合并最新master到M0A-2开发分支
Project CI / Repository checks (pull_request) Successful in 1m21s
Project CI / Frontend tests (pull_request) Successful in 3m5s
Project CI / Backend tests (pull_request) Successful in 4m10s
Project CI / Native shell tests (pull_request) Failing after 10m35s

同步 origin/master 至 3c457feb4c

保留 M0 固定 owner 验证、本人 smoke、试玩执行者与动态 Canvas 谱系合同

通过 114 项完成合同回归、动态 Canvas 精确回归及格式编码检查
This commit is contained in:
2026-08-11 09:12:10 +00:00
103 changed files with 7551 additions and 1455 deletions
File diff suppressed because one or more lines are too long
@@ -1592,6 +1592,58 @@ V1.49 已经让 `agent-runtime-core` 能在不依赖 Provider 的情况下独立
- core conformance 覆盖第三方 fake Provider 注册/调用、重复与未知 ID、能力不匹配零调用和 stream callback。`platform-llm` 覆盖三种 descriptor、request/response/tool-call/stream/error 双向转换与实例隔离;AGC 覆盖 interaction 实际走 registry 及原 fallback 语义。
- 完成后运行 core conformance、`cargo test -p platform-llm --manifest-path server-rs/Cargo.toml`、AGC interaction/config 定向回归、Tauri `cargo check --tests``npm run ai-game-creator-shell:check``npm run check:encoding``git diff --check`;独立 core 生成的 `Cargo.lock/target` 交付前清理。
## V1.51 Codex CLI 节点执行模式
V1.51 在不替换现有 Provider、Runner 和 Runtime 事实源的前提下增加第二种节点 Agent 执行器。AppData `agentMode` 只接受 `codex_cli / provider`,默认 `codex_cli`;显式 `provider` 继续执行 V1.29-V1.43 的原 HTTP LLM 路径。Runner 不新增模式参数,每次节点请求从当前 AppData 配置解析模式。
### 执行与协议
- 每次 Runtime 节点的 tool-plan、格式修复、上下文压缩或 final-reply 请求仍先构建既有 `LlmRunRequest`、捕获同一 Provider snapshot,并进入原 started/completed lifecycle。`codex_cli` 分支启动一次 `codex exec`,把 prompt 经 stdin 输入,把当前函数目录转换为 structured-output schema,并把终态 JSONL 转回现有 `LlmRunResponse / LlmToolCall`
- Codex CLI 只充当推理 Agent,不充当第二个 ToolHost。调用固定使用空临时 cwd、`--skip-git-repo-check --ephemeral --ignore-user-config --ignore-rules --sandbox read-only --disable shell_tool` 和 never approval;不得加载项目 `AGENTS.md`、用户 MCP/plugin/hook 或执行项目命令。所有项目读写、命令、MCP、Canvas、权限、pending、receipt、revision 与 verification 继续由 AGC Runtime 执行。
- prompt 和 schema 有界,prompt 只走 stdin,不进入 argvstdout/stderr 有独立上限,持久审计只保存模式、版本、退出分类、字符数和指纹,不保存 prompt、函数参数、CLI 认证、本机路径或原始错误正文。CLI 非零退出、缺少终态 agent message、JSONL/schema 损坏和超限输出统一失败关闭并走既有安全错误摘要。
### 生命周期与恢复
- Codex child 绑定当前 request future 并设置 drop killsteer、取消、暂停、Runner draining 和 GUI owner 丢失继续沿现有 Provider interruption 收束。started 后没有 completed 的请求继续进入 `needs-reconciliation`,不得重新启动同一 request slot。
- 由于 CLI shell、MCP 和项目写入被禁用,Codex 请求本身没有项目副作用;但其响应交接仍可能处在未知窗口,必须继续使用 V1.41/V1.43 的 handoff 与零重放规则。`agentMode`、CLI 稳定身份和影响输出的 CLI 参数进入 `providerConfigFingerprint`,跨模式或 CLI 漂移必须作废旧 retry/handoff,不能当作同一请求恢复。
- 同 wave 并发仍由现有 per-Agent lane 和 scheduler 决定;一个节点只启动一个 Codex 子进程,依赖节点只在原 manifest 终态门满足后启动。CLI 模式不新增 Codex 内部子 Agent,也不把 Codex session 当 AGC Session 或恢复事实。
### 配置与验收
- `check_game_creator_llm_config` 在 CLI 模式只检查固定 Codex 可执行文件可启动并返回受支持版本,不要求 LLM API Key;Provider 模式保持既有检查。配置 UI 显示全局模式,始终保留旧 LLM/逐 Agent/MCP/Editor 配置;切换模式不清空任何旧值。
- fake Codex fixture 必须覆盖 argv/stdin、structured calls、final text、非零退出、挂起取消、损坏/超限 JSONL、无 shell/MCP 参数和并发节点;真实 smoke 只复用用户已有 Codex 登录态。旧 Provider smoke 继续作为回退模式门禁,不能被新 CLI smoke 替代。
## V1.52 Codex app-server 长期节点 Agent 模式
V1.52 保留 V1.51 一次性 `codex_cli` 和原 HTTP `provider`,新增 `codex_app_server` 并切为默认。External Runner 按实际 LLM 凭据、Responses 路由与 `projectId / agentId / sessionId / runId` 为每个权威节点隔离长期 `codex app-server --stdio` 子进程;节点 run 在自己的进程内映射一个 ephemeral Codex thread,每次权威 `LlmRunRequest` 快照映射一个串行 turn。Codex thread 不是持久恢复真相,Runner 重启后仍只依据 AGC lifecycle、retry/handoff、manifest、Agent DB 与 finalization 重建工作。
### 配置、认证与安全边界
- `apiKind` 在有无 API Key 时都必须为 `openai_responses`;非空 Key 由 app-server 启动参数注册隔离 model providerbase URL 和 `wire_api=responses` 显式生效,Key 仅通过专用环境变量传入,不进入 argv、日志、项目或指纹明文。`openai_chat / anthropic` 不伪装兼容,配置检查明确要求切换 `provider`。API Key 为空时只使用用户现有 Codex `auth.json` 登录态,model 与 reasoning effort 仍取当前有效 Agent LLM 配置;继承的 `CODEX_API_KEY` 必须移除,避免实际账号与池/账本身份不一致。
- app-server 使用带空 `.git` 边界的临时 cwd、隔离 `CODEX_HOME` 和隔离 OS `HOME / USERPROFILE / APPDATA`,让仓库发现停在临时 workspace,并只桥接用户已有 `auth.json`;不得沿临时目录父级加载配置/skills,也不加载用户 `config.toml`、用户 skills、MCP、hooks 或项目 rules。启动前显式设置 `web_search="disabled"``agents.enabled=false`,并关闭 shell、unified exec、浏览器、插件、图像、workspace dependency 等原生能力;thread/turn 固定 never approval、read-only、network disabled,并只发送当前 Codex CLI schema 声明的字段。任何 server→client 审批/交互请求失败关闭,任何非被动 item 在 `item/started` 即中止。AGC Runtime 继续是唯一 ToolHost,因此 `webSearchEnabled` 在本模式必须为 `false`;需要原 Provider 联网检索时切换 `provider`
- Pool key 绑定本次实际凭据快照指纹、base URL、API kind、Codex CLI 版本与权威节点 run 身份:非空 AppData Key 指纹绑定实际注入的专用环境变量字节,空 Key 则先一次性读取有界 `auth.json`、按同一份字节生成指纹并复制进隔离 `CODEX_HOME`,登录态变化后不得复用旧池连接。最多保留 32 个节点进程,仅淘汰没有外部 lease 的 LRU 连接。每个连接最多保留 128 个 inactive LRU thread,但正常只服务自己的节点身份。Provider 配置指纹另外绑定模式、CLI 版本、app-server 协议、model/effort、安全参数和 output schema 合同。逐 Agent override 与不同节点不得共享进程。
### turn、取消与恢复
- JSON-RPC stdout 使用有界 NDJSON 行,stderr 按固定块排空并对无换行单条记录设置硬上限;两条路径在没有换行时都不得无限增长。stderr 原文不进入错误、Runner 日志或持久记录,只累计固定分类、总字节数与 SHA-256,并同时记录可取得的 exit status。协议继续使用单调 request ID、有界 pending RPC map 与 turn event routerinitialize 每个进程 generation 只执行一次。`stream=true` 的 final-reply 把 `item/agentMessage/delta` 转成现有 `LlmStreamDelta`,半句仍只是可丢失展示缓存;只有 `turn/completed` 且最终 agent message 满足 output schema 后才转换为 `LlmRunResponse / LlmToolCall`,随后仍走既有成功 handoff 原子写入和回读。
- 当前 request future 被取消、暂停或 drop 时只发送对应 `turn/interrupt`;取消状态从 `turn/start` 写出前就建立,若取消与 turn ID 回包乱序,双方通过共享槽位恰好一次补发 interrupt。异常路径立即删除本地 turn routerorphan pending RPC 在 30 秒后自清理。app-server EOF、损坏 JSON、`turn/start` 回包丢失或已开始 turn 的等待超时属于终态未知,必须进入 `needs-reconciliation`,仅关闭当前节点进程且不得作为瞬态错误自动重放同一 request slot;其它节点进程继续运行。明确 `failed / interrupted` 是确定失败,不做 transport retry。
- 执行模式与 Provider 配置指纹必须来自同一次配置快照;不能先捕获 executor、再重新读取 `agentMode` 生成 durable identity。Runner 正常/强制/watchdog 退出都会显式关闭池;Linux 子进程额外设置 parent-death signalRunner 被 SIGKILL 时也不能遗留持有凭据的 app-server。
- 每个 turn 输入仍是 AGC 构建的完整权威消息快照,因此复用 thread 会累计完整轮次历史;这只影响进程内推理上下文和 token,不改变 AGC durable owner。后续若改为增量消息协议,必须另行版本化 request fingerprint 与恢复合同,不能静默改变本模式输入语义。
### 验收
- fake app-server 覆盖 initialize、thread/start、turn/start、structured output、delta、turn-start 回包前取消、凭据只进专用环境变量、隔离 OS HOME、原生能力关闭和跨配置/CLI 版本 pool 隔离;定向测试覆盖三态默认/round-trip、unknown terminal reconciliation 与旧 `codex_cli/provider` 回归。真实模型 smoke 为 ignored/显式 opt-in,避免自动消耗用户 Provider。
## V1.53 Supervisor 运行中非终态回复与 LLM 条件中断
V1.53 把根 Project Supervisor 的 same-run steer 从“收到消息立即中断”改为“先回复并判断、按需中断”。用户消息仍先进入原 run 的 durable steer ledger 与 conversation;公开确认明确说明正在判断且当前任务继续运行。随后由独立 LLM turn 调用严格 `runtime_steer_decision`,一次返回自然语言 `reply``interruptCurrentProvider` 与安全原因。该回复按 steer 身份持久幂等,是制作过程中的非终态对话,不调用 `respond_to_user`,也不关闭 task、Goal、Run 或 finalization。
- 命令层在 durable 入队后不得先通知或唤醒 External Runner,避免 Runner 抢先消费 steer 后让判定快照漂移。判定为 `false` 或判定失败时,才发送只校验 ledger 并唤醒任务的 `runtime.steer`;该 RPC 必须固定返回 `providerInterrupted=false`。判定为 `true` 时直接发送 `runtime.interrupt_for_steer_decision`,由该 RPC 完成条件中断并唤醒同一 run。本地进程内路径遵循同一顺序。
- 状态询问、解释、鼓励、确认和不冲突补充默认不中断;只有明确停止、改向,或继续当前方案会产生明显过期结果时才允许 `true`。判定使用当前有效 `provider / codex_cli / codex_app_server` 模式;app-server 以独立 synthetic 节点运行,不能等待主节点的 turn gate。
- 条件中断必须先读取已持久化 decision,并只允许中断注册时 `appliedSteerCursor < steer.sequence` 的旧 planning/final-reply Provider。若旧请求已自然结束,或新 Provider 已消费该 steer 后启动,则返回 `providerInterrupted=false`,不得误杀新规划。工具、外部副作用、确认、process session、Git、receipt 和 finalization 始终不强杀,在下一安全边界消费 steer。
- LLM 判定、解析或持久化失败时写入关联的非终态 fallback 回复,保持当前任务运行,并在下一安全边界应用已排队 steer;失败不能退回“默认中断”。判定与回复按 `agentId / runId / steerId` 幂等,冲突终态失败关闭。
- 验收必须覆盖判定 LLM 的 `true / false` 协议、公开回复幂等、入队本身不中断、`runtime.steer` 有活动 Provider 时仍不中断、缺失 decision 拒绝条件中断、`false` decision 不中断、`true` decision 只中断旧 cursor,以及判定失败后同一 run 继续。
## 验收命令
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml structured_plan_ -- --nocapture`
File diff suppressed because one or more lines are too long