版本: 2.0 (包含 V2.1 诊断特性与 V2.2 上下文压缩算法) 核心定位: 面向公网的高安全只读看板 + 大模型思维链 (CoT) 可视化引擎 + 基于图遍历的动态上下文管理器。
系统严格按职责分为四层微服务架构:
text
openclaw-task-board/
├── backend/ # 后端服务 (Node.js 原生,无重型框架)
│ ├── server.js # HTTP 与 API 入口
│ ├── auth.js # Admin Token 鉴权中间件
│ ├── sse.js # Server-Sent Events (SSE) 推送引擎
│ └── data/
│ ├── repository.js # 任务树 CRUD 与持久化 (tasks.json)
│ └── tree-pruner.js # 焦点树修剪算法 (上下文压缩引擎)
├── frontend/ # 公网静态只读前端
│ ├── index.html # 包含画布与诊断侧边栏
│ ├── js/
│ │ ├── app.js # 状态机与 SSE 监听
│ │ ├── layout-engine.js # Thought-Chain DAG 布局计算
│ │ └── renderer.js # SVG 渲染、节点交互与动画 (滤镜)
│ └── css/styles.css # 低饱和粉色主题与发光动画
├── sync-hook/ # OpenClaw 插件层
│ ├── handler.js # 生命周期事件监听
│ ├── cot-parser.js # XML 标签解析 (<plan>, <think>, <action>)
│ └── tools/
│ └── get_task_details.js # 给大模型注册的主动召回工具
└── docs/ # 架构与 API 契约
在系统间流转的最小数据单元,扩展了语义类型与大模型诊断信息。
`json { "id": "task-1708781234-abc", "conversationId": "sess-xyz789", "parentId": "task-1708781000-root", "nodeType": "thought", // 枚举: prompt | sub-goal | thought | action | observation | conclusion "name": "评估系统状态并决定下一步", "status": "in-progress", // 枚举: pending | in-progress | completed | bug "content": "具体的思考内容或执行细节...", "timestamps": {
"created": "2026-02-24T08:00:00Z",
"started": "2026-02-24T08:00:01Z",
"completed": null
}, "llmDiagnostics": {
"rawInputLength": 4500, // 字符级长度记录
"tokenUsage": {
"promptTokens": 1542,
"completionTokens": 500,
"totalTokens": 2042
},
"stopReason": "length", // stop | length | load
"latencyMs": 14500
} } `
GET /api/public/conversations 与 GET /api/public/tasks/:conversationId。仅响应 JSON,无鉴权,但需配置 CORS 与限流。POST/PUT/DELETE /api/admin/tasks。用于 sync-hook 推送节点变更,Header 必须校验 Authorization: Bearer <TOKEN>。GET /api/public/stream/:conversationId。建立单向长连接,当 Admin API 触发数据变更时,向对应会话的订阅者广播增量 JSON。conclusion 节点 (DAG 渲染)。in-progress: 保留旋转虚线,叠加脉冲发光 (feGaussianBlur)。bug (如 stopReason === 'length'): 节点外发红光,并在 UI 提供 Debug 详情面板。严格控制传递给大模型的上下文长度,限制条件为: $N{total}=N{prompt}+N{predict}\le N{ctx}$
利用 tree-pruner.js 实现基于当前焦点节点的 $O(N)$ 复杂度修剪算法:
[状态] 标题。输出形式: 精简版 Markdown 文本,由 sync-hook 在每次请求前动态拉取,并作为 System Prompt 注入。
为应对修剪算法可能导致的深层历史细节丢失,必须向 Ollama 注册 Function Calling:
get_task_detailstaskIdbackend 获取该节点的完整 JSON(含 notes, bugDetails),作为 observation 节点返回给大模型。tree-pruner.js 实现焦点树修剪算法。sync-hook 中实现 XML 标签解析 (<plan>, <think>, <action>),并将数据映射到 Admin API。get_task_details 工具。llmDiagnostics 数据的调试侧边栏。