让数据主权
回归个人,
AI 效率触手可及。
CLI 驱动的本地 AI × 硬件级加密。
为每一个想掌控自己数据的人而建。
知识 · 社交 · 交易,
以个人为中心,全栈端到端。
一套硬件级安全 + 本地化 AI + 完全去中心化的共同基座,三大场景独立可用、互通无界。
知识库管理
- ·笔记 / 文档 / 对话历史 — 个人第二大脑
- ·混合搜索:BM25 + Qdrant 向量
- ·层级记忆 2.0:工作 → 短期 → 长期 → 核心
- ·基于 RAG 的 AI 问答 · 代码知识图谱
去中心化社交
- ·W3C DID v2 身份 + 可验证凭证
- ·P2P 端到端加密:Signal + libp2p + WebRTC
- ·社区 / 频道 gossip 跨机同步(v5.0.3.41+)
- ·Audit-grade Merkle envelope + 跨机分发 + 外部归档(B4 全套)
- ·协议融合:ActivityPub · Nostr · Matrix
- ·反审查:Tor + 域前置 + 卫星消息
数字资产交易
- ·多链钱包:EVM 系 + Solana
- ·跨链桥:HTLC 原子交换 + 跨链消息
- ·zk-SNARK / zk-STARK 本地生成
- ·DAO 治理 v2 · 二次方投票 · 国库管理
把散落各处的数字足迹,
汇成一份只属于你的金库。
邮件 · 微信 · 支付宝 · 8 家 AI Chat · 7 大社交平台 · 电商 · 旅行 · Android 系统数据 ——
22+ 数据源端到端拉回本地,谁也拿不走。
"让数据主权回归个人" 不是口号 —— 是 22 个真接通的适配器、5 个内置分析技能、1 份本地加密金库。
- · IMAP 全协议 邮箱
- · 支付宝账单 CSV / PDF
- · 6 模板抽取(账单/订单/出行)
- · PDF 解密 + 交易明细
- · DeepSeek · Kimi · 通义
- · 智谱 · 混元 · 千帆
- · 扣子 · Dreamina · 豆包
- 9 / 9 全接通 · Phase 10.2
- · 微信(SQLCipher · MD5 + Frida 双路径)
- · QQ · 微博 · B 站
- · 抖音 · 小红书
- · Telegram · WhatsApp
- 微信 8.0+ Frida hook · Phase 12.6 全 land
- · 淘宝 · 京东 · 美团
- · 高德 · 百度地图
- · 携程 · 12306
- · 订单/物流/足迹聚合
- · 通讯录 · 通话记录
- · 短信 · 位置历史
- · Android ADB 备份
- · iOS iTunes encrypted
对 AI 说人话,
它替你干活。
不用背命令、不用写代码。打开 Web 控制台,告诉它你想做什么 —
Agent 自动挑工具、自动装依赖、实时流式回报进度。
文档转换
批量把 Word 转 PDF / Word 转 Markdown
媒体处理
视频压缩、提取音频、格式转换
数据分析
CSV / Excel 分析 + 生成图表
图片处理
批量压缩、OCR 识别文字
信息检索
自动搜索 + 整理结果
系统管理
磁盘分析、进程排查、网络测试
运行 chainlesschain ui,浏览器打开 http://localhost:18810/#/cowork
5 阶段编排 · Plan Mode ·
本能学习 · 验证循环。
不是单 Agent 撞运气。Planner / Architect / Coder / Reviewer / Verify 五角色串联,每步可中断、可审查、可重放。
一套 AI 引擎,
30,000+ 测试守护。
Win / macOS / Linux / Android / iOS / CLI — 同一套引擎跨终端。所有发布前必须六层全绿,单层失败即拦截发版。
2026-04-19 工程验证回归 · 全绿
你的密钥,
握在自己手里。
U-Key / SIMKey 硬件芯片 · 私钥永不导出。AES-256 + SQLCipher 全量加密。Signal 协议端到端。Ollama 本地推理 — 数据永不上云。
USB 安全芯片
Windows Koffi FFI 直连 SIMKey SDK。PIN 码保护、多次错误自动锁定、所有关键操作需物理确认。BLE/NFC 无线 U 盾 + 生物识别。
SIM 卡安全芯片
Android OMAPI / iOS eSIM API。三大运营商 USIM + 5G 超级 SIM 覆盖。指纹 / 面容 ID 替代 PIN。12 大安全增强:eSIM OTA、TEE 集成、量子抗性。
本地 Ollama
qwen2 / llama3 / deepseek-r1 本地推理。14+ 云 LLM 可选但绝不强制。敏感数据自动路由本地模型,从根源阻断上云路径。
对 AI 说人话,
工具自动干活。
10 个任务模板 · 自动安装依赖 · 实时流式进度。
"把 report.docx 转成 PDF" — Agent 自己去装 pandoc、调工具、回报结果。
Android 云 LLM 路由真接通本地 RAG + 联系人电话号码真对 AI 可见 + 6 平台 endpoint hotfix 套件
6 平台 endpoint hotfix 套件:Xhs 3 endpoint path/param 对齐 JsBridge 真路径(/api/sns/web/v1/me → /v2/user/me 等)+ Toutiao extractUid 加 uid_tt / sso_uid_tt / tt_webid fallback 解 passport_uid 长期 null 拒登录 + Weibo /api/favorites 上游下线 graceful skip 不再给假 404 + Douyin 收藏分页 has_more 循环拉全(之前只一页 ~24/N 静默丢)+ Android askQuestion timeout 60s → 240s(MediaPipe cold-start over budget 首问无响应兜底)+ `cc hub` 系列 aichat-health timers 全 unref 让命令秒退(之前被 setInterval 持有 event loop)。工程文档:handbook 加 trap #27 (USR_VERSION sentinel cache miss after PDH/CLI lib refresh — 改 pdh/lib 或 cli/lib 必 bump android USR_VERSION 否则真机走 fast-path 跳解压用旧代码) + trap #28 (workspace dep npm publish stale — 改 pdh/lib 或 cli/lib 必 bump 包 version + npm publish + USR_VERSION 否则 cc-cli.tgz 装旧代码)。版本面:productVersion v5.0.3.96 → v5.0.3.97 / CLI 0.162.26 → 0.162.27 / @chainlesschain/personal-data-hub 0.3.7 → 0.3.9 / Android versionCode 503097 / USR_VERSION 12→17 累计 5 次 bump / iOS CFBundleVersion 97。
桌面检查更新两路兜底 — release-in-progress 友好提示 + 窗口隐藏发系统通知
新 `desktop-app-vue/src/main/system/update-error-classifier.js` 把 electron-updater 错按 kind 分类:release-in-progress (Cannot find latest*.yml / 404 拉 latest*.yml) vs generic。auto-updater.js error handler 按 kind 分流:release-in-progress 后台自检完全静默;手动检查弹 info dialog「新版本正在发布中,请稍后几分钟再试」不糊 stacktrace。enhanced-tray-manager.js#triggerCheckForUpdates 触发检查前先 showWindow() 把主窗口拉回前台。auto-updater.js 在 update-downloaded + update-not-available 两个事件加 OS Notification 兜底(窗口隐藏 / 最小化 / destroyed 时发),点击通知亮窗 → 用户随即看到 notifier 卡片 / native dialog。新 update-window-visibility.js 抽 shouldFallbackToOsNotification 纯函数 helper。17 case 单测覆盖(8 case error-classifier 含真实 v5.0.3.95 错误文本 + latest-mac/linux 变体 + 404-only-on-non-yml 反例 + null/undefined 边界 + 9 case window visibility 含 null / destroyed / 不支持 / 可见 / 隐藏 / 最小化 / 防御性兼容)。
legacy-GPU Chromium 130+ 崩溃自动恢复 trap #26 — user 报「installer 闪退」实为 0xc0000602 GPU 进程 fail-fast
Fix marker file 自动恢复:desktop-app-vue/src/main/index.js setupApp() 启动前写 .launching marker 到 userData;mainWindow.once("ready-to-show") 清掉 marker。下次启动看到残留 marker → 判定上次崩了 → 持久化 .gpu-disabled 文件 + app.disableHardwareAcceleration() + Chromium switches(--disable-gpu / --disable-gpu-compositing / --disable-software-rasterizer)。支持 CHAINLESSCHAIN_DISABLE_GPU=1 env var 手动触发;删 <userData>/.gpu-disabled 可恢复 GPU。同 VS Code / Slack / Cursor / Discord 的 disable-gpu 恢复模式,外部行为驱动不依赖任何 GPU API 状态。诊断快速键:(1) Test-Path "$env:ProgramFiles\ChainlessChain\ChainlessChain.exe" 看 installer 是否真崩;(2) Get-WinEvent 查 0xc0000602 + CoreMessaging.dll → 锁实 trap #26;(3) Get-CimInstance Win32_VideoController 看 GPU 驱动年龄。docs/internal/hidden-risk-traps.md 加 trap #26 完整正文(诊断三步 + SOP/checklist + 反模式 + 快速诊断键),handbook 标题升到 #6-#26。同时打包 chore(ci): PR-advisory sidebar coverage audit for design docs + chore(ci): hard-gate trap #25 partial-index drift in PDH + chore(docs-infra): consolidate sync filename maps to shared JSON + test(android): fix TurnEphemeralRefresherTest CI flake 3s → 10s poll + fix(android-tests): resolve 27 unit test failures across 7 classes + test(android): resolve 17 .kt.broken delete 14 LLM-hallucinated + fix 2 stubs + revive TaskPlanCardTest + chore(android): add release-precheck workflow R8 hotfix-chain prevention。
PDH 社交双通道大收口 — 快手 PC ADB 第 4 路 C 路径 + Toutiao/Bilibili/Weibo/Xhs Mode B 安卓内嵌 root 四家齐落 + Bridge dry-run doctor 提前 5-10 天捕 SDK rotation
Xhs/Douyin in-WebView prefetch 复刻 Bilibili 架构(hidden WebView 跑平台自带 sign JS + JavascriptInterface bridge 回 Kotlin 写 staging JSON),Xhs v6 加 cookie cross-subdomain bridge + v8 isLoginSuccessByCookie 阈值 20→50 拒访客 tracking session + v13 id_token httpOnly cookie decode + profile event push;5 家社交登录改 Mobile Chrome UA + 抖音 cookie-presence 检测(revert v5.0.3.84 错向)。Android 发版工程修:R8 minify 改 systemProp 前缀解 v5.0.3.89 复发的 ConcurrentModificationException,v5.0.3.91 兜底 disable R8。仓库治理:gitee 移出 .husky/post-commit 自动 push 链(本地 .git 1325MB > gitee 1GB quota,每次 commit 都失败堆 WARN,留 orphan-snapshot 手动重建脚本作 emergency 路径)。设计文档 6 篇齐发:PDH_Kuaishou_C_Path_Real_Device_E2E + PDH_Toutiao_C_Path_Real_Device_E2E + PDH_Bilibili_Mode_B_Real_Device_E2E + PDH_Weibo_DB_Schema_Probe + PDH_Weibo_Mode_B_Real_Device_E2E + PDH_Mode_B_Toutiao_Douyin_Real_Device_E2E,全 Win-first 6 场景体例。后续 Phase 8 待扫尾:Toutiao/Bilibili/Weibo/Xhs Mode B 真机 root + magisk + frida-server 实跑(Win dev box 跑不动,需 Mac/Linux + root 设备)。版本面:productVersion v5.0.3.85 → v5.0.3.91。
安卓端 MediaPipe 端侧本机大模型真接通 + 4 档 LLM 路由统一选择器 + Personal Data Hub Vault Browser 双端数据可视化
149 测试全绿(36 categories + 13 vault helpers + 27 FTS5 native integration(sandbox) + 4 composable + 10 store + 12 view + 19 desktop renderer + 11 export + 10 android renderer + 7 android VM)。PDH partial-index drift recovery:migration v4 explicit DROP+CREATE 4 表 partial unique index 全带 WHERE source_original_id IS NOT NULL 修 trap #23(CREATE UNIQUE INDEX IF NOT EXISTS 隐藏 schema drift → adapter.sync silent fail / events 卡 0 行 / raw_events 累积 1308 行黄金信号),新 cc hub rederive [--adapter <name>] [--batch-size <n>] 救老 vault 孤儿数据。PDH §2.5 出行 12306(5 卡)+ 内容平台头条 / 快手 v0.1 placeholder 卡 + QQ HubLocal UI wire(接 Phase 13.5 v0.2 已 land collector + 11 单测)。PDH social MockWebServer 集成测试层补齐 4 platform / 33 case(Bilibili 7 + Weibo 9 + Xhs 11 + Douyin 6 covering HTTP 412/401/461/500、anti-bot login redirect、X-S X-T 签名 header gates、buvid3 substitution、containerid 前缀魔法),填补 audit 发现的 0 覆盖层。Bilibili WBI 签名修 silent {code:0,data:list:[]} 空响应。Android Bootstrap @Singleton race 修 → companion Mutex + 自愈 mkdirs trap #24。版本面:productVersion v5.0.3.84 → v5.0.3.85 / CLI 0.162.17 → 0.162.18 / npm @chainlesschain/personal-data-hub 0.2.4。
本机开发者活动 7 个 adapter 落地 — 你的本机操作流也是个人 RAG 语料
7 个 adapter 全走 category=system bucket,在 Vault Browser 侧栏可单独筛;FTS5 trigram CJK 全文检索同样有效(搜"react"既匹配 git commit message 也匹配 shell history 里的 npm install 也匹配 vscode 工作区路径)。对开发者尤其重要:你 1 天 8 小时敲键盘的操作流(哪个 repo 在哪个分支干啥 / 在 vscode 打开过什么 / 在浏览器查过什么 / 从 Downloads 拖过哪个 zip)全部入 vault 后,AI 跨源问"上周三我在调试什么?"可以同时看 git checkout 日志 + vscode 工作区 + 浏览器 stackoverflow 历史 + shell 命令——单一数据源永远答不全。配套:bs3mc / bs3 ABI dual-load 修 Electron 39 (ABI 140) vs Node 22 (ABI 127) 双路径 require 崩 native binding 的 trap #23(chrome-db-reader / vscode-reader / 后续所有 SQLite reader 必走 dual-load + new Database(":memory:") smoke test)。
Personal Data Hub v0.2 大爆发 — 11 个 placeholder 卡接通 + WeChat / QQ 真采集 + Android 端侧 LLM 骨架
三道锁 UI + 真接通:拒云 / 销毁 / 导出 (cc hub export 真接通)。AI 给出处 citation chip → cc hub event-detail 真链回原始事件。release.yml 拆 publish-deps 前置 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 新单测 (CredentialsStore 14 + DbExtractor 17 + FridaInjector 15 + LocalCollector 10) + QQ Phase 13.5 27 Kotlin 单测。3 stale-assertion 同日修:longtail Douyin uid (constructor 改 dual-mode 优雅) + analysis TOTALS regex case (/i flag) + hub-command snapshot (event-detail / export 漏注册)。版本面:productVersion v5.0.3.78 → v5.0.3.80 / CLI 0.162.14 → 0.162.16 / npm @chainlesschain/personal-data-hub 0.2.1 → 0.2.3 / Android versionCode 503080 / iOS CFBundleVersion 80。
Personal Data Hub A8 v0.1 — Android 完全独立社交数据采集(Bilibili 端到端 + 3 平台占位)
8 文件落地:JS adapter 重构 stateless constructor + _syncViaSnapshot 新模式 + 保留 legacy sqlite-mode / Kotlin 4 文件 SocialCookieWebViewScreen(4 平台共用 generic)+ BilibiliApiClient(OkHttp 4 endpoint)+ BilibiliCredentialsStore(EncryptedSharedPreferences)+ BilibiliLocalCollector(编排器)/ HubLocalScreen 多卡片重构含 WebView overlay + globalSyncingAdapter 互斥 / CLI + Desktop wiring 双 land BilibiliAdapter stateless 自动注册。测试 65+:JS 12 snapshot-mode 单测 + 4 legacy 重写 + 6 integration(真 vault 4-kind end-to-end + idempotency)+ Kotlin 37 单测(BilibiliApiClient 14 / Collector 8 / VM 15)+ Android E2E 8 场景 plan + stub。设计文档 ~600 行(Adapter_Social_Cookie + A8_Bilibili_E2E_Plan)+ 7 forward-looking traps。v0.2 路线 ~5d(微博 1.5d / 抖音 2d msToken-X-Bogus / 小红书 2d X-s)。
Personal Data Hub Plan A v0.1 真机闭环 — Android 本地数据 hub snapshot 模式
3 真机硬化修:originalId required(adapter yield 必含字段否则 invalidCount=rawCount 假象 + 1305 行 audit burst)+ skip-embeddings flag(Plan A 模式无需 vector)+ audit pagination 拆 1305 → 50/page。Android cc subprocess W^X execve via mksh symlink + reader-thread try/catch(Throwable) EOF race + ingestSystemDataAndroid 30→120s timeout。E2EE 7 androidTest 经 X3DHSimulator state-less E2EESession factories 重新启用。bootstrap LLMManager 注册为 singleton + web-shell PDH wiring inject CcLLMAdapter 让 web-shell 也尊重 active LLM provider。AnalysisEngine 读 persons + items 不只 events 阻止幻觉 contact counts + LLM ResponseCache bypass for analysis ask(防供 stale 缓存)。6 真机 trap 全收口 · 工程基础 100% verified · 剩 feature 层 ~7-9d。同期 v5.0.3.77 顺手 iOS .ipa 真机 ship + Phase 14.1 step 5 ChatBubble 全 land。
WeChat Phase 12.6.7-10 — bootstrap 编排层 + IPC/WS + cc hub wechat CLI + Vue UI 向导
本轮累计:1223 测试 / 67 文件(1068 hub 包 + 183 desktop + 46 CLI + 18 web-panel — composable / VM / IPC / WS / wiring / store / 账户 JSON / privileged whitelist / 集成端到端)。memory 沉淀:wechat_bootstrap_orchestration_layer.md — 当 N 个 sub-phase 产零件但 3 caller(IPC、WS、CLI)都要拼时加 bootstrap.js 编排层的通用模式。同期顺手修了 docs-site 一处 stale 注释:iOS Phase 14.2 UI scaffold 实际已在 3db7b5a73 全部 land(650 LOC PersonalDataHubViews.swift + 3 ViewModel + RemoteDependencies + 1491 LOC tests),而非之前注释里的 "lost-to-race"。剩余:Phase 12.9 rooted Android 真机 E2E 与 Phase 14.4 移动端真机 E2E 均依赖物理硬件不能在 Win dev box 完成。
Personal Data Hub 一晚 13-phase burst — 8/8 AIChat 真厂商接通 + 7 social adapter + .72 iOS keychain hotfix repackage
v5.0.3.72 同时是 release pipeline 工程复盘。v5.0.3.71 desktop build 全 EUSAGE — root package-lock.json 与 packages/personal-data-hub/package.json 不同步:hub 在 Phase 12/13 滚动期间加了 adm-zip@^0.5.16(解 iTunes encrypted backup zip)+ iconv-lite@^0.6.3(解 GBK 编码 social 历史)两 optional dep,workspace 各自 package.json 已声明但 root package-lock 未 sync 进去,所有 5 个平台 desktop installer 跑到 electron-builder 步全 EUSAGE 退出。5d8ba08b5 fix(deps) sync root lock 后跳过 .71 直接 ship .72 repackage 同样 iOS keychain Logger.swift NSLock 防并发崩溃修(与 .70 同一 commit 625e86819 forward),.72 真出包 18 assets 完整。d03c87d0a 后续把 packages/cli 在 root lock 里也 bump 到 0.162.7 收口避免相同问题再出现。版本面:CLI 0.162.5 → 0.162.8 / productVersion v5.0.3.70 → v5.0.3.72(跳 .71)/ desktop-app-vue 5.0.3-alpha.70 → .72 / iOS CFBundleVersion 70 → 72 / Android versionCode 503070 → 503072. 实际真发布的是 .72,.71 在 GitHub Release 列表里不存在,但 lib/adapters 代码在 main 上 + npm chainlesschain@0.162.7 已发,仅 desktop installer 走 .72 那条 release。
iOS hotfix 三件套 — PIN-unlock crash 修 + AppIcon 真编进包 + SQL bind
v5.0.3.70 是个 iOS 工程修补 release,也顺带是个发版流程复盘:(1) v5.0.3.69 出了 Logger NSLock + AuthViewModel SQL bind 两个修复,release workflow 5 平台 build 全绿 + 18 assets 全上传,但 publish-cli 那步在 npm publish chainlesschain@0.162.4 时收到 npm 404 Not Found PUT https://registry.npmjs.org/chainlesschain(CLI 包 token/权限问题),finalize-release 依赖 publish-cli 直接 skipped → v5.0.3.69 release stuck 在 draft 状态 8h+,所有 18 assets 都在但 isDraft=true 即用户拿不到。(2) v5.0.3.70 在 .69 基础上加了 AppIcon wiring 修复(2441b0d8b 改 pbxproj 让 Assets.xcassets 成为 PBXFileReference type=folder.assetcatalog + 进 PBXResourcesBuildPhase,actool 才会真编译 Assets.car 进 ChainlessChain.app),版本号统一推 productVersion / CLI / iOS CFBundleVersion / Android versionCode/versionName 5 处。(3) v5.0.3.70 首次跑同样在 publish-cli 步 404,gh run rerun --failed 重试一次成功,finalize-release 自动 PATCH draft→published,最终 18 assets 全齐成为 Latest(4 Android arm64-v8a/armeabi-v7a/universal/aab + macOS dmg + Linux AppImage/rpm/deb + Windows Setup.exe/Portable + iOS .ipa + 3 latest.yml + blockmaps)。.69 仍 stuck draft 不动 — 删 draft 会 burn tag 24h,所以保留作为版本号占位。从 .69 → .70 用户跳一版没感知。
Android cc Chat — 用自然语言直接问,AI 自动调本机 cc 命令
v1 默认只放过 8 个只读子命令(note / search / memory / skill / status / session / mcp / did),即便 AI 收到"帮我把所有笔记删了"也会被白名单当场拦截,返回 exitCode=126 denied。卡片显示完整命令 + exitCode + 耗时 + stdout 折叠展开,长查询有"取消"按钮一键终止。复用 Android 本地终端 Phase 2.5 内置 Node + cc CLI bundle,无配对依赖,离线可用。
iOS .ipa 重发收口 + Android cc CLI bundle 真接通(v5.0.3.65/66 一晚两版打补)
v5.0.3.66 的实质是 v5.0.3.65 release reship — release 流程层级的工程故障复盘。源头:v5.0.3.65 build-ios 因 Phase 6 新增视图未接进 Xcode 项目而失败,桌面 + Android + npm 全绿但 .ipa 缺位。GitHub release 模型对 v5.0.3.65 immutable-releases 设置生效后 .ipa 已无法补传,只能 cut 新版本号。修复链路:(1) 看 build-ios job log 找出 9 个 "cannot find X in scope" 错(UpdateBannerOverlay + 8 个 RemoteOperateView 引用的 Phase 6 view)→ 验证文件在磁盘但不在 pbxproj;(2) 扩 wire_app_sources.rb FILES 列表加 13 个 .swift 文件路径 + 调用 ios-wire-app-sources.yml workflow_dispatch(dry_run=false)让 ruby xcodeproj gem 在 macOS runner 上写 pbxproj 并 push 回 main(commit 2fe98ef9f);(3) bump 4 个 enforced surface(productVersion / desktop-app-vue version / ios CFBundleVersion / android versionCode+versionName)+ tag v5.0.3.66 + push;(4) release.yml 全 11 job 绿,build-ios 5min11s 出 .ipa,create-release / publish-cli / finalize-release 全通过,最终 18 assets。其中 cli-tests 与 publish-cli 因 0.162.2 已发 npm 自动跳过避免影响 latest dist-tag。Android cc CLI bundle 这边 v5.0.3.65 同期落地:把整个 41MB chainlesschain CLI npm 包(含 Node 22 runtime)放进 Android APK assets/local-terminal/ 目录,配 wrapper shell 脚本绕开 Android 下不可用的 #!/usr/bin/env node shebang trap,Termux libc++_shared.so 换名 libtermux_cxx.so 兼容 AGP 8 stripping 规则,cc CLI wrapper 自己的 shebang 从 /system/bin/sh 换成 prefix/bin/mksh,因为 Android W^X 模型把 /system/bin/sh 关在 shell_exec SELinux domain 内 untrusted_app(pty 域)无法 execve,而 prefix/bin/mksh 实际指向 ../lib/libmksh.so → nativeLibraryDir/libmksh.so,在 Android lib/<abi>/lib*.so 白名单内可 execve。这套组合让 Android app 内运行 cc CLI 直接可用,不依赖 Termux 应用。
iOS 全面成熟 — Phase 1-6 + AI Chat 收口 + 版本号 4 段制 + 真签名 .ipa 已 ship
v5.0.3.64 主要做三件事并把 iOS 版本号管理收尾:(A) AppConstants stale 硬编码全清零 — `AppConstants.App.version` 之前硬编码 "0.32.0"(实际几个月没更过常量,与真实版本严重 stale)/ `buildNumber` 硬编码 "32" / `bundleId` 硬编码 "com.chainlesschain.ios"(实际 Info.plist 配的是 com.chainlesschain.ChainlessChain,CodeSign 也基于此)全部改为从 Bundle.main 动态读:新增 `Bundle.appShortVersion` ("5.0.3") / `appBuildNumber` ("64") / `appFullVersion` ("5.0.3.64" 4 段制与 desktop productVersion / Android versionName 对齐) / `appFullVersionTag` ("v5.0.3.64" 带 v 前缀 UI 展示用) / `appDisplayName` 5 个 helper。AIDashboardView.swift 硬编码 "v0.16.0" + PluginManager.swift fallback "1.7.0" 全替换。Settings 「关于」栏显示完整 4 段制 v5.0.3.64 + 加「Bundle ID」一栏便于用户确认安装的是真版本。(B) iOS 17 API 二次全仓审计 — 对全仓 596 个 .swift 文件跑 29 个 pattern(assumeIsolated / @Observable / SwiftData / symbolEffect / ContentUnavailableView / scrollPosition / KeyframeAnimator / visualEffect / sensoryFeedback / Previewable / dialogSeverity / SubscriptionStoreView 等),确认 0 处新增违规:AppState.swift:94-118 v5.0.3.63 修已就位(Task { @MainActor in ... })/ SystemInfoView.swift:65-73 .symbolEffect 在 #available(iOS 17, *) 块内 iOS 16 fallback 静态图标 / ImagePickerView.swift @Previewable 在 @available(iOS 17, *) #Preview {} 内 preview-only 不进生产。(C) 18 unit + 7 integration + 2 UITest 三层覆盖锁版本号显示 + PIN 解锁不崩两类回归 — BundleVersionTests.swift 11 unit 锁版本号 helper + AppConstants 动态字段语义;AppStateNotificationTests.swift 7 integration 验 databaseUnlocked / didAuthenticated post 不崩 + 高频反复 post 稳定性;ChainlessChainUITests testSettingsVersionDisplaysFourSegmentTag + testPINUnlockDoesNotCrashOnFirstLaunch XCUITest 真机回归。同期 iOS Phase 5 AI Chat 静态审计找出 4 真实 bug:(1) finalizeStreamingPlaceholder 空字符串穿透 nil-coalesce — 旧代码 `messageId ?? oldMsg.id`。ChatStreamEnd.parseFromEnvelope 在 server 缺 messageId 字段时填 ""(不是 nil),nil-coalesce 不兜底,"" 直接覆盖本地 local-assistant-<UUID> 占位 id,SwiftUI ForEach(messages, id: \.id) 身份被击穿(多条 row 共享空 id)。修:显式 guard `if let mid = messageId, !mid.isEmpty`。(2) deleteConversation 失败半回滚 — 删除当前对话失败时仅恢复 conversations 列表,currentConversation / messages 留在已清空状态。新增 rollbackDelete 私有方法 + wasCurrent / originalCurrent / originalMessages 快照全量原子回滚。(3) sendMessage 缺防御性 stream-in-flight guard — UI 在流式中切到 cancel button 形态,但 VM 不能假设上层禁掉了 send 入口(programmatic 调用 / 双击竞争 / 上层 bug 都可能绕过)。在 DC gate 前加 `guard currentStreamId == nil`。(4) selectConversation stale streamId 污染 — 切对话时不清 currentStreamId,edge case 新 conv 末条恰为 streaming 占位(前次未 finalize)时 prev stream 的 delta 会越界改新 conv 的 last。修:显式 currentStreamId = nil + isStreamingMessage = false。+ 4 集成测试 Phase5AIChatIntegrationTests 覆盖 events fan-out / cancel 顺序(discardStream → 本地状态收尾 → cancelStream RPC 出站 → late chunk silent drop) / offline drain(DC down 时 ai.createConversation 入 OfflineQueue → DC ready edge → drainer 触发) / 多对话 stream 隔离(conv A 启 stream → 切 conv B → sA 后续 delta+end 不污染 conv B messages)。iOS Phase 6 sprint 一晚 19 commits:桌面 knowledge-handler.js +30 method(folders 5 + tags 3 + alias 1 + versions 4 + star/pin 6 + archive 3 + import-export 4 + 高级 tags 3)+ ai-handler.js +25 method(Conversations 高级 5 + Prompt templates 3 + RAG 5 + Multimodal 4 + Code helpers 4 + Agents 4);iOS KnowledgeCommands actor wrap 31 method(30 桌面 + getNote alias)+ AIExtendedCommands actor wrap 25 method;KnowledgeView + AIExtendedView SwiftUI + 2 VM + 2 新 main tab(→ 15 total);多模态 v0.3 实时录音 AVAudioRecorder 16kHz mono AAC + Agents 2 个新 sub-tab + 5 tab horizontal picker + Agent streaming desktop runAgentStream + iOS poll loop + Agents UI live。绿基线 1fb947b32,iOS CI 真编译验证通过(Win 上唯一 Swift 编译验证路径)。
Android 远程文件 skill 接通 — 浏览 / 上传 / 下载 PC 文件,app 内一键打开
Plan C Android↔PC 文件传输落地后的产品化收口。Android 端 FileTransferScreen 现在是 5 个 TopBar 图标:📁 浏览远程目录(输入 ~ / C:/Users/... → 进入,目录在前字母排序,点目录递归,点文件直接下载,↑ 上级 / 🔄 刷新)/ ☁️↑ 上传(系统 GetContent 选本机文件 → 自动 chunk 上传 → Snackbar 弹「PC: C:/Users/longfa/Downloads/<名>」+「复制路径」按钮,PC 端同名文件自动加 (1)/(2) 后缀防覆盖)/ ☁️↓ 输入路径下载(手动输入远程路径 + 文件名 → 开始下载)/ 📱 本机下载文件夹(v5.0.3.57 新增:MediaStore.Downloads.EXTERNAL_CONTENT_URI 查询公共 Downloads 目录所有文件 + DATE_ADDED DESC 排序 + 每行显示文件名/大小/时间 + 点「打开」直接拉系统 viewer)/ 🧹 清理 30 天前历史。PC 端 desktop-app-vue/src/main/remote/handlers/android-file-handler.js 新写 460 行,11 个 action 派发(listDirectory/getFileInfo/exists/delete/createDirectory/requestUpload/uploadChunk/completeUpload/requestDownload/downloadChunk/cancelTransfer/listTransfers),字段对齐 Android FileCommands.kt(type 而非 isDirectory / modifiedTime 而非 modifiedAt / entries 而非 items)。修复 6 个互锁雷:(1) P2PClient.kt:538-542 chainlesschain:* skip guard 太宽 — 旧代码 `if (raw.contains("\"type\":\"chainlesschain:")) return` 把 P2PClient 自己发的命令响应也屏蔽,pendingRequests 永远等不到 complete。修法:缩窄成只 skip `chainlesschain:command:request`。(2) Plan C 路径 P2PClient.connectionState 永远 DISCONNECTED — RemoteOperateScreen → signaling forward 没调 P2PClient.connect(),state 一直 DISCONNECTED,所有 RemoteCommandClient 命令立即失败。修法:RemoteCommandClient.invokeTyped 改 delegate SignalingRpcClient.invoke(pcPeerId),pcPeerId 从 PairedDesktopsStore.devices.firstOrNull() 取。(3) PC handleFileCommand 是简陋 stub — 旧的 switch 只有 case "list" 查 SQL 表 + case "requestUpload" 弹 dialog.showOpenDialog(PC 端弹文件选择框完全错误,应该 Android 端选)。修法:整段替换为 delegate 到新 android-file-handler。(4) FileTransferHandler(remote-gateway 注册的)sandbox 在 userData + 字段不一致 — _resolvePath 强 prefix app.getPath("userData"),C:\Users\... 一律 Access denied。修法:不复用,新写专用 handler 无 sandbox(trusted paired peer)。(5) checksum 算法不匹配 → repository 自删下载文件 — 第一版 requestDownload 返 "sha256-prefix:abc...",但 FileTransferRepository.kt:264-276 期望 "md5:" + 完整 MD5,对不上立刻删本地文件 + 标 FAILED + 抛 Checksum mismatch。修法:返 checksum:null 跳过 Repository 验证。(6) getExternalFilesDir(null) 用户找不到下载的文件 — /sdcard/Android/data/.../files/downloads/ 受 Android 13+ scoped storage 限制,普通用户用文件管理器要点 5 层 + 开"显示隐藏"。修法:API 29+ 用 MediaStore.Downloads.EXTERNAL_CONTENT_URI insert 写公共 Download 目录,返 content:// uri 直接喂 Intent.ACTION_VIEW,无需 WRITE_EXTERNAL_STORAGE 权限。34 新单测 — PC vitest 30 cases(_resolvePath × 5 / listDirectory × 5 / getFileInfo + exists × 3 / createDirectory + delete × 3 / Upload 全流程 × 5 含防覆盖与 metadata.targetDir / Download 全流程 × 3 含 Bug 5 回归 checksum 必须 null / cancelTransfer × 2 / handle() dispatch × 2 / listTransfers × 1)+ Android RemoteCommandClientTest 4 cases(delegate 到 SignalingRpc + Bug 1+2 锁死 coVerify(exactly=0) 不走 p2pClient.sendCommand)。Xiaomi 24115RA8EC × Win desktop 真机 E2E 8 场景全跑通:E1 浏览家目录 / E2 浏览盘根 / E3 进子目录 / E4 小文件上传 + 复制路径 / E5 防覆盖 (1) 后缀 / E6 小文件下载 / E7 「打开」action 拉 viewer / E8 本机下载面板 LazyColumn 列出 Download 目录所有文件。设计文档 docs/design/Android_Remote_File_Skill.md / 用户文档 docs-site/docs/guide/remote-file.md。已知限制:大文件 >10MB 走 signaling 4 跳 base64 chunk 可能 timeout,等 Plan A.1 WebRTC DataChannel 稳后切 DC 路径;API <29 MediaStore.Downloads 不可用,fallback app-private 路径用户找不到,后续如有反馈再加 FileProvider 适配;destructive action (delete / writeFile) 当前无审批 gate,trusted paired peer 自动执行,未来叠 mobileApprovalChannel。
iOS 端镜像移植 — Phase 1+2+3+4 完整落地(桌面配对 + 远程终端 + 远程操控 framework + 4 typed skill + Notification skill)
v5.0.3.55 把 Android 平台 1 年多积累的移动端功能(QR 配对 / 远程终端 / 远程操控 framework / Notification skill)镜像到 iOS。所有 4 Phase 都是框架级完整移植 — Phase 1 桌面配对三流 commit c30b415a8(71 单测,Modules/CoreP2P/Pairing 9 swift + Features/Pairing 8 swift + PairingSignalingGate 接口 + PairedDesktopsStore UserDefaults JSON 持久化 + 桌面端 follow-up manual-pair-listener.js 220 LOC pairing-code 别名监听)+ Phase 2 远程桌面终端 commit 7613ea710(163 单测,Modules/CoreP2P/RemoteTerminal 13 swift + Features/RemoteTerminal 6 swift + 4 xterm.js bundle resources + SignalClient.forwardedMessages 多订阅 AsyncStream 补 Phase 1 设计 gap)+ Phase 3 远程操控 framework + 4 typed skill commit 759a1e907(~264 单测,Modules/CoreP2P/RemoteSkills 16 swift + Features/RemoteOperate 6 swift + RemoteCommandClient 单消费者收口到 commandClient 让 TerminalRpcClient 订 events 流)+ Phase 4 Notification skill commits 45b485fdd → 5877b5d84 6 sub-phase 全落地(41 新单测累计 ~313,3 swift CoreP2P + ViewModel 322 LOC + View 517 LOC + 既有 PushNotificationManager 0 改动 / 仅 1 行 conformance 扩展 + DI events fan-out 修 cmdClient.events AsyncStream 单消费者多 skill 订阅 trap + RemoteOperateView 第 6 tab + SkillTabPickerView REWRITE 横滚 + Capsule unread badge per design §7.9 备选 B)。2 个 P0 修:RemoteCommandClient.invoke withThrowingTaskGroup timeout 路径 pendingResponses 泄漏 + RemoteWebRTCClient.waitForAnswer pendingAnswer 清不干净 — 2 regression tests + 1 集成 test 验池清干净。设计文档 4 个 + trap memory 4 个(ios_qr_pairing_three_flows / ios_remote_terminal_phase2 / ios_remote_operate_phase3 / ios_remote_notification_phase4)+ feedback_ios_ui_mirrors_validated_android(UI 信息架构必须照抄已真机验证的 Android Kt screen,HIG 偏离仅 6 项白名单)。同批:#21 P1 主体 5/5 — A.1 Linux native 配对(cc pair preflight 5 项 LAN 诊断 + cc pair token 子命令组 + systemd hardening 模板 + 9 段 docs/linux/PAIRING.md,57 单测)+ A.2 三端 UI consistency 设计文档(4 项必须一致 + 4 项必须不同)+ B.1 web-shell 私钥签字 UI(MultisigSigner + in-process WS topic 绕开 6-10s 冷启 + SignProposalModal + unified-key-manager DID routing,113 单测)+ B.5 跨链桥 outbound × m-of-n 多签 Layer 1+2 共 8 PRs(CLI + cc_bridges provenance 列 + crosschain-mtc helpers + verifyMultiHopBridgeEnvelope auto-runs check)+ C.1 watch face VoiceMode shortcut(phone NavGraph + wear MessageClient forward + trigger_source 锁 WEAR_FORWARD 防伪,33 单测)。
Android GA 后续 scope #21 P1 主体 5/5 全闭环 — A.1 + A.2 + B.1 + B.5 + C.1 一日齐落
issue #21 GA 后续 scope 在 Android v1.0 GA 上架后开工,按 Triage 分层 P0 前置 / P1 主体 / P2 候选三级。P0 前置 (A.3 ADR review v2.0 + B.2 web-shell multisig 冷启 + B.6 PQC 严格模式) 2026-05-12 已落地。本批 P1 主体 5 项一日内全部闭环:A.1 桌面 Linux native 配对 — audit 反驳设计文档"Linux 需补 mDNS systemd 单元"是误解,@libp2p/mdns + bonjour-service 纯 JS 不依赖 avahi-daemon;实落 3 PR:cc pair preflight 5 项 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 场景预生成 token),dist-tools/systemd/chainlesschain.service hardening 全套模板(NoNewPrivileges / ProtectSystem=strict / ReadWritePaths whitelist / MemoryMax 2G),docs/linux/PAIRING.md 9 段用户指南(3 场景 / 5 blocker 修复 / 诊断包收集),57 单测。A.2 三端 UI consistency 设计文档 v0.1 baseline — 4 项必须一致(语义色 / 高风险红色 hex / DID 短显规则 6+4 字符 / m-of-n 进度展示 m/n + 分隔符)+ 4 项必须不同(手表大按钮 ≥48dp / 桌面侧栏 / 车载 voice-only / 手机 thumb zone)。B.1 web-shell 私钥签字 UI 4 PRs — MultisigSigner ukeyManager adapter(4 driver return shape normalisation),multisig.sign in-process WS topic(绕开 cc subprocess 6-10s 冷启),signWithExternal async API(core-multisig 新增),SignProposalModal.vue(Pinia store + member dropdown + dev-only hex source),unified-key-manager DID-based signer routing(同 DID 跨 driver 自动路由),113 单测。B.5 跨链桥 outbound × m-of-n 多签 8 PRs(Layer 1+2)— Layer 1:CLI bridge --require-multisig + bridge-consume + web-shell crosschain.bridge.consume in-process topic + Multisig.vue 执行按钮 + 多签设计文档 §6.3;Layer 2:cc_bridges m-of-n provenance 列 + crosschain-mtc attachMultisigProvenance/stripMultisigSigsForCanonical helpers(strip-all-sigs canonical form 镜像 _stripSigsForPublisher 让 producer/verifier 喂同一 JCS bytes)+ buildMultiHopBridgeEnvelope 3rd arg + verifyMultiHopBridgeEnvelope auto-runs provenance check + bridge-consume --mtc 把 multisig provenance 带入 staging。Layer 3 external-blocked Q-COMP-3:真 testnet 锚定 + contract audit + KYC + bridge counterparty 选型不计入本 scope。C.1 watch face VoiceMode shortcut 3 PRs — phone-side VoiceLaunchActions + VoiceTriggerSource 4 enum(AUTO_BUTTON / PHONE_SHORTCUT / WEAR_FORWARD / VOICE_TRIGGER)+ NavGraph 路由,CcPhoneVoiceListener Data Layer service(/cc/voice/start MessageClient path),wear VoiceSender + VoiceShortcutTileService standalone Voice tile + VoiceComplicationService(watch face 复杂功能槽位)+ VoiceForwardActivity(intent + 50ms vibration + 3s timeout)。安全约束:trigger_source 字段 wear 侧仅信息用途,phone 侧锁 WEAR_FORWARD 防伪 — 防 wear 端伪造 trigger_source 提权到 AUTO_BUTTON / PHONE_SHORTCUT。Audit reframe:设计文档说"需先抽 generic cc.voice.start IPC"不准 — Auto Phase 1 实际是 in-process VM event 没有公开 IPC,wear 走 Wearable Data Layer MessageClient 直 forward 是更直的路。33 单测。最终 P1 sweep 找到 2 个 Robolectric 测试 bug(同根因):C.1 PR1 VoiceLaunchActionsTest + C.1 PR2 CcPhoneVoiceListenerTest 漏标 @Config(sdk=[33]),Robolectric DefaultSdkPicker 拒收 compileSdk=35(maxSdkVersion=34)— commit f1d283833 统一与 :app 其它 Robolectric 测试一致。P2 候选 4 项 (B.3 DID rotate / B.4 air-gapped QR signing / C.2 LongTask complication / C.3 wear instrumented test) 等 GA Play Store + 真用户反馈复评。Follow-ups gated on GA reflection:A.1 full headless WS signaling listener + IPv6 multicast + WSL2 helper / B.5 Layer 3 真链上锚定(external-blocked Q-COMP-3)/ B.1 F1-F4 encrypted software secret store + CLI --keystore flag + unified radio + UnifiedKeyManager IPC bind-did / C.1 真机 instrumented E2E + 预览 drawables + phone shortcut tile + wear failure toast UX。issue #21 + Android 重新定位 §10 GA 后续 scope。
🎯 Plan A.1 真机 E2E 收口:Android 远程终端从"打不开"到"完整可用"(8 bugs 一次扫净)
v5.0.3.53 那一天 Plan A.1 把信令链路从 4 跳砍到 1 跳 DataChannel 直连,协议层 RTT 200-500ms → 30-80ms 显著改善。但用户拿到 v5.0.3.53 真机测试时反馈 "终端打不开",深挖发现 v5.0.3.53 暴露了 8 个独立的 latent bug,每个都是协议设计正确但 implementation 细节犯错的典型案例 —— 这是 protocol-level success 到 product-level success 之间的距离。bug 链复盘按 root cause 顺序:(1) WebRTC echo loop:sendOffer 把 target peerId 误写进 self 的 currentPeerId,导致 WS 因任何原因断开后 reconnect 自动 re-register 把 mobile 注册成 desktop 的 peerId,中继路由把 mobile 的消息 forward 回 mobile 自己 → DC handshake 永远失败 fallback signaling → 但 signaling 也 stuck 因为 (2) 中继 server.js 的 handleMessage forward 路径只校验 to 不补 from,desktop 回包 to=undefined → 中继 reject "missing to field" → desktop 重试 → 死循环吃中继带宽。修法:sendOffer 完全不动 currentPeerId(currentPeerId 唯一 owner 是 register())+ 中继 server.js handleMessage `if (!msg.from && ws._peerId) msg.from = ws._peerId`。(3) iceServers TTL 24h 到期跨 NAT 完全不通,桌面 ICE 创建好后 24h 不会主动 push 新的 iceServers 给 mobile —— 修法:mobile-bridge.bridgeToLibp2p 每次有 inbound message 时调 maybeRefreshIceForMobile + 12h 节流(半 TTL)防雪崩。(4) TerminalRpcClient stdout dedup gate 写错:`if (lastSeq && seq > lastSeq)` 但首条 stdout 时 lastSeq 是 undefined 短路 → 每条 stdout 被 drop(gate 永远 truthy)—— 修法:移除 gate(xterm.js render duplicate stdout 是 cosmetic harmless)。(5) TerminalListViewModel.createSession.onSuccess 的 closure shadow:`{ created -> _state.update { it.copy(creating = false, lastCreatedId = it.lastCreatedId) } }` —— 内层 update 的 it 是 state(CreatedSession 的参数名 `created` 被外层 `it` shadow 了写法 `it.copy(lastCreatedId = it.lastCreatedId)` 实际是 `state.lastCreatedId = state.lastCreatedId` 永远 no-op)。修法:把 onSuccess 显式 named `created -> ... it.copy(lastCreatedId = created.sessionId)` + List 屏 LaunchedEffect(state.lastCreatedId) 在新 sessionId 出现时自动 navigate 到 SessionScreen + consumeLastCreatedId 清理。(6) TerminalWebView 黑屏真因(最难定位):Compose AndroidView 默认 LayoutParams.WRAP_CONTENT × WRAP_CONTENT。WebView 用 wrap_content 高度时问 HTML body "你多高" → body CSS height:100% → 依赖父级(WebView)高度 → wrap_content = 内容高度 = body 高度 = 0 → 死锁,WebView 永远 0 高。但 fitAddon.fit() 在 0×0 容器返回 cols=49 rows=1 默认垃圾值(>0 绕过任何"cols>0"的 guard),onReady 通知桌面 PTY resize → 桌面 PTY 被 resize 成 1 行 → 所有 stdout 全挤进顶部第 1 行,其余区域是 #1e1e1e 底色 → 用户看到的"全黑"其实是底色。三层定位:fix9 用 ResizeObserver 监听 #term div + setInterval 100ms × 30 兜底;fix10 改用 DOM clientWidth/clientHeight 做 guard 替代 xterm.cols/rows;fix11 真因 — TerminalWebView LayoutParams 强制 MATCH_PARENT × MATCH_PARENT 让 Column.weight(1f) 真的能给 WebView 分配高度。(7) cc / claude / npm 远程终端不可用:PtyManager.pty.spawn(cmd, [], {...}) args 写死 [],bash/wsl 都不走 login mode → ~/.bashrc 不加载 → 用户的 npm-global / cargo / brew 等全局 CLI PATH 完全不在 spawned shell 里。叠加 Windows shell=bash 解析的 PATH 顺序优先匹配 C:\Windows\System32\bash.exe(WSL bash)而不是 git-bash,进 WSL 后又是 root 用户 PATH 一样不含 npm-global。修法:resolveShellCmd 改返回 {cmd, args},bash 加 -l,wsl 加 ["--", "bash", "-l"];shell=bash 优先 probe C:\Program Files\Git\bin\bash.exe 等已知 git-bash 路径,命中用绝对路径,fallback 才用 PATH。Android 端选 bash 创建 session 后 prompt 变成 longfa@DESKTOP-MTMV2RE MINGW64 而不是 root@...,cc -v 直接输出 0.161.12,claude / npm 全部可用。complete fix 链 commit 8d3c95df6 (7 bugs) + commit f54a6fcd0 (PtyManager) + memory 复盘 feedback_currentpeerid_target_vs_self_trap.md + android_webview_xterm_resize_observer.md。手机端真机 e2e 验证:登陆 → 配对桌面(已配对 fb8380b1...)→ "+ 新会话" 选 bash → SessionScreen 立刻显示 git-bash prompt → 敲 cc -v 输出版本号 → 敲 claude 启动 Claude Code CLI → 敲 ls 看完整目录 listing 绿色文件名渲染 → 输入 + stdout 持续双向流通(logcat 看 terminal.stdin / terminal.stdout 不停流动 seq 持续递增)。这一次远程终端从演示走到了能用 —— 手机在路上能指挥桌面执行任意 CLI 命令,是真的"移动遥控器"。分发:桌面 binary v5.0.3.53 → v5.0.3.54 重打;CLI chainlesschain npm 0.161.12 不变(CLI 这次没改);Android versionCode 503053 → 503054 / versionName 5.0.3.53 → 5.0.3.54。
Plan A.1 远程终端 Android↔桌面 WebRTC DataChannel 直连(Phase 1–5 一日全落 7 commits)
v5.0.3.52 Plan A 真机首测 Xiaomi 24115RA8EC × Win desktop dev 暴露了 1 个架构性问题:4 跳信令链路 phone→router→public-relay→desktop-RelayClient 在 NAT idle / 蜂窝运营商间歇杀 TCP 时整链路 fragile 任一跳断即整体失败。Plan A.1 把高频高吞吐终端流量从 signaling 链路切到 WebRTC DataChannel 直连绕开中间所有跳;signaling 路径保留作 fallback。性能预期端到端 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 修 commits d22b7ac8a + bb759bc78 SignalClient.forwardedMessages 迁移多订阅 SharedFlow 替代单 listener setOnForwardedMessageReceived — 原 bug:WebRTCClient.initialize 装的 ice:config 拦截器在用户进 TerminalListScreen 时被 TerminalRpcClient.start 后写覆盖 → ice:config 推送丢 iceServers 24h 过期跨 NAT 完全不通;新增 WebRTCClient.dataChannelReady StateFlow Boolean derived flag READY 才真意味 DC OPEN 避免 ICE-connected 但 DC 未开的误判。Phase 2 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 commit 91e77e489 TerminalListViewModel.init 检测 DC 未 ready 异步触发 RemoteConnectionManager.connect + UI chip 显示 P2P 直连绿 vs 中继路径黄 路径状态用户可见。Phase 4 commit dd9b1227e Android + fc3752360 desktop Android TerminalRpcClient 双订 SharedFlow stdout 按 sessionId|seq 256-LRU 去重 exit 按 sessionId 64-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 实时映射 dataChannelReady chip。测试 Android TerminalRpcClientTest +3 dedup / SignalingRpcClientTest +4 transport selection / WebRTCClientTest +1 Trap 1 回归 + 修 mockk relaxed StateFlow 泛型擦除致 12-test regression 加 every mockPairedDesktopsStore.devices returns MutableStateFlow emptyList 修;desktop mobile-bridge.test.js 新 14 测覆盖 LRU dedup 5 维 (TTL / capacity eviction / whitelist 之外不去重 / JSON-RPC response 不去重 / missing id 不去重) + sendToMobile DC 优先 vs signaling-relay 双发兜底 5 维 (DC OPEN 单 DC / readyState 多形 / DC missing 双发 / DC closed 双发 / missing relay 不抛) + guard rails 2。三套件全绿 11 + 15 + 21 Android + 14 desktop + 既有未动。真机 e2e §5.3 5 场景矩阵移交用户:LAN 同 WiFi DC 秒级握手 / 蜂窝网 TURN 路径 / 双 NAT 3G symmetric 应 fallback signaling / DC 工作中模拟失效 fallback ≤ 3s / DC 恢复后自动切回。设计文档 docs/design/Android_Remote_Terminal_Plan_A1.md v1.0 含 §1.2 三个 trap 完整分析 (setOnForwardedMessageReceived 单 listener / DC 入向与 signaling forward 两条路径 / P2PClient.sendCommand DC-only 但有自己 envelope 与 TerminalRpc 不兼容) + §3.7 不复用 :core-p2p DataChannelTransport 决策 (terminal envelope JSON vs sync 二进制 P2PMessage 不通) + §5.3 真机 e2e 5 场景验收矩阵。遥测 [SignalingRpc.metric] path=dc|signaling reqId 上线首周观察 fast-path 占比目标 ≥80% 用户基数 ≥10 设备低于 80% 说明 DC 不通比预想多需诊断。分发桌面 binary v5.0.3.52 → v5.0.3.53 重打 CLI chainlesschain npm 0.161.12 不变 Plan A.1 work all under android-app/ + desktop-app-vue/ + docs/ Android versionCode 503052 → 503053 / versionName 5.0.3.52 → 5.0.3.53 按 feedback_android_tag_follows_desktop 与桌面同号原则。
Plan A 远程终端:Android↔桌面 PTY 全链路(Phase 1–4 全部落地 + 162 测试全绿)
用户痛点 "PC 上开了很多终端 能不能在 Android 上看到这些终端的输出并远程输入指令"。硬约束 Windows 上已经在跑的外部终端不能被另一进程 attach (OS 句柄私有)。落地方案 A — ChainlessChain 桌面端用 node-pty 托管新开终端 复用 #21 Remote Operate signaling-relay 通道把 stdin/stdout 流到 Android。Phase 1 桌面主进程 PtyManager (lazy node-pty + 256KB ring buffer + 24h idle kill + shell 白名单 pwsh/cmd/bash/wsl + 8 session 上限) + RingBuffer (byte-aware FIFO 不持久化 安全 > 韧性 — 终端输出常含 API key / git diff 含密钥) + terminal-handlers.js (8 WS topics) + terminal-ipc.js (V6 native IPC bridge) + confirmation-dialog.js (高危关键字 Electron messageBox + 永久信任 per-cmd cache)。startWebShell 接 ptyManager + terminalRequireConfirmation;handleMobileCommand 加 terminal.* namespace + mobile-bridge per-peer stdout/exit subscription fanout。Phase 1.5 cc ui mirror — packages/cli/src/gateways/ws/topic-handler-attachment.js 抽出 ws-cli-loader 的 dispatcher 包装为 ESM helper;cc ui 的 agent-runtime.startUiServer 调一遍 → cc ui 也能 /terminal。Phase 2 三壳 UI — web-panel useTerminal composable (singleton fan-out via module-level sub map base64↔UTF-8 编解码) + Terminal.vue route /terminal (xterm.js lazy import + 多 session 标签 + history 补帧 + ResizeObserver + dangerous-keyword toast) + 侧栏菜单 + i18n;V6 plugin widget plugins-builtin/terminal/plugin.json + shell/widgets/TerminalWidget.vue + shell/TerminalPanel.vue (xterm.js 嵌入 + IPC bridge electronAPI.terminal.*) + slash 命令 /terminal。Phase 3 Android — TerminalRpcClient.kt (复用 SignalingRpcClient envelope pattern + observeStdout/observeExit SharedFlow) + TerminalWebView.kt (WebView ↔ Kotlin JS bridge) + xterm-shell.html + xterm.js / addon-fit / xterm.css vendored 入 assets/terminal/ + TerminalListScreen / TerminalSessionScreen Compose + softkey toolbar (Ctrl/Tab/Esc/方向/Ctrl+C/D) + NavGraph 2 路由 + RemoteOperateScreen 加 "打开远程终端" 按钮。Phase 4 韧性 — requireConfirmation 接桌面 systray + paired_devices/permission-gate 路径 (已沿用现有 p2p-command-adapter) + mobile-bridge stdout fan-out (per-peer subscription map) + 重连 history 补帧 + 24h idle kill。测试 162 新增全绿 — Desktop main 61 (RingBuffer 7 + PtyManager 15 + terminal-handlers 15 + terminal-ipc 12 + confirmation-dialog 5 + ws-smoke integration 6 + 真 PTY spawn cmd.exe integration 1 测试在 5.08s 完成端到端 stdin 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 (full happy path + flow event fanout)。同时修 pre-existing test drift — widget-registry.test.ts (PREVIEW_WIDGETS 已扩到 7 个 bridge-mtc + federation-governance 此前漏更新) / dashboard-store.test.js (没 mock mcp.list_tools 的 sendRaw 回应 drift since commit d9cc41432) / views-mount-smoke.test.js 5 个尾部视图 (Projects/VideoEditing/P2P/Memory/Git 在 50+ 文件并行套件下撞 Notification + Pinia 跨测试状态污染) / Projects-folder-picker.test.js 删除过时测试。设计文档 docs/design/Android_Remote_Terminal_Plan_A.md + 用户文档 docs-site/docs/guide/remote-terminal.md 双站同步。Future A.1 流量切 WebRTC DataChannel 绕中继带宽瓶颈 / Future B 已开外部终端只读快照 截图 + OCR + Win32 SendInput 留后续。
远程操控 Plan A + B 基础设施落地:WebRTC 透传中继 + STUN/TURN 部署 + iceServers 凭证签发
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。客户端按场景 fall-through:优先尝试 DataChannel 失败 fallback 信令 forward。Plan A 核心改动:(1) 中继 server.js handleMessage switch 新增 case offer/answer/ice-candidate/ice-candidates/peer-status 与 type=message 同路径 forward + 注入 from 字段(取 ws 已 register 的 peerId 与 LAN signaling-handlers 行为一致 桌面 handleOffer 内部 socket.peerId 或 message.from 取对端 relay 路径必须显式补 from)。(2) 桌面 main startRelayClient.onMessage 简化为统一 dispatch 不再按 type case:pair-ack 仍单独路由 写 sessionState 其余(command:request 或 offer 或 answer 或 ice)交给 mobileBridge.handleSignalingMessage 同款 dispatcher 本来就按 msg.type 分发到 handleOffer 或 handleAnswer 或 handleICECandidate 或 handleP2PMessage —— LAN 路径与 relay 路径完全等价。Plan B 核心改动:(1) coturn 4.6 docker compose host network UDP relay 端口范围 49152-65535 host network 避免 NAT 转换 监听 0.0.0.0:3478 UDP+TCP + 5349 TLS 域名 turn.chainlesschain.com A 记录 47.111.5.128 Let_s Encrypt 证书 acme.sh @gitee 镜像 GitHub 大陆访问受限 鉴权 use-auth-secret time-limited credentials。(2) signIceCredentials(userId) 签发:username = expiry-ts:user-id credential = base64 HMAC-SHA1 TURN_SECRET username iceServers 返回 stun:turn.chainlesschain.com:3478 + turn:3478?transport=udp/tcp + turns:5349 三档优先级 + 凭证。TTL 24h 足够单设备使用过期前用户多半已重新配对。env CC_TURN_SECRET 强制必填源码里没有 fallback 绝不硬编码 secret(任何 fork 也无法签出生效凭证)缺 env 时降级 STUN-only(LAN + 双 NAT 友好场景仍能 WebRTC 跨 NAT 不可用)。(3) iceServers 不塞 QR — QR payload 650+ 字符 + 高纠错 280px 扫描识别率暴跌实测 2026-05-14 阻塞 30s 扫不出 改成扫码后异步推送:桌面 pair-ack matched 后 pushIceServersToMobile(ackPayload) LAN signaling + 公网中继双发 type chainlesschain:ice:config payload pcPeerId iceServers iceExpiry 给手机 mobileDid。手机端 WebRTCClient.setOnForwardedMessageReceived 拦截该 type persistIceConfigMessage upsert PairedDesktopsStore.iceServersJson 同步加 SignalingRpcClient.handleIceConfigMessage 监听备份 race-tolerant 万一 WebRTCClient 未初始化时 RemoteOperate 路径也能 catch。(4) Android WebRTCClient.createPeerConnection 时 resolveIceServersFor(pcPeerId) 用 stored iceServers 含 turn.chainlesschain.com TURN fallback Google STUN 过期检查 desktop.iceExpiry > 0 且 now > iceExpiry fallback。parseIceServersJson 支持 urls 既可以是 string 也可以是数组。完整 plan A+B 配合数据流:配对阶段 phone scans QR pair-ack desktop persist SQLite + push iceServers phone receives ice:config PairedDesktopsStore upsert;WebRTC 建连阶段 phone opens RemoteControl WebRTCClient.connect(pcPeerId) createPeerConnection 用 stored iceServers 含 TURN createOffer signaling forward LAN or relay desktop handleOffer setRemoteDescription createAnswer forward back ICE candidate exchange via forward STUN/TURN 打通 DataChannel open。命令路径分流:Low-freq SignalingRpcClient relay forward Plan C / Hi-throughput DataChannel direct Plan A / NAT-hard TURN relay Plan B DataChannel through relay。阿里云安全组要求 UDP 3478 / TCP 3478 / TCP 5349 / UDP 49152-65535 全开放给 0.0.0.0/0 未开端口 coturn 容器跑但外部不可达 WebRTC ICE 收集失败 DC 建不起来。已知限制 / 待办:iceServers TTL 24h 过期后 fallback Google STUN 跨 NAT 不通 后续 mobile 检测 expiry 临近经信令请求新凭证;WebRTC P2P 端到端真机跨 NAT 实测待补 v1.4 GA 前做一次 phone 4G + desktop home WiFi 完整 file-transfer 流;Signal Protocol E2EE 待 Plan A DC 通了再考虑 DC 已是直连 TLS 之外加 Signal 收益边际;coturn 凭证管理 API 长期需 backend HMAC 签发 API 鉴权用户身份后才签。设计文档 docs/design/Android_Remote_Operate_Plan_AB.md。
v1.2 GA 反馈 5+3 项整合: 桌面↔手机项目工作流 P1+P2+P3A + 删除 fix + 日常模板
v1.2 GA 反馈到位后整合 5+3 项 issue 21 https://github.com/chainlesschain/chainlesschain/issues/21 #2/#3/#4/#5/#7/#8。北极星目标 手机端做 AI 项目的交互要像电脑端那样丝滑。分两阶段。阶段 1 (前期 P0 GA 上架前) A.3 ADR review + B.6 PQC 严格模式 verifier + B.2 削 web-shell multisig cc subprocess 冷启 + AI-3 forward-compat seam + 2 bug fix 已落 commit 348896382 / e24386d00 / b1c7cfd95 / 45a88270e / c0d061328 / 409afddcd。阶段 2 (中期 v1.2 GA 反馈到位) 项目工作流四件套: #2 项目无法删除 fix (commit fc24f9856) EnhancedProjectCard 完全没有 delete UI 旧 ProjectListScreen 的 delete 代码是死代码未连入 NavGraph 加 3-dot 菜单 + AlertDialog 确认 onDeleteClick 调 viewModel.deleteProject DAO softDelete status deleted Room Flow 自动从列表移除。#3 模板改日常 11 个 (commit 99d38bf69) L1+L2+L3 mobile 定位下用户不是程序员原 11 IDE 模板 Android React Spring Flutter 等跟使用场景不符整个 ProjectTemplates 重写为日常生活模板购物清单 旅行计划 读书笔记 灵感收集 健身计划 食谱记录 学习计划 家庭账本 工作日志 会议记录 空白 TemplateCategory 加 5 新类目 DAILY TRAVEL STUDY HEALTH FINANCE。#4/#7 桌面 CLI + REMOTE handler P1 (commit 32ccabdb5) packages/cli/src/lib/project-runtime.js SQLite cascade native better-sqlite3-multiple-ciphers better-sqlite3 sql.js WASM 自动 fallback + Electron userData path resolution Win macOS Linux + cc project init/list/show/delete 4 subcommands 直写 desktop chainlesschain.db WAL 并发安全。desktop-app-vue/src/main/remote/handlers/project-management-handler.js 6 actions list get init delete listFiles getFile 暴露给 Android L3 REMOTE 调用复用 desktop DatabaseManager。CLI 7 integration tests + handler 21 unit tests 全过。#4 Android→Desktop 反向 sync P2 (commit 2646bbb4e) audit 发现桌面→手机 sync 通 mobile-bridge-sync _fetchProjects walker + Android ProjectSyncApplierImpl 反向手机→桌面断 SocialSyncWalker 不含 projects 表。新增 ProjectDao.getProjectsSinceCursor 无 status 过滤让 status=deleted 也 emit + ProjectSyncWalker.kt feature-project 约 120 行 op mapping CREATE/UPDATE/DELETE snake_case JSON 对齐 desktop + CompositeSyncRepositoryWalker.kt :app/sync 聚合 SocialSyncWalker + ProjectSyncWalker + SyncWalkerModule.kt Hilt @Binds 替换 feature-p2p single-walker binding。P2PModule.kt 注释旧 binding。ProjectSyncWalker 12 tests + CompositeSyncRepositoryWalker 7/7 tests 全过。顺手修 5 个 pre-existing feature-project 测试 kotlin.test.* org.junit.Assert.* imports 解锁 :feature-project:compileDebugUnitTestKotlin。#5/#8 web-shell Projects + in-process WS P3 Part A (commit bfdde637d) desktop-app-vue/src/main/web-shell/handlers/project-handlers.js 6 in-process WS topics 包装 P1 ProjectManagementHandler DRY 复用同一 handler 同时服务 web-shell + mobile L3 REMOTE 避免 ws.execute(cc project …) asar:true 子进程冷启 6-10s。packages/web-panel/src/views/Projects.vue 重写为真项目管理页 4 stats + state/name filter + table id/name/type/status/sync_status/updated_at + Detail drawer 含 Descriptions + 文件列表 + Create 模态框 10 types useShellMode.isEmbedded 分发 in-process vs ws.executeJson 兜底。原 Projects.vue 项目 init/setup/templates 内容 cp 过来到 ProjectInit.vue 路由 /project-init 保留 backward 访问。project-handlers 7 unit tests 全过。version 不 bump 等 P3 Part B Android ProjectCommands.kt 落地 + 用户验证 P1+P2+P3A 后与 P1 主体一起 release。
Android v1.3+ P0 前置三项 GA-independent 收口 + AI-3 forward-compat + 2 bug fix
v1.2 GA 上架前的 P0 前置批次。issue 21 https://github.com/chainlesschain/chainlesschain/issues/21 A.3 ADR review + AI-1 amend (commit 348896382):8 ADR 全 audit,5 keep + 2 amend (ADR-7 cc-mobile.json 从未创建实际走 user_settings + mobile.* scope,ADR-8 实际 disk-first + push-based 非 pull) + 1 revise (ADR-2 M2 DID wallet 走软件 Ed25519,blocks B.3 DID rotate)。ADR-2 选项 A/B/C 决策待 v1.2 GA Play Console API level 数据。同 commit 设计文档 §10 v1.3+ scope triage 分层 12 子项 P0/P1/P2 + 5 依赖链。B.6 PQC 严格模式 verifier (commit e24386d00):packages/core-mtc/lib/landmark-cache.js 加 strictPqMode opt-in flag + _assertStrictPqMode landmark-level gate + _assertStrictPqModeForSnapshot per-snap gate + STRICT_PQ_MODE_VIOLATION error code + CLASSICAL_ALGS 常量。Reading A 语义拒收任何 alg === Ed25519 的 partial sig + publisher_signature。与现 heterogeneous federation 数据格式兼容,0 schema 改动,0 producer 改动。B.2 削 cc subprocess 冷启 (commit b1c7cfd95):desktop-app-vue/src/main/web-shell/handlers/multisig-handlers.js 新增 7 个 in-process WS topics 镜像 CLI --json shape (multisig.list/show/policy.show/cancel/finalize/sweep + marketplace.consume)。Topics 调 openMultisigManager() from CLI multisig-runtime.js,dynamic-import 跨 CJS/ESM 边界。Multisig.vue 加 callMultisigTopic() helper 用 useShellMode().isEmbedded 分发;7 处 ws.executeJson 全切。性能 asar:true 子进程冷启 6-10s → in-process ~20ms (SQLite open) + 查询,60-100× 提升,UX 0 改动。AI-3 SkillMetadata.signature forward-compat (commit 45a88270e):Android Kotlin 新增 ManifestSignatureVerifier interface + sealed VerificationResult.{Accepted/Rejected(reason)} + object NoOpManifestVerifier always-accept stub。SkillMetadata 加 signature: String? = null field + init invariant。RemoteSkillRegistry 加 @Volatile manifestVerifier + setManifestVerifier(v) swap seam + updateFromRemote 跑 verifier per-skill (Accepted 合并 Rejected Timber.w warn-log + 跳过)。Marketplace M0 (#21 AI-5) 上线时注入真 Ed25519/SLH-DSA hybrid verifier 即可,调用方 0 改动。Bug fix 1 wear test imports (commit c0d061328):CcPhoneDecisionListenerTest 自 cc08da0b0 v1.2 #20 P0.2 起用 kotlinx.coroutines.GlobalScope.launch 但 imports 缺 launch/delay/GlobalScope/DelicateCoroutinesApi,block 整个 :app:compileDebugUnitTestKotlin,加 4 imports 解锁。Bug fix 2 B.6 disk-load gate (本次 QA sweep test-driven 发现):LandmarkCache.loadFromDisk() 直接调 _validateAndStoreSnapshot bypass ingest 的严格模式 gate;strict mode OFF 写入磁盘的 Ed25519 landmark 下次 strict mode ON 加载时仍接受 silent invariant 违反;修:per-snapshot 严格检查移到 _validateAndStoreSnapshot 头部统一处理,+2 disk-load integration tests 锁回归。测试:B.6 landmark-cache-strict-pq-mode 11/11 (9 原 + 2 disk-load) + B.2 multisig-handlers 23/23 unit tests via runtimeFactory 注入 seam + AI-3 ManifestSignatureVerifier 10/10 + SkillMetadataTest 9/9 + RemoteSkillRegistryTest 38/38 regression + web-shell 379 regression 25 test files 全过。version 不 bump:本批是 v1.2 GA 前置工,待 v1.2 GA 上架反馈到位时与 P1 主体一起 release。
Android Remote Operate Plan C 信令转发 RPC:桌面遥控器真接通
配对(v5.0.3.49 W3.7 Flow B QR)完成后下一步:让手机真正"操控"桌面。三条路径:A WebRTC P2P 直连大工程 + B STUN/TURN 穿透中工程 + C 复用配对已通的信令 forward 管道小工程。Plan C 务实先行:pair-ack 已走 forward 路径并打通双向收发,桌面 handleMobileCommand 已接好,只缺手机端 SignalingRpcClient + 简单 UI 屏。A+B 留后续(视频流、实时同步、高频小消息)。(1) SignalingRpcClient 落地 (app/.../remote/client/SignalingRpcClient.kt):构 {type:"chainlesschain:command:request", payload:{id, method, params, auth, timestamp}} → PairingSignalingGate.sendAck;一次性安装 setOnForwardedMessageReceived listener 按 requestId 关联 CompletableDeferred resolve 响应;30s withTimeout 兜底;LAN sendAck 失败时自动 reset gate → 切公网中继 URL → re-register → 重试一次,与 ScanDesktopPairingViewModel 配对路径同模式。(2) RemoteOperateScreen + ViewModel (app/.../remote/ui/RemoteOperateScreen.kt):极简 UI 3 chip 按钮 Ping/系统状态/系统信息 + 响应 JSON 显示 + 解除配对;首页"已连接桌面"卡片点击 → NavGraph 跳 remote_operate/{peerId}。(3) PairedDesktopsStore (core-p2p/.../pairing/PairedDesktopsStore.kt) SharedPreferences JSON 落已配对桌面列表 (pcPeerId/deviceName/lanSignalingUrl/relayUrl/pairedAt/lastSeenAt);upsert idempotent by pcPeerId;首页改读 store 而非 p2pClient.connectedPeers — Plan C 不建持久 P2P 连接,扫码后信令立刻断 connectedPeers 即空,UX 反直觉的根因。(4) Desktop RelayClient (desktop-app-vue/src/main/p2p/relay-client.js) outbound 长连 wss://signaling.chainlesschain.com,register 桌面 pcPeerId 必须与 mobileBridge.peerId 一致否则外网手机找不到目标 peer,onMessage 路由 pair-ack/一般 mobile command 进 recordPairAck/handleMobileCommand 与 LAN 同一管道;指数退避自重连 max 60s。(5) mobile-bridge.handlePairAckFromRelay bug fix:main/index.js 调 this.mobileBridge?.handlePairAckFromRelay(...) 但方法之前不存在,optional-chain ?. 静默吞掉 relay 路径 pair-ack 不触发任何事件;补 EventEmitter 通知与 LAN 行为对称。(6) MobileBridgeHeaderStatus.vue web-panel header 显示已配对 mobile 数量,5s 轮询 cc p2p devices --type mobile;parseJsonOutput 跳过 CLI log 前缀 [AppConfig]/[DatabaseManager] 等避免 false-positive 匹配为 JSON-array 开头。(7) i18n RemoteOperateScreen 11 字符串提取到 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 启动快几个数量级)/ 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)。两个关键技术决策:用 runCurrent() 而非 advanceUntilIdle() — SignalingRpcClient 内部 withTimeout(30000) 用虚拟时间 advanceUntilIdle 会把时间推到 30s 后触发误超时;新增 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 入用户出场清单与 Flow B 验证 pattern 一致。约束:信令一跳 + 公网中继多一跳 p99 100-500ms 低频命令可接受;中继 TLS 但服务器看得到 payload 端到端加密需上 Signal Protocol session;中继宕 = Plan C 不可用 LAN 仍工作。路线图:Plan C ✅ 落地 → Plan A.1 DataChannel 复用 → Plan A.2 高吞吐场景真 P2P 直连绕中继带宽 → Plan B STUN/TURN 穿透。设计文档 docs/design/Android_Remote_Operate_Plan_C.md。分发:桌面 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。
M-of-N multisig Phase 1d + Phase 2a marketplace mediator + Phase 2b web-panel Multisig view + Android v1.1 W3.7 Flow B QR pairing 收口 + 测试补丁
本版四条主线。(1) `@chainlesschain/core-multisig` package + `cc multisig` CLI 落地(commit 3c890dcac,v1.2 m-of-n Phase 1d):Phase 1 完整 5 个 lib —— policy.js 域级 {m,n,members[],requirePqc,defaultExpiryMs} validate/normalize;store.js SQLite 3 表 schema (proposals/signatures/policies) + 5 helper;proposals.js 状态机 pending → reached → consumed + cancelled/expired terminal;signing.js JCS canonicalize + DOMAIN_PREFIX "MULTISIG:" 防回放 + Ed25519/SLH-DSA dispatcher + verifyThreshold strip-all-sigs;governance-log.js append-only JSON Lines 审计 log,每态转捕。75 lib 单测(policy 14 + signing 21 + proposals 20 + store 12 + governance-log 8)全过。cc multisig CLI 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.js WASM,CLI 跨平台开箱即用无须每平台预装 native prebuild。marketplace.purchase / did.rotate / 跨链 bridge 三大典型 domain 由此解锁。测试基础修复 3 项:core-multisig vitest.config.js 设 globals: true(vitest 4 不接 CJS require("vitest"));5 test 文件改 ESM import;multisig-cli.test.js import 路径修 @chainlesschain/core-mtc/signers/ed25519.js → 去 .js 后缀(core-mtc exports key 无后缀)。(2) Phase 2a marketplace.purchase mediator(commit 2755093d0,设计文档 §6.1 落地):cc marketplace purchase <itemId> --amount-fen N --buyer <did> --key <hex> [--threshold-fen N] [--item-name <name>] —— amount < threshold (default LARGE_PURCHASE_THRESHOLD_FEN = 100000 fen = ¥1000) 走 direct path (CLI stub 打印 "purchased");amount ≥ threshold 必须有 marketplace.purchase 域 policy,否则 exit 2 no_policy;有 policy 调 mgr.propose 返 proposalId 让其他签名方加签。cc marketplace consume <proposalId> —— 校验 domain == "marketplace.purchase" + state == "reached" 才执行,finalize 后打印订单 payload + governance log 写 consumed 事件,错域/错态都 exit 2。共享运行时 packages/cli/src/lib/multisig-runtime.js(新文件)抽 Phase 1 commands/multisig.js 内联的 SQLite cascade (better-sqlite3-multiple-ciphers → better-sqlite3 → sql.js) + manager loader + readSecretKey / readJsonArg helpers,让 commands/marketplace.js 复用同一份;commands/multisig.js refactor 替代内联减 130 行 dedup,Phase 1 10/10 integration test 零行为变更。8 新 E2E 测试(packages/cli/__tests__/integration/marketplace-multisig-e2e.test.js)全 green:(a) 大额 ¥1500 2-of-2 全 walkthrough policy set → purchase 创 proposal → 2 签名方加 sign → reached → consume → finalize → governance.log 4 类事件 proposed/signed×2/reached/consumed;(b) 小额 ¥500 走 direct path 不创 proposal;(c) --threshold-fen 覆盖默认;(d) 大额无 policy → exit 2 blocked;(e) consume pending → exit 2 proposal_state_pending;(f) consume 错域 → exit 2 wrong_domain;(g) --help 文本验证;(h) Phase 1 兼容性回归。总 18 multisig integration test 全 green(Phase 1 10 + Phase 2 8)。marketplace.purchase 是第一个真接通业务侧的 mediator。(3) Phase 2b web-panel Multisig 视图落地(commit c758492d9,设计文档 §8.1 落地):web-shell(默认桌面入口)加 M-of-N 多签查看 / 操作面板,Phase 1 CLI 的 cc multisig list/show/cancel + cc marketplace consume 通过 ws.executeJson(...) 走 CLI 子进程。新 packages/web-panel/src/views/Multisig.vue (468 行):6-card 顶部 stats — 总提案 / 待签 pending / 已达阈值 reached / 已执行 consumed / 已取消 cancelled / 已过期 expired,各带 Ant icon + 色彩 token;两个 tab — 提案列表(表格 columns ID/Domain/State/Sigs/Created/Expires/Actions + state 过滤器 pending/reached/consumed/cancelled/expired + domain 过滤;行 actions 详情 / 取消 / 执行购买 marketplace.purchase reached only)+ 域策略(列已知 domain marketplace.purchase / did.rotate / crosschain.outbound 的 policy 详情 + 成员展开);Detail drawer (640px) Descriptions 显 domain / state / threshold / sigs / initiator / timestamps / payload JSON pretty + 签名列表 signer DID + alg + 时间 + 操作按钮 取消 pending|reached / 执行购买 marketplace.purchase reached / finalize 其它 reached + info Alert "web shell 不持私钥,sign 操作走 CLI";顶部操作栏 刷新 + 扫过期 调 cc multisig sweep。AppLayout.vue 在 security/audit 组加 multisig menu item (TeamOutlined icon) + 折叠模式 (右侧) 同步加 multisig 入口 + i18n fallback "M-of-N 多签" — appLayout.items.multisig 未配时显示中文。router/index.js 加 { path: "multisig", name: "Multisig", component } 路由。WS 通信走 ws.executeJson("multisig list --json") 等 CLI 子进程(CLI WS server _executeCommand 路径);第一次冷启动 6-10s asar:true 开销 per mtc-status-handlers.js comment — Phase 2 可接受。同份 SPA 在 desktop web-shell + cc ui 双 surface 自动可用 per memory feedback_cross_shell_feature_pattern。Phase 3 留 follow-up:私钥签名 UI 需 Unified KeyStore 接通 / WS in-process handlers multisig.list/multisig.show/... 削延迟 / 实时推送 现 onMounted 拉取一次无 WS 订阅 / Marketplace.vue 集成入口 purchase modal 直接进 multisig 流程。(4) Android v1.1 W3.7 Flow B QR pairing 落地(commit c47cbc649):desktop 显 QR / phone 摄像头扫桌面屏幕的主流应用通用 UX(微信/支付宝/Discord/WhatsApp Web 同模式)— 手机摄像头扫桌面屏幕 QR 比反向(desktop webcam 扫小手机屏 QR)识别率高得多。Xiaomi 24115RA8EC 真机 E2E verified。跨模块 DI 拆解:PairingSignalingGate.sendAck interface 落 :core-p2p 避免 :feature-p2p 反依赖 :app;WebSocketPairingSignalingGate.sendAck 实现在 :app 内 ensureRegistered + Mutex 串行化;WebRTCClient.SignalClient.sendForwardedMessage(toPeerId, payload) 桥接 mobile 端的 signaling forward。Mobile 端 UI:ScanDesktopPairingScreen + ScanDesktopPairingViewModel 用非-social QRCodeScannerScreen(ZXing 透传);NavGraph + SettingsScreen 加 "扫描桌面 QR" 入口(推荐路径)。Desktop 端 WS topics 三件套 desktop-pair-handlers.js:desktop.pair.generate-qr(6 位 code + payload + pcPeerId 三段 fallback:mobileBridge.peerId → deviceManager.getCurrentDevice → "desktop-unknown")/ desktop.pair.poll-ack(idle/waiting/acked/expired 四态)/ desktop.pair.reset;mobile-bridge.js 加 this.peerId 持久化 + 拦截 type=pair-ack 经 recordPairAck 匹配 + 写 SQLite paired_devices。Vue UI MobileBridge.vue Flow B tab(默认)+ Flow A + 手输 3-tab;antd.js 注册 AQrcode。真机 E2E 链路:Xiaomi 24115RA8EC desktop QR → ML Kit 扫 → signaling pair-ack → desktop mobileBridge 拦截 → recordPairAck 匹配 → CLI pair-from-qr 写 SQLite → Vue 列表刷新。9 项实战坑全排清。(5) 测试补丁:ScanDesktopPairingViewModelTest.kt(新增 10 测试)覆盖 onQrScanned 全部 validation 分支 + happy path + retry + idempotent + malformed JSON,MockK + StandardTestDispatcher + FakeGate 捕获 sendAckCallCount;desktop-pair-handlers.test.js(新增 19 测试)覆盖 3 handler factory + recordPairAck:generate-qr 6 case / poll-ack 4 case 用 vi.useFakeTimers 验 expired / reset 1 case / recordPairAck 4 case。Android :feature-p2p:testDebugUnitTest 41s 全绿(138 actionable tasks);Desktop 3 文件 / 45 测试全绿。分发:桌面 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 完整移动客户端。
Android M3 capture suite (5/5 code) + M4 RemoteSkillRegistry method-level + ApprovalUI 4-category + ProgressViewer + alias 兼容窗口 + M7 Android v1.0.0 GA flip
Android v1.0 RFC M3 + M4 收尾批次(7 commit / 187 新单测)+ Android M7 GA flip 一并落地(commit ffe722162,versionCode 37 → 100,versionName 0.37.0 → 1.0.0)。无桌面 / CLI 源码改动,CLI npm 0.161.7 → 0.161.8(force publish 走 release.yml 同步轨道)。(1) M3 capture suite 5/5 全部进代码层:VoiceMode 连续语音串联(commit 47bebed80,ASR → REMOTE chat → TTS pipeline);CameraOCR 拍照入 KB 流水线(commit a69269ced,ai.ocrImage + knowledge.createNote 走完);LocationTagger Play Services FusedLocationProvider + Foreground Service(commit 3f5ac8647,GPS 进 createNote.metadata);SharePayloadFlusher 接 SyncCoordinator → knowledge.createNote(commit 3d1a6e3a8,5 种 SharePayload 转 note 字段,30s push 循环末尾 drain SharedInboxRepository,失败 re-enqueue,19 新单测);PushNotifier 本地通道 + FCM 骨架(commit c0d990c91,4 NotificationChannel Cowork/Marketplace/SystemAlert/ShareInbox + 协议中立 CcPushNotificationService 入口,36 新单测,google-services.json 真接入按 android-app/docs/M3_FCM_SETUP.md 5 步用户出场)。(2) M4 D1 RemoteSkillRegistry method-level 元数据补全(commit 6e49270fd):MethodMetadata (name/paramCount/riskOverride/requiresApprovalOverride) + listMethods/getMethod/requiresApprovalForMethod/riskForMethod accessor;knowledge.* + ai.* 各 10 methods seeded 含 8 riskOverride 演示;其他 21 namespace pending 桌面 mobile-skill-whitelist 下发。16 新单测。(3) M4 收尾两件(commit f4f83cc67):ApprovalUI 4 category 适配 — ApprovalCategory enum {Sign/Cowork/Marketplace/SystemCritical} + fromMethod 推断,AndroidApprovalGate 4-arg overload 透传 category(旧 3-arg 自动 forward),Dialog 按 category 切 icon/tint/title/footer;ProgressViewer 长时任务面板 — LongTaskRegistry @Singleton MutableStateFlow (Pending/Running/Completed/Failed/Cancelled,MAX_TASKS=100 滑窗) + TaskProgressCommandRouter 接 task.* reverse-RPC (update/complete/fail/cancel/remove) + Compose ProgressViewerScreen (StatusChip + Linear/indeterminate Circular + dismiss/clear-terminal)。共 43 新单测 (9 + 15 + 19)。(4) §8.3 alias 兼容窗口(commit 0bc8e2797):SkillMetadata.aliases 字段 + 内部 aliasIndex 反查;get/listMethods/requiresApproval/risk* 全部经 resolveAlias 路径;未来 namespace 改名时旧调用方 1 版内不 break。7 新单测。(5) §8.1 README versionName + v1.0 GA 检查清单(commits 0bc8e2797 3da484e9c):android-app/README.md M3 (2/5) → (5/5 code)、M4 补 method-level + ApprovalUI + ProgressViewer;新增 ANDROID_v1_GA_CHECKLIST.md 。(6) M7 Android v1.0.0 GA flip (commit ffe722162):android-app/app/build.gradle.kts versionCode 37 → 100、versionName 0.37.0 → 1.0.0;android-app/CHANGELOG.md 加 [1.0.0] - 2026-05-12 GA entry 汇总 9 commits + 4 项已知限制;android-app/README.md 标题切 "🎉 v1.0.0 — GA"。下一步 tag v1.0.0 在 ffe722162 推 gitee+github。v1.0 GA 仍待用户出场 4 项:M3 真机 E2E / M4 D2 真机 / FCM 凭证 / M6 性能实测。
Verification release:build-android keystore fix VERIFIED + density splits 14→4 用户侧首落 + outstanding `../` 全扫净
验证型发版。无桌面 / CLI / Android 源码改动,只把 v5.0.3.46 后陆续落的 3 个 release-pipeline 修复在 CI 实跑证明 green。(1) build-android keystore 修复 VERIFIED (commit f9a7ba716):49f1440ca 把 android-app/app/build.gradle.kts:79 从 file(...) 切到 rootProject.file(...) 让 release.storeFile 路径解析基准从 :app 模块改成 rootProject (android-app/),workflow 写的 `release.storeFile=../debug-ci.keystore` 在新基准下错位到 repo root,v5.0.3.46 build-android 因此挂在 :app:validateSigningRelease。f9a7ba716 在 workflow 端去掉 `../`,让 rootProject.file("debug-ci.keystore") 直接解到 android-app/debug-ci.keystore(正是 keytool 输出位置)。v5.0.3.47 release.yml run #25632845952 build-android 真绿 verified,4 Android assets(app-{arm64-v8a,armeabi-v7a,universal}-release.apk + app-release.aab)正确入 Release。(2) Density APK splits 用户侧首落(commit 9865c5c08):v5.0.3.46 已合但因 build-android 挂没产出 release assets,本轮首次以 release 形态用户可见:每 density × ABI splits 在 Android 5.0+ runtime resource selection 加持下意义不大,移除后 release asset count 14 → 4(3 APK + 1 AAB),AAB 上 Play Store 继续走 bundle{} 块的 density delivery 不影响用户。(3) 剩余 `../` 三处扫净(commit 5a06421cd):f9a7ba716 只修 workflow;keystore.properties.template / docs/guides/KEYSTORE_SETUP.md / orphan android-app/.github/workflows/android-release.yml 同病的 `../` 这次一并扫掉。约定全 repo 统一:release.storeFile=keystore/<name>.keystore(无 `../`),物理 keystore 落 android-app/keystore/<name>.keystore。KEYSTORE_SETUP.md 的 CI 例子顺手加 `working-directory: android-app` 保 keystore 落对位置。orphan workflow 加头注释说明 `.github/workflows/` 嵌套层级 GitHub Actions 不会执行。桌面 binary 重打 v5.0.3.46 → v5.0.3.47 二进制内容等价,auto-updater 比对 `5.0.3-alpha.47 > 5.0.3-alpha.46` 让 v5.0.3.46 用户重启拿到新 build。`chainlesschain` npm 维持 0.161.7。Android versionCode/Name 不变但 APK 因 density splits 关闭从 14 → 4 个产物。
Phase 3d 桌面 ↔ Android 双向同步全套 + Android 0.37.0 七件套 + e2e CI 静默回归洞收口
三条主线一次 ship。(1) Phase 3d 桌面 ↔ Android 双向同步(12 commit):M2 桌面 sync engine 落地(5 ResourceType walker:note / conversation / did / community / channel + tombstones + IPC wire-up + 52 测试,过程中找出修 3 prod bug);M3 Android 侧用 dagger.Lazy 解 4 处 Hilt 循环 + Room 持久化 SyncRemoteCursor + sync.* JSON-RPC handlers + transport wiring;M4 桌面 SyncMobile 设置页 + DeviceManager + 手动 pairing 表单;v1.1 SocialSyncWalker 真填 handlePullRpc + DID auth 验证 + SyncCoordinator socket 连上自动 trigger;v1.2 真 @noble/ed25519 签名 + Android gate 4 验签,gate 1-4 全部 strict-verify。(2) Android 0.37.0(commit 1348636ad,7 件用户可见):Volcengine SeedASR 语音(16kHz mono PCM + 800ms poll + AsrSettingsScreen + Recording/Transcribing dialogs);APK 自更新 issue #21(GitHub Releases android-v tag arm64-v8a + DownloadManager + REQUEST_INSTALL_PACKAGES + Settings 检查更新入口);Splash 紫色渐变旋转环 + TT logo + 修 splash race;Claude coral 主题 #D97757 primary + dynamicColor=false 保品牌色;i18n issue #16 三地区 zh-rCN/rTW/rHK 显式 qualifier + AppCompatDelegate locales;生物识别 toggle 接 AuthVM;KeyManagementScreen DID + public key hex + trusted devices + reset;顺手修 OpenAIAdapter 主线程 12s 阻塞 + 256 个 rs_* string stub。(3) e2e CI 静默回归洞收口(commit e807d576c):drop e2e-tests workflow JOB 级 continue-on-error: true —— 之前让 3/3 OS 失败显示 success,"No team IPC interface found" 沉了几周;同期加 Playwright browsers cache + npm cache,单 OS 时间 ~14m → ~6-8m。
cc ui llm.chat parity + 意图理解 opt-in 开关 + 真流式 + Vue Proxy 修复
四条联动收口。(1) cc ui llm.chat 路由(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 第一行短路:if (mode === "global" || !intentEnabled.value) { sendMessage; return }。桌面壳同享 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 修复)。
LLM OCR + audit-ipc 覆盖 + chat-intent 90s 兜底
一条 user-visible feature + 三条质量收口。(1) 截图 OCR LLM 引擎(39b16e29f):Tesseract.js 中文准确度差,新增 engine 参数 auto/llm/tesseract 三态。auto 默认走火山豆包视觉(已配置),LLM 出错带 fallbackFrom / fallbackReason 标签自动降级回 Tesseract;llm 强制视觉 LLM(doubao-1.5-vision-pro,userBudget=medium);tesseract 强制本地。Provider 白名单 Set(["volcengine"]),扩展到 gemini / openai / anthropic 只需在各自 LLMManager 暴露 chatWithImage* 后加一项。V5/V6 共享 dialog + web-panel dialog 各加 `<a-select>` engine 选择 + 蓝/灰/橙三色 tag。(2) chat intent understand 90s wall-clock 兜底(6cbd04c50):sendStream 自带的 60s idle timer 在每个 chunk 上 rearm,慢 LLM dribble token 但永远不出 final frame 时占位卡无限转——AbortController + setTimeout(90s) 兜底。(3) compliance-ipc 死 handler 清理(29006decf):typo 前缀 compliance-classify:* 无人调用,背后还接的是不同 service,直接删 + 同步删 IPC_CHANNELS。(4) audit-ipc.js 首次单测覆盖(b092673be):之前零覆盖盲点拽出来 — 18 channel + DI 改造 + 23 用例。回归全绿:desktop 1477/1477 + CLI 17,455/17,455。
MTC publisher_signature M-of-N 修正 + 安全硬化级联
两条主线一次 ship。(1) MTC `landmark.publisher_signature` 修正:producer 与 verifier 对称 strip 全部 per-member sig(不只是 publisher_signature.sig)后再喂 JCS——否则篡改 M-of-N 联邦中任何一个成员 sig 都会炸 publisher_signature,直接绕过 M-of-N 阈值的存在意义。Helper 抽到 `@chainlesschain/core-mtc/publisher-signing` 子路径,三处调用点(batch.js 单签 + 联邦、landmark-cache.js 验证、桌面 governance-multisig.js)。`LandmarkCache` 默认 opt-in `verifyPublisherSignature:true`,real-verifier callers 全线启用。常量 BAD_PUBLISHER_SIG → BAD_LANDMARK_SIG(匹配 spec §11)。(2) 一周内 8 次 npm audit 清空:override `serialize-javascript`/`tar`/`semver`/`undici`/`make-fetch-happen`/`tmp`/`ip-address`/`dompurify`,drop 无人维护的 `speedtest-net`(改 native fetch)+ `werift` + `hdkey`,拆 hardhat-stack 到独立 contracts/ workspace,channel-manager DDL 加固,wrtc-compat 修补 CVE-2024-29415——HIGH 44→0 / MOD 4→0 / LOW 45→0。Bonus:updater 渲染端进度通知(notifier-only flow)。
chat-panel-v5 三壳对齐 + B4 social 滚动收口
productVersion .40 → .41,正式 ship 前 4 个 5.0.3.40 续滚动条目(cred-persist + auto-archive、mofn-sign v2 + webpanel UI、merkle envelope finality、跨机同步 Phase A + Web Shell Phase 3c.7)以及两条新增:(A) V6 默认壳 AIChatPanel 反向对齐 V5 ChatPanel 4 件核心特性(流式响应 + 历史会话切换 + 上下文记忆引用 + 工具调用面板,Phase E commit b33527d31);(B) web-shell ChatPanel v5 端口 v1+v1.1(commit 72b13388a)port V5 全部 router 协议 / autoSendMessage 信号 / virtual list / 5 intent / 6 IPC 走 WS topic。从此 V5 / V6 / web-shell 三壳聊天体验严格对等,Phase 1.6 默认 web-shell 用户不再缺任何 V5 聊天能力。同时修:web-panel views-mount-smoke 在 63 文件并行套件 first-import 撞 30s timeout 走 file-level vi.setConfig({testTimeout:60_000})。
P2P 社交全栈 audit-grade 闭环(§2.2.10 → §2.2.24)
从"消息能跨机"到"全套审计闭环"15 个 sub-phase 一次性收口:跨机同步(Phase A 修 7 底层 bug) → MTC 联邦双轨(B v1) → DID 签名 + 自动 peer 桥接(B4) → Merkle 批 envelope finality(B4-merkle) → envelope gossipsub 跨机分发 + on-demand pull(B4-cross) → trust filter 按 community 成员校验(B4-cross-trust) → 桌面 viewer 按钮 + Modal(B4-ui) → 外部归档 filesystem + WebDAV(B4-archive) → M-of-N 多签 governance(B4-mofn) → 跨联邦信任锚扩展 trust filter(B4-crossfed) → 13 WS topic 给默认 web-shell(B4-webshell) → 4 composable + MtcAudit.vue UI(B4-webpanel) → sign-as-self v2 渲染端只发 ID(B4-mofn-sign v2 + 修一个潜伏 ~1 个月的 IPC bag 漏 12 manager bug) → WebDAV 凭据走 secure-config.enc(safeStorage / AES-256-GCM 双层加密 + 修一个潜伏 ~1 个月的字段名 baseUrl/remoteRoot vs url/remotePath bug)→ 主进程定时归档 cron(min 5min / per-community try/catch / runOnce 不重入 / lastRun* 自动持久化)。私钥 / 密码均不离开主进程,UI 默认壳全套可见,audit-grade 闭环。
MTC 视图 in-process 提速 + CI 三发解锁
主修:v5.0.3.39 切到 `asar:true` 后 `cc` 子进程冷启动 6-10s,`Mtc.vue` `onMounted` 三发并发必爆 8s/6s timeout("状态加载失败 / 加载桥 MTC 状态失败")。新增 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` 双路径分叉。同时打包三发 CI 修复:macOS `realpathSync` 把 `/var → /private/var` 当 symlink → POSIX 改 `lstat`;rules-validator 把测试 fixture `TestDbManager.exec(sql)` 报红 → 排除 `__tests__`;CLI subprocess Win cold-start 超 10/15s execSync timeout → 统一 60s。
B4 ASAR surgery — Win 安装显著加速
Windows 安装显著加速:dev-box (NVMe SSD + Defender OFF) 实测 190.9s vs 1201s 旧 baseline = 6.3× 提速;HDD + Defender ON 默认环境严格 parity 数据未测。重启 asar:true(v5.0.3.4-13 因 walker 漏 4 个 transitive deps 改 asar:false 兜底)。新 afterPack 钩子里跑 surgery:extract → inject 4 个 walker-dropped 包 → repack 保留原始 unpackDir 决策;Win 包装脚本处理 workspace symlinks。
MTC v0.11 — 跨联邦信任锚 + 离线审计
基于 Merkle 树的去中心化证书体系,跨联邦信任锚 + 第三方审计器 + 多跳路由 + Gas 感知关批 + SLA 监控仪表板。Federation MTCA M-of-N 多签 + 异构 Ed25519/SLH-DSA 联邦 + filesystem/libp2p 双 transport 服务发现。
Web Panel 中英双语 M3
web-panel 主要视图全量改用 vue-i18n(SpeechSettings / Analytics / Cron / Security / Audit / MCP / Backup / Tokens / MTC / WebAuthn / Community / Wallet / Inference / Organization / Federation 等),中英双语贯通,硬编码字符串清零。V6 Preview 顶栏接入语言切换器。
Web Shell 默认化 + 多窗口架构
桌面端从"原生 Vue 渲染器"切到"Electron 主进程内嵌 ws-server + 加载 web-panel dist",三端同源。多窗口骨架(role-based hash route + per-role geometry 持久化),window.open WS topic 让渲染层拉新窗口。
V6 Chat-First Shell 硬翻
桌面端默认进 V6 Chat-First Shell(三区布局 + 5 类企业 Provider + 分发器与 Widget 注册表 + Ctrl+Shift+A 管理控制台)。.ccprofile + MDM 推送三路径企业定制。Top-10 V5 路由全部有 V6 widget probe。
CLI V2 治理表面 220+
从 a2apgov 到 pmodegov,136 个 lib-level V2 治理表面(双维度上限 + auto-flip + autoStaleIdle + autoFailStuck)+ 5,984 V2 测试,与同模块旧表面通过 nest-blocker 共存。
Android v1.0 重新定位 — L1 钥匙 / L2 捕获 / L3 REMOTE
桌面 = AI 工作站 · 手机 = 钥匙 + 捕获器 + 遥控器。停止以 skill 数量对标桌面,转 StrongBox 硬件签名 + Voice/Camera OCR + 桌面 skill REMOTE 三层架构。11 天 7 里程碑落地路线 · 258+ 单测 · 12 E2E。 阅读 RFC →
两类用户,一个底座。
"我想在终端里
用 Agent 编码。"
- · CLI Agent · Claude Code 风格
- · Cowork 多 Agent 并行审查
- · MCP 工具生态 + 9 Skill Packs
- · 144 命令 · 30,000+ 测试 · V2 规范层 220+ 治理表面
不止 Demo,
已在工厂里跑起来了。
从供应链 Excel 协作到 AI 报数,真实工厂部署验证。
链厂数据管家 · 工厂供应链 AI 协作
把 Excel 搬进浏览器,把 AI 装进工厂 —
OnlyOffice 实时协作 · AI Text-to-SQL · OCR 单据录入 · Git 版本管理。
Excel 在线协作
OnlyOffice 内嵌浏览器,多人实时编辑同一份 Excel,Git 自动版本管理,改错能回滚。Socket.IO 实时同步单元格。
AI 自然语言报数
业务员直接中文问:"本月万节公斤销量多少?"AI 自动生成 SQL 查 SQLite 运营数据库,秒级返回结果与图表。
单据自动录入
手机拍物料单据上传,AI 识别 + 结构化入库,从此告别手工 Excel 抄单。Drizzle ORM 规范化存储。
医院病历 AI 检索
本地 Ollama 推理,病历数据不出院。RAG 检索 + 医嘱生成辅助。
律所知识库 & 合同审阅
U-Key 硬件加密保护卷宗,Cowork 多角色审阅合同条款。
内网 AI 办公平台
私有化部署 · SSO / SCIM / RBAC · 等保三级合规 · 审计日志。
个人,还是企业?
个人版
免费开源适合个人用户 & 独立开发者。完整的 CLI、桌面、移动端三端体验。
- ✓ 全部 144 条 CLI 命令 + 141 Skills
- ✓ U-Key / SIMKey 硬件加密
- ✓ 本地 Ollama + 10 LLM Providers
- ✓ Cowork 多智能体协作
- ✓ Windows / macOS / Linux / Android
企业版
按需定制适合金融、医疗、法律、政企等对合规与私有化有严格要求的组织。
- ✓ 私有化部署 + UI 品牌化
- ✓ SSO / SCIM / RBAC / 审计合规
- ✓ 行业定制 Skills(医疗 / 法律 / 科研)
- ✓ U-Key 批量签发 + DLP + SIEM
- ✓ 专属技术支持
三端同源 · v5.0.3.98
命令行工具
支持 npm / yarn / pnpm / bun · 约 2MB
Android
L1 DID 钱包 · L2 移动捕获 · L3 REMOTE 遥控 · 28 Skills · 383+ 单测
查看移动版详情 →
有企业定制需求?
直接拨打 400。
我们为医疗、法律、科研、政企客户提供从 POC 到交付运维的全流程定制服务。免费需求沟通 · 90 天 POC 保障。