# chainlesschain **Repository Path**: chainlesschaincn/chainlesschain ## Basic Information - **Project Name**: chainlesschain - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-12-01 - **Last Updated**: 2026-05-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ChainlessChain - 基于U盾和SIMKey的个人移动AI管理系统 ## 2026-05-02 增量更新(**Web Panel 双语化** — vue-i18n + 18 个 view 翻译完成 + 共享 locales 包) Web 管理面板从硬编码中文翻成中英双语,sidebar 跟着头部按钮一键切。`@chainlesschain/locales` 共享包是 SOT,desktop / 官网 / docs 都能复用。 | 主题 | 提交 | 说明 | |---|---|---| | 共享 locales 包 (M1) | `b66dd9fe7` | 新建 `packages/locales/` workspace,零运行时重量,vite/vitest alias 接入。`messages` / `SUPPORTED` / `FALLBACK` 一处定义,desktop-app-vue 后续可直接 import 同一份。 | | 提取 + 守门工具链 (M2) | `f6c163c79` | `npm run extract` 跑 vue-i18n-extract(CI exit 1 on missing key)+ `scan-untranslated.js`(CJK 漂移扫描)+ `no-stray-locales.test.js`(禁止子项目放本地 *.json locale)。 | | vue-i18n 接入 + ant-d-v 同步 | `932f5ba38` | `` 双向 watch zhCN/enUS bundle,分页 / 日期 / Popconfirm 跟着切;`useLocale()` 暴露 current/antdLocale/setLocale。语言切换按钮在 sidebar header(next to 主题切换)。 | | 18 view × ~1240 string 翻译 (M3) | `dd878633a` → `82b63b50a` | QuickAsk · Compliance · Pipeline · DID · KnowledgeGraph · Dashboard · Chat · WorkflowEditor · Marketplace · Trust · Governance · Privacy · Sla · Codegen · Tenant · NLProgramming · Crosschain · AppLayout(sidebar 137 项 + 9 group + header)。enum 标签 mapper 用 `t(key) === key ? fallback : t(key)` 模式,未知值原值穿透。 | | 测试加固 | `d0fa56f64` | i18n-key-parity(zh/en JSON key 必须 mirror、leaf 非空、≥18 namespace)+ mount-sweep 覆盖 17 view(mount + 译后标题在 DOM 中可见)。Unit 1660 → 1691(+31),E2E 75/75。 | **Audit deltas**(`packages/locales/scripts/scan-untranslated.js`) - 翻译前:54 文件 / 2906 CJK occurrences - 翻译后:39 文件 / 1583 occurrences(**-15 文件 / -1323 strings,~46% catalog**) - 25+ view 还有零散 CJK 待翻;模式跑得很顺,按需逐个推 **Bug 修复**:本批没引入新 bug。`compliance threat-intel match 1.2.3.4` integration 测试 1 项失败,是本机 SQLite DB 损坏(`database disk image is malformed`)触发的环境问题,跟翻译无关;`cc setup --reset` 或者删 `%APPDATA%/chainlesschain/data/chainlesschain.db` 重建即可。 ## 2026-05-01 增量更新 II(**Phase 1.6 hard-flip + 双向 shell 切换** — web-shell 默认 + 顶栏切换按钮 + 4 处启动期 bug 修) 桌面端从"实验性 web-shell"翻成"默认 web-shell",对称的顶栏一键切换,外加运行时回归一波。 | 主题 | 提交 | 说明 | |---|---|---| | `DatabaseManager is not a constructor` 修 | `4c054fa98` | `b2a8e5a8a` ESM 迁移漏改 `core-initializer.js`:`const DatabaseManager = require("../database")` 拿到的是 namespace 对象不是类。补解构。原 ~25 个依赖 `database` 的模块(DID/P2P/Friend/Org/sync/llm/rag/git 等)级联 silent skip,渲染层 store 全空。 | | 009_embedding_cache + 009_memory_system 真装载 | `fd9c4f101` | 路径 bug × 10 处:`path.join(__dirname, "database", "migrations", X)` 多了一层(`__dirname` 已是 `dist/main/database/`)。所有外部 SQL migrations(005-018)实际**都没跑过**——EmbeddingCache / PermanentMemoryManager 启动期撞 "no such table" 才暴露。修路径 + 加 009 orchestration(建 embedding_cache / memory_stats / memory_sections / user_preferences / 等)+ LATEST_VERSION 6→7。 | | `session:list` 重复注册修 | `5e2048329` | session-core-ipc.js(Managed Agents 新组)和 session-manager-ipc.js(LLM 旧组)+ memory-v2-ipc.js 之间 6 个 channel 名冲突(list/create/resume + memory:store/recall/consolidate)。Electron 在第一个冲突抛错截断 session-core 的 24 channel 注册。renderer 调 `electronAPI.sessionCore.*` 实际打到 LLM session manager 上语义错位。整组改名 `session-core:` 前缀;preload + 测试同步。 | | Phase 1.6 hard-flip | `3296e9fb4` | 复刻 V6 hard-flip (`caaddf530`) 节奏:DEFAULT_CONFIG.ui.useWebShellExperimental `false → true`;`shouldRunWebShell` 语义 `=== true` → `!== false`(opt-out);显式 false 才回 V5/V6 桌面壳。argv/env force-on 仍保留作 CI 逃生口;UI toggle 显式 false 优先级高于 force-on。SystemSettings.vue 文案 + form 初始化同步翻。 | | V6 → web-shell 顶栏切换按钮 | `ebed2d7e8` | `AppShellPreview.vue` topbar-actions 加 🌐 GlobalOutlined 按钮(`CmdOrCtrl+Shift+B` accelerator):Modal.confirm → `electronAPI.invoke('config:set', 'ui.useWebShellExperimental', true)` → `system:restart`。绕开 `titleBarStyle:"hidden"` 隐藏菜单的限制(Electron 39 web-shell 模式 default 触发 0xC0000005,所以 hidden 锁死)。 | | web-shell → V6 顶栏切回按钮 | `367ec1bbe` + `5c21633b5` | web-panel `AppLayout.vue` header-right 加 🖥️ DesktopOutlined(仅 `shellMode.isEmbedded === true` 显示)。第一版用 electronAPI(**没用**——web-shell preload 故意空,只暴露 `__CC_CONFIG__`);改用 `ws.sendRaw({type:"shell.switch", target:"desktop"})` 走 WS topic,符合 web-shell 一切走 WS 的设计。 | | `shell.switch` WS topic | `41b17ec56` | 新 handler `shell-switch-handler.js`(factory + DI inject getAppConfig/app/scheduleRestart):验证 target ∈ {desktop, web-shell} → 写 `ui.useWebShellExperimental` → 100ms 后 `app.relaunch() + app.exit(0)`(让 WS 回包先 flush)。bootstrap 仅在 getAppConfig 提供时注册,避开 CI smoke。8 单测覆盖两 target / 错误 target / appConfig=null / app.relaunch throw 吞错。 | | inline `