feat(lark): 支持 TraeX 统一初始化 Forge - #711
Conversation
Co-authored-by: TRAE CLI <noreply@bytedance.com>
deepcoldy
left a comment
There was a problem hiding this comment.
Codex 复审结论:Request changes
本轮重点复核了 TraeX 安全网入口、commitRepoSelection 复用,以及 worktree 两条异步分支。owner / nonce / 活动卡 / 并发门整体成立,但发现 1 个阻塞问题和 1 个窄路径问题。
🔴 P1:项目多时初始化卡超过飞书 100 KB 上限,TraeX 首轮无法启动
buildTraexInitializationCard 把全部项目先映射成目录选项,再为所有主仓库追加 worktree 选项,没有数量或字节预算。当前 checkout 的实际扫描结果已经能稳定触发:
scanMultipleProjects(['/root', '/tmp'], 3, repoPickerScanOptions()):639 个项目,其中 81 个主仓库- 下拉选项:720 个
- 卡片原始大小:111,956 bytes
- 经
stampBotmuxCallbackMarkers后实际发送内容:112,004 bytes
飞书官方接口明确限制卡片内容不超过 100 KB;超过会返回 100000。这里 sessionReply 会失败,worker 又按设计尚未 fork,因此这类环境的 TraeX 真人首轮会直接卡死。现有测试 mock 了发送接口,所以 639-project 用例仍显示通过,没覆盖这个运行时失败。
建议在卡片 builder 里按最终 wire bytes做硬预算(同时给 option 数量设上限),保留当前目录/常用项目并提示可用手动目录兜底;补一个大项目列表测试,断言加 marker 后仍低于 100 KB。
官方限制:https://open.feishu.cn/document/ukTMukTMukTM/uMDO1YjLzgTN24yM4UjN
🟠 P2:thread safety-net 漏掉 !threadGrill
handleNewTopic 的 TraeX guard 有 && !workflowGrillPrompt,但无活跃会话时的 thread safety-net 没有 && !threadGrill。因此老话题里 /workflow new X 会误弹初始化卡。
展开后的 workflow prompt 并非丢失:它进入 promptPrefix;确认时又拼上输入框默认的字面 /workflow new X,Forge 模式还会夹入 $forge-*。最终是“展开后的 workflow skill prompt + 原始 workflow 命令”的语义混合。建议补 && !threadGrill 并加回归测试。
已确认无问题
- TraeX 提交先经过通用 sensitive owner 例外,再经过
operator === pending.owner === session.owner、nonce、活动卡校验。 - worktree 递归 re-dispatch 与 auto-worktree 两支都会在首次
await前同步设置ds.worktreeCreating = true;重复点击、普通切仓及并发 commit 会被worktreeCreating/pendingRepoCommitInFlight挡住。 - message listener 正常固定用当前
messageId作新 anchor,并路由到handleNewTopic,已有!messageListener;它只有在注册输掉后 re-dispatch、且赢家又恰好消失的极窄竞态才可能落到 safety-net。为对称和防御性,安全网可顺手加&& !ctx.messageListener。bot 自动化则由isForeignBot排除。
实际验证
pnpm build✅- 相关 7 个测试文件:373/373 ✅
git diff --check 4bc7d4e8f..7a3d20ea7✅- PR 当前无 CI checks
未合码,等待作者修复及申晗确认。
概述
为 TraeX 机器人新增首轮统一初始化卡:用户发送首条普通消息后,在启动 worker 前一次性选择工作目录、普通 TraeX / Forge Pipeline / Forge Pilot,并可编辑初始提示词。
链接
改动
$forge-*入口保持原直达路径。$forge-pipeline\n<提示词>和$forge-pilot\n<提示词>,复用现有buildNewTopicCliInput → commitRepoSelection → forkWorker事务。测试
pnpm vitest run --project unit test/traex-initialization.test.ts test/traex-initialization-card.test.ts test/card-handler-repo-select.test.ts test/daemon-rename-route.test.ts test/card-builder.test.ts test/initial-user-turn-opening.test.ts238/238通过pnpm buildpnpm test12221通过;构建后复跑所有 dist 前置失败项均通过test/v3-distillation-runner.test.ts的 PID namespace 辅助进程时序用例在本机稳定失败,与本次改动无依赖覆盖场景
影响范围
daemon.ts、Lark card handler、DaemonSession运行态。cliId=traex的真人首轮普通消息生效;其它 20+ CLI 不进入新分支。QA 回归建议