完成 Editor Agent P2 持久任务与运行时收口
新增 Web Project runtime job、持久日志、lease、取消、expired、stale 和 active preview guard 状态机 接入 api-server Web Project runtime worker 与 TempDirBuildRuntime 构建执行链路 补齐 SpacetimeDB procedure、spacetime-client facade、shared contracts 和前端 web-project client 契约 更新 /editor/agent 的 runtime job 恢复、日志回填、SSE 重连、取消按钮和 active preview 刷新恢复 新增 P2 dev smoke 脚本,并让完整 npm run dev 默认以 all 角色启动 P2 worker 补充 P2 自动化测试、浏览器 smoke 验收记录、开发运维文档和 Hermes 踩坑记忆
This commit is contained in:
@@ -2253,3 +2253,60 @@
|
||||
- 决策:P2 不直接跳到长驻 Docker 工作区或 Shell,而是先新增 `web_project_runtime_job`、worker / lease / controller、日志分页和 SSE 重连,再抽象 `SandboxRuntime`。第一版 SandboxRuntime 可继续复用当前 temp-dir runner,Docker / gVisor / Kata / microVM 作为后续执行面实现;snapshot 仍是唯一事实源,sandbox diff 必须转为 `WebProjectPatch` 并经过 api-server 校验后落库。
|
||||
- 影响范围:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`docs/technical/【技术方案】浏览器内AIWeb工程沙箱预览方案-2026-06-13.md`、`docs/technical/【技术方案】EditorAgentMockAgentP1落地计划-2026-06-15.md`、Web Project runtime job 后续实现。
|
||||
- 验证方式:P2 落地时需覆盖 runtime job 状态机、worker claim / renew / complete / fail、failed / cancelled / expired / stale 不覆盖 active preview、日志分页 / SSE 重连、真实浏览器 happy path 和破坏构建保留上一版预览。
|
||||
|
||||
## 2026-06-17 Editor Agent P2 runtime job API 只能经 spacetime-client facade
|
||||
|
||||
- 背景:P2-03 开始把 `web_project_runtime_job` 暴露给 api-server 和前端恢复链路;如果 api-server 直接拼 generated procedure 或下发 worker lease,会让后续 P2-04 / P2-05 的 worker 边界变脆。
|
||||
- 决策:Web Project runtime job 的 `create / get / list open / claim / renew / complete / fail / cancel / stale / expire / append log / list logs` 统一封装在 `server-rs/crates/spacetime-client/src/web_project.rs` facade。api-server HTTP 只暴露创建、读取、取消、未终态列表和日志分页;HTTP DTO 不下发 worker `lease_token`。P2-04 起 `POST /api/runtime/web-project/projects/{projectId}/preview-builds` 只创建 preview build 并入队 `web_project_runtime_job(kind=preview_build)`,不再在请求内抢占 preview build slot、启动 runner 或提前推进 `active_preview_build_id`。
|
||||
- 影响范围:`server-rs/crates/spacetime-client/src/web_project.rs`、`server-rs/crates/spacetime-client/src/mapper/web_project.rs`、`server-rs/crates/api-server/src/web_project.rs`、`shared-contracts`、`packages/shared`、P2 后续 worker / preview build 迁移。
|
||||
- 验证方式:`cargo test -p spacetime-client web_project --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server web_project_runtime_job --manifest-path server-rs/Cargo.toml`、`cargo check -p api-server --manifest-path server-rs/Cargo.toml`、`npm run test -- src/services/web-project --reporter verbose`、`npm run test -- src/components/editor/agent/WebProjectAgentEditorPage.test.tsx --reporter verbose`、`npm run typecheck`、`npm run check:spacetime-schema`。
|
||||
- 关联文档:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||
|
||||
## 2026-06-17 Editor Agent P2 Runtime Worker 默认不伪造预览成功
|
||||
|
||||
- 背景:P2-05 需要先落地 Web Project runtime worker 的 claim / lease / log / complete / fail 骨架,但真实 SandboxRuntime 与 runner 写回将在 P2-06 接入;如果骨架阶段把 preview build 标成 succeeded,会让前端拿到没有 artifact / preview URL 的假成功。
|
||||
- 决策:新增 `GENARRATIVE_PROCESS_ROLE=web-project-runtime-worker`,并支持 `GENARRATIVE_PROCESS_ROLE=all` 与 HTTP 同进程并行启动。P2-05 worker 默认 `GENARRATIVE_WEB_PROJECT_RUNTIME_WORKER_DRY_RUN_RESULT=fail`,只验证领取、日志、续租和失败闭环;显式 `success` 只允许无 preview build 绑定的 runtime job 完成。preview build 绑定任务的 dry-run 失败会先通过 runtime job lease fail,再 best-effort 将 linked `web_project_preview_build` 标记 failed 并广播 SSE;该两步不是同一 SpacetimeDB transaction,后续若要强一致需补组合 procedure。
|
||||
- 影响范围:`server-rs/crates/api-server/src/web_project_runtime_worker.rs`、`server-rs/crates/api-server/src/main.rs`、`server-rs/crates/api-server/src/config.rs`、`server-rs/crates/api-server/src/web_project.rs`、P2-06 SandboxRuntime 接入。
|
||||
- 验证方式:`cargo test -p api-server web_project_runtime_worker --manifest-path server-rs/Cargo.toml`、`cargo check -p api-server --manifest-path server-rs/Cargo.toml`、`npm run check:encoding`。
|
||||
- 关联文档:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||
|
||||
## 2026-06-17 Editor Agent P2 TempDirBuildRuntime 先接入 worker
|
||||
|
||||
- 背景:P2-06 要把 P1 `web-project-runner` 从请求内后台任务迁到持久 runtime worker,同时为后续 Docker / gVisor / microVM 执行面留出 `SandboxRuntime` 抽象。
|
||||
- 决策:在 `api-server` 内新增 `web_project_preview_runtime`,定义第一版 `SandboxRuntime` trait 与 `TempDirBuildRuntime`,当前实现继续以受控子进程调用 `web-project-runner`,不直接开放 Shell,也不把 runner 改成 in-process 构建。worker 对 linked preview build job 追加 hydrate / build / artifact / preview 阶段日志,runner 成功后先 `complete_web_project_runtime_job` 复用 active snapshot stale 校验,再 best-effort 写 `web_project_preview_build=succeeded` 和 preview token / URL;runner 失败只失败当前 runtime job 和 linked preview build,不生成新 preview。
|
||||
- 一致性备注:runtime job 与 preview build 仍是两次 SpacetimeDB procedure,worker 在 runner 结束后先做最终续租再写终态,降低 lease 过期造成的部分写回风险;彻底单事务完成、失败和 stale 组合 procedure 或 reconcile 仍归入 P2-07 Active Preview Guard / Stale 收口。
|
||||
- 影响范围:`server-rs/crates/api-server/src/web_project_preview_runtime.rs`、`server-rs/crates/api-server/src/web_project_runtime_worker.rs`、`server-rs/crates/api-server/src/web_project.rs`、`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||
- 验证方式:`cargo test -p web-project-runner --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server web_project_runtime_worker --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server web_project --manifest-path server-rs/Cargo.toml`、`npm run check:encoding`。
|
||||
- 关联文档:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||
|
||||
## 2026-06-17 Editor Agent P2 active preview 推进必须单事务完成
|
||||
|
||||
- 背景:P2-06 成功路径先完成 runtime job,再 best-effort 写 preview build succeeded;如果旧 snapshot job 在新 snapshot 成为 active 后才完成,或两次写回中间失败,可能留下 job/build 状态不一致或错误推进 preview 的风险。
|
||||
- 决策:P2-07 新增 `complete_web_project_preview_build_runtime_job_and_return` 组合 procedure。runner 成功后,worker 只生成 artifact / preview token / preview URL / logs 的 finish plan,再通过 `spacetime-client` facade 调用该 procedure;SpacetimeDB 在同一 transaction 内校验 worker lease、preview build 绑定和 `job.snapshot_id == web_project.active_snapshot_id`,然后同时写 runtime job、preview build 与 `active_preview_build_id`。若 snapshot 已 stale,即使 runner 成功也只把 runtime job 和 preview build 标为 `stale`,不生成 preview URL、不覆盖 active preview。
|
||||
- 影响范围:`server-rs/crates/spacetime-module/src/web_project.rs`、`server-rs/crates/spacetime-client/src/web_project.rs`、`server-rs/crates/spacetime-client/src/mapper/web_project.rs`、`server-rs/crates/api-server/src/web_project_runtime_worker.rs`、`server-rs/crates/api-server/src/web_project_preview_runtime.rs`、前端 stale 展示测试和 P2 文档。
|
||||
- 验证方式:`npm run spacetime:generate`、`cargo check -p spacetime-module --target wasm32-unknown-unknown --manifest-path server-rs/Cargo.toml`、`cargo test -p spacetime-client web_project --manifest-path server-rs/Cargo.toml`、`cargo test -p api-server web_project_runtime_worker --manifest-path server-rs/Cargo.toml`、`npm run test -- src/services/web-project/webProjectSse.test.ts src/components/editor/agent/WebProjectAgentEditorPage.test.tsx --reporter verbose`、`npm run check:spacetime-schema`。
|
||||
- 关联文档:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。
|
||||
|
||||
## 2026-06-17 Editor Agent P2 允许原生纯逻辑单测使用 SpacetimeDB ABI 桩
|
||||
|
||||
- 背景:`spacetime-module` 的 `runtime_job` 用例只验证 lease token、claimable、terminal status、stale 清理和失败结果结构等纯 Rust helper;但 Windows native `cargo test` 会链接整个 crate,`spacetimedb-bindings-sys` 的 WASM 宿主 ABI 符号(如 `procedure_start_mut_tx`、`datastore_insert_bsatn`、`console_log`)没有原生宿主提供,导致测试体执行前就 `LNK2019` / `LNK1120`。
|
||||
- 决策:在 `server-rs/crates/spacetime-module/src/test_stubs.rs` 中用 `#[cfg(all(test, not(target_arch = "wasm32")))]` 提供 25 个 test-only ABI 桩,只满足原生测试链接;`console_log` 静默 no-op,其余桩只用于暴露误调用。该桩不进入 WASM 构建,也不允许把 native 单测误当成 SpacetimeDB runtime 行为测试。
|
||||
- 影响范围:`server-rs/crates/spacetime-module/src/lib.rs`、`server-rs/crates/spacetime-module/src/test_stubs.rs`、P2 计划文档和 `.hermes/shared-memory/pitfalls.md`。
|
||||
- 验证方式:`cargo test -p spacetime-module runtime_job --manifest-path server-rs/Cargo.toml` 通过 6 个纯逻辑用例;`cargo check -p spacetime-module --target wasm32-unknown-unknown --manifest-path server-rs/Cargo.toml` 通过。
|
||||
- 关联文档:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`、`.hermes/shared-memory/pitfalls.md`。
|
||||
|
||||
## 2026-06-17 Editor Agent P2 runtime job 取消优先于 worker 结果
|
||||
|
||||
- 背景:P2-08 开始支持用户取消 queued / running Web Project runtime job;如果 worker 已经跑到 runner 末尾,仍可能在用户取消后继续 complete / fail,并生成 preview URL 或把 linked preview build 写成 failed。
|
||||
- 决策:取消请求是 runtime job 终态写回的最高优先级。`spacetime-module` 的 `complete_web_project_runtime_job`、`fail_web_project_runtime_job` 和 `complete_web_project_preview_build_runtime_job` 都必须在同一 transaction 内先检查 `cancel_requested_at`,命中后写 `cancelled`、清理 worker lease、禁止生成 artifact preview token / URL、禁止推进 `active_preview_build_id`。Queued cancel 由 HTTP cancel handler 同步把 linked preview build 写成 `cancelled`;running cancel 由 worker heartbeat / 最终续租检测后收敛,当前 TempDir runner 暂不承诺强杀子进程。
|
||||
- 影响范围:`server-rs/crates/spacetime-module/src/web_project.rs`、`server-rs/crates/api-server/src/web_project_runtime_worker.rs`、`server-rs/crates/api-server/src/web_project_preview_runtime.rs`、`server-rs/crates/api-server/src/web_project.rs`、`src/services/web-project/webProjectClient.ts`、`src/components/editor/agent/WebProjectAgentEditorPage.tsx`。
|
||||
- 验证方式:`cargo check -p api-server --manifest-path server-rs/Cargo.toml`、`cargo test -p spacetime-module runtime_job --manifest-path server-rs/Cargo.toml`、`npm run test -- src/services/web-project src/components/editor/agent --reporter verbose`、`npm run typecheck`。
|
||||
- 关联文档:`docs/planning/【开发计划】EditorAgentP2持久任务与SandboxRuntime计划-2026-06-16.md`。
|
||||
|
||||
## 2026-06-17 Editor Agent P3 先采用远程同容器 Agent MVP
|
||||
|
||||
- 背景:P2 完成后,`/editor/agent` 已具备 runtime job、worker / lease、日志恢复、取消 / stale 和 `SandboxRuntime` 抽象;为了加快真实 Agent 和远程 Container 落地,需要在不推翻 P1 / P2 控制面的前提下先跑通 MVP。
|
||||
- 决策:P2 后新增长期架构文档,明确真实 Agent、用户工作区、Agent 私有 shell、ShellPolicy / CommandGuard、ToolBridge、LLM Broker 与后续容器拆分边界。P3 采用 Remote Agent Server + Remote Container 执行面。第一版允许真实 Agent 与用户 workspace 位于同一个 Remote Container,Agent 可以使用完整 shell,但用户不开放 shell;所有 shell 命令必须经过 `ShellPolicy` / `CommandGuard` 接口,MVP 可先 `AllowAllShellPolicy`,后续再补正式 allowlist / denylist / 审批规则。Agent 调 LLM 通过 `LLM Broker`,Container 不持有长期 provider key。Container 内修改只能收集 diff 转 `WebProjectPatch`,由 api-server 校验后保存 snapshot;前端不直连 Container,preview 继续走 Preview Gateway + iframe sandbox。
|
||||
- 影响范围:`/editor/agent` P3 计划、Remote Agent Server、runtime job kind、ShellPolicy / ToolBridge / SandboxRuntime 抽象、LLM Broker、后续 Agent / Workspace 双容器拆分。
|
||||
- 验证方式:P3 MVP 必须覆盖真实 Agent 处理用户需求、Remote Container hydrate snapshot、Agent shell 经 ShellPolicy 审计、patch 校验落 snapshot、自动触发 preview build、刷新恢复 agent job / 日志 / active preview、失败不覆盖上一版 preview。
|
||||
- 关联文档:`docs/technical/【技术方案】EditorAgent远程Agent与工作区沙箱架构-2026-06-17.md`、`docs/planning/【开发计划】EditorAgentP3远程AgentContainerMVP计划-2026-06-17.md`、`docs/technical/【技术方案】浏览器内AIWeb工程沙箱预览方案-2026-06-13.md`。
|
||||
|
||||
Reference in New Issue
Block a user