/Users/lifcc/Desktop/code/AI/tools/ZCode(开源快照,root version 3.14.0,HEAD 872ad96)/tmp/zcode-reverse/app(解包产物)+ /Applications/ZCode.app(实机安装;内部构建 3.14.1 / commit cead36fd / buildTime 2026-09-20)/tmp/zcode-areas/ 下 16 个区域审计 JSON,rows 合计 595 条,全部保留、未删行(超长的 detail/evidence 做了截断并以 … 标注,关键路径保留)判定标签含义:identical-evidence=两侧同源且有逐字/逐字节/逐项证据;skewed=同源成立但存在单向超集/局部改写/构建形态差;differs=语义或实现分叉;repo-only=仓库有而 App 无;app-only=App 有而仓库无;unresolved=现有证据无法判定。
| 判定 | 条数 | 占比 | 说明 |
|---|---|---|---|
| identical-evidence | 296 | 49.7% | 同源主证据:源码签名、清单全量比对、二进制 md5/sha256 逐字节一致 |
| skewed | 60 | 10.1% | 同源但形态/超集/改写:bundle 压缩改名、App 侧增补、品牌措辞清洗 |
| differs | 36 | 6.1% | 实质差异:App 内部 3.14.1 领先于开源 3.14.0 快照的功能/文案分叉 |
| repo-only | 64 | 10.8% | 仓库有而 App 无:构建脚本、测试、文档、server-cli、部分源码等公开侧内容 |
| app-only | 126 | 21.2% | App 私有功能:Bots、rewards、webRemoteControl、marketingTouch、CUA 管线等 |
| unresolved | 13 | 2.2% | 无法判定:纯类型/桶文件无运行时痕迹、跨平台配置无产物可验、混淆符号消失 |
| 合计 | 595 | 100% |
| # | 区域 | rows | identical | skewed | differs | repo-only | app-only | unresolved |
|---|---|---|---|---|---|---|---|---|
| 1 | App 独有功能全量枚举(app-only-full) | 50 | 3 | 0 | 0 | 0 | 47 | 0 |
| 2 | CLI 全量对照(cli-full) | 42 | 21 | 3 | 5 | 5 | 8 | 0 |
| 3 | 依赖全量对照(deps-full) | 24 | 9 | 4 | 2 | 3 | 6 | 0 |
| 4 | i18n 全量对照(i18n-full) | 33 | 8 | 11 | 5 | 2 | 7 | 0 |
| 5 | 构建/更新/签名链(metadata-updater) | 49 | 32 | 3 | 4 | 3 | 3 | 4 |
| 6 | packages/client(pkg-client) | 19 | 8 | 2 | 0 | 1 | 8 | 0 |
| 7 | packages/desktop 主/preload(pkg-desktop) | 33 | 23 | 4 | 0 | 0 | 6 | 0 |
| 8 | packages 杂项(pkg-misc) | 20 | 7 | 3 | 1 | 9 | 0 | 0 |
| 9 | packages/provider 体系(pkg-provider) | 59 | 53 | 0 | 1 | 0 | 0 | 5 |
| 10 | packages/server + rpc(pkg-server-host) | 53 | 26 | 10 | 4 | 9 | 3 | 1 |
| 11 | packages/services(pkg-services) | 59 | 53 | 1 | 0 | 0 | 5 | 0 |
| 12 | packages/shared 协议(pkg-shared-protocol) | 34 | 8 | 0 | 4 | 1 | 21 | 0 |
| 13 | packages/ui(pkg-ui) | 2 | 2 | 0 | 0 | 0 | 0 | 0 |
| 14 | packages/web 与静态资产(pkg-web-assets) | 30 | 17 | 2 | 0 | 9 | 2 | 0 |
| 15 | packages/zcode-cua(pkg-zcode-cua) | 53 | 11 | 16 | 10 | 3 | 10 | 3 |
| 16 | 仓库有而 App 无(repo-only) | 35 | 15 | 1 | 0 | 19 | 0 | 0 |
| 合计 | 595 | 296 | 60 | 36 | 64 | 126 | 13 |
以下数字均取自各区域 coverageNote 与 rows 的全量枚举结果(非抽样)。
| 清单 | 仓库 3.14.0 | App 3.14.1 | 差异方向 |
|---|---|---|---|
| ServiceChannels(服务频道) | 40 键 | 44 键 | App 多 4:bots / cloud-content / marketing-touch / output-style |
| PlatformChannels(平台通道) | 128 键 | 137 键 | App 多 9:WebRemoteControl 族 8 + BotRemoteWorkspaceReconnected |
| HostMessageTypes(Host 消息类型) | 26 | 29 | App 多 3:BotRemoteWorkspace* |
| HostResponseTypes(Host 响应类型) | 45 | 48 | App 多 3:BotRemoteWorkspace* |
| InternalChannels | 6 | 6 | 全同 |
| Webview 频道对象(EmbeddedBrowser/CodingPlan) | 1+1 | 1+1 | 全同 |
| shared 协议可枚举单元合计 | 249 | 268 | App 严格超集;共有键值零漂移(VALUE-DIFF 全空) |
zcode: IPC 通道全集 | 144 | 159 | App 多 15 |
| 渲染器 i18n key(en / zh) | 5595 / 5594 | 6124 / 6120 | App 增补(en +529 / zh +526),repo-only 0 |
| 渲染器 i18n 命名空间 | 87 | 93 | App 多 6:bots / webRemoteControl / manualClaimPlan / server / marketingTouch / rewards |
| CLI i18n 叶子路径(en-US / zh-CN) | 204 / 204 | 185 / 185 | 各有增删,4 条 leaf 漂移 |
| 官方 GLM 模型 ID | 22 | 22 | 全同(顺序、大小写一致) |
| 内置模型供应商 ID(BUILTIN_MODEL_PROVIDER_IDS) | 6 | 6 | 全同;offpeak 模型 2 条全同 |
| 官方插件定义(name@version) | 14 | 14 | 定义全同;App 另带 12 个插件的完整内容包,仓库仅 3 个目录有实体 |
| CLI 顶层命令 / 斜杠命令 / bash 注册表 | 12+4 / 19 / 707 | 同左 | 全量一致(含别名) |
| 会话迁移 / 工具名 / session 事件类型 | 22 / 47 / 79 | 同左 | 全量一致(含 appVersion 链) |
| App package.json dependencies | —(desktop 35 项逐字同源) | 38 项 | 35 项与仓库 packages/desktop 逐字一致,App 独有 8 个包 |
| node_modules 顶层包 / lock 包名 | lock 段 1594 包名 | 顶层 658 包 | 共同包 653 个,645 个实装版本与 lock 完全一致;生产闭包 949 项 |
| testid(shared/test-ids.ts) | 361 个 | 产物命中 301(60 个死常量) | 产物另增静态 data-testid 418 个 |
| data-slot / data-testid 会话分享族 | 143 / 72+51 | 113 / 全命中 | 形态差(构建改写类) |
| material-icons SVG | 1146 个 | 1146 个 | md5 逐字节 100% 相同 |
| pdfjs / KaTeX / sheets-wasm / react-docx | 5.4.296 / 0.16.45 / 0.1.21 / 0.8.1 | 同左 | cmaps 168、字体 60、wasm md5 全同 |
| services 源文件 → 产物证据 | 298 个 .ts | 298 个全部命中 | 无 repo-only 服务 |
| desktop src/main + src/preload 源文件 | 188 + 8 | 21 .js + 7 .cjs 全对应 | 196 文件无一缺失 |
| 版本标识 | root 3.14.0 | asar package.json 3.14.1 / buildCommitId cead36fd | App 为内部领先构建 |
以下按 16 个区域分节。全部 595 行 rows 原样保留,未删行、未改判定;仅对超长 detail/evidence 做截断(以 … 标注)并保留关键路径。判定列沿用审计原始标签:identical-evidence(一致·有证据)/ skewed(漂移)/ differs(差异)/ repo-only(仅仓库)/ app-only(仅 App)/ unresolved(未决)。每节表格前为该区域审计的原始 summary。
区域 summary:App 相对开源仓库存在 11 大类私有功能。最大的一块是 Bots:完整的多平台机器人接入(Telegram 长轮询、Feishu/Lark WebSocket、微信 iLink 扫码+长轮询、Webhook 回调),含 9 条 help/bind 等命令、运行时锁、任务派发回传与三份持久化文件,仓库全库零命中且 @larksuiteoapi 依赖仅存在于 App。第二大块是 Web 远程控制:9 条 app-only IPC 通道、wss://zcode.z.ai/ws 中继、外部设备配对(deviceSid+passHash)与带校验和/ACK 的 RPC 传输协议,zcode.cjs 内也携带全套 schema。营销与增长面包括 marketingTouch 触达服务、手动领取体验套餐(billing/preview+claim)、Aliyun 验证码、rewards 奖励页与 hero-sandbox 互动内容(依托云内容 lease 缓存与 sha256 白名单)。权限体系方面,App 将任务模式从仓库的 6 值扩展到 10 值(新增 default/acceptEdits/dontAsk/bypassPermissions),并带多引擎(claude/codex/gemini/glm/opencode)各自模式描述。CUA 计算机使用在仓库里被替换为'功能不可用'桩实现,App 内则是完整的下载-验签-门禁安装管线(codesign/spctl/syspolicy_check)。BigModel/Z.ai 采用生产+测试双端点(dev.bigmodel.cn、*.chatglm.site 仅 App 存在),内网默认主机 studio.zcode-ai.com 也被仓库清空。
本区域 rows 共 50 条(identical-evidence 3 / app-only 47)。覆盖口径:系统枚举了 11 大功能面:Bots(4 平台接入+命令+运行时+派发+持久化)、rewards(webview/白名单/持久化/UI)、webRemoteControl(管理器/9 条 app-only IPC/中继 WS/设备配对/RPC 传输协议/移动端 UI)、marketingTouch(服务/端点/报文/UI)、多智能体权限模式(主枚举 10 值 vs 仓库 6 值、子代理 frontmatter 6 值 vs 2 值、多引擎模式、多引擎建任务/切换)、CUA 安装管线(安装器实现、签名校验链、下载安装管线)、透明代理(核查后为同源)、云内容(服务+publishedAssets 白名单)、hero-sandbox、BigModel 双端点(3 组测试端点+按环境拆分 env)、以及 i18n 全量兜底扫描发现的 manualClaimPlan、Aliyun 验证码、模型槽位映…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| Bots 服务总装与持久化(createBotsService + bot-config.v3.json / bot-state.json / 旧版 bot-config.json 导入) | 全库零命中(检索词:createBotsService、bot-config.v3.json、importLegacyBotConfig) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 宿主进程注册 createBotsService(仓库 packages/services 无对应服务目录与工厂),配置持久化为 bot-config.v3.json,状态为 bot-state.json,并支持从旧版 bot-config.json 导入(importLegacyBotConfig 归一化 bots 映射、normalizeBotConfig 对 weixin 删除 webhookUrl)。 | 证据:out/host/index.js: 'var Gb="bot-config.v3.json",D$="bot-config.json",N$="bot-state.json"';'i(Z$,"importLegacyBotConfig")';'i(Cy,"normalizeBotConfig")';createBotsService 仓库 rg 零命中。 |
| Bots 平台接入:Telegram(长轮询+附件+回调查询) | 全库零命中(检索词:api.telegram.org、splitTelegramText、readTelegramPrivateMessage) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 对接 https://api.telegram.org/bot 与 /file/bot:getMe 校验、getUpdates 长轮询(含 409 冲突 handled-elsewhere 状态)、callback_query 解码('zc:' 前缀转命令)、photo/document/video/audio/voice 附件(readTelegramAttachments)、超长文本按 3900 字符分段(splitTelegramText,摘要 180 字符);actor 标识 provider:"telegram"+botId+providerUserId。 | 证据:out/host/index.js: 'https://api.telegram.org/bot'、'i(Vae,"splitTelegramText")'、'provider:"telegram",botId:e,providerUserId:a'、'i(ece,"readTelegramAttachments")'。 |
| Bots 平台接入:Feishu/Lark(WebSocket 长连接) | 全库零命中(检索词:@larksuiteoapi、getFeishuBaseUrl、feishuAppId;依赖声明同样无) | /tmp/zcode-reverse/app/out/host/index.js + /tmp/zcode-reverse/app/node_modules/@larksuiteoapi/[email protected] | app-only | 通过飞书官方 WSClient 建立 WebSocket(Domain.Lark/Domain.Feishu 双域),Base URL getFeishuBaseUrl 在 https://open.feishu.cn 与 https://open.larksuite.com 间切换;支持 appId/appSecret 校验(pollFeishuAppRegistration、appName 拉取)、per-bot WebSocket 运行时状态(connecting/running/stopped/starting/ handled-elsewhere)、跨窗口持有锁 acquireFeishuWebSocketLock(${provider}-websocket)。 | 证据:out/host/index.js: 'new d.WSClient({appId:a,appSecret:c,domain:my(t)==="lark"?d.Domain.Lark:d.Domain.Feishu'、'i(ii,"getFeishuBaseUrl")'、'i(dH,"acquireFeishuWebSocket...")';node_modules/@larksuiteoapi/package.json version 8.20.0,仓库 rg '@larksuiteoapi' 零命中。 |
| Bots 平台接入:微信 iLink(扫码登录+长轮询) | 全库零命中(检索词:ilinkai.weixin.qq.com、X-WECHAT-UIN、get_bot_qrcode、weixinGetUpdatesBuf) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 对接 https://ilinkai.weixin.qq.com:GET /get_bot_qrcode?bot_type=3 取二维码,轮询 /get_qrcode_status?qrcode=... 直至 success 并取 bot_token 与 ilink_bot_id/bot_id;请求头 buildHeaders={content-type:application/json, AuthorizationType:'ilink_bot_token', Authorization:'Bearer …', 'X-WECHAT-UIN':随机 uin}(buildRandomWechatUin 生成 0..4294967296 的 base64);激活态记录 weixinActivatedAt/weixinActivatedWelcome,长轮询缓冲 weixinGetUpdatesBuf,运行时状态 weixinLongPollingRunning/Starting/Stopped/HandledElsewhere。 | 证据:out/host/index.js: 'i(Ace,"buildHeaders")' 含 '"X-WECHAT-UIN":Rce()'、'sZ(e,"/get_bot_qrcode?bot_type=3")'、'"Weixin login succeeded but did not return bot_token."'、'i(Rce,"buildRandomWechatUin")'。 |
| Bots 平台接入:Webhook(入站回调+出站推送) | 全库零命中(检索词:x-zcode-bot-secret、zcode.bot.test、webhookSecretInvalid) | /tmp/zcode-reverse/app/out/host/index.js | app-only | Webhook 型 bot 向配置的 webhookUrl POST 出站消息,头部携带 'x-zcode-bot-secret',报文 type 为 zcode.bot.message / zcode.bot.test(连通性测试)/ zcode.bot.elicitation_request(带 elicitation 载荷时升级类型),body 含 botId/provider:'webhook'/userId/text/sentAt;密钥持久化键 buildBotWebhookSecretKey='bot:<id>:webhook-secret';入站回调启用状态提示 'Webhook bot is enabled for inbound callbacks.'。 | 证据:out/host/index.js: 'headers:{…"x-zcode-bot-secret"]:n??""},body:JSON.stringify({type:"zcode.bot.test",botId:t.id,provider:"webhook"'、'i(W$,"buildBotWebhookSecretKey")'、'type:"zcode.bot.elicitation_request"'。 |
| Bots 命令系统(help/status/new/workspace/model/mode/thoughtLevel/reply/bind + 命令策略) | 全库零命中(检索词:bindBotMissing、getUserCommandPolicy、decodeTelegramCallbackData、bindPrivateOnly) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 聊天命令集 dy=['help',...['status','new','workspace','model','mode','thoughtLevel','reply'],'bind'];命令策略 getUserCommandPolicy 从 allowedCommands 派生('This command is disabled for the current bot.');bind 仅限私聊('Bots can only bind in a private chat.')并校验 bot 存在(bindBotMissing);回调数据 'zc:xxx' 解码为命令;同一凭据的轮询 bot 不可重复启用('Enabled polling bots cannot share the same credential.' validateBotConfig)。 | 证据:out/host/index.js: 'dy=["help",...Zae,"bind"]'(Zae=["status","new","workspace","model","mode","thoughtLevel","reply"])、'i(FZ,"getUserCommandPolicy")'、'i(sce,"decodeTelegramCallbackData")'、'i(vH,"validateBotConfig")'。 |
| Bots 运行时状态机与跨窗口锁(bots.runtime.* 15 条状态 + bots-runtime-locks) | 全库零命中(检索词:bots.runtime.telegramLongPollingRunning、BotRuntimeLock、v2/bots-runtime-locks) | /tmp/zcode-reverse/app/out/host/index.js + out/main 数据分区前缀表 | app-only | 每平台运行时状态以 i18n messageId 上报(bots.runtime.botDisabled、telegramTokenMissing、telegramPollingFailedRetrying、telegram/feishu/weixin 各 Running/Starting/Stopped/HandledElsewhere 等 15 条);跨窗口互斥由运行时锁保证(BotRuntimeLock/LockPath/LockOwner/LockLeaseAt/LockConflictError/LockCleanupRetryable),锁文件落在数据分区 v2/bots-runtime-locks;附件缓存分区 v2/bot-attachments。 | 证据:out/host/index.js: 'messageId:"bots.runtime.weixinLongPollingStopped"' 等;out/main/chunk-DLYU5YW3.js: '"v2/bots-runtime-locks","v2/bot-attachments"'。 |
| Bots 任务派发与远程工作区联动(botDeliveryTarget + bot-channel-continuous + BotRemoteWorkspaceService) | 全库零命中(检索词:botDeliveryTarget、bot-channel-continuous、BotRemoteWorkspaceService、bot-remote-workspace-reconnected) | /tmp/zcode-reverse/app/out/host/index.js + out/main/index.js | app-only | 任务元数据携带 botDeliveryTarget 将任务输出回流到 bot 通道(deliveryKind:"bot-channel-continuous",BotReplyGranularity/BotReplyToolCalls/BotToolCallReplyTerminal 控制工具调用粒度回包);BotRemoteWorkspaceService 使 bot 可驱动远程工作区,IPC 通道 zcode:bot-remote-workspace-reconnected(仓库通道清单无此通道);拒绝理由 reason:'bot_disabled'/'bot_missing'/'Denied by bot command'。 | 证据:out/host/index.js: 'deliveryKind:"bot-channel-continuous"'、'BotRemoteWorkspaceRuntimePortRequest';/tmp/app_channels.txt 与 /tmp/repo_channels.txt 差分含 zcode:bot-remote-workspace-reconnected。 |
| Rewards 奖励页整层(rewardsWebview.cjs 专属 preload) | 仅残留挂载点:packages/desktop/vite.config.ts:202 注入 VITE_REWARDS_WEBVIEW_ORIGIN 空串;无任何 rewardsWebview 源文件(检索词:rewardsWebview、VITE_REWARDS_WEBVIEW_ORIGIN、installRewardsPageBridge) | /tmp/zcode-reverse/app/out/preload/rewardsWebview.cjs(698KB,仓库 src/preload 目录清单无此文件) | app-only | App 独有第 7 个 preload:为 /(cn|en)/rewards 官网页安装 installRewardsPageBridge,监听页面 zcode-rewards-context CustomEvent 同步 theme/locale/auth 三通道订阅;主进程在受信 URL 时把 webPreferences.preload 指向 ../preload/rewardsWebview.cjs 并支持 --zcode-rewards-dev 开发标记;页面路由 zod 判别联合 page: 'upgrade'|'rewards'|'settings'(仓库仅有 codingPlanWebview 购买页桥)。 | 证据:out/preload/rewardsWebview.cjs: 'r.addEventListener("zcode-rewards-context",…["zai-light","zai-dark"]…["zh-CN","en-US"]'、'c(Yv,"installRewardsPageBridge")';out/main/index.js: 'd.preload=ql(import.meta.dirname,"../preload/rewardsWebview.cjs")…"--zcode-rewards-dev"'。 |
| Rewards 受信 URL 白名单(isTrustedRewardsUrl) | 全库零命中(检索词:isTrustedRewardsUrl、embedded=app、/rewards 路径正则) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js(scheduler 同构副本) | app-only | 白名单:origin ∈ {https://zcode.z.ai, https://zcode.chatglm.site}(生产+测试),pathname 必须 /^\/(cn|en)\/rewards\/?$/,必须带 searchParams embedded=app;禁止 URL userinfo;dev 模式放行 http://localhost:3000,e2e 模式放行 127.0.0.1/localhost 的 http。主 preload 与 rewards preload 各有一份同构实现(Jv/Yv、Gie)。 | 证据:out/main/chunk-YSD25WTT.js: '["https://zcode.z.ai","https://zcode.chatglm.site"].includes(o.origin)…&&/^\/(cn|en)\/rewards\/?$/.test(o.pathname)&&o.searchParams.get("embedded")==="app"'、'c(Gie,"isTrustedRewardsUrl")'。 |
| Rewards 持久化与主题/语言/登录态桥(persist:zcode-rewards) | 全库零命中(检索词:persist:zcode-rewards、zcode-rewards-context、zcode-rewards-dev) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/preload/rewardsWebview.cjs + out/scheduler/index.js | app-only | redux-persist 键 'persist:zcode-rewards',schema {theme: zai-light|zai-dark, locale: zh-CN|en-US, auth: {status: ready|anonymous…}};preload 侧维护 theme/locale/auth 三个 Set 订阅器并返回退订函数;活动会话限流参数 {rounds:200, network:100, dedupe:2000}(sessionId schema 校验)。 | 证据:out/main/chunk-YSD25WTT.js: 'var qie="persist:zcode-rewards";var eU=e.object({theme:e.enum(["zai-light","zai-dark"])…auth:e.object({status:e.enum(["ready","anonymous"';rewardsWebview.cjs: 'var Xv={rounds:200,network:100,dedupe:2e3}'。 |
| Rewards 入口 UI(菜单+角标+打开官网) | 全库零命中(检索词:rewards.menuBadge、rewards.openWebsite、rewards.title) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 应用菜单/界面含奖励入口:rewards.title(奖励)、rewards.menuTitle、rewards.menuBadge(角标)、rewards.openWebsite(打开官网)、rewards.loadFailed(页面加载失败,请重试),中英双语各一份。 | 证据:IntlProvider-DW5rmeLm.js: '"rewards.loadFailed":页面加载失败,请重试。","rewards.menuBadge"…"rewards.openWebsite":打开官网'。 |
| Web 远程控制管理器与 9 条 app-only IPC 通道 | 全库零命中(检索词:WebRemoteControlManager、start-web-remote-control、web-remote-control-status-changed;repo_channels.txt 159 条中无任何 web-remote-control 通道) | /tmp/zcode-reverse/app/out/main/index.js + out/main/chunk-YSD25WTT.js + renderer | app-only | main 进程 WebRemoteControlManager/IpcHandlers/FeatureGate/DeviceTransport/RelayAuthProvider/RelayAuthStorageProvider/SharedHostAttachments 全套类;通道:zcode:start-web-remote-control、zcode:stop-web-remote-control、zcode:get-web-remote-control-status、zcode:web-remote-control-status-changed、zcode:reset-web-remote-control-pairing、zcode:web-remote-control-reconnect-workspace、zcode:sync-web-remote-control-workspaces、zcode:sync-web-remote-control-tasks(bind-remote-workspace-session-context 为两侧共有);窗口关闭时 disposeWindow 并对远端会话回报失败。 | 证据:out/main/index.js: 'e.webRemoteControlManager.disposeWindow(n)'、'xa.handle(k.ResetWebRemoteCo…'、'operation:s(o=>{let n=e.webRemoteControlManager,i=n.authorizeStart(o,r);return n.startAuthorized(o,r,i)}'。 |
| Web 远程控制中继链路(wss 中继 + 按 ZCODE_ENV 切换) | 全库零命中(检索词:resolveWebRemoteControlRelayWsUrl、zcode.z.ai/ws、zcode.chatglm.site/ws) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js | app-only | resolveWebRemoteControlRelayWsUrl:测试环境 'wss://zcode.chatglm.site/ws',生产 'wss://zcode.z.ai/ws'(默认 Zx),可 overrideUrl 覆盖;webShareCallbackUrl ${origin}/cn/share/callback、remote callback ${origin}/…/remote/callback 一并组装。 | 证据:out/main/chunk-YSD25WTT.js: 't?.endpointOrigin?.trim()===hs?"wss://zcode.chatglm.site/ws":Zx'、'var Zx="wss://zcode.z.ai/ws"'、'c(_U,"resolveWebRemoteControlRelayWsUrl")'。 |
| Web 远程控制外部中继设备配对(deviceSid+passHash + 二维码 URL) | 全库零命中(检索词:webRemoteControlExternalRelayDevice、buildWebRemoteControlExternalQrUrl、deviceSid) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/main/index.js + out/scheduler/index.js | app-only | 设置持久化键 webRemoteControlExternalRelayDevice={deviceSid} 与独立存储的 passHash 双因子加载,二者不齐即告警 '[web-remote-control] external relay auth reset' 并清空(ResetWebRemoteControlPairing);配对二维码 buildWebRemoteControlExternalQrUrl 在 baseUrl 上追加 sid/hash/t(timestamp)/mid(deviceMid)/name(deviceName)/app_version 参数;上次启用上下文 webRemoteControlLastEnabledContext={workspacePath, workspaceIdentity?, initialTaskId?} 用于重启续用。 | 证据:out/main/chunk-YSD25WTT.js: 'pv=e.object({deviceSid:F}),mv=e.object({workspacePath:F,…initialTaskId:F.optional()})'、'p.searchParams.set("sid",n),p.searchParams.set("hash",o)'、'c(Are,"buildWebRemoteControlExternalQrUrl")';out/main/index.js: 'resetExternalRelayDeviceAuth'。 |
| Web 远程控制 RPC 传输协议(帧/校验和/ACK/中继信封/移动端视图) | 全库零命中(检索词:webRemoteControlRpcTransportFrameSchema、webRemoteControlRpcRelayEnvelopeSchema、webRemoteControlMobileViewStateSchema) | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs + /tmp/zcode-reverse/app/out/main | app-only | zcode.cjs(CLI 运行时)导出全套 webRemoteControl schema:RpcTransportFrame/Checksum/Ack/Identity/Id、RpcRelayEnvelope、Workspace/TaskTarget 与列表结果、WindowBootstrapResult、ReconnectWorkspace 请求/结果、MobileViewState、MobileDeviceInfo、FailureReason、ExternalWorkspaceBridge、AppPayload、PlatformMethod(isDockerAvailable/listWSLDistros/listDockerContainers/listSSHConfigAliases/loadMcpFromUserDirectory/saveMcpToUserDirectory/migrateLegacyCommonMcp);表明 CLI 侧参与远程控制桥接。 | 证据:zcode.cjs: 'webRemoteControlRpcTransportFrameSchema…webRemoteControlRpcRelayEnvelopeSchema…webRemoteControlMobileViewStateSchema'(导出表);'vYe=m.enum(["isDockerAvailable","listWSLDistros","listDockerContainers","listSSHConfigAliases","loadMcpFromUserDirectory","saveMcpToUserDirectory","migrateLegacyCom… |
| Web 远程控制移动端 Web UI(mobileHome/mobileQr/botChannel 远控等 104 个 i18n 键) | 全库零命中(i18n 键差分:webRemoteControl.* 全部缺失于 packages/ui/src/i18n/locales/zh-CN.ts) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 远程控制 Web 端界面:mobileHome(22 键)、mobileShell、mobileQr、refreshQr、copyLink、themeMenu、status/statusDetail/statusTag/triggerStatus/taskStatus、failure(12 键),并可在 Web 端操控 botChannel(12 键)——移动端可查看/触发任务并操纵 bot 通道。 | 证据:i18n 键空间差分 /tmp/app_only_i18n.txt:'webRemoteControl.mobileHome.'(22)、'webRemoteControl.botChannel.'(12)、'webRemoteControl.refreshQr' 等。 |
| marketingTouch 营销触达服务(GET /api/v1/marketing/touch + POST /api/v1/marketing/touch/action) | 全库零命中(检索词:marketingTouchService、createMarketingTouchService、api/v1/marketing/touch) | /tmp/zcode-reverse/app/out/host/index.js | app-only | createMarketingTouchService:GET /api/v1/marketing/touch?seq=<自增> 拉取投放(响应 {code:0,data:{server_time,language,deliveries[]≤32}},popup 弹出类型),POST /api/v1/marketing/touch/action 上报 {campaign_id, action_type:'confirm'|'cancel'}(schema I3: locale+scope:uuid+campaignId≤128+actionType 枚举);请求头 X-Device-Mid、X-Client-Language、X-ZCode-App-Version、可选 Authorization Bearer;15s 超时、redirect:'error'、identity scope 变化抛 marketing_identity_changed、已处置抛 cloud_content_disposed 同族错误。 | 证据:out/host/index.js: 'a=new URL("/api/v1/marketing/touch",e.baseUrl);a.searchParams.set("seq",String(b3++))'、'I3=_.object({locale:AN,scope:_.string().uuid(),campaignId:…,actionType:_.enum(["confirm","cancel"])})'、'i(EN,"createMarketingTouchService")'。 |
| marketingTouch 营销活动 UI(7 态卡片) | 全库零命中(i18n 键差分:marketingTouch.* 缺失) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js + assets/index-BvllzT2k.js | app-only | 渲染层营销触达操作卡片状态机:idle(准备就绪)/verifying(正在验证…)/submitting(正在处理…)/preparing(操作成功,正在准备结果…)/succeeded(操作成功)/failed(操作失败,请稍后重试。)/uncertain(暂时无法确认操作结果…为避免重复提交,本轮不再重试。)。 | 证据:IntlProvider-DW5rmeLm.js: '"marketingTouch.uncertain":暂时无法确认操作结果,请稍后查看权益。为避免重复提交,本轮不再重试。'。 |
| 手动领取体验套餐 API(billing/preview + billing/claim) | 全库零命中(检索词:zcode-plan/billing/preview、zcode-plan/billing/claim、manual_claim_preview;仓库仅有 billing/current 与 billing/balance,见 packages/shared/src/zcodeEndpoint.ts:268-269) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 编码套餐手动领取:GET /api/v1/zcode-plan/billing/preview?app_version=<v>&platform=<os>(Bearer 凭据 credentialService.load),POST /api/v1/zcode-plan/billing/claim 完成领取;错误码 manual_claim_preview_failed / manual_claim_preview_missing_data;与验证码头(X-Aliyun-Captcha-Verify-Param 等)叠加使用。 | 证据:out/host/index.js: 'new URL(Vt(process.env,"/api/v1/zcode-plan/billing/preview"));n.searchParams.set("app_version",sn),n.searchParams.set("platform",r_())'、'new URL(Vt(process.env,"/api/v1/zcode-plan/billing/claim")),{method:"POST",headers:{Authorization:…"X-Aliyun-"'。 |
| 手动领取体验套餐 UI(manualClaimPlan.* 53 个 i18n 键横幅) | 全库零命中(检索词:manualClaimPlan、可领取的体验套餐;仓库 manualClaim 仅命中 scheduler/manualClaimRelease.ts 的离峰调度锁释放,属另一概念) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 限时领取横幅与领取流程:banner.aria(可领取的体验套餐)/banner.tag(限时可领取)/bonus/claim/close、dismissConfirm 二次确认、period.daily|oneTime、subtitle {model} 每日额度|一次性额度、claim.ticket.benefits 等领取权益文案。 | 证据:IntlProvider-DW5rmeLm.js: '"manualClaimPlan.banner.aria":可领取的体验套餐'、'"manualClaimPlan.banner.subtitle.daily":{model} 每日额度'。 |
| Aliyun 验证码集成(AliyunCaptcha.js + captcha-network 埋点 + 校验头) | 全库零命中(检索词:AliyunCaptcha、captcha-frontend、X-Aliyun-Captcha-Verify-Param、captchaRegion) | /tmp/zcode-reverse/app/out/main/index.js + out/host/index.js + renderer | app-only | main 进程 onBeforeRequest 拦截验证码资源(/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js,dynamic_js/dynamic_css/device_script 分类)并打点 '[captcha-network]' resource.start/end(5 分钟 TTL、容量 128);host 侧向 API 请求注入 'X-Aliyun-Captcha-Verify-Param' 与可选 'X-Aliyun-Captcha-Verify-Region'(captchaRegion),附 X-ZCode-App-Version、X-Platform;渲染层有 chat.captcha.verifyFailed / chat.error.action.retryCaptcha。 | 证据:out/main/index.js: 'path:o==="sdk_script"?"/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js"'、't.info("[captcha-network]",{event:"resource.start"';out/host/index.js: '"X-Aliyun-Captcha-Verify-Param":t.captchaVerifyParam,…"X-Aliyun-Captcha-Verify-Region":t.captchaRegion'。 |
| 任务权限模式主枚举扩展(10 值 vs 仓库 6 值) | 全库零命中(检索词:"acceptEdits"、"dontAsk"、"bypassPermissions";仓库 ZCodeTaskMode=z.enum(["yolo","plan","edit","auto","autoEdit","build"]) 见 packages/shared/src/zcode-task-mode-schema.ts:6) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/host/index.js | app-only | App 权限/模式全集 Nae={default,yolo,plan,edit,acceptEdits,auto,dontAsk,bypassPermissions,autoEdit,build}(新增 4 值);归一化映射:yolo/bypassPermissions/dontAsk→yolo,build/default/acceptEdits/autoEdit→build,plan→plan,edit→edit,auto→auto;渲染层模式徽标色集 Ewe={acceptEdits,auto,bypassPermissions,default,dontAsk,plan}(agent frontmatter 用)。 | 证据:out/main/chunk-YSD25WTT.js: 'var Qn=e.enum(["default","yolo","plan","edit","acceptEdits","auto","dontAsk","bypassPermissions","autoEdit","build"]';out/host/index.js: 'case"yolo":case"bypassPermissions":case"dontAsk":return"yolo";case"build":case"default":case"acceptEdits":case"autoEdit":'。 |
| 子代理 frontmatter 权限模式扩展(6 值 vs 仓库 2 值) | packages/services/src/subagents/subagentMarkdown.ts:25 仅 'auto'|'plan'(检索词:VALID_PERMISSION_MODES) | /tmp/zcode-reverse/app/out/host/index.js | app-only | App 解析 subagent markdown frontmatter 时接受 permissionMode ∈ {acceptEdits,auto,bypassPermissions,default,dontAsk,plan},并按 mode 渲染徽标与描述(Accept Edits/接受编辑、Don't Ask/无需询问、Bypass Permissions/绕过权限等);设置页 settings.subagents.permissionMode.{default,acceptEdits,dontAsk,bypassPermissions} 四个新选项。 | 证据:out/host/index.js: 'Ewe=new Set(["acceptEdits","auto","bypassPermissions","default","dontAsk","plan"])'、'bypassPermissions:N?"Bypass Permissions":"绕过权限"';IntlProvider: 'settings.subagents.permissionMode.acceptEdits' 等。 |
| 多引擎权限模式体系(claude/codex/gemini/glm/opencode 各自模式描述) | 全库零命中(检索词:agentFullAccess、mode.description.codex、readOnly 模式集;仓库 settings-sync.ts 仅有引擎 kind "claudeCode"|"codexCli") | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 每个引擎有独立模式枚举与描述:claude: default/acceptEdits/plan/auto/dontAsk/bypassPermissions;codex: agent/agentFullAccess/auto/fullAccess/readOnly;gemini: autoEdit/default/plan/yolo;glm: default;opencode: build/plan——即 App 支持以多引擎执行任务且权限模式按引擎适配。 | 证据:IntlProvider-DW5rmeLm.js: '"mode.description.codex.agentFullAccess"…"mode.description.gemini.yolo"…"mode.description.opencode.build"'(38 个 mode.* 键差分)。 |
| 多引擎新建任务与会话内切换(newTask.claude/codex/gemini/opencode + chat.agentSwitch) | 全库零命中(检索词:taskList.newTask.codex、codexConnectivityUnavailable、chat.agentSwitch) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 任务列表新建任务可选引擎 claude/codex/gemini/opencode(taskList.selectProvider),codex 连通性不可用提示 taskList.codexConnectivityUnavailable;聊天中切换 agent:chat.agentSwitch.switchTo/success/failed。 | 证据:IntlProvider-DW5rmeLm.js: '"taskList.newTask.codex"…"taskList.newTask.opencode"'、'"chat.agentSwitch.failed"…"chat.agentSwitch.switchTo"'。 |
| CUA Helper 安装器真实实现(仓库为'功能不可用'桩) | packages/zcode-cua/broker-server.js:9-24 桩:createCuaHelperInstaller 返回 {ensureInstalled/verifyInstalled: unavailableReject},常量 'Computer Use is not available in this build.'(检索词:verifyCuaHelperBundle、createCuaHelperInstaller 实现) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 仓库虽然保留 createCuaHelperInstaller 接口(desktopCuaHelperInstaller.ts 归一化层仍在),但底层 zcode-cua 包被替换为全桩;App 内为完整实现:ensureInstalled 单飞 Map 去重、installRoot mkdir(recursive,mode:0o700)、acquireInstallLease(assertHeld/release, TTL 120s)、verifyInstalled 走 verifyCuaHelperBundle;Helper app 解析 resolvePackagedCuaHelperAppPath(resources/cua-helper/)。 | 证据:out/host/index.js: 'return{ensureInstalled:i(()=>jie(n),"ensureInstalled"),verifyInstalled:i(async(r,o)=>{await Nh(r,n.plan,n.dependencies,o)}'、'i(Ku,"createCuaHelperInstalle…")'、'{bundleInfo:o,codesign:l,releaseEligible:!1,mode:"local_dev_unsigned"}'。 |
| CUA Helper 签名与门禁校验链(codesign/codesign detail/spctl/syspolicy_check) | 全库零命中(检索词:verifyCuaHelperBundle、defaultAssessGatekeeper、syspolicy_check;仓库 services/zcode-cua 源码无) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 校验管线 verifyCuaHelperBundle:readBundleInfo(Contents/Info.plist) → inspectCodesignDetails(best-effort) → verifyCodeSignature('/usr/bin/codesign --verify --deep --strict') → 未跳过时 assessGatekeeper('/usr/bin/syspolicy_check distribution',失败回退 '/usr/sbin/spctl -a -vv -t exec'),产出 {bundleInfo,codesign,gatekeeperAssessment,releaseEligible,mode:'release'|'local_dev_unsigned'};工具绝对路径表 Xt 另含 ditto/lsof/mdfind/ps/screencapture/sh/unzip/xattr,PATH 固定 '/usr/bin:/bin:/usr/sbin:/sbin'。 | 证据:out/host/index.js: 'await Ir(Xt.codesign,["--verify","--deep","--strict",e])'、'await Ir(Xt.syspolicyCheck,["distribution",e])…await Ir(Xt.spctl,["-a","-vv","-t","exec",e])'、'Xt={codesign:"/usr/bin/codesign",ditto:"/usr/bin/ditto",lsof:"/usr/sbin/lsof",mdfind:"/usr/bin/mdfind"…'。 |
| CUA Helper 下载安装管线(锁定租约+限量下载+隔离属性清除+日志修剪) | 全库零命中(检索词:ZCODE_CUA_HELPER_DOWNLOAD_URL、zcode-cua-helper-meta、ZCode-CUA-Helper- zip 名) | /tmp/zcode-reverse/app/out/host/index.js | app-only | macOS 专用自动安装(非 darwin 报 install_failed):版本固定 embeddedBuildId(打包缺身份拒绝 unpinned 安装);下载 ZCode-CUA-Helper-<version>-mac-<arch>.zip,URL 取 ZCODE_CUA_HELPER_DOWNLOAD_URL 或 ZCODE_CUA_HELPER_DOWNLOAD_BASE_URL 拼接;默认超时 30s(ZCODE_CUA_HELPER_DOWNLOAD_TIMEOUT_MS)、上限 200MB(ZCODE_CUA_HELPER_MAX_DOWNLOAD_BYTES,超限抛 'download exceeded max size');元数据 .zcode-cua-helper-meta.json、互斥锁 .zcode-cua-helper-install.lock、clearQuarantine 清 xattr;helper 日志 zcode-cua-helper-YYYY-MM-DD.jsonl 仅保留 7 份(pruneHelperLogs)。 | 证据:out/host/index.js: 'var Rie=".zcode-cua-helper-meta.json",PW=3e4,Aie="ZCODE_CUA_HELPER_DOWNLOAD_TIMEOUT_MS",CW=20010241024,Eie="ZCODE_CUA_HELPER_MAX_DOWNLOAD_BYTES",bW=".zcode-cua-helper-install.lock",Tie=12e4'、'/^zcode-cua-helper-\d{4}-\d{2}-\d{2}\.jsonl$/u'、'i(die,"pruneHelperLogs")'。 |
| 云内容服务(createCloudContentService:lease 缓存 + sha256 清单 + 本地文件回源) | 全库零命中(检索词:createCloudContentService、content-bundles、cloud_content_source、readPublishedMedia) | /tmp/zcode-reverse/app/out/host/index.js | app-only | createCloudContentService(IN):prepare({bundle}) 经受信校验后 acquire lease,下载到 cacheRoot=cache/content-bundles/<M_e()>/,返回 {leaseId,cacheHit,sha256,entry,url:'<root>/<leaseId>/<encoded entry>'};控制文件 schemaVersion:1 记录 endpointKey/leaseId/leaseUntil(默认 30s)/nextEligibleAt/failureCount 用于失败退避与 GC;release/disposeAllAndWait 全量清理(含 closeAllConnections);readPublishedMedia({asset,kind}) 读取已发布媒体;未处置访问抛 cloud_content_disposed。 | 证据:out/host/index.js: 'register(Rm,IN({publishedAssets:Fo,cacheRoot:lo(rt(),"cache","content-bundles",M_e())}))'、'{schemaVersion:1,endpointKey:r,leaseId:o,leaseUntil:a+(this.#e.leaseDurationMs??3e4),nextEligibleA…'。 |
| publishedAssets 发布资产白名单(https-only + sha256 钉扎 LRU) | 全库零命中(检索词:publishedAssets、allowsUrl、cloud_content_source) | /tmp/zcode-reverse/app/out/host/index.js | app-only | TN({allowLoopback}) 构建白名单:仅允许 https(test 环境或 NODE_ENV=development 放行 127.0.0.1/localhost/[::1]);allow(src,sha256) 入 LRU(512 个 src、每个 src 最多 8 个 sha256,淘汰最旧);allows/allowsUrl 校验 src+sha256 对;媒体类型 image(default/dark)、video(src/fallback)、lottie、interactive_bundle;越界引用抛 'cloud_content_source'。 | 证据:out/host/index.js: '!t.has(u.src)&&t.size>=512&&t.delete(t.keys().next().value)…g.size>=8&&g.delete(g.values().next().value)'、'if(!e.publishedAssets?.allows({src:f.url,sha256:f.sha256}))throw new Error("cloud_content_source")'。 |
| hero-sandbox 互动内容运行时(zcode-hero-sandbox-v1) | 全库零命中(检索词:zcode-hero-sandbox-v1、interactive_bundle、hero-overlay) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/preload/rewardsWebview.cjs + out/scheduler/index.js + renderer/assets/styles-CuFc3dtZ.js + zcode.cjs | app-only | 营销/欢迎页 hero 内容三类:video(src/darkSrc/poster/autoplay/loop/muted:true/fit cover|contain)、lottie(src/darkSrc/autoplay/loop/speed 0.1-4/fallback)、interactive_bundle(runtime 固定 'zcode-hero-sandbox-v1',bundle schema,viewport 固定 4:3,data JSON 序列化 ≤64KB,events, fallback);渲染层有 hero-overlay/hero-slot/hero-error/hero-unresolved/hero-v1/hero-type 标记;schema 在 main、scheduler、preload、zcode.cjs 四处同构出现。 | 证据:out/main/chunk-YSD25WTT.js: 'e.object({type:e.literal("interactive_bundle"),runtime:e.literal("zcode-hero-sandbox-v1"),bundle:Gb,viewport:e.object({aspectRatio:e.literal("4:3")}),data:e.record(e.string(),e.unknown()).refine(t=>JSON.stringify(t).length<=64e3),events:'。 |
| BigModel/Z.ai 双端点(生产+测试三组端点 + 按环境拆分 env) | 全库零命中(检索词:zcode.chatglm.site、api.chatglm.site、dev.bigmodel.cn、BIGMODEL_TEST_API_BASE_URL;仓库 packages/shared/src/zcodeEndpoint.ts 仅有生产默认值+BIGMODEL_API_BASE_URL 单一 env) | /tmp/zcode-reverse/app/out/scheduler/index.js + out/main/chunk-YSD25WTT.js + zcode.cjs | app-only | App 内置端点对:产品 web zcode.z.ai(生产)/zcode.chatglm.site(测试);业务 API api.z.ai(生产)/api.chatglm.site(测试);BigModel bigmodel.cn(生产)/dev.bigmodel.cn(开发测试)。resolveBigModelApiOrigin 按 ZCODE_ENV 在 BIGMODEL_PRODUCTION_API_BASE_URL 与 BIGMODEL_TEST_API_BASE_URL 间选择;OAuth 同理 ZAI_PRODUCTION_OAUTH_ORIGIN/ZAI_TEST_OAUTH_ORIGIN。仓库把默认值/测试端点全部清洗为仅生产默认。 | 证据:out/scheduler/index.js: 'var Gv="https://zcode.z.ai",nz="https://zcode.chatglm.site";var rz="https://bigmodel.cn",oz="https://dev.bigmodel.cn";var iz="https://api.z.ai",sz="https://api.chatglm.site"';out/main/chunk-YSD25WTT.js: 'o=n==="production"?je(t,"BIGMODEL_PRODUCTION_API_BASE_URL"):je(t,"BIGMO… |
| 内网默认主机 studio.zcode-ai.com(依赖自举源) | 全库零命中(检索词:studio.zcode-ai.com;仓库 packages/shared/src/intranetDefaults.ts:1 为 DEFAULT_INTRANET_MACHINE_HOST="") | /tmp/zcode-reverse/app/out/host/index.js + zcode.cjs | app-only | App 将默认内网机器 host 硬编码为 studio.zcode-ai.com(可被 INTRANET_MACHINE_HOST/ZCODE_DEPS_BASE_URL 覆盖),指向 http://studio.zcode-ai.com:12345/zcode/deps 依赖源与 :3850/api/intranet/probe 探针;仓库保留全部端口/路径/解析逻辑但默认主机被清空。 | 证据:out/host/index.js: 'var hW="studio.zcode-ai.com"…return e.INTRANET_MACHINE_HOST?.trim()||hW'、'http://${mb}:${gb}/zcode/deps'、'mie=http://${mb}:${vW}${SW}'。 |
| 模型供应商自定义端点与 Claude 槽位映射设置(anthropic/openai/geminiEndpoint + slot 映射) | i18n 键全库零命中(检索词:claudeMapping、slot.haiku、mappingNotSet、endpointNoMatch;anthropicEndpoint 仅命中 legacyModelProviderSerialized.ts 的旧配置读取) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 设置页 modelProvider 增加:Anthropic/OpenAI/Gemini 自定义接口地址输入(placeholder 如 https://open.bigmodel.cn/api/anthropic)、Claude 模型槽位映射 slot.haiku/opus/sonnet/reasoning(claudeMapping/claudeMappingDescription/mappingNotSet/endpointNoMatch 校验文案)、codingPlan.billingDiscountInfo.open 折扣信息入口。 | 证据:IntlProvider-DW5rmeLm.js: '"settings.modelProvider.anthropicEndpointPlaceholder":如:https://open.bigmodel.cn/api/anthropic'、'settings.modelProvider.slot.haiku/slot.opus/slot.reasoning/slot.sonnet'、'settings.modelProvider.claudeMapping'。 |
| 插件市场 Claude Code 插件接入 + zcode 专属插件标记 | 全库零命中(检索词:settings.plugins.marketplace.claudeCodePlugins、settings.plugins.zcodeOnly) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 插件设置支持 Claude Code 插件市场(marketplace.claudeCodePlugins)与 zcode 专属插件(zcodeOnly)筛选/标记。 | 证据:IntlProvider-DW5rmeLm.js: '"settings.plugins.marketplace.claudeCodePlugins"…"settings.plugins.zcodeOnly"'。 |
| 技能 agent 归属(common/glm/unknown) | 全库零命中(检索词:settings.skills.agent.common、settings.skills.agent.glm) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 技能设置按 agent 归类展示:settings.skills.agent.common/glm/unknown 三类。 | 证据:IntlProvider-DW5rmeLm.js: 'settings.skills.agent.common、settings.skills.agent.glm、settings.skills.agent.unknown'(i18n 差分清单)。 |
| 设置页专属页面区分(webview page 判别联合含 rewards) | 仓库仅有 codingPlanWebview(购买页桥),无 page 判别联合(检索词:page:e.literal、VITE_REWARDS_WEBVIEW_ORIGIN) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js | app-only | App 设置/内嵌 webview 页面 schema:discriminatedUnion page ∈ {upgrade, rewards, settings},settings.section ∈ [general,appearance,models,browser,computer_use,memory,subagents,plugins,mcp,skills,commands,hooks,usage],popup 消息类型;rewards 页整支仅在 App。 | 证据:out/main/chunk-YSD25WTT.js: 'discriminatedUnion("page",[…page:e.literal("upgrade")…page:e.literal("rewards")…section:e.enum(["general","appearance","models","browser","computer_u…'。 |
| appHeader:复制 Claude JSONL 路径 + 供应商配置直达 | 全库零命中(检索词:copyClaudeJsonlPath、goToProviderConfig、openProviderConfigInEditorFailed) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 应用头部菜单:复制 Claude JSONL 会话文件路径(copyClaudeJsonlPath)、跳转供应商配置(goToProviderConfig 前后缀文案)、用编辑器打开供应商配置失败提示(openProviderConfigWithEditor*/openProviderConfigInEditorFailed)。 | 证据:IntlProvider-DW5rmeLm.js: '"appHeader.copyClaudeJsonlPath"…"appHeader.goToProviderConfigPrefix"…"appHeader.openProviderConfigInEditorFailed"'。 |
| Server 型远程工作区接入 UI(server.* 12 键 + remote.kind.server) | i18n 键零命中;共享层有 server-remote.ts schema(kind:'server' 连接键为 App 侧 buildConnectionKey 'docker':case'server'→dedicated) | /tmp/zcode-reverse/app/out/host/index.js + renderer | app-only | 远程工作区向导的 dedicated server 表单:server.name/token/url/workspacePath 与校验(invalidUrl/urlRequired/urlRequired/workspacePathDescription),remote.kind.server 描述;host 侧 buildConnectionKey 对 kind 'server' 生成 '<kind>:dedicated:<id>'。 | 证据:out/host/index.js: 'case"docker":case"server":return${e.kind}:dedicated:${t}';i18n 差分:'server.namePlaceholder、server.token、server.url、server.workspacePath、server.validation.invalidUrl、remote.kind.server.wizardDescription'。 |
| 官方插件捆绑包(glm/packages 14 个中 12 个仓库未随附源码) | 仓库仅含 browser-use-plugin、node-repl-host 源码与 official-plugin-definitions.ts 市场定义(指向 cdn-zcode.z.ai 运行时下载),另有 superpowers-plugin 仓库有而 App 未捆绑 | /Applications/ZCode.app/Contents/Resources/glm/packages/ | app-only | App 随附 14 个插件包:android-emulator、browser-use、documents、image-search、ios-simulator、node-repl-host、pdf、plugin-creator、presentations、restore-legacy-sessions、skill-creator、spreadsheets、zcode-cua、zcode-guide;除 browser-use/node-repl-host 外其余 12 个的包体仅存在于 App(仓库零命中包体,仅有市场定义引用)。 | 证据:ls /Applications/ZCode.app/Contents/Resources/glm/packages/ 共 14 项;rg 'android-emulator-plugin' 仓库仅命中 official-plugin-definitions.ts:121-124 的探测路径列表。 |
| onboarding 智能体设置步骤(agentSettings) | 全库零命中(i18n 键差分:onboarding.step.agentSettings 等) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 引导流程新增 agentSettings 步骤(onboarding.step.agentSettings、stepDescription.agentSettings、agentSettings.providersToggleAllAra、footer.selection)。 | 证据:i18n 差分 /tmp/app_only_i18n.txt:'onboarding.step.agentSettings、onboarding.stepDescription.agentSettings、onboarding.agentSettings.providersToggleAllAra'。 |
| memory 查看器禁用开关(settings.memory.viewer.disabled) | 全库零命中(i18n 键差分) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | app-only | 记忆设置存在 viewer.disabled 状态文案(查看器不可用时的 UI 分支),仓库 i18n 无对应键。 | 证据:i18n 差分:'settings.memory.viewer.disabled'。 |
| Bots/RemoteControl 双通道恢复通知(zcode:bot-remote-workspace-reconnected 等) | 仓库 159 条 zcode: 通道中零命中(diff 文件 /tmp/repo_channels.txt) | /tmp/zcode-reverse/app/out/main(通道常量表) | app-only | app-only 通道全集:bot-remote-workspace-reconnected、get-web-remote-control-status、reset-web-remote-control-pairing、start/stop-web-remote-control、sync-web-remote-control-tasks/workspaces、web-remote-control-reconnect-workspace、web-remote-control-status-changed(共 9 条,通道名 zcode: 前缀)。 | 证据:comm -23 /tmp/app_channels.txt /tmp/repo_channels.txt 输出含 ':zcode:start-web-remote-control' 等全部 9 条。 |
| 边界核查:透明代理/宿主 API 代理为同源(非 app-only) | packages/services/src/providers/api/nodeApiNetwork.ts resolveHostProxyForUrl + runtime-tools/agentProxyEnv.ts + desktopNetworkPolicy.ts setProxy 均存在 | /tmp/zcode-reverse/app/out/host/index.js | identical-evidence | 任务点名核查:App 的 host 出站代理(resolveHostProxyForUrl→{kind:'proxy',proxyUrl}/direct/invalid,undici ProxyAgent+caCertPath,缓存键 kind:proxyUrl:caCertPath)与 Electron setProxy/proxyBypassRules 策略在仓库均有同源实现;未发现 App 独有的网络层透明代理。 | 证据:out/host/index.js: 'return{kind:"proxy",proxyUrl:o}:{kind:"invalid",reason:"Configured Host proxy URL is invalid"}' ↔ repo nodeApiNetwork.ts resolveHostProxyForUrl。 |
| 边界核查:Stripe/PayPal 支付 API 为同源(非 app-only) | packages/services/src/coding-plan-subscription/bigmodelCodingPlanSubscriptionProvider.ts:355-365 queryStripeCards/bindStripeCard/payStripe/check-pending-orders 均在 | /tmp/zcode-reverse/app/out/host/index.js | identical-evidence | App host 的 zaiPay 系列(/stripe/query、/stripe/bind、/stripe/unbind、/stripe/pay、/pay/check-pending-orders、checkPaypal*)与仓库共享服务逐一同名同路径;node_modules 的 @stripe 仅在仓库 packages/ui 声明同一组依赖。 | 证据:out/host/index.js: 'async queryStripeCards(t={}){return this.getZaiPay(t.providerId,"/stripe/query")}' ↔ repo bigmodelCodingPlanSubscriptionProvider.ts:360。 |
| 边界核查:内网端口/探针/依赖路径为同源(仅默认主机值 app-only) | packages/shared/src/intranetDefaults.ts:19-43(12345/3850、/api/intranet/probe、/zcode/deps、ZCODE_DEPS_BASE_URL 全在) | /tmp/zcode-reverse/app/out/host/index.js | identical-evidence | 内网资产服务 12345、探针 3850、路径 /api/intranet/probe 与 /zcode/deps、env 覆盖逻辑逐项一致;唯一漂移是默认主机值 studio.zcode-ai.com(另列 app-only 行)。 | 证据:repo intranetDefaults.ts:26-27 'INTRANET_PROBE_SERVICE_PORT = 3850…INTRANET_PROBE_SERVICE_PATH = "/api/intranet/probe"' ↔ out/host/index.js 同值。 |
| 遗留 Bot 配置导入与凭据校验(legacy bot-config + credential 冲突检查) | 全库零命中(检索词:importLegacyBotConfig、Enabled polling bots cannot share、BotStorageMigrated) | /tmp/zcode-reverse/app/out/host/index.js | app-only | 升级链路:检测旧版 bot 配置结构(wa(e.bots))后按新 schema 迁移并标记 BotStorageMigrated 事件;启用轮询的 bot 间凭据唯一性校验报错 'Enabled polling bots cannot share the same credential.';modelSelection 归一($$(n))后并入 currentOptions。 | 证据:out/host/index.js: 'function H$(e){if(!wa(e)||!wa(e.bots))return e;let t=Object.entries(e.bots).map(([n,r])…'、'Error("Enabled polling bots cannot share the same credential.")'、'BotStorageMigrated'(7 处)。 |
| OAuth/登录入口常量(bigmodel.cn/login、api.z.ai/api/auth/z/login) | api/auth/z/login 3 文件命中、chat.z.ai/api/oauth 1 文件命中(同源);bigmodel.cn/login 全库零命中 | /tmp/zcode-reverse/app/out/host/index.js | app-only | host 内置登录入口含 https://bigmodel.cn/login(BigModel 控制台登录跳转)为 App 独有;api.z.ai/api/auth/z/login 与 chat.z.ai OAuth authorize/userinfo 与仓库同源(划界说明,不重复计)。 | 证据:out/host/index.js: 'https://bigmodel.cn/login'(rg 全库仅 App 命中);'https://api.z.ai/api/auth/z/login' 仓库 3 文件同源。 |
| i18n 键空间总体差分(兜底扫描结论) | packages/ui/src/i18n/locales/zh-CN.ts 5477 键(检索方法见 evidence) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js(6004 键) | app-only | PCRE 提取 'key': '格式 i18n 键做集合差分:527 个 App-only 键,分布 bots 258、webRemoteControl 104、manualClaimPlan 53、mode 38、settings 25、server 12、appHeader 8、marketingTouch 7、taskList 6、rewards 5、chat 5、onboarding 4、remote 2;未发现其他未覆盖的独有命名空间,佐证上述枚举无重大遗漏。 | 证据:rg -oP '"\K[a-z][a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)+(?=":)' 两侧抽取后 comm -23 差分 = 527 键(/tmp/app_only_i18n.txt)。 |
区域 summary:本区域完成了逐单元穷举对照:16 个子包、12+4 条顶层 CLI 命令、19 条斜杠命令、707 条 bash 命令注册表、0001-0022 全部 22 个会话迁移(含 appVersion 链)、22 个官方模型 ID、10 段系统提示词、47 个工具名、79 个 session 事件类型、14 条官方插件定义、glm/packages 14 个插件目录、i18n 中英双目录全量 leaf。结论:同源成立且主体逐字节一致(bash 注册表 707 条深比较 0 差异、迁移与模型 ID 全同、命令 switch 逐 case 一致、.node-bundle-meta.json 4 字段全同、CLI 版本同为 0.16.9)。确认的漂移集中在 6 处真实文案/定义差异:/model 命令 App 多 main|lite 入口、/login 帮助文案、loginRequired 四条文案("需要配置模型"→"需要登录")、bigmodel OAuth 文案、computer-use 插件 runtimeTopLevelPaths(repo 空占位 vs App 携带 node_modules 原生依赖)、browser-use 插件文档的 Codex/CLAUDE_PLUGIN_ROOT 措辞在开源侧被清洗。App 独有:webRemoteControl 中继函数、第二个 OAuth client ID、wss://zcode.z.ai/ws、staging 域名、12 个插件的可执行内容、browser-client.mjs 与 node-repl server.js 构建产物。仓库独有:superpowers-plugin 存根、swift-bridge 占位包、debug 调试 UI、i18n 的 subagents 侧栏与 terminal.starting 键。无 unresolved 项。
本区域 rows 共 42 条(identical-evidence 21 / skewed 3 / differs 5 / repo-only 5 / app-only 8)。覆盖口径:穷举范围:(1) apps/zcode-cli/packages 下全部 16 个子包(adapters/bootstrap/browser-use-plugin/cli/contracts/core/debug/dynamic-workflow/dynamic-workflow-runtime/i18n/node-repl-host/shared-types/superpowers-plugin/swift-bridge/telemetry/tui)逐个在 zcode.cjs 定位;(2) 清单型数据全量对照:顶层 CLI 命令 12 条 + 4 个预分派入口、斜杠命令 19 条(含别名)、bash-command registry 707 条(深比较)、会话迁移 0001-0022 共 22 条(含 appVersion 链)、官方 GLM 模型 ID 22 个、系统提示词 10 个…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| bash-command registry(707 条命令) | apps/zcode-cli/packages/core/src/tool/handlers/generated/bash-command-registry.ts:4-8 | zcode.cjs @5283394 (变量 Cft) | identical-evidence | 数据字节级一致(仅压缩器去掉键引号)。注意 bundle 中版本注释常量 fig-2.692.3/hash 被剥除,但内容哈希可由生成器复现。 | 证据:repo BASH_COMMAND_REGISTRY_VERSION="fig-2.692.3"、HASH=1b0d34b4…;deep-compare repo 对象 vs cjs Cft 对象:707/707 键序一致、0 条目差异 |
| 会话迁移 0001-0022(含 appVersion 链) | apps/zcode-cli/packages/adapters/src/storage/session-store/migrations.ts | zcode.cjs(appVersion:"…",id:"000N_…" ×22) | identical-evidence | 全量枚举比较,无缺失、无新增、版本链一致。 | 证据:22/22 id 与 appVersion 逐一相同(0001-0003=0.2.0 … 0019-0022=0.16.5);cjs 中无 0023+ 追加迁移 |
| 22 个官方 GLM 模型 ID | packages/shared/src/official-glm-model-id.ts:2-25 | zcode.cjs(XQn 数组) | identical-evidence | 全量一致。 | 证据:GLM-5.3 … GLM-4V-Flash 共 22 个,两侧顺序、大小写完全一致;normalizeOfficialGlmModelId 逻辑同构 |
| 顶层 CLI 命令注册表 | apps/zcode-cli/packages/cli/src/run.ts:518-570 | zcode.cjs(case"help"…case"tui" switch 块) | identical-evidence | 无 App 侧新增顶层命令(无 bots/rewards 等命令面)。 | 证据:repo switch 12 分支(help/version/agent-server/app-server/doctor/login/logout/commands/plugin/plugins/skills/tui)与 cjs 逐 case 同序;预分派 __internal-search/isPluginHostInvocation/isDwfChildInvocation/hooks/--prepare-storage 均在 cjs 命中 |
| 斜杠命令注册表(19 条) | packages/shared/src/zcode-slash-command-help.ts:9-190 | zcode.cjs(usage:"/help [command]"… 共 19 条 + 19 条 summary) | identical-evidence | 唯一文案差异见 /model 与 /login 行。 | 证据:help/login/logout/compact/init/expert/effort|variant/dwf/fork/locale|language/mcp|plugin/plugins/mode/model/new|clear/resume|continue/rewind/skill/goal|target 两侧集合一致,别名一致 |
| /model 斜杠命令帮助 | packages/shared/src/zcode-slash-command-help.ts:136-141 | zcode.cjs usage:"/model [list|main|lite|provider/model]" | differs | App(内部 3.14.1)新增 main/lite 快捷模型入口;开源 3.14.0 无。这是内部 commit 领先于开源快照的直接证据。 | 证据:repo:usage="/model [list|provider/model]",details="Use a provider/model id to select a model with its default reasoning effort; use /effort…";App:usage="/model [list|main|lite|provider/model]",details="Use main, lite, or a provider/model id to switch the active session model." |
| /login 命令帮助文案(en+zh) | apps/zcode-cli/packages/i18n/src/locales/en-US.ts(cli.help) / zh-CN.ts:同段 | zcode.cjs kPo/TPo 的 cli.help 模板 | differs | App 弱化 BigModel 入口提示(OAuth 面仍保留 bigmodel 选项),逐行 diff 仅此 1-2 行漂移。 | 证据:en repo:"login [zai|bigmodel] Sign in through browser authorization" vs App:"login Sign in with Z.AI OAuth for model access";zh repo:"通过浏览器授权登录" vs App:"使用 Z.AI OAuth 登录模型访问";en 帮助斜杠段 repo:"/login Choose Z.AI or BigModel browser login" vs App:"Sign in with Z.AI OAuth" |
| i18n tui.loginRequired.*(title/message/status/help ×2 语言) | packages/shared/src/zcode-slash-command-help.ts 引用的 locales en-US.ts:loginRequired / zh-CN.ts:loginRequired | zcode.cjs kPo/TPo tui.loginRequired | differs | 语义从「模型/Provider 配置」改为「登录」导向,8 条 leaf 全部漂移。 | 证据:repo en title="model setup required" message="No available models. Configure a provider or sign in with /login." vs App title="login required" message="Model not set, send /login to login.";zh 同步漂移(需要配置模型→需要登录) |
| i18n tui.loginSetup.options.bigmodelOauth 文案 | apps/zcode-cli/packages/i18n/src/locales/en-US.ts loginSetup 段 | zcode.cjs tui.loginSetup | differs | 授权回执机制描述不同:自动检测 vs 本地回调,4 条 leaf 漂移。 | 证据:repo secondary="Open browser login; authorization is detected automatically." vs App="Open browser login with a localhost callback.";pendingSecondary 同类漂移(en+zh) |
| i18n 目录其余全部 leaf(en-US + zh-CN) | apps/zcode-cli/packages/i18n/src/locales/{en-US,zh-CN}.ts | zcode.cjs kPo(en)/TPo(zh)目录对象 | identical-evidence | zh-CN 目录以 \u 大写转义形式内嵌("不支…"),解码后与 repo 逐字一致。 | 证据:deep-compare(函数取源码串归一化空白):en-US 与 zh-CN 除上列 3 组漂移外全部 leaf 一致;差异多为压缩器参数重命名+\uXXXX 转义 |
| i18n 键 tui.sidebar.subagents | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:162-164 | — | repo-only | App bundle 不含该键——TUI 子代理侧栏文案是开源快照侧新增(或 App 分支未有)。检索过 Subagents/subagents=37 次命中但均非该目录键。 | 证据:repo en "No subagents yet."/zh 同键存在;cjs 检索 "No subagents yet."=0、TPo/kPo 的 sidebar 键集无 subagents |
| i18n 键 tui.terminal.starting | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:289 | — | repo-only | 开源侧新增的终端启动提示文案。 | 证据:repo "starting: Starting ZCode... Ctrl+C to exit";cjs 检索 "Starting ZCode"=0;App terminal 命名空间仅 requiresInteractive |
| 工具注册表(47 个工具名) | apps/zcode-cli/packages/core/src/tool/handlers/index.ts:82-146 + contracts/src/tools/* | zcode.cjs(name:"X" 字符串全量命中) | identical-evidence | 无缺失、无 App 侧多余工具。 | 证据:Read/Write/Edit/Bash/Glob/Grep/WebFetch/WebSearch/TodoRead/TodoWrite/CronCreate/List/Update/Delete/OffPeakCreate|List/Enter|ExitPlanMode/AskUserQuestion/SendMessage/RespondToCoordinator/submit_result/escalate/TaskOutput/TaskStop/ReadSessionContext/Agent/Task/Skill/CreateWorkflow/AmendWorkflow/Save… |
| session 事件类型(79 个) | apps/zcode-cli/packages/contracts/src/events/session.events.ts:70-176 | zcode.cjs(双引号字符串全量比对) | identical-evidence | 协议词汇表全量一致。 | 证据:79/79 类型在 cjs 命中,0 缺失;cjs 中另有的 model_request_failed/turn_failed 等字符串经上下文核实为遥测/错误码枚举,非事件类型漂移 |
| 系统提示词各段落 | apps/zcode-cli/packages/core/src/context/{builder.ts,sections/*.ts} | zcode.cjs(字符串逐个命中) | identical-evidence | identity/env-info 标签常量(Primary working directory 等)亦逐串命中。 | 证据:10 个 section 名(Agent Identity/Environment Info/System Context/Skills/Memory/Current Date/CLI Prefix/Request User Context/Workflow Actor Identity/Custom System Prompt)+ "# Harness" 5 行 + 安全 IMPORTANT 行 + "You are an interactive ZCode agent…" 全部在 cjs 命中且各 1-2 次 |
| 官方插件定义 14 条(name/version/seeds/listing) | apps/zcode-cli/packages/bootstrap/src/app/official-plugin-definitions.ts:89-364 | zcode.cjs t9 数组 @~13811800 | identical-evidence | 唯一定义级差异单列见 computer-use runtimeTopLevelPaths 行。 | 证据:14/14 条 name+version 相同([email protected], [email protected], [email protected], documents/pdf/presentations/[email protected], [email protected], ios-simulator/restore-legacy-sessions/[email protected], [email protected], [email protected], [email protected]);requiredSeedPaths 逐路径相同… |
| computer-use(zcode-cua) runtimeTopLevelPaths | apps/zcode-cli/packages/bootstrap/src/app/official-plugin-definitions.ts:359 | zcode.cjs t9 computer-use 条目 runtimeTopLevelPaths:["node_modules"] | differs | 同一 seed 逻辑在 App 侧携带真实 CUA 原生运行时;开源侧被替换为空占位。与「仓库只有 CUA 占位包」已知结论吻合。 | 证据:repo:runtimeTopLevelPaths: [] 注释"当前 CUA 为不可用占位包,无需复制 native runtime";App:["node_modules"] 且 glm/packages/zcode-cua-plugin/node_modules 实装 sharp/koffi/@img/semver/detect-libc |
| browser-use-plugin 文档与技能正文 | apps/zcode-cli/packages/browser-use-plugin/{docs,skills} | glm/packages/browser-use-plugin/{docs,skills} | skewed | 同源文件的品牌/上游名清洗:开源侧删除 Codex 与 Claude 兼容提示。 | 证据:diff:docs/api.json、overview.md、playwright.md、workflow.md、skills/control-browser/SKILL.md 共 5 文件漂移(docs/recording.md 相同);漂移点:App 有 "CLAUDE_PLUGIN_ROOT as a compatibility fallback" 与 "Codex-compatible/Codex's 3000ms budget/current IAB backend" 措辞,repo 清洗为 ZCode 通用表述 |
| browser-use-plugin/package.json | apps/zcode-cli/packages/browser-use-plugin/package.json | glm/packages/browser-use-plugin/package.json | skewed | 许可证字段在开源侧改为 Apache-2.0,测试脚本仅内部存在。 | 证据:diff:license repo=Apache-2.0 vs App=MIT;App 多 "test": "vitest run test" 与 devDep vitest ^4.1.5 |
| browser-use-plugin/scripts/browser-client.mjs | apps/zcode-cli/packages/browser-use-plugin/src/browser-client.ts(源码) | glm/packages/browser-use-plugin/scripts/browser-client.mjs | app-only | 构建产物随包分发,开源侧只给源与构建脚本。 | 证据:App 为打包产物(含 ../core/dist 与 ../contracts/dist 内联注释),repo 无该 mjs;repo requiredSeedPaths 明确要求 scripts/browser-client.mjs(由 build.mjs 产出) |
| node-repl-host 运行时产物 | apps/zcode-cli/packages/node-repl-host/src(源码,无 dist) | glm/packages/node-repl-host/dist/mcp/server.js (5,069,197 bytes) | app-only | 宿主 MCP server 可执行体仅在 App。 | 证据:App server.js 头部为 esbuild CJS-ESM hybrid 包装;repo 无 dist 目录(构建产物不入库);.zcode-plugin/plugin.json 两侧 diff 为空(完全一致) |
| 12 个插件包内容(documents/pdf/presentations/spreadsheets/image-search/ios-simulator/android-emulator/restore-legacy-sessions/plugin-creator/skill-creator/zcode-guide/zcode-cua) | — | glm/packages/*-plugin/(42/44/5/29/4/31/42/7/10/3/16/含 node_modules 个文件) | app-only | 开源仓库只声明官方插件 seed(名称/版本/必需文件路径),可执行内容(skills/commands/docs/agents)仅随 App 分发;zcode-guide 的 commands/workflow.md 等在 repo 全文检索无对应。 | 证据:repo 全库 find 仅存在 browser-use-plugin/node-repl-host/superpowers-plugin 三个目录;12 个插件只有 definitions 里的 rootCandidates 声明,无任何源码或内容文件 |
| zcode-cua-plugin 完整插件包 | packages/zcode-cua-plugin(不存在) | glm/packages/zcode-cua-plugin/(@zcode/zcode-cua-plugin 0.6.3,docs/computer-use.md 470 行、skills/computer-use/SKILL.md、scripts/check-* 等 7 个脚本、node_modules 原生依赖) | app-only | 真实 CUA 插件(含图像依赖 sharp/koffi)仅存在于 App;与已知结论「真实 CUA helper,仓库只有占位」一致。 | 证据:App package.json 自述 "ZCode CUA SDK and skill package; execution is provided by the shared node_repl host";repo 全库检索无该包内容 |
| zcodeEndpoint 模块函数面 | packages/shared/src/zcodeEndpoint.ts:3-273(24 个导出) | zcode.cjs(r() 命名注册块 Aee/LZe/Brr…) | app-only | App-only 的 webRemoteControl 手机远程控制网关解析逻辑被编入 CLI 运行时端点模块。 | 证据:App 额外含 r(k3i,"resolveWebRemoteControlRelayWsUrl")、r(? ,"isWebRemoteControlV4AppVersion") 常量 Krr="3.4.0";repo 全库检索 resolveWebRemoteControl/WebRemoteControl=0 命中 |
| 第二个 OAuth client ID | packages/shared/src/zcodeEndpoint.ts:7(仅 client_P8X5CMWmlaRO9gyO-KSqtg) | zcode.cjs Grr="client_RzngVdSk8sYsG2_3HzOMdQ" | app-only | App 存在第二个 OAuth 客户端身份(用途未标注,紧邻 webRemoteControl 代码)。 | 证据:repo 全库 grep client_RzngVdSk8sYsG2 无命中;cjs 与 client_P8X5 并列出现 |
| wss://zcode.z.ai/ws WebSocket 端点 | — | zcode.cjs Jrr="wss://zcode.z.ai/ws" | app-only | CLI 运行时内置长连接中继端点,开源侧零对应。 | 证据:repo 全库(含 packages/web、desktop)grep wss://zcode.z.ai 无命中;cjs 该常量与 resolveWebRemoteControlRelayWsUrl 同块 |
| 备用/预发端点域名与 client 常量 | packages/shared/src/zcodeEndpoint.ts:3-7(仅 prod 四域) | zcode.cjs(LZe/Brr/zrr/qrr/Vrr 常量块) | app-only | App 保留内部测试/预发环境切换能力,开源快照裁剪。 | 证据:App 含 https://zcode.chatglm.site、http://localhost:3000、https://dev.bigmodel.cn、https://zai-test.chatglm.site、https://api.chatglm.site;repo 全库 grep chatglm=0 命中(bigmodel.cn、api.z.ai、chat.z.ai 两侧都有) |
| superpowers-plugin | apps/zcode-cli/packages/superpowers-plugin/(仅 1 个 LICENSE 文件,Jesse Vincent MIT) | — | repo-only | 开源侧遗留的第三方技能包许可存根,App 无对应。 | 证据:目录仅 LICENSE;workspace 通配 packages/* 会含它;cjs 检索 superpowers 仅 1 处路径过滤串 "/docs/superpowers/plans/"(会话过滤逻辑),无插件实体 |
| swift-bridge 包 | apps/zcode-cli/packages/swift-bridge/src/index.ts("Swift bridge placeholder"、isSwiftAvailable/detectSwiftVersion TODO 桩) | — | repo-only | 未接线的占位包,打包时被 tree-shake,属仓库残留样板。 | 证据:cjs 检索 "Swift bridge placeholder"=0、detectSwiftVersion=0;repo 内无其他包 import @zcode/swift-bridge |
| debug 包(vis-timeline 调试 UI) | apps/zcode-cli/packages/debug/src/{main.tsx,App.tsx,gantt-style.ts} | — | repo-only | 开发期轨迹可视化工具,仅存于仓库。 | 证据:cjs 检索 vis-timeline/standalone=0、gantt=0;该包为浏览器端 React 调试界面,不在 CLI bundle |
| .node-bundle-meta.json | packages/desktop/scripts/stage-agent-bundle.mjs:42-48 | /Applications/ZCode.app/Contents/Resources/glm/.node-bundle-meta.json | identical-evidence | staging 元数据完全同源。 | 证据:App 文件 {runtime:"electron-node", entry:"zcode.cjs", platform:"darwin-arm64", source:"apps/zcode-cli/packages/cli/dist/zcode.cjs"} 与 repo 写入的 4 字段模板逐字吻合 |
| CLI 版本号 | apps/zcode-cli/package.json (0.16.9) | zcode.cjs d9="0.16.9" | identical-evidence | CLI 层版本一致(App 桌面壳为 3.14.1、开源根包 3.14.0,属壳层差异)。 | 证据:bundle 内 __CLI_VERSION__ 注入值 d9="0.16.9";playwright 缓存路径 0.16.9 同值;迁移 appVersion 链最高 0.16.5(历史标记,非当前版本) |
| i18n 命名空间结构 | apps/zcode-cli/packages/i18n/src/{index.ts,types.ts,locale.ts,locales/} | zcode.cjs qTa={"en-US":kPo,"zh-CN":TPo} + getZCodeCopy(f4) | identical-evidence | 仅 en-US/zh-CN 两种 locale,resolveLocale/SUPPORTED_LOCALES 同构。 | 证据:命名空间 cli.{errors,help} + tui.{copy,effort,input,loginRequired,loginSetup,model,sidebar,status,terminal,transcript,selection,fileMention,slash} 两侧集合一致(键级差异已单列) |
| adapters/auth(Z.ai/BigModel Coding Plan OAuth) | apps/zcode-cli/packages/adapters/src/auth/{cli-oauth.ts,coding-plan-api-key.ts,shared-credentials.ts} | zcode.cjs(zai-coding-plan×8、bigmodel-coding-plan×8、api.z.ai×2) | identical-evidence | 认证面同源。 | 证据:DEFAULT_ZCODE_OAUTH_BASE_URL="https://zcode.z.ai/api/v1"、ZAI_API_HOST="https://api.z.ai"、oauth:bigmodel:* 凭据键、account:(zai|bigmodel)-(start|individual|team)-coding-plan provider id 集合两侧一致 |
| telemetry 包 | apps/zcode-cli/packages/telemetry/src/{bootstrap.ts,agent-metrics.ts,error-sanitizer.ts,…} | zcode.cjs resolveOtlpTraceEndpoint 命中 | identical-evidence | 遥测骨架同源(上报目的地由 env 决定)。 | 证据:OTEL_EXPORTER_OTLP_TRACES/METRICS/ENDPOINT 环境解析函数名与逻辑在 cjs 命中;OpenTelemetry API(TraceAPI/MetricsAPI/PropagationAPI)以依赖形式内嵌 |
| dynamic-workflow + dynamic-workflow-runtime | apps/zcode-cli/packages/dynamic-workflow/src/{compiler,engine,facade,lowering,…}、dynamic-workflow-runtime/src/{child-entry-file.ts,harness.ts,protocol.ts} | zcode.cjs(entry_file_fallback、zcode-workflow-runs、renderChildEntry、analyzeWorkflowScript、lowerWorkflow、workflow_child×15) | identical-evidence | DWF 引擎链路同源。 | 证据:沙箱入口落盘常量与函数名逐个命中;workflow_child/workflow_launch/local_dynamic_workflow 等角色枚举两侧一致 |
| bootstrap 官方插件 seed 机制 | apps/zcode-cli/packages/bootstrap/src/app/{bundled-plugins.ts,official-plugin-seed-lock.ts,official-plugin-cache-fs.ts} | zcode.cjs(.zcode-plugin-seed.json×1、withOfficialPluginSeedLock×1、isZCodeCuaInternalFeatureEnabled×2) | identical-evidence | seed/锁/降级协议同源。 | 证据:seed marker 文件名、锁函数、CUA 门控(ZCODE_CUA_PRODUCT_HELPER/ZCODE_CUA_DEV_MODE,默认 true、显式 0/false/off 关闭)与 repo runtimeEnv.ts:34-44 逻辑一致 |
| tui 包 | apps/zcode-cli/packages/tui/src/(91 个 tsx/ts) | zcode.cjs(activeStatusHint:"esc to interrupt" 等) | identical-evidence | TUI 实现随 bundle 分发,文案差异已在 i18n 行列明。 | 证据:TUI copy 全量经 i18n 目录比对覆盖;esc to interrupt 等 TUI 内嵌串命中 |
| shared-types / contracts 类型面 | apps/zcode-cli/packages/shared-types/src/index.ts、contracts/src/ | zcode.cjs(memoryBench×4、stream-json、ZCODE 协议类型) | identical-evidence | 类型包为编译期工件,运行时证据一致。 | 证据:GlobalOptions 字段(memoryBench/browserUse/outputFormat stream-json 等)在 cjs 命中;类型在编译后擦除,仅能按值域验证 |
| native-search 依赖(dependencies/native-search) | apps/zcode-cli/dependencies/native-search/{SHA256SUMS,bfs-v4.1.1-*,ripgrep-v13.0.0-10,ripgrep-v14.1.1-1,ugrep-v7.8.4-1} | /Applications/ZCode.app/Contents/Resources/tools/{bfs/bfs,ripgrep/rg,ugrep/ugrep} | identical-evidence | repo 保留归档+SHA256SUMS,App 只带解出的 darwin-arm64 二进制;版本/来源一致。 | 证据:实测二进制版本:ripgrep 14.1.1 (rev 4649aa9700)、bfs 4.1.1、ugrep 7.8.4 与 repo 清单版本一致 |
| node-repl-host package.json | apps/zcode-cli/packages/node-repl-host/package.json | glm/packages/node-repl-host/package.json | skewed | 包元数据轻微漂移(内部 monorepo 用 catalog 协议,开源改 workspace 协议)。 | 证据:diff:App 多 "test": "vitest run test";@zcode/zcode-cua 依赖 repo="workspace:*" vs App="catalog:";App 多 vitest devDep |
| glm/packages 目录集合 vs 官方插件定义 | apps/zcode-cli/packages/bootstrap/src/app/official-plugin-definitions.ts | /Applications/ZCode.app/Contents/Resources/glm/packages/(14 个目录) | identical-evidence | 插件集合与版本矩阵全量对齐,逐条版本见 definitions 行。 | 证据:目录名→definitions.name 映射 14/14(zcode-cua-plugin→computer-use、node-repl-host 目录同名);无多余目录、无缺失目录 |
区域 summary:依赖层面的"同源"结论被全量数据坐实:App package.json 38 项依赖中 35 项与仓库 packages/desktop 逐字同源,且 645/653 个共同 node_modules 包实装版本与仓库 pnpm-lock 解析版本完全一致。真差异集中在四处:(1) App 独有 8 个包(sharp、@larksuiteoapi/node-sdk、chart.js 全家、lottie-web、lodash.identity/pickby)在开源仓库任何清单和源码中都找不到,其中 sharp 被 out/main 动态 import、Lark SDK 被 out/host 实际调用,属内部 3.14.1 私有功能的依赖痕迹;(2) rrweb 全家 5 包版本漂移(App 2.0.0 vs 仓库 lock 2.1.6,同满足 @arms/rum-browser 的 ^2.0.0-alpha.4 规格,是两侧 lockfile 代际差);(3) @zcode/zcode-cua 引用方式不同(App 用 catalog: 而仓库 pnpm-workspace.yaml 无 catalog 定义,仓库本体是 fails-closed 占位 stub);(4) App 多声明 @zcode/e2e-report、仓库对应包不存在。lock 独有的 944 项均可归因于构建期工具链、平台二进制或已打入 out/ bundle 的 305 项生产闭包。两个 AI-SDK 补丁版本(anthropic 3.0.81 / openai-compatible 2.0.60)在 14MB zcode.cjs 中留有痕迹,@arms/rum-electron 补丁代码确认已在 App 副本中生效。
本区域 rows 共 24 条(identical-evidence 9 / skewed 4 / differs 2 / repo-only 3 / app-only 6)。覆盖口径:实际枚举:①App /tmp/zcode-reverse/app/package.json 全部 38 个 dependencies(28 外部 + 10 @zcode workspace)逐项对照仓库 packages/desktop/package.json 与 pnpm-lock importer 解析版本;②仓库 desktop 18 个 devDependencies、根 package.json 3 个 dependencies 反向核对 App 是否打包;③App node_modules 顶层 658 个包(scoped 已展开)与 lock packages 段 1594 个包名全集 LC_ALL=C comm 双向 diff(修正过两次排序 collation 导致的假差异),app-only 8 项、lock-only 944 项全量列出后归类;④desktop+全部…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| sharp 0.34.5(App 直接依赖) | — | /tmp/zcode-reverse/app/package.json:42; node_modules/sharp/package.json version=0.34.5 | app-only | App package.json 声明且 node_modules 实装 0.34.5(optionalDependencies 含全平台 @img/ 二进制但 darwin 包只带 sharp 本体)。仓库全库检索不到:无任何 package.json 声明、无源码 import。是 App 主进程私有功能依赖。 | 证据:App: package.json "sharp": "0.34.5";out/main/index.js 命中 await import("sharp")(压缩串 Svg");async function iC(e){try{let{default:t}=await import("sharp"))。仓库侧检索词:grep -rn sharp packages apps 全部 package.json 与 .ts/.tsx/.mjs 均零命中;pnpm-lock packages 段无 sharp@ 条目。 |
| @larksuiteoapi/node-sdk 1.61.1(App 直接依赖) | — | /tmp/zcode-reverse/app/package.json:15; node_modules/@larksuiteoapi/node-sdk version=1.61.1 | app-only | App 声明 1.61.1 并实装,out/host 进程实际动态 import(多智能体 host 的 Lark 接入)。仓库无此包,也不在 lock。其传递依赖 [email protected]、[email protected] 随之进入 App node_modules(反查依赖链:node_modules/@larksuiteoapi/node-sdk/package.json 引用二者),同样仓库不存在。 | 证据:App: out/host/index.js 命中 let d=await import("@larksuiteoapi/node-sdk")。仓库检索:grep -rn larksuiteoapi packages apps pnpm-lock.yaml 零命中(含 lock packages 段无 @larksuiteoapi/node-sdk@ 键)。 |
| @zcode/e2e-report(App workspace 依赖) | — | /tmp/zcode-reverse/app/package.json:25 | app-only | App package.json 声明 "@zcode/e2e-report": "workspace:",仓库 packages/ 下无 e2e-report 目录,lock importer 列表也无该包。内部 3.14.1 的新增包被开源清洗掉,但 App 构建产物清单保留了引用。 | 证据:仓库检索:ls packages/ 仅 13 个包无 e2e-report;grep -rn "e2e-report" packages//package.json pnpm-workspace.yaml 零命中。 |
| @zcode/zcode-cua 引用方式 | packages/desktop/package.json:49; packages/zcode-cua/package.json | /tmp/zcode-reverse/app/package.json:33 | differs | App 用 "catalog:" 引用(内部仓库 pnpm-workspace.yaml 定义了 catalog 版本源),仓库用 "workspace:" 指向 packages/zcode-cua;且仓库 pnpm-workspace.yaml 全文无 catalog 段,catalog: 在开源仓库无法解析。仓库侧 [email protected] 自述为占位实现("every runtime surface reports unavailable and fails closed"),而 App 的 out/renderer、out/host、out/scheduler 均有 zcode-cua 实际接线。 | 证据:App: package.json "@zcode/zcode-cua": "catalog:";out/host/index.js、out/scheduler/index.js、out/renderer/assets/styles-CuFc3dtZ.js 命中 zcode-cua。仓库:packages/desktop/package.json:49 为 workspace:;packages/zcode-cua/package.json description 含 "ships without Computer use...fails closed";pnpm-workspace.yam… |
| @lydell/node-pty-linux-arm64 / linux-x64 | packages/desktop/package.json:33-34; pnpm-lock.yaml packages 段 | /tmp/zcode-reverse/app/package.json:16-17 | differs | 两侧 package.json 都以 1.2.0-beta.10 精确版本声明,但 App(darwin 产物)的 node_modules 完全未打这两个 Linux 平台二进制;仓库 lock 则同时解析了 linux 与 darwin 变体(@lydell/node-pty-darwin-arm64/x64 也在 lock 而 App 未打,darwin 包实际用 [email protected] 原生模块)。属打包器按平台过滤,非逻辑差异。 | 证据:App: node -e require('@lydell/node-pty-linux-arm64/package.json') 抛 MISSING;ls node_modules/@lydell 目录不存在。仓库:desktop package.json 与 lock importer 均有 1.2.0-beta.10;lock_only.txt 含 @lydell/node-pty-darwin-arm64/x64。 |
| desktop package.json 元数据(version/flavor/homepage/author) | packages/desktop/package.json | /tmp/zcode-reverse/app/package.json:3,51-53 | skewed | App: version=3.14.1、zcodeProductFlavor=production、homepage=https://zcode.z.ai、author 为对象 {name:ZCode,email:[email protected]};仓库 desktop 无 version 字段(版本由根 3.14.0 管理)、无 zcodeProductFlavor、无 homepage、author 为字符串 "ZCode"。与既往结论一致:App 构建自内部 3.14.1(commit cead36fd)。 | 证据:两侧 package.json 原文对照:App line 51 "version": "3.14.1" vs 仓库文件无 version 键;author 对象 vs 字符串。 |
| rrweb / rrdom / rrweb-snapshot / @rrweb/types / @rrweb/utils(@arms/rum-browser 传递依赖) | pnpm-lock.yaml:10025(@arms/[email protected] → rrweb: 2.1.6) | node_modules/rrweb/package.json version=2.0.0 | skewed | 653 个共同包中唯一真实版本漂移:App 实装 2.0.0,仓库 lock 解析 2.1.6(5 个 rrweb 系包全体一致偏移)。链条:@arms/[email protected](两侧同版本)声明 rrweb ^2.0.0-alpha.4,2.0.0 与 2.1.6 均满足规格——内部 3.14.1 锁了旧版,开源 3.14.0 lock 解析到新版。App 的 out/ bundle 中无 rrweb 引用(grep out/ 零命中),说明录屏只在 @arms/rum-browser 运行时内部使用。 | 证据:逐包版本比对脚本输出:rrweb app=2.0.0 lock=2.1.6(rrdom/rrweb-snapshot/@rrweb/types/@rrweb/utils 同)。App: node_modules/@arms/rum-browser/package.json dependencies.rrweb="^2.0.0-alpha.4"、version=0.1.8。仓库:lock 10023-10025 @arms/[email protected](...): dependencies: rrweb: 2.1.6。检索词:grep -n "rrweb:" pnpm-lock.yam… |
| 外部直接依赖 12 项(@arms/rum-electron、@babel/runtime、@fiahfy/icns、@lydell×2、@opentelemetry 6 件套) | packages/desktop/package.json:30-40; pnpm-lock.yaml importer packages/desktop | /tmp/zcode-reverse/app/package.json:12-23 | identical-evidence | specifier 逐字符一致,App 实装版本与仓库 lock importer 解析版本一一相等:rum-electron 0.0.3、@babel/runtime 7.29.7、icns 0.0.7、otel api 1.9.1 / exporters 0.214.0 / resources+sdk 2.6.1。同源且零漂移。 | 证据:版本核对输出:12 项全部 实装=lock(如 @opentelemetry/api app=1.9.1 lock=1.9.1)。仓库 lock 5382 行起 packages/desktop importer 段逐项相同 specifier。 |
| 外部直接依赖 12 项(electron-updater、module-details-from-path、node-forge、node-pty、playwright-core、semver、ssh2、undici、ws、yaml、yauzl、yazl) | packages/desktop/package.json:50-63 | /tmp/zcode-reverse/app/package.json:34-48 | identical-evidence | specifier 一致;实装=lock 解析:electron-updater 6.8.3、module-details-from-path 1.0.4、node-forge 1.4.0、node-pty 1.1.0(spec ^1.0.0)、playwright-core 1.59.1、semver 7.7.4、ssh2 1.17.0(spec ^1.16.0)、undici 6.24.1(spec ^6.23.0)、ws 8.20.0、yaml 2.9.0、yauzl 3.3.0、yazl 3.3.1。ssh2/undici/node-pty 的 spec→lock 超前解析两侧完全同拍。 | 证据:App 逐包 node -e require(...).version 输出与 lock importer 段 version: 值逐项相等(如 ssh2 app=1.17.0 = lock 1.17.0)。 |
| react / react-dom | packages/desktop/package.json:55-56; package.json(pnpm.overrides react 19.2.7) | /tmp/zcode-reverse/app/package.json:39-40; out/renderer/assets/*.js | identical-evidence | 两侧 spec 同为 ^19.2.4;仓库经 pnpm.overrides 钉到 19.2.7(lock 解析 19.2.7,App package.json 作为构建产物不含 overrides 段)。App node_modules 不打 react/react-dom(打包进 renderer bundle),bundle 内含 10 处 19.2.7 版本串,与 lock 解析一致。 | 证据:仓库 root package.json:84-85 overrides react/react-dom=19.2.7;lock '[email protected]'。App: grep -rho "19\.2\.[0-9]" out/renderer/assets/.js | uniq -c → 19.2.7 ×10;ls node_modules 无 react/react-dom 顶层目录。 |
| @zcode 9 个 workspace 包(client/provider/provider-node/rpc/server/services/shared/ui/zcode-cua) | packages/desktop/package.json:41-49 | /tmp/zcode-reverse/app/package.json:24-32 | identical-evidence | 均为 workspace:*,两侧集合一致(zcode-cua 例外已单列)。App node_modules 无 @zcode 目录——workspace 包全部编译进 out/main、out/host 等 bundle,符合构建设计。 | 证据:两侧 package.json 依赖段逐名对照相同;ls /tmp/zcode-reverse/app/node_modules/@zcode → 目录不存在。 |
| @arms/rum-electron 补丁(patches/@[email protected]) | patches/@[email protected]; package.json:88 | node_modules/@arms/rum-electron/dist/index.mjs:517 | identical-evidence | 仓库补丁为 ARMS SDK 增加 console.error 多参数采集/脱敏(zcodeRedactConsoleErrorText 等函数);App 内 0.0.3 副本的 dist/index.mjs 第 517 行起含同名函数定义,确认 App 打包的是补丁后版本,补丁链两侧同源。 | 证据:patch 文件 diff 内容含 +function zcodeRedactConsoleErrorText(I)...;App 副本 grep -n zcodeRedactConsoleErrorText dist/index.mjs → 517 行命中,全文件 zcode 标记 45 处。 |
| @ai-sdk/[email protected] 与 @ai-sdk/[email protected] 补丁 | package.json:89-90 patchedDependencies; pnpm-lock packages 段 | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs | identical-evidence | 仓库根 patchedDependencies 指向这两个精确版本,lock 亦解析 3.0.81/2.0.60。两包不在 App node_modules(AI SDK 打进单文件 CLI 运行时),但 zcode.cjs 中各留有 1 处对应版本串,与补丁对象版本吻合。补丁内容是否生效需反编译 zcode.cjs 才能确认,版本级证据已闭环。 | 证据:grep -c "3\.0\.81" zcode.cjs → 1;grep -c "2\.0\.60" zcode.cjs → 1;lock_versions.json:@ai-sdk/anthropic=[3.0.81]、@ai-sdk/openai-compatible=[2.0.60]。 |
| App node_modules 中仓库完全不存在的包:chart.js 4.5.1 / react-chartjs-2 5.3.1 / @kurkle/color 0.3.4 / lottie-web 5.13.0 | — | node_modules/{chart.js,react-chartjs-2,@kurkle/color,lottie-web}/package.json | app-only | 四个包及 @kurkle/color(chart.js 传递依赖)在 App node_modules 中无任何 npm 层父依赖(node_modules 内反查仅自身),引入源只能是内部 3.14.1 的 @zcode 包(多半是 ui 的图表/动画能力)新增依赖;renderer bundle 有 lottie_light_canvas 命名 chunk 佐证 lottie 实际使用。开源仓库任何 package.json 与 lock 均无。 | 证据:app_only.txt(LC_ALL=C comm 输出)含这 4 项;仓库检索:grep -rn --include=package.json "chart.js|lottie|kurkle|react-chartjs-2" packages apps 零命中,lock grep chart.js@ 零命中。App: out/renderer/assets/lottie_light_canvas-C1S2SwyO.js 文件名存在。 |
| App node_modules 其余 app-only 包(8 项中的 lodash.identity 3.0.0 / lodash.pickby 4.6.0) | — | node_modules/lodash.{identity,pickby}/package.json | app-only | 二者是 @larksuiteoapi/node-sdk 的传递依赖(见上行 Lark 条目),随 Lark SDK 进入 App;仓库不存在。App-only 全集合共 8 项:@kurkle/color、@larksuiteoapi/node-sdk、chart.js、lodash.identity、lodash.pickby、lottie-web、react-chartjs-2、sharp,已全部归因,无未解释项。 | 证据:node_modules 内反查 grep -rl '"lodash.identity"' --include=package.json → @larksuiteoapi/node-sdk/package.json 命中;app_only.txt 全 8 行已逐项核对。 |
| 645/653 个共同包逐版本一致性 | pnpm-lock.yaml packages 段 1594 个包名 | node_modules/*/package.json(658 顶层包逐个读取版本) | identical-evidence | 658 个 App 顶层包中 650 个在仓库 lock 有名(8 个 app-only 已列);其中 645 个实装版本精确落在 lock 解析版本集合内(含 61 个 lock 多版本包各取其一,如 @shikijs/* 4.0.2、ai 6.0.159、minimatch 10.2.5、zustand 5.0.12 等 dedupe 差异,非漂移);仅 rrweb 全家 5 包漂移(已单列)。同源结论的量化证据。 | 证据:版本比对脚本输出:app pkgs=658 / mismatch=5 / multi-version-hit=61 / app有lock无=8;样例 @radix-ui/react-dialog app=1.1.15=lock 1.1.15(lock:3765)、@lexical/react app=0.42.0=lock(lock:2446)。 |
| lock 独有 944 包中的构建/开发工具链(electron 41.0.3、electron-builder、vite 8、rolldown、tsup、oxlint、oxfmt、ts-morph、knip、turbo、release-it、istanbul、conventional-changelog 系、tailwindcss、typescript 等) | pnpm-lock.yaml(各 importer devDependencies) | — | repo-only | lock-only 全集 944 项(LC_ALL=C comm),绝大多数是仓库各 workspace 的 devDependencies 与其传递闭包,按 Electron 打包语义本就不应进 App。抽验 desktop devDependencies 18 项(@electron/asar、@electron/rebuild、@tailwindcss/vite、@types/*、@vitejs/plugin-react、electron、electron-builder、http-mitm-proxy、istanbul-lib-instrument、tailwindcss、tsup、typescript、vite)全部未出现在 App node_modules,符合预期。 | 证据:lock_only.txt 944 行;比对 app_nm_c.txt 无 electron-builder/vite/oxlint 等条目。 |
| lock 独有中的平台二进制包(@esbuild/ 24 项、@rollup/rollup- 23 项、lightningcss- 12 项、@tailwindcss/oxide- 12 项、@napi-rs/canvas- 12 项、@lydell/node-pty-darwin- 2 项、@oxc-parser/-resolver、@oxfmt/@oxlint binding 系等) | pnpm-lock.yaml packages 段 optionalDependencies | — | repo-only | lock 为全平台安装记录了全部 optionalDependencies 平台变体;App 产物按 darwin-arm64 平台裁剪,仅保留当前平台所需。属平台过滤噪声,非功能差异。 | 证据:lock_only.txt 中 @esbuild/android-arm…@esbuild/win32-x64 等全平台清单;App node_modules 无任何 @esbuild/@rollup/@napi-rs 条目(app_nm_c.txt 核对)。 |
| 生产依赖闭包中 App 未打的 305 项(react/react-dom/scheduler、zod、yjs、@ai-sdk/gateway|provider|provider-utils、micromark 系部分、cytoscape 系、@mermaid-js/parser、@noble/hashes、@opentelemetry/sdk-logs、@types/* 等) | pnpm-lock.yaml(desktop+11 个被打包 workspace 包 importer 生产闭包=949 项) | /tmp/zcode-reverse/app/out/ | skewed | 以仓库 desktop+全部被打包 workspace 包的生产依赖做闭包得 949 项,其中 305 项不在 App node_modules。定性:同源依赖的打包位置漂移——这些包未列入 App 打包 externals,被 tsup/vite 编译进 out/ JS 与 glm/zcode.cjs(如 zod、yjs、@ai-sdk 系);其余为闭包遍历带入的间接/类型项。这不是逻辑差异,但意味着在 App 侧无法用 node_modules 逐一验证这些依赖的版本。 | 证据:闭包脚本输出 full prod closure=949 / missing=305;样例核实:zod、yjs、react、scheduler 均在 lock 且在 App node_modules 缺席,同时 out/renderer bundle 含 react 19.2.7(编译进入);grep zcode.cjs 命中 @ai-sdk 版本串。 |
| border-beam ^1.0.1(仓库根 dependencies) | package.json:50; pnpm-lock.yaml | — | repo-only | 仓库根 package.json 声明的 3 个根级依赖中,border-beam 在 lock 有解析但 App node_modules 不存在且 out/ 无需运行时副本(其效果编译进 renderer)。属仓库根级 hoisted 依赖,App 打包面天然不覆盖。 | 证据:仓库 root package.json:50 "border-beam": "^1.0.1";lock_only.txt 含 border-beam;app_nm_c.txt 无。 |
| d3-path ^3.1.0 / tailwind-scrollbar-hide ^4.0.0(仓库根 dependencies) | package.json:51-52 | node_modules/{d3-path,tailwind-scrollbar-hide}/package.json | identical-evidence | 根级另两项依赖在 App node_modules 中存在且版本命中 lock(d3-path app=3.1.0 lock 含 3.1.0;tailwind-scrollbar-hide 双侧同名同版),与 border-beam 形成对照。 | 证据:比对输出:d3-path app=3.1.0 ∈ lock[3.1.0](multi 命中类);app_only.txt/lock_only.txt 均不含二者。 |
| @pierre/diffs、@streamdown/*、@extend-ai/react-docx|xlsx、@aiden0z/pptx-renderer 等非典型源 npm 包 | packages/ui/package.json:31,35-38,75 等 | node_modules/@pierre/diffs 等 | identical-evidence | 这批少见包(diff 渲染、markdown 流式、docx/xlsx 预览、pptx 渲染)在仓库 packages/ui 声明、lock 有解析、App node_modules 全部在位(不在 app-only 缺失名单),传递链亦对上:@chenglou/[email protected] 是 @extend-ai/[email protected] 的依赖、@dukelib/[email protected] 是 @extend-ai/[email protected] 的依赖(lock 快照段核实)。 | 证据:仓库 ui package.json 命中 @pierre/diffs ^1.1.22、@streamdown/cjk|code|math|mermaid、streamdown ^2.5.0;lock 10644-10663 行快照展示 @extend-ai/react-docx→@chenglou/pretext 0.0.8、@extend-ai/react-xlsx→@dukelib/sheets-wasm 0.1.21;app_only.txt 无这些包。 |
| packages/zcode-cua(仓库侧本体) | packages/zcode-cua/package.json(0.6.3) | out/host/index.js、out/scheduler/index.js、out/renderer/assets/styles-CuFc3dtZ.js | skewed | 仓库版是明确的清洗替身:0.6.3,description 自述 API 兼容占位、无 Computer Use、所有运行面报告不可用并 fail-closed;lock 中该 importer 无任何依赖(packages/zcode-cua: {})。App 侧三处 out bundle 实际引用 zcode-cua,且 App package.json 走 catalog: 引用真实实现。接口同源、实体天差地别——与既往审计"真实 CUA helper 仅在 App"结论在依赖层面吻合。 | 证据:packages/zcode-cua/package.json description="API-compatible placeholder package for Computer Use...fails closed";lock:1285 packages/zcode-cua: {}(空 importer);App out 三文件 grep zcode-cua 命中。 |
| pnpm catalog 机制 | pnpm-workspace.yaml | /tmp/zcode-reverse/app/package.json:33 | app-only | App package.json 使用 catalog: 协议引用 zcode-cua,要求构建时 pnpm-workspace.yaml 存在 catalog 段;开源仓库 pnpm-workspace.yaml(31 行)无 catalog 定义,catalog: 在仓库内不可解析——这是内部 monorepo 工程设施未随开源快照导出的直接证据。 | 证据:grep -n catalog pnpm-workspace.yaml 零命中;App package.json "@zcode/zcode-cua": "catalog:"。 |
区域 summary:本专项完成了两侧 i18n 的穷举级对照。渲染器侧:仓库 packages/ui/src/i18n(en 5595 key / zh 5594 key / 87 命名空间)是 App 侧 IntlProvider-DW5rmeLm.js(en 6124 / zh 6120 / 93 命名空间)的严格子集——repo-only 命名空间与 repo-only key 均为 0,App 独有 6 个命名空间(bots 259、webRemoteControl 104、manualClaimPlan 53、server 12、marketingTouch 7、rewards 5,共 440 key)外加散布在 8 个既有命名空间里的 89 个新 key(mode+38、settings+24 等),独有 key 全部指向 App 私有功能(Bots、webRemoteControl、多智能体、奖励、验证码、多 Provider)。共享 key 的值级比对(转义归一后)仅 7 处真实漂移:feedback.background. 5 条文案重写("反馈提交状态"→"后台反馈状态")与 2 条 zcode.error. 新增验证码语义。CLI 侧方向相反:仓库 apps/zcode-cli/packages/i18n(204 叶子)比 App 捆绑的 zcode.cjs(185 叶子)多出 19 个叶子(18 个 tui.sidebar.subagents.* 子智能体侧栏文案 + tui.terminal.starting),且 loginRequired、bigmodelOauth、cli.help 共 7 个叶子文本实质漂移(App 内部版把 BigModel 浏览器登录改成了纯 Z.AI OAuth/localhost 回调)。两侧 en/zh 不对称特征同构(settings.memory.viewer.disabled 均为 en-only),进一步佐证同源。
本区域 rows 共 33 条(identical-evidence 8 / skewed 11 / differs 5 / repo-only 2 / app-only 7)。覆盖口径:枚举范围:(1) 渲染器侧穷举了仓库 packages/ui/src/i18n/locales/en-US.ts 与 zh-CN.ts 全部 key(5595/5594,含跨行值与字符串拼接解析,注释跳过)与 App 侧 /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js 中两个完整字典(zh var p、en var m,花括号配对提取 6120/6124 key,无重复);命名空间按 key 首段切分,两侧全列表 87 vs 93 逐个对照,无一抽样;共享 key 全量做了转义归一化后的值级 diff。(2) CLI 侧穷举了 apps/zcode-cli/packages/i18n/src/locales/{en-US,zh-CN}.ts 的全部叶子路径(204/204,函数型消息也算叶子)与 /Ap…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| 渲染器语言包文件对应 | packages/ui/src/i18n/locales/en-US.ts (404KB) + zh-CN.ts (407KB),由 packages/ui/src/i18n/IntlProvider.tsx 的 MESSAGES 表加载 | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js(823KB,zh 字典 var p={...} 位于偏移 714,en 字典 var m={...} 位于偏移 312932) | identical-evidence | 同一组件同一数据结构:IntlProvider.tsx 中 MESSAGES={'zh-CN':zhCN,'en-US':enUS} 与 bundle 中 var p(zh 先)、var m(en 后)的顺序一致,bundle 尾部同样导出 useZCodeIntl。 | 证据:IntlProvider.tsx:16-20 'const MESSAGES: Record<Locale, Record<string,string>> = {"zh-CN": zhCN, "en-US": enUS}';bundle 头 'var p={"startPlan.recommendation.subagentDescription":你的体验套餐中…';bundle 尾 'Error(useZCodeIntl 必须在 ZCodeIntlProvider 内使用)' |
| 渲染器命名空间集合(首段切分) | packages/ui/src/i18n/locales/en-US.ts — 87 个命名空间 | IntlProvider-DW5rmeLm.js — 93 个命名空间 | skewed | App 命名空间集合是仓库的严格超集:repo-only 0 个;app-only 6 个(bots/webRemoteControl/manualClaimPlan/server/marketingTouch/rewards,见后续行)。共享的 87 个中 79 个 key 数相同、8 个被 App 增补(appHeader/chat/mode/onboarding/remote/settings/taskList/zcode)。 | 证据:key 级 diff 统计:repo en 5595 → app en 6124(+529),repo zh 5594 → app zh 6120(+526);en app-only 529 / repo-only 0,zh app-only 526 / repo-only 0 |
| ns=bots | — | IntlProvider-DW5rmeLm.js — 'bots.add':添加… 等 259 key | app-only | App 独有命名空间,259 个 key,为全部独有命名空间中最大。前 5 个代表 key:bots.add、bots.addBinding、bots.addBot、bots.allowedCommands、bots.allowedWorkspaces。对应 App 私有的 Bots 功能。 | 证据:repo 侧 grep '^"bots\.' packages/ui/src/i18n/locales/en-US.ts 零命中;bundle 命名空间计数 259 |
| ns=webRemoteControl | — | IntlProvider-DW5rmeLm.js — 104 key | app-only | App 独有。前 5 key:webRemoteControl.botChannel.configure、.botChannel.description、.botChannel.feishu.description、.botChannel.feishu.title、.botChannel.lark.description。含飞书/Lark bot 通道配置文案,对应 web 远程控制私有功能。 | 证据:bundle 命中 '"webRemoteControl.botChannel.feishu.title":…';repo 侧零命中 |
| ns=manualClaimPlan | — | IntlProvider-DW5rmeLm.js — 53 key | app-only | App 独有。前 5 key:manualClaimPlan.banner.aria、.banner.bonus、.banner.claim、.banner.close、.banner.dismissConfirm.claim。对应手动领取套餐 banner 私有功能。 | 证据:bundle 命名空间计数 53;repo 侧零命中 |
| ns=server | — | IntlProvider-DW5rmeLm.js — 12 key | app-only | App 独有。前 5 key:server.description、server.name、server.namePlaceholder、server.token、server.tokenPlaceholder。对应自建服务器(remote kind=server)接入配置。 | 证据:bundle 命中 '"remote.kind.server":Server'(remote 命名空间内的配套);repo 侧 grep '"server\.' 零命中 |
| ns=marketingTouch | — | IntlProvider-DW5rmeLm.js — 7 key | app-only | App 独有。前 5 key:marketingTouch.failed、.idle、.preparing、.submitting、.succeeded。对应营销触达/提交流程状态文案。 | 证据:bundle 命名空间计数 7;repo 侧零命中 |
| ns=rewards | — | IntlProvider-DW5rmeLm.js — 5 key | app-only | App 独有。前 5 key:rewards.loadFailed、.menuBadge、.menuTitle、.openWebsite、.title。对应奖励中心私有功能。 | 证据:bundle 命名空间计数 5;repo 侧零命中 |
| ns=mode | packages/ui/src/i18n/locales/en-US.ts — 9 key | IntlProvider-DW5rmeLm.js — 47 key(+38) | skewed | App 新增 38 个 key,主要是 mode.description.claude.*(acceptEdits/auto/bypassPermissions/default/dontAsk/plan 等按引擎细分的模式描述)与 mode.acceptEdits、mode.default。对应多引擎(Claude/Code 模式)权限模式说明。 | 证据:bundle 命中 '"mode.default":默认';repo 侧 grep '"mode.default"' 零命中;repo 仅有 mode.title 等 9 个基础 key |
| ns=settings | en-US.ts — 1845 key | IntlProvider-DW5rmeLm.js — 1869 key(+24) | skewed | App 新增 24 个 key,集中于 settings.modelProvider.(anthropicEndpoint、geminiEndpoint、claudeMapping、endpointNoMatch、codingPlan.billingDiscountInfo.open 等多 Provider 端点配置)与 settings.memory.。 | 证据:app-only key 列表中 settings.* 24 条,如 'settings.modelProvider.anthropicEndpoint';repo 侧 grep 零命中 |
| ns=appHeader | en-US.ts — 14 key | IntlProvider-DW5rmeLm.js — 22 key(+8) | skewed | App 新增 8 个 key:copyClaudeJsonlPath、goToProviderConfig、goToProviderConfigPrefix/Suffix、openProviderConfigInEditorFailed、openProviderConfigWithEditor 等,对应 Provider 配置跳转/JSONL 路径复制私有功能。 | 证据:app-only 列表 appHeader. 8 条;repo 侧 grep '"appHeader.copyClaudeJsonlPath"' 零命中 |
| ns=taskList | en-US.ts — 64 key | IntlProvider-DW5rmeLm.js — 70 key(+6) | skewed | App 新增 6 个 key:newTask.claude/newTask.codex/newTask.gemini/newTask.opencode、selectProvider、codexConnectivityUnavailable。对应多引擎新建任务入口。 | 证据:bundle 命中 '"taskList.newTask.codex":Codex CLI';repo 侧零命中 |
| ns=chat | en-US.ts — 1338 key | IntlProvider-DW5rmeLm.js — 1343 key(+5) | skewed | App 新增 5 个 key:chat.agentSwitch.failed/success/switchTo、chat.captcha.verifyFailed、chat.error.action.retryCaptcha。对应智能体切换提示与验证码重试私有功能。 | 证据:bundle 命中 '"chat.captcha.verifyFailed":验证码校验失败,请重试。';repo 侧 grep 零命中 |
| ns=onboarding | en-US.ts — 58 key | IntlProvider-DW5rmeLm.js — 62 key(+4) | skewed | App 新增 4 个 key:step.agentSettings、stepDescription.agentSettings、footer.selection、agentSettings.providersToggleAllAria。对应引导流程的 Agent 设置步骤。 | 证据:app-only 列表 onboarding.* 4 条;repo 侧 grep '"onboarding.step.agentSettings"' 零命中 |
| ns=remote | en-US.ts — 49 key | IntlProvider-DW5rmeLm.js — 51 key(+2) | skewed | App 新增 2 个 key:remote.kind.server、remote.kind.server.wizardDescription。对应自建 server 类型远程连接向导。 | 证据:bundle 命中 '"remote.kind.server":Server';repo 侧 grep '"remote.kind.server"' 零命中 |
| ns=zcode | en-US.ts — 24 key | IntlProvider-DW5rmeLm.js — 26 key(+2) | skewed | App 新增 2 个 key:zcode.error.CLAUDE_UNKNOWN_COMMAND、CLAUDE_UNKNOWN_COMMAND_WITH_ARGS(Claude Code 未知命令提示)。 | 证据:bundle 命中 '"zcode.error.CLAUDE_UNKNOWN_COMMAND":Claude Code 未知命令 {command}。…';repo 侧 grep 零命中 |
| 其余 78 个共享命名空间 | en-US.ts / zh-CN.ts | IntlProvider-DW5rmeLm.js | identical-evidence | app、appError、automations(174)、bashOutput、browser(41)、carousel、codeBlock、codeViewer(71)、codingPlan、commandCenter、common、confirmDialog、conversationShare(165)、cuaPermission(28)、debugInfo、desktopMenu、developerTools、diff、directoryBrowser、docker、fileActions、fileTree、forceUpdate、forms、git(154)、gitGraph、locale、login、logout、markdownImage、markdownTable、model、modelSelection、modelTrajectory(51)、notification、occupationOnboarding(43)、offPeak(89)、planTool、pluginCreator、postUpdateReleaseNotes、projectSelector、purchase、quickPick(57)、remoteConnection、resourceManager(65)、root、scheduledPreview、settingsSync、sidePane、sidebar(55)、ssh、st… | 证据:逐命名空间计数表:如 automations repo=174 app=174、git repo=154 app=154、feedback repo=291 app=291(feedback 计数同但 5 条值漂移,见专行) |
| ns=feedback(计数相同但值漂移) | en-US.ts:5670 'feedback.background.collapse': "Collapse feedback submission status" | IntlProvider-DW5rmeLm.js — 'feedback.background.collapse':Collapse background feedback status | differs | feedback 命名空间两侧均 291 key,但 5 条 background.* 文案在 App 内部版被重写:collapse/dismiss/expand/open 由 'feedback submission status(反馈提交状态)' 改为 'background feedback status(后台反馈状态)',defaultDetail 由 '提交继续进行中,退出应用后会停止' 改为 '反馈会在后台继续处理'。en/zh 同步漂移。 | 证据:zh 侧:repo '折叠反馈提交状态' vs app '折叠后台反馈状态';'反馈提交继续进行中,退出应用后会停止' vs '反馈会在后台继续处理' |
| zcode.error.providerBusiness.3007 | en-US.ts:5614 '请求被网关安全校验拒绝,请稍后重试或联系支持。' / en: 'The request was rejected by the gateway security check. Please try again later or contact support.' | IntlProvider-DW5rmeLm.js — 验证码校验失败,请重试。 / Captcha verification failed. Please try again. | differs | 同一错误码 3007 的文案语义被改写:仓库是通用网关安全校验拒绝提示,App 改为验证码专用提示,与 App 私有验证码(captcha)功能配套。en/zh 同步漂移。 | 证据:drift 比对输出:zh repo '请求被网关安全校验拒绝,请稍后重试或联系支持。' vs app '验证码校验失败,请重试。' |
| zcode.error.modelSuspiciousEmpty | en-US.ts:5624 'The model returned no content (often caused by an expired token or plan issues). Please send again.' | IntlProvider-DW5rmeLm.js — The model returned no content (often caused by captcha not completed, an expired token, or plan issues). Send … | skewed | 仅英文文案漂移:App 在成因列表中插入 'captcha not completed(验证码未完成)';中文文案两侧一致,未同步修改。 | 证据:drift 比对:en repo 'often caused by an expired token or plan issues' vs app 'often caused by captcha not completed, an expired token, or plan issues';zh 无差异 |
| en/zh 不对称:settings.memory.viewer.disabled | en-US.ts:1823 存在;zh-CN.ts 无此 key(en 5595 vs zh 5594 的唯一差值) | IntlProvider-DW5rmeLm.js en 字典 6124 vs zh 字典 6120,该 key 同样仅存在于 en | identical-evidence | 仓库自身的 en/zh 缺key不对称在 App 中原样保留,是两侧同源的有力旁证。App 侧 zh 另缺 3 个 manualClaimPlan key(见下一行)。 | 证据:repo diff:唯一差 key 'settings.memory.viewer.disabled';app 内部 diff:en-only 4 key = 该 key + manualClaimPlan.banner.bonus/period.daily/period.oneTime |
| App en-only:manualClaimPlan 3 key | — | IntlProvider-DW5rmeLm.js en 字典含 manualClaimPlan.banner.bonus、banner.period.daily、banner.period.oneTime;zh 字典缺失 | app-only | App 独有命名空间内部的 en/zh 不对称:3 个 key 只有英文文案,未翻成中文。仓库无对应 key,无从对照。 | 证据:app 内部集合差:app_en - app_zh = ['manualClaimPlan.banner.bonus','manualClaimPlan.banner.period.daily','manualClaimPlan.banner.period.oneTime','settings.memory.viewer.disabled'] |
| IntlProvider 运行时逻辑同源 | packages/ui/src/i18n/IntlProvider.tsx | IntlProvider-DW5rmeLm.js | identical-evidence | bundle 保留完全相同的 localStorage 偏好键 'zcode-locale-preference'、广播通道 'state:locale'、同名的 useZCodeIntl hook 与中文报错文案,逻辑(system/zh-CN/en-US 偏好解析)一致。 | 证据:bundle grep 命中 'zcode-locale-preference'、'state:locale'、'useZCodeIntl';IntlProvider.tsx:38-39 定义相同常量 |
| 渲染器字典唯一来源 | — | out/renderer/assets/ 共 2804 个文件;out/main、out/preload、out/host、out/scheduler | identical-evidence | 对全部 out/ 子目录检索 'startPlan.recommendation' 等特征 key,仅 IntlProvider-DW5rmeLm.js 命中;styles-CuFc3dtZ.js 仅含 key 引用(formatMessage 调用点)非字典;defaultLocale-BFQXd0J9.js 是 Intl 数字格式化 polyfill(toLocaleString 辅助),非语言包。对照不存在遗漏字典的可能。 | 证据:grep -rl 'startPlan.recommendation' out/main out/preload out/host out/scheduler 无结果;defaultLocale 头部 'function e(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString(en)…' |
| CLI 语言包文件对应 | apps/zcode-cli/packages/i18n/src/locales/en-US.ts + zh-CN.ts(嵌套结构,en/zh 各 204 个叶子消息) | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs(14MB 单文件)内 en 字典 'kPo={locale:"en-US",cli:{…},tui:{…}}' 偏移 13209403,zh 字典 'TPo={locale:"zh-CN",…}' 偏移 13220399 | identical-evidence | App 的 CLI 运行时完整捆绑了两份语言字典,结构与仓库一致(locale/cli/tui 三段顶层),含 localeUnsupported 等同款消息。 | 证据:zcode.cjs 命中 'locale:"en-US",cli:{errors:{localeUnsupported:r(e=>Unsupported --locale value: ${e}. Supported locales: en-US, zh-CN, auto.' |
| CLI 叶子集合总量 | apps/zcode-cli/packages/i18n/src/locales/*.ts — 各 204 叶子 | zcode.cjs 两字典 — 各 185 叶子 | skewed | repo-only 19 个叶子、app-only 0 个:仓库 3.14.0 的 CLI 语言包反而比 App 内部 3.14.1 捆绑版多出子智能体侧栏整套文案。这是两侧 i18n 中唯一'仓库多、App 少'的反向差异。 | 证据:叶子路径 diff:en repo-only 19 / app-only 0;zh 完全同步 19 / 0 |
| CLI tui.sidebar.subagents.*(18 叶子) | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:162-183 — subagents: { title/empty/emptyOutput/back/readonly/loading/unavailable/retry/more/pendingMain/ended/status.{running,waiting,blocked,success,failed,cancelled,lost} } | zcode.cjs — tui.sidebar 子树仅 60 叶子(api/cache/context/mcp/…),无 subagents 段 | repo-only | 仓库 CLI TUI 的子智能体侧栏全套文案(含 'No subagents yet.'、'← Main conversation'、8 个运行状态词)在 App 捆绑的 CLI 中整段缺失;bundle 中 sidebar 定义只有 'sidebar:{api' 一处起点,且全文 grep 'No subagents yet' 零命中。说明内部 3.14.1 的 CLI TUI 未包含(或移除了)子智能体侧栏渲染。 | 证据:grep -c 'No subagents yet' zcode.cjs = 0,en-US.ts = 1;tui.sidebar 计数 repo 78 vs app 60,差集恰为 18 个 subagents.* |
| CLI tui.terminal.starting | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:287 起 terminal 段 | zcode.cjs — terminal:{requires…},无 starting 叶子 | repo-only | 仓库 CLI 的 '终端启动中' 提示在 App 捆绑版缺失(App 侧 terminal 段以不同叶子集开头),是第 19 个 repo-only 叶子。 | 证据:leaf diff 列表第 19 项 'tui.terminal.starting';bundle 命中 'terminal:{requires' |
| CLI tui.loginRequired.*(4 叶子) | en-US.ts:98 loginRequired 段:title 'model setup required'、message/status 'No available models. Configure a provider or sign in with /login.'、help 'Use /model to view models, or /login to connect a Coding Plan account.' | zcode.cjs en 字典:title 'login required'、message/status 'Model not set, send /login to login.'、help 'Local commands still work: /help, /locale, /mode, and /login.' | differs | 未登录/未配置模型拦截提示整组改写:语义从'需配置模型(Coding Plan)'变为'需登录',help 从引导 /model 变为列举本地可用命令。zh 同步漂移('需要配置模型'→'需要登录','没有可用模型,请配置 Provider 或输入 /login 登录。'→'未设置模型,请输入 /login 登录。')。 | 证据:leaf 值比对 4/4 全部 drift;zh 侧 unicode 转义 '需要登录' = 需要登录 |
| CLI tui.loginSetup.options.bigmodelOauth.*(2 叶子) | en-US.ts:114 bigmodelOauth 段:secondary 'Open browser login; authorization is detected automatically.'、pendingSecondary 'Complete sign-in in your browser. Authorization is detected automatically.' | zcode.cjs en 字典:secondary 'Open browser login with a localhost callback.'、pendingSecondary 'Complete sign-in in your browser. I will continue when the localhost callback arrives.' | differs | 登录授权机制文案漂移:仓库是'自动检测授权结果',App 改为'等待 localhost 回调',说明内部版改用了本地回调服务器方式的 OAuth 流程。zh 同步漂移('CLI 会自动查询授权结果'→'并使用本地回调…')。 | 证据:leaf 值比对 2/2 drift;zh 侧 app 文本 '并使用本地回调' = 并使用本地回调 |
| CLI cli.help | en-US.ts:21 'login [zai|bigmodel] Sign in through browser authorization'、:56 '/login Choose Z.AI or BigModel browser login' | zcode.cjs en 字典 help:'login Sign in with Z.AI OAuth for model access'、'/login Sign in with Z.AI OAuth' | differs | 帮助文本精确 diff 显示 4 处替换:App 移除了 login 命令的 '[zai|bigmodel]' 参数标注(原位变空白),'through browser authorization'→'with Z.AI OAuth for model access','Choose … or BigModel browser login'→'Sign in with …OAuth'。内部版砍掉了 BigModel 独立浏览器登录入口,与 bigmodelOauth 文案漂移互为印证。 | 证据:SequenceMatcher opcodes:replace '[zai|bigmodel]'→' ';'through browser authorization'→'with Z.AI OAuth for model access';'Choose'→'Sign in with';'or BigModel browser login'→'OAuth' |
| CLI 其余 179 个共享叶子 | apps/zcode-cli/packages/i18n/src/locales/{en-US,zh-CN}.ts | zcode.cjs 两语言字典 | identical-evidence | 除上述 19 个 repo-only 叶子和 7 个文本漂移叶子外,其余 178 个共享叶子(tui.input/tui.status/tui.transcript.workflow/tui.slash/tui.selection/tui.model 等)的字面量文本经参数归一(${X} 占位统一)后完全一致;此前 20 处疑似漂移经核查均为压缩器改写解构参数名({path:selected→{path:e,selected:t})造成的假阳性。 | 证据:字面量级 diff:shared 185 - text drift 7 - repo-only 交叉后剩余全部 equal;如 'Permission requested for ${X}.'、'Workflow ${X} - ${X} (${X}/${X} steps)' 两侧逐字符相同 |
| CLI en/zh 漂移与缺失同步性 | zh-CN.ts(204 叶子) | zcode.cjs zh 字典(185 叶子) | identical-evidence | zh 侧的 repo-only 集合与 en 侧完全相同(同 19 叶子),文本漂移也同步发生在 loginRequired/bigmodelOauth/cli.help 上,说明两侧各自内部 en/zh 保持同步演化为一体,对照结论不受语言选择影响。 | 证据:zh repo-only 19 项列表与 en 逐项相同;zh loginRequired.title 漂移 '需要配置模型'→'需要登录' |
区域 summary:构建/更新/签名链全面同源:asar 内 package.json 的 version/homepage/zcodeProductFlavor/author.email 与仓库 electron-builder extraMetadata 逐字段吻合;appId dev.zcode.app、Electron 41.0.3、electron-updater 6.8.3、icon 与 config/default.json 的 sha256、entitlements(主程序 4 键/Helper 3 键)与仓库 plist 完全一致;更新链(app-update.yml generic 占位 + 运行时 setFeedURL custom manifest provider)在 autoUpdater.ts 与 out/main/index.js 中逐句对上;spctl 显示 Notarized Developer ID,与仓库 notarize:false + 独立公证阶段 + doctor 脚本的两段式设计一致。确认的漂移:构建元数据为内部 3.14.1/cead36fd(仓库 3.14.0),CFBundleVersion 3.14.1.7714 无仓库对应;THIRD-PARTY-NOTICES.md 按仓库 extraResources/afterExtract 配置应存在于 Resources 但全树缺失;asar package.json 多出 @larksuiteoapi/node-sdk、@zcode/e2e-report、sharp 且 zcode-cua 由 workspace:* 改 catalog:;三个 tools 的 .bundle-meta.json 记录 sha256 与交付(已 Developer ID 签名)二进制实际哈希不一致。zcode-builtin.json 仅 JSON 序列化格式不同,jq -S 归一化后哈希相同。
本区域 rows 共 49 条(identical-evidence 32 / skewed 3 / differs 4 / repo-only 3 / app-only 3 / unresolved 4)。覆盖口径:穷举范围:out/metadata 全部文件(仅 build-meta.json 共 1 个)逐一字段对照 packages/desktop/scripts/build-metadata.mjs;app-update.yml 全部 4 个字段逐字段 vs packages/desktop/dev-app-update.yml;electron-builder.config.js 全部顶层键(appId/extraMetadata/electronLanguages/electronVersion/electronDownload/productName/directories/files/asarUnpack/beforePack/afterExtract/afterPack/extraResources/npmRebuild/protocols/mac/win/linux/deb/pac…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| out/metadata 目录全部文件 | packages/desktop/scripts/build-metadata.mjs(metadataDir=out/metadata,唯一落盘文件) | out/metadata/(仅 1 个文件:build-meta.json,141 字节) | identical-evidence | App out/metadata 下穷举仅 build-meta.json 一个文件,与仓库生成脚本的唯一输出路径 resolve(desktopDir,'out/metadata/build-meta.json') 一致;无多余 metadata 文件 | 证据:app /tmp/zcode-reverse/app/out/metadata/ 只含 build-meta.json;repo build-metadata.mjs:30 metadataDir=resolve(desktopDir,'out/metadata') |
| build-meta.json 字段 schema | packages/desktop/scripts/build-metadata.mjs collectBuildMetadata() | out/metadata/build-meta.json(appVersion/buildCommitId/buildTime/electronBuilderVersion) | identical-evidence | 生成脚本返回恰好这 4 个字段,App 侧文件字段一一对应,无增无减 | 证据:repo build-metadata.mjs:78-86 return {appVersion, buildCommitId, buildTime, electronBuilderVersion};app JSON 键集合完全相同 |
| build-meta.json.appVersion | package.json:3 "version": "3.14.0" | out/metadata/build-meta.json: "appVersion": "3.14.1" | skewed | 生成脚本取 root package.json version 去前缀;App 值 3.14.1 对应内部 commit cead36fd 的版本,仓库开源快照停在 3.14.0,已知同源漂移 | 证据:repo build-metadata.mjs:75 appVersion: normalizeVersion(rootPackageJson.version),normalizeVersion 去掉 ^v 前缀;repo package.json name=zcode version=3.14.0 |
| build-meta.json.buildCommitId | packages/desktop/scripts/build-metadata.mjs resolveCommitId()(git rev-parse --short=8 HEAD) | out/metadata/build-meta.json: "buildCommitId": "cead36fd" | skewed | App 构建自内部 commit cead36fd(2026-09-20);仓库 HEAD 是清洗后的 872ad96,无 cead36fd 对应提交 | 证据:repo build-metadata.mjs:52-63 execSync("git rev-parse --short=8 HEAD"),回退 env.ZCODE_COMMIT;app 值 cead36fd;grep zcode.cjs 'cead36fd' = 0 命中 |
| build-meta.json.buildTime | packages/desktop/scripts/build-metadata.mjs buildTime: new Date().toISOString() | out/metadata/build-meta.json: "buildTime": "2026-09-20T07:37:29.416Z" | skewed | App 构建时间 2026-09-20 与内部发布时间线一致;仓库侧无法复现该时间戳(构建时生成) | 证据:repo build-metadata.mjs:80 buildTime: new Date().toISOString();注释说明统一落盘保证 About 展示与产物同一次构建 |
| build-meta.json.electronBuilderVersion | packages/desktop/package.json devDependencies "electron-builder": "^26.8.1" | out/metadata/build-meta.json: "electronBuilderVersion": "26.8.1" | identical-evidence | 生成脚本从安装的 electron-builder package.json 解析版本(回退 devDeps 声明),App 记录 26.8.1 与仓库 ^26.8.1 声明吻合 | 证据:repo build-metadata.mjs:82-85 resolveInstalledPackageVersion("electron-builder", devDependencies?.["electron-builder"]) |
| build-meta.json 消费链(About 面板) | packages/desktop/src/main/about.ts:117,125 | out/main/index.js 命中 "build-meta.json")";out/host/index.js 同样引用 buildCommitId | identical-evidence | 主进程优先读打包前生成的 build-meta.json,缺文件才回退编译时常量——两侧消费逻辑同源 | 证据:repo about.ts:117 join(import.meta.dirname, "../metadata/build-meta.json")、:125 注释『优先读打包前生成的 build-meta.json』;app index.js grep 'build-meta.json' 命中 |
| app-update.yml vs dev-app-update.yml 逐字段 | packages/desktop/dev-app-update.yml(4 字段+3 行注释) | Resources/app-update.yml(4 字段全量) | differs | provider/useMultipleRangeRequest/url 三字段值完全一致(generic / false / http://localhost:8081);updaterCacheDirName 不同:App '@zcodedesktop-updater'(electron-builder 由 scoped 包名 @zcode/desktop 派生的生产默认值)vs 仓库 'zcode-dev-updater'(dev 占位,dev-app-update.yml 本就不进产物,files 仅含 out/+package.json)。dev 文件头 3 行中文注释为仓库独有,生成产物无注释属正常 | 证据:app app-update.yml: provider: generic / useMultipleRangeRequest: false / url: http://localhost:8081 / updaterCacheDirName: '@zcodedesktop-updater';repo dev-app-update.yml 同三字段 + updaterCacheDirName: zcode-dev-updater;repo electron-builder.config.js files:["out//*","package.json",...] 不含 dev-app-up… |
| updaterCacheDirName 运行时消费 | packages/desktop/package.json "electron-updater": "^6.8.3" | node_modules/electron-updater/out/AppUpdater.js 命中 updaterCacheDirName | identical-evidence | App 内 electron-updater 6.8.3 运行时读取 app-update.yml 的 updaterCacheDirName 字段,链路成立;'@zcodedesktop-updater' 恰为包名 @zcode/desktop 去斜杠派生,反向佐证构建源包名同源 | 证据:app node -e require('electron-updater/package.json').version = 6.8.3(repo 声明 ^6.8.3);grep updaterCacheDirName 命中 app node_modules/electron-updater/out/AppUpdater.js |
| 运行时更新链:服务端 manifest provider | packages/desktop/src/main/autoUpdater.ts:748-777 | out/main/index.js:402 命中 setFeedURL / manifest provider / checkForUpdates / normalizeReleaseNotesMarkdown / resolveUpdateFeedSourceFromStartupConfig | identical-evidence | autoUpdater.setFeedURL({provider:'custom', updateProvider:ManifestUpdateProvider, endpointOrigin, manifestUrl?, releasePlatform, deviceMid, resolveEndpointOrigin, resolveReleaseChannel}) 及日志串 '[auto-update] service manifest provider applied platform=...' 逐句对应;zh-CN/en-US 双语 release notes 归一化逻辑同在 | 证据:repo autoUpdater.ts:756-773 与 app index.js:402 内 $M(e){...setFeedURL({provider:"custom",updateProvider:pi,...releasePlatform:Pn(),deviceMid...}) 字符级同构;红函 redactUpdateFeedUrlForLog 两侧同名逻辑 |
| electron-builder publish 配置 | packages/desktop/electron-builder.config.js:756-765 publish:{provider:'generic',useMultipleRangeRequest:false,url:'http://localhost:8081'} | Resources/app-update.yml(electron-builder 由 publish 生成) | identical-evidence | publish 三字段与 app-update.yml 前三字段逐字对应;config 注释说明 generic 仅为占位、真实更新走服务端 manifest provider,与 App 实际运行链一致 | 证据:repo electron-builder.config.js:763-765 url: "http://localhost:8081"、useMultipleRangeRequest: false(注释:OSS 多 Range Content-Type 问题) |
| appId / productName(生产身份) | packages/desktop/scripts/desktop-product-identity.mjs PRODUCTION_IDENTITY{appId:'dev.zcode.app',productName:'ZCode'} | Info.plist CFBundleIdentifier=dev.zcode.app;codesign Identifier=dev.zcode.app | identical-evidence | App 为 production flavor 构建(flavor=production),appId/productName 与仓库生产身份常量一致;asar 内 zcodeProductFlavor=production 同证 | 证据:repo desktop-product-identity.mjs:10-16 appId "dev.zcode.app";app plutil Info.plist CFBundleIdentifier=dev.zcode.app |
| extraMetadata 注入字段 | packages/desktop/electron-builder.config.js:455-464 extraMetadata | /tmp/zcode-reverse/app/package.json: version=3.14.1, zcodeProductFlavor=production, homepage=https://zcode.z.ai, author={name:ZCode,email:[email protected]} | identical-evidence | asar package.json 比仓库 desktop package.json 多出的 version/zcodeProductFlavor/homepage/author.email 四项恰为 extraMetadata 注入值,逐字段命中;仓库原始 desktop package.json author 为 "ZCode"(无 email),差异完全由构建注入解释 | 证据:repo config:456-463 version: buildMetadata.appVersion / zcodeProductFlavor: flavor / homepage: "https://zcode.z.ai" / author.email "[email protected]" |
| electronVersion 钉版 | packages/desktop/electron-builder.config.js:471 electronVersion: "41.0.3";devDependencies electron 41.0.3 | Frameworks/Electron Framework.framework CFBundleVersion=41.0.3;4 个 Helper(Helper/GPU/Plugin/Renderer)齐全 | identical-evidence | Electron 运行时版本与仓库显式钉版一致,Helper 集合为 Electron 41 标准四件套 | 证据:repo config:471 electronVersion: "41.0.3";app plutil Electron Framework Info.plist CFBundleVersion 41.0.3 |
| electronLanguages 剪裁 | packages/desktop/electron-builder.config.js:469 electronLanguages: ["en-US","zh-CN"] | Frameworks/Electron Framework.framework/Versions/A/Resources/(仅 pak/dat/nib,无 .lproj、无 locale pak) | unresolved | 仓库配置声明只保留 en-US/zh-CN 以缩短签名时长;但安装产物 Electron Framework Resources 内连 locale pak/lproj 都不存在,无法从产物验证剪裁集合。已试检索:ls Framework Resources 与 Versions/A/Resources、grep -i lproj,均无命中 | 证据:repo config:467-470 electronLanguages: ["en-US", "zh-CN"];app ls Versions/A/Resources 输出无任何 .lproj/.pak locale 文件 |
| extraResources: icon.png | packages/desktop/build/icon.png → config:595-596 to: icon.png | Resources/icon.png | identical-evidence | sha256 完全相同(edd87a18...) | 证据:shasum 两侧均 edd87a182097389b0f59c07f8de283dbe433c9d37cd6e9a2a372611516ab81eb |
| extraResources: icon_windows.png | packages/desktop/build/icon_windows.png → config:609-610 | Resources/icon_windows.png | identical-evidence | sha256 完全相同(ae8cc4ca...) | 证据:shasum 两侧均 ae8cc4ca59180441ce3ba60a572ee9a5ee802f9ab9e7de1177ae5e0027c36a7a |
| extraResources: icon.icns | packages/desktop/build/icon.icns(buildResources 标准 mac 图标) | Resources/icon.icns | identical-evidence | sha256 完全相同(9c286aea...) | 证据:shasum 两侧均 9c286aeaf42ea1026877869dfade0f44ebce4c335c7b7ae347ba007ba0e16aa1 |
| extraResources: config/default.json | config/default.json → config:584-587 to: config/default.json | Resources/config/default.json | identical-evidence | 字节级一致,sha256 相同(05356d15...);注释『正式包不能依赖仓库目录读取内置兜底配置』与实际打包位置一致 | 证据:shasum 两侧均 05356d1513238e10c1823fd4ba9003e5d814f2f166c5c989044670489310af6f |
| extraResources: config/provider/zcode-builtin.json | config/provider/zcode-builtin.json ← scripts/builtin-provider-config.mjs:46-48 sourcePath | Resources/config/provider/zcode-builtin.json | identical-evidence | 原始字节不同但仅 JSON 序列化格式差异(仓库紧凑数组 vs App 展开缩进,如 ["gpt-5.6-luna","grok-4.6"] vs 两行展开);jq -S 键排序归一化后 sha256 完全相同(ea5a9bee...),值集合(模型ID、low/high/max 档位等)零漂移 | 证据:diff 仅显示数组展开 hunks(571c/3307c/3336c 等);jq -S . 两侧归一化哈希均 ea5a9bee1363c8f5e9b35249ef8983a32d50e06cc9a693bc024a9f572969a030 |
| extraResources: macos-window-bounds/zcode-window-bounds | packages/desktop/scripts/build-macos-window-bounds.mjs(源 native/macos-window-bounds/main.swift,swiftc arm64+x86_64 + lipo) | Resources/macos-window-bounds/zcode-window-bounds(Mach-O universal 2 架构) | identical-evidence | App 侧为 x86_64+arm64 双架构 lipo 产物,与脚本『同时产出 arm64 与 x86_64 的 universal 二进制』的构建定义一致;config 注释说明其为 CUA 权限浮窗吸附数据源 | 证据:file 输出 'Mach-O universal binary with 2 architectures: [x86_64] [arm64]';repo build-macos-window-bounds.mjs:40-50 swiftc -target arm64/x86_64-apple-macos11 + lipo -create |
| extraResources: glm/(agent 运行时) | config:630-637 from bundled-agents/<platform>/glm to glm;scripts/stage-agent-bundle.mjs | Resources/glm/zcode.cjs(14,796,911 字节)+ .node-bundle-meta.json + packages/14 个插件 | identical-evidence | 体积与任务描述约 14MB 一致;.node-bundle-meta.json 4 字段(runtime/entry/platform/source)与 stage-agent-bundle.mjs 写入的 meta 模板逐字段相同:runtime=electron-node、entry=zcode.cjs、platform=darwin-arm64、source=apps/zcode-cli/packages/cli/dist/zcode.cjs | 证据:repo stage-agent-bundle.mjs:22 stagedMetaPath=resolve(glmDir,'.node-bundle-meta.json'),:39-45 meta={runtime:'electron-node',entry:'zcode.cjs',platform:platformKey,source:AGENT_BUNDLE_SOURCE_RELATIVE};app glm/.node-bundle-meta.json 值完全一致 |
| glm/zcode.cjs 内容级对照 | apps/zcode-cli/packages/cli/package.json(bin zcode → ./dist/zcode.cjs) | Resources/glm/zcode.cjs 头部 '#!/usr/bin/env node' + esbuild 打包特征 | unresolved | 仓库侧 dist/zcode.cjs 不存在(apps/zcode-cli/packages/cli/dist: No such file or directory,构建产物 gitignore),无法字节级对照;产物内 grep 'cead36fd'=0、grep '3.14.1'=0(CLI 包自身版本 0.1.0,独立版本线),仅能确认生成链同源(build-desktop-agent-cli.mjs → prepare-agent-node-bundle.mjs → stage-agent-bundle.mjs)而非内容等价 | 证据:ls apps/zcode-cli/packages/cli/dist/ 报 No such file or directory;grep -c 'cead36fd|3\.14\.1' zcode.cjs 均为 0;repo stage-agent-bundle.mjs:3 AGENT_BUNDLE_SOURCE_RELATIVE="apps/zcode-cli/packages/cli/dist/zcode.cjs" |
| extraResources: tools/(bfs/ripgrep/ugrep) | config:639-647 from bundled-tools/<platform>/{toolId} to tools/<toolId>;scripts/native-search-tools-config.mjs:26-37 | Resources/tools/{bfs/bfs, ripgrep/rg, ugrep/ugrep} 三个目录 | identical-evidence | 工具集合与版本逐一吻合:bfs 4.1.1 / ripgrep 14.1.1 / ugrep 7.8.4;release v4.1.1-1 / v14.1.1-1 / v7.8.4-1 与 NATIVE_SEARCH_PREBUILT_RELEASES 模板 v${version}-1 全同;source 字段 ripgrep=official(预编译)、bfs/ugrep=producer(源码构建)与 config 逻辑(extraResourceToolIds 过滤 ripgrep、producer 归档 SHA 清单)一致 | 证据:repo native-search-tools-config.mjs:26-28 NATIVE_SEARCH_TOOL_VERSIONS={bfs:'4.1.1',ripgrep:'14.1.1',ugrep:'7.8.4'}、:33-37 PREBUILT_RELEASES;三个 .bundle-meta.json 的 version/release/source/toolId 全部命中 |
| .bundle-meta.json 字段 schema | scripts/native-search-tools-bundle-meta.mjs expectedBundleMeta() | tools/{bfs,ripgrep,ugrep}/.bundle-meta.json 各 8 字段 | identical-evidence | 生成模板字段 archiveSha256(可选)/binaryName/platform/provider('native-search-tool')/release/sha256/source/toolId/version 与三个 App 侧 meta 文件字段集合完全一致,无增无减 | 证据:repo native-search-tools-bundle-meta.mjs:11-21 expectedBundleMeta 返回 9 键(archiveSha256 条件展开);app bfs meta 实含 8 键+archiveSha256=9 键,provider 均为 'native-search-tool' |
| .bundle-meta.json sha256/archiveSha256 与二进制一致性 | scripts/native-search-tools-bundle-meta.mjs sha256(path)(写 meta 时对未签名二进制计算) | tools/bfs/.bundle-meta.json sha256=82c2c3a5... vs bfs 实际 e3a853f4...;ripgrep 7c0ab822... vs 5719e5e4...;ugrep d6f7836e... vs 51f9a187... | differs | 三个工具的实际二进制 sha256 全部与 meta 记录不符。实测二进制均带 hardened runtime 代码签名(CodeDirectory flags=0x10000),签名发生在写 meta 之后、改变 Mach-O 内容导致哈希漂移;archiveSha256 无原始归档可复验。影响面有限:repo 中 isNativeSearchBundleCurrent 仅用于构建/准备期(prepare-native-search-tools.mjs:61),打包后运行时不重校验。但按仓库模板语义(记录交付二进制哈希),交付态 meta 已失真 | 证据:shasum 实测:bfs e3a853f4...、rg 5719e5e4...、ugrep 51f9a187...;codesign -dv rg/bfs 输出 flags=0x10000(runtime);repo prepare-native-search-tools.mjs:8,61 isNativeSearchBundleCurrent 仅 import 于准备脚本 |
| asarUnpack: node-pty prebuilds | config:497-502 asarUnpack: ['node_modules/node-pty/prebuilds/${targetPlatform.key}/**'] | app.asar.unpacked/node_modules/node-pty/prebuilds/darwin-arm64/(另有 node_modules/ssh2/lib/protocol) | identical-evidence | 解包目录与 asarUnpack 规则吻合(darwin-arm64 目标平台);ssh2 为 electron-builder 对含原生可选绑定的包自动解包,同链路产物 | 证据:find app.asar.unpacked 输出 node_modules/node-pty/prebuilds/darwin-arm64 与 node_modules/ssh2/lib/protocol;repo config:498-501 注释『node-pty 的 target prebuild 还包含 spawn-helper...整个目标目录必须 unpack』 |
| mac 签名身份/hardened runtime | config:670 identity: shouldEnableMacSigning ? macSigningIdentity : null;:677 hardenedRuntime: shouldEnableMacSigning | codesign -dv: flags=0x10000(runtime), TeamIdentifier=8A5X4JJ39T | identical-evidence | 主 app 以 hardened runtime + Developer ID 签名,对应 config 的 CI 发布开关路径(identity 仅 CI 注入时启用);注释所述『mac.identity 26.x 拒绝 Developer ID Application 前缀需归一化』的预签名链与产物签名形态一致 | 证据:codesign -dv /Applications/ZCode.app 输出 CodeDirectory flags=0x10000(runtime)、TeamIdentifier=8A5X4JJ39T |
| entitlements.mac.plist(主程序) | packages/desktop/build/entitlements.mac.plist(同 4 键)→ config:677 entitlements | codesign -d --entitlements 输出 4 键:allow-dyld-environment-variables/allow-jit/allow-unsigned-executable-memory/disable-library-validation | identical-evidence | 主程序实际 entitlements 与仓库 plist 逐键一致,无多无少 | 证据:codesign 输出键集合 = entitlements.mac.plist 4 个 key 的集合 |
| entitlements.mac.inherit.plist(Helper) | packages/desktop/build/entitlements.mac.inherit.plist(同 3 键)→ config:678 entitlementsInherit | codesign -d --entitlements 'ZCode Helper (Renderer).app' 输出 3 键 | identical-evidence | Helper 实际 entitlements 与 inherit plist 逐键一致(较主程序少 allow-dyld-environment-variables) | 证据:Helper (Renderer) entitlements = {allow-jit, allow-unsigned-executable-memory, disable-library-validation} = inherit plist 键集合 |
| entitlements.helper.plist | packages/desktop/build/entitlements.helper.plist(2 键:allow-jit/allow-unsigned-executable-memory) | — | repo-only | 仓库 build/ 下存在 2 键版 helper entitlements,但在 packages/desktop 的 js/mjs/ts 中 grep 'entitlements.helper' 零引用(config 的 mac 节只用 entitlements+inherit 两个文件);App 侧 Helper 实际用的是 3 键 inherit 版。推断供仓库外的 CI 预签名/独立 helper 打包 job 使用,开源快照未带调用方 | 证据:grep -rn 'entitlements.helper' packages/desktop/ → 无命中;entitlements.helper.plist 内容仅 2 键;Helper 实际 3 键 |
| afterSign 钩子与公证流水线 | config:674 notarize:false + :671-674 注释『build 阶段签名+独立公证阶段两段式』;scripts/doctor-macos-release-app.sh | spctl --assess: accepted, source=Notarized Developer ID;xcrun stapler validate: 'does not have a ticket stapled' | identical-evidence | 仓库刻意不设 afterSign(内置 notarize 关闭,公证由独立阶段完成);App 实测为已公证的 Developer ID(在线公证票据、未 staple),与 doctor 脚本 require_notarization_staple 默认 0(staple 可选)的验证语义一致 | 证据:repo config:673-674 注释+notarize:false;doctor-macos-release-app.sh:91 local require_notarization_staple="${3:-0}"、:96-101 stapler validate 按需;app spctl accepted (Notarized Developer ID)、stapler 无票据 |
| signIgnore: glm/ 与 tools/ 跳过重签 | config:685-688 signIgnore: [/Contents/Resources/glm/, /Contents/Resources/tools/] | tools/{rg,bfs,ugrep} 均带嵌嵌入式签名(Identifier=rg/bfs/ugrep,hardened runtime) | identical-evidence | signIgnore 阻止 electron-builder 对已预签名目录重复签名(保持 CDHash/ Staple 有效);App 内 tools 二进制签名完好存在且未被主签名重签,与该设计一致 | 证据:repo config:686-687 两条正则;codesign -dv rg/bfs 显示 embedded 签名且 Identifier 保留原二进制名 |
| mac.extendInfo NSAppleEventsUsageDescription | config:662-663 extendInfo(模板串拼接 productName) | Info.plist NSAppleEventsUsageDescription='ZCode needs Apple Events access to coordinate local automation workflows with user-approved desktop apps.' | identical-evidence | 文案与 ${productName} needs Apple Events access... 模板逐字一致 | 证据:repo config:662 NSAppleEventsUsageDescription: ${desktopProductIdentity.productName} needs Apple Events access to coordinate local automation workflows with user-approved desktop apps. |
| protocols: zcode URL scheme | config:649-655 protocols:[{name: productName, schemes:['zcode']}] | Info.plist CFBundleURLTypes[0].CFBundleURLSchemes=['zcode'] | identical-evidence | deep link 协议注册与配置一致,scheme 保持小写 zcode,展示名跟随 productName(ZCode) | 证据:repo config:654 schemes: ["zcode"];app plutil CFBundleURLSchemes => [0 => 'zcode'] |
| LSMinimumSystemVersion 12.0 | (electron-builder.config.js 未显式设置 minimumSystemVersion) | Info.plist LSMinimumSystemVersion='12.0';cua-helper Info.plist 同为 12.0 | app-only | 主 app 与 CUA helper 的最低系统版本 12.0 在仓库 config 中无显式来源(grep minimumSystemVersion/LSMinimum 零命中),为 electron-builder 26.x 按 Electron 41 最低 macOS 要求派生的默认值;仓库 scripts/native-search-tools-config.mjs:15 MACOS_NATIVE_SEARCH_DEPLOYMENT_TARGET='12.0' 仅约束搜索工具编译目标,非 app plist 来源 | 证据:app plutil Info.plist LSMinimumSystemVersion 12.0;repo config grep 'minimumSystemVersion|LSMinimum|12\.0' 仅命中 native-search-tools-config.mjs:15 |
| CFBundleVersion 构建号 | (仓库无 build number 生成逻辑;.release-it.mjs 仅管 version/tag) | Info.plist CFBundleVersion='3.14.1.7714'(CFBundleShortVersionString=3.14.1) | app-only | 构建号 7714 来自内部 CI 流水线,仓库侧无对应生成脚本或常量;版本段 3.14.1 与 build-meta.appVersion 一致 | 证据:app plutil CFBundleVersion 3.14.1.7714;repo .release-it.mjs tagName 'v${version}' 无 build 号概念 |
| Squirrel.framework / Mantle.framework / ReactiveObjC.framework | (仓库不含框架二进制;electron-updater ^6.8.3 + electronVersion 41.0.3 钉版) | Frameworks/{Squirrel,Mantle,ReactiveObjC}.framework(Squirrel: com.github.Squirrel v1.0;Mantle: org.mantle.Mantle) | app-only | 三者是 Electron macOS 发行包自带的 Squirrel.Mac 自动更新组件(electron-updater 运行时使用),随 electronVersion 41.0.3 由 electron-builder 装入 Frameworks;仓库仅以 devDep 'electron-updater':'^6.8.3' 与 config electronVersion 间接对应,无框架文件本身。App 主进程 index.js 存在 Squirrel 引用印证运行链 | 证据:plutil Squirrel Info.plist CFBundleIdentifier=com.github.Squirrel;grep Squirrel 命中 out/main/index.js;repo config:471 electronVersion 41.0.3、package.json electron-updater ^6.8.3 |
| extraResources: THIRD-PARTY-NOTICES.md | config:568-569 { from: workspaceRoot/THIRD-PARTY-NOTICES.md, to: THIRD-PARTY-NOTICES.md }(无条件条目) | (全 App 树无任何 notices 文件) | differs | 仓库 config 将 650KB 的 THIRD-PARTY-NOTICES.md 无条件拷入 Resources,且 afterExtract 还会 stageElectronNotices 写入 Electron Framework Resources;实测 find /Applications/ZCode.app -iname 'notices' 零命中(顶层 Resources 与 Framework Resources 均无)。构建期清 sourcemap 的 packaged-sourcemap-cleanup 不涉及该文件,属产物与仓库配置的真实漂移(可能内部构建流水线另行剥离) | 证据:repo third-party-notices.mjs:6 noticesFileName='THIRD-PARTY-NOTICES.md'、:37-40 stageThirdPartyNotices 无条件 writeFile;app find -iname 'notices' 无输出;shasum 仓库侧 05d366f6...仅存在于仓库 |
| asar package.json 依赖集合 | packages/desktop/package.json dependencies | /tmp/zcode-reverse/app/package.json dependencies | differs | App 独有:@larksuiteoapi/[email protected]、@zcode/e2e-report@workspace:、[email protected](内部功能依赖,仓库无);@zcode/zcode-cua 解析方式不同:app 'catalog:' vs 仓库 'workspace:'(pnpm catalog 机制,等价指向但写法漂移)。其余 34 个依赖名与版本范围逐一相同 | 证据:node 字段级 diff:仅上述 4 项 differs;如 '@larksuiteoapi/node-sdk' app=1.61.1 repo=undefined、'sharp' app=0.34.5 repo=undefined、'@zcode/zcode-cua' app='catalog:' repo='workspace:*' |
| asar package.json 结构裁剪 | packages/desktop/package.json(含 scripts 16 项、devDependencies 18 项) | app package.json 无 scripts/devDependencies 字段 | identical-evidence | electron-builder 两段式打包只保留 name/main/type/dependencies 等运行时字段并注入 extraMetadata;scripts/devDependencies 被裁剪属预期行为。name=@zcode/desktop、main=out/main/index.js、type=module、description 与仓库逐字一致 | 证据:字段 diff 仅 author/dependencies/version/zcodeProductFlavor/homepage/scripts/devDependencies 差异,name/main/type/description 完全一致 |
| electron-builder win/linux 跨平台 target 配置 | config:690-735 win:{target:['nsis']}、linux:{target:['AppImage','deb','rpm','pacman']}、deb/pacman/rpm 细节 | (icon_windows.png 为 Resources 内唯一 Windows 痕迹) | unresolved | 手头只有 macOS 安装产物,NSIS/deb/rpm/pacman 的 afterPack Windows install manifest、pacman depends、rpm fpm 追加依赖等配置无法从产物验证。已确认的间接证据:asar 内 node_modules 含 @lydell/node-pty-linux-arm64/x64 预编译(远端 SSH/WSL 场景),与 config node-pty 跨平台策略相符 | 证据:repo config:690-735;app Resources 仅 icon_windows.png(sha256 与 build/icon_windows.png 相同);asar package.json 含 @lydell/node-pty-linux-* |
| dmg 安装盘配置 | config:729-745 dmg:{size:'3200m', background:'build/dmg_background.png', icon:'build/icon_installer.icns', contents:[...]};build/ 下素材均在 | (已安装 .app 不含 DMG) | unresolved | DMG 容量放大(防 Framework 截断)、自定义背景、图标坐标等配置无法从已安装产物验证,需拿到安装包镜像才能逐字段对照 | 证据:repo config:729-745、ls packages/desktop/build/ 见 dmg_background.png/icon_installer.icns 等;/Applications/ZCode.app 为已解压安装态 |
| CUA Helper(ZCode Computer Use.app) | packages/zcode-cua/broker-helper-constants.js:1-5 HELPER_APP_NAME/HELPER_BUNDLE_ID | Resources/cua-helper/ZCode Computer Use.app(CFBundleIdentifier=dev.zcode.cua-helper,v3.14.1,含 _CodeSignature/CodeResources) | identical-evidence | helper 应用名 'ZCode Computer Use.app'、显示名 'ZCode Computer Use'、bundle id 'dev.zcode.cua-helper' 与仓库常量逐字一致;生产 flavor cuaHelperInstallVariant=null 对应非 Dev 变体(无 .dev 后缀)。注:仓库 packages/zcode-cua 为清理版 stub('Computer Use is not available in this build.'),helper 实体本体是 app-only 的内部实现 | 证据:repo broker-helper-constants.js:1 HELPER_APP_NAME='ZCode Computer Use.app'、:4 HELPER_BUNDLE_ID='dev.zcode.cua-helper';app Info.plist CFBundleDisplayName/Identifier 同值;config:18 cuaHelperInstallVariant:null(production) |
| doctor:macos-release 验证链 | scripts/doctor-macos-release-app.sh + package.json 'doctor:macos-release' | (App 为被验证对象:spctl accepted) | repo-only | 发布验收脚本(codesign --verify --deep --strict、spctl -a -vv、可选 stapler validate、区分 preview 身份)只存在于仓库侧;实测 App 通过其核心断言(spctl accepted, Notarized Developer ID) | 证据:doctor-macos-release-app.sh:29-33 USAGE 声明Always validates codesign/spctl;app spctl --assess accepted |
| release-it 发布链 | .release-it.mjs(git tag v${version}、conventional-changelog、npm publish:false)+ scripts/release-it/changelog-writer.mjs | (产物侧仅体现为 version 字段 3.14.1) | repo-only | 版本推进/changelog 生成链为仓库独有;App 的 3.14.1 版本号是该链在内部仓运行的结果,仓库快照停在 3.14.0,无 CHANGELOG.md 输出可对照 | 证据:.release-it.mjs:9-14 commitMessage 'chore: release v${version}'、tagName 'v${version}'、github/gitlab release:false、npm publish:false |
| 构建编排脚本链(仓库生成脚本全集) | packages/desktop/package.json scripts + scripts/*:prepare:build-meta→build-metadata.mjs、prepare:runtime-assets、prepare:agent-bundle→prepare-agent-node-bundle/stage-agent-bundle、prepare:native-search→prepare-native-search-tools、prepare:macos… | App 产物为该链的输出(out/ 五目录结构、metadata、glm、tools、unpacked 均可溯源到具体脚本) | identical-evidence | App 侧每个资源目录都能对应到唯一仓库生成脚本:out/metadata←build-metadata.mjs、Resources/glm←stage-agent-bundle.mjs、Resources/tools←prepare-native-search-tools.mjs、Resources/macos-window-bounds←build-macos-window-bounds.mjs、asarUnpack/node-pty←node-pty-package-assets.mjs;链路完整闭合,无孤儿产物 | 证据:packages/desktop/package.json scripts 'prepare:build-meta':'node scripts/build-metadata.mjs' 等 16 条脚本;scripts/build-zcode.mjs、run-production-build.mjs、ensure-local-runtime-assets.mjs 均在 scripts/ 目录实测存在 |
| detectUpdateChannel:false 与 release channel | config:754 detectUpdateChannel: false;packages/desktop/src/main/autoUpdater.ts:740-750 | out/main/index.js:402 resolveUpdateReleaseChannel:读 settingService receivePreviewUpdates → 'preview'|'stable',日志 '[auto-update] ... check channel ... -> ...' | identical-evidence | 关闭 electron-builder 按 prerelease 名自动推断 channel,改为服务端设置驱动(receivePreviewUpdates),两侧逻辑与日志格式一致 | 证据:repo config:754 detectUpdateChannel: false;autoUpdater.ts:748 注释『服务端 manifest provider 会在 checkForUpdates 内部读取 preview 设置』;app index.js Ty(e){...(await e.get()).receivePreviewUpdates===!0?'preview':'stable'} |
| afterPack 运行时依赖注入与 sourcemap 清理 | config:541-566 afterPack(injectHoistedRuntimeModulesIntoAsar / stripPackagedSourcemapReferences / assertPackagedNodePtyPrebuild) | asar node_modules 含 @opentelemetry/*、module-details-from-path 等非直接 hoist 可见的运行时包;out/ 内未见 .map 引用残file | identical-evidence | asar 内 node_modules 实际包含 pnpm strict 布局下 electron-updater→builder-util-runtime→debug→ms 这类传递依赖(config:147 注释所列),证明注入步骤执行过;sourcemap 清理后产物无 .map 可回源。Windows-only 的 writeWindowsInstallManifest 不适用于 mac 产物 | 证据:repo config:147 注释 'electron-updater → builder-util-runtime → debug 运行时 require("ms")';app node_modules/ 下 debug/ms 包存在;out/ 目录 grep '.map' 无 sourceMappingURL 主链引用 |
区域 summary:packages/client 是 6 文件小包(连接层 + 服务代理 + window.zcode 类型声明),编译后内联进 App 的 renderer bundle。同源证据非常扎实:messageport.ts 三条日志串与逐行编译形态、RemoteServiceAccess 的 39 个 getter 顺序、rendererLoggingEnv 的双条件判断均在 /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js 原样命中。核心漂移有四处:App 的 ServiceChannels 多出 cloud-content/marketing-touch/output-style/bots 四个仓库完全没有的通道,RemoteServiceAccess 相应多 4 个服务代理(botsService 插在 conversationShare 与 fileWatcher 之间,另两个插在 clientScenes 之后、outputStyle 插在 memory 之后,其余相对顺序与仓库一致);App preload 的 window.zcode 比仓库 globals.d.ts 的 98 个声明多暴露约 24 个方法(8 个 webRemoteControl 族 + onBotRemoteWorkspaceReconnected 为全仓库零命中的私有功能,15 个在仓库其他包有实现但未进该声明文件)。websocket.ts 是唯一 repo-only 模块:仅 packages/web 使用,桌面 App 全量 tree-shake,"WebSocket"/"closed before ready"/"new WebSocket" 全 out/ 零命中(IntlProvider 中仅 bots.runtime.feishuWebSocket* 私有 i18n)。总体结论与已知结论一致:仓库是清洗后的 3.14.0 快照,App 为含 Bots/webRemoteControl/内容营销等私有功能的 3.14.1 内部构建。
本区域 rows 共 19 条(identical-evidence 8 / skewed 2 / repo-only 1 / app-only 8)。覆盖口径:本区域为 @zcode/client 包(工作区源码包,编译时内联进 App renderer bundle,无独立产物文件)。穷举范围:(1) src/ 下全部 6 个文件(index.ts、messageport.ts、remoteServiceAccess.ts、rendererLoggingEnv.ts、websocket.ts、globals.d.ts)+ package.json + tsconfig.json,逐个在 out/renderer/assets/.js 定位(关键 chunk:index-BvllzT2k.js 入口、src-1E9aqq2Y.js、logger-B2LDfCdI.js、IntlProvider-DW5rmeLm.js)。(2) 清单型数据全量对照:ServiceChannels 仓库 40 键 vs App 44 键逐键比对;RemoteSer…*
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| packages/client/package.json(包元数据:@zcode/client,exports ./src/index.ts + ./globals,deps rpc/services/shared) | packages/client/package.json:1-19 | 无独立产物(workspace 源码包,编译期内联进 renderer chunk) | identical-evidence | App 以源码别名方式把 @zcode/client 内联打包(desktop tsup alias 同款机制),三个 workspace 依赖 @zcode/rpc(Me/Xe/g.toService 等)、@zcode/services(各 IXxxService descriptor)、@zcode/shared(ServiceChannels 对象)全部出现在 bundle 中,包边界消失但内容齐全 | 证据:仓库 packages/client/package.json:5-9 exports/deps;产物 index-BvllzT2k.js:1 new Me(e),new Xe(t)(MessagePortProtocol/ChannelClient)+ new O(n)(RemoteServiceAccess) |
| src/index.ts(导出桶:RemoteServiceAccess、connectViaProtocol、connectViaWebSocket、connectViaMessagePort、createMessagePortServiceConnection + 2 类型) | packages/client/src/index.ts:1-5 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js:1 | identical-evidence | 5 个运行时导出中 3 个(RemoteServiceAccess=class O、createMessagePortServiceConnection=A、connectViaMessagePort=pt)在 App 入口 chunk 原样存在;connectViaWebSocket/connectViaProtocol 被 tree-shake(详见 websocket.ts 行) | 证据:仓库 index.ts:2-4;产物 index-BvllzT2k.js:1 命中 function A(e){k(\[messageport] creating protocol and client...\)}、pt=e=>A(e).services |
| src/messageport.ts(createMessagePortServiceConnection/connectViaMessagePort/logMessagePortDebug) | packages/client/src/messageport.ts:6-59 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js:1 | identical-evidence | 编译形态逐行对应:logMessagePortDebug→k(e)=ft()||console.log(e)(生产静默)、MessagePortProtocol→Me、ChannelClient→Xe、onDidInitialize 日志、disposed 标志的 dispose(client.dispose(reason)+protocol.disconnect())、pt=A(e).services。三条日志串 100% 命中 | 证据:仓库 messageport.ts:28-47;产物 grep 命中 [messageport] creating protocol and client.../[messageport] ChannelClient received Initialize from server/[messageport] client created, waiting for Initialize...(sort -u 3 条全中,仅 index-BvllzT2k.js) |
| src/rendererLoggingEnv.ts(isRendererProductionBuild:__ZCODE_RENDERER_DISABLE_LOGGING__ || import.meta.env.PROD) | packages/client/src/rendererLoggingEnv.ts:5-16 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js:1(ft 函数)+ logger-B2LDfCdI.js:1(n 函数同款) | identical-evidence | 逻辑完全一致:globalThis.__ZCODE_RENDERER_DISABLE_LOGGING__===!0||{...env}.PROD===!0。注意 vite 把 env 对象整体内联,其中含仓库没有的 VITE_REWARDS_WEBVIEW_ORIGIN/VITE_CODING_PLAN_WEBVIEW_ORIGIN 键(私有功能的构建期注入,属旁证,不改变本模块逻辑同源判定);logger chunk 的同款判断还多了 typeof process<"u"&&!0 的 NODE_ENV fallback,来自 packages/ui/src/logger.ts 而非本包 | 证据:仓库 rendererLoggingEnv.ts:11-15;产物 index-BvllzT2k.js:1 function ft(){return globalThis.__ZCODE_RENDERER_DISABLE_LOGGING__===!0||{BASE_URL:\./\,...,VITE_REWARDS_WEBVIEW_ORIGIN:\\,...}.PROD===!0} |
| src/remoteServiceAccess.ts(RemoteServiceAccess 类:39 个服务 getter + defineProperty 隐藏 providerProvisioningTargetService) | packages/client/src/remoteServiceAccess.ts:50-218 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js:1(O=class{...}) | skewed | 同源且 39 个仓库 getter 的名称与相对顺序逐一一致,defineProperty(providerProvisioningTargetService,{enumerable:!1}) 细节都保留;漂移点:App 类多 4 个字段与 getter——botsService(插在 conversationShareService 与 fileWatcherService 之间)、cloudContentService 和 marketingTouchService(插在 clientScenesService 与 offPeakTaskService 之间)、outputStyleService(插在 memoryService 与 settingsSyncService 之间),共 43 个 getter(42 赋值 + 1 defineProperty),对应私有功能 Bots/云端内容/营销触达/输出风格 | 证据:仓库 remoteServiceAccess.ts:51-92,157-162;产物 python 提取 O=class{fileService;...;conversationShareService;botsService;fileWatcherService;...;clientScenesService;cloudContentService;marketingTouchService;offPeakTaskService;...;memoryService;outputStyleService;settingsSyncService;...},42 处 `this.x=g.toS… |
| RemoteServiceAccess 的 39 个仓库侧共享 getter(file/media-preview/git/git-checkpoint/system/terminal/setting/onboarding-record/credential/broadcast/zcode-task/window-controller/zcode-agent/zcode-session/cua-permission/conversation-share/file-watcher/oauth/provider-settings/model-selection/provider-provision… | packages/client/src/remoteServiceAccess.ts:95-216 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js:1 | identical-evidence | 归并行:39 个 getter 逐一在 App 构造器中按相同顺序命中(42 次 toService 赋值中除去 4 个 app-only 后为 38 次赋值 + 1 次 defineProperty = 39),名称零漂移;cuaPermissionService 在两侧都是必选 getter(App 构造器含 this.cuaPermissionService=g.toService(e.getChannel(je.channelName))) | 证据:仓库 grep -c channelClient.getChannel = 39;产物同段计数 toService 赋值 42 = 38 共享 + 4 新增,+1 defineProperty |
| RemoteServiceAccess.providerProvisioningTargetService 的非枚举 defineProperty 细节 | packages/client/src/remoteServiceAccess.ts:157-162 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js:1 | identical-evidence | 仓库注释'Host-only target proxy;不向 Renderer 暴露 Secret 写入接口'对应实现原样保留:属性字符串名未被改写且 enumerable:!1 与仓库 enumerable:false 一致 | 证据:仓库 remoteServiceAccess.ts:157 Object.defineProperty(this, "providerProvisioningTargetService", {value:..., enumerable: false});产物 Object.defineProperty(this,\providerProvisioningTargetService\,{value:g.toService(e.getChannel(ye.channelName)),enumerable:!1}) |
| src/websocket.ts(connectViaWebSocket/connectViaProtocol/wrapBrowserWebSocket/WebSocketConnectionCloseEvent) | packages/client/src/websocket.ts:23-105(被 packages/web/src/main.tsx:13 消费) | — | repo-only | App renderer 全量 tree-shake 了该模块:桌面入口只 import connectViaMessagePort/createMessagePortServiceConnection,websocket 路径仅 web 构建使用。检索词试过:'WebSocket closed before ready'、'closed before ready'、'WebSocket connection failed'、'connectViaWebSocket'、'new WebSocket'、'binaryType'、'WebSocket'、'SocketProtocol'——out/ 全目录(renderer/preload/main/host)零命中;唯一 'WebSocket' 命中在 IntlProvider 的 bots.runtime.feishuWebSocket* 私有 i18n 文案,与本模块无关。判定为构建目标差异而非功能删改 | 证据:仓库 websocket.ts:72 WebSocket connection failed: ${wsUrl}、:86 WebSocket closed before ready: ${event.reason};产物 grep -rl 全 out/ 无命中,IntlProvider-DW5rmeLm.js 仅 "bots.runtime.feishuWebSocketStarting":\飞书 WebSocket 启动中。\`` |
| src/globals.d.ts(window.zcode 类型声明:98 个方法) | packages/client/src/globals.d.ts:55-320 | /tmp/zcode-reverse/app/out/preload/index.cjs(exposeInMainWorld("zcode",{...})) | skewed | 清单全量比对:仓库声明的 98 个方法(connectRemote...setTitleBarTheme)在 App preload 的 window.zcode 对象里 98/98 全部存在、无一缺失;漂移方向为 App 单向超集——App 实际暴露约 122 个成员,多出的 24 个方法中 9 个属全仓库零命中的私有功能(webRemoteControl 族 + bots 重连事件),15 个在仓库其他包有实现但未写入本声明文件(声明滞后),详见后续行 | 证据:仓库 globals.d.ts 程序化提取 98 个方法名(/tmp/repo_globals_methods.txt);产物 preload/index.cjs 提取 exposeInMainWorld("zcode") 对象字面量(15923 字节),正则逐名核对 98/98 present, missing=[] |
| window.zcode 新增:webRemoteControl 方法族(getWebRemoteControlStatus/startWebRemoteControl/stopWebRemoteControl/refreshWebRemoteControlPairing/syncWebRemoteControlTasks/syncWebRemoteControlWorkspaces/onWebRemoteControlReconnectWorkspace/onWebRemoteControlStatusChanged) | — | /tmp/zcode-reverse/app/out/preload/index.cjs window.zcode | app-only | 8 个方法在仓库全量源码(packages/, apps/,排除 node_modules)中 0 命中,对应已知私有功能 webRemoteControl(App 远控网页端) | 证据:产物 /tmp/zcode_wzcode_obj.txt 含 getWebRemoteControlStatus:、startWebRemoteControl: 等 8 键;仓库 grep -r 每名均 0 命中 |
| window.zcode 新增:onBotRemoteWorkspaceReconnected | — | /tmp/zcode-reverse/app/out/preload/index.cjs window.zcode | app-only | Bots 私有功能的事件回调,仓库 0 命中;与 ServiceChannels.Bots(bots)、RemoteServiceAccess.botsService、IntlProvider 的 bots.runtime.* i18n 相互印证 | 证据:产物 /tmp/zcode_wzcode_obj.txt 含 onBotRemoteWorkspaceReconnected:;仓库 grep 0 命中 |
| window.zcode 新增:仓库有实现但 globals.d.ts 未声明的 15 个方法(onShareImport、onOpenTicketsPanel、onOpenFeedbackDialog、onCloseActiveContextRequest、reportArmsCustomEvent、getWindowControlsOverlayMetrics、onWindowControlsOverlayChanged、migrateLegacyCommonMcp、loadMcpFromUserDirectory、saveMcpToUserDirectory、getZCodeStdioT… | packages/ui/src/root/useRootPlatformEffects.ts:174(platform.onShareImport 等平台抽象层) | /tmp/zcode-reverse/app/out/preload/index.cjs window.zcode | app-only | 归并行:这 15 个在 App window.zcode 上存在,且仓库其他包也能找到同名实现/调用(命中数 onShareImport:17、migrateLegacyCommonMcp:18、reportArmsCustomEvent:21、loadMcpFromUserDirectory:24、setShortcutRecordingActive:15、saveMcpToUserDirectory:13、getZCodeStdioTapDevState:7、onCloseActiveContextRequest:7、onWindowControlsOverlayChanged:6、reportLocalTtftBatch:5、onOpenTicketsPanel:4、getWindowControlsOverlayMetrics:4、onOpenFeedbackDialog:4、getDeviceId:10、createTempTextAttachment:9),说明是开源快照把 client/globals.d.ts 的声明面裁剪了(或 App 3.14.1 新增后仓库声明未跟上),而非功能凭空出现 | 证据:产物 /tmp/zcode_wzcode_obj.txt 全部含 名: 键;仓库 grep 计数见检索输出,如 packages/ui/src/root/useRootPlatformEffects.ts:174 const disposeShareImport = platform.onShareImport |
| preload exposeInMainWorld 键集合(__ZCODE_DEVICE_ID__ / __zcodeFinalArmsCustomEventsE2E / zcode) | packages/desktop/src/preload/index.ts(3 处 exposeInMainWorld) | /tmp/zcode-reverse/app/out/preload/index.cjs | identical-evidence | 两侧 exposeInMainWorld 的顶层键完全一致,同为 3 个;窗口级差异在 zcode 对象内部(见上两行) | 证据:仓库 grep exposeInMainWorld packages/desktop/src/preload/index.ts → 3 键;产物 grep exposeInMainWorld out/preload/index.cjs → "__ZCODE_DEVICE_ID__"、"__zcodeFinalArmsCustomEventsE2E"、"zcode" 同 3 键 |
| ServiceChannels 共享通道 40 键(file/media-preview/system/terminal/git/git-checkpoint/setting/credential/cua-permission/cua-pip-session/broadcast/zcode-task/window-controller/zcode-agent/zcode-session/conversation-share/file-watcher/oauth/provider-settings/model-selection/provider-provisioning-target/usag… | packages/shared/src/channels.ts:74-150 | /tmp/zcode-reverse/app/out/renderer/assets/src-1E9aqq2Y.js:1(tA={ServiceChannels 对象}) | identical-evidence | 归并行:仓库 40 键的键名与通道字符串在 App 的 ServiceChannels 对象字面量中逐一命中、值零漂移(26 个多词通道逐个 grep 计数均命中,14 个单词通道在对象 dump 中可见),App 对象为仓库超集(多 4 键见后) | 证据:仓库 channels.ts:74 export const ServiceChannels = { File: "file", ... OnboardingRecord: "onboarding-record" };产物 python 提取 tA={File:\file\,MediaPreview:\media-preview\,...,CuaPipSession:\cua-pip-session\,...,OffPeakTask:\off-peak-task\,OnboardingRecord:\onboarding-record\} |
| ServiceChannels.CloudContent(cloud-content)+ RemoteServiceAccess.cloudContentService | — | src-1E9aqq2Y.js:1 ServiceChannels + index-BvllzT2k.js:1 O 类 | app-only | 云端内容服务通道,仓库全量源码 0 命中(grep 'cloud-content' = 0);App 在 clientScenesService 之后插入 cloudContentService getter | 证据:产物 src-1E9aqq2Y.js ClientScenes:\client-scenes\,CloudContent:\cloud-content\,MarketingTouch:...;index-BvllzT2k.js this.cloudContentService=g.toService(e.getChannel(fe.channelName));仓库 grep 0 |
| ServiceChannels.MarketingTouch(marketing-touch)+ RemoteServiceAccess.marketingTouchService | — | src-1E9aqq2Y.js:1 ServiceChannels + index-BvllzT2k.js:1 O 类 | app-only | 营销触达服务通道,仓库 0 命中;getter 位置紧随 cloudContentService 之后 | 证据:产物 src-1E9aqq2Y.js MarketingTouch:\marketing-touch\`;index-BvllzT2k.js this.marketingTouchService=g.toService(e.getChannel(Ke.channelName))`;仓库 grep 0 |
| ServiceChannels.OutputStyle(output-style)+ RemoteServiceAccess.outputStyleService | — | src-1E9aqq2Y.js:1 ServiceChannels + index-BvllzT2k.js:1 O 类 | app-only | 输出风格服务通道,仓库 0 命中;getter 插在 memoryService 与 settingsSyncService 之间 | 证据:产物 src-1E9aqq2Y.js Memory:\memory\,OutputStyle:\output-style\,SettingsSync:...;index-BvllzT2k.js 字段表 ...hooksService;memoryService;outputStyleService;settingsSyncService;...;仓库 grep 0 |
| ServiceChannels.Bots(bots)+ RemoteServiceAccess.botsService | — | src-1E9aqq2Y.js:1 ServiceChannels + index-BvllzT2k.js:1 O 类 + IntlProvider-DW5rmeLm.js:1 i18n | app-only | Bots(智能体机器人)服务通道,仓库 0 命中;getter 插在 conversationShareService 与 fileWatcherService 之间;另有配套私有 i18n 命名空间 bots.runtime.*(含 feishuWebSocket/telegram polling 文案)仅存在于 App | 证据:产物 src-1E9aqq2Y.js SettingsSync:\settings-sync\,Bots:\bots\,Feedback:;index-BvllzT2k.js conversationShareService;botsService;fileWatcherService 与 this.botsService=g.toService(e.getChannel(ve.channelName));IntlProvider "bots.runtime.feishuWebSocketStarting";仓库 grep '"bots"' 0 |
| App preload 独立入口 rewardsWebview.cjs(对比仓库 preload 目录清单) | packages/desktop/src/preload/(browserVideoRecorder/codingPlanWebview/cuaPermissionPanel/embeddedBrowserJavaScriptDialog/embeddedBrowserWheel/index/oauthCallbackBridge/resourceManager 共 8 个 .ts) | /tmp/zcode-reverse/app/out/preload/(browserVideoRecorder/codingPlanWebview/cuaPermissionPanel/embeddedBrowserJavaScriptDialog/index/resourceManager/rewardsWebview 共 7 个 .cjs) | app-only | 区域边缘证据(client 邻接面):App 多出 rewardsWebview.cjs(rewards 积分墙私有功能,与本包 rendererLoggingEnv 处内联的 VITE_REWARDS_WEBVIEW_ORIGIN 互相印证);仓库的 embeddedBrowserWheel/oauthCallbackBridge 在 App 无同名独立 cjs(大概率内联进 index.cjs,未在本区域深挖) | 证据:ls 两目录清单对比;App out/preload/rewardsWebview.cjs 存在而仓库无同名源文件 |
区域 summary:本区域完成了 src/main 全部 188 个源文件与 src/preload 全部 8 个源文件对 App 产物(out/main 的 index.js+17 chunks+3 worker/entry、out/preload 7 个 .cjs)的穷举级对照:196 个源文件全部找到对应物,无一个 repo-only 缺失。清单型数据全量对照显示:仓库侧 167 个通道值在 App main/preload 中全部命中,App 侧多出 9 个 webRemoteControl/Bot 通道与 5 个 bot-remote-workspace RPC 消息类型;App 还独有 rewardsWebview.cjs 预加载、persist:zcode-rewards 分区、打包区域 CDN 映射与 ssh-remote-assets 地址。内容漂移共 4 处:endpoint 对话框占位符被清洗(zcode.chatglm.site → endpoint.example.com)、打包 OTEL/ARMS 上报端点与 license(仓库完全删除)、remoteCdn 打包默认 CDN、browserTabRecoveryStore 报错文案。build-meta.json 的 4 个字段 schema 与 build-metadata.mjs 完全一致,值(3.14.1/cead36fd/2026-09-20)与已知"内部 commit 构建"结论吻合。中文日志串在产物中以 \uXXXX 转义存在,初检 MISS 的 10 个低匹配文件经转义复检后基本全部命中。
本区域 rows 共 33 条(identical-evidence 23 / skewed 4 / app-only 6)。覆盖口径:穷举范围:src/main 188 个源文件(顶层 157 + browserView/ 31 + mcpUserDirectory/ 4)逐一签名比对(每文件提取函数/类名+≥12 字符字符串字面量,在 out/main 21 个 .js + out/preload 7 个 .cjs 全文检索,中文按 \uXXXX 转义复检),148 个强匹配,10 个低匹配全部逐条复核为转义命中/注释不入 bundle/局部变量名压缩,7 个零命中文件为纯 re-exports/类型文件并经被调方符号验证;src/preload 8 文件与 7 个 .cjs 建立一一映射(embeddedBrowserWheel 内联进 dialog、oauthCallbackBridge 内联进 index、rewardsWebview 为 app-only)。清单型数据:通道值全量 diff(仓库 167 值 v…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| main/ 入口与生命周期集群(index.ts, desktopElectronApp, appLaunchCoordinator/Gate, primaryWindowCoordinator, desktopWindowLifecycle, desktopDarwinCloseBehavior, appShutdownPolicy, startupWorkspace(+DeepLinkGate), desktopLaunchMarks, forceUpdateGuard/Prompt, e2eCoverage 等) | packages/desktop/src/main/index.ts 等 157 个顶层文件中的本集群 | out/main/index.js | identical-evidence | index.ts 104 个签名命中;forceUpdatePrompt 57 命中、appShutdownPolicy/cuaOsSupport 等全部命中。中文日志以 \uXXXX 转义存在于产物(如「已忽略强制升级期间的 second-instance workspace deep link 请求」转义后命中 index.cjs/index.js)。 | 证据:repo: src/main/index.ts:69 (PlatformChannels import), src/main/desktopSecondInstanceDeepLink.ts(两处 force-update 中文串转义命中);产物: out/main/index.js 含 removeTabRecovery/whenRecoveryIdle/ensureResidentFromRenderer 等同名方法链 |
| main/ 窗口与系统集成集群(desktopWindowChrome/State/ButtonPosition/Size, desktopZoom, desktopApplicationMenu, desktopTray, unreadBadge, about/aboutWindow, applicationIcons, windowsAumidIcon, desktopLinuxAppImageIcon, desktopLinuxXdg, desktopWindowsOpenFolderContextMenu, windowsExplorerDelegation, desktopFinde… | packages/desktop/src/main/desktopWindowChrome.ts 等 | out/main/index.js | identical-evidence | desktopWindowChrome 45 命中、desktopApplicationMenu 11、applicationIcons 20、desktopLinuxAppImageIcon 6/11(5 个 miss 全为中文日志串,转义复检命中,如「Linux AppImage 图标安装失败,已降级」);editors 62、openInEditor 21、exportLogs 73 命中。 | 证据:repo: src/main/desktopLinuxAppImageIcon.ts(中文日志串);产物: index.js 转义命中「Linux AppImage 图标安装失败,已降级」 |
| main/browserView/ 子目录 31 文件集群(browserGuestManager, browserCommand 8 件, browserPlaywright 5 件, browserScreenshot 6 件, browserTabResidency, browserVirtualClipboard(+PageScript), browserVideoRecorder, electronBrowserWebmRecorder, playwrightInjectedScriptSource, browserOperationIndicator, browserClo… | packages/desktop/src/main/browserView/(31 文件) | out/main/index.js | identical-evidence | 全部强匹配:browserGuestManager 135 命中、browserCommandScripts 77、browserPlaywrightLocatorExecutor 66、electronBrowserWebmRecorder 33、browserPlaywrightDomSnapshot 27、windowsCuaOperationIndicator 27、browserVirtualClipboard 26 等;restore-tabs 通道、BrowserViewRestoredTabShell 类 API(restoreGuestState/persistShell)均在 index.js。 | 证据:repo: src/main/browserView/browserGuestManager.ts;产物: index.js 含 async removeTabRecovery(t){await this.residencyOptions.recoveryStore?.remove(t.tabId)}、browser tab stale page-state ignored tabId= |
| main/browserView/browserTabRecoveryStore.ts | packages/desktop/src/main/browserView/browserTabRecoveryStore.ts:273 | out/main/index.js (recoveryStore 调用点) | skewed | 模块确定存在:App index.js 中 recoveryStore API 面(getPageState/removePageState/remove/whenIdle/listShells/upsertPageState)与仓库类方法一一对应,且被 guest manager/residency 调用。但漂移:仓库的 new TypeError("invalid browser recovery snapshot")(266 行) 与 "unsupported browser recovery snapshot"(273 行) 及隔离告警「browser tab recovery 文件损坏,已隔离到 .corrupt-<ts>」在 App 全部 bundle(含转义形态)中检索不到;3.14.1 版本可能改写了损坏快照的错误处理文案。 | 证据:repo: browserTabRecoveryStore.ts:273 throw new TypeError("unsupported browser recovery snapshot");产物: index.js 含 upsertPageState/listShells/whenIdle 各 1 次、recoveryStore?.getPageState,但 recovery snapshot 字符串 0 命中 |
| main/ Chrome 浏览器数据集群(chromeCookieManager, chromeCookieMapping, chromeCredentialManager, chromeExecutableDiscovery, chromeInstallationCandidates, chromeLocalStorageManager, chromeProfileDiscovery, browserDataManager, desktopBrowserDataIpc, windowsChromeAppBoundKey) | packages/desktop/src/main/chromeCookieManager.ts 等 10 文件 | out/main/index.js | identical-evidence | chromeLocalStorageManager 67 命中、windowsChromeAppBoundKey 64、chromeInstallationCandidates 56、chromeExecutableDiscovery 30、browserDataManager 21、chromeCookieManager 39 中 23 命中(miss 均为转义命中的中文串,如「Chrome App-Bound Cookie 原生解密失败」)以及模板片段假 token。 | 证据:repo: src/main/chromeCookieManager.ts(App-Bound 解密日志);产物: index.js 含 [browser-data] Chrome App-Bound Cookie 原生\u8...(原生解密)转义串 |
| main/processResource* 17 文件集群(AppTotals, ChromiumSource, CliSource, ExternalAppSamples, McpTelemetrySource, RendererHeapSource, RoleClassifier, SampleSourceRegistry, SampleSources, SelfHeapSource, SystemSource, SystemWindowAggregator/Event, WindowAggregator/Event, electronCpuNormalization, resourceM… | packages/desktop/src/main/processResource*.ts | out/main/index.js | identical-evidence | 全部命中(多数为小文件 1-4 个签名全中);SampleSourceRegistry 为纯数组装配文件,其 6 个来源(chromium/system/selfHeap/rendererHeap/cli/mcp)各自在产物中有对应实现,被压缩内联。 | 证据:repo: src/main/processResourceSampleSourceRegistry.ts:14-21(6 来源数组);产物: index.js 含 mcpProcessResourceSampleSource 等来源实现(processResourceMcpTelemetrySource 3 命中) |
| main/ 遥测/ARMS/crash 集群(appARMSBootstrap 14, armsBrowserPerfLoadNudge, armsEventRedaction 10, armsUserIdentity, desktopArmsCustomEvent 8, desktopTelemetryFetch, desktopMcpTelemetry, desktopNetworkTelemetry, desktopRemoteUsageArmsTelemetry 22, desktopResourceTelemetry, desktopStabilityTelemetry 101, a… | packages/desktop/src/main/desktopStabilityTelemetry.ts 等 ~24 文件 | out/main/index.js | identical-evidence | 全部强匹配:desktopStabilityTelemetry 101、localTtftExporter 31、desktopRemoteUsageArmsTelemetry 22、desktopCrashCapture 20、appARMSBootstrap 14;「https://zcode.invalid/local-crash-only」在两侧均有(repo desktopCrashCapture.ts,产物 index.js hE="https://zcode.invalid/local-crash-only")。 | 证据:repo: src/main/desktopCrashCapture.ts(zcode.invalid 崩溃上报占位);产物: index.js hE="https://zcode.invalid/local-crash-only",wE=1e3,yE=[1500,5e3] |
| 打包 OTEL/ARMS 上报默认值(chunk-HH7N2YVI 中的 env 常量对象) | packages/desktop/src/main/localTtftExporter.ts:32-53(options.env.*) | out/main/chunk-HH7N2YVI.js(f 对象) | skewed | 同机制不同内容:仓库通过 env 读取 OTEL_EXPORTER_OTLP_ENDPOINT/HEADERS;App 3.14.1 打包进硬编码生产值 OTEL_EXPORTER_OTLP_ENDPOINT:"https://proj-xtrace-7e235817c9b9381c22d8b743908d469f-cn-beijing.cn-beijing.log.aliyuncs.com/apm/trace/opentelemetry"、OTEL_EXPORTER_OTLP_HEADERS:"x-arms-license-key=j2c03hoppk@8309eb6928a66ff,x-arms-project=proj-xtrace-...,x-cms-workspace=default-cms-1936221977589032-cn-beijing"、OTEL_SERVICE_NAME:"zcode-cli-agent"。仓库全库 0 处 proj-xtrace/j2c03hoppk。 | 证据:产物: chunk-HH7N2YVI.js f={OTEL_EXPORTER_OTLP_ENDPOINT:"https://proj-xtrace-...aliyuncs.com/...",OTEL_EXPORTER_OTLP_HEADERS:"x-arms-license-key=j2c03hoppk@8309eb6928a66ff,...",OTEL_SERVICE_NAME:"zcode-cli-agent"};repo: grep proj-xtrace → 0 命中 |
| main/ CUA 集群(cuaAccessibilitySettings, cuaOsSupport, cuaPermissionDragPanel 10, cuaPermissionPanelPositioner, cuaPipFocusRouter, cuaSystemSettingsWindowWatcher 4, desktopCuaHelperInstaller, desktopCuaPermissionIpc 32, desktopCuaPipIpc, windowsCuaOperationIndicator(+Content) 27/13) | packages/desktop/src/main/cuaAccessibilitySettings.ts 等 10 文件 | out/main/index.js | identical-evidence | 全部命中;desktopCuaPipIpc 两个签名(registerCuaPipActiveSessionIpc、[cua-pip-session] ignored overlong active session id)均在产物;cuaPermissionPanelState 通道 zcode:cua-permission-panel-state 两侧一致(repo src/preload/cuaPermissionPanel.ts ↔ cuaPermissionPanel.cjs)。 | 证据:repo: src/main/desktopCuaPipIpc.ts;产物: index.js 含 registerCuaPipActiveSessionIpc 与 [cua-pip-session] ignored overlong active session id |
| main/ deep link / 数据目录 / 设备身份集群(desktopDeepLinkUrl 20, desktopSecondInstanceDeepLink, desktopOAuthDeepLink 16/43, desktopLinuxDeepLinkRegistration 31, desktopDataBaseDirBootstrap, desktopEarlyDataBaseDirBootstrap, desktopChromiumHardwareAccelerationBootstrap, desktopEarlyChromiumHardwareAcceleration… | packages/desktop/src/main/desktopDeepLinkUrl.ts 等 ~16 文件 | out/main/index.js | identical-evidence | 全部命中;desktopDeviceMid 的 telemetry-state.json 与 ensureDesktopDeviceMidSync 在产物中;两个 Early* 引导文件(0 token 纯副作用模块)的被调方 applyEarlyDataBaseDirBootstrap/applyEarlyChromiumHardwareAccelerationBootstrap 均在 index.js;desktopOAuthDeepLink 中文串(网络工作区路径已拒绝/是否在 ZCode 中打开此文件夹?等)转义命中。 | 证据:repo: src/main/desktopDeviceMid.ts:34 join(configDir, "telemetry-state.json");产物: index.js 含 telemetry-state.json、applyEarlyDataBaseDirBootstrap |
| main/ host/scheduler/存储桥集群(desktopHostProcess 14, hostLogRelay, databaseStartupRelay/Telemetry 13, taskRealtimeBus, broadcastHub, desktopCronScheduler 17, mcpUserDirectory/ 4 件 24 命中, storageScanWorkerProtocol, desktopRemoteSessions 53, resourceManager* 4 件) | packages/desktop/src/main/desktopHostProcess.ts 等 ~14 文件 | out/main/index.js、out/main/chunk-YSD25WTT.js | identical-evidence | 全部命中;mcpUserDirectory 的 zcodeagentmcp 目录标识在产物;storageScanWorkerProtocol 的 isStorageScanWorkerMessage/isStorageScanWorkerCommand 出现在 chunk-DLYU5YW3(worker 入口 import 的 H/B 导出)。 | 证据:repo: src/main/mcpUserDirectory/types.ts(zcodeagentmcp);产物: index.js 含 zcodeagentmcp、out/main/chunk-DLYU5YW3.js 导出 B/H 供 storageScanWorker.js 使用 |
| out/main/storageScanWorker.js ↔ src/main/storageScanWorker.ts | packages/desktop/src/main/storageScanWorker.ts:13-24 | out/main/storageScanWorker.js(824B) | identical-evidence | 逐句对上:isMainThread/parentPort/workerData 守卫、abort 消息 o.type==="abort"&&n.abort()、runStorageScan 调用(chunk-DLYU5YW3 的 B 导出)、postMessage 的 progress/done/aborted/error 四种消息形态完全一致。 | 证据:repo: storageScanWorker.ts if (!isMainThread && port) { ... message.type === "abort" ... runStorageScan;产物: storageScanWorker.js !S&&a 守卫 + p({roots:r.roots,signal:n.signal,progressIntervalMs:r.progressIntervalMs,...}) |
| out/main/zcodeDataSizeWorker.js ↔ src/main/zcodeDataSizeWorker.ts | packages/desktop/src/main/zcodeDataSizeWorker.ts | out/main/zcodeDataSizeWorker.js(330B) | identical-evidence | 结构一致:workerData → runZcodeDataSizeScan(chunk-M6RG7CA4 的 a 导出)→ postMessage({ok:true,result}) / {ok:false,error}。仓库文件 1 签名命中。 | 证据:产物: zcodeDataSizeWorker.js t(i).then(e=>{r.postMessage({ok:!0,result:e})}).catch(...{ok:!1,error:...}) |
| out/main/browserWebmRecorder.js ↔ src/main/browserView/electronBrowserWebmRecorder.ts | packages/desktop/tsup.config.ts:141 | out/main/browserWebmRecorder.js(153B) | identical-evidence | tsup 入口 "main/browserWebmRecorder": "src/main/browserView/electronBrowserWebmRecorder.ts" 与产物 re-export 文件一一对应(createElectronBrowserWebmRecorder + default 导出来自 chunk-B27WMHNN)。 | 证据:repo: tsup.config.ts:141;产物: browserWebmRecorder.js export{a as createElectronBrowserWebmRecorder,b as defaultElectronBrowserWebmRecorder} |
| main/desktopCommandHandlers.ts(51 签名命中) | packages/desktop/src/main/desktopCommandHandlers.ts:325-326 | out/main/index.js(endpoint 对话框 HTML) | skewed | 模块同源(51 个签名命中),但 endpoint 设置对话框内容漂移:仓库占位/示例为 https://endpoint.example.com,App 为 https://zcode.chatglm.site。这是开源清洗痕迹:chatglm.site 在仓库全部 packages/ 中 0 次出现,而 App index.js 有 2 处、chunk-YSD25WTT 有 3 处(含 wss://zcode.chatglm.site/ws)。 | 证据:repo: desktopCommandHandlers.ts:325 placeholder="https://endpoint.example.com"、326 for example https://endpoint.example.com.;产物: index.js <input id="endpoint" value="${oB(e)}" placeholder="https://zcode.chatglm.site" ... for example https://zcode.chatglm.site. |
| main/remoteCdn.ts ↔ out/main/chunk-HH7N2YVI.js | packages/desktop/src/main/remoteCdn.ts:4,22-31 | out/main/chunk-HH7N2YVI.js | identical-evidence | 同源:normalizeBaseUrl/resolveRemoteCdnBaseUrls 名字保留,N=["https://cdn-zcode.z.ai/zcode/electron/releases"] 对应仓库 DEFAULT_CDN_BASE_URL+路径拼接。App 侧另有 domestic/overseas 区域 CDN 表(见 app-only 行)。 | 证据:repo: remoteCdn.ts:4 const DEFAULT_CDN_BASE_URL = "https://cdn-zcode.z.ai";产物: chunk-HH7N2YVI.js var N,R=T(()=>{N=["https://cdn-zcode.z.ai/zcode/electron/releases"]}) |
| App 打包区域端点:domestic/overseas CDN 表 + ssh-remote-assets 服务器 | — | out/main/index.js | app-only | index.js 内置仓库没有的打包常量:Ms={domestic:"https://cdn.codegeex.cn/zcode/electron/releases",overseas:"https://cdn.zcode-ai.com/zcode/electron/releases"}、QE="http://studio.zcode-ai.com:12345/ssh-remote-assets",配套 isChineseLocale/resolveLocalTimeZone 区域判定函数(eT/tT/rT)。仓库 packages/ 全库检索 cdn.zcode-ai.com、cdn.codegeex.cn、ssh-remote-assets、studio.zcode-ai 均 0 命中。 | 证据:产物: index.js Ms={domestic:"https://cdn.codegeex.cn/...",overseas:"https://cdn.zcode-ai.com/..."},QE="http://studio.zcode-ai.com:12345/ssh-remote-assets";repo: grep 'cdn.zcode-ai.com|ssh-remote-assets' packages/ → 0 命中 |
| 通道名清单全量对照(shared/src/channels.ts ServiceChannels+PlatformChannels+EmbeddedBrowserWebviewChannels+CodingPlanWebviewChannels+InternalChannels ↔ App bundle 通道对象) | packages/shared/src/channels.ts:74-493 | out/main/chunk-YSD25WTT.js(含全部通道对象)、out/preload/*.cjs | identical-evidence | 仓库侧提取 167 个 xxx:yyy 通道值(channels.ts 全部对象 + desktop src 字面量),在 App main+preload 中逐一检索全部命中,0 个 repo-only。App chunk-YSD25WTT 中的通道对象(如 BindRemoteWorkspaceSessionContext/StartWebRemoteControl 键值对)与仓库命名键完全同构。node:*/about:blank 等差异为 bundler 外置化所致,非漂移。 | 证据:repo: shared/src/channels.ts:158 export const PlatformChannels = {(至 424 行);产物: chunk-YSD25WTT.js eWorkspaceSessionContext:"zcode:bind-remote-workspace-session-context",StartWebRemoteControl:...;diff 结果 repo-only=0(除 node: 外置) |
| 通道清单 App-only 增量:webRemoteControl/Bot 9 通道 | — | out/main/chunk-YSD25WTT.js | app-only | App 通道对象多出 9 个键值:GetWebRemoteControlStatus/ResetWebRemoteControlPairing/StartWebRemoteControl/StopWebRemoteControl/SyncWebRemoteControlTasks/SyncWebRemoteControlWorkspaces/WebRemoteControlReconnectWorkspace/WebRemoteControlStatusChanged(zcode:-web-remote-control-)与 BotRemoteWorkspaceReconnected(zcode:bot-remote-workspace-reconnected)。仓库 channels.ts 与 desktop src 均无。 | 证据:产物: chunk-YSD25WTT.js StartWebRemoteControl:"zcode:start-web-remote-control",ResetWebRemoteControlPairing:"zcode:reset-web-remote-control-pairing",StopWebRemoteControl:"zcode:...;repo: grep 'web-remote-control' packages/ → 0 命中 |
| RPC 消息类型清单全量对照(HostMessageTypes:505 + HostResponseTypes:559,共 69 值) | packages/shared/src/channels.ts:505-646 | out/main/chunk-YSD25WTT.js | identical-evidence | 仓库 69 个消息/响应类型值(database-startup-control、connect-remote-workspace、attach-service-port、task-realtime-deliver、remote-workspace-connected 等)逐个在 App main bundle 中全部命中,0 缺失。 | 证据:repo: channels.ts:505 export const HostMessageTypes = {;产物: chunk-YSD25WTT.js HostMessageTypes 对象区含全部 69 值(脚本核验 missing=[]) |
| RPC 消息类型 App-only 增量:bot-remote-workspace-* 5 个 | — | out/main/chunk-YSD25WTT.js | app-only | App HostMessageTypes 区域多出 5 个成员:BotRemoteWorkspaceReconnectResult/ConnectionStatusResult/RuntimePort(*-result/-port 响应类)与 ReconnectRequest/ConnectionStatusRequest(请求类),对应多智能体/Bots 私有功能的远程 workspace 重连协议。 | 证据:产物: chunk-YSD25WTT.js BotRemoteWorkspaceReconnectResult:"bot-remote-workspace-reconnect-result" 等 5 对;repo: grep 'bot-remote-workspace' packages/ → 0 命中 |
| webRemoteControlManager 模块 | — | out/main/index.js | app-only | index.js 含 webRemoteControlManager×9、webRemoteControlLastEnabledContext×3、webRemoteControlExternalRelayDevice×3、webRemoteControlManagerRef×2 的完整管理器实现(配对/启停/任务与 workspace 同步/状态变更广播),仓库 desktop src 无任何对应文件。 | 证据:产物: index.js grep 'webRemoteControl' 计 17 处(webRemoteControlManager 等);repo: grep -r 'webRemoteControl' packages/desktop/src → 0 命中 |
| persist:zcode-rewards 分区 | — | out/preload/rewardsWebview.cjs、out/main | app-only | App 有第三个隔离分区常量 persist:zcode-rewards(奖励页 webview);仓库仅有 persist:zcode-coding-plan(desktopCommandHandlers.ts:44)与 persist:zcode-embedded-browser(browserDataManager.ts:30),rewards 相关代码在 packages/desktop/src 0 命中。 | 证据:产物: app_only 通道 diff 含 persist:zcode-rewards;repo: grep 'persist:zcode-rewards' packages/ → 0 命中;对照 repo desktopCommandHandlers.ts:44 const CODING_PLAN_WEBVIEW_PARTITION = "persist:zcode-coding-plan" |
| account:/oauth: 字面量(6 个 account:bigmodel|zai--plan、oauth::access_token 等) | packages/ui/src/lib/providerTelemetryIdentity.ts:8-12 | out/main/chunk-YSD25WTT.js | identical-evidence | 初判 app-only,复核后在仓库找到同源:account:* 六个键在 packages/ui/src/lib/providerTelemetryIdentity.ts;oauth:${provider}:access_token 由 packages/ui/src/hooks/useCredentials.ts:31 等动态构造;enc:v1: 前缀在 packages/services/src/credential/providers/credentialCipherProvider.ts:5;zcode:session_create:v1 在 packages/desktop/src/host/hostSessionCreateTelemetry.ts;ssh:v1 在 packages/shared/src/remoteSshHostKey.ts。均非本区域文件,但确认非 App 私有。 | 证据:repo: providerTelemetryIdentity.ts:10 "account:bigmodel-individual-coding-plan": "builtin:bigmodel-coding-plan";产物: chunk-YSD25WTT.js bigmodelIndividualCodingPlan:"account:bigmodel-individual-coding-plan" |
| preload 8 源文件 ↔ 7 个 .cjs 总映射 | packages/desktop/tsup.config.ts:184-189 | out/preload/{index,codingPlanWebview,cuaPermissionPanel,embeddedBrowserJavaScriptDialog,resourceManager,browserVideoRecorder,rewardsWebview}.cjs | identical-evidence | tsup 声明 6 个 preload 入口,产物同名 6 个 .cjs 全部对应;embeddedBrowserWheel.ts(非独立入口)6/6 签名内联在 embeddedBrowserJavaScriptDialog.cjs,oauthCallbackBridge.ts 的 createOAuthCallbackHandler 内联在 index.cjs。App 多出第 7 个 rewardsWebview.cjs(见下一行)。 | 证据:repo: tsup.config.ts:184-189(6 个 preload 入口);产物: python 逐文件检索 embeddedBrowserWheel→dialog.cjs 6 命中、oauthCallbackBridge→index.cjs createOAuthCallbackHandler 命中 |
| app/preload/rewardsWebview.cjs | — | out/preload/rewardsWebview.cjs(692KB) | app-only | 奖励中心预加载 bundle(约 692KB,与其余 preload 同规模),配 persist:zcode-rewards 分区;仓库 src/preload 只有 8 个文件、tsup 只声明 6 个入口,无任何 rewards 预加载。 | 证据:产物: out/preload/rewardsWebview.cjs 存在(692267 字节);repo: grep -ril rewards packages/desktop/src → 0 文件 |
| preload/index.ts ↔ index.cjs 暴露面 | packages/desktop/src/preload/index.ts:28,89,246 | out/preload/index.cjs | identical-evidence | contextBridge 三键完全一致:__ZCODE_DEVICE_ID__(parseDeviceIdFromArgs,产物含 --device-id= 解析)、__zcodeFinalArmsCustomEventsE2E(e2e 通道)、zcode(主 API 对象)。40 个 API 键中未匹配的 9 个(updateReadyCallbacks 等)经核实为模块局部变量/类型字段,压缩后天然消失。 | 证据:repo: index.ts:28 exposeInMainWorld("__ZCODE_DEVICE_ID__"...、:246 exposeInMainWorld("zcode", {;产物: index.cjs exposeInMainWorld("__ZCODE_DEVICE_ID__"、exposeInMainWorld("zcode" 各一处 |
| preload/browserVideoRecorder.ts ↔ browserVideoRecorder.cjs | packages/desktop/src/preload/browserVideoRecorder.ts:3 | out/preload/browserVideoRecorder.cjs(140B) | identical-evidence | 全文级一致:RECORDER_PORT_CHANNEL="zcode-browser-video-recorder:port",ipcRenderer.once 收 port 后 window.postMessage 转移 MessagePort,逻辑逐句对应。 | 证据:repo: browserVideoRecorder.ts:3 const RECORDER_PORT_CHANNEL = "zcode-browser-video-recorder:port";产物: cjs 全文 var e=require("electron"),r="zcode-browser-video-recorder:port";e.ipcRenderer.once(r,s=>{let[o]=s.ports;o&&window.postMessage(r,"*",[o])}) |
| preload/codingPlanWebview.ts ↔ codingPlanWebview.cjs | packages/desktop/src/preload/codingPlanWebview.ts | out/preload/codingPlanWebview.cjs(700KB) | identical-evidence | 6/11 签名命中,5 个 miss 均为模板字符串片段假 token;命中含 __zcodeCodingPlanWebviewNativeBridge__、__zcodeLang__、__zcodeReportContext__、/coding-plan/payment/callback。分区 persist:zcode-coding-plan 两侧一致。 | 证据:repo: src/preload/codingPlanWebview.ts(native bridge 键);产物: codingPlanWebview.cjs 含 __zcodeCodingPlanWebviewNativeBridge__、/coding-plan/payment/callback |
| preload/cuaPermissionPanel.ts ↔ cuaPermissionPanel.cjs、preload/resourceManager.ts ↔ resourceManager.cjs、preload/embeddedBrowserJavaScriptDialog.ts ↔ 同名 .cjs | packages/desktop/src/preload/cuaPermissionPanel.ts 等 3 文件 | out/preload/{cuaPermissionPanel,resourceManager,embeddedBrowserJavaScriptDialog}.cjs | identical-evidence | 各自签名命中:cuaPermissionPanel(cuaPermissionPanel、zcode:cua-permission-panel-state)、resourceManager("Resource Manager"、resourceManager)、embeddedBrowserJavaScriptDialog(__zcodeEmbeddedBrowserJavaScriptDialog__、DOMContentLoaded)。 | 证据:repo: src/preload/cuaPermissionPanel.ts;产物: cuaPermissionPanel.cjs 含 zcode:cua-permission-panel-state,resourceManager.cjs 含 resourceManager,dialog.cjs 含 __zcodeEmbeddedBrowserJavaScriptDialog__ |
| scripts/build-metadata.mjs ↔ out/metadata/build-meta.json | packages/desktop/scripts/build-metadata.mjs:86-94 | out/metadata/build-meta.json(4 字段) | identical-evidence | collectBuildMetadata() 输出恰好 4 字段 {appVersion, buildCommitId, buildTime, electronBuilderVersion},与 build-meta.json 键集合完全一致;buildCommitId 为 git rev-parse --short=8 的 8 位短 SHA,产物 cead36fd 符合该格式;electron-builder 26.8.1 满足仓库 ^26.8.1 约束。值漂移即已知结论:appVersion 3.14.1 vs 仓库 root package.json:3 的 3.14.0,commit cead36fd 非仓库 HEAD(872ad96),buildTime 2026-09-20。运行时消费方 src/main/about.ts:117,154(优先读 build-meta.json)在产物中存在。 | 证据:repo: build-metadata.mjs:87-93 appVersion: normalizeVersion(rootPackageJson.version), buildCommitId: resolveCommitId(), buildTime: new Date().toISOString(), electronBuilderVersion: ...;产物: build-meta.json `{"appVersion":"3.14.1","buildCommitId":"cead36fd","buildTime":"2026-09-20T07:37:29.416Z","el… |
| repo-only 检查:src/main+src/preload 中无对应产物的文件 | packages/desktop/src/main、src/preload 全部 196 文件 | out/main/*.js | identical-evidence | 穷举结论:196 个源文件全部在产物中找到对应实现,不存在整文件缺失。形式上的 repo-only 仅三类:(1) node:* 模块字符串——bundler 外置化后不以字符串字面量出现;(2) 纯类型/接口文件(browserCommandTypes.ts、mcpUserDirectory/types.ts)与纯 re-export 装配文件(appCrashCaptureBootstrap 等薄包装)——被内联,经被调方符号(initializeCrashCapture、createMemoryDiagnosticsRegistry 等)验证在产物中;(3) 注释文案(如 browserTransparentWindowBootstrap.ts:21「刚 showInactive 就要 capture」为代码注释)天然不入 bundle。 | 证据:repo: src/main/appCrashCaptureBootstrap.ts:6 export const crashCapturePaths = initializeCrashCapture(logger, true);产物: out/main/index.js 含 initializeCrashCapture;chunk-YSD25WTT.js 含 createMemoryDiagnosticsRegistry |
| desktopRuntimeEnv / desktopProviderConfig 与测试端点 zai-test.chatglm.site | packages/desktop/src/main/desktopRuntimeEnv.ts(57 签名命中) | out/main/index.js | skewed | desktopRuntimeEnv 57 签名强匹配、机制同源(env 驱动的运行时端点);但 App 内置测试/生产域名 https://zai-test.chatglm.site、https://zcode.chatglm.site、wss://zcode.chatglm.site/ws,仓库 packages/ 全库 0 处 chatglm.site(与 desktopCommandHandlers 清洗同源)。api.z.ai/bigmodel.cn 等 URL 在仓库 provider 相关包中另有来源,未逐一深挖(属 provider 区域)。 | 证据:产物: app-only URL 列表含 https://zai-test.chatglm.site、wss://zcode.chatglm.site/ws;repo: grep -r 'chatglm.site' packages/ → 0 命中 |
区域 summary:config/default.json 与 App 的 ${RES}/config/default.json 逐字节一致(md5 相同);provider/zcode-builtin.json 仅数组紧凑/展开的格式化漂移,jq -S 归一化后哈希一致,语义完全相同;README.md 为仓库独有。patches/ 三个补丁的效果全部体现在 App 产物中:@arms/[email protected] 包本体就在 App node_modules 且补丁 hunks 已注入其 ESM 入口 index.mjs;两个 @ai-sdk 补丁的目标包不以独立包存在(@ai-sdk 作用域在 App node_modules 完全缺失),但补丁效果(anthropic 的 video base64 block、openai-compatible 的 video_url)已内联进 zcode.cjs 的 provider 代码,其中 openai-compatible 的 video_url 分支在产物中连续出现两次,属同源结构漂移。third-party/ 是合规与溯源工件目录(哈希命名许可证库 + 各清单),App 不随包携带;其中 native-search/sources.json 与 ${RES}/tools/ 的 bfs 4.1.1 / ripgrep 14.1.1 / ugrep 7.8.4 逐一对应(archiveSha256 亦吻合),npm-overrides 抽查 [email protected] 版本一致。packages/zcode-server-cli 与 packages/formal-proof 均为 repo-only:App 全产物(zcode.cjs、out/、package.json、附加资源)对两者包名与专属字面量零命中;zcode.cjs 实际来源于 apps/zcode-cli(zcode-cli 0.16.9),formal-proof 仅作为 bootstrap 的 devDependencies 做黄金测试对齐,App 侧另有同域但独立的 ~/.zcode/server 远端探测代码(out/main、out/host)。
本区域 rows 共 20 条(identical-evidence 7 / skewed 3 / differs 1 / repo-only 9)。覆盖口径:实际枚举 5 大项及其全部子单元,共 20 行:zcode-server-cli 4 行(包本体、安装布局字面量、App 侧同域痕迹、同名环境变量甄别)、formal-proof 1 行、patches 4 行(pnpm 声明机制 + 3 个补丁文件全量)、third-party 7 行(upstream、inventory、npm-overrides、copied-components、embedded-components、runtime、native-search)、config 3 行(default.json、provider/zcode-builtin.json、README.md)。无遗漏:patches/ 与 config/ 目录文件 100% 覆盖,third-party/ 与两个 packages/ 的全部子单元均已判定。全程只读,bundle 侧仅用 rg 定位 +…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| packages/zcode-server-cli 包本体(@zcode/server-cli,bin: zcode → dist/server-cli.js) | packages/zcode-server-cli/package.json(dependencies: @zcode/rpc|services|shared, hono, ws, yauzl, zod 4.6.5) | 无对应物:zcode.cjs 与 /tmp/zcode-reverse/app/out/ 全部零命中 | repo-only | 该包不进 zcode.cjs,也不独立存在于 App 产物。包名与全部专属特征串(ZCODE_SERVER_SKIP_SERVICE_REGISTRATION、resolveCanonicalServerLayout、acquireUninstallLock、DataRootLock、stable-launcher、server-cli.js)在 zcode.cjs 与 out/ 均为 0 命中;仓库内亦无其他包引用它(仅自身 3 个文件及根 package.json 的 typecheck 行、architecture-policy.yaml、文档)。 | 证据:rg -c 'zcode-server-cli|@zcode/server-cli' /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs → 无命中;rg -l 'ZCODE_SERVER_SKIP_SERVICE_REGISTRATION|resolveCanonicalServerLayout|acquireUninstallLock' /tmp/zcode-reverse/app/out/ → exit 1(零文件) |
| zcode-server-cli 安装布局字面量(~/.zcode/server 下 releases/current.json/pending.json/install.json/server.lock/update-transaction.json 等) | packages/zcode-server-cli/src/runtime/paths.ts:24-49(join(configured || homedir(), '.zcode', 'server');releasesDir、currentFile、lockFile: run/server.lock、updateTransactionFile 等) | 无命中 | repo-only | server-cli 专属的安装事务布局字面量在 App 两个 bundle(zcode.cjs、out/)中全部 0 命中,进一步证明该包的安装器/更新器逻辑未随 App 分发。 | 证据:rg -c 'update-transaction.json|server.lock|current.json' /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs → 均 0;rg -l 同串 out/ → 无文件 |
| 同域痕迹:App 客户端探测远端 ~/.zcode/server | (无直接同源文件;与 server-cli 管理的远端布局同域) | /tmp/zcode-reverse/app/out/main/chunk-RU7TE5HQ.js、out/host/chunk-5YU2OQG4.js | skewed | App 侧存在与 ~/.zcode/server 同域的代码:fileExists 探测 + formatHandshakeFailure 握手错误格式化,即桌面端对远端 server 安装布局做校验(与 app package.json 依赖 ssh2 ^1.16.0 呼应),但这是独立实现,不含 server-cli 的安装/更新/卸载逻辑(专属字面量全零)。 | 证据:rg 提取 out/main/chunk-RU7TE5HQ.js:var T="~/.zcode/server";async function G(...e){...access...}i(G,"fileExists")...i(Oo,"formatHandshakeFailure");out/host/chunk-5YU2OQG4.js 有同构 var M="~/.zcode/server" |
| ZCODE_DATA_BASE_DIR 环境变量(同名甄别) | packages/zcode-server-cli/src/runtime/paths.ts:24(server 数据根:ZCODE_DATA_BASE_DIR || homedir() → .zcode/server) | zcode.cjs 遥测模块(4 处)与 out/host/chunk-OPKMCWQ2.js 数据目录模块(1 处) | differs | 该环境变量名在 App 侧确实出现,但上下文证明归属不同:zcode.cjs 中 TOs="ZCODE_DATA_BASE_DIR" 属 ensureCliDeviceMid/resolveCliTelemetryStateFile(CLI 遥测设备 MID 持久化);out/host 中属 getDataBaseDir/getZCodeDataRootDir(桌面端 .zcode 数据根)。与 server-cli 的 server root 布局无关,不构成该包进 App 的证据。 | 证据:zcode.cjs 提取:TOs="ZCODE_DATA_BASE_DIR"...r(R$r,"ensureCliDeviceMid");r(IOs,"resolveCliTelemetryStateFile");out/host/chunk-OPKMCWQ2.js 提取:yr=process.env.ZCODE_DATA_BASE_DIR?.trim()||null...i(Te,"getDataBaseDir") |
| zcode.cjs 真实溯源(佐证 server-cli 非来源) | apps/zcode-cli(zcode-cli 0.16.9,workspace 成员,packages/ 含 cli、core、bootstrap 等 16 个子包) | /Applications/ZCode.app/Contents/Resources/glm/.node-bundle-meta.json | identical-evidence | App 的 CLI 运行时由 apps/zcode-cli 构建而来(source: apps/zcode-cli/packages/cli/dist/zcode.cjs,runtime: electron-node,platform: darwin-arm64),与 packages/zcode-server-cli 无关,解释了为何 server-cli 特征串全零。 | 证据:glm/.node-bundle-meta.json 全文:{"runtime":"electron-node","entry":"zcode.cjs","platform":"darwin-arm64","source":"apps/zcode-cli/packages/cli/dist/zcode.cjs"} |
| packages/formal-proof(@zcode/formal-proof,Vite + d3 状态空间枚举器) | packages/formal-proof/package.json(scripts: vite dev/build;dependencies: d3 ^7.9.0;README:'产品行为状态空间枚举器') | 无对应物 | repo-only | 确认为纯开发用包:App 全部产物(out/、zcode.cjs、glm/、cua-helper/、tools/、app package.json)中 'formal-proof|formalProof' 零命中。它仅作为 apps/zcode-cli/packages/bootstrap 的 devDependencies(bootstrap/package.json:42)用于黄金测试对齐;bootstrap 源码注释'裁决表与 packages/formal-proof/src/model.ts 的 evaluate 逐条对齐'在打包时被剥离(evaluateCompacting、duplicateCompactRejected 在 zcode.cjs 亦 0 命中)。 | 证据:rg -ril 'formal-proof|formalProof' out/ glm/ cua-helper/ tools/ app package.json → 零命中;bootstrap/package.json:42 '@zcode/formal-proof': 'workspace:*' 位于 devDependencies;rg -c 'evaluateCompacting' zcode.cjs → 0 |
| patches/ 声明机制(pnpm.patchedDependencies) | package.json:87-90:@arms/[email protected]、@ai-sdk/[email protected]、@ai-sdk/[email protected] 三条,与 patches/ 目录三个 .patch 文件一一对应 | 效果分别体现在 node_modules 与 zcode.cjs(见下三行) | identical-evidence | 仓库侧补丁机制完整(3/3 声明与文件对应);三个补丁的效果均可在 App 产物中找到对应实现,逐条判定见后续三行。 | 证据:/Users/lifcc/Desktop/code/AI/tools/ZCode/package.json:88-90 三行 patchedDependencies 映射;ls patches/ 恰好 3 个同名 .patch 文件 |
| patches/@[email protected](console.error 采集修复 + Crashpad process_type 修复) | patches/@[email protected](改 dist/index.mjs:zcodeFormatConsoleErrorArgs 系列 + readCrashProcessType/zcodeCrashpadInfoStreamType) | /tmp/zcode-reverse/app/node_modules/@arms/[email protected]/dist/index.mjs | identical-evidence | 目标包本体在 App node_modules 且版本一致(0.0.3;app package.json dependencies 含 "@arms/rum-electron": "^0.0.3")。补丁全部 hunks 已注入 dist/index.mjs(补丁本身只改该文件)。加载路径吻合:App package.json type:module,exports.'.'.import 指向 dist/index.mjs,out/main/index.js 以 ESM 引用 rum-electron,实际加载的正是已补丁文件(dist/index.cjs 未补丁但补丁亦未覆盖 cjs,属补丁自身范围而非漂移)。 | 证据:rg -c:index.mjs 中 zcodeFormatConsoleErrorArgs=2、readCrashProcessType=2、zcodeCrashpadInfoStreamType=2、'ZCode 修复'=2、zcodeRedactConsoleErrorText=4;node_modules/@arms/ 下有 rum-browser/rum-core/rum-electron;exports: {".":{"import":{"default":"./dist/index.mjs"},"require":{"default":"./dist/index.cjs"}}} |
| patches/@[email protected](video/* file part → base64 video content block) | patches/@[email protected](dist/index.js + dist/index.mjs:在 application/pdf 分支前插入 type:'video', source:{type:'base64'} 分支) | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs 内联 provider 代码 | identical-evidence | 目标包不以独立包存在(App node_modules 无 @ai-sdk 作用域目录),provider 代码被打进 zcode.cjs。补丁效果逐点对应:video 分支位于 application/pdf(pdfs-2024-09-25)之前,结构与补丁插入完全一致(type:'video', source:{type:'base64', media_type, data: convertToBase64(...)}, cache_control)。 | 证据:zcode.cjs 提取:else if(Dt.mediaType.startsWith("video/"))$e.push({type:"video",source:{type:"base64",media_type:Dt.mediaType,data:l2(Dt.data)},cache_control:un});else if(Dt.mediaType==="application/pdf"){Ce.add("pdfs-2024-09-25");find node_modules -name '@ai-sdk' → 无结果 |
| patches/@[email protected](video/* → OpenAI 兼容 video_url base64 data URL) | patches/@[email protected](在 application/pdf 检查前插入 type:'video_url' 分支,一处) | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs 内联 provider 代码 | skewed | 补丁效果确实在 zcode.cjs(video_url + data:${mediaType};base64,${convertToBase64}),但该 if 分支在产物中连续出现两次完全相同的拷贝(补丁只添加一处),且目标包本体同样不在 App node_modules——效果同源存在,结构与打包形态有漂移。 | 证据:zcode.cjs 提取:if(g.mediaType.startsWith("video/"))return{type:"video_url",video_url:{url:data:${g.mediaType};base64,${t0e(g.data)}},...b}; 连续出现 2 次后接 if(g.mediaType==="application/pdf"){...throw new z3({functionality:"PDF file parts with URLs"}) |
| third-party/upstream/(78 个 sha256 命名的第三方许可证文本) | third-party/upstream/*.txt(如 34dee5fd...txt = [email protected] LICENSE) | 无对应物(App 不随包携带许可证库) | repo-only | 该目录是哈希命名的上游许可证快照库(被 inventory.json/npm-overrides.json/copied-components.json 引用),属仓库合规工件。App Resources 下不存在任何 LICENSE 文件,out/ 亦无 THIRD-PARTY-NOTICES 引用。抽查文件哈希与文件名自洽。 | 证据:shasum -a 256 third-party/upstream/34dee5fd...txt = 34dee5fd5e5cc756efb5ad4d64652bce719bdf5e900ca5d7538253e737930bc4(与文件名一致);find /Applications/ZCode.app/Contents/Resources -iname 'license' → 零结果;rg -l 'THIRD-PARTY-NOTICES' out/ → 无命中 |
| third-party/inventory.json(1.4MB 第三方合规清单) | third-party/inventory.json(schemaVersion 1,scope:'Production dependency union across current workspace projects...') | 无对应文件 | repo-only | 仓库侧合规总清单,覆盖生产依赖并集、复制源码与原生工具;含 @arms/rum-electron 记录(3 处)。App 不携带该清单,产品内也未内嵌许可证页引用。 | 证据:head third-party/inventory.json:"scope": "Production dependency union...";rg -c '@arms/rum-electron' inventory.json → 3 |
| third-party/npm-overrides.json(63 条许可证覆盖/选择记录) | third-party/npm-overrides.json(首条 [email protected] → upstream/34dee5fd...txt) | /tmp/zcode-reverse/app/node_modules/[email protected](抽查对应) | identical-evidence | 文件本体是仓库合规元数据(App 不携带),但记录的包版本与 App 实际安装一致:抽查首条 [email protected] 在 App node_modules 中版本恰为 37.3.6(其余条目含 [email protected]、[email protected]、[email protected] 等 63 条)。 | 证据:python3 json 解析:len=63,['[email protected]','[email protected]','[email protected]','[email protected]','[email protected]','[email protected]'];node -e require('.../victory-vendor/package.json').version → 37.3.6 |
| third-party/copied-components.json(复制组件溯源,如 shadcn/ui) | third-party/copied-components.json(首条 id: shadcn,referenceRevision a87a63b2ca25143d26c8bd0903e4e9bc77b3f824) | 无独立对应物(源码已编译进 out/renderer chunk) | repo-only | 记录复制进仓库源码的第三方组件(shadcn 等)的许可证与版本溯源;App 侧这些代码经编译混淆进 renderer chunk,不存在可逐字节比对的独立对应物,App 也不携带该清单。 | 证据:head copied-components.json:{"id":"shadcn","referenceRevision":"a87a63b2...","source":"https://raw.githubusercontent.com/shadcn-ui/ui/a87a63b2.../LICENSE.md"} |
| third-party/embedded-components.json(内嵌组件,如 Skia / @napi-rs/[email protected]) | third-party/embedded-components.json(首条 Skia,parentPackage @napi-rs/[email protected],reviewRequired 注记) | 无对应物:App node_modules 无 @napi-rs/canvas,zcode.cjs 无 @napi-rs 字样 | repo-only | 记录内嵌于原生依赖中的上游组件(Skia 等)的合规状态;管控点在 packages/desktop/scripts/desktop-native-package-policy.mjs。App 实际安装树中 @napi-rs/canvas 不存在(NOT FOUND),zcode.cjs 亦无相关字符串,说明当前桌面产物未包含该内嵌组件。 | 证据:head embedded-components.json:{"id":"Skia","parentPackage":"@napi-rs/[email protected]",...};node -e version 查询 → NOT FOUND;rg -c '@napi-rs' zcode.cjs → 无命中 |
| third-party/runtime/sources.json(Node 22.16.0 / 24.14.0 运行时许可证) | third-party/runtime/sources.json + node-*-LICENSE.txt(source 指向 nodejs/node 官方 LICENSE,带 sha256) | 无对应文件(App 本机运行时为 electron-node) | repo-only | 对应构建工具链与远端 server 运行时(apps/zcode-cli engines node 24.14.0;server-cli 打包经 nodeDistMirror 下载 node dist 部署远端)。App 本机不携带独立 node 二进制——glm 运行时声明 runtime: electron-node,且 Resources 下无 node LICENSE 文件。 | 证据:runtime/sources.json:两条记录 version 22.16.0 / 24.14.0;.node-bundle-meta.json:"runtime":"electron-node";find Resources -iname 'license' → 零结果 |
| third-party/native-search/sources.json ↔ ${RES}/tools/ 原生搜索工具 | third-party/native-search/sources.json(archives: bfs 4.1.1 / ugrep 7.8.4 / ripgrep 14.1.1 及 13.0.0 等多平台记录) | /Applications/ZCode.app/Contents/Resources/tools/{bfs,ripgrep,ugrep}/.bundle-meta.json + 对应二进制 | identical-evidence | 逐一对应:bfs version 4.1.1 release v4.1.1-1,archiveSha256 696f73eaff50d3c3...(与 sources.json bfs 归档记录 sha256 完全一致);ripgrep 14.1.1(v14.1.1-1);ugrep 7.8.4(v7.8.4-1);三者 provider 均为 native-search-tool,platform darwin-arm64。App 只随包 darwin-arm64 一套,sources.json 中 13.0.0 等为其他平台/版本记录。 | 证据:tools/bfs/.bundle-meta.json:"toolId":"bfs","version":"4.1.1","release":"v4.1.1-1","archiveSha256":"696f73eaff50d3c3de8a8ee36746a89693dd6ff0d010b05cd3b4b3eb2a369781";sources.json archives[0] 同值;tools/ripgrep version 14.1.1、tools/ugrep version 7.8.4 |
| config/default.json(客户端默认配置) | config/default.json(md5 47fee9e751fc5c90e37fd444b905beeb) | /Applications/ZCode.app/Contents/Resources/config/default.json(md5 47fee9e751fc5c90e37fd444b905beeb) | identical-evidence | 逐字节一致:两侧 md5 完全相同,diff 无任何差异。与 config/README.md 自述('随客户端发布的默认配置,Desktop 从打包文件读取')相符。 | 证据:md5 两侧均 47fee9e751fc5c90e37fd444b905beeb;diff repo/App default.json → 无输出(一致) |
| config/provider/zcode-builtin.json(内置 provider 配置) | config/provider/zcode-builtin.json(md5 489a8cd7fefe0c932d1803021d6fa9e2) | /Applications/ZCode.app/Contents/Resources/config/provider/zcode-builtin.json(md5 366cee174e491aa21a41fb387e93b193) | skewed | 字节级不同但语义完全一致:diff 全部为数组的紧凑写法(仓库,如 ["gpt-5.6-luna","grok-4.6"])与展开多行写法(App)的格式化差异,无任何值变更;jq -S 键排序归一化后两侧 md5 均为 9e12cc6c9d207418c25af348ba08206d。属同源格式化漂移(构建时经 JSON 序列化器重排)。 | 证据:diff 显示约 30 处均为 'values: [...]' 紧凑/展开差异;jq -S . 两侧 | md5 → 均 9e12cc6c9d207418c25af348ba08206d |
| config/README.md(配置说明文档) | config/README.md(md5 a05b599bd579022caf927a3b1cf55d26,说明 default.json 随客户端发布与帮助配置来源) | 无对应物(${RES}/config/ 仅含 default.json 与 provider/zcode-builtin.json) | repo-only | App 侧 config 目录文件集为仓库 config/ 的真子集(无 README.md),文档不随包分发。 | 证据:find /Applications/ZCode.app/Contents/Resources/config -type f → 仅 default.json、provider/zcode-builtin.json 两项 |
区域 summary:本区域三个 package 共 48 个源码模块已逐一单列对照:除 5 个纯类型/桶文件无运行时痕迹无法直接判定外,其余 42 个模块均在 App 产物中取得同源证据(bundler 的 i()/r() 改名注解 + 函数体逐行比对)。清单型数据全量核对:内置供应商基线 zcode-builtin.json 两侧深度相等(revision 30,modelRules 84 / modelApiRules 72 / providerSiteRules 52 / templateModelRules 244 / builtinProviderModelRules 26),模型 ID 增删为零,唯一差异是序列化风格(仓库内联短数组、App 全展开)导致 sha256 不同。OFFICIAL_GLM_MODEL_IDS 22 条、legacy reasoning renames 25 条、account:* 六计划 ID 加两个 offpeak ID、模板 ID、厂商配置结构枚举全部逐条相等。唯一实质发现:App 的桌面主进程 resolveZCodeBuiltinProviderConfigFilePath 在开发态多出 zcode-builtin.test.json 分支(仓库无,区域外 packages/desktop,附带记录);另 merge-patch/option-maps 仅存在于 zcode.cjs(CLI),桌面 bundle 因未使用被 tree-shake,属打包裁剪而非内容漂移。
本区域 rows 共 59 条(identical-evidence 53 / differs 1 / unresolved 5)。覆盖口径:实际枚举单元:provider/src 23 个源码文件 + provider-node/src 17 个 + model-option-map/src 8 个,共 48 个模块全部单列成行(0 抽样);另列 10 行清单型数据(内置 zcode-builtin.json、模板 builtinModelIds 集合、五组规则计数、OFFICIAL_GLM_MODEL_IDS 22 条、BUILTIN_MODEL_PROVIDER_IDS 6 ID、offpeak 2 ID、BUILTIN_PROVIDER_TEMPLATE_IDS、legacy builtin: 迁移映射、厂商配置结构枚举、legacy reasoning renames 25 条),并附 1 条区域外附带发现(desktopProviderConfig 的 test.json 分支)。总计 59 行,无遗漏。方法:Gr…*
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| 内置供应商基线 config/provider/zcode-builtin.json | config/provider/zcode-builtin.json:1-3 (schemaVersion 1, revision 30) | /Applications/ZCode.app/Contents/Resources/config/provider/zcode-builtin.json | identical-evidence | 两侧 revision 均为 30,json 深度比较(含键序)完全相等;唯一差异是序列化风格——仓库把短数组内联("builtinModelIds": ["gpt-5.6-luna", "grok-4.6"]),App 侧每个数组元素独立成行,导致原始字节 sha256 不同(0b3d735e… vs 8bd8070d…)但内容零差异 | 证据:repo config/provider/zcode-builtin.json 180680 字节 vs app 182180 字节,首个差异在 char 17298(数组排版);python sort_keys 规范化后两侧 sha 一致 4c13aeb5a260083b |
| 模型 ID 全量清单(20 模板 builtinModelIds,逐模板列出) | config/provider/zcode-builtin.json providerConfigRules.templateRules | 同右(同一文件两份拷贝) | identical-evidence | 增删=0,20 模板逐一相等:zai-api/bigmodel-api=[GLM-5.3,GLM-5.3-Flash];zai/bigmodel-standard-api=24 条(GLM-5.3…GLM-4V-Flash+codegeex-4/charglm-4/emohaa);moonshot-kimi=6(kimi-k3、kimi-k2.7-code、kimi-k2.6、kimi-k2.7-code-highspeed、k3、k3-256k);minimax=8;deepseek=2(deepseek-flash、deepseek-v4-pro);qwen cn=13/intl=14(多 qwen3.8-omni-flash);xiaomi-mimo=2;openai=10(gpt-6-astra…gpt-5.3-codex);anthropic=5;xai=3;openrouter=59;opencode-go-chat=16;go-messages=8;go-responses=2;zen-responses=14;zen-messages=16 条目(15 唯一);zen-chat=14 | 证据:python json 全量导出两侧模板清单逐条 diff 为空 |
| 规则计数与规则组键(modelRules 等 5 组) | config/provider/zcode-builtin.json modelConfigRules | out/host/index.js(键名命中) | identical-evidence | modelRules=84、modelApiRules=72、providerSiteRules=52、templateModelRules=244、builtinProviderModelRules=26 两侧全同;5 个规则组键名在 host bundle 中全部命中 | 证据:host/index.js 命中 templateModelRules / modelApiRules / providerSiteRules / builtinProviderModelRules / templateRules 各 1 处 |
| OFFICIAL_GLM_MODEL_IDS 官方 GLM 白名单(22 条) | packages/shared/src/official-glm-model-id.ts:2-25 | out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js、out/scheduler/index.js、zcode.cjs | identical-evidence | GLM-5.3 至 GLM-4V-Flash 共 22 条顺序逐条相等(python 全量比对 MATCH),四个 bundle 中均存在同一数组 | 证据:zcode.cjs 字节 595149 附近 Brs=["GLM-5.3","GLM-5.3-Flash",…,"GLM-4V-Flash"];host/chunk-GVBBGMXG.js 同数组 22 条 MATCH |
| BUILTIN_MODEL_PROVIDER_IDS(account:* 六计划 ID) | packages/shared/src/model-provider-types.ts:5-12 | out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js、zcode.cjs | identical-evidence | 六个键值对逐字相等:zaiIndividualCodingPlan/zaiTeamCodingPlan/zaiStartPlan/bigmodelIndividualCodingPlan/bigmodelTeamCodingPlan/bigmodelStartPlan → account:zai-individual-coding-plan … account:bigmodel-start-plan | 证据:host/chunk-GVBBGMXG.js {zaiIndividualCodingPlan:"account:zai-individual-coding-plan",…,bigmodelStartPlan:"account:bigmodel-start-plan"} 全串提取成功 |
| offpeak account:* 两个内置供应商 ID | config/provider/zcode-builtin.json providerRules(account:zai-offpeak-idle-plan、account:bigmodel-offpeak-idle-plan) | out/host/chunk-GVBBGMXG.js、zcode.cjs | identical-evidence | offpeak ID 不在 model-provider-types 常量表中(仅 6 个计划 ID),随内置清单发布;两侧清单文件相同故 ID 相同,且 host chunk 与 cjs 中均有字面量 | 证据:host/chunk-GVBBGMXG.js 中 account:zai-offpeak-idle-plan 与 account:bigmodel-offpeak-idle-plan 均 True;zcode.cjs 各命中 1 次 |
| BUILTIN_PROVIDER_TEMPLATE_IDS(zai-api/bigmodel-api) | packages/shared/src/model-provider-types.ts:3-6 | zcode.cjs、out/host/index.js | identical-evidence | 常量映射逐字相同;host 中以压缩名引用(Ot.zaiIndividualCodingPlan 等) | 证据:zcode.cjs XQ={zai:"zai-api",bigmodel:"bigmodel-api"},rm={zaiIndividualCodingPlan:…};host/index.js new Set(["zai-api",Ot.zaiIndividualCodingPlan,…]) |
| legacy builtin:* 迁移映射(migrateLegacyModelProviderId) | packages/shared/src/legacy-model-provider-identity.ts:22-39 | out/host/index.js、out/host/chunk-GVBBGMXG.js、zcode.cjs | identical-evidence | builtin:bigmodel/builtin:zai/builtin:-start-plan/builtin:-coding-plan 全部旧 ID 及 builtin:zapi(已退出供应商拒绝逻辑)在 App 侧均存在 | 证据:host/index.js 命中 builtin:zai-coding-plan(1)/builtin:zapi(2),chunk-GVBBGMXG.js 命中 builtin:bigmodel-start-plan(1),zcode.cjs 命中 3-4 次 |
| 厂商配置结构(access/api/group/mode/visibility/logo 枚举) | packages/provider/src/config/provider-data-schema.ts:4-27 | out/host/index.js | identical-evidence | api 类型三值(anthropic-messages/openai-chat-completions/openai-responses)、group 三值(standard-personal/zai-family/bigmodel-family)、zhipu-account mode 四值(start-plan/individual-coding-plan/team-coding-plan/off-peak)、accountType 二值(zai/bigmodel)、校验错误码 required-field-missing、apiKeyManagementUrl 字段全部命中 | 证据:host/index.js 对上述 11 个枚举/字段字面量逐一 grep 命中;zcode.cjs 中 zhipu-account 命中 5 次 |
| legacy reasoning renames(25 条一次性改名清单) | packages/provider-node/src/legacy-reasoning-level-renames.ts:2-103 | out/host/index.js、zcode.cjs | identical-evidence | 25 条 {modelMatch, oldLevel} 用 python 全量正则抽取比对 IDENTICAL(含 GLM-5.2→nothink 的唯一 nothink 条目、glm-5 系 off、kimi-k2.x、deepseek-v4、qwen 系、mimo 系) | 证据:host/index.js 命中串 {modelMatch:".GLM-5\\.2(?:[.\\-:/\\[].)?",oldLevel:"nothink"};脚本输出 repo 25 / app 25 IDENTICAL |
| provider/src/account-provider-resolution.ts | packages/provider/src/account-provider-resolution.ts:47,92 | out/host/index.js | identical-evidence | 两个导出函数均带 bundler 注解 | 证据:host/index.js createAccountProviderConfigResolver");function 与 i(...,"resolveAccountProviderConfigs") 注解命中 |
| provider/src/account-provider-service.ts | packages/provider/src/account-provider-service.ts:45 (class AccountProviderService) | out/host/index.js | identical-evidence | 类名注解 + 私有错误消息(unicode 转义)同源 | 证据:host/index.js i(this,"AccountProviderService");函数体 throw new Error("AccountProviderService 已 dispose") |
| provider/src/account-provider-state.ts | packages/provider/src/account-provider-state.ts:11-29 | out/host/index.js | identical-evidence | 纯类型文件(interface/type),经消费方字段形状佐证:unavailableReason 字段在 host 中 8 处出现 | 证据:host/index.js grep -o unavailableReason 计数 8 |
| provider/src/config-overlay.ts | packages/provider/src/config-overlay.ts:40 (requiredFieldIssue) 及 ConfigOverlay 基类 | out/host/index.js | identical-evidence | 基类注解与 overlayValue 方法体同源 | 证据:host/index.js var Wn=class{static{i(this,"ConfigOverlay")}overlayValue(t,n){return n===void 0?t… |
| provider/src/config-service.ts | packages/provider/src/config-service.ts:96 (class ProviderConfigService) | out/host/index.js | identical-evidence | 类名注解命中 | 证据:host/index.js i(this,"ProviderConfigService") |
| provider/src/config/ids.ts | packages/provider/src/config/ids.ts:1-3 | — | unresolved | 纯类型别名(ProviderId/ProviderTemplateId/ModelId),编译后无任何运行时痕迹;检索 'ProviderId'/'ModelId'/'ProviderTemplateId' 仅命中压缩器生成的无关局部变量,无法从 bundle 判定;文件仅 3 行类型别名,漂移风险经由消费方(provider-config.ts 等已证同源)间接覆盖 | 证据:grep 'ProviderId' host/index.js 无语义命中;已试检索词 ProviderId、ModelId、ProviderTemplateId |
| provider/src/config/index.ts | packages/provider/src/config/index.ts:1-5 | — | unresolved | 5 行桶文件,无独立运行时单元;其 re-export 的运行时符号(parse* 系列)已在 host 命中(见 schema.ts 行),但桶文件本身无法判定;host 会 tree-shake 未用导出(例证:MutableAccountProviderConfigSource 仅存于 cjs) | 证据:grep 'parseProviderTemplateMap' host/index.js 与 zcode.cjs 均 0(被压缩),桶级无法直接取证 |
| provider/src/config/manual-model-config.ts | packages/provider/src/config/manual-model-config.ts:37 (clearManualModelConfig) | out/host/index.js | identical-evidence | 导出函数注解命中 | 证据:host/index.js clearManualModelConfig");function |
| provider/src/config/model-config.ts | packages/provider/src/config/model-config.ts:366 (ModelConfigRules), 544 (matchesRule) | out/host/index.js | identical-evidence | 规则类与匹配正则构造同源 | 证据:host/index.js i(this,"ModelConfigRules");^(?:${e})$(matchesRule 的正则模板)出现 2 次 |
| provider/src/config/provider-config.ts | packages/provider/src/config/provider-config.ts:276,310,383 (ProviderTemplate/ProviderTemplateMap/ProviderConfigMap) | out/host/index.js | identical-evidence | Template/Map 类注解 + access 结构字段命中 | 证据:host/index.js i(this,"ProviderTemplateMap");apiKeyManagementUrl、zhipu-account(3 处)命中 |
| provider/src/config/provider-data-schema.ts | packages/provider/src/config/provider-data-schema.ts:4-27 | out/host/index.js | identical-evidence | zod 枚举字面量全部命中(详见『厂商配置结构』行);validateConfigSchema 紧邻处可见 _.enum(["ant…(anthropic-messages 枚举开头) | 证据:host/index.js i(Wr,"validateConfigSchema");y();y();var nY=_.enum(["ant |
| provider/src/config/rule-data-schema.ts | packages/provider/src/config/rule-data-schema.ts:116 (account: 前缀 access 校验) | out/host/index.js | identical-evidence | superRefine 校验体逐字同构 | 证据:host/index.js e.providerId.startsWith("account:")&&e.config.access!==void 0&&t.addIssue({code:"custom",path:[ |
| provider/src/config/schema-validation.ts | packages/provider/src/config/schema-validation.ts:5 (validateConfigSchema) | out/host/index.js | identical-evidence | 函数注解 + 校验错误码命中 | 证据:host/index.js i(Wr,"validateConfigSchema"),其前是 必须是有效 URL('必须是有效 URL')错误消息;required-field-missing 命中 |
| provider/src/config/schema.ts | packages/provider/src/config/schema.ts:44 (parseZCodeBuiltinProviderConfigRules), 40 (parseProviderTemplateMap) | out/host/index.js | identical-evidence | 核心解析函数注解命中;同文件小函数(parseProviderTemplateMap 等)被压缩器重命名未留注解 | 证据:host/index.js parseZCodeBuiltinProviderConfigRules");function |
| provider/src/effective-model-selection.ts | packages/provider/src/effective-model-selection.ts:10-17,36,51,72-73 | out/host/index.js | identical-evidence | 分类器 kind(account-plan/account-offpeak)与三个 selectionIssue 错误码全命中,函数注解命中 | 证据:host/index.js i(Nk,"resolveEffectiveModelSelection");account-plan/account-offpeak/account-connection-unavailable/reasoning-level-not-supported/reasoning-level-missing 各命中 |
| provider/src/facades.ts | packages/provider/src/facades.ts:207,498,571 | out/host/index.js | identical-evidence | 两个 Facade 类与投影函数注解命中;ProviderSettingsFacade.getView 投影字段串(revision/zcodeBuiltinProviders/zcodeBuiltinProviderTemplates/personalProviders/personalModels/resolution)与 repo 一致 | 证据:host/index.js i(this,"ProviderSettingsFacade")…getView(){…zcodeBuiltinProviders:t.config.zcodeBuiltinProviders,zcodeBuiltinProviderTemplates:…personalProviders:…personalModels:…resolu;i(this,"ModelSelectionFacade");projectModelSelectionProviderView 注解 |
| provider/src/index.ts | packages/provider/src/index.ts:1-14 | — | unresolved | 14 行桶文件;其 12 个模块行均已单独取证,桶本身无运行时单元可检;且 host 存在 tree-shake(sources.ts 的 MutableAccountProviderConfigSource 只在 cjs),桶内容完整性无法从 bundle 反推 | 证据:已试检索:各 re-export 符号名(结果见各模块行);桶级无独立证据 |
| provider/src/model-selection-config.ts | packages/provider/src/model-selection-config.ts:28,58,79 | out/host/index.js、zcode.cjs | identical-evidence | 三个导出函数注解命中(normalizeModelSelection 在 host 被压缩、于 cjs 留注解) | 证据:host/index.js resolveInitialModelSelection");function、completeNewModelSelection");function;zcode.cjs r(AKe,"normalizeModelSelection") |
| provider/src/owned-order.ts | packages/provider/src/owned-order.ts:7-23 | out/host/index.js | identical-evidence | 34 行小函数逐行同源:host 函数体 Pc(e,t,n){let r=Mk(e),o=new Set(r),s=Mk(t).filter(l=>!o.has(l)),…return[...r.filter(l=>!d.has(l)),...c,...s.filter(l=>!d.has(l))]} 与 repo 三段序(未排序 builtin 前置/ordered/未排序 personal 后置)完全一致 | 证据:host/index.js i(Pc,"resolveOwnedOrder") + 上述函数体 |
| provider/src/registry-service.ts | packages/provider/src/registry-service.ts:53 (class ProviderRegistryService) | out/host/index.js | identical-evidence | 类名注解命中 | 证据:host/index.js i(this,"ProviderRegistryService") |
| provider/src/registry.ts | packages/provider/src/registry.ts:47,129 | out/host/index.js | identical-evidence | 注册表类与 selection 校验函数注解命中 | 证据:host/index.js i(this,"ProviderRegistry")、validateModelSelectionOptions 注解命中 |
| provider/src/resolver.ts | packages/provider/src/resolver.ts:39,108,182 | out/host/index.js | identical-evidence | Resolver 类与两个序列化函数注解命中 | 证据:host/index.js ProviderConfigResolver");function、i(...,"serializeRegistryProviderConfig") |
| provider/src/sources.ts | packages/provider/src/sources.ts:35,55,61,80 | out/host/index.js、zcode.cjs | identical-evidence | 快照工厂与 revision 模板同源:host account:${JSON.stringify([e,t.toJSON(),n])} 与 repo sources.ts:61 逐字对应;MutableAccountProviderConfigSource 在 host 被 tree-shake、仅存于 cjs(打包差异非漂移) | 证据:host/index.js i(...,"createFailClosedAccountProviderConfigSnapshot")、account:${JSON.stringify([e,t.toJSON(),n])},basedOnZCodeBuiltinRevisi;zcode.cjs r(this,"MutableAccountProviderConfigSource")` |
| provider-node/src/endpoint-scoped-zcode-builtin-source.ts | packages/provider-node/src/endpoint-scoped-zcode-builtin-source.ts:28 (class EndpointScopedZCodeBuiltinSource) | out/host/index.js | identical-evidence | 类名注解命中 | 证据:host/index.js i(this,"EndpointScopedZCodeBuiltinSource") |
| provider-node/src/index.ts | packages/provider-node/src/index.ts:1-14 | — | unresolved | 桶文件;17 个成员模块行均已单独取证,桶本身无运行时单元;同 host tree-shake 限制 | 证据:成员符号检索结果见 provider-node 各模块行;桶级无独立证据 |
| provider-node/src/legacy-reasoning-level-renames.ts | packages/provider-node/src/legacy-reasoning-level-renames.ts:2-103 | out/host/index.js、zcode.cjs | identical-evidence | 25 条清单逐条相等,详见『legacy reasoning renames(25 条)』行 | 证据:host/index.js 与 zcode.cjs 各含完整 25 条数组(python 抽取 IDENTICAL) |
| provider-node/src/legacy-reasoning-level.ts | packages/provider-node/src/legacy-reasoning-level.ts:13-72 | out/host/index.js | identical-evidence | 函数体同构:off/nothink 早退、personal getExactRule 排除分支(manual-provider-model 或 values/map 已定义)、renames 匹配后 disabled 替换,与 repo 一致 | 证据:host/index.js resolveLegacyReasoningLevel");function 及 function wN(e,t){let n=t.options?.reasoningLevel;if(n!=="off"&&n!=="nothink")return;let r=e.config.personalModels.getExactRule(t.providerId,t.modelId);… |
| provider-node/src/model-selection-config-repository.ts | packages/provider-node/src/model-selection-config-repository.ts:8 (class NodeModelSelectionConfigRepository) | out/host/index.js | identical-evidence | 类名注解命中 | 证据:host/index.js i(this,"NodeModelSelectionConfigRepository") |
| provider-node/src/model-selection-facade.ts | packages/provider-node/src/model-selection-facade.ts:10 (createNodeModelSelectionFacade) | out/host/index.js | identical-evidence | 工厂函数注解命中 | 证据:host/index.js createNodeModelSelectionFacade |
| provider-node/src/personal-provider-config-repository.ts | packages/provider-node/src/personal-provider-config-repository.ts:28 (class NodePersonalProviderConfigRepository) | out/host/index.js | identical-evidence | 类名注解命中 | 证据:host/index.js i(this,"NodePersonalProviderConfigRepository") |
| provider-node/src/provider-config-file-codec.ts | packages/provider-node/src/provider-config-file-codec.ts:14,32,42,112 | out/host/index.js | identical-evidence | 版本错误类逐字同构(name/version 字段);decode 紧邻 defaultModelSelection schema;encode 注解命中;CURRENT_SCHEMA_VERSION=1 以 z.literal 形式编译进 schema | 证据:host/index.js i(xi,"decodeProviderConfigFile");var QY=ss.extend({enabled:z…、ia=class extends Error{static{i(this,"UnsupportedProviderConfigVersionError")}version;constructor(t,n){super(t),this.name="UnsupportedProviderConfigVersion…、encodeProviderConfigFile");function |
| provider-node/src/provider-config-runtime.ts | packages/provider-node/src/provider-config-runtime.ts:41 (class NodeProviderConfigRuntime),173 (createNodeProviderConfigRuntime) | out/host/index.js | identical-evidence | 运行时类注解命中;工厂函数为单行 return 被压缩未留注解 | 证据:host/index.js i(this,"NodeProviderConfigRuntime") |
| provider-node/src/provider-registry-runtime.ts | packages/provider-node/src/provider-registry-runtime.ts:21 (class NodeProviderRegistryRuntime) | zcode.cjs(仅 CLI bundle) | identical-evidence | 桌面 host 不含该模块(桌面经 ProviderConfigService+ProviderRegistryService 装配;repo 消费方为 apps/zcode-cli bootstrap,属 CLI 专用);CLI 运行时 zcode.cjs 完整包含 | 证据:zcode.cjs zKe=class{static{r(this,"NodeProviderRegistryRuntime")}… 与 NodeProviderRegistryRuntime 已 dispose 错误串;host/main/scheduler grep 均 0 |
| provider-node/src/runtime-paths.ts | packages/provider-node/src/runtime-paths.ts:1-21 | out/main/index.js、out/host/index.js、zcode.cjs | identical-evidence | 环境变量名与文件名常量、两个路径函数注解命中 | 证据:main/index.js 与 host/index.js 命中 ZCODE_BUILTIN_PROVIDER_CONFIG_FILE;host/index.js i(kN,"createNodeProviderRuntimePathEnv");host+cjs 命中 provider_config.json;zcode.cjs r(cfr,"resolveNodeProviderRuntimePaths")(紧邻 "provider_config.json" 字面量) |
| provider-node/src/zcode-builtin-cache-paths.ts | packages/provider-node/src/zcode-builtin-cache-paths.ts:4,24,45,51 | out/host/index.js、zcode.cjs | identical-evidence | 四个导出函数全部取证:三个在 host 注解命中,resolveZCodeBuiltinClientPlatform 仅 cjs(与 endpoint-key 路径逻辑同处) | 证据:host/index.js 命中 resolveZCodeBuiltinCachePaths/createZCodeBuiltinEndpointKey/normalizeZCodeBuiltinEndpointOrigin;zcode.cjs r(LKe,"resolveZCodeBuiltinClientPlatform");r(FKe,"resolveZCodeBuiltinCachePaths");r(t6i,"createZCode… |
| provider-node/src/zcode-builtin-download.ts | packages/provider-node/src/zcode-builtin-download.ts:35,50-52 | out/host/index.js | identical-evidence | 下载边界同源:控制面端点、app_version/platform 查询参数、20s 超时 AbortController 结构一致 | 证据:host/index.js 命中 "/api/v1/client/configs"、app_version,platform:n.platform、i(...,"downloadZCodeBuiltinRelease") |
| provider-node/src/zcode-builtin-provider-config-materializer.ts | packages/provider-node/src/zcode-builtin-provider-config-materializer.ts:18,26-30 | zcode.cjs(仅 CLI bundle);桌面侧等价逻辑在 out/main/index.js | identical-evidence | 物化函数仅存于 cjs(repo 消费方为 server/services/cli,非桌面);桌面 main 用 desktopProviderConfig 解析 resourcesPath 下 config/provider/zcode-builtin.json,功能等价 | 证据:zcode.cjs r(Ttr,"materializeZCodeBuiltinProviderConfig");r(n6i,"readOptionalFile") 及 runtime/provider/…zcode-builtin.json 路径拼接;main/index.js xC(e?.resourcesPath??process.resourcesPath,"config/provider/zcode-builtin.json") |
| provider-node/src/zcode-builtin-provider-config-source.ts | packages/provider-node/src/zcode-builtin-provider-config-source.ts:23,208-218 | out/host/index.js | identical-evidence | Source 类、snapshotFromRelease 的 revision 模板逐字同构(zcode-builtin:${revision}:${sourceKey}),active/control 文件名(zcode-builtin.json / zcode-builtin-refresh.json)与 endpoint-key sha256 逻辑命中 | 证据:host/index.js function $Y(e,t){return Object.freeze({revision:zcode-builtin:${e.revision}:${t},providers:e.config.providers,pro…;zcode.cjs 同构函数 Z4i;endpoint-${createHash sha256 slice(0,32)} |
| provider-node/src/zcode-builtin-release.ts | packages/provider-node/src/zcode-builtin-release.ts:10-11,38,45 (RETIRED builtin:zapi 拒绝) | out/host/index.js、zcode.cjs | identical-evidence | decode/encode 注解命中;已退出 provider 拒绝常量 builtin:zapi 在 host 存在;schemaVersion=1/revision 校验经 zod 编译不可见但 snapshot 函数逐字同构 | 证据:host/index.js 命中 decodeZCodeBuiltinRelease、encodeZCodeBuiltinRelease、builtin:zapi(2 次);zcode.cjs Z4i(e,t){return Object.freeze({revision:zcode-builtin:${e.revision}:${t}…})} 与 repo snapshotFromRelease 同构 |
| provider-node/src/zcode-builtin-remote-synchronizer.ts | packages/provider-node/src/zcode-builtin-remote-synchronizer.ts:49 (class ZCodeBuiltinRemoteSynchronizer) | out/host/index.js | identical-evidence | 类名注解命中 | 证据:host/index.js i(this,"ZCodeBuiltinRemoteSynchronizer") |
| model-option-map/src/compiler.ts | packages/model-option-map/src/compiler.ts:17,35,62,87 | out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js、out/scheduler/index.js、zcode.cjs | identical-evidence | 编译函数注解与两条错误消息命中;compileRestrictedCel 被内联进 compileModelOptionMap(无独立注解),其错误串存在 | 证据:host/chunk-GVBBGMXG.js s(af,"compileModelOptionMap")、main c(Vg,"compileModelOptionMap")、cjs r(UEe,"compileModelOptionMap");'model option map must return a JSON object' 与 'expression must not be empty' 在 host/main/scheduler/renderer 四处 bundle 命中 |
| model-option-map/src/evaluator.ts | packages/model-option-map/src/evaluator.ts:149,156,163,177 | out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js、out/scheduler/index.js、renderer/assets/src-1E9aqq2Y.js | identical-evidence | 四条特征错误消息在四个进程 bundle 全命中 | 证据:grep 命中 'boolean operand required'、'numeric result is not JSON-safe'('input value must be a string or number' 同处) |
| model-option-map/src/index.ts | packages/model-option-map/src/index.ts:1-5 | — | unresolved | 桶文件;8 个成员中 7 个已取证,桶本身无运行时单元 | 证据:成员符号(tokenizeRestrictedCel/parseRestrictedCel/compileModelOptionMap/evaluateRestrictedCel/RestrictedCelError 等)在 main/chunk-YSD25WTT.js、host/chunk-GVBBGMXG.js、scheduler/index.js 全命中;桶级无独立证据 |
| model-option-map/src/merge-patch.ts | packages/model-option-map/src/merge-patch.ts:13-32 | zcode.cjs(仅 CLI bundle) | identical-evidence | 冲突检测错误串逐字存在于 cjs;桌面 host/main/scheduler/renderer/preload 均未包含——repo 内该函数仅被 option-maps.ts 引用、桌面路径未用而被 tree-shake,属打包裁剪非内容漂移 | 证据:zcode.cjs grep -c 'write conflicting JSON path' = 1;out/ 全目录 grep = 0(已试 'conflicting JSON path'、'Model option maps write'、'applyOrderedJsonMergePatches') |
| model-option-map/src/option-maps.ts | packages/model-option-map/src/option-maps.ts:20-34 | zcode.cjs(仅 CLI bundle) | identical-evidence | 同 merge-patch:仅 cjs 包含(r(ker,"compileModelOptionMaps")),桌面 bundle 裁剪;错误消息逐字同源 | 证据:zcode.cjs r(ker,"compileModelOptionMaps") 与 'reasoningLevel requires an effective value' 命中;out/ 各 bundle grep = 0 |
| model-option-map/src/parser.ts | packages/model-option-map/src/parser.ts:66-71,179 | 同 evaluator 四处 bundle | identical-evidence | 受限 CEL 语法拒绝消息全命中 | 证据:grep 命中 'member access is not supported'、'function calls are not supported'(及 unexpected token 分支)于 host/main/scheduler/renderer |
| model-option-map/src/tokenizer.ts | packages/model-option-map/src/tokenizer.ts:69-123 | 同 evaluator 四处 bundle | identical-evidence | 词法错误消息全命中 | 证据:grep 命中 'unterminated string literal'、'invalid number literal'(及 unsupported token/escape 分支)于 host/main/scheduler/renderer |
| model-option-map/src/types.ts | packages/model-option-map/src/types.ts:21,31 (RestrictedCelError/ModelOptionMapError) | out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js、out/scheduler/index.js、renderer/assets/src-1E9aqq2Y.js | identical-evidence | 两个运行时错误类类名在四个 bundle 命中 | 证据:grep -c RestrictedCelError/ModelOptionMapError 在三个 bundle 各 ≥1;renderer src bundle 亦命中 |
| 附带发现:desktopProviderConfig 开发态文件名分支(区域外 packages/desktop) | packages/desktop/src/main/desktopProviderConfig.ts:17-21(开发态固定 zcode-builtin.json) | out/main/index.js resolveZCodeBuiltinProviderConfigFilePath | differs | App(3.14.1)主进程解析函数为 le==="production"?"zcode-builtin.json":"zcode-builtin.test.json",仓库 3.14.0 无此条件、无 zcode-builtin.test.json 字样(全库 grep 0 命中);属 App 多出的测试清单分支,影响开发/测试态内置供应商基线来源。注:该文件不在本次分配区域(provider/provider-node/model-option-map),因直接毗邻内置清单加载链路而附带记录 | 证据:main/index.js s(DC,"resolveZCodeBuiltinProviderConfigFilePath") 前文 let r=le==="production"?"zcode-builtin.json":"zcode-builtin.test.json";return xC(e?.appPath??_C.getAppPath(),"../../config/provider",r);repo grep 'zcode-builtin.test.json' 无命中 |
区域 summary:本轮把 server 与 rpc 两个包升级为逐模块穷举对照。结论:两侧同源程度非常高——packages/rpc 的 0-3 层(VSBuffer/序列化/ChunkStream/SocketProtocol/MessagePortProtocol/ChannelServer/Client/ProxyChannel/网络遥测/日志中间件/RequestType-ResponseType 数值契约)在 App out/host/chunk-UHHNTW2R.js 中逐一命中且保留原始类名与错误文案;packages/server/src/remote 的 40 个模块几乎全部能在 chunk-5YU2OQG4.js(远程部署/资产)、chunk-JCLGGUMD.js(ssh)、chunk-3RFWSRX3.js(wsl)、chunk-AUZZ66CO.js(docker)中找到逐字符一致的函数名、错误串与目录布局。主要漂移有三类:(1) 形态漂移——仓库 http.ts 的 HTTP 服务本体不在 App 内(远端 server 由 server-bundle 下载部署),App 只保留这四个端点的客户端连接器(server-info/ws/ws-host/rpc-host-capability),而 /api/connect-remote 与 /ws/remote/:id 两条 web-remote 路由在 App 全量检索中完全消失;(2) App 独有消息/频道全量枚举完成:HostMessageTypes +3(bot-remote-workspace--result/runtime-port)、HostResponseTypes +3(bot-remote-workspace--request)、workspace-bridge-open/ready/error 3 条、ServiceChannels +4(bots/cloud-content/marketing-touch/output-style)、remoteTarget 新增 kind:"server" 连接器;(3) rpc 的 ipc.ts(IPCServer/IPCClient/StaticRouter)、delayedChannel.ts、remote.ts 在 App out 全树无保留名痕迹,persistent-protocol.ts 在 main 进程演进为 AcknowledgedRelayProtocol(新增 assemblyTimeoutMs)。仓库侧无 App 没有的消息类型;仓库 HostMessageTypes 26 条/HostResponseTypes 45 条与 App P3(29)/E3(48) 逐名比对后是 App 严格超集。
本区域 rows 共 53 条(identical-evidence 26 / skewed 10 / differs 4 / repo-only 9 / app-only 3 / unresolved 1)。覆盖口径:穷举范围:packages/server/src 顶层 11 个 ts 文件 + src/remote 40 个 ts 文件 + packages/rpc/src 16 个 ts 文件 + rpc/examples 4 个 + server 构建脚本 3 个 + 两侧消息类型清单全量(HostMessageTypes 仓库26/App P3 29;HostResponseTypes 仓库45/App E3 48;workspace-bridge- 3 条;ServiceChannels 仓库40/App 44;InternalChannels 7 条;wire 层 ProtocolMessageType 9 值 + RequestType 4 值 + ResponseType 5 值;clientMode 4 值;server 相关 ZCODE_ 环境键 14 个;server 依赖清…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| 部署形态映射:packages/server ↔ out/host | packages/server/src(entry-stdio/entry-http/http.ts + remote/) | /tmp/zcode-reverse/app/out/host/{index.js,chunk-5YU2OQG4.js} | differs | 仓库 server 包同时含 HTTP 服务与可部署 stdio 入口;App 的 out/host 是桌面宿主进程:内嵌 remote 连接/部署全量代码(chunk-5YU2OQG4.js,206 个保留函数名),但不含 HTTP server 本体。远端 server 以 server-bundle 制品在部署时下载(App index.js: "server remote target must use the server remote connector";glm/.node-bundle-meta.json: source=apps/zcode-cli/packages/cli/dist/zcode.cjs)。对照按'端点客户端 vs 服务端实现'逐条进行。 | 证据:repo build-remote.ts:31-33 entryPoints=[src/entry-stdio.ts]→dist/remote/zcode-server.cjs;App out/host/index.js PAe(): if(e.kind==="server")throw new Error("server remote target must use the server remote connector") |
| GET /api/server-info | packages/server/src/http.ts:317 | out/host/index.js RRe=fetchServerInfo | identical-evidence | App host 是该端点的消费端:GET + Bearer token 可选头 + zod 校验 serverRemoteInfoSchema,错误文案与 schema 字段(serverId/version/protocolVersion/authRequired/workspaces/capabilities)与 packages/shared/src/server-remote.ts:11-31 一致。 | 证据:App index.js: async function RRe(e,t,n){...throw new Error(Server info request failed: ${r.status})...a=jx.safeParse(s);if(!a.success)throw new Error("Server info response is invalid");repo server-remote.ts:15 protocolVersion: z.literal(SERVER_REMOTE_PROTOCOL_VERSION=1) |
| POST /api/rpc-host-capability | packages/server/src/http.ts:318 + hostCapability.ts | out/host/index.js ARe | identical-evidence | App host 以 POST 换取一次性 host capability ticket,再带 x-zcode-rpc-host-capability 头升级 /ws/host,与仓库 http.ts:336-343 的 use 守卫+upgrade 流程互为两端。capability schema {capability,expiresAt} 同源(server-remote.ts:34-39)。 | 证据:App index.js: ARe: let r=await n(ZE(e,t),{method:"POST"});if(!r.ok)throw new Error(Host capability request failed: ${r.status});chunk-GVBBGMXG.js: T3="x-zcode-rpc-host-capability" ↔ repo shared/channels.ts:497 ZCODE_RPC_HOST_CAPABILITY_HEADER |
| GET /ws(web-remote-replayable) | packages/server/src/http.ts:322-329 | out/host/index.js 端点解析 | identical-evidence | URL 拼接函数逐字保留四个端点(info/ws/capability/ws-host),stripWebSocketEndpointPath 逻辑与仓库一致;clientMode 字符串四值全部在 App host 命中。 | 证据:App index.js: r.pathname=zv(c,"/ws"),o.pathname=zv(d,"/api/rpc-host-capability"),s.pathname=zv(l,"/ws/host");Wv=stripWebSocketEndpointPath;clientMode 计数 desktop-continuous×31 / web-remote-replayable×15 / trusted-host-relay×10 / terminal-client×5 ↔ repo http.ts:87,98 |
| GET /ws/host(desktop-continuous 提权通道) | packages/server/src/http.ts:331-343 | out/host/index.js | identical-evidence | App host 侧消费 capability 并以 desktop-continuous + trusted-host-relay 角色建立连接;仓库 createHostCapabilityStore 的 30s TTL 一次性语义由 zcode-server-cli/src/server-core/hostCapability.ts 同源实现并在部署侧生效。 | 证据:App chunk-DDHSVAQM.js: trusted-host-relay×10;index.js: t.endsWith("/ws/host")?t.slice(0,-8);repo http.ts:107-116 仅 desktop-continuous 可用 IProviderProvisioningTargetService |
| POST /api/connect-remote | packages/server/src/http.ts:346-365 | — | repo-only | Web 模式发起远程连接的 REST 端点在 App 全树(out/host、out/main、out/renderer、out/preload、glm/zcode.cjs)均无命中。检索词:api/connect-remote、connect-remote、ws/remote。App 已改为 'server' kind 连接器直连(见 remoteTarget 行),不经过该中转端点。 | 证据:grep -rl 'api/connect-remote' /tmp/zcode-reverse/app/out/ → 空;zcode.cjs 仅命中 connect-remote-workspace 与 zcode:connect-remote(不同语义) |
| GET /ws/remote/:id | packages/server/src/http.ts:368-397 | — | repo-only | 远程连接 WS 桥接端点(把 File/Git/System/Terminal 四服务暴露给浏览器)在 App 全树无命中。检索词:ws/remote、remote/:id 形式的路由模板。 | 证据:grep -rl 'ws/remote' /tmp/zcode-reverse/app/out/ → 空;repo http.ts:387-391 new ServiceCollection().register(IFileService...) 为该端点专属 |
| 静态资源服务 + SPA fallback + zcode_lite_token | packages/server/src/http.ts:184,199-242,399-414 | — | repo-only | staticMimeTypes、resolveStaticFile、isTokenProtectedPath、zcode_lite_token cookie 会话鉴权均为仓库 HTTP server 专属,App out/host 无对应(App 仅有 sandbox iframe 用的小型 mime 表 v3,用途不同:CSP 'none' 内嵌页)。检索词:zcode_lite_token、spaFallback、text/css; charset=utf-8。 | 证据:grep -c 'zcode_lite_token' out/host/*.js → 0;App index.js v3={".html":"text/html; charset=utf-8",...} 上下文为 sandbox allow-scripts |
| hostCapability.ts(一次性 ticket store) | packages/server/src/hostCapability.ts:18-53 | out/host/chunk-GVBBGMXG.js T3 + index.js 消费端 | identical-evidence | 头部常量逐字一致;App 侧 issue 在部署 server 侧(本地同源实现见 zcode-server-cli/src/server-core/hostCapability.ts:172),App host 为 consume 端。 | 证据:App: T3="x-zcode-rpc-host-capability";repo shared/channels.ts:499 ZCODE_RPC_HOST_CAPABILITY_HEADER="x-zcode-rpc-host-capability";DEFAULT_HOST_CAPABILITY_TTL_MS=30_000 |
| entry-stdio.ts(可部署 server 入口) | packages/server/src/entry-stdio.ts | — | repo-only | 整个入口(hello→ack→deviceMid→services→createStdioServer→lifecycle)编译为 dist/remote/zcode-server.cjs,是部署到远端的制品;App 桌面内不携带该入口(server-bundle 走 remote-download),故 out/host 无对应。'stdio shutdown timed out' 全 App 无命中。 | 证据:build-remote.ts:31-33;grep -rl 'stdio shutdown timed out' /tmp/zcode-reverse/app/out /Applications/ZCode.app/Contents/Resources/glm → 空 |
| hello 握手协议(zcode-hello / zcode-hello-ack) | packages/server/src/remote/handshake.ts:15-95 + entry-stdio.ts:41-48 | out/host/chunk-5YU2OQG4.js performHandshake | identical-evidence | App host 作为连接方等待远端 server 的 zcode-hello 并回 zcode-hello-ack;超时与流关闭错误文案与仓库逐字符一致(含 'Handshake timeout: no zcode-hello received within timeout')。 | 证据:App chunk-5YU2OQG4.js: m("Handshake timeout: no zcode-hello received within timeout")、v.type==="zcode-hello"、'Stream closed before handshake completed' ↔ repo handshake.ts:49,95 与同文件错误串 |
| stdio.ts(wrapStdio/createStdioServer) | packages/server/src/stdio.ts:14-96 | out/host/chunk-5YU2OQG4.js wrapStdioStream | repo-only | 服务端 stdio 适配(stdout 只承载 RPC 帧)随部署入口走;App host 侧保留的是对称的 wrapStdioStream(把远端子进程 stdio 包成 ISocket)。connectionId 前缀 server-stdio-/server-ws- 在 App 未见(App 用 host-rpc- 等前缀),但 trusted-host-relay 角色保留。 | 证据:grep wrapStdioStream → chunk-5YU2OQG4.js ✓;App index.js: connectionId:host-rpc-${Fs()};chunk-DDHSVAQM.js: trusted-host-relay×10 |
| stdio-lifecycle.ts | packages/server/src/stdio-lifecycle.ts('stdio shutdown timed out'/'service-dispose') | out/host/index.js service-dispose | repo-only | 信号驱动的优雅退出编排属部署入口;App host 无该编排,但底层 disposeServiceResourcesAndWait 的 service-dispose 阶段标记在 App index.js 命中(services 包同源)。检索词:registerStdioProcessLifecycle、stdio shutdown、service-dispose。 | 证据:grep 'service-dispose' out/host/index.js → 2;grep 'registerStdioProcessLifecycle' → 0 |
| stdioServices.ts | packages/server/src/stdioServices.ts:32-49 | out/host/{index.js,chunk-5YU2OQG4.js} | skewed | createStdioServices 入口包装不在 App(随部署入口),但其三个关键环境开关同源存在于 App:ZCODE_SERVICE_AUTHORITY_MODE、ZCODE_REMOTE_RUNTIME_NETWORK_AUTHORITY + ZCODE_REMOTE_HTTP_PROXY/ZCODE_REMOTE_NO_PROXY(runtimeEnv.ts:5-8 常量逐字一致)。 | 证据:grep ZCODE_SERVICE_AUTHORITY_MODE → index.js ✓;ZCODE_REMOTE_RUNTIME_NETWORK_AUTHORITY/HTTP_PROXY/NO_PROXY → chunk-5YU2OQG4.js/index.js ✓ |
| stdioDeviceMid.ts | packages/server/src/stdioDeviceMid.ts:21-34 | out/host/index.js | skewed | ensureRemoteServerDeviceMid 函数名不在 App(远端入口专属),但同一设备身份机制完整存在:telemetry-state.json 文件与 X-Device-Mid 请求头均在 App host index.js 命中,语义与仓库注释(Start Plan billing 依赖该头)一致。 | 证据:grep 'telemetry-state.json' → index.js ✓;grep 'X-Device-Mid' → index.js×2;grep ZCODE_TELEMETRY_DEVICE_MID → ✓(repo shared/runtimeEnv.ts:85) |
| bundledZCodeBuiltinProviderConfig.ts | packages/server/src/bundledZCodeBuiltinProviderConfig.ts:11-26 | out/host/index.js ZCODE_BUILTIN_PROVIDER_CONFIG_FILE | skewed | materialize/read 包装函数不在 App(构建期嵌入宏 __ZCODE_BUILTIN_PROVIDER_CONFIG_JSON__ 属部署构建),但 ZCODE_BUILTIN_PROVIDER_CONFIG_FILE 环境键在 App host 命中,同一配置物化机制由 services 包共享。 | 证据:grep ZCODE_BUILTIN_PROVIDER_CONFIG_FILE → index.js ✓;grep materializeBundledZCodeBuiltinProviderConfig → 0 |
| entry-http.ts | packages/server/src/entry-http.ts | — | repo-only | HTTP 模式启动器(PORT/ZCODE_SERVER_HOST/ZCODE_WEB_STATIC_ROOT/ZCODE_SERVER_AUTH_TOKEN)不在 App;这些 env 键(ZCODE_SERVER_ID/NAME/WORKSPACE/TOKEN/HOST/WEB_STATIC_ROOT)在 out/host 全部无命中——它们配置的是部署侧进程。检索词逐一列出均 0 命中。 | 证据:for v in ZCODE_SERVER_ID ZCODE_SERVER_NAME ZCODE_SERVER_WORKSPACE ZCODE_SERVER_TOKEN ZCODE_SERVER_HOST ZCODE_WEB_STATIC_ROOT; do grep -lc $v out/host/*.js; done → 全空 |
| remote/connect.ts + create-backend.ts + backend.ts | packages/server/src/remote/{connect.ts:109,create-backend.ts,backend.ts} | out/host/chunk-5YU2OQG4.js + index.js PAe/setupRemoteConnection | skewed | createRemoteBackend/connectRemote/pickRemoteRuntimeEnv 三个入口函数名逐字保留,ssh/wsl/docker 三种 target 完全同源;漂移点:App 的 remoteTargetSchema 增加第四种 kind:"server"(url/tokenCredentialKey/serverId 字段)与 local/remote 会话 kind,仓库 remoteTargetSchema(shared/validation.ts:96-101)只有 ssh/wsl/docker 判别联合。 | 证据:App index.js: if(e.kind==="server")throw new Error("server remote target must use the server remote connector");chunk-GVBBGMXG.js: t.object({kind:t.literal("server"),url:t.string().url(),...,tokenCredentialKey:B.optional()});repo validation.ts:96 discriminatedUnion([ssh,wsl,docker]) |
| remote/ssh-backend.ts + sshAuth.ts + sshUploadProgress.ts | packages/server/src/remote/{ssh-backend.ts:1-613,sshAuth.ts,sshUploadProgress.ts} | out/host/chunk-JCLGGUMD.js + node_modules/ssh2 | identical-evidence | sftp 错误码集合(BAD_MESSAGE/CONNECTION_LOST/FAILURE/NO_CONNECTION/NO_SUCH_FILE/OP_UNSUPPORTED/PERMISSION_DENIED/UNKNOWN)、SSH_AUTH_SOCK agent 转发、client-authentication/client-timeout 超时标记全部在 chunk-JCLGGUMD.js 命中;ssh2 版本 App 1.17.0 ↔ repo ^1.17.0 精确一致。 | 证据:App node_modules/ssh2/package.json version=1.17.0;repo packages/server/package.json "ssh2": "^1.17.0";chunk-JCLGGUMD.js 含 SSH_AUTH_SOCK/client-authentication/OP_UNSUPPORTED |
| remote/docker-backend.ts + docker-detect.ts | packages/server/src/remote/{docker-backend.ts,docker-detect.ts:47-69} | out/host/chunk-AUZZ66CO.js | identical-evidence | Windows 可执行名候选数组与 Docker Desktop 回退路径逐字符一致;docker exec/容器列举函数名保留(execDocker/parseDockerContainerList/isDockerAvailable/normalizeDockerOutput——后者源在 packages/ui remoteConnectionDockerOptions.ts,同仓库另一包)。 | 证据:App chunk-AUZZ66CO.js: o==="win32"?["docker.exe","docker.cmd","docker.bat",x]:[x]、C:\\Program Files\\Docker\\Docker\\resources\\bin\\docker.exe ↔ repo docker-detect.ts:47,68-69 |
| remote/wsl-backend.ts + wsl-detect.ts + wslProxy.ts | packages/server/src/remote/{wsl-backend.ts,wsl-detect.ts:5,wslProxy.ts} | out/host/chunk-3RFWSRX3.js | identical-evidence | wsl.exe 命令常量、UTF-16LE 解码(decodeWslOutput/normalizeWslOutput)、发行版列表解析、代理回环替换与 resolv.conf nameserver 探测全部同源;isWslBackend 在部署 chunk 亦命中。 | 证据:App chunk-3RFWSRX3.js: Y="wsl.exe",Q=810241024、awk '$1=="nameserver" {print "resolv=" $2}'、formatWslProxyForLog/isLoopbackProxyHostname/replaceProxyHostname ↔ repo wsl-detect.ts:5,15 |
| remote/handshake.ts + posixShell.ts + closeEvent.ts + detectEnv.ts + stdio-socket.ts | packages/server/src/remote/{handshake.ts,posixShell.ts,closeEvent.ts,detectEnv.ts,stdio-socket.ts} | out/host/{chunk-5YU2OQG4.js,chunk-Y3R65CLN.js,chunk-3RFWSRX3.js} | identical-evidence | 五个基础设施模块函数名逐一保留:quotePosixShellArg(3 个 chunk 复用)、createCloseEventController、normalizeToken、wrapStdioStream、performHandshake。 | 证据:grep quotePosixShellArg → chunk-3RFWSRX3/AUZZ66CO/KSJDXDKL ✓;createCloseEventController → chunk-Y3R65CLN ✓;normalizeToken → chunk-Y3R65CLN/GVBBGMXG ✓ |
| remote/deploy.ts + deployShared.ts + remoteDeployLock.ts + serverBundleDeployCheck.ts | packages/server/src/remote/{deploy.ts:58,deployShared.ts,remoteDeployLock.ts:7-118,serverBundleDeployCheck.ts} | out/host/chunk-5YU2OQG4.js | identical-evidence | SERVER_BUNDLE_COMPONENT_ID、.deploy.lock 锁目录 + lock_heartbeat 心跳脚本、'missing required server bundle markers:' 校验串全部逐字命中;deployServer/pickRemoteRuntimeEnv 在 App index.js 的 setupRemoteConnection 以相同参数(deployLockMode/assetInstallMode/remoteAssetNetwork)调用。 | 证据:App chunk-5YU2OQG4.js: o=t.lockDir?.trim()||${M}/.deploy.lock`、$t={"server-bundle":"server-content",glm:"glm-content"}`、'missing required server bundle markers: ' ↔ repo deploy.ts:58、remoteDeployLock.ts:118、remoteAssetCache.ts:56-57 |
| remote/remoteAssetCache/Cdn/Installer/Preflight/DeployDecision/LiveIdentity/Network | packages/server/src/remote/{remoteAssetCache.ts:56,remoteAssetCdn.ts,remoteAssetInstaller.ts,remoteAssetPreflight.ts,remoteAssetDeployDecision.ts,remoteAssetLiveIdentity.ts:208,remoteAssetNetwork.ts} | out/host/chunk-5YU2OQG4.js | identical-evidence | 资产子系统 7 模块全部同源:组件目录映射 {server-bundle:server-content, glm:glm-content}、缓存布局 releases/<version>/<platformArch>/manifest-*.json、组件清单 node-runtime/node-pty/remote-download、决策串 'download required'/'upload required'(各 8 次)、函数名 resolveRemoteCdnBaseUrls/detectRemoteAssetTools/throwIfRemoteAssetInstallAborted/resolveRemoteAssetFetch 逐字保留;ZCODE_REMOTE_ASSET_CDN_BASE_URL 命中。 | 证据:App chunk-5YU2OQG4.js: D(e.remoteCacheDir,"releases",e.version,e.platformArch)、$t={"server-bundle":"server-content",glm:"glm-content"} ↔ repo remoteAssetCache.ts:56-57、remoteAssetLiveIdentity.ts:208 |
| remote/zcodeAgent*Deploy 六件套 + runtimeToolDeploy.ts | packages/server/src/remote/{zcodeAgentDeploy.ts,zcodeAgentDevDeploy.ts,zcodeAgentBundleWrapper.ts,zcodeAgentWrapperDeploy.ts:22,zcodeAgentOfficialPluginAssets.ts,zcodeAgentOfficialPluginPermissionRepair.ts,runtimeToolDeploy.ts} | out/host/chunk-5YU2OQG4.js | identical-evidence | wrapper 脚本名 zcode-agent-wrapper-${pid}-${ts}.sh、'[zcode-agent-deploy] glm:' 日志前缀、'missing official plugin manifest:'、旧插件目录权限修复(repairLegacyRemoteOfficialPluginDirectoryPermissions + 中文日志 '检查并修复旧 builtin plugin 目录权限')、dev 部署 env ZCODE_REMOTE_DEV_AGENT_BUNDLE 与内部路径 apps/zcode-cli/packages/cli/dist/zcode.cjs 全部命中。 | 证据:App chunk-5YU2OQG4.js: fn(un(),zcode-agent-wrapper-${process.pid}-${Date.now()}.sh) ↔ repo zcodeAgentWrapperDeploy.ts:22;'glm-content' 映射 ↔ remoteAssetCache.ts:57 |
| remote/remoteConnectionProgressContext.ts + remotePlatformSupport.ts + localTarGz.ts | packages/server/src/remote/{remoteConnectionProgressContext.ts,remotePlatformSupport.ts,localTarGz.ts} | out/host/{index.js,chunk-5YU2OQG4.js} | identical-evidence | createRemoteConnectionProgressContext 在 App host index.js 保留原名;assertSupportedRemoteEnvironment 在部署 chunk 保留;tar.gz 打包走相同 'set -eu' shell 模板。 | 证据:grep createRemoteConnectionProgressContext → index.js ✓;assertSupportedRemoteEnvironment → chunk-5YU2OQG4.js ✓;'set -eu' → chunk-5YU2OQG4.js ✓ |
| rpc/buffer.ts(VSBuffer) | packages/rpc/src/buffer.ts | out/host/chunk-UHHNTW2R.js | identical-evidence | VSBuffer 类在 rpc 内核 chunk 中以保留名存在,wrap/alloc/readUInt32BE 语义与仓库一致。 | 证据:grep VSBuffer → chunk-UHHNTW2R.js ✓(index.js 亦 import 使用) |
| rpc/foundation.ts(Emitter/DisposableStore) | packages/rpc/src/foundation.ts | out/host/chunk-UHHNTW2R.js | identical-evidence | Emitter 与 DisposableStore 类名保留(static{a(this,...)}),CancellationToken 家族随 chunk 分发。 | 证据:chunk-UHHNTW2R.js: a(this,"Emitter")×1、a(this,"DisposableStore")×1 |
| rpc/serialization.ts | packages/rpc/src/serialization.ts:31-47 | out/host/chunk-UHHNTW2R.js | identical-evidence | BufferReader/BufferWriter 类名保留;serialize/deserialize 的 VQL 类型标签方案随 chunk 分发。 | 证据:chunk-UHHNTW2R.js: a(this,"BufferReader")、a(this,"BufferWriter") |
| rpc/protocol.ts(ChunkStream/SocketProtocol/帧格式) | packages/rpc/src/protocol.ts:85-307 | out/host/chunk-UHHNTW2R.js | identical-evidence | 13 字节帧头(type:1+id:4+ack:4+length:4)读写序列逐字同构;'SocketProtocol 读取到完整帧长度后 body 不应为空' 错误串以 unicode 转义形式逐字存在;peek/skip 分片语义保留。 | 证据:App: e.writeUInt8(n.type,0),e.writeUInt32BE(n.id,1),e.writeUInt32BE(n.ack,5),e.writeUInt32BE(n.data.byteLength,9);'SocketProtocol 读取到完整帧长度后 body' ↔ repo protocol.ts:222-230,290 |
| ProtocolMessageType 枚举(wire 层消息类型) | packages/rpc/src/protocol.ts:195-205 | out/host/chunk-UHHNTW2R.js | skewed | 数值契约经内联后仍可辨:Regular 帧读写、KeepAlive/Disconnect/Ack 由 PersistentProtocol 使用——但 out/host 不含 PersistentProtocol(见下行),host 内仅 Regular + MessagePort flow-control 在用;完整 9 值枚举(None0/Regular1/Control2/Ack3/Disconnect5/ReplayRequest6/Pause7/Resume8/KeepAlive9)无法在 out/host 内逐一验证,同源证据在 out/main 的演进实现。 | 证据:repo protocol.ts:195-205;App chunk-UHHNTW2R.js 仅见 Regular 路径 + isMessagePortFlowControl;grep 'Ack:3|ReplayRequest' out/host → 0 |
| rpc/persistent-protocol.ts(ACK/心跳/重放/拥塞水位) | packages/rpc/src/persistent-protocol.ts:29-101 | out/main/chunk-ELJPSXCH.js AcknowledgedRelayProtocol | differs | out/host 全树无 unacknowledgedBytes/onSocketClose/getDelayedChannel 痕迹;App 在 main 进程将其演进为 AcknowledgedRelayProtocol:保留 highWaterMarkBytes/lowWaterMarkBytes/replayBufferMaxBytes/saturatedEmitter 概念(对应仓库 saturationHigh/LowWaterMarkBytes/replayBufferMaxBytes/onSaturated),新增 assemblyTimeoutMs 与 identity/sendFrame/measureFrameBytes 参数化。同源但已重构改名。 | 证据:App main/chunk-ELJPSXCH.js: a(this,"AcknowledgedRelayProtocol")...highWaterMarkBytes;lowWaterMarkBytes;replayBufferMaxBytes;assemblyTimeoutMs;grep acknowledgedBytes out/host → 0;repo persistent-protocol.ts:31-38 |
| rpc/channels.shared.ts(RequestType/ResponseType 数值契约) | packages/rpc/src/channels.shared.ts:18-31 | out/host/chunk-UHHNTW2R.js | identical-evidence | wire 数值逐一经内联常量验证:客户端 sendRequest(100)=Promise、sendRequest(102)=EventListen;服务端 type===100 未知频道应答、{type:200} Initialize、{type:201} PromiseSuccess、type:202/203/204 各命中。 | 证据:App: sendRequest(100,i,e,t,s)、sendRequest(102,r,e,t,s)、e.type===100&&this.sendResponse(..."Unknown channel")、{type:200}、type:201 ↔ repo Promise=100/EventListen=102/Initialize=200/PromiseSuccess=201 |
| rpc/channelServer.ts + channelClient.ts | packages/rpc/src/{channelServer.ts,channelClient.ts} | out/host/chunk-UHHNTW2R.js | identical-evidence | 两类名保留,registerChannel/getChannel/Unknown channel 分派逻辑同构;LoggingChannelServer 包装后日志格式逐字一致。 | 证据:chunk-UHHNTW2R.js: a(this,"ChannelServer")、a(this,"ChannelClient");LoggingChannelServer: this.logger([rpc:register] channel "${e}") ↔ repo logging-middleware.ts:86 |
| rpc/logging-middleware.ts | packages/rpc/src/logging-middleware.ts:79,143 | out/host/chunk-UHHNTW2R.js | skewed | LoggingChannelServer 同源(见上);LoggingChannelClient 在 out/host 与 out/main 均无保留名命中——应为 host 场景死代码消除(客户端侧日志包装只在渲染进程需要),无法在 bundle 内证伪。 | 证据:grep LoggingChannelClient out/host/.js out/main/.js → 0;LoggingChannelServer → chunk-UHHNTW2R.js ✓ |
| rpc/network-telemetry-middleware.ts | packages/rpc/src/network-telemetry-middleware.ts:29-141 | out/host/chunk-UHHNTW2R.js | skewed | setNetworkTelemetrySink/emitNetworkTelemetryObservation 函数名与 NetworkTelemetryChannelServer 类名保留,遥测批次经 HostResponseTypes.NetworkTelemetryBatch 上报(两侧同名);NetworkTelemetryChannelClient 变体在 out/host 无命中(同上死代码消除推断)。 | 证据:chunk-UHHNTW2R.js: fe(n){Z=n}a(fe,"setNetworkTelemetrySink")、a(this,"NetworkTelemetryChannelServer");E3/P3: NetworkTelemetryBatch ↔ repo shared/channels.ts:633 |
| rpc/ipc.ts(IPCServer/IPCClient/StaticRouter) | packages/rpc/src/ipc.ts:95-318 | — | differs | 三个类在全 App out(host/main/preload/renderer)均无保留名命中。App 的 MessagePort RPC 直接用 MessagePortProtocol+ChannelServer/Client 组合,未带 1:N IPCServer 路由层。检索词:IPCServer、IPCClient、StaticRouter、getDelayedChannel。 | 证据:grep -rl 'IPCServer|IPCClient|StaticRouter' /tmp/zcode-reverse/app/out/ → 空;对照 chunk-UHHNTW2R.js 同类保留名均在(说明保留名机制有效,缺席非压缩所致) |
| rpc/delayedChannel.ts | packages/rpc/src/delayedChannel.ts:4 | — | unresolved | getDelayedChannel 函数名与 DelayedChannel 类名在全 App out 无命中。函数可能被内联/重命名(17 行小函数无 static 块可保留名),无法判定删除还是改名。检索词:getDelayedChannel、DelayedChannel、getChannel().then 模式。 | 证据:grep -rl 'getDelayedChannel|DelayedChannel' /tmp/zcode-reverse/app/out/ → 空;对照 repo delayedChannel.ts 仅 17 行 |
| rpc/proxy-channel.ts(ProxyChannel.fromService/toService) | packages/rpc/src/proxy-channel.ts:46,106 | out/host/{chunk-UHHNTW2R.js,chunk-DDHSVAQM.js} | identical-evidence | fromService/toService 双向代理函数保留;ServiceCollection.exposeOnChannelServer 的实现(遍历服务并 registerChannel(n, ProxyChannel.fromService(service)))在 chunk-DDHSVAQM.js 逐字同构。 | 证据:App chunk-DDHSVAQM.js: o.registerChannel(n,k.fromService(l)) + exposeOnChannelServer(o,r=new Map){for(let[n,i]of this._services) ↔ repo collection.ts:13-18 + proxy-channel.ts |
| rpc/remote.ts(RemoteAgentConnection/WebSocketRemoteConnection/RemoteSocketFactoryService 等) | packages/rpc/src/remote.ts:44-263 | — | differs | remote.ts 的六个导出(WebSocketRemoteConnection/ManagedRemoteConnection/RemoteAuthorityResolverService/RemoteSocketFactoryService/createURITransformer/RemoteAgentConnection)在全 App out 无保留名命中。App 的 ws 远程连接改由 index.js 内联的 wrapNodeWebSocket + fetchServerInfo + server remote connector 承担。检索词:RemoteAgentConnection、RemoteSocketFactoryService、createURITransformer、WebSocketRemoteConnection。 | 证据:grep -rl 全 out → 空;App index.js: i(_Re,"wrapNodeWebSocket")(repo 无此名,grep wrapNodeWebSocket packages/ → 0) |
| protocol.ts MessagePortFlowControl(connection-flow-v1) | packages/rpc/src/protocol.ts:41-58 | out/host/chunk-UHHNTW2R.js | identical-evidence | 哨兵对象 __zcodeRpcControl:"connection-flow-v1" 与 saturated/drained 双状态校验逐字一致(含'两键对象'的严格形状检查)。 | 证据:App: Object.keys(e).length===2&&e.__zcodeRpcControl==="connection-flow-v1"&&(e.state==="saturated"||e.state==="drained") ↔ repo protocol.ts:50-58 |
| HostMessageTypes 全量(main→host 消息类型) | packages/shared/src/channels.ts:505-536(26 条) | out/host/chunk-GVBBGMXG.js P3(29 条) | skewed | 逐名比对:仓库 26 条(database-startup-control/init-local/connect-remote-workspace/cancel-remote-workspace-connect/bind-remote-workspace-context/dispose-remote-workspace-session/attach-service-port/detach-service-port/dispose/broadcast/broadcast-claim-result/task-realtime-deliver/task-run-lease-result/task-owner-command-deliver/task-owner-command-result/session-message-deliver/session-message-delivery-result/feedback-log-archive-result/cron-run/off-peak-run/browser-execute-result/local-media-preview-path-authorize-result/cua-pip-focus-changed/provider-provisioning-execute/resource-usage-snapshot-request/resource-usage-sna… | 证据:App chunk-GVBBGMXG.js P3={DatabaseStartupControl:"database-startup-control",...,BotRemoteWorkspaceReconnectResult:"bot-remote-workspace-reconnect-result",...};repo 侧 grep BotRemoteWorkspace → 0 |
| HostResponseTypes 全量(host→main 消息类型) | packages/shared/src/channels.ts:559-641(45 条) | out/host/chunk-GVBBGMXG.js E3(48 条) | skewed | 逐名比对:仓库 45 条全部在 App 同名同值(含 database-startup-state/remote-workspace-五件/log/agent-process-五件/资源遥测七件/broadcast-claim 三件/task-run-lease 两件/cron+off-peak 四件/session-message 两件/network-telemetry-batch/provider-provisioning 两件);App 多 3 条 bot-remote 请求类消息。仓库是 App 的严格子集,无仓库独有消息类型。 | 证据:App E3={DatabaseStartupState,...,NetworkTelemetryBatch,ProviderProvisioningSourceChanged,ProviderProvisioningExecutionResult} 共 48 值;repo 45 值逐一匹配(python 全量比对) |
| App 独有消息:bot-remote-workspace-*(6 条) | — | out/host/chunk-GVBBGMXG.js | app-only | 全量枚举:bot-remote-workspace-reconnect-request、bot-remote-workspace-reconnect-result、bot-remote-workspace-connection-status-request、bot-remote-workspace-connection-status-result、bot-remote-workspace-runtime-port-request、bot-remote-workspace-runtime-port。zod schema 亦仅在 App(type+requestId+workspacePath+workspaceIdentity+target)。仓库全无(grep BotRemoteWorkspace/bot-remote-workspace packages/ → 0)。对应 App 的 Bots 多开远端工作区重连/状态/运行时端口能力。 | 证据:grep -oh '"bot-remote[^"]"' .js → 恰 6 条;chunk-GVBBGMXG.js: ZD=t.object({type:t.literal("bot-remote-workspace-reconnect-request"),requestId:S,workspacePath:S,workspaceIdentity:S,target:$o,...}) |
| App 独有消息:workspace-bridge-*(3 条) | — | out/host/chunk-GVBBGMXG.js | app-only | 全量枚举:workspace-bridge-open、workspace-bridge-ready、workspace-bridge-error。走 zcode_type 字段(renderer bridge 风格)+ requestId + bridgeSessionId + bridgeGeneration。仓库唯一痕迹是 desktop/src/main/networkTelemetryAggregator.ts:127 的 "workspace-bridge" 遥测 source 标签(内部版遗留),无消息类型定义。 | 证据:grep -oh '"workspace-bridge[^"]"' .js → 恰 3 条;t.object({zcode_type:t.literal("workspace-bridge-open"),requestId:S,bridgeSessionId:Ne,bridgeGeneration:t.number().int().nonnegative(...) |
| ServiceChannels 服务频道注册表(40 vs 44) | packages/shared/src/channels.ts:74-151(40 条) | out/host/chunk-GVBBGMXG.js(44 条) | skewed | 全量比对:仓库 40 条(file/media-preview/system/terminal/git/git-checkpoint/setting/credential/cua-permission/cua-pip-session/broadcast/zcode-task/window-controller/zcode-agent/zcode-session/conversation-share/file-watcher/oauth/provider-settings/model-selection/provider-provisioning-target/usage-stats/coding-plan-subscription/client-config/client-scenes/skills/skill-sync/mcp-sync/plugin-sync/plugins/plugin-management/subagents/commands/hooks/memory/settings-sync/feedback/prompt-attachment-transfer/off-peak-task/onboarding-record)在 App 全部同名;App 多 4 条:bots、cloud-content、marketing-touch、output-style(四者在仓库全树 grep 均为 0)。注册机制… | 证据:App chunk-GVBBGMXG.js: ...SettingsSync:"settings-sync",Bots:"bots",Feedback:"feedback",PromptAttachmentTransfer:"prompt-attachment-transfer",OffPeakTask:"off-peak-task",OnboardingRecord:"onboarding-record";grep '"bots"|"cloud-content"|"marketing-touch"|"output-style"' packages/ → 0 |
| InternalChannels(zcode:* 内部传输频道) | packages/shared/src/channels.ts:482-493(7 条) | out/preload/index.cjs + out/renderer/assets + out/main | identical-evidence | zcode:database-startup-state/control、zcode:service-port、zcode:scoped-service-port(-ready)、zcode:task-notification-sound 在 App 的 preload/renderer/main 命中;database-startup-control 裸值亦在 host chunk-GVBBGMXG.js 与 main chunk-YSD25WTT.js 命中(host↔main 走 P3/E3 裸值,preload 边界走 zcode: 前缀)。 | 证据:grep -rl 'zcode:scoped-service-port' out/ → preload/index.cjs、renderer/assets/src-1E9aqq2Y.js、main/chunk-YSD25WTT.js |
| App 独有 /api/* 端点串(非 host 路由) | — | out/host/index.js | app-only | 全量列出 App host 内除四个 server 端点外的 /api 串:/api/anthropic、/api/auth/z/login、/api/biz(+/customer/getCustomerInfo、/subscription/list)、/api/intranet/probe、/api/monitor/usage/quota/limit、/api/oauth/authorize、/api/oauth/userinfo、/api/pay、/api/v1(/client/configs、/client/scenes、/coding-plan/reset、/marketing/touch(+/action)、/mcp/usage、/oauth/cli/init、/oauth/token、/off-peak/anthropic/v1/messages、/off-peak/ticket(3 变体)、/zcode-plan/billing/claim|preview)。上下文核验为上游 Z.ai 服务与本地探针的客户端 URL(tokenUrl/probe URL 拼接),非 host 提供的 HTTP 路由。 | 证据:index.js: tokenUrl:qn(e,"BIGMODEL_OAUTH_TOKEN_URL")??ba(e,"/api/v1/oauth/token");SW="/api/intranet/probe",mie=${wW}:${vW}${SW}` |
| clientMode 四值语义 | packages/server/src/http.ts:87,98 + stdio.ts:64-65 | out/host/index.js + chunk-DDHSVAQM.js | identical-evidence | desktop-continuous ↔ trusted-host-relay、web-remote-replayable/terminal-client 组合完全一致;App 侧 web-remote-replayable 还驱动 resumeModelPolicy/draft session 降级等行为(App 侧扩展逻辑)。 | 证据:App 计数 desktop-continuous×31、web-remote-replayable×15、trusted-host-relay×10、terminal-client×5;w.clientMode==="web-remote-replayable"&&w.resumeModelPolicy!=="ui-resolved-only" |
| server 依赖清单对照 | packages/server/package.json dependencies(22 项) | /tmp/zcode-reverse/app/node_modules/ | identical-evidence | 13 项逐一核对版本:ssh2 1.17.0(^1.17.0)、ws 8.20.0、undici 6.24.1、yaml 2.9.0、yauzl 3.3.0、yazl 3.3.1、axios 1.13.6、combined-stream 1.0.8、follow-redirects 1.16.0、form-data 4.0.5、node-forge 1.4.0、proxy-from-env 1.1.0 全部精确一致;@hono/node-server 1.19.14(^1.19.11)、@hono/node-ws 1.3.0、hono 4.12.12(^4.12.9)、node-pty 1.1.0(^1.0.0) 在 semver 范围内小幅前移。 | 证据:node_modules/{ssh2,hono,ws,undici,yaml,yauzl,yazl,axios,...}/package.json 版本输出 ↔ packages/server/package.json |
| ZCODE_REMOTE_DEV_AGENT_BUNDLE dev 部署链路 | packages/server/src/remote/zcodeAgentDevDeploy.ts | out/host/chunk-5YU2OQG4.js | identical-evidence | env 键与内部 monorepo 产物路径 apps/zcode-cli/packages/cli/dist/zcode.cjs 双双命中——同时证明 App 的 glm/zcode.cjs 正是该内部路径的产物(.node-bundle-meta.json source 字段互证)。 | 证据:grep ZCODE_REMOTE_DEV_AGENT_BUNDLE → chunk-5YU2OQG4.js ✓;/Applications/ZCode.app/.../glm/.node-bundle-meta.json: "source":"apps/zcode-cli/packages/cli/dist/zcode.cjs" |
| rpc/index.ts 导出面 + examples/ | packages/rpc/src/index.ts(六层导出)+ examples/01-04 | out/host/chunk-UHHNTW2R.js | repo-only | 导出中 0-3 层全部在 App 内联同源(见各行);Layer 4-6(ipc.ts/remote.ts/persistent-protocol)在 App host 缺席或演进(见对应行)。examples/ 四个演示脚本为开发文件,App 不携带,属预期 repo-only。 | 证据:ls packages/rpc/examples/ → 01-basic-ipc/02-proxy-channel/03-ipc-server-client/04-remote-connection;App 无 examples 概念 |
| server 构建脚本(build-remote.ts/buildRemoteValidation.ts/tsup.config.ts) | packages/server/{build-remote.ts:31-58,buildRemoteValidation.ts,tsup.config.ts} | — | repo-only | 开源仓的自有构建编排(esbuild 打包 entry-stdio → zcode-server.cjs)在 App 无对应——App 由内部 monorepo apps/zcode-cli 管道产出,构建产物路径与命名即差异证据。 | 证据:build-remote.ts:33 outfile:"dist/remote/zcode-server.cjs" ↔ App .node-bundle-meta.json entry:"zcode.cjs" source:"apps/zcode-cli/..." |
区域 summary:对 packages/services/src 全部 298 个源文件按 47 个模块单元做了穷举对照:从每个文件提取独特字符串(含 \uXXXX 转义中文)、导出符号名、RPC 方法名与 SQL 语句,在 /tmp/zcode-reverse/app/out/host 与 out/main 全量检索,298 个文件全部取得产物侧证据,两侧同源结论得到全量而非抽样确认。重点核对 gitService:push/commit/branch 方法链在 host/index.js 中逐字节同构——push 的 detached-HEAD 守卫、trackingBranch 分支、--set-upstream 兜底、超时常量 106e4/81024*1024 与 commit 的 zcode-git-index- 临时索引链、switchBranch 的 conflicts-present/operation-in-progress/check-ref-format 校验全部一致。唯一实质差异是 App 侧 ServiceChannels 为 44 个(仓库 40 个),多出 bots、cloud-content、marketing-touch、output-style 四个 App-only 服务及对应 createBotsService 等工厂符号,与先前"Bots/私有功能为 App 独有"的结论吻合。未发现 repo-only 服务或逻辑漂移(differs)项。
本区域 rows 共 59 条(identical-evidence 53 / skewed 1 / app-only 5)。覆盖口径:穷举枚举了 packages/services/src 下全部 298 个 .ts 源文件、按 47 个可枚举模块单元归组(git/ 17 个文件单独拆为 9 行,其中 push/commit/branch 链路 3 行)。检索方法:从每个源文件自动提取字符串字面量(含 \uXXXX 大写转义中文)、导出符号名(bundle 保留 static{i(this,"Name")} 注解)、接口 RPC 方法名(bundle 中未加引号对象键)、SQL 建表语句,共三轮全量 grep 于 out/host 17 个 chunk+index+tasksStorageWorker、out/main 19 个 chunk+index+3 个 worker、out/scheduler。结果:298 文件全部取得至少一条产物侧命中证据;仓库 40 个 ServiceChannels 全部在 App 命中,…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| git/gitService.ts(push 链路) | packages/services/src/git/gitService.ts:312-315 → git/repo/gitCliRepo.ts:1638-1672 | out/host/index.js | identical-evidence | bundle 中 async push(S) 与仓库逐字对应:getStatus → ensureRepositoryAvailable("push changes") → headRefType!=="branch" 抛 "Cannot push while HEAD is detached." → 有 tracking 时 ["push"],否则 ["push","--set-upstream",remote??"origin",branch] → timeoutMs=EL、maxOutputBytes=TL → dt("git push") → invalidate → getStatus 返回 {branchName,trackingBranchName,remoteName,setUpstream,summary} | 证据:host/index.js 命中 args:D?["push"]:["push","--set-upstream",U??"origin",A],timeoutMs:EL,maxOutputBytes:TL;Cannot push while HEAD is detached. |
| git/gitCliRepo.ts(push remote 解析) | packages/services/src/git/repo/gitCliRepo.ts:672-707 | out/host/index.js | identical-evidence | resolvePushRemote 链完全一致:branch.<name>.remote → remote.pushDefault → remotes 含 origin 取 origin → 唯一 remote → 0 个抛 "No Git remote is configured for the current repository." → 多个抛 "Multiple Git remotes are configured. Configure branch.<name>.remote or remote.pushDefault first." | 证据:host/index.js 命中 let A=await f(k,branch.${C}.remote);if(A)return A;let D=await f(k,"remote.pushDefault") 及上述两条错误串原文 |
| git/gitCliRepo.ts(commit 链路) | packages/services/src/git/repo/gitCliRepo.ts:1488-1636 | out/host/index.js | identical-evidence | stagedOnly 路径逐字一致:git status --porcelain=v2 -z 限定路径 → ls-files --stage → 冲突检查抛 "Cannot commit selected staged paths while index conflicts exist." → mkdtemp(join(tmpdir(),"zcode-git-index-")) 临时索引 → read-tree parentHash/--empty → update-index --force-remove/--add --cacheinfo → commit -m → reset --quiet HEAD -- paths → finally rm;常规路径 ["commit","-m",U,"--",...paths] → rev-parse HEAD。空消息守卫 "Commit message cannot be empty" 同在 | 证据:host/index.js 命中 zcode-git-index-、["commit","-m",U,"--",...j]:["commit","-m",U]、dt("git commit selected staged paths",Se) |
| git/gitCliRepo.ts(branch 链路) | packages/services/src/git/repo/gitCliRepo.ts:1071-1230 | out/host/index.js | identical-evidence | switchBranch/createBranchAndSwitch 一致:conflicts-present("Repository still has unresolved conflicts.")、operation-in-progress("Another Git operation is still in progress.")、check-ref-format --branch 校验、["switch","--no-guess",name] 与 ["switch","--no-guess","-c",name,"--",startPoint] 参数逐字命中 | 证据:host/index.js 各命中 1 次:no-guess、check-ref-format、两条冲突/进行中错误串 |
| git/config.ts | packages/services/src/git/config.ts:3-16 | out/host/index.js | identical-evidence | 四个 git 超时/配额常量在 bundle 中以内联数值精确同源;Windows git.exe 候选路径 C:\Program Files 同样命中 | 证据:bundle EL=106e4(DEFAULT_GIT_PUSH_TIMEOUT_MS)、TL=810241024(PUSH_OUTPUT_BYTES)、Pt=15e3、xn=5121024,与仓库 15_000/1060_000/5121024/810241024 相等 |
| git/gitCommitMessageGenerator.ts | packages/services/src/git/gitCommitMessageGenerator.ts | out/host/index.js | identical-evidence | 提示词与 gitService 错误串原样存在;DIFF_FILE_LIMIT=8 截断逻辑伴随 getCommitMessageDiffQueries 出现 | 证据:host/index.js 命中 (diff unavailable; infer only from the changed file summar…、Commit message generation is not available.、There are no changes available to commit. |
| git/gitCheckpointService.ts | packages/services/src/git/gitCheckpointService.ts | out/host/index.js | identical-evidence | checkpoint 服务与 createCheckpoint/diffCheckpoints/restoreBetweenCheckpoints/deleteCheckpoint 四个 RPC 方法名全部在 bundle 命中 | 证据:host/index.js 命中 Checkpoint workspace scope mismatch.;createCheckpoint/diffCheckpoints/restoreBetweenCheckpoints 各 2 次 |
| git/repo/gitCheckpointRepo/Helpers/Store | packages/services/src/git/repo/gitCheckpointRepo.ts、gitCheckpointHelpers.ts、gitCheckpointStore.ts | out/host/index.js、out/host/chunk-DDHSVAQM.js | identical-evidence | checkpoint 的 git plumbing(ls-tree/read-tree/checkpoint 分支)与引用标识同源 | 证据:命中 git ls-tree checkpoint paths(gitCheckpointRepo)、ZCode Checkpoint(gitCheckpointHelpers) |
| git/providers/gitCommandProvider+gitEnvironmentProvider | packages/services/src/git/providers/gitCommandProvider.ts、gitEnvironmentProvider.ts | out/host/index.js | identical-evidence | git 二进制解析与环境净化链路同源 | 证据:host/index.js 命中 Git binary is not available、--version |
| git/commitMessageFileScope.ts | packages/services/src/git/commitMessageFileScope.ts | out/host/index.js | identical-evidence | 会话文件过滤函数在 bundle 保留全名,与 gitService.generateCommitMessage 调用点同链路 | 证据:host/index.js 命中 filterCommitMessageFilesByCurrentSession |
| git/git.ts + gitCheckpoint.ts(接口/描述符) | packages/services/src/git/git.ts:82、gitCheckpoint.ts | out/host/index.js、host/chunk-GVBBGMXG.js | identical-evidence | 接口方法名以 bundle 对象键形式全部命中(getRepositorySummary/getWorkspaceRepositoryInfo/getLocalBranches/getCommitGraph/switchBranch/createBranchAndSwitch/getChanges/getIgnoredPaths/getDiff/getBranchComparison/stagePaths/unstagePaths/discardPaths/generateCommitMessage/commit/push/getIdentity/refresh) | 证据:频道 "git"、"git-checkpoint" 在 host/chunk-GVBBGMXG.js ServiceChannels 对象中;18 个方法名各 1-2 次命中 |
| ServiceChannels 频道清单(40 个) | packages/shared/src/channels.ts:74-150 | out/host/chunk-GVBBGMXG.js | skewed | 仓库 40 个频道(file/media-preview/system/terminal/git/git-checkpoint/setting/credential/cua-permission/cua-pip-session/broadcast/zcode-task/window-controller/zcode-agent/zcode-session/conversation-share/file-watcher/oauth/provider-settings/model-selection/provider-provisioning-target/usage-stats/coding-plan-subscription/client-config/client-scenes/skills/skill-sync/mcp-sync/plugin-sync/plugins/plugin-management/subagents/commands/hooks/memory/settings-sync/feedback/prompt-attachment-transfer/off-peak-task/onboarding-record)在 App ServiceChannels 对象中逐一存在;漂移内容为 App 多 4 个频道(见 app-only 行) | 证据:host/chunk-GVBBGMXG.js 提取 {File:"file",…,OnboardingRecord:"onboarding-record"} 共 44 项;仓库同对象 40 项 |
| Bots 服务(app-only) | — | out/host/index.js、host/chunk-GVBBGMXG.js、main/chunk-DLYU5YW3.js | app-only | 频道 Bots:"bots" 在仓库 channels.ts 中不存在;createBotsService/createBotRemoteWorkspaceService 在整个仓库(packages/+apps/)grep 无命中,对应已知私有 Bots 功能 | 证据:bundle 命中 Bots:"bots"、createBotsService、createBotRemoteWorkspaceService;仓库检索 Bots: 无结果 |
| CloudContent 服务(app-only) | — | out/host/chunk-GVBBGMXG.js、main/chunk-YSD25WTT.js、scheduler/index.js | app-only | 频道与 createCloudContentService 工厂均为 App 独有 | 证据:bundle 命中 CloudContent:"cloud-content"、createCloudContentService;仓库无 |
| MarketingTouch 服务(app-only) | — | out/host/chunk-GVBBGMXG.js、main/chunk-YSD25WTT.js、scheduler/index.js | app-only | 频道与 createMarketingTouchService 工厂均为 App 独有 | 证据:bundle 命中 MarketingTouch:"marketing-touch"、createMarketingTouchService;仓库无 |
| OutputStyle 服务(app-only) | — | out/host/chunk-GVBBGMXG.js、main/chunk-YSD25WTT.js、scheduler/index.js | app-only | 频道与 createOutputStyleService 工厂均为 App 独有 | 证据:bundle 命中 OutputStyle:"output-style"、createOutputStyleService;仓库无 |
| App 独有 host 运行时工厂(desktop host 层,超出本区域但经此暴露) | — | out/host/index.js | app-only | createRemoteRuntimeServicesFromPort、createRuntimeServicesFromPort、createLaunchServicesLauncher、createServerRemoteWorkspaceServiceCollection 在仓库 packages/desktop/src/host/* 中也无命中(repo 侧仅有 createRemoteWorkspaceServiceCollection);createUnsupportedRemoteConversationShareService 为仓库 createUnsupportedConversationShareService(conversation-share/conversationShare.ts)的 App 侧远端变体 | 证据:comm 差集输出 17 个 App 多余符号,其中 6 个全仓库 grep REPO-MISSING |
| zcode-agent/ 组(29 文件) | packages/services/src/zcode-agent/*.ts | out/host/index.js、chunk-DDHSVAQM/GVBBGMXG/OPKMCWQ2/UHHNTW2R | identical-evidence | 29 个文件全部命中:协议传输、stdio tap、任务适配、presentation surface、浏览器 ambient、错误类等;中文日志以 \uXXXX 大写转义形式存在 | 证据:命中 ZCode agent stdio transport is closed、zcode-stdio-tap.json、ZCodeV4CommandRejectedError、startup_status_timeout、ZCode Protocol session/create 兼容重试后设置 thoughtLevel 完成(\u 转义)、web-remote-replayable、desktop-continuous、fault.connection.flowControlForbidden |
| zcode-task 适配(zcodeTaskServiceAdapter.ts) | packages/services/src/zcode-agent/zcodeTaskServiceAdapter.ts | out/host/index.js | identical-evidence | 适配器中文日志原样存在(转义形式),[zcode-task-service] logger 前缀在 bundle 中出现 | 证据:host/index.js 命中 同步 task rename 到 v4 session store 失败,保留 task-index 标题(转义 形式)、Review this implementation plan.、Ke=Pe("zcode-task-service") |
| session/automation*(4 文件) | packages/services/src/session/automationService.ts、automationCron.ts、automationCronValidation.ts、automationIntervalCarrier.ts、automationRepo.ts | out/host/index.js、host/chunk-OPKMCWQ2.js | identical-evidence | 四个 Invalid/Stale 错误类名与中文消息逐字同源(bundle 用大写十六进制 \u 转义,此前小写探测误判为缺失);intervalUnit carrier 校验逻辑标识符命中 | 证据:host/index.js 清空 maxRuns 时必须在同一次更新中设置 recurring=true(=仓库 automationService.ts:50)、非法的定时任务调度规则:${t}、InvalidAutomationIntervalCarrierError、StaleOneShotAutomationScheduleError |
| session/tasksDatabase/(6 文件) | packages/services/src/session/tasksDatabase/schema-v1.ts、migrations.ts、prepared.ts、startup.ts、provider-selection-v2.ts、official-glm-selection-v3.ts | out/host/chunk-OPKMCWQ2.js、out/host/tasksStorageWorker.js | identical-evidence | 8 张建表语句逐一命中,外加 migrations.ts 的 tasks_schema_migration 元表;official-glm-selection-v3 的模型白名单 SQL(json_extract + 22 个模型 ID)同源 | 证据:host/chunk-OPKMCWQ2.js 命中 CREATE TABLE IF NOT EXISTS tasks/task_groups/task_group_members/task_group_view_node_orders/task_group_workspace_bootstraps/automations/automation_runs/off_peak_tasks/tasks_schema_migration、json_extract×4、account:zai-start-plan、glm-5.3-flash、glm-4.6v-flashx |
| session/claude-native/(12 文件) | packages/services/src/session/claude-native/*.ts | out/host/index.js、chunk-GVBBGMXG/OPKMCWQ2/UHHNTW2R | identical-evidence | Claude 原生会话导入链路 12 文件全部命中 | 证据:命中 claude-native-import、claude-import-、<synthetic>、Imported session、claudeCode、messages[].model |
| session/offPeak*(5 文件) | packages/services/src/session/offPeakTask.ts、offPeakTaskRepo.ts、offPeakTaskService.ts、offPeakServerClient.ts、offPeakMockGateway.ts、offPeakRuntimeModel.ts | out/host/index.js、chunk-OPKMCWQ2.js | identical-evidence | 闲时任务服务的接口方法(pauseTask/continueTask/deleteHistory/getCodingPlanSupport/getTakeNumberAvailability)与错误串全部命中;频道 off-peak-task 在 App ServiceChannels | 证据:host/index.js 命中 off-peak scheduler wake failed after create:、off-peak request rejected、mock gateway handler failed:、off-peak mock upstream requires a selected coding plan pro… |
| session/ 其余(mailbox/realtime/title/taskChangeSummary/taskIndexRepo/mcpWorkspaceScope/legacyTaskSessionFile/zcodeTaskService/zcodeTaskListTypes) | packages/services/src/session/*.ts | out/host/index.js、chunk-3RFWSRX3/DDHSVAQM/OPKMCWQ2、tasksStorageWorker.js | identical-evidence | 任务列表服务、邮箱、realtime 端口、标题生成、task index SQL 全部命中 | 证据:命中 SELECT group_id FROM task_groups、@modelcontextprotocol/server-filesystem、enqueue_task_command、safeParseLegacyTaskSessionFile、modelExecution、Generate a concise title for this coding session. |
| model-provider/(26 文件) | packages/services/src/model-provider/*.ts | out/host/index.js、chunk-GVBBGMXG/UHHNTW2R | identical-evidence | 凭证、请求鉴权、provisioning、legacy 导入、JWT、计费全部命中;ProviderProvisioningExecutor 系列符号同源 | 证据:命中 AccountRequestCredentialUnavailableError、legacy gemini format is not supported by zcode.model-provi…、Team Plan runtime key projection skipped: project not foun…、oauth:active_provider、Personal Provider Config 在读取期间发生变化、Credential Store 必须是 JSON 对象、bigmodel-organization、`ensureBigMode… |
| oauth/(14 文件) | packages/services/src/oauth/*.ts 及 providers/、repo/ | out/host/index.js、chunk-GVBBGMXG/UHHNTW2R | identical-evidence | IOAuthService 8 方法(handleCallback/logoutAll/pollPendingOAuth/restoreCachedSession/getActiveProvider 等)与 provider adapter 方法全部命中 | 证据:命中 https://chat.z.ai/api/oauth/authorize、zcode://oauth/callback、BIGMODEL_OAUTH_APP_ID、zcode token business response rejected、clear derived provider keys after corrupt OAuth session fa…、restoreCachedSession restored:、ApiClient 注入缺失:OAuth provider adapters 必须通过 Providers 传入 apiClient(\u… |
| providers/ + providers/api/(10 文件) | packages/services/src/providers/** | out/host/index.js、chunk-GVBBGMXG | identical-evidence | API 端点、JSON 解析、网络错误分类、请求头、zai 业务 token 全部命中 | 证据:命中 /api/v1/client/scenes、Invalid JSON response、UND_ERR_CONNECT_TIMEOUT、zcode endpoint request headers prepared、Configured Host proxy URL is invalid、zai_oauth_required、withRequestIdHeaderRecord |
| credential/(3 文件) | packages/services/src/credential/credentialService.ts、credential.ts、providers/credentialCipherProvider.ts | out/host/index.js、host/chunk-GVBBGMXG.js | identical-evidence | 频道 "credential" 在 App ServiceChannels;服务实现与加密 provider 环境变量命中 | 证据:host/index.js 命中 read failed; refusing to overwrite corrupt credential stor…、ZCODE_CREDENTIAL_SECRET |
| cua-permission-broker/(9 文件) | packages/services/src/cua-permission-broker/*.ts | out/host/index.js、chunk-OPKMCWQ2/GVBBGMXG | identical-evidence | CUA 权限代理、PiP 会话、Windows dev helper、admission gate 全部命中;频道 cua-permission/cua-pip-session 在 App ServiceChannels | 证据:命中 [cua-pip-session] replay of deferred turn-started failed、Invalid Windows Computer Use Helper control message、focus-changed、[cua-pip-session] wiring resolved、ZCode agent process start was cancelled. |
| conversation-share/(8 文件) | packages/services/src/conversation-share/*.ts | out/host/index.js | identical-evidence | 8 文件全部命中,错误串逐字一致 | 证据:命中 Conversation changed while preparing share、Conversation share JSON cannot contain undefined values、Active subagents cannot be shared、conversation share API upstream unavailable、Conversation artifact download timed out、Shared context artifact was not installed |
| conversation-telemetry/ + official-mcp/ + remote-sync/ | packages/services/src/conversation-telemetry/conversationTelemetry.ts、official-mcp/*.ts、remote-sync/remoteSyncWriteAccess.ts | out/host/chunk-DDHSVAQM.js、host/index.js、chunk-OPKMCWQ2.js | identical-evidence | 遥测事实回调、官方 MCP 凭证与审计、远端写权限检查全部命中 | 证据:命中 onDynamicConversationTelemetryFact、official mcp credentials resolved、checkRemoteSyncDirectoriesWriteAccess、markFirst(officialMcpIssuanceAudit) |
| feedback/(6 文件) | packages/services/src/feedback/*.ts | out/host/index.js、chunk-OPKMCWQ2/3RFWSRX3 | identical-evidence | 工单存储、日志归档、HTTP 客户端全部命中;频道 "feedback" 在 App ServiceChannels | 证据:命中 Missing feedback device_mid、tickets.json、Scope: diagnostic text log files modified today (local tim…、prepareCompactLogArchive |
| file/(5 文件) | packages/services/src/file/fileService.ts、file.ts、workspaceFileIgnore.ts、workspaceFileMentionFilter.ts、workspaceFileSearch.ts | out/host/index.js | identical-evidence | 文件服务、忽略规则、mention 过滤、搜索全部命中 | 证据:命中 Workspace name cannot contain path separators.、storybook-static/、bower_components、sync-gitignore |
| fileWatcher/(2 文件) | packages/services/src/fileWatcher/fileWatcher.ts、fileWatcherService.ts | out/host/chunk-DDHSVAQM.js、host/index.js | identical-evidence | 接口方法 onDynamicChange 与实现符号命中;频道 "file-watcher" 在 App ServiceChannels | 证据:命中 resolveFileWatchChangedPath、onDynamicChange、fileWatcher |
| fs/(2 文件) | packages/services/src/fs/atomicFileUtils.ts、fsFaultInjection.ts | out/host/chunk-DDHSVAQM.js、host/index.js | identical-evidence | 原子写与故障注入环境变量命中 | 证据:命中 zcodeFsFaultId、rename |
| hooks/(4 文件) | packages/services/src/hooks/*.ts | out/host/index.js、chunk-GVBBGMXG | identical-evidence | hooks 服务、信任存储、设置模型全部命中;saveHooks 在 bundle 中以 saveHooksImpl 形式存在 | 证据:命中 workspace-hook-trust-v1.json、trusted_persistent、Workspace Hook Trust store 不可读,已 fail-closed 忽略全部持久信任记录、saveHooksImpl |
| skills/(3 文件) | packages/services/src/skills/*.ts | out/host/index.js、chunk-DDHSVAQM/OPKMCWQ2 | identical-evidence | 技能发现遍历与服务全部命中;频道 "skills" 在 App ServiceChannels | 证据:命中 walkSkillMarkdownPaths、discoverSkills、skills-audit.log |
| skill-sync/(5 文件) | packages/services/src/skill-sync/*.ts | out/host/index.js | identical-evidence | ISkillSyncService 方法(exportSkillsArchive/importSkillsArchive/listRemoteUserSkillStatuses 等)与错误类全部命中;频道 "skill-sync" 在 App ServiceChannels | 证据:命中 SKILL.md is missing、truncated skill sync archive、SkillSyncSizeLimitError、unsafe skill sync path |
| mcp-sync/(2 文件) | packages/services/src/mcp-sync/mcpSync.ts、mcpSyncService.ts | out/host/index.js | identical-evidence | IMcpSyncService 方法(exportMcpServers/listWorkspaceMcpServerStatuses/listRemoteUserMcpStatuses 等)命中;频道 "mcp-sync" 在 App ServiceChannels | 证据:命中 [mcp-sync] legacy enable migration failed:、exportMcpServers、listWorkspaceMcpServerStatuses、listRemoteUserMcpStatuses |
| plugin-sync/(4 文件) | packages/services/src/plugin-sync/*.ts | out/host/index.js | identical-evidence | 归档安全、路径安全、marketplace 元数据校验全部命中;频道 "plugin-sync" 在 App ServiceChannels | 证据:命中 unsafe plugin archive path、unsafe plugin sync path、invalid plugin marketplace source metadata |
| plugins/(5 文件) | packages/services/src/plugins/*.ts | out/host/index.js、chunk-DDHSVAQM | identical-evidence | IPluginsService 方法(getOverview/addMarketplace/installPlugin/uninstallPlugin/setPluginEnabled)与管理服务命中;频道 "plugins"/"plugin-management" 在 App ServiceChannels | 证据:命中 installed_plugins.json、restoreBuiltinPlugin、Legacy plugin management has been retired in ZCode Agent m…、normalizeSubagentModelSelection 旁证同 chunk |
| commands/(3 文件) | packages/services/src/commands/*.ts | out/host/index.js、main/chunk-YSD25WTT.js | identical-evidence | 命令文件解析与写入失败处理命中;频道 "commands" 在 App ServiceChannels | 证据:命中 Failed to parse written command file、[importCommandFile] Windows 硬链接创建成功(settings-sync 内同链路) |
| memory/ + memoryDiagnostics.ts | packages/services/src/memory/*.ts、memoryDiagnostics.ts | out/host/index.js、chunk-DDHSVAQM/UHHNTW2R | identical-evidence | 项目内存服务与诊断注册命中;频道 "memory" 在 App ServiceChannels | 证据:命中 Invalid Project Memory path、PROJECT_MEMORY_FILE_CHANGED、collectServiceMemoryDiagnostics、registerMemoryDiagnosticsProvider、readProjectMemoryFileFromStableHandle |
| setting/(6 文件) | packages/services/src/setting/*.ts | out/host/index.js、chunk-GVBBGMXG | identical-evidence | 设置服务、写队列、legacy 迁移全部命中;频道 "setting" 在 App ServiceChannels | 证据:命中 reading settings from:、ZCODE_SETTING_WRITE_QUEUE_TIMEOUT_MS、modelProviderFamilySelectedKeys、httpProxyNoProxy、providerFamilyConnectionSelections、onDidUpdate |
| settings-sync/(2 文件) | packages/services/src/settings-sync/*.ts | out/host/index.js、chunk-DDHSVAQM、main/chunk-DLYU5YW3.js | identical-evidence | 首次启动设置同步与 Claude AGENTS.md 迁移命中;频道 "settings-sync" 在 App ServiceChannels | 证据:命中 [settings-sync] Claude AGENTS.md migration completed、[importCommandFile] Windows 硬链接失败,回退到复制模式 |
| storage/(11 文件) | packages/services/src/storage/** | out/main/index.js、main/chunk-DLYU5YW3.js、storageScanWorker.js、zcodeDataSizeWorker.js、host/chunk-3RFWSRX3/OPKMCWQ2/GVBBGMXG | identical-evidence | 目录清理、扫描 job、卷探测、usage 聚合、catalog 全部命中;worker 文件与仓库 storageService 扫描链路对应 | 证据:命中 storage scan aborted、EOUTSIDE、subagentTranscripts、credentials.json、createFsVolumeProbe、createStorageUsageAccumulator、dataBaseDir |
| subagents/(5 文件) | packages/services/src/subagents/*.ts | out/host/index.js | identical-evidence | subagent markdown、存储、模型选择、服务全部命中;频道 "subagents" 在 App ServiceChannels | 证据:命中 agent_missing_frontmatter、agents-state.json、Name can only contain letters, numbers, and hyphens、normalizeSubagentModelSelection |
| system/(4 文件) | packages/services/src/system/*.ts | out/host/index.js | identical-evidence | ISystemService 方法(listIntegratedTerminalShells/probeIntranet)与 shell 探测命中;频道 "system" 在 App ServiceChannels | 证据:命中 service returned ok=false、C:\Program Files\Git\bin\bash.exe、listIntegratedTerminalShells、probeIntranet |
| terminal/(5 文件) | packages/services/src/terminal/*.ts | out/host/index.js、chunk-DDHSVAQM | identical-evidence | conpty、macOS Terminal 配置、shell 启动全部命中;频道 "terminal" 在 App ServiceChannels | 证据:命中 conpty、Code - Insiders、Startup Window Settings、No usable shell found for terminal startup |
| process/(10 文件) | packages/services/src/process/*.ts | out/host/index.js、chunk-OPKMCWQ2/GVBBGMXG | identical-evidence | 进程树快照/终止/等待/采样、Windows CIM 与 taskkill、runtime 生命周期全部命中 | 证据:命中 Get-CimInstance Win32_Process | ForEach-Object { '{0} {1} …、windows-utc-us:、taskkill、watchdog_recycle、Windows runtime 进程树 graceful cleanup flight settled(\u 转义) |
| runtime-tools/(9 文件) | packages/services/src/runtime-tools/*.ts | out/host/index.js、chunk-GVBBGMXG/OPKMCWQ2 | identical-evidence | 代理环境、CA 证书、平台探测、login shell 环境捕获、工具解析全部命中 | 证据:命中 ZCode Network CA、ZCODE_TEST_RELEASE_TARGET、ALL_PROXY、__ZCODE_LOGIN_ENV_START__、%ProgramFiles(x86)%\nodejs、bundled-resources |
| usage-stats/(7 文件) | packages/services/src/usage-stats/** | out/host/index.js | identical-evidence | IUsageStatsService 8 方法与 BigModel/Zcode MCP 配额 provider 全部命中;频道 "usage-stats" 在 App ServiceChannels | 证据:命中 getAppUsageStats、/api/biz/subscription/list、/api/v1/mcp/usage、BigModel tool usage failed、coding_plan_usage_custom_range_invalid_order、TIME_LIMIT、Search MCP |
| bigmodel/(2 文件) | packages/services/src/bigmodel/codingPlanEntitlement.ts、teamPlanApiKey.ts | out/host/index.js、chunk-GVBBGMXG | identical-evidence | 团队 API key 预热与个人 entitlement 函数全名命中 | 证据:命中 ensureBigModelTeamPlanProjectApiKeyWithStatus、fetchPersonalCodingPlanEntitlement、bigmodel-organization |
| coding-plan-subscription/(4 文件) | packages/services/src/coding-plan-subscription/*.ts | out/host/index.js、chunk-GVBBGMXG/DDHSVAQM | identical-evidence | 订阅购买服务与 bigmodel/zai provider 命中;频道 "coding-plan-subscription" 在 App ServiceChannels | 证据:命中 Team Plan project api key prewarm result、individual-coding-plan、start plan |
| broadcast/(2 文件) | packages/services/src/broadcast/broadcast.ts、broadcastService.ts | out/host/index.js、chunk-GVBBGMXG/DDHSVAQM | identical-evidence | 跨窗口广播服务工厂命中;频道 "broadcast" 在 App ServiceChannels | 证据:命中 createBroadcastService、acquired(lock 语义) |
| client-config/ + client-scenes/(4 文件) | packages/services/src/client-config/.ts、client-scenes/.ts | out/host/index.js、chunk-GVBBGMXG | identical-evidence | 公共配置超时与场景服务命中;频道 client-config/client-scenes 在 App ServiceChannels;IClientConfigService/IClientScenesService 为纯类型,方法面经频道与 apiEndpoints(/api/v1/client/scenes)旁证 | 证据:命中 Public client config request timed out、/api/v1/client/scenes |
| onboarding/(2 文件) | packages/services/src/onboarding/onboardingRecord.ts、onboardingRecordService.ts | out/host/index.js、chunk-GVBBGMXG | identical-evidence | onboarding 记录读写命中;频道 "onboarding-record" 在 App ServiceChannels | 证据:命中 onboardingOccupation、read onboarding record failed: |
| 顶层基础设施(accessor/collection/descriptors/index/node/paths/storage-startup/logger/device/telemetry/window-controller/media-preview/prompt-attachment-transfer/types) | packages/services/src/{accessor,collection,descriptors,index,node,paths,storage-startup,logger/serviceLogger,device/deviceMid,telemetry/telemetryCore,window-controller/windowController,media-preview/mediaPreview,prompt-attachment-transfer/*… | out/host/index.js、chunk-DDHSVAQM/46AC3RUY、main/chunk-DLYU5YW3.js | identical-evidence | ServiceCollection/createServiceDescriptor 基础设施、pip 会话接线、网络传输注册、遥测锁、窗口控制器、媒体预览、附件预传全部命中;yazl.d.ts 为纯类型声明,经 feedback 压缩归档(prepareCompactLogArchive 使用 zip)旁证 | 证据:命中 createServiceDescriptor、ServiceCollection、registerHostApiNetworkTransportForDispose、[cua-pip-session] wiring resolved、Telemetry state lock timeout、delete-archived、host-range-url、createLocalPromptAttachmentTransferService、createServiceLogger、telemetry-state.json |
| window-controller/(单列) | packages/services/src/window-controller/windowController.ts | out/host/index.js | identical-evidence | 聚合投影与归档删除动作命中;频道 "window-controller" 在 App ServiceChannels | 证据:命中 delete-archived;频道命中 host/index.js + chunk-GVBBGMXG.js |
区域 summary:两侧协议同源且 App 为仓库的严格超集:七个协议对象中任何共有键的值零漂移(VALUE-DIFF 全空),仓库无任何 App 缺失的频道或消息类型。App 共多出 19 个私有协议单元:ServiceChannels 多 4 个服务频道(bots/cloud-content/marketing-touch/output-style,host 内均有 createBotsService/createCloudContentService/createMarketingTouchService/createOutputStyleService 实现函数),PlatformChannels 多 9 个频道(8 个 Web Remote Control 远程控制频道 + 1 个 BotRemoteWorkspaceReconnected),main↔host 的 HostMessageTypes 多 3 个 BotResult、HostResponseTypes 多 3 个 BotRequest,构成 App 独有的 Bot 远程工作区与 Web 远程控制功能面。仓库侧唯一的 app 缺失项是被标记 @deprecated 的 x-zcode-rpc-client-mode 请求头常量,App bundle 已整体移除。.InternalChannels、两个 WebView 频道对象及 x-zcode-rpc-host-capability 常量两侧完全一致。
本区域 rows 共 34 条(identical-evidence 8 / differs 4 / repo-only 1 / app-only 21)。覆盖口径:全量枚举了仓库 packages/shared/src/channels.ts 的全部 7 个协议对象:ServiceChannels(40)、PlatformChannels(128)、HostMessageTypes(26)、HostResponseTypes(45)、InternalChannels(6)、EmbeddedBrowserWebviewChannels(1)、CodingPlanWebviewChannels(1),以及 2 个 RPC header 常量,仓库侧合计 249 个可枚举单元(含常量)。App 侧对应提取自 out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js、out/main/index.js、out/preload/index.cjs(及 codingPlanWebview/cuaPermissio…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| ServiceChannels 共有 40 键(组归并) | packages/shared/src/channels.ts:74-149 | out/host/chunk-GVBBGMXG.js var w3={...};out/main/chunk-YSD25WTT.js var UU={...} | identical-evidence | 40 个共有键逐键同值且相对键序一致:file, media-preview, system, terminal, git, git-checkpoint, setting, credential, cua-permission, cua-pip-session, broadcast, zcode-task, window-controller, zcode-agent, zcode-session, conversation-share, file-watcher, oauth, provider-settings, model-selection, provider-provisioning-target, usage-stats, coding-plan-subscription, client-config, client-scenes, skills, skill-sync, mcp-sync, plugin-sync, plugins, plugin-management, subagents, commands, hooks, memory, settings-sync, feedback, prompt-attachment-transfer, off-peak-task, onboarding-record | 证据:repo channels.ts:74 export const ServiceChannels = {File:"file",...};app host/chunk-GVBBGMXG.js var w3={File:"file",MediaPreview:"media-preview",...,OnboardingRecord:"onboarding-record"},全对象 44 键中 40 键与仓库逐一匹配 |
| ServiceChannels.CloudContent = "cloud-content" | (无) | out/host/chunk-GVBBGMXG.js / out/main/chunk-YSD25WTT.js ServiceChannels 对象 | app-only | App 独有服务频道,插在 ClientScenes 与 MarketingTouch 之间;host/index.js 有实现函数 createCloudContentService(含 cacheRoot 清理逻辑) | 证据:host/chunk-GVBBGMXG.js ClientScenes:"client-scenes",CloudContent:"cloud-content",MarketingTouch:"marketing-touch";host/index.js i(IN,"createCloudContentService") |
| ServiceChannels.MarketingTouch = "marketing-touch" | (无) | out/host/chunk-GVBBGMXG.js / out/main/chunk-YSD25WTT.js ServiceChannels 对象 | app-only | App 独有服务频道(营销触达),紧随 CloudContent;host/index.js 有实现函数 createMarketingTouchService(含 fetch+_.object({code:_.literal(0)}).parse 校验) | 证据:host/chunk-GVBBGMXG.js CloudContent:"cloud-content",MarketingTouch:"marketing-touch",Skills:"skills";host/index.js i(EN,"createMarketingTouchService") |
| ServiceChannels.OutputStyle = "output-style" | (无) | out/host/chunk-GVBBGMXG.js / out/main/chunk-YSD25WTT.js ServiceChannels 对象 | app-only | App 独有服务频道(输出风格管理),插在 Memory 与 SettingsSync 之间;host/index.js 有 createOutputStyleService(setActiveStyle/getActiveStyle),并读写 ~/.claude/output-styles | 证据:host/chunk-GVBBGMXG.js Memory:"memory",OutputStyle:"output-style",SettingsSync:"settings-sync";host/index.js sDirectory:a,setActiveStyle:t,getActiveStyle:e}}i(pf,"createOutputStyleService")、Ua(hA(),".claude","output-styles") |
| ServiceChannels.Bots = "bots" | (无) | out/host/chunk-GVBBGMXG.js / out/main/chunk-YSD25WTT.js / out/scheduler/index.js ServiceChannels 对象 | app-only | App 独有服务频道(Bot 管理),插在 SettingsSync 与 Feedback 之间;host/index.js 有 createBotsService 及 bot-state.v3.json 持久化、importLegacyBotConfig、{version:3,bots:[...]} zod schema 等完整实现 | 证据:host/chunk-GVBBGMXG.js SettingsSync:"settings-sync",Bots:"bots",Feedback:"feedback";host/index.js Vb="bot-state.v3.json"、i(B$,"createDefaultBotsConfig")、i(up,"createBotsService") |
| ServiceChannels 对象整体 | packages/shared/src/channels.ts:74-149(40 键) | host/chunk-GVBBGMXG.js、main/chunk-YSD25WTT.js、scheduler/index.js、renderer/assets/src-1E9aqq2Y.js(均为 44 键) | differs | App 为仓库严格超集:44 = 40 + 4(cloud-content/marketing-touch/output-style/bots),无 repo-only 键,共有键值零漂移;App 内部 4 处副本(host/main/scheduler/renderer,renderer 为反引号模板字符串写法)键集完全一致 | 证据:三向 diff 结果 REPO-ONLY=[] VALUE-DIFF=[];renderer src-1E9aqq2Y.js CloudContent:cloud-content,MarketingTouch:marketing-touch``;scheduler/index.js 副本解析同样 44 键 |
| PlatformChannels 共有 128 键(组归并) | packages/shared/src/channels.ts:158-424 | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs 的 PlatformChannels 对象(两者 JSON 级全等) | identical-evidence | 128 个共有键逐键同值:zcode:select-directory, zcode:select-file, zcode:select-files, zcode:create-temp-text-attachment, zcode:save-file, zcode:print-to-pdf, zcode:remote-connection-log, zcode:remote-session-closed, zcode:activate-or-set-workspace, zcode:connect-remote, zcode:cancel-pending-remote-connection, zcode:bind-remote-workspace-session-context, zcode:dispose-remote-session, zcode:is-docker-available, zcode:list-wsl-distros, zcode:list-docker-containers, zcode:list-ssh-config-aliases, zcode:load-mcp-from-user-directory, zcode:save-mcp-to-user-directory, zcode:log, zcode:sync-window-tabs, zcode:sync-window-unread-co… | 证据:main 与 preload 提取对象 JSON.stringify 全等(main==preload:true),三向 diff REPO-ONLY=[] VALUE-DIFF=[],UNPARSED=[] |
| PlatformChannels.BotRemoteWorkspaceReconnected = "zcode:bot-remote-workspace-reconnected" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有 Electron IPC 频道,插在 RemoteSessionClosed 之后,Bot 远程工作区重连完成通知 | 证据:main/chunk-YSD25WTT.js RemoteSessionClosed:"zcode:remote-session-closed",BotRemoteWorkspaceReconnected:"zcode:bot-remote-workspace-reconnected",ActivateOrSetWorkspace:... |
| PlatformChannels.StartWebRemoteControl = "zcode:start-web-remote-control" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有 Web 远程控制频道:启动 web 端远程控制配对 | 证据:main/chunk-YSD25WTT.js PlatformChannels 137 键对象内 StartWebRemoteControl:"zcode:start-web-remote-control" |
| PlatformChannels.ResetWebRemoteControlPairing = "zcode:reset-web-remote-control-pairing" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:重置 web 远程控制配对 | 证据:同上对象 ResetWebRemoteControlPairing:"zcode:reset-web-remote-control-pairing" |
| PlatformChannels.StopWebRemoteControl = "zcode:stop-web-remote-control" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:停止 web 远程控制 | 证据:同上对象 StopWebRemoteControl:"zcode:stop-web-remote-control" |
| PlatformChannels.GetWebRemoteControlStatus = "zcode:get-web-remote-control-status" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:查询 web 远程控制状态 | 证据:同上对象 GetWebRemoteControlStatus:"zcode:get-web-remote-control-status" |
| PlatformChannels.WebRemoteControlStatusChanged = "zcode:web-remote-control-status-changed" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:web 远程控制状态变化推送(Main → Renderer) | 证据:同上对象 WebRemoteControlStatusChanged:"zcode:web-remote-control-status-changed" |
| PlatformChannels.SyncWebRemoteControlWorkspaces = "zcode:sync-web-remote-control-workspaces" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:同步可被 web 远程控制的 workspace 列表 | 证据:同上对象 SyncWebRemoteControlWorkspaces:"zcode:sync-web-remote-control-workspaces" |
| PlatformChannels.SyncWebRemoteControlTasks = "zcode:sync-web-remote-control-tasks" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:同步 web 远程控制可见的 task 列表 | 证据:同上对象 SyncWebRemoteControlTasks:"zcode:sync-web-remote-control-tasks" |
| PlatformChannels.WebRemoteControlReconnectWorkspace = "zcode:web-remote-control-reconnect-workspace" | (无) | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs PlatformChannels 对象 | app-only | App 独有:从 web 端触发 workspace 重连 | 证据:同上对象 WebRemoteControlReconnectWorkspace:"zcode:web-remote-control-reconnect-workspace" |
| PlatformChannels 对象整体 | packages/shared/src/channels.ts:158-424(128 键) | main/chunk-YSD25WTT.js、preload/index.cjs、codingPlanWebview.cjs、cuaPermissionPanel.cjs、resourceManager.cjs、embeddedBrowserJavaScriptDialog.cjs(137 键);rewardsWebview.cjs 不含该对象 | differs | App 为仓库严格超集:137 = 128 + 9(1 个 Bot 重连通知 + 8 个 Web Remote Control 频道),无 repo-only 键、共有键值零漂移;main 与 5 个 preload 变体中 4 个(index/codingPlanWebview/cuaPermissionPanel/resourceManager/embeddedBrowserJavaScriptDialog)副本一致为 137 键,rewardsWebview.cjs 按需打包未含 PlatformChannels | 证据:diff 结果 REPO-ONLY=[] VALUE-DIFF=[];start-web-remote-control 在 index/codingPlanWebview/cuaPermissionPanel/resourceManager/embeddedBrowserJavaScriptDialog 中各 1 次、rewardsWebview 中 0 次;rewardsWebview.cjs select-directory:0、File:"file":0 |
| HostMessageTypes 共有 26 键(组归并) | packages/shared/src/channels.ts:505-556 | out/host/chunk-GVBBGMXG.js var P3={...};out/main/chunk-YSD25WTT.js var ZU={...} | identical-evidence | 26 个共有键逐键同值且相对键序一致:database-startup-control, init-local, connect-remote-workspace, cancel-remote-workspace-connect, bind-remote-workspace-context, dispose-remote-workspace-session, attach-service-port, detach-service-port, dispose, broadcast, broadcast-claim-result, task-realtime-deliver, task-run-lease-result, task-owner-command-deliver, task-owner-command-result, session-message-deliver, session-message-delivery-result, feedback-log-archive-result, cron-run, off-peak-run, browser-execute-result, local-media-preview-path-authorize-result, cua-pip-focus-changed, provider-provisioning-execute, resource-usage-snaps… | 证据:host/chunk-GVBBGMXG.js var T3="x-zcode-rpc-host-capability",P3={DatabaseStartupControl:"database-startup-control",...ResourceUsageSnapshotCancel:"resource-usage-snapshot-cancel"};diff REPO-ONLY=[] VALUE-DIFF=[] |
| HostMessageTypes.BotRemoteWorkspaceReconnectResult = "bot-remote-workspace-reconnect-result" | (无) | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostMessageTypes 对象 | app-only | main → host 消息,Bot 远程工作区重连结果,插在 TaskOwnerCommandResult 与 BotRemoteWorkspaceConnectionStatusResult 之间 | 证据:host/chunk-GVBBGMXG.js TaskOwnerCommandResult:"task-owner-command-result",BotRemoteWorkspaceReconnectResult:"bot-remote-workspace-reconnect-result",BotRemoteWorkspaceConnectionStatusResult:... |
| HostMessageTypes.BotRemoteWorkspaceConnectionStatusResult = "bot-remote-workspace-connection-status-result" | (无) | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostMessageTypes 对象 | app-only | main → host 消息,Bot 远程工作区连接状态查询结果 | 证据:同上对象,紧随 BotRemoteWorkspaceReconnectResult 之后 |
| HostMessageTypes.BotRemoteWorkspaceRuntimePort = "bot-remote-workspace-runtime-port" | (无) | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostMessageTypes 对象 | app-only | main → host 消息,下发 Bot 远程工作区 runtime MessagePort;App 内 scheduler/index.js 与 renderer/src-1E9aqq2Y.js 也有对应 zod schema(e.literal("bot-remote-workspace-runtime-port")) | 证据:scheduler/index.js kR=e.object({type:e.literal("bot-remote-workspace-runtime-port"),requestId:w,ok:e.boolean(),error:e.string().optional()}) |
| HostMessageTypes 对象整体 | packages/shared/src/channels.ts:505-556(26 键) | host/chunk-GVBBGMXG.js P3 与 main/chunk-YSD25WTT.js ZU(29 键) | differs | App 为仓库严格超集:29 = 26 + 3(BotRemoteWorkspace*Result/RuntimePort),无 repo-only 键、共有键值零漂移;与先前粗审计结论 29/26 吻合 | 证据:三向 diff REPO-ONLY=[] VALUE-DIFF=[],两侧 host/main 副本键序完全一致 |
| HostResponseTypes 共有 45 键(组归并) | packages/shared/src/channels.ts:559-646 | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostResponseTypes 对象 | identical-evidence | 45 个共有键逐键同值且相对键序一致:database-startup-state, remote-workspace-connection-log, remote-workspace-connected, remote-workspace-connect-failed, remote-workspace-closed, log, agent-process-spawned, agent-process-ready, agent-process-exited, agent-process-error, agent-process-exception, agent-resource-sample, host-resource-sample, mcp-telemetry, mcp-resource-samples, tool-exec-resource, session-create-telemetry, resource-usage-snapshot-result, agent-running-task-count-changed, workspace-running-task-count-changed, cua-operation-state, remote-workspace-acquired, broadcast, broadcast-claim-request, broadcast-claim-commit, b… | 证据:host/main 两侧对象全文提取比对,diff REPO-ONLY=[] VALUE-DIFF=[],UNPARSED=[] |
| HostResponseTypes.BotRemoteWorkspaceReconnectRequest = "bot-remote-workspace-reconnect-request" | (无) | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostResponseTypes 对象 | app-only | host → main 消息,Bot 请求重连远程工作区,插在 TaskOwnerCommandResult 与 BotRemoteWorkspaceConnectionStatusRequest 之间;scheduler 有 zod schema | 证据:main/chunk-YSD25WTT.js HostResponseTypes 对象 TaskOwnerCommandResult:"task-owner-command-result",BotRemoteWorkspaceReconnectRequest:"bot-remote-workspace-reconnect-request",... |
| HostResponseTypes.BotRemoteWorkspaceConnectionStatusRequest = "bot-remote-workspace-connection-status-request" | (无) | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostResponseTypes 对象 | app-only | host → main 消息,Bot 查询远程工作区连接状态 | 证据:同上对象,紧随 BotRemoteWorkspaceReconnectRequest 之后 |
| HostResponseTypes.BotRemoteWorkspaceRuntimePortRequest = "bot-remote-workspace-runtime-port-request" | (无) | out/host/chunk-GVBBGMXG.js 与 out/main/chunk-YSD25WTT.js HostResponseTypes 对象 | app-only | host → main 消息,Bot 申请 runtime MessagePort,携带 workspacePath/workspaceIdentity/target;scheduler/index.js 有 zod schema a1 | 证据:scheduler/index.js a1=e.object({type:e.literal("bot-remote-workspace-runtime-port-request"),requestId:w,workspacePath:w,workspaceIdentity:w,target:_s}) |
| HostResponseTypes 对象整体 | packages/shared/src/channels.ts:559-646(45 键) | host/chunk-GVBBGMXG.js 与 main/chunk-YSD25WTT.js(48 键) | differs | App 为仓库严格超集:48 = 45 + 3(BotRemoteWorkspace*Request),无 repo-only 键、共有键值零漂移;与先前粗审计结论 48/45 吻合 | 证据:三向 diff REPO-ONLY=[] VALUE-DIFF=[] |
| InternalChannels 全部 6 键 | packages/shared/src/channels.ts:482-493 | out/main/chunk-YSD25WTT.js 与 out/preload/index.cjs InternalChannels 对象 | identical-evidence | 两侧完全一致(6=6),键值与键序均同:database-startup-state, database-startup-control, service-port, scoped-service-port, scoped-service-port-ready, task-notification-sound | 证据:main/chunk-YSD25WTT.js 与 preload/index.cjs 中 `DatabaseStartupState:"zcode:database-startup-state",DatabaseStartupControl:"zcode:database-startup-control",ServicePort:"zcode:service-port",ScopedServicePort:"zcode:scoped-service-port",ScopedServicePortReady:"zcode:scoped-service-port-ready",TaskNotifi… |
| EmbeddedBrowserWebviewChannels.WheelBoundary = "zcode:embedded-browser-wheel-boundary" | packages/shared/src/channels.ts:433-436 | out/preload/embeddedBrowserJavaScriptDialog.cjs var Mv={...} | identical-evidence | 内置 WebView 滚动边界转发频道,两侧一致(1=1) | 证据:preload/embeddedBrowserJavaScriptDialog.cjs Id:"zcode:get-device-id"},Mv={WheelBoundary:"zcode:embedded-browser-wheel-boundary"} |
| CodingPlanWebviewChannels.PurchaseComplete = "zcode:coding-plan-purchase-complete" | packages/shared/src/channels.ts:451-454 | out/preload/codingPlanWebview.cjs var Nv={...} | identical-evidence | Coding Plan 官网页购买完成回传频道,两侧一致(1=1) | 证据:preload/codingPlanWebview.cjs var Nv={PurchaseComplete:"zcode:coding-plan-purchase-complete"} |
| ZCODE_RPC_HOST_CAPABILITY_HEADER = "x-zcode-rpc-host-capability" | packages/shared/src/channels.ts:498 | out/host/chunk-GVBBGMXG.js var T3 | identical-evidence | desktop /ws/host 握手能力头,两侧同值 | 证据:host/chunk-GVBBGMXG.js var T3="x-zcode-rpc-host-capability",P3={DatabaseStartupControl:...};repo channels.ts:498 同值 |
| ZCODE_RPC_CLIENT_MODE_HEADER = "x-zcode-rpc-client-mode" | packages/shared/src/channels.ts:496(@deprecated 注释明确 /ws 已忽略该头) | (无) | repo-only | 仓库保留的旧客户端兼容常量,App bundle 已整体移除。已检索 host(index+4 chunks)、main(index+19 chunks+workers)、preload(7 个 cjs)、renderer/assets/src-1E9aqq2Y.js、scheduler(3 个文件),0 命中 | 证据:repo channels.ts:496 export const ZCODE_RPC_CLIENT_MODE_HEADER = "x-zcode-rpc-client-mode";app 侧 grep -rl x-zcode-rpc-client-mode out/host out/main out/preload out/renderer/assets/src-1E9aqq2Y.js out/scheduler 无输出 |
| App 独有 4 个服务的实现函数(Bots/CloudContent/MarketingTouch/OutputStyle) | (无对应实现) | out/host/index.js | app-only | 4 个 app-only 服务频道在 App host 进程中均有命名保留的实现工厂与配套持久化:createBotsService(bot-state.v3.json、importLegacyBotConfig)、createCloudContentService、createMarketingTouchService、createOutputStyleService(读写 ~/.claude/output-styles),证明新频道非死枚举 | 证据:host/index.js:i(IN,"createCloudContentService")、i(EN,"createMarketingTouchService")、i(pf,"createOutputStyleService")、i(up,"createBotsService")、Vb="bot-state.v3.json" |
| Bot* 消息的 zod schema 佐证(scheduler + renderer) | (无对应 schema) | out/scheduler/index.js、out/renderer/assets/src-1E9aqq2Y.js | app-only | 6 个 BotRemoteWorkspace* 消息类型在 scheduler 与 renderer 的共享 chunk 中均有 e.literal(...) zod 校验 schema(含 requestId/workspacePath/workspaceIdentity/target 字段),另 8 个 Web Remote Control 频道在 main/preload 5 个副本中均存在,交叉证明私有协议面真实接线 | 证据:scheduler/index.js kR=e.object({type:e.literal("bot-remote-workspace-runtime-port"),...})、a1=e.object({type:e.literal("bot-remote-workspace-runtime-port-request"),requestId:w,workspacePath:w,workspaceIdentity:w,target:_s});grep -rl bot-remote-workspace-runtime-port 命中 host/main/scheduler/rendere… |
区域 summary:对 packages/ui 做了逐目录穷举对照:src 下 37 个一级组件目录全部建立仓库侧→产物侧证据链,src 顶层 126 个文件做了“每文件一独特字符串”自动全扫描(初判缺失的 3 个复核后均落实)。清单型数据完成全量比对:shared/src/test-ids.ts 的 361 个 testid 逐一在产物 grep(301 命中、60 个为仓库侧死常量被摇树剔除);产物侧反向提取 418 个静态 data-testid,其中 24 个真 App 独有(cloud-dialog/rewards/web-remote-control/marketing/docx-editor-viewer);i18n zh-CN 5591 个键 100% 存在于产物 IntlProvider chunk,产物反多 530 个键(bots 259、webRemoteControl 104、manualClaimPlan 53、mode 38 等,对应私有功能);二进制资产(icon-glm PNG、task-notification-pop.mp3)md5 逐字节一致。发现的漂移集中在:components/ui 的 30 个 data-slot 缺失(accordion/plan/button-group 等子组件被摇树或裁剪)、ai-elements/prompt-input.tsx 本地附件校验分支文案整体缺失、CodingPlanUsageRemainingPanel 与 SettingsSyncSelectionStep 的局部类名漂移。结论:两侧同源且忠实度极高,App 仅在私有功能(Bots/网页远程控制/奖励/领取套餐/多智能体)与局部样式、死代码上超出或偏离仓库。
本区域 rows 共 2 条(identical-evidence 2)。覆盖口径:实际枚举:packages/ui/src 下一级目录 37 个全部逐条对照(app-shell 68 文件、assets 46、browser-use 15、chat-input-toolbar 17、command-center 2、components 151(含 ui/ 45 个 shadcn 原件与 ai-elements/ 46 个)、cua-permission 1、feedback 19、git-action-menu 2、git-branch-switcher 3、git-graph 6、GitPane 2(另含 GitPane.tsx/GitPaneChangeCard.tsx)、hooks 98、i18n 5、lib 237、login 2、mentions 24、onboarding 22、presentation 6、prompt-editor 4、quickpic…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| test-id 清单 · shared/src/test-ids.ts 361 项 → 产物命中 301 项 | packages/shared/src/test-ids.ts:1-732 | /tmp/zcode-reverse/app/out/renderer/assets/*.js(2713 个 chunk 全量 grep -F) | identical-evidence | 361 个注册 testid 中 301 个在产物所有 JS chunk 中逐一命中(含 login-api-key-button、git-commit-dialog、plugin-store-、workspace-header-context-info、v4-、onboarding-mesh-background 等全部活跃 id),清单主体两侧一致。 | 证据:repo test-ids.ts:9 TID_LOGIN_TRIGGER="login-trigger |
| 顶层 test-actions.ts / e2e 桥 | packages/ui/src/test-actions.ts(getPluginReferenceCatalog) | styles-CuFc3dtZ.js | identical-evidence | 清理重扫后该文件标识串在产物命中(E2E 桥两侧同源)。 | 证据:toplevel 自动扫描清理重跑后未再报 MISS |
区域 summary:本区域完成穷举式逐字节对照,同源性证据远强于抽样:material-icons 两侧文件名集合完全一致,1146/1146 个 SVG md5 逐字节相同;pdfjs 两侧同为 5.4.296,168 个 cmaps 与官方包逐字节一致;KaTeX 0.16.45 的 60 个字体全部一致(59 个落盘+1 个被 Vite 内联为 data URI,解码后 md5 相同);docx/dukelib 两个 wasm 与官方包 md5 一致;styles.css @theme 全部 154 个主题 token(覆盖任务口径 145 个)在 App 构建产物中一一对应,150 个逐字相同、4 个为 minifier 等价序列化(rgba↔hex、0.09em↔.09em、color-mix 预计算);通知音 mp3 md5 相同。真实漂移仅 2 处注释级差异:App 版 index.html 注释带"修复原因:"前缀、cua-permission-panel.html 多出提及 codex 的两行注释,均与"App 构建自内部 commit、仓库为清洗快照"的既有结论吻合。repo-only 为浏览器版 web 包工程(main.tsx、auth 7 文件、share 6 文件等,特征串在桌面 bundle 无命中);app-only 为 5 个分享渠道图标(钉钉/Discord/Telegram/企微/微信,仓库全库无文件名与 md5 命中)。
本区域 rows 共 30 条(identical-evidence 17 / skewed 2 / repo-only 9 / app-only 2)。覆盖口径:穷举清单:仓库 packages/web 全部 1168 文件(4 个根配置 + favicon.ico + 1146 个 material-icons SVG + src 下 17 个源码文件)逐一归类;desktop renderer 三个 HTML 与 App 三个 HTML 逐字节 diff;styles.css @theme 提取全部 154 个 token 名与值,与 App styles-C8Nayk5k.css 全量比对(修复了 minified CSS 块末省略分号导致的正则漏配后 0 缺失);App renderer/material-icons 1146 个 SVG 全量 md5(超额满足 ≥50 抽样要求);pdfjs:pnpm-lock/packages/ui/package.json 版本 + App pdf-viewer 与 worker bundle 版本串…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| HTML 入口 index.html(桌面主入口) | packages/desktop/src/renderer/index.html | /tmp/zcode-reverse/app/out/renderer/index.html | skewed | 静态部分逐字节 diff 仅 1 处注释漂移:仓库 63 行 / 启动 logo 壳是固定深色底…/,App 版为 / 修复原因:启动 logo 壳是固定深色底… /(内部版带"修复原因:"格式前缀,仓库清洗时去掉)。其余差异均为构建注入:仓库 dev 引用 ./src/main.tsx,App 引用 ./assets/index-BvllzT2k.js + 283 个 modulepreload + styles CSS。 | 证据:diff 两文件:仅 63c63 注释行 + 106a107 构建注入块;仓库侧启动 SVG path M134.4 0.130152L116.48... 与 App 侧逐字一致 |
| index.html 内联启动脚本逻辑 | packages/desktop/src/renderer/index.html:139-188 | /tmp/zcode-reverse/app/out/renderer/assets/index-BvllzT2k.js | identical-evidence | 仓库 index.html 内联的启动壳脚本(update-status 窗口跳过、animationend+1000ms 兜底、3000ms markReactReady、zcode-react-startup-ready 事件)在 App 构建产物中被 Vite 提取进主 bundle,全部分支逐一命中,逻辑同源。 | 证据:bundle 命中:body.classList.add(zcode-startup-ready)...window.addEventListener(zcode-react-startup-ready,E,{once:!0})...window.setTimeout(T,1e3)...window.setTimeout(E,3e3);windowKind)===update-status |
| HTML 入口 resource-manager.html | packages/desktop/src/renderer/resource-manager.html | /tmp/zcode-reverse/app/out/renderer/resource-manager.html | identical-evidence | head 与 body 静态部分逐字节一致(diff 仅构建注入的 script/modulepreload 与 dev src 替换),无任何源码漂移。 | 证据:diff 输出仅 13a14-297 构建注入与 17d300 dev script;两侧 <title>Resource Manager</title> 与 style 块逐字相同 |
| HTML 入口 cua-permission-panel.html | packages/desktop/src/renderer/cua-permission-panel.html | /tmp/zcode-reverse/app/out/renderer/cua-permission-panel.html | skewed | 除构建注入外仅 1 处注释漂移:App 版 .arrow 规则多两行注释 / 向上箭头:告诉用户「往上面那个列表拖」。codex 用的是静态 SF Symbol arrow.up,这里加上下浮动…/——提及竞品 codex 的注释在仓库开源版被清洗删除。其余样式(panel/tile/icon/hint、暗色媒体查询)逐字一致。 | 证据:diff 输出 63a64-65(App 多两行注释)、117a120-121、146d149;两侧 @keyframes nudge-up、rgba(250, 250, 250, 0.98) 等逐字相同 |
| HTML 入口 packages/web/index.html(浏览器版) | packages/web/index.html | — | repo-only | Web 浏览器版入口(含 theme-color meta、data-URI 内嵌 favicon、bundle 执行前主题预置脚本 DEFAULT_THEME=zai-dark),属 @zcode/web 工程,不进入桌面产物。检索证据:其下游特征串 ZCode - Sign In(WebCallbackPage)、preview_runtime_initialized、ZCode 会话分享 在 App 全部 JS bundle 中 rg 均无命中。 | 证据:packages/web/index.html:5-9 <meta name="theme-color" content="#161616"/>;rg 'ZCode - Sign In|preview_runtime_initialized' 于 /tmp/zcode-reverse/app/out/renderer/assets/*.js 无命中 |
| packages/web/src/main.tsx(浏览器入口编排) | packages/web/src/main.tsx | — | repo-only | Web 端启动编排(WebSocket connectViaWebSocket、OAuth callback 路由 /cn/share/callback、会话分享落地页路由)。桌面 App 入口是 packages/desktop/src/renderer/src/main.tsx(另一文件),此模块不进桌面 bundle。 | 证据:main.tsx:4 import { connectViaWebSocket } from "@zcode/client";App bundle 中 /cn/share/callback 仅 1 处且上下文为 host 配置 webShareCallbackUrl:,非本模块 |
| packages/web/src/auth/(7 个文件) | packages/web/src/auth/{browserOAuthCredentialRepo,oauthStateCodec,webAuthLocale,webAuthService,WebCallbackPage,webZaiOAuthConfig,zaiWebOAuthProvider}.ts(x) | — | repo-only | 浏览器版 ZAI OAuth 工程(授权码交换、回调页、凭证仓)。桌面版走 Electron 主进程 OAuth,无此组文件对应;WebCallbackPage 标题串在 App bundle 无命中。 | 证据:find packages/web/src/auth 共 7 文件;rg 'ZCode - Sign In' App bundle 0 命中 |
| packages/web/src/share/(6 个文件) | packages/web/src/share/{conversationShareLandingPage.css,ConversationShareLandingPage.tsx,conversationSharePreviewClient.ts,conversationShareRoute.ts,mockConversationSharePreviewClient.ts,shareHeaderLayout.ts} | — | repo-only | 会话分享落地页(浏览器端渲染分享会话预览)。App 桌面端有"分享"功能但入口不同;本组模块的落地页特征(invalid_contract 作为 landing 错误态、console 标签 conversation-share-web)不在 App 主/入口 bundle。 | 证据:find packages/web/src/share 共 6 文件;rg -F 'conversation-share-web' index-BvllzT2k.js/src-1E9aqq2Y.js 均为 0 命中(src-1E9aqq2Y.js 仅含 host 配置 webShareCallbackUrl 字段) |
| packages/web/src/webThemeSeed.ts | packages/web/src/webThemeSeed.ts | — | repo-only | Web 初始主题解析(WEB_DEFAULT_THEME/resolveWebInitialTheme)。桌面版主题初始化在 desktop renderer 源码内,无对应需求。 | 证据:main.tsx:41 import { WEB_DEFAULT_THEME, resolveWebInitialTheme } from "./webThemeSeed.js" |
| packages/web/src/communityUrl.ts | packages/web/src/communityUrl.ts | — | repo-only | Web 端社区链接/帮助配置解析(resolveWebCommunityUrl/resolveWebHelpConfig),浏览器版专属模块。 | 证据:main.tsx:20 import { resolveWebCommunityUrl, resolveWebHelpConfig } from "./communityUrl.js" |
| packages/web/vite.config.ts | packages/web/vite.config.ts | — | repo-only | @zcode/web 独立构建管线(端口 5173、/ws 代理到 3030、ZAI OAuth client_id 注入)。同源旁证:其 pdfJsCMapsPlugin()(引自 ../ui/vite/pdfJsCMapsPlugin.ts)正是 App 产物 pdfjs/cmaps 目录的生成机制。 | 证据:vite.config.ts plugins: [pdfJsCMapsPlugin(), react(), tailwindcss(), thirdPartyNoticesVitePlugin()];App bundle pdf-viewer 内 cMapUrl 指向 pdfjs/cmaps |
| packages/web/package.json / tsconfig.json / src/env.d.ts | packages/web/{package.json,tsconfig.json} + src/env.d.ts | — | repo-only | @zcode/web 包清单(workspace 依赖 @zcode/client/shared/ui + react 19),纯浏览器工程配置,桌面产物无对应。 | 证据:package.json:2 "name": "@zcode/web" |
| packages/web/public/favicon.ico | packages/web/public/favicon.ico | — | repo-only | 浏览器标签图标,桌面 Electron 无 .ico 需求(App renderer 无任何 .ico)。md5 712280ee7a988f6227f5e29030346c3f,仅仓库存在。 | 证据:find /tmp/zcode-reverse/app /Applications/ZCode.app/Contents/Resources -name '*.ico' 无命中;仓库 favicon.ico md5=712280ee... |
| material-icons 1146 个 SVG 全集 | packages/web/public/material-icons/ | /tmp/zcode-reverse/app/out/renderer/material-icons/ | identical-evidence | 文件名集合 comm 双向 diff 为空(各 1146 个);对全部 1146 个文件(超出 ≥50 抽样要求,实为全量)做 md5 逐字节比对,diff 0 行——包括 favicon.svg、vscode.svg、claude.svg 等全部条目逐字节一致。 | 证据:comm -23/-13 文件名清单双向为空;cd repo && md5 -q .svg vs cd app && md5 -q .svg:diff /tmp/repo_icons.md5 /tmp/app_icons.md5 = 0 行 |
| material-icons 双目录(web/public 与 desktop/public) | packages/desktop/src/renderer/public/material-icons/ | /tmp/zcode-reverse/app/out/renderer/material-icons/ | identical-evidence | 仓库内两份 material-icons(web 公共资产与 desktop renderer 公共资产)本身 1146 个 md5 全等;App 产物 material-icons 与二者亦全等,证明 App 构建取材于同一图标集。 | 证据:diff <(cd web/public && md5 -q .svg) <(cd desktop/public && md5 -q .svg) 通过,文件名清单亦相等 |
| pdfjs 版本 | pnpm-lock.yaml:8225 [email protected];packages/ui/package.json "pdfjs-dist": "5.4.296" | /tmp/zcode-reverse/app/out/renderer/assets/pdf-viewer-Cj8ntTLR.js + pdf.worker.min-qwK7q_zL.mjs | identical-evidence | 两侧均为 pdfjs-dist 5.4.296:仓库 lockfile 与 ui 包声明锁定;App 侧 pdf-viewer bundle 与 pdf worker 中各出现 2 次 5.4.296 版本串。 | 证据:rg -o '[0-9]+\.[0-9]+\.[0-9]+' pdf-viewer-Cj8ntTLR.js | sort | uniq -c → 2 5.4.296;worker 同样 2 5.4.296 |
| pdfjs cmaps(168 个 .bcmap) | [email protected] 官方包 cmaps/(仓库 node_modules 未安装,lockfile 锁定 5.4.296) | /tmp/zcode-reverse/app/out/renderer/pdfjs/cmaps/ | identical-evidence | App 侧 168 个 bcmap 与官方 [email protected] tarball 的 cmaps 目录:文件名清单一致(168=168),全量 md5 逐字节一致(ALL 168 CMAPS BYTE-IDENTICAL)。 | 证据:npm tarball tar -tzf | grep -c 'cmaps/.*bcmap' = 168;diff <(ls official) <(ls app) 通过;md5 全量 diff 0 行 |
| pdfjs cMapUrl 运行时集成 | packages/ui/src/lib/pdfJsAssets.ts:12 cMapUrl: new URL("pdfjs/cmaps/", ...) | assets/pdf-viewer-Cj8ntTLR.js 内 cMapUrl → pdfjs/cmaps | identical-evidence | 仓库的 createPdfJsDocumentOptions 生成的 pdfjs/cmaps/ 路径约定在 App bundle 中原样命中,cmaps 目录位置与加载方式同源。 | 证据:pdfJsAssets.ts cMapPacked: true, cMapUrl:...pdfjs/cmaps/;bundle rg 'pdfjs/cmaps' 命中 |
| 通知音 task-notification-pop.mp3 | packages/ui/src/assets/notification-sounds/task-notification-pop.mp3 | /tmp/zcode-reverse/app/out/renderer/assets/task-notification-pop-qiQ1Ge3C.mp3 | identical-evidence | 两侧 md5 完全相同(0d30e1af7b50e3902fcebc9dd68834d5),逐字节一致。 | 证据:md5 两侧均 0d30e1af7b50e3902fcebc9dd68834d5 |
| 通知音集合完整性 | packages/ui/src/assets/notification-sounds/ 下仅 1 个文件 | assets/ 下仅 1 个音频文件(task-notification-pop-*.mp3) | identical-evidence | 全库枚举(.mp3/.wav/.ogg/.m4a/.aac/.flac/.aiff,排除 node_modules)证明:仓库侧通知音恰 1 个,App renderer 侧音频资产亦恰 1 个,且两者同一文件;无隐藏的第二音效。 | 证据:find 双侧音频扩展名枚举:仓库 1 命中、App 1 命中,md5 相等 |
| styles.css @theme 主题 token 全集(154 个) | packages/ui/src/styles.css:137-… @theme 块 | /tmp/zcode-reverse/app/out/renderer/assets/styles-C8Nayk5k.css | identical-evidence | 从仓库 @theme 块穷举出 154 个唯一 token 名(超出任务口径的 145 个,为超集覆盖),与 App 构建产物 CSS 全量逐 token 比对(修正 minified CSS 块末省略分号的解析后):154/154 全部在 App 侧找到定义,其中 150 个值逐字相同(含 :root 浅色、.dark 深色、theme-zai-light/zai-dark 各主题变体的全部定义值)。 | 证据:python 全量比对脚本:total: 154, identical: 150, value-diff: 4, missing: 0;样例 token --color-terminal-bright-blue/--color-usage-chart-1/--font-mono 等值逐字相同 |
| 4 个序列化等价 token(animated-gradient-text-soft、color-subagent-node、color-subagent-node-hover、tracking-wf-label) | packages/ui/src/styles.css @theme | styles-C8Nayk5k.css 内 #0a0a0a38、oklab(77.6963% -.0361366 .0873579/.18)、.09em | identical-evidence | 仅有的 4 个非逐字 token 均为 LightningCSS 压缩的等价序列化,非内容漂移:rgba(10,10,10,0.22)↔#0a0a0a38(0.22×255≈56=0x38)、#fff3↔rgba(255,255,255,0.2)、color-mix(in oklab,#b7bd75 18%,transparent)↔预计算 oklab(77.6963% -.0361366 .0873579/.18)、0.09em↔.09em。 | 证据:比对脚本 DIFF 清单 4 条,逐条换算验证 alpha 分量相等(0.055→0x0e、0.28→0x47 等) |
| 主题 token 名集合完整性 | packages/ui/src/styles.css | /tmp/zcode-reverse/app/out/renderer/assets/styles-C8Nayk5k.css | identical-evidence | token 名集合 comm 双向 diff 为空:仓库每个主题 token 在 App 产物均有定义(含曾被初版脚本误报 missing 的 9 个——background-alt/foreground-subtle(st)/usage-heatmap-0..4/plugin-paid-plan-badge-foreground,实为压缩器把块末分号省略导致解析漏配,修正后全部命中,如 --color-foreground-subtle:#40404099 与 color-mix 回退双写)。 | 证据:修正后 missing: 0;App CSS 内 @supports (color:color-mix(in lab, red, red)){:root,:host{--color-usage-heatmap-1:color-mix(in oklab, var(--color-sky-500) 18%, ... 保留与仓库相同的回退结构 |
| App styles-C8Nayk5k.css ↔ 仓库 styles.css 构建关系 | packages/ui/src/styles.css(2053 行) | /tmp/zcode-reverse/app/out/renderer/assets/styles-C8Nayk5k.css(410172 字节) | identical-evidence | App 产物 CSS 由仓库 packages/ui/src/styles.css 经 Tailwind v4 + LightningCSS 构建:154 个主题 token 全等 + katex.min.css 以 @import 内联(styles.css:6 @import "katex/dist/katex.min.css",App CSS 中含完整 KaTeX @font-face 与 .katex 规则)共同证明同源。 | 证据:styles.css:42 @source "./**/*.{ts,tsx}";App CSS 含 --color-foreground-subtle:#40404099}@supports (color:color-mix... 构建器双写特征 |
| KaTeX 字体(60 个) | pnpm-lock.yaml:7205 [email protected];packages/ui/package.json "katex": "^0.16.45" | assets/KaTeX_*.woff2/woff/ttf 共 59 个落盘 + 1 个内联 data URI | identical-evidence | App bundle 内 katex 版本串 0.16.45 与 lockfile 一致;官方 0.16.45 的 60 个字体文件中 59 个落盘 md5 全等,KaTeX_Size3-Regular.woff2(3624 字节 < Vite 4KB 内联阈值)被内联进 CSS data URI,base64 解码后 md5=9108a400f4787cffdcc3a3b813401e6a 与官方逐字节一致——初看'缺 1 个 woff2'实为构建内联,无内容差异。 | 证据:rg '0.16.45' katex-Dpv1KeVU.js 命中;python 解码 data:font/woff2;base64,d09GMgABAAAAAA4o... → md5 9108a400... 等于官方文件 |
| docx 预览 wasm | pnpm-lock.yaml:2054 @extend-ai/[email protected] | assets/docx_wasm_bg-HWnIvdMf.wasm(md5 8300d365569b96a77f034019e70d6932) | identical-evidence | App 侧 docx_wasm_bg.wasm 与官方 @extend-ai/[email protected] tarball 内 package/dist/docx_wasm_bg.wasm md5 逐字节一致。 | 证据:官方 tarball 解包 md5 = 8300d365569b96a77f034019e70d6932 = App 文件 md5 |
| xlsx 预览 wasm | pnpm-lock.yaml:1680 @dukelib/[email protected] | assets/duke_sheets_wasm_bg-BCCK9PkU.wasm(md5 74c3d964a397171af3e8ec8aab3fc061) | identical-evidence | App 侧 duke_sheets_wasm_bg.wasm 与官方 @dukelib/[email protected] tarball 内同名文件 md5 逐字节一致。 | 证据:官方 tarball md5 = 74c3d964a397171af3e8ec8aab3fc061 = App 文件 md5;App bundle 含 duke_sheets_wasm-q_9lNkaq.js 加载器 |
| App ui-assets 18 个二进制资产(md5 全等组) | packages/ui/src/assets/{plugin-icons,document-skill-icons,cli-icons,onboarding/assets,provider-icons}/* + packages/desktop/build/icon.png | assets/{documents,documents@2x,feishu,finder,icon-glm-for-dark,icon-glm-for-light,icon_512@2x,image-search,model-provider-moonshot-kimi,model-provider-zai-app,pdf,pdf@2x,plugin-creator,presentations,spreadsheets,spreadsheets@2x,task-notific… | identical-evidence | App renderer 全部 23 个非 JS 二进制资产中 18 个与仓库逐字节 md5 相同:plugin-icons 6 个(documents/pdf/spreadsheets/presentations/image-search/plugin-creator)、document-skill-icons 3 个 @2x、cli-icons 2 个(glm-for-dark/light)、onboarding 3 个(feishu/finder/terminal)、provider-icons 1 个(moonshot-kimi)、desktop/build/icon.png(即 App 的 icon_512@2x)、通知音 1 个、zai-app 图标(与 desktop/build/icons/128x128.png 同内容)。 | 证据:python md5 交叉匹配输出 app assets matched by md5: 18 / 23,逐条列出对应仓库路径 |
| 5 个分享渠道图标(钉钉/Discord/Telegram/企微/微信) | — | assets/{icon-dingding@2x-CnYjVOCa,icon-discord@2x-D9OBPr5g,icon-telegram@2x-Cax3aaF9,icon-wecom@2x-BZVgmBph,icon-weixin@2x-Bp9EqCCA}.png | app-only | 5 个第三方分享渠道图标在仓库全库(排除 node_modules)按文件名 dingding/discord/telegram/wecom/weixin 检索 0 命中,且 App 内实际内容 md5 在仓库 42 个二进制资产 md5 集中无匹配——属内部版私有分享功能的静态资产。 | 证据:find 仓库 -iname 'dingding' -o -iname 'discord' -o -iname 'telegram' -o -iname 'wecom' -o -iname 'weixin'(非 node_modules)无输出;python 交叉匹配 no md5 match in repo (5) |
| styles-CuFc3dtZ.js(App 侧依赖预加载映射) | — | /tmp/zcode-reverse/app/out/renderer/assets/styles-CuFc3dtZ.js | app-only | Vite 构建生成的 __vite__mapDeps 动态依赖路径表(入口 CSS chunk 的伴随 helper),非功能模块、仓库无源码对应文件(该机制存在于 Vite 运行时,非业务差异)。 | 证据:文件首行 const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./angular-html-GVH-sAlQ.js",...] |
区域 summary:两侧确证同源:helper SEA 内嵌 JS 带有 node_modules/@zcode/zcode-cua/dist/* 源路径注释,且 helperConstants 五常量、BROKER_SOCKET_ENV、HELPER_ADDON_ENV、request-access schema、frame-contract 三常量在 zcode.cjs 中逐字命中,Info.plist 的 dev.zcode.cua-helper 与 BuildId pipeline-291748-cead36fd 锚定内部 commit。仓库 0.6.3 是把协议面拍平为 13 个桩文件的 fail-closed 清洗版:所有同名函数被改为抛错/恒 false/空映射,且错误工厂从 9 个删到 6 个、BrokerError/errorResponse/parseRequestLine/mintBrokerSocketPath 的签名与命名方案均与真实实现漂移。App-only 面巨大:42 个 broker 方法、18 个只读方法、Team ID 8A5X4JJ39T 签名校验、安装变体、10 个 CLI 参数、11 个环境变量、跨平台后端与完整 AX 原生面均无仓库对应。唯一确认的 repo-only 契约是 host-display-contract 的 app-associations 键(App 三处产物均无)。
本区域 rows 共 53 条(identical-evidence 11 / skewed 16 / differs 10 / repo-only 3 / app-only 10 / unresolved 3)。覆盖口径:仓库侧穷举了 packages/zcode-cua 全部 13 个模块(package.json exports 12 子路径、index、frame-contract、host-display-contract、request-access-contract、pip-session、pip-session/node、broker、broker/server、broker/ports、broker/socketPath、broker/helperConstants、broker/helperHealth)及 README,逐个导出/常量列出。App 侧对 111MB SEA 用 strings 落盘 310466 行后分类核对:全部契约常量(BROKER_SOCKET_ENV/HELPER_ADDON_ENV/5 个 helperConstants/frame 三常量/request-ac…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| package.json exports 清单(12 个子路径导出) | packages/zcode-cua/package.json:7-66 | SEA 内嵌 dist/broker/* 同名模块(helperConstants/socketPath/brokerProtocol/brokerServer 等) | identical-evidence | 全部 12 个子路径(. /frame-contract /host-display-contract /request-access-contract /pip-session /pip-session/node /broker /broker/server /broker/ports /broker/socketPath /broker/helperConstants /broker/helperHealth)在 App 侧均有对应实现层;helper SEA 的内嵌 JS 注释直接标注 node_modules/@zcode/zcode-cua/dist/... 路径,证明 App 构建自同一包的完整版。 | 证据:repo package.json exports 与 SEA strings 命中 '// node_modules/@zcode/zcode-cua/dist/broker/helperConstants.js'、'dist/broker/socketPath.js'、'dist/broker/brokerProtocol.js' 等(/tmp/cua-helper-strings.txt:285318+) |
| package.json 版本/占位声明 | packages/zcode-cua/package.json:2-5 | Info.plist CFBundleShortVersionString=3.14.1, ZCodeCUAHelperBuildId=pipeline-291748-cead36fd | skewed | 仓库为 0.6.3 且 description 明言 'placeholder package...fails closed';App 侧 helper 版本 3.14.1、BuildId 锚定内部 commit cead36fd,是真实实现。SEA 中未检索到任何 "version": "x.y.z" 形式的包版本串(grep '"version": ?"[0-9.]+' 0 命中),嵌入包的具体版本号无法核实。 | 证据:repo package.json:3 '0.6.3';Info.plist:13-14 '3.14.1'/'pipeline-291748-cead36fd' |
| README.md | packages/zcode-cua/README.md:1-5 | — | repo-only | 仓库 README 描述'每个运行时面报 unavailable 并 fail-closed';App bundle 内无对应文档,且实际行为完全相反(真实 broker/截屏/键鼠控制)。该文档是清洗痕迹的一部分。 | 证据:repo README.md:3-4 'every runtime surface ... reports unavailable and fails closed';App Resources/ 下仅 AppIcon.icns、ax_native.node、node_modules |
| index.js createComputerUseRuntime | packages/zcode-cua/index.js:3-14 | zcode.cjs 内嵌 CUA 运行时(经 ZCODE_CUA_PERMISSION_BROKER_SOCKET 连 broker 调 42 个方法) | differs | 仓库桩 execute() 恒返回 isError 文本 'Computer Use is not available in this build.';App 侧运行时真实驱动 broker 的 click/type_text/capture_app 等方法。core 工具行为完全对不上(有意 fail-closed)。 | 证据:repo index.js:4 UNAVAILABLE_TEXT;zcode.cjs 命中 ZCODE_CUA_PERMISSION_BROKER_SOCKET(1) 且 SEA 含完整 BROKER_METHODS 分发表 |
| frame-contract 三个常量 | packages/zcode-cua/frame-contract.js:1,3,5 | zcode.cjs(CLI 运行时,非 helper 二进制——正确的层级归属) | identical-evidence | OFFICIAL_CUA_FRAME_INTEGRITY_META_KEY、OFFICIAL_CUA_FRAME_MODEL_CONTENT_PROTECTION、OFFICIAL_CUA_IMAGE_INLINE_BASE64_BYTES=2001024 三者在 zcode.cjs 逐字命中;helper SEA 二进制中为 0(frame 契约属 agent/CLI 层,不在 helper 进程),层级归属一致。 | 证据:zcode.cjs: '_2="official_cua_frame_v1",lMs=2001024;r(ucn,"attestOfficialCuaFrameContent")';'zcode.cua/official-frame-integrity-v1' 1 命中;204800 用于帧大小校验消息 |
| frame-contract 8 个谓词/处理函数 | packages/zcode-cua/frame-contract.js:7-45 | zcode.cjs(attestOfficialCuaFrameContent 函数名保留;image_ref/raster 相关串 15 命中) | differs | 仓库侧 isOfficialCuaImageRefText/containsImageRefAuthority/parseOfficialCuaImageRef/readRasterEnvelopeIdentity/preserveOfficialCuaFrameResult/attestOfficialCuaFrameContent/findOfficialCuaFrameContentPair 等全部恒返 false/undefined/pass-through;App 侧 zcode.cjs 有真实的帧完整性证明与 image_ref 凭据检测逻辑(attestOfficialCuaFrameContent 以未混淆名命中)。 | 证据:repo frame-contract.js:9 'return false';zcode.cjs grep 'attestOfficialCuaFrameContent' 命中、'image_ref|raster_envelope|rasterEnvelope' 15 命中 |
| host-display-contract(app-associations 2 常量) | packages/zcode-cua/host-display-contract.js:1,3 | — | repo-only | CUA_APP_ASSOCIATIONS_META_KEY='zcode.cua/app-associations-v1' 与 MAX_META_BYTES=16384 在 App 三处(helper SEA strings、zcode.cjs、out/ 全部 bundle)均为 0 命中,含宽松检索 app-associations/appAssociations/MAX_META_BYTES 亦 0。仓库保留了 App 已不使用(或被移除/改名)的表面。 | 证据:grep -aoc 'app-associations|appAssociations|MAX_META_BYTES' zcode.cjs=0;out/host/index.js=0;/tmp/cua-helper-strings.txt 无命中 |
| request-access-contract(meta key + schema) | packages/zcode-cua/request-access-contract.js:1,4-14 | zcode.cjs 内嵌 zod schema | identical-evidence | meta key 逐字命中;schema 逐字段一致:schemaVersion literal(1)、platform literal('darwin')、grantOwner string.trim().min(1).max(512)、accessibility enum(granted/stale/denied)、screenRecording enum(granted/denied/unknown),与仓库 .d.ts 的 CuaRequestAccessStatus 接口完全吻合。仓库桩 safeParse 恒失败,App 侧为真校验。 | 证据:zcode.cjs: 'request-access-status-v1",dro=m.object({schemaVersion:m.literal(1),platform:m.literal("darwin"),grantOwner:m.string().trim().min(1).max(512),accessibility:m.enum(["granted","stale","denied"]),screenRecording:m.enum(["granted","denied","unknown"' |
| pip-session.js createPipSessionClient | packages/zcode-cua/pip-session.js:1-11 | SEA dist/pip-session/{contract,coordinator,presentation-scheduler,broker-handlers}.js | differs | 仓库桩 enabled:false、send() 返 {applied:false};App 侧有 4 个真实 pip-session 模块且 broker 提供 pip_session_handshake/pip_session_event 方法。 | 证据:repo pip-session.js:3 'enabled: false';SEA 命中 'dist/pip-session/coordinator.js'、'pip_session_handshake'(4)、'pip_session_event'(3) |
| pip-session 事件类型 union(8 种 kind) | packages/zcode-cua/pip-session.d.ts:1-24 | helper SEA + zcode.cjs | skewed | turn-started/focus-changed/turn-ended/session-closed 双侧命中;turn-completed/turn-failed/tool-scheduled/tool-started 仅在 zcode.cjs(2 命中)而 helper 二进制 0——这 4 种由 CLI 层协调器产出,事件词表按层分布,与仓库单一 union 声明的组织方式不同但集合一致。 | 证据:helper: '"turn-started"'(2)/'"focus-changed"'(2)/'"turn-ended"'(2)/'"session-closed"'(3);zcode.cjs: turn-completed/turn-failed/tool-scheduled/tool-started 各 2 命中 |
| pip-session/node 子路径 | packages/zcode-cua/pip-session-node.js:1(re-export createPipSessionClient) | SEA pip-session/broker-handlers.js | identical-evidence | node 子路径导出面(PipSessionClientOptions 含 peerChecker/onDiagnostic、PipSessionApplyResult{applied,reason})与 App 侧 broker 的 pip_session 通道对应;仓库为禁用桩。 | 证据:repo pip-session-node.d.ts:7 'export declare function createPipSessionClient';SEA 'dist/pip-session/broker-handlers.js' 命中 |
| BROKER_SOCKET_ENV | packages/zcode-cua/broker.js:5 | helper SEA dist/broker/socketPath.js | identical-evidence | 值 'ZCODE_CUA_PERMISSION_BROKER_SOCKET' 逐字一致,SEA 中 3 处读取;zcode.cjs 亦 1 命中。 | 证据:SEA strings: 'var BROKER_SOCKET_ENV = "ZCODE_CUA_PERMISSION_BROKER_SOCKET"'(socketPath.js 段);helper 二进制 grep -cF 3 |
| BROKER_UNAVAILABLE_ENV | packages/zcode-cua/broker.js:6 | /tmp/zcode-reverse/app/out/host/index.js | identical-evidence | helper 二进制 0 命中属预期(该环境变量由主进程/host 侧设置);out/host/index.js 命中。 | 证据:grep -rl 'ZCODE_CUA_PERMISSION_BROKER_UNAVAILABLE' /tmp/zcode-reverse/app/out/ → out/host/index.js |
| BrokerError 类 | packages/zcode-cua/broker.js:8-16 | SEA dist/broker/types.js | differs | 构造签名漂移:仓库 constructor(message, {code='unavailable', details});真实实现 constructor(code, message, details={}) 且 code 必传无默认值。errorResponseFromException 兜底码也不同:仓库无 code 字段直传 message,真实实现兜底 'internal'。 | 证据:SEA: 'var BrokerError = class extends Error { ... constructor(code, message, details = {})';'return errorResponse(id, "internal", message)';repo broker.js:9-15 |
| CuaHelperError 类与 helper_unavailable 码 | packages/zcode-cua/broker.js:17-24 | — | unresolved | 类名与默认码 'helper_unavailable' 在 helper SEA strings、zcode.cjs、out/(host/index.js 'CuaHelperError' 0 命中)均无命中。检索词:helper_unavailable、CuaHelperError、isCuaHelperError。bundle 混淆可解释符号名消失,但字符串码也 0 命中,无法判定 App 侧对应物;可能为仓库清洗时新造的客户端包装类。 | 证据:grep 'helper_unavailable' zcode.cjs=0、/tmp/cua-helper-strings.txt=0;grep 'CuaHelperError' out/host/index.js=0 |
| 6 个 broker 错误工厂 | packages/zcode-cua/broker.js:31-36 | SEA dist/broker/types.js | skewed | 仓库导出 notAuthorized/notSelectable/notSettable/elementUnavailable/actionUnavailable/foregroundRequired 六个,App 侧全部存在(二进制命中 not_authorized=11 等)且语义同源;但真实实现共 9 个工厂,多出 permissionDenied/controllerBusy/launchFailed 三个仓库没有。 | 证据:SEA: 'var permissionDenied = (message, details) => new BrokerError("permission_denied", ...)'/controllerBusy/launchFailed;二进制命中 not_authorized=11、foreground_required=6、element_unavailable=2、not_selectable=1、not_settable=1、action_unavailable=1 |
| callBrokerMethod/probeHelperHealth(ports + helperHealth 子路径) | packages/zcode-cua/broker.js:39-51; broker-helper-health.js:1 | out/host/chunk-BPMMBPK6.js 等 3 个 chunk 命中 probeHelperHealth | differs | 仓库 callBrokerMethod 恒抛错、probeHelperHealth 恒返 {bundleId:null,pid:null};App 侧 host/scheduler bundle 保留 probeHelperHealth 符号并做真实健康探测(SEA 中有 startup-timeout/kill-path/health 相关逻辑与 CUA_BROKER_IPC_VERSION=2 版本协商)。 | 证据:grep -rl probeHelperHealth out/ → host/chunk-BPMMBPK6.js、host/chunk-TVWDPSHD.js、scheduler/chunk-KP22P5UF.js;SEA: 'var CUA_BROKER_IPC_VERSION = 2' |
| mintBrokerSocketPath | packages/zcode-cua/broker.js:47-49 | SEA dist/broker/socketPath.js | differs | 命名方案对不上:仓库生成 tmpdir 下 'zcode-cua-broker-<randomUUID>.sock';真实实现用固定文件名 'broker.sock'(置于 options.dir 下)且 Windows 走命名管道 '\\.\pipe\zcode-cua-helper-'。helper 二进制检索 'zcode-cua-broker' 前缀 0 命中,证实 UUID 方案为仓库独有(或旧版残留)。 | 证据:SEA: 'var BROKER_SOCKET_FILENAME = "broker.sock"; var WINDOWS_NAMED_PIPE_PREFIX = "\\\\.\\pipe\\zcode-cua-helper-"';repo broker.js:48 join(dir, zcode-cua-broker-${randomUUID()}.sock) |
| resolveBrokerSocketPath | packages/zcode-cua/broker.js:52-57; broker-socket-path.js:1 | SEA dist/broker/socketPath.js | identical-evidence | 逻辑同构:先读 options.env ?? process.env 的 BROKER_SOCKET_ENV,非空即用,否则回退生成。env 优先分支逐行对应。 | 证据:SEA: 'var explicit = env[BROKER_SOCKET_ENV]; if (typeof explicit === "string" && explicit.trim().length > 0) return explicit';repo broker.js:54-56 |
| 协议函数族 parseRequestLine/okResponse/errorResponse/errorResponseFromException/serializeResponse | packages/zcode-cua/broker.js:59-78 | SEA dist/broker/brokerProtocol.js | differs | 签名漂移:真实 errorResponse(id, code, message, details) vs 仓库 errorResponse(message, {code});真实 parseRequestLine 返回 {ok,id,code,message} 信封并强制 id 为非负安全整数,仓库声明 BrokerRequest.id 可为 string|null 且桩恒返 undefined;okResponse 真实版多 presentation 参数与 {id} 字段。serializeResponse(JSON+\n)一致。 | 证据:SEA: 'function errorResponse(id, code, message, details)'、'request.id must be a non-negative safe integer'、'function okResponse(id, result, presentation)';repo broker.js:67, broker.d.ts 'id?: string | null' |
| dispatchRequest/handleRequestLine | packages/zcode-cua/broker.js:87-95 | SEA dist/broker/brokerProtocol.js | skewed | 仓库两个函数恒抛 CuaHelperError;真实 dispatchRequest 同名同职责:isBrokerMethod 校验→method_not_found→backendmethod→okResponse/errorResponseFromException,另支持 presentation 包装结果(BROKER_PRESENTED_RESULT Symbol='zcode.cua.broker-presented-result')。 | 证据:SEA: 'async function dispatchRequest(backend, request) { if (!isBrokerMethod(request.method)) return errorResponse(request.id, "method_not_found", ...)'; 'var BROKER_PRESENTED_RESULT = Symbol("zcode.cua.broker-presented-result")' |
| isBrokerMethod/isReadOnlyBrokerMethod | packages/zcode-cua/broker.js:97-101 | SEA BROKER_METHOD_SET / READ_ONLY_BROKER_METHODS | differs | 仓库两谓词恒 false(配合 fail-closed);真实实现基于集合:BROKER_METHOD_SET 42 个方法、READ_ONLY_BROKER_METHODS 18 个。函数名与职责一一对应,返回语义完全相反。 | 证据:SEA: 'var BROKER_METHOD_SET = new Set(BROKER_METHODS); var isBrokerMethod = (method) => BROKER_METHOD_SET.has(method); var isReadOnlyBrokerMethod = (method) => READ_ONLY_BROKER_METHODS.has(method)' |
| HELPER_ADDON_ENV | packages/zcode-cua/broker-server.js:3 | helper SEA dist/broker/server/helperAddonLoader.js | identical-evidence | 值 'ZCODE_CUA_HELPER_ADDON' 逐字一致;SEA 中定义 + addon 加载器两处使用,报错信息直接点名 'node-gyp rebuild in the @zcode/zcode-cua package'。 | 证据:SEA:285334 'var HELPER_ADDON_ENV = "ZCODE_CUA_HELPER_ADDON";';'CUA native addon (ax_native.node) not found for ${platform2}. ... set ${HELPER_ADDON_ENV} to the .node path.';二进制 grep -cF 2 |
| WINDOWS_DEV_CONTROL_PROTOCOL | packages/zcode-cua/broker-server.js:4 | out/host/index.js | identical-evidence | 值 'zcode-cua-windows-dev/v1' 在 helper SEA 二进制 0 命中(helper 为 macOS 进程,属预期),在主进程 host bundle 命中——层级归属与常量值一致。 | 证据:grep -rl 'zcode-cua-windows-dev/v1' /tmp/zcode-reverse/app/out/ → out/host/index.js |
| buildHelperOpenArgs | packages/zcode-cua/broker-server.js:13-15 | helper SEA helperLauncher/helperLaunchGuard | skewed | 仓库恒返 [];真实实现组装 open 命令行,参数族含 --controller-variant、--pip-mode、--pip-live-probe、--disable-cps-activation、--allow-unsigned-launcher-local-dev、--allow-external-broker-client-local-dev、--ghost-cursor-overlay、--ghost-cursor-capture、--permission-request-deadline-epoch-ms,且传 launcherPid 做父子签名校验('--launcher-pid did not verify as a code-signed ZCode process')。 | 证据:SEA: 'var HELPER_CONTROLLER_VARIANT_ARG = "--controller-variant"' 等 9 个 ARG 常量;'ZCode Computer Use broker: --launcher-pid did not verify as a code-signed ZCode process ... refusing to start' |
| isCuaLocalDevelopmentRuntime | packages/zcode-cua/broker-server.js:22-24 | SEA helperLocalDevAuthorization/cua-env | skewed | 仓库恒 false;真实实现检查 ZCODE_CUA_DEV_MODE/ZCODE_CUA_DEV_MODE_ENV_KEY/ZCODE_RUNTIME_ENV/ZCODE_ENV 等开发态环境变量,并联动 ZCODE_CUA_HELPER_ALLOW_UNSIGNED_LOCAL、ZCODE_CUA_HELPER_ALLOW_UNAUTHENTICATED_LOCAL、ZCODE_CUA_HELPER_TEAM_ID 覆写。 | 证据:SEA: 'const teamOverride = isCuaLocalDevelopmentRuntime(env) ? env.ZCODE_CUA_HELPER_TEAM_ID?.trim() : void 0';ZCODE_CUA_DEV_MODE_ENV_KEY/ZCODE_CUA_HELPER_ALLOW_UNSIGNED_LOCAL 等串均命中 |
| createCuaHelperInstaller + defaultCuaHelperVerifierDependencies | packages/zcode-cua/broker-server.js:26-43 | SEA dist/broker/server/helperVerifier.js | skewed | 仓库 installer 的 ensureInstalled/verifyInstalled 与三个 verifier 依赖(readExecutableArchs/verifyCodeSignature/verifyTeamIdentifier)全部 unavailableReject;App 侧真实校验:HELPER_TEAM_ID='8A5X4JJ39T'、CUA_HELPER_INSTALL_VARIANTS=['stable','preview','dev-desktop','standalone']、CUA_HELPER_INSTALL_VARIANT_ENV='ZCODE_CUA_HELPER_INSTALL_VARIANT',按变体扫描安装根。 | 证据:SEA: 'var HELPER_TEAM_ID = "8A5X4JJ39T";' 'var CUA_HELPER_INSTALL_VARIANTS = [ "stable", "preview", "dev-desktop", "standalone" ]';repo broker-server.js:34-39 |
| resolveHelperPermissionSubjectIdentity | packages/zcode-cua/broker-server.js:17-20 | SEA dist/broker/server/cuaAppIdentity.js | skewed | 仓库恒抛 unavailable;App 侧有专用 cuaAppIdentity 模块,授权主体分 zcode_app/zcode_helper 等类别,display_name/bundle_id 兜底文案 'the ZCode authorization subject',与仓库 .d.ts 的 HelperPermissionSubjectIdentity 四字段形状对应。 | 证据:SEA: 'case "zcode_app": case "zcode_helper":'、'return brokerInfo.display_name || brokerInfo.bundle_id || "the ZCode authorization subject"';'dist/broker/server/cuaAppIdentity.js' 命中 |
| cuaBrokerRefreshMarkerPath/publishCuaBrokerRefreshMarker | packages/zcode-cua/broker-server.js:45-52 | out/host/index.js、out/host/chunk-GVBBGMXG.js、out/main/chunk-YSD25WTT.js | identical-evidence | 仓库两函数为 undefined/{path:undefined} 桩;App 主进程三处命中 refreshMarker——机制存在于 host 层(helper 二进制 0 命中属正确的层级分布)。 | 证据:grep -rl 'refreshMarker|refresh-marker' out/host/ out/main/ → index.js、chunk-GVBBGMXG.js、chunk-YSD25WTT.js |
| loadRealNativeAddon/resolvePackagedNativeAddonPath/resolveInTreeAddonPath | packages/zcode-cua/broker-server.js:54-66 | Contents/Resources/ax_native.node (986384B) + helperAddonLoader.js | skewed | 仓库:抛错/返回 undefined;App 侧 ax_native.node 实际打包于 helper Resources/,addon 加载器按 HELPER_ADDON_ENV → 打包路径 → in-tree 顺序解析(与三个函数的职责划分对应),另支持 ZCODE_CUA_LIVE_NATIVE 活动原生模式。 | 证据:ls Resources/ax_native.node 存在;SEA: 'const explicitAddonPath = env[HELPER_ADDON_ENV]?.trim()'、ZCODE_CUA_LIVE_NATIVE 2 命中 |
| createAxReadOnlyMethods/ROLE_TO_KIND/roleToKind | packages/zcode-cua/broker-server.js:68-76(ROLE_TO_KIND={} 空) | SEA dist/broker/server/axReadOnly.js + ax_native.node | differs | 仓库 ROLE_TO_KIND 为空对象、roleToKind 恒 undefined;真实实现含完整 macOS AX 角色映射(AXButton→button、AXMenuButton→button、AXPopUpButton→popupbutton、AXComboBox→combobox、AXTextField→textfield、AXSearchField→searchfield…),另有 dist/native/controlTypeToKind.js 与 atspiRoleMap.js 两个跨平台映射表(仓库完全无对应物)。 | 证据:SEA: 'var ROLE_TO_KIND = { AXButton: "button", AXMenuButton: "button", AXPopUpButton: "popupbutton", ...';'dist/native/atspiRoleMap.js'、'dist/native/controlTypeToKind.js' 命中 |
| CuaHelperLifecycleManager | packages/zcode-cua/broker-server.js:78-107 | SEA dist/broker/server/helperLifecycle.js | skewed | 仓库保留同名类但 acquire 省略 shouldRetainCurrent 分支(收到却不消费);真实实现配 helperLifecycle.js,含启动超时自终止('was not claimed within ${startupTtlMs}ms; self-terminating to avoid an orphaned permission subject')与 post-drain 清理。 | 证据:SEA: 'ZCode Computer Use was not claimed within ... self-terminating to avoid an orphaned permission subject'、'cua broker post-drain input cleanup failed';'dist/broker/server/helperLifecycle.js' 命中 |
| createProductCuaHelperHost | packages/zcode-cua/broker-server.js:113-143 | out/host(host 进程实现) | differs | 仓库返回全 unavailable 的 host(start/restart/checkHealth 恒拒、queryPermissionStatus 返 {});App host 侧真实管理 helper 生命周期:启动认领窗(broker_info 首包窗口关闭后拒绝)、启动超时关停、curl 式健康探测。方法面与 .d.ts 声明一致,行为完全相反。 | 证据:SEA: 'broker startup claim window has closed'、'ZCode Computer Use startup-timeout shutdown failed';repo broker-server.js:117-141 createUnavailableCuaHelperHost |
| isOfficialCuaPluginEnabledForWorkspace / createCuaProductMcpServerResolver / isPotentialZCodeCuaAgentMcpServer | packages/zcode-cua/broker-server.js:150-176(.d.ts 声明) | — | unresolved | 三符号名在 helper SEA strings、zcode.cjs、out/ 均未命中。检索词:isOfficialCuaPluginEnabledForWorkspace、createCuaProductMcpServerResolver、isPotentialZCodeCuaAgentMcpServer。zcode.cjs 与 out 均为混淆 bundle,符号名被 mangle(对比:同为 zcode-cua 代码的 attestOfficialCuaFrameContent 却在 zcode.cjs 保留未混淆名),无法按名判定;从仓库 consumer import(services/desktop 引 broker/server 子路径)推断功能存在于 App,但无法取证。 | 证据:grep -aoc 各符号 zcode.cjs=0;/tmp/cua-helper-strings.txt=0;out/ 无命中 |
| waitForCuaHelperStartup | packages/zcode-cua/broker-server.js:178-180 | helper SEA brokerServer.js | skewed | 仓库直接透传 startup Promise(忽略 deadline);真实实现有 startupTtlMs 超时与超时后安全关停路径('startup-timeout shutdown did not drain safely')。 | 证据:SEA: 'ZCode Computer Use startup-timeout shutdown did not drain safely'、'was not claimed within ${startupTtlMs}ms' |
| isScreenCaptureProbeSuccess + mark/has/clearCuaProductHelperAgentEnvUnavailable 三件套 | packages/zcode-cua/broker-server.js:182-197(.d.ts 声明) | — | unresolved | 四个符号名未在任何 App 产物命中。检索词:isScreenCaptureProbeSuccess、markCuaProductHelperAgentEnvUnavailable(三件套共享 'CuaProductHelperAgentEnvUnavailable' 词根,mark 版 0 命中推断其余亦 0)。功能侧证存在:screen_capture_probe 在 SEA BROKER_METHODS 与 READ_ONLY 集合中各 2 命中、zcode.cjs 亦有;仅客户端包装符号无法按名核实。 | 证据:grep 'screen_capture_probe' /tmp/cua-helper-strings.txt 2 命中;zcode.cjs 'screen_capture_probe' 2 命中;符号名自身 0 命中 |
| reapOrphanedHelpers | packages/zcode-cua/broker-server.js:199-203 | SEA dist/broker/server/helperReaper.js | skewed | 仓库恒 no-op;真实实现有专门 helperReaper 模块,kill 路径带 pid 复用防护(进程列表失败则跳过 SIGTERM)。 | 证据:SEA: 'cua helper kill-path: process listing failed for pid ${helperPid} (...); skipping SIGTERM as a pid-reuse precaution';'dist/broker/server/helperReaper.js' 命中 |
| requestHelperAccessibility/ScreenRecordingPermissionViaLaunchServices | packages/zcode-cua/broker-server.js:205-211 | helper SEA(LaunchServices 启动解析)+ Info.plist | skewed | 仓库恒返 {ok:false, reason:UNAVAILABLE};真实实现经 LaunchServices 解析并后台拉起目标 app([cua-captureapp-launch] 日志串),权限请求走可信 Host UI 手势(READ_ONLY 注释:'the trusted Host UI owns all permission-request gestures'),Info.plist 带 NSAppleEventsUsageDescription 与 LSUIElement。 | 证据:SEA: '[cua-captureapp-launch] resolved via LaunchServices pid=${pid} (no enumeration wait)';Info.plist:19-20 NSAppleEventsUsageDescription、LSUIElement |
| broker-helper-constants 5 常量 | packages/zcode-cua/broker-helper-constants.js:1-5 | SEA dist/broker/helperConstants.js + Info.plist | identical-evidence | 五个常量逐字一致:HELPER_APP_NAME='ZCode Computer Use.app'、DEV_HELPER_APP_NAME='ZCode Computer Use Dev.app'(各 1 命中)、HELPER_DISPLAY_NAME='ZCode Computer Use'(=Info.plist CFBundleName/DisplayName)、HELPER_BUNDLE_ID='dev.zcode.cua-helper'(=Info.plist CFBundleIdentifier)、DEV_CUA_HELPER_BUNDLE_ID='dev.zcode.cua-helper.dev'(1 命中)。 | 证据:SEA: 'var HELPER_APP_NAME = "ZCode Computer Use.app";' 等 5 行与 repo 逐字相同;Info.plist CFBundleIdentifier=dev.zcode.cua-helper |
| helperConstants 的 App 侧扩展 | — | SEA dist/broker/helperConstants.js | app-only | 仓库无对应导出:CUA_HELPER_BUNDLE_IDS 集合 + isCuaHelperBundleId()、HELPER_TEAM_ID='8A5X4JJ39T'、CUA_HELPER_INSTALL_VARIANT_ENV、CUA_HELPER_INSTALL_VARIANTS=['stable','preview','dev-desktop','standalone'](安装变体选择逻辑 'CUA_HELPER_INSTALL_VARIANTS.includes(requested) ? requested : "standalone"')。 | 证据:SEA: 'var CUA_HELPER_BUNDLE_IDS = new Set([HELPER_BUNDLE_ID, DEV_CUA_HELPER_BUNDLE_ID])'、'function isCuaHelperBundleId(bundleId)'、'return CUA_HELPER_INSTALL_VARIANTS.includes(requested) ? requested : "standalone"' |
| broker-ports.js 两谓词 | packages/zcode-cua/broker-ports.js:1-8 | SEA screenCaptureProbe.js + screen_capture_probe 方法 | skewed | isCuaPermissionStatusAvailable 形状检查(available===true)与真实 CuaPermissionStatus 信封对应;shouldRunCuaScreenCaptureProbe 恒 false(隐私 fail-closed),App 侧真实执行 WindowServer 就绪度探测(SEA 注释:'screen_capture_probe … WindowServer readiness')。两符号名在 App 产物未保留(bundle mangle)。 | 证据:SEA READ_ONLY 注释 '// screen_capture_probe … WindowServer … readiness';'dist/broker/server/screenCaptureProbe.js' 命中;符号名 grep 0 |
| BROKER_METHODS 42 方法全集(App-only) | packages/zcode-cua/broker.d.ts:78-80(BrokerMethod=string,无枚举) | SEA var BROKER_METHODS = [...](283112-283163 行段) | app-only | App 真实注册表共 42 个:broker_info, controller_status, controller_takeover, controller_stop, request_access, permission_status, input_permission_status, screen_capture_status, screen_capture_probe, supports_accessibility, list_applications, application_info, list_windows, capture_app, element_at_point, read_element, click, scroll, drag, type_text, type_text_to_app, press_key, press_key_to_app, hold_key, hold_key_to_app, cancel_input_holds, element_press, element_show_menu, element_focus, element_set_value, element_perform_action, element_select_text, paste, prevent_activation, reenable_activation, is_focus_steal_prevent… | 证据:SEA 283112-283163 完整数组;门串 'throw notAuthorized("read_clipboard is unavailable in this ZCode build.")' 等共 19 个方法名 |
| READ_ONLY_BROKER_METHODS 18 个(App-only) | packages/zcode-cua/broker.js:101 | SEA var READ_ONLY_BROKER_METHODS = new Set([...]) | app-only | broker_info, controller_status, request_access, input_permission_status, screen_capture_status, screen_capture_probe, supports_accessibility, permission_status, list_applications, application_info, list_windows, capture_app, element_at_point, read_element, is_focus_steal_prevented, pip_is_running, pip_clear_dismissed, pip_session_handshake;PIP_SESSION_BROKER_METHODS={pip_session_handshake, pip_session_event} 单列。内置注释声明 request_access 只做状态快照、prompt=false、不预热权限。仓库无只读/写权限分层。 | 证据:SEA 283195-283226 段;'var PIP_SESSION_BROKER_METHODS = new Set(["pip_session_handshake", "pip_session_event"])' |
| 错误码全集扩展(App-only) | packages/zcode-cua/broker.js(仅 6 工厂 + unavailable/helper_unavailable 默认码) | SEA types.js/brokerProtocol.js/brokerServer.js | app-only | App 侧另有 permission_denied、controller_busy(CUA_CONTROLLER_BUSY 三态 owner_x/takeover_timeout)、launch_failed、invalid_request、method_not_found、version_mismatch(IPC 版本协商 'broker IPC version 2 is older than the client's')、internal、broker_unavailable(Windows 后端 warming_up)、timeout。协议层细节仓库全部缺失。 | 证据:SEA: 'return errorResponse(request.id, "version_mismatch", Computer Use broker IPC version ${CUA_BROKER_IPC_VERSION} is older...)'、'throw new BrokerError("broker_unavailable", "Windows CUA broker backend is warming up"...';二进制计数 not_authorized=8/version_mismatch=4/timeout=9/method_not_found=2/cont… |
| helper CLI 参数族(App-only) | packages/zcode-cua/broker-server.js:13(buildHelperOpenArgs 返 []) | SEA ARG 常量段 | app-only | --controller-variant、--pip-mode、--pip-live-probe、--disable-cps-activation、--allow-unsigned-launcher-local-dev、--allow-external-broker-client-local-dev、--ghost-cursor-overlay、--ghost-cursor-capture、--permission-request-deadline-epoch-ms、--launcher-pid;另有 pip_live_probe 测试面(start_test_panel/window_bounds/drag_panel/move_test_panel/sample_ownership/initial_hit_surface,配 ZCODE_CUA_LIVE_NATIVE=1 与 scripts/pip_live_、test/pip-live-)。 | 证据:SEA 285322-285335 段 9 个 HELPER__ARG 常量;'pip_live_probe_ start_test_panel / window_bounds / drag_panel ...' 注释段 |
| ZCODE_CUA_* 环境变量族(App-only) | packages/zcode-cua(仅 BROKER_SOCKET_ENV/BROKER_UNAVAILABLE_ENV/HELPER_ADDON_ENV 3 个) | SEA 全文 | app-only | App 侧多出:ZCODE_CUA_HELPER_TEAM_ID、ZCODE_CUA_LIVE_NATIVE、ZCODE_CUA_LAUNCHER_BUNDLE_ID、ZCODE_CUA_DEV_MODE、ZCODE_CUA_DEV_MODE_ENV_KEY、ZCODE_CUA_HELPER_INSTALL_VARIANT、ZCODE_CUA_HELPER_ALLOW_UNSIGNED_LOCAL、ZCODE_CUA_HELPER_ALLOW_UNAUTHENTICATED_LOCAL、ZCODE_CUA_PLUGIN_ROOT,以及 ZCODE_HOME/ZCODE_PLUGIN_ROOT/ZCODE_RUNTIME_ENV/ZCODE_ENV/ZCODE_ALLOW_HOST_SHARP。 | 证据:grep -oE 'ZCODE_[A-Z_]+' /tmp/cua-helper-strings.txt 计数:ZCODE_HOME=3、ZCODE_CUA_PERMISSION_BROKER_SOCKET=3、ZCODE_CUA_HELPER_TEAM_ID=3、ZCODE_CUA_LIVE_NATIVE=2、ZCODE_CUA_LAUNCHER_BUNDLE_ID=2 等 |
| broker 进程/传输安全面(App-only) | packages/zcode-cua(.d.ts 仅类型,无实现) | SEA peerVerifier/brokerServer | app-only | Unix socket 对端校验全链:peer uid 校验、audit_token 提取、responsible/parent pid 代码签名校验、allowed Team 名单('peer pid ${cred.pid} delivered no audit_token; rejecting' 等 8 条 reject 路径)、broker_info 首包认领窗、onClientAuthenticated/onClientClaim 钩子、16MB DEFAULT_MAX_LINE_BYTES、15s DEFAULT_REQUEST_TIMEOUT_MS、api_version 'ZCodeComputerUseIPC-1'。 | 证据:SEA: 'cua broker verifyPeer: peer uid ${cred.uid} != ${options.currentUid}; rejecting'、'api_version: "ZCodeComputerUseIPC-1"'、'var DEFAULT_MAX_LINE_BYTES = 16 1024 1024; var DEFAULT_REQUEST_TIMEOUT_MS = 15e3' |
| 日志与诊断(App-only) | — | SEA logging/helperMain | app-only | jsonl 日志按日轮转保留 7 天(HELPER_LOG_RETENTION_DAYS=7,文件名 zcode-cua-helper-YYYY-MM-DD.jsonl)、silentBrokerLogger、module='zcode-cua-helper' 诊断标注、[cua-openapp-diag]/[cua-captureapp-settle]/[cua-cps-activation] 诊断通道、临时目录前缀 zcode-cua-cap-。 | 证据:SEA: 'var HELPER_LOG_RETENTION_DAYS = 7;'、'/^zcode-cua-helper-\d{4}-\d{2}-\d{2}\.jsonl$/u'、'mkdtempSync(join(tmpdir(), "zcode-cua-cap-"))' |
| 跨平台后端(App-only) | packages/zcode-cua/broker-server.js:4(仅 WINDOWS_DEV_CONTROL_PROTOCOL 常量) | SEA dist/native/{win linux windowsScreenCapture} + dist/broker/server/{windowsSystemSurface linuxWindowCapture linuxSystemSurface linuxIbusBypass electronNativeBackend...} | app-only | 真实包带 Windows(UIPI 提权拦截文案、命名管道、localAppData zcode/cua-broker)、Linux(ATSPI 角色表、IBus bypass)、Electron 内嵌后端(electronNativeBackend/electronInputHandlers/electronDisplayTopology 等 6 模块);仓库仅留一个 Windows 协议常量,实现面为零。 | 证据:SEA: 'capture_app: the target process (pid ${pid}) runs elevated, so Windows UIPI blocks UI Automation...'、'dist/broker/server/linuxIbusBypass.js'、'dist/broker/server/electronNativeBackend.js' 命中 |
| helper Info.plist 契约 | packages/zcode-cua/broker-helper-constants.js:1-5 | Contents/Info.plist | skewed | bundle id / display name / 可执行名与仓库常量一致(identical 部分见 helperConstants 行);漂移点:CFBundleShortVersionString=3.14.1(仓库根 3.14.0)、ZCodeCUAHelperBuildId=pipeline-291748-cead36fd(仓库无此概念)、LSUIElement=true 与 NSAppleEventsUsageDescription 为 App-only 配置。 | 证据:Info.plist:4 'dev.zcode.cua-helper'、:13-14 '3.14.1'/'pipeline-291748-cead36fd'、:22 LSUIElement |
| 嵌入模块清单:App 64 个 dist 模块 vs 仓库 13 个文件 | packages/zcode-cua/(13 个 .js/.d.ts 平面文件) | SEA '// node_modules/@zcode/zcode-cua/dist/...' 注释段 | skewed | App 内嵌完整包结构:broker/{types,brokerProtocol,ipcVersion,presentation,logging,socketPath,helperConstants,shared/cua-env}.js、broker/server/ 下 33 个模块(peerVerifier/helperVerifier/controllerLease/controllerCoordinator/axSnapshot/nativeAxSource/screenCapture 系/macOS 与 Linux 系统命令/helper 系)、pip-session/ 4 模块、native/ 5 模块、lib/ 4 模块(load-sharp/display-topology/app-frame-surfaces/unicode-text-range)、targeting/treeNormalization.js。仓库把其中协议面拍平成 broker.js/broker-server.js 两个桩文件并删去全部 server 实现。SEA 构建入口 .tmp/cua-helper-build-uPp94s/helper-sea-entry.mjs。 | 证据:grep -oE 'node_modules/@zcode/zcode-cua/dist/[a-zA-Z0-9/._-]+' 去重共 64 个模块路径;'// .tmp/cua-helper-build-uPp94s/helper-sea-entry.mjs' |
| 占位标记串(repo-only) | packages/zcode-cua/index.js:4; broker.js:40; broker-server.js:6; request-access-contract.js:6 | — | repo-only | 'Computer Use is not available in this build.' 是仓库桩的统一 fail-closed 文案,在 zcode.cjs 与 out/ 全 bundle 均 0 命中——App 侧不存在该字符串,反向证明仓库是插入桩的清洗快照。 | 证据:grep -aoc 'Computer Use is not available in this build' zcode.cjs=0;out/ grep -rl 无结果;repo index.js:4 定义 |
| ax_native.node AX 能力面(App-only) | — | Contents/Resources/ax_native.node(Mach-O 64-bit bundle arm64, 986384B) | app-only | 原生插件暴露 38 个 AX 符号:AXActivationPoint/Application/Button/Children/DefaultButton/Description/Dialog/Enabled/EnhancedUserInterface/Focused/FocusedApplication/FocusedUIElement/FocusedWindow/Frontmost/Help/Identifier/Main/MainWindow/ManualAccessibility/Menu/MenuBar/Parent/Popover/Position/Press/Raise/Role/Selected/SelectedTextRange/Sheet/Size/Subrole/Title/TitleUIElement/Value/VisibleChildren/Window/Windows + AXIsProcessTrusted。仓库包内无任何 .node 产物。 | 证据:strings ax_native.node | grep -E '^AX[A-Z]' 共 38 个唯一符号;file 输出 'Mach-O 64-bit bundle arm64' |
区域 summary:对仓库顶层 46 项、packages/ 全部 14 个包、apps/zcode-cli、scripts/ 46 项逐一与 App 产物(/tmp/zcode-reverse/app/out + glm/zcode.cjs + Resources/*)做了穷举对照。确认两个完整的 repo-only 包:formal-proof(设计期状态空间枚举器,仅部分裁决规则投影进 zcode.cjs)和 zcode-server-cli(独立远端服务器 CLI,desktop 不依赖,产物全无命中);外加架构治理三件套、.agents/skills 8 个开发技能、harness/remote、prompt-trajectory、合规文档链(NOTICE/THIRD-PARTY-NOTICES/LICENSE 及其生成脚本)等约 20 项 repo-only 内容,全部对终端用户无功能影响。config、图标、native-search 工具、build-meta、macos-window-bounds、bytecode 机制、CLI 构建链均找到字节级或字符串级同源证据。唯一内容漂移是 dev-app-update.yml 与产物 app-update.yml 的注释与 updaterCacheDirName 差异。未发现"产出本应出现在 App 但缺失"的功能性缺口;唯一存疑是第三方许可声明未随 App 分发。
本区域 rows 共 35 条(identical-evidence 15 / skewed 1 / repo-only 19)。覆盖口径:穷举范围:仓库顶层全部 46 个条目(含 dotfiles/.vscode/docs)、packages/ 全部 14 个包(含子目录 services/test、ui/test、rpc/examples、desktop/native、desktop/build、desktop/scripts 27 个脚本、zcode-server-cli/src 42 个 TS 文件)、apps/zcode-cli(16 个内部包 + tools/prompt-trajectory + dependencies/native-search)、scripts/ 全部 46 项(含 architecture/4、dev/1、license-texts/14、release-it/1、zcode-distribution/3 五个子目录)、harness/、config/、public/、patches/ 3…
| 模块/清单项 | 仓库 | App | 判定 | 说明/证据 |
|---|---|---|---|---|
| packages/formal-proof(整个包) | packages/formal-proof/{src/main.ts,src/model.ts,src/styles.css,index.html,vite.config.ts} | — | repo-only | vite+d3 的产品行为状态空间枚举器(design review 工具),App 产物无该工具对应物。但注意其裁决表并非纯文档:见下条投影证据。对终端用户无功能影响。 | 证据:仓库 packages/formal-proof/src/model.ts:486 evaluate() 裁决表;rg 'formal-proof|formalProof|heldQueueInputRequiresChoice' /tmp/zcode-reverse/app/out 全部 0 命中 |
| formal-proof 裁决规则 → CLI 投影 | packages/formal-proof/src/model.ts + apps/zcode-cli/packages/bootstrap/src/zcode-protocol-v4/projection-state.ts:1-3 | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs | identical-evidence | 投影只覆盖部分规则:runningCannotFork/justCompactedNoNeed/heldCompactQueues/completedCanSend 在 zcode.cjs 与 out/ 均 0 命中;desktop out/ 对全部 rule id 0 命中(桌面走另一套队列实现)。即设计工具部分逻辑进了 CLI,工具本体仍 repo-only。 | 证据:zcode.cjs 命中 heldQueueInputRequiresChoice(1)、compactingAcceptsFutureInput(1)、goalVerifierAcceptsFutureInput(1)、idleCannotCompact(1);projection-state.ts 注释'黄金测试 l 背书;reasonCode = product-protocol guard id' |
| packages/zcode-server-cli(整个包) | packages/zcode-server-cli/src/{cli.ts,main.ts,supervisor/{supervisor.ts,crashBudget.ts},server-core/}(42 个 TS 文件) | — | repo-only | 独立远端/无头服务器 CLI(supervisor、candidate release、--server-root),desktop 构建不依赖它,App 完全不含。host/index.js 里的 hostCapabilityUrl 是 desktop 远程协议侧概念,非本包。终端用户(桌面 App)无功能影响。 | 证据:rg 'stdioDeviceMid|--server-root|--service-entry|--supervisor|runServerCli|resolveBundledAgentWiring|crashBudget|parentDisconnect|taskActivityTracker' 于 /tmp/zcode-reverse/app/out 与 zcode.cjs 全部 0 命中;packages/desktop/package.json dependencies 无 @zcode/server-cli |
| architecture-policy.yaml | architecture-policy.yaml:1-52 | — | repo-only | 开发期架构治理策略,纯仓库设施。无用户影响。 | 证据:文件定义 16 个模块的治理策略(maxFileLines:400/forbidCycles 等);rg 'architecture-policy|maxFileLines' out/main out/renderer 0 命中 |
| .architecture-baseline.json | .architecture-baseline.json | — | repo-only | 架构检查基线文件,配合 scripts/architecture 使用。 | 证据:内容 {"version":1,"violations":[]};产物侧无任何 baseline 概念命中 |
| scripts/architecture/ | scripts/architecture/{architecture-check.mjs,policy.mjs,git-file-names.mjs,index.mjs} | — | repo-only | 治理检查执行器,消费 architecture-policy.yaml。 | 证据:root package.json scripts: architecture:check/report/baseline:update/context;产物侧 0 命中 |
| .agents/skills/(8 个开发技能) | .agents/skills/{agent-browser,ai-elements,architecture-governance,dep-refs,dogfood,electron,feature-boundary-planner,react-best-practices} | — | repo-only | 仓库内 AI 开发辅助技能(SKILL.md 形式),不随 App 分发。third-party/inventory.json 将其列为合规哈希输入(.agents/skills/agent-browser/... 等),进一步证明它们只是源码树一部分。 | 证据:rg -l 'agent-browser'(大小写敏感)/tmp/zcode-reverse/app/out → exit 1;host/index.js 中 dR="SKILL.md" 是 App 自身技能加载代码('SKILL.md is missing' 错误串),与这些开发技能无关 |
| harness/remote/ | harness/remote/{Dockerfile,build.sh,README.md} | — | repo-only | 远端功能开发的本地 SSH 测试容器,纯开发工具。无用户影响。 | 证据:Dockerfile: 'FROM ubuntu:22.04 ... 安装 openssh-server ... root:root'(README 给出 docker run -p 2222:22) |
| scripts/dev/zcode-stdio-tap.mjs | scripts/dev/zcode-stdio-tap.mjs | — | repo-only | 开发期 stdio 流量分接器。 | 证据:scripts/dev/ 目录仅此一个文件;stdio 分接调试工具 |
| apps/zcode-cli/tools/prompt-trajectory | apps/zcode-cli/tools/prompt-trajectory/{package.json,src/} | — | repo-only | CLI 的提示词轨迹记录工具(prompt-trajectory:model-io / record:prompt npm scripts),dev 工具,未编译进 zcode.cjs。 | 证据:rg 'prompt-trajectory|promptTrajectory' /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs → 0 命中 |
| NOTICE.md / THIRD-PARTY-NOTICES.md / LICENSE | {NOTICE.md(27KB),THIRD-PARTY-NOTICES.md(1.9MB),LICENSE(Apache-2.0)} | — | repo-only | 开源合规三件套未随 App 分发(Resources 顶层无任何许可/声明文件,renderer 无开源许可 UI 入口)。这是唯一一个'产出本应出现在 App 但没出现'的候选:可能是合规缺口,也可能许可声明放官网/线上分发渠道。对功能无影响,对合规或有影响。 | 证据:find /Applications/ZCode.app/Contents/Resources -maxdepth 1 -name 'NOTICE' -o -name 'LICENSE' → 空;rg -l 'THIRD-PARTY|Apache License' /tmp/zcode-reverse/app/out → 仅 pdf.worker.min-*.mjs(pdf.js 上游自带文本) |
| 第三方许可生成链(scripts) | scripts/{generate-third-party-notices.mjs,licenses.mjs,third-party-notices.mjs,third-party-npm.mjs} + scripts/license-texts/(14 个许可文本) | — | repo-only | 生成 THIRD-PARTY-NOTICES.md 的完整工具链,产物侧无对应(见上条)。 | 证据:license-texts/ 含 0BSD.txt~Zlib.txt 共 14 份;third-party/inventory.json noticesSha256 字段与之配套 |
| third-party/ 合规与构建快照 | third-party/{inventory.json,embedded-components.json,copied-components.json,npm-overrides.json,upstream/(29+ 许可源快照),runtime/(node-22.16/24.14 LICENSE)} | — | repo-only | 合规清单与上游许可快照,构建期输入,不进产物。third-party/native-search 除外(见对应行)。 | 证据:inventory.json: 'Production dependency union across current workspace projects...';upstream/ 为 sha256 命名的许可文本快照 |
| 顶层文档(AGENTS/CONTEXT/DESIGN/README) | {AGENTS.md,CONTEXT.md,DESIGN.md,README.md,README.en.md} | — | repo-only | DESIGN.md 描述的 color/typography/spacing 体系在 renderer CSS 侧有实现对应,但文档本身不随 App 分发。无用户影响。 | 证据:CONTEXT.md 是插件商店领域词汇表;DESIGN.md 是 UI 设计系统规范(529 行);AGENTS.md 是仓库 agent 指引 |
| 开发配置文件组(18 项) | .vscode/(6 文件), mise.toml, knip.json, .release-it.mjs, .oxlintrc.json, .oxfmtrc.json, .prettierignore, .npmrc, .nvmrc, .dockerignore, .gitignore, .gitattributes, .env.{development,production,example}, pnpm-lock.yaml, pnpm-workspace.yaml, ts… | — | repo-only | 构建/lint/CI/工具链配置,全部为开发期设施。.env 中的端点值以编译产物形式进入 App(shared endpoint resolver)。 | 证据:.env.example 列出 ZCODE_BASE_URL=https://zcode.z.ai 等端点;产物 main chunk 命中 INTRANET_MACHINE_HOST/ZCODE_DEPS_BASE_URL(见 intranetDefaults 行) |
| packages/rpc/examples/ | packages/rpc/examples/{01-basic-ipc.ts,02-proxy-channel.ts,03-ipc-server-client.ts,04-remote-connection.ts} | — | repo-only | RPC 用法示例,非运行代码。 | 证据:4 个编号示例文件;packages/rpc 本体编译进产物(desktop 依赖 @zcode/rpc) |
| 测试目录(services/test + ui/test) | packages/services/test/, packages/ui/test/ | — | repo-only | 单测目录不进产物。harness/remote 同类(另列)。 | 证据:两包 package.json 含 test 配套;产物仅打包 src |
| scripts/doctor-macos-release-app.sh | scripts/doctor-macos-release-app.sh:1-10 | — | repo-only | 对已安装 App 的发布体检脚本(QA 工具),不属于 App 内容。 | 证据:脚本开头:APP_PATH 默认 /Applications/ZCode.app,ZCODE_PREVIEW_IDENTITY 语义检查 |
| scripts/ 开发工具链(13 项) | scripts/{bootstrap.mjs,clean.mjs,count-lines.sh,dep-refs.mjs,dependency-graph.mjs,check-workspace-freshness.mjs,mise-run.mjs,mise-toolchain-env.mjs,load-endpoint-env.mjs,spawn-command.mjs,dev-desktop-env.mjs,dev-desktop-remote-prod.mjs} + s… | — | repo-only | bootstrap/清理/度量/依赖图/mise 包装/dev 环境等纯开发工具,无产物对应、无用户影响。 | 证据:bootstrap.mjs:152 构建 rpc/web/formal-proof(含 formal-proof,进一步证明其为仓库侧资产);dev-desktop-env.mjs 被 root scripts dev:desktop:* 引用 |
| packages/desktop/native/windows-browser-import-helper | packages/desktop/native/windows-browser-import-helper/ | — | repo-only | Windows 浏览器导入 helper 源码(由 desktop/scripts/build-windows-browser-import-helper.mjs 构建),只进 Windows 安装包;本 mac App 无对应属平台差异,非清洗缺失。 | 证据:find /Applications/ZCode.app/Contents/Resources -name 'browser-import' → 空;Resources 仅有 macos-window-bounds |
| packages/desktop/dev-app-update.yml | packages/desktop/dev-app-update.yml:1-6 | /Applications/ZCode.app/Contents/Resources/app-update.yml | skewed | 同源文件内容漂移:产物为发布版(去 dev 注释、cacheDirName 换为产品标识)。漂移本身符合 dev/prod 分工,属预期差异。 | 证据:diff:仓库版多 2 行注释('修复原因:显式开启开发态自动更新...')+ updaterCacheDirName: zcode-dev-updater;产物版无注释 + updaterCacheDirName: '@zcodedesktop-updater';url: http://localhost:8081 两侧相同 |
| CLI 构建与分发链(scripts) | scripts/{build-zcode.mjs,zcode-distribution/{assets.mjs,installer.mjs,runner.mjs},zcode-distribution-smoke.mjs,deterministic-tar-archive.mjs,build-desktop-agent-cli.mjs} | glm/zcode.cjs + out/main/chunk-YSD25WTT.js | identical-evidence | 构建/分发/冒烟工具链在产物中有直接字符串级对应。 | 证据:chunk-YSD25WTT.js: 'nodeBundleEntryFile:"zcode.cjs"'、'kn="apps/zcode-cli/packages/cli/dist/zcode.cjs"'、'[zcode-agent-deploy] glm: 开发态 zcode.cjs 未变化,跳过';zcode.cjs 头部 YJn="zcode",GBt="zcode-cli" |
| desktop-agent 字节码机制(scripts) | scripts/{build-desktop-agent-bytecode.mjs,compile-desktop-agent-bytecode.cjs,desktop-agent-bytecode-runtime.cjs} | out/host/chunk-OPKMCWQ2.js | identical-evidence | App 保留字节码优化路径(默认关闭、随包为明文 zcode.cjs),构建脚本与运行时提示语同源。 | 证据:host chunk: 'process.env.ZCODE_DESKTOP_AGENT_BYTECODE==="1"' 时加载 'zcode.bytecode.cjs',并含 '请运行 pnpm build:desktop-agent:bytecode' 错误提示 |
| apps/zcode-cli(CLI 本体,16 个内部包) | apps/zcode-cli/packages/{adapters,bootstrap,browser-use-plugin,cli,contracts,core,debug,dynamic-workflow,dynamic-workflow-runtime,i18n,node-repl-host,shared-types,superpowers-plugin,swift-bridge,telemetry,tui} | glm/zcode.cjs(14MB)+ glm/packages/{browser-use-plugin,node-repl-host} | identical-evidence | CLI 整体有产物对应(内部 3.14.1 vs 仓库 0.16.9 的版本差属已知清洗快照问题,归整体审计)。App 侧 glm/packages 另有 12 个仓库没有的插件(android-emulator/documents/image-search/ios-simulator/pdf/plugin-creator/presentations/restore-legacy-sessions/skill-creator/spreadsheets/zcode-cua/zcode-guide),为 app-only,属反向对照区域。 | 证据:zcode.cjs: superpowers 1 命中、dynamic-workflow 19、dynamicWorkflow 41、swiftBridge 1、@zcode/telemetry 1;进程标题 'zcode-cli' |
| native-search 工具链(scripts) | scripts/{build-native-search-tools.mjs,package-native-search-tools.mjs,prepare-native-search-tools.mjs,native-search-tools-config.mjs,native-search-tools-{bundle-meta,process,unix,verify,windows,windows-pe}.mjs,remote-native-search-tools-co… | /Applications/ZCode.app/Contents/Resources/tools/{bfs,ripgrep,ugrep} | identical-evidence | 构建链与产物对应完整。 | 证据:native-search-tools-config.mjs: NATIVE_SEARCH_RIPGREP_REVISION="4649aa9700"、NATIVE_SEARCH_DEPENDENCIES_DIR=apps/zcode-cli/dependencies/native-search;App Resources/tools 三工具齐备 |
| config/(默认配置 + 内置 provider) | config/{default.json,provider/zcode-builtin.json} | /Applications/ZCode.app/Contents/Resources/config/{default.json,provider/zcode-builtin.json} | identical-evidence | 逐字节格式不同但语义完全一致(含 builtinModelIds: gpt-5.6-luna/grok-4.6 与全部 reasoningLevel values)。 | 证据:diff<1) 双侧均 'SEMANTICALLY IDENTICAL';仅 JSON 缩进/数组展开格式差异 |
| public/ 图标资产 | public/{[email protected],logo/icons/{icon.icns,icon.ico,16x16~1024x1024.png}} | /Applications/ZCode.app/Contents/Resources/{icon.icns,icon.png} | identical-evidence | 图标字节级一致。 | 证据:cmp icon.icns vs Resources/icon.icns → 0 差异;public/[email protected] == Resources/icon.png |
| patches/(pnpm patchedDependencies) | patches/{@[email protected],@[email protected],@[email protected]} | /tmp/zcode-reverse/app/node_modules/@arms/{rum-electrum→rum-electron,rum-browser,rum-core} | identical-evidence | 补丁在构建期应用于依赖,产物以补丁后形态存在。@ai-sdk 因打包进 bundle 故无独立 node_modules 条目,非缺失。 | 证据:root package.json pnpm.patchedDependencies 三条;app node_modules 存在 @arms/rum-electron;@ai-sdk 无顶层目录(AI SDK 代码打包进 main bundle) |
| packages/desktop/build/(安装器资产) | packages/desktop/build/{entitlements.mac.plist,entitlements.helper.plist,dmg_background.png,installer.nsh,icon*,icons/} | /Applications/ZCode.app/Contents/Resources/{icon_windows.png,icon.icns,icon.png} | identical-evidence | 安装器/签名资产有产物对应;dmg 背景与 NSIS 脚本属安装包构建输入(.app 内不可见,属正常)。 | 证据:Resources 顶层 icon_windows.png/icon.icns/icon.png 与 build/ 资产对应;icon.icns 字节一致 |
| desktop 构建脚本组(build-metadata 等) | packages/desktop/scripts/(27 个:bundle.mjs,run-production-build.mjs,prepare-runtime-assets.mjs,build-metadata.mjs,build-macos-window-bounds.mjs,packaged-sourcemap-cleanup.mjs,app-asar-repack.mjs 等) | /tmp/zcode-reverse/app/out/* + out/metadata/build-meta.json | identical-evidence | 构建脚本的产物(out 五目录、metadata、sourcemap 清理结果)全部在 App 中得到验证。conversation-docker-plan.mjs、ttft-otlp-receiver.mjs 为 dev 工具。 | 证据:build-meta.json: {appVersion:"3.14.1", buildCommitId:"cead36fd", buildTime:"2026-09-20T07:37:29.416Z", electronBuilderVersion:"26.8.1"};out 内 *.map 文件数 = 0 |
| macos-window-bounds(native + 脚本) | packages/desktop/native/macos-window-bounds/ + packages/desktop/scripts/build-macos-window-bounds.mjs | /Applications/ZCode.app/Contents/Resources/macos-window-bounds | identical-evidence | 原生窗口边界工具与产物一一对应。 | 证据:Resources/macos-window-bounds 存在(find 命中) |
| scripts/intranetDefaults.mjs | scripts/intranetDefaults.mjs:1-20(INTRANET_MACHINE_HOST/INTRANET_ASSET_SERVICE_PORT=12345) | out/main/chunk-DLYU5YW3.js + chunk-YSD25WTT.js | identical-evidence | 内网镜像/私有部署地址解析逻辑进入产物(面向私有化部署用户,非纯 dev)。 | 证据:rg 'INTRANET_MACHINE_HOST|ZCODE_DEPS_BASE_URL' 命中两个 main chunk 各 1 处 |
| packages/model-option-map | packages/model-option-map/src/{option-maps.ts,compiler.ts,evaluator.ts,parser.ts,merge-patch.ts}(8 文件) | glm/zcode.cjs | identical-evidence | 模型选项映射 DSL 编译器经 apps/zcode-cli 依赖链进入 CLI 运行时,证据确凿;desktop 侧经 @zcode/provider(provider-node/shared) 依赖,未在 out 检出该错误串(可能被 tree-shake 或内联),桌面侧细节 unresolved 但包本体非 repo-only。 | 证据:zcode.cjs 命中 'reasoningLevel requires an effective value'(option-maps.ts:27 同串);desktop out/* 对 'effective value' 0 命中(rg exit=1) |
| packages/zcode-cua | packages/zcode-cua/{broker.js,broker-socket-path.js,pip-session.js,request-access-contract.js,...}(26 文件) | Resources/cua-helper/ZCode Computer Use.app + glm/packages/zcode-cua-plugin + out/{main,scheduler,host} | identical-evidence | 仓库版 zcode-cua 是契约/协议层;App 版另有真实 CUA helper('ZCode Computer Use.app'),为已知 app-only 私有功能的协议侧共享部分。 | 证据:rg 'broker-socket-path|request-access-contract|pip-session' 命中 out/main/index.js、out/main/chunk-YSD25WTT.js、out/scheduler/index.js、out/host/index.js、zcode.cjs |
| packages/web | packages/web/src/{main.tsx,auth/(7 文件),share/(6 文件),communityUrl.ts,webThemeSeed.ts} | out/renderer/assets/{IntlProvider-DW5rmeLm.js,src-1E9aqq2Y.js,styles-CuFc3dtZ.js} + out/main/chunk-DLYU5YW3.js + out/host/index.js | identical-evidence | web 入口(分享落地页/OAuth 回跳)逻辑进入产物。 | 证据:rg -li 'conversationShare|webThemeSeed|webZaiOAuth' 命中上述 renderer assets 与 main/host chunk |
本节单列 App 有而仓库无的功能面,主体取自区域 1(app-only-full)的 47 条 app-only rows;其余 79 条 app-only rows 分布在区域 2/3/4/5/6/7/10/11/12/14/15 的主表中(App 全局合计 126 条 app-only),此处不重复罗列。
区域 1 覆盖口径:系统枚举了 11 大功能面:Bots(4 平台接入+命令+运行时+派发+持久化)、rewards(webview/白名单/持久化/UI)、webRemoteControl(管理器/9 条 app-only IPC/中继 WS/设备配对/RPC 传输协议/移动端 UI)、marketingTouch(服务/端点/报文/UI)、多智能体权限模式(主枚举 10 值 vs 仓库 6 值、子代理 frontmatter 6 值 vs 2 值、多引擎模式、多引擎建任务/切换)、CUA 安装管线(安装器实现、签名校验链、下载安装管线)、透明代理(核查后为同源)、云内容(服务+publishedAssets 白名单)、hero-sandbox、BigModel 双端点(3 组测试端点+按环境拆分 env)、以及 i18n 全量兜底扫描发现的 manualClaimPlan、Aliyun 验证码、模型槽位映射、插件捆绑包等。方法:对全量 zcode: IPC 通道(144 vs 159)、服务工厂名(createXxxService)、i18n 键空间(6004 vs 5477,527 个 app-only 键)、URL 常量、持久化键做集合差分,再对每个差分单元小范围 Read 取证。共 45 个功能面、49 条 rows,未发现遗漏面;仅 3 条 identical-evidence 边界行用于划界(透明代理、Stripe/PayPal、内网端口设施),其余均为 app-only。
| # | 功能面(App 独有) | App 侧位置 | 说明 |
|---|---|---|---|
| 1 | Bots 服务总装与持久化(createBotsService + bot-config.v3.json / bot-state.json / 旧版 bot-config.json 导入) | /tmp/zcode-reverse/app/out/host/index.js | 宿主进程注册 createBotsService(仓库 packages/services 无对应服务目录与工厂),配置持久化为 bot-config.v3.json,状态为 bot-state.json,并支持从旧版 bot-config.json 导入(importLegacyBotConfig 归一化 bots 映射、normalizeBotConfig 对 weixin 删除 webhookUrl)。 |
| 2 | Bots 平台接入:Telegram(长轮询+附件+回调查询) | /tmp/zcode-reverse/app/out/host/index.js | 对接 https://api.telegram.org/bot 与 /file/bot:getMe 校验、getUpdates 长轮询(含 409 冲突 handled-elsewhere 状态)、callback_query 解码('zc:' 前缀转命令)、photo/document/video/audio/voice 附件(readTelegramAttachments)、超长文本按 3900 字符分段(splitTelegramText,摘要 180 字符);actor 标识 provider:"telegram"+botId+providerUserId。 |
| 3 | Bots 平台接入:Feishu/Lark(WebSocket 长连接) | /tmp/zcode-reverse/app/out/host/index.js + /tmp/zcode-reverse/app/node_modules/@larksuiteoapi/[email protected] | 通过飞书官方 WSClient 建立 WebSocket(Domain.Lark/Domain.Feishu 双域),Base URL getFeishuBaseUrl 在 https://open.feishu.cn 与 https://open.larksuite.com 间切换;支持 appId/appSecret 校验(pollFeishuAppRegistration、appName 拉取)、per-bot WebSocket 运行时状态(connecting/running/stopped/starting/ handled-elsewhere)、跨窗口持有锁 acquireFeishuWebSocketLock(${provider}-websocket)。 |
| 4 | Bots 平台接入:微信 iLink(扫码登录+长轮询) | /tmp/zcode-reverse/app/out/host/index.js | 对接 https://ilinkai.weixin.qq.com:GET /get_bot_qrcode?bot_type=3 取二维码,轮询 /get_qrcode_status?qrcode=... 直至 success 并取 bot_token 与 ilink_bot_id/bot_id;请求头 buildHeaders={content-type:application/json, AuthorizationType:'ilink_bot_token', Authorization:'Bearer …', 'X-WECHAT-UIN':随机 uin}(buildRandomWechatUin 生成 0..4294967296 的 base64);激活态记录 weixinActivatedAt/weixi… |
| 5 | Bots 平台接入:Webhook(入站回调+出站推送) | /tmp/zcode-reverse/app/out/host/index.js | Webhook 型 bot 向配置的 webhookUrl POST 出站消息,头部携带 'x-zcode-bot-secret',报文 type 为 zcode.bot.message / zcode.bot.test(连通性测试)/ zcode.bot.elicitation_request(带 elicitation 载荷时升级类型),body 含 botId/provider:'webhook'/userId/text/sentAt;密钥持久化键 buildBotWebhookSecretKey='bot:<id>:webhook-secret';入站回调启用状态提示 'Webhook bot is enabled for inbound callbacks.'。 |
| 6 | Bots 命令系统(help/status/new/workspace/model/mode/thoughtLevel/reply/bind + 命令策略) | /tmp/zcode-reverse/app/out/host/index.js | 聊天命令集 dy=['help',...['status','new','workspace','model','mode','thoughtLevel','reply'],'bind'];命令策略 getUserCommandPolicy 从 allowedCommands 派生('This command is disabled for the current bot.');bind 仅限私聊('Bots can only bind in a private chat.')并校验 bot 存在(bindBotMissing);回调数据 'zc:xxx' 解码为命令;同一凭据的轮询 bot 不可重复启用('Enabled polling bots cannot share the same credentia… |
| 7 | Bots 运行时状态机与跨窗口锁(bots.runtime.* 15 条状态 + bots-runtime-locks) | /tmp/zcode-reverse/app/out/host/index.js + out/main 数据分区前缀表 | 每平台运行时状态以 i18n messageId 上报(bots.runtime.botDisabled、telegramTokenMissing、telegramPollingFailedRetrying、telegram/feishu/weixin 各 Running/Starting/Stopped/HandledElsewhere 等 15 条);跨窗口互斥由运行时锁保证(BotRuntimeLock/LockPath/LockOwner/LockLeaseAt/LockConflictError/LockCleanupRetryable),锁文件落在数据分区 v2/bots-runtime-locks;附件缓存分区 v2/bot-attachments。 |
| 8 | Bots 任务派发与远程工作区联动(botDeliveryTarget + bot-channel-continuous + BotRemoteWorkspaceService) | /tmp/zcode-reverse/app/out/host/index.js + out/main/index.js | 任务元数据携带 botDeliveryTarget 将任务输出回流到 bot 通道(deliveryKind:"bot-channel-continuous",BotReplyGranularity/BotReplyToolCalls/BotToolCallReplyTerminal 控制工具调用粒度回包);BotRemoteWorkspaceService 使 bot 可驱动远程工作区,IPC 通道 zcode:bot-remote-workspace-reconnected(仓库通道清单无此通道);拒绝理由 reason:'bot_disabled'/'bot_missing'/'Denied by bot command'。 |
| 9 | Rewards 奖励页整层(rewardsWebview.cjs 专属 preload) | /tmp/zcode-reverse/app/out/preload/rewardsWebview.cjs(698KB,仓库 src/preload 目录清单无此文件) | App 独有第 7 个 preload:为 /(cn|en)/rewards 官网页安装 installRewardsPageBridge,监听页面 zcode-rewards-context CustomEvent 同步 theme/locale/auth 三通道订阅;主进程在受信 URL 时把 webPreferences.preload 指向 ../preload/rewardsWebview.cjs 并支持 --zcode-rewards-dev 开发标记;页面路由 zod 判别联合 page: 'upgrade'|'rewards'|'settings'(仓库仅有 codingPlanWebview 购买页桥)。 |
| 10 | Rewards 受信 URL 白名单(isTrustedRewardsUrl) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js(scheduler 同构副本) | 白名单:origin ∈ {https://zcode.z.ai, https://zcode.chatglm.site}(生产+测试),pathname 必须 /^\/(cn|en)\/rewards\/?$/,必须带 searchParams embedded=app;禁止 URL userinfo;dev 模式放行 http://localhost:3000,e2e 模式放行 127.0.0.1/localhost 的 http。主 preload 与 rewards preload 各有一份同构实现(Jv/Yv、Gie)。 |
| 11 | Rewards 持久化与主题/语言/登录态桥(persist:zcode-rewards) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/preload/rewardsWebview.cjs + out/scheduler/index.js | redux-persist 键 'persist:zcode-rewards',schema {theme: zai-light|zai-dark, locale: zh-CN|en-US, auth: {status: ready|anonymous…}};preload 侧维护 theme/locale/auth 三个 Set 订阅器并返回退订函数;活动会话限流参数 {rounds:200, network:100, dedupe:2000}(sessionId schema 校验)。 |
| 12 | Rewards 入口 UI(菜单+角标+打开官网) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 应用菜单/界面含奖励入口:rewards.title(奖励)、rewards.menuTitle、rewards.menuBadge(角标)、rewards.openWebsite(打开官网)、rewards.loadFailed(页面加载失败,请重试),中英双语各一份。 |
| 13 | Web 远程控制管理器与 9 条 app-only IPC 通道 | /tmp/zcode-reverse/app/out/main/index.js + out/main/chunk-YSD25WTT.js + renderer | main 进程 WebRemoteControlManager/IpcHandlers/FeatureGate/DeviceTransport/RelayAuthProvider/RelayAuthStorageProvider/SharedHostAttachments 全套类;通道:zcode:start-web-remote-control、zcode:stop-web-remote-control、zcode:get-web-remote-control-status、zcode:web-remote-control-status-changed、zcode:reset-web-remote-control-pairing、zcode:web-remote-control-reconnect-works… |
| 14 | Web 远程控制中继链路(wss 中继 + 按 ZCODE_ENV 切换) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js | resolveWebRemoteControlRelayWsUrl:测试环境 'wss://zcode.chatglm.site/ws',生产 'wss://zcode.z.ai/ws'(默认 Zx),可 overrideUrl 覆盖;webShareCallbackUrl ${origin}/cn/share/callback、remote callback ${origin}/…/remote/callback 一并组装。 |
| 15 | Web 远程控制外部中继设备配对(deviceSid+passHash + 二维码 URL) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/main/index.js + out/scheduler/index.js | 设置持久化键 webRemoteControlExternalRelayDevice={deviceSid} 与独立存储的 passHash 双因子加载,二者不齐即告警 '[web-remote-control] external relay auth reset' 并清空(ResetWebRemoteControlPairing);配对二维码 buildWebRemoteControlExternalQrUrl 在 baseUrl 上追加 sid/hash/t(timestamp)/mid(deviceMid)/name(deviceName)/app_version 参数;上次启用上下文 webRemoteControlLastEnabledContext={workspacePath, workspace… |
| 16 | Web 远程控制 RPC 传输协议(帧/校验和/ACK/中继信封/移动端视图) | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs + /tmp/zcode-reverse/app/out/main | zcode.cjs(CLI 运行时)导出全套 webRemoteControl schema:RpcTransportFrame/Checksum/Ack/Identity/Id、RpcRelayEnvelope、Workspace/TaskTarget 与列表结果、WindowBootstrapResult、ReconnectWorkspace 请求/结果、MobileViewState、MobileDeviceInfo、FailureReason、ExternalWorkspaceBridge、AppPayload、PlatformMethod(isDockerAvailable/listWSLDistros/listDockerContainers/listSSHConfigAliases/loadMcp… |
| 17 | Web 远程控制移动端 Web UI(mobileHome/mobileQr/botChannel 远控等 104 个 i18n 键) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 远程控制 Web 端界面:mobileHome(22 键)、mobileShell、mobileQr、refreshQr、copyLink、themeMenu、status/statusDetail/statusTag/triggerStatus/taskStatus、failure(12 键),并可在 Web 端操控 botChannel(12 键)——移动端可查看/触发任务并操纵 bot 通道。 |
| 18 | marketingTouch 营销触达服务(GET /api/v1/marketing/touch + POST /api/v1/marketing/touch/action) | /tmp/zcode-reverse/app/out/host/index.js | createMarketingTouchService:GET /api/v1/marketing/touch?seq=<自增> 拉取投放(响应 {code:0,data:{server_time,language,deliveries[]≤32}},popup 弹出类型),POST /api/v1/marketing/touch/action 上报 {campaign_id, action_type:'confirm'|'cancel'}(schema I3: locale+scope:uuid+campaignId≤128+actionType 枚举);请求头 X-Device-Mid、X-Client-Language、X-ZCode-App-Version、可选 Authorization Beare… |
| 19 | marketingTouch 营销活动 UI(7 态卡片) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js + assets/index-BvllzT2k.js | 渲染层营销触达操作卡片状态机:idle(准备就绪)/verifying(正在验证…)/submitting(正在处理…)/preparing(操作成功,正在准备结果…)/succeeded(操作成功)/failed(操作失败,请稍后重试。)/uncertain(暂时无法确认操作结果…为避免重复提交,本轮不再重试。)。 |
| 20 | 手动领取体验套餐 API(billing/preview + billing/claim) | /tmp/zcode-reverse/app/out/host/index.js | 编码套餐手动领取:GET /api/v1/zcode-plan/billing/preview?app_version=<v>&platform=<os>(Bearer 凭据 credentialService.load),POST /api/v1/zcode-plan/billing/claim 完成领取;错误码 manual_claim_preview_failed / manual_claim_preview_missing_data;与验证码头(X-Aliyun-Captcha-Verify-Param 等)叠加使用。 |
| 21 | 手动领取体验套餐 UI(manualClaimPlan.* 53 个 i18n 键横幅) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 限时领取横幅与领取流程:banner.aria(可领取的体验套餐)/banner.tag(限时可领取)/bonus/claim/close、dismissConfirm 二次确认、period.daily|oneTime、subtitle {model} 每日额度|一次性额度、claim.ticket.benefits 等领取权益文案。 |
| 22 | Aliyun 验证码集成(AliyunCaptcha.js + captcha-network 埋点 + 校验头) | /tmp/zcode-reverse/app/out/main/index.js + out/host/index.js + renderer | main 进程 onBeforeRequest 拦截验证码资源(/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js,dynamic_js/dynamic_css/device_script 分类)并打点 '[captcha-network]' resource.start/end(5 分钟 TTL、容量 128);host 侧向 API 请求注入 'X-Aliyun-Captcha-Verify-Param' 与可选 'X-Aliyun-Captcha-Verify-Region'(captchaRegion),附 X-ZCode-App-Version、X-Platform;渲染层有 chat.captcha.verifyFailed / chat.error.a… |
| 23 | 任务权限模式主枚举扩展(10 值 vs 仓库 6 值) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/host/index.js | App 权限/模式全集 Nae={default,yolo,plan,edit,acceptEdits,auto,dontAsk,bypassPermissions,autoEdit,build}(新增 4 值);归一化映射:yolo/bypassPermissions/dontAsk→yolo,build/default/acceptEdits/autoEdit→build,plan→plan,edit→edit,auto→auto;渲染层模式徽标色集 Ewe={acceptEdits,auto,bypassPermissions,default,dontAsk,plan}(agent frontmatter 用)。 |
| 24 | 子代理 frontmatter 权限模式扩展(6 值 vs 仓库 2 值) | /tmp/zcode-reverse/app/out/host/index.js | App 解析 subagent markdown frontmatter 时接受 permissionMode ∈ {acceptEdits,auto,bypassPermissions,default,dontAsk,plan},并按 mode 渲染徽标与描述(Accept Edits/接受编辑、Don't Ask/无需询问、Bypass Permissions/绕过权限等);设置页 settings.subagents.permissionMode.{default,acceptEdits,dontAsk,bypassPermissions} 四个新选项。 |
| 25 | 多引擎权限模式体系(claude/codex/gemini/glm/opencode 各自模式描述) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 每个引擎有独立模式枚举与描述:claude: default/acceptEdits/plan/auto/dontAsk/bypassPermissions;codex: agent/agentFullAccess/auto/fullAccess/readOnly;gemini: autoEdit/default/plan/yolo;glm: default;opencode: build/plan——即 App 支持以多引擎执行任务且权限模式按引擎适配。 |
| 26 | 多引擎新建任务与会话内切换(newTask.claude/codex/gemini/opencode + chat.agentSwitch) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 任务列表新建任务可选引擎 claude/codex/gemini/opencode(taskList.selectProvider),codex 连通性不可用提示 taskList.codexConnectivityUnavailable;聊天中切换 agent:chat.agentSwitch.switchTo/success/failed。 |
| 27 | CUA Helper 安装器真实实现(仓库为'功能不可用'桩) | /tmp/zcode-reverse/app/out/host/index.js | 仓库虽然保留 createCuaHelperInstaller 接口(desktopCuaHelperInstaller.ts 归一化层仍在),但底层 zcode-cua 包被替换为全桩;App 内为完整实现:ensureInstalled 单飞 Map 去重、installRoot mkdir(recursive,mode:0o700)、acquireInstallLease(assertHeld/release, TTL 120s)、verifyInstalled 走 verifyCuaHelperBundle;Helper app 解析 resolvePackagedCuaHelperAppPath(resources/cua-helper/)。 |
| 28 | CUA Helper 签名与门禁校验链(codesign/codesign detail/spctl/syspolicy_check) | /tmp/zcode-reverse/app/out/host/index.js | 校验管线 verifyCuaHelperBundle:readBundleInfo(Contents/Info.plist) → inspectCodesignDetails(best-effort) → verifyCodeSignature('/usr/bin/codesign --verify --deep --strict') → 未跳过时 assessGatekeeper('/usr/bin/syspolicy_check distribution',失败回退 '/usr/sbin/spctl -a -vv -t exec'),产出 {bundleInfo,codesign,gatekeeperAssessment,releaseEligible,mode:'release'|'local_dev_… |
| 29 | CUA Helper 下载安装管线(锁定租约+限量下载+隔离属性清除+日志修剪) | /tmp/zcode-reverse/app/out/host/index.js | macOS 专用自动安装(非 darwin 报 install_failed):版本固定 embeddedBuildId(打包缺身份拒绝 unpinned 安装);下载 ZCode-CUA-Helper-<version>-mac-<arch>.zip,URL 取 ZCODE_CUA_HELPER_DOWNLOAD_URL 或 ZCODE_CUA_HELPER_DOWNLOAD_BASE_URL 拼接;默认超时 30s(ZCODE_CUA_HELPER_DOWNLOAD_TIMEOUT_MS)、上限 200MB(ZCODE_CUA_HELPER_MAX_DOWNLOAD_BYTES,超限抛 'download exceeded max size');元数据 .zcode-cua-helper-meta.json… |
| 30 | 云内容服务(createCloudContentService:lease 缓存 + sha256 清单 + 本地文件回源) | /tmp/zcode-reverse/app/out/host/index.js | createCloudContentService(IN):prepare({bundle}) 经受信校验后 acquire lease,下载到 cacheRoot=cache/content-bundles/<M_e()>/,返回 {leaseId,cacheHit,sha256,entry,url:'<root>/<leaseId>/<encoded entry>'};控制文件 schemaVersion:1 记录 endpointKey/leaseId/leaseUntil(默认 30s)/nextEligibleAt/failureCount 用于失败退避与 GC;release/disposeAllAndWait 全量清理(含 closeAllConnections);readPublishedMed… |
| 31 | publishedAssets 发布资产白名单(https-only + sha256 钉扎 LRU) | /tmp/zcode-reverse/app/out/host/index.js | TN({allowLoopback}) 构建白名单:仅允许 https(test 环境或 NODE_ENV=development 放行 127.0.0.1/localhost/[::1]);allow(src,sha256) 入 LRU(512 个 src、每个 src 最多 8 个 sha256,淘汰最旧);allows/allowsUrl 校验 src+sha256 对;媒体类型 image(default/dark)、video(src/fallback)、lottie、interactive_bundle;越界引用抛 'cloud_content_source'。 |
| 32 | hero-sandbox 互动内容运行时(zcode-hero-sandbox-v1) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js + out/preload/rewardsWebview.cjs + out/scheduler/index.js + renderer/assets/styles-CuFc3dtZ.js + zcode.cjs | 营销/欢迎页 hero 内容三类:video(src/darkSrc/poster/autoplay/loop/muted:true/fit cover|contain)、lottie(src/darkSrc/autoplay/loop/speed 0.1-4/fallback)、interactive_bundle(runtime 固定 'zcode-hero-sandbox-v1',bundle schema,viewport 固定 4:3,data JSON 序列化 ≤64KB,events, fallback);渲染层有 hero-overlay/hero-slot/hero-error/hero-unresolved/hero-v1/hero-type 标记;schema 在 main、schedu… |
| 33 | BigModel/Z.ai 双端点(生产+测试三组端点 + 按环境拆分 env) | /tmp/zcode-reverse/app/out/scheduler/index.js + out/main/chunk-YSD25WTT.js + zcode.cjs | App 内置端点对:产品 web zcode.z.ai(生产)/zcode.chatglm.site(测试);业务 API api.z.ai(生产)/api.chatglm.site(测试);BigModel bigmodel.cn(生产)/dev.bigmodel.cn(开发测试)。resolveBigModelApiOrigin 按 ZCODE_ENV 在 BIGMODEL_PRODUCTION_API_BASE_URL 与 BIGMODEL_TEST_API_BASE_URL 间选择;OAuth 同理 ZAI_PRODUCTION_OAUTH_ORIGIN/ZAI_TEST_OAUTH_ORIGIN。仓库把默认值/测试端点全部清洗为仅生产默认。 |
| 34 | 内网默认主机 studio.zcode-ai.com(依赖自举源) | /tmp/zcode-reverse/app/out/host/index.js + zcode.cjs | App 将默认内网机器 host 硬编码为 studio.zcode-ai.com(可被 INTRANET_MACHINE_HOST/ZCODE_DEPS_BASE_URL 覆盖),指向 http://studio.zcode-ai.com:12345/zcode/deps 依赖源与 :3850/api/intranet/probe 探针;仓库保留全部端口/路径/解析逻辑但默认主机被清空。 |
| 35 | 模型供应商自定义端点与 Claude 槽位映射设置(anthropic/openai/geminiEndpoint + slot 映射) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 设置页 modelProvider 增加:Anthropic/OpenAI/Gemini 自定义接口地址输入(placeholder 如 https://open.bigmodel.cn/api/anthropic)、Claude 模型槽位映射 slot.haiku/opus/sonnet/reasoning(claudeMapping/claudeMappingDescription/mappingNotSet/endpointNoMatch 校验文案)、codingPlan.billingDiscountInfo.open 折扣信息入口。 |
| 36 | 插件市场 Claude Code 插件接入 + zcode 专属插件标记 | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 插件设置支持 Claude Code 插件市场(marketplace.claudeCodePlugins)与 zcode 专属插件(zcodeOnly)筛选/标记。 |
| 37 | 技能 agent 归属(common/glm/unknown) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 技能设置按 agent 归类展示:settings.skills.agent.common/glm/unknown 三类。 |
| 38 | 设置页专属页面区分(webview page 判别联合含 rewards) | /tmp/zcode-reverse/app/out/main/chunk-YSD25WTT.js | App 设置/内嵌 webview 页面 schema:discriminatedUnion page ∈ {upgrade, rewards, settings},settings.section ∈ [general,appearance,models,browser,computer_use,memory,subagents,plugins,mcp,skills,commands,hooks,usage],popup 消息类型;rewards 页整支仅在 App。 |
| 39 | appHeader:复制 Claude JSONL 路径 + 供应商配置直达 | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 应用头部菜单:复制 Claude JSONL 会话文件路径(copyClaudeJsonlPath)、跳转供应商配置(goToProviderConfig 前后缀文案)、用编辑器打开供应商配置失败提示(openProviderConfigWithEditor*/openProviderConfigInEditorFailed)。 |
| 40 | Server 型远程工作区接入 UI(server.* 12 键 + remote.kind.server) | /tmp/zcode-reverse/app/out/host/index.js + renderer | 远程工作区向导的 dedicated server 表单:server.name/token/url/workspacePath 与校验(invalidUrl/urlRequired/urlRequired/workspacePathDescription),remote.kind.server 描述;host 侧 buildConnectionKey 对 kind 'server' 生成 '<kind>:dedicated:<id>'。 |
| 41 | 官方插件捆绑包(glm/packages 14 个中 12 个仓库未随附源码) | /Applications/ZCode.app/Contents/Resources/glm/packages/ | App 随附 14 个插件包:android-emulator、browser-use、documents、image-search、ios-simulator、node-repl-host、pdf、plugin-creator、presentations、restore-legacy-sessions、skill-creator、spreadsheets、zcode-cua、zcode-guide;除 browser-use/node-repl-host 外其余 12 个的包体仅存在于 App(仓库零命中包体,仅有市场定义引用)。 |
| 42 | onboarding 智能体设置步骤(agentSettings) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 引导流程新增 agentSettings 步骤(onboarding.step.agentSettings、stepDescription.agentSettings、agentSettings.providersToggleAllAra、footer.selection)。 |
| 43 | memory 查看器禁用开关(settings.memory.viewer.disabled) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js | 记忆设置存在 viewer.disabled 状态文案(查看器不可用时的 UI 分支),仓库 i18n 无对应键。 |
| 44 | Bots/RemoteControl 双通道恢复通知(zcode:bot-remote-workspace-reconnected 等) | /tmp/zcode-reverse/app/out/main(通道常量表) | app-only 通道全集:bot-remote-workspace-reconnected、get-web-remote-control-status、reset-web-remote-control-pairing、start/stop-web-remote-control、sync-web-remote-control-tasks/workspaces、web-remote-control-reconnect-workspace、web-remote-control-status-changed(共 9 条,通道名 zcode: 前缀)。 |
| 45 | 遗留 Bot 配置导入与凭据校验(legacy bot-config + credential 冲突检查) | /tmp/zcode-reverse/app/out/host/index.js | 升级链路:检测旧版 bot 配置结构(wa(e.bots))后按新 schema 迁移并标记 BotStorageMigrated 事件;启用轮询的 bot 间凭据唯一性校验报错 'Enabled polling bots cannot share the same credential.';modelSelection 归一($$(n))后并入 currentOptions。 |
| 46 | OAuth/登录入口常量(bigmodel.cn/login、api.z.ai/api/auth/z/login) | /tmp/zcode-reverse/app/out/host/index.js | host 内置登录入口含 https://bigmodel.cn/login(BigModel 控制台登录跳转)为 App 独有;api.z.ai/api/auth/z/login 与 chat.z.ai OAuth authorize/userinfo 与仓库同源(划界说明,不重复计)。 |
| 47 | i18n 键空间总体差分(兜底扫描结论) | /tmp/zcode-reverse/app/out/renderer/assets/IntlProvider-DW5rmeLm.js(6004 键) | PCRE 提取 'key': '格式 i18n 键做集合差分:527 个 App-only 键,分布 bots 258、webRemoteControl 104、manualClaimPlan 53、mode 38、settings 25、server 12、appHeader 8、marketingTouch 7、taskList 6、rewards 5、chat 5、onboarding 4、remote 2;未发现其他未覆盖的独有命名空间,佐证上述枚举无重大遗漏。 |
本节合并区域 16(repo-only 全量清单,19 条)与其余 15 个区域主表中的 repo-only rows(45 条),合计 64 条。区域间可能存在同一实体的重复计数(如 superpowers-plugin、formal-proof 同时出现在区域 16 与所属包区域),为保持与判定统计一致不做去重。
| # | 来源区域 | 条目 | 仓库位置 | 说明 |
|---|---|---|---|---|
| 1 | 区域2 cli-full | i18n 键 tui.sidebar.subagents | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:162-164 | App bundle 不含该键——TUI 子代理侧栏文案是开源快照侧新增(或 App 分支未有)。检索过 Subagents/subagents=37 次命中但均非该目录键。 |
| 2 | 区域2 cli-full | i18n 键 tui.terminal.starting | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:289 | 开源侧新增的终端启动提示文案。 |
| 3 | 区域2 cli-full | superpowers-plugin | apps/zcode-cli/packages/superpowers-plugin/(仅 1 个 LICENSE 文件,Jesse Vincent MIT) | 开源侧遗留的第三方技能包许可存根,App 无对应。 |
| 4 | 区域2 cli-full | swift-bridge 包 | apps/zcode-cli/packages/swift-bridge/src/index.ts("Swift bridge placeholder"、isSwiftAvailable/detectSwiftVersion TODO 桩) | 未接线的占位包,打包时被 tree-shake,属仓库残留样板。 |
| 5 | 区域2 cli-full | debug 包(vis-timeline 调试 UI) | apps/zcode-cli/packages/debug/src/{main.tsx,App.tsx,gantt-style.ts} | 开发期轨迹可视化工具,仅存于仓库。 |
| 6 | 区域3 deps-full | lock 独有 944 包中的构建/开发工具链(electron 41.0.3、electron-builder、vite 8、rolldown、tsup、oxlint、oxfmt、ts-morph、knip、turbo、release-it、istanbul、conventional-changelog 系、tailwindcss、typescript 等) | pnpm-lock.yaml(各 importer devDependencies) | lock-only 全集 944 项(LC_ALL=C comm),绝大多数是仓库各 workspace 的 devDependencies 与其传递闭包,按 Electron 打包语义本就不应进 App。抽验 desktop devDependencies 18 项(@electron/asar、@electron/rebuild、@tailwindcss/vite、@types/*、@vitejs/plugin-react、electron、electron-builder、http-mitm-proxy、istanbul-lib-instrument、tailwindcss、tsup、t… |
| 7 | 区域3 deps-full | lock 独有中的平台二进制包(@esbuild/ 24 项、@rollup/rollup- 23 项、lightningcss- 12 项、@tailwindcss/oxide- 12 项、@napi-rs/canvas- 12 项、@lydell/node-pty-darwin- 2 项、@oxc-parser/-resolver、@oxfmt/@oxlint binding 系等) | pnpm-lock.yaml packages 段 optionalDependencies | lock 为全平台安装记录了全部 optionalDependencies 平台变体;App 产物按 darwin-arm64 平台裁剪,仅保留当前平台所需。属平台过滤噪声,非功能差异。 |
| 8 | 区域3 deps-full | border-beam ^1.0.1(仓库根 dependencies) | package.json:50; pnpm-lock.yaml | 仓库根 package.json 声明的 3 个根级依赖中,border-beam 在 lock 有解析但 App node_modules 不存在且 out/ 无需运行时副本(其效果编译进 renderer)。属仓库根级 hoisted 依赖,App 打包面天然不覆盖。 |
| 9 | 区域4 i18n-full | CLI tui.sidebar.subagents.*(18 叶子) | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:162-183 — subagents: { title/empty/emptyOutput/back/readonly/loading/unavailable/retry/more/pendingMain/ended/status.{running,waiting,blocked,success,failed,cancelled,los… | 仓库 CLI TUI 的子智能体侧栏全套文案(含 'No subagents yet.'、'← Main conversation'、8 个运行状态词)在 App 捆绑的 CLI 中整段缺失;bundle 中 sidebar 定义只有 'sidebar:{api' 一处起点,且全文 grep 'No subagents yet' 零命中。说明内部 3.14.1 的 CLI TUI 未包含(或移除了)子智能体侧栏渲染。 |
| 10 | 区域4 i18n-full | CLI tui.terminal.starting | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:287 起 terminal 段 | 仓库 CLI 的 '终端启动中' 提示在 App 捆绑版缺失(App 侧 terminal 段以不同叶子集开头),是第 19 个 repo-only 叶子。 |
| 11 | 区域5 metadata-updater | entitlements.helper.plist | packages/desktop/build/entitlements.helper.plist(2 键:allow-jit/allow-unsigned-executable-memory) | 仓库 build/ 下存在 2 键版 helper entitlements,但在 packages/desktop 的 js/mjs/ts 中 grep 'entitlements.helper' 零引用(config 的 mac 节只用 entitlements+inherit 两个文件);App 侧 Helper 实际用的是 3 键 inherit 版。推断供仓库外的 CI 预签名/独立 helper 打包 job 使用,开源快照未带调用方 |
| 12 | 区域5 metadata-updater | doctor:macos-release 验证链 | scripts/doctor-macos-release-app.sh + package.json 'doctor:macos-release' | 发布验收脚本(codesign --verify --deep --strict、spctl -a -vv、可选 stapler validate、区分 preview 身份)只存在于仓库侧;实测 App 通过其核心断言(spctl accepted, Notarized Developer ID) |
| 13 | 区域5 metadata-updater | release-it 发布链 | .release-it.mjs(git tag v${version}、conventional-changelog、npm publish:false)+ scripts/release-it/changelog-writer.mjs | 版本推进/changelog 生成链为仓库独有;App 的 3.14.1 版本号是该链在内部仓运行的结果,仓库快照停在 3.14.0,无 CHANGELOG.md 输出可对照 |
| 14 | 区域6 pkg-client | src/websocket.ts(connectViaWebSocket/connectViaProtocol/wrapBrowserWebSocket/WebSocketConnectionCloseEvent) | packages/client/src/websocket.ts:23-105(被 packages/web/src/main.tsx:13 消费) | App renderer 全量 tree-shake 了该模块:桌面入口只 import connectViaMessagePort/createMessagePortServiceConnection,websocket 路径仅 web 构建使用。检索词试过:'WebSocket closed before ready'、'closed before ready'、'WebSocket connection failed'、'connectViaWebSocket'、'new WebSocket'、'binaryType'、'WebSocket'、'SocketProtocol'——out/… |
| 15 | 区域8 pkg-misc | packages/zcode-server-cli 包本体(@zcode/server-cli,bin: zcode → dist/server-cli.js) | packages/zcode-server-cli/package.json(dependencies: @zcode/rpc|services|shared, hono, ws, yauzl, zod 4.6.5) | 该包不进 zcode.cjs,也不独立存在于 App 产物。包名与全部专属特征串(ZCODE_SERVER_SKIP_SERVICE_REGISTRATION、resolveCanonicalServerLayout、acquireUninstallLock、DataRootLock、stable-launcher、server-cli.js)在 zcode.cjs 与 out/ 均为 0 命中;仓库内亦无其他包引用它(仅自身 3 个文件及根 package.json 的 typecheck 行、architecture-policy.yaml、文档)。 |
| 16 | 区域8 pkg-misc | zcode-server-cli 安装布局字面量(~/.zcode/server 下 releases/current.json/pending.json/install.json/server.lock/update-transaction.json 等) | packages/zcode-server-cli/src/runtime/paths.ts:24-49(join(configured || homedir(), '.zcode', 'server');releasesDir、currentFile、lockFile: run/server.lock、updateTransactionFile 等) | server-cli 专属的安装事务布局字面量在 App 两个 bundle(zcode.cjs、out/)中全部 0 命中,进一步证明该包的安装器/更新器逻辑未随 App 分发。 |
| 17 | 区域8 pkg-misc | packages/formal-proof(@zcode/formal-proof,Vite + d3 状态空间枚举器) | packages/formal-proof/package.json(scripts: vite dev/build;dependencies: d3 ^7.9.0;README:'产品行为状态空间枚举器') | 确认为纯开发用包:App 全部产物(out/、zcode.cjs、glm/、cua-helper/、tools/、app package.json)中 'formal-proof|formalProof' 零命中。它仅作为 apps/zcode-cli/packages/bootstrap 的 devDependencies(bootstrap/package.json:42)用于黄金测试对齐;bootstrap 源码注释'裁决表与 packages/formal-proof/src/model.ts 的 evaluate 逐条对齐'在打包时被剥离(evaluateCompacting、du… |
| 18 | 区域8 pkg-misc | third-party/upstream/(78 个 sha256 命名的第三方许可证文本) | third-party/upstream/*.txt(如 34dee5fd...txt = [email protected] LICENSE) | 该目录是哈希命名的上游许可证快照库(被 inventory.json/npm-overrides.json/copied-components.json 引用),属仓库合规工件。App Resources 下不存在任何 LICENSE 文件,out/ 亦无 THIRD-PARTY-NOTICES 引用。抽查文件哈希与文件名自洽。 |
| 19 | 区域8 pkg-misc | third-party/inventory.json(1.4MB 第三方合规清单) | third-party/inventory.json(schemaVersion 1,scope:'Production dependency union across current workspace projects...') | 仓库侧合规总清单,覆盖生产依赖并集、复制源码与原生工具;含 @arms/rum-electron 记录(3 处)。App 不携带该清单,产品内也未内嵌许可证页引用。 |
| 20 | 区域8 pkg-misc | third-party/copied-components.json(复制组件溯源,如 shadcn/ui) | third-party/copied-components.json(首条 id: shadcn,referenceRevision a87a63b2ca25143d26c8bd0903e4e9bc77b3f824) | 记录复制进仓库源码的第三方组件(shadcn 等)的许可证与版本溯源;App 侧这些代码经编译混淆进 renderer chunk,不存在可逐字节比对的独立对应物,App 也不携带该清单。 |
| 21 | 区域8 pkg-misc | third-party/embedded-components.json(内嵌组件,如 Skia / @napi-rs/[email protected]) | third-party/embedded-components.json(首条 Skia,parentPackage @napi-rs/[email protected],reviewRequired 注记) | 记录内嵌于原生依赖中的上游组件(Skia 等)的合规状态;管控点在 packages/desktop/scripts/desktop-native-package-policy.mjs。App 实际安装树中 @napi-rs/canvas 不存在(NOT FOUND),zcode.cjs 亦无相关字符串,说明当前桌面产物未包含该内嵌组件。 |
| 22 | 区域8 pkg-misc | third-party/runtime/sources.json(Node 22.16.0 / 24.14.0 运行时许可证) | third-party/runtime/sources.json + node-*-LICENSE.txt(source 指向 nodejs/node 官方 LICENSE,带 sha256) | 对应构建工具链与远端 server 运行时(apps/zcode-cli engines node 24.14.0;server-cli 打包经 nodeDistMirror 下载 node dist 部署远端)。App 本机不携带独立 node 二进制——glm 运行时声明 runtime: electron-node,且 Resources 下无 node LICENSE 文件。 |
| 23 | 区域8 pkg-misc | config/README.md(配置说明文档) | config/README.md(md5 a05b599bd579022caf927a3b1cf55d26,说明 default.json 随客户端发布与帮助配置来源) | App 侧 config 目录文件集为仓库 config/ 的真子集(无 README.md),文档不随包分发。 |
| 24 | 区域10 pkg-server-host | POST /api/connect-remote | packages/server/src/http.ts:346-365 | Web 模式发起远程连接的 REST 端点在 App 全树(out/host、out/main、out/renderer、out/preload、glm/zcode.cjs)均无命中。检索词:api/connect-remote、connect-remote、ws/remote。App 已改为 'server' kind 连接器直连(见 remoteTarget 行),不经过该中转端点。 |
| 25 | 区域10 pkg-server-host | GET /ws/remote/:id | packages/server/src/http.ts:368-397 | 远程连接 WS 桥接端点(把 File/Git/System/Terminal 四服务暴露给浏览器)在 App 全树无命中。检索词:ws/remote、remote/:id 形式的路由模板。 |
| 26 | 区域10 pkg-server-host | 静态资源服务 + SPA fallback + zcode_lite_token | packages/server/src/http.ts:184,199-242,399-414 | staticMimeTypes、resolveStaticFile、isTokenProtectedPath、zcode_lite_token cookie 会话鉴权均为仓库 HTTP server 专属,App out/host 无对应(App 仅有 sandbox iframe 用的小型 mime 表 v3,用途不同:CSP 'none' 内嵌页)。检索词:zcode_lite_token、spaFallback、text/css; charset=utf-8。 |
| 27 | 区域10 pkg-server-host | entry-stdio.ts(可部署 server 入口) | packages/server/src/entry-stdio.ts | 整个入口(hello→ack→deviceMid→services→createStdioServer→lifecycle)编译为 dist/remote/zcode-server.cjs,是部署到远端的制品;App 桌面内不携带该入口(server-bundle 走 remote-download),故 out/host 无对应。'stdio shutdown timed out' 全 App 无命中。 |
| 28 | 区域10 pkg-server-host | stdio.ts(wrapStdio/createStdioServer) | packages/server/src/stdio.ts:14-96 | 服务端 stdio 适配(stdout 只承载 RPC 帧)随部署入口走;App host 侧保留的是对称的 wrapStdioStream(把远端子进程 stdio 包成 ISocket)。connectionId 前缀 server-stdio-/server-ws- 在 App 未见(App 用 host-rpc- 等前缀),但 trusted-host-relay 角色保留。 |
| 29 | 区域10 pkg-server-host | stdio-lifecycle.ts | packages/server/src/stdio-lifecycle.ts('stdio shutdown timed out'/'service-dispose') | 信号驱动的优雅退出编排属部署入口;App host 无该编排,但底层 disposeServiceResourcesAndWait 的 service-dispose 阶段标记在 App index.js 命中(services 包同源)。检索词:registerStdioProcessLifecycle、stdio shutdown、service-dispose。 |
| 30 | 区域10 pkg-server-host | entry-http.ts | packages/server/src/entry-http.ts | HTTP 模式启动器(PORT/ZCODE_SERVER_HOST/ZCODE_WEB_STATIC_ROOT/ZCODE_SERVER_AUTH_TOKEN)不在 App;这些 env 键(ZCODE_SERVER_ID/NAME/WORKSPACE/TOKEN/HOST/WEB_STATIC_ROOT)在 out/host 全部无命中——它们配置的是部署侧进程。检索词逐一列出均 0 命中。 |
| 31 | 区域10 pkg-server-host | rpc/index.ts 导出面 + examples/ | packages/rpc/src/index.ts(六层导出)+ examples/01-04 | 导出中 0-3 层全部在 App 内联同源(见各行);Layer 4-6(ipc.ts/remote.ts/persistent-protocol)在 App host 缺席或演进(见对应行)。examples/ 四个演示脚本为开发文件,App 不携带,属预期 repo-only。 |
| 32 | 区域10 pkg-server-host | server 构建脚本(build-remote.ts/buildRemoteValidation.ts/tsup.config.ts) | packages/server/{build-remote.ts:31-58,buildRemoteValidation.ts,tsup.config.ts} | 开源仓的自有构建编排(esbuild 打包 entry-stdio → zcode-server.cjs)在 App 无对应——App 由内部 monorepo apps/zcode-cli 管道产出,构建产物路径与命名即差异证据。 |
| 33 | 区域12 pkg-shared-protocol | ZCODE_RPC_CLIENT_MODE_HEADER = "x-zcode-rpc-client-mode" | packages/shared/src/channels.ts:496(@deprecated 注释明确 /ws 已忽略该头) | 仓库保留的旧客户端兼容常量,App bundle 已整体移除。已检索 host(index+4 chunks)、main(index+19 chunks+workers)、preload(7 个 cjs)、renderer/assets/src-1E9aqq2Y.js、scheduler(3 个文件),0 命中 |
| 34 | 区域14 pkg-web-assets | HTML 入口 packages/web/index.html(浏览器版) | packages/web/index.html | Web 浏览器版入口(含 theme-color meta、data-URI 内嵌 favicon、bundle 执行前主题预置脚本 DEFAULT_THEME=zai-dark),属 @zcode/web 工程,不进入桌面产物。检索证据:其下游特征串 ZCode - Sign In(WebCallbackPage)、preview_runtime_initialized、ZCode 会话分享 在 App 全部 JS bundle 中 rg 均无命中。 |
| 35 | 区域14 pkg-web-assets | packages/web/src/main.tsx(浏览器入口编排) | packages/web/src/main.tsx | Web 端启动编排(WebSocket connectViaWebSocket、OAuth callback 路由 /cn/share/callback、会话分享落地页路由)。桌面 App 入口是 packages/desktop/src/renderer/src/main.tsx(另一文件),此模块不进桌面 bundle。 |
| 36 | 区域14 pkg-web-assets | packages/web/src/auth/(7 个文件) | packages/web/src/auth/{browserOAuthCredentialRepo,oauthStateCodec,webAuthLocale,webAuthService,WebCallbackPage,webZaiOAuthConfig,zaiWebOAuthProvider}.ts(x) | 浏览器版 ZAI OAuth 工程(授权码交换、回调页、凭证仓)。桌面版走 Electron 主进程 OAuth,无此组文件对应;WebCallbackPage 标题串在 App bundle 无命中。 |
| 37 | 区域14 pkg-web-assets | packages/web/src/share/(6 个文件) | packages/web/src/share/{conversationShareLandingPage.css,ConversationShareLandingPage.tsx,conversationSharePreviewClient.ts,conversationShareRoute.ts,mockConversationSharePreviewClient.ts,shareHeaderLayout.ts} | 会话分享落地页(浏览器端渲染分享会话预览)。App 桌面端有"分享"功能但入口不同;本组模块的落地页特征(invalid_contract 作为 landing 错误态、console 标签 conversation-share-web)不在 App 主/入口 bundle。 |
| 38 | 区域14 pkg-web-assets | packages/web/src/webThemeSeed.ts | packages/web/src/webThemeSeed.ts | Web 初始主题解析(WEB_DEFAULT_THEME/resolveWebInitialTheme)。桌面版主题初始化在 desktop renderer 源码内,无对应需求。 |
| 39 | 区域14 pkg-web-assets | packages/web/src/communityUrl.ts | packages/web/src/communityUrl.ts | Web 端社区链接/帮助配置解析(resolveWebCommunityUrl/resolveWebHelpConfig),浏览器版专属模块。 |
| 40 | 区域14 pkg-web-assets | packages/web/vite.config.ts | packages/web/vite.config.ts | @zcode/web 独立构建管线(端口 5173、/ws 代理到 3030、ZAI OAuth client_id 注入)。同源旁证:其 pdfJsCMapsPlugin()(引自 ../ui/vite/pdfJsCMapsPlugin.ts)正是 App 产物 pdfjs/cmaps 目录的生成机制。 |
| 41 | 区域14 pkg-web-assets | packages/web/package.json / tsconfig.json / src/env.d.ts | packages/web/{package.json,tsconfig.json} + src/env.d.ts | @zcode/web 包清单(workspace 依赖 @zcode/client/shared/ui + react 19),纯浏览器工程配置,桌面产物无对应。 |
| 42 | 区域14 pkg-web-assets | packages/web/public/favicon.ico | packages/web/public/favicon.ico | 浏览器标签图标,桌面 Electron 无 .ico 需求(App renderer 无任何 .ico)。md5 712280ee7a988f6227f5e29030346c3f,仅仓库存在。 |
| 43 | 区域15 pkg-zcode-cua | README.md | packages/zcode-cua/README.md:1-5 | 仓库 README 描述'每个运行时面报 unavailable 并 fail-closed';App bundle 内无对应文档,且实际行为完全相反(真实 broker/截屏/键鼠控制)。该文档是清洗痕迹的一部分。 |
| 44 | 区域15 pkg-zcode-cua | host-display-contract(app-associations 2 常量) | packages/zcode-cua/host-display-contract.js:1,3 | CUA_APP_ASSOCIATIONS_META_KEY='zcode.cua/app-associations-v1' 与 MAX_META_BYTES=16384 在 App 三处(helper SEA strings、zcode.cjs、out/ 全部 bundle)均为 0 命中,含宽松检索 app-associations/appAssociations/MAX_META_BYTES 亦 0。仓库保留了 App 已不使用(或被移除/改名)的表面。 |
| 45 | 区域15 pkg-zcode-cua | 占位标记串(repo-only) | packages/zcode-cua/index.js:4; broker.js:40; broker-server.js:6; request-access-contract.js:6 | 'Computer Use is not available in this build.' 是仓库桩的统一 fail-closed 文案,在 zcode.cjs 与 out/ 全 bundle 均 0 命中——App 侧不存在该字符串,反向证明仓库是插入桩的清洗快照。 |
| 46 | 区域16 repo-only | packages/formal-proof(整个包) | packages/formal-proof/{src/main.ts,src/model.ts,src/styles.css,index.html,vite.config.ts} | vite+d3 的产品行为状态空间枚举器(design review 工具),App 产物无该工具对应物。但注意其裁决表并非纯文档:见下条投影证据。对终端用户无功能影响。 |
| 47 | 区域16 repo-only | packages/zcode-server-cli(整个包) | packages/zcode-server-cli/src/{cli.ts,main.ts,supervisor/{supervisor.ts,crashBudget.ts},server-core/}(42 个 TS 文件) | 独立远端/无头服务器 CLI(supervisor、candidate release、--server-root),desktop 构建不依赖它,App 完全不含。host/index.js 里的 hostCapabilityUrl 是 desktop 远程协议侧概念,非本包。终端用户(桌面 App)无功能影响。 |
| 48 | 区域16 repo-only | architecture-policy.yaml | architecture-policy.yaml:1-52 | 开发期架构治理策略,纯仓库设施。无用户影响。 |
| 49 | 区域16 repo-only | .architecture-baseline.json | .architecture-baseline.json | 架构检查基线文件,配合 scripts/architecture 使用。 |
| 50 | 区域16 repo-only | scripts/architecture/ | scripts/architecture/{architecture-check.mjs,policy.mjs,git-file-names.mjs,index.mjs} | 治理检查执行器,消费 architecture-policy.yaml。 |
| 51 | 区域16 repo-only | .agents/skills/(8 个开发技能) | .agents/skills/{agent-browser,ai-elements,architecture-governance,dep-refs,dogfood,electron,feature-boundary-planner,react-best-practices} | 仓库内 AI 开发辅助技能(SKILL.md 形式),不随 App 分发。third-party/inventory.json 将其列为合规哈希输入(.agents/skills/agent-browser/... 等),进一步证明它们只是源码树一部分。 |
| 52 | 区域16 repo-only | harness/remote/ | harness/remote/{Dockerfile,build.sh,README.md} | 远端功能开发的本地 SSH 测试容器,纯开发工具。无用户影响。 |
| 53 | 区域16 repo-only | scripts/dev/zcode-stdio-tap.mjs | scripts/dev/zcode-stdio-tap.mjs | 开发期 stdio 流量分接器。 |
| 54 | 区域16 repo-only | apps/zcode-cli/tools/prompt-trajectory | apps/zcode-cli/tools/prompt-trajectory/{package.json,src/} | CLI 的提示词轨迹记录工具(prompt-trajectory:model-io / record:prompt npm scripts),dev 工具,未编译进 zcode.cjs。 |
| 55 | 区域16 repo-only | NOTICE.md / THIRD-PARTY-NOTICES.md / LICENSE | {NOTICE.md(27KB),THIRD-PARTY-NOTICES.md(1.9MB),LICENSE(Apache-2.0)} | 开源合规三件套未随 App 分发(Resources 顶层无任何许可/声明文件,renderer 无开源许可 UI 入口)。这是唯一一个'产出本应出现在 App 但没出现'的候选:可能是合规缺口,也可能许可声明放官网/线上分发渠道。对功能无影响,对合规或有影响。 |
| 56 | 区域16 repo-only | 第三方许可生成链(scripts) | scripts/{generate-third-party-notices.mjs,licenses.mjs,third-party-notices.mjs,third-party-npm.mjs} + scripts/license-texts/(14 个许可文本) | 生成 THIRD-PARTY-NOTICES.md 的完整工具链,产物侧无对应(见上条)。 |
| 57 | 区域16 repo-only | third-party/ 合规与构建快照 | third-party/{inventory.json,embedded-components.json,copied-components.json,npm-overrides.json,upstream/(29+ 许可源快照),runtime/(node-22.16/24.14 LICENSE)} | 合规清单与上游许可快照,构建期输入,不进产物。third-party/native-search 除外(见对应行)。 |
| 58 | 区域16 repo-only | 顶层文档(AGENTS/CONTEXT/DESIGN/README) | {AGENTS.md,CONTEXT.md,DESIGN.md,README.md,README.en.md} | DESIGN.md 描述的 color/typography/spacing 体系在 renderer CSS 侧有实现对应,但文档本身不随 App 分发。无用户影响。 |
| 59 | 区域16 repo-only | 开发配置文件组(18 项) | .vscode/(6 文件), mise.toml, knip.json, .release-it.mjs, .oxlintrc.json, .oxfmtrc.json, .prettierignore, .npmrc, .nvmrc, .dockerignore, .gitignore, .gitattributes, .env.{development,production,example}, pnpm-lock.yaml, pnp… | 构建/lint/CI/工具链配置,全部为开发期设施。.env 中的端点值以编译产物形式进入 App(shared endpoint resolver)。 |
| 60 | 区域16 repo-only | packages/rpc/examples/ | packages/rpc/examples/{01-basic-ipc.ts,02-proxy-channel.ts,03-ipc-server-client.ts,04-remote-connection.ts} | RPC 用法示例,非运行代码。 |
| 61 | 区域16 repo-only | 测试目录(services/test + ui/test) | packages/services/test/, packages/ui/test/ | 单测目录不进产物。harness/remote 同类(另列)。 |
| 62 | 区域16 repo-only | scripts/doctor-macos-release-app.sh | scripts/doctor-macos-release-app.sh:1-10 | 对已安装 App 的发布体检脚本(QA 工具),不属于 App 内容。 |
| 63 | 区域16 repo-only | scripts/ 开发工具链(13 项) | scripts/{bootstrap.mjs,clean.mjs,count-lines.sh,dep-refs.mjs,dependency-graph.mjs,check-workspace-freshness.mjs,mise-run.mjs,mise-toolchain-env.mjs,load-endpoint-env.mjs,spawn-command.mjs,dev-desktop-env.mjs,dev-desktop-… | bootstrap/清理/度量/依赖图/mise 包装/dev 环境等纯开发工具,无产物对应、无用户影响。 |
| 64 | 区域16 repo-only | packages/desktop/native/windows-browser-import-helper | packages/desktop/native/windows-browser-import-helper/ | Windows 浏览器导入 helper 源码(由 desktop/scripts/build-windows-browser-import-helper.mjs 构建),只进 Windows 安装包;本 mac App 无对应属平台差异,非清洗缺失。 |
渲染器侧:仓库 packages/ui/src/i18n/locales/{en-US,zh-CN}.ts(en 5595 / zh 5594 key,87 命名空间)↔ App out/renderer/assets/IntlProvider-DW5rmeLm.js(en 6124 / zh 6120 key,93 命名空间)。共享 87 命名空间中 79 个逐 key 一致(其中 feedback 计数相同但 5 条值漂移)、8 个被 App 增补 key(appHeader / chat / mode / onboarding / remote / settings / taskList / zcode);app-only 命名空间 6 个,repo-only 命名空间 0 个。CLI 侧:仓库 204/204 叶子 ↔ App 185/185 叶子,共享 179 叶子一致,漂移/增删见下表。
| 命名空间/清单 | 仓库 | App | 判定 | 说明 |
|---|---|---|---|---|
| 渲染器命名空间集合(首段切分) | packages/ui/src/i18n/locales/en-US.ts — 87 个命名空间 | IntlProvider-DW5rmeLm.js — 93 个命名空间 | skewed | App 命名空间集合是仓库的严格超集:repo-only 0 个;app-only 6 个(bots/webRemoteControl/manualClaimPlan/server/marketingTouch/rewards,见后续行)。共享的 87 个中 79 个 key 数相同、8 个被 App 增补(appHeader/chat/mode/onboarding/remote/settings/taskList/zcode)。 |
| ns=bots | — | IntlProvider-DW5rmeLm.js — 'bots.add':添加… 等 259 key | app-only | App 独有命名空间,259 个 key,为全部独有命名空间中最大。前 5 个代表 key:bots.add、bots.addBinding、bots.addBot、bots.allowedCommands、bots.allowedWorkspaces。对应 App 私有的 Bots 功能。 |
| ns=webRemoteControl | — | IntlProvider-DW5rmeLm.js — 104 key | app-only | App 独有。前 5 key:webRemoteControl.botChannel.configure、.botChannel.description、.botChannel.feishu.description、.botChannel.feishu.title、.botChannel.lark.description。含飞书/Lark bot 通道配置文案,对应 web 远程控制私有功能。 |
| ns=manualClaimPlan | — | IntlProvider-DW5rmeLm.js — 53 key | app-only | App 独有。前 5 key:manualClaimPlan.banner.aria、.banner.bonus、.banner.claim、.banner.close、.banner.dismissConfirm.claim。对应手动领取套餐 banner 私有功能。 |
| ns=server | — | IntlProvider-DW5rmeLm.js — 12 key | app-only | App 独有。前 5 key:server.description、server.name、server.namePlaceholder、server.token、server.tokenPlaceholder。对应自建服务器(remote kind=server)接入配置。 |
| ns=marketingTouch | — | IntlProvider-DW5rmeLm.js — 7 key | app-only | App 独有。前 5 key:marketingTouch.failed、.idle、.preparing、.submitting、.succeeded。对应营销触达/提交流程状态文案。 |
| ns=rewards | — | IntlProvider-DW5rmeLm.js — 5 key | app-only | App 独有。前 5 key:rewards.loadFailed、.menuBadge、.menuTitle、.openWebsite、.title。对应奖励中心私有功能。 |
| ns=mode | packages/ui/src/i18n/locales/en-US.ts — 9 key | IntlProvider-DW5rmeLm.js — 47 key(+38) | skewed | App 新增 38 个 key,主要是 mode.description.claude.*(acceptEdits/auto/bypassPermissions/default/dontAsk/plan 等按引擎细分的模式描述)与 mode.acceptEdits、mode.default。对应多引擎(Claude/Code 模式)权限模式说明。 |
| ns=settings | en-US.ts — 1845 key | IntlProvider-DW5rmeLm.js — 1869 key(+24) | skewed | App 新增 24 个 key,集中于 settings.modelProvider.(anthropicEndpoint、geminiEndpoint、claudeMapping、endpointNoMatch、codingPlan.billingDiscountInfo.open 等多 Provider 端点配置)与 settings.memory.。 |
| ns=appHeader | en-US.ts — 14 key | IntlProvider-DW5rmeLm.js — 22 key(+8) | skewed | App 新增 8 个 key:copyClaudeJsonlPath、goToProviderConfig、goToProviderConfigPrefix/Suffix、openProviderConfigInEditorFailed、openProviderConfigWithEditor* 等,对应 Provider 配置跳转/JSONL 路径复制私有功能。 |
| ns=taskList | en-US.ts — 64 key | IntlProvider-DW5rmeLm.js — 70 key(+6) | skewed | App 新增 6 个 key:newTask.claude/newTask.codex/newTask.gemini/newTask.opencode、selectProvider、codexConnectivityUnavailable。对应多引擎新建任务入口。 |
| ns=chat | en-US.ts — 1338 key | IntlProvider-DW5rmeLm.js — 1343 key(+5) | skewed | App 新增 5 个 key:chat.agentSwitch.failed/success/switchTo、chat.captcha.verifyFailed、chat.error.action.retryCaptcha。对应智能体切换提示与验证码重试私有功能。 |
| ns=onboarding | en-US.ts — 58 key | IntlProvider-DW5rmeLm.js — 62 key(+4) | skewed | App 新增 4 个 key:step.agentSettings、stepDescription.agentSettings、footer.selection、agentSettings.providersToggleAllAria。对应引导流程的 Agent 设置步骤。 |
| ns=remote | en-US.ts — 49 key | IntlProvider-DW5rmeLm.js — 51 key(+2) | skewed | App 新增 2 个 key:remote.kind.server、remote.kind.server.wizardDescription。对应自建 server 类型远程连接向导。 |
| ns=zcode | en-US.ts — 24 key | IntlProvider-DW5rmeLm.js — 26 key(+2) | skewed | App 新增 2 个 key:zcode.error.CLAUDE_UNKNOWN_COMMAND、CLAUDE_UNKNOWN_COMMAND_WITH_ARGS(Claude Code 未知命令提示)。 |
| 其余 78 个共享命名空间 | en-US.ts / zh-CN.ts | IntlProvider-DW5rmeLm.js | identical-evidence | app、appError、automations(174)、bashOutput、browser(41)、carousel、codeBlock、codeViewer(71)、codingPlan、commandCenter、common、confirmDialog、conversationShare(165)、cuaPermission(28)、debugInfo、desktopMenu、developerTools、diff、directoryBrowser、docker、fileActions、fileTree… |
| ns=feedback(计数相同但值漂移) | en-US.ts:5670 'feedback.background.collapse': "Collapse feedback submission status" | IntlProvider-DW5rmeLm.js — 'feedback.background.collapse':Collapse background feedback status | differs | feedback 命名空间两侧均 291 key,但 5 条 background.* 文案在 App 内部版被重写:collapse/dismiss/expand/open 由 'feedback submission status(反馈提交状态)' 改为 'background feedback status(后台反馈状态)',defaultDetail 由 '提交继续进行中,退出应用后会停止' 改为 '反馈会在后台继续处理'。en/zh 同步漂移。 |
| CLI 语言包文件对应 | apps/zcode-cli/packages/i18n/src/locales/en-US.ts + zh-CN.ts(嵌套结构,en/zh 各 204 个叶子消息) | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs(14MB 单文件)内 en 字典 'kPo={locale:"en-US",cli:{…},tui:{…}}' 偏移 13209403,zh 字典 'TPo={locale:"zh-CN… | identical-evidence | App 的 CLI 运行时完整捆绑了两份语言字典,结构与仓库一致(locale/cli/tui 三段顶层),含 localeUnsupported 等同款消息。 |
| CLI 叶子集合总量 | apps/zcode-cli/packages/i18n/src/locales/*.ts — 各 204 叶子 | zcode.cjs 两字典 — 各 185 叶子 | skewed | repo-only 19 个叶子、app-only 0 个:仓库 3.14.0 的 CLI 语言包反而比 App 内部 3.14.1 捆绑版多出子智能体侧栏整套文案。这是两侧 i18n 中唯一'仓库多、App 少'的反向差异。 |
| CLI tui.sidebar.subagents.*(18 叶子) | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:162-183 — subagents: { title/empty/emptyOutput/back/readonly/loading/unavailable/retry/more/pendingM… | zcode.cjs — tui.sidebar 子树仅 60 叶子(api/cache/context/mcp/…),无 subagents 段 | repo-only | 仓库 CLI TUI 的子智能体侧栏全套文案(含 'No subagents yet.'、'← Main conversation'、8 个运行状态词)在 App 捆绑的 CLI 中整段缺失;bundle 中 sidebar 定义只有 'sidebar:{api' 一处起点,且全文 grep 'No subagents yet' 零命中。说明内部 3.14.1 的 CLI TUI 未包含(或移除了)子智能体侧栏渲染。 |
| CLI tui.terminal.starting | apps/zcode-cli/packages/i18n/src/locales/en-US.ts:287 起 terminal 段 | zcode.cjs — terminal:{requires…},无 starting 叶子 | repo-only | 仓库 CLI 的 '终端启动中' 提示在 App 捆绑版缺失(App 侧 terminal 段以不同叶子集开头),是第 19 个 repo-only 叶子。 |
| CLI tui.loginRequired.*(4 叶子) | en-US.ts:98 loginRequired 段:title 'model setup required'、message/status 'No available models. Configure a provider or sign in with /login.'、help 'Use… | zcode.cjs en 字典:title 'login required'、message/status 'Model not set, send /login to login.'、help 'Local commands still work: /help, /locale, /mode, a… | differs | 未登录/未配置模型拦截提示整组改写:语义从'需配置模型(Coding Plan)'变为'需登录',help 从引导 /model 变为列举本地可用命令。zh 同步漂移('需要配置模型'→'需要登录','没有可用模型,请配置 Provider 或输入 /login 登录。'→'未设置模型,请输入 /login 登录。')。 |
| CLI tui.loginSetup.options.bigmodelOauth.*(2 叶子) | en-US.ts:114 bigmodelOauth 段:secondary 'Open browser login; authorization is detected automatically.'、pendingSecondary 'Complete sign-in in your brows… | zcode.cjs en 字典:secondary 'Open browser login with a localhost callback.'、pendingSecondary 'Complete sign-in in your browser. I will continue when the… | differs | 登录授权机制文案漂移:仓库是'自动检测授权结果',App 改为'等待 localhost 回调',说明内部版改用了本地回调服务器方式的 OAuth 流程。zh 同步漂移('CLI 会自动查询授权结果'→'并使用本地回调…')。 |
| CLI cli.help | en-US.ts:21 'login [zai|bigmodel] Sign in through browser authorization'、:56 '/login Choose Z.AI or BigModel browser login' | zcode.cjs en 字典 help:'login Sign in with Z.AI OAuth for model access'、'/login Sign in with Z.AI OAuth' | differs | 帮助文本精确 diff 显示 4 处替换:App 移除了 login 命令的 '[zai|bigmodel]' 参数标注(原位变空白),'through browser authorization'→'with Z.AI OAuth for model access','Choose … or BigModel browser login'→'Sign in with …OAuth'。内部版砍掉了 BigModel 独立浏览器登录入口,与 bigmodelOauth 文案漂移互为印证。 |
| CLI 其余 179 个共享叶子 | apps/zcode-cli/packages/i18n/src/locales/{en-US,zh-CN}.ts | zcode.cjs 两语言字典 | identical-evidence | 除上述 19 个 repo-only 叶子和 7 个文本漂移叶子外,其余 178 个共享叶子(tui.input/tui.status/tui.transcript.workflow/tui.slash/tui.selection/tui.model 等)的字面量文本经参数归一(${X} 占位统一)后完全一致;此前 20 处疑似漂移经核查均为压缩器改写解构参数名({path:selected→{path:e,selected:t})造成的假阳性。 |
| CLI en/zh 漂移与缺失同步性 | zh-CN.ts(204 叶子) | zcode.cjs zh 字典(185 叶子) | identical-evidence | zh 侧的 repo-only 集合与 en 侧完全相同(同 19 叶子),文本漂移也同步发生在 loginRequired/bigmodelOauth/cli.help 上,说明两侧各自内部 en/zh 保持同步演化为一体,对照结论不受语言选择影响。 |
App package.json 38 项 dependencies(28 外部 + 10 @zcode workspace)中 35 项与仓库 packages/desktop/package.json 逐字同源;App node_modules 顶层 658 包 vs lock packages 段 1594 包名,共同包 653 个中 645 个实装版本与 lock 解析版本完全一致(真漂移仅 rrweb 全家 5 项);生产闭包 949 项中 App 未打 305 项(均归因于打包策略);App 独有包 8 个;root 3 个 patchedDependencies 均在 App 侧取得补丁证据。
| # | 依赖对照项 | 仓库 | App | 判定 |
|---|---|---|---|---|
| 1 | sharp 0.34.5(App 直接依赖) | — | /tmp/zcode-reverse/app/package.json:42; node_modules/sharp/package.json version=0.34.5 | app-only |
| 2 | @larksuiteoapi/node-sdk 1.61.1(App 直接依赖) | — | /tmp/zcode-reverse/app/package.json:15; node_modules/@larksuiteoapi/node-sdk version=1.61.1 | app-only |
| 3 | @zcode/e2e-report(App workspace 依赖) | — | /tmp/zcode-reverse/app/package.json:25 | app-only |
| 4 | @zcode/zcode-cua 引用方式 | packages/desktop/package.json:49; packages/zcode-cua/package.json | /tmp/zcode-reverse/app/package.json:33 | differs |
| 5 | @lydell/node-pty-linux-arm64 / linux-x64 | packages/desktop/package.json:33-34; pnpm-lock.yaml packages 段 | /tmp/zcode-reverse/app/package.json:16-17 | differs |
| 6 | desktop package.json 元数据(version/flavor/homepage/author) | packages/desktop/package.json | /tmp/zcode-reverse/app/package.json:3,51-53 | skewed |
| 7 | rrweb / rrdom / rrweb-snapshot / @rrweb/types / @rrweb/utils(@arms/rum-browser 传递依赖) | pnpm-lock.yaml:10025(@arms/[email protected] → rrweb: 2.1.6) | node_modules/rrweb/package.json version=2.0.0 | skewed |
| 8 | 外部直接依赖 12 项(@arms/rum-electron、@babel/runtime、@fiahfy/icns、@lydell×2、@opentelemetry 6 件套) | packages/desktop/package.json:30-40; pnpm-lock.yaml importer packages/desktop | /tmp/zcode-reverse/app/package.json:12-23 | identical-evidence |
| 9 | 外部直接依赖 12 项(electron-updater、module-details-from-path、node-forge、node-pty、playwright-core、semver、ssh2、undici、ws、yaml、yauzl、yazl) | packages/desktop/package.json:50-63 | /tmp/zcode-reverse/app/package.json:34-48 | identical-evidence |
| 10 | react / react-dom | packages/desktop/package.json:55-56; package.json(pnpm.overrides react 19.2.7) | /tmp/zcode-reverse/app/package.json:39-40; out/renderer/assets/*.js | identical-evidence |
| 11 | @zcode 9 个 workspace 包(client/provider/provider-node/rpc/server/services/shared/ui/zcode-cua) | packages/desktop/package.json:41-49 | /tmp/zcode-reverse/app/package.json:24-32 | identical-evidence |
| 12 | @arms/rum-electron 补丁(patches/@[email protected]) | patches/@[email protected]; package.json:88 | node_modules/@arms/rum-electron/dist/index.mjs:517 | identical-evidence |
| 13 | @ai-sdk/[email protected] 与 @ai-sdk/[email protected] 补丁 | package.json:89-90 patchedDependencies; pnpm-lock packages 段 | /Applications/ZCode.app/Contents/Resources/glm/zcode.cjs | identical-evidence |
| 14 | App node_modules 中仓库完全不存在的包:chart.js 4.5.1 / react-chartjs-2 5.3.1 / @kurkle/color 0.3.4 / lottie-web 5.13.0 | — | node_modules/{chart.js,react-chartjs-2,@kurkle/color,lottie-web}/package.json | app-only |
| 15 | App node_modules 其余 app-only 包(8 项中的 lodash.identity 3.0.0 / lodash.pickby 4.6.0) | — | node_modules/lodash.{identity,pickby}/package.json | app-only |
| 16 | 645/653 个共同包逐版本一致性 | pnpm-lock.yaml packages 段 1594 个包名 | node_modules/*/package.json(658 顶层包逐个读取版本) | identical-evidence |
| 17 | lock 独有 944 包中的构建/开发工具链(electron 41.0.3、electron-builder、vite 8、rolldown、tsup、oxlint、oxfmt、ts-morph、knip、turbo、release-it、istanbul、conventional-changelog 系、tailwindcss、typescript 等) | pnpm-lock.yaml(各 importer devDependencies) | — | repo-only |
| 18 | lock 独有中的平台二进制包(@esbuild/ 24 项、@rollup/rollup- 23 项、lightningcss- 12 项、@tailwindcss/oxide- 12 项、@napi-rs/canvas- 12 项、@lydell/node-pty-darwin- 2 项、@oxc-parser/-resolver、@oxfmt/@oxlint binding 系等… | pnpm-lock.yaml packages 段 optionalDependencies | — | repo-only |
| 19 | 生产依赖闭包中 App 未打的 305 项(react/react-dom/scheduler、zod、yjs、@ai-sdk/gateway|provider|provider-utils、micromark 系部分、cytoscape 系、@mermaid-js/parser、@noble/hashes、@opentelemetry/sdk-logs、@types/* 等) | pnpm-lock.yaml(desktop+11 个被打包 workspace 包 importer 生产闭包=949 项) | /tmp/zcode-reverse/app/out/ | skewed |
| 20 | border-beam ^1.0.1(仓库根 dependencies) | package.json:50; pnpm-lock.yaml | — | repo-only |
| 21 | d3-path ^3.1.0 / tailwind-scrollbar-hide ^4.0.0(仓库根 dependencies) | package.json:51-52 | node_modules/{d3-path,tailwind-scrollbar-hide}/package.json | identical-evidence |
| 22 | @pierre/diffs、@streamdown/*、@extend-ai/react-docx|xlsx、@aiden0z/pptx-renderer 等非典型源 npm 包 | packages/ui/package.json:31,35-38,75 等 | node_modules/@pierre/diffs 等 | identical-evidence |
| 23 | packages/zcode-cua(仓库侧本体) | packages/zcode-cua/package.json(0.6.3) | out/host/index.js、out/scheduler/index.js、out/renderer/assets/styles-CuFc3dtZ.js | skewed |
| 24 | pnpm catalog 机制 | pnpm-workspace.yaml | /tmp/zcode-reverse/app/package.json:33 | app-only |
官方 GLM 模型白名单 22 条:仓库 packages/shared/src/official-glm-model-id.ts:2-25 ↔ App zcode.cjs(XQn 数组)与 out/host/chunk-GVBBGMXG.js 同数组,两侧 22 条顺序、大小写完全一致(identical-evidence,区域 2/9 双重复核)。
| # | 官方模型 ID |
|---|---|
| 1 | GLM-5.3 |
| 2 | GLM-5.3-Flash |
| 3 | GLM-5V-Turbo |
| 4 | GLM-5.2 |
| 5 | GLM-5.1 |
| 6 | GLM-5.1-Highspeed |
| 7 | GLM-5 |
| 8 | GLM-5-Turbo |
| 9 | GLM-4.7 |
| 10 | GLM-4.7-FlashX |
| 11 | GLM-4.7-Flash |
| 12 | GLM-4.6 |
| 13 | GLM-4.5-Air |
| 14 | GLM-4.5 |
| 15 | GLM-4.6V |
| 16 | GLM-4.6V-Flash |
| 17 | GLM-4.6V-FlashX |
| 18 | GLM-4.1V-Thinking-FlashX |
| 19 | GLM-4.1V-Thinking-Flash |
| 20 | GLM-4-FlashX-250414 |
| 21 | GLM-4-Flash-250414 |
| 22 | GLM-4V-Flash |
配套内置供应商/模板 ID(区域 9,全部 identical-evidence):内置模型供应商 6 个 account: 计划 ID(account:{zai|bigmodel}-{start|individual|team}-coding-plan);offpeak 2 个(account:zai-offpeak-idle-plan、account:bigmodel-offpeak-idle-plan);内置供应商模板 2 个(zai-api、bigmodel-api);20 模板 builtinModelIds 两侧逐条 diff 为空;legacy builtin: 迁移映射与 25 条 legacy reasoning 改名清单均全量一致。
官方插件定义 14 条(apps/zcode-cli/packages/bootstrap/src/app/official-plugin-definitions.ts:89-364 ↔ zcode.cjs t9 数组):name+version、requiredSeedPaths、listing 键集、hostMcpServerNames、rootCandidates、defaultEnabled 14/14 全同。但插件内容包仅随 App 分发:仓库 apps/zcode-cli/packages/ 下只有 browser-use-plugin、node-repl-host、superpowers-plugin 三个目录(superpowers-plugin 仅 1 个 LICENSE 存根,且不在 14 条定义内);glm/packages/ 14 个目录与 definitions 14/14 映射。
| # | 插件(definitions.name@version) | glm/packages 目录 | 仓库侧内容 |
|---|---|---|---|
| 1 | [email protected] | node-repl-host/ | 有实体(仓库同目录) |
| 2 | [email protected] | browser-use-plugin/ | 有实体;docs/skills 5 文件与 package.json 漂移(license 改 Apache-2.0),scripts/browser-client.mjs 打包件仅 App |
| 3 | [email protected] | android-emulator/ | 仅 definitions 声明,无内容 |
| 4 | [email protected] | documents/ | 仅 definitions 声明,无内容 |
| 5 | [email protected] | pdf/ | 仅 definitions 声明,无内容 |
| 6 | [email protected] | presentations/ | 仅 definitions 声明,无内容 |
| 7 | [email protected] | spreadsheets/ | 仅 definitions 声明,无内容 |
| 8 | [email protected] | image-search/ | 仅 definitions 声明,无内容 |
| 9 | [email protected] | ios-simulator/ | 仅 definitions 声明,无内容 |
| 10 | [email protected] | restore-legacy-sessions/ | 仅 definitions 声明,无内容 |
| 11 | [email protected] | skill-creator/ | 仅 definitions 声明,无内容 |
| 12 | [email protected] | plugin-creator/ | 仅 definitions 声明,无内容 |
| 13 | [email protected] | zcode-guide/ | 仅 definitions 声明,无内容 |
| 14 | [email protected] | zcode-cua-plugin/ | 仅 definitions 声明;真实插件包(docs 470 行、7 脚本、sharp/koffi 依赖)仅 App |
仓库 packages/shared/src/channels.ts 全部 7 个协议对象 + 2 个 RPC header 常量与 App 侧整体提取对象逐键 diff:共有键值零漂移(VALUE-DIFF 全空),repo-only 仅 1 条,其余 19 个差量全部为 app-only——App 协议面是仓库的严格超集。
| 协议对象 | 仓库键数 | App 键数 | App-only 差量 | 判定 |
|---|---|---|---|---|
| ServiceChannels | 40 | 44 | +4:bots / cloud-content / marketing-touch / output-style | differs(超集) |
| PlatformChannels | 128 | 137 | +9:WebRemoteControl 族 8 + BotRemoteWorkspaceReconnected | differs(超集) |
| HostMessageTypes | 26 | 29 | +3:BotRemoteWorkspaceReconnectResult / ConnectionStatusResult / RuntimePort | differs(超集) |
| HostResponseTypes | 45 | 48 | +3:BotRemoteWorkspaceReconnectRequest / ConnectionStatusRequest / RuntimePortRequest | differs(超集) |
| InternalChannels | 6 | 6 | 0 | identical-evidence |
| EmbeddedBrowserWebviewChannels | 1 | 1 | 0 | identical-evidence |
| CodingPlanWebviewChannels | 1 | 1 | 0 | identical-evidence |
| RPC header 常量 | 2 | 1 | 0(repo-only 1:ZCODE_RPC_CLIENT_MODE_HEADER,/ws 已弃用) | skewed |
| 合计 | 249 | 268 | +19 app-only / −1 repo-only | App 严格超集 |
另一口径:全量 zcode: IPC 通道 144(仓库)vs 159(App);App 侧 PlatformChannels 137 键副本同时存在于 preload 6 个变体(rewardsWebview.cjs 按需打包不含该对象);renderer 主资产含 44 键 ServiceChannels 与 Host 消息 zod schema。
1. 同源成立。296 条 identical-evidence(占 49.7%)构成跨层证据链:源码签名级比对(desktop 196 文件、services 298 文件、provider 48 模块全部在 App 产物命中)、清单全量比对(22 模型 ID、14 插件定义、707 bash 命令、22 会话迁移、47 工具、79 session 事件、361 testid、249 协议单元)、二进制逐字节一致(1146 个 material-icons SVG、168 个 pdfjs cmaps、60 个 KaTeX 字体、config/default.json md5、asar 元数据字段、sha256 级图标比对)、依赖闭包逐版本一致(645/653)。App 由该代码库构建可以定论。
2. App 是仓库的严格超集。协议面多 19 个私有单元(ServiceChannels +4、PlatformChannels +9、Host 消息/响应 +3+3);services 多 4 个私有服务频道(bots/cloud-content/marketing-touch/output-style);126 条 app-only 功能 rows:Bots 四平台接入、rewards、webRemoteControl(9 条 IPC + 中继 + 配对)、marketingTouch、多智能体权限模式扩展、CUA 安装管线、云内容、hero-sandbox、BigModel 测试端点等 11 大功能面、45 个功能单元;另有 12 个官方插件的完整内容包仅随 App 分发。共有部分零反向缺失:仓库的频道、消息类型、i18n 命名空间、服务在 App 侧 repo-only 为 0。
3. 开源仓库是清洗后的公开切片。私有功能整体剥离;品牌与上游措辞清洗(browser-use-plugin 文档中 Codex/Claude 兼容提示被改写为 ZCode 通用表述);license 字段改写(Apache-2.0 ← App MIT);测试脚本与 devDependencies 移除;superpowers-plugin 仅剩 LICENSE 存根;zcode-server-cli、formal-proof、构建/发布脚本、测试、文档等 64 条 repo-only 单元不随 App 分发——这部分属于"开源侧合理存在、App 无需打包",与清洗方向互为表里。
4. 版本错位是 differs 的主因。仓库 3.14.0 快照 vs App 内部 3.14.1(cead36fd,2026-09-20):如 /model 的 main/lite 快捷入口、bigmodelOauth 授权回调文案、36 条 differs 中的多数属于内部构建领先,而非仓库被改动。
| # | 来源区域 | 未决项 | 无法判定的原因 |
|---|---|---|---|
| 1 | 区域5 构建/签名链 | electronLanguages 剪裁集合 | 产物 Electron Framework 内无任何 locale pak/lproj,无从验证剪裁 |
| 2 | 区域5 构建/签名链 | glm/zcode.cjs 内容级对照 | 仓库侧 dist 未构建(gitignore),产物内无版本/commit 串,仅能确认生成链同源 |
| 3 | 区域5 构建/签名链 | electron-builder win/linux 跨平台 target 配置 | 手头仅 macOS 产物,NSIS/deb/rpm/pacman 配置无实体可验 |
| 4 | 区域5 构建/签名链 | dmg 安装盘配置 | 需安装镜像才能逐字段对照 |
| 5 | 区域9 provider | provider/src/config/ids.ts | 纯类型别名(3 行),编译后无运行时痕迹 |
| 6 | 区域9 provider | provider/src/config/index.ts | 5 行桶文件,成员模块均已单独取证,桶本身无运行时单元(host 有 tree-shake) |
| 7 | 区域9 provider | provider/src/index.ts | 14 行桶文件,12 个成员模块已各自取证 |
| 8 | 区域9 provider-node | provider-node/src/index.ts | 桶文件,17 个成员模块已各自取证 |
| 9 | 区域9 model-option-map | model-option-map/src/index.ts | 桶文件,8 个成员中 7 个已取证 |
| 10 | 区域10 server/rpc | rpc/delayedChannel.ts | 17 行小函数,getDelayedChannel/DelayedChannel 全 App 零命中,无法区分内联改名还是删除 |
| 11 | 区域15 zcode-cua | CuaHelperError 类与 helper_unavailable 码 | 符号名与字符串码在 SEA/zcode.cjs/out 全部 0 命中,可能为仓库清洗时新造的客户端包装 |
| 12 | 区域15 zcode-cua | isOfficialCuaPluginEnabledForWorkspace / createCuaProductMcpServerResolver / isPotentialZCodeCuaAgentMcpServer | 三符号在混淆 bundle 中被 mangle,仅能由 consumer import 推断功能存在 |
| 13 | 区域15 zcode-cua | isScreenCaptureProbeSuccess + mark/has/clearCuaProductHelperAgentEnvUnavailable 三件套 | 客户端包装符号未命中;功能本体(screen_capture_probe)在 SEA BROKER_METHODS 已确证 |