- Unify ToolResultEnvelope (output vs content) for built-in tools - Fix shell.run AsyncGenerator consumption in ToolRegistry.call/streaming - Scheduler: consume WorkerResult.status instead of marking all running tasks completed - WorkerProcess/WorkerManager: surface exit events and generate failed/cancelled result - MainAgent: integrate ContextAssembler, Chinese destructive regex, ArchitectureDesigner impact gate - run.ts: pendingConfirmation flow, dispatch extracted, .air files filtered from /results - CapabilityRegistry wired into RuntimeApp and ServiceRegistry; DoctorService uses it - release.ts: findRepoRoot/findBun, run air e2e + depcruise + runtime regression - New gates: release-critical-gates, CLI run command regression - 14/14 e2e gates pass; 3/3 release dry-run pass Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
13 KiB
Executable File
13 KiB
Executable File
AirCoding 集成修复第一轮 - 状态交接
用于在另一台设备继续。包含上下文、真实问题、修复方案、验证结果、剩余事项和复现命令。
1. 项目与远端
- 仓库根:
/home/airlongdian/DataDevices/AirWorkSpace/AirCoding - 仓库地址:
http://admin:L753865h@39.106.174.106/admin/AirCoding.git - 当前分支:
GLM5-Achieve - 推送目标:
origin/GLM5-Achieve - 仓库不在 Git 根级
package.json下,子包为 monorepo;用 Bun 运行命令。
2. 本轮目标与边界
用户要求:架构与设计冻结、需求已明确;不允许回退或降级;汇总多轮四视角审查报告的真实问题并修复;修复后跑真实 UAT 演示。
架构与设计冻结点(不要修改):
- 7 个 monorepo 包:
contracts / cli / tui / runtime / llm / toolchain-cpp / workers - 5 个 Domain Invariants(INV-1~INV-5)
- 工具契约
ToolResultEnvelope { status, output, error, artifact_ids, evidence_ref_ids, metadata }(packages/contracts/src/tool.ts) - Worker/Scheduler IPC 协议
- 状态机:
MainAgent15 态、Scheduler13 态
真实阻断问题(来源:MiniMax-M3 / Deepseek / GLM5.1 / Gpt5.5 四份审查报告):
- 工具结果
content与output契约不一致 shell.runAsyncGenerator 无法被普通call()消费- Scheduler 在
!has_running()时把所有 running task 标 completed - Worker 无结果退出后状态丢失
- MainAgent 回答未接入 ContextAssembler
run.ts危险操作 confirmation y/n 路由断裂- ExecutorRole DONE 判定宽松、code block 全局反转义破坏源码
- E2E/release gates 不覆盖真实成功场景
- 报告
集成测试阶段GLM5.1审查结果.md/集成测试阶段Gpt5.5审查结果.md在仓库根目录
3. 已完成的源码修复
3.1 工具契约与 shell.run
packages/runtime/src/tools/BuiltInToolRegistrar.ts:create_real_executor()中 18 个工具成功返回从{ type, content }改为 canonical{ status: 'ok', output, metadata }。packages/runtime/src/tools/ToolRegistry.ts:ToolExecutor支持Promise | AsyncIterable返回;execute_branch通过execute_executor_final消费 streaming final envelope;call_streaming透传 chunks 并保证 final 出现。packages/runtime/src/tools/shell/index.ts:streaming executor 立即 yieldcommand.started,stdout/stderr chunk 收集后 yield,final envelope 包含metadata.is_final = true与output.{exit_code, stdout, stderr, timed_out}。
3.2 Worker/Scheduler 结果闭环
packages/runtime/src/workers/WorkerProcess.ts:新增on_exit回调,触发退出时把信息分发给 WorkerManager。packages/runtime/src/workers/WorkerManager.ts:WorkerHandle.state增加failed,worker.result按 payload.status 决定 handle state;保留 wrapped result。wrap_worker_result把changes[].file → changed_files、verification object →verification[]、role statusfixed/pass → completed、others →failed。handle_worker_exit在 worker 退出但无 result 时构造failed/cancelledresult。- 暴露
get_result_for_task/get_handle_for_task。 - 给 ToolRegistry 调用上下文传
project_root+agent_type: 'executor',不再用cwd伪字段。
packages/runtime/src/scheduler/Scheduler.ts:MONITORING改为按WorkerResult.status消费task.completed/task.blocked/task.cancelled/task.faileddurable events;删除"!has_running()直接 completed"逻辑。
3.3 MainAgent 上下文、确认门、ArchitectureDesigner
packages/runtime/src/context/ContextAssembler.ts:- 修复 L6
evidence_store.list_for_entity调用签名。 - 修复 L8 兼容
role: 'tool' / 'tool_result' / 'tool_use'。 - 新增 L3
project_files快照层(实现build_project_files_snapshot)。 - 移除 additional_layers 重复追加。
- 修复 L6
packages/runtime/src/app/RuntimeApp.ts:start()中实例化CapabilityRegistry、绑定 ToolRegistry、注入 DoctorService;创建MessageRepository/EvidenceRepository并context_assembler.set_data_sources。packages/runtime/src/app/ServiceRegistry.ts:同步接入CapabilityRegistry、把 WorkerManager/Scheduler 走同一个 tool registry。packages/runtime/src/agents/main/MainAgent.ts:- 新增
context_assembler / architecture_designer / project_root / agent_id / task_id字段。 chat_with_llm()使用ContextAssembler.assemble生成 L0-L9 消息再追加 user message。classify_via_llm改用complete_text与ProviderManager既有 API 对齐。- 危险操作正则覆盖中文:
删除|删掉|清除|移除|销毁。 - 委托前调用
ArchitectureDesigner.assess_impact,reject_or_escalate/requires_replan转ARCHITECTURE_DESIGNING,requires_user_confirmation转CONFIRMING。 - 新增
infer_changed_files推断受影响组件。
- 新增
packages/cli/src/commands/run.ts:- MainAgent 构造时传入
context_assembler与project_root。 - 把调度逻辑抽取为
dispatchTask,避免重复代码。 pendingConfirmation状态机:进入 CONFIRMING 时只展示提示并保存原始任务;y→handle_confirmation(true)后dispatchTask;n→handle_confirmation(false)提示取消,不创建任务。/results优先使用WorkerResult.changed_files,过滤.air内部文件。
- MainAgent 构造时传入
packages/cli/src/commands/ask.ts:MainAgent 接入context_assembler/project_root;execute_task中ctx改为 canonical ToolExecutionContext。
3.4 ExecutorRole
packages/workers/src/roles/ExecutorRole.ts:- 引入
is_done_signal(text)严格判定(仅当整行等于DONE或TASK_COMPLETE)。 - 工具失败且 LLM 输出 DONE 时不返回
completed,而是让 LLM 修复。 - 移除 code block 内容的全局
\\n/\\t/\\\\/\\"反转义,保留原文。
- 引入
3.5 Permission 与 TUI
packages/runtime/src/tools/ToolRegistry.ts:ask_user/deny分支保留call.call_id。packages/cli/src/commands/release.ts:增加findRepoRoot/findBun,将 release gates 改为运行air e2e、runtime regression、depcruise,timeout 600s,并输出失败尾部。
4. 新增门禁与测试
packages/runtime/test/regression/release-critical-gates.test.ts(已接入 e2e P0-REL):built-in tool success envelopes use output, not contentshell.run returns a final envelope through call and streaming APIsscheduler does not mark running tasks completed without a worker resultMainAgent answer mode uses assembled project contextdestructive requests enter confirmation and rejection returns to idle
packages/cli/test/run-command-regression.test.ts(已接入 e2e P0-REL):- 锁定
run.ts使用 WorkerResult.changed_files、过滤.air、维护 pendingConfirmation。
- 锁定
packages/runtime/test/regression/worker-result-envelope.test.ts更新断言为新wrap_worker_result实现。packages/runtime/test/regression/tool-registry-permission.test.ts新增 ask_user/deny 保留 call_id 断言。packages/cli/src/commands/e2e.ts新增P0: Release-critical functional gates。
5. 验证结果
$ /home/airlongdian/.bun/bin/bun run packages/cli/src/index.ts e2e
14/14 gates passed
- P0: Monorepo structure
- P0: depcruise dependency boundary (INV-4)
- P0: tsc strict typecheck (0 errors)
- P0: Release-critical functional gates
- P1: Storage/Events
- P2: Tools/Permission
- P3: Provider/Context
- P4: Worker IPC
- P5: C++ Toolchain
- P6: Projection/TUI
- P7: Agents
- P8: Full regression suite
- SEC: Command injection regression
- CAP: Capability trust regression
$ /home/airlongdian/.bun/bin/bun run packages/cli/src/index.ts release --dry-run
3/3 gates passed - Release READY
6. 真实 UAT 演示(临时目录 /tmp/air-uat.Y2H5dz)
- LLM 配置:
OPENAI_API_KEY=sk-...、OPENAI_BASE_URL=http://newapi.airlongdian.fun(注意:env 中AIRCODING_*会被适配器再次加/v1,应直接用OPENAI_*)、AIRCODING_MODEL=glm-5.1。 - 场景结果:
air ask "创建一个 hello.txt,内容是 HelloWorld"→ 真实写入HelloWorld磁盘。air ask "我的项目里有哪些文件?"→ 回答引用项目文件快照(hello.txt),无幻觉。air run输入请删除 hello.txt后n→ 提示 "Cancelled. No task was created.",文件保留。air run输入请删除 hello.txt后y→ 调度shell.run rm,文件被删除。
- UAT 临时发现并修复:MainAgent 原危险正则不匹配中文,补充
删除|删掉|清除|移除|销毁。
7. 复现命令(在新设备上验证)
REPO=/home/airlongdian/DataDevices/AirWorkSpace/AirCoding
cd "$REPO"
# 1) Type check
/home/airlongdian/.bun/bin/bun run node_modules/.bin/tsc --noEmit -p tsconfig.check.json
# 2) E2E
/home/airlongdian/.bun/bin/bun run packages/cli/src/index.ts e2e
# 3) Release dry-run
/home/airlongdian/.bun/bin/bun run packages/cli/src/index.ts release --dry-run
# 4) 临时目录演示
TMP=$(mktemp -d /tmp/air-uat.XXXXXX)
cd "$TMP"
/home/airlongdian/.bun/bin/bun run "$REPO/packages/cli/src/index.ts" init .
OPENAI_API_KEY=<your_key> \
OPENAI_BASE_URL=http://newapi.airlongdian.fun \
AIRCODING_MODEL=glm-5.1 \
AIRCODING_REPO_ROOT="$REPO" \
/home/airlongdian/.bun/bin/bun run "$REPO/packages/cli/src/index.ts" ask "创建一个 hello.txt,内容是 HelloWorld"
cat hello.txt
8. 关键文件清单
修改:
packages/cli/src/commands/ask.tspackages/cli/src/commands/e2e.tspackages/cli/src/commands/release.tspackages/cli/src/commands/run.tspackages/runtime/src/agents/main/MainAgent.tspackages/runtime/src/app/RuntimeApp.tspackages/runtime/src/app/ServiceRegistry.tspackages/runtime/src/context/ContextAssembler.tspackages/runtime/src/scheduler/Scheduler.tspackages/runtime/src/tools/BuiltInToolRegistrar.tspackages/runtime/src/tools/ToolRegistry.tspackages/runtime/src/tools/shell/index.tspackages/runtime/src/workers/WorkerManager.tspackages/runtime/src/workers/WorkerProcess.tspackages/runtime/test/regression/tool-registry-permission.test.tspackages/runtime/test/regression/worker-result-envelope.test.tspackages/workers/src/roles/ExecutorRole.ts
新增:
packages/runtime/test/regression/release-critical-gates.test.tspackages/cli/test/run-command-regression.test.ts
报告(在仓库根目录):
集成测试阶段Deepseek审查结果.md集成测试阶段GLM5.1审查结果.md集成测试阶段Gpt5.5审查结果.md集成测试阶段MiniMax-M3审查结果.md集成测试阶段GLM5.1审查结果.md状态交接.md(本文件)
9. 提交策略
本轮一次性提交,commit message:
fix: integrate audit findings (round 1) - tools, worker, scheduler, main agent
- Unify ToolResultEnvelope (output vs content) for built-in tools
- Fix shell.run AsyncGenerator consumption in ToolRegistry.call
- Scheduler: consume WorkerResult.status instead of marking all running tasks completed
- WorkerProcess/WorkerManager: surface exit events and generate failed/cancelled result
- MainAgent: integrate ContextAssembler, Chinese destructive regex, ArchitectureDesigner impact gate
- run.ts: pendingConfirmation flow, dispatch extracted, .air files filtered from /results
- CapabilityRegistry wired into RuntimeApp and ServiceRegistry; DoctorService uses it
- release.ts: findRepoRoot/findBun, run air e2e + depcruise + runtime regression
- New gates: release-critical-gates, CLI run command regression
- 14/14 e2e gates pass; 3/3 release dry-run pass
10. 已知与待办
- TUI 完整输入/快捷键统一收口仍是可改进点(UAT 已在非 TTY 走通 readline),建议后续在 TUI 内增加任务输入框。
- Projection 事实源收口已做(
/results走 WorkerResult,ProjectionClient 接收 ProjectionStore 推送),但 TUI 渲染仍以手工 snapshot 为初值;下一步可以由 EventStore/ProjectionStore 完全驱动。 - 新增
集成测试阶段Gpt5.5审查结果.md等报告应作为证据纳入未来 release notes。
会话记录(从对话恢复继续的关键节点):
- 四份审计报告汇总去重 → 真实问题清单。
- Phase 1: 工具契约 + shell.run 修复(ToolRegistry 消费 AsyncIterable、shell final envelope)。
- Phase 2: WorkerProcess exit handler → WorkerManager → Scheduler MONITORING 改按 WorkerResult 状态入事件。
- Phase 3: MainAgent 接入 ContextAssembler,CONFIRMING y/n 路由,ArchitectureDesigner 主路径,CapabilityRegistry 接入,Permission call_id 保留。
- Phase 4: ExecutorRole 严格 DONE、保留 code block 原文、失败不 completed。
- Phase 5: 新增 release-critical-gates / CLI run regression,air e2e 14/14。
- Phase 6: run.ts
/results走 WorkerResult,release.ts 找 repo root。 - 真实 UAT:air ask 创建/追问;air run 中文删除拒绝/确认;运行中 UAT 触发并修复中文确认门正则。
- 准备状态交接与一次性 git 提交推送。
会话总耗时较长,过程已通过自动化避免重复。回到本机可直接按 §7 复现并继续。