X-Ray · Agent 工具链
ZCode 之后我又拆了 MiniMax 和 Qoder,GLM 对话没有读回那份 Git 包
网上传编程 Agent 会静默上传仓库。上一篇把本机 ZCode 3.10.1 对上了。同一天我在另一台 Mac 上拆 MiniMax Code 3.0.68 和 Qoder CN 0.3.3,再回到本机看 GLM 运行时会不会把已经传走的快照用进对话。
三家客户端都带着云端代码相关实现。打出来的包不一样,开关也不一样。
MiniMax 桌面版还留着 ZIP 索引,这台机器没跑过
应用在 /Applications/MiniMax Code.app,短版本 3.0.68。asar 大约 461 MB。公开仓库 MiniMax-AI/minimax-code 的 TUI 0.4.12 已经拆掉工作区索引。桌面版还留着完整子系统,名字叫 workspace indexing。代码会把用户选中的项目打成 workspace.zip,旁边再写一份 manifest.json,交给远程 worker。
本地 SQLite 表 local_runtime_workspace_indexing_revisions 的字段里有 archive_oss_key、embedding_model、dimensions。这条路是给语义搜索用的。asar 里搜不到 pack-objects。
开关在 resolveWorkspaceIndexingPreference。
enabled = forced || persisted === true
forced = runtimeOwnerKind !== 'tui'
&& (internalBuild || buildEnv === 'test')
正式桌面版默认关着,要把偏好写成 true 才会开。另外 isWorkspaceIndexingSessionEligible 要求 isDefaultWorkspace === false,避免把应用自己的回退目录传上去。注释写得很直白,旧记录如果缺这个字段,把 undefined 当成合格,会扫到应用自己的 fallback 文件夹。
这台机器的 ~/.minimax/v2/sqlite/runtime-state.sqlite 里,local_runtime_workspace_indexing_sessions 和 local_runtime_workspace_indexing_revisions 都是 0 行。local_runtime_file_api_uploads 也是 0。代码在,上传记录没有。
eval_snapshot 我只看到过一次超时失败。后来聊天成功,没有对应的快照行。桌面版有没有在对话里另走一条静默快照,这台机器给不出成功样本。
Qoder CN 把远程索引写进产品表里关了
另一台 Mac 装着 Qoder CN 0.3.3。插件 qoder-context 版本 1.0.51.fa026ec3。qoder-search.bundle.mjs 里有完整远程索引。本地 mtree 扫工作区,算 Merkle。远端比对之后,未同步文件读 fileContent,deflate 打成 batch_N.zip,PUT 到 /algo/api/v2/service/codebase/file/upload。模型写死 text-embedding-v4,512 维。
跳过 node_modules、.git、dist、out、build、coverage,再叠加 gitignore。Git watch 只用 status、diff、rev-parse、hash-object 做指纹,不打包 objects。
| 能力 | 产品 ID qoder |
产品 ID qoder-cn |
|---|---|---|
| 远程代码索引 | 开 | 关 |
| 云端搜工作区 | 开 | 关 |
| 索引设置界面 | 开 | 关 |
| 知识库远程配置 | 开 | 关 |
两张表写在同一份插件里。host 里 dk() 直接返回 qoder-cn。进程环境 QODER_PRODUCT_ID 也是 qoder-cn。daemon 启动时不创建远程 client。tryRemoteSync 第一行看到 remoteCodeIndexing 为 false 就返回。国内网关地址 https://gateway.qoder.com.cn 和国际地址 https://repo2.qoder.sh 并排写在同一张 endpoint 表里。
所以这台 Qoder CN 云端搜代码走不通。登录、扫盘、发 prompt 都发生过。远端没有 codebaseId,语义搜索没有东西可查。设置页也没有索引开关,indexSettings 一并关掉了。
安装包里找不到为什么关。没有合规、PIPL、数据出境这类注释。日志原文是 disabled by product profile,按产品形态禁用。上传实现和国内网关地址都还在包里,客户端没接线。
2026 年 9 月 18 日晚上 22 点 53 分,日志写 knowledge remote config disabled by product profile。22 点 55 分打开 /Users/lifcc/Desktop/code,UserPromptSubmit 触发 mtree sync begin,codebaseId 仍是 null。CLI 打出 registerWorkspace skipped: non-target org。22 点 57 分 mtree sync end,fileCount 等于 100000,codebaseId 还是 null。
本地 index-settings.v1.json 里 autoIndex 为 true,树里大约 25 万文件、10.9 万目录,索引文件数顶在 10 万。这是本机扫盘。没有 qoder-search-indexing.log。那份日志只在真正跑 workspace_sync 时写。
自动上传还有文件数门槛。自动触发在文件数大于等于 10000 时跳过。硬顶大于 100000 会失败。这台机器即使打开远程,自动路径也会被 10 万文件挡住。
国际版默认开,是从 CN 包里那张 qoder 表读出来的。我没有另装国际版客户端,也没有国际版运行日志。同一份上传实现,换产品 ID 就会走开着的配置。国际安装包如果换了插件或改写 flag,实际行为可能不一样。
GLM 对话没有把快照读回来
回到本机 ZCode。发提示词时 host 调用 scheduleRepoSnapshotSidecar,错误被 catch 掉。紧接着 await session/send。这一轮 GLM 等不到索引建完。
zcode.cjs 里搜不到 snapshot_id,也搜不到 /api/v1/snapshot。asar 里和仓库快照有关的 HTTP 只剩 GET /api/v1/snapshot/upload-credential。没有 search、status、query、retrieve。
本机 3 份 model-io 打给 GLM-5.3。请求字段是 messages、tools、system 这类。没有 snapshot 字段。挂给模型的工具是 Agent、Read、Bash、Edit、Write、WebSearch 等。22 份 transcript 里实际出现的工具名是 Bash、Read、TodoWrite。agent 在读磁盘。
设置里的即时搜索是 instantGrepIndexingEnabled,本地 grep。和仓库快照上传分开。
服务端拿得到 AES 密钥。包能解开。拿去训练或以后做索引,客户端证明不了。3.10.1 的对话路径没有把快照读回来。
对照
| ZCode 3.10.1 | MiniMax 3.0.68 | Qoder CN 0.3.3 | |
|---|---|---|---|
| 上传物 | 工作区文件加整个 .git/ |
workspace.zip |
源文件 ZIP 批次 |
| 目的 | 仓库快照,接口名 snapshot | 远程 embedding / 语义搜 | 远程 embedding / 语义搜 |
| 默认 | host 不读设置页开关 | 关,除非偏好写成 true | 国内产品表关掉远程 |
| 这台机器 | 公开小仓已传成功 | 索引表 0 行 | 本地扫了 10 万文件,未上传 |
| 对话怎么读代码 | Read / Bash 读磁盘 | 未在这台机器上观察到 ZIP 回读 | CN 未建立 codebaseId |
这次只覆盖本机 ZCode 3.10.1、另一台 Mac 上的 MiniMax Code 3.0.68 与 Qoder CN 0.3.3。MiniMax 公开 TUI 仓库和桌面版不是同一份二进制。Qoder 国际版只看到 CN 包里的产品表。服务端怎样保存和解开这些包,我没有证据。