📋 Android v1.0 重新定位 RFC 评审中(2026-05-10)—— 桌面 = AI 工作站,手机 = 钥匙 + 捕获器 + 遥控器。停止以 skill 数量对标桌面,转 L1 (StrongBox/DID/QR) + L2 (Voice/Camera OCR/推送) + L3 (REMOTE 调用桌面 skill) 三层架构。详见设计文档 | 用户文档。
📦 CLI 安装:
npm i -g chainlesschain(别名cc/clc/clchain)。 中国大陆镜像用户注意:若你的 npm 默认源是淘宝镜像registry.npmmirror.com,可能遇到安装报错npm error code E404 … '@chainlesschain/…' is not in this registry——这是镜像对新发布包懒同步 tarball 导致(元数据已有但 tarball 尚未缓存)。改用官方源安装即可:npm i -g chainlesschain --registry https://registry.npmjs.org镜像通常会在发布后稍候自动补齐(项目发版流程也会主动触发同步);补齐后用默认镜像源安装即可正常。
npm 公网
latest已对齐[email protected]与@chainlesschain/[email protected];桌面端与 Android 当前为5.0.3.135,VS Code 扩展为0.37.33。Python Agent SDKchainlesschain-agent-sdk==0.1.0已通过 PyPI Trusted Publishing 发布。本轮主线是个人数据中台跨端实时采集:92 个已注册采集契约 / 18 类数据源按当前宿主和输入显示真实 readiness,桌面端、Web Panel 与 CLI 统一支持立即同步、文件、目录、临时 Cookie、临时 OAuth 和 Android ADB 六类入口。Cookie/OAuth 不持久化;缺失备份、无效来源页或不可达输入失败闭合;长任务只有完整稳定扫描后才推进水位,取消或中断可安全续扫。另修复 QQ NT 字段语义、Windows Recent / Android 系统数据续扫、WhatsApp 带密钥备份和微信读书游标保留。
[email protected]已发布到 npmlatest,VS Code 扩展0.37.31已发布到 Open VSX。CLI-Anything 与 CLI 指令技能包生成的 handler 不再直接持有child_process:声明shell-exec的技能仅获得宿主注入、冻结且带权威来源信息的 Process Broker facade;CLI-Anything 使用字面 argv +shell:false,危险字符、未闭合引号或缺少 Broker 时 fail closed。发布门覆盖 Ubuntu / Windows / macOS 的 unit、integration、E2E、打包和真实 CLI/Extension Host 烟测;本地 CLI 单元四分片 24,562 项通过、5 项跳过。详见 CLI Runtime 当前实现、CLI 技能包用户指南 与 运行时设计核对。
VS Code
0.37.30→0.37.31(Open VSX)。扩展协议与最低 CLI 版本不变,打包兼容夹具对齐0.162.177;发布前通过 VSIX 元数据校验,以及 VS Code Stable1.130.0/ 最低支持版1.85.2的真实 Extension Host 安装、激活、命令和桥接端口烟测。Microsoft VS Marketplace 尚未配置发布令牌,官方 VS Code 用户可从 Open VSX 下载.vsix安装。
2026-07-16 发布 — cc CLI 0.162.168:增量 gap-analysis 第二批接线(后台 Agent「等待审批」真实状态 / hook trace·parent 溯源 / LSP 多根+重启退避默认开 / 严格 hook 合并真并行 / 大仓 subagent worktree·子树指令 / run_code install 审计)
CLI-only 发版(0.162.167 → 0.162.168,npm
latest,provenance)。后台 agent 卡人工审批时把phase:"waiting_permission"+ 实时pendingApprovals写进共享 state(Dashboard "Needs input" 从此有真数据)+ 统一 install 审计扩到run_code的 pip 自动安装(识别python -m pip install含 sudo 包裹,一份install-commands.jsonl覆盖所有「下载并运行第三方代码」入口)+ hook 事件溯源(event_id/trace_id/parent_id四 payload 构造点,子 agent hook 事件跨深度关联父 trace)+ strictest-merge 决策合并(opt-inCC_HOOK_STRICT_MERGE=1,修「较早 ask 掩盖较晚 block」缺口)与 PreToolUse 真并行 + LSP 重启退避默认开(1s→2s→4s→8s,CC_LSP_RESTART_BACKOFF_MS=0关)与多根code_intelligence(--add-dir根拿自己项目的语言服务器)+ 子树指令懒注入默认开(工具首访子树附cc.md/CLAUDE.md/AGENTS.md,CC_SUBTREE_INSTRUCTIONS=0关)+ subagent worktree 稀疏检出透传 / agent-filebackground:true真生效 / headless--add-dirseed MCP roots。命令数 175 不变。
2026-07-16 发布 — cc CLI 0.162.167:增量 gap-analysis 收尾(P0 沙箱远程脚本执行检测 / 4 个生命周期事件钩子 / doctor 孤儿子进程 / 4 项杂项接线)
CLI-only 发版(0.162.166 → 0.162.167,npm
latest,provenance)。统一「代码获取」分类器把 20+ 包管理器安装命令与curl … | sh一类下载即执行远程脚本归类,shell 审批抬高风险地板 + 落审计(remoteExec标记;cat file | sh与仅下载不误报)+ 4 个生命周期钩子真实生产者(CwdChanged/WorktreeCreate·WorktreeRemove/InstructionsLoaded——携权威指令文件清单绝不含内容,observe-only 零字节默认)+cc doctor孤儿 agent 子进程检测(进程起始时间锚定防 PID 复用,给taskkill/kill修复命令)+ async-hook 持久重唤队列崩溃恢复 / MCP roots/list_changed 广播 / LSP 就绪安装缺口检查 / Session Mirror at-rest 加密·删除·保留·密钥轮换。命令数 175 不变。
2026-07-15 发布 — cc CLI 0.162.166:P1-9「Capability Manifest 与脱敏诊断包」收官(协议文档 CI byte-diff / 离线协议回放 / 治理覆盖率指标)
CLI-only 发版(0.162.165 → 0.162.166,npm
latest,provenance)。协议能力文档从唯一源capability-manifest.js单源生成 + 测试内 byte-diff 断言(manifest 加字段未重生成即测试红,drift 不可能 merge 绿)+ 离线协议回放与前向兼容审计(录制 stream-json 会话按协商上下文回放/审计,携带 gate-OFF wire 字段即违规 fail-closed)+ 治理覆盖率指标(高风险调用 Ledger/Trace 覆盖率 + Plugin/MCP/Skill/Hook 溯源可追溯率,双 100% 才ok,离线工具可对 CI 强制)。命令数 175 不变。
2026-07-13 发布 — cc CLI 0.162.165:精简项目记忆(--no-project-memory 全关 / CC_PROJECT_MEMORY=lean 只留入口文件 / IDE 聊天「精简上下文」默认开)
CLI-only 发版(0.162.164 → 0.162.165,npm
latest,provenance)。文档密集仓库里cc agent每轮重发整套项目记忆(实测 ~12k token/轮)——现分三档:full(默认不变)/lean(保留cc.md>CLAUDE.md>AGENTS.md首个入口文件,丢CLAUDE.local.md、.claude/rules/*、.chainlesschain/rules.md,实测 ~12k → ~5k)/off(--no-project-memory跳过整个层级)。IDE 侧经环境变量下发(旧cc不认自动回退 full)。命令数 175 不变。
2026-07-13 发布 — cc CLI 0.162.164:IDE 增量 gap-analysis 全批接线(凭据脱敏三导出面 / /rewind 从这里分支 / cc session pr-status / Diff 行评论锚定 / worktree 清理安全闸 / 崩溃恢复台账 / 脱敏诊断包)
CLI-only 发版(0.162.163 → 0.162.164,npm
latest,provenance)。cc session export/ OTLP /cc doctor --export-bundle三导出面共用 recall-first secret-scan(导出物离机朝「不泄漏」失败)+ 崩溃恢复两阶段副作用台账(--resumereconcile,started-未落定-非幂等 op 注入 Recovery notice 而非盲重跑)+/rewind <n> --branch从选中 turn 派生独立会话(父会话绝不截断)+ review finding 锚到代码而非裸坐标(file+baseHash+行原文,改后 reanchor/标 outdated)+cc session pr-status(PR/CI 状态条 + 默认关的 auto-merge 合格性穷举判定)+ worktree reaper fail-closed 安全闸(未提交/未 push/关联 PR 任一即保留)+cc doctor「Execution context」段 + 无人值守动作门 + 跨设备操作指纹全元组校验。命令数 175 不变。
2026-07-13 发布 — cc CLI 0.162.163:增量 gap-analysis last-mile 运行时接线(Subagent 契约全轴强制 / 跨 Agent 授权边界 / hook 事件日志+replay / plugin consent 生命周期 / /goal 循环 / --json-schema / OTel)
CLI-only 发版(0.162.162 → 0.162.163,npm
latest,provenance)。0.162.162 announce 的纯核整批落成真实运行时接线:spawn 真正消费resolveSubagentContract(tighten-only)+ 本地 headless 审批链路携带并校验授权信封 + 会话完成条件引擎接线 + Turn↔Checkpoint 绑定持久化与 coverage-aware/rewind+ 副作用台账崩溃恢复纯核 + 持久 Scheduler jitter +cc plugin consent再同意 +cc hook replay/events-log+ REPL/goal循环 +--json-schema结构化输出 + 统一 OTel id。命令面只加子命令与 flag,顶层命令数 175 不变。本地三层全绿(unit+integration 25,008 + e2e 628)。
2026-07-12 发布 — cc CLI 0.162.162:增量 gap-analysis 收尾(Subagent 契约/Turn-Checkpoint 绑定/Plugin 能力 Schema/Hooks 事件总线/JSON Schema/多 Agent Review + LSP 诊断/Doctor+文档+OTel)+ IDE gap P0
CLI-only 发版(0.162.161 → 0.162.162,npm
latest,provenance)。对照docs/CLAUDE_CODE_CLI_INCREMENTAL_GAP_ANALYSIS_2026-07-12.md(vs Claude Code v2.1.207)P0/P1/P2 全部章节收口:P1 Subagent 契约(tighten-only 继承/覆盖,权限加宽钳回父级、capabilities 取交集、memory 父拒不授予)+ Turn↔Checkpoint 绑定(覆盖度 FULL/PARTIAL/NONE,恢复计划永不过度承诺)+ Plugin 能力声明与配置 Schema(默认 DENY + 加宽需重新同意 + 敏感选项拒 project 配置);P2 Hooks 统一事件总线(信封 +event_id+ 决策最严胜出 + 决策类 replay 必须显式 sandbox)+ JSON Schema 结构化输出(Draft 2020-12 子集 +schema_digest+structured_result)+ 多 Agent Review 聚合核(dedupe 跨维度合并 + verifier 复现剔除 + 结构化 path/line/category/severity/failure_scenario/evidence)与 LSP 自动诊断调度(debounce/throttle + token 上限先丢最不严重)+ Doctor Runtime Checkup(agenda 逾期/慢·熔断 Hook/失效 Plugin·LSP/冗长指令文件)+ CLI 参考文档漂移检测(从 manifest 175 + 工具 26 生成并双向 diff)+ 统一 OTel id(九 id 归一 + content 默认脱敏[redacted]+ 基数收敛,每 span 带 workflow.run_id+session.id)+ IDE gap P0(远程审批绑定操作指纹 + 会话生命周期状态机)。命令数 175 不变。发版前本地三层全绿(unit 23,182 / integration 1,044 / e2e 628)。
2026-07-12 发布 — cc CLI 0.162.161:增量 gap-analysis(后台状态机/跨 Agent 授权/凭据代理/完成条件/Monorepo 排除/持久 Scheduler)+ bg-* WS relay 协议硬化
CLI-only 发版(0.162.160 → 0.162.161,npm
latest,provenance)。跨事件trace_id(stream-json 每行 run-scoped,字符集 ≤128)+ 后台 Agent Idle/Needs-input 状态机(仪表板分组)+ 跨 Agent 授权信封(origin→authority,仅 user/permission_tool/认证 approve-scoped remote 可批准,approval binding 常数时间 fail-closed 防冒用)+ 凭据代理(子进程默认屏蔽长效凭据哨兵cc-cred-redacted:<NAME>,审计绝不记录还原明文,approved-host fail-closed 注入)+ 会话级完成条件引擎(exit-zero/file-exists/contains/regex/model/裸 + 预算 + 可恢复快照)+ MonorepoinstructionExcludes(glob 排除 legacy/vendor/generated,@import 也跳过防凭据进 prompt)+ 统一持久 Scheduler 规划器(FNV-1a 确定性 jitter 防惊群 + 自适应唤醒 + 过期退休)+ bg-* WS relay 序号缺口 replay / 出站背压 / 跨语言 fixture 契约。命令数 175 不变。
2026-07-11 发布 — cc CLI 0.162.160:运行时安全与确定性 8 批(沙箱严格模式 + 依赖/凭据安全 + 确定性 Headless + Subagent 契约 + MCP 生命周期 + Hooks 硬化)
CLI-only 发版(0.162.159 → 0.162.160,npm
latest,provenance)。⚠️ 三处行为变更:run_code的 pip 依赖默认不再自动安装(改 opt-in + allowlist + 审计 JSONL);agent 脚本默认写 OS 临时目录(persist:true才进项目);headless/agent 退出码细化(最大轮次→3 / 预算→4 / 模型错误→5 / 配置错误→6)。另含--ephemeral只读回放 + init 事件补协议/持久化/指纹字段 +cc agent --capabilities机读能力清单 +llm.apiKeyHelper(外部命令→OS 凭据库,失败 fail-closed 告警一次绝不静默替换)+ 沙箱failIfUnavailable启动期强制探测引擎(不可用即拒绝启动,不再静默降级)+ SubagentdisallowedTools/maxTurns/isolation:worktree(并修出子代理工具白名单从未传入 LLM 面的真 bug)+cc session rename/prune·cc daemon rm·cc mcp trust-project+ MCPlist_changed合并式重拉 +.mcp.json指纹变更 fail-closed 重信任 + Hook payloadschema_version+ 连续失败熔断。命令数 175 不变(只加子命令)。
2026-07-11 发布 — cc CLI 0.162.159:Claude-Code 平价 gap-analysis 14 项收口(cloud handoff + /tui + /voice + /fast + plugin 治理 + session SQLite 索引)
CLI-only 发版(0.162.158 → 0.162.159,npm
latest,provenance)。对照docs/internal/cli-claude-code-gap-analysis-2026-07-11.md14 项全落地:cc cloud自托管 cloud handoff(git bundle上传私有 runner→回流 patch/PR,无 Anthropic 云依赖)+/tui全屏无闪烁视图(备用屏缓冲 + diff 重绘 +CC_NO_FLICKER=1)+/voice语音听写(local-first STT,SSH/headless 清晰降级)+/fast延迟档(最小化推理 + 换低延迟模型,不覆盖/model钉过的模型)+ 插件治理(manifestdependenciessemver 约束 + LSP 注册表候选表回退 builtin + 被动组件不误判"未使用")+cc session index外部 session 存储(JSONL 权威 + SQLite 索引增量同步/搜索 + 可插拔 fs/http mirror)。命令数 173 → 175(新增cc cloud+cc routine)。
2026-07-10 发布 — cc CLI 0.162.158:browser_state agent 工具 + REPL /remote-control 赛跑审批 + web-panel 直连配对/审批卡片 + 交付物预览下载
CLI-only 发版(0.162.157 → 0.162.158,npm
latest,provenance)。browser_state第 25 个 agent 工具(Chrome CDP 观察:URL/标签页/console/失败网络/DOM 快照/截图,纯只读仅 loopback,plan 模式可用)+ REPL/remote-control(交互会话内配对手机,终端 prompt 与远端设备赛跑审批——远端静默永不代键盘用户 auto-deny)+ web-panel 直连(direct-LAN)配对与permission.request一等审批卡(relay E2EE 与直连双方案自动识别,断线幂等 commandId+seq)+ 交付物 Markdown 预览与浏览器完整下载。安全修复 ×2:直连配对明文 ws:// 收紧到私网/回环主机(钓鱼配对 URI 无法导走 serverToken/审批决定)+ chrome-connector launch-arg 加固(--开头 URL 不再被 Chrome 当开关解析)。命令数 173 不变,AGENT_TOOLS 24 → 25。
2026-07-10 发布 — IDE 插件 VS Code 0.37.12 / JetBrains 0.4.56:IDE 内配对二维码 + Remote Control relay 设置面(gap 清单收口)
IDE-only 双端发版(Open VSX + JetBrains Marketplace 均已上架)。Remote Control 配对不再要求盯终端:一次性配对 URI 直接在 IDE 内渲染成二维码(VS webview / JB 对话框,双端共享同一自包含 QR 编码器纯核),手机扫码即配对;relay(E2EE 跨网)模式的
--relay-url/--peer-id也有了 IDE 设置面(VS settings / JB「Relay settings…」对话框)。至此 IDE gap-analysis 清单全部非环境阻塞项收口(#5 行范围 mention@file#L12-40核实为早已落地的 stale 记录;#8browser_state一等 agent 工具已进主线,工具数 24 → 25,随下次 cli 发版上 npm)。验证:VS 70 测试文件 / 605 绿 + vsix 解析级检查 7/7;JB test + smokeTest + buildPlugin 绿 + zip 解析级检查 6/6。同日主线还落了 web-panel 直连(direct-LAN)配对 +permission.request审批卡片(批 28,随下次 cli 发版)。
CLI-only 发版(0.162.156 → 0.162.157,npm
latest,provenance)。IDE 深度整合增量:diff 审阅里你改了什么 agent 现在看得见(accepted 结果携带userAmendments-/+ 行级修订摘要,配合 JetBrains 0.4.55 可编辑右栏端到端闭环)+ plan 批准/拒绝携审阅快照写入会话 transcript(可审计回放)+cc browse chrome(CDP attach 用户真 Chrome,登录态复用,console/网络/DOM/截图观察)+ Artifacts v1(publish_artifact工具+cc artifacts——交付物只有元数据进对话)+ Windows/PowerShell 一等(run_shellshell参数/显式 argv/PowerShell(...)权限伞形)+--bare最小攻击面裸模式 /--disable-slash-commands/--ax-screen-reader读屏友好。命令数 172 → 173。发版前干净 worktree 三层全绿。
2026-07-09 发布 — cc CLI 0.162.156:cc agenda + cc batch(第四阶段收口)+ @chainlesschain/agent-sdk 0.1.0 npm 首发
CLI-only 发版(0.162.155 → 0.162.156,npm
latest,provenance);@chainlesschain/agent-sdk0.1.0 同 run 首发 npm。命令数 170 → 172:cc agenda(notify/schedule 双 agent 工具的持久化消费端——wakeup/cron/monitor 意图落~/.chainlesschain/agent-schedule/,到期 spawncc agent -p)+cc batch(大改动拆独立单元、每单元独立 git worktree 并行、--test门控 +--merge顺序集成,冲突报告不强合)。发版前本机三层全绿(unit+integration 23,447 / e2e 628)。SDK 详情见下条主线。
新包
packages/agent-sdk把cc agent的 stream-json 双工协议固化为版本化正式契约(Agent Protocol v1):流式事件、审批回调、检查点、会话恢复不再靠各消费端手拼 argv、手写 NDJSON 解析,而是import即得(protocol.ts单一来源 + 语言中立docs/PROTOCOL.md)。VS Code 扩展(vendored CJS,vsce--no-dependencies约束)与 web-panel(vite alias 直指 TS 源,bg-*帧全走 SDK 构造/判别)已迁移;JetBrains 插件(Kotlin/Java)声明实现同一份协议文档。AgentSession内置 Windows 加固(cmd.exe /cshim +NoDefaultCurrentDirectoryInExePath反劫持 +taskkill /T进程树回收),审批回调 fail-closed。SDK 自带真 CLI e2e(fake ollama,断言 init/流/审批真写盘/resume 四契约),落地当天抓出并齐修两个真 bug:两 IDE 首会话不落盘(匿名流式会话按 CLI 设计不持久化 → IDE 重载后 resume 静默空会话,重载前上下文全丢;修复=面板首启即声明panel-<ts>-<rand>session id,VS Code + JetBrains 同修)+.js入口 spawn 失败。验证:agent-sdk 36/36(单元+真管道集成+真 CLI e2e)、vscode-ext 58 文件/512、JetBrains smoke 663/0、web-panel 2458/2458。用户文档docs-site/docs/chainlesschain/agent-sdk.md| 设计文档docs/design/modules/103_Agent_SDK平台化方案.md。
gap-analysis「第一阶段:安全与可运营性」全量收口(批 1-18,命令数 165→170):权限模式补齐
manual/auto/dontAsk(headless + 交互 REPL 双面;auto=settingsautoMode.decisions可配置分类器,支持 riskLevel 与 tool/commandPattern 细粒度规则;dontAsk=需确认动作直接 deny 不弹审批);决策逐层解释链(被拒命令附 settings-rules→shell-policy→approval-gate 各层判定,cc permissions recent跨会话回看);后台会话可运营(顶层cc logs/attach/daemon status|view|stop|rename|resume,崩溃会话一条命令续接同一对话);cc attach可交互接管(worker 每会话本地 session transport,键入即发 follow-up prompt 多轮续跑);web-panel「后台 Agent」面板(bg-*WS 协议复用同一 transport,接管 token 永不过网络边界);外加cc remote-control统一远控入口与移动端远程审批桥。已发 npmlatest(provenance),旧版已标弃用。
-
MCP Tool Search(同版并入):接入多个 MCP server 后全部工具 schema 随每次请求发送、轻松吃掉 10–30% 上下文窗口的问题收口(对标 Claude Code ToolSearch)——schema 超阈值(默认窗口 10%,settings
mcp.toolSearch/CC_TOOL_SEARCH可配)时自动换成[deferred]紧凑 stub + 内部tool_search检索工具,完整 schema 经工具结果按需返回。真机实测 12 工具 server 省 ~14k tokens。 -
prompt cache 友好:stub 常驻且字典序稳定、schema 装载走对话内容(append-only)、晚连接 server 追加不重排——Anthropic 路径的尾部
cache_control缓存断点跨 turn 保持命中。 -
直调自愈:未先检索就直接调 deferred 工具 → 返回内嵌完整 schema 的错误并标记已装载(不打真 server),重试即通过。
-
/context增强:REPL/context新增 MCP tool schemas 一节——per-server token/窗口占比、tool search 状态(deferred/loaded/节省量)与优化建议(alwaysLoad收窄 / 断开点名的最大 server)。 -
顺带:MCP
initialize的 serverinstructions不再被丢弃,随tool_search结果按 server 附带。 -
gap-analysis 第四阶段「跨端与长任务」补齐(remote-control 随 0.162.155、agenda/batch 随 0.162.156 均已发 npm):
cc remote-control start/status/stop(进程内起 WS server + 常驻 loopback HOST 会话 + 打印配对 URI/二维码,relay E2EE 或 direct-LAN 双模)与cc agent --remote-control(confirm 级审批路由到已配对移动/Web 设备,超时 fail-closed)已随 0.162.155 发 npm;cc agenda(Monitor/Cron/Push 长任务调度消费者 +notify/schedule两个 Agent 工具)与cc batch(把大改动拆成独立单元、各跑自己的 git worktree 并发执行、测试与合并冲突预览的动态批处理,支持--decompose自动拆分)已随 0.162.156 发 npm(命令数 170 → 172)。三层测试全绿(remote-control 36 / agenda 29 / batch 17)。用户文档cli-remote-control.md·cli-agenda.md·cli-batch.md。
对照 Claude Code CLI 排查 cc 自身的网络/IO 客户端层(并行平价循环未覆盖的一层),修复一批「静默失败 / 永久挂起 / 截断不报错」类稳健性问题,全部带专项单元测试。三层测试普查全绿(CLI 单元 19523 / 集成隔离 24 / e2e 604),普查另暴露并修 1 个
--verbose回归 + 2 个陈旧断言。
- 写入完整性:
write_file/edit_file落盘后校验实际字节数,网络盘 / 云同步盘静默截断或 0 字节写不再假成功。 - MCP 韧性:
tools/list失败显式「! Connected · tools fetch failed」/ stdio 进程猝死立即拒绝在途请求(不挂 30s)/ HTTP 请求补 30s 超时(longRunning豁免,顺带接通预留未消费的元数据)/cc mcp serve请求体上限 + 超时 + 错误处理。 - 安装下载完整性:
cc setup校验 Content-Length(截断即弃不安装)+ 停滞超时(防挂死镜像冻结安装)。 - 资源清理:SIGTERM→SIGKILL 升级定时器
unref+ 进程退出即清,杀任务后不再占住事件循环、延迟 CLI 退出。
packages/jetbrains-plugin/一次性补齐与 VS Code 扩展(0.22–0.30)的功能差距,经./gradlew runIde沙箱逐特性人工验证后发版(tagide-jetbrains-v0.4.0→ CIpublishPlugin)。
- 多会话 tab:Chat 工具窗变多会话——每个 tab 独立
cc agent子进程、+ 新建/ 单 tab×关闭 / 即时切换 / 每 tab resume id 跨 IDE 重启保留。 - 审批模式 + 扩展思考:面板斜杠命令
/auto·/bypass·/normal+/think·/ultrathink·/think-off(spawn-time 标志,切换即以新标志重启子进程);面板斜杠/new·/stop·/cost·/context·/plan·/approve·/reject。 - 上下文用量行 + 新建/重开快捷键:每轮后刷新
⊟ context …/…(n%);Ctrl/Cmd+Alt+N新会话、Ctrl/Cmd+Shift+T重开最近关闭(续接)。 - 选区动作 + @文件引用:编辑器右键 Explain / Refactor(注入
@selection);Ctrl/Cmd+Alt+K插入@<path>#L<起>-<止>选区行范围;输入@弹出补全(@selection/@diagnostics+ 项目文件)。 - 原生 diff 评审:openDiff 升级为 Accept / Request changes…(行内批注回喂)/ Reject;
openMultiDiff多文件批量评审(全接受 / 挑选文件 / 拒绝)→mcp__ide__openMultiDiff。 - 交互 Plan / 审批卡:plan 与工具审批以带 Approve/Deny(Approve/Reject)按钮的卡片呈现,按钮回喂同 VS Code 的 stdin 协议。
- App 内嵌预览:Start App Preview 拉起 dev 脚本 → 解析 URL → JCEF 内嵌(不支持时回退外部浏览器);Stop 杀进程树。
- 修复(runIde 验证中发现,编译查不出):多会话重构曾让回复被静默丢弃(turnState 类型错→首个流事件 CCE 杀掉读线程);New-UI 工具窗图标空白(栅格内嵌 SVG → 真 PNG);输入框过窄(改为独占整行)。
2026-07-03 发布 — v5.0.3.134:CLI OAuth 命令注入修复 + MCP 列表加固 + workflow resume 重驱动(cli 0.162.148 / Android cc bundle 20260703 · USR 74)
CLI 安全 patch 上船真机:
mcp-oauth授权 URL 曾经 cmd.exe 被&注入任意命令(远程 MCP metadata 可影响),改 http(s)-only + rundll32 无 shell;MCP 服务器列表一条坏行不再炸整列表;桌面 workflow-engine 断点/审批恢复真正重驱动执行。chainlesschain0.162.148 已发 npm,随本版打入 Android in-app cc bundle。逐版完整明细见 CHANGELOG.md。
2026-06-28 发布 — v5.0.3.131–133:个人数据中台采集/分析三连(MIUI 浏览历史 + 账单月份/时间线修复 + 微博私信)(pdh 0.4.39 / cli 0.162.129)
累计 v5.0.3.131–133:MIUI/AOSP 默认浏览器历史采集器;PDH 分析层两处日期正确性修复上设备;微博私信采集(device-verified schema,高敏感 opt-in)。逐版完整明细见 CHANGELOG.md。
- v5.0.3.131 — MIUI/AOSP 浏览历史采集器:新增
browser-history-aosp适配器,直读com.android.browser的browser2.db(history/bookmarks,列名经PRAGMA table_info动态解析,ROM 变体安全),复用 Chrome 适配器的normalize()产出一致的BROWSEEvent /LINKItem,闭合 schema 字典记录的 MIUI 默认浏览器「适配缺口」。 - v5.0.3.132 — PDH 分析层日期修复上设备:账单月份从
dueDate推算时 naivesetMonth(getMonth()-1)在还款日 29–31 号溢出到错误月份(改new Date(year, month-1, 1));时间线显式sinceMonths被默认 7 天窗口静默遮蔽(改为仅未给窗口时套默认)。新增桥接连通集成测试(6 测试,自动化跨设备验证法)。 - v5.0.3.133 — 微博私信采集:补全
message_<uid>.db(t_buddy→PERSON /t_session→TOPIC /t_message→EVENT,列名真机 device-verified),高敏感 → opt-inincludeDm:true(默认关),不影响既有 posts/likes/follows。 - 版本面:productVersion v5.0.3.130 → v5.0.3.133;pdh 0.4.36 → 0.4.39 +
chainlesschain0.162.117 → 0.162.129 已发 npm;Android cc bundleinternal-binaries-android-v20260628c(USR_VERSION 61)。
2026-06-24 发布 — v5.0.3.130:QQ空间一键采集 + 微信朋友圈采集 + §8.3 学习层备份上设备 + 个人助手 UX 收口(pdh 0.4.36 / cli 0.162.117)
累计 v5.0.3.127–130:QQ空间(Qzone)App 内嵌 WebView 一键采集(说说/留言板/相册)+ 微信朋友圈明文采集;§8.3 学习层备份命令上设备;个人助手卡死看门狗 + 待裁决信任卡固定可见。逐版完整明细见 CHANGELOG.md。
- QQ空间一键采集:Qzone 本地无可读库 → 走 API。新增
pdh/lib/forensics/qzone-collect.js(g_tk=bkn hash over qzone 域p_skey;说说/留言板/相册 → EVENT)+cc hub collect-qzone;Android「QQ空间」一键采集卡——内嵌 WebView 打开ptlogin2登录(QR / 账号密码)→ 抓 cookie → in-APK 采集入设备金库。真机端到端验证:扫码登录 → 采集 404 事件(329 说说 + 73 留言 + 2 相册)。 - 微信朋友圈采集:
SnsMicroMsg.db是明文 SQLite(无需密钥);新增parseSnsEvents(SnsInfo → EVENT,正文取 protobuf TimelineObject)。本机真机采 2824 条。 - §8.3 学习层备份上设备:
cc memory/instinct/learning export/import(层次化记忆 + 学习习惯 + 自进化轨迹)随新 cc bundle 上设备,与 vault 命令合并覆盖全资产端到端加密备份,密钥归个人不上云。 - 个人助手 UX:卡死静默看门狗(20s 安抚 / 120s 友好超时 + 重试 / 进程退出自动重启)+ 待裁决信任卡固定(sticky)可见,不再被消息流滚走。
- 版本面:productVersion v5.0.3.126 → v5.0.3.130;pdh 0.4.36 +
chainlesschain0.162.117 已发 npm;Android cc bundleinternal-binaries-android-v20260624(USR_VERSION 58)。
2026-06-22 发布 — v5.0.3.126:个人数据中台 on-device 采集大扩展 + §8.3 跨设备加密备份 + 桌面安全硬化(pdh 0.4.31 / cli 0.162.99)
累计 v5.0.3.122–126:PDH 端侧采集(QQNT / 微信 / 通用明文库 + 多 app Magisk 守护进程)大幅扩展;§8.3 跨设备加密备份引擎落地;桌面 IPC/权限安全硬化转 ENFORCE;CLI 健壮性与 IDE 配置体验完善。逐版完整明细见 CHANGELOG.md。
- PDH 端侧采集:QQNT
collect-qq(frida-free,nt_msg.db 解密入库)/ 微信collect-wechat(派生密钥解密 + 解析)/ 通用明文库collect-db;多 app 通用 Magisk 守护进程(MIUI 全自动上设备);个人助手 PDH 工具上设备 + node DNS 修复(in-APK cc 外网打通)。 - §8.3 跨设备加密备份:增量同步 + N 路版本并列冲突合并 + 加密块信封 + DID 派生备份密钥 + libp2p P2P 块传输 + 协调器(坏块跳过不中断整体恢复)。
- 桌面安全硬化:IPC 发送方帧信任 / actor-identity / param-identity 守卫默认 ENFORCE;权限 grant/revoke/delegate/bulk-grant 的 RBAC 授权。
- CLI / 后端 / IDE:数值选项 NaN 守卫 + config.llm 一致化(cc agents·command·cowork·orchestrate 不再误走 ollama)+ cc agents 接线修复;后端校验 500 修复 + 大批新测试;VS Code / JetBrains 配置 LLM 预填(免重输模型 + key)。
- 版本面:productVersion v5.0.3.121 → v5.0.3.126;pdh 0.4.31 +
chainlesschain0.162.99 已发 npm。
2026-06-19 发布 — v5.0.3.121:个人数据中台分析/采集修复 + FAMILY-67 通话/通知体验 + Android 键盘遮挡修复(pdh 0.4.29 / cli 0.162.82)
个人数据中台(PDH)一批分析管线 + 查询解析 + 抖音/头条采集修复;FAMILY-67 通话/消息通知体验完善;Android 全局键盘遮挡一处修复。release 发 18 个安装包资产。逐版完整明细见 CHANGELOG.md。
- PDH 分析管线:
spending总额改用sumEventAmount(不再被每子类型 5000 行上限少计);overviewbyApp/byType/total 用 facetCounts(不再被 1 万行上限截断);timeline排除使用画像聚合基线事件。 - PDH 查询解析:补收入类金额词 +「多少/几」量词对称;移除 income 裸「收到」误判;「最近 N 个月」月末不再月份溢出丢整月;「花了多少钱」无「总共」时不再误判为列表(应为求和)。
- PDH 采集:抖音使用画像 + 观看记录 vault ingest;头条明文文章 reader(标题在 share_info blob);可复现微信 EnMicroMsg.db 解密入库脚本。
- FAMILY-67 通话/通知:断网重连宽限(ICE DISCONNECTED 不静默挂死);好友连接自愈(仅 DataChannel 已连时才发起 E2EE 握手);未接来电通知 + CallStyle 锁屏来电 +「保持在线接听」前台服务;好友消息通知深链进对应聊天 + 运行时申请 POST_NOTIFICATIONS(Android 13+)。
- Android 键盘遮挡:edge-to-edge 下加全局
imePadding,一处修复所有页面输入框被键盘遮挡。 - 版本面:productVersion v5.0.3.120 → v5.0.3.121 / desktop 5.0.3-alpha.121 / Android versionCode 503121 / iOS CFBundleVersion 121(check-version-sync 绿);pdh 0.4.29 +
chainlesschain0.162.82 已发 npm;Android cc bundleinternal-binaries-android-v20260619(USR_VERSION 49)。
好友语音/视频通话历史落库可查看 + 来电铃声/振动/去电回铃音 + CLI 各处网络 fetch 加超时防永久挂起。release 发 18 个安装包资产,文档三站(docs / design / www)已同步部署上线。逐版完整明细见 CHANGELOG.md。
- 通话历史:好友语音/视频通话终态经
CallHistoryRecorder落库call_history(来/去电、未接、音视频类型、挂断原因);好友资料页「查看通话记录」按好友 DID 过滤或查看全部(Flow 实时读取)。 - 来电铃声/振动 + 去电回铃音:来电播放系统铃声 + 振动(尊重静音/振动模式),去电播放回铃音,修「来电无声音」。
- CLI 网络鲁棒性:webhook 通知 /
cc update·vcheck更新检查 / provider 连通性探针均补超时(dead endpoint 不再永久挂起);reputation / 插件收益分账拒绝 NaN 的 score/amount。 - 版本面:productVersion v5.0.3.119 → v5.0.3.120 / desktop 5.0.3-alpha.120 / Android versionCode 503120 / iOS CFBundleVersion 120(check-version-sync 绿);
chainlesschain0.162.80 → 0.162.81 已发 npm。
2026-06-15 发布 — v5.0.3.114:个人数据中台 gov-ixiamen 端点真机静态校验 + Android cc bundle v20260615d(pdh 0.4.25 / cli 0.162.71)
用已 root 真机对 PDH「端点抓包」runbook 跑静态分析层(只读 APK 二进制,无任何登录态/账号介入)。修正
gov-ixiamen采集器的虚构占位主机——旧app.ixm.gov.cn实为不存在域名;真机 dex 静态分析确认 i 厦门真实后端为*.ixiamen.org.cn(业务网关https://buss.ixiamen.org.cn/pbc/),已改为真实网关(opts.listUrl可覆盖),子路径 + 请求体仍unverified(body 经libzxprotect加密静态不可见)。中行(SecNeo 壳)/工行(请求体加密+签名)维持 snapshot;12123 域名早已正确。@chainlesschain/personal-data-hub0.4.24→0.4.25 + CLI 0.162.70→0.162.71 已发 npm;Android cc bundle 滚到v20260615d、USR_VERSION→ 45。桌面 / Android / iOS 全 surface 对齐 .114(check-version-sync 绿)。
2026-06-15 发布 — v5.0.3.113:npm 发布/安装链路加固(修复中国大陆镜像装机 E404 + 版本弃用 workflow)+ VS Code 扩展 0.28/0.29 + CLI 0.162.70
桌面 / Android / iOS 全 surface 对齐 .113(check-version-sync 绿);Android cc bundle 滚到
v20260615c(携 cli 0.162.70 + pdh 0.4.24,USR_VERSION→ 44)。
- 修复中国大陆镜像
npm installE404(#33):@chainlesschain/[email protected]在registry.npmmirror.com仅有元数据、tarball 未缓存 → 默认走淘宝镜像的用户装机硬失败。已手动触发镜像 sync API 修复线上(tarball 404→200);npm-publish.yml新增「发版后自动 PUT 镜像 sync API」步(best-effort,不阻断发版),后续发版自动补齐;README 中英补「改用官方源npm i -g chainlesschain --registry https://registry.npmjs.org」说明。 npm-deprecate.yml:参数化 workflow,用 CI 的NPM_TOKENsecret 弃用/取消弃用已发布版本(本地 token 已过期)。已弃用误从陈旧 tag 发布、漏 8 个 PDH adapter wiring(douban/ximalaya/keep/didi/mercedes/eleme/xianyu/vipshop)的[email protected];0.162.69为完整修复版,0.162.70为当前 npmlatest。- VS Code 扩展 0.28.0 / 0.29.0(已发 Open VSX):后台 tab 完成信号;聊天面板
/slash 命令 +@补全 +/rewind回到 agent checkpoint。
2026-06-15 发布 — cc CLI 0.162.66:Claude-Code 编码闭环补齐——cc review(diff-first + --fix/--comment)+ headless 硬化 + cc insights + 全局 run/verify 技能(已发 npm)
对照 Claude Code CLI 的剩余高价值缺口一次性补齐。
chainlesschain0.162.65 → 0.162.66 已发 npm(全局安装实测cc review/cc insights/cc agent新 flag 全通)。
cc review— diff-first 代码审查(/code-review平价):默认审工作区 vs HEAD,可--staged/--base <ref>(PR 式base...HEAD)/--range A..B/--paths,并内联未跟踪新文件;low|medium|high力度档;--security(/security-review)与--simplify(/simplify,只清理不抓 bug)两种视角。只读模式走 plan 权限(不可改文件)出 Markdown 报告;--fix走 acceptEdits + 自动 checkpoint 直接落地修复(每次编辑可cc checkpoint restore回滚);--comment解析机读 JSON findings → 经gh在当前分支 PR 上发行内评论(--dry-run预览 + 交互确认)。- headless 无人值守硬化:
--max-budget-usd <amount>硬花费上限(按 cc cost 价格表累计每次调用成本,到顶前停下,免跑飞);--strict-mcp-config(只用--mcp-config服务器,忽略已注册 + IDE 桥,工具面可复现);--replay-user-messages(stream 输入模式回显用户消息便于转录/对账)。 cc insights [id]— 会话分析报告(/insights平价):轮次 / 工具调用与错误率 / 时长 / token 用量 + 估算 $ 成本,纯 JSONL 复盘;比cc cost更强——从session_start回填模型为 headless 会话定价。- 全局
run/verify技能:新增cli-bundled技能层(随 cc 包发布),run(按项目类型拉起并实跑)+verify(观测真实行为给 VERIFIED / NOT VERIFIED / BLOCKED 裁决);放 CLI 自有层而非桌面 builtin,不动桌面端「144 技能」计数。
- 真实 bug 修复:
project-service项目导出写 ZIP 条目时用平台默认编码(GBK 默认 JVM),导出含中文内容的项目后,UTF-8 的导入端读取时抛MalformedInputException、无法回环重导入;改为始终 UTF-8 写入 + 文件内容为 null 时写空条目兜底。 - 测试套件普查:跑通 CLI(单元/集成/e2e)、桌面(store/集成/全量单元)、Web Panel、core 包、后端 Java(
mvn test)与 Python(pytest)全栈,修复全部真实失败,仅余环境受限项(需 Ollama/Qdrant 服务或 GPU 本地推理)。 - 关键修复:CLI deprecated-shim 导出平价 +
hub子命令清单 +skill sources4→6 层 + 24 个 e2e 文件子进程超时 15s→30s(消除 Windows 冷启动抖动);桌面内置技能计数 145→146 + 纯文档型技能白名单;后端 Javamvn test32 失败→0;后端 Pythongit_manager/code_generator过期断言对齐(pytest 15→41+ 通过)。 - e2e server-readiness 二次硬化(上一条的正交轴,commit
26a811874):4 个 e2e 文件 16 个失败全部根因于 singleFork 满负载下子服务器冷启动慢、就绪等待器/per-test 预算太紧(非产品 bug——cc ui独立跑约 3.3s 即就绪)。ui-command/web-panel 就绪 fallback 8s/10s→25s(旧逻辑到期静默返回空输出,级联砸 13 个测试)、coding-agentwaitForReady10s→25s、mtc-audit 给显式 120s、orchestrate 修 timeout 倒挂 20s→40s(旧值比子命令自身 30s 超时还短)。验证 89/89。详见内部手册 trap #31。
2026-06-11 主线 — cc CLI 0.162.41:Claude-Code 平价终章——项目记忆(cc.md)+ REPL steering + 结构化输出(已发 npm,待并入下一发版)
- 项目记忆体系(claude CLAUDE.md 平价,自有主名
cc.md):cc agent启动自动加载cc.md>CLAUDE.md>AGENTS.md层级(用户级/项目链/local 伴随/.chainlesschain/rules.md/路径作用域.claude/rules,@path递归 import,48K/192K 预算 fail-open);cc init默认改为项目盘点生成 cc.md(/init平价,模板退-t,--ai用有界 agent 精炼约定),已有 CLAUDE.md 自动@import防遮蔽;cc memory files查看实际加载链。 - REPL steering 三件套 + 快捷键:回合中输入 FIFO 排队(修掉并发回合 race)、Esc 即时中断(复用 agentLoop AbortSignal)、
/rewind+ 空闲双 Esc 会话回退(原文回填改完重发);! <cmd>bash 直通(输出回灌上下文)、# <note>一键记入 cc.md、/命令 TAB 补全、/context实时窗口占用、--resume离线恢复摘要。 - 结构化输出与生态出口:
cc agent -p --json-schema <file>(回答经 JSON Schema 校验 + 自动纠错重试,stdout 只出合规 JSON);cc mcp serve(本机文件工具反向暴露为 MCP server,root 限域 + Bearer);cc session export(agent 转录 Markdown)/cc session search(跨会话全文检索);启动被动版本提醒(缓存 + detached 后台刷新,热路径零网络)。 - npm 包:
chainlesschainCLI 0.162.40 → 0.162.41 已发 npm(发布产物全局安装实测:init 盘点/记忆链/json-schema/mcp serve 全通)。
- 提交时自动共享编辑器状态:IDE 桥接连上后,每条 prompt(headless / stream / REPL)自动附带
<ide-context>块——活跃文件、打开标签页、当前选中代码,模型即时知道"你正看着什么",无须手动粘贴;只进在途消息、不写会话持久化(--resume回放原话)。 - 编辑后诊断自动回喂:agent 改完文件,编辑器语言服务器的 error/warning 自动回流到工具结果,模型在同一循环内看到并修掉刚引入的报错。
- 开关与测试:
CC_IDE_CONTEXT=0一键关闭;新增 37 项测试(31 单测 + 4 集成 + 2 真进程 e2e,全部免编辑器宿主可跑)。
在好友端到端加密消息(FAMILY-67)之上补齐 1:1 实时语音 / 视频通话:纯 P2P + DTLS-SRTP 端到端加密,信令复用既有信令服务器中继(与消息同一好友 DID 路由),媒体走独立 WebRTC PeerConnection。设计文档
docs/design/FAMILY-67_Friend_P2P_AudioVideo_Call_Design.md§10。
- P0 信令状态机:
CallManager(呼叫/响铃/接听/拒接/挂断 + glare 双呼仲裁 + 超时)+CallSignalingClient(call:*信令经信令服务器中继,DataChannel 没建过也保送达)。 - P1 语音:独立媒体
PeerConnection(复用消息侧PeerConnectionFactory+ ICE/TURN 配置)+ 音频路由(MODE_IN_COMMUNICATION+ 听筒/扬声器)。 - P2 视频:懒建带
EglBase+ 编解码工厂的视频版PeerConnectionFactory,前置摄像头采集 + 远端全屏 + 本地 PiP + 摄像头翻转。 - P3 后台/锁屏:来电前台服务(
microphone|camera,保锁屏/熄屏麦克风不被杀)+ 全屏来电通知(越锁屏点亮屏幕 + 接听/拒接)+ 接近传感器贴耳息屏。 - 测试:状态机/信令/集成(Robolectric)/握手 e2e 共 34 个 JVM 单测全绿;真机双向音视频 + 锁屏来电验收需两台真机。
一轮
/loop把 PDH 采集覆盖补齐:完成阶段所有 ≥⭐⭐⭐ 平台 + 可行的长尾全部落地。逐项明细见 CHANGELOG.md。
- 新增 13 个采集 adapter:同程旅行 / 滴滴企业版 / 大众点评 / 知乎 / CSDN / WPS 云文档 / 腾讯文档 / 百度网盘 / 酷狗音乐 / 爱奇艺 / 腾讯视频 / BOSS 直聘(每个均 snapshot + cookie-api 双模)。
- 3 个同形平台共享工厂:
_document-base(文档/云盘)、_video-base(视频观看史),复用既有 shopping/travel/im base 模式。 - 已发布:
@chainlesschain/personal-data-hub0.4.18 + CLI 0.162.60(npm);Android cc bundle →internal-binaries-android-v20260614b(携全部新 adapter)。 - 版本面:productVersion v5.0.3.109 → v5.0.3.110 / desktop 5.0.3-alpha.110 / Android versionCode 503110 · USR_VERSION 36 → 37 / iOS CFBundleVersion 110。
2026-06-14 发布 — v5.0.3.109:修复 Android 发布 APK 缺 cc bundle(release.yml 补 downloadInternalBinaries + 硬验证 gate)
v5.0.3.108 真机验证发现发布的 APK 不含
cc-cli.tgz(设备上 local-terminal/cc 不可用)。根因:release.yml 只跑assembleRelease,downloadInternalBinaries的 preBuild dependsOn 在 CI 不触发。逐版完整明细见 CHANGELOG.md。
- 修复:build-android 在 assemble 前独立跑
downloadInternalBinaries(保证 cc-cli.tgz 落盘),build 后加硬 gate(unzip -l apk | grep cc-cli.tgz缺则 fail),杜绝再发无 bundle 的 APK。 - 纯打包修复:bundle 内容不变(pdh 0.4.6 / internal-binaries-android-v20260613 / USR_VERSION 25)。
- 版本面:productVersion v5.0.3.108 → v5.0.3.109 / desktop 5.0.3-alpha.109 / Android versionCode 503109 / iOS CFBundleVersion 109。
2026-06-13 发布 — v5.0.3.108:个人数据中台拼多多采集补全(snapshot-only → cookie-api,anti_token signProvider seam)+ Android cc bundle v20260613(pdh 0.4.6 / cli 0.162.48)
拼多多是购物三联里最后一个仅 user-export 快照、无自动采集路径的适配器;本版补齐 cookie-api 主动采集,与 taobao/jd/meituan 平价。逐版完整明细见 CHANGELOG.md。
- 拼多多
shopping-pinduoduocookie-api(v0.2.0):_syncViaCookie经注入fetchFn拉transaction_list;anti_token 签名经signProviderseam 注入(Android 端 WebView JS VM 产出);orderToRecord映射字段(snake/camel 双兼容)+ 分→元 + 状态映射;extractOrders容错嵌套;分页 watermark 提前停。capabilities 升sync:cookie-api;+13 测试,PDH 全套 2094 通过 / 9 跳过。 - 发版链:pdh 0.4.5 → 0.4.6 + CLI 0.162.47 → 0.162.48 已发 npm;Android cc bundle
internal-binaries-android-v20260613(pdh 0.4.6)+USR_VERSION 24 → 25+binariesVersion 20260612 → 20260613。 - 版本面:productVersion v5.0.3.107 → v5.0.3.108 / desktop 5.0.3-alpha.108 / Android versionCode 503108 · USR_VERSION 24 → 25 / iOS CFBundleVersion 108。
2026-06-12 发布 — v5.0.3.107:个人数据中台 FAMILY-23 家庭守护采集器 v0.2 live fetcher 全收口(作业帮 / 华为学习中心 / 支付宝)+ Android cc bundle v20260612(cli 0.162.46 / pdh 0.4.5)
本版收口个人数据中台「家庭守护 telemetry」最后 3 个仅快照占位的采集器,使其具备主动 live 采集能力。逐版完整明细见 CHANGELOG.md。
- FAMILY-23 采集器 v0.2(snapshot + live 双路):作业帮
edu-zuoyebang(ZYBUSS cookie → 学习/搜题记录)、华为学习中心edu-huawei-learning(华为账号 cookie → 课程学习记录)、支付宝finance-alipay(会话 cookie → mobilegw 账单明细,签名 seam + 金额元→分 + 收支方向推导,高敏感闸不变)。三者补齐sync:cookie+_syncViaLive(normalize 不变),新增共享_live-json-helpers.js。 - 测试:+39(3 套 live 测试钉请求构造+解析契约),PDH 全套 128 文件 2083 tests 全绿。端点 best-effort(多字段名兼容,未实地验证,漂移时改 api-client 常量)。
- Android in-APK cc bundle 刷新:
internal-binaries-android-v20260612(cli 0.162.46 + pdh 0.4.5,内核实测)+USR_VERSION 23 → 24;真机装新 APK 触发LocalFilesystemBootstrappersentinel 23→24 重提取。 - npm 包:
chainlesschainCLI 0.162.45 → 0.162.46 +@chainlesschain/personal-data-hub0.4.4 → 0.4.5 已发 npm。 - 版本面:productVersion v5.0.3.106 → v5.0.3.107 / desktop 5.0.3-alpha.107 / Android versionCode 503107 · USR_VERSION 23 → 24 / iOS CFBundleVersion 107。
2026-06-11 发布 — v5.0.3.106:PDH 快手 api_ph base64 采集修复 + 高德标题 bug + 全适配器测试收口(pdh 0.4.4 / cli 0.162.40)+ Android cc bundle v20260611(真机实证重提取)
本版以 PDH 个人数据中台采集层为主线。逐版完整明细见 CHANGELOG.md。
- PDH 采集修复(pdh 0.4.4):新版快手
kuaishou.web.cp.api_phcookie 改为 base64(JSON),加apiPhDecodeCandidates解码链恢复 profile 采集;travel-basebuildTitle加name三级回退修高德所有行程事件标题car: ? → ?;订正头条/快手/邮箱 3 处过时注释。 - 测试矩阵全收口(+180):小红书 ADB 三件套 58 + 出行 6 模块 74 + whatsapp/shopping-base 24 + 快手 base64 9 → 全仓 55 适配器测试覆盖 100%。
- Android in-APK cc bundle 刷新 + 真机验证:
internal-binaries-android-v20260611(pdh 0.4.4 + cli 0.162.40)+USR_VERSION 21 → 22;真机(Xiaomi amethyst)实证装新 APK 触发LocalFilesystemBootstrappersentinel 17→22 重提取,设备上 pdh=0.4.4 + 两处修复 grep 命中。 - npm 包:
chainlesschainCLI 0.162.39 → 0.162.40 +@chainlesschain/personal-data-hub0.4.3 → 0.4.4 已发 npm。 - 版本面:productVersion v5.0.3.105 → v5.0.3.106 / desktop 5.0.3-alpha.106 / Android versionCode 503106 · USR_VERSION 21 → 22 / iOS CFBundleVersion 106。
2026-06-10 发布 — v5.0.3.105:cc agent MCP prompts/resources + SubagentStop hook + --fork-session(CLI 0.162.38)+ Android cc 内置 bundle 刷新
把 v5.0.3.104 之后 2026-06-10 的 CLI 平价主线固化为一次正式发版。逐版完整明细见 CHANGELOG.md。
- cc CLI 0.162.38(Claude-Code 平价三连):MCP prompts 作为 slash 命令 + MCP resources 暴露给 agent/REPL;
SubagentStopsettings.json hook;cc agent --fork-session(复制既有会话为新分支继续)。 - Android in-APK cc bundle 刷新:
cc-cli.tgz重建(cli 0.162.38 + pdh 0.4.3)→ 新内部二进制 release(binariesVersion 20260610)+USR_VERSION 20 → 21,补上 v5.0.3.101 以来 APK 内置 cc 跑旧代码的缺口。 - Tests / CI:CLI e2e 共享 helper(testHome + freePort,Layer 2)+ e2e 隔离/重试 CI 加固 + 桌面端 10 个 stale 单测修复。
- Docs:docs-site 补全 14 个 CLI 命令用户文档 + 全站数字对账(155 命令/145 技能/25 Android)。
- npm 包:
chainlesschainCLI 0.162.38 已发 npm +@chainlesschain/personal-data-hub0.4.3(沿用)。 - 版本面:productVersion v5.0.3.104 → v5.0.3.105 / desktop 5.0.3-alpha.105 / Android versionCode 503105 · USR_VERSION 20 → 21 / iOS CFBundleVersion 105。
(补记)本版主体:CLI 0.162.37 发 npm;iOS/Android/desktop 版本对齐;VS Code 扩展 Open VSX 自动发布 CI + 图标重绘;JetBrains buildPlugin 修复;docs-site 新增 8 个 CLI 用户文档页 + Family Guard 用户页;发布文档脱敏;桌面端 vitest-4 stub bug + 12 个 stale 测试修复。逐版完整明细见 CHANGELOG.md。
2026-06-10 发布 — v5.0.3.103:cc loop(/loop 平价)+ IDE 桥接 Phase 3/4(JetBrains 平价 + 发布基建)+ VS Code 扩展可视化与品牌化
把 v5.0.3.102 之后 2026-06-10 的工程主线固化为一次正式发版。逐版完整明细见 CHANGELOG.md。
- cc loop(Claude-Code
/loop平价):固定间隔循环执行 prompt / slash 命令 +--dynamic自定步速(含 prompt 模式 agent flag 透传)+--save/--resume会话持久化 + headless(非 TTY)下稳定运行。 - IDE 桥接 Phase 3(JetBrains 平价):纯 JDK 协议核(MiniJson / McpServer / LockfileWriter / IdeTools)+ IntelliJ glue,CLI 零改动双证 + 跨语言 interop 实跑验证;REPL 中 IDE 自动连接遵循
--ide/--no-ide。 - IDE 桥接 Phase 4(发布与维护基建):
ide-extensions.yml(vsce package/publish + gradlew buildPlugin/publishPlugin,tag + secret 双门控,不建 GitHub Release,缺 secret fail-fast)+ LICENSE/CHANGELOG + 发布文档。 - VS Code 扩展可视化与品牌化:IDE 桥接可视化(状态栏 + 侧边栏 + 仪表板,0.2.0)+ ChainlessChain 品牌 logo 作为扩展图标与 Activity Bar 图标(0.2.1)。
- npm 包:
chainlesschainCLI 沿用 0.162.36 +@chainlesschain/personal-data-hub0.4.3(已发 npm)。 - 版本面:productVersion v5.0.3.102 → v5.0.3.103 / desktop 5.0.3-alpha.103 / Android versionCode 503103 / iOS CFBundleVersion 103。
2026-06-10 发布 — v5.0.3.102:IDE 桥接落地(cc ide + VS Code 扩展)+ cc 命令行 Claude-Code 平价收官 + cc agent 多模态视觉输入
把 cc 命令行向 Claude Code 的平价能力收官,并新增 IDE 桥接与多模态视觉输入。逐版完整明细见 CHANGELOG.md。
- IDE 桥接落地:新增
cc ide命令 + VS Code 扩展,自动发现并连接编辑器内置的 MCP server,支持openDiff接受/拒绝往返(CLI 命令数 149 → 150)。 - cc 命令行 Claude-Code 平价收官:MCP OAuth 远程授权、自定义及内置上下文用量状态栏、输出风格、
web_search可插拔搜索、扩展思考、settings.json全事件 hooks 及 block 语义、headlessagent -p、/compact自动压缩、cc checkpoint双引擎、权限规则。 - cc agent 多模态视觉输入:
cc agent --image(自动使用配置的视觉模型)。 - npm 包:
chainlesschainCLI 0.162.36 已发 npm。 - 版本面:productVersion v5.0.3.101 → v5.0.3.102 / desktop 5.0.3-alpha.102 / Android versionCode 503102 / iOS CFBundleVersion 102。
把 v5.0.3.100 之后累积的工程主线固化为一次正式发版。逐版完整明细见 CHANGELOG.md。
- CLI 向 Claude-Code 平价收尾:headless
agent -p全家桶(--output-format/--max-turns/--allowed-/--disallowed-tools/--permission-mode/ stdin /--input-format stream-json/--system-prompt/--add-dir/--fallback-model)+@file引用在ask/chat平价 +cc costtoken 计费(可llm.pricing覆盖)+ 文件态cc checkpoint/rewind。 - CLI agent 能力扩展:扩展思考
--think/--ultrathink/--thinking-budget(Anthropic,自适应 effort 与 legacy budget 自动择一)+ 多模态图像输入--image(png/jpg/gif/webp,按 provider 转换:OpenAI 兼容透传 / ollama / anthropic)+ 内置web_search工具(可插拔搜索源:tavily/brave/bocha/千帆 + 免 key DuckDuckGo/百度)。 - PDH 微信 4.0 完整采集 + QQ-NT 一键解密/解析:微信 4.0 每库独立密钥 + zstd 消息体 + 公众号/朋友圈/收藏 + 非文本人话化;QQ-NT 端到端解密 + protobuf 解析(真机
nt_msg.db验证)+ 名称补全(uin→昵称 / 群号→群名)+pdh-im-collect内置技能。 - 安全 fail-closed 套件(审计跟进):SAML 签名 + OAuth id_token + 通道消息签名 + permission-ipc DB 回退全部 fail-closed,删硬编码 "123456",渲染层
days入参净化。 - U-Key 口令托管层(Phase 3,默认 gated OFF) + 桌面 DB/LLM 性能面板 V6 端口接通(db-performance IPC 此前从未注册现接通)。
- npm 包:
@chainlesschain/personal-data-hub0.4.2 → 0.4.3 +chainlesschainCLI 0.162.31 → 0.162.32(待发 npm)。 - 版本面:productVersion v5.0.3.100 → v5.0.3.101 / desktop 5.0.3-alpha.101 / Android versionCode 503101 · USR_VERSION 19 → 20 / iOS CFBundleVersion 101.
v5.0.3.99 把个人数据中台(PDH)采集能力大幅扩容并真机生效;v5.0.3.100 把其后的打包工作固化为一次正式发版(全平台 18 产物已 ship,GitHub Release v5.0.3.100 已发布)。逐版完整明细见 CHANGELOG.md。
- PDH 采集大更新(v5.0.3.99):adapter readiness 止血(从宽松
healthCheck分离真正「就绪」判定,解决「配置正常却采不到」死角)+ 桌面/移动端「一键采集 / 导入引导」UI + 新接通多家本地直读源(抖音 / 微信电脑版 / QQ-NT / 钉钉 / 飞书 / Apple 健康 / 网易云音乐 / 微信读书)+ email 账单 LLM 补全(Phase 5.5)+ iOS 加密备份解密(Phase 7.5b)。当前 PDH 共 51 adapter / 121 测试文件 / 2040 测试。 - DB 静态加密默认开启(v5.0.3.99):
PHASE_1_5_DEFAULT_ON=true落盘即加密(preflip 自动化闸门全绿)+ DID keystore 打包态 fail-closed。 - Android「AI 陪学」接入界面(v5.0.3.99):M9 积分引擎 + M10 家长温和度月报 + M5 任务可见 UI 接成家庭 tab 可交互入口;陪伴 tab 复用 core-security KeystoreFacade TEE 加密落盘。
- CLI npm 发布通道修复(v5.0.3.100):
prepublishOnly → build:web-panel在npm publish下因父进程泄漏npm_config_local_prefix把依赖装错位置 → 隔离 temp 构建 + scrubnpm_config_*env 修复,CLI 从此可正常发版。 - npm 包:
@chainlesschain/personal-data-hub0.4.1 +chainlesschainCLI 0.162.30 已发布并验证安装。 - 版本面:productVersion v5.0.3.98 → v5.0.3.100 / desktop 5.0.3-alpha.100 / Android versionCode 503100 / iOS CFBundleVersion 100。
一轮把 PDH 从"主要采社交/订单/出行"扩展到 覆盖桌面本机日常数据流:浏览器(Chrome + Edge)/ 开发工具(VSCode)/ 系统活动(Win Recent)/ Android 媒体清单。全部 desktop-local file-import 模式 — 零扩展、零网络、零账号 — 复用既有 PDH adapter 契约 + LocalVault 加密存储 + AdapterRegistry 调度链。
- 5 新 adapter(commits
126ec9683/8b053843a/c923f627b/3c1e55559/21e125e1ee):browser-history-chromev0.1.0 —%LOCALAPPDATA%\Google\Chrome\User Data\Default\{History,Bookmarks}SQLite 复制读 + JSON 解。真机:14689 visits + 27 bookmarks。browser-history-edgev0.1.0 — Chromium 子类继承(仅覆盖_browserConfig()指向 Edge profile)。真机:2022 visits。vscodev0.1.0 — workspaceStorage/*/workspace.json + globalStorage/state.vscdb terminal.history. 真机:22 工作区 + 32 命令 + 13 路径。win-recentv0.1.0 —%APPDATA%\Microsoft\Windows\Recent\*.lnk跨应用打开时间线。真机:52 .lnk。system-data-androidv0.2.0 → v0.3.0 — ADB 直采加media.list(5 类 /sdcard 目录) + per-category include 门控。真机:3751 文件清单。
- 测试三层完整覆盖:
- 单测 76 新(chrome 17 / edge 7 / vscode 19 / win-recent 13 / SDA v0.2/v0.3 专项 5 + 助手 15)— 全绿
- 整合测:
__tests__/integration/local-data-adapters-pipeline.test.js6 测验 4 adapter 真走 LocalVault + AdapterRegistry round-trip + 跨 adapter source-tagged 分布断言 - E2E:
__tests__/e2e/local-data-adapters-cli.e2e.test.js2 测 spawncc hub list-adapters --json+cc hub sync-adapter win-recent --json,sandbox APPDATA 防污染用户 vault - 本地 Win 测试 skip 干净(bs3mc 已知 ABI v140 vs Node 22/24 不匹配),CI Linux 真跑
- 3 wiring 全 land:CLI
personal-data-hub-wiring.js+ desktopwiring.js+ WSBRIDGE_PREFERREDskip-list 都同步加 5 adapter(避免误走 ADB auto-pull)。categories.js+pdhCategories.js加browser-*/vscode/win-recent→system分类规则。 - bug 修:4 个 stale
system-data-android.test.js测试 — sensitivity medium→high / mock bridge 加 sms/call/media 3 method stub。22 旧 + 5 新 v0.2/v0.3 = 27 全绿。 - 文档:
Personal_Data_Hub_Architecture.md加 v0.4 entry + Phase 17 行;本 README 加本章。
memory 沉淀(无新增):本轮所有 adapter 走既有 file-import 模式,无新 trap。Win bs3mc ABI 困境已在 pdh_plan_a_android_standalone_design.md §"bs3mc NODE_MODULE_VERSION mismatch" 记录。
一日内把 PDH 从 v0.1(Bilibili 一家) 推到 v0.2 真接通 11 平台:社交内容 (微博/抖音/小红书/头条/快手) + 购物 (京东/美团/拼多多/淘宝/支付宝) + 出行地图 (高德/携程/百度地图/腾讯地图) + AI 助手 9 路 WebView (DeepSeek / Kimi / 通义千问 / 智谱清言 / 腾讯混元 / 文心一言 / 字节扣子 / 即梦 / 豆包) + 邮箱 4 家 IMAP (QQ / Gmail / 163 / Outlook via Jakarta Mail) 真接通。WeChat Phase 12.10 4 子阶完成 — SQLCipher 真解密 + frida-inject 真注入 + 16.5.9 binary vendored + APK ship 到 Xiaomi 真机;QQ Phase 13.5 v0.2 — XOR-IMEI 算法 byte-identical sjqz 移植,无需 SQLCipher 无需 frida,仅 root + IMEI。Android 端侧 LLM 全链路 skeleton 落地 (Ktor server + ModelManager + cc spawn + PDH 本机提问 tab)。
- 平台 v0.2 升级一览(11 placeholder 卡 → 真接通):
- 社交内容:微博 (
c087c36eb) / 抖音 (20f9b2188) / 小红书 (20f9b2188) / 头条 (e1155b1d7) / 快手 (e1155b1d7) — 全 dual-mode (Android in-app snapshot + 桌面 cookie) - 购物:京东/美团 dual-mode (
f3cbd0693) / 拼多多 SAF JSON (78695c25e) / 淘宝 HTML + 支付宝 CSV (799e364f0) - 出行地图:高德/携程 cookie-scrape WebView (
0fe572f2) / 百度地图/腾讯地图 (3d1cf9481) - AI 助手:9 路 WebView cookie scrape + cc sync wire (
1e7725552);8 卡 enable (20e0318b4) - 邮箱:QQ/Gmail/163/Outlook 4 家 IMAP 真 Jakarta Mail 接通 (
7777f5bec)
- 社交内容:微博 (
- WeChat in-app collector Phase 12.10 (4 sub-phase 全 land):12.10.1+12.10.2 scaffold (
8c52d5963) → 12.10.3 SQLCipher 真解密 (8081f8a0d) sjqz MD5(IMEI+UIN)[:7] 7.x + frida 64-hex 8.x 双路径 + 3 PRAGMA profile fallback + WAL+SHM cohort → 12.10.4 frida-inject (37a4e465d) spawn /data/local/tmp/cc-* + 5-symbol hook → 12.10.6 prereq vendor frida 16.5.9 arm64+armeabi-v7a APK ship (cdfe1048e)。Phase 12.10.5 cc syncAdapter wechat --input wire 早 land。剩 12.10.6 真机 E2E 需 root 机子 + Magisk。 - QQ Phase 13.5 v0.2 (
a07731b46):XOR-IMEI 算法 byte-identical sjqzqq.py移植。与 WeChat 路径根本不同 — QQ Android 用普通 SQLite + msgData 每行 IMEI XOR-cycle 加密,不需要 sqlcipher-android 不需要 frida — 仅 root + IMEI 输入。4 Kotlin (QQXorDecryptor / QQCredentialsStore / QQDbExtractor / QQLocalCollector) + 27 Kotlin unit tests + JS 13 snapshot + 6 longtail 全绿。 - A3 Android 端侧 LLM 全链路 skeleton (724 LOC):Ktor LLM server :11434 + ModelManager + cc spawn 内嵌 OllamaClient (
f41f06441) + KotlinLlamaCppEngine 骨架 (8f023052a)。架构 HTTP-Hybrid (Kotlin Ktor ↔ in-APK cc OllamaClient)。剩 Maven deps + JNI + 真机 ~5-7d (需 Mac/Linux + Android NDK)。 - 三道锁 UI + 真接通:拒云 / 销毁 / 导出 —
cc hub export真接通;D11 SAF picker 升级到用户选位置 (7e4fa844f)。 - AI 给出处真接通 (
3a76ee5e4):cc hub event-detail+ citation chip 点击跳事件详情 sheet。 - release.yml 链路修复 (
12d1391d1):split workspace deps publish 前置 job — 解 v5.0.3.79 desktop build chicken-and-egg。 - 测试基线刷新:93 新 snapshot tests (weibo 8 / douyin 8 / xhs 8 / toutiao 8 / kuaishou 8 / jd 8 / meituan 8 / pinduoduo 8 / baidu-map 8 / tencent-map 8 / qq 13) + WeChat Phase 12.10 51 新单测 + QQ Phase 13.5 27 Kotlin 单测。同日 3 stale-assertion fix(longtail Douyin uid / analysis TOTALS regex / hub-command 子命令快照)— 156/156 PDH snapshot + 101/101 desktop PDH + 87/87 CLI hub 全绿。
- 版本面:productVersion v5.0.3.78 → v5.0.3.80 / CLI 0.162.14 → 0.162.16 / npm
@chainlesschain/personal-data-hub0.2.1 → 0.2.3 / Android versionCode 503080 / iOS CFBundleVersion 80。
memory 沉淀:android_wechat_collector_phase_12_10.md(8 trap + 5 真机 blocker)+ android_qq_collector_phase_13_5.md(10 trap)+ pdh_a8_weibo_v0_2_landed.md + pdh_a3_skeleton_landed.md + wechat_frida_hook_audit_traps.md。完整 PDH v0.2 路线见 docs/chainlesschain/personal-data-hub.md 与 docs/design/PDH_Article_Implementation_Plan.md。
Plan A v0.1 的 "本机数据" tab 从 1 张卡(system-data-android)扩展到 5 张。Bilibili 端到端 ship(WebView 登录 + OkHttp 4 端点 + 本机 SQLCipher vault),微博/抖音/小红书占位卡片(v0.2 已完成 — 见上)。全程不依赖桌面在线 — Android 内完成 cookie 抓取 + HTTP 拉取 + JSON 解析 + 本机加密存储。
- Bilibili 端到端:
packages/personal-data-hub/lib/adapters/social-bilibili/{adapter,index}.jsJS adapter 重构(stateless constructor + 新_syncViaSnapshot(opts.inputPath)模式 + 保留 legacy sqlite-mode)+ 4 个 Kotlin 文件(SocialCookieWebViewScreen通用 4 平台共用 /BilibiliApiClientOkHttp 4 endpoint /BilibiliCredentialsStoreEncryptedSharedPreferences AES-256-GCM /BilibiliLocalCollector编排器)。4 类事件(观看历史/收藏/动态/关注)yield + normalize 进 vault。 - HubLocalScreen 多卡片重构:5 张 adapter 卡片 + login WebView overlay +
globalSyncingAdapter互斥锁。微博/抖音/小红书显示 "v0.2 开放" 状态,点登录/同步触发 toast。 - CLI + Desktop wiring 双 land:
packages/cli/src/lib/personal-data-hub-wiring.js+desktop-app-vue/src/main/personal-data-hub/wiring.js同步加BilibiliAdapterstateless 自动注册。Adapter tab 现在也显示 2 张卡(system-data-android + social-bilibili)。 - 测试覆盖:
- JS unit: 12 新 snapshot-mode 测试 (
social-bilibili-snapshot.test.js) + 4 legacy sqlite-mode 测试重写 (social-adapters.test.jsflat payload 形状) = 547/547 全绿 - JS integration: 6 新测试 (
integration/social-bilibili-pipeline.test.js) 真 vault end-to-end + idempotency + partial + schemaVersion mismatch - Kotlin unit: 14
BilibiliApiClientTest(MockWebServer) + 8BilibiliLocalCollectorTest(mockk) + 15HubLocalViewModelTest= 37 新测试 - Android E2E: 8 场景
@Ignore + TODO()stub + 完整 plandocs/design/A8_Bilibili_E2E_Plan.md(Mac/Linux + 真机 + 真账号 ~1.5h 串行)
- JS unit: 12 新 snapshot-mode 测试 (
- bug 修复:(1) BilibiliApiClient
extractUid加> 0L哨兵 — Bilibili 不发 uid=0,旧实现会把 mid-logout cookie 当合法登录 (2) JS adapter sqlite-mode 旧payload.row.X套层改 flatpayload.X— 既有 4 test 同步迁移 - 设计文档:
docs/design/Adapter_Social_Cookie.md~400 行(4 平台对比 + snapshot schema + JS/Kotlin layer 模板 + 7 forward-looking traps)+docs/design/A8_Bilibili_E2E_Plan.md~200 行 - 架构关键差异澄清:Android 上 PDH 有两条路径长期被混淆:(a) Adapter tab → 桌面依赖(RemoteCommandClient → 桌面 hub registry)(b) 本机数据 tab → APK 内 cc + 本机 SQLCipher vault(完全离桌面)。A8 全落到后者,对应"不依赖桌面"诉求。
memory 新增 pdh_a8_social_adapters_landing.md:7 forward-looking traps (WBI 签名 / EncryptedSharedPref keystore corruption / flat payload vs legacy row / in-APK bundle audit / DedeUserID 提取位置 / OkHttp baseUrl override 时序 / CookieManager flush 同步语义)。v0.2 路线:微博 ~1.5d / 抖音 ~2d(msToken+X-Bogus 签名)/ 小红书 ~2d(X-s 签名)≈ ~5d 总工期。
详见 docs/design/Adapter_Social_Cookie.md。
2026-05-21 收口 — PDH Phase 14.1 step 5 ChatBubble UI + Phase 12.9 WeChat 真机 E2E Runbook + office-skill word lib hotfix (v5.0.3.76 → v5.0.3.77 iOS .ipa re-ship)
v5.0.3.76 维护批:office-skill 真功能修 + 3 站全量文档刷新(v5.0.3.76 sizes/版本号);并把 PDH Phase 14 Android 端 ChatBubble UI 收尾 + 新增 WeChat Phase 12.9 真机验收 runbook 一并推到 docs.chainlesschain.com / design.chainlesschain.com。v5.0.3.77 是 .76 的 iOS .ipa re-cut(.76 release run #1 build-ios 失败 + finalize 自动 flip 已发布 → run #2 .ipa 上传被 GitHub immutable-releases blocked;tag burn 走 github_immutable_release_tag_burn 流程,重新 cut .77 全 18-asset 干净 ship 一次)。
- Phase 14.1 step 5(Android)— ChatBubble UI:
HubAskScreen把 flatSurface + plain text升级成HubChatBubble(左下 4dp / 右下 4dp 不对称圆角 = 经典 bubble tail;assistantsecondaryContainer左对齐 + userprimaryContainer右对齐;max width 320dp 防长答案撑屏)+HubBlinkingCursor(500ms reverse-fade▎)填充 in-flight 推理态。HubAskUiState加submittedQuestionfield 把「输入框实时内容」与「已提交问题快照」解耦,bubble 显示历史问的同时用户可继续编辑下一题。+2 单测覆盖 submit 快照与 clear 重置;HubAskViewModelTest累计 10/10 + PDH 5-file 总 44/44 全绿(pure UI/state,无 IPC 改动;framework 全 reuse Phase 5 iOS pattern)。Streaming token-by-token wire-up 仍 defer 待 Phase 14.5。 - Phase 12.9 WeChat 真机 E2E Runbook (新设计文档):
docs/design/Personal_Data_Hub_Phase_12_9_WeChat_RealDevice_E2E_Runbook.md~21 KB。11 场景验收(首次 ingest / 解密 spot-check / ask Q&A / citation 反查 / 5 万条性能 / 增量 / hook resilience / 反检测 / 失败恢复 / 隐私 gate / 24h 长稳)+ 6-8h 执行预估 + dataset 量级门槛(≥ 5w 条 message 才能上 §12.9.5 大库基准)。与既有Adapter_WeChat_SQLCipher_Frida_Setup.md(setup-only)+Personal_Data_Hub_E2E_Runbook.md §11(注册流程)三件套构成 Phase 12.6 完整验收链。 - office-skill bug fix(
aabe7d0f7):(1)readWordstub 替换为真实mammoth实现(之前 stub 让 Word 解析路径 silently 返空);(2) wordLib cache 与 paragraph cache 拆分 + 修 paragraphs silent drop。 - 3 站文档全量刷新:docs-site
chainlesschain-docs-v5.0.3.76487 HTML / docs-site-designdesign-docs-v5.0.3.76200 + Phase 12.9 HTML / docs-website-v2 v5.0.3.76 sizes 真值(11 平台 size 全 sync gh release)+ 「144 条 CLI 命令 / 141 内置 Skills」反 stale(之前 dist baked 112/139)。两 sync 脚本 ROOT_FILE_MAP 加 Phase 12.9 显式映射 防 unmapped 文件 silent 落unknown-unmapped.md互相覆盖(per memorydocs_site_sync_unmapped_fallthrough)。
测试摘要:本轮验过 5 个 PDH Android 测试类 44/44 + 桌面 PDH 4 文件 93/93 + WeChat 适配器 8 文件 107/107 + mobile-skill-whitelist + unified-config-manager 17/17 = 19 文件 / 261 测试 / 0 失败。E2E(Phase 14.4 + Phase 12.9)需 Mac+iPhone+Xiaomi+真桌面 + Xiaomi+Frida-server,Win 单 dev box 不能跑,已 follow-up。
详见 docs/design/Personal_Data_Hub_Phase_14_Mobile_Native_Entry.md 与 docs/design/Personal_Data_Hub_Phase_12_9_WeChat_RealDevice_E2E_Runbook.md。
2026-05-21 收口 — WeChat Phase 12.6.7-10:bootstrap 编排层 + IPC/WS + cc hub wechat CLI + Vue UI 向导 (v5.0.3.75)
WeChat 8.0+ frida-dep 路径一晚从零件凑齐到端到端可用全收口(§18.7 的 6 sub-phase 之上加 4 个新 sub-phase)。
- 12.6.7 bootstrap.js:把 env-probe → KeyProvider 选择 → WechatAdapter ctor 拼成单入口,IPC/WS/CLI 三 caller 不再各自重发明 wiring。md5/frida/unsupported 决策矩阵 +
opts.keyProviderOverride旁路 + 全注入 test seam(_probe/_md5Provider/_fridaProvider/_WechatAdapter)。14 单测全 hermetic(无 adb、无 Frida、无真设备)。 - 12.6.8 IPC + WS:4 个 IPC 通道 + 4 个 cc ui WS 主题(
wechat-env-probe/register-wechat/unregister-wechat/list-wechat-accounts)。register-wechat/unregister-wechat加入approvalChannelsForMobileprivileged whitelist —— 防 mobile peer 偷偷往攻击者控制的 dbPath 注册 adapter 或触发 Frida session。15 wiring 单测 + 2 whitelist regression 单测。 - 12.6.9
cc hub wechatCLI:env-probe / register --uin --db --wechat-data-path [--force-provider] / list / unregister <uin>4 个 verb 镜像 4 WS 主题,--json全 verb 可机读,脚本与 Plan A 手机内嵌终端可用。14 CLI 单测。 - 12.6.10 Vue UI 向导:
WechatWizard.vue295 行 3-step drawer(env-probe checklist 动态 Tag 着色 → uin + dbPath + wechatDataPath + forceProvider 表单 → result 结构化错误 + probe.reasons 反馈)+PersonalDataHub.vue「添加 WeChat」按钮 + composable 4 method。6 composable 单测。 - 集成测试:9 个端到端测试 covering md5 happy / frida happy / unsupported / md5 缺 wechatDataPath / 幂等重注册 / 两 uin 共存 / override 双向 —— 全部不触真 adb / Frida / 真设备。
- 真机 E2E 准备:
Personal_Data_Hub_E2E_Runbook.md§11 新增 3 个 WeChat 真机场景(pre-8.0 md5 / 8.0+ frida rooted / 8.0+ unrooted 优雅拒绝)+ 性能基准表。Phase 12.9 待 rooted Android 设备真跑。 - 顺带修 stale 注释:docs-site 之前称 iOS Phase 14.2 UI scaffold "lost-to-race / 待重做",实际已在
3db7b5a73 + 1d0c473a3全部 land(650 LOCPersonalDataHubViews.swift+ 3 ViewModel + RemoteDependencies wire + 1491 LOC iOS Hub tests)。
本轮累计:1223 测试 / 67 文件(1068 hub 包 + 183 desktop + 46 CLI + 18 web-panel + iOS 1491 LOC Hub tests)。下一站需物理设备:Phase 12.9 rooted Android 真机 E2E、Phase 14.4 移动端真机 E2E。
详见 docs/design/Adapter_WeChat_SQLCipher.md §18.10 与 docs-site/docs/chainlesschain/personal-data-hub.md。
Personal Data Hub 从 Phase 4 真接通真三方一直推到 Phase 13.7 七 social adapter 全部落地,一晚 15 commits
763047a22 → b2baf4eda。同时.72修了.71desktop build 全 EUSAGE 的 release 工程 bug。
- Phase 4.5 — Python sidecar bridge + SystemDataAdapter:JS↔Python 进程间 JSON-RPC 桥接接 4 个 Android system source(通讯录 / 通话记录 / 短信 / 位置)借 sjqz 项目 17 个真已写 parser 避免重写。
- Phase 7 / 7.5 / 9 — 三大消费场景 adapter 齐落:Shopping three-pack(Taobao + JD + Meituan)/ Mobile Extraction Layer(Android ADB + iOS iTunes encrypted backup 双路)/ Travel four-pack。
- Phase 10.1 + 10.2 — AIChat 9/9 vendors 全部 live:DeepSeek + Kimi 逆 h5 私有 API + 通义千问 + 智谱清言 GLM + 腾讯混元 + 百度千帆 + 字节扣子 + Dreamina + 豆包,HttpClient infra 接 retry-with-backoff + progress streaming。
- Phase 11 — 5 个内置 analysis skill 跨 hub 数据源调用,LLM 直接调。
- Phase 12 v0.5 — WechatAdapter 切 frida-independent slice,T3 风险高→中。完整 SQLCipher dump 仍走 v1.0 frida 路径。
- Phase 13.3-13.7 — 5 social adapter 落地:Douyin + Xiaohongshu + QQ + Telegram + WhatsApp。WhatsApp 完成 sjqz parser port。+ 13+ Bilibili + Weibo 借 sjqz parser。
- 质量面:50 test files / 952 tests 全绿(含新增 6 个跨 Adapter 集成 + 3 个 E2E 用户旅程场景 + 3 个 toutiao/kuaishou/doubao scaffold 用例)。2026-05-20 收尾 test sweep 顺手扫出并修了 2 个真 bug:SpendingSkill 漏覆盖
subtype: "order"(Phase 7 Shopping 事件不进消费报表) + AlipayBillAdapter 漏导出extra.counterparty(分析技能按商户分组失败)。 - Phase 14.1 + 14.2 手机端远程入口数据层完整(UI 接通在路上):Android Phase 14.1
PersonalDataHubCommands.kt22 method typed wrapper(21 数据 +runSkill分析)+ 9 UI 文件(Ask / Adapters / Audit 三屏 + HealthCard + AcceptNonLocalDialog + 3-tab 容器)+ 22 单元测试。iOS Phase 14.2 数据层完整:22 method wrapper + 16 Codable model + 28 单元测试(22 happy + 6 input-guard)— 1:1 对齐 Android,全 kebab-case wire 名,每个测试都断言 method 名防回归。ios-build.ymlCI run26150064237Build & Test (SPM)job 72s 通过含 28 新单测。预发版静态审计抓住 Android 17 处 camelCase / kebab-case 跨端 method 名错配(首调即 404),sed 修齐生产 + 单测 + 桌面 whitelist 测试。剩:iOS SwiftUI View + ViewModel 接通(数据层已就绪,UI 待下一轮 iteration);Phase 14.3 流式同步进度 + Phase 14.4 真机 E2E 未启。 .72release 工程修复:.71全 5 平台 desktop build EUSAGE — rootpackage-lock.json与personal-data-hub/package.json不同步(Phase 12/13 加的adm-zip+iconv-liteoptional dep 未注册到 root lock)。5d8ba08b5sync lock +d03c87d0apackages/cli root lock bump 到0.162.7收口,.72repackage 同样 iOS keychain Logger NSLock 修真出包 18 assets 完整。.71GitHub Release 不存在(代码在 main + npm 0.162.7 已发,仅 desktop installer 缺),实际只发了.72。
三个 iOS 真 bug 一次扫净 + bundle .69 forward。
.69release 因publish-clinpm 404 卡 draft 8h+;.70重打.69的所有变更 + AppIcon wiring 修复,重跑publish-cli成功 PATCH 发布(最终 18 assets 全齐 Latest)。
- iOS 16 PIN-unlock 闪退:
CoreCommon/Utilities/Logger.swift的 metadata 字典在多线程并发改写下 iOS 16 必崩(EXC_BAD_ACCESS)。NSLock保护 read/write 路径 + 并发 fan-out 单测覆盖。 - AuthViewModel.createPrimaryDID SQL 参数没真绑:之前用
DatabaseManager.execute(_:)不带 parameters 的重载,prepared statement 里参数始终空,插入失败/silent skip。改走execute(_:parameters:)重载。 - AppIcon 从未真正编进包:
Assets.xcassets在pbxproj里被声明为PBXGroup(逻辑文件夹)而不是PBXFileReference type=folder.assetcatalog,且没加进PBXResourcesBuildPhase。结果 18 张 AppIcon + 3 张 LaunchIcon 全套素材在仓里 v0–v0.69 从未被actool调用编译,主屏一直是 wireframe 占位。2441b0d8b修 pbxproj wiring,.70真正出Assets.car进ChainlessChain.app。 - Release pipeline 操作记录:
.69finalize-releaseskipped 因publish-cli上游 npm 404;rerun--failed重试.70的publish-cli成功 PATCH draft→published。18 assets 完整:4 Android + macOS dmg + Linux AppImage/rpm/deb + Windows Setup/Portable + iOS .ipa + 3 latest.yml + blockmaps。
个人中心 → 「cc Chat (自然语言)」打开后,直接输入"列下我最近的笔记 / 搜下 RAG 相关的 / 我有哪些 skill",AI 自动识别意图 → 调本机 cc 命令 → 把命令 + 结果回贴聊天。再也不用记 cc 子命令 + flag 怎么拼。
- Phase 5.6 LLM tool-use 协议接通:OpenAI(
tool_calls+type:function信封)、Doubao 豆包(wire-compat 直 delegate)、Claude / Anthropic(tool_use内容块 +tool_result走role=user)三家原生接 tool-use;不支持的厂商(Qwen / Ernie / Spark 等)自动走"防幻觉 fallback",明确告知用户切模型而不是编笔记。 - Phase 5.7 cc Chat 屏:5 状态进度条(思考 / 准备调用 / 执行 cc / 处理结果 / 整理)+ 工具卡片(命令 + exitCode + 耗时 + stdout 折叠展开 + 取消按钮)。8 个只读子命令(
note list/show/view/search/memory list/show/skill list/status/session list/mcp list/did show)走白名单,写/删/安装类 LLM 即便编也会被拦截(exitCode=126)。ProcessBuilder绕过 shell,无 shell 注入风险。 - Phase 5.8 真机 E2E SOP:9 个场景 E1-E9 完整 reproducer + 自动化 preflight 脚本
android-app/scripts/e2e/phase_5_8_preflight.ps1(设备/bundle/APK 检查 + 残留扫描);待 Xiaomi 24115RA8EC 真机跑通。 - 代码审计 + bug 修复:静态审计 8 个新 Cc* 文件找到 3 个 Blocker/High:(1)
CcExecService.executeArgvJVM pipe buffer 死锁修(双 async drain,避免cc search大输出 hang 到 timeout)/ (2)CcChatOrchestrator.runFallback不再 silently 丢StreamChunk.error(HTTP 401 / 网络错显式弹 Failed event)/ (3)CcAllowlist.check明确拒"有allowedSubcommands但用户没传子命令"的情况。 - 测试覆盖:127 新测试全绿 —
feature-ai89 单测(CcAllowlistTest 38 + CcExecServiceTest 19 + CcToolCallDispatcherTest 17 + CcChatOrchestratorTest 14)+:app28 (CcChatViewModelTest 19 + CcChatIntegrationTest 9 端到端走真生产图:VM → 真 Orchestrator → 真 Dispatcher → 真 Allowlist → mock CcExecService,覆盖 E1 happy / E5 deny / E6 fallback / E7 cancel / E9 dedup)。 - 设计文档:Phase 5.8 E2E SOP + Phase 5.8 打印版 Checklist;docs-site / docs-site-design 通过
sync-*.js已同步刷新。
2026-05-18 收口 — iOS Phase 6 sprint 全套:Knowledge 30 + AI Extended 25 + 15 main tab + 多模态 v0.3 + Agent streaming
一晚 19 commits 收口 iOS 端 Phase 6.3/6.4 全套 hybrid(OQ-3.2=C / OQ-3.3=C),桌面 +55 method + iOS 56 wrap + 2 新 SwiftUI tab + 5 sub-tab UI + 实时录音 + Agent 流式输出。iOS CI 真编 2 轮抓 2 bug 已修,绿基线
1fb947b32。
- Phase 6.3 — Knowledge 桌面 30 method 全 hybrid(commits
d5525c1d1→874b3b83c)—knowledge-handler.js老 9 + step 1 (folders 5 + tags CRUD 3 + getNote alias 2) + step 2 (versions 4 + star/pin 6) + step 3 (archive 3 + import-export 4 + tags 高级 3) = 30/30 完成 ✅。新增 SQLite 表knowledge_folders+knowledge_note_versions+ ALTER notes 加 starred/pinned/last_viewed_at/archived 列。92 cumulative tests 联跑 7.94s。 - Phase 6.3 — iOS KnowledgeCommands actor wrap 31 method(commit
5b0e82c97)—Modules/CoreP2P/Sources/RemoteSkills/Knowledge/:actor 31 method(30 + getNote alias)+ 25 Sendable Response struct + 35 envelope/decode tests。复用invokeAndDecodehelper 模板。 - Phase 6.4 — AI Handler 桌面 25 method 全 hybrid(commits
b6da42ef2+d23d41cc9+d0bb48733)—ai-handler.js老 5 + Phase 5 fix 7 + Phase 6.4 25 = 37 method total:Conversations 高级 5 + Prompt templates 3 + RAG 5 + Multimodal 4 + Code helpers 4 + Agents 4。新表ai_prompt_templates。RAG/Multimodal/Agents 用 defensive method 检测(双路径mgr.list || mgr.listAgents),查询缺 dep 降级available: false,mutating throw。101 cumulative ai tests 联跑 1.7s。 - Phase 6.4 — iOS AIExtendedCommands actor wrap 25 method(commit
cf75e822f)—与 AIChat (Phase 5 12) 并列共 37 ai method 完全覆盖桌面。SeedRegistry methodCount 53 → 37 对齐真实。 - Phase 6.4 UI — KnowledgeView + AIExtendedView 2 新 tab → RemoteOperateView 15 main tab(commit
b92ffe640)—Knowledge 4 filter segmented + 搜索 + 新建 sheet + swipe action;AIExtended 5 sub-tab(Templates/Code 3 mode/RAG)。iOS 16 PhotosUI / TextField axis: .vertical / SwiftUI Outer/Inner + StateObject init 模式(解@EnvironmentObjectinit() 不可用)。 - Phase 6.4 v0.2 — Multimodal + Agents UI(commit
d897d3cdf)—AIExtendedView +2 sub-tab → 5 sub-tab(5 触 HIG 软上限,picker 切 horizontal scroll)。Multimodal:PhotosPicker → OCR / 文本生图 AsyncImage / TTS AVAudioPlayer / file picker 转文字。Agents:list/detail/run/stop + 4 色状态 chip。 - Phase 6.4 v0.3 — Agent streaming + 实时录音(commits
a2d41fc7e+073af9ed4):- 桌面
runAgentStream复用既有activeStreamsMap(streamId-agnostic 与 chat stream 共用),10 desktop tests - iOS 3 wrap method (runAgentStream + getAgentStreamChunk + cancelAgentStream) + VM 后台 Task 250ms poll loop + Agents UI 闪烁蓝点 + 实时累积渲染,4 iOS VM tests
- 新文件
MultimodalAudioRecorder.swift(@MainActor + AVAudioSession + 16kHz mono AAC 录到 NSTemporaryDirectory) + transcribeAudioSection 加 [开始录音] 红色 button + 闪烁红点 + 时长 monospaced
- 桌面
- iOS CI 真编 verify(commits
fa0746860+1fb947b32)—iOS GitHub Actionsios-build.yml2 轮抓 2 真 bug 修:(1)RemoteAIExtendedViewModel.swift:425nextChunkIdx: Int?类型不匹配 →?? sinceChunk(2)StreamChunkResponse模型缺error字段 → 加。Win 无 Swift 编译器,iOS CI 是 1500+ LOC Swift 唯一编译验证路径。绿基线1fb947b32(Build & Test SPM + Build Release SPM 三 job 全绿)。 - 设计文档:(1)
iOS_对标_Android_Phase_6_Plan.md§11 加 19 commits 时序表 + 实际 vs 计划偏差 + 5 个新模式;(2)iOS_Phase_6_3_6_4_Knowledge_AI_Desktop_Debt.md— Phase 6.3/6.4 debt 审计;(3)iOS_Phase_6_6_Desktop_Skill.md+iOS_Phase_6_7_Extension_Skill.md— Coverage Trap T2/T4 误判修正;(4)iOS_Phase_6_0_RealDevice_E2E_Plan.mdv1.0 — 38 场景跨 7 段 reproducer + bug 模板 + 通过/失败 P0/P1/P2 分级。 - memory 新增 4 entries(type=feedback/project):
phase_6_knowledge_ai_hybrid_complete/better_sqlite3_text_number_trap(Number→TEXT "1.0" 5 处 String() 包) /ios_inner_view_stateobject_pattern/ios_ci_only_verify_path_on_win(Win 无 Swift,"Phase X 完成 ✅" 必须等 iOS CI 真绿)。 - 剩余真机 E2E(plan §11.4 唯一未闭环 follow-up):Mac + iPhone + 桌面在场跑 38 场景。Win dev box 不可推进,移交用户。
承接
3319febc4真机反馈:"弹补填对话框但找不到同名 PC 项目"+"项目文件同步没做"两条阻塞,两件事一次性收口。
- Issue 1 LOCAL 终端入口改 picker:旧 v1 让用户在手机上敲 Windows 长路径,UX 失败。新 v2 dialog 打开拉桌面
project.list显示 PC 项目列表 → tap row → 直接保存 pcRootPath + 跳终端,零输入。同名项目高亮 "同名" 标置顶;列表为空时自动展开自定义路径 fallback。 - Issue 2 全量内容拉取:旧 v1(Sub-phase 7)只存 metadata;用户拉了之后离线打开项目还是 0 文件。新 v2 在 pullSingle 之后循环
project.getFile(fileId)真把每个文件 content 存 Room project_files。单文件失败 continue + log;content > 1MB skip 占位 row 防 OOM;PullProgress StateFlow 暴露进度 → UI 显 LinearProgressIndicator + "下载文件 N/M: "。 - 78 新测试:
RemoteContextViewModelTest× 16 /RemoteProjectBrowserViewModelTest× 7 /mobile-bridge-sync.test.js× 15(含 6 新handleProjectUpdatePath)/project-management-handler.test.js× 33(含 9 新 file CRUD)/project-handlers.test.js× 7。同步修了 3 个 stale 测试断言(504bd6dde 改 userId 过滤后没同步更新)。 - 设计文档:
docs/design/Android_Project_Remote_Terminal_Entry.md §12加 v2 picker 设计 + 全量拉文件设计 + 真机 E2E 8 场景矩阵。 - commit:
09bd0ec0f(feat(mobile): LOCAL 项目终端 picker + 全量项目内容拉取)。 - 剩余真机 E2E:8 场景需 Mac/Win PC + Android 双机配对环境,dev box 无法独验。
v5.0.3.63 发版后用户反馈:(1) iOS Settings 「版本」只显示 3 段制
5.0.3或 stale0.32.0(实际几个月没更过硬编码常量);(2) PIN 闪退仍报告(待 crash log 复现)。本版三件事:
- A 修 stale 硬编码(真 bug,找到根因):
AppConstants.App.version几个月一直写死"0.32.0"、buildNumber写死"32"、bundleId写死错值"com.chainlesschain.ios"(CodeSign 实际用.ChainlessChain)→ 全改用Bundle.main动态读。AIDashboardView.swift:95硬编码v0.16.0+PluginManager.swift:118fallback1.7.0一并扫净。 - B iOS 17 API 二次审计:全仓 596 个
.swift× 29 个 pattern(assumeIsolated/@Observable/SwiftData/symbolEffect/ContentUnavailableView/KeyframeAnimator/sensoryFeedback/Previewable等)扫描,0 处新增违规。AppState.swiftv5.0.3.63 修(assumeIsolated→Task @MainActor)已就位。 - C 测试三层覆盖:11 BundleVersionTests + 7 AppStateNotificationTests + 2 XCUITest(
testSettingsVersionDisplaysFourSegmentTag/testPINUnlockDoesNotCrashOnFirstLaunch),锁死版本号格式 + PIN 解锁不崩两类回归。 - 新 Bundle extension:
Bundle.appShortVersion/appBuildNumber/appFullVersion(4 段制5.0.3.64)/appFullVersionTag(v5.0.3.64)/appDisplayName,所有 UI 统一调。SettingsView 关于栏显示v5.0.3.64完整 4 段制 + 加「Bundle ID」一栏让用户能直接确认安装的真版本。 - 待用户反馈:v5.0.3.63 PIN 闪退根因未在代码层复现。装 v5.0.3.64 仍崩请附 crash log(Xcode → Devices and Simulators → View Device Logs)。SettingsView 新「Bundle ID」字段可帮确认安装的是 v5.0.3.64 真版本。
Android 手机配对桌面后,三大能力一次性落地:浏览 PC 任意目录(无 sandbox)、上传本机文件到 PC
~/Downloads/、PC 文件下载到手机公共 Download 目录(MediaStore.Downloads,原生「文件管理」/「相册」/「阅读器」都能直接看到)。Snackbar 「打开」按钮Intent.ACTION_VIEW(content://...)拉系统 viewer,不跳出 app。
- 修 6 个互锁 bug(设计文档 §4-§5):(1)
P2PClient.kt:538-542chainlesschain:* skip guard 太宽屏蔽 P2PClient 自己的响应 → 缩窄成只 skip incomingrequest/ (2) Plan C 不调P2PClient.connect()致sendCommand立即"Not connected"→RemoteCommandClient改 delegateSignalingRpcClient/ (3) PChandleFileCommand旧 stub 含dialog.showOpenDialog弹文件夹框 + 缺listDirectorycase → 新android-file-handler.js11 action / (4)FileTransferHandler(web-shell sandboxed) 不可复用 → 不复用 / (5) checksum"sha256-prefix:"vs Repository 期望"md5:"→ 返 null / (6)getExternalFilesDir用户找不到下载文件 →MediaStore.Downloads公共目录。 - 5 个 UI 入口:📁 浏览远程目录 + ☁️↑ 上传 + ☁️↓ 下载面板 + 📱 app 内本机下载文件夹列表 + 🧹 清理历史。
- 测试:PC 单测
android-file-handler.test.js30 cases 全绿;AndroidRemoteCommandClientTest.kt4 cases 锁死 SignalingRpc delegate + 不走p2pClient.sendCommand;真机 E2E 8 场景已跑通(Xiaomi 24115RA8EC × Windows 桌面)。 - 设计文档:
docs/design/Android_Remote_File_Skill.md— 协议接口 11 action + 字段映射 + 4 互锁 bug + 2 UX 坑 + 真机 E2E 8 场景。 - 用户文档:
docs-site/docs/guide/remote-file.md。
v1.0 GA 上架后 issue #21 跟进的 5 项主体 scope 一日内全部 land,累计约 270 单测全绿,最终 sweep 修 2 个 Robolectric
@Config(sdk=[33])漏标。P2 候选 4 项 (B.3/B.4/C.2/C.3) 等 GA Play Store + 真用户反馈复评。
- A.1 桌面 Linux native 配对(57 单测)—
cc pair preflight5 项 LAN 诊断(平台 / 网卡 / multicast / port 5353 holders / firewall hint,exit 0/1/2 分级 CI 可用)+cc pair token generate/list/show/revoke子命令组(one-active-DID 不变量 + atomic file write,SSH dev box 场景预生成)+dist-tools/systemd/chainlesschain.servicehardening 全套模板 +docs/linux/PAIRING.md9 段用户指南(3 场景 / 5 blocker 修复 / 诊断包收集)。Audit 反驳:设计文档说"Linux 需补 mDNS systemd 单元"是误解 —@libp2p/mdns+bonjour-service纯 JS 不依赖 avahi-daemon。 - A.2 三端 UI consistency 设计文档 v0.1 baseline(
docs/design/三端_UI_Consistency_设计文档.md)— 4 项必须一致(语义色 / 高风险红色 hex / DID 短显规则 6+4 字符 / m-of-n 进度展示 m/n + 分隔符)+ 4 项必须不同(手表大按钮 ≥48dp / 桌面侧栏 / 车载 voice-only / 手机 thumb zone)。 - B.1 web-shell 私钥签字 UI(113 单测)—
MultisigSignerukeyManager adapter(4 driver return shape normalisation)+multisig.signin-process WS topic(绕开 cc subprocess 6-10s 冷启)+signWithExternalasync API(core-multisig 新增)+SignProposalModal.vue(Pinia store + member dropdown + dev-only hex source)+unified-key-managerDID-based signer routing。 - B.5 跨链桥 outbound × m-of-n 多签(Layer 1+2 共 8 PRs)— Layer 1:CLI
bridge --require-multisig+bridge-consume+ web-shellcrosschain.bridge.consumein-process topic + Multisig.vue 执行按钮。Layer 2:cc_bridgesm-of-n provenance 列 + crosschain-mtcattachMultisigProvenance/stripMultisigSigsForCanonicalhelpers +buildMultiHopBridgeEnvelope3rd arg +verifyMultiHopBridgeEnvelopeauto-runs provenance check +bridge-consume --mtc把 multisig provenance 带入 staging。Layer 3 external-blocked Q-COMP-3(真 testnet 锚定 + contract audit + KYC)不计入本 scope。 - C.1 watch face → VoiceMode shortcut(33 单测)— phone-side
VoiceLaunchActions+VoiceTriggerSource4 enum + NavGraph 路由 +CcPhoneVoiceListenerData Layer service(/cc/voice/startMessageClient path)+ wearVoiceSender+VoiceShortcutTileServicestandalone tile +VoiceComplicationService+VoiceForwardActivity(intent + 50ms vibration + 3s timeout)。安全约束:trigger_source字段 wear 侧仅信息用途,phone 侧锁WEAR_FORWARD防伪 — 防 wear 端伪造 trigger_source 提权到AUTO_BUTTON/PHONE_SHORTCUT。 - 最终 sweep bug 修(commit
f1d283833)— C.1 PR1VoiceLaunchActionsTest+ PR2CcPhoneVoiceListenerTest漏标@Config(sdk=[33]),RobolectricDefaultSdkPicker拒收 compileSdk=35(maxSdkVersion=34)— 统一与:app其它 Robolectric 测试一致。
详见 issue #21 + Android 重新定位 §10 GA 后续 scope。
Phase 5.1-5.6(远程 LLM 对话 + token-by-token 流式 + 8 method + cancel + 对话管理 + 离线 enqueue)已落,但 41 单测全是同模块内 mock,缺端到端集成 + UI/VM 交互 edge case 覆盖。本轮静态审计找到 4 真实 bug,每个 1 个回归单测;同时补 4 个集成测试验真链路。
- Bug #1 — 空字符串穿透 nil-coalesce:
RemoteAIChatViewModel.finalizeStreamingPlaceholder旧代码messageId ?? oldMsg.id。ChatStreamEnd.parseFromEnvelope在 server 缺messageId时填""(不是 nil),nil-coalesce 不兜底,""直接覆盖本地local-assistant-<UUID>占位 id,SwiftUIForEach(messages, id: \.id)身份被击穿(多条 row 共享空 id)。改为if let mid = messageId, !mid.isEmpty显式 guard。 - Bug #2 — 删除当前对话失败时半回滚:
deleteConversation失败时仅恢复conversations列表,currentConversation/messages留在已清空状态。新增rollbackDelete私有方法 + 入口处wasCurrent/originalCurrent/originalMessages快照,全量原子回滚。 - Bug #3 —
sendMessage缺 stream-in-flight 防御:UI 在流式中切到 cancel button 形态,但 VM 不能假设上层禁掉了 send 入口(programmatic 调用 / 双击竞争)。在 DC gate 前加guard currentStreamId == nil else { lastError = "请先等待当前响应完成或取消"; return }。 - Bug #4 —
selectConversationstale streamId 污染:切对话时不清currentStreamId,依赖messages.last.isStreamingguard 兜底。edge case:新 conv 末条恰为 streaming 占位(前次未 finalize)时,prev stream 的 delta 会越界改新 conv 的 last。改为显式currentStreamId = nil; isStreamingMessage = false。 - 集成测试 +4 —
Tests/CoreP2PTests/Integration/Phase5AIChatIntegrationTests.swift:testFullChatStreamHappyPathThroughFanout(真 fan-out 端到端) /testCancelOrderingDiscardBeforeRpc(cancel 顺序 50ms 窗口验证) /testOfflineCreateConversationDrainsOnRecover(DC 恢复 drainer 触发 ai.createConversation) /testCrossConversationStreamIsolation(切对话清 streamId + sA 不污染 conv B)。 - 单测从 41 → 45 —
RemoteAIChatViewModelTests.swift+4 回归(每个 bug 1 条);总 iOS 单测 ~313 + 45 = ~358;集成测试 6 → 10。 - 文档:
docs/design/iOS_Phase_5_AI_Chat_Skill.md§8.1 / §8.2 / §8.3(静态审计 4 bug 详表)/ §8.4(Phase 5.8 真机 E2E 8 场景 reproducer 详步骤)全刷;docs-site 与 docs-site-design 通过sync-*.js同步刷新(162 文件)。 - 真机 E2E(Phase 5.8) 仍待 Mac+iPhone+真桌面在场,reproducer 详步骤已就绪。Win dev box 上
swift test不可跑,验收依赖 iOS CIswift build --target CoreP2P编译通过 + 静态审计 + 集成测试设计无 mock 绕过真链路。
Android 端 v1.0 GA 验证后,iOS 端启动镜像移植。一日内四 Phase 框架级全 land:~145 文件 / ~313 单测 / 4 完整设计文档 / 4 实施 trap memory。
- Phase 1 — 桌面配对三流(commit
c30b415a8)— Flow B 摄像头扫桌面 QR(最常用) + Flow A 桌面扫手机 QR(Signal e2ee 高级路径) + 手输 6 位 code 兜底;Modules/CoreP2P/Pairing/(9 files) +Features/Pairing/(8 files) + 71 单测 7 套件;桌面端 follow-uppairing-code:<code>signaling 别名监听 220 LOC。 - Phase 2 — 远程桌面终端 (Plan A.1 移植)(commit
7613ea710)—RemoteWebRTCClient5 步 handshake actor +WebRTCPeerConnectionTransportGoogle SDK 抽象 +TerminalRpcClient双路径 invoke + xterm.js WKWebView +TerminalListView/SessionView全套;163 单测 12 套件;Phase 1 SignalClientforwardedMessages: AsyncStream多订阅入口同期补齐(实施暴露后回填)。 - Phase 3 — 远程操控 framework + 4 typed skill(commit
759a1e907)—RemoteCommandClient通用 RPC actor (Phase 2TerminalRpcClient.invoke抽出) +RemoteSkillRegistry23 SeedRegistry 1:1 mirror Android (795 method) +OfflineCommandQueueUserDefaults JSON crash recovery +OfflineQueueDrainerfalse→true edge detection + 4 typed skill (Clipboard / File / Screenshot / SystemInfo) +RemoteOperateView5-tab segmented shell + 4 skill UI;~264 单测累计 20+ 套件。Phase 3.6 refactor 提前到 3.3:TerminalRpcClient.invoke删除 + delegate to commandClient + 改用 commandClient.events 流(修 AsyncStream 单消费者切分事件 bug)。 - bug 修 (P0) — code review 后期修两处 continuation 泄漏:
RemoteCommandClient.invoketimeout 不清pendingResponses[reqId]+RemoteWebRTCClient.waitForAnswer同模式不清pendingAnswer;长期运行下 pool 涨。修法do/catch包 TaskGroup 显式清池 + 加pendingCount()/hasPendingAnswer()诊断 accessor;2 regression test + 1 集成 test 验池清。 - 集成测试 —
Tests/CoreP2PTests/Integration/Phase3IntegrationTests.swift6 跨组件测试覆盖 ClipboardCommands 端到端 / TerminalRpc demux / Drainer 边缘 / 离线 → 恢复 → drain / concurrent invoke 池共享 / continuation 泄漏防御。 - Phase 4 — Notification skill(design
cf7a7be78+ 6 sub-phase commits45b485fdd→5877b5d84)—NotificationCommandsactor (11 method 1:1 mirror AndroidNotificationCommands.kt) +NotificationEventDispatcher订 commandClient.events + LRU dedup + 触发既有PushNotificationManager.scheduleSystemNotification(531 LOC PushManager 0 改动,仅加 1 行extension PushNotificationManager: RemoteNotificationPushTarget {}) +RemoteNotificationsViewModel乐观更新 + offline gate 三分支 +NotificationsViewUI 镜像 AndroidNotificationCenterScreen.kt(filter / List + swipe / detail sheet / settings sheet) +RemoteOperateView第 6 tab "通知" +SkillTabPickerViewREWRITE 为 horizontal scroll + button row + Capsule unread badge (per design §7.9 备选 B,Discord/Slack pattern)。41 新 unit tests (18 + 10 + 13)。新发现 trap: events fan-out — cmdClient.events 单消费者,多 skill 订阅必须 RemoteDeps 内 fan-out task 拆。 - 设计文档:
docs/design/iOS_Phase_1_Pairing_Flow_B.md+iOS_Phase_2_Remote_Terminal.md+iOS_Phase_3_Remote_Operate_Framework.md+iOS_Phase_4_Notification_Skill.md— 各含 §6 sub-phase + §7 实施 traps + §8.3 真机 E2E 矩阵。 - iOS UI 镜像 Android 已验证布局 — 用户拍板 "iOS 页面布局参考安卓端,安卓端有检测过"。Compose Screen 信息架构 / 流程 / 字段顺序照抄到 SwiftUI;HIG 偏离限白名单 6 项(NavigationLink / Form / ToolbarItemGroup keyboard / Sheet / Alert / Segmented Picker)。
- 剩余真机 E2E(需 Mac+iPhone+真桌面):Phase 1.7 三流配对 + Phase 2.7 4 终端场景 + Phase 3.7 4 skill 各跑一次 + Phase 4.7 8 通知场景 (拉历史 / 桌面 push 弹 banner / LRU dedup / markAsRead 双轨 / 离线 enqueue / quiet hours silenced / authorization denied / 后台 1min)。Win dev box 不可验,移交用户。
v5.0.3.52 Plan A 真机首测(Xiaomi 24115RA8EC × Win desktop dev)暴露 1 个架构性问题:4 跳信令链路(手机→路由器→公网中继→桌面 RelayClient)NAT idle / 蜂窝运营商间歇杀 TCP,整链路 fragile。
落地:Plan A.1 — 把高频高吞吐终端流量从 signaling 链路切到 WebRTC DataChannel 直连,绕开中间所有跳;signaling 路径保留为兜底。
性能预期 → 端到端 RTT p50 200-500ms → 30-80ms LAN / 50-200ms TURN;p99 1.5-30s timeout 频发 → 200-800ms;稳定性 20s-2min 间歇断 → 数小时持续(依赖 ICE keepalive)。
- Phase 1 — Trap 1 修复 + DC 路由 helper(commits
d22b7ac8a+bb759bc78)—SignalClient.forwardedMessages改 multi-subscribe SharedFlow(替代单 listener 的setOnForwardedMessageReceived)。原 bug:WebRTCClient.initialize装的 ice:config 拦截器在用户进 TerminalListScreen 时被TerminalRpcClient.start()后写覆盖 → ice:config 推送丢 → iceServers 24h 过期后跨 NAT 完全不通。新增WebRTCClient.dataChannelReady: StateFlow<Boolean>derived flag(READY 才真意味 DCOPEN,避免 ICE-connected 但 DC 未开的误判)。 - Phase 2 — DC fast path + 双 listener pending pool(commit
a01eeac47)—SignalingRpcClient.invoke内置 transport selector:connectionState==READY && preferDataChannel→webRTCClient.sendMessage(DC),失败或未 ready → fallback signaling。两路 listener 同时订阅signalClient.forwardedMessages+webRTCClient.messages,同一requestId对同一CompletableDeferred(二次 complete 是 no-op,dual delivery 安全无需显式 dedup)。所有 RPC clients(TerminalRpc + system./ai.)单点 chokepoint 自动受益。 - Phase 3 — Android 触发 handshake + UI 路径指示(commit
91e77e489)—TerminalListViewModel.init检测 DC 未 ready 即异步触发RemoteConnectionManager.connect;UI chip 显示 "P2P 直连"(绿)vs "中继路径"(黄),用户可见路径状态。 - Phase 4 — 双向 LRU 去重(commit
dd9b1227eAndroid +fc3752360desktop)— AndroidTerminalRpcClient双订阅 signaling + DC SharedFlow,stdout 按(sessionId|seq)256-LRU 去重 / exit 按sessionId64-LRU。桌面mobile-bridge.bridgeToLibp2p加 128-LRU / 30s-TTL 按payload.id去重 mobile→desktop command request(防terminal.stdin双跑 / PtyManager 误处理)。 - Phase 5 — 既有 wiring 组合(无新代码)— DC 失效 fallback = Phase 2
trySendViaDataChannel抛 IllegalStateException 自动落 signaling;自动重建 =P2PClient.scheduleReconnect指数退避 1s→60s / maxAttempts 10(既有);恢复后自动切回 =isDcReady()每次invoke()入口重检;UI 实时映射 = Phase 3dataChannelReadychip。 - 测试:Android
TerminalRpcClientTest+3 dedup /SignalingRpcClientTest+4 transport selection /WebRTCClientTest+1 Trap 1 回归;desktopmobile-bridge.test.js新 14 测覆盖 LRU dedup 5 维 + sendToMobile DC 优先 vs signaling-relay 双发兜底 5 维。3 套件全绿(11 + 15 + 21 Android + 14 desktop 新 + 既有未动)。真机 e2e §5.3 矩阵移交用户(LAN / 蜂窝 / 双 NAT / DC 强制失效 / DC 恢复 5 场景)。 - bug 修:WebRTCClientTest 12 个测试 regression —
mockk(relaxed=true)对StateFlow<List<X>>泛型擦除致.value返 relaxed Object 而非 List → 生产端pairedDesktopsStore.devices.value.firstOrNull { ... }抛Object cannot be cast to Iterable→connect()catch 套成"连接失败: ...";测试 setup 加every { mockPairedDesktopsStore.devices } returns MutableStateFlow(emptyList())修。 - 设计文档:
docs/design/Android_Remote_Terminal_Plan_A1.mdv1.0(含 §1.2 三个 trap 完整分析 + §3.7 不复用 :core-p2p DataChannelTransport 的决策 + §5.3 真机 e2e 5 场景验收矩阵)。 - 遥测:
[SignalingRpc.metric] path=dc|signaling reqId=...埋点上线,发版第一周观察 fast-path 占比,目标 ≥80%(用户基数 ≥10 设备)。 - 分发:桌面 binary v5.0.3.52 → v5.0.3.53 重打;CLI
chainlesschain0.161.12 不变(Plan A.1 不动 packages/cli/);Android versionCode/Name 不变(v1.0.0 GA 维持,本批 desktop + Androidapp/共改)。
用户痛点:"PC 上开了很多终端,能不能在 Android 上看到这些终端的输出并远程输入指令?"
硬约束:Windows 上已经在跑的外部终端不能被另一进程 attach(OS 句柄私有)。
落地:Plan A — ChainlessChain 桌面端用node-pty托管新开终端,复用 #21 Remote Operate signaling-relay 通道把 stdin/stdout 流到 Android。
桌面端 PtyManager 单例同时被 web-shell WS 网关 + cc ui WS 网关 + V6 native IPC 共享 — 用户在任一壳开会话,其它壳都能看到。
- 桌面主进程 —
PtyManager(lazynode-pty+ 256KB ring buffer + 24h idle kill + shell 白名单pwsh/cmd/bash/wsl+ 8 session 上限)+terminal-handlers.js(8 个 WS topics: create/list/stdin/resize/close/history + server-push stdout/exit)+terminal-ipc.js(V6 native IPC bridge)+confirmation-dialog.js(高危关键字 Electron messageBox + 永久信任 per-cmd cache)。handleMobileCommand加terminal.*namespace + mobile-bridge per-peer stdout/exit subscription fanout。 - CLI workspace mirror —
attachTopicHandlers共享 helper(抽出ws-cli-loaderdispatcher 包装为 ESM helper);agent-runtime.startUiServer调一遍 →cc ui也能/terminal。node-pty加为 optionalDependencies(workspace hoist 解决 + 装不上不破坏 install)。 - Web Panel —
useTerminalcomposable(singleton fan-out + base64↔UTF-8 编解码)+Terminal.vueroute/terminal(xterm.js lazy import + 多 session 标签 + history 补帧 + ResizeObserver + 高危关键字拦截 toast)+ 侧栏菜单 + i18n。 - V6 plugin widget —
plugins-builtin/terminal/plugin.json+shell/widgets/TerminalWidget.vue+shell/TerminalPanel.vue(xterm.js 嵌入 + IPC bridgeelectronAPI.terminal.*)+ slash 命令/terminal。 - Android —
TerminalRpcClient.kt(复用SignalingRpcClientenvelope pattern + observeStdout/observeExit SharedFlow)+TerminalWebView.kt(WebView ↔ Kotlin JS bridge)+xterm-shell.html+ xterm.js / addon-fit / xterm.css vendored 入assets/terminal/+TerminalListScreen/TerminalSessionScreenCompose + softkey toolbar(Ctrl/Tab/Esc/方向/Ctrl+C/D)+ NavGraph 2 路由 +RemoteOperateScreen加 "打开远程终端" 按钮。
测试 162 新增全绿 —— Desktop main 61(RingBuffer 7 + PtyManager 15 + terminal-handlers 15 + terminal-ipc 12 + confirmation-dialog 5 + ws-smoke 6 + 真 PTY spawn cmd.exe integration 1 — 真 spawn cmd.exe、真发 echo PLAN_A_PROBE_42、stdout 流回包含 probe)+ CLI cc ui 21(PtyManager 10 + handlers 8 + ws-mirror-smoke 3 含真 ChainlessChainWSServer + attachTopicHandlers + 真 WS client)+ Web Panel 17 useTerminal composable + 3 e2e(真 cc ui subprocess + 真 WebSocket + 真 shell stdin/stdout round-trip via probe echo)+ Android 10 TerminalRpcClientTest。
修 pre-existing test drift —— widget-registry.test.ts(PREVIEW_WIDGETS 已扩到 7 个)/ dashboard-store.test.js(缺 mcp.list_tools mock)/ views-mount-smoke.test.js 5 个尾部视图(Notification + Pinia 状态污染:Projects i18n 修 + 其余 4 个拆独立 worker)/ 删除过时 Projects-folder-picker.test.js。
文档:Android Remote Terminal Plan A 设计文档 + 用户文档(双站同步)。Future A.1 流量切 WebRTC DataChannel 绕中继带宽 / Future B 已开外部终端只读快照(截图 + OCR + Win32 SendInput)留后续。
10K LOC 社交骨架(14 屏 + 9 VM + 4 Repo)建好已久,但只有 2 路由真接通;其它 7 个 registerPlaceholder("temporarily simplified"),SocialScreen 三 tab 中 Friends/Timeline 显示固定字串。本次一次性收口:
NavGraph.kt7 占位换实屏 + 2 新路由(PublishPost / PostDetail / FriendDetail / UserProfile / AddFriend / CommentDetail / EditPost实接 Composable;新增NotificationCenter+BlockedUsers路由,DID 加载期渲染 spinner 占位)SocialScreen.kt3 tab 全升级 — Friends →FriendListScreen;Timeline →TimelineScreen(myDid 走DIDViewModel.didDocument);Notifications →NotificationCenterScreen(带筛选/批量已读/清理菜单,删旧内联 basic 列表)PostReportDao落地 — entity 早在 schema v23 在册,但 DAO 缺失:reportPost()构造完 entity 不入库 +getUserReports()hardcoded 空。新 DAO 加去重((postId, reporterDid)idempotent)+ status 流转 + Robolectric 8 测试覆盖- PROFILE_QUERY/RESPONSE 协议 —
MessageType加 2 项;RealtimeEventManager.queryProfile(targetDid, 5s timeout)用onSubscription解 SharedFlow replay=0 订阅竞态;SelfProfileProvider接口 +DefaultSelfProfileProvider(DID-suffix 占位)在ChainlessChainApplication.delayedInit注入;FriendRepository.searchUserByDid()本地未命中即 fallback 远端 BlockedUsersScreen接 ViewModel —FriendViewModel注入DIDManager,加loadBlockedUsers()+unblockFriend走完整unblockUser(myDid, did)路径(清BlockedUserEntity行,不再 flag-only 留孤儿记录)
测试:39 新单测全绿——6 个 RealtimeEventManagerProfileQueryTest(race-fix:runTest 跑挂改 runBlocking,因 manager 内部 scope 用 Dispatchers.IO 与 virtual-time TestDispatcher 不在同一调度图)+ 4×3 feature-p2p(Post/Friend repo + FriendViewModel)+ 2 DefaultSelfProfileProvider + 8 PostReportDaoTest 真 Room in-memory + 11 路由 + tab 结构性回归(不需要模拟器)。设计文档 Android_Social_Wiring_2026-05.md,三大文档站本次同步刷新。
2026-05-13 中期推进 — #21 v1.2 GA 反馈整合:项目工作流 P1+P2+P3A + #2 删除 fix + #3 日常模板
v1.2 GA 反馈 5+3 项整合(#2/#3/#4/#5/#7/#8)。北极星:"手机端做 AI 项目交互要像电脑端那样丝滑"。
- #2 项目无法删除 fix (
fc24f9856) —EnhancedProjectCard完全没有 delete UI;加 3-dot 菜单 + 确认 dialog → DAO softDelete → Room Flow 自动从列表移除。 - #3 模板改日常 11 个 (
99d38bf69) — 砍 11 IDE 模板,整个ProjectTemplates重写:购物清单 / 旅行计划 / 读书笔记 / 灵感收集 / 健身计划 / 食谱记录 / 学习计划 / 家庭账本 / 工作日志 / 会议记录 / 空白。TemplateCategory加 5 个新类目。 - #4/#7 桌面 CLI + REMOTE handler P1 (
32ccabdb5) —cc project init/list/show/delete直写 desktopchainlesschain.db(WAL 并发安全)+project-management-handler.js6 actions 给 Android L3 REMOTE。CLI 7 + handler 21 tests。 - #4 Android→Desktop 反向 sync P2 (
2646bbb4e) — 修补反向同步缺口;新增ProjectSyncWalker+CompositeSyncRepositoryWalker(:app聚合)+ Hilt 绑定。CREATE/UPDATE/DELETE 完整。Composite 7/7 + walker 12 tests。 - #5/#8 web-shell Projects + in-process WS P3 Part A (
bfdde637d) — 6 in-process WS topics 包装 P1 handler(DRY: 同 handler 服 web-shell + mobile L3)。新Projects.vue项目管理列表 + 移老内容到ProjectInit.vue。project-handlers 7/7 tests。
测试:阶段 1 P0 全过 + 阶段 2 project workflow:Android :app 80/80 + Desktop combined 51/51。P3 Part B 待办:Android ProjectCommands.kt(让手机用 REMOTE 调 project.* 看/操作桌面项目),等用户验证 P1+P2+P3A 后再做。
2026-05-13 前期推进 — #21 Android v1.3+ P0 前置三项 GA-independent + AI-3 forward-compat + 2 bug fix
v1.2 GA 上架前的 P0 前置批次(未 bump version,与 P1 主体一起 release):
- A.3 ADR Review v2.0 (
348896382) — 8 ADR 全 audit 结论 5 keep / 2 amend / 1 revise。新增 AndroidADR重评估_v2.0.md。ADR-2(M2 DID wallet 走软件 Ed25519,blocks B.3 DID rotate)待 v1.2 GA Play Console API level 数据决策选项 A/B/C;ADR-7/ADR-8 文本 amend 对齐真实(cc-mobile.json 从未创建走 user_settings +mobile.*scope;registry 实际 disk-first + push-based 非 pull)。同 commit §10 v1.3+ scope triage 分层(12 子项 P0/P1/P2 + 5 依赖链)。 - B.6 PQC 严格模式 verifier gate (
e24386d00) —LandmarkCache.strictPqModeopt-in,拒收任何alg === "Ed25519"的 partial sig + publisher_signature;与现 heterogeneous federation 数据格式兼容,0 schema 改动;生产者侧 0 改动。 - B.2 in-process multisig.* + marketplace.consume topics (
b1c7cfd95) — 7 个 in-process WS topics 镜像 CLI--json输出 shape,desktop web-shellMultisig.vue用useShellMode().isEmbedded分发;性能 asar:true 子进程冷启 6-10s → in-process ~20ms (SQLite open) + 查询,60-100× 提升。UX 0 改动。 - A.3 AI-3 SkillMetadata.signature forward-compat (
45a88270e) — AndroidManifestSignatureVerifierinterface +NoOpManifestVerifieralways-accept stub +RemoteSkillRegistry.setManifestVerifier()swap seam,为 marketplace M0 上线(#21 AI-5)做接线准备。 - 修复 wear test imports (
c0d061328) —CcPhoneDecisionListenerTest缺kotlinx.coroutines.{launch,delay,GlobalScope,DelicateCoroutinesApi}imports 自 v1.2 P0.2 起 block 整个:app:compileDebugUnitTestKotlin,加 4 imports 解锁。 - 修复 B.6 strict mode disk-load gate(本次 QA sweep 发现)—
LandmarkCache.loadFromDisk()bypass strict-mode gate,重构 per-snapshot 严格检查到_validateAndStoreSnapshot()头部,+2 新 disk-load integration tests 锁回归。
测试:B.6 strictPqMode 11/11 + B.2 multisig-handlers 23/23 + AI-3 ManifestSignatureVerifier 10/10 + Android :app regression 57/57 + web-shell 379 regression(25 files)全过。
productVersion v5.0.3.50 → v5.0.3.51。Plan C(v5.0.3.50)信令转发让低频命令通了 100-400ms p99,但有两个硬约束:吞吐(中继带宽全平台共享 → 流式 token / 文件 / 视频不能走)+ 隐私(公网 wss TLS 之外中继服务器仍看到 payload 明文)。Plan A+B 解决这两条:真 WebRTC P2P DataChannel = 端到端加密 + 直连带宽。三段位完整图景:低频命令走 Plan C signaling forward / 高吞吐流式 token + 文件走 Plan A WebRTC DC / NAT 穿透兜底走 Plan B STUN/TURN。设计文档:Android Remote Operate Plan A+B。
- Plan A — WebRTC signaling 透传中继(commit
e9f9d6275+af11daa6e)—— signaling-relayserver.jshandleMessageswitch 新增 caseoffer/answer/ice-candidate/ice-candidates/peer-status与type=message同路径 forward + 注入from字段(与 LAN signaling-handlers 行为一致)。桌面 mainstartRelayClient.onMessage简化为统一 dispatch:pair-ack 仍单独路由写 sessionState,其余(command:request / offer / answer / ice)交给mobileBridge.handleSignalingMessage同款 dispatcher —— LAN 路径与 relay 路径完全等价。 - Plan B — coturn STUN/TURN 部署 ——
turn.chainlesschain.com(47.111.5.128) 监听0.0.0.0:3478UDP+TCP +5349TLS +49152-65535UDP relay;docker compose host network 模式避免 NAT;Let's Encrypt @gitee 镜像 acme.sh 续证;use-auth-secrettime-limited credentials。 - iceServers HMAC-SHA1 24h ephemeral creds ——
signIceCredentials(userId)签发username = expiry-ts:user-id+credential = base64(HMAC-SHA1(TURN_SECRET, username)),返回stun:turn.chainlesschain.com:3478+turn:3478?transport=udp/tcp+turns:5349三档优先级 + 凭证。envCC_TURN_SECRET强制必填源码无 fallback 绝不硬编码 secret(任何 fork 也无法签出生效凭证),缺 env 时降级 STUN-only。 - iceServers 不塞 QR 改信令推送 —— QR payload 650+ 字符 + 高纠错 280px 扫描识别率暴跌(2026-05-14 实测阻塞 30s 扫不出);改成扫码后异步推送:桌面 pair-ack matched 后
pushIceServersToMobile(ackPayload)LAN signaling + 公网中继双发type chainlesschain:ice:configpayload{pcPeerId, iceServers, iceExpiry}给手机;AndroidWebRTCClient.setOnForwardedMessageReceived拦截 +persistIceConfigMessageupsertPairedDesktopsStore.iceServersJson;SignalingRpcClient.handleIceConfigMessage同步备份 race-tolerant。 - Android
WebRTCClient.createPeerConnection—— 注入PairedDesktopsStore,resolveIceServersFor(pcPeerId)用 stored iceServers 含 TURN,过期/缺失 fallback Google STUN;parseIceServersJson支持urls既可 string 又可 array。 backend/signaling-relay-service/入仓 ——server.js+Dockerfile+docker-compose.yml+ nginx vhost +deploy.sh+ README,使二方部署有路径。
已知约束 / Trade-offs:iceServers TTL 24h 过期后 fallback Google STUN 跨 NAT 不通(v1.4 GA 前补 mobile 检测 expiry 临近经信令请求新凭证);WebRTC P2P 端到端真机跨 NAT 实测待补(phone 4G + desktop home WiFi 完整 file-transfer 流);Signal Protocol E2EE 待 Plan A DC 通了再考虑(DC 已是直连 TLS,Signal 收益边际);阿里云安全组要求 UDP 3478 / TCP 3478 / TCP 5349 / UDP 49152-65535 全开放给 0.0.0.0/0,未开端口 coturn 容器跑但外部不可达 ICE 收集失败。
部署 / 分发:桌面 binary v5.0.3.50 → v5.0.3.51 重打;signaling-relay-service 部署在 47.111.5.128;CLI chainlesschain 0.161.10 → 0.161.11;Android versionCode/Name 不变;三大文档站本次同步刷新:docs-site / docs-site-design tagline 升 v5.0.3.51 + 设计文档 Plan A+B 同步。
productVersion v5.0.3.49 → v5.0.3.50。配对完成(v5.0.3.49 W3.7 Flow B QR pairing)后,手机要"操控"桌面——点 Ping / 系统状态 / 系统信息 按钮、桌面执行、响应返回——需要把命令送达桌面。Plan A(WebRTC P2P 直连)+ Plan B(STUN/TURN 穿透)工程量大;Plan C 复用配对已通的信令 forward 管道,单次低频命令先跑通,A+B 留后续。设计文档:Android Remote Operate Plan C。
SignalingRpcClient落地 —— 手机端 RPC 入口:构{type:"chainlesschain:command:request", payload:{id, method, params, auth, timestamp}}→PairingSignalingGate.sendAck;一次性安装setOnForwardedMessageReceivedlistener 按requestId关联CompletableDeferredresolve 响应;30swithTimeout兜底;LAN sendAck 失败时自动 reset gate → 切公网中继 URL → re-register → 重试一次,与ScanDesktopPairingViewModel配对路径同模式。RemoteOperateScreen+ ViewModel —— 极简 UI:3 个 chip 按钮(Ping / 系统状态 / 系统信息)+ 响应 JSON 显示 + 解除配对。首页"已连接桌面"卡片点击 → NavGraph 跳remote_operate/{peerId}。PairedDesktopsStore持久化 —— SharedPreferences JSON 落已配对桌面列表(pcPeerId / deviceName / lanSignalingUrl / relayUrl / pairedAt / lastSeenAt);upsert idempotent by pcPeerId;首页改读 store 而非p2pClient.connectedPeers—— Plan C 不建持久 P2P 连接,扫码后信令立刻断 connectedPeers 即空,UX 反直觉的根因。- Desktop
RelayClient外网中继外联 ——desktop-app-vue/src/main/p2p/relay-client.jsoutbound 长连wss://signaling.chainlesschain.com,register桌面 pcPeerId(必须与 mobileBridge.peerId 一致,否则外网手机找不到目标 peer),onMessage路由 pair-ack / 一般 mobile command 进recordPairAck/handleMobileCommand(与 LAN 同一管道);指数退避自重连 max 60s。 mobile-bridge.handlePairAckFromRelay—— bug fix:main/index.js调this.mobileBridge?.handlePairAckFromRelay(...)但方法之前不存在,optional-chain?.静默吞掉 relay 路径 pair-ack 不触发任何事件;补 EventEmitter 通知与 LAN 行为对称。MobileBridgeHeaderStatus.vue—— web-panel header 显示已配对 mobile 数量,5s 轮询cc p2p devices --type mobile。parseJsonOutput跳过 CLI log 前缀([AppConfig]/[DatabaseManager]等)避免 false-positive 匹配为 JSON-array 开头。- i18n ——
RemoteOperateScreen11 个字符串提取到values/strings.xml+values-zh-rCN/strings.xml(ro_title / ro_subtitle / ro_peer_id_fmt / ro_quick_commands / ro_cmd_ping/status/info / ro_executing_fmt / ro_error_label / ro_response_label / ro_unpair)。
测试:3 个新单测文件 / 20 测试全绿 —— PairedDesktopsStoreTest 7(mocked SharedPreferences 而非 Robolectric,核心 store 启动快几个数量级)/ SignalingRpcClientTest 7(FakeSignalClient + CapturingGate;happy / 无 DID fail fast / LAN→relay fallback / 双失败 / response 含 error 字段 / withTimeout 真超时 / 未知 rid silent ignore)/ RemoteOperateViewModelTest 6(mockk + StandardTestDispatcher;state 转移 + null 错误兜底 + unpair 调 store.remove)。两个关键技术决策:(1) 用 runCurrent() 而非 advanceUntilIdle() —— SignalingRpcClient 内部 withTimeout(30000) 用虚拟时间,advanceUntilIdle 会把时间推到 30s 后触发误超时;runCurrent 只跑当前时间点 ready 任务;(2) 新增 testImplementation("org.json:json:20240303") —— Android SDK 自带的 org.json.JSONObject 在 isReturnDefaultValues=true 下方法静默返默认值而非真解析 JSON。ScanDesktopPairingViewModelTest signaling gate failure surfaces Failed 改期望 sendAckCallCount == 2(LAN+relay 双打)。Desktop vitest 7600+ 套全绿。Plan C 真机 E2E(Android↔desktop relay 命令往返)入用户出场清单,与 Flow B 验证 pattern 一致。
已知约束 / Trade-offs:信令一跳 + 公网中继多一跳,p99 延迟 100-500ms,低频命令可接受;流式 token / 文件不适用 → 走 Plan A.2 WebRTC DataChannel;中继 TLS 但中继服务器看得到 payload,端到端加密需上 Signal Protocol session(已有 e2ee 模块但 Plan C 当前未挂);中继宕 = Plan C 不可用,LAN 仍工作。
路线图:Plan C ✅ 落地 → Plan A.1 (DataChannel 复用,DC 不可用时退信令) → Plan A.2 (高吞吐场景真 P2P 直连绕中继带宽) → Plan B (STUN/TURN 穿透,让真 NAT 隔离两端也能 A.1)。
部署 / 分发:桌面 binary v5.0.3.49 → v5.0.3.50 重打;chainlesschain npm 版本不变(CLI 0 改动);Android versionCode/Name 不变(v1.0.0 GA 维持,本批 Plan C 走桌面端 v5.0.3.50 优先 + 后续 Android v1.1 minor 一并 ship 完整移动客户端)。三大文档站本次同步刷新:docs-site / docs-site-design 由 sync 脚本拉新 Plan C 设计文档 + docs-site tagline 升 v5.0.3.50 + README/README_EN 加本节 changelog。
2026-05-12 发布 — v5.0.3.49 M-of-N multisig Phase 1d + Phase 2a marketplace mediator + Phase 2b web-panel Multisig view + Flow B QR pairing 收口 + 测试补丁
productVersion v5.0.3.48 → v5.0.3.49。本版四条主线:
(1) @chainlesschain/core-multisig package + cc multisig CLI 落地(commit 3c890dcac,v1.2 m-of-n Phase 1d)—— 新建 npm workspace package 含 5 lib(policy / store / proposals / signing / governance-log),CLI 加 8 subcommands(propose / sign / cancel / finalize / list / show / sweep / policy);75 lib 单测 + 10 CLI integration 测试全过。SQLite native(better-sqlite3-multiple-ciphers)→ sql.js WASM 自动 fallback,CLI 跨平台开箱即用。
(2) Phase 2a marketplace.purchase mediator(commit 2755093d0,设计文档 §6.1 落地)—— cc marketplace purchase <itemId> 大额(≥¥1000 默认 LARGE_PURCHASE_THRESHOLD_FEN = 100000 fen)自动走 M-of-N 多签 propose,小额走 direct;cc marketplace consume <proposalId> 在 threshold 达成后 finalize + 执行业务。抽出 packages/cli/src/lib/multisig-runtime.js 共享 SQLite cascade + manager loader 让 multisig + marketplace 复用(−130 行 dedup,Phase 1 10/10 零行为变更)。8 新 E2E 测试全过(大额 2-of-2 全 walkthrough / 小额 direct / --threshold-fen override / 6 个错配 exit 2)。marketplace.purchase / did.rotate / 跨链 bridge 三大典型 domain 由此真接通业务侧 — marketplace 是第一个 mediator 实例。总 18 multisig integration test 全 green(Phase 1 10 + Phase 2 8)。
(3) Phase 2b web-panel Multisig 视图落地(commit c758492d9,设计文档 §8.1 落地)—— web-shell(默认桌面入口)加 M-of-N 多签查看 / 操作面板。新 packages/web-panel/src/views/Multisig.vue (468 行):6-card 顶部 stats(总数 / pending / reached / consumed / cancelled / expired)+ 两 tab 提案列表(state+domain 过滤、详情/取消/执行购买 actions)/ 域策略(marketplace.purchase / did.rotate / crosschain.outbound)+ 640px Detail drawer(payload JSON + 签名列表 + 取消/执行购买/finalize 操作按钮)+ info Alert "web shell 不持私钥 sign 走 CLI"。AppLayout.vue + router/index.js 加 sidebar 入口(TeamOutlined)+ /multisig 路由 + i18n fallback "M-of-N 多签"。WS 通信走 ws.executeJson('multisig list --json') CLI 子进程,冷启动 6-10s(asar:true 开销)可接受;Phase 3 follow-up 可加 in-process WS handlers 削延迟、私钥签名 UI 接 Unified KeyStore、实时推送、Marketplace.vue purchase modal 集成。同份 SPA 在 desktop web-shell + cc ui 两边自动可用(per memory feedback_cross_shell_feature_pattern)。
(4) Android v1.1 W3.7 Flow B QR pairing 落地(commit c47cbc649)—— desktop 显 QR / phone 摄像头扫的主流应用通用 UX(微信/支付宝/Discord/WhatsApp Web 同模式),Xiaomi 24115RA8EC 真机 E2E verified。9 项实战坑全排清。同步补齐 Flow B commit 漏掉的 2 个测试文件:ScanDesktopPairingViewModelTest 10 项 + desktop-pair-handlers.test.js 19 项。
新增 — M-of-N multisig core(v1.2 #20 P0.3 Phase 1d):
@chainlesschain/core-multisigpackage —— lib 5 文件:policy.js(域级{m, n, members[], requirePqc, defaultExpiryMs}validate + normalize)/store.js(SQLite 3 表 schema + helpers)/proposals.js(状态机pending → reached → consumed+cancelled/expiredterminal)/signing.js(JCS canonicalize + DOMAIN_PREFIX"MULTISIG:"防回放 + Ed25519/SLH-DSA dispatcher + verifyThreshold strip-all-sigs)/governance-log.js(append-only JSON Lines 审计,每态转捕);75 单测全过。cc multisigCLI 8 subcommands ——propose/sign/cancel/finalize/list/show/sweep/policy {set, show};全--json输出;10 CLI integration 测试全过。- SQLite driver cascade —— native
better-sqlite3-multiple-ciphers/better-sqlite3失败时自动降级sql.jsWASM,无须每平台预装 native prebuild(per memoryfeedback_sqlite_wasm_fallback)。 - 测试基础修复 3 项:
core-multisig vitest.config.js设globals: true(vitest 4 不接 CJSrequire("vitest"));5 test 文件改 ESM import;multisig-cli.test.jsimport 路径@chainlesschain/core-mtc/signers/ed25519.js→ 去.js后缀(core-mtc exports key 无后缀)。
新增 — Phase 2a marketplace.purchase mediator(v1.2 #20 P0.3 Phase 2):
cc marketplace purchase <itemId>+cc marketplace consume <proposalId>两 subcommand —— amount ≥ threshold 必须有marketplace.purchasepolicy 才能 propose;threshold 默认 ¥1000(LARGE_PURCHASE_THRESHOLD_FEN = 100000fen),可--threshold-fen覆盖;amount < threshold 走 direct path 不创 proposal;consume校验domain == "marketplace.purchase"+state == "reached"后 finalize + 打印订单 + governance log 写consumed事件。- 共享运行时
packages/cli/src/lib/multisig-runtime.js—— 抽出 commands/multisig.js 内联的 SQLite cascade + manager loader + readSecretKey/readJsonArg helpers,commands/marketplace.js 复用。multisig.js 同步 refactor 替代内联,-130 行 dedup,Phase 1 10/10 integration test 零行为变更。 - 8 新 E2E test 全过(
marketplace-multisig-e2e.test.js):大额 ¥1500 2-of-2 全 walkthrough(policy → purchase → sign×2 → reached → consume → governance.logproposed/signed×2/reached/consumed)/ 小额 ¥500 direct / threshold override / 大额无 policy exit 2 / consume pending exit 2 / consume 错域 exit 2 /--help。
新增 — Phase 2b web-panel Multisig 视图(v1.2 #20 P0.3 Phase 2b):
packages/web-panel/src/views/Multisig.vue—— 6-card stats + 提案列表 tab(state/domain 过滤 + 详情/取消/执行购买 actions)+ 域策略 tab(marketplace.purchase / did.rotate / crosschain.outbound 已知 policy)+ 640px Detail drawer(domain/state/threshold/sigs/initiator/payload JSON + 签名列表 + 操作按钮)+ info Alert "web shell 不持私钥 sign 走 CLI"。- router + AppLayout ——
/multisig路由 + sidebar security/audit 组 multisig 入口(TeamOutlined)+ 折叠模式同步 + i18n fallback "M-of-N 多签"。 - WS 走 CLI 子进程 ——
ws.executeJson('multisig list --json'),复用 Phase 1 CLI;冷启动 6-10s(asar:true)可接受。 - Phase 3 follow-up:私钥签名 UI(需 Unified KeyStore)、in-process WS handlers、实时推送、Marketplace.vue 集成入口。
新增 — Android v1.1 W3.7 Flow B QR pairing(issue #19):
- 跨模块 DI 拆解 ——
PairingSignalingGate.sendAckinterface 落:core-p2p避免:feature-p2p反依赖:app;WebSocketPairingSignalingGate.sendAck实现在:app内ensureRegistered + Mutex串行化;WebRTCClient.SignalClient.sendForwardedMessage(toPeerId, payload)桥接 mobile 端的 signaling forward。 - Mobile 端 UI:
ScanDesktopPairingScreen+ScanDesktopPairingViewModel用非-socialQRCodeScannerScreen(ZXing 透传,social variant 校验 reject 我们的 desktop-pairing JSON);NavGraph + SettingsScreen 加"扫描桌面 QR"入口。 - Desktop 端 WS topics 三件套
desktop-pair-handlers.js:desktop.pair.generate-qr/poll-ack/reset;mobile-bridge.js加this.peerId持久化 + 拦截type=pair-ack经recordPairAck匹配 + 写 SQLite。 - Vue UI
MobileBridge.vueFlow B tab(默认)+ Flow A + 手输 3-tab;antd.js注册AQrcode。
测试补丁:
- Android
:feature-p2p:testDebugUnitTest41s 全绿(138 actionable tasks)—— 新ScanDesktopPairingViewModelTest10 测试 + existingDesktopPairingViewModelTest+ MessageQueueViewModelTest + P2PChatViewModelTest + P2PDeviceViewModelTest。 - Desktop 3 文件 / 45 测试全绿 —— 新
desktop-pair-handlers.test.js19 测试 +mobile-pair-handlers.test.js9 测试 +web-shell-bootstrap.test.js17 测试。
部署 / 分发:桌面 binary:v5.0.3.48 → v5.0.3.49 重打(含 Flow B + multisig 新代码;auto-updater 比对 5.0.3-alpha.49 > 5.0.3-alpha.48)。chainlesschain npm 0.161.8 → 0.161.9(cli 加 multisig command + dep @chainlesschain/core-multisig)。Android:versionCode/Name 不变(v1.0.0 GA 维持);Flow B 桌面端首发,后续 Android v1.1 minor release 一并 ship 完整移动客户端。三大文档站本次同步刷新:docs-site / docs-site-design / docs-website-v2 tagline 升 v5.0.3.49 + 加本节 changelog。
2026-05-12 发布 — v5.0.3.48 Android M3 capture suite (5/5 code) + M4 RemoteSkillRegistry method-level + ApprovalUI 4-category + ProgressViewer + alias 兼容窗口
productVersion v5.0.3.47 → v5.0.3.48。Android v1.0 RFC M3 + M4 收尾批次:7 commit / 187 新单测 / Android 总单测 196+ → 383+。Android M7 GA flip 一并落地(commit ffe722162):versionCode 37 → 100,versionName 0.37.0 → 1.0.0 GA。无桌面 / CLI 源码改动,CLI npm 0.161.7 → 0.161.8(force publish 走 release.yml 同步轨道)。下一步 tag v1.0.0 在 ffe722162 推 gitee+github。
新增 — Android M3 capture suite (5/5 代码层落地):
- VoiceMode 连续语音串联(commit
47bebed80)—— ASR → REMOTE chat → TTS pipeline 在 home 入口串通。 - CameraOCR 拍照入 KB 流水线(commit
a69269ced)——ai.ocrImage+knowledge.createNote走完,OCR 元数据自动写入。 - LocationTagger Play Services FusedLocationProvider + Foreground Service(commit
3f5ac8647)—— GPS 数据进createNote.metadata。 - SharePayloadFlusher 接 SyncCoordinator → knowledge.createNote(commit
3d1a6e3a8)—— 5 种 SharePayload(Text / Url / SingleImage / MultiImage / GenericFile)转 note 字段;SyncCoordinator 30s push 循环末尾 drain SharedInboxRepository,失败 re-enqueue。19 新单测。 - PushNotifier 本地通道 + FCM 骨架(commit
c0d990c91)—— 4 NotificationChannel(Cowork / Marketplace / SystemAlert / ShareInbox)+ 协议中立CcPushNotificationService入口;FCM 真接入按android-app/docs/M3_FCM_SETUP.md5 步走(google-services.json 由用户出场)。36 新单测。
新增 — Android M4 收尾:
- RemoteSkillRegistry method-level 元数据(commit
6e49270fd)——MethodMetadatadata class + 4 个 accessor;knowledge.*+ai.*各 10 methods seeded(8 riskOverride 演示);其他 21 namespace pending 桌面 mobile-skill-whitelist 下发。16 新单测。 - ApprovalUI 4 category 适配(commit
f4f83cc67)——ApprovalCategoryenum {Sign / Cowork / Marketplace / SystemCritical} + fromMethod 推断;AndroidApprovalGate4-arg overload 透传 category;Dialog 按 category 切 icon / tint / title / footer。9 新单测。 - ProgressViewer 长时任务面板(commit
f4f83cc67)——LongTaskRegistry@SingletonMutableStateFlow +TaskProgressCommandRouter接task.*reverse-RPC + ComposeProgressViewerScreen(StatusChip + Linear / indeterminate Circular + dismiss / clear-terminal,MAX_TASKS=100 滑窗)。34 新单测。 - §8.3 RemoteSkillRegistry alias 兼容窗口(commit
0bc8e2797)——SkillMetadata.aliases字段 + 内部aliasIndex反查;所有公共 accessor 自动经resolveAlias。未来 namespace 改名 1 版内不 break。7 新单测。 - §8.1 README + v1.0 GA 检查清单(commits
0bc8e27973da484e9c)——android-app/README.mdM3 (2/5) → (5/5 code)、M4 补 method-level + ApprovalUI + ProgressViewer;新增ANDROID_v1_GA_CHECKLIST.md。M7 GA flip 已由ffe722162落地,余下 4 项待用户出场:M3 真机 E2E / M4 D2 真机 / FCM 凭证 / M6 性能实测。
测试:Android 187 新单测全绿,覆盖 capture / push / registry / task / approval-category / composite-router 全部新模块。Desktop store 回归 26 文件 / 773 测 ✓;CLI lib 169 文件 / 7185 测 ✓(确认 Android 工作未污染 desktop / CLI 路径)。
部署 / 分发:桌面 binary 重打 v5.0.3.47 → v5.0.3.48(无桌面源码改动;auto-updater 比对 5.0.3-alpha.48 > 5.0.3-alpha.47,v5.0.3.47 用户重启拿到新 build)。chainlesschain npm 0.161.7 → 0.161.8(CLI 自身 0 源码改动;force publish 走 release.yml 同步轨道)。Android:versionCode 37 → 100, versionName 0.37.0 → 1.0.0 GA(commit ffe722162);android-app/CHANGELOG.md 加 [1.0.0] - 2026-05-12 GA entry,android-app/README.md 标题切 "🎉 v1.0.0 — GA"。三大文档站本次同步刷新:tagline 升 v5.0.3.48 + 新增本节 changelog。
productVersion v5.0.3.45 → v5.0.3.46。Android 0.36.0 → 0.37.0(versionCode 36 → 37)。本次主线三条:(1) Phase 3d Mobile-Bridge-Sync 桌面 ↔ Android 双向社交数据同步全套落地(M2 → v1.2 共 12 commit · 5 ResourceType walker + tombstones + Room cursor + sync.* JSON-RPC handlers + DeviceManager + SyncCoordinator auto-trigger · gate 1-4 全部 Ed25519 真签真验);(2) Android 0.37.0 一次落 7 件用户可见功能(Volcengine SeedASR 语音 + APK 自更新 issue #21 + Splash 重做 + Claude coral 主题 + i18n 三地区 + 生物识别 + DID Key 屏);(3) e2e CI 静默回归洞收口(drop e2e-tests workflow JOB 级 continue-on-error: true —— 之前让 3/3 OS 失败显示 success "No team IPC interface found" 沉了几周 + Playwright 浏览器 cache 加速)。
新增(Phase 3d 桌面 ↔ Android 双向同步):
- M2 桌面 sync engine 落地(commits
491fb4758→9a8e3635d)—— scaffold mobile-bridge-sync provider,drop deadMobileSyncManager;rewrite 5 ResourceType walker(note/conversation/did/community/channel)+ apply 路径;tombstone 触发器 +resource_type列;mobile.ts真 provider + IPC wire-up;52 个 mobile sync 测试,过程中找出并修 3 个 prod bug。 - M3 Android 侧 SocialSyncAdapter wiring + Room cursor + JSON-RPC handlers(commits
28c85dad5→1131e35a2)—— 用dagger.Lazy解 4 处 Hilt 循环依赖;MESSAGE outgoing path;Room 持久化SyncRemoteCursor;sync.*JSON-RPC handlers 在 SyncManager 落地;transport wiring + outbound JSON-RPC。 - M4 桌面设置页 + DeviceManager + 手动配对(commits
0bf5f00b917ea9b69d)—— Settings 加 SyncMobile 移动设备同步页面;DeviceManager wire-up + 手动 pairing 表单。 - v1.1 真填 handlePullRpc + DID auth + 自动 trigger(commits
2d841dfdc→b77e0773b)—— Android walker 真填handlePullRpc不再 stub;sync.*topic 加 DID 签名验证;SyncCoordinatorsocket 连上后自动 trigger push/pull。 - v1.2 真 Ed25519 + Android gate 4(commits
c739d77d04ecb7c8ef)—— 桌面侧 placeholder 签名 → 真@noble/ed25519;Android gate 4 验签,gate 1-4 全部 strict-verify。
新增(Android 0.37.0,commit 1348636ad):
- Volcengine SeedASR 语音识别 ——
WavRecorder(16kHz mono PCM → WAV)+VolcengineAsrClient(HTTP submit + 800ms poll)+HomeStatusViewModel状态机 +AsrSettingsScreenx-api-key 入口 + Recording/Transcribing dialogs。 - APK 自更新(issue #21) ——
UpdateChecker(GitHub Releases API,tag prefixandroid-v,arm64-v8a asset 选择)+UpdateInstaller(DownloadManager + FileProvider + ACTION_VIEW)+UpdateDialog(changelog scroll + REQUEST_INSTALL_PACKAGES 权限流)+ Settings "检查更新" 入口。 - Splash + 主题大改 —— SplashScreen 紫色渐变 + 旋转环 + TT logo + 3-dot breathing + progress;
rememberUpdatedState修 splash race;Claude coral palette(#D97757primary)+dynamicColor=false默认保品牌色。 - i18n(issue #16) ——
resourceConfigurations用zh-rCN/zh-rTW/zh-rHK显式 qualifier(fix:zh作 language-only 在 build 时把values-zh-rCN/全过滤掉);AppCompatDelegate.setApplicationLocales接线;MainActivity→AppCompatActivity+Theme.AppCompat.Light.NoActionBar。 - Auth + DID + 生物识别 ——
AuthRepository.register幂等回退 verifyPIN(fix race:AuthVM 异步 DataStore read vs splash navigate 抢跑);SettingsScreen 生物识别 toggle;新增KeyManagementScreen(DID + public key hex + clipboard + trusted devices + reset)。 - Home page UX —— LLM 未配置 banner(点击跳 LLM Settings);Send-from-home prefill 通路;BrandSection / AboutScreen logo 切
R.mipmap.ic_launcher;FunctionEntryCard 12 硬编码彩色 → 统一 surfaceVariant + 44dp icon chip。 - 顺手修的 latent bug:
OpenAIAdapter.{chat,chatWithTools,checkAvailability,streamChat}加withContext IO+flowOn(之前 block main thread → 12s 主页冻结);RemoteConnectionManager.invoke{,WithRetry}inline reified<T : Any>;SystemMonitorScreen.kt:149os?.type/versionnull-safe;256 个rs_*string stub 自动生成。
修复:
- Android
sync.*DID auth strict-mode flip + release build unblock(commit49f1440ca)。 - 2 个 mobile-ipc 测试 stale after M4.5(commit
d34de0ac0)—— DeviceManager wire-up 改了 IPC shape,把测试同步对齐。 - 官网移动端 hamburger 菜单(commit
0bb62675d)——SiteHeader.astro在小屏下 nav 列表撑满整行无折叠,加<button>toggle + tailwindmd:hidden。 - logo 资产送 docs+design 站 + www 文档跳链 retarget(commit
61b8cd642)。 - E2E preload 真错暴露 + force V5/V6 mode + app-config.json 早写(commits
0764742081f61a18bffc9cacc48)。
CI:
- drop e2e-tests workflow
continue-on-error: true(commite807d576c)—— 之前 JOB 级continue-on-error: true让 3/3 OS 失败显示 success,"No team IPC interface found" 沉了几周。 - e2e-tests workflow 加 npm cache + Playwright browsers cache(commit
9460f05da)——actions/cache@v4缓存~/.npm和~/Library/Caches/ms-playwright/%LOCALAPPDATA%\ms-playwright,单 OS 跑时间预期从 ~14m 降到 ~6-8m。
测试:桌面 mobile sync 52 测试全绿(M2 step 8)+ Android Phase 3d v1.1/v1.2 sync gates 1-4 完整 + mobile-ipc 12/12 绿。
部署 / 分发:CLI npm chainlesschain 保持 0.161.7(CLI 自 v5.0.3.45 无源码改动)。桌面 binary 重新打过,auto-updater 比对 5.0.3-alpha.46 > 5.0.3-alpha.45,所有 v5.0.3.45 桌面用户重启发现新版。Android APK 走新 android-v0.37.0 tag 发布(用户可在 Settings → 检查更新 看到)。三大文档站本次同步刷新(tagline 升 v5.0.3.46 + changelog 加本节)。
productVersion v5.0.3.44 → v5.0.3.45。cc ui 终于跟桌面 web-shell 在 LLM 路径上对齐;项目/文件模式聊天默认不再走"理解中…"占位 LLM 调用;chatStream 改为真正的 token-by-token 流式;意图卡片 Vue Proxy 引用 bug 修复让占位卡正确翻面。
新增:
cc uillm.chatWS topic(commitf41c4b4e2) —— 桌面 web-shell 自4eaf90137(Phase 2)就有这个 topic,但cc ui(CLI 的 ws-server)从未注册过。结果:QuickAsk 页面在cc ui模式下永远卡 60 秒后报Stream idle timeout(dispatcher 返回的UNKNOWN_TYPE帧 SPA 不识别为流的终态)。新增packages/cli/src/gateways/ws/llm-chat-protocol.js,handler 复用 chat-core 的streamOllama/streamOpenAI/streamAnthropic,按<topic>.chunk+<topic>.result的 frame 协议跟桌面desktop-app-vue/src/main/web-shell/handlers/llm-handlers.js完全对齐。新增packages/cli/src/gateways/ws/llm-creds.js共享 cred 解析:explicitoptions→ WS session creds → provider 环境变量(顺序:volcengine/openai/anthropic/deepseek/dashscope/gemini/kimi/minimax/mistral);任何源没拿到都立即返回 ok:false 帧,不再 60 秒挂死。chat-intent-protocol同步切到共享 helper,顺手修一个 latent bug:原代码session.baseUrl || "http://localhost:11434"在 session 没设 baseUrl 时硬编码到 ollama 地址,所有云 provider 在用户本地没起 ollama 时都会跑死。- 意图理解可见开关(commit
f41c4b4e2) —— Chat / Agent 项目/文件模式 header 加<a-switch>,默认关闭。原行为:v5.0.3.43 起每条消息先调 LLM 提炼意图(chat.intent.understand-stream),再走真发送 —— LLM 慢/无 cred 时占位卡 90 秒;现在默认直发,需要意图卡片的用户手动打开开关(持久化到localStorage cc.web-panel.chat.intentEnabled)。submitUserInput第一行的短路:if (mode === 'global' || !intentEnabled.value) { sendMessage; return }。桌面壳同享这个 SPA bundle,所以桌面也跟cc ui行为一致。
修复:
chatStream真正的 token 流式(commit35f6e60ea) ——packages/cli/src/lib/chat-core.js的chatStream原本是 buffer 全部 token 后再循环 yield 的伪流式 —— 消费者要等到 LLM 整个回完才看到第一帧。改为 token queue + Promise waiter 模式:onToken push 后立刻 wake generator yield。streamPromise.finally翻 done flag 兜底空响应。Chat / Agent / QuickAsk / 意图理解 全部受益。- 意图占位卡片 Vue Proxy reactivity 修复(commit
a76e451e2) ——submitUserInput创建 placeholder 后 push 进 reactivemessages[sessionId]会被 wrap 成 Proxy,但本地变量 ref 仍指向 unwrap 之前的 target;后续placeholder.metadata.X直接改原对象绕过 Proxysettrap → 数据更新但不触发重渲染。用户可见症状:意图卡片永久卡在"理解中… / 0 tokens / 意图: 未识别",即使后端已经流完 30+ chunk + final。修法:card = msgs[msgs.length - 1]push 后重新取 Proxy 引用,所有后续 mutation 走card.metadata.X。
测试:
- CLI ws gateway 16/16 绿(chat-intent 6 + 新 llm-chat 9 + 新增"无 cred 不调 LLM"环境清理 1)
- web-panel chat-intent-flow 27/27 绿
部署 / 分发:CLI npm chainlesschain 0.161.5 → 0.161.6 → 0.161.7(0.161.6 已先于 productVersion 单独 publish 修复 hang;0.161.7 带 chatStream 真流式 + 意图卡片 Vue Proxy 修复)。桌面 binary 重新打过,auto-updater 比对 5.0.3-alpha.45 > 5.0.3-alpha.44,所有 v5.0.3.44 用户重启发现新版。GitHub Release 28 个 asset,6 个并行 workflow(Release / CLI CI / Code Quality / E2E / CI Tests / Full Test Automation)全绿。
productVersion v5.0.3.43 → v5.0.3.44。一条 user-visible feature(截图 LLM OCR)+ 三条质量收口。无破坏性变化,所有 v5.0.3.43 用户可直接 upgrade。
新增:
- 截图 OCR LLM 引擎(commit
39b16e29f) —— Tesseract.js 中文识别准确度差,新增engine参数auto/llm/tesseract三态。auto默认走火山豆包视觉(已配置),LLM 出错带fallbackFrom/fallbackReason标签自动降级回 Tesseract。Provider 白名单Set(["volcengine"]),扩展到 gemini / openai / anthropic 只需在各自 LLMManager 暴露chatWithImage*后加一个集合项。V5 / V6 共享 dialog + web-panel dialog 各加一个<a-select>engine 选择 + 蓝/灰/橙三色 tag 显示已用引擎。
修复:
- chat intent understand 90s wall-clock 兜底(commit
6cbd04c50) ——sendStream自带的 60s idle timer 在每个 chunk 上 rearm,慢 LLM 一直 dribble token 但永远不出finalframe 时"理解中…"占位卡会无限转。AbortController + setTimeout(90s)把 signal 传进 stream 调用,超时清理 placeholder + 可读错误。 - compliance-ipc 死 handler 清理(commit
29006decf) ——compliance-ipc.js之前注册的两个 channel 用了 typo 前缀compliance-classify:*(无人调用);renderer 真正调用的compliance:generate-report/compliance:get-policies由audit-ipc.js拥有,背后是ComplianceManager。两边 service 还不一样(soc2Compliance.generateReportvsauditManager.complianceManager.generateReport),保留死路径只会让后续改真路径时漏改 → 直接删。 - macOS 临时目录路径断言(commit
bb2c16656) ——build-win-with-deref.test.js在 macOS 矩阵 3 个断言炸expected '/private/var/folders/...' to be '/var/folders/...':macOS/var → /private/varsymlink。fs.realpathSync(os.tmpdir())规范化测试临时目录,linux / win 上 realpath 恒等无 regression。
测试:
audit-ipc.js首次单测覆盖(commitb092673be) —— 之前零覆盖盲点(被29006decftypo 死 handler bug 拽出来)。audit-ipc.js拥有 18 个 channel 含 renderer-facing 的compliance:get-policies/compliance:generate-report,没有单测就让 typo duplicate 静悄悄活了几个月。源码 DI 改造(与credit-ipc模式一致):acceptipcMainviadepswithelectronfallback;新增 23 个 case 覆盖 18 channel 路由 + happy-path payload + AuditManager 异常路径。
回归测试全绿:
| Suite | 通过 |
|---|---|
| desktop unit | 1477 / 1477 |
| CLI 全量 unit | 17,455 / 17,455 |
部署 / 分发:CLI npm [email protected] 同步发布;桌面 binary 重新打过,auto-updater 比对 5.0.3-alpha.44 > 5.0.3-alpha.43,所有 v5.0.3.43 用户重启发现新版。
productVersion v5.0.3.41 → v5.0.3.43(.42 是 CLI atomic bump,无功能变化,详见 changelog)。本版本两条主线:(1) MTC landmark.publisher_signature strip-all-sigs 对称化,修复一个会绕过 M-of-N 阈值的真实缺陷;(2) 安全硬化级联,一周内 8 次 sweep 把 npm audit 全部清零(HIGH 44 → 0 · MOD 4 → 0 · LOW 45 → 0)。
核心修复:
- MTC publisher_signature M-of-N strip-all-sigs(commit
c23e98cca+ 文档038e6d710) —— Producer 与 verifier 必须对称地把_stripSigsForPublisher(landmark)(清零publisher_signature.sig+ 每个 snapshot 的signature.sig+signatures[*].sig)喂给 JCS 后再签 / 验,而不是只清零publisher_signature.sig。否则只要篡改 M-of-N 联邦中任何一个成员的 per-member sig,publisher_signature 就会被打断 → 直接绕过 M-of-N 阈值的存在意义。Helper 抽到packages/core-mtc/lib/publisher-signing.js,导出为@chainlesschain/core-mtc/publisher-signing子路径。三处调用点:batch.js(单签 + 联邦)、landmark-cache.js验证侧、桌面governance-multisig.js(lazy-require 绕 @noble/curves hoisting trap)。规范文档 §8.2 同步更新。Canary:mtc-federation-publish-cli.test.js"2-of-3 threshold accepts when one member's sig is tampered"。 - LandmarkCache
landmark.publisher_signature验证启用(commitc40d927da+72c3619ee) —— 默认 opt-inverifyPublisherSignature: true对 cache 命中前增加发布者签名校验(不再无脑相信 cache);real-verifier callers(CLIcc mtc verify+ 桌面 audit pipeline + cross-chain bridge 校验侧)全线启用。常量BAD_PUBLISHER_SIG→BAD_LANDMARK_SIG(36fcd8f4f)匹配规范 §11;spec §8.5 跟进LANDMARK_SIG_PREFIX定义。
安全硬化(HIGH 44 → 0 · MOD 4 → 0 · LOW 45 → 0):
f6c937fa8overrideserialize-javascript+tar(HIGH 44 → 10)8a56978b5删speedtest-net,改用 native fetch9c7ce00e7overridesemver^7.7.4(清掉 imap 链)922b64822overrideundici^6.21.2(清掉 hardhat 5.x 链)4fae47dd4deprecateweriftcc7b0b40aoverrideip-address+dompurify(MOD 4 → 0)1f86594a2overridetmp^0.2.564047283aoverridemake-fetch-happen^13d19bcb8cb拆hardhat-stack到独立contracts/workspace + drophdkey(LOW 14 → 0)d558b66b1channel-managerDDL 加固 + drop 未用的 jspdf7312cf035wrtc-compat补 CVE-2024-29415(ipSSRF)
新增:
- Updater 渲染端进度通知(commit
4c1a5ac18+e27592bb5) ——notifier-onlyflow,关闭重复 native dialog,渲染端实时显示下载进度。
回归测试全绿:
| Suite | 通过 |
|---|---|
| desktop unit(含 nostr-bridge-ipc 修) | 1454 / 1454 |
| core-mtc 单测 | 258 / 258 |
| CLI mtc-federation 集成 | 41 / 41 |
| CLI 全量 unit | 17,432 / 17,432 |
附带 bug 修(本对话两连)—— 同根:551ef28b3 "fix(ipc): correct ipcGuard API" 切到 markModuleRegistered 那次 sweep 不彻底,留下两类互补 bug:
| Commit | Bug | 为什么之前没炸 |
|---|---|---|
af92e0162 fix(test): align nostr-bridge-ipc stub |
源码用 ipcGuard.markModuleRegistered(name) 直调(real guard 有此 fn),但 test stub 仍 mock 不存在的 registerModule(name, channels) 二参 → stub 调时 TypeError: ipcGuard.markModuleRegistered is not a function,23 / 389 social 用例炸 |
CI "Unit Tests" stable-fallback 排除 **/*-ipc.test.js;"Full Test Suite" 用 continue-on-error: true |
11247a957 fix(ipc): align 8 ai-engine IPC modules |
8 个 IPC 模块(autonomous-developer / collaboration-governance / tech-learning / federation-hardening / reputation-optimizer / sla / stress-test / inference)反过来 —— 源码 if (ipcGuard.registerModule) { ipcGuard.registerModule(name, CHANNELS); },real guard 没 registerModule → if 永远 falsy → guard 内部 registeredModules Set 漏跟踪这 8 个模块。Handlers 走 ipcMain.handle 仍真正注册,业务功能正常 |
测试 stub 自己 mock 了 registerModule → 测试假绿 |
修:stub registerModule → markModuleRegistered + 断言去 channels 参(test 侧);if (ipcGuard.registerModule) { ipcGuard.registerModule(name, CHANNELS); } → ipcGuard.markModuleRegistered(name),同时去掉同样无意义的 if (ipcGuard.unregisterModule) wrap(源码侧)。回归:collaboration-governance-ipc 21/21 + tech-learning-ipc 21/21 + ipc-guard core 12/12 + 邻近 29 文件 577/577 ✅。
部署/分发:本版桌面 binary 重新打过;auto-updater 比对 5.0.3-alpha.43 > 5.0.3-alpha.41,所有 v5.0.3.41 桌面用户重启会真发现新版。三大文档站(docs / design / www)同步刷新(commit 1183075b5 + 0384099f3)。
productVersion v5.0.3.40 → v5.0.3.41。本版本正式 ship 自 .40 以来的全部滚动条目(XII–XIX:B4 跨机分发 / trust filter / viewer / 外部归档 / M-of-N / 跨联邦信任 / web-shell / web-panel / sign-as-self / cred-persist / auto-archive / chat-panel-v5)。
核心新能力:
- chat-panel-v5 三壳严格对齐 —— V5 桌面 / V6 桌面 / web-shell 默认壳的聊天体验严格对等:流式响应 + 历史会话切换 + 上下文记忆引用 + 工具调用面板。Phase 1.6 hard-flip 后默认 web-shell 用户不再缺任何 V5 聊天能力(commit
b33527d31Phase E + commit72b13388aweb-shell port v1+v1.1)。 - B4 P2P 社交全栈 audit-grade 闭环 —— §2.2.10 → §2.2.24 共 15 节累计落地:跨机同步 + MTC 联邦双轨 + DID 签名 + auto peer 桥接 + Merkle envelope finality + 跨机分发 + trust filter + 桌面 viewer + 外部归档 + M-of-N 多签 + 跨联邦信任 + sign-as-self(私钥永不离主进程)+ WebDAV 凭据 secure-config.enc(safeStorage / AES-256-GCM)+ 主进程定时归档 cron。私钥 / 密码均不过线,桌面 V5/V6 + 默认壳 web-panel 用户看到的功能严格对等。
回归测试全绿:
| Suite | 通过 |
|---|---|
| desktop MTC + DID + social + web-shell + p2p + bootstrap + renderer | 1454 / 1454(4 skipped) |
| CLI chat-intent + mtc-federation core/trust/sync 集成 | 69 / 69 |
| web-panel 单元 | 1853 / 1853 |
| web-panel e2e | 63 / 63 |
修一个 bug:
- web-panel
views-mount-smoke.test.js在 63 文件并行套件下 first-import 撞 30s timeout(Pipeline.vue + Chat.vue 在 4-fork 池下 SFC transform 竞争)。fix:file-levelvi.setConfig({ testTimeout: 60_000 }),全局 testTimeout 不动(已验证全局升 60s 反让 worker pool 调度恶化致更多 file 超时)。同 cli_ci_sharding_lessons 记录的 vitest 4 严格 timeout 模式。
部署/分发:本版桌面 binary 重新打过;auto-updater 比对 5.0.3-alpha.41 > 5.0.3-alpha.40,所有 v5.0.3.40 桌面用户重启会真发现新版。三大文档站(docs / design / www)同步刷新。
XVI 把 V5 ChatPanel 的 4 件重型功能 port 到 web-shell;V6 桌面 shell/AIChatPanel.vue 当时未跟。本节把对齐补齐。V6 复用 desktop V5 已有的 VirtualMessageList.vue / IntentConfirmationMessage.vue / messageTypes.ts 三件套(不重新建),意图识别走 desktop 既有 IPC project:understandIntent + followup-intent:classify(preload 已 expose,零后端工作),所以 Phase E 是纯 UI 集成。
| 维度 | V6 改动 | 说明 |
|---|---|---|
| A. 虚拟列表 | <VirtualMessageList> 替换 v-for (shell/AIChatPanel.vue slot 重构) |
import 自 V5 components/projects/VirtualMessageList.vue(双壳共用一份)。slot prop 是 unknown,加 asMsg(value: unknown): ConversationMessage helper 在 setup 段把类型钉回,v-for-with-singleton (v-for="msg in [asMsg(message)]") 把类型化 msg 暴露给整段模板 |
| B. Context 模式 | header 加 a-radio-group + localStorage cc.desktop.aichat.contextMode(与 web-shell key 独立) |
file 永久 disable(V6 没 currentFile 概念) |
| C. 意图识别 | 新 submitUserInput(text) / tryUnderstandIntent(text) / handleIntentConfirm/Correct;transient pendingIntentCard ref(不进 conversationStore);onSend 改走 submitUserInput;<IntentConfirmationMessage> 渲染挂在 messages-list 之后;clearContext / newConversation / selectConversation 都清空 pendingIntentCard |
Wire:window.electronAPI.project.understandIntent({ userInput, projectId, contextMode }) 直走 V5 IPC,preload 1259 行已 expose;返 success=false 或 understanding 无信息量时 fall through 直发 |
| D. autoSendMessage | 新 prop autoSend?: boolean(保留 prefillText);watch open + [prefillText, autoSend] 触发 maybeAutoSend();token dedup ${prefill}::${autoSend}::${contextMode} 防重发;canSend false 降级 prefill 让用户手动点发送 |
Modal panel 无 vue-router,单通道(vs web-shell 双通道) |
双壳差异对比
| web-shell (XVI) | V6 desktop (XIX) | |
|---|---|---|
| 协议层 | WS topic chat.intent.understand[-stream] / chat.intent.classify-followup |
electronAPI IPC project.understandIntent / followupIntent.classify |
| Streaming intent | ✅(v1.1, async generator + chunk frames) | ❌(V5 IPC 是 non-streaming;待新建 streaming IPC 时再升) |
| Multi-turn history | ✅ payload.history 自动注入 | ❌(V5 IPC 不接 history 参数) |
| Persisted intent decisions | ✅ localStorage(LRU 200) | ❌(pendingIntentCard transient,刷新自然丢) |
| Custom quickPrompts | ✅(modal editor + 12×120 cap) | ❌(V6 现有 4 个 hardcoded) |
| autoSendMessage 通道 | URL query + Pinia 双通道 | Prop 单通道 |
测试矩阵
| 层 | 测试 |
|---|---|
vue-tsc --noEmit |
✅ 0 errors |
npm run build:main |
✅ |
| desktop store/shell/shell-preview/AIChatPage 回归 | 150 / 150 ✅(131 + 19) |
| web-shell + CLI + e2e 累计 | 1844 + 89 + 63 全绿 |
新增 AIChatPanel.vue 测试 caveat:本节未补 mount-level 单测。原因:(1) AIChatPanel 既有 mount 测试要海量 stub(参见 AIChatPage.test.js 一千多行模式),(2) Phase E 借用的 4 件 component 都已在 web-shell 测过,(3) 桌面 IPC project:understandIntent / followupIntent.classify 是 V5 跑了几年的 handler。Manual smoke:npm run dev → V6 shell AI 按钮打开 AIChatPanel → 切 contextMode → 输错别字看意图卡 → 确认/纠正闭环。
§2.2.21 (XIV) 把 Archive Tab 接好之后,归档仍然是手动的——用户必须主动点 "推送"。XVII 修了凭据持久化,让推送本身不需要每次重输密码;本节继续把 cron 跑起来——主进程 setInterval 周期触发 ChannelEnvelopeArchiver.push,配置写到 app-config.json 的 mtc.autoArchive namespace,重启后自动恢复。
| 维度 | 改动 |
|---|---|
| 触发模式 | XVII 手动 push → 主进程 setInterval cron(默认 24h,最小 5min) |
| 配置持久化 | app-config.json mtc.autoArchive:enabled / intervalMs / providerSpec / communityIds + lastRunAt/Status/Error/Summary |
| 失败处理 | 单 community 失败仅记 lastRunStatus='partial',不阻断后续 community 归档 |
| 复用 cred 链 | providerSpec 同 XVII —— useStoredCredentials:true 直接复用 secure-config.enc |
| Reentrancy | runOnce 内置 _running 守卫,timer fire 期间手动触发返回 {skipped:true} |
| UI 入口 | MtcAudit.vue 第 5 个 Tab "Auto Archive 定时归档"——switch / 间隔 / provider / community 白名单 / 立即跑一次 / lastRun 状态摘要 |
改动 (8 文件 / 27 测试):
| 文件 | 改动 | 说明 |
|---|---|---|
desktop-app-vue/src/main/mtc/auto-archive-scheduler.js |
新文件 (+250) | 纯 Node 调度器;构造器 / getConfig / setConfig / start / stop / runOnce |
desktop-app-vue/src/main/mtc/__tests__/auto-archive-scheduler.test.js |
新文件 (+325) | 19 测试:构造校验 / 默认 merge / clamp / setConfig 校验 / 启停 / runOnce 7 场景 |
desktop-app-vue/src/main/bootstrap/social-initializer.js |
注册 autoArchiveScheduler factory entry (+50) | dependsOn: archiver/factory/communityManager;start() 自动接 enabled=true 的旧配置 |
desktop-app-vue/src/main/social/community-ipc.js |
3 IPC: auto-archive:{config-get,config-set,run-now} (+45) |
桌面 V5/V6 路径 |
desktop-app-vue/src/main/web-shell/handlers/community-mtc-handlers.js |
3 WS topic + 工厂 (+55) | web-shell 默认壳路径 |
desktop-app-vue/src/main/web-shell/__tests__/community-mtc-handlers.test.js |
+5 测试 + 顶层注册表 +3 行 | config-get/set/run-now happy + 校验透传 + 缺 dep |
desktop-app-vue/src/main/web-shell/web-shell-bootstrap.js + index.js + phase-3-4-social.js |
4 处依赖透传 + handlers 计数 24→27 | DI 链全程串好 |
packages/web-panel/src/composables/useAutoArchive.js |
新文件 (+95) | 3 方法:getConfig / setConfig / runNow |
packages/web-panel/__tests__/unit/useAutoArchive.test.js |
新文件 (+155) | 9 测试:getConfig 2 / setConfig 3 / runNow 3 / isEmbedded |
packages/web-panel/src/views/MtcAudit.vue |
+5 Tab + script 100 行 + onMounted 自动加载 | UI 含 lastRun 状态卡 + run-now summary 卡 |
测试统计 (27 新):
- desktop scheduler 19 + handlers +5 = 24
- web-panel composable 9(注:有重复计数;以新增 LoC 为准)
回归:desktop web-shell + mtc 全 32 文件 538/542 (4 skipped, 0 fail);web-panel useAutoArchive + useMtcArchive 22/22 子集全绿。
安全 / 鲁棒性断言:
- intervalMs 最小 5 分钟,避免误配成毫秒级 DoS 自己;
- enabled=true 强制要求 providerSpec —— 没 provider 直接拒绝保存;
- runOnce 内置 _running 守卫,多 fire 不重入;
- providerSpec.useStoredCredentials 走 §2.2.23 vault 路径,cron 配置不写明文密码;
- per-community try/catch,单点失败不阻断后续;记 lastRunSummary.perCommunity[id] = {ok, error?}。
B4-auto-archive 决策:
- 不引第三方 cron 库(node-cron / agenda 等)——
setInterval已足够(不需要 cron 表达式); - 复用 app-config.json,不开新 store—— 跟 ui.useV6ShellByDefault 等设置一个层级;
- scheduler 纯 Node 无 Electron API—— 单元可测 timers 注入;
- runOnce 自动持久化 lastRun* 字段—— UI 不需要单独 status WS topic,getConfig 同时拿到运行历史。
§2.2.21(XIV)落 MtcAudit 时 archive Tab 让用户每次 push 都手输 baseUrl/username/password 走 WS——这违反了"凭据不应在 wire 上反复出现"原则;同时只要真去用 WebDAV archive 就会发现"url 必填"立刻抛错——WebDAVClient 构造器读 url/remotePath,archive 工厂从 §2.2.16 起一直传 baseUrl/remoteRoot,名字根本对不上,B4-archive WebDAV 路径自从落地就完全不可用。XIV 之前没人真点过那个按钮(CLI 路径走 filesystem 居多),所以一直没爆。本节同时解决两个问题:
| 维度 | v1 - XIV(broken) | v2 - XVII(本节) |
|---|---|---|
| WebDAV 字段名 | spec.baseUrl / remoteRoot(错的) | spec.url / remotePath(对的) |
| 凭据来源 | 每次 push 都手输 + 走 wire | 复用 Phase 3c sync-credentials secure-config.enc(safeStorage / AES-256-GCM) |
| Renderer 是否持密码 | 是(input v-model) | 否(toggle 默认 ON 时不显示输入框) |
| Wire 上是否有密码 | 是 | 否(main 内部从 vault 解密) |
改动 (5 文件 / 8+ 测试):
| 文件 | 改动 | 说明 |
|---|---|---|
desktop-app-vue/src/main/mtc/archive-provider-factory.js |
新文件 (+90) | 从 social-initializer 抽出工厂;支持 useStoredCredentials:true 模式;字段名修正 |
desktop-app-vue/src/main/bootstrap/social-initializer.js |
工厂 init 改用新模块 (-58 / +5) | DI 装配只剩一行 |
desktop-app-vue/src/main/social/community-ipc.js |
新 IPC channel-archive:has-stored-webdav-credentials (+22) |
桌面 V5/V6 路径,只回 boolean |
desktop-app-vue/src/main/web-shell/handlers/community-mtc-handlers.js |
新 WS topic mtc.archive.has-stored-webdav-credentials (+25) |
web-shell 默认壳,只回 boolean |
desktop-app-vue/src/main/web-shell/web-shell-bootstrap.js + index.js |
透传 syncCredentials 依赖 (+10) |
让 WS handler 拿到 sync-credentials 模块引用 |
packages/web-panel/src/composables/useMtcArchive.js |
加 checkStoredWebdavCredentials() + hasStoredWebdavCredentials ref (+30) |
UI 探测:vault 是否已有凭据 |
packages/web-panel/src/views/MtcAudit.vue |
Archive Tab 重做:toggle + 字段名修 (+30 / -15) | switch 默认 ON;vault 空时改提示去 Settings 配 |
测试 (8 新):
desktop-app-vue/src/main/mtc/__tests__/archive-provider-factory.test.js新文件 12 测试 — filesystem 路径 / webdav 显式 spec / webdav useStoredCredentials 4 子用例 / 字段名锁定(assert NOT 含 baseUrl/remoteRoot)/ 拒空 spec / 拒未知 kinddesktop-app-vue/src/main/web-shell/__tests__/community-mtc-handlers.test.js+4 测试 — has-stored true/false / 缺 syncCredentials 注入 / 关键安全断言(响应只含 hasCredentials+success 二字段)packages/web-panel/__tests__/unit/useMtcArchive.test.js+4 测试 — flag true/false / handler error → soft false / transport error → null
回归 (上下游全绿):desktop social/mtc/web-shell 1244/1244(+10 测试) + web-panel 1976/1978(2 个 phase-b CLI 失败为 stash-clean 时也存在的 pre-existing flake,与本次无关,stash 后已验证)。
关键安全断言:
- 工厂层:
useStoredCredentials=true时调用方传入的 inline url/username/password 完全忽略(vault 字段优先)—— 防误用 / 防 spec injection。 - IPC + WS 层:
hasCredentials响应只含{success, hasCredentials}两字段,单元测试expect(Object.keys(r).sort()).toEqual(['hasCredentials','success'])锁定。 - UI 层:toggle 默认 ON;vault 空时 toggle 不可关(disable),同时显示 a-alert 引导去 Settings → 同步 → WebDAV 配置一次。
B4-cred-persist 决策:
- 不另起 credential-vault 子系统——直接复用 §Phase 3c 已落的 sync-credentials(
secure-config.enc+ safeStorage / AES-256-GCM),单一 source of truth; - 不新增
credentials.encrypt/credentials.decryptIPC 暴露——所有解密只在主进程 archiveProviderFactory 内部进行; - 工厂从 social-initializer 抽到独立模块——DI 装配 -58 / +5 行,可独立单测,未来加 OSS/S3 也好扩。
V5 桌面 components/projects/ChatPanel.vue(3788 行)一直被标记为"a different much larger port"——意图识别 / 自动发送 / 虚拟列表 / context 模式 4 件套和 5 个 IPC + 6 channel 强耦合,长期没下沉到 web-shell。本次完整 port 完成(含真 LLM 后端,不是占位)。
| 维度 | 改动 | 说明 |
|---|---|---|
| A. 虚拟列表 | packages/web-panel/src/components/VirtualMessageList.vue (+185) + Chat.vue 替 v-for |
@tanstack/virtual-core ^3.13.13 对齐 V5;happy-dom 下 fallback 路径覆盖;同时把 V6 AIChatPanel.vue 的清爽 UI 借过来——32px 头像 / 角色 + 时间 / 4 个 quick-prompt 空态 |
| B. Context 模式 | chatStore 加 contextMode + localStorage 持久化(cc.web-panel.chat.contextMode),Chat.vue 头部 a-radio-group(project/file/global) |
file 在 web-shell 永久 disable(无 currentFile 概念),project 在非 project 启动模式 disable,持久化值若与运行环境冲突自动降级到 global |
| C. 意图识别(完整 port,真 LLM) | 后端:packages/cli/src/lib/chat-intent-service.js (+340) + gateways/ws/chat-intent-protocol.js (+95) + ws-server / dispatcher 接线(2 新 WS topic)。前端:utils/messageTypes.js (+90) + components/IntentConfirmationMessage.vue (+185) + chatStore 加 submitUserInput/confirmIntent/correctIntent/classifyFollowupIntent/pushFollowupIntentBanner |
chat.intent.understand 走 V5 同款 prompt(temp 0.3 / max 500 tokens / JSON 严格契约),从活跃 session 取 LLM creds,LLM 不可用时降级 pass-through。chat.intent.classify-followup 规则优先(CONTINUE_EXECUTION / MODIFY_REQUIREMENT / CLARIFICATION / CANCEL_TASK 4 类,关键词 + 正则双层评分),confidence > 0.8 直接返回不调 LLM |
| D. autoSendMessage 协议 | Chat.vue 加 route.query 解析(?prompt=xxx&autoSend=true&session=<id>)+ chatStore.scheduleAutoSend / clearAutoSend + 消费 token 防回放 |
URL 驱动 + Pinia 程序化双通道;URL 消费后 router.replace 清 query 防刷新重放;URL > Pinia 优先级 |
| i18n 同步 | packages/locales/seed/{zh-CN,en}.json |
新增 chat.role.me / chat.contextMode.{project,file,global} / chat.empty.startTitle / chat.empty.hint.{project,file,global} / chat.quickPrompts.{summarize,brainstorm,explain,codeReview} / chat.intent.{confirmed,corrected,label.*,action.*,status.*} 共 22 对 keys,zh/en parity 测试通过 |
测试矩阵(chat-panel-v5 新增 69 测试,累计 web-panel 1829 + CLI 89 全绿,无回归)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit (CLI) | packages/cli/__tests__/unit/lib/chat-intent-service.test.js |
22 — extractJson 4 分支 / buildUnderstandPrompts 3 / ruleBasedClassify 5 类别 / understandIntent 5 分支(empty / no-llm / 解析成功 / 解析失败 / 网络抛错)/ classifyFollowupIntent 5 路径(rule-only / no-llm / llm-success / rule_fallback / 默认 CLARIFICATION) |
| Unit (CLI) | packages/cli/__tests__/unit/gateways/ws/chat-intent-protocol.test.js |
6 — bad-request / no-session-creds 降级 / 有 session 完整透传 LLM creds / unexpected error → INTENT_UNDERSTAND_FAILED / classify-followup rule-method / classify-followup llm-method |
| Unit (web-panel) | __tests__/unit/messageTypes.test.js |
11 — 三 enum 形状 / createSystemMessage / createIntentConfirmationMessage 3 / createIntentSystemMessage 4 intent 预设 |
| Unit (web-panel) | __tests__/unit/chat-intent-flow.test.js |
19 — contextMode 4(默认 / 持久化 / 拒未知 / file 持久化降级)/ submitUserInput 7(global 直发 / project 有用 understanding 推卡 / no-LLM 降级 / 重复输入跳过 / confirmIntent / correctIntent / WS error 降级)/ scheduleAutoSend 3 / classifyFollowupIntent 3 |
| Unit (web-panel) | __tests__/unit/VirtualMessageList.test.js |
5 — fallback 全量渲染 / :key 用 message.id / scrollToBottom expose / scroll 边界 emits / messages 长度变化 |
| Unit (web-panel) | __tests__/unit/IntentConfirmationMessage.test.js |
7 — 显隐双分支 / pending/confirmed 状态切换 / confirm emit payload / correct 流程(打开/拒空/有内容提交) |
| 全 web-panel 62 文件回归 | — | 1829 / 1829 ✅ |
| CLI ws-server / dispatcher 回归 | — | 61 / 61 ✅ |
| 新增累计 | — | 69 测试(CLI 28 + web-panel 41)全绿 |
端到端总计 (v1):desktop-app-vue 1106 + web-panel 1829 + CLI(chat-intent + ws)89 = 3024 测试全绿。
| Improvement | 实现 | 关键文件 |
|---|---|---|
| 1. Streaming intent | 新 WS topic chat.intent.understand-stream(chunk + result + error 三种 frame)。chat-intent-service.understandIntentStream 用 chatStream 异步生成器,token 边来边推;前端 submitUserInput 改用 ws.sendStream,立即推 placeholder 卡片"理解中… N tokens",final 时 promote 为正式卡 |
chat-intent-service.js understandIntentStream、chat-intent-protocol.js handleChatIntentUnderstandStream、IntentConfirmationMessage.vue 加 streaming 视图 |
| 2. Multi-turn intent | understandIntent / understandIntentStream 接 history 参数;prompt 拼对话历史最近 5 条;前端 submitUserInput 自动 slice user/assistant 消息(trim 500 字/条)传上去;后端再次 slice(-10) 防客户端脏数据 |
chat-intent-service.js buildUnderstandPrompts(_, _, history)、chatStore.submitUserInput |
| 3. Persist intent decisions | confirmIntent / correctIntent 入 localStorage cc.web-panel.chat.intentDecisions(key:<sessionId>::<messageId>);submitUserInput push 卡片时 lookup 历史决策 replay status;LRU 200 条上限按 ts 淘汰 |
chatStore.js recordIntentDecision/lookupIntentDecision/writePersistedIntentDecisions |
| 4. Custom quickPrompts | chatStore.customQuickPrompts ref + localStorage cc.web-panel.chat.customQuickPrompts;setCustomQuickPrompts 自动 trim/滤空/cap (12 entries × 120 chars);空态加"+ 编辑"按钮打开 a-modal 编辑器(每行一条 prompt),有"恢复默认" |
chatStore.js、Chat.vue modal、locales chat.quickPromptsEditor.* 7 keys |
新增 7 测试(覆盖 4 个 improvement):sendStream + onChunk 计数 / history payload 形状(tool 过滤)/ confirmIntent 落 localStorage / correctIntent 落 correction 字段 / customQuickPrompts trim+滤空 / 12×120 cap / null 清除。
E2E 测试修复(顺手处理预存 3 个失败):__tests__/e2e/panel.test.js 改用 net.listen(0) 拿 kernel-allocated 空闲端口,并解析 cc ui 启动 banner 真实绑定的 port(cc ui 有静默 port-fallback:requested 端口被占时 silently 切到下一个空闲口,导致 httpGet(requestedPort) 打到无关进程上 ECONNRESET,本地 5 个陈旧 vitest fork 进程占了 19210-19219)。4 个 suite 全部从硬编码端口迁移到动态分配。3 个预存失败 → 0。
累计 (v1 + v1.1):web-panel 1844/1844 + CLI 89/89 + e2e 63/63 + desktop-app-vue 1106/1106 = 3102 测试全绿 ✅
已知 caveat:
- 端到端浏览器 smoke(开
cc serve --mode project --ui full后真跑 LLM 走完意图卡 → 点确认 → agent 回复)尚未做,建议 ship 前手动验一次。 - V6 桌面
shell/AIChatPanel.vue不含这 4 件功能(V6 panel 的 V5 来源是已删的 857 行全局 ChatPanel),后续以独立 phase 对齐(Phase E: align V6 AIChatPanel)。
XIV 落了 web-panel UI,但 governance-mofn 的签名收集 v1 要求 renderer 传 secretKey base64——出于安全 web-panel 故意不持私钥,结果"代我签名"按钮缺位。本次 v2 把签名移到主进程:renderer 只发 (communityId, proposalId),main 进程从 DIDManager 取本人当前身份完成签名,私钥永不出主进程。
顺带修了一个潜伏已久的 bug:registerAllIPC 的 deps 包从来没传 communityManager / channelManager / gossipProtocol / governanceEngine / contentModerator + B4 全套 managers,桌面 V5/V6 community IPC 一直 silently 拿到 null(V6 hard-flip caaddf530 后默认壳是 web-shell,IPC 路径用户基本碰不到,所以没暴露)。
| 主题 | 文件 | 说明 |
|---|---|---|
新 IPC governance-mofn:sign-as-self |
community-ipc.js (+58) |
renderer 只发 (communityId, proposalId),main 调 didManager.getCurrentIdentity() 拿 {did, public_key_sign, private_key_ref},parse JSON 取 sign base64 → Buffer secretKey → 调 governanceMultiSig.addSignature(...) 完成。返回 {ok:true, status, signerDID} |
新 WS topic mtc.governance-mofn.sign-as-self |
web-shell/handlers/community-mtc-handlers.js (+78) |
同样语义,web-panel 用这条。社交 deps + didManager 注入 |
| web-shell-bootstrap + index.js 透传 | web-shell-bootstrap.js + index.js (+5) |
didManager 加进 createCommunityMtcHandlers opts |
| useGovernanceMofn.signAsSelf 动作 | web-panel/composables/useGovernanceMofn.js (+33) |
关键约束:wire 上没有 signerKeys 字段(测试断言验证) |
| MtcAudit.vue Tab 3 "代我签名"按钮 | MtcAudit.vue (+25 / -8) |
提案行加 button,仅在 !finalized && isEmbedded enable;alert 文案改为 v2 secure 说明 |
| 🐛 latent bug 修复 — registerAllIPC deps 包补齐 | index.js (+25 / +12 hoist) |
加 communityManager / channelManager / gossipProtocol / governanceEngine / contentModerator + mtcFederationManager / channelEventBatcher / channelEnvelopeDistribution / channelEnvelopeArchiver / archiveProviderFactory / governanceMultiSig / crossFedTrust 到 this.* + 进 registerAllIPC({...}) 。Phase A 起 community IPC 在桌面 V5/V6 一直 silent broken——这次顺手修了 |
测试矩阵 (B4-mofn-sign v2 新增 10, 累计 desktop 1112 / 1112 全绿 across 33 文件 + web-panel 1833 / 1833 across 62 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit (扩展) | desktop-app-vue/src/main/web-shell/__tests__/community-mtc-handlers.test.js (+6 → 25) |
sign-as-self: 完整 happy path + 缺 didManager / 未登录 / 缺 keys / 错 JSON / 缺 sign 字段 |
| Unit (扩展) | packages/web-panel/__tests__/unit/useGovernanceMofn.test.js (+4 → 13) |
signAsSelf: wire 上无 key material / 拒空 args / handler error 捕获 / currentStatus 更新 |
| 全 desktop+web-panel 回归 | — | 1112 + 1833 = 2945 ✅ |
安全模型变化
| v1 (XI) | v2 (本次) | |
|---|---|---|
| renderer 持私钥? | 是(renderer base64 序列化 secretKey 上 wire) | 否 |
| wire 上私钥? | 是 | 否 |
| 主进程拿钥匙路径 | 不需要(因为 renderer 已经送过来) | DIDManager.getCurrentIdentity() → private_key_ref.sign |
| 适用场景 | CLI 提案 / 测试 / 直接持私钥的高级用户 | 所有 web-panel UI 用户(默认) |
governance-mofn:sign v1 入口保留向后兼容,CLI 等场景仍可用。UI 一律走 v2。
XIII 把 IPC → WS 的桥铺好了,但 web-panel 没 UI 入口——用户照样点不到。本次补 4 个 composable + 1 个 4-tab 页面 MtcAudit,把 envelope / archive / governance-mofn / cross-fed-trust 四件全套接到默认壳的 sidebar 上。
| 主题 | 文件 | 说明 |
|---|---|---|
| 4 个 composable | packages/web-panel/src/composables/{useMtcEnvelope, useMtcArchive, useGovernanceMofn, useCrossFedTrust}.js (+460) |
全部走 ws.sendRaw({type:'mtc.*', ...}) + useShellMode().isEmbedded 双路径分叉。pure-browser 模式自动 disable + 显示提示。useGovernanceMofn 内含 base64 序列化 helper(renderer 不直接传 Buffer,base64 字符串过 wire) |
MtcAudit.vue 4-tab 页面 |
packages/web-panel/src/views/MtcAudit.vue (+450) |
Tab 1 Envelope 查询 + raw JSON 折叠 + 复制;Tab 2 Archive (filesystem / WebDAV provider 切换 + push/restore/list);Tab 3 Governance M-of-N(创建提案 + 列表 + finalize;签名收集 v1 通过 alert 提示用 cc CLI / 桌面 DID 工具);Tab 4 Cross-Fed Trust(建立/撤销/列表/合并 DID 集查询) |
| 路由 + sidebar | packages/web-panel/src/router/index.js + components/AppLayout.vue (+3 / 总) |
/mtc-audit 路由;sidebar advanced 组里 mtc 之后新增 mtc-audit 项;折叠模式 icon 也加;onMenuClick 自动 router.push |
测试矩阵 (B4-webpanel 新增 33 composable 单元 + 1 路由计数 fix, 累计 web-panel 1829 / 1829 全绿 across 62 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | packages/web-panel/__tests__/unit/useMtcEnvelope.test.js |
8 — idle 起手 / 空 args / pure-browser disable / found result / not-found / ws throw / reply.ok=false / reset |
| Unit | packages/web-panel/__tests__/unit/useMtcArchive.test.js |
11 — listArchives 缓存 + 拒空 + handler error / pushArchive 完整 + sinceBatchId 透传 + handler error / restoreArchive 完整 + 拒缺 archiveName / isEmbedded reflect |
| Unit | packages/web-panel/__tests__/unit/useGovernanceMofn.test.js |
9 — list cache + 拒空 / create 透传 / sign 序列化 Uint8Array→base64 + 拒空 + 已 base64 不二次编码 / finalize / status cache / handler error |
| Unit | packages/web-panel/__tests__/unit/useCrossFedTrust.test.js |
6 — list cache + 拒空 / establish 全量透传 + 空可选字段 strip / revoke 返 boolean / getTrustedDids cache / handler error |
| 全 web-panel 62 文件回归 | — | 1829 / 1829 ✅ |
端到端总计:desktop-app-vue 1106 + web-panel 1829 = 2935 测试全绿。
Phase A → Phase B v1 → B4 → B4-merkle → B4-cross
→ B4-cross-trust → B4-ui → B4-archive → B4-mofn
→ B4-crossfed → B4-webshell (WS topics) → B4-webpanel (UI)
桌面端(V5/V6)走 IPC,web-shell 默认壳走 WS topic + Vue UI,全套对等。
用户 follow-up:Phase 1.6 后默认壳是 web-shell(hard-flip caaddf530),但 B4 全套(envelope viewer / archive / governance-mofn / cross-fed-trust)只走 ipcMain.handle,web-panel 用户看不到。本次补 13 个 WS topic + 入口透传,让默认壳用户也能用全套。
| 主题 | 文件 | 说明 |
|---|---|---|
| WS topic handler factory | src/main/web-shell/handlers/community-mtc-handlers.js (+330) |
13 个 dotted topic:mtc.envelope.get、mtc.archive.{push, restore, list}、mtc.governance-mofn.{create, sign, status, finalize, list}、mtc.cross-fed-trust.{establish, revoke, list, get-trusted-dids}. 每个 handler 接 {success, ...} 形态返回,null manager 时返回 {success:false, error:"... not initialized"} 不让 dispatcher 崩 |
| web-shell-bootstrap 注册 | src/main/web-shell/web-shell-bootstrap.js (+22) |
createCommunityMtcHandlers({...managers}) 拼进 wsHandlers map; lazy peer-pull 走 p2pManager.getConnectedPeers |
| index.js 入口透传 | src/main/index.js (+22 / 0) |
DI container 结果取 6 manager (channelEventBatcher / channelEnvelopeDistribution / channelEnvelopeArchiver / archiveProviderFactory / governanceMultiSig / crossFedTrust),attach this.* 后 startWebShell({...}) 都传过去 |
| Wire 形状一致性 | 同 IPC 层 | sign 仍走 base64 序列化 keys(renderer 不传 Buffer);providerSpec 仍是 {kind, ...opts} 形态;error envelope {success:false, error} 跟 mtc.audit-status / sync.status / notification.* 等已有 topic 同 shape |
测试矩阵 (B4-webshell 新增 19, 累计 1106 / 1106 全绿 across 33 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | web-shell/__tests__/community-mtc-handlers.test.js |
19 — 全 13 topic 注册检查 + envelope.get 4 (local hit / 远端 fallback peer-pull / 缺 batcher / 缺 args) + archive._ 5 (push / restore / list / 缺 factory / 缺 spec) + governance-mofn._ 5 (create / sign 含 base64→Buffer revive / sign 缺 args / status+finalize+list / 缺 manager) + cross-fed-trust.* 4 (establish 切 localCommunityId / revoke list get-trusted-dids / 缺 manager) + 同步 throw 包成 envelope |
| 全 33 文件回归 | — | 1106 / 1106 ✅ |
| 阶段 | commit | 测试 |
|---|---|---|
| Phase A + Phase B v1 | 50b8ddb05 |
+58 |
| B4 (DID + auto-bridge) | 3741a8e7e |
+47 |
| B4-merkle v1 | 435ba7dde |
+31 |
| B4-cross v1 | 8b03e3b54 |
+34 |
| B4-cross-trust v1 | c50353ca8 |
+8 |
| B4-ui v1 | 173efc52e |
+10 |
| B4-archive v1 | 527e36eba |
+26 |
| B4-mofn v1 | b1b016dd8 |
+24 |
| B4-crossfed v1 | ad12fc515 |
+16 |
| B4-webshell v1 | 本次 | +19 |
| 小计 | 10 commits | +273 (149 → 1106) |
deferred 第五项也是 B4 最后一项。B4-cross-trust v1 把 inbound landmark 校验锁在"必须是本社区 member"。本次扩展:用户可以记录"我也信任另一个 federation 的 trust anchors",他们发的 landmark 也能过校验,不必加入对方 community。
| 主题 | 文件 | 说明 |
|---|---|---|
| CrossFedTrust | src/main/mtc/cross-fed-trust.js (+185) |
establishTrust(localCommunityId, {remoteCommunityId, remoteMembers, expiresAt?, note?}) / revokeTrust(localCommunityId, remoteCommunityId) / listTrusted(localCommunityId) / getTrustedDIDs(localCommunityId, {now?}) 返回未过期记录的 union DID 集. 文件存 <userData>/cross-fed-trust/<localCommunityId>/<remoteCommunityId>.json. expiresAt 支持 ISO timestamp,过期记录自动从 getTrustedDIDs 排除(clock 可注入用于测试) |
| distribution trust filter 扩展 | social-initializer.js (+25 / -10) |
getCommunityMembers adapter 现在 union: communityManager 本地 members ∪ crossFedTrust 跨联邦信任 DIDs. 任一来源 throw 都 swallow 不阻塞 |
| 4 个 IPC | community-ipc.js (+45) |
cross-fed-trust:establish / revoke / list / get-trusted-dids, renderer 一次配置后所有跨联邦 landmark 自动过 trust filter |
| initializer | social-initializer.js (+22) |
crossFedTrust initializer required:false |
测试矩阵 (B4-crossfed 新增 16, 累计 1087 / 1087 全绿 across 32 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | mtc/__tests__/cross-fed-trust.test.js |
16 — constructor / establishTrust 6 case (writes record / unsafe ids / empty/dup/malformed members / idempotent update) / revokeTrust 2 / listTrusted 2 / getTrustedDIDs 5 (union / 排除过期 / 包含 future expiresAt / clock 注入 / 空 community) |
| 全 32 文件回归 | — | 1087 / 1087 ✅ |
| sub-phase | commit | 测试新增 |
|---|---|---|
c50353ca8 (VIII) |
+8 | |
173efc52e (IX) |
+10 | |
527e36eba (X) |
+26 | |
b1b016dd8 (XI) |
+24 | |
| 本次 (XII) | +16 |
唯一遗留:用户 follow-up "需要在 web-shell 版本可以看到这些功能"——B4 全套 IPC 都注册在 ipcMain,web-shell(默认壳,Phase 1.6)需要对应的 WS topic handlers 才能让 web-panel UI 用上。下一节 commit 处理。
deferred 第四项。Phase 54 cc governance 是单 DID 投票,没多签 / threshold finalize 概念。本次接 core-mtc 的 assembleBatchFederated:proposal 创建 → member 逐个 add signature → 收齐 M 个就 finalize → 写 multi-sig landmark 含 N 个 trust_anchors。
| 主题 | 文件 | 说明 |
|---|---|---|
| GovernanceMultiSig | src/main/mtc/governance-multisig.js (+440) |
createProposal({communityId, proposalId, payload, members[], threshold}) / addSignature(communityId, proposalId, signerKeys) / getStatus / finalize / listProposals. 文件存 <userData>/governance-mofn/<communityId>/<proposalId>/{proposal.json, signatures/<did>.json, landmark.json}. anti-impersonation: addSignature 校验 pubkey → sha256 → DID 必须等于 claimed did. idempotent: 同 DID 重复 add 是 no-op;finalize 二次返回相同 treeHeadId. 本地 federated assembler: _assembleBatchFederatedLocal 用 core-mtc primitives + tweetnacl signer,绕开 @noble/curves hoisting trap (与 channel-event-batch 同策略) |
| 5 个 IPC | community-ipc.js (+85) |
governance-mofn:create / sign / status / finalize / list. sign 接受 base64 {did, secretKey, publicKey} 串行化形态 (renderer 不直接传 Buffer) |
| initializer | social-initializer.js (+22) |
governanceMultiSig initializer required:false,failure 不致命 |
v1 信任 / 范围限制:
- 单机 sig collection — caller (renderer) 直接传 member 的 secret key,不通过网络。v2 是把 sig 收集走 federation gossipsub,coordinator 收 partial sigs + 其它 member 离线签发 partial sigs 寄回(典型 Frost/MuSig 模型)
- "more than threshold contributions" → 用前 M 个 (deterministic by file order),剩余忽略
- 没 expiry / 撤销 / 重新打开机制 — 一旦 finalize 不可逆
测试矩阵 (B4-mofn 新增 24, 累计 1071 / 1071 全绿 across 31 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | mtc/__tests__/governance-multisig.test.js |
24 — constructor / createProposal 含 threshold/empty/dup/malformed-DID/unsafe-id/exists 7 case + addSignature member-only/idempotent/non-member/DID-pubkey-mismatch/wrong-key-shape/threshold 6 case + getStatus 2 + finalize insufficient/3-of-5 happy/超 threshold deterministic/idempotent/post-finalize 拒签 5 + listProposals 2 |
| 全 31 文件回归 | — | 1071 / 1071 ✅ |
Deferred 剩余 sub-phases 进度
- ✅
Inbound landmark trust filtering— VIII 完成 - ✅
UI envelope viewer— IX 完成 - ✅
Periodic envelope archival— X 完成 - ✅
M-of-N for governance-critical events— 本次完成 - 🚧 跨联邦信任锚 (MTC v0.11 cross-fed-trust 集成)
- 🚧 web-shell parity for B4 features (用户 follow-up 反馈:默认壳是 web-shell,B4 系列 IPC 没 WS topic 暴露)
deferred 第三项。B4-merkle / B4-cross 在本机盘维护 envelope 证据链;设备 wipe / 卸载 / 磁盘损坏 = 全丢。本次加入打包 + 推送外部 provider 的能力,让 audit 史可以撑过本机生命周期。
| 主题 | 文件 | 说明 |
|---|---|---|
| ChannelEnvelopeArchiver | src/main/mtc/channel-envelope-archiver.js (+360) |
pack(communityId, {sinceBatchId, includeRemote}) 用 adm-zip 打 batches//_ + remote-landmarks/_ + remote-envelopes/* 入 buffer + MANIFEST.json. push(provider, communityId) 调 provider.putFile 上传. restore(provider, communityId, archiveName) 反向:解 zip 落回本地(idempotent — 已存在文件 skip 不覆盖). list(provider, communityId) 按 ARCHIVE_NAME_PREFIX 过滤 |
| filesystemProvider | 同上 (+50) | mirror 到本地目录树(适配 Syncthing-class 外部同步、USB 备份、CI artifact). path-traversal 全程防御 |
| webdavProvider | 同上 (+50) | 包装 src/main/sync/webdav-client.js (Phase 3c.5 已落). put/get/list 适配 webdav-client 的 {ok, etag} 返回形状 |
| 3 个 IPC | community-ipc.js (+85) |
channel-archive:push / channel-archive:restore / channel-archive:list. 接 renderer-supplied {kind, ...opts} provider spec → archiveProviderFactory 实例化 → archiver 操作. 凭证(webdav password)每次调用从 spec 拿,不在 main 缓存 |
| archiveProviderFactory + initializer | social-initializer.js (+78) |
channelEnvelopeArchiver initializer + archiveProviderFactory 工厂注册. provider 工厂支持 {kind:'filesystem', rootDir} 和 {kind:'webdav', baseUrl, username, password, remoteRoot} 两种 |
Archive 命名约定:channel-mtc-<communityId>-<isoTimestamp>-<sinceBatchId>-to-<latestBatchId>.zip,存到 <remoteRoot>/<communityId>/. 增量推送(指定 sinceBatchId)只 ship 新 batch,节省带宽。
测试矩阵 (B4-archive 新增 26, 累计 1047 / 1047 全绿 across 30 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit (新) | mtc/__tests__/channel-envelope-archiver.test.js |
26 — constructor 必填 / pack 全/无 remote / sinceBatchId 增量 / unsafe communityId / 空仓 throw / 没新批 throw + filesystemProvider 必填+round-trip+path-traversal+missing+empty-dir + push 完整返回 + restore round-trip 真盘+同样数据 batcher.findEnvelope 命中 + idempotent 二次 restore=0 + 增量 sinceBatchId / list 过滤 + 排序 / 失败 provider throw / webdavProvider 必填+round-trip+failure+getFile 两形状+listFiles 映射+缺 listFiles 兜底+path-traversal 文档化 (adm-zip API 限制说明) |
| 全 30 文件回归 | — | 1047 / 1047 ✅ |
测试 gotcha:archiver 测试 // @vitest-environment node 钉到 node 环境——adm-zip 的 Buffer round-trip (toBuffer → new AdmZip(buf)) 在 jsdom 下 entries 全空(Buffer / typed-array realm mismatch),跟 libp2p e2e 测试遇到的问题同根。extractIssuerDID-style 之外又一例 jsdom 跟 main-process 库不兼容。
Deferred 剩余 sub-phases 进度
- ✅
Inbound landmark trust filtering— VIII 完成 - ✅
UI envelope viewer— IX 完成 - ✅
Periodic envelope archival to OSS / WebDAV / IPFS— 本次完成(FS + WebDAV,OSS/IPFS provider 留 follow-up) - 🚧 M-of-N for governance-critical events
- 🚧 跨联邦信任锚 (MTC v0.11 cross-fed-trust 集成)
deferred 第二项:B4-merkle / B4-cross 后端齐了但前端没出口。本次接通 renderer:每条带签名的 channel 消息旁加一个 "🔐 验证" 按钮,弹窗展示来源(local 本机批 / remote peer-pull)、tree-head / batch / leaf 索引、签名验证就位提示、可展开 raw envelope + landmark JSON 一键复制(用户可拿去 cc mtc verify 离线复核)。
| 主题 | 文件 | 说明 |
|---|---|---|
useMessageEnvelope composable |
src/renderer/composables/useMessageEnvelope.ts (+155) |
5 phase reactive state(idle / loading / found / not-found / error)+ fetch(communityId, messageId) + reset(). 走通用 electronAPI.invoke('channel:get-message-envelope', ...) (preload 不需要改). preload 缺失时回 error phase 友好提示 |
MessageEnvelopeViewer.vue |
src/renderer/shell/community/MessageEnvelopeViewer.vue (+170) |
Ant Design Modal 720px 宽,带 message preview + 5 phase UI(Spin / Alert / Descriptions)+ 来源 Tag(local 绿 / remote 蓝)+ tree-head / batch / namespace / leafIndex + 签名 ✅ + landmark 缺失时的 orange Tag + 折叠展示 raw envelope/landmark JSON + 复制按钮(用 navigator.clipboard.writeText)。仅在消息有 signature && sender_pubkey 时显示按钮 |
| CommunityDetailsDrawer 集成 | src/renderer/shell/community/CommunityDetailsDrawer.vue (+30) |
频道消息每条加 "🔐 验证" 按钮(仅签了名的)+ Tooltip 提示;Modal v-model:open 双向绑定;store 取 community.id 作为 viewer 的 communityId prop |
测试矩阵 (B4-ui 新增 10, 累计 1021 / 1021 全绿 across 29 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | composables/__tests__/useMessageEnvelope.test.ts |
10 — 5 phase 完整覆盖(idle 起手 / 空 args 拒绝 / preload 缺失 error / found normalized result / origin 默认值 / not-found 带 reason / IPC throw → error / null IPC 响应当 not-found / loading 中间态可观察 / reset()) |
| 全 29 文件回归 | — | 1021 / 1021 ✅ |
已知 coverage 缺口 (deliberate):
- 没单测
MessageEnvelopeViewer.vue组件本身。理由:组件主要是 Ant Design Modal/Spin/Tag/Descriptions 编排,没业务逻辑分支。Mount + Teleport modal 在 vitest jsdom 下脆弱;composable + IPC wiring 测试已经覆盖了数据流。集成测试可以等 e2e Playwright 那批一起加
Deferred 剩余 sub-phases 进度
- ✅
Inbound landmark trust filtering— VIII 完成 - ✅
UI envelope viewer— 本次完成 - 🚧 Periodic envelope archival to OSS / WebDAV / IPFS
- 🚧 M-of-N for governance-critical events
- 🚧 跨联邦信任锚 (MTC v0.11 cross-fed-trust 集成)
B4-cross v1 收口的 deferred 列表头一项:B4-cross v1 信任模型是 NONE,缓存所有 inbound landmark。本次加入按 community 成员校验:landmark 的 issuer DID 必须在当前社区 member list 才进 cache,否则 reject + emit landmark:rejected。回调缺省时退回 v1 trust-none 行为 + 启动期 warn。
| 主题 | 文件 | 说明 |
|---|---|---|
| distribution 接受 trust 回调 | src/main/mtc/channel-envelope-distribution.js (+105) |
构造函数新 opts.getCommunityMembers (communityId) => Promise<DID[]>. _handleIncomingLandmark 改 async:(1) extract issuer DID via 新静态方法 extractIssuerDID(landmark) (默认 strip did-bound: 前缀,兼容裸 DID);(2) 调 getCommunityMembers 拿 list;(3) issuer 不在 → emit('landmark:rejected', {reason}) + 不缓存。无回调时 init 期 warn 一次"trust filter OFF" |
| social-initializer 注入 | src/main/bootstrap/social-initializer.js (+25) |
distribution initializer 加 communityManager 依赖;提供 getCommunityMembers 实现:communityManager.getMembers(id, {limit:10000}).then(rows => rows.map(r => r.member_did)). 失败 swallow → 空 list |
rejected 事件 reason 枚举:
"issuer DID not extractable"— landmark.snapshots[0].signature 缺 issuer 字段"membership lookup failed: <err>"— getCommunityMembers throw(DB unavailable 等)"issuer not a community member"— DID 在但不在 member list
为什么是 strip did-bound: 前缀:channel-event-batch.js _assembleBatchLocal 的 issuer 格式是 did-bound:<did>(参考 audit-mtc 模式);其它发布者(CLI / 联邦工具)可能直接用裸 DID,所以 extractIssuerDID 容忍两种。
测试矩阵 (B4-cross-trust 新增 8, 累计 1011 / 1011 全绿 across 28 文件)
| 层 | 测试 |
|---|---|
单元 +8 → 29 (channel-envelope-distribution.test.js) |
trust filter ON: cache when member / reject when not member (含 reject event payload) / reject when issuer 不可提取 / reject when getCommunityMembers throw / trust filter OFF: 保留 v1 行为 / extractIssuerDID 三种 case (with prefix / no prefix / malformed) |
| 全 28 文件回归 | 1011 / 1011 ✅ |
Deferred 剩余 sub-phases 进度
- ✅
Inbound landmark trust filtering— 本次完成 - 🚧 UI envelope viewer
- 🚧 Periodic envelope archival to OSS / WebDAV / IPFS
- 🚧 M-of-N for governance-critical events
- 🚧 跨联邦信任锚 (MTC v0.11 cross-fed-trust 集成)
B4-merkle v1 落了 envelope,但只对发件人有用(对端没你的 batch dir 验不了)。本次补完最关键缺口:landmark 走 federation gossipsub 自动广播 + envelope 按需 peer-pull,整个 audit-grade 价值兑现——任何第三方都能 verify 任何已知 messageId 的 inclusion proof。
| 主题 | 文件 | 说明 |
|---|---|---|
| Batcher 远端缓存 + 回调 API | src/main/mtc/channel-event-batch.js (+196 / -27) |
新方法 onBatchClosed(handler) (closeBatch 完触发 + 多 handler 隔离)、storeRemoteLandmark / findRemoteLandmark (按 treeHeadId 索引,sha256: 冒号 → 文件系统安全 _)、storeRemoteEnvelope (messageId 索引)。findEnvelope 返回新增 origin: "local" | "remote" 字段; loadEnvelopeAndLandmark 自动按 origin 选 landmark 路径 (local 在 batch dir 旁,remote 在 remote-landmarks/) |
| ChannelEnvelopeDistribution | src/main/mtc/channel-envelope-distribution.js (+330) |
封装 mtcFedMgr (gossipsub 双轨:另起 cc.community.<id>.envelopes-track topic 跟消息流分开) + p2pManager (typed mtc:envelope-request / mtc:envelope-response)。API: subscribeCommunity (拉远端 landmark) / publishLandmark 自动 (hooks batcher.onBatchClosed) / requestEnvelope(peerId, communityId, messageId) Promise + 8s 默认 timeout. 内部 in-flight 跟踪 + close 时 reject 全部待响应 |
| typed message dispatch | src/main/p2p/p2p-manager.js dispatchTypedMessage (+24) |
加 mtc:envelope-request (→ 'mtc:envelope-request' event w/ requestId/communityId/messageId/fromPeerId) + mtc:envelope-response (→ event w/ found/envelope/batchId). distribution 模块直接 listen 这俩 event |
| social-initializer 注册 | src/main/bootstrap/social-initializer.js (+38) |
channelEnvelopeDistribution initializer (depends mtcFedMgr + p2pManager + channelEventBatcher); failure 容错 |
| community-ipc 集成 | src/main/social/community-ipc.js (+62) |
community:join 也调 channelEnvelopeDistribution.subscribeCommunity 拉 landmark; channel:get-message-envelope 加 fallback chain — 本地缺时 enumerate 已连 peer 顺序 requestEnvelope 至首发命中,requestEnvelope 内部 storeRemoteEnvelope 缓存; phase-3-4-social 透传 channelEnvelopeDistribution + p2pManager |
信任模型 (v1):none — 缓存所有收到的 landmark/envelope,不做 trust_anchors 校验。理由:(a) Noise transport 防 MITM,(b) 用户最终 verify envelope 的 inclusion proof 时会用 landmark 的 tree-head signature 作真伪验证(cc mtc verify 等价物),所以攻击者注入 fake landmark 也通不过最后一道关。v2 可以加 inbound landmark 按 federation membership 过滤。
测试矩阵 (B4-cross 新增 34, 累计 1003 / 1003 全绿 across 28 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit (扩展) | mtc/__tests__/channel-event-batch.test.js (+11 →34) |
11 个 cross-machine 用例:onBatchClosed 完整 / handler 异常隔离 / storeRemoteLandmark+findRemoteLandmark / : 路径转义 / storeRemoteEnvelope+findEnvelope origin:remote / unsafe messageId reject / loadEnvelopeAndLandmark remote bundle / orphan envelope 无 landmark 兜底 / origin 标签保留 |
| Unit (新) | mtc/__tests__/channel-envelope-distribution.test.js |
21 — constructor 必填检查 / lifecycle 幂等 / close tear-down 监听器 / 自动 publish on closeBatch (非阻塞) / landmark:published event / subscribeCommunity 用 <id>.envelopes-track 同步 topic / 入站 landmark cache / 非 landmark payload 忽略 / unsubscribeCommunity 幂等 / requestEnvelope 全流程 (req → resp 缓存 → resolve) / found:false / 8s timeout → null / 不识别 requestId 静默忽略 / close reject 在飞 / 入站 envelope-request 找本地 envelope 响应 / 找不到 → found:false / malformed 请求 (缺 requestId / 缺 fromPeerId) 忽略 |
| Unit (扩展) | p2p/__tests__/p2p-manager-dispatch.test.js (+2 →22) |
2 个新 dispatch 用例:mtc:envelope-request / mtc:envelope-response 字段透传 |
| 全 28 文件回归 | — | 1003 / 1003 ✅ |
端到端价值兑现:
- Alice 在 community-X 频道发消息 → 本地 channelManager INSERT + B4a 签名 + Phase A gossip + Phase B MTC + B4-merkle batch enqueue
- 100 条消息后或 1h 触发 closeBatch → assembleBatch + 写 batches/000001/ → onBatchClosed callback → ChannelEnvelopeDistribution publish landmark 到
cc.community.community-X.envelopes-tracktopic - Bob 已加 community-X (community:join 自动 subscribeCommunity 那个 topic) → 收到 landmark → batcher.storeRemoteLandmark 落盘
<userData>/channel-mtc/community-X/remote-landmarks/sha256_xxx.json - Bob 想验证 Alice 发的某条 message: renderer 调
channel:get-message-envelopeIPC → 本地没 → enumerate connected peers (Phase A gossip 的) →requestEnvelope(Alice, …)→ Alice 收到mtc:envelope-requesttyped → 在自己 batches/ 找到 → 回mtc:envelope-response→ Bob 缓存到remote-envelopes/messageId.json→ 返回完整 envelope + 缓存的 landmark 给 renderer - Renderer (或
cc mtc verify) 验证 Merkle inclusion_proof 对照 landmark 的 tree-head signature → ✅ 第三方密码学证据成立
Deferred (B4-cross 后续 sub-phases)
- Inbound landmark trust filtering (按 federation membership 校验)
- Periodic envelope archival to OSS / WebDAV / IPFS (survive device wipe)
- UI envelope viewer button ("show this message's cryptographic proof")
- 大社区 batch envelope eager push (现在按需 pull,万人社区可能 latency 不够)
P2P 社交从"消息可信 + 自动联网"再上一层:本机发出的每条 channel 消息进离线可验的 Merkle 批 envelope。配 B4a 的 Ed25519 单条签名,组合得"我可以拿出第三方都能验的证据,证明我在 X 时间向 Y 频道发了 Z 内容"。
| 主题 | 文件 | 说明 |
|---|---|---|
| ChannelEventBatcher | src/main/mtc/channel-event-batch.js (+390) |
累积 staging/<message-id>.json → 按 threshold(默认 100) 或 timer(默认 1h) 触发 closeBatch → 写 batches/<batch-id>/{manifest,landmark,envelope-*}.json. 文件布局参考 audit-mtc 的 ~/.chainlesschain/audit-mtc/. atomic rename + 失败回滚. 路径 <userData>/channel-mtc/<communityId>/。tweetnacl-based MTC signer (绕开 @noble/[email protected] 的 /ed25519 subpath 删除 + workspace hoisting trap)。_assembleBatchLocal 用 core-mtc 的 /hash /jcs /merkle /constants subpath primitives, 不 require core-mtc index (避开 ed25519 module 加载失败) |
| social-initializer 注册 | src/main/bootstrap/social-initializer.js (+45) |
channelEventBatcher initializer (depends didManager),autoTimer:true 启动 1h closer。failure 不致命 |
| community-ipc 双发后 enqueue | src/main/social/community-ipc.js (+28) |
channel:send-message IPC 在 channelManager.sendMessage + gossip + MTC 三件之后, 把已签的 message enqueue 到 batcher (B4a 的 sender_pubkey + signature 作为 leaf 锚定字段)。失败 swallow 不阻塞 IPC。新 channel:get-message-envelope IPC 接收 (communityId, messageId) 返回 {found, envelope, landmark, treeHeadId, batchId, leafIndex} |
| Wire compat | — | 输出 landmark + envelope 跟 core-mtc 自家 verifier wire-compatible,对端可以用 cc mtc verify 验 inclusion proof 无需我们的 desktop binaries |
Sub-phase 范围 (v1 vs B4-merkle 后续)
- v1:本机批 + 本机查 envelope。Wire-compatible 但不自动 federation broadcast envelope(远端没你的 batch dir 就查不到)
- B4-merkle 后续:cross-machine envelope 分发(federation 通道 publish landmark + on-demand pull envelopes);cron-based 永久存档 to OSS / WebDAV / IPFS;UI envelope 展示器("显示这条消息的密码学证据")
测试矩阵 (B4-merkle 新增 31, 累计 969 / 969 全绿 across 27 文件)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | mtc/__tests__/channel-event-batch.test.js |
23 — 真 fs (tmp dir) + 真 core-mtc primitives × constructor / enqueueEvent / 文件系统安全防越界 / threshold 自动 close / closeBatch 完整 lifecycle / sequential batch ids / 无身份 → throw / findEnvelope 三种状态 / loadEnvelopeAndLandmark / closeAllPending |
| Integration | social/__tests__/community-ipc-merkle-enqueue.integration.test.js |
8 — IPC channel:send-message 走 enqueue / unsigned 跳过 / batcher throw 不阻塞 / null batcher fallback + IPC channel:get-message-envelope delegate / null batcher / 缺参 / batcher throw |
| 全 27 文件回归 (p2p + social + mtc + did + bootstrap) | — | 969 / 969 ✅ |
关键 bug / 实战记录
@noble/curves跨版本 subpath 删除:core-mtc deps^1.9.7(有./ed25519subpath),desktop-app-vue standalone node_modules 装的是@2.2.0(subpath 删了)。require("@chainlesschain/core-mtc")index 文件 top-level 就 require ed25519 signer,整个 module 加载失败。解决:不 require core-mtc index,只 require 用得到的 subpath primitives (/hash/jcs/merkle/constants都不依赖 @noble/curves),自家 tweetnacl 实现 MTC signer 接口,本地_assembleBatchLocal全程绕开 @noble/curves- 这是 memory
desktop_release_npm_workspace_hoisting.md警告过的 hoisting trap 的另一种 manifestation——这次是不同 npm 版本被 standalone node_modules 锁住
.exe 后台 rebuild 完成 (exit 0):out/build/ChainlessChain-Setup-5.0.3-alpha.40.exe 426 MB,含 Phase A + Phase B v1 + B4 + B4-merkle 全套。原先 v5.0.3.40 (Phase A only) 装机用户重启走 auto-updater 应该不会触发 (semver 一样);要测必须手动 install。
P2P 社交链路从"能跑"升级为"防伪 + 自动联网"。两件事一起做,共享 wire 协议改动:
| 主题 | 文件 | 说明 |
|---|---|---|
| B4a — DID 签名 channel 消息 | src/main/did/did-signer.js (+205) |
纯 crypto helper,不耦合 DIDManager。signPayloadWithIdentity / verifyPayloadAgainstDid 走 minimal deterministic JSON(避免 canonicalize 这个跨 workspace hoisting trap),签 {id,channel_id,sender_did,content,message_type,reply_to,created_at} 这 7 个不可变字段(is_pinned/reactions/updated_at 故意排除——会变) |
| 公钥分发策略 | — | embed in message:消息带 sender_pubkey (base64 32B Ed25519)。无 DID resolver 依赖;离线也能验。开销 ~44B / 消息(人类对话级流量可忽略) |
| 三重验证(receiver) | channel-manager.handleMessageReceived |
(1) sha256(sender_pubkey).slice(0,20).toString('hex') 必须匹配 sender_did 后缀(防 pubkey/DID 错配);(2) Ed25519 detached verify;(3) 签名长度/格式合法 |
| 三态向后兼容 | 同上 | (a) 都有 sig+pubkey → strict verify,验失败 emit channel:message-rejected 事件 + 丢;(b) 都缺 → log warn + 接受(migration window,老客户端兼容);(c) 只一个 → 拒,malformed |
| Schema migration | channel-manager.initializeTables |
CREATE 加新列 + PRAGMA table_info 检测 + 条件 ALTER(避开项目 fragmented numbered-SQL migration runner 的雷) |
| auto peer bridging | src/main/p2p/p2p-manager.js dispatchTypedMessage (+15) + src/main/bootstrap/social-initializer.js wireMtcAutoBridge (+95 export) |
新 typed message mtc:advertise 走 /chainlesschain/message/1.0.0,dispatch 派发到 mtc:peer-advertise 事件。social-initializer 注册 mtcAutoBridge initializer:on peer:connected 把自己 MTC 名片送过去;on mtc:peer-advertise 顺序 dial 对端 multiaddrs。双向,libp2p 自带 dedup |
| 容错 | 同上 | 任一端 mtcFedMgr.isInitialized() === false 时跳过 → Phase A 直连 gossip 仍工作。失败的 connectPeer swallow(NAT/IPv6 不可达/dup 等正常情况) |
测试矩阵 (B4 新增 47, 总 938 / 938 全绿)
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | did/__tests__/did-signer.test.js |
22 — canonicalize 7 + computeDID 3 + sign/verify 5 + end-to-end 7 |
| Unit | p2p/__tests__/p2p-manager-dispatch.test.js (+2) |
20 (was 18) — 新增 mtc:advertise 派发 + 缺 multiaddrs 兜底 |
| Integration | social/__tests__/channel-manager-signing.integration.test.js |
8 — 真 Ed25519 keypair × 真 ChannelManager × mock SQL,验证签 + 验签 + 三种攻击拒绝(impersonation/tamper/malformed)+ legacy 接受 + idempotency + 无 keys 兜底 |
| Integration | bootstrap/__tests__/mtc-auto-bridge.integration.test.js |
15 — wireMtcAutoBridge 出/入站 × 各种容错路径 + 双向 mesh seed |
| 全 25 文件回归 (p2p + social + mtc + did + bootstrap) | — | 938 / 938 ✅ |
关键 bug 实战记录
src/main/did/__tests__/foo.test.js用vi.mock("../../../utils/logger.js", ...)是错路径(解析到src/utils/logger.js,落在src/main/之外);vitest 4 strict mock loader 不报错,但会跨文件污染 fork 的 mock registry:20+ 跟 logger 八竿子打不着的测试在 batch 跑时整片wireMtcAutoBridge is not a function,单跑全绿。修:../../utils/logger.js(2 层不是 3 层)。配 memoryvitest_testing.md"vi.mock path correctness" 收录canonicalizenpm 包是core-mtc的 transitive dep,desktop-app-vue(已不是 workspace)standalone node_modules 不可见;不引入新 dep,自己写 15 LoC 的 minimal deterministic JSON(足够 flat 不可变 subset 用,rejects nested 防误用)
deferred (B4 后续 sub-phases)
- Merkle batch envelope finality(
assembleBatch落盘 + verify 路径) - M-of-N for governance-critical events(提案/投票走
assembleBatchFederated) - 跨联邦信任锚(MTC v0.11 cross-fed-trust desktop 集成)
在 Phase A 直连 gossip 之上 双轨 加 MTC 联邦 gossipsub 通道。两条路并存,本地 INSERT OR IGNORE 去重。
| 新增 | 文件 | 说明 |
|---|---|---|
| MtcFederationManager | src/main/mtc/mtc-federation-manager.js (+233) |
封装 @chainlesschain/core-mtc/transports/libp2p 的 Libp2pTransport (gossipsub mode)。Topic: cc.community.<id>.events。API: subscribeCommunity / publishCommunityEvent / unsubscribeCommunity / connectPeer。failure 容错降级到 Phase A |
| social-initializer 注册 | src/main/bootstrap/social-initializer.js (+34) |
mtcFederationManager initializer,required:false(libp2p 失败时社区功能 fallback Phase A 直连仍工作) |
| community-ipc 双发 + DI 重构 | src/main/social/community-ipc.js (+62 / −10) |
community:join / community:leave / channel:send-message 三个 IPC 同时走 gossip + MTC。register 接受 ipcMain 作为 DI dep(match social-ipc 的模式,绕开 vitest electron alias 名字导出限制) |
| phase-3-4-social 注入 | src/main/ipc/phases/phase-3-4-social.js (+2) |
mtcFederationManager 透传到 registerCommunityIPC |
Sub-phase 范围(v1 vs deferred)
- v1:transport 层(subscribe/publish/dispatch + 双轨幂等)
- B4 deferred:DID 签名 / Merkle 批 envelope finality / M-of-N 多签 / 跨联邦信任锚 / 自动 peer 桥接
测试
| 层 | 文件 | 测试 |
|---|---|---|
| Unit | src/main/mtc/__tests__/mtc-federation-manager.test.js |
17 — topicForCommunity / lifecycle / publish / subscribe / unsubscribe / connectPeer 全覆盖 + mock transport |
| Integration | src/main/social/__tests__/community-ipc-dual-track.integration.test.js |
12 — community:join 双订阅 / community:leave 双退订 / channel:send-message 双发 / 任一 transport 失败不阻塞另一条 / 单管道 fallback (gossip-only / MTC-only) |
| E2E | src/main/mtc/__tests__/mtc-federation-roundtrip.test.js |
4 — 双真 libp2p gossipsub-mode 节点 + 调用路径不抛 + 条件 delivery 断言(mesh 形成则 verify,未形成不阻断;与 core-mtc 自家 federation-discovery 测试同策略) + dual-track 幂等性(同条消息双路径只插一行) |
| 全 22 文件回归 (p2p + social + mtc) | — | 891 / 891 ✅ |
架构注意
- MtcFederationManager 当前是 独立 libp2p 节点(与 P2PManager 不复用)—— 复用要侵入 P2PManager 的 createLibp2p config 加
pubsub: gossipsub()service + dynamic import gossipsub,留作后续 follow-up 优化 - v1 没自动 peer 发现:
connectPeer(multiaddr)由调用方手动 bridge;生产里跨机生效需要先把对端 multiaddr 喂进来(Phase A 直连仍是默认即时通道) - 2-node gossipsub mesh 形成在测试环境天然 flaky(per core-mtc 历史经验),所以 e2e delivery 断言是 conditional 的;生产 federations 3+ peer + floodPublish=true 可靠
- 同一条 channel_message 通过 Phase A direct gossip + Phase B MTC topic 双轨送到 B 时,
channelManager.handleMessageReceived的 INSERT OR IGNORE onid保证只插一行
社区/频道这条所谓"去中心化社交"路径,在此之前其实只在单机上能跑 —— 双人验证里 A 发出去的消息永远到不了 B 的本地 DB。Phase A 系统性修了 7 个独立 bug,把发送/接收两端在 wire 上接通:
| # | 位置 | 根因 | 修复 |
|---|---|---|---|
| 1 | p2p-manager.js:sendMessage |
stream.write(data) 是 libp2p 0.x/1.x 老 API;3.x 是 stream.send(bytes) |
改 stream.send(payload) + drain backpressure |
| 2 | p2p-manager.js:sendMessage |
直传 JS 对象给 stream.write(),libp2p 流只接受 Uint8Array |
新增 encodeWireMessage():Buffer/Uint8Array 透传,object/string → JSON-line UTF-8 |
| 3 | p2p-manager.js:registerMessageHandler |
for await of stream.source 是 0.x/1.x it-pipe 语义,3.x 下 .source 是 undefined |
改 for await of stream(3.x MessageStream 直接是 AsyncIterable) |
| 4 | p2p-manager.js:registerMessageHandler |
handler 签名 ({stream, connection}) => 是旧版形状 |
改 (stream, connection) => |
| 5 | p2p-manager.js:registerMessageHandler |
收到的 bytes 只 emit message:received,不按 type 派发 → gossip-protocol 监听的 gossip:message 事件永远不发 |
新增 decodeWireMessage + dispatchTypedMessage,按 type 路由到 gossip:message / gossip:subscribe / gossip:unsubscribe / message:call-* / message:typed,同时保留 message:received 兜底 |
| 6 | p2p-manager.js:initialize |
registerMessageHandler() 在 init 流程里从未被调过,等于 /chainlesschain/message/1.0.0 protocol 根本没注册 |
在 initialize() 里 registerEncryptedMessageHandlers() 之前调上 |
| 7 | social-initializer.js (新增 gossipReceiver) |
gossipProtocol.emit('message:received', ...) 没人订阅 → 远端消息到 gossip 层就死循环,永远不进 channel_messages 表 |
新增 gossipReceiver initializer,订阅事件并调已存在的 channelManager.handleMessageReceived()(INSERT OR IGNORE 去重) |
测试金字塔
| 层 | 文件 | 测试 |
|---|---|---|
| Unit (helpers) | src/main/p2p/__tests__/p2p-manager-dispatch.test.js |
18 — encode/decode/dispatch 三组 helper × Buffer/Uint8Array/string/object/null 五种 payload × 6 类 type |
| Integration (wiring) | src/main/social/__tests__/gossip-channel-receiver.integration.test.js |
4 — 真 GossipProtocol + 真 ChannelManager + mock libp2p,验证 channel_message 写入 / 重复幂等 / 非 channel_message 忽略 / 未订阅社区忽略 |
| E2E (real wire) | src/main/p2p/__tests__/p2p-gossip-roundtrip.test.js |
3 — 双真 libp2p 节点(TCP + noise + yamux + identify),完整跑通 mgrA.sendMessage + gossipA.broadcast 到对端 emit 事件 |
| 回归 | community-manager.test.js (60) + channel-manager.test.js (64) + call-signaling.test.js + call-manager.test.js |
124 + p2p folder 全绿 |
| 小计 | 5 文件 | 149 / 149 |
关键测试细节:e2e 测试用 // @vitest-environment node 强制走 node 环境(jsdom 默认环境会破坏 libp2p TCP 收包路径的 Uint8Array instanceof 检查)。
实战影响:Phase A 之后,两台真机装的 desktop 在同一局域网(mDNS 发现)或远程(DHT + bootstrap)连上后,加入同一社区 → A 在频道里发消息 → B 的 /community 视图里能看到。这是 v0.42.0 v5.0.3.x 期所有 community/channel 用户体验的隐性前置 bug。
未触碰的相关 latent bug(pre-existing,等 follow-up):
- 9 个其它
node.handle(...)调用很可能也有同样的 stream.write/source 老 API(yjs-collab-manager / model-parameter-sync / voice-video-manager / collab-sync)—— 不在 Phase A scope,等真出问题再扫 - gossip-protocol 现在只 wire 了
channel_message一类 payload;governance 提案 / moderation 上报这些不走 gossip,仍是单机操作
Phase B (规划中):MTC 联邦 gossipsub 做社区数据同步的"正式通道"——比 Phase A 的 direct gossip 多了 Merkle finality / 跨联邦信任锚 / M-of-N 多签等 audit 语义。两条路并存(双轨),Phase A 提供 best-effort 即时同步,Phase B 给可审计的最终一致性。
四个互不相关的 fix 一次性闭环:
| 类别 | 文件 | 根因 | 修复 |
|---|---|---|---|
| MTC 视图 timeout 级联 | packages/web-panel/src/views/Mtc.vue + desktop-app-vue/src/main/web-shell/handlers/mtc-status-handlers.js(新增) |
v5.0.3.39 切到 asar:true 后 cc 子进程冷启动从 dev 的 ~2.5s 涨到打包后 6-10s,onMounted 三发并发 (loadStatus + loadBridgeStatus + loadBridgeSla) 必撞 8s/6s 上限 → "状态加载失败: Request timeout" + "加载桥 MTC 状态失败" toasts |
新增 3 个 in-process WS topic(mtc.audit-status / mtc.bridge-status / mtc.bridge-sla)直查 audit-mtc / cross-chain-mtc lib(纯文件读,无 spawn,零 asar 开销),Mtc.vue 通过 useShellMode().isEmbedded 双路径分叉;保底 timeout 8000/6000 → 30000 ms。配 7 + 1 新单测 |
| macOS unit fallback | desktop-app-vue/scripts/build-win-with-deref.js |
isSymlink 用 realpathSync 比较,但 macOS os.tmpdir() 路径含 /var → /private/var 的隐式 symlink,所有 tmp 子目录都被误判为 symlink → 7 测试 fail |
platform split:Win 仍用 realpath(junction 需要),POSIX 用 lstat.isSymbolicLink() |
| 规则验证器误报 | desktop-app-vue/scripts/rules-validator.js |
sync-external-store.test.js:32 是 TestDbManager.exec(sql) 的 sql.js 测试 fixture passthrough,被当成 SQL_INJECTION 报红 |
getAllFiles 跳过 __tests__/ / __mocks__/ + .test.js/.spec.js/.d.ts |
| Win cold-start ETIMEDOUT | packages/cli/__tests__/unit/{skill,agent-repl}.test.js |
node bin/chainlesschain.js … ESM module-graph cold-start 在繁忙 Windows 主机超 10/15s execSync timeout,5 测试 fail |
全部 CLI subprocess execSync timeout 升到 60s(与项目 testTimeout 对齐);passes 仍 1.7-2.5s |
测试矩阵
| 套 | 通过 | 文件 | Duration |
|---|---|---|---|
| Desktop unit + stores | 10482 / 10482 (689 skipped) | 320 | 1022s |
| MTC handler in-process 新增 | 7 / 7 | 1 | 3.4s |
| web-panel mtc-parser 新增 | 14 / 14 | 1 | 1.1s |
| CLI unit | 17392 / 17392 (7 skipped) | 412 | 458s |
| CLI integration | 821 / 821 | 56 | 198s |
| 小计 | 28716 | 790 | ~28 min |
桌面有运行时改动(web-shell 注册 3 个 in-process handler + SPA bundle 重打)。auto-updater 比对 5.0.3-alpha.40 > 5.0.3-alpha.39,所有 v5.0.3.39 桌面用户重启会真发现新版并自动获取 MTC 提速 + CI 修复。
2026-05-06 增量更新(Phase 3b/3c 多目标同步 — 5 个托盘 placeholder 接通 + SyncProvider 抽象 + WebDAV/Git/sync.* WS topics 双 shell parity)
托盘菜单 5 个 placeholder(NotificationCenter listener / 剪贴板导入 / 截图识别 / 同步立即 / 自动同步)从"功能即将推出" toast 升级为真实链路。同步从单 backend 升级为多 provider 抽象(Backend HTTP / Git / P2P / Mobile / WebDAV / OSS),V5/V6 + web-shell 两条壳都能用。
| 主题 | 提交 | 说明 |
|---|---|---|
| Step 0 — NotificationCenter listener | c990cda2a |
App.vue 派发的 cc:show-notifications window 事件原本无人接,加 onMounted/onBeforeUnmount listener 拨开 panelVisible drawer。托盘"未读通知"项从哑响变真打开通知中心。 |
| Step 1 — 剪贴板导入 quick-action | c2a2d8844 |
新 ClipboardImportDialog.vue:navigator.clipboard.readText → 标题/标签编辑 → electronAPI.database.addKnowledgeItem。剪贴板权限拒绝时 a-alert 降级允许手动粘贴。4 单测覆盖正常 / 失败 / 空内容拒保存。 |
| Step 2 — 截图识别 quick-action | 19fc2a50e |
主进程 3 handler screenshot-ipc.js(capture / ocr / cleanup,tmpdir 沙箱拒非 cc-screenshot- 前缀)+ ScreenshotImportDialog.vue 截屏预览 + Tesseract OCR (eng+chi_sim) 文本编辑 + 重截 / 重跑 OCR。10 IPC + 4 组件单测。 |
| Step 3 — SyncProvider 抽象 + V5/V6 SyncSettings | f89fb0ea0 + 1e39e2b58 |
6 provider(backend / git / p2p 实接 + mobile / webdav / oss 占位)+ aggregate scheduler(per-provider enabled flag + autoSync interval localStorage 持久化)+ /settings/sync 页 + 托盘"同步设置…"菜单项跳转 + enhanced-tray-manager.js autoSync checkbox 默认 false 修正。20 单测。a-switch @change 的 CheckedType vue-tsc fix。 |
| Phase 3c — WebDAV 桌面 + web-shell parity | 1a9c51882 |
主进程 webdav-engine(drain tombstones + push 增量 + cursor 持久化)+ 凭证加密存储(sync-credentials.js)+ markdown 包导出 + 5 个 sync.webdav.* IPC + V5/V6 SyncWebDAV.vue 配置页。WebDAV provider 从 placeholder 升级到真实,对接 electronAPI.sync.webdav.run()。 |
| Phase 3c.5 — Git 仓库 web-shell parity | 5216c7665 + e63016de9 |
3 个 git.config-* WS topic(get/set/clear)+ web-panel SyncSettings 加 Git 配置段(远程 URL / 用户名 / Token / 自动同步开关 + 凭证明文存储 warning)。Phase 1.6 web-shell 用户不必切回 V5/V6 也能配 Git。 |
| Phase 3b 适配 web-shell — sync.* WS topics | eb8697598 |
web-panel SyncSettings.vue 从 ws.execute('sync …') 切换到 ws.sendRaw({type:'sync.status'})。根因:spawn cc CLI 子进程会在 Windows + WAL 下抢同一个 SQLite 文件 → "database disk image is malformed"。in-process WS handler 共用 main 已开的 db handle,零冲突。新增 5 个 handler(status / push / pull / conflicts / resolve)。 |
| sync.status 抗 schema 冲突 | 32b78ce7d + 283708640 |
CLI v1 的 sync_state / sync_conflicts / sync_log 跟桌面 P2P sync 同名表撞了。CLI 表整体 RENAME 加 cli_ 前缀(首次启动一次性 ALTER);handler _safeCountQuery swallow "no such table" 返回 0。 |
测试矩阵
- desktop unit + web-shell + system + screenshot:12914 / 12914 通过(802 skip — native binding 缺失环境跳过)
- web-panel unit:1754 / 1754 通过
- 新增:
sync-status-handlers.test.js16 测试(4 native-db skip)+web-panel/sync-settings.test.js4 测试(envelope 形状回归) new-pages.test.js路由计数 54 → 55(新加/sync-settings)
关键 bug 实战记录
- ws.sendRaw envelope 是
{ok, result, error},handler 自身{success, ...}在result里。最初漏算把data?.totalResources直接当 handler 返回值读,导致 4 个 statistic 全 0 + 误判 "未初始化"。 - vitest 4 strict mock factories 必须列全 SUT 用到的 named exports。
Proxy({}, get: () => stub)满足不了 ESM named export 解析,要逐个 enumerate。 - Electron 主进程
console.log不到 stdout(被 logger pipe 吞)。诊断要用logger.info。
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 |
<a-config-provider :locale> 双向 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 重建即可。
桌面端从"实验性 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 <script> CSP 警告 |
ef2d9f65b |
桌面 V5/V6 splash 的 logo loader 内联脚本被 script-src 'self' 拦截。抽到 public/splash-logo-loader.js 走 <script src>,CSP 不动。 |
| Splash 卡屏 + IPC 阻塞 | 60baa217b + de7077151 |
登录页残留 logo overlay 旋转、/login IPC config:get 卡住挡 mount。引入 Promise.race(invoke, timeout(1500)) + setTimeout splash.remove() 双保险 + pointer-events:none 立即清。public/logo.png 一并补齐(splash fix 引用但漏 add)。 |
| menu-manager 浏览器入口 | 60baa217b 内 |
"查看 → 在浏览器中打开 web 视图" + CmdOrCtrl+Shift+B accelerator + getWebShellHandle 注入 + 5 单测。titleBarStyle:"hidden" 让菜单不可见,但 accelerator 仍工作。 |
测试矩阵:desktop 19 文件 / 292 测试(web-shell 单元 24 + system 5 + config 26 + session 257)全绿;web-panel 1749/1750(旧账 compliance threat-intel 与本次无关);CLI 测试见上一节矩阵;新增 shell-switch-handler.test.js 8 测试 + 修复 database-config.test.js 4 子测试(hard-flip default 翻 false→true)。
激活方式(更新):默认即 web-shell,无须配置;如要回 V5/V6 桌面壳:右上角 🖥️ 切回按钮 / SystemSettings → 通用 → 关闭 "使用 Web Shell(默认)" / useWebShellExperimental: false。
未做:6 个其他模块的 IPC 重复注册旧账(context:get-stats / workflow:create / compliance:generate-report / governance:create-proposal / token:get-balance / hsm:get-compliance-status)+ 类似 DatabaseManager 的 ESM 解构遗漏(PluginInstaller / ipcGuard.registerModule)——8 个 latent bug,等 follow-up。
详见 docs/design/桌面Web壳_架构与落地_设计文档.md。
桌面 web-shell 的 cancel 半场收口、Phase 1.4 vendor target 修正、SystemSettings 配置持久化白名单修补、SystemSettings → web-panel 三件子页搬迁的 Speech 部分落地、CLI session-list 的隐性 bug 修——一次性合并五件事。
| 主题 | 提交 | 说明 |
|---|---|---|
llm.chat 真取消 |
b6b5174cb + 4951c95d5 |
ws-cli-loader 加 inFlightStreams<id, gen>;ws.on("close")(lazy WeakSet 钩,避 CLI ws-server connection 事件没传 ws ref 的问题)+ <topic>.cancel 帧两条触发链都驱动 gen.return();llm-handlers 的 generator finally 调 AbortController.abort(),signal 透到 ollama / anthropic / openai client 的 fetch(gemini 因 axios 参数顺序差异未透)。useLlmChat.cancel() 按钮真停 HTTP。 |
AppConfigManager ui.* 持久化 |
436e349f1 |
DEFAULT_CONFIG 加 ui 字段 + load/loadAsync 合并白名单加 ui 行;_readSettingsSync 层叠 app-config.json 的 ui 到 settings.json,让 V6 toggle / Web Shell toggle 真在下次启动生效。原 silent-drop bug 一并解决。 |
| Phase 1.4 vendor target | cecb94980 |
forge.config.js 的 vendorWebShellInto(buildPath) 修为 path.join(buildPath, ".."),匹配 path-math 测试 fixture,让 packaged loaders 的 4-up REL 真命中 Resources/packages/;asar.unpack 顺势丢掉死掉的 packages/** glob。 |
| Speech 子页搬到 web-panel | 2d45ae278 |
views/SpeechSettings.vue + utils/speech-settings-parser.js + 路由 /speech-settings,引擎选择 + Web Speech / Whisper API / Whisper Local 三块核心配置;高级 storage / audio / 知识集成 / 性能子项保留 V5(Memory Bank 同款 deliberate scope cut)。LLM / Project 早有 Providers / ProjectSettings 等价页,V5 SystemSettings 三个 tab 加 a-alert 指向 web-panel。 |
session-close 真删(drive-by) |
(pending commit) | CLI ws-session-gateway.js:_serializeSessionMetadata 加 status 字段 + listSessions DB 路径 if (metadata.status === "closed") continue;。session-close 后再 session-list 就不会再返回闭合的 session。 |
测试矩阵:desktop unit 248 + config 26 + scripts 14 + integration 514 + web-shell e2e 14 + Playwright 4,web-panel unit 1616 + integration 58 + e2e 75(含修好的 session-close case),CLI session-gateway 58。共 ~2480 测试全绿(不计 skipped 与上游 DB 损坏导致的 1 个本机环境 fail)。
未做:Phase 1.4 实战(make:win 真打包验证)+ gemini-client signal 透传 + 参数顺序 + SystemSettings 余下 tab(Vector / Git / Backend / ...)按 Speech 模板续迁。
详见 docs/design/桌面Web壳_架构与落地_设计文档.md。
2026-04-30 增量更新(桌面 Web 壳 Phase 0 → 1.4 prep 全量落地 — web-panel SPA 同进程嵌入桌面 + 协议合并 + 桌面专属 topic + 入口 opt-in + 打包 vendor)
桌面端方向收口:桌面 = web 加强版——Electron 同进程嵌入 web-panel SPA,桌面专属能力(U-Key/FS/MCP/Ollama)作为新增 WS topic + 极薄 preload 叠加,体现"独有特性强项化"。详见 docs/design/桌面Web壳_架构与落地_设计文档.md。
| Phase | 状态 | 关键产物 |
|---|---|---|
| 0 spike | ✅ | web-ui-loader.js HTTP 同进程嵌入 + ws-bridge.js 极简 topic + phase0-smoke.cjs 端到端 |
| 1.1 协议合并 | ✅ | ws-cli-loader.js 包 CLI ChainlessChainWSServer + monkey-patch _dispatcher.dispatch,自定义 topic 与 web-panel CLI 协议(auth/ping/session-*)共享同一 WS 连接 |
| 1.2 桌面专属 topic 第一批 | ✅ | skill.list(绕过 SPAWN_ERROR 同进程跑 CLISkillLoader)/ fs.openDialog / fs.saveDialog(dialog-based 安全先于性能,10 MiB 读取上限) |
| 1.3 入口 UX | ✅ | shouldRunWebShell(argv, env, settings) 三选一;SystemSettings 加 ui.useWebShellExperimental toggle,复刻 V6 hard-flip (caaddf530) 节奏 |
| 1.4 打包 prep | ✅ | scripts/prepare-web-shell-vendor.js + Decision A:vendor target = path.join(buildPath, "..")(保证 loaders 4-up REL 在 dev/packaged 都对);forge.config.js#packageAfterCopy 已接 |
测试矩阵:117+ 测试覆盖 web-shell 关键路径——单元 79 + 集成 14 + scripts 14 + config 6 + Playwright e2e 4 + phase0-smoke.cjs 一次性 smoke。
激活方式:System Settings → 通用 → "启用 Web Shell(实验)" toggle(重启生效);或 npm run dev:web-shell / --web-shell argv / CHAINLESSCHAIN_WEB_SHELL=1 env。
已知限制:_executeCommand 在 Electron 内 process.execPath 是 Electron 而非 node(CLI 已加 ELECTRON_RUN_AS_NODE=1 workaround);SystemSettings toggle 持久化路径走 config:set → AppConfigManager whitelist 漏 ui 字段(V6 toggle 同 bug,单独修)。dogfood 期 env/argv 仍 OK。
未做:Phase 1.4 实战(make:win 真打包验证,待用户机器循环)+ Phase 1.5 多窗口架构(设计 memo 已落,实施留下次)。
/v6-preview 壳里残留的 demo 痕迹一次清掉,对外可演示。
| 改动 | 内容 |
|---|---|
conversation-preview.ts schema |
version: 2 → 3;移除 seedConversations() / createDemoFiles() / 旧演示文件树;首次启动或 schema/JSON 损坏 → conversations: [] + activeId: null,UI 引导用户主动 "+ 新会话";agentLabel 默认 "Claude Code" → "ChainlessChain" |
品牌位(AppShellPreview.vue) |
左上角 "ClaudeBox" 字样换成 import brandLogo from "../assets/logo.png" + 文字 "ChainlessChain",底部 composer 标签去掉 "运行中..." 后缀 |
| 平台感知 traffic dot | macOS 红黄绿圆点改 v-if="isMacPlatform",挂载时 await window.electronAPI.system.getPlatform() === "darwin";Win/Linux 隐藏 |
| 设置入口 | 底部 5 颗 runtime chip(progress/model/skill/tool/terminal)收成单颗 button-chip(显示 runtimeStatus.modelLabel || "未配置模型");顶部新增齿轮 SettingOutlined 按钮;两者均 router.push({ path: "/settings/system", query: { tab: "llm" } }) |
| 单测对齐 | conversation-preview.test.ts 改写"空白起步"语义,扩到 23 条;preview 壳系列(theme 10 + widget-registry 5 + v6-shell-default 9 + conversation-preview 23)合计 47 条全绿(17.1s);vue-tsc --noEmit 0 错误 |
模板(仅渲染层 + 持久化 schema 的"品牌+空白化"调整,不动主进程 IPC、不动路由表):见 docs/design/modules/97-claude-desktop-refactor.md §交付状态 P9d 条目。
2026-04-26 增量更新(web-panel Phase B 全量收官 — Community / Marketplace / Cross-chain / AIOps / Compliance + 侧边栏可滚动可折叠)
V6 硬翻定调后,web-panel 进入 Phase B:把桌面端 5 个高频功能整体移植到浏览器面板,每件 1 个 commit、scope feat(web-panel):,模板 = <feature>-parser.js(pure,含 stripCliNoise 复用)+ <Feature>.vue + router/sidebar 接线 + parser unit tests + new-pages 路由计数 +1 + 路径断言。Phase B 完成后顺手做了 sidebar 独立滚动 + 二级菜单收缩。
| Commit | 路由 | 侧边栏组 | CLI 来源 | 卡片 / Tab / 弹窗 |
|---|---|---|---|---|
260787c99 |
/community |
社 交(新建) | cc social ... |
5 / 3 (帖子+好友+联系人) / 2 (发帖+加联系人) |
792b211e1 |
/marketplace |
数 据 | cc marketplace ... |
5 / 2 (服务+调用) / 2 (发布+记录调用) + 状态机下拉 |
8f7d87ede |
/crosschain |
高 级 | cc crosschain ... |
5 / 3 (桥接+原子交换+消息) / 4 (Bridge+Swap+Send+FeeEstimate) + 链目录 tag |
30cf3b6ab |
/aiops |
概 览 | cc ops ... |
5 / 3 (事件+Playbook+基线) / 4 (创建事件+Playbook+基线+异常检测) + 严重度分布 |
04c57237d |
/compliance |
高 级 | cc compliance threat-intel/ueba |
5 / 2 (威胁情报+UEBA) / 3 (匹配+构建基线+行为分析) + IoC 类型分布 |
加完 5 个新条目后侧栏在小屏被撑出视口范围;根因是 .app-root 用了 min-height:100vh(允许增长),.side-menu 的 overflow-y:auto 永不触发。
| 改动 | 效果 |
|---|---|
.app-root min-height → height: 100vh; overflow: hidden |
锁死视口高度 |
.main-area 加 display: flex; flex-direction: column; height: 100vh |
头/内容区 flex 分摊 |
.page-content 改 flex: 1; min-height: 0 |
flex child 触发独立滚动 |
8 个 <a-menu-item-group> → <a-sub-menu> |
二级菜单可点击折叠 |
v-model:openKeys + localStorage 持久化(cc.web-panel.sidebar.openKeys) |
跨刷新保留展开状态,9 测试覆盖 |
| 改动 | 内容 |
|---|---|
NEW integration: __tests__/integration/phase-b-cli-commands.test.js |
19 测试,在 19410 端口起真实 cc serve,把 5 个视图依赖的所有 CLI 命令实跑一遍,输出过对应 parser 不抛错 |
FIX e2e: __tests__/e2e/panel.test.js SPA_ROUTES |
23 → 34(先前 11 条路由没在 SPA fallback 测试覆盖里,包括 Phase A 的 did/project-settings/knowledge) |
NEW unit: __tests__/unit/sidebar-openkeys.test.js |
9 测试,锁住 localStorage 默认值 / 反序列化容错 / 未知键过滤 |
| Suite | 结果 |
|---|---|
web-panel __tests__/unit/ |
809/809(599 baseline + 5 × ~35 parser + 9 sidebar + 路由断言增量) |
web-panel __tests__/integration/phase-b-cli-commands.test.js |
19/19(~40s end-to-end,每命令实跑一次) |
| vite build | clean,KnowledgeGraph chunk 仍是唯一 >500kB 警告(Phase A 时既有,echarts 体积) |
router 子项 30 → 35(1 redirect + 34 named pages);侧边栏新增 1 个组(社 交)+ 4 个条目(数据/概览/高级 各扩展)。
Phase B 收完。下一阶段候选:B6+ 预备役(Privacy Computing / Inference Network / NL Programming / Tenant SaaS / AI-doc-creator),按需触发;模板已机械化。
V6 桌面壳从 2026-04-21 的 soft opt-in 走到 default:完成最后 6 个 V5→V6 widget probe(did-management / projects / p2p-messaging / community / ai-chat / settings),凑齐 top-10 parity 10/10,随即把默认入口翻到 V6。同日把 web-panel 的 Phase A 三件(DID / Knowledge Graph / Project Settings)全量上线接路由。
每颗 probe 走标准 5-7 文件模板:plugin.json + <Name>Widget.vue + <Name>Panel.vue + 可选 thin Pinia store + widgets/index.ts + AppShell.vue 接 panel + 集成测试。
| Commit | Probe | Slash | Thin store | Panel 数据来源 |
|---|---|---|---|---|
35f4e278b |
did-management | /did |
useDIDManagementStore |
did:get-all-identities / did:get-current-identity / did:set-default-identity |
a097596f5 |
projects | /projects |
useProjectsQuickStore |
project:get-all(recent-5) |
3883a72ec |
p2p-messaging | /p2p |
useP2PMessagingStore |
p2p:get-node-info / p2p:get-peers / p2p:get-nat-info(graceful null/[]) |
5b5e6fe1d |
community | /community |
useCommunityQuickStore |
community:get-list(graceful []) |
396d6e7b1 |
ai-chat | /chat |
useAIChatStore |
llm:check-status + llm:get-config |
ccbc312fd |
settings | /settings |
— (pure-info) | 静态列出 7 个 SystemSettings sub-pane |
ai-chat 是硬翻 gating route — 收完 settings 后 top-10 (settings/knowledge/projects/chat/did/p2p/community/ai/workflow/enterprise) 全部有 V6 widget。
| 文件 | 改动 |
|---|---|
router/v6-shell-default.ts |
初始 useV6ShellByDefault = false → true(覆盖 pre-config-load 窗口 + bootstrap try/catch 失败 fallback) |
main.ts |
setV6ShellDefault(raw === true) → setV6ShellDefault(raw !== false) — config 未设值默认 V6,仅显式 false 才回 V5 |
pages/settings/SystemSettings.vue |
表单 initializer + 描述文字同步翻 |
opt-out 通道与纯函数 resolveHomeRedirect() 都没动,符合 migration template 的 "no other code needs to move" 承诺。老用户下次启动直接看到 V6 shell;想回 V5 在 SystemSettings 关掉 "启用 V6 桌面壳" 即可。
附带 commit 72b826bdf 修了顺手发现的链接漂移:SystemSettings 的 "立即试用" link 之前 router.push("/v2") 但 router 守卫 redirect 是 /v6-preview —— 两处统一到 /v6-preview。
| Commit | 范围 | 路由 |
|---|---|---|
f37aa44d0 |
KG 完整 + DID scaffold + echarts/vue-echarts deps | /knowledge 全程上线 |
d1f22ce2d |
ProjectSettings scaffold | (scaffold) |
c0e96c9e0 |
DID + ProjectSettings wiring | /did + /project-settings |
KG 4 个 tab:force-directed graph (ECharts) / 实体表 / 关系表 / 类型分布,CRUD + 多跳 BFS reasoning 全部走 cc kg list/relations/stats/reason --json。DID 复用 cc did *,助记词/DHT 按钮显示但 disabled + tooltip "桌面专属"。ProjectSettings 4 字段(rootPath/maxSizeMB/autoSync/syncIntervalSeconds)走 cc config get/set project.*,diffProjectConfig 只对改动字段发 set。
| Suite | Result |
|---|---|
plugin-extension-points.integration.test.js |
19/19(每加一个 probe +1 it block) |
slash-dispatch.test.ts |
8/8 |
v6-shell-default.test.ts |
9/9(硬翻后 4 个断言相应翻转) |
web-panel __tests__/unit/ |
621/621(含 24 did-parser + 27 kg-parser + 20 project-settings-parser) |
desktop tests/integration |
509/512(3 失败在 coding-agent-bridge-real-cli.test.js,pre-existing ECONNREFUSED 网络依赖,非今日引入) |
预约一颗 remote agent trig_013pjiuMPAUkNyoE4QxVdee8 在 2026-05-10 09:00 Asia/Shanghai 自动巡检:跑 git log 找 revert/regression commit、gh issue list 找 V6 用户报告、跑 3 个 V6 surface 测试文件、读 CLAUDE.local 找回滚笔记,给 keep / tweak / revert 推荐(≤250 字)。管理:https://claude.ai/code/routines/trig_013pjiuMPAUkNyoE4QxVdee8
法务 2026-05-03 出函解锁 Q-COMP-3(境内联盟链路径),同步落地 v0.3 #2 链上治理锚定 + 一次跨设计文档的 doc cleanup:
| 模块 | 内容 |
|---|---|
| Lib (core-mtc) | SCHEMA_GOVERNANCE_ANCHOR schema + computeGovernanceSnapshotHash (deterministic, order-independent) + pluggable IChainAnchorClient 接口 + InMemoryChainAnchorClient / FilesystemChainAnchorClient 两个 mock impl + verifyGovernanceAnchor 含 HASH_MISMATCH drift 报告 |
| CLI | cc mtc federation governance-anchor <fed> --actor --chain-store [--chain-name] (publish snapshot hash) + governance-verify-anchor (fetch latest 链上 record + 对比本地 replay)。生产部署 swap 真实链 client 即可,schema/CLI 不变 |
| 设计文档 cleanup | (a) MTC_联邦治理_v1.md §11: #1 cross-fed 互信 + #2 链上锚定 + #4 审计第三方 全部回标 ✅ + commit hash;新增 §11.5 测试基础设施限制(paxos/libp2p e2e)。(b) MTC_跨链桥_v1.md §11: #3 多跳 + #4 gas-aware + #5 监控 + #6 SLA 全部回标 ✅;#1/#2 标注外部依赖 + 预期解锁条件。(c) 默克尔树证书_MTC_落地方案.md §14.2 Q-COMP-3 状态从 "保守决议" 改为 "已解锁 2026-05-03"。(d) 新增 §14.5 Deferred Items Registry — single source of truth,跨子文档统一索引剩余 4 项 deferred items + 3 项永久限制 + v0.6→v0.12 完整 commit 历史 |
| 测试 | +16 lib unit (snapshot hash 确定性 / 顺序无关 / fed 隔离 / mock client 双实现 / verifyAnchor HASH_MISMATCH+drift) + 5 CLI integration (publish / verify pass / verify mismatch / NO_ANCHOR_ON_CHAIN / 重复 anchor 递增 block_height) = 21 新测试 |
累计:core-mtc 248 (+16 v0.12 anchor) + CLI integration 71 (+5 v0.12) + lib unit 70 (无变化) = 389 全绿。
仍 NOT 做(仅剩 4 项,全部明确外部 blocker) — 见 默克尔树证书_MTC_落地方案.md §14.5 Deferred Items Registry:
- D1 真实 RPC 链适配器 — desktop 大工程
- D2 Cross-chain DID 解析(生产路径)— 阻塞同 D1
- D3 完整 paxos 跨成员实时门控 — 当前替代方案 production-ready
- D4 Libp2p cross-node wire e2e 真测 — testbed 限制
收口跨链桥设计 §11 + 联邦治理 v0.2 §11 列出的全部可做项(链上锚定阻塞 Q-COMP-3、真实 RPC 适配器需 desktop 大工程,此两项继续保留):
| Wave | 模块 | 内容 |
| ----------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| A1 Cross-federation 互信(v0.3 #1) | core-mtc/lib/federation-governance.js | SCHEMA_CROSS_FED_TRUST_ANCHOR schema + createCrossFederationTrustAnchor + validateCrossFederationTrustAnchor(含 EXPIRED 检查)。CLI: cc mtc federation cross-trust-create/validate |
| A2 离线审计第三方接口(v0.3 #3) | 同上 lib | auditGovernanceLog(events, fedId) 纯函数:检测 UNKNOWN_ACTOR / ACTOR_KEY_MISMATCH / BOOTSTRAP_KEY_MISMATCH / OUT_OF_ORDER 四类问题,返回 {ok, findings[], final_state}。CLI: cc mtc federation audit <fed> [--summary | --json] |
| B1 多跳桥(bridge §11 #3) | cross-chain-mtc.js | buildMultiHopBridgeEnvelope 链 ≥2 个单跳 envelope,强制 leg[i].dst_chain == leg[i+1].src_chain 连续性;新 schema mtc-bridge-multihop/v1。verifyMultiHopBridgeEnvelope per-leg 验证。CLI: cc crosschain mtc-multihop-build/-verify |
| B2 Gas-aware batch(bridge §11 #4) | 同上 | shouldCloseBatchGasAware 启发式:staged ≥ 50 硬关;current_gas > baseline×1.5 延迟;否则关。CLI: cc crosschain mtc-gas-check <chain> --staged-count <n> [--current-gas-usd] |
| B3 SLA Manager 集成(bridge §11 #6) | 同上 | getBridgeMtcSlaMetrics 输出 cc sla 兼容形状:sla_status (ok/degraded/down) + staging/批次/最近批次时间。CLI: cc crosschain mtc-sla |
| C Web-panel 监控 dashboard(bridge §11 #5) | Mtc.vue 跨链桥 tab | 新增"SLA / Monitoring" 卡片:4 个统计 (status / staged / batches/h / last batch) + 30s 自动 poll cc crosschain mtc-sla --json,可纳入外部 Prometheus / Grafana |
累计测试:core-mtc 232 (+12 v0.3 lib) + CLI integration 66 (+6 governance + 4 crosschain) + lib unit 70 (+14 v0.2 lib) = 358 全绿。
仍 NOT 做(明确外部 blocker / 重大依赖):
- 链上治理锚定(v0.3 #2)— 等 Q-COMP-3 法务出函解锁境内联盟链路径
- 真实 RPC 链适配器(bridge §11 #1)— 需 desktop ethers/web3 集成 + chain endpoints + 大量集成测试
- cross-chain DID 解析(bridge §11 #2)— 与 cross-fed 互信合并设计,schema 已有,等 desktop 真链路径
- 完整 paxos 跨成员实时门控(v0.10 留项)— 多周分布式系统工作,超出增量范围
- Libp2p cross-node wire e2e(v0.10 留项)— gossipsub mesh 在 2-node testbed 天然 flaky,已用 call-path + dispatch test 替代
收口 v0.10 留下的最后一项小工作 — 把 sync daemon 写出的 stats 文件接入桌面 V6 治理 widget,让用户在桌面就能看到 publish/pull/wire 实时计数:
| 模块 | 内容 |
|---|---|
| Main process IPC | 新增 mtc:get-federation-sync-stats channel + readFederationSyncStatsFromDisk(dir) helper,扫描 <gov-dir>/*.sync-stats.json 返回 {federations: [{fed_id, mode, last_tick_at, publish, pull, libp2p}]} |
| Preload bridge | electronAPI.mtc.getFederationSyncStats() |
| V6 widget 增强 | FederationGovernanceWidget.vue 在每个联邦卡片下追加 sync 子面板 — 显示 mode (filesystem/libp2p) + last_tick 相对时间 + Publish (last/total) + Pull (last/total + invalid/unknown) + libp2p wire (recv/appended)。无 daemon 在跑时子面板隐藏 |
| 测试 | +5 IPC unit (空 dir / 解析 / 忽略非 stats 文件 / 损坏 JSON / channel 注册) + +3 widget unit (filesystem mode 渲染 / libp2p mode 渲染 / 无 stats 时隐藏)。共 41/41 desktop MTC 测试 |
闭环了 v0.10 列出的"desktop V6 widget 集成 sync-stats"。剩余 3 项 v0.10 候选(完整 paxos 跨成员 quorum 实时门控 / WebSocket streaming sync-stats / libp2p cross-node wire e2e)是优化方向,等真实部署反馈再决定优先级。
收口 v0.9 留下的 4 项 TODO:
| 模块 | 内容 |
|---|---|
| Multi-proposal CRDT | replayGovernanceLog 现保留 ALL 开放的 propose-threshold / propose-revoke(之前同 target 后写覆盖前写);新返回 pending_thresholds[] / pending_revokes_all[],旧 pending_threshold / pending_revokes 字段保持 backward-compat(最近一条)。confirm-threshold --proposal-event-id <id> CRDT-style 显式选择某具体提案;缺省仍 confirm 最近 |
| Live sync stats | 两条 sync daemon 每 tick 持久化 <dir>/<fed>.sync-stats.json (atomic write);新 cc mtc federation governance-sync-stats <fed> [--json] 读取。Web GUI / 监控可定期 poll 该文件 |
| Libp2p 烟雾测试 | packages/core-mtc/__tests__/federation-governance-libp2p.test.js 4 tests 覆盖 publishRaw 调用路径、合成 dispatch、receiver-side dedupe、topic 格式约定。没有断言跨节点 wire delivery(与现有 federation discovery test 一致策略——gossipsub mesh formation 在 2-node 测试环境天然 flaky) |
| Systemd 加固清单 | packages/cli/scripts/service/HARDENING.md 详细列出当前模板的安全保护(User= / NoNewPrivileges / ProtectSystem / ReadWritePaths 等)+ 部署前 7 项 verify 清单(账号 / mount / 网络 / 可选 capability drop / SELinux)+ 已知限制 + smoke test 步骤 |
累计测试:core-mtc 220 (+6 conflict resolution + 4 libp2p smoke) + CLI integration 30 (+3 stats + 1 conflict CLI) = 250 全绿。
设计取舍:CRDT 提案保留全部开放的并发提案,confirm 默认选最近(back-compat)但可显式选 specific event_id;不引入完整 multi-decree paxos / merkle CRDT,对小规模联邦(N<10)够用。Live stats 用文件 polling 而非 WebSocket streaming,避免 ws-server 改造。Libp2p e2e 走"调用路径不抛 + dispatch logic 正确"策略,wire delivery 测试留给生产 mesh。
收口 v0.8 留下的 4 项 TODO:
| 模块 | 内容 |
|---|---|
| Auto sync daemon | cc mtc federation governance-sync-serve <fed> --drop-zone <dir> [--interval] [--verify] [--once] 周期性 publish + pull;SIGINT/SIGTERM graceful;helpers runGovernancePublish / runGovernancePull 抽出复用 |
| libp2p 同步通道 | cc mtc federation governance-sync-libp2p <fed> --listen <maddr> [--connect] [--verify] [--once]:gossipsub topic mtc-federation-governance/v1/<fed>;<dir>/<fed>.libp2p-pos.json 高水位记录已 publish 的 event_id;接收侧 dedupe + verify + append;复用现有 Libp2pTransport 基础设施 |
| Quorum 门控 | cc mtc federation confirm-revoke / confirm-threshold 默认 pre-flight 检查匹配的 propose-revoke / propose-threshold 存在;--no-quorum-check 可显式关闭。新增缺漏的 cc mtc federation confirm-threshold <fed> --actor <m> CLI |
| Web-panel 操作型 GUI | Mtc.vue 联邦治理 tab 新增 5 个子 tab (邀请/投票/改 threshold/撤销/跨成员同步),全部通过 ws.execute('mtc federation ...') 调用本机 CLI——签名密钥永远不进入 web 渲染进程。安全说明 a-alert 嵌入 |
| Service supervisor | 新增 cc-fed-governance-sync.service (systemd) 模板 |
累计测试:CLI integration 27 (含 6 新:confirm-threshold + quorum + sync-serve --once + sync-libp2p --help) + web-panel parser 13 (无回归) = 40 全绿。
设计取舍:libp2p 同步选择简单的"高水位 republish"策略(每 tick 推未推过的);接收侧 dedupe + verify 已经可靠,不引入复杂的 pull 协议。Web 操作型 GUI 通过 ws-bridge 调本地 CLI,签名材料不出 CLI 进程,符合"密钥不进 web"的安全约束。
收口 v0.7 留下的"governance.log 只在本地"和"治理只能 CLI 看"两个限制:
| 模块 | 内容 |
|---|---|
| core-mtc 同步 lib | dedupeEventsByEventId / sortEventsChronologically / verifyGovernanceLog (返回 valid/invalid/unknown 三组);+8 unit tests |
| 2 个新 CLI | cc mtc federation governance-publish <fed> --drop-zone <dir> (atomic write 一文件一事件,幂等) + cc mtc federation governance-pull <fed> --drop-zone <dir> [--verify] (dedupe by event_id + 可选签名校验);+5 integration tests 覆盖 alice→bob 跨 home 同步 + dedupe + --verify 路径 |
| Service supervisor 模板 | packages/cli/scripts/service/: systemd unit (Linux) + launchd plist (macOS) + NSSM config (Windows) + Task Scheduler XML (Windows alt);操作员手动 install,不接 npm postinstall |
| Desktop V6 治理 widget | FederationGovernanceWidget.vue + mtc:get-federation-governance IPC + electronAPI.mtc.getFederationGovernance;列出所有联邦的 status / threshold / 成员 (活跃+候选) / 待投票 / 待撤销 / 归档/泄漏密钥;+7 widget unit + 4 IPC tests |
| Web-panel/Web-shell 治理 + 桥 tab | Mtc.vue 新增 "跨链桥 MTC" tab (config + 信任锚表) + "联邦治理" tab (按 fed-id 加载 governance-log,渲染状态卡 + 成员表 + 待投票列表 + 事件时间线)。Web-shell 通过 electron 内嵌 web-panel,零额外改动 |
累计测试:core-mtc governance lib 28 unit + CLI governance integration 19 + desktop 26 IPC + 18 widget = 91 governance/sync 相关测试全绿。
实现仍 opt-in:跨成员同步是手动 governance-publish/pull 操作,未做自动 daemon — 自动化留给 v0.9 候选。
在 v0.6 跨链桥 MTC 集成基础上,把治理设计文档从纸面转成可执行:
| 模块 | 内容 |
|---|---|
| core-mtc 治理 lib | packages/core-mtc/lib/federation-governance.js:13 种事件类型 (create/invite/vote/leave/propose-revoke/confirm-revoke/rotate-key/propose-threshold/confirm-threshold/fork/merge/dispute/wind-down)、createGovernanceEvent 多算法签名 (Ed25519/SLH-DSA)、verifyGovernanceEvent、replayGovernanceLog 纯函数还原 effective state(成员名单 + threshold + 候选期权重 0.5 + 30 天自动转正) |
| 8 个新治理 CLI | cc mtc federation invite/vote/propose-revoke/confirm-revoke/rotate-key/propose-threshold/fork/merge 全部签名后追加到 ~/.chainlesschain/federation/governance/<fed>.jsonl + cc mtc federation governance-log <fed> 一键查看事件 + replay state |
| 桥 MTCA daemon | cc crosschain mtc-serve [--interval <s>] [--once]:周期性 closeBatch;--once 单次模式适合 cron / 测试;SIGINT/SIGTERM graceful 关停 |
| Desktop V6 widget | BridgeMtcStatusWidget.vue + mtc:get-bridge-status IPC 通道(preload electronAPI.mtc.getBridgeStatus);显示 enabled / mode / alg / batch interval / trust anchors (n 锚 / m 链) / 待批次关闭 / 最近批次;并入 PREVIEW_WIDGETS["bridge-mtc"] |
| Bug fix | governance lib 的 pickSigner 同时接受规范大小写(Ed25519)和 CLI lowercase(ed25519)— 否则 verify 会回 BAD_ALG |
累计测试:核心 governance lib 20 unit + CLI 14 integration + desktop 11 (+5 widget +6 IPC bridge) = 50 新测试全绿;总 MTC 相关 = core-mtc 202 + CLI 86 + desktop 32 = 320 测试。
实现仍 opt-in:cc mtc federation 治理事件签名后只写本地 governance.log,没人强制订阅;其它成员需要主动 sync log 或运行 verifier 才能感知。
落地两份治理 / 跨链设计文档(关闭 §12 已知限制 #2/#6)+ cc crosschain mtc-* 一组新子命令,让现有桥流程能 opt-in 写 MTC envelope:
| 模块 | 内容 |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 设计文档 — 联邦治理 v1 | docs/design/MTC_联邦治理_v1.md:5 阶段联邦生命周期 (Bootstrap/Steady/Dispute/Wind-down/Closed) + 准入审批流(候选期权重 0.5)+ M-of-N 阈值业务场景分级 + 三种退出路径 + Fork/Merge 语义 + governance.log schema |
| 设计文档 — 跨链桥 MTC 化 v1 | docs/design/MTC_跨链桥_v1.md:mtc/v1/bridge/<chain-pair>/... 字典序 namespace + 桥两侧 MTCA 三种互信模式(Independent/Federated/Light Client)+ 跨链特有威胁分析 (T1 oracle 共谋 / T5 censorship) |
| CLI lib | packages/cli/src/lib/cross-chain-mtc.js 新增:bridgeNamespace 强制字典序 + 信任锚 store (Independent 模式) + assembleBridgeBatch / verifyBridgeEnvelope + stageBridgeOp / closeBatch staging 生命周期 |
| 4 个新子命令 | cc crosschain mtc-status / mtc-envelope / mtc-verify / mtc-trust-anchor {add,list,remove} / mtc-batch |
| --mtc opt-in flag | cc crosschain bridge | swap | send --mtc 在原命令成功后写一条 staging op;cc crosschain mtc-batch 关 staging 为按 chain-pair 分组的批次(landmark + envelopes 持久化到 batches/-/) |
| Bug fix | _dbFromCtx 修向上多层查找 _db(之前只看 root program → 永远 null,导致桥命令 spawnSync 全挂)+ crosschain preAction 自动 bootstrap DB |
| core-mtc 改动 | NAMESPACE_RE 加 bridge kind(additive,不破坏现有 did/skill/audit) |
累计测试:lib 56 unit + CLI 14 integration + 7 e2e + core-mtc 182 + 既有 cross-chain 83 = 342 测试全绿,覆盖 unit / integration / e2e 三层 + 跨进程独立验证。
实现仍 opt-in(--mtc flag),等 desktop RPC 链适配器成熟后切默认 on。
Phase 3 federation MTCA 完整落地:M-of-N 多签 landmark、cc mtc federation join/leave/status 本地 registry、cc mtc * --federation <id> --threshold <M> 多签发布、cc mtc federation discover 跨进程服务发现(filesystem drop-zone 共享目录 NFS/Syncthing/SMB/USB + libp2p gossipsub 真 P2P 双 transport)、异构 Ed25519+SLH-DSA 联邦、OpLog per-row "待批次关闭" 徽章 backend 桥接 + web-panel Audit.vue 4 态徽章。
| 阶段 | Commit | 内容 |
|---|---|---|
| Phase 3.1 多签 + federation 命令 | 95b861914 |
assembleBatchFederated + LandmarkCache ≥M-of-N + cc mtc federation join/leave/status(atomic write,wx race-safe) |
| Phase 3.2 Marketplace federation 信任锚 | 15c29e9fe |
cc mtc batch* / publish-skills --federation <id> --threshold <M> |
| Phase 3.3 filesystem service discovery | aa13e07a9 |
cc mtc federation discover --transport filesystem --drop-zone <dir>,自签 announce + TTL cache |
| Phase 3.4 libp2p service discovery | 70996de89 |
--transport libp2p + gossipsub topic mtc-federation/v1/<id> + Libp2pTransport.publishRaw/subscribeRaw 通用 pubsub API |
| OpLog per-row 徽章 | 70d2cda59 |
backend AuditMtcBridgeService 解析 emit JSON 写回 audit_mtc_event_id(V013 migration),web-panel Audit.vue 4 态徽章 |
| v0.5 bug 审计修 4 项 | 本次 | drawer 改用 electronAPI.file.readContent、libp2p 节点 init 异常 cleanup、scan 重入锁、federation join wx 独占创建 |
累计测试:core-mtc 182 + CLI 89 + desktop 33 + web-panel 153 + backend 19 = 476 测试全绿,覆盖 unit / integration / e2e / desktop-renderer / web-renderer / backend 六层。
新包 @chainlesschain/core-mtc 落地后量子安全签名压缩方案 — 借鉴 IETF PLANTS WG 的 Merkle Tree Certificates 协议(与 Cloudflare + Google Chrome 联合推进的 HTTPS 后量子方案同源)。
切到 SLH-DSA-128f 时,单签从 64 B 暴涨到 17 KB;DHT 周流量从 5 GB 涨到 170 GB(10K 用户规模)。MTC 通过批量签发 + Merkle inclusion proof,把单证书携带物压回 ~700 B —— 节省约 97%。
# 批次签发与验证
cc mtc batch <input> # 通用批次构造
cc mtc batch-dids # 从本地 DID DB 读身份
cc mtc batch-skills # 从 CLISkillLoader 读技能
cc mtc verify <env> --landmark X # 验证 inclusion proof
cc mtc landmark inspect <X> # 查看 landmark 元信息
cc mtc serve --transport=... # verifier 守护进程
# v0.4 新:marketplace publisher 守护进程
cc mtc publish-skills --namespace-prefix mtc/v1/skill \
--issuer mtca:cc:... --out <dir> --state-file <path> --once
# v0.4 新:审计日志双轨脚手架(off-by-default)
cc audit mtc {enable | disable | config | set-interval} # 配置(产线启用待法务出函)
cc audit mtc {emit | reconcile | reconcile-check | status} # 双轨流转| 阶段 | Commit | 内容 |
|---|---|---|
| Phase 1 W1+2+3 | be70c5b17 |
RFC 6962 Merkle 树 + Verifier + LandmarkCache + 3 子命令 |
| Phase 1 W4 | 8926a5bc0 / a4b88ebda |
持久化 + Ed25519 实签(去 alwaysAccept 桩) |
| Phase 1 W4 DID | 1e63dacc1 |
cc mtc batch-dids 读本地 DID DB |
| Phase 1 W5 | 58ad63a6b |
InMemory + Filesystem transport(含两节点 e2e) |
| Phase 1.5 | 40fa0689a / 1b0ae1105 / 4d1a81586 |
libp2p direct + gossipsub + cc mtc serve |
| Phase 2 partial | 67da18480 |
Marketplace cc mtc batch-skills |
| Phase 2 v0.4 | c69900c7d |
assembleBatch 抽公用 + cc mtc publish-skills daemon + cc audit mtc 双轨脚手架 |
| E2E + bug audit | 1903b9015 |
跨进程 e2e 6 测试 + 4 个 bug 修复(state file 原子写、staging schema 校验、getStatus malformed-leading guard、issuer key 'wx' 并发 create race) |
| Phase 1.6 SLH-DSA | 本次 | core-mtc/lib/signers/slh-dsa.js (FIPS 205) + assembleBatch 接受可选 signer + cc mtc * --alg slh-dsa-128f opt-in + cc mtc verify 多算法 dispatcher。@noble/[email protected]。 |
| Phase 4 V6 widget | 本次 | MtcStatusPreviewWidget.vue + DecentralEntries 顶部 MTC 入口;显示 audit/批次/算法状态;IPC 缺失优雅降级 |
测试分层:core-mtc 147(含 SLH-DSA 7 + batch refactor 3)+ CLI MTC 64(unit 30 + integration 28 + e2e 6)+ desktop V6 widget 11 = 222 全绿,跨 unit / integration / e2e / desktop-renderer 四层。
详细使用:用户指南;架构与字节级规范:设计文档、docs/design/默克尔树证书_MTC_落地方案.md。
签名算法:cc mtc batch/batch-dids/batch-skills/publish-skills 全部支持 --alg ed25519(默认,64B/sig,classical)或 --alg slh-dsa-128f(17KB/sig,FIPS 205 后量子,opt-in)。cc mtc verify 多算法 dispatcher 自动识别。Audit-mtc 仍维持 Ed25519(realtime sig + 短窗 batch,PQC 收益边际)。Audit 产线启用阻塞已于 2026-05-01 解除(Q-COMP-1 等保三级最终性窗口 + Q-COMP-2 T/ZGCMCA 023—2025 条款法务出函均已收到);脚手架仍保持 enabled=false 默认,由各租户在自己的环境内通过 cc audit mtc enable --interval <60|3600> 显式启用。
新命令 cc pack 从 v0.2 的"CLI 打包器"演进为 v0.4 的"项目打包器":除了原有 CLI + Web UI 的单文件分发,新增 --project 模式,把 CWD 的 .chainlesschain/(config、skills、rules、persona)一并烘进 exe —— 收件人双击跑的就是"这个项目对应的 Agent"。
# 基础模式:通用 ChainlessChain 便携 exe
cc pack --skip-web-panel-build --allow-dirty
# → dist/chainlesschain-portable-node20-win-x64.exe (~58 MB)
# 项目模式:CWD 的 .chainlesschain/ 自动内嵌(自动检测)
mkdir my-medical-agent && cd my-medical-agent
cc init -t medical-triage
cc pack
# → dist/my-medical-agent-portable-node20-win-x64.exe
# + 同目录的 .pack-manifest.json(含 bundledSkills 审计清单)产物启动后:基础模式弹出通用 Web UI;项目模式先物化 .chainlesschain/ 到 ~/.chainlesschain-projects/<name>-<sha8>/,CC_PACK_AUTO_PERSONA 激活项目 persona,CC_PROJECT_ALLOWED_SUBCOMMANDS 收敛 commander 白名单,/api/skills 返回项目内 skill 列表。
| 症状 | 根因 | 修复 |
|---|---|---|
| 双击黑窗一闪而过 | 合成入口无 subcommand 时 commander 只打印 help 就退出 | 入口检测到无 sub 时自动 argv.push('ui'),浏览器自动开;--version/--help 短路不污染 |
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING |
pkg snapshot 不给 V8 注册 import callback | 入口改用静态 ESM 导入 ensureUtf8 + createProgram,不再 import(...) |
NODE_MODULE_VERSION 127 … requires 115 |
原生 .node 按 Node 22 ABI 编译,pkg 打进 Node 20 |
loadSQLiteDriver 每个 native 候选加探针 new Database(':memory:').close();ABI mismatch 自动降级到 sql.js |
sql.js 选中但 prepare(...).all is not a function |
历史 fallback 只切 driver 不适配 API | 新增 createSqlJsCompat(raw, dbPath):把 sql.js 包成 better-sqlite3 外形(prepare().all/get/run + transaction + pragma no-op + close auto-persist),业务代码零改动 |
Auth: disabled 即使 --token auto |
入口没烘 token 字段 | 入口合成一个冻结 BAKED 常量,--token auto(默认)每次启动用 crypto.randomBytes(16) 现生成一次性 token 并打印;CC_PACK_TOKEN / CC_PACK_UI_PORT / CC_PACK_WS_PORT / CC_PACK_HOST 四个 env var 可覆盖 |
| Phase | Commit | 关键产出 |
|---|---|---|
| 2a | 522d7c8c9 |
BAKED 字段(projectMode/Name/Sha/Entry/AutoPersona/AllowedSubcommands/BundledDir)+ 入口 copyRecursiveMerge(新文件追加,已存在保留 + warn)+ sanitizeProjectName()(Windows 保留名、64 字符上限) |
| 2b | 69a91c450 |
web-ui-server.js 新增 GET /api/skills:返回 {schema:1, skills:[{name, source, category, ...}]},由 CLISkillLoader.loadAll() 驱动;smoke-runner 从 pre-wired 升级为实断言 |
| 3a | dce8e5d66 |
createProgram(opts) 支持 allowedCommands 白名单 / CC_PROJECT_ALLOWED_SUBCOMMANDS 环境变量过滤,未列出子命令根本不注册到 commander |
| 3b | 7633ad483 |
CC_PACK_AUTO_PERSONA 环境变量导出 + pack-manifest.json.bundledSkills 字段(收件方审计)+ Phase 8 smoke 对照返回集合 |
- 基础模式(Phase 0-3):core-db
createSqlJsCompat12 + packer 五模块 57 + 集成 6 + E2E 4(门禁) - 项目模式(v0.4 新增):
- 单元 97:allowed-commands 9 + precheck-project-mode 26 + project-assets-collector 17 + pkg-config-generator 28 + manifest-writer 9 + smoke-runner 8
- 集成 11:packer-pipeline 8 + packer-dry-run 3
- 冒烟:
runPackphase 8 自动 spawn 产物探 HTTP 200 + WS 握手 +(项目模式)/api/skills断言 bundledSkills;跨平台产物 / 旧 artifact 404 均软容忍
- 基础命令参考:docs-site/docs/chainlesschain/cli-pack.md
- 项目模式用户文档:docs-site/docs/chainlesschain/cli-pack-project.md (v0.4)
- 完整设计:docs/design/CCPACK打包指令设计文档.md (v0.4)
- CLI 索引:docs/CLI_COMMANDS_REFERENCE.md → System Management
延续 2026-04-21 的 SystemSettings / ChatPanel SFC 拆分收尾,本轮把剩余的大 SFC(MainLayout、DIDManagement)继续按功能切分,并同步完成三项"隐藏 bug 面"的根因清理:Shell 真 LLM 接入、主进程启动拆两段、重型渲染器组件懒加载。
| 大文件 | 拆分前 | 拆分后 | 新增子组件 | 路径 |
|---|---|---|---|---|
| MainLayout.vue | 3203 | 1943(−39%) | FavoriteManagerModal · HeaderBreadcrumbs · SyncStatusButton · VoiceCommandHandler · SidebarContextMenu · AppHeader | src/renderer/components/layout/ |
| DIDManagement.vue | 1390 | 543(−61%) | AutoRepublishSettingsPane · MnemonicModals · IdentityDetailsModal | src/renderer/components/did/ |
ShellComposer.vue的handleSend()不再是占位:先走sendLlmChatStream()(prompt-only,window.electronAPI.llm.queryStream)流式,失败回退sendLlmChat(payload)带 history 非流式;前置isAvailable()校验。ConversationStream.vue消息源改由useConversationPreviewStore驱动;新增 typing indicator(3 点波浪@keyframes shell-typing);移除did-chip视觉噪音。- Phase 3.4 软开关 重定向目标从
/v2改为/v6-preview(resolveHomeRedirectinrouter/v6-shell-default.ts):勾上ui.useV6ShellByDefault后根路径直接进入 Claude-Desktop 风格预览壳,而非 V2 壳;9/9 单测已同步。
bootstrapCritical()阶段 0-5(Hooks / 核心 / 文件 / LLM / 会话 / RAG+Git)阻塞 splash(5-55%)。bootstrapDeferred()阶段 6+(技能 / 工具 / 高级)splash 55-90%。- IPC 注册拆
registerCriticalIPC()+registerDeferredIPC(),setupIPC在createWindow内仅调一次 → 根因消除:原先 phase 文件里散落ipcMain.handle()与ipc-guard.resetAll()的竞态会导致llm:chat/conversation:*二次注册后"无法发送消息"。 CHAINLESSCHAIN_LEGACY_BOOT=1保留旧单阶段启动回退开关。
5 处 import 改 defineAsyncComponent:FileEditor → MonacoEditor(~5MB),KnowledgeDetailPage → Milkdown MarkdownEditor(~1.5MB),DesignEditorPage → Fabric DesignCanvas(~1MB),ProjectDetailPage → CodeEditor / MarkdownEditor / WebDevEditor。实测 monaco 独立 chunk 3.7MB / gzip 938KB,首屏不再强拉。
BackendServiceManager.waitForServices():4 路服务(9101 / 9102 / 9103 / 9090)从串行 4×30s 改并行 Promise.all,单服务 maxRetries=10;startServices() 不再阻塞启动,触发后赋值 this.servicesReady 给可选 await。
| 维度 | 命令 | 结果 |
|---|---|---|
| Store 全量 | npx vitest run src/renderer/stores/__tests__/ |
600 / 600(23 文件 · 35s) |
| Shell + router + bootstrap | npx vitest run src/renderer/shell src/renderer/shell-preview src/renderer/router/__tests__ tests/unit/bootstrap |
76 / 76(5 文件) |
| Skill-handlers + ipc-guard + bootstrap | npx vitest run tests/unit/ai-engine/skill-handlers.test.js tests/unit/core/ipc-guard.test.js tests/unit/bootstrap/initializer-factory.test.js |
285 / 285 |
| Vue 组件 | npx vitest run tests/unit/components tests/unit/core/core-components.test.ts |
124 / 125(1 skip) |
| AI + core + multi-agent | npx vitest run tests/unit/ai/skill-tool-ipc.test.js tests/unit/core tests/unit/ai-engine/multi-agent |
411 / 413(2 skip) |
| Database + enterprise + did + knowledge | npx vitest run tests/unit/database tests/unit/enterprise tests/unit/did tests/unit/knowledge |
1456 / 1464(8 skip · 3 stderr 错误为预存测试脚手架问题) |
| shell-preview(组件 / 服务 / widgets) | npx vitest run src/renderer/shell-preview |
51 / 51 |
| 集成测试(mcp / canonical / coding-agent / planning-ipc / code-execution / file-ops 等 9 文件) | npx vitest run tests/integration/... |
98 / 104(6 skip) |
| Smoke build | npm run build:renderer && npm run build:main |
✅ 两端构建成功(renderer 6m28s) |
| Lint(含改动文件) | npx eslint src/renderer/components/layout src/renderer/shell ... |
0 errors(237 style warnings,全部 vue/max-attributes-per-line 类) |
| E2E 枚举 | npx playwright test --list |
Playwright 枚举 1017 测试 / 163 文件;环境健康 80% |
🟢 无回归 bug 溢出;详见 用户文档 changelog 与 设计文档附录 C。
延续 2026-04-20 的 V6 预览壳 P9c 与 8 颗 V5→V6 探针,本轮把 Phase 3.3c 的 5 个 thin store 补齐单元测试、把 Phase 3.4 软开关(/ → /v2 opt-in)并入、并顺带修掉两个回归面暴露的遗留 bug。
| 环节 | 命令 | 结果 |
|---|---|---|
| 新增 store 单测(rag / wallet / git-hooks / workflow-designer / analytics-dashboard) | npx vitest run src/renderer/stores/__tests__/{rag,wallet,git-hooks,workflow-designer,analytics-dashboard}.test.ts |
83 例全绿(rag 12 · wallet 13 · git-hooks 14 · analytics 20 · workflow 24) |
| Store 全量回归 | npx vitest run src/renderer/stores/__tests__/ |
600 / 600 全绿 · 23 个文件 · 约 42s |
| 插件扩展点集成测 | npx vitest run tests/integration/plugin-extension-points.integration.test.js |
13 / 13 全绿(5 原 MDM override + 8 Phase 3.2 探针) |
| Phase 3.4 路由守卫单测 | npx vitest run src/renderer/router/__tests__/v6-shell-default.test.ts |
9 / 9 全绿 |
| 类型检查 | npx vue-tsc --noEmit |
0 错误(修掉一个历史 electronAPI.config 未定义 drift) |
| E2E 结构健康检查 | npm run test:e2e:check |
66 / 66 结构正确 · 10 模块分组 |
| E2E Playwright 全量 | — | 本轮未执行(需 Electron runtime 常驻进程,超出非 UI 回归范围) |
本轮 bug 修复:
src/renderer/utils/logger.ts:121— 用Promise.resolve(result).catch(...)包裹 IPC 返回,防御invoke()返回undefined时的Cannot read properties of undefined (reading 'catch')抛错。src/renderer/types/electron.d.ts— 补齐ConfigAPI类型定义,与preload/index.js:367早已暴露的config.{get,set,update,...}对齐,解决main.ts:69的 TS2339 drift。
Phase 3.3c 新增 store 索引(已在 commit 11b69d / 461d42 / c86bf4 / 4cf49ef / 8aec26 landed):
| Store | 对应 Panel | 触发 IPC 前缀 |
|---|---|---|
stores/rag.ts |
shell/KnowledgeGraphPanel.vue |
rag:get-stats · rag:rebuild-index |
stores/wallet.ts |
shell/WalletPanel.vue |
wallet:get-all · wallet:set-default |
stores/git-hooks.ts |
shell/GitHooksPanel.vue |
git-hooks:run-pre-commit · run-impact · run-auto-fix · get-config · set-config · get-history · get-stats |
stores/workflow-designer.ts |
shell/WorkflowDesignerPanel.vue |
workflow:list · workflow:create · workflow:get · workflow:save · workflow:execute · workflow:step:* 事件流 |
stores/analytics-dashboard.ts |
shell/AnalyticsDashboardPanel.vue |
analytics:get-dashboard-summary · get-time-series · get-top-n · export-{csv,json} · realtime-update 事件流 |
🟢 单测、集成、类型检查三关无 bug 溢出;两处遗留 drift 已修复;E2E 全量留待 UI 走查与手测阶段。详见 用户文档 §18.8 与 设计文档 v0.6。
在 P0–P9b 实现全部落地后,对 V6 Shell + /v6-preview 预览壳做了一轮完整回归,均在 Windows + Node 环境:
| 环节 | 命令 | 结果 |
|---|---|---|
| 单元测试(Shell + Preview + Stores) | npx vitest run tests/unit/renderer/shell src/renderer/shell/__tests__ src/renderer/shell-preview/**/__tests__ src/renderer/stores/__tests__/theme-preview.test.ts src/renderer/stores/__tests__/conversation-preview.test.ts |
92 / 92 全绿 · 9 个文件 · 25.97s |
| 集成测试(扩展点 × MDM 覆盖) | npx vitest run tests/integration/plugin-extension-points.integration.test.js |
5 / 5 全绿 · 104ms |
| 类型检查 | npx vue-tsc --noEmit |
0 错误 |
| 渲染进程构建 | npx vite build |
成功 · dist/renderer/index.html 已产出 |
E2E(tests/e2e/v6-shell/admin-console.e2e.test.ts) |
— | 跟随既有 describe.skip 约定(等 login() helper 预置 admin 权限后再开启) |
🟢 单测、集成、类型、构建四关无 bug 溢出;本轮回归未触发任何代码修复。详见 用户文档 §18.7 与 设计文档 v0.5。
在 P0–P6 基础上新增 /v6-preview 预览路由(与 /v2 并存,不替换),把桌面版外观向 Claude Desktop 对齐,并固化 4 颗差异化入口:
- 4 主题 —
src/renderer/shell-preview/themes.css提供 dark / light / blue / green(从 web-panel theme.js 移植),通过[data-theme-preview]切换 + localStorage 持久化;store:src/renderer/stores/theme-preview.ts。 - 4 颗去中心化入口(左栏底部固化) — P2P 协作 / 去中心化交易 / 去中心化社交 / U-Key 安全,绑定到 P6
slash-dispatch的 4 个builtin:open*handler。 - 三区骨架 — 左栏
ConversationList会话历史 +DecentralEntries+ 主题切换;中区留白气泡 + 极简 composer(Ctrl/Cmd+Enter 发送);右侧ArtifactDrawer从右滑入。 - 测试:
stores/__tests__/theme-preview.test.ts(11 例)+shell/__tests__/slash-dispatch.test.ts(8 例),共 19 例全部通过。 - P8 接入(同日晚):4 颗入口点击不再是占位 toast,而是在右抽屉中挂载
shell-preview/widgets/{P2p,Trade,Social,UKey}PreviewWidget.vue轻量预览卡,每卡含概览 + 2–3 按钮router.push到既有/main/*完整页(P2P 去P2PMessaging/ Trade 去TradingHub/ Social 去Chat/ UKey 去ThresholdSecurity)。widget-registry.test.ts新增 5 例。 - P9a 持久化(同日晚):新增
stores/conversation-preview.tsPinia store,把会话列表 + 消息 + 活跃 id 持久化到 localStorage(keycc.preview.conversations,带version: 1schema + 损坏/版本不匹配自动 re-seed);AppShellPreview.vue完全由 store 驱动,重启壳自动恢复上次对话。13 条 store 单测全部通过,合计 37 例全绿。 - 详细计划:
docs/design/modules/97_桌面版UI_ClaudeDesktop重构计划.md。
Electron 桌面端 /v2 路由上线对话优先 + 插件化平台新壳,完整取代旧 dashboard,阶段 P0–P6 全部落地:
- 三区布局 — 左
ShellSidebar(空间切换)/ 中ConversationStream + ShellComposer(/命令 +@引用)/ 右ArtifactPanel+ 底ShellStatusBar。 - 扩展点 7 类 + 企业能力 5 类 —
plugin.json的contributes.ui.*/contributes.provider.*贡献,通过ExtensionPointRegistry按 priority 降序选出胜出者。 - P6 分发器(本轮核心)—
slash-dispatch.ts+widget-registry.ts把 plugin 声明的handler/component字符串接上运行时行为,内置builtin:openAdminConsole+builtin:AdminShortcut。 - AdminConsole —
Ctrl+Shift+A//admin/ 状态栏齿轮三路径都能打开(4 标签页:概览 / UI 扩展点 / 企业能力 / 调试),仅admin权限账户可见。 - 企业定制三路径 — 私有 Registry(
trustedPublicKeys验签)/.ccprofile(ed25519 + per-plugin sha256 签名包,一键换肤换能力)/ MDM 推送(启动时校验解包,高 priority 胜出)。 - 13 个内置 first-party 插件 —
chat-core/notes/spaces-personal/cowork-runner/brand-default/ai-ollama-default/auth-local/data-sqlite-default/crypto-ukey-default/compliance-default/admin-console/chain-gateway/did-core。
测试:22 例单元+集成全部通过(slash-dispatch 7 / widget-registry 5 / AdminShortcut 2 / plugin-extension-points 5 / AppShell interaction 3);3 例 Playwright E2E 以 describe.skip 等 admin 权限 helper。渲染器 build 4m 52s 绿。
文档:docs-site/docs/guide/desktop-v6-shell.md(用户指南) · docs/design/桌面版UI重构_设计文档.md(设计 v0.3 P0–P6 完成)
在 iter16-iter21 的 64 个 lib 表面基础上再连续推 7 轮(iter22 → iter28),再下沉 72 个 lib 级治理表面,CLI 包升级到 0.156.0。iter22-iter26 各 8 个表面、iter27 与 iter28 各 16 个表面;全部严格沿用 4-state profile maturity × 5-state record lifecycle 双状态机骨架(auto-stale/suspend/pause/degrade/mute-idle + auto-fail-stuck),与 legacy 路径零耦合,并与既有 *-v2 前缀通过 preAction 钩子避让嵌套。
| 迭代 | 覆盖子系统(lib) | 新 V2 测试 | 命令前缀 |
|---|---|---|---|
| iter22 | automation-engine / cowork-share / did-v2-manager / knowledge-exporter / knowledge-importer / llm-providers / pqc-manager / social-manager | 8×44=352 | cc automation augov-*-v2 cc cowork shgov-*-v2 cc did-v2 dv2gov-*-v2 cc export kexpgov-*-v2 cc import kimpgov-*-v2 cc llm llmgov-*-v2 cc pqc pqcgov-*-v2 cc social smgov-*-v2 |
| iter23 | response-cache / tech-learning-engine / universal-runtime / note-versioning / permanent-memory / protocol-fusion / dbevo / decentral-infra | 8×44=352 | cc rcache rcgov-*-v2 cc tech techgov-*-v2 cc runtime rtgov-*-v2 cc note ntgov-*-v2 cc permmem pmgov-*-v2 cc fusion pfgov-*-v2 cc dbevo dbevogov-*-v2 cc infra digov-*-v2 |
| iter24 | content-recommendation / mcp-registry / plugin-ecosystem / skill-loader / token-tracker / autonomous-developer / threat-intel / ueba | 8×44=352 | cc recommend rcmdgov-*-v2 cc mcp mcpgov-*-v2 cc ecosystem ecogov-*-v2 cc skill sklgov-*-v2 cc tokens toktgov-*-v2 cc dev devgov-*-v2 cc compliance tigov-*-v2 cc compliance uebgov-*-v2 |
| iter25 | cowork-task-templates / cowork-template-marketplace / cli-anything-bridge / agent-router / sub-agent-registry / todo-manager / execution-backend / evomap-federation | 8×44=352 | cc cowork cttgov-*-v2 cc cowork ctmgov-*-v2 cc cli-anything clibgov-*-v2 cc orchestrate argov-*-v2 cc agent saregov-*-v2 cc agent todogov-*-v2 cc agent ebgov-*-v2 cc evomap evfedgov-*-v2 |
| iter26 | interactive-planner / cli-context-engineering / sub-agent-context / interaction-adapter / workflow-expr / plugin-autodiscovery / hashline / web-ui-server | 8×44=352 | cc planmode plannergov-*-v2 cc cli-anything ctxenggov-*-v2 cc agent sactxgov-*-v2 cc chat iagov-*-v2 cc workflow wfexgov-*-v2 cc plugin padgov-*-v2 cc memory hlgov-*-v2 cc ui webuigov-*-v2 |
| iter27 | downloader / skill-mcp / cowork-mcp-tools / stix-parser / sub-agent-profiles / cowork-observe / process-manager / ws-chat-handler / evomap-client / provider-options / session-core-singletons / service-manager / cowork-evomap-adapter / provider-stream / cowork-observe-html / cowork-adapter | 16×44=704 | cc setup dlgov-*-v2 cc skill smcpgov-*-v2 cc cowork cmcpgov-*-v2 cc compliance stixgov-*-v2 cc agent sapgov-*-v2 cc cowork cobsgov-*-v2 cc start pmgrgov-*-v2 cc chat wscgov-*-v2 cc evomap evcligov-*-v2 cc llm poptgov-*-v2 cc config scsgov-*-v2 cc services smgrgov-*-v2 cc cowork ceadgov-*-v2 cc stream pstrmgov-*-v2 cc cowork cohtgov-*-v2 cc cowork cadpgov-*-v2 |
| iter28 | a2a-protocol / agent-coordinator / agent-economy / autonomous-agent / chat-core / compliance-manager / cross-chain / crypto-manager / dao-governance / evolution-system / evomap-manager / hierarchical-memory / inference-network / knowledge-graph / pipeline-orchestrator / plan-mode | 16×44=704 | cc a2a a2apgov-*-v2 cc orchestrate acrdgov-*-v2 cc economy aecogov-*-v2 cc agent autagov-*-v2 cc chat ccoregov-*-v2 cc compliance cmpmgov-*-v2 cc crosschain crchgov-*-v2 cc encrypt crygov-*-v2 cc dao daomgov-*-v2 cc evolution esysgov-*-v2 cc evomap emgrgov-*-v2 cc hmemory hmemgov-*-v2 cc inference infnetgov-*-v2 cc kg kggov-*-v2 cc pipeline pipogov-*-v2 cc planmode pmodegov-*-v2 |
iter22-iter28 累计:5 轮 × 8 + 2 轮 × 16 = 72 个 lib 级治理表面,共 72 × 44 = 3,168 新 V2 单测。与 iter16-iter21 合计 136 个表面 / ~5,984 V2 单测,全栈 V2 治理表面从 156+ → 228+。
| 层 | 文件数 | 用例数 | 备注 |
|---|---|---|---|
| CLI 单元 (iter28 新增) | 16 | 704 / 704 | a2a-protocol / agent-coordinator 等 16 个新 V2 表面 |
| CLI 集成 | 40 | 696 / 696 | 与 0.151.0 持平 |
| CLI E2E | 38 | 565 / 565 | 与 0.151.0 持平 |
| 合计 (新增 + 复跑) | 94 | 1,965 / 1,965 | 零回归 |
npm:npm i -g [email protected](别名 cc / clc / clchain)
详情见 docs/design/modules/96_V2规范层governance.md §iter22-iter28。
继 0.142.0 的第九 / 第十批之后,CLI V2 规范层再连续推 6 轮(iter16-iter21),共下沉 64 个新 lib 级治理表面,CLI 包升级到 0.151.0(Tag v5.0.2.34)。所有表面统一遵循 4-state profile maturity × 5-state record lifecycle 双状态机骨架,配套 per-owner active cap、per-entity pending cap、auto-suspend-idle、auto-fail-stuck,与 legacy 路径零耦合。
| 迭代 | 覆盖子系统(lib) | 新 V2 测试 | 命令前缀 |
|---|---|---|---|
| iter16 | audit-logger / knowledge-graph / sandbox-v2 / sla-manager / stress-tester / terraform-manager / reputation-optimizer / skill-marketplace | 8×44=352 | cc audit aud-gov-*-v2 cc kg kgov-*-v2 cc sandbox sbox-gov-*-v2 cc sla slagov-*-v2 cc stress strgov-*-v2 cc terraform tfgov-*-v2 cc reputation repgov-*-v2 cc marketplace mktgov-*-v2 |
| iter17 | chat-core / claude-code-bridge / compliance-manager / cowork-learning / cowork-workflow / privacy-computing / token-incentive / hardening-manager | 8×44=352 | cc chat chatgov-*-v2 cc orchestrate ccbgov-*-v2 cc compliance cmgr-*-v2 cc cowork learn-*-v2 cc cowork cwwf-*-v2 cc privacy pcgov-*-v2 cc incentive incgov-*-v2 cc hardening hardgov-*-v2 |
| iter18 | aiops / multimodal / instinct-manager / tenant-saas / quantization / trust-security / nl-programming / perception | 8×44=352 | cc ops aiopsgov-*-v2 cc multimodal mmgov-*-v2 cc instinct instgov-*-v2 cc tenant tnsgov-*-v2 cc quantize qntgov-*-v2 cc trust trustgov-*-v2 cc nlprog nlpgov-*-v2 cc perception percgov-*-v2 |
| iter19 | code-agent / collaboration-governance / community-governance / did-manager / sso-manager / org-manager / scim-manager / sync-manager | 8×44=352 | cc codegen cdagov-*-v2 cc collab cogov-*-v2 cc governance commgov-*-v2 cc did didgov-*-v2 cc sso ssogov-*-v2 cc org orggov-*-v2 cc scim scimgov-*-v2 cc sync syncgov-*-v2 |
| iter20 | agent-network / browser-automation / dlp-engine / evomap-governance / federation-hardening / ipfs-storage / p2p-manager / wallet-manager | 8×44=352 | cc agent-network anetgov-*-v2 cc browse bagov-*-v2 cc dlp dlpgov-*-v2 cc evomap evgov-*-v2 cc federation fedgov-*-v2 cc ipfs ipfsgov-*-v2 cc p2p p2pgov-*-v2 cc wallet walgov-*-v2 |
| iter21 | activitypub-bridge / matrix-bridge / nostr-bridge / bi-engine / memory-manager / session-manager / hook-manager / workflow-engine | 8×44=352 | cc activitypub apgov-*-v2 cc matrix matgov-*-v2 cc nostr nosgov-*-v2 cc bi bigov-*-v2 cc memory memgov-*-v2 cc session sesgov-*-v2 cc hook hookgov-*-v2 cc workflow wfgov-*-v2 |
iter16-iter21 累计:6 轮 × 8 lib × 44 V2 测试 = 2,112 新 V2 单测(实际 2,816+,含 iter17-21 全 440),全栈 V2 治理表面从 92+ → 156+。
| 层 | 文件数 | 用例数 | 备注 |
|---|---|---|---|
| CLI 单元 | 332 | 14,255 / 14,255 | 含 92 个 *-v2.test.js(iter16-iter21 共 32 文件 × 44 = 1,408 新覆盖) |
| CLI 集成 | 40 | 696 / 696 | 与 0.142.0 持平 |
| CLI E2E | 38 | 565 / 565 | 与 0.142.0 持平 |
| 合计 | 410 | 15,516 / 15,516 | 零回归 |
npm:npm i -g [email protected](别名 cc / clc / clchain)
详情见 docs/design/modules/96_V2规范层governance.md §iter16-iter21。
在第八批 12 个 lib surface 基础上再推两批 V2 规范层:第九批收敛 session / 上下文 / 权限 / DI / 社交图谱 子系统(14 个 lib),第十批收敛 编排 / 自治 / 经济 / 进化 / 合规框架 / SIEM / 推理网络 / 低代码 子系统(16 个 lib)。CLI 包从 0.136.0 → 0.142.0(Tag v5.0.2.34)。所有 30 个表面严格沿用 4-state 成熟度 × 5-state 记录生命周期双状态机骨架,与 legacy 路径(SQLite 表 / 内存单例 / 传输层 / 协议层)零耦合。
30 个 V2 规范表面 — 第九批 14 个(全新 top-level 分派避让已有命令),第十批 16 个(多数 top-level,少数挂到现有命令加前缀):
| 批次 | 覆盖子系统(lib) | 新 V2 测试 | 代表命令 |
|---|---|---|---|
| 第九批 | slot-filler / web-fetch / memory-injection / session-search / session-tail / session-usage / session-hooks / mcp-scaffold / plan-mode / permission-engine / user-profile / social-graph / service-container / task-model-selector | 521(10×37 + 39 + 38 + 2×37) | cc slotfill cc webfetch cc meminj cc seshsearch cc seshtail cc seshu cc seshhook cc mcpscaf cc planmode cc perm cc uprof cc social sg-*-v2 cc svccont cc tms |
| 第十批 | orchestrator / perf-tuning / topic-classifier / iteration-budget / git-integration / cowork-task-runner / inference-network / content-recommender / app-builder / siem-exporter / autonomous-agent / compliance-framework-reporter / agent-economy / pipeline-orchestrator / evolution-system / hierarchical-memory | 704(12×45 + 4×41) | cc orchgov cc perf *-v2 cc topiccls cc itbudget cc git cc cowork runner-*-v2 cc inference cc recommend cr-*-v2 cc lowcode cc siem cc autoagent cc compliance fwrep-*-v2 cc economy cc pipeline cc evolution cc hmemory |
每个表面均遵循 V2 统一骨架:双状态机 + per-owner active cap(pending→active 仅)+ per-entity pending cap(创建记录时强制)+ stamp-once activatedAt / startedAt + auto*V2 批处理 + _resetState*V2(测试隔离)。所有 V2 action 以 -v2 后缀分派,preAction hook 通过 actionCommand.name().endsWith("-v2") bypass legacy 引导。多个 top-level 以重名规避前缀(cc seshhook vs cc hook、cc mcpscaf vs cc mcp、cc autoagent vs cc agent、cc runner-*-v2 vs Agent Coordinator、cc cr-*-v2 vs content-recommendation、cc sg-*-v2 vs social-manager、cc fwrep-*-v2 vs compliance V2)。
| 层 | 文件数 | 用例数 | 耗时 |
|---|---|---|---|
| CLI 单元 | 274 | 11718 / 11718 | 125s |
| CLI 集成 | 40 | 696 / 696 | 40s |
| CLI E2E | 38 | 565 / 565 | 360s |
| 合计 | 352 | 12979 / 12979 | 零回归 |
第九 + 第十批相较 0.136.0 累计新增 1225 个 V2 单元测试(521 + 704),总计 V2 治理表面从 62+ → 92+。
npm:npm i -g [email protected](别名 cc / clc / clchain)
详情见 docs/design/modules/96_V2规范层governance.md 与 更新日志。
第八批在 V2 governance 收口向 lib 模块(a2a-protocol / activitypub-bridge / bi-engine / browser-automation / cross-chain / dao-governance / dlp-engine / evomap-manager / matrix-bridge / nostr-bridge / session-consolidator / zkp-engine),同样沿用 4-state 成熟度 × 5-state 记录生命周期的双状态机骨架,独立于 Phase 88 / Phase 92 / Phase 95 等既有协议实现。CLI 包从 0.130.0 → 0.136.0(Tag v5.0.2.34)。
12 个 V2 规范表面(严格增量、纯内存 governance、与协议层零冲突):
| lib 模块 | Maturity / Record enum | per-owner cap | per-entity cap | 自动批处理 | V2 测试 |
|---|---|---|---|---|---|
a2a-protocol |
A2A_AGENT_MATURITY_V2 + A2A_MESSAGE_LIFECYCLE_V2 |
agent | pending message | autoRetireIdle + autoFailStuck | 40 |
activitypub-bridge |
AP_ACTOR_MATURITY_V2 + AP_ACTIVITY_LIFECYCLE_V2 |
actor | pending activity | autoRetireIdle + autoFailStuck | 39 |
bi-engine |
BI_DATASET_MATURITY_V2 + BI_QUERY_LIFECYCLE_V2 |
dataset | pending query | autoArchiveIdle + autoFailStuck | 39 |
browser-automation |
BROWSE_SESSION_MATURITY_V2 + BROWSE_STEP_LIFECYCLE_V2 |
session | pending step | autoArchiveIdle + autoFailStuck | 37 |
cross-chain |
CC_BRIDGE_MATURITY_V2 + CC_TRANSFER_LIFECYCLE_V2 |
bridge | pending transfer | autoDegradeIdle + autoFailStuck | 40 |
dao-governance |
DAO_REALM_MATURITY_V2 + DAO_PROPOSAL_LIFECYCLE_V2 |
realm | open proposal | autoArchiveIdle + autoFailStuck | 41 |
dlp-engine |
DLP_POLICY_MATURITY_V2 + DLP_INCIDENT_LIFECYCLE_V2 |
policy | open incident | autoDeprecateIdle + autoCloseStale | 40 |
evomap-manager |
EVOMAP_HUB_MATURITY_V2 + EVOMAP_SUBMISSION_LIFECYCLE_V2 |
hub | pending submission | autoArchiveIdle + autoFailStuck | 39 |
matrix-bridge |
MX_ROOM_MATURITY_V2 + MX_EVENT_LIFECYCLE_V2 |
room | pending event | autoArchiveIdle + autoFailStuck | 37 |
nostr-bridge |
NOSTR_RELAY_MATURITY_V2 + NOSTR_EVENT_LIFECYCLE_V2 |
relay | pending event | autoDegradeIdle + autoFailStuck | 39 |
session-consolidator |
CONSOL_PROFILE_MATURITY_V2 + CONSOL_JOB_LIFECYCLE_V2 |
profile | pending job | autoArchiveIdle + autoFailStuck | 38 |
zkp-engine |
ZKP_CIRCUIT_MATURITY_V2 + ZKP_PROOF_LIFECYCLE_V2 |
circuit | pending proof | autoArchiveIdle + autoFailStuck | 41 |
每个表面均遵循 V2 统一骨架:双状态机 + per-owner active cap(pending→active 仅)+ per-entity pending cap(创建记录时强制)+ stamp-once activatedAt / startedAt + auto*V2 批处理 + _resetState*V2(测试隔离)。所有 V2 action 以 -v2 后缀分派,preAction hook 通过 actionCommand.name().endsWith("-v2") bypass legacy 数据库引导。
| 层 | 文件数 | 用例数 | 耗时 |
|---|---|---|---|
| CLI 单元 | 244 | 10493 / 10493 | 124s |
| CLI 集成 | 40 | 696 / 696 | 40s |
| CLI E2E | 38 | 565 / 565 | 352s |
| 合计 | 322 | 11754 / 11754 | 零回归 |
本批相较 0.130.0 累计新增 470 个 V2 单元测试(12 个 lib 模块之和)。
npm:npm i -g [email protected](别名 cc / clc / clchain)
详情见 docs/design/modules/96_V2规范层governance.md 与 更新日志。
在第六批 13 个运行时管家的基础上,把 V2 规范层推进到 9 个编排层模块:SSO / Workflow / Router / Hook / MCP / Coord / Sub-Agent / ExecBE / Todo。CLI 包从 0.123.0 → 0.130.0(Tag v5.0.2.34)。每个表面严格独立于 legacy SQLite / 传输层,保持 preAction bypass、双状态机、per-owner + per-entity caps 三层骨架。累计新增 345 个 V2 单元测试。
第五批(0.106.0,collab + UEBA + threat-intel)当天晚些时候再推一轮,把 13 个运行时管家模块全部拉通 V2 规范表面。CLI 包从 0.106.0 → 0.130.0(Tag v5.0.2.10)。
13 个 V2 规范表面(严格增量、向后兼容,全部基于内存 governance 层,与遗留 SQLite/ 文件态独立):
| 模块 | Maturity / Work-unit enum | 人均 active cap | 人均 pending cap | 自动批处理 |
|---|---|---|---|---|
cc automation V2 |
AUTOMATION_MATURITY_V2 + EXECUTION_LIFECYCLE_V2 |
per-owner 20 | per-flow 30 | autoPause + autoCancel |
cc instinct V2 |
PROFILE_MATURITY_V2 + OBSERVATION_LIFECYCLE_V2 |
per-user 5 | per-profile 100 | autoDormant + autoDiscard |
cc memory V2 |
ENTRY_MATURITY_V2 + CONSOLIDATION_LIFECYCLE_V2 |
per-owner 200 | per-owner 20 | autoStale + autoSupersede |
cc note V2 |
NOTE_MATURITY_V2 + REVISION_LIFECYCLE_V2 |
per-author 100 | per-note 50 | autoStale + autoDiscard |
cc org V2 |
ORG_MATURITY_V2 + MEMBER_LIFECYCLE_V2 |
per-owner 10 | per-org 500 | autoSuspend + autoExpire |
cc permmem V2(新命令组) |
PIN_MATURITY_V2 + RETENTION_JOB_LIFECYCLE_V2 |
per-owner 100 | per-pin 10 | autoDormant + autoCancel |
cc rcache V2(新命令组) |
PROFILE_MATURITY_V2 + REFRESH_JOB_LIFECYCLE_V2 |
per-owner 25 | per-profile 4 | autoSuspend + autoFail |
cc scim V2 |
IDENTITY_LIFECYCLE_V2 + SYNC_JOB_V2 |
per-tenant 5000 | per-idp 50 | autoSuspend + autoFail |
cc session V2 |
CONVERSATION_MATURITY_V2 + TURN_LIFECYCLE_V2 |
per-user 20 | per-session 100 | autoIdle + autoFail |
cc social V2 |
RELATIONSHIP_MATURITY_V2 + THREAD_LIFECYCLE_V2 |
per-user 1000 | per-user 500 | autoMute + autoArchive |
cc sync V2 |
RESOURCE_MATURITY_V2 + SYNC_RUN_V2 |
per-owner 50 | per-resource 20 | autoPause + autoFail |
cc tokens V2 |
BUDGET_MATURITY_V2 + USAGE_RECORD_LIFECYCLE_V2 |
per-owner 10 | per-budget 10000 | autoExhaust + autoCommit |
cc wallet V2 |
WALLET_MATURITY_V2 + TX_LIFECYCLE_V2 |
per-user 10 | per-wallet 100 | autoFreeze + autoCancel |
每个模块都遵循同一骨架:register*V2 / get*V2 / list*V2 / set*StatusV2 + 状态快捷设置器、per-owner active cap + per-container pending cap、stamp-once activatedAt / lifecycle 时间戳、auto* 批处理方法、get*StatsV2 及 _resetState*V2(测试隔离)。cc rcache 与 legacy LRU cc tokens cache 并存不冲突。
| 层 | 文件数 | 用例数 | 耗时 |
|---|---|---|---|
| CLI 单元 | 232 | 9219/9229(10 skipped) | ~130s |
| CLI 集成 | 40 | 696/696 | 38s |
| CLI E2E | 38 | 565/565 | 427s |
| Desktop 单元(core+database) | 15 | 836/846(10 skipped) | 141s |
| Desktop 单元(renderer stores) | 16 | 486/486 | 25s |
| Desktop 单元(ai-engine sample) | 3 | 265/346(81 skipped) | 28s |
本批相较 0.106.0 累计新增 560 个 V2 单元测试(automation 46 + instinct 48 + memory 47 + note 49 + org 43 + permanent-memory 46 + response-cache 46 + scim 39 + session 33 + social 34 + sync 39 + token-tracker 49 + wallet 41),零回归。
npm:npm i -g [email protected](别名 cc / clc / clchain)
紧接昨日 0.104.0 的第四批 V2 增量,今日推进第五批:cc collab + cc compliance ueba + cc compliance threat-intel 三条命令族叠加 V2 规范表面。CLI 包从 0.104.0 → 0.106.0(Tag v5.0.2.10)。
3 个 V2 规范表面(严格增量、向后兼容):
cc collabV2:4-state Agent 成熟度 (provisional/active/suspended/retired,suspended→active恢复) + 5-state 提案生命周期 (draft/voting/approved/rejected/withdrawn,3 终态),per-realm active-agent cap = 10、per-proposer voting-proposal cap = 3,autoRetireIdleAgentsCgV2+autoWithdrawStuckProposalsV2。cc compliance uebaV2:4-state baseline 成熟度 (draft/active/stale/archived,stale→active恢复) + 5-state investigation 生命周期 (open/investigating/closed/dismissed/escalated,3 终态),per-owner active-baseline cap = 20、per-analyst open-investigation cap = 10(在openInvestigationV2创建时强制),autoMarkStaleBaselinesV2+autoEscalateStuckInvestigationsV2。cc compliance threat-intelV2:4-state Feed 成熟度 (pending/trusted/deprecated/retired,deprecated→trusted恢复) + 5-state Indicator 生命周期 (pending/active/expired/revoked/superseded,3 终态),per-owner active-feed cap = 15、per-feed active-indicator cap = 500,autoDeprecateIdleFeedsV2+autoExpireStaleIndicatorsV2。V2 层叠加在 SQLite IoC catalog 之上,与遗留importStixBundle/matchObservable完全独立。
本批相较 0.104.0 累计新增 107 个 V2 单元测试(collab 37 + ueba 29 + threat-intel 41),零回归。
同日晚再推一轮,把并行会话落地的 7 个全新 CLI 命令组 和 8 个现有命令的 V2 强化 合并发布到 [email protected](tag v5.0.2.34)。
7 个新命令组:agent-network(Phase 24)· automation(Phase 96)· didv2(Phase 55)· perf(Phase 22)· pipeline(Phase 26)· ecosystem(Phase 64)· sso(Phase 14)· social graph(Phase 42 新增分析子命令)
8 个 V2 强化(严格增量,向后兼容):dao(Phase 92 二次投票 + 防环委托 + 时锁)· economy(Phase 85 状态通道 + NFT)· evolution(Phase 100 6 维能力 + 4 级诊断)· hmemory(Phase 83 4 层 + 概念语义搜索)· sandbox(Phase 87 5 级风险 + 自动隔离)· workflow(Phase 82 检查点 + 正则安全断点)· zkp(Phase 88 3 方案参数化证明)
| 层 | 文件数 | 用例数 | 耗时 |
|---|---|---|---|
| CLI 单元 | 232 | 7618/7618 | 129s |
| CLI 集成 | 40 | 696/696 | 46s |
| CLI E2E | 38 | 565/565 | 427s |
本批相较 0.51.0 新增 536 个单元测试,全部通过;集成 / E2E 零回归。
npm:npm i -g [email protected](别名 cc / clc / clchain)
延续本日早些时候的 CLI 端口批次,把 Phase 17 / 20 / 27 / 28 / 63 五个 Phase 合并到同一轮 npm 发布。
- Phase 17 IPFS 去中心化存储 —
cc ipfs node-start/add/get/pin/gc/set-quota/attach-knowledge,确定性 bafy CID + AES-256-GCM + 配额/GC + 知识库附件,64 tests - Phase 20 模型量化 —
cc quantize,GGUF 14 级 + GPTQ 目录 + 作业生命周期(pending→running→completed/failed/cancelled)+ 进度追踪,48 tests - Phase 27 多模态协作 —
cc mm session/stream/track/snapshot,CRDT 风格会话状态 + 5 模态/7 文档格式/6 输出格式参考目录,68 tests - Phase 28 自然语言编程 —
cc nlprog classify/extract/detect-stack/translate/refine/convention-add/conventions/stats,启发式双语意图/实体/技术栈识别 + 翻译/惯例 CRUD,62 tests - Phase 63 统一应用运行时 —
cc runtime,OS/容器/云环境能力检测 + 自适应资源分配策略 + 运行时统计,60 tests
npm 发布:v5.0.2.31 / 0.48.0 → v5.0.2.32 / 0.49.0 → v5.0.2.33 / 0.51.0(三次独立 publish)。 npm i -g [email protected] 即可拿到本批全部能力。
| 层 | 文件数 | 用例数 | 耗时 |
|---|---|---|---|
| CLI 单元 | 232 | 7082/7082 | 210s |
| CLI 集成 | 40 | 696/696 | 76s |
| CLI E2E | 38 | 565/565 | 459s |
用户文档:cli-ipfs · cli-quantize · cli-mm · cli-nlprog · cli-runtime 设计文档:17 IPFS 去中心化存储 · 27 多模态协作 · 63 统一应用运行时
本轮聚焦 CLI 侧五大 Phase 的收口、测试回归和文档重构:
- Phase 25 AIOps —
cc ops异常检测 (Z-Score/IQR) + 事件生命周期 + playbook + postmortem,48 tests - Phase 58 联邦硬化 —
cc federation熔断器状态机 (closed/open/half_open) + 健康检查 + 连接池,59 tests - Phase 80 数据库演进 —
cc dbevo迁移 CRUD + 慢查询分析 + 索引建议,47 tests - Phase 84 多模态感知 —
cc perception记录/索引/跨模态查询 + 语音会话状态机,47 tests - Phase 86 代码生成 Agent 2.0 —
cc codegen生成追踪 + 5 条启发式安全规则 + 脚手架记录,38 tests
文档重构:docs/CLI_COMMANDS_REFERENCE.md 由 54.8k → 4.4k 精简索引;完整命令清单拆到 docs/cli/ 6 个子文件 (core-phases / managed-agents / blockchain-enterprise / observability / platform / video),命令注释全量中文化 (~371 条)。新增 docs-site 页面 cli-federation.md / cli-perception.md + VitePress 侧栏。
| 层 | 文件数 | 用例数 | 耗时 |
|---|---|---|---|
| CLI 单元 | 219 | 6010/6010 | 114s |
| CLI 集成 | 40 | 696/696 | 36s |
| CLI E2E | 38 | 565/565 | 495s |
E2E 运行期间 vitest-worker 触发一次
Timeout calling "onTaskUpdate"RPC 超时告警(vitest 长跑套件已知问题),不影响任何用例结论。
用户文档:docs-site/docs/chainlesschain/cli-federation · cli-perception · cli-codegen · cli-dbevo · cli-ops
设计文档:30 联邦强化 · 25 自治运维 · 45 数据库演进 · 49 多模态感知 · 51 代码生成 Agent 2.0
对 Anthropic Claude Managed Agents + Deep Agents Deploy 做本地优先版本的运行时对标。新增共享包 @chainlesschain/session-core,把 Session / Trace / Team-Subagent / Scoped Memory / Approval Policy / Beta Flags / Stream Router / Service Envelope / MCP Policy / Sandbox Policy / Agent Bundle 抽到 CLI 与 Desktop 可共用的一层。
- session-core 21 个测试文件,452/452 tests — 涵盖 SessionHandle、SessionManager、MemoryStore、MemoryConsolidator、ApprovalGate、BetaFlags、StreamRouter、TraceStore、SharedTaskList、ServiceEnvelope、MCPPolicy、SandboxPolicy、AgentBundle、QualityGate
- Hosted Session API —
cc serveWS 网关 17 req/resp + 2 streaming 路由(stream.run+sessions.subscribe),统一<type>.response信封 - CLI session/usage 命令 —
cc session tail/usage/lifecycle/park/unpark/end、三端 (Ollama/OpenAI/Anthropic) 自动 token 记账 - Desktop IPC 收口 — 21 IPC channels(session lifecycle + memory + beta + usage + subscribe),Pinia store + SessionCorePage Usage tab
- Phase J — Hosted Tool ApprovalGate 合流 —
_executeHostedTool走evaluateToolCallWithApprovalGate,closeSessionfire-and-forget_autoConsolidate(trace → MemoryStore),不破坏现有 Permission Gate / Plan Mode 行为 - Phase J+ — Renderer/CLI 对称提示 + 防御 —
latestApprovalDeniedEventPinia getter(按payload.source === "approval-gate"过滤)、AIChatPage.vuesticky alert + toast、policy=strict时引导用户放宽 session policy;新增 Round 4 regression guard 锁定事件类型碰撞修复 - Permission Gate × ApprovalGate ADR — 两层正交(capability vs policy)共存,
91_Managed_Agents对标计划第四节末已记录"完全替换 Permission Gate"决定为 won't-do - Desktop/CLI 对称持久化 — 共用
parked-sessions.json / memory-store.json / beta-flags.json / approval-policies.json
| 层 | 范围 | 通过 |
|---|---|---|
| 共享包 | @chainlesschain/session-core (21 files) |
452/452 |
| CLI 单元 | ws-session-core (25) + agent-core (95) + chat-core-usage (10) + session-* (22) + singletons (10) + agent-repl (41 + ApprovalGate hint) | 203/203 |
| CLI 集成 | managed-agents + parity + shims + doc-creator | 696/696 |
| CLI E2E | managed-agents + full e2e suite | 562/562 |
| Desktop | session-core-ipc (23) + coding-agent-session-service (38) + tool-adapter (8) + sandbox-v2 (41) + coding-agent store (30) | 140/140 |
用户文档:docs-site/docs/chainlesschain/managed-agents-parity 设计文档:docs/design/modules/91_Managed_Agents对标计划 | 92_Deep_Agents_Deploy
对 packages/cli Agent Runtime 做 vercel-labs/open-agents(2025-12)的系统性对标补齐。既有优势(edit_file_hashed / git 工具 / FTS5 搜索 / 138 skills / sub-runtime-pool / 4 层记忆 / Hooks 三件套)保持不动,只补齐五个维度的空白:
- Phase 1 — 3 个 agent 工具:
web_fetch(SSRF 默认拒绝私网 + markdown 输出)、todo_write(会话级存储 + 单 in_progress 约束)、ask_user_question(结构化提问暂停 agent)。AGENT_TOOLS 从 13 扩到 16 - Phase 2 — Skill
$ARGUMENTS:SKILL.md body 支持$ARGUMENTS/$1..$N占位符 +Skill directory: <abs>自动前置 - Phase 3 — Sub-agent Profiles:声明式
explorer/executor/designregistry,spawn_sub_agent契约新增profile字段,profile 提供toolAllowlist+systemPrompt+maxIterations默认 - Phase 4 — prepareCall turn-scoped context:agent-core 每轮 LLM 调用前注入 transient system suffix(cwd/git branch@sha+dirty/sessionId/iteration),不污染持久化历史
- Phase 5 — Provider-options 三层深合并:
mergeProviderOptions(provider, modelId, callOverrides)— defaults ← modelId 推断 ← callOverrides;undefined显式擦除字段语义
| 层 | 范围 | 通过 |
|---|---|---|
| 单元 | sub-agent-profiles / turn-context / provider-options / agent-core-prepare-call / todo-manager / web-fetch / skill-loader-arguments | 95/95 |
| 集成 | parity-open-agents-loop.test.js(chatFn mock + 每轮 suffix + todo/web_fetch 端到端) |
4/4 |
| E2E | parity-open-agents.test.js(spawn CLI 真二进制 + 模块导入检查) |
9/9 |
| 小计 | 3 层 | 108/108 新增,217/217 累计,0 回归 |
用户文档:docs-site/docs/design/modules/88-open-agents-parity 设计文档:docs/design/modules/88_OpenAgents对标补齐方案
对 packages/cli 的 Cowork 多智能体协作系统做一轮端到端演进,把 2026-04-14 规划的 F1–F9 九项特性全部实现:
- F3 模板市场 (
cowork-template-marketplace.js) — 本地模板层(内置 10 + 用户自建),cowork template search|install|list|remove|publish - F4 定时调度 (
cowork-cron.js) — 5 字段 POSIX cron,JSONL 持久化,cowork cron list|add|remove|enable|disable|run - F5 Android 远程技能 — 新增
pc-cowork-daily/pc-cowork-workflowREMOTE SKILL,手机通过 P2P 调用桌面,无需本地 LLM - F6 MCP 工具挂载 — 模板
mcpServers字段声明式挂载 MCP,会话期间 mount/unmount - F7 Workflow DAG (
cowork-workflow.js) — 依赖解析 + Kahn 拓扑排序 + 批次并行 + 占位符替换 +continueOnError降级 - F8 P2P 分享 (
cowork-share.js) — canonical-JSON + SHA-256 校验包,模板/结果包导出导入 - F9 历史学习 (
cowork-learning.js) — token 重叠 × successRate 无 ML 推荐,失败归因 - F1 Orchestrator 并行 + F2 Debate 评审 — 运行器扩展路径
新命令树:cowork {debate|compare|analyze|template|cron|workflow|share|learning|status}。全部 headless,_deps 注入模式保证可测,统一持久化到 .chainlesschain/cowork/*.jsonl。
| 层 | 范围 | 通过 |
|---|---|---|
| 单元 | cowork-learning.test.js / cowork-workflow.test.js / cowork-share.test.js |
57/57 |
| 集成 | cowork-evolution-workflow.test.js(mkdtemp 真 fs,覆盖 marketplace↔registry / share 往返 / learning 真 JSONL / workflow e2e / cron) |
12/12 |
| E2E | cowork-evolution-commands.test.js(spawn CLI 真二进制,learning/workflow/share 全子命令 + 错误路径) |
14/14 |
| 小计 | 3 个新模块 + 2 个测试文件 | 83/83 |
累计 cowork 测试 168(既有 template-marketplace 17 + cron 31 + task-runner 63 + 本次新增 57)。版本号 packages/cli/package.json 升到 0.46.0。
用户文档:docs-site/docs/chainlesschain/cli-cowork 设计文档:docs-site/docs/design/modules/86-web-cowork(末尾「2026-04-15 Cowork Evolution」实施记录 + 「十一、未来演进」N1–N7 新规划)
对 84 个设计文档与实际代码进行全面比对,补全 7 处文档-代码差距,所有功能从 mock/占位符升级为真实实现:
- Nostr WebSocket 真实连接: 替换 mock 对象为真实
wsWebSocket,完整 NIP-01 消息处理(EVENT/EOSE/OK/NOTICE),指数退避自动重连(1s→60s) - Low-Code Deploy 命令: 实现静态站点生成(index.html + app.js + style.css),支持
--output指定输出目录,应用状态自动更新为deployed - ZKP 真实证明逻辑: BN254 有限域(256-bit)上的 R1CS 约束系统 + Fiat-Shamir 启发式证明,替换
mock-a-/mock-b-/mock-c-占位符,verifyProof()实现真实验证 - 隐私计算真实算法: FedAvg 加权梯度聚合 + Shamir 秘密共享(128-bit 素数域 + Lagrange 插值)+ Laplace 噪声差分隐私
- 协作引擎好友可见性: 查询
friends表检查双向好友关系,替换邀请检查 fallback - Filecoin 存储证明: PoRep/PoSt 证明验证 + SHA-256 承诺检查 + 交易续约 + 条件查询
- TTS 模型自动下载: HTTPS 下载 + 重定向跟随 + 事件进度通知 + 断点检测
| 层 | 范围 | 通过 |
|---|---|---|
| 单元 | zkp-engine / privacy-computing / filecoin-storage / nostr-bridge-ws / local-tts-client / app-builder / collab-engine | 139/139 |
| 集成 | crypto-privacy / filecoin-nostr / lowcode-deploy | 17/17 |
| E2E | gap-fill-commands(CLI 端到端) | 10/10 |
| 小计 | 10 文件 | 166/166 |
修改 9 个源文件,新增 10 个测试文件。同步更新用户文档(docs-site)和设计文档。
详细设计:docs/design/modules/85_文档代码差距补全.md
对标 Nous Research Hermes Agent,系统性补齐 CLI Agent 的 6 项高影响力差距,全部向后兼容,纯 CLI 侧实现:
- Phase 1 迭代预算:
IterationBudget共享引用替换硬编码MAX_ITERATIONS=15,默认 50,父子 Agent 共享同一实例,70%/90%/100% 三级渐进警告,CC_ITERATION_BUDGET环境变量可配 - Phase 2 跨会话 FTS 搜索:SQLite FTS5 虚拟表
session_fts,/search <query>REPL 命令,search_sessionsAgent 工具,SessionEnd钩子自动索引,reindexAll()回填 - Phase 3 USER.md + 冻结提示词:
~/.chainlesschain/USER.md持久用户画像(2000 字符上限 + AI 凝练),注入上下文工程 instinct/memory 之间,系统提示词会话级冻结不可变,/profileREPL 命令 - Phase 4 零摩擦插件加载:扫描
~/.chainlesschain/plugins/*.js,自动注入 tools/hooks/commands,DB 注册插件优先覆盖同名文件插件 - Phase 5 Docker/SSH 执行后端:
ExecutionBackend抽象层 +createBackend()工厂,Local/Docker(exec+run)/SSH 三种后端,run_shell/run_code透明路由 - Phase 6 消息网关:
GatewayBase会话管理 + 限流 + 响应分片,Telegram MarkdownV2 formatter,Discord 2000 字符分割 +codeBlock/quoteBlock辅助
本轮测试矩阵:
| 层 | 范围 | 通过 |
|---|---|---|
| 单元 | iteration-budget / session-search / user-profile / plugin-autodiscovery / execution-backend / gateway-base | 206/206 |
| 集成 | hermes-parity-workflow(6 Phase 跨模块协作) | 25/25 |
| E2E | hermes-parity-commands(CLI 端到端全链路) | 22/22 |
| 小计 | 8 文件 | 253/253 |
新增 8 个源文件(~1400 行),修改 9 个现有文件,新增 REPL 命令 /search、/profile。
详细设计:docs/design/modules/85_Hermes_Agent对标实施方案.md / 用户文档 / 英文设计文档。
CLI Runtime 收口路线图(docs/design/modules/82_CLI_Runtime收口路线图.md)Phase 0–7 全部落地,统一 Coding Agent envelope 协议 v1.0 在 CLI / Desktop / Web UI 三端达成字节级对齐:
- 8 步 parity 测试矩阵全绿(91 tests):envelope 契约 / sequence tracker / legacy↔unified 双向映射 / WS server 透传 / JSONL session store / SubAgentContext worktree 隔离 / mock LLM provider / desktop bridge envelope parity
- shim 明确标注:
src/lib/agent-core.js(26L) /src/lib/ws-server.js(16L) /src/lib/ws-agent-handler.js(12L) 全部降级为 @deprecated 薄 shim,canonical 实现收归src/runtime/与src/gateways/ws/ - 新增测试:
packages/cli/__tests__/integration/parity-envelope-bridge.test.js(58 tests)覆盖createCodingAgentEvent/CodingAgentSequenceTracker/wrapLegacyMessage/unwrapEnvelope全路径 - 收口完成定义 5 项准则全部达成:单一入口 · envelope 协议统一 · parity harness 全绿 · shim 迁移窗口标注 · 文档同步
详情见 82 路线图 §8 完成定义与 CHANGELOG.md Unreleased 段。
继规范工作流 Phase A–D 之后,本轮把 ADR LIGHTWEIGHT_MULTI_AGENT_ORCHESTRATION 的 Phase E 智能路由 主线一次性落地:
- Intake classifier (纯函数):
desktop-app-vue/src/main/ai-engine/code-agent/intake-classifier.js— 输入{ request, scopePaths, fileHints, sessionId },输出{ decision: "ralph"|"team", confidence, complexity, scopeCount, boundaries, testHeavy, signals, reason, recommendedConcurrency, suggestedRoles }。支持 monorepo 边界检测 (desktop-app-vue/src/main/src/renderer/packages/cli/backend/*等);多作用域 →$team,单作用域 →$ralph。非强制门控 — 仅作为routingHint建议。 - 持久化到
mode.json:SessionStateManager.setRoutingHint()通过_updateModemerge-write,$deep-interview写入intent.md后自动落盘;hint 跨阶段存活 (ralplan→approve→ralph/team都能读到)。classifier 抛错不会阻塞 happy path,routingHint 降级为null。 - IPC 只读通道:
workflow-session:classify-intake— Renderer 可在已有 session 上二次触发 classifier,自动从tasks.json的scopePaths聚合作用域。 - Renderer 可视化:
CanonicalWorkflowPanel.vue展示routingHint(decision tag / complexity / confidence / scopeCount / recommendedConcurrency / reason / suggestedRoles); Pinia storeuseWorkflowSessionStore新增classifyIntake()action 和lastClassificationstate。
本轮回归:
| 层 | 范围 | 通过 |
|---|---|---|
| Main 单元 (classifier) | intake-classifier.test.js |
20/20 |
| Main 单元 (IPC) | workflow-session-ipc.test.js (含 classify-intake) |
18/18 |
| Main 单元 (handler) | workflow-skills.test.js (含 routingHint 持久化 / 容错) |
55/55 |
| Renderer store 单元 | workflow-session.test.ts (含 classifyIntake 3 用例) |
13/13 |
| Main 集成 | coding-workflow.integration.test.js Phase E describe |
10/10 |
| E2E 集成 (handler → store) | canonical-workflow-phase-e.integration.test.js |
7/7 |
| 小计 | 6 套 | 123/123 |
关键设计:classifier 以 routingHint 非门控字段存在,_updateMode merge-write 让 hint 自动
跨阶段存活,loadFullState 直接返回完整 mode,IPC/Renderer 零改动即可消费。
详细设计:docs/design/modules/80_规范工作流系统.md / 81_轻量多Agent编排系统.md §10 Phase E / docs-site 镜像 / ADR: LIGHTWEIGHT_MULTI_AGENT_ORCHESTRATION_ADR.md。
继最小 Harness 之后,本轮把 Coding Agent 推进到 Phase 5 持久化任务图 + 编排器 主线,三层贯穿全部落地:
- CLI runtime:
agent-core内置任务图模型(DAG 节点 + 状态机 + 拓扑序),session-protocol新增 5 条消息task-graph-create/task-graph-add-node/task-graph-update-node/task-graph-advance/task-graph-state,全部以统一信封返回;新增自动完成 / 失败传播 /becameReady语义。 - Desktop main:
CodingAgentBridge暴露createTaskGraph/addTaskNode/updateTaskNode/advanceTaskGraph/getTaskGraph5 个方法(自动拆封 9 类task-graph.*事件),CodingAgentSessionService暴露领域 API,coding-agent-ipc-v3新增 5 条 IPC 通道。 - Renderer:
stores/coding-agent.ts新增taskGraphs: Record<sessionId, CodingAgentTaskGraph>状态、currentSessionTaskGraph/currentSessionReadyTaskNodesgetters、5 个 actions、9 类 lifecycle 事件订阅;TypeScript 严格模式下完全可用。
本轮回归(按层):
| 层 | 范围 | 通过 |
|---|---|---|
| CLI 单元 | agent-core / ws-agent-handler |
109/109 |
| CLI 集成 | ws-session-workflow |
52/52 |
| CLI E2E | coding-agent-envelope-roundtrip(含任务图全链路) |
10/10 |
| Desktop main 单元 | coding-agent-bridge / coding-agent-ipc-v3 / coding-agent-session-service |
96/96 |
| Desktop 集成 | coding-agent-lifecycle |
24/24 |
| Desktop E2E | coding-agent-bridge-real-cli(真实 chainlesschain serve 子进程) |
3/3 |
| Renderer 单元 | coding-agent store / AIChatPage |
91/91 |
| 小计 | 7 套 | 385/385 |
修复的 bug:tests/integration/coding-agent-bridge-real-cli.test.js 中 session-created / session-list-result / result 三处类型断言为 v1.0 信封落地前的旧值,已对齐为 session.started / session.list / command.response。
详细设计、协议、测试矩阵:docs/design/modules/79_Coding_Agent系统.md §12.5 / docs-site 镜像。
在 v1.0 统一信封落地后,本轮把 Coding Agent 的 Phase 5 最小 Harness 和 真实 interrupt 语义 主线收口:
- 真实中断:
coding-agent:interrupt不再是close-session别名。新增共享packages/cli/src/lib/abort-utils.js(AbortError/throwIfAborted/isAbortError),CLIws-agent-handler在每个 turn 建立AbortController,agent-core/interaction-adapter感知到 abort 后会立即释放 pending 审批 / 工具调用、发出session.interrupted,session 本身仍保留可继续使用。 - 最小 Harness 主线:
CodingAgentSessionService.getHarnessStatus()聚合sessions/worktrees/backgroundTasks,新增list-background-tasks/get-background-task/get-background-task-history/stop-background-task四条 IPC,Desktop main → bridge → IPC v3 → preload → renderer store → AIChatPage 全链路补齐。 - Desktop Harness 面板:
AIChatPage.vue新增 Coding Agent Harness 面板,展示会话 / worktree / 后台任务概览,支持 Refresh、View Details(详情 + 历史)、Stop Task。 - AIChatPage 点分小写事件迁移:页面兼容共享 dot-case 事件协议,
tool.call.*/assistant.final/approval.*全部打通。
本轮定向回归结果:
interrupt主线(CLI agent-core / ws-agent-handler / interaction-adapter / abort-utils):6 files, 175 passed- Phase 5 最小 harness(Desktop session-service / bridge / IPC v3 / renderer store / 集成):
5 files, 84 passed - AIChatPage harness 面板 + dot-case 事件页面回归:
tests/unit/pages/AIChatPage.test.js 69/69 - CLI
coding-agent-envelope-roundtripE2E:7/7 - CLI
ws-session-workflow集成:20/20
2026-04-08 文档对齐回归(修改文件全量定向):
| 类型 | 范围 | 通过 |
|---|---|---|
| CLI 单元 | agent-core / sub-agent-registry / ws-agent-handler |
126/126 |
| Desktop main 单元 | coding-agent-bridge / coding-agent-ipc-v3 / coding-agent-session-service |
77/77 |
| Renderer 单元 | coding-agent store / AIChatPage |
81/81 |
| CLI 集成 | ws-session-workflow |
32/32 |
| Desktop 集成 | coding-agent-lifecycle |
18/18 |
| CLI E2E | coding-agent-envelope-roundtrip(真实 spawn chainlesschain serve + WS) |
7/7 |
| 小计 | 6 套 | 341/341 |
无 bug 修复,全部测试一次通过。详细设计与 IPC 列表:docs/design/modules/79_Coding_Agent系统.md / 用户文档 docs-site/docs/chainlesschain/coding-agent.md。
2026-04-08 文档补齐(Phase 5 扩展能力):用户文档 + 设计文档此前只覆盖最小 harness,本轮补齐 子代理委派 / review mode / patch preview / diff 总结 / 持久化任务图与编排器 四类 Phase 5 CLI 扩展能力的协议、事件、WS 消息与数据结构说明。详见 coding-agent.md "Phase 5 — 高阶 Harness" 与 设计模块 79 §Phase 5 扩展能力详细设计。
这轮不是只做版本号和测试数字同步,而是把前面几次落地的 Agent Runtime、Web Panel、协议与文档重新收束成一致状态,并补回被压短的入口说明。
本次已经完成并在代码中可用的能力包括:
- Coding Agent 统一事件信封 v1.0 已在 CLI runtime / Desktop main / Web UI 三端落地:所有 WebSocket / IPC 响应共享
{ version, eventId, type (点分小写), requestId, sessionId, source, payload }外壳;DesktopCodingAgentBridge实现拆封 + 双 awaitTypes 灰度迁移,Web UI 通过web-ui-envelope.js提供 31 条UNIFIED_TO_LEGACY映射 + 浏览器内联兼容。详见 docs/design/modules/79_Coding_Agent系统.md §5.7。 - 后台任务支持分页历史检索、任务详情摘要、重启恢复和多节点恢复策略基础能力。
- Worktree 冲突处理支持文件级摘要、自动化解决候选项和 diff 预览入口。
- 压缩观测支持时间窗口筛选,以及按
provider/model维度切片统计。 - 会话迁移支持目录级 dry-run 报告、迁移后抽样校验和失败重试。
JSONL_SESSION已默认启用。- 后台任务完成后会通过
task:notification实时通知 Web Panel。 - Worktree 合并助手已支持 diff 预览和一键合并协议。
- 压缩策略 A/B 测试已通过
featureVariant()接入。
本轮与当前代码对齐的验证结果:
- CLI 定向单元测试:
130/130 - CLI 定向集成测试:
19/19 - CLI
ws-session-workflow集成:19/19 - CLI
ws-runtime-events单元(envelope v1.0 发射):16/16 - CLI
web-ui-envelope单元(UNIFIED_TO_LEGACY + 浏览器内联源):28/28 - CLI
coding-agent-envelope-roundtripE2E(真实 spawnchainlesschain serve+ WebSocket):7/7 - Web Panel 单元测试:
523/523(含 v1.0 envelope 兼容 + 23 页面解析逻辑) - Web Panel 集成测试:
40/40(web-ui-server + CLI 命令集成) - Web Panel E2E:
12/12(WS 协议兼容)+46SPA 路由 + 资源文件测试 - Desktop Coding Agent 桥接全链路:
94/94(含 9 个 v1.0 信封拆封新增用例) - Coding Agent 统一信封 v1.0 三端总测试:
408/408 - Web Panel 构建:通过
- Docs Site 构建:通过
如果你是第一次进入仓库,建议按这个顺序阅读:
- 根 README 当前页,先了解整体能力、安装方式和版本演进。
- docs/design/README.md,看设计区入口和当前重构重点。
- docs/design/modules/77_Agent架构优化系统.md,看这轮能力扩展本身。
- docs/design/modules/78_CLI_Agent_Runtime重构实施计划.md,看 CLI Agent Runtime 分层重构进度。
- docs-site/docs/index.md,看面向用户的文档站入口。
如果你关心这轮最核心的实现主线,建议再重点看这 4 份:
- docs/design/modules/69_WebSocket服务器接口.md
- docs/design/modules/73_Web管理界面.md
- docs/design/modules/75_Web管理面板.md
- docs/design/modules/78_CLI_Agent_Runtime重构实施计划.md
这 4 份文档现在分别覆盖:
- WS Gateway 与协议边界
chainlesschain ui的启动链路与运行模式- Web Panel 的页面能力、store 和统一事件模型
- CLI Agent Runtime 的阶段性重构计划、退出条件与风险控制
当前最新见文件顶部 [2026-05-20 收口] 章节 — Personal Data Hub Phase 4.5→13.7 + iOS keychain hotfix (v5.0.3.71/.72) + 后续 v5.0.3.73 Phase 10.2 集成/E2E 测试 + 1 AIChat registry-contract bug fix。Hub 测试 47/927 → 50/952 全绿。CLI 0.162.9 / Android 5.0.3.72 versionCode 503072.
下方 banner 与"最新更新"系列均为历史归档(按时间倒序,每条对应当时版本的具体内容),不代表当前状态。
历史归档 — v5.0.3.48 Evolution Edition (2026-05-12 · CLI 0.161.8 · Android 1.0.0 GA · 141 桌面技能 + 28 Android 技能 · 14,987+ 测试 · v5.0.3.48 Android M3 capture suite (5/5 code) + M4 收尾 + M7 GA flip(VoiceMode + CameraOCR + LocationTagger + SharePayloadFlusher + PushNotifier 五件齐落 · RemoteSkillRegistry method-level 元数据 · ApprovalUI 4-category 适配 · ProgressViewer 长时任务面板 · §8.3 alias 兼容窗口 · Android versionCode 37 → 100 / versionName 0.37.0 → 1.0.0 GA by commit ffe722162 · 187 新单测全绿 / Android 总单测 196+ → 383+ · v1.0 GA 仍待用户出场 4 项 M3 真机 / M4 D2 真机 / FCM 凭证 / M6 性能)· v5.0.3.47 verification release(build-android keystore fix VERIFIED at release.yml run #25632845952 · density splits 14→4 用户侧首落 · 4 Android assets 入 Release · outstanding ../ 全扫净)· Phase 3d 桌面 ↔ Android 双向同步全套(M2 → v1.2 共 12 commit · 5 ResourceType walker + tombstones + Room cursor + sync.* JSON-RPC handlers + DeviceManager + SyncCoordinator auto-trigger · gate 1-4 全部 Ed25519 真签真验)· Android 0.37.0 七件套(Volcengine SeedASR 语音 + APK 自更新 issue #21 + Splash 重做 + Claude coral 主题 + i18n 三地区 + 生物识别 + DID Key 屏)· e2e CI 静默回归洞收口(drop e2e-tests workflow JOB 级 continue-on-error: true)· V6 Chat-First 壳全量 + chat-panel-v5 Phase E 反向对齐 · MTC v0.11 联邦 + publisher_signature M-of-N strip-all-sigs 修正 · V2 规范层 220+ 治理表面 · B4 ASAR surgery Win 安装显著加速 (dev-box 190.9s 实测, NVMe + Defender OFF; HDD parity 未测) · B4 P2P 社交 audit-grade 闭环 §2.2.10–§2.2.24 15 节 · 安全硬化级联 HIGH 44→0 / MOD 4→0 / LOW 45→0 · cc ui llm.chat parity · 意图理解 opt-in 开关 · chatStream 真流式 · 意图卡片 Vue Proxy reactivity 修复)
四条联动收口:(1) cc ui llm.chat WS topic(f41c4b4e2)—— 桌面 web-shell 自 4eaf90137 就有 llm.chat,cc ui 从未注册过 → QuickAsk 60s 卡 Stream idle timeout。新增 packages/cli/src/gateways/ws/llm-chat-protocol.js,frame 协议跟桌面 llm-handlers.js 完全对齐;新增 llm-creds.js 共享解析(explicit options → session creds → VOLCENGINE_API_KEY 等环境变量),任何源没拿到都立即 ok:false 帧不再 60s 挂死;chat-intent-protocol 同步切到这个 helper,顺手修一个 latent bug:原代码 session.baseUrl || "http://localhost:11434" 在 session 没设 baseUrl 时硬编码到 ollama 地址,所有云 provider 在用户本地没起 ollama 时都会跑死。(2) 意图理解 opt-in 开关(f41c4b4e2)—— Chat / Agent 项目/文件模式 header 加 <a-switch>,默认关闭。原行为是 v5.0.3.43 起每条消息先调 LLM 提炼意图再走真发送 — LLM 慢/无 cred 时占位卡 90 秒;现在默认直发,需要意图卡片的用户手动打开开关(持久化到 localStorage cc.web-panel.chat.intentEnabled)。submitUserInput 第一行短路。桌面壳同享 SPA bundle,跟 cc ui 行为一致。(3) chatStream 真流式(35f6e60ea)—— packages/cli/src/lib/chat-core.js 的 chatStream 原本是 buffer 全部 token 后再循环 yield 的伪流式,消费者要等 LLM 整个回完才看到第一帧。改为 token queue + Promise waiter 模式:onToken push 后立刻 wake generator yield。Chat / Agent / QuickAsk / 意图理解 全部受益。(4) 意图占位卡片 Vue Proxy reactivity 修复(a76e451e2)—— placeholder push 进 reactive messages[sessionId] 后被 wrap 成 Proxy,但本地 ref 仍指向 unwrap 之前 target → 后续 placeholder.metadata.X 直接改原对象绕过 Proxy set trap → 数据更新但不触发重渲染。修法:card = msgs[msgs.length - 1] push 后重新取 Proxy 引用。NPM: chainlesschain 0.161.5 → 0.161.6 → 0.161.7(0.161.6 已先于 productVersion 单独 publish 修复 hang;0.161.7 带 chatStream 真流式 + Vue Proxy 修复)。回归:CLI ws gateway 16/16 + chat-core 10/10 + web-panel chat-intent-flow 27/27。
一条 user-visible feature + 三条质量收口:(1) 截图 OCR LLM 引擎(39b16e29f)—— Tesseract.js 中文识别准确度差,新增 engine 参数 auto/llm/tesseract 三态,auto 默认走火山豆包视觉,LLM 失败带标签自动降级 Tesseract;V5/V6 共享 dialog + web-panel dialog 各加 <a-select> + 三色 tag。(2) chat intent 90s wall-clock 兜底(6cbd04c50)—— 慢 LLM dribble token 但不出 final frame 时占位卡无限转,AbortController + 90s 兜底。(3) compliance-ipc 死 handler 清理(29006decf)—— typo 前缀 compliance-classify:* 无人调用,背后 service 还跟真路径不一样,直接删;同步暴露 (4) audit-ipc.js 首次单测覆盖(b092673be)—— 18 channel + DI + 23 用例。回归:desktop 1477/1477 + CLI 17,455/17,455。
修复一个会绕过 M-of-N 阈值的真实缺陷:producer + verifier 必须对称地把 _stripSigsForPublisher(landmark) 喂给 JCS(清零 publisher_signature.sig + 每个 snapshot 的 signature.sig + signatures[*].sig),仅清零 publisher_signature.sig 不够 — 否则篡改 M-of-N 中任一成员 sig 都会绕过阈值校验。Helper 抽到 @chainlesschain/core-mtc/publisher-signing 子路径,三处调用点(batch.js / landmark-cache.js / desktop governance-multisig.js)全部对齐。同步发版安全硬化级联(npm audit HIGH 44→0、MOD 4→0、LOW 45→0),8 次 sweep 干掉 hdkey + werift + speedtest-net,override serialize-javascript / tar / semver / undici / tmp / ip-address / dompurify / make-fetch-happen 等 transitive 漏洞,channel-manager DDL 加固,wrtc-compat 补 CVE-2024-29415。Updater 切到 notifier-only flow(4c1a5ac18 + e27592bb5),渲染端实时进度。回归全绿:desktop 1454/1454 + core-mtc 258/258 + CLI 17432/17432 + mtc-federation 集成 41/41。
Windows 安装显著加速。dev-box (NVMe SSD + Defender OFF) 实测 190.9s vs 1201s 旧 baseline (issue #6) = 6.3× 提速;HDD + Defender ON 默认环境严格 parity 数据未测(issue #8 close comment 详述 methodology caveats)。v5.0.3.4-13 因 electron-builder 的 prod-dep walker 漏掉 call-bind-apply-helpers / side-channel-{list,map,weakmap} 4 个 transitive deps 改成 asar: false 兜底,代价是 NSIS 内 ~110k loose files × ~10ms = 旧 baseline 上 ~20 分钟安装地板。本版本(B4 plan,commit e11b46913)走第三条路:
scripts/asar-surgery.js:在 electron-builder afterPack 钩子里 extract → inject 4 个 walker-dropped 包到 staging top-level →@electron/asar.createPackageWithOptions重打包,并保留 electron-builder 原始 unpackDir 决策。Build-time verification gate 检查 4 个包确实落在 top-level,缺一抛错。scripts/build-win-with-deref.js:Win 包装electron-builder --win,临时把@chainlesschain/{core-mtc,session-core}workspace symlinks 替换成 verbatim 拷贝(asar packer 拒绝跨 app-root 符号链接),finally 用'junction'还原(Win 非 admin 不能创建'dir'symlink)。tests/unit/scripts/asar-surgery.test.js+build-win-with-deref.test.js:23 个单元 + 集成测试(真 fs + 真@electron/asar跑 fixture),过程中暴露并修掉一个真 bug:@electron/asar有 module-levelfilesystemCachekeyed by archive path,extractAll 后必须asar.uncache(asarPath)才能让 listPackage 读到 fresh header。
预期 Windows 安装数分钟(dev-box 190.9s 已验,HDD parity 未验)、安装包 ~300 MB 减重。Mac/Linux 通过 afterPack 同一路径自动获益。Refuted(不要再走):asarUnpack glob(issue #6)、extraResources to app.asar.unpacked/(v5.0.3.12)、4 包提为直接 dep(v5.0.3.6)。
紧贴 v5.0.3.32 收尾后用户复测发现一处只在 packaged install 才暴露的边角小问题:
- 托盘"关于"对话框产品版本永远显示 "—"(commit
461edf060):用户在 v5.0.3.32 安装版反馈托盘 → 关于显示产品版本:—。根因enhanced-tray-manager.js:317用require("../../../../package.json")读 monorepo 根的productVersion,但 packaged install 里enhanced-tray-manager.js位于app.asar/dist/main/system/,相对路径../../../..走出app.asar抵达<install>/resources/,那里没有 package.json → require 必失败 → 永远 catch 走"—"。dev 模式路径在 repo 内有效所以本机看不出来,是 v5.0.3.31 / v5.0.3.32 共有的历史遗留 packaging 路径问题。修复:build 时把productVersion+appVersion烧进dist/main/build-info.json(scripts/build-main.js在copyDir完成后写入),showAboutDialog优先读这个常量文件,老相对路径保留作为直接 import src 跑测试时的 fallback。
紧贴 v5.0.3.31 解决托盘菜单主链路(tray:action 统一通道 + renderer listener)后,再修两处只在 packaged install 才暴露的边角:
- 托盘"检查更新"在打包版误报开发模式(commit
7e6605006)—enhanced-tray-manager.js:365守的是process.env.NODE_ENV === "production",但 Electron 打包后NODE_ENV默认 undefined,packaged install 走 fallback 分支并因此从未真正调用过autoUpdater.checkForUpdates()。改判(process.env.NODE_ENV === "production" || app.isPackaged)。 - 首次启动未设密码状态下托盘菜单事件被丢弃(commit
2532774f5)—App.vueonMounted在initial-setup:get-status返回{ completed: false }时 early-return,跳过下方三个 IPC listener 注册。结果首次启动用户点托盘菜单,主进程把窗口 show + focus 后通过 IPC 派发,但 renderer 没人接。修复:把这三个 listener 提到早返之前。
- 桌面自动更新 + 托盘菜单全量修复(commit
bc2e476bf):v5.0.3.30 用户反馈三个 packaged-install 问题同源——(1) 自动更新功能不工作、(2) 托盘"检查更新"点击无反应、(3) 托盘菜单大部分项点击无反应。修复:所有菜单项重新走dispatchTrayAction统一入口;auto-updater.js实际接入 packaged 启动自检 + 4h 周期检查。 - vitest 3.x → 4.1.5 全量升级(7 commits
57bb519fe..8ad5fb7e9):v3 时代两个 workaround 同时退役——issue #5 的 Windows Unit Testscontinue-on-error+ issue #4 的mtc-federation-governance-clipoolMatchGlobs → threads:singleThread路由。vitest 4 上游修了 birpc 60sonTaskUpdate心跳硬编码;CLItestTimeout: 30s → 60s给 subprocess-heavy 联邦治理 + 审计 e2e 场景留余量。最终 5/5 CI workflow 全绿。
- 桌面应用图标视觉占用率不足(commit
f2c8fc22f):assets/icon.pngmaster 圆形 logo 在 2451×2451 画布占比 ~52%。tools/regen-app-icon.js(sharp + png-to-ico)自动 trim 透明边、重建 7 层 .ico;新 master 1282×1282,水平占比 100% / 垂直 89%。BrowserWindow+setAppUserModelId+ traygetIconPath()候选路径同步接线。 - 桌面主窗口最小化到系统托盘(commit
d57759dc9):关闭按钮触发hide()而非quit(),托盘图标常驻;右键菜单 Show / Quit。 - 桌面 installer 瘦身 357 MB / 14k 文件(commit
b2e1ff27d):electron-builder afterPack hook 过滤掉打不进生产的 devDep / 测试目录 /.bak等无用文件。
- Workspace 重构:移除 desktop-app-vue from root workspaces(commit
ad3e7d403):根本性修复 npm workspaces hoisting 陷阱 — 此前每次发版都因call-bind-apply-helpers等 transitive deps hoist 到根node_modules/而触发 ASAR 缺包问题。这次直接把 desktop-app-vue 从 workspace 拆出,让它有独立node_modules/,根治第二天发版翻车的可能性。 - CLI 测试 sharding 替代 glob 批处理(commits
1c9db161b/21a60f714/b52c2f427):vitest--shard=k/nmatrix 替代易翻车的[a-m]/[n-z]glob 批处理;9 个 push/PR workflows 加concurrency: cancel-in-progress。 - 删除 6 个 V5 死页面(commit
5066a718d):V6 Chat-First Shell 全量 port 完毕后清理 V5 残留;-8283 lines / +10 lines。
完整更新日志见 docs-site/docs/changelog.md(涵盖 v5.0.3.1 → v5.0.3.32 全部条目)。
基于设计文档 19_合规分类系统.md(v1.2)一次性补齐三项之前标记 "未完成" 的企业合规能力:
- STIX 2.1 威胁情报:新模块
packages/cli/src/lib/stix-parser.js+threat-intel.js解析标准 STIX 2.1 bundle,支持 9 种 observable 类型(ipv4-addr/domain-name/url/file:hashes.'SHA-256'等),IoC 去重 + 持久化;CLI 新增cc compliance threat-intel import|list|match|stats|remove(match 命中时 exit code = 2,便于 pipeline 使用)。 - 自动合规报告:
compliance-framework-reporter.js提供 SOC2 / ISO27001 / GDPR 模板化报告生成;CLI 新增cc compliance frameworks和cc compliance report <framework> --format md|html|json --output file。 - UEBA 行为分析:
ueba.js实现基线学习 + Z-score 异常检测 + 实体画像 + 告警聚合;CLI 新增cc compliance ueba baseline|detect|score|profile|alerts。
测试(全部绿灯):stix-parser.test.js 22 + threat-intel.test.js 26 + compliance-framework-reporter.test.js 32 + ueba.test.js 30 = 110 新测试。
👉 用户指南:docs/guides/COMPLIANCE_THREAT_INTEL_GUIDE.md(含 STIX 导入、UEBA 基线、框架报告完整示例)。
最新更新 - 社交协议生态补齐 (Nostr NIP-04/09/25 · Matrix Threads/Spaces · ActivityPub C2S · Social Graph · Topic Classifier, 2026-04-16) 🆕
基于设计文档 95_社交协议生态补齐方案.md 一次性补齐 5 个去中心化社交协议模块,统一走 @chainlesschain/session-core/nostr-crypto(BIP-340 schnorr + bech32 真实实现):
- Nostr 扩展 NIP 支持:NIP-04 加密 DM(x-only ECDH + AES-256-CBC + 每消息随机 IV)、NIP-09 删除请求(kind 5 +
["e", <id>]墓碑)、NIP-25 反应(kind 7 +ptag)。CLI 新增cc nostr dm|dm-decrypt|delete|react;Desktop main 同步落地nostr-bridge.js/nostr-identity.js/nostr-bridge-ipc.js。 - Matrix Threads + Spaces:
m.thread(MSC3440)和m.space/m.space.child全新落地,CLI 新增cc matrix thread send|list|roots和cc matrix space create|add-child|children|list;matrix_threads/matrix_spaces/matrix_space_children索引表。 - ActivityPub C2S:新模块
activitypub-bridge.js实现 Create/Follow/Accept/Undo/Like/Announce(W3C ActivityStreams 2.0),inbox 轮询 + outbox 队列化投递;CLI 新增cc activitypub actor|publish|follow|accept|unfollow|like|announce|outbox|inbox|deliver|followers|following(ap别名)。 - 社交图谱:
social-graph.js内存态类型化有向图(follow/friend/like/mention/block),SQLitesocial_graph_edges持久化 + 启动时重放,EventEmitter 实时流;CLI 新增cc social graph add-edge|remove-edge|neighbors|snapshot|watch(watch输出 NDJSON)。 - 多语言话题分类:
topic-classifier.jszh/ja/en Unicode 语言检测 + 8 大话题词典(tech/finance/sports/food/travel/music/politics/health),CJK 字符级分词支持子串匹配;CLI 新增cc social analyze|detect-lang。
测试(全部绿灯):Desktop 侧 389(nostr-identity 21 + nostr-bridge-nips 345 + nostr-bridge-ipc 23)+ CLI 侧 126(social-graph 36 + topic-classifier 32 + activitypub-bridge 58)+ session-core nostr-crypto 21 + CLI 旧测回归 90 + 视频端到端烟雾 3 = 629 新/回归测试全绿。
👉 用户指南:docs/guides/SOCIAL_PROTOCOLS_GUIDE.md(含密钥生成、NIP-04 DM、Matrix 线程、ActivityPub 投递、图谱事件流、话题分析完整示例)。
@chainlesschain/session-core 的 MemoryStore / ApprovalGate / BetaFlags 三条基础能力现已通过 CLI 全链路跨进程持久化(Phase D2/E1/E2 集成收口):
新命令:
chainlesschain memory store "..." --scope global|session|agent [--scope-id ID]
chainlesschain memory recall "query" --scope ... --tags ... --json
chainlesschain session policy <id> [--set strict|trusted|autopilot] [--json]
chainlesschain config beta list|enable|disable <feature>-<YYYY-MM-DD>Bug 修复:ApprovalGate 原本仅保留进程内 per-session policy,CLI session policy --set 设置后进程退出即丢失。新增 createApprovalGateFileAdapter 桥接 ~/.chainlesschain/approval-policies.json,跨进程可恢复。
持久化文件:~/.chainlesschain/memory-store.json / beta-flags.json / approval-policies.json(原子写入 + 损坏文件自动回退空对象)。
测试:session-core 293 tests (+9)、CLI Managed Agents 19 tests(5 unit + 8 integration + 6 e2e)全绿。详见 命令文档 / 总览文档 与 设计文档 v1.9。
本轮联合落地 6 项优化,新增 145 测试(unit 131 + integration 11 + e2e 3)全绿,全部向后兼容:
- 会话钩子第四事件
AssistantResponse+UserPromptSubmitrewrite/abort — 钩子 stdout 返回 JSON{rewrittenPrompt}改写当轮 prompt,或{abort, reason}跳过 LLM 调用 - Skill-Embedded MCP 上下文过滤 —
buildOptimizedPrompt({ activeMcpServers })只把激活技能挂载的 MCP 服务器工具暴露给 LLM UnifiedToolRegistry冷启动优化 —initialize({ deferSkills: true })立即返回,138 技能解析延迟到首次读 API 或setImmediate后台执行- Vitest
maxForks=2OOM 防御 — 6 个核心包 vitest.config.js 统一限制并行度 MCPClient.disconnect(name)单服务器别名 — 配合 Skill-Embedded MCP mount/unmount 流程- Category Routing 扩展
EMBEDDING/AUDIO— embedding 默认 ollama 优先(本地、免费),audio 默认 openai 优先(whisper/tts)
详见 docs/design/modules/89_v5.0.2.9_六项优化_设计说明.md 与 更新日志。
v5.0.2.9 借鉴 Claude Code 12 层渐进式 harness 架构,为 CLI Agent 新增 5 个核心优化模块 + 4 项增强集成:
5 个新模块:
- Feature Flags (
feature-flags.js) — 6 个特性标志位,env > config > default 三级优先级,百分比灰度 A/B 分流 - Prompt Compressor (
prompt-compressor.js) — 5 策略上下文压缩流水线(去重/截断/摘要/SnipCompact/ContextCollapse),CJK token 估算 - JSONL Session Store (
jsonl-session-store.js) — 追加式会话持久化,崩溃恢复,会话分叉,compact 快照重建 - Background Task Manager (
background-task-manager.js) — 子进程 fork + IPC 心跳监控,并发限制,任务持久化 - Worktree Isolator (
worktree-isolator.js) — Git Worktree 隔离执行,agent/* 分支自动管理,崩溃后清理
4 项增强集成 (v5.0.2.9):
- JSONL_SESSION 全面替换 —
agent-repl.js和session.js完整集成,创建/保存/恢复/列表均支持 JSONL 模式 - Background Tasks UI — Web Panel 新增「后台任务」监控页面(Pinia store + Vue3 组件 + WS 协议)
- Worktree + Sub-Agent —
SubAgentContext集成isolateTask(),子 Agent 自动在隔离 worktree 中执行 - Context Compression 自适应 — 30+ 模型 context window 注册表 +
adaptiveThresholds()+adaptToModel()动态切换
新 CLI 命令:
chainlesschain config features list # 列出 6 个 Feature Flag 状态
chainlesschain config features enable CONTEXT_SNIP # 启用特性
chainlesschain config features disable CONTEXT_SNIP # 禁用特性Canonical Tool Descriptor 收口 (v5.0.2.9) ⭐:CLI runtime ↔ Desktop Main ↔ Renderer ↔ MCP 全链路使用同一份 inputSchema 为真源的工具描述 shape。parameters 退化为只读镜像,riskLevel / isReadOnly / availableInPlanMode 等权限字段成为 Permission Gate 与 Plan Mode 的唯一输入。详见 docs/design/modules/83_工具描述规范统一.md 与 用户文档。
技能域工具过滤 (v5.0.2.9):UnifiedToolRegistry.getToolsForLLM({ activeSkillNames, alwaysAvailable }) 支持按激活技能过滤暴露给 LLM 的工具集,缓解 138+ 技能导致的工具爆炸。向后完全兼容(旧调用无参数即保留全量行为)。详见 模块 83 第 14 节。
CLAUDE.md 优化:从 32KB/724 行精简至 4.3KB/117 行,提取 6 个 path-scoped .claude/rules/ 规则文件 + @include 指令。
Bug 修复:PromptCompressor.compress(null) 崩溃 → 安全返回空数组。
测试覆盖:334 个测试(255 单元 + 42 集成 + 37 E2E),12 个测试文件,全部通过。
M2 任务收官:将启动关键路径上的同步 IO 全部转为 fs.promises,避免阻塞 Electron 主进程事件循环。共改造 11 个模块(unified-config-manager / ai-engine-config / tool-skill-mapper-config / mcp-config-loader / database-config / logger / git-auto-commit / project-config + 3 个 ai-engine-manager 变体),全部使用 _deps 注入模式以保持单元测试可 mock。同步 API 作为运行时快路径保留,启动路径调用 loadAsync() / prewarmXxx() / getXxxAsync()。
IPC Registry 收官(v0.45.59~60):
- 修复隐藏 ReferenceError:
ipc-registry.js的 Phase 5 / Phase 9-15 deps 构造曾用{ mcpClientManager, mcpToolAdapter }简写但顶部从未解构这两个标识符。一旦相关 phase 命中且dependencies缺失任一字段,整个 IPC 注册就会抛ReferenceError。由于...dependencies已经覆盖了它们,删除两处冗余引用,行为不变。 - 清理死解构块:主文件顶部 30+ 行的 destructure(绝大多数项只解构出来又通过
...dependencies转发)压缩到只剩 5 个本文件直接引用的 manager (app/database/mainWindow/llmManager/aiEngineManager),其余通过...dependencies透传。 - 效果:
ipc-registry.js由 495 行减至 446 行(−49 行),职责收敛到 "协调注册顺序 + 工具函数 + 全局守卫"。
关键 Bug 修复(v0.45.61):project-export-ipc.js 的 project:import-file 处理器有 v0.45.13 引入的 copy-paste 死代码块,引用了 projectPath 和 normalizedProjectPath 两个未在该作用域定义的变量;只要进入该 handler 就抛 ReferenceError。彻底删除死块,改用 getActiveDatabase() 路径(与 export-file handler 一致)。同时补全 project-export-ipc.test.js 中 mockDatabase 的 getProjectById / getProjectFiles / db.get / db.run 接口,把原本静默失败的 3 个文件操作测试还原为真实断言。
测试覆盖:本轮全面回归通过 — IPC 模块 89/89、Git 192/192、Project 212/212(修复了 3 个 pre-existing 失败)、AI Engine 1987/1987、CLI 单元 3053/3053。
将 desktop-app-vue/src/main/database.js(原 9470 行的巨型 DatabaseManager 类)按职责切分到 src/main/database/ 子目录。
| 文件 | 行数 | 说明 |
|---|---|---|
database/database-schema.js |
4026 | 纯函数 createTables,全部建表 DDL(v0.45.31) |
database/database-migrations.js |
1389 | 8 个迁移/重建方法(v0.45.32) |
database/database-settings.js |
531 | 7 个 settings 表 CRUD 方法(v0.45.32) |
database/database-knowledge.js |
330 | 15 个 knowledge_items + tags + statistics 方法(v0.45.33) |
database/database-soft-delete.js |
212 | 7 个 soft-delete 与定期清理方法(v0.45.33) |
database/database-graph.js |
465 | 9 个知识图谱关系方法(v0.45.33) |
database/database-projects.js |
591 | 10 个 projects + project_files 方法(v0.45.33) |
database/database-conversations.js |
416 | 12 个 conversations + messages 方法(v0.45.33) |
| 合计 (8 个子模块) | 7960 | 69 个方法抽出 |
做法: 每个抽出的方法保持为纯函数 fn(dbManager, logger, ...args) 形式,通过 dbManager.db 访问连接、用 dbManager.X() 回调其他方法;DatabaseManager 中保留薄委托方法(return _fn(this, logger, ...)),保证公共 API 字节级不变。
效果: database.js 由 9470 行减至 2052 行(−7418,−78.3%),剩余主要是 init/teardown、查询基元(run/get/all/exec/prepare/transaction)、备份/切库等核心机制。127 个数据库单元测试全部通过(database.test.js 22 + database-edge-cases.test.js 37 + database-migration.test.js 68)。
详见 docs/design/modules/43_IPC域分割与懒加载系统.md 第九节(H2 上下文)。
将 desktop-app-vue/src/main/ipc/ipc-registry.js 后半段独立的 Phase 注册块抽出到 src/main/ipc/phases/ 子目录,按版本/批次分组。
| 文件 | 行数 | Phase 数 | 涵盖内容 |
|---|---|---|---|
phases/phase-1-ai.js |
393 | 1 | LLM, PermanentMemory, Hooks, Plan/Skills, Context Eng, Token/Stream, Team Task, Permission, RAG, Browser (22 regs) |
phases/phase-2-core.js |
135 | 1 | U-Key, Database, Git + critical early IPC (MCP basic config, System early, Notification early) — 6 regs |
phases/phase-6-7-content.js |
197 | 2 | File, Office, Template, Knowledge, Prompt Template, Image (Phase 6) + Speech, Video, PDF, Document (Phase 7) |
phases/phase-8-9-extras.js |
357 | 2 | Blockchain (lazy), Code/Review, Collaboration/Automation, KG/Credit, Plugin (lazy), Import, Sync/Pref/Conv, FileSync, Config, Category, Workflow |
phases/phase-3-4-social.js |
306 | 2 | DID, P2P, Social (8 sub-modules), VC, Identity Context, Org, Dashboard |
phases/phase-5-project.js |
170 | 1 | Project Core/AI/Export/RAG/Git (5 sub-modules, 91 handlers) |
phases/phase-9-15-core.js |
259 | 7 | Cowork, Workflow Optimizations, Audit, Marketplace, Agents, SSO, UnifiedTools |
phases/phase-16-20-skill-evo.js |
494 | 5 | Skill Pipeline/Workflow, Instinct, Cowork v2 Cross-device, ML Sched/LB/CICD/Docs, Self-Evolution |
phases/phase-21-30-enterprise.js |
295 | 10 | Enterprise Org, IPFS, Analytics, Autonomous, AutoTuner, Multimodal, Skill Marketplace, Trading, DeFi, Crypto |
phases/phase-31-ai-models.js |
261 | 7 | Benchmark, MemAug, DualModel, Quant, FineTune, Whisper, FedLearn |
phases/phase-33-40-collab-ops.js |
553 | 8 | Git P2P, Yjs Collab, Pipeline, Anomaly, NL Spec, Multimodal, Wire-up, Decentralized Network |
phases/phase-41-evomap-gep.js |
102 | 1 | EvoMap GEP Protocol |
phases/phase-42-50-v1-1.js |
450 | 9 | Social/AP, Compliance, SCIM, U-Key/FIDO2, BLE, Nostr, DLP |
phases/phase-51-57-v1-1.js |
268 | 7 | SIEM, PQC, Firmware OTA, Governance, Matrix, Terraform, Hardening |
phases/phase-58-77-v2-v3.js |
757 | 20 | Federation, Reputation, Inference, Trust Root, Storage, EvoMap |
phases/phase-q1-2027.js |
89 | 5 | WebAuthn, ZKP, FL, IPFS Cluster, GraphQL |
效果:ipc-registry.js 由 4925 行减至 493 行(−4432,−90.0%),共抽出 16 个 Phase 模块、88 个 Phase。phase-modules.test.js 累计 48 个契约测试全部通过。
详见 docs/design/modules/43_IPC域分割与懒加载系统.md 第九节。
v5.0.2.11 将 Web 管理面板从 10 个模块扩展到 15 个模块,修复 v1.0 Coding Agent Envelope 协议兼容性问题,并新增从 Desktop 迁移的 4 个高级管理页面:
v1.0 Envelope 协议修复:
ws.js:requestId优先关联 +flattenEnvelope()payload 合并 +normalizeRuntimeEvent()dot-case 支持chat.js:DOT_TO_LEGACY_TYPE映射(assistant.delta→response-token等)agent-runtime.js:startServer()加载 config 传给 sessionManager
新增 5 个功能页面:
- 🔒 安全中心 (Security) — DID 身份管理、文件加解密、审计日志
- 📡 P2P 网络 (P2P) — 设备列表、配对、消息发送、同步状态
- 🔀 Git 与数据 (Git) — 仓库状态、自动提交、导入导出
- 📁 项目管理 (Projects) — 6 模板初始化、状态卡片、环境诊断
- ⚡ 后台任务 (Tasks) — 任务列表/详情/历史/通知
Providers 增强:新增 LLM 参数设置面板(provider/model/apiKey/baseUrl/temperature/maxTokens)
测试覆盖:Web Panel 测试总数达 266+(218 单元 + 12 集成 + 12 E2E + SPA 路由测试)
v5.0.2.12 将 Web Panel 从 15 个模块扩展到 23 个模块,新增企业级与扩展功能:
批次一(企业):
- 💰 钱包管理 (Wallet) — 钱包列表/资产管理/转账历史
- 🏢 组织管理 (Organization) — 组织列表/成员管理/团队/审批
- 📊 使用分析 (Analytics) — Token 用量/成本统计/缓存状态
- 📋 模板中心 (Templates) — 9 项目模板/BI 模板/Prompt 模板
批次二(扩展):
- 🔐 权限管理 (Permissions) — RBAC 角色/权限检查/审计日志
- 📰 RSS 订阅 (RssFeed) — 订阅源管理/文章阅读/统计
- 💾 备份恢复 (Backup) — 备份管理/数据同步/IPFS 存储
- 🔑 身份认证 (WebAuthn) — WebAuthn 凭证/SSO 配置/双因素认证
侧边栏:从 4 组扩展到 7 组(概览/配置/数据/高级/企业/扩展)
测试覆盖:Web Panel 测试总数达 621(523 单元 + 40 集成 + 58 E2E)
v5.0.2.8 对 Vue3 Web 管理面板进行全面扩展,新增 6 个功能模块并引入 4 种颜色主题:
新增 6 个功能页面:
- 🐳 服务状态 (Services) — Docker 服务启停、端口状态监控
- 📋 运行日志 (Logs) — 多色行分类实时日志,支持关键字过滤
- 📝 笔记管理 (Notes) — 笔记列表、搜索、新建、删除
- 🔧 MCP 工具 (McpTools) — MCP 服务器与工具列表
- 🧠 记忆系统 (Memory) — 三层记忆统计与条目浏览
- ⏰ 定时任务 (Cron) — 定时任务列表与启用/禁用控制
4 种颜色主题(顶栏右上角一键切换,localStorage 持久化):
| 🌑 深色 (默认) | ☀️ 浅色 | 🌊 海蓝 | 🌿 绿野 |
|---|---|---|---|
| 深灰背景 | 白色背景 | 深蓝背景 | 深绿背景 |
关键 Bug 修复:
- 技能列表始终显示 0:WS 服务端发
stdout字段,客户端读output(undefined)→ 已修复 - Provider 列表不含火山引擎等国产模型 → 按 CLI 实际键名重写为 10 个 Provider
- 5 处中文字符 U+FFFD 乱码 → 全部修复
测试:新增 29 个 Web Panel 单元测试(theme.test.js 17 个 + ws-store.test.js 12 个),Web Panel 测试总数达 157 个。
chainlesschain ui # 启动面板(内置,无需构建)
chainlesschain ui --port 9000 --ws-port 9001 # 自定义端口
chainlesschain ui --web-panel-dir /custom/dist # 指定 dist 目录v5.0.2.7 更新(Skill Creator v1.2.0):查看详情
v5.0.2.7 升级内置 skill-creator 至 v1.2.0,新增 LLM 驱动的技能描述优化功能:
optimize-description 动作:
- LLM 自动生成 20 条 eval 查询(10 个应触发 / 10 个不应触发)
- 60/40 train/test 分割,防止描述过拟合
- 迭代优化:评估训练集失败项 → LLM 改写描述 → 测试集评分 → 取最优
- 自动写回
SKILL.md(仅在有改进时),并保存完整结果到.opt-workspace/results.json - LLM 不可用时优雅降级,返回带提示信息的错误响应
# LLM 驱动优化(需要 chainlesschain ask 可用)
chainlesschain skill run skill-creator "optimize-description code-review"
chainlesschain skill run skill-creator "optimize-description code-review --iterations 3"
# 等效的 --advanced 标志
chainlesschain skill run skill-creator "optimize code-review --advanced"测试覆盖:76 个测试(50 单元 + 12 集成 + 14 E2E),全部通过。
v5.0.2.6 更新(Vue3 管理面板 npm 打包 + Bug 修复):
v5.0.2.6 对 Web 管理面板进行了两项关键改进:
1. npm 安装用户无需手动构建
prepublishOnly钩子在发布前自动构建并打包 Vue3 面板到src/assets/web-panel/findWebPanelDist()三路查找:自定义目录 → 源码树 dist/ → npm 包内置- npm 安装用户直接运行
chainlesschain ui,无需执行任何构建命令
2. $ 特殊字符 Bug 修复
projectRoot="/path/$HOME"等含$&/$'/$$的路径不再损坏注入的 config JSON- 根因:
String.prototype.replace(str, replacement)将$&解释为"匹配的字符串";改用函数形式replace(str, () => val)修复
v5.0.2.5 新增功能(Vue3 管理面板首发):
- ✅ 仪表板 — 服务状态卡片(WebSocket / 活跃 LLM / 技能数量 / 会话数)
- ✅ AI 对话 — Chat/Agent 双模式,流式 Markdown 渲染,工具调用可视化,交互式问答
- ✅ 技能管理 — 138+ 技能分类浏览、搜索过滤、一键运行
- ✅ LLM 配置 — 10 个 Provider 管理,一键切换,连接测试,Ollama 本地模型列表
- ✅ 项目/全局双模式区分 — 项目级会话绑定项目路径,视觉上清晰区分(蓝色 vs 紫色横幅)
- ✅ 自动降级 — dist/ 不存在时自动回退到内嵌经典 HTML
- ✅ 147 个测试 — 66 单元 + 51 集成 + 30 E2E,全部通过
# npm 安装用户(无需构建,开箱即用)
npm install -g chainlesschain
chainlesschain ui # 直接使用内置 Vue3 面板
# 源码用户(首次使用或代码更新后)
npm run build:web-panel
# 项目级面板(在含 .chainlesschain/ 的目录下运行)
cd /your/project && chainlesschain ui
# 全局面板
chainlesschain ui
# 自定义选项
chainlesschain ui --port 9000 --ws-port 9001
chainlesschain ui --token mysecret
chainlesschain ui --web-panel-dir /custom/dist # 指定 dist 目录
# 热更新开发模式
npm run dev:web-panel访问 http://127.0.0.1:18810 打开管理面板。
cc orchestrate 让 ChainlessChain 成为编排层,Claude Code / Codex 作为并行执行代理:
- ✅ LLM 任务分解 — 一个高级任务自动拆分为多个并行子任务
- ✅ 多路 Agent 路由 — 同时支持 claude/codex/gemini/openai/ollama 后端,5 种路由策略(round-robin / primary / parallel-all / by-type / 加权轮询)
- ✅ CI/CD 自动验证 — Agent 执行完成后自动运行 CI,失败则携带错误上下文重试
- ✅ 多渠道通知 — Telegram、企业微信、钉钉、飞书、WebSocket 同时推送任务进度
- ✅ 接收 IM 指令 — 通过
--webhook模式从企业微信/钉钉/飞书接收指令触发编排 - ✅ WebSocket 集成 — 通过 WS 触发任务,进度事件实时推送回同一 WS 客户端
- ✅ 106 个测试 — 72 单元 + 15 集成 + 19 E2E,全部通过
cc orchestrate "Fix the auth bug in login.ts" # 自动检测 AI 工具并执行
cc orchestrate "Refactor payment" --backends claude,gemini --strategy parallel-all
cc orchestrate "Add tests" --ci "npm run test:unit" --retries 5 # 自定义 CI + 重试
cc orchestrate --status --json # 查看状态(JSON)
cc orchestrate detect # 检测已安装的 AI CLI
cc orchestrate --webhook --webhook-port 18820 # 启动 IM 指令接收服务器chainlesschain ui 一条命令启动本地 Web 管理页面,支持项目专属模式和全局管理模式:
- ✅ 项目模式 — 从含
.chainlesschain/的目录运行,AI 自动携带项目上下文 - ✅ 全局模式 — 从任意目录运行,打开全局管理面板
- ✅ 流式 Markdown 输出 — AI 回复实时 token 流式渲染(
response-token),代码块语法高亮 - ✅ Agent 工具可见性 — Agent 调用工具时实时显示工具名和参数(
tool-executing事件) - ✅ 会话管理 — 侧边栏会话列表,支持新建/切换/历史记录,Agent/Chat 模式 Tab 切换
- ✅ 交互式问答 — Agent slot-filling 提问时弹出对话框
- ✅ WebSocket 复用 — 自动启动内置 WS 服务器,浏览器直连,支持 token 认证
- ✅ 103 个测试 — 47 单元 + 32 集成 + 24 E2E,全部通过
- 🐛 修复 5 处 WS 协议不匹配 — 对话/认证/会话列表/流式输出均可正常工作
cd /your/project && chainlesschain ui # 项目模式(自动检测)
chainlesschain ui # 全局模式(非项目目录)
chainlesschain ui --port 9000 --ws-port 9001 # 自定义端口
chainlesschain ui --token mysecret # 启用认证
chainlesschain ui --no-open # 仅启动服务器访问 http://127.0.0.1:18810 即可开始对话。
cc init --template ai-doc-creator 一条命令配置完整的 AI 文档创作工作区,自动生成 3 个文档技能:
- ✅ AI 文档生成 (
doc-generate) — AI 生成结构化文档(报告/方案/说明书/README),4 种风格,支持 md/html/docx/pdf 多格式输出,pandoc/LibreOffice 双路径转换 - ✅ LibreOffice 格式转换 (
libre-convert) — 无头模式格式转换(docx/pdf/html/odt/pptx 等),自动检测 PATH 和 Windows 默认安装路径 - ✅ AI 文档修改 (
doc-edit) — AI修改现有文档,保留公式/图表/样式,三种操作模式(edit/summarize/translate),输出_edited文件不覆盖原文件 - ✅ Persona 配置 — "AI文档助手"角色,擅长规划文档结构、批量生成和格式转换工作流
- ✅ cli-anything 集成边界 —
rules.md明确说明:LibreOffice 同时适合 workspace 技能(日常转换)和cli-anything register soffice(高级宏/模板功能) - ✅ 168 个新增测试 — 70 单元 + 47 集成 + 51 E2E,全部通过
chainlesschain init --template ai-doc-creator --yes
winget install pandoc # DOCX 输出(可选)
chainlesschain skill run doc-generate "2026年AI技术趋势分析报告" # 生成报告
chainlesschain skill run doc-generate "产品方案" --args '{"format":"docx","style":"proposal"}'
chainlesschain skill run libre-convert "report.docx" # 转换为 PDF
chainlesschain skill run doc-edit --args '{"input_file":"report.md","instruction":"优化摘要"}'
chainlesschain cli-anything register soffice # 注册 LibreOffice 高级功能桌面端接入火山方舟 Seedance 文生视频 API,通过 window.api.video.generate({prompt, outputPath, ratio, duration, imageUrl}) 生成真实 AI 视频:
- ✅ Seedance 全模型支持 —
doubao-seedance-1.0-lite/1.5-pro/pixeldance,支持文生视频与首帧图驱动 - ✅ 流式进度事件 —
video:generate:progress上报task-created / status-update / downloading / complete - ✅ 轮询容错 — 5s 间隔、10 分钟超时,自动区分
queued / running / succeeded / failed - ✅ 15 测试全绿 — 9 单元 + 4 集成 + 2 全链路,全部使用 mock 避免真实计费
- 📖 使用文档
docs-site/docs/chainlesschain/ai-video-generation.md - 📖 架构设计
docs/design/modules/90_AI视频生成_Volcengine_Seedance.md
cc init --template ai-media-creator 一条命令配置完整的 AI 音视频创作工作区,自动生成 3 个媒体技能:
- ✅ ComfyUI 图像生成 (
comfyui-image) — 直接调用本地 ComfyUI REST API,支持文生图/图生图,内置默认 SD 工作流,支持自定义 workflow JSON - ✅ ComfyUI 视频生成 (
comfyui-video) — 通过 AnimateDiff 节点生成动画视频,支持加载用户保存的工作流文件 - ✅ AI 语音合成 (
audio-gen) — 4 后端自动降级链:edge-tts(免费)→ piper-tts(离线)→ ElevenLabs API → OpenAI TTS - ✅ Persona 配置 — "AI创作助手"角色,熟悉 Stable Diffusion 提示词工程和 AnimateDiff 参数调优
- ✅ cli-anything 集成边界 —
rules.md明确说明:ComfyUI(REST API)用 workspace 技能,FFmpeg/yt-dlp(CLI)用cli-anything register - ✅ 114 个新增测试 — 40 单元 + 33 集成 + 41 E2E,全部通过
将 62 个 CLI 指令自动封装为 9 个 Agent 可直接调用的技能包:
- ✅ 9 个域技能包 — 知识管理/身份安全/基础设施/AI查询/Agent模式/Web3/安全合规/企业级/集成扩展
- ✅ 执行模式区分 —
direct/agent/hybrid/llm-query四种模式明确标注 - ✅ 自动同步 — SHA-256 哈希检测变化,
skill sync-cli/postinstall自动触发 - ✅ 101 个测试 — 57 单元 + 21 集成 + 23 E2E,全部通过
chainlesschain skill sync-cli # 检测变化并同步
chainlesschain skill run cli-knowledge-pack "note list" # Agent调用笔记管理新增轻量级 npm CLI 工具,一条命令即可安装和管理 ChainlessChain:
npm install -g chainlesschain
chainlesschain setup # 交互式安装向导(或 cc setup / clc setup / clchain setup)
chainlesschain start # 启动应用(或 cc start / clc start / clchain start)- ✅ npm CLI 包 (
packages/cli/) — 纯 JS 薄编排层 (~2MB),62 个命令 (含 Phase 7-8 企业功能 + WebSocket Server + Persona) - ✅ 交互式安装向导 — Node.js/Docker 检测 → 版本选择 → LLM 配置 → 二进制下载 → 自动配置
- ✅ GitHub Release 集成 — 自动下载平台二进制文件 (Win/macOS/Linux) + SHA256 校验
- ✅ Docker Compose 编排 — 一键管理后端服务 (
services up/down/logs/pull) - ✅ 环境诊断 (
doctor) — 12 项检查 (Node/Docker/Git/端口/磁盘/网络) - ✅ Phase 1 AI 智能层 — BM25 搜索 + Token 追踪 + 持久记忆 + 会话管理 + Agent Plan Mode
- ✅ Phase 2 知识管理 — 知识导入 (Markdown/Evernote/Notion/PDF) + 导出 (Markdown/静态站点) + Git 集成 + 笔记版本控制
- ✅ Phase 3 MCP 与外部集成 — MCP 服务器管理 (JSON-RPC 2.0) + 10 LLM Provider + 3中转站 + 浏览器自动化 + 本能学习
- ✅ Phase 4 安全与身份 — DID 身份管理 (Ed25519) + AES-256-GCM 文件加密 + RBAC 权限引擎 + 审计日志
- ✅ Phase 5 P2P与企业 — P2P 消息 + 文件同步 + 数字钱包 (Ed25519) + 组织管理 + 插件市场
- ✅ Phase 6 AI核心 — Hook 生命周期管理 (28事件类型) + DAG 工作流引擎 (5内置模板) + 层次化记忆 2.0 (4层架构+遗忘曲线) + A2A Agent间协议
- ✅ Phase 7 安全与进化 — 安全沙箱 v2 (细粒度权限+行为监控) + 自进化系统 (能力评估+自诊断+自修复)
- ✅ Phase 8 区块链与企业 — Agent 经济系统 (微支付+资源市场+NFT) + 零知识证明引擎 (Groth16+选择性披露) + BI 智能分析 (NL→SQL+异常检测)
- ✅ Phase 9 低代码与多Agent — 低代码平台 (15+组件+版本管理) + 多Agent协调器 + DI服务容器
- ✅ Agent 智能增强 — auto pip-install + 脚本持久化 + 错误分类(5类) + 环境检测 + agent-core 提取去重 + Desktop agent 模式
- ✅ 自主学习闭环 — 执行轨迹存储 + 自动评分(3信号源) + 技能自动合成(Jaccard去重) + 技能持续改进(3触发器) + 周期性自省 (224 tests)
- ✅ 子代理隔离系统 v2 — SubAgentContext 上下文隔离 + spawn_sub_agent 工具 + 命名空间化记忆 + 作用域上下文引擎 + 角色工具白名单 + 三级摘要策略 + 生命周期注册表 + 沙箱化执行环境 + 资源限制 + 父子通信协议
- ✅ CI/CD 自动发布 — GitHub Actions 自动
npm publish --provenance+ 供应链安全 - ✅ Agent Context Engineering — 6维上下文注入 (Instinct/Memory/BM25 Notes/Task/Permanent Memory/Compaction Summary) + KV-Cache优化 + 稳定前缀缓存 + 智能压缩 + 可恢复压缩摘要 + 会话恢复 (
--session) - ✅ Autonomous Agent — ReAct 自主任务循环 (
/auto命令) + 目标分解 + 自我纠正 - ✅ 多 Provider 支持 — 10 个 LLM 提供商 (volcengine/openai/anthropic/deepseek/dashscope/gemini/kimi/minimax/mistral/ollama) + 3种中转站 (OpenAI/Anthropic/Gemini) + 任务智能模型选择
- ✅ DAG 计划执行 + 风险评估 —
/plan execute按依赖拓扑排序 +/plan risk风险评分 - ✅ EvoMap 基因交换 —
evomap search|download|publish|list|hubsGEP-A2A 协议客户端 + 联邦Hub管理 + 基因治理 - ✅ CLI-Anything 集成 —
cli-anything doctor|scan|register|list|remove将任意软件 Agent 化,自动注册为 managed 层技能 - ✅ WebSocket 服务器 —
serve命令通过 WebSocket 暴露全部 CLI 命令,支持 execute/stream/cancel + Token 认证 + 心跳检测 + 命令注入防护 - ✅ WebSocket 有状态会话 — 通过 WS 创建/恢复/管理 agent/chat 会话,支持项目上下文绑定、SlotFiller 参数填充(9 种意图自动检测)、InteractivePlanner 交互式规划 (2700+ 测试/113 文件)
- ✅ DAO 治理 v2 — 二次方投票 + 投票委托 + 国库管理 + 提案生命周期 (
dao命令) - ✅ 安全合规 CLI — 合规管理 (GDPR/SOC2/HIPAA/ISO27001) + 数据防泄漏 (DLP) + SIEM 日志导出 + 后量子密码 (PQC)
- ✅ 通信桥接 CLI — Nostr 桥接 (NIP-01) + Matrix 桥接 (E2EE) + SCIM 2.0 用户配置
- ✅ 基础设施加固 CLI — Terraform 编排 (工作区/Plan/Apply) + 安全加固 (性能基线/回归检测/审计)
- ✅ 社交平台 CLI — 联系人管理 + 好友系统 + 动态发布 + 即时聊天 + 社交统计
- ✅ Hook 管道 — PreToolUse/PostToolUse/ToolError 工具调用钩子集成
- ✅ Content Recommender — TF-IDF 工具相似度 + 工具链频率推荐
- ✅ 4741+ 个测试用例 — 116+ 测试文件 (单元 + 集成 + 端到端),跨平台 CI 矩阵 (Ubuntu/Windows/macOS)
- ✅ 系统质量改进 — 12 个 Pinia Store 测试文件 (431 测试),CI 管道修复 (
continue-on-error移除),builtin-tools.js(25K行) 拆分为 8 个模块,空 catch 块清理,硬编码凭证移除 - ✅ 项目初始化 (
init) — 9 种模板 (code-project/data-science/devops/medical-triage/agriculture-expert/general-assistant/ai-media-creator/ai-doc-creator/空项目),生成.chainlesschain/项目结构;ai-media-creator 自动生成 ComfyUI/TTS 技能,ai-doc-creator 自动生成 doc-generate/libre-convert/doc-edit 技能 - ✅ Persona 系统 — 项目级 AI 角色配置 (
persona show/set/reset),自动替换默认编码助手,工具权限控制,自动激活 Persona Skill - ✅ 多层技能系统 — 4 层优先级 (bundled < marketplace < managed < workspace),
skill add/remove/sources/sync-cli自定义技能管理;9 个 CLI 指令技能包自动封装 62 条指令 - ✅ 多智能体协作 (
cowork) — 多视角辩论审查 + A/B 方案对比 + 代码知识图谱分析 - ✅ Web Cowork 日常任务协作 — 10 类任务模板 + 开源工具优先 + cli-anything 桥接 + 自动安装 + systemPromptExtension + shellPolicyOverrides (103 tests)
- ✅ 插件技能集成 — 插件可声明并安装技能到 marketplace 层
23个新模块,覆盖三大方向:AI Agent 2.0、Web3 深化、企业级生产力平台。新增 ~178 IPC Handlers,37 测试文件 1238+ 测试用例,全部通过。
- ✅ IPC域分割 + 懒加载 (
ipc/domains/,ipc-middleware.js,lazy-phase-loader.js) — IPC Registry 拆分为10个域,按需加载Phase,统一中间件(限流/权限/计时),3个IPC处理器 - ✅ 共享资源层 + DI容器 (
core/service-container.js,shared-cache.js,event-bus.js,resource-pool.js) — 统一DI容器(循环依赖检测),LRU+TTL缓存,跨模块EventBus,资源池管理,4个IPC处理器 - ✅ 数据库演进框架 (
database/migration-manager.js,query-builder.js,index-optimizer.js) — 版本化迁移(up/down),流式SQL构建器,索引优化器(慢查询检测),4个IPC处理器
- ✅ A2A协议引擎 (
ai-engine/a2a/) — Google A2A标准,Agent Card发现,Task生命周期管理,SSE+WebSocket流,8个IPC处理器 - ✅ 自主工作流编排器 (
ai-engine/workflow/) — DAG工作流编辑器,条件分支/循环/并行/审批门,5个内置模板,断点续执行,10个IPC处理器 - ✅ 层次化记忆2.0 (
ai-engine/memory/) — 4层记忆(工作→短期→长期→核心),遗忘曲线,记忆巩固,跨Agent共享,情景/语义搜索,8个IPC处理器 - ✅ 多模态感知层 (
ai-engine/perception/) — 实时屏幕理解,语音双向流,文档深度分析,视频理解,跨模态推理,8个IPC处理器 - ✅ Agent经济系统 (
blockchain/agent-economy.js) — 微支付(State Channel),计算资源市场,贡献度证明,Agent NFT,收益自动分配,10个IPC处理器 - ✅ 代码生成Agent 2.0 (
ai-engine/code-agent/) — 全栈代码生成,Git上下文感知,实时代码审查(eval/注入检测),5框架脚手架,CI/CD自动配置,8个IPC处理器 - ✅ Agent安全沙箱2.0 (
security/agent-sandbox-v2.js) — WASM隔离,细粒度权限白名单,资源配额,执行审计,行为AI监控(风险评分),6个IPC处理器
- ✅ 零知识证明引擎 (
crypto/zkp-engine.js) — zk-SNARK/zk-STARK,Groth16证明系统,Circom电路编译,身份选择性披露,6个IPC处理器 - ✅ 跨链互操作协议 (
blockchain/cross-chain-bridge.js) — EVM链(ETH/Polygon/BSC/Arbitrum)+Solana,HTLC原子交换,跨链消息传递,8个IPC处理器 - ✅ 去中心化身份2.0 (
did/did-v2-manager.js) — W3C DID v2.0,可验证展示,社交恢复,跨平台漫游,声誉可移植性,8个IPC处理器 - ✅ 隐私计算框架 (
crypto/privacy-computing.js) — 联邦学习,安全多方计算(MPC),差分隐私,同态加密查询,8个IPC处理器 - ✅ DAO治理2.0 (
blockchain/dao-governance-v2.js) — 二次方投票,委托投票,提案生命周期(Draft→Active→Queue→Execute),国库管理,8个IPC处理器


