@tea-agent/loop-agent 0.40.0 → 0.41.0-beta.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +140 -13
  2. package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
  3. package/dist/adapters/context-transfer/pi-session.js +61 -0
  4. package/dist/build-stamp.json +3 -3
  5. package/dist/cli/command-definitions.js +12 -0
  6. package/dist/cli/program.js +23 -1
  7. package/dist/commands/dag-artifact.js +284 -0
  8. package/dist/commands/dag-context.js +184 -0
  9. package/dist/commands/dag-rerun.js +206 -1
  10. package/dist/executors/dag-pi-executor.js +39 -12
  11. package/dist/executors/pi-sdk-executor.js +3 -0
  12. package/dist/executors/shell-executor.js +3 -30
  13. package/dist/{worker → infrastructure}/console/app-data.js +4 -0
  14. package/dist/infrastructure/console/artifact-revision-store.js +430 -0
  15. package/dist/infrastructure/console/context-export-store.js +160 -0
  16. package/dist/infrastructure/console/dir-lock.js +132 -0
  17. package/dist/{worker → infrastructure}/console/operation-store.js +28 -0
  18. package/dist/infrastructure/harness/artifact-store.js +10 -1
  19. package/dist/infrastructure/harness/atomic-write.js +12 -2
  20. package/dist/shared/context-transfer/artifact-revision.js +172 -0
  21. package/dist/shared/context-transfer.js +418 -0
  22. package/dist/shared/operator/capabilities.js +14 -0
  23. package/dist/shared/operator/safe-run-summary.js +1 -0
  24. package/dist/shared/path-safety.js +93 -0
  25. package/dist/shared/preview.js +28 -4
  26. package/dist/task/config-types.js +2 -1
  27. package/dist/task/task-demand-routing.js +3 -0
  28. package/dist/worker/console/chat/chat-event-store.js +2 -2
  29. package/dist/worker/console/chat/resource-preferences-store.js +1 -1
  30. package/dist/worker/console/chat/routes.js +3 -11
  31. package/dist/worker/console/chat/session-store.js +1 -1
  32. package/dist/worker/console/chat/turn-process.js +2 -10
  33. package/dist/worker/console/chat/user-questions.js +1 -1
  34. package/dist/worker/console/console-update-runtime.js +1 -1
  35. package/dist/worker/console/context-transfer-diagnostics.js +198 -0
  36. package/dist/worker/console/dag-confirmation.js +1 -1
  37. package/dist/worker/console/dag-execution-receipt.js +1 -1
  38. package/dist/worker/console/doctor.js +1 -1
  39. package/dist/worker/console/draft-store.js +1 -1
  40. package/dist/worker/console/human-gate-token.js +1 -1
  41. package/dist/worker/console/index.js +3 -3
  42. package/dist/worker/console/interview/assessment.js +1 -1
  43. package/dist/worker/console/interview/session.js +1 -1
  44. package/dist/worker/console/operation-runner.js +45 -4
  45. package/dist/worker/console/operation-sse.js +1 -1
  46. package/dist/worker/console/operation-wait.js +1 -1
  47. package/dist/worker/console/operator-actions.js +104 -3
  48. package/dist/worker/console/operator-surface-health.js +1 -1
  49. package/dist/worker/console/operator-user-error.js +169 -0
  50. package/dist/worker/console/routes.js +618 -7
  51. package/dist/worker/console/security.js +35 -0
  52. package/dist/worker/console/server.js +4 -2
  53. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Dy71QJp3.js → abnfDiagram-N423BO3Z-DSVcg1YO.js} +1 -1
  54. package/dist/worker/console/static/assets/{arc-M25fNMTE.js → arc-BtXhIqui.js} +1 -1
  55. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CUWlVl1a.js → architectureDiagram-T3A2C74G-B-nh-ilJ.js} +1 -1
  56. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-Dd0Whpx2.js → blockDiagram-VBNYF7ZC-BIUSVdZI.js} +1 -1
  57. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BdfeCkI5.js → c4Diagram-5PPSVZJV-Cmw3L4qM.js} +1 -1
  58. package/dist/worker/console/static/assets/channel-BhZFNefx.js +1 -0
  59. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D_1sUkyD.js → chunk-2GRJ4B5K-CGpMMjGm.js} +1 -1
  60. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-Cxnxf36E.js → chunk-2Q5K7J3B-BNBkEpEJ.js} +1 -1
  61. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-D9RG3G_x.js → chunk-5RXB4S5H-ubln3eaU.js} +1 -1
  62. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-Zz9jgjLX.js → chunk-5VM5RSS4-_XcBTt1i.js} +1 -1
  63. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BCggDRCH.js → chunk-6Q2QTUOP-Ln30Pgrh.js} +1 -1
  64. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CFg-5iAS.js → chunk-GF5L2VYU-ESH3lhSx.js} +1 -1
  65. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-DRQTE8x_.js → chunk-JWPE2WC7-DAJt-qXB.js} +1 -1
  66. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-C_Dw7uZ8.js → chunk-KBJHAD2P-Cx10LIcH.js} +1 -1
  67. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BjIiApsk.js → chunk-RYQCIY6F-CENeOxoJ.js} +1 -1
  68. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-B5XQD4KG.js → chunk-XXDRQBXY-DXqK-D38.js} +1 -1
  69. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Sbv-NJni.js +1 -0
  70. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Sbv-NJni.js +1 -0
  71. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-huHqH6WQ.js → cose-bilkent-JH36ORCC-CE4dmvGY.js} +1 -1
  72. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BSi6yZqP.js → cynefin-VYW2F7L2-CRacN1zK.js} +1 -1
  73. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Bs_Jp31y.js → cynefinDiagram-MW4NZA55-Cneukjrt.js} +1 -1
  74. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CYxavikT.js → dagre-VZM6K2ZE-DPFboRoL.js} +1 -1
  75. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-B6TErl71.js → diagram-7IWD3JNH-DIAQgcOP.js} +1 -1
  76. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-CvH4J2ii.js → diagram-B4RE2ZJO-VrYMKxuy.js} +1 -1
  77. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-v1NBAqXS.js → diagram-LBJQPF4R-CLHvBghn.js} +1 -1
  78. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-CUNHVAn2.js → diagram-Q27KOJAE-DVCWBif8.js} +1 -1
  79. package/dist/worker/console/static/assets/{diagram-UB23O5K3-Dzz1gUu-.js → diagram-UB23O5K3-BTMmbBzJ.js} +1 -1
  80. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CCF8_LjK.js → ebnfDiagram-BXEA7PRR-BUZsKJ56.js} +1 -1
  81. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DObdPVLa.js → erDiagram-JOGREHBK-BsBZ5NXC.js} +1 -1
  82. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DlN8Pxrj.js → flowDiagram-UKHOOZJN-D7fH_kDa.js} +1 -1
  83. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BJKIPTGX.js → ganttDiagram-PKOTCBZU-Bza5OohY.js} +1 -1
  84. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-XcSSnObi.js → gitGraphDiagram-DS77QQ5N-DpkoGR_Y.js} +1 -1
  85. package/dist/worker/console/static/assets/index-Ius3vxhf.css +1 -0
  86. package/dist/worker/console/static/assets/index-yASzcbBr.js +451 -0
  87. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BKrRKMww.js → infoDiagram-6WML65LV-BYm3g6LT.js} +1 -1
  88. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-CN5dk-yb.js → ishikawaDiagram-WSZJBQD7-C2RS_H4v.js} +1 -1
  89. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-B4P4KZ-Y.js → journeyDiagram-NVQOT4AX-B4slKpCo.js} +1 -1
  90. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BRlteP32.js → kanban-definition-27J2QSJJ-B7orRNpI.js} +1 -1
  91. package/dist/worker/console/static/assets/{linear-CG8D9fuL.js → linear-D1BeBxLQ.js} +1 -1
  92. package/dist/worker/console/static/assets/{mermaid.core-BuB6P2rX.js → mermaid.core-0TtMP8k4.js} +5 -5
  93. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DYXGl_DR.js → mindmap-definition-FAOFIHXS-XL5EbCtT.js} +1 -1
  94. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BM48yEVG.js → pegDiagram-VL7TDLO6-CwF7uas5.js} +1 -1
  95. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-mT8NL-Ow.js → pieDiagram-7S7Q4E2Y-A_Jo-72f.js} +1 -1
  96. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-C4pZ6DH_.js → quadrantDiagram-CIZ2JOQS-CxOa4gKL.js} +1 -1
  97. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BKAcr70m.js → railroadDiagram-AXF67PYL-DoAoswIH.js} +1 -1
  98. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-CRxcKpoO.js → requirementDiagram-LRYGKXZP-C1Lc1MlD.js} +1 -1
  99. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Ds4LxQDI.js → sankeyDiagram-W5VNT64P-DFXOkq0U.js} +1 -1
  100. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-CPLwPf_p.js → sequenceDiagram-SI44F4Z6-B0ufUCuW.js} +1 -1
  101. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CL65uij0.js → sizeCapture-X5ZJPWSS-iPbW55g3.js} +1 -1
  102. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-CO0Mgd1W.js → stateDiagram-OKZ733FA-CHiXzEKP.js} +1 -1
  103. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BtMgzo_H.js +1 -0
  104. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-Cxv3TSNw.js → swimlanes-SLNWSIFB-LyFs7TpX.js} +2 -2
  105. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Cb-OVd9Y.js +8 -0
  106. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Dw85f9L2.js → timeline-definition-Z64GVDOM-tNkJnb6z.js} +1 -1
  107. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-B4QLCqCy.js → vennDiagram-T6HMQDX7-DFm7Oo8o.js} +1 -1
  108. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-B_yKCWwn.js → wardleyDiagram-T6FBY63Y-tpblTp9i.js} +1 -1
  109. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-nniBEGv2.js → xychartDiagram-ELKLHX3M-BCDLWR_D.js} +1 -1
  110. package/dist/worker/console/static/index.html +7 -2
  111. package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
  112. package/dist/worker/console/static-src/shell/console-update-reload.js +25 -0
  113. package/dist/worker/console/workspace-context.js +28 -2
  114. package/dist/worker/console/workspace-registry.js +2 -2
  115. package/dist/worker/continuation/worker-continuation.js +278 -0
  116. package/dist/worker/observe/health.js +1 -1
  117. package/dist/worker/observe/node-transparency.js +572 -0
  118. package/dist/worker/observe/routes.js +51 -1
  119. package/dist/worker/observe/static/api.js +69 -5
  120. package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
  121. package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
  122. package/dist/worker/observe/static/state.js +3 -1
  123. package/dist/worker/observe/static/styles.css +1037 -126
  124. package/dist/worker/observe/static/views/dag-inspector.js +1215 -58
  125. package/dist/worker/observe/static/views/session-timeline.js +75 -10
  126. package/dist/worker/outcomes/adapters.js +19 -0
  127. package/dist/worker/outcomes/types.js +1 -0
  128. package/dist/worker/pool/attempt-lease.js +97 -66
  129. package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
  130. package/dist/worker/pool/reconcile.js +46 -1
  131. package/dist/worker/pool/run-store.js +2 -0
  132. package/dist/worker/pool/state-projection.js +2 -0
  133. package/dist/worker/task-spec/workflow-routing.js +8 -3
  134. package/dist/workflows/dag/artifact-bindings.js +149 -0
  135. package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
  136. package/dist/workflows/dag/backend-test-result-contract.js +1 -1
  137. package/dist/workflows/dag/budget-enforcement.js +10 -0
  138. package/dist/workflows/dag/context-receipt.js +305 -0
  139. package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
  140. package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
  141. package/dist/workflows/dag/context-transfer/renderers.js +93 -0
  142. package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
  143. package/dist/workflows/dag/init-hybrid.js +146 -0
  144. package/dist/workflows/dag/node-execution.js +112 -27
  145. package/dist/workflows/dag/path-safety.js +1 -0
  146. package/dist/workflows/dag/prompt.js +29 -4
  147. package/dist/workflows/dag/rerun-plan.js +555 -1
  148. package/dist/workflows/dag/rerun-run.js +601 -15
  149. package/dist/workflows/dag/runner.js +20 -1
  150. package/dist/workflows/dag/skill-snapshot.js +17 -0
  151. package/dist/workflows/dag/types.js +183 -7
  152. package/docs/architecture/runtime-boundaries.md +6 -6
  153. package/docs/architecture/worker-and-feature.md +1 -1
  154. package/docs/templates/agent-dag.schema.json +32 -0
  155. package/docs/templates/product-line/task.yaml +1 -1
  156. package/package.json +3 -1
  157. package/skills/loop-agent/references/command-reference.md +6 -0
  158. package/dist/worker/console/static/assets/channel-Ba0AKiEZ.js +0 -1
  159. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BU3IjVEe.js +0 -1
  160. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BU3IjVEe.js +0 -1
  161. package/dist/worker/console/static/assets/index-CIYzS16i.css +0 -1
  162. package/dist/worker/console/static/assets/index-CS3QOTfl.js +0 -451
  163. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BUewAVYS.js +0 -1
  164. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Bhe67Wjl.js +0 -8
  165. /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
package/CHANGELOG.md CHANGED
@@ -2,19 +2,146 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
- ## [0.40.0] - 2026-08-31
6
-
7
- ### 新增
8
-
9
- - 新增了本发布周期内已经完成并通过验证的功能。
10
-
11
- ### 改进
12
-
13
- - 完善了日常使用体验和运行稳定性。
14
-
15
- ### 修复
16
-
17
- - 修复了影响使用体验或运行稳定性的问题。
5
+ - Console 对话页「轨迹」视图新增每轮遥测头行(对标 DSH「请求 #N」记录):从服务端持久化事件环按轮折叠出步骤数、LLM 时长、首 token 延迟、解码吞吐(tok/s)、工具调用数与耗时、上下行 token(含缓存读/写计入上行)与成本,切到历史会话立即显示;「导出 HTML」同步输出该行。
6
+ - Console 对话页「轨迹」视图「展开」按钮改为按实际溢出显隐:渲染后实测文本宽度并用 ResizeObserver 跟随容器尺寸,拉宽面板后能放下的行不再显示按钮,收窄时自动恢复;展开态恒显「收起」。
7
+ - Console 对话页「轨迹」视图「会话注入」区在服务端冷启动 Pi 会话期间(首次打开历史会话约 1 秒)显示加载占位行,不再空白后突然出现;注入读取失败也会显示错误提示。
8
+ - 修复 Console 对话页轨迹/工具目录数据在多工作区控制台恒为空的问题:capabilities 请求补带 `?workspaceId=`(会话所属工作区优先),工具目录与注入区正常显示 61 个模型可见工具。
9
+ - 修复轨迹遥测只在收到流式事件后才显示的问题:会话切换/激活与重连恢复两条 hydrate 路径现在都会带上按轮遥测数据。
10
+ - Console 对话页「轨迹」视图新增「会话注入」区(对标 DSH SYSTEM 记录):在轨迹顶部展示真实注入 Pi 会话的系统提示词全文(含字符数与注入上下文 suffix)与模型可见工具目录(工具 ID、动作、描述),均可展开/收起;「导出 HTML」同步包含该区块,离线导出也能审查完整注入面。
11
+ - 修复 Console 对话页「轨迹」视图工具行(如 bash)展开后参数与结果仍被截断在 420 字符的问题:展开现在显示完整内容(块内滚动收纳长输出),并复用聊天工具卡同款的结果解包与参数格式化,HTML 导出同步生效。
12
+ - Operator Chat 输入框下方的「调用记录」入口现在会常驻显示;没有记录时显示为 0,发送消息或刷新运行状态时不再突然消失。
13
+ - 初始化选择模型时现在能识别公司内部 `wizard-local` 的 AICoder 型号梯度:`aicoder-default`、`aicoder-plus`、`aicoder-pro`、`aicoder-max` 从左到右能力逐级增强;它会作为选择 LOW/MED/HIGH 的参考,但不会忽略成本和项目需求机械分档。
14
+ - 修复 Operator Chat 左侧栏工作区名称过长时遮挡悬浮「更多」「新建对话」按钮的问题:工作区行改为 flex 行布局,名称过长时单行省略,操作按钮改为行尾占位显示,悬浮背景整行连续无断层。
15
+ - 修复 Console 轨迹视图引用未声明 CSS 自定义属性导致仓库发布门禁失败的问题,补齐品牌色、警告色与字体别名并保持现有视觉回退值。
16
+
17
+ ### 重点更新
18
+
19
+ - Console「更新并初始化」体验修复:设置对话框内嵌实时进度(阶段说明 + 已用时 + 完成摘要,关闭重开对话框不丢进度);接棒重启改为等待新实例就绪后再刷新页面(不再白屏「页面没了」);接棒期间操作记录不再误报为失败(boot reconcile 识别已请求接棒的记录并闭合为成功);补齐更新链路错误码(版本回退/安装失败/运行占用/接棒失败等)的中文语义映射。
20
+
21
+ - 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。
22
+
23
+ - 发布渠道:恢复 npm `beta` 作为 operator 显式手动预览渠道(`x.y.z-beta.N`,dist-tag 固定 `beta`,仅手动发布、不接入 CI、不可晋升 latest);`checkPublishPolicy` / `checkPromotePolicy` 与发布管理文档同步。
24
+
25
+ - 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。
26
+
27
+ - 高风险 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` 边界不变。
28
+
29
+ - 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`,重启后刷新页面即可恢复。
30
+
31
+ - 产物修订/上下文导出七次评审收口:① 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。
32
+
33
+ - 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 不回显命中值。
34
+ - 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。
35
+ - Pi SDK 显式模型解析失败时不再静默退回会话默认模型;Context Receipt 中的 resolved model 与实际执行保持一致。Artifact consumer prompt 使用 frozen binding 注入 run-owned 精确路径,receipt 同时复制 hash-bound 上游文本产物,确保下游可读且导出的 bundle 不依赖归档后失效的 active 路径。
36
+ - Operator Chat 多次输入排队对齐 DSH Web:运行中的连续输入改为持久化 FIFO 队列,不再用后一条覆盖前一条;单条直接展示,多条默认折叠为数量栏,展开后逐行提供内联编辑、删除和插话发送。队列 Dock 使用与 DSH 一致的外层定位与内层面板结构,标题固定、仅消息列表滚动,并在编辑或请求期间锁定折叠操作。编辑/删除以消息 ID + revision 做并发保护,插话复用 Pi `steer` 注入当前回合,其余消息继续按顺序在回合结束后自动发送;队列通过会话快照与 SSE 权威数组恢复,刷新或 Console 重启不丢失。
37
+ - Operator Chat 右侧辅助栏统一上下文与调用记录:输入框的上下文环、调用记录入口现在复用文件/DAG 侧栏;「文件」常驻,「上下文 / 调用记录」按入口临时添加并支持独立 `×` 关闭,关闭后回到文件 Tab;点击已选入口可收起侧栏,切换到上下文时同步开启注入状态,收起时仅关闭注入而保留上下文数据。上下文与工具调用内容改为内嵌布局,不再叠加独立弹窗、遮罩、焦点陷阱或重复关闭按钮,并补充 Tab 切换与侧栏开合动画;修复折叠态右侧展开按钮无法恢复侧栏的问题。
38
+ - Operator Chat 手动 compact 消息流对齐 DSH Web:压缩中在时间线显示状态行,完成后显示默认折叠的 `compact` 摘要边界,点击可展开完整 Markdown 压缩结果;compact 事件通过 SSE 与 session 详情快照双路径恢复,使用事件 ID 去重,刷新/重新进入会话不丢失。Pi compaction 会把摘要写入 session context,后续模型请求继续使用压缩后的上下文。
39
+ - Operator Chat 对齐 DSH Web Todo 能力:新增 `todo_write` 整表替换工具与内容校验,Todo 状态通过会话事件持久化并支持刷新恢复;新一轮开始自动清空,输入框上方展示默认折叠的任务面板(待处理虚线圆环、进行中旋转圆环与完成勾选),消息流使用专用“更新任务清单”摘要行;手动压缩上下文时会把当前完整 Todo 列表合并进压缩指令,避免摘要遗漏仍在执行的任务。
40
+ - Todo 压缩续跑保护:保留 Pi 默认压缩算法,在手动、阈值或上下文溢出压缩成功后的同一轮下一次模型请求前,临时注入当前完整 Todo 内容与状态;下一轮按 DSH 生命周期清空,避免旧任务串入新对话。
41
+ - Operator Chat 的 `ask_user_question` 提问卡片进一步对齐 DSH Web:问题协议新增 Markdown `detail` 说明;选项标签、推荐标记与描述按同一行自然换行,多选仅由 checkbox 表达勾选而不再整行强高亮;自定义回答按单选编辑图标/多选 checkbox 区分,并使用最多六行的镜像自增高输入框;卡片滚动、悬浮/选中动画、窄屏间距和无障碍 tooltip 同步 DSH 行为。
42
+ - 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 原子顺序执行,消除旧作用域请求新路由的竞态窗口。
43
+
44
+ - Operator Console 顶栏以对话页为统一基准:Logo 与工作区入口固定在左侧,「对话 / 操作 / 观测」使用视口居中的三等分胶囊与 190ms 横向滑动选中态;切换页面时复用同一个滑块 DOM 节点,避免顶栏更新中断过渡而闪到终点,也不再因仓库身份、状态胶囊或不同内容宽度发生位移;原“仓库身份”改为消费唯一多工作区控制器的工作区下拉,保持列表顺序,切换后停留在当前主页面,并让对话、操作请求与观测数据继续携带同一 `workspaceId`。
45
+ - Operator Chat 右侧文件工作台对齐 `dsh-better-sidebar@0.16.1`:辅助栏宽度不再受固定 520px 上限限制,拖拽宽度随视口钳制并跨会话持久化;文件打开后采用左侧预览、右侧文件树布局,树宽可在 160–480px 间独立拖动。文件 Tab 内置关闭按钮,「预览 / 源文件」与「新窗口打开」收为右侧紧凑工具区;Tab 悬浮、选中与键盘焦点统一为整行反馈,不再出现文件名和关闭按钮各自高亮;预览滚动条同步模型选择器的低对比细滚动条样式。
46
+ - Operator Chat 工具执行状态进一步对齐 DSH Web:成功后不再显示“完成”标签,错误时以红色状态点和错误首行替换普通图标、参数摘要,运行中以低对比扫光表达状态;Think 与工具行统一为 14/24,Think 正文继承界面正文字体,Bash/代码输出保留 12/18 等宽字体;折叠态显示语义图标、悬浮时切换展开箭头,未知工具使用 Sparkle 图标;状态文字继续通过无障碍文本提供,错误详情仍默认展开,右侧“工具调用记录”诊断面板保持不变。
47
+ - Operator Chat 输入框把模型与推理等级合并为一个 DSH 风格入口:根菜单分为“模型 / 推理等级”,模型仍按供应商分组,`Auto` 同时显示 Pi 当前实际档位。
48
+ - Operator Chat 输入框下方统计栏对齐 DSH Web:移除长期硬编码的 `轮/步 —`、`LLM —`、`首 token —` 等占位,改由服务端从持久会话事件投影真实轮数、步骤数、LLM/工具耗时与 token/cache 汇总,刷新或切换历史会话后仍可恢复;新回复同时记录每个 assistant step 的首 token、解码时长和输出 token,结束后自动刷新并展示平均 TTFT 与 tok/s。展示按 DSH 使用 `|` 分组、组内 `·`,没有可靠证据的整组直接隐藏,超长单行省略并保留完整悬浮文本。
49
+ - Operator Chat 消息流对齐 DSH Web:彻底移除历史回合中的“处理详情”聚合入口以及残留的 `Assistant process` 展示容器,Think、进展、阶段性正文、Bash/Read/Search/Edit/Web/MCP 等工具调用与最终回答作为轮次下的同级节点,按真实事件顺序直接展示;Think 与工具行显式左对齐,不再继承全局按钮的横向居中,运行中 Think 展开、历史 Think 折叠,右侧“工具调用记录”诊断面板继续保留。回答正文、Think、工具行与代码输出同步采用 DSH 的字号和行高基准。
50
+ - Operator Chat Markdown 表格对齐 DSH Web:三列及以下表格在 748px 正文列内自动换行,四列及以上表格扩展利用整个消息视口;宽表静止时不再常驻横向滚动条,只有内容确实溢出且鼠标悬浮或键盘聚焦时才显示,窄视口自动回退为列内安全滚动。
51
+ - 新增源码仓库专用 `npm run console:dev`:浏览器继续固定使用 8790 的真实同源接口与 mutation gate,8790 仅把前端模块代理给内部 loopback Vite;CSS 原地 HMR、TSX 自动整页刷新,后台类型检查不阻塞视觉循环,Console 后端依赖变化只重启受监督源码子进程。正式 build、发布包与 init surface 不变。
52
+ - Operator Chat 左侧会话行按 DSH Web 保留 2px 相邻间距,选中/悬浮背景不再黏连;工作区行隔离鼠标点击焦点,鼠标移开即恢复,仅键盘 `focus-visible` 与打开菜单时保留聚焦反馈;Console mutation gate 修正同端口 `localhost`、`127.0.0.1` 与 `[::1]` 回环别名误判,并把新建会话的安全闸错误转换为可操作中文提示。
53
+ - Operator Chat 左侧工作区与会话的悬浮/键盘聚焦状态改为行级隔离:会话仍归属工作区分组,但悬浮或聚焦会话时不再连带高亮工作区行、切换工作区图标或显示工作区操作按钮;工作区自身的悬浮卡片和菜单保持原行为。
54
+ - Operator Console 收敛为常驻单壳:一级导航改为「对话 / 操作 / 观测」。对话与操作工作区保活不卸载;观测工作区首次动态挂载 `inspect-workspace.js`,切走 `setActive(false)` 暂停轮询。对话模式没有二级页签时直接隐藏空标签带与折叠按钮,不覆盖操作/观测已有的折叠偏好。产品观测入口(Night 深链、Recovery 全屏、InspectSplitPanel、对话卡片)一律写入 Console canonical hash(`/#/inspect...`),独立 `/inspect/#/...` 仅作兼容入口。
55
+ - Console DAG 检查器「提示词重启」面板改为与检查器一致的卡片层级:版本选择复用自定义下拉;编辑模式与页签同款分段按钮;提交按钮用品牌橙药丸并吸底;追加/替换编辑区放到底稿前面,长底稿默认折叠以免把操作挤出视口。
56
+ - 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` 识别实例。
57
+ - 修复 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 横幅。
58
+ - Operator Chat 输入框两项交互增强:① **↑/↓ 历史输入召回**——每次发送的文本进入输入历史(连续重复折叠、上限 100 条),光标在首行按 ↑ 逐条向旧回溯、按 ↓ 向新前进,越过最新一条时恢复回溯前**未发送的草稿**(草稿不会被历史浏览冲掉);多行文本中部的方向键仍是普通光标移动,IME 组词与 @文件/命令面板打开时不抢占。② **运行中排队下一轮指令**——当前回合运行中 Enter 不再被吞掉,消息作为「排队消息」绑定当前 Turn(服务端 `PUT deferred-turn` 从仅限 stopping 放开为 running/stopping,错误码 `TURN_NOT_STOPPING`→`TURN_NOT_ACTIVE`),当前回合结束(正常完成或停止)后自动发送;排队条提供「立即发送」(停止当前回复并立即发出)、「编辑」(移回输入框改写后再排)、「删除」三种操作,运行中输入框右侧提供排队发送按钮(与停止按钮并列);排队条单行展示(状态 + 省略号预览 + 操作按钮一行),输入框默认一行高(自动增高上限 280px 不变)。
59
+ - 向导「运行」面板结构化与预期管理(A2/C9):新增实时运行进度块——节点完成计数与百分比进度条(含 progressbar 无障碍语义)、当前运行节点名称与已运行时长、失败节点与错误摘要,数据来自 `/api/dag-runs/:id` 每 5 秒轮询并在终态自动停止;`effectiveStatus=running-suspected-stall` 时显示橙色「疑似停滞」提示条(建议打开检视查看节点活动或到恢复页协作中止/诊断),把 20–40 分钟长跑的「日志噪音等待」变为有阶段感、可判断的等待。原始 SSE 事件日志默认折叠为「原始事件日志(最近 80 条)」,需要排查时再展开。
60
+ - 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 秒。
61
+ - Console 对话页 Models 面板的模型管理增强:以弹框形式增/改/删 Pi 的模型条目,支持 6 个定义字段(id、name、contextWindow、maxTokens、input、reasoning)。新增时 Provider 用下拉选择、其余字段自动补默认值;编辑时 Provider 只读且仅在原位置就地替换,只改表单内字段、不覆盖配置里页面未展示的其它字段(如 cost/compat);不读写 API key(凭据走 Pi CLI)。编辑已存在的模型不再被移到最后。(该能力仅在对话页提供,设置页不再重复入口。)
62
+ - 修复 `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`。)
63
+ - 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`。)
64
+ - 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`)。
65
+ - 前端风险分级细分 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` 拒绝信号,审计可溯。
66
+ - 前端验证 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 无法走完绿灯链。
67
+ - 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。
68
+ - `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。
69
+ - 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 恢复可见断言路径。
70
+ - Inspect 异常 Task 页空态文案统一(B-FIND-02):`failures.js` 运行时空态由 `当前没有失败或阻塞的 Task。` 改回与静态 `#failures-empty`、页面标题及回归目录 AC-FE-INS-004 一致的 `当前没有异常 Task`,消除静态/运行时文案漂移;实测新文案 find 1 命中、旧文案 0 命中。
71
+
72
+ - `next-release.yml` 防重复发布守卫补充幂等语义:`mode=recover`(dist-tags.next 已指向出自本 HEAD 的 tarball)时,手动 `workflow_dispatch` 重入不再撞 duplicate publish 硬失败,改为写 summary 后干净退出(§5.1 规则 4);非 recover 的重复发布仍硬失败。
73
+
74
+ - 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 可继承。
75
+ - 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` 的归一化映射。
76
+ - 将 `@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、发布包契约测试与安装/本地环境说明同步对齐。
77
+ - 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 及其派生槽位。
78
+ - 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 同步。
79
+
80
+ - Console「Pi 插件」增强:已安装插件显示实际安装版本;安装时提供版本下拉(从 npm 配置的仓库拉取该包全部已发布版本,默认装最新);版本号带 `@version` 的已装包(如 `npm:pi-lens@3.8.72`)也能被正确识别为已安装。
81
+ - Console「Pi 插件」的版本号改为从 **npm 配置的仓库地址**(`npm config get registry`)拉取,不再硬编码官方源,内网镜像可用;安装/卸载进度条改用 JS(requestAnimationFrame)驱动,不受系统「减少动态效果」影响,任何环境都显示滑动动画。
82
+ - Console「操作」页的「Pi 插件」从「设置」页提升为与「设置」同级的独立 tab(`/#/operate/pi-plugins`):共享壳操作导航新增入口,独立子面板承载插件目录/搜索/分页/一键安装卸载。
83
+ - Console 设置页新增「Pi 插件」区块:内置一份经 npm 校验的插件目录(6303 个,仅展示 5562 个可安装、含中文说明),支持搜索、每页条数(10/20/50/100)、分页、一键安装/卸载(调用 `pi install/remove`,全局 `~/.pi/agent`),安装/卸载带进度过渡与结果提示。
84
+ - 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>`(置于子命令前)约定。
85
+ - `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` 可直接调用。
86
+ - Console 对话页「轨迹」视图响应式优化:轨迹列宽跟随面板实际宽度收缩(`.oc-trajectory` 加 `width:100%`、`.oc-trajectory-turn/.step` 加 `min-width:0` 修 flex 收缩链),窄窗口(≤720px)自动隐藏耗时列,避免工具行被固定项挤爆。
87
+ - Console 对话页新增「轨迹」视图(详情侧栏 tab):仿 DSH ui-trajectory,用本仓库 turnGroups 数据把对话按「用户 → 过程 → AI 回复」渲染成统一单元格列表,每行带 kind 标签 + 图标(用户/ AI / 思考 / 工具 / 活动 / 错误 / 压缩);用户与 AI 用标签颜色 + 图标区分,AI 中间文本也标注;思考、工具、以及超长用户/AI 消息默认单行截断、可展开/收起看全文(含工具参数与结果、状态与耗时)。支持一键「导出 HTML」自包含文件(长内容用 `<details>` 折叠,短内容内联)。主会话思考块标签由英文 Think 改为「思考」。
88
+ - 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。
89
+ - Operator Chat 新增持续目标模式:可以用 `/goal` 或输入框上方的目标条创建跨多个回合推进的目标,并随时暂停、继续、编辑或清除;刷新后仍能看到目标,但重启 Console 后不会未经确认自行续跑。
90
+ - Operator Chat 现在可以在同一个页面管理多个工作区;每个会话始终使用创建它的工作区,切换对话时地址栏保持简洁稳定。
91
+ - 对话消息流整体调整为更紧凑、清晰的布局,思考过程、工具执行、阶段性结果和最终回答会按真实发生顺序展示。
92
+ - 上下文过大时会自动压缩并继续原请求,消息流会依次展示触发原因、压缩进度和压缩结果;手动压缩也使用同一套展示方式。
93
+ - Operator Chat 与 DAG Pi 节点默认开启上下文压力处理:发送前接近窗口时压缩一次、识别网关「请求上下文过大」后压缩续跑,并对 OpenAI 格式的大工具输出做线路压缩;可用环境变量关闭,不必改会话记录。
94
+ - 对话进行中可以连续提交多条消息,并支持编辑、删除或立即插入当前回复;刷新页面或重启 Console 后,未发送内容仍会保留。
95
+
96
+ ### 新增
97
+
98
+ - 模型可以读取、创建和更新当前会话的持续目标;长任务会在安全轮数内自动续行,优先处理用户排队消息,并在 DAG 或其他运行结束后再继续。上下文压缩后,当前目标也会自动回到模型上下文中。
99
+ - 右侧辅助栏统一承载文件、上下文、调用记录、运行活动和当前 DAG;点击消息流中的运行状态即可在同一侧栏查看运行、门禁与产物,并可自由调整侧栏宽度。
100
+ - 新增任务清单与结构化提问卡片,让长任务的进度和需要用户选择的内容更容易理解。
101
+ - 「对话 / 操作 / 观测」使用统一导航;操作和观测页面可以切换工作区查看对应数据。
102
+
103
+ ### 改进
104
+
105
+ - Operator Chat 发送前会在接近模型窗口时主动压缩,压缩失败仍发送当前输入,不会把消息丢掉。DAG 节点同步启用 overflow 识别与线路压缩,但不在 streaming 中主动 compact。
106
+ - 网关「请求上下文过大」及常见包装/嵌套 JSON 由共享分类器识别;目标项目 `loop-agent init` 生成的 Pi overflow extension 与控制器使用同一套短语表。
107
+ - `@agent-context/sift@0.0.1-alpha.6` 作为可选依赖接入 Console 与 DAG:默认开启,`HARNESS_CONSOLE_SIFT` / `HARNESS_DAG_SIFT` 设为 `0`、`false` 或 `off` 即可关闭。Anthropic 缺省 prompt cache 形态保持 no-op,避免破坏缓存。
108
+ - 后端测试的计划与生成阶段只读取任务明确绑定的需求、环境报告和本轮产物,减少无关仓库内容干扰结果,并让后续步骤继续使用同一份已确认计划。
109
+ - Operator Chat 的任务清单工具描述补齐多步骤与 DAG 使用纪律:开始前按具体步骤规划、保持进行中约束、完成后立即更新完整列表,并用面向用户的阶段呈现 DAG 进度,简单任务自动跳过。
110
+ - 右侧文件工作台打开 `.html` 或 `.htm` 文件时默认直接预览:沙箱会完整加载页面及同项目的相对样式、图片和字体,同时阻止脚本及外部网络访问;大体积源码不再直接报错,而是展示前 512 KiB 并清晰提示内容已截断。
111
+ - 排队消息改为由输入框上方的队列面板统一展示;正常排队、撤回和删除不再反复弹出提示,当前会话也不再显示重复的“待发送”,其他会话只保留低调的排队数量。
112
+ - 正式发布会自动同步更新版本日志和文档站摘要;发布说明优先生成简洁自然的中文,生成服务不可用时也能安全完成发布。
113
+ - 输入框整合模型与推理等级选择,并只展示有真实数据的轮次、耗时、速度和缓存统计。
114
+ - 工作区、会话列表、文件标签和侧栏交互更加紧凑自然,折叠、切换和页面过渡更加流畅。
115
+ - 左侧多个工作区可以独立展开;展开工作区不再切换当前作用域,跨工作区打开会话时也不会闪出错误的空列表。
116
+ - 多个 Console 同时运行时会安全合并工作区增删,并把变更实时同步到已打开的页面,避免旧缓存覆盖新工作区。
117
+ - 设置页改用自然中文展示当前工作区的模型状态,减少内部状态和重复信息。
118
+ - DAG 检查器简化节点说明、执行记录和提示词重启面板,长内容更容易阅读和定位。
119
+
120
+ ### 修复
121
+
122
+ - 修复 backend-test 将 no-body Case 的 `Payload Required Paths: none` / `Payload Allowed Paths: none` 中空值标记误识别为 JSON 字段路径、继而把全部 pytest items 判为 payload `UNSAFE` 并排除的问题;独立 empty sentinel 现在归一化为空集合,真实 required path 冲突仍保持 fail-closed。
123
+ - 修复 Console「更新并初始化」被观测顶栏挡住、看起来像从 DAG 详情消失的问题:入口改到操作 → 设置,观测与对话页不再挂全局悬浮按钮。
124
+ - 修复从恢复打开全屏观测时,长 DAG run id 把「返回 恢复」顶进居中模式开关底下、按钮显示不全的问题;上下文 chip 改到顶栏下方独立一行,过长 id 省略、按钮不收缩。
125
+ - 修复 Console 内嵌观测后样式泄漏到对话/操作、观测顶栏丢失新鲜度与 Pi 状态、从恢复打开观测看不到「返回 恢复」、以及检查器盖住一级导航的问题;对话里的观测链接改为壳内地址。
126
+ - 修复 Console 内嵌观测丢失「提示词重启」入口、Remixicon 图标和产品深链的问题:托管观测从 `/inspect/` 响应解析 scoped token,不把该凭据写入 Console HTML。
127
+ - 修复 backend-test 的 Scenario Partition 虽声明 Domain/slot kinds、却未把展开后的精确 `TP-SP-*` 清单交给 Markdown writer,导致 Case 只生成普通别名 TP 并被 N6 全量判缺的问题;Plan 现在把每个 exact slot 逐字写入绑定 Coverage Matrix Rule,Markdown生成与同步节点返回前执行 exact-set 审计,普通别名和 `SINGLE`/`MULTIPLE` 不再替代 partition slots。
128
+ - 修复 backend-test 的 Scenario Partition 计划表只提示 `each-value`/`omitted`、却由下游确定性门禁强制要求 `not-in-set` 的合同漂移;计划、Markdown Case 与 pytest 现在统一明确唯一补集槽位,避免 PI 因表格指令遗漏 `TP-<Partition ID>-NOT-IN-SET` 后触发 `MISSING_COMPLEMENT_SLOT`。
129
+ - 修复文档审计扫描本地 `.scratch/` 临时证据与打包目录、导致仓库 preflight 和发布前验证被非治理文件阻断的问题。
130
+ - 修复 backend-test 把 Markdown 明确声明的 enum-invalid、wrong-type、null、empty 和精确非法 custom literal 当作 payload enum 契约漂移、错误消耗唯一一次 pytest repair 的问题;豁免现在按 pytest parameter ID、目标字段和值逐 TP 绑定,positive/nominal drift 与 path 缺陷仍严格阻断。
131
+ - 修复 backend-test 无法从同一生成模块的安全 payload helper 中绑定 field-target positional/keyword/default 参数,以及无法识别精确 `_without(payload, field)` 删除语义的问题;computed、动态、二层、跨模块和危险 helper 仍保持 `UNDETERMINED`。
132
+ - 修复 backend-test 无法静态证明同一生成模块内安全 payload helper、导致 request-level nominal 场景长期停留在 `UNDETERMINED` 的问题;超长边界 observed 现在持久化为有界摘要并保留真实长度,空白修复建议也明确使用真实空格而非字面 escape 文本。
133
+ - 修复 backend-test 把 Markdown 中 `\\u0020`/`\\x20` 空白表示与 pytest 真实空白字符串误判为 scenario-param 不一致的问题;readiness 的逐项排除现在携带有界的 TP、字段、expected/observed raw/normalized 和源码位置诊断,同时不对普通业务字符做 trim、大小写折叠或宽松解码。
134
+ - 修复 Console 把 backend-test writer 的局部保护文件误判为整个 writeSet 越界的问题;任务级禁止路径仍保持硬阻断,合法 DAG 可继续取得 autonomous execution receipt。
135
+ - 修复 backend-test 对 `resource_client.call(..., payload=...)` 一类本地 transport 的 payload AST 假阴性;readiness 新增固定分类/Case 排除汇总和 pytest 启动事实,payload repair finding 同时携带 expected/observed/missing path 清单。
136
+ - 修复后端测试在 payload、fixture 与 Markdown→pytest 对应关系同时异常时只修复其中一类问题的问题;pytest 侧缺陷现在通过结构化 `repairFindings` 合并进入唯一一次有界 repair,Markdown Test Point 未分类或重复分类则在生成阶段定向重试并禁止下游猜修。
137
+ - 修复重命名会话时输入框没有回显当前标题的问题。
138
+ - 修复自动压缩提示长期停在输入框上方、恢复输出跑到压缩前面,以及回复文字在工具出现时突然跳位的问题;消息流会按顺序保留模型提供商的原始错误、压缩过程和恢复结果,刷新后也保持一致。
139
+ - 工作区列表支持像 DSH Web 一样上下拖动调整顺序;新的顺序会自动保存,刷新页面或重新启动看板后仍然保持。
140
+ - 修复多工作区下已有会话只显示在对话正文、却没有出现在左侧列表的问题;会话会稳定归属到创建它的工作区,旧会话也会自动恢复到列表中。
141
+ - 会话列表改为独立的全局目录:启动时一次恢复历史归属,之后随会话变化实时更新;移除工作区不会删除或隐藏其中的会话,它们会保留在“未归类”中并可继续打开。
142
+ - 修复停止回复后输入区恢复迟缓、排队消息偶发丢失,以及切换会话后旧状态残留的问题。
143
+ - 修复宽表格、文件预览、滚动条和窄屏布局中的多处显示异常。
144
+ - 修复部分 Windows 环境读取运行状态时的偶发失败,并提高前后端任务验证的可靠性。
18
145
 
19
146
  ## [0.39.3] - 2026-08-28
20
147
 
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.40.0",
4
- "gitSha": "0d5709685941d99bb7d5870be034691e28a55b78",
5
- "builtAt": "2026-08-31T00:50:21.960Z"
3
+ "version": "0.41.0-beta.1",
4
+ "gitSha": "925a696cedc24be3ff8a714b2d03fb0e9e3b8da1",
5
+ "builtAt": "2026-08-31T03:30:41.864Z"
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
@@ -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);