X-Ray · Agent 工具链
查完 ZCode,再看 MiniMax 和 Qoder 的代码上传
上一篇在本机找到了 ZCode 的仓库快照。这次我在另一台 Mac 上检查 MiniMax Code 3.0.68 和 Qoder CN 0.3.3,又回到 ZCode,看 GLM 对话是否会读回那些快照。三份客户端都有云端代码相关实现,但打包内容、启用条件和留下的运行记录并不一样。
MiniMax:桌面版保留了索引,记录却是空的
应用在 /Applications/MiniMax Code.app,短版本 3.0.68,asar 包约 461 MB。这里容易混淆的是公开 TUI 和桌面版:公开仓库 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 和 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。配置的 embedding 模型为 text-embedding-v4,维度是 512。
这条扫描路径跳过 node_modules、.git、dist、out、build、coverage,再应用 gitignore。Git watch 使用 status、diff、rev-parse 和 hash-object 计算指纹,没有在这条路径中打包 Git objects。
不过,包里有实现不代表 CN 产品会运行它。同一份插件里的两张产品配置表,把下面几项设成了不同的值:
| 能力 | 产品 ID qoder |
产品 ID qoder-cn |
|---|---|---|
| 远程代码索引 | 开 | 关 |
| 云端搜工作区 | 开 | 关 |
| 索引设置界面 | 开 | 关 |
| 知识库远程配置 | 开 | 关 |
host 中的 dk() 返回 qoder-cn,进程环境变量 QODER_PRODUCT_ID 也是这个值。daemon 启动时不创建远程 client;tryRemoteSync 遇到 remoteCodeIndexing 为 false 就返回。设置界面同时被 indexSettings 关闭,因此也看不到索引开关。
日志与配置相符。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 万;同时没有找到真正运行 workspace_sync 时才会写出的 qoder-search-indexing.log。这些记录显示本地扫描发生了,远程代码库没有建起来,这轮云端语义搜索也就没有可查询的代码库。
文件数还有另一层限制:自动触发遇到大于等于 10000 个文件时会跳过,大于 100000 则超过硬上限。这台机器的目录达到 10 万文件,即便启用远程配置,自动上传路径仍会遇到前一个门槛。
至于 CN 为什么关闭这些功能,安装包没有给出原因。国内网关 https://gateway.qoder.com.cn 和国际地址 https://repo2.qoder.sh 都在 endpoint 表里,但没有找到解释关闭原因的注释。日志只说按产品配置禁用,不能从中推断是合规、成本或其他决策。
表格中 qoder 一列也有范围限制:它来自 CN 安装包内的配置,不能替代国际版实测。我没有另外安装国际版,也没有它的运行日志;国际安装包若更换插件或覆盖配置,行为可能不同。
回到 GLM:这些会话有没有引用仓库快照
ZCode 已经有了快照上传记录,还需要检查另一件事:模型对话是否使用它。在本机的发送路径中,host 先调用 scheduleRepoSnapshotSidecar,对错误做 catch,随后执行 await session/send。这条路径没有等待快照上传或索引完成,单凭两者前后调用,不能认定对话已经拿到了快照。
我在 zcode.cjs 中没有找到 snapshot_id 或 /api/v1/snapshot。asar 里查到的仓库快照 HTTP 接口是 GET /api/v1/snapshot/upload-credential,没有找到对应的 search、status、query、retrieve 调用。
再看运行记录:本机 3 份发往 GLM-5.3 的 model-io 请求包含 messages、tools、system 等字段,没有 snapshot 字段。提供给模型的工具包括 Agent、Read、Bash、Edit、Write、WebSearch;22 份 transcript 中实际出现的工具名是 Bash、Read、TodoWrite。这些样本显示 agent 在通过本地工具读文件,没有显示它读回了那份 Git 包。设置里的 instantGrepIndexingEnabled 控制本地 grep,也与快照上传分开。
这仍然只是已检查的客户端路径和会话样本。快照的内容密钥按客户端实现封装给服务端,服务端具备解包条件;之后是否用于索引、训练或其他用途,仅凭这些请求和日志无法判断。
三份客户端的差别
| 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。表格区分实现、开关与运行记录,不代表检查过三家的所有数据发送路径或服务端行为。