@tea-agent/loop-agent 0.41.0 → 0.42.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -14
- package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
- package/dist/adapters/context-transfer/pi-session.js +61 -0
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +12 -0
- package/dist/cli/program.js +23 -1
- package/dist/commands/dag-artifact.js +284 -0
- package/dist/commands/dag-context.js +184 -0
- package/dist/commands/dag-rerun.js +206 -1
- package/dist/executors/dag-pi-executor.js +39 -12
- package/dist/executors/pi-sdk-executor.js +3 -0
- package/dist/{worker → infrastructure}/console/app-data.js +4 -0
- package/dist/infrastructure/console/artifact-revision-store.js +430 -0
- package/dist/infrastructure/console/context-export-store.js +160 -0
- package/dist/infrastructure/console/dir-lock.js +132 -0
- package/dist/{worker → infrastructure}/console/operation-store.js +28 -0
- package/dist/infrastructure/harness/artifact-store.js +10 -1
- package/dist/infrastructure/harness/atomic-write.js +12 -2
- package/dist/shared/context-transfer/artifact-revision.js +172 -0
- package/dist/shared/context-transfer.js +418 -0
- package/dist/shared/operator/capabilities.js +14 -0
- package/dist/shared/operator/safe-run-summary.js +1 -0
- package/dist/shared/path-safety.js +93 -0
- package/dist/shared/preview.js +28 -4
- package/dist/task/config-types.js +2 -1
- package/dist/task/task-demand-routing.js +3 -0
- package/dist/worker/console/chat/chat-event-store.js +2 -2
- package/dist/worker/console/chat/resource-preferences-store.js +1 -1
- package/dist/worker/console/chat/routes.js +1 -1
- package/dist/worker/console/chat/session-store.js +1 -1
- package/dist/worker/console/chat/user-questions.js +1 -1
- package/dist/worker/console/console-update-runtime.js +1 -1
- package/dist/worker/console/context-transfer-diagnostics.js +198 -0
- package/dist/worker/console/dag-confirmation.js +1 -1
- package/dist/worker/console/dag-execution-receipt.js +1 -1
- package/dist/worker/console/doctor.js +1 -1
- package/dist/worker/console/draft-store.js +1 -1
- package/dist/worker/console/human-gate-token.js +1 -1
- package/dist/worker/console/index.js +3 -3
- package/dist/worker/console/interview/assessment.js +1 -1
- package/dist/worker/console/interview/session.js +1 -1
- package/dist/worker/console/operation-runner.js +45 -4
- package/dist/worker/console/operation-sse.js +1 -1
- package/dist/worker/console/operation-wait.js +1 -1
- package/dist/worker/console/operator-actions.js +104 -3
- package/dist/worker/console/operator-surface-health.js +1 -1
- package/dist/worker/console/operator-user-error.js +169 -0
- package/dist/worker/console/pi-plugins.js +57 -0
- package/dist/worker/console/routes.js +637 -8
- package/dist/worker/console/security.js +35 -0
- package/dist/worker/console/server.js +6 -3
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-DwVJxUxz.js → abnfDiagram-N423BO3Z-DZZ8m3PO.js} +1 -1
- package/dist/worker/console/static/assets/{arc-DqfCcXdu.js → arc-D6PvaVd-.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-qMVtggRv.js → architectureDiagram-T3A2C74G-B_OTOiI8.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-ECrV38dh.js → blockDiagram-VBNYF7ZC-Bv6rqHBg.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DBaaLqQv.js → c4Diagram-5PPSVZJV-B8eHr0oz.js} +1 -1
- package/dist/worker/console/static/assets/channel-BU5gOilw.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-BvfNHkAz.js → chunk-2GRJ4B5K-DYwR0im2.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-C5StiIbc.js → chunk-2Q5K7J3B-D2WPGqXt.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-HabGiJkS.js → chunk-5RXB4S5H-CQISJ_I7.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BiTg127i.js → chunk-5VM5RSS4-C0o2Du1e.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-CZsXBPuR.js → chunk-6Q2QTUOP-4f8kr-U7.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-D-r1MxLK.js → chunk-GF5L2VYU-D_OWvXzX.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-DQxb9plr.js → chunk-JWPE2WC7-CasdPz5X.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DMndGvCT.js → chunk-KBJHAD2P-Cj8lRrla.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-ByL4BgOJ.js → chunk-RYQCIY6F-CUvD1FSd.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-BVe1b1gL.js → chunk-XXDRQBXY-CqLw_eqB.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DIzKJGHr.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DIzKJGHr.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BAyGzN8j.js → cose-bilkent-JH36ORCC-ku-WqJPx.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-C5yVYU7E.js → cynefin-VYW2F7L2-Bq_PYDhl.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-x-MwsEm9.js → cynefinDiagram-MW4NZA55-BiGZV641.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CT5Tle5F.js → dagre-VZM6K2ZE-C4JRlglF.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BARERhlS.js → diagram-7IWD3JNH-B0dNeWYG.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BwfUz0VM.js → diagram-B4RE2ZJO-Cj35YvYM.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-Mk4r2WvJ.js → diagram-LBJQPF4R-uzQoJ2-8.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-KUrxuBs0.js → diagram-Q27KOJAE-D1a-Buoz.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-CjZOceZn.js → diagram-UB23O5K3-XjRrLRSs.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-rnwUCiEI.js → ebnfDiagram-BXEA7PRR-Da_O24cW.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DM4j23FM.js → erDiagram-JOGREHBK-BLJ8jrYU.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DD5HdDEs.js → flowDiagram-UKHOOZJN-B9GrLjM0.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CIAGSF47.js → ganttDiagram-PKOTCBZU-CeJ0TqiK.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DbwFbVEL.js → gitGraphDiagram-DS77QQ5N-Bm2eNNFX.js} +1 -1
- package/dist/worker/console/static/assets/index-H9rFJiGL.css +1 -0
- package/dist/worker/console/static/assets/{index-Bih9w9h9.js → index-xwu9GxEc.js} +80 -80
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-B-Pb0T66.js → infoDiagram-6WML65LV-DB26i3d8.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-B9Unk-YX.js → ishikawaDiagram-WSZJBQD7-BOGRyeZT.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-C2F3JkPt.js → journeyDiagram-NVQOT4AX-CZRoBO_6.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-Bl8-Xcoz.js → kanban-definition-27J2QSJJ-qlWhJyoB.js} +1 -1
- package/dist/worker/console/static/assets/{linear-yK4uZmC5.js → linear-CfUiDDB3.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-Bpa6PmuE.js → mermaid.core-BQe6fpqj.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-BfGRoCSe.js → mindmap-definition-FAOFIHXS-zFzWHw64.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-Bz6_HtST.js → pegDiagram-VL7TDLO6-DFGUqjZO.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-i0Umbsby.js → pieDiagram-7S7Q4E2Y-BB5i0l8Z.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-DaVQBobe.js → quadrantDiagram-CIZ2JOQS-obbVZ_X5.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-DMTGnSq7.js → railroadDiagram-AXF67PYL-BwdaNzc1.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-2ao_DaSq.js → requirementDiagram-LRYGKXZP-CkTJaugh.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-2SG1lTB9.js → sankeyDiagram-W5VNT64P-BwJ-hIgq.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-BQYOLybR.js → sequenceDiagram-SI44F4Z6-BzSgmm7w.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-C8g3yjuI.js → sizeCapture-X5ZJPWSS-Bn3oj5Q1.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-q_F8nAQG.js → stateDiagram-OKZ733FA-dxhGtL8K.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Cld2qK9v.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-8LrWpH2s.js → swimlanes-SLNWSIFB-BLpEInya.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-TIHpiT7w.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-BQoY3qzl.js → timeline-definition-Z64GVDOM-ChJGYcXy.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BDu1UjSp.js → vennDiagram-T6HMQDX7-DK-qjRer.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-C48M7Y0a.js → wardleyDiagram-T6FBY63Y-3qeaWAg-.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-YU6FTl_F.js → xychartDiagram-ELKLHX3M-CootlyP9.js} +1 -1
- package/dist/worker/console/static/index.html +7 -2
- package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
- package/dist/worker/console/static-src/shell/console-update-reload.js +25 -0
- package/dist/worker/console/workspace-context.js +28 -2
- package/dist/worker/console/workspace-registry.js +2 -2
- package/dist/worker/continuation/worker-continuation.js +278 -0
- package/dist/worker/observe/health.js +1 -1
- package/dist/worker/observe/node-transparency.js +572 -0
- package/dist/worker/observe/routes.js +51 -1
- package/dist/worker/observe/static/api.js +69 -5
- package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
- package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
- package/dist/worker/observe/static/state.js +3 -1
- package/dist/worker/observe/static/styles.css +1037 -126
- package/dist/worker/observe/static/views/dag-inspector.js +1215 -58
- package/dist/worker/observe/static/views/session-timeline.js +75 -10
- package/dist/worker/outcomes/adapters.js +19 -0
- package/dist/worker/outcomes/types.js +1 -0
- package/dist/worker/pool/attempt-lease.js +97 -66
- package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
- package/dist/worker/pool/reconcile.js +46 -1
- package/dist/worker/pool/run-store.js +2 -0
- package/dist/worker/pool/state-projection.js +2 -0
- package/dist/worker/task-spec/workflow-routing.js +8 -3
- package/dist/workflows/dag/artifact-bindings.js +149 -0
- package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
- package/dist/workflows/dag/budget-enforcement.js +10 -0
- package/dist/workflows/dag/context-receipt.js +305 -0
- package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
- package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
- package/dist/workflows/dag/context-transfer/renderers.js +93 -0
- package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
- package/dist/workflows/dag/init-hybrid.js +146 -0
- package/dist/workflows/dag/node-execution.js +112 -27
- package/dist/workflows/dag/path-safety.js +1 -0
- package/dist/workflows/dag/prompt.js +29 -4
- package/dist/workflows/dag/rerun-plan.js +555 -1
- package/dist/workflows/dag/rerun-run.js +601 -15
- package/dist/workflows/dag/runner.js +20 -1
- package/dist/workflows/dag/skill-snapshot.js +17 -0
- package/dist/workflows/dag/types.js +183 -7
- package/docs/architecture/runtime-boundaries.md +6 -6
- package/docs/architecture/worker-and-feature.md +1 -1
- package/docs/templates/agent-dag.schema.json +32 -0
- package/docs/templates/product-line/task.yaml +1 -1
- package/package.json +3 -1
- package/skills/loop-agent/references/command-reference.md +6 -0
- package/dist/worker/console/static/assets/channel-CL1NRAmS.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-PBGzzjZA.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-PBGzzjZA.js +0 -1
- package/dist/worker/console/static/assets/index-BfleX-qj.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DrxGBDJu.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BhpDxzAf.js +0 -8
- /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,20 +2,108 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
5
|
+
- Console「Pi 插件」新增升级功能:进入页面自动检查已安装插件的可用更新(从 npm 配置的仓库拉取每个已装包的 latest,与本地实际版本做语义化比较),检测到新版本时该插件行展示「升级 v<新版本>」按钮,一键升级到目标版本;工具栏提供「检查更新」手动重查入口,摘要行显示「已安装 N 个 · M 个可升级」;单包拉取失败不影响其它插件的判定,检查结果在服务端缓存 60 秒避免频繁刷新打爆 registry。
|
|
6
|
+
- 修复 DAG 节点「执行过程」导出 HTML 在内网反代/子路径部署下整页样式丢失的问题:导出不再写死从主机根抓 /inspect/styles.css(反代下 404 后静默回退兜底样式,按钮与卡片样式全丢),改为直接复用页面实际加载的样式表地址(相对当前页面解析,任何部署形态都拿到同一份 CSS,多张样式表合并);导出文档 body 补 data-shell 属性让内联页面 CSS 的设计令牌与前缀规则原生命中;兜底样式补充最小按钮样式。
|
|
7
|
+
- 修复 DAG 检查器节点「执行过程」导出 HTML 在系统深色模式下黑底黑字不可读的问题:导出文档自带完整的 `:root` 颜色变量定义(页面样式变量挂在 `body[data-shell]` 选择器下、独立导出文档不生效)并强制 light 配色,深色系统打开导出文件正文对比度恢复正常(15.4:1)。
|
|
8
|
+
- 修复「Pi 插件」安装时内网 Nexus 拉 scoped 包(如 `@0xkobold/pi-ollama`)版本列表失败的问题:包名整段编码不再把 `%2F` 还原成字面 `/`,与 npm 客户端请求形式一致,npmjs.org 与内网 Nexus 均正常返回。
|
|
9
|
+
- 「Pi 插件」安装版本下拉增加加载过渡:内网拉取版本较慢时显示行内小转圈「正在获取版本…」并暂禁确认按钮;获取失败显示「版本获取失败,将安装最新」并可一键重试,不阻塞安装流程。
|
|
10
|
+
- backend-test 新增 `backendTest.executeTimeoutMs`,可为 readiness 授权的单次 pytest/HTML 执行节点配置 1 分钟至 2 小时的每命令超时;省略时仍为 5 分钟,不影响其他节点、DAG 外层 wall-clock 或 fail-closed 判定。
|
|
11
|
+
- 修复 Console 对话页「轨迹」视图刷新页面后工具行耗时全部变成 0ms/消失的问题:会话恢复投影现在会从持久化事件环回填每次工具调用的真实起止时间(tool_call 发起 → tool_result 返回),刷新/重开历史会话后 bash、write 等工具行继续显示真实耗时(如 20.0s、16ms);事件环已裁剪的旧记录不再显示误导性的「0ms」而是留空。
|
|
12
|
+
- 修复 Console 对话页「轨迹」视图窄窗口(≤720px)下工具行耗时列被整体隐藏的问题:工具名列本身可收缩省略,无需靠隐藏耗时信息防挤爆,任何窗口宽度都显示耗时。
|
|
13
|
+
- Console 对话页「轨迹」视图新增每轮遥测头行(对标 DSH「请求 #N」记录):从服务端持久化事件环按轮折叠出步骤数、LLM 时长、首 token 延迟、解码吞吐(tok/s)、工具调用数与耗时、上下行 token(含缓存读/写计入上行)与成本,切到历史会话立即显示;「导出 HTML」同步输出该行。
|
|
14
|
+
- Console 对话页「轨迹」视图「展开」按钮改为按实际溢出显隐:渲染后实测文本宽度并用 ResizeObserver 跟随容器尺寸,拉宽面板后能放下的行不再显示按钮,收窄时自动恢复;展开态恒显「收起」。
|
|
15
|
+
- Console 对话页「轨迹」视图「会话注入」区在服务端冷启动 Pi 会话期间(首次打开历史会话约 1 秒)显示加载占位行,不再空白后突然出现;注入读取失败也会显示错误提示。
|
|
16
|
+
- 修复 Console 对话页轨迹/工具目录数据在多工作区控制台恒为空的问题:capabilities 请求补带 `?workspaceId=`(会话所属工作区优先),工具目录与注入区正常显示 61 个模型可见工具。
|
|
17
|
+
- 修复轨迹遥测只在收到流式事件后才显示的问题:会话切换/激活与重连恢复两条 hydrate 路径现在都会带上按轮遥测数据。
|
|
18
|
+
- Console 对话页「轨迹」视图新增「会话注入」区(对标 DSH SYSTEM 记录):在轨迹顶部展示真实注入 Pi 会话的系统提示词全文(含字符数与注入上下文 suffix)与模型可见工具目录(工具 ID、动作、描述),均可展开/收起;「导出 HTML」同步包含该区块,离线导出也能审查完整注入面。
|
|
19
|
+
- 修复 Console 对话页「轨迹」视图工具行(如 bash)展开后参数与结果仍被截断在 420 字符的问题:展开现在显示完整内容(块内滚动收纳长输出),并复用聊天工具卡同款的结果解包与参数格式化,HTML 导出同步生效。
|
|
20
|
+
- 对话中的长时间 DAG 执行现在会保留一条实时状态:持续显示总运行时间、当前阶段、完成步数和最近一次有效进展;重复等待不再堆叠,点击状态可以直接查看对应 DAG。模型仍会在阶段变化、重要发现、失败恢复和结束时,用自然语言说明刚完成什么、下一步做什么。
|
|
21
|
+
|
|
22
|
+
### 重点更新
|
|
23
|
+
|
|
24
|
+
- Console「更新并初始化」体验修复:设置对话框内嵌实时进度(阶段说明 + 已用时 + 完成摘要,关闭重开对话框不丢进度);接棒重启改为等待新实例就绪后再刷新页面(不再白屏「页面没了」);接棒期间操作记录不再误报为失败(boot reconcile 识别已请求接棒的记录并闭合为成功);补齐更新链路错误码(版本回退/安装失败/运行占用/接棒失败等)的中文语义映射。
|
|
25
|
+
|
|
26
|
+
- Worker 只读分析 workflow:TaskSpec 新增 `execution.workflow: backend-test-analysis`,映射到专用 `backend-test-analysis-dag`,只执行 Backend Test Analysis v2 生成、严格 JSON 物化、独立只读复核与静态收尾。该路径不进入 writer、动态扩展或测试执行,并显式声明 `revisionPolicy: replace-file` artifact 及其 consumer,可作为安全 artifact continuation 的真实 Worker parent。
|
|
27
|
+
|
|
28
|
+
- 发布渠道:结束 M7/M8 dogfood 期间临时开放的 npm `beta` 发布例外;`checkPublishPolicy` 再次拒绝全部 `beta` / `rc` 等非 `next` prerelease,只保留 `main -> next` 与 `release/x.y -> release-x.y` 正式列车入口。已发布 beta 制品仅作为历史验证证据保留,不再允许新发。
|
|
29
|
+
|
|
30
|
+
- Worker-managed 产物派生继续(M7):Console 现在为 Worker-owned parent 生成 plan-hash-bound continuation authority,以 parent worker run + revision 确定性创建新的 child Worker/DAG、先占 Task Pool Running slot再调用 pinned sibling `loop-agent`,并在 spawn 前绑定 child run 供 interrupt 使用。成功 child 写入独立 `artifact-continuation` 审计 run/event、释放 lease,并保留原 parent Outcome/Delivery checkpoint;失败 fail closed。Console crash 发生在 terminal run record 写入前时,可由 immutable owner + child DAG lineage reconcile,已有 child 不会被第二请求覆盖或双启动。高风险 writer/dynamic/budget 扩展见下一条 M8。
|
|
31
|
+
|
|
32
|
+
- 高风险 Artifact Continuation(M8):`artifact-override` 现在可在 hash-bound authority 下继续 bounded exclusive Pi writer、重新物化 dynamic map/loop 子图并继承 hard-budget 累计 ledger;child staging 对 writeSet 建立 content snapshot,失败按 attempt inventory 做逐文件 CAS rollback,外部冲突绝不覆盖并以 `WRITER_ROLLBACK_BLOCKED` 留证。执行前二次 workspace freshness 位于 revision consume/writer 调用之前;dynamic writer template 缺 writeSet、越出 allowedPaths、非 Pi/docs-only、decision/evaluation/convergence 与非 canonical shell 继续 fail closed。普通 `dag rerun --from-node` 边界不变。`@tea-agent/loop-agent@0.41.0-beta.1` 发布版真实 frontend dogfood 进一步完成普通 writer continuation、hard-budget 累计继承、失败回滚与幂等重放收口。
|
|
33
|
+
|
|
34
|
+
- Console 报错语义化扫尾:DAG 检查器导出/修订/派生继续的失败状态行统一走「中文语义(原码);原始信息」修饰(新增 `describeTransferError`,覆盖 reason code、token 失效、控制器版本变更等运行时错误);Operator Chat/Operate 的操作错误映射补齐全部 context-transfer reason code。修复 Console 重启后浏览器缓存旧页面导致所有操作 403「invalid confirmation header token」的问题:Console HTML 响应现在带 `Cache-Control: no-store`,重启后刷新页面即可恢复。
|
|
35
|
+
|
|
36
|
+
- 产物修订/上下文导出七次评审收口:① Context Receipt 的 declared source 与上游产物一律是契约级 reference-only provenance(dispatch 只发 system+user message + 上游 read-tool 指针,源文档 prose 经 prompt assembly 嵌入 system-prompt,未真实 read 前不以 full/excerpt 冒充 effective context;路径经 task source/ 权威边界与逐段 symlink 拒绝解析,越界即拒)。Task Contract 组件携带 `sourceHashes` 物化,bundle 构建时以严格 schema 解析后用 `computeCanonicalHash` 独立验证 canonicalHash(不再只是「这个 JSON 没变」);综合 golden fixture 锁定确定性 digest。② 修订候选按声明 `schemaId` 做 registry 实际校验(7 个冻结结构化 id),未注册 id fail-closed 拒绝而非降级放行;staging 配额(每 repo 200 MiB,`ARTIFACT_REVISION_QUOTA_EXCEEDED`)以带 owner token 的 repo 级目录锁消除并发绕过(stale 原子 rename 接管;release 也原子 rename→校验 owner→命中才删/未命中恢复,旧持有者不能删新持有者的锁,跨进程竞争用真实子进程验证;孤儿 tombstone 由 reconcile 按 TTL 清扫);显式 staging lease(`LEASE_HELD`/滑续/过期接管)接入 CLI execute/discard 生产链,execute 的 `consumeRevision` 以同一 `cli-execute:<requestId>` holder 持锁。③ 直接 CLI 同 requestId 重放走持久化 operator request 幂等返回(envelope 严格 schema 校验,parent/planHash 不匹配返回 `REQUEST_ID_REUSE_CONFLICT`;revision 被 reconcile 删除后仍可重放——execute 路径 replay-first)。④ Inspector 阻断原因统一为表驱动中文 reason-code copy(未知 code 原样保留),预览头部展示 SHA-256,截断预览如实说明暂无完整文件下载。⑤ standalone continuation 纵向 E2E:真实 CLI stage → plan → execute 子进程(真实 runner 执行 child shell 闭包、revision 消费、幂等重放、reconcile 后重放、异 planHash 冲突、hardlink parent 拒绝)+ workflow 层五路径 + Console canonical operation 层 failed 投影证据;bundle 对 materializedPath 做逐段 symlink/hardlink/device/FIFO 拒绝;内置 DAG 生成的 structured artifact 默认 `revisionPolicy: replace-file`,普通 task advance 新 run 即具备可修订产物。⑥ 所有边界内读取改为 fd 级安全读取(预检、`O_NOFOLLOW|O_NONBLOCK`、打开后 inode/dev 对账及 realpath containment),receipt、bundle material、upload/candidate 均拒绝路径替换,避免 FIFO 阻塞与检查后重开路径的 TOCTOU;revision metadata 变更以跨进程目录锁串行,重试上传必须与既有 content-addressed 字节一致,Console 在同级 CLI 调度前完成 canonical admission,冲突请求不会遗留孤儿上传;CLI 每次 execute 使用独立 lease holder,避免并发同 requestId 互相续租。⑦ 活跃目录锁以 owner 文件心跳判断 stale;长时间正常持锁不会仅因目录 mtime 未变而被错误接管,reconcile 也按同一 freshness 规则处理 mutation locks。
|
|
37
|
+
|
|
38
|
+
- DAG Inspector 节点透明度与可移植上下文闭环:节点检查器统一为八个页签(含保留的「规范证据」只读页签),并用「执行设置」「实际上下文」「执行记录」「产出」「来源与影响」等操作者语言区分节点事实;新增 dispatch-time Context Receipt、产出关系,以及 generic、Pi session、可读记录、Pi handoff 四种 deterministic Context Bundle 导出。交接包工作台会在下载前预览用途、包含内容与保护级别;默认脱敏,raw 需显式风险确认。所有文本型 bundle 文件在写 manifest 前统一执行 credential 与本机 home 路径安全终检;raw 保留原字节但如实记录 warning/分类计数。Context Receipt/materials 使用 0600 文件与 0700 目录;Console staging 保存在 repo 外,启动时回收过期/半写入数据和 stale lease。产物修订候选若含 credential-like 内容会以 `SECRET_SCAN_CONFIRMATION_REQUIRED` fail closed,且 operation/CLI 不回显命中值。
|
|
39
|
+
- Frozen DAG spec 新增结构化 Artifact Binding(`producesArtifacts` / `consumesArtifacts`),全部内置模板同步声明 producer/consumer;consumer closure 只读 binding,不从 prompt、`outputContract` 或路径猜测。操作者可 stage 单个 ordinary declared artifact revision、查看 bounded diff/影响闭包与 hash-bound plan,再创建 parent 不可变的 child run,只重跑受影响消费者并记录 imported/overridden/supersedes lineage。Worker-managed、writer/dynamic/decision/unsafe-shell/budget 不安全链路继续 fail closed。
|
|
40
|
+
- Pi SDK 显式模型解析失败时不再静默退回会话默认模型;Context Receipt 中的 resolved model 与实际执行保持一致。Artifact consumer prompt 使用 frozen binding 注入 run-owned 精确路径,receipt 同时复制 hash-bound 上游文本产物,确保下游可读且导出的 bundle 不依赖归档后失效的 active 路径。
|
|
41
|
+
- Operator Chat 多次输入排队对齐 DSH Web:运行中的连续输入改为持久化 FIFO 队列,不再用后一条覆盖前一条;单条直接展示,多条默认折叠为数量栏,展开后逐行提供内联编辑、删除和插话发送。队列 Dock 使用与 DSH 一致的外层定位与内层面板结构,标题固定、仅消息列表滚动,并在编辑或请求期间锁定折叠操作。编辑/删除以消息 ID + revision 做并发保护,插话复用 Pi `steer` 注入当前回合,其余消息继续按顺序在回合结束后自动发送;队列通过会话快照与 SSE 权威数组恢复,刷新或 Console 重启不丢失。
|
|
42
|
+
- Operator Chat 右侧辅助栏统一上下文与调用记录:输入框的上下文环、调用记录入口现在复用文件/DAG 侧栏;「文件」常驻,「上下文 / 调用记录」按入口临时添加并支持独立 `×` 关闭,关闭后回到文件 Tab;点击已选入口可收起侧栏,切换到上下文时同步开启注入状态,收起时仅关闭注入而保留上下文数据。上下文与工具调用内容改为内嵌布局,不再叠加独立弹窗、遮罩、焦点陷阱或重复关闭按钮,并补充 Tab 切换与侧栏开合动画;修复折叠态右侧展开按钮无法恢复侧栏的问题。
|
|
43
|
+
- Operator Chat 手动 compact 消息流对齐 DSH Web:压缩中在时间线显示状态行,完成后显示默认折叠的 `compact` 摘要边界,点击可展开完整 Markdown 压缩结果;compact 事件通过 SSE 与 session 详情快照双路径恢复,使用事件 ID 去重,刷新/重新进入会话不丢失。Pi compaction 会把摘要写入 session context,后续模型请求继续使用压缩后的上下文。
|
|
44
|
+
- Operator Chat 对齐 DSH Web Todo 能力:新增 `todo_write` 整表替换工具与内容校验,Todo 状态通过会话事件持久化并支持刷新恢复;新一轮开始自动清空,输入框上方展示默认折叠的任务面板(待处理虚线圆环、进行中旋转圆环与完成勾选),消息流使用专用“更新任务清单”摘要行;手动压缩上下文时会把当前完整 Todo 列表合并进压缩指令,避免摘要遗漏仍在执行的任务。
|
|
45
|
+
- Todo 压缩续跑保护:保留 Pi 默认压缩算法,在手动、阈值或上下文溢出压缩成功后的同一轮下一次模型请求前,临时注入当前完整 Todo 内容与状态;下一轮按 DSH 生命周期清空,避免旧任务串入新对话。
|
|
46
|
+
- Operator Chat 的 `ask_user_question` 提问卡片进一步对齐 DSH Web:问题协议新增 Markdown `detail` 说明;选项标签、推荐标记与描述按同一行自然换行,多选仅由 checkbox 表达勾选而不再整行强高亮;自定义回答按单选编辑图标/多选 checkbox 区分,并使用最多六行的镜像自增高输入框;卡片滚动、悬浮/选中动画、窄屏间距和无障碍 tooltip 同步 DSH 行为。
|
|
47
|
+
- Console 多工作区作用域模型收敛(2026-08-26):对话页顶部不再渲染工作区切换器,工作区添加/选择/新建会话只保留在左侧 Workspace browser;会话按创建工作区持久归属,打开会话后的对话、文件与仓库能力请求全部路由该 session 的 owning workspaceId,与当前全局 active workspace 无关,切换 Operate/Inspect 活动工作区不再泄漏跨工作区数据;新建会话必须携带已知 workspaceId,缺失或未知时前后端一致 fail closed(400 `WORKSPACE_REQUIRED` / 404 `WORKSPACE_NOT_FOUND`),绝不回退默认工作区;Operate 顶部切换工作区为硬作用域边界——中止旧 operation SSE、清空 taskId/dagRunId/operationId/确认态并以新 workspaceId 重新加载;readiness、recovery candidates、night jobs/doctor/morning/ticker 与全部 Observe GET 改为显式 `?workspaceId=` 作用域(`/api/health` 保持进程级),Observe 工作区切换严格按 abort old → clear old → set scope → route/reload new 原子顺序执行,消除旧作用域请求新路由的竞态窗口。
|
|
48
|
+
|
|
49
|
+
- Operator Console 顶栏以对话页为统一基准:Logo 与工作区入口固定在左侧,「对话 / 操作 / 观测」使用视口居中的三等分胶囊与 190ms 横向滑动选中态;切换页面时复用同一个滑块 DOM 节点,避免顶栏更新中断过渡而闪到终点,也不再因仓库身份、状态胶囊或不同内容宽度发生位移;原“仓库身份”改为消费唯一多工作区控制器的工作区下拉,保持列表顺序,切换后停留在当前主页面,并让对话、操作请求与观测数据继续携带同一 `workspaceId`。
|
|
50
|
+
- Operator Chat 右侧文件工作台对齐 `dsh-better-sidebar@0.16.1`:辅助栏宽度不再受固定 520px 上限限制,拖拽宽度随视口钳制并跨会话持久化;文件打开后采用左侧预览、右侧文件树布局,树宽可在 160–480px 间独立拖动。文件 Tab 内置关闭按钮,「预览 / 源文件」与「新窗口打开」收为右侧紧凑工具区;Tab 悬浮、选中与键盘焦点统一为整行反馈,不再出现文件名和关闭按钮各自高亮;预览滚动条同步模型选择器的低对比细滚动条样式。
|
|
51
|
+
- Operator Chat 工具执行状态进一步对齐 DSH Web:成功后不再显示“完成”标签,错误时以红色状态点和错误首行替换普通图标、参数摘要,运行中以低对比扫光表达状态;Think 与工具行统一为 14/24,Think 正文继承界面正文字体,Bash/代码输出保留 12/18 等宽字体;折叠态显示语义图标、悬浮时切换展开箭头,未知工具使用 Sparkle 图标;状态文字继续通过无障碍文本提供,错误详情仍默认展开,右侧“工具调用记录”诊断面板保持不变。
|
|
52
|
+
- Operator Chat 输入框把模型与推理等级合并为一个 DSH 风格入口:根菜单分为“模型 / 推理等级”,模型仍按供应商分组,`Auto` 同时显示 Pi 当前实际档位。
|
|
53
|
+
- Operator Chat 输入框下方统计栏对齐 DSH Web:移除长期硬编码的 `轮/步 —`、`LLM —`、`首 token —` 等占位,改由服务端从持久会话事件投影真实轮数、步骤数、LLM/工具耗时与 token/cache 汇总,刷新或切换历史会话后仍可恢复;新回复同时记录每个 assistant step 的首 token、解码时长和输出 token,结束后自动刷新并展示平均 TTFT 与 tok/s。展示按 DSH 使用 `|` 分组、组内 `·`,没有可靠证据的整组直接隐藏,超长单行省略并保留完整悬浮文本。
|
|
54
|
+
- Operator Chat 消息流对齐 DSH Web:彻底移除历史回合中的“处理详情”聚合入口以及残留的 `Assistant process` 展示容器,Think、进展、阶段性正文、Bash/Read/Search/Edit/Web/MCP 等工具调用与最终回答作为轮次下的同级节点,按真实事件顺序直接展示;Think 与工具行显式左对齐,不再继承全局按钮的横向居中,运行中 Think 展开、历史 Think 折叠,右侧“工具调用记录”诊断面板继续保留。回答正文、Think、工具行与代码输出同步采用 DSH 的字号和行高基准。
|
|
55
|
+
- Operator Chat Markdown 表格对齐 DSH Web:三列及以下表格在 748px 正文列内自动换行,四列及以上表格扩展利用整个消息视口;宽表静止时不再常驻横向滚动条,只有内容确实溢出且鼠标悬浮或键盘聚焦时才显示,窄视口自动回退为列内安全滚动。
|
|
56
|
+
- 新增源码仓库专用 `npm run console:dev`:浏览器继续固定使用 8790 的真实同源接口与 mutation gate,8790 仅把前端模块代理给内部 loopback Vite;CSS 原地 HMR、TSX 自动整页刷新,后台类型检查不阻塞视觉循环,Console 后端依赖变化只重启受监督源码子进程。正式 build、发布包与 init surface 不变。
|
|
57
|
+
- Operator Chat 左侧会话行按 DSH Web 保留 2px 相邻间距,选中/悬浮背景不再黏连;工作区行隔离鼠标点击焦点,鼠标移开即恢复,仅键盘 `focus-visible` 与打开菜单时保留聚焦反馈;Console mutation gate 修正同端口 `localhost`、`127.0.0.1` 与 `[::1]` 回环别名误判,并把新建会话的安全闸错误转换为可操作中文提示。
|
|
58
|
+
- Operator Chat 左侧工作区与会话的悬浮/键盘聚焦状态改为行级隔离:会话仍归属工作区分组,但悬浮或聚焦会话时不再连带高亮工作区行、切换工作区图标或显示工作区操作按钮;工作区自身的悬浮卡片和菜单保持原行为。
|
|
59
|
+
- Operator Console 收敛为常驻单壳:一级导航改为「对话 / 操作 / 观测」。对话与操作工作区保活不卸载;观测工作区首次动态挂载 `inspect-workspace.js`,切走 `setActive(false)` 暂停轮询。对话模式没有二级页签时直接隐藏空标签带与折叠按钮,不覆盖操作/观测已有的折叠偏好。产品观测入口(Night 深链、Recovery 全屏、InspectSplitPanel、对话卡片)一律写入 Console canonical hash(`/#/inspect...`),独立 `/inspect/#/...` 仅作兼容入口。
|
|
60
|
+
- Console DAG 检查器「提示词重启」面板改为与检查器一致的卡片层级:版本选择复用自定义下拉;编辑模式与页签同款分段按钮;提交按钮用品牌橙药丸并吸底;追加/替换编辑区放到底稿前面,长底稿默认折叠以免把操作挤出视口。
|
|
61
|
+
- Console「操作」模式新增人类专用的“更新并初始化”入口:默认更新 npm `latest` 稳定版,也可明确选择 `next` 预发布版;先 fail-closed 检查活跃 DAG/Worker/Chat/Console 操作与 npm 来源,再精确安装并验证所选版本、仅执行 `init update --apply-safe`,并以 hash-bound handoff 在原端口接棒新 Console。`latest` 保持稳定版且拒绝回退,`next` 仅在人工选择时允许精确 prerelease;渠道写入 operation 审计身份。Inspect 与模型工具均不能触发该写入操作。启动时不再在终端询问更新,页面会在接棒后自动刷新并通过新的 `consoleInstanceId` 识别实例。
|
|
62
|
+
- 修复 Console 四处评审缺陷(合并前收口):① 向导「运行」进度块接通——`runDag` 只返回 operationId,原实现读的 `recovery.dagRunId` 在向导路径永远为空;现在确认页先快照基线 run、进入运行页后轮询 `observeLink`,以 (taskId, operationId) 任一变化为失效信号(operationId 覆盖「重新运行」按钮——它不改变向导步骤;taskId 覆盖运行步骤中手动改任务 ID 的场景,失效时基线一并重置,避免沿用上一任务的 run):新派发/切任务会清掉旧选中 run 并重新解析,**只接受与当前任务基线不同的新 run**;从 Recovery 带回的共享选中 run 先做归属校验——`GET /api/dag-runs/:id` 详情响应新增 `taskId` 投影(源自 run.json 的 `taskContractBinding`→`sourceBinding`→Hybrid 标题,与 observeLink/candidates 同一绑定真源,不受候选列表 limit 截断影响;404 视为失效选中、无绑定视为不可判定),非本任务的 run 不展示;校验全程由 effect 生命周期栅栏保护——任务/运行/选中在异步校验期间变化时,旧响应直接丢弃、不会改写新状态;校验暂不可用时按有界退避(2s→30s,约 2 分钟)自动重试而非被动等待状态变化,重试计划为纯函数并有行为测试;**展示层另有闸门**——进度面板与运行操作只消费「本解析器已采纳/已验证」的 run(组件 state),未验证期间(校验中、重试中、give-up 后)进度面板保持空缺,不会即时或永久显示其他任务的 DAG;「打开检视」「侧栏预览」两个入口同样双重门禁(按钮无已验证 run 即禁用 + 处理器复核 verifiedRunId),共享的 openInspectSplit 解析器不再能带出未验证的外来 run。解析决策本身抽取为纯状态机 `pages/tasks/run-id-resolution.ts`(首跑/重跑/切任务/外来选中/基线门控五类迁移),Effects 只做薄适配,主流程「确认页基线快照 → runDag 派发 → observeLink 轮询 → 新 run 采纳」有完整行为测试。基线快照为三态(成功/权威无运行/暂不可查),**查询失败不会被当成「没有历史运行」**——快照重试期间基线保持未知、探测轮询等待,不会把旧运行误判为新运行;新 run 创建失败或注册较慢时进度面板宁可空缺也不把上一次已终止的 DAG 当作当前运行(轮询上限 5 分钟后安静停止)。② 失败建议数据契约修正——旅程卡原先把原始 run 级 `failureCategory` 直接查归一化建议表(`missing-api-key`/`nonzero-exit` 等永远查不中,节点分类又在安全投影中被丢弃);现在纯分类核心下沉 `src/shared/dag-failure-category.ts`(console↔workflows 双向共享叶,不破坏 console 禁止 import workflows 的边界测试),服务端投影把 run 级与节点级分类都归一化输出(success/skipped 不出),卡片按「失败节点分类优先、run 级兜底」取值,失败卡始终有可操作建议。③ Recovery interrupt 资格轮询在运行中档位同步刷新 run 状态——原先状态只在选中时读一次,运行中的 run 结束后仍永久保持 4 秒快轮询;现在 4 秒档附带轻量 `GET /api/dag-runs/:id` 刷新 `effectiveStatus`,终态后自动退到 30 秒。④ Inspect 紧凑检视一次瞬时刷新失败不再永久显示错误——成功刷新回合会清除上一轮 error 横幅。
|
|
63
|
+
- Operator Chat 输入框两项交互增强:① **↑/↓ 历史输入召回**——每次发送的文本进入输入历史(连续重复折叠、上限 100 条),光标在首行按 ↑ 逐条向旧回溯、按 ↓ 向新前进,越过最新一条时恢复回溯前**未发送的草稿**(草稿不会被历史浏览冲掉);多行文本中部的方向键仍是普通光标移动,IME 组词与 @文件/命令面板打开时不抢占。② **运行中排队下一轮指令**——当前回合运行中 Enter 不再被吞掉,消息作为「排队消息」绑定当前 Turn(服务端 `PUT deferred-turn` 从仅限 stopping 放开为 running/stopping,错误码 `TURN_NOT_STOPPING`→`TURN_NOT_ACTIVE`),当前回合结束(正常完成或停止)后自动发送;排队条提供「立即发送」(停止当前回复并立即发出)、「编辑」(移回输入框改写后再排)、「删除」三种操作,运行中输入框右侧提供排队发送按钮(与停止按钮并列);排队条单行展示(状态 + 省略号预览 + 操作按钮一行),输入框默认一行高(自动增高上限 280px 不变)。
|
|
64
|
+
- 向导「运行」面板结构化与预期管理(A2/C9):新增实时运行进度块——节点完成计数与百分比进度条(含 progressbar 无障碍语义)、当前运行节点名称与已运行时长、失败节点与错误摘要,数据来自 `/api/dag-runs/:id` 每 5 秒轮询并在终态自动停止;`effectiveStatus=running-suspected-stall` 时显示橙色「疑似停滞」提示条(建议打开检视查看节点活动或到恢复页协作中止/诊断),把 20–40 分钟长跑的「日志噪音等待」变为有阶段感、可判断的等待。原始 SSE 事件日志默认折叠为「原始事件日志(最近 80 条)」,需要排查时再展开。
|
|
65
|
+
- Console 前端三项体验优化(P0/P2):① Recovery 页 DAG 紧凑检视侧栏(InspectSplitPanel)从一次性快照改为实时刷新——运行中每 5 秒自动拉取节点/事件并新增「进行中/已结束」刷新状态行,到达终态(finished/failed/partial_failed/superseded/abandoned)自动停止轮询,刷新轮不清空既有内容避免闪烁;② Chat 任务旅程卡失败态新增按归一化 failureCategory 的可操作「建议」行(validation/executor/write-guard/timeout/auth/human-required/human-rejected/shell-command/static-error/decision-envelope/unknown 各映射到具体下一步:从失败节点重跑、修正契约后重新生成、跳「模型与认证」页等),不再只报「原因分类为 X」;③ Recovery 页 interrupt 资格轮询退避:选中 run 已终态(含 interrupted)时从 4 秒降到 30 秒,运行中保持 4 秒。
|
|
66
|
+
- Console 对话页 Models 面板的模型管理增强:以弹框形式增/改/删 Pi 的模型条目,支持 6 个定义字段(id、name、contextWindow、maxTokens、input、reasoning)。新增时 Provider 用下拉选择、其余字段自动补默认值;编辑时 Provider 只读且仅在原位置就地替换,只改表单内字段、不覆盖配置里页面未展示的其它字段(如 cost/compat);不读写 API key(凭据走 Pi CLI)。编辑已存在的模型不再被移到最后。(该能力仅在对话页提供,设置页不再重复入口。)
|
|
67
|
+
- 修复 `markdown-traceability` pipeline 未将冻结 `backendLayout` 传给 `validateBackendMarkdownTraceability`,自定义 layout 下不再回落默认 `testcase/md` ENOENT;新增回归用例以非默认 nested layout(`testRoot=testcase/elb/remote`、`markdownRel=md`)执行真实 shell pipeline,traceability 从自定义 Markdown 目录读取并 PASS,默认 layout 行为不变。(验证:`npm run typecheck`、`npx vitest run test/backend-test-markdown-workflow.test.ts test/backend-test-layout.test.ts`、`npm run build`、`git diff --check`。)
|
|
68
|
+
- backend-test 快速补强(backend-test-fast-failclosed-attribution):两处 fail-open 缺口已 fail-closed。① 当前轮次 Markdown 作用域严格依赖唯一有效 `## Module Index`——README 缺失 / 不可读 / `## Module Index` 重复(或缺标题)/ 唯一但空或不可解析任一状态,`markdownFiles` 与 coverage `markdownModuleFiles` 均返回空作用域而非回退全目录扫描,历史 `.md` 不再渗入 Case/coverage/partition facts,`resolveBackendTestManifestModules` 新增可区分 `manifestStatus`(valid/missing/unreadable/duplicate/empty-unparsable)与 `moduleIndexHeadingCount`,`validateBackendMarkdownCases` 与 `analyzeBackendTestCaseCoverage` 为非法状态各推 FAIL finding,默认与自定义 `backendTest` 布局一致。② collection 分类器不再凭 `__NNN_*` 裸 import 名称单独判 REPAIRABLE:inventory 构建时预计算每个 mapped script 的裸本地 helper import 证据(`scriptBareImports`),只有「存在同名 generated-local helper asset 且 mapped script 源码确实 import 该裸模块」才判 REPAIRABLE 并给精确 repairPaths;无 helper asset / mapped script 无对应 import / 无法精确归因一律 `BLOCKED`(`missing-generated-local-helper-without-evidence`。真第三方模块缺失保持 BLOCKED,不通过 PYTHONPATH/sys.path/conftest/ImportError fallback 绕行。(验证:`npm run typecheck`、backend-test 四聚焦 vitest、`npm run build`、`git diff --check`。)
|
|
69
|
+
- backend-test 后续修复(backend-test-fast-manifest-import-fix):Markdown 用例校验与 coverage 分析改为按 README `## Module Index` 清单限定本轮有效模块资产——未声明旧 `.md`(如 legacy.md)不再进入 Case/coverage/partition 统计,报告改为显式非静默 unmanifested advisory;“清单声明但文件缺失” fail-closed 明确失败,默认与自定义 `backendTest` 布局统一生效。generated pytest 裸本地 helper import(`from __551_manager_helpers import ...`)在 writer completeness gate 判为 recoverable 并给出精确 mapped 脚本 target path;collection 分类器对可归因到 mapped 资产的裸本地 helper `ModuleNotFoundError` 判 REPAIRABLE 并提供精确 repairPaths,真正第三方依赖缺失仍保持 BLOCKED。不放宽 self-contained、writeSet、forbiddenPaths、skip/xfail、断言与单次业务执行约束(验证:`npm run typecheck`、backend-test 聚焦 vitest、`npm run build`、`git diff --check`)。
|
|
70
|
+
- 前端风险分级细分 manifest 触及语义:`allowedPaths` 含 `package.json`/lockfile 或需求文本提到 package.json 不再单独触发 `new-dependency` high-risk(改一行 script、调构建参数的任务不再被顶到强制全门禁并误标高风险),只有任务文本同时出现安装语言(npm install / yarn add / pnpm add / 新增依赖等)才升级;仅路径触及时记 `new-dependency:manifest-path-without-install-language` 拒绝信号,审计可溯。
|
|
71
|
+
- 前端验证 fallback 生成期诚实化:真实项目无可读取的 `package.json` scripts 且未探测到本地 tsc 时,不再注入必然失败的 `npm run typecheck` / `npm run build` / `npm test`(纯静态 / vanilla JS 站点原会在 verify 阶段假失败),改为执行显式 no-op 标记命令(`No frontend verification command configured`,进入冻结命令集可被 contract 引用,trace 如实记录 not-run),并写生成期 advisory 提示用 `--verify` 或执行约束显式声明验证命令后重新生成 DAG。无 repoRoot 的单测 fixture 保留历史 generic fallback。**标记不构成验证证据(fail-closed)**:verification trace 将绑定标记的 target 判为失败、只含标记的 static 证据判为 unavailable,repair 分类归为 non-repairable `contract`,verify 节点以 `frontend verification unavailable` 硬失败阻断 review/closeout——无真实验证命令的 run 无法走完绿灯链。
|
|
72
|
+
- frontend-test `passed` 回执链改按 dispatch 序号判序(B-HASH-01):`summarizePlaywrightCliReceipts` 先按 `sequence` 排序再判 open→find→cleanup 连续链;并行 `find`/`screenshot` 按完成时间落盘导致的乱序不再误杀执行已通过的 case(Wave 1 实测 4 条 passed 被改判 `browser-command-evidence-missing`)。真 gap / 重复序号仍 fail-closed。
|
|
73
|
+
- `tool-policy` 失败归一为 `executor`(B-REC-03):前端 preflight 能力拒绝(缺 `@playwright/cli` JS entry、allowlist 拒绝)不再落 `unknown`→`manual-review`+`humanRequired`;`dag report` 给出 `rerun-after-fix`,Console `standaloneTaskRerun` 的 R2 gate 放行 run-failed 同 task 整单重跑,无需人工决策门或 sibling task。
|
|
74
|
+
- Operator Chrome Band1 模式切换入口补显式 `aria-label`(B-FIND-01,方案 A):`操作`/`观测` mode link 原为 inline-flex 裸文本节点,不参与 name-from-content,a11y snapshot 序列化为无名 link,`find` 无法断言;补 `aria-label` 后实测 `find "观测"` 1 命中、click 后 `find "运行总览"` 1 命中,AC-FE-CHROME-003 恢复可见断言路径。
|
|
75
|
+
- Inspect 异常 Task 页空态文案统一(B-FIND-02):`failures.js` 运行时空态由 `当前没有失败或阻塞的 Task。` 改回与静态 `#failures-empty`、页面标题及回归目录 AC-FE-INS-004 一致的 `当前没有异常 Task`,消除静态/运行时文案漂移;实测新文案 find 1 命中、旧文案 0 命中。
|
|
76
|
+
|
|
77
|
+
- `next-release.yml` 防重复发布守卫补充幂等语义:`mode=recover`(dist-tags.next 已指向出自本 HEAD 的 tarball)时,手动 `workflow_dispatch` 重入不再撞 duplicate publish 硬失败,改为写 summary 后干净退出(§5.1 规则 4);非 recover 的重复发布仍硬失败。
|
|
78
|
+
|
|
79
|
+
- frozen repair 工具审计改为按 attempt 段扫描(B1):`session-events.jsonl` 跨 attempt 共享追加,attempt>1 的 `auditRepairAttemptToolUse` 现在只审本 attempt 字节段(newline 对齐),planner attempt 1 的 ls/find 不再被误判给 repair 轮;repair prompt 显式声明 read-only 工具契约与 allowlist 边界(B2),并内嵌 openspec-citations 输出格式正例;`LOOP_AGENT_IGNORE_STALE_DIST=1` 环境变量旁路 stale-dist guard(B3),Console spawn 的 sibling CLI 可继承。
|
|
80
|
+
- frontend plan/revision 结构化输出改为冻结 repair context + hash-bound canonical artifact:attempt>1 不再重放完整 planner prompt;成功后 stdout 只保留 artifact 路径,design review / prewrite 只消费已校验 artifact,不再从节点文本 merge。失败分类补齐 `structured-repair-exhausted` / `governance-blocked`,并修正 `structured-output-truncated` / `output-too-large` 的归一化映射。
|
|
81
|
+
- 将 `@earendil-works/pi-ai` 与 `@earendil-works/pi-coding-agent` 从可选依赖提升为精确 pin 的运行时依赖 `0.83.0`,将运行时直接导入的 `typebox` 精确声明为 `1.3.7`,并在根包声明 Node.js `>=22.19.0`。安装 `@tea-agent/loop-agent` 会默认装上 Pi SDK(含 `--omit=optional` 场景);`@cursor/sdk` 仍保持 optional。availability / readiness 探针、隔离 tarball canary、发布包契约测试与安装/本地环境说明同步对齐。
|
|
82
|
+
- backend-test Scenario Partition 仅接受绑定源有限 enum/分类集合的 GET/list query/path 轴;非法 Domain(空/重复/保留 token、无有限域、与 OpenAPI enum 不一致)报 `INVALID_PARTITION_DOMAIN` / `NO_FINITE_DOMAIN` / `PARTITION_SOURCE_MISMATCH` 根因,不再生成空后缀 `TP-SP-...-`、重复 slot,也不再级联 `MISSING_*_SLOT`。N6 对这些根因码 fail-closed;合法源分区缺槽仍阻断。N2 禁止为自由串/主键/required-only/boundary-only 建分区;N5 允许删除无源非法 Partition 及其派生槽位。
|
|
83
|
+
- npm `next` 渠道发布改为提交数节流:main push 仅当距上次 next 发布的 source commit ≥ 5 个 commit 时才自动发布(新增 `scripts/next-publish-gate.mjs`,读已发布 tarball build-stamp 对比 HEAD);不足阈值时 workflow 绿色跳过,手动 `workflow_dispatch` 不受限(切 release 线前强制出包 / 紧急补发)。发布文档真源 §4.1/§5.1/§7/§12 同步。
|
|
84
|
+
|
|
85
|
+
- Console「Pi 插件」增强:已安装插件显示实际安装版本;安装时提供版本下拉(从 npm 配置的仓库拉取该包全部已发布版本,默认装最新);版本号带 `@version` 的已装包(如 `npm:pi-lens@3.8.72`)也能被正确识别为已安装。
|
|
86
|
+
- Console「Pi 插件」的版本号改为从 **npm 配置的仓库地址**(`npm config get registry`)拉取,不再硬编码官方源,内网镜像可用;安装/卸载进度条改用 JS(requestAnimationFrame)驱动,不受系统「减少动态效果」影响,任何环境都显示滑动动画。
|
|
87
|
+
- Console「操作」页的「Pi 插件」从「设置」页提升为与「设置」同级的独立 tab(`/#/operate/pi-plugins`):共享壳操作导航新增入口,独立子面板承载插件目录/搜索/分页/一键安装卸载。
|
|
88
|
+
- Console 设置页新增「Pi 插件」区块:内置一份经 npm 校验的插件目录(6303 个,仅展示 5562 个可安装、含中文说明),支持搜索、每页条数(10/20/50/100)、分页、一键安装/卸载(调用 `pi install/remove`,全局 `~/.pi/agent`),安装/卸载带进度过渡与结果提示。
|
|
89
|
+
- CLI 命令 `--help` 现在直接显示真实 usage(此前 raw-args 命令只在解析出错时才抛 usage):`task advance` / `task status` / `task source prepare` 与 `dag resume|doctor|report|reconcile-run|rerun|rerun-task|reject|approve|status` 的 `--help` 顶部即列出完整参数契约,`task advance` 并附 `--verify "label:command"` 示例;`init` 提示补全局 `--repo-root <path>`(置于子命令前)约定。
|
|
90
|
+
- `task source prepare`(确定性任务源投影,managed 需求.md/执行约束.md)从死代码转正:此前 `TASK_SUBCOMMANDS` 缺少 `source` 导致命令不可达,现 `task source prepare <task-id> --from-text/--from-file/--from-stdin/--from-draft --dry-run|--apply` 可直接调用。
|
|
91
|
+
- Console 对话页「轨迹」视图响应式优化:轨迹列宽跟随面板实际宽度收缩(`.oc-trajectory` 加 `width:100%`、`.oc-trajectory-turn/.step` 加 `min-width:0` 修 flex 收缩链),窄窗口(≤720px)自动隐藏耗时列,避免工具行被固定项挤爆。
|
|
92
|
+
- Console 对话页新增「轨迹」视图(详情侧栏 tab):仿 DSH ui-trajectory,用本仓库 turnGroups 数据把对话按「用户 → 过程 → AI 回复」渲染成统一单元格列表,每行带 kind 标签 + 图标(用户/ AI / 思考 / 工具 / 活动 / 错误 / 压缩);用户与 AI 用标签颜色 + 图标区分,AI 中间文本也标注;思考、工具、以及超长用户/AI 消息默认单行截断、可展开/收起看全文(含工具参数与结果、状态与耗时)。支持一键「导出 HTML」自包含文件(长内容用 `<details>` 折叠,短内容内联)。主会话思考块标签由英文 Think 改为「思考」。
|
|
93
|
+
- DAG 检查器节点「执行过程」的「导出 HTML」改为复用页面真实渲染与样式,导出的独立 HTML 排版与页面一致;Pi 会话节点导出会带上原始协议事件,左上角提供「展开/隐藏原始协议事件」按钮(默认隐藏,每项仍可单独展开),shell/静态节点导出同样与页面一致。- backend-test 的 pytest repair 现在继续使用 run-owned plan,不再搜索测试目录 README;correspondence finding 会直接指向 docstring、参数 ID、符号、脚本或 payload 的修复位置,collection/scenario repair 与 generated-local Python 写边界保持一致,并在单次 Pi 会话达到 24 轮或 80K 最大 usage snapshot 前受控返回 partial failure。
|
|
94
|
+
- Operator Chat 新增持续目标模式:可以用 `/goal` 或输入框上方的目标条创建跨多个回合推进的目标,并随时暂停、继续、编辑或清除;刷新后仍能看到目标,但重启 Console 后不会未经确认自行续跑。
|
|
95
|
+
- Operator Chat 现在可以在同一个页面管理多个工作区;每个会话始终使用创建它的工作区,切换对话时地址栏保持简洁稳定。
|
|
96
|
+
- 对话消息流整体调整为更紧凑、清晰的布局,思考过程、工具执行、阶段性结果和最终回答会按真实发生顺序展示。
|
|
97
|
+
- 上下文过大时会自动压缩并继续原请求,消息流会依次展示触发原因、压缩进度和压缩结果;手动压缩也使用同一套展示方式。
|
|
98
|
+
- Operator Chat 与 DAG Pi 节点默认开启上下文压力处理:发送前接近窗口时压缩一次、识别网关「请求上下文过大」后压缩续跑,并对 OpenAI 格式的大工具输出做线路压缩;可用环境变量关闭,不必改会话记录。
|
|
99
|
+
- 对话进行中可以连续提交多条消息,并支持编辑、删除或立即插入当前回复;刷新页面或重启 Console 后,未发送内容仍会保留。
|
|
100
|
+
|
|
101
|
+
### 新增
|
|
102
|
+
|
|
103
|
+
- 模型可以读取、创建和更新当前会话的持续目标;长任务会在安全轮数内自动续行,优先处理用户排队消息,并在 DAG 或其他运行结束后再继续。上下文压缩后,当前目标也会自动回到模型上下文中。
|
|
104
|
+
- 右侧辅助栏统一承载文件、上下文、调用记录、运行活动和当前 DAG;点击消息流中的运行状态即可在同一侧栏查看运行、门禁与产物,并可自由调整侧栏宽度。
|
|
105
|
+
- 新增任务清单与结构化提问卡片,让长任务的进度和需要用户选择的内容更容易理解。
|
|
106
|
+
- 「对话 / 操作 / 观测」使用统一导航;操作和观测页面可以切换工作区查看对应数据。
|
|
19
107
|
## [0.40.0] - 2026-08-31
|
|
20
108
|
|
|
21
109
|
### 重点更新
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Probe only. pi-handoff is an interactive Pi extension, not a renderer API,
|
|
3
|
+
* so Context Bundle generation never imports or executes it. This isolation
|
|
4
|
+
* keeps the authoritative export path deterministic when the optional package
|
|
5
|
+
* is absent, broken, or changes its private Pi dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export async function probeOptionalPiHandoff(input = {}) {
|
|
8
|
+
const resolve = input.resolve ?? (async (specifier) => import.meta.resolve(specifier));
|
|
9
|
+
try {
|
|
10
|
+
await resolve("@nicknisi/pi-handoff");
|
|
11
|
+
return {
|
|
12
|
+
schemaVersion: 1,
|
|
13
|
+
packageName: "@nicknisi/pi-handoff",
|
|
14
|
+
status: "available-interactive-only",
|
|
15
|
+
coreBundleUnaffected: true,
|
|
16
|
+
detail: "extension can be used after Pi import, but does not expose a Context Bundle renderer API",
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
return {
|
|
22
|
+
schemaVersion: 1,
|
|
23
|
+
packageName: "@nicknisi/pi-handoff",
|
|
24
|
+
status: /cannot find|not found|resolve/i.test(message)
|
|
25
|
+
? "not-installed"
|
|
26
|
+
: "incompatible",
|
|
27
|
+
coreBundleUnaffected: true,
|
|
28
|
+
detail: "optional extension unavailable; use generic or Pi session adapter",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
function sha256(value) {
|
|
3
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
4
|
+
}
|
|
5
|
+
export function evaluatePiSessionCapability(receipt) {
|
|
6
|
+
const limitations = [
|
|
7
|
+
"Pi JSONL import does not restore the captured system prompt as a system message",
|
|
8
|
+
"provider authentication and external tool state are intentionally not exported",
|
|
9
|
+
];
|
|
10
|
+
if (receipt.runtime.executor !== "pi") {
|
|
11
|
+
return {
|
|
12
|
+
schemaVersion: 1,
|
|
13
|
+
compatible: false,
|
|
14
|
+
reproducibility: "semantic-handoff",
|
|
15
|
+
reasonCodes: ["PI_EXECUTOR_NOT_CAPTURED"],
|
|
16
|
+
limitations,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
schemaVersion: 1,
|
|
21
|
+
compatible: true,
|
|
22
|
+
reproducibility: "semantic-handoff",
|
|
23
|
+
reasonCodes: ["PI_IMPORT_SEMANTIC_ONLY"],
|
|
24
|
+
limitations,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build a minimal Pi v3 JSONL session that can be opened with `/import`.
|
|
29
|
+
* It deliberately references the sibling bundle materials instead of
|
|
30
|
+
* duplicating a potentially large prompt inside the session file.
|
|
31
|
+
*/
|
|
32
|
+
export function renderPiSessionJsonl(input) {
|
|
33
|
+
const capability = evaluatePiSessionCapability(input.receipt);
|
|
34
|
+
const seed = `${input.runId}:${input.nodeId}:${input.attempt}:${input.receipt.contextDigest}`;
|
|
35
|
+
const sessionId = sha256(`session:${seed}`).slice(0, 32);
|
|
36
|
+
const messageId = sha256(`message:${seed}`).slice(0, 16);
|
|
37
|
+
const timestamp = input.receipt.identity.capturedAt;
|
|
38
|
+
const header = {
|
|
39
|
+
type: "session",
|
|
40
|
+
version: 3,
|
|
41
|
+
id: sessionId,
|
|
42
|
+
timestamp,
|
|
43
|
+
cwd: ".",
|
|
44
|
+
};
|
|
45
|
+
const message = {
|
|
46
|
+
type: "message",
|
|
47
|
+
id: messageId,
|
|
48
|
+
parentId: null,
|
|
49
|
+
timestamp,
|
|
50
|
+
message: {
|
|
51
|
+
role: "user",
|
|
52
|
+
content: [
|
|
53
|
+
"This session was imported from a loop-agent Context Bundle.",
|
|
54
|
+
"Read and follow context/system-prompt.md, then continue the request in context/user-message.md.",
|
|
55
|
+
`Context digest: ${input.receipt.contextDigest}`,
|
|
56
|
+
`Reproducibility: ${capability.reproducibility}. ${capability.limitations.join("; ")}.`,
|
|
57
|
+
].join("\n\n"),
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
return `${JSON.stringify(header)}\n${JSON.stringify(message)}\n`;
|
|
61
|
+
}
|
package/dist/build-stamp.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.
|
|
4
|
-
"gitSha": "
|
|
5
|
-
"builtAt": "2026-08-
|
|
3
|
+
"version": "0.42.0-next.1",
|
|
4
|
+
"gitSha": "fdc98f1393f69abd9a052de266f7199f580e4061",
|
|
5
|
+
"builtAt": "2026-08-31T11:04:06.136Z"
|
|
6
6
|
}
|
|
@@ -31,6 +31,7 @@ import { runDagWorkflowValidate } from "../commands/dag-workflow-validate.js";
|
|
|
31
31
|
import { runDagWorkflowCompile } from "../commands/dag-workflow-compile.js";
|
|
32
32
|
import { runDagWorkflowPlan } from "../commands/dag-workflow-plan.js";
|
|
33
33
|
import { runDagApprove } from "../commands/dag-approve.js";
|
|
34
|
+
import { runDagArtifact } from "../commands/dag-artifact.js";
|
|
34
35
|
import { runDagReject } from "../commands/dag-reject.js";
|
|
35
36
|
import { runDagReconcileTasks } from "../commands/dag-reconcile-tasks.js";
|
|
36
37
|
import { runDagReconcileRun } from "../commands/dag-reconcile-run.js";
|
|
@@ -42,6 +43,7 @@ import { runDagDecisionInspect, runDagDecisionValidate, } from "../workflows/dag
|
|
|
42
43
|
import { runDagDoctor, runDagStatus } from "../workflows/dag/lifecycle.js";
|
|
43
44
|
import { runDagCloseoutDraft, runDagReport } from "../commands/dag-report.js";
|
|
44
45
|
import { runDagFinalVerification } from "../commands/dag-final-verification.js";
|
|
46
|
+
import { runDagContext } from "../commands/dag-context.js";
|
|
45
47
|
import { runKnowledge } from "../commands/knowledge.js";
|
|
46
48
|
import { runLoopBenchmark } from "../commands/loop-benchmark.js";
|
|
47
49
|
import { runPiReuseBenchmark } from "../commands/pi-reuse-benchmark.js";
|
|
@@ -137,6 +139,8 @@ const DAG_SUBCOMMANDS = [
|
|
|
137
139
|
"rerun-task",
|
|
138
140
|
"reconcile-tasks",
|
|
139
141
|
"final-verification",
|
|
142
|
+
"context",
|
|
143
|
+
"artifact",
|
|
140
144
|
"decision",
|
|
141
145
|
];
|
|
142
146
|
const TASK_SUBCOMMANDS = ["advance", "status", "source"];
|
|
@@ -591,6 +595,14 @@ export const COMMAND_DEFINITIONS = [
|
|
|
591
595
|
await runDagFinalVerification(repoRoot, finalVerificationArgs);
|
|
592
596
|
return;
|
|
593
597
|
}
|
|
598
|
+
if (subcommand === "context") {
|
|
599
|
+
await runDagContext(repoRoot, rest.filter((arg) => Boolean(arg)));
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
if (subcommand === "artifact") {
|
|
603
|
+
await runDagArtifact(repoRoot, rest.filter((arg) => Boolean(arg)));
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
594
606
|
if (subcommand === "decision") {
|
|
595
607
|
const decisionSubcommand = rest[0];
|
|
596
608
|
const decisionArgs = rest
|
package/dist/cli/program.js
CHANGED
|
@@ -7,7 +7,9 @@ import { runCoverageAudit } from "../commands/coverage-audit.js";
|
|
|
7
7
|
import { runCoverageReport } from "../commands/coverage-report.js";
|
|
8
8
|
import { parseCursorPromptArgs, printCursorPromptUsage, runCursorPrompt, } from "../commands/cursor-prompt.js";
|
|
9
9
|
import { runDagApprove } from "../commands/dag-approve.js";
|
|
10
|
+
import { runDagArtifact } from "../commands/dag-artifact.js";
|
|
10
11
|
import { runDagFinalVerification } from "../commands/dag-final-verification.js";
|
|
12
|
+
import { runDagContext } from "../commands/dag-context.js";
|
|
11
13
|
import { runDagInitHybrid } from "../commands/dag-init-hybrid.js";
|
|
12
14
|
import { runDagReconcileTasks } from "../commands/dag-reconcile-tasks.js";
|
|
13
15
|
import { runDagReconcileRun } from "../commands/dag-reconcile-run.js";
|
|
@@ -363,6 +365,12 @@ async function runDagAction(repoRoot, subcommand, rest) {
|
|
|
363
365
|
case "final-verification":
|
|
364
366
|
await runDagFinalVerification(repoRoot, args);
|
|
365
367
|
return;
|
|
368
|
+
case "context":
|
|
369
|
+
await runDagContext(repoRoot, args);
|
|
370
|
+
return;
|
|
371
|
+
case "artifact":
|
|
372
|
+
await runDagArtifact(repoRoot, args);
|
|
373
|
+
return;
|
|
366
374
|
case "decision": {
|
|
367
375
|
const [decisionSubcommand, ...decisionArgs] = args;
|
|
368
376
|
if (decisionSubcommand === "inspect") {
|
|
@@ -376,7 +384,7 @@ async function runDagAction(repoRoot, subcommand, rest) {
|
|
|
376
384
|
throw new Error("usage: dag decision <inspect|validate> --run-id <id> [--node-id <node-id>]");
|
|
377
385
|
}
|
|
378
386
|
default:
|
|
379
|
-
throw new Error("usage: dag <init-hybrid|execute|validate|workflow-plan|workflow-validate|workflow-compile|approve|reject|resume|status|doctor|report|closeout-draft|reconcile-run|request-interrupt|rerun|rerun-task|reconcile-tasks|final-verification|decision> ...");
|
|
387
|
+
throw new Error("usage: dag <init-hybrid|execute|validate|workflow-plan|workflow-validate|workflow-compile|approve|reject|resume|status|doctor|report|closeout-draft|reconcile-run|request-interrupt|rerun|rerun-task|reconcile-tasks|final-verification|context|artifact|decision> ...");
|
|
380
388
|
}
|
|
381
389
|
}
|
|
382
390
|
function compactArgs(args) {
|
|
@@ -547,7 +555,21 @@ function addDagCommand(program, defaultRepoRoot) {
|
|
|
547
555
|
"rerun-task",
|
|
548
556
|
"reconcile-tasks",
|
|
549
557
|
"final-verification",
|
|
558
|
+
"context",
|
|
559
|
+
"artifact",
|
|
550
560
|
], defaultRepoRoot);
|
|
561
|
+
const context = dag.commands.find((command) => command.name() === "context");
|
|
562
|
+
if (!context)
|
|
563
|
+
throw new Error("dag context command registration failed");
|
|
564
|
+
context
|
|
565
|
+
.description("Inspect or export a captured effective node context")
|
|
566
|
+
.addHelpText("after", "\nActions:\n show --run-id <id> --node-id <id> --attempt <n> [--json]\n export --run-id <id> --node-id <id> --attempt <n> --output <zip> [--target <generic|pi-session|pi-handoff|readable>] [--redaction <redacted|raw>] [--acknowledge-sensitive-data] [--json]");
|
|
567
|
+
const artifact = dag.commands.find((command) => command.name() === "artifact");
|
|
568
|
+
if (!artifact)
|
|
569
|
+
throw new Error("dag artifact command registration failed");
|
|
570
|
+
artifact
|
|
571
|
+
.description("Inspect artifact consumers or manage staged artifact revisions")
|
|
572
|
+
.addHelpText("after", "\nActions:\n consumers --run-id <id> --node-id <producer> --artifact <path> [--json]\n revision stage --run-id <id> --node-id <producer> --artifact <path> --file <replacement> --request-id <id> [--json]\n revision discard --revision-id <id> --request-id <id> [--json]");
|
|
551
573
|
const validate = createRawArgsCommand("validate", "Validate an Agent DAG spec", defaultRepoRoot);
|
|
552
574
|
configureDagValidate(validate);
|
|
553
575
|
replaceActionWithOptionAwareDispatch(validate, defaultRepoRoot);
|