feat: cut over rust web main shell

This commit is contained in:
lix-2026
2026-04-29 12:24:44 +08:00
parent 7965c6c107
commit 048fe28a4d
97 changed files with 9396 additions and 1263 deletions
+367 -2
View File
@@ -663,10 +663,359 @@
}
],
"completed_at": "2026-04-28T07:44:37Z"
},
{
"id": "task-019",
"title": "Phase W-0:冻结 Rust Web 主执行面 owner manifest 与负向门禁",
"status": "completed",
"priority": "P0",
"depends_on": [],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"wolai-frontend/src/lib/rust-web-main-execution-boundary.ts",
"wolai-frontend/src/lib/rust-web-main-execution-boundary.test.ts",
"ARCHITECTURE.md",
"design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md"
],
"acceptance": [
"新增 RUST_WEB_MAIN_EXECUTION_BOUNDARY,固定 publicEntry=3000、mainWebOwner=mnote-web、legacyCompatOwner=next-app-router",
"测试禁止把 Next App Router 写回主 Web owner",
"ARCHITECTURE.md 明确树域完成不等于主 Web 执行面完成"
],
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/rust-web-main-execution-boundary.test.ts src/lib/runtime-config.test.ts && cd /mnt/Data1T/mnote && git diff --check -- ARCHITECTURE.md design/03-rust-web wolai-frontend/src/lib",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增 Rust Web 主执行面 owner manifest 与负向门禁,并更新 ARCHITECTURE.md / 3-6 checklist 口径。",
"timestamp": "2026-04-28T09:07:58Z"
}
],
"completed_at": "2026-04-28T09:07:58Z"
},
{
"id": "task-020",
"title": "Phase W-1:让 mnote-web 默认成为 3000 gateway owner",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-019"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"rust/crates/mnote-web/src/app.rs",
"rust/crates/mnote-web/src/routes/mod.rs",
"rust/crates/mnote-web/src/routes/gateway.rs",
"scripts/desktop-hot.js",
"scripts/desktop-hot.test.js",
"scripts/task114-rust-web-gateway-entry-smoke.js"
],
"acceptance": [
"mnote-web 支持 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3000 并作为默认 3000 owner",
"Next dev 默认改为 legacy upstream port,不再拥有 3000",
"task114 smoke 证明 3000 响应来自 Rust gateway 且 3104 不作为公开入口"
],
"validation": {
"command": "node --test /mnt/Data1T/mnote/scripts/desktop-hot.test.js && cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web gateway && cd /mnt/Data1T/mnote && node scripts/task114-rust-web-gateway-entry-smoke.js",
"timeout_seconds": 3600
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增 mnote-web gateway route/owner header、desktop-hot Rust gateway 默认启动计划与 task114 smoke。",
"timestamp": "2026-04-28T09:13:44Z"
}
],
"completed_at": "2026-04-28T09:13:44Z"
},
{
"id": "task-021",
"title": "Phase W-2:把 runtime config 与 auth/session handoff 迁到 Rust Web",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-020"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"rust/crates/mnote-web/src/routes/session.rs",
"rust/crates/mnote-web/src/routes/mod.rs",
"wolai-frontend/src/lib/runtime-config.ts",
"wolai-frontend/src/lib/runtime-config.test.ts",
"wolai-frontend/src/app/api/auth/mnote-web-token/route.ts"
],
"acceptance": [
"mnote-web 输出 /api/runtime/config、/api/auth/session 与 session refresh/handoff route",
"浏览器 runtime config 不泄漏 internal MNOTE_WEB_* base URL",
"Next /api/auth/mnote-web-token 降级为 compat/debug"
],
"validation": {
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web session && cargo test -p mnote-web runtime_config && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/runtime-config.test.ts src/app/api/auth/mnote-web-token/route.test.ts",
"timeout_seconds": 3000
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增 mnote-web runtime config/session/refresh routes,并将 Next mnote-web-token route 标记为 compat/debug。",
"timestamp": "2026-04-28T09:16:28Z"
}
],
"completed_at": "2026-04-28T09:16:28Z"
},
{
"id": "task-022",
"title": "Phase W-3:建立 Rust-owned 文档页 / Page Aggregate server-first shell",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-021"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"rust/crates/mnote-web/src/routes/web_shell.rs",
"rust/crates/mnote-web/src/routes/documents.rs",
"rust/crates/mnote-web/src/routes/mod.rs",
"wolai-frontend/src/components/editor/document-shell.tsx",
"wolai-frontend/src/components/editor/document-content.tsx",
"scripts/task115-rust-web-document-shell-smoke.js"
],
"acceptance": [
"mnote-web 输出 /documents/:id server-first shell 与 page aggregate snapshot",
"Next 文档页降级为 legacy compat",
"task115 smoke 证明默认文档页由 Rust shell 服务且不挂载 mnote-web-document-shell iframe"
],
"validation": {
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web document_shell && cargo test -p mnote-web page_aggregate && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/document-content.test.ts src/lib/documents/page-aggregate-builder.test.ts && cd /mnt/Data1T/mnote && node scripts/task115-rust-web-document-shell-smoke.js",
"timeout_seconds": 3600
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增 mnote-web /documents/:id shell 与 /api/page-aggregate/:id snapshot contract,并补 task115 smoke。",
"timestamp": "2026-04-28T09:20:22Z"
}
],
"completed_at": "2026-04-28T09:20:22Z"
},
{
"id": "task-023",
"title": "Phase W-4:把主 API transport 从 Next route 收薄为 Rust Web owned",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-022"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"rust/crates/mnote-web/src/routes/documents.rs",
"rust/crates/mnote-web/src/routes/tree.rs",
"rust/crates/mnote-web/src/routes/search.rs",
"wolai-frontend/src/lib/tree-route-boundary.ts",
"wolai-frontend/src/app/api/documents/route-adapters.test.ts",
"wolai-frontend/src/lib/search/request.test.ts"
],
"acceptance": [
"Rust Web owner 覆盖 documents meta/content/save、tree commands/projections 与 search documents transport",
"Next route 只保留 cookie/header 透传和 legacy compat",
"TREE_3000_ROUTE_BOUNDARY_MANIFEST owner 口径改为 rust-web-gateway"
],
"validation": {
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web documents_api && cargo test -p mnote-web tree_commands && cargo test -p mnote-web search && cargo test -p bridge-runtime page_aggregate && cargo test -p bridge-runtime tree_subtree_move_command && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/lib/tree-route-boundary.test.ts src/app/api/documents/route-adapters.test.ts src/lib/search/request.test.ts",
"timeout_seconds": 3600
},
"on_failure": {
"cleanup": null
},
"error_log": [
"[CONFIG] 原验证中的 cargo test -p bridge-runtime page_aggregate 过滤词当前命中 0 项;本任务实际覆盖 documents_api/tree_commands/search 与 route boundary。"
],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已补 Rust Web search.documents transport、documents owner headers 与 TREE_3000_ROUTE_BOUNDARY rust-web-gateway owner 口径。",
"timestamp": "2026-04-28T09:26:14Z"
}
],
"completed_at": "2026-04-28T09:26:14Z"
},
{
"id": "task-024",
"title": "Phase W-5:把 tree realtime stream 固定为 Rust Web 主链",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-023"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"rust/crates/mnote-web/src/routes/sse.rs",
"rust/crates/mnote-web/src/routes/stream_support.rs",
"wolai-frontend/src/app/api/mnote-web/stream/route.ts",
"wolai-frontend/src/lib/tree-stream/protocol.ts",
"wolai-frontend/src/lib/tree-stream/tree-stream.test.ts",
"wolai-frontend/src/lib/tree-stream/use-sidebar-tree-stream.test.tsx"
],
"acceptance": [
"Rust Web 输出正式 /api/tree/events snapshot + delta stream",
"/api/mnote-web/stream 降级为 compat alias",
"Sidebar / page tree / file tree consumer 使用 Rust-owned stream"
],
"validation": {
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web tree_realtime && cargo test -p mnote-web stream && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/app/api/mnote-web/stream/route.test.ts src/lib/tree-stream/tree-stream.test.ts src/lib/tree-stream/use-sidebar-tree-stream.test.tsx && cd /mnt/Data1T/mnote && node scripts/task112-tree-rust-family-regression-smoke.js",
"timeout_seconds": 4200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "Rust Web /api/tree/events 已固定为 tree realtime stream 主链,输出 rust-web owner、snapshot/delta streamNext /api/mnote-web/stream 保留 compat aliasconsumer URL 指向 /api/tree/events。task112 针对 legacy Chromium renderer crash 仅做一次新 context 恢复。",
"timestamp": "2026-04-28T12:33:41Z"
}
],
"completed_at": "2026-04-28T12:33:41Z"
},
{
"id": "task-025",
"title": "Phase W-6:把 Search / AI / Mindmap 页面壳迁到 Rust Web shell + islands",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-024"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"rust/crates/mnote-web/src/routes/search.rs",
"rust/crates/mnote-web/src/routes/mindmap_shell.rs",
"rust/crates/mnote-web/src/routes/hermes.rs",
"wolai-frontend/src/components/search/SearchPaletteHost.tsx",
"wolai-frontend/src/components/editor/DocumentAiAgentPanel.runtime.tsx",
"wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/page.tsx",
"scripts/task116-rust-web-islands-smoke.js"
],
"acceptance": [
"Rust Web 输出 Search server-first shell",
"Rust Web / Hermes 拥有 AI bridge session、tool event、client action contract",
"Rust Web 输出 Mindmap object shellReact runtime 只作为 island 或 legacy compat"
],
"validation": {
"command": "cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web search_shell && cargo test -p mnote-web ai_bridge && cargo test -p mnote-web mindmap_shell && cd /mnt/Data1T/mnote/wolai-frontend && pnpm vitest run src/components/editor/DocumentAiAgentPanel.runtime.test.tsx src/lib/ai-agent/runtime/runAgent.test.ts src/lib/search/request.test.ts && cd /mnt/Data1T/mnote && node scripts/task116-rust-web-islands-smoke.js",
"timeout_seconds": 4200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "Search server-first shell、Hermes AI bridge owner contract、Mindmap object shell 已落到 Rust WebReact runtime 标记为 island/legacy compattask116 smoke 证明三类 owner 已迁移。",
"timestamp": "2026-04-28T12:44:04Z"
}
],
"completed_at": "2026-04-28T12:44:04Z"
},
{
"id": "task-026",
"title": "Phase W-7:退役 Next App Router 主入口并完成 03-rust-web 文档收口",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-025"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "9f6a2c86",
"source_doc": "design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"scope": [
"ARCHITECTURE.md",
"design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md",
"design/03-rust-web/done/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"design/03-rust-web/done/3-6-rust-web-main-execution-plane-checklist-v1.md",
"scripts/task117-next-retirement-guard.js"
],
"acceptance": [
"task117 证明 SKIP_NEXT_LEGACY=1 时核心 smoke 仍可通过",
"默认启动链不再把 pnpm dev 作为 3000 owner3104 不恢复为公开入口",
"ARCHITECTURE.md 与 3-1 同步 Next App Router legacy compat 口径,本 plan/checklist 移入 done"
],
"validation": {
"command": "cd /mnt/Data1T/mnote && node scripts/task097-homepage-entry-smoke.js && node scripts/task114-rust-web-gateway-entry-smoke.js && node scripts/task115-rust-web-document-shell-smoke.js && node scripts/task116-rust-web-islands-smoke.js && node scripts/task117-next-retirement-guard.js && git diff --check -- ARCHITECTURE.md design/03-rust-web scripts wolai-frontend rust/crates/mnote-web",
"timeout_seconds": 4800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "task117 已证明 SKIP_NEXT_LEGACY=1 时核心 shell 不依赖 Next legacydesktop-hot 支持跳过 Next legacyARCHITECTURE/3-1 已同步 Next App Router legacy compat 口径,3-5/3-6 已移入 done。",
"timestamp": "2026-04-28T12:50:07Z"
}
],
"completed_at": "2026-04-28T12:50:07Z"
}
],
"session_count": 8,
"last_session": "2026-04-28T07:44:37Z",
"session_count": 10,
"last_session": "2026-04-28T12:50:07Z",
"final_renderer_gate": {
"source_doc": "design/04-tree-domain/process/4-18-tree-final-dom-shell-cutover-hard-gate-v1.md",
"status": "completed",
@@ -682,5 +1031,21 @@
"task-017",
"task-018"
]
},
"main_web_execution_plane": {
"source_doc": "design/03-rust-web/process/3-6-rust-web-main-execution-plane-checklist-v1.md",
"plan_doc": "design/03-rust-web/process/3-5-rust-web-main-execution-plane-cutover-plan-v1.md",
"status": "planned",
"tasks": [
"task-019",
"task-020",
"task-021",
"task-022",
"task-023",
"task-024",
"task-025",
"task-026"
],
"note": "树域 Rust family 默认执行面已完成;主 Web 执行面仍需通过 task-019 至 task-026 迁到 mnote-web / Rust family。"
}
}