@tea-agent/loop-agent 0.42.0-next.9 → 0.42.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 (236) hide show
  1. package/CHANGELOG.md +111 -45
  2. package/dist/application/dag/run-dag.js +8 -2
  3. package/dist/application/evaluation/budget.js +19 -1
  4. package/dist/application/task-lifecycle/advance.js +26 -8
  5. package/dist/application/task-lifecycle/observe.js +43 -29
  6. package/dist/application/task-lifecycle/plan-transitions.js +5 -4
  7. package/dist/build-stamp.json +3 -3
  8. package/dist/cli/program.js +1 -1
  9. package/dist/commands/dag-rerun-task.js +2 -0
  10. package/dist/commands/task-source-prepare.js +3 -1
  11. package/dist/executors/dag-pi-executor.js +2584 -600
  12. package/dist/executors/pi-executor.js +22 -1
  13. package/dist/executors/pi-extension-resolver.js +14 -2
  14. package/dist/executors/pi-sdk-executor.js +140 -39
  15. package/dist/executors/shell-executor.js +135 -55
  16. package/dist/shared/dag-failure-category.js +6 -0
  17. package/dist/shared/frontend-execution-policy.js +23 -0
  18. package/dist/task/config-types.js +4 -0
  19. package/dist/task/contract/apply.js +36 -2
  20. package/dist/task/source-prepare/ledger-reconciliation.js +2 -2
  21. package/dist/task/source-prepare/ledger-review.js +6 -9
  22. package/dist/task/source-prepare/parse-intent.js +7 -0
  23. package/dist/task/source-prepare/semantic-intake.js +16 -26
  24. package/dist/task/source-prepare/source-fidelity-pi.js +28 -9
  25. package/dist/task/source-references.js +48 -23
  26. package/dist/worker/console/chat/assistant-content.js +23 -2
  27. package/dist/worker/console/chat/browser-policy.js +143 -0
  28. package/dist/worker/console/chat/browser-routes.js +148 -0
  29. package/dist/worker/console/chat/chat-event-store.js +4 -2
  30. package/dist/worker/console/chat/explore-tools.js +13 -0
  31. package/dist/worker/console/chat/pi-runtime.js +173 -94
  32. package/dist/worker/console/chat/resource-loader.js +4 -1
  33. package/dist/worker/console/chat/routes.js +208 -66
  34. package/dist/worker/console/chat/scm-routes.js +217 -0
  35. package/dist/worker/console/chat/scm-service.js +283 -0
  36. package/dist/worker/console/chat/scm-tools.js +111 -0
  37. package/dist/worker/console/chat/sdd-data-alignment.js +78 -11
  38. package/dist/worker/console/chat/session-catalog.js +32 -0
  39. package/dist/worker/console/chat/session-mode-view.js +48 -0
  40. package/dist/worker/console/chat/session-mode.js +218 -0
  41. package/dist/worker/console/chat/session-store.js +27 -7
  42. package/dist/worker/console/chat/shortcuts.js +6 -0
  43. package/dist/worker/console/chat/subagents/agent-tool.js +62 -0
  44. package/dist/worker/console/chat/subagents/explore-agent.js +169 -0
  45. package/dist/worker/console/chat/subagents/index.js +5 -0
  46. package/dist/worker/console/chat/subagents/orchestrator.js +273 -0
  47. package/dist/worker/console/chat/subagents/tool-policy.js +53 -0
  48. package/dist/worker/console/chat/subagents/types.js +13 -0
  49. package/dist/worker/console/chat/terminal-routes.js +216 -0
  50. package/dist/worker/console/chat/terminal-sessions.js +284 -0
  51. package/dist/worker/console/chat/terminal-tools.js +199 -0
  52. package/dist/worker/console/chat/tool-preview.js +21 -0
  53. package/dist/worker/console/chat/tools.js +13 -1
  54. package/dist/worker/console/chat/turn-process.js +1 -0
  55. package/dist/worker/console/interview/tools.js +1 -0
  56. package/dist/worker/console/server.js +2 -28
  57. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C6n9_m0P.js → abnfDiagram-N423BO3Z-C9eI7nEo.js} +1 -1
  58. package/dist/worker/console/static/assets/{arc-DQh-IfZ1.js → arc-VJWsxWhB.js} +1 -1
  59. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-54NnrwUC.js → architectureDiagram-T3A2C74G-BGcyiMSo.js} +1 -1
  60. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-pivRALGK.js → blockDiagram-VBNYF7ZC-BScnFwyi.js} +1 -1
  61. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BR7OV2NJ.js → c4Diagram-5PPSVZJV-Bl9_BsLi.js} +1 -1
  62. package/dist/worker/console/static/assets/channel-B6sQYuOE.js +1 -0
  63. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-B1Aq6BcK.js → chunk-2GRJ4B5K-F1uKxiUt.js} +1 -1
  64. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-CbdU0rjo.js → chunk-2Q5K7J3B-rSRMynVu.js} +1 -1
  65. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-Dqi2GJeD.js → chunk-5RXB4S5H-DAsJm1WD.js} +1 -1
  66. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BYn1Hu4R.js → chunk-5VM5RSS4-DQIdVI0a.js} +1 -1
  67. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DRLjDL0k.js → chunk-6Q2QTUOP-4A_8rJ-Q.js} +1 -1
  68. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CY9Xx2jV.js → chunk-GF5L2VYU-BHnT-vjh.js} +1 -1
  69. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BNCZs7_z.js → chunk-JWPE2WC7-Rq7QKBkn.js} +1 -1
  70. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DZ8AStLL.js → chunk-KBJHAD2P-BXh-AI2u.js} +1 -1
  71. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DsxjYrzz.js → chunk-RYQCIY6F-BblcLy8m.js} +1 -1
  72. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-Ddx1KC1l.js → chunk-XXDRQBXY-zHZmVnB6.js} +1 -1
  73. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Z6s5QoeI.js +1 -0
  74. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Z6s5QoeI.js +1 -0
  75. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-W9TveCnK.js → cose-bilkent-JH36ORCC-Cmwz0Wi4.js} +1 -1
  76. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-l9j_ztZH.js → cynefin-VYW2F7L2-Dq76MHQU.js} +1 -1
  77. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-BMJMKi4G.js → cynefinDiagram-MW4NZA55-zPahV1fM.js} +1 -1
  78. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-Bb4mG9pH.js → dagre-VZM6K2ZE-DQJ3xPc_.js} +1 -1
  79. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BMgL_Qv0.js → diagram-7IWD3JNH-BwX7u6fv.js} +1 -1
  80. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Bvo2T4OQ.js → diagram-B4RE2ZJO-CodnDCco.js} +1 -1
  81. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-_5kWRN9c.js → diagram-LBJQPF4R-gAjtWkxG.js} +1 -1
  82. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DqdMrltM.js → diagram-Q27KOJAE-CGCqz0cS.js} +1 -1
  83. package/dist/worker/console/static/assets/{diagram-UB23O5K3-CDDYsNkp.js → diagram-UB23O5K3-RHwYEywd.js} +1 -1
  84. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-c4nfnZUV.js → ebnfDiagram-BXEA7PRR-B6seb_p_.js} +1 -1
  85. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DnkUcNMs.js → erDiagram-JOGREHBK-CmwCKYe8.js} +1 -1
  86. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-Dz0KGLZE.js → flowDiagram-UKHOOZJN-BfNsaZ0V.js} +1 -1
  87. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Cj1t1uka.js → ganttDiagram-PKOTCBZU-zmYgi_Z3.js} +1 -1
  88. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-tp2FrBHd.js → gitGraphDiagram-DS77QQ5N-BDEzzSKF.js} +1 -1
  89. package/dist/worker/console/static/assets/index-DgenUAfc.js +468 -0
  90. package/dist/worker/console/static/assets/index-aF4u-Y__.css +1 -0
  91. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DQwJS8DH.js → infoDiagram-6WML65LV-DeSz8l42.js} +1 -1
  92. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-eimCQWD4.js → ishikawaDiagram-WSZJBQD7-B1LV29aH.js} +1 -1
  93. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-Dd9Gbwgv.js → journeyDiagram-NVQOT4AX-CCw4W2oU.js} +1 -1
  94. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-Qve3cyft.js → kanban-definition-27J2QSJJ-BozaMoRJ.js} +1 -1
  95. package/dist/worker/console/static/assets/{linear-UXKSe36Z.js → linear-G1JR40SX.js} +1 -1
  96. package/dist/worker/console/static/assets/{mermaid.core-CWhj4JXN.js → mermaid.core-CCgPF0oA.js} +5 -5
  97. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-yTcwf4SJ.js → mindmap-definition-FAOFIHXS-CEqnCHnD.js} +1 -1
  98. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-_7qToaZP.js → pegDiagram-VL7TDLO6-DpmQPKuI.js} +1 -1
  99. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-CXmrKmDm.js → pieDiagram-7S7Q4E2Y-BP501AxR.js} +1 -1
  100. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-hMmrJyaS.js → quadrantDiagram-CIZ2JOQS-D1dBhl_A.js} +1 -1
  101. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BXw8tCBe.js → railroadDiagram-AXF67PYL-DgZDS5pY.js} +1 -1
  102. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BmjgnLZl.js → requirementDiagram-LRYGKXZP-BzB3pyIq.js} +1 -1
  103. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Bj77SPpN.js → sankeyDiagram-W5VNT64P-B9ZprFFP.js} +1 -1
  104. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-B2FDVysL.js → sequenceDiagram-SI44F4Z6-CC2-_XrA.js} +1 -1
  105. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-UChNY9ZZ.js → sizeCapture-X5ZJPWSS-UVtAUqgB.js} +1 -1
  106. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-wbAEkbd7.js → stateDiagram-OKZ733FA-CWcS5JYG.js} +1 -1
  107. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BooX8u1Q.js +1 -0
  108. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DCEkU8HR.js → swimlanes-SLNWSIFB-C4p-dn06.js} +2 -2
  109. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D64_eqqE.js +8 -0
  110. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-BGp7H06U.js → timeline-definition-Z64GVDOM-Dnz52OHX.js} +1 -1
  111. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-DsCIQuWR.js → vennDiagram-T6HMQDX7-CzTE0Nfu.js} +1 -1
  112. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-cRZLP4Xe.js → wardleyDiagram-T6FBY63Y-NAR9cjQQ.js} +1 -1
  113. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CP0xLR9Y.js → xychartDiagram-ELKLHX3M-DVMk8413.js} +1 -1
  114. package/dist/worker/console/static/index.html +2 -2
  115. package/dist/worker/console/static-src/chat-view-types.js +1 -1
  116. package/dist/worker/console/static-src/operator-chat/chat-link.js +94 -0
  117. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +142 -7
  118. package/dist/worker/console/static-src/operator-chat/pending-user-message.js +44 -0
  119. package/dist/worker/console/static-src/operator-chat/process-label.js +41 -0
  120. package/dist/worker/console/static-src/operator-chat/tools-catalog.js +21 -2
  121. package/dist/worker/console/static-src/operator-chat/turn-group-equality.js +13 -0
  122. package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +2 -0
  123. package/dist/worker/console/static-src/operator-chat/use-searchable-hidden.js +51 -0
  124. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +33 -18
  125. package/dist/worker/console/static-src/operator-chat/useChatStream.js +48 -16
  126. package/dist/worker/console/static-src/operator-chat/useChatThread.js +170 -7
  127. package/dist/worker/console/static-src/operator-chat/useComposer.js +13 -7
  128. package/dist/worker/console/static-src/operator-chat/user-turn-anchor-equality.js +21 -0
  129. package/dist/worker/console/static-src/shell/workspace-route.js +4 -0
  130. package/dist/worker/console/workspace-context.js +15 -1
  131. package/dist/worker/observe/node-transparency.js +81 -72
  132. package/dist/worker/observe/routes.js +20 -1
  133. package/dist/worker/observe/static/constants.js +22 -22
  134. package/dist/worker/observe/static/dag-context-reason-labels.js +19 -0
  135. package/dist/worker/observe/static/dag-history-labels.js +1 -0
  136. package/dist/worker/observe/static/dag-inspector-humanize.d.ts +16 -0
  137. package/dist/worker/observe/static/dag-inspector-humanize.js +342 -0
  138. package/dist/worker/observe/static/dag-node-purpose.js +10 -10
  139. package/dist/worker/observe/static/dom.js +20 -1
  140. package/dist/worker/observe/static/format-pool.d.ts +2 -0
  141. package/dist/worker/observe/static/format-pool.js +6 -0
  142. package/dist/worker/observe/static/format.js +7 -0
  143. package/dist/worker/observe/static/index.html +4 -4
  144. package/dist/worker/observe/static/inspect-workspace.js +34 -7
  145. package/dist/worker/observe/static/inspector-submission.js +32 -0
  146. package/dist/worker/observe/static/kpi.js +1 -0
  147. package/dist/worker/observe/static/prompt-restart-candidates.js +4 -2
  148. package/dist/worker/observe/static/relations.js +7 -5
  149. package/dist/worker/observe/static/router.js +13 -0
  150. package/dist/worker/observe/static/run-processing.js +2 -0
  151. package/dist/worker/observe/static/shell-chrome.js +36 -3
  152. package/dist/worker/observe/static/state.js +35 -2
  153. package/dist/worker/observe/static/styles.css +431 -39
  154. package/dist/worker/observe/static/task-failure-labels.d.ts +4 -0
  155. package/dist/worker/observe/static/task-failure-labels.js +67 -0
  156. package/dist/worker/observe/static/task-history.js +12 -0
  157. package/dist/worker/observe/static/views/batch.js +6 -13
  158. package/dist/worker/observe/static/views/dag-graph.js +51 -4
  159. package/dist/worker/observe/static/views/dag-inspector.js +1069 -426
  160. package/dist/worker/observe/static/views/dag-trajectory.js +3 -0
  161. package/dist/worker/observe/static/views/dag.d.ts +6 -0
  162. package/dist/worker/observe/static/views/dag.js +64 -22
  163. package/dist/worker/observe/static/views/dags.js +2 -0
  164. package/dist/worker/observe/static/views/dashboard.js +21 -12
  165. package/dist/worker/observe/static/views/failures.js +21 -11
  166. package/dist/worker/observe/static/views/feature.js +11 -29
  167. package/dist/worker/observe/static/views/pool.js +37 -28
  168. package/dist/worker/observe/static/views/run.js +48 -5
  169. package/dist/worker/observe/static/views/session-timeline.js +194 -243
  170. package/dist/worker/observe/static/views/task.js +81 -62
  171. package/dist/workflows/dag/backend-test-plan-protocol.js +104 -0
  172. package/dist/workflows/dag/budget-enforcement.js +53 -3
  173. package/dist/workflows/dag/dag-retry-schema.js +3 -0
  174. package/dist/workflows/dag/frontend-capacity.js +9 -0
  175. package/dist/workflows/dag/frontend-contract-facts.js +130 -0
  176. package/dist/workflows/dag/frontend-design-policy.js +103 -17
  177. package/dist/workflows/dag/frontend-durable-tools.js +193 -0
  178. package/dist/workflows/dag/frontend-execution-groups.js +24 -0
  179. package/dist/workflows/dag/frontend-implementation-contract.js +423 -41
  180. package/dist/workflows/dag/frontend-input-projection.js +76 -0
  181. package/dist/workflows/dag/frontend-plan-completeness.js +186 -0
  182. package/dist/workflows/dag/frontend-plan-recovery-policy.js +18 -0
  183. package/dist/workflows/dag/frontend-plan-render.js +21 -3
  184. package/dist/workflows/dag/frontend-prewrite-gate.js +1 -1
  185. package/dist/workflows/dag/frontend-recovery-controller.js +32 -8
  186. package/dist/workflows/dag/frontend-recovery-lineage.js +13 -0
  187. package/dist/workflows/dag/frontend-recovery-plan.js +4 -1
  188. package/dist/workflows/dag/frontend-recovery-run.js +146 -16
  189. package/dist/workflows/dag/frontend-review-scopes.js +139 -0
  190. package/dist/workflows/dag/frontend-risk.js +2 -0
  191. package/dist/workflows/dag/frontend-session-budget.js +249 -0
  192. package/dist/workflows/dag/frontend-shadow-dual-write.js +37 -3
  193. package/dist/workflows/dag/frontend-shape-facts.js +12 -2
  194. package/dist/workflows/dag/frontend-shape.js +46 -7
  195. package/dist/workflows/dag/frontend-test-execution-evidence.js +49 -0
  196. package/dist/workflows/dag/frontend-typed-event-store.js +14 -0
  197. package/dist/workflows/dag/frontend-verification-trace.js +38 -4
  198. package/dist/workflows/dag/frontend-writer-admission.js +2 -2
  199. package/dist/workflows/dag/init-hybrid.js +70 -35
  200. package/dist/workflows/dag/node-execution.js +225 -226
  201. package/dist/workflows/dag/prompt.js +4 -0
  202. package/dist/workflows/dag/recovery-lease.js +106 -16
  203. package/dist/workflows/dag/rerun-feedback.js +1 -0
  204. package/dist/workflows/dag/rerun-plan.js +96 -4
  205. package/dist/workflows/dag/rerun-run.js +28 -6
  206. package/dist/workflows/dag/rerun-task.js +221 -18
  207. package/dist/workflows/dag/retry-policy.js +27 -10
  208. package/dist/workflows/dag/runner-exit-diagnostics.js +125 -0
  209. package/dist/workflows/dag/runner.js +246 -19
  210. package/dist/workflows/dag/structured-output-repair.js +4 -1
  211. package/dist/workflows/dag/types.js +10 -3
  212. package/dist/workflows/dag/validate.js +10 -8
  213. package/dist/workflows/dag/workspace-checkpoint.js +66 -0
  214. package/docs/operations/README.md +2 -0
  215. package/docs/templates/agent-dag.schema.json +2 -2
  216. package/docs/templates/backend-test-dag.json +6 -4
  217. package/docs/templates/frontend-design-contract.md +4 -4
  218. package/docs/templates/frontend-implementation-contract.schema.json +68 -4
  219. package/docs/templates/frontend-implementation-dag.json +5 -5
  220. package/harness.json +1 -1
  221. package/package.json +8 -6
  222. package/skills/frontend-contract/SKILL.md +2 -1
  223. package/skills/frontend-contract/references/contract-protocol.md +19 -3
  224. package/skills/frontend-design-review/SKILL.md +12 -11
  225. package/skills/frontend-plan/SKILL.md +22 -2
  226. package/skills/frontend-plan/references/decision-contract.md +114 -5
  227. package/skills/frontend-plan/references/design-decisions.md +32 -0
  228. package/skills/frontend-review/SKILL.md +10 -11
  229. package/skills/frontend-scout/references/scout-evidence.md +4 -0
  230. package/dist/worker/console/static/assets/channel-DsZxrgqe.js +0 -1
  231. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-CuToPeGV.js +0 -1
  232. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-CuToPeGV.js +0 -1
  233. package/dist/worker/console/static/assets/index-D9Sc0f0y.js +0 -449
  234. package/dist/worker/console/static/assets/index-DDQc5a50.css +0 -1
  235. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-yPoT19ft.js +0 -1
  236. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-VWdarchG.js +0 -8
@@ -20,20 +20,20 @@ export const OUTPUT_FOLLOW_LATEST_PX = 48;
20
20
 
21
21
  export const UI_TEXT = {
22
22
  dashboard: "总览",
23
- dagRuns: "DAG 运行",
24
- dagHistory: "DAG 运行历史",
23
+ dagRuns: "运行流程",
24
+ dagHistory: "运行历史",
25
25
  viewAllDags: "查看全部 →",
26
- failures: "异常 Task",
26
+ failures: "异常任务",
27
27
  nightJobs: "夜间任务",
28
28
  batchDetail: "批次详情",
29
29
  runDetail: "运行详情",
30
- dagDetail: "DAG 详情",
31
- activeDags: "进行中的 DAG",
32
- recentDags: "最近 DAG 运行",
33
- batches: "Worker 批次",
34
- noActiveDags: "当前没有进行中的 DAG,启动后将出现在这里。",
35
- noRecentDags: "暂无 DAG 运行记录。",
36
- noFormalDagHistory: "暂无正式 DAG 运行记录",
30
+ dagDetail: "运行详情",
31
+ activeDags: "进行中的流程",
32
+ recentDags: "最近运行",
33
+ batches: "任务批次",
34
+ noActiveDags: "当前没有进行中的流程,启动后将出现在这里。",
35
+ noRecentDags: "暂无运行记录。",
36
+ noFormalDagHistory: "暂无正式运行记录",
37
37
  noFormalDagHistoryHint:
38
38
  "dry-run / init-only 预检记录不会出现在此列表中。",
39
39
  dagHistoryRefreshFailed: "刷新失败,当前展示上一次结果",
@@ -41,34 +41,34 @@ export const UI_TEXT = {
41
41
  dagHistoryCopiedAnnounce: "已复制运行 ID",
42
42
  dagHistoryCopyFailed: "复制失败,请手动选择运行 ID",
43
43
  dagHistoryCopyTooltip: "复制运行 ID",
44
- noBatches: "暂无 Worker 批次,运行后将出现在这里。",
44
+ noBatches: "暂无任务批次,运行后将出现在这里。",
45
45
  noNodes: "暂无节点。",
46
46
  noOutput: "暂无节点输出。",
47
47
  noInput: "暂无节点输入。",
48
48
  inputLoading: "正在加载节点输入…",
49
- inputUnavailable: "未在冻结 DAG tasks[] 中找到该节点输入。",
49
+ inputUnavailable: "没有在本次运行保存的执行计划中找到该节点设置。",
50
50
  inputDynamicUnsupported:
51
- "该节点为运行时动态展开节点,Phase A 暂不提供完整输入。",
52
- inputRunSpecUnavailable: "无法读取冻结 DAG 规格(run.json)。",
51
+ "该节点是在运行过程中动态生成的,暂时无法展示完整的运行前设置。",
52
+ inputRunSpecUnavailable: "无法读取本次运行开始前保存的执行计划(run.json)。",
53
53
  inputError: "加载节点输入失败。",
54
- inputFrozenLabel: "冻结 DAG 节点定义",
55
- inputFingerprintNote: "仅保存 assembled prompt 指纹,全文未持久化",
56
- noSessionEvents: "该 Pi 节点暂无过程日志(可能尚未执行、走 CLI 路径,或为历史 run)",
57
- noShellProcess: "该 shell 节点尚未留下命令回执。",
54
+ inputFrozenLabel: "本次运行开始前保存的执行设置",
55
+ inputFingerprintNote: "这里只保存最终提示内容的校验信息,没有保存完整文本。",
56
+ noSessionEvents: "该 AI 节点暂无过程日志(可能尚未执行、通过命令行执行,或来自较早的运行)。",
57
+ noShellProcess: "该命令节点尚未留下执行记录。",
58
58
  noPresetProcess: "该内部处理器尚未留下过程回执。",
59
- staticNoProcess: "静态节点没有逐步执行过程,请查看节点输出。",
59
+ staticNoProcess: "系统直接生成的节点没有逐步执行过程,请查看节点输出。",
60
60
  processLoading: "正在加载执行过程…",
61
61
  processError: "加载执行过程失败。",
62
- shellCommandsHeading: "Shell 命令",
62
+ shellCommandsHeading: "命令执行记录",
63
63
  shellPresetHeading: "内部处理器",
64
64
  noArtifacts: "暂无产物记录。",
65
65
  noActiveCommand: "当前没有正在执行的命令。",
66
- noFailures: "当前没有异常 Task。",
66
+ noFailures: "当前没有异常任务。",
67
67
  enterDetail: "查看详情 →",
68
68
  repoRoot: "仓库根目录",
69
69
  generatedAt: "生成时间",
70
70
  refreshStatus: "更新",
71
- failureInbox: "异常 Task",
71
+ failureInbox: "异常任务",
72
72
  nearRealtime: "轮询刷新",
73
73
  manualRefresh: "手动刷新",
74
74
  autoRefresh: "自动刷新",
@@ -30,6 +30,25 @@ const CONTEXT_TRANSFER_REASON_LABELS = {
30
30
  WORKER_CONTINUATION_AUTHORITY_MISMATCH: "Worker 派生运行的归属事实不一致",
31
31
  WORKER_CONTINUATION_NEEDS_RECONCILE: "Worker 派生运行已存在,需要先恢复核对",
32
32
  WORKER_CONTINUATION_LEASE_CONFLICT: "该 Worker Task 已有运行占用",
33
+ "parent-lifecycle-ineligible": "原运行尚未完整结束,只有已完成的运行才能从这里继续",
34
+ "convergence-rerun-unsupported": "原运行使用自动收敛流程,暂不支持替换产出后继续",
35
+ "evaluation-rerun-unsupported": "评测运行暂不支持替换产出后继续",
36
+ "budget-lineage-missing": "缺少原运行的额度使用记录",
37
+ "budget-lineage-breached": "原运行已经用完或超出额度",
38
+ "budget-lineage-drift": "原运行的额度规则已经变化",
39
+ "sourceBindingMatched-drift": "任务来源与原运行不一致",
40
+ "taskContractBindingMatched-drift": "任务约定与原运行不一致",
41
+ "controllerIdentityMatched-drift": "运行控制器版本与原运行不一致",
42
+ "skillSnapshotVerified-drift": "节点使用的技能版本无法与原运行核对",
43
+ "workspaceMatched-drift": "当前工作区内容与原运行结束时不一致",
44
+ "restart-subgraph-contains-writer": "受影响范围里有写入节点,但它的文件边界不够明确",
45
+ "restart-subgraph-contains-decision-gate": "受影响范围里包含需要人工重新决定的关卡",
46
+ "restart-subgraph-contains-unsafe-shell": "受影响范围里有不能安全自动重跑的命令",
47
+ "dynamic-rerun-unsupported": "受影响范围里有无法安全重新生成的动态节点",
48
+ "parent-facts-invalid": "准备沿用的节点没有完整的成功记录",
49
+ "workspace-checkpoint-missing": "缺少原运行结束时的工作区校验记录",
50
+ "workspace-drift": "当前工作区已经发生变化,不能安全接着写",
51
+ HIGH_RISK_AUTHORITY_MISSING: "高风险重跑缺少完整的写入、动态节点或额度校验信息",
33
52
  INELIGIBLE: "当前不满足继续运行的条件",
34
53
  PARENT_IMMUTABILITY_VIOLATION: "父运行事实发生变化,已阻止派生",
35
54
  PARENT_LIFECYCLE: "父运行状态不允许派生继续",
@@ -19,6 +19,7 @@ const ATTEMPT_FAILURE_LABELS = {
19
19
  "structured-repair-exhausted": "结构化修复耗尽",
20
20
  "governance-blocked": "治理规则阻断",
21
21
  "empty-output": "输出为空",
22
+ network: "网络连接失败",
22
23
  auth: "认证失败",
23
24
  quota: "额度或限流",
24
25
  "rate-limit": "额度或限流",
@@ -0,0 +1,16 @@
1
+ export type InspectorMetaCopy = {
2
+ label: string;
3
+ value: string;
4
+ help: string | null;
5
+ rawLabel: string | null;
6
+ rawValue: string | null;
7
+ };
8
+
9
+ export function inspectorFieldLabel(field: unknown): string;
10
+ export function inspectorValueLabel(field: unknown, value: unknown): string;
11
+ export function inspectorListValueLabel(value: unknown): string;
12
+ export function inspectorFieldHelp(field: unknown): string | null;
13
+ export function describeInspectorMeta(
14
+ field: unknown,
15
+ value: unknown,
16
+ ): InspectorMetaCopy;
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Human-readable copy for the DAG node inspector.
3
+ *
4
+ * API payloads keep their stable machine fields and enum values. The inspector
5
+ * uses these maps only at render time and preserves the raw terms in titles so
6
+ * diagnostics remain available without making them the primary UI language.
7
+ */
8
+
9
+ const FIELD_LABELS = Object.freeze({
10
+ executor: "执行方式",
11
+ role: "节点职责",
12
+ complexity: "任务复杂度",
13
+ writePolicy: "写入权限",
14
+ toolProfile: "可用工具范围",
15
+ depends_on: "需要先完成的节点",
16
+ dependsPolicy: "前置节点要求",
17
+ failureAwareDependsOn: "失败时仍可读取的前置节点",
18
+ runIf: "什么情况下执行",
19
+ kind: "执行类型",
20
+ modelHint: "建议使用的模型",
21
+ preset: "预设处理流程",
22
+ cwd: "执行目录",
23
+ timeoutMs: "超时时间(毫秒)",
24
+ nonZeroExitPolicy: "命令失败时如何处理",
25
+ gates: "执行前后检查",
26
+ handlers: "内部处理器",
27
+ status: "当前状态",
28
+ outputMode: "输出形式",
29
+ firstProtocolLine: "首行格式要求",
30
+ resolved: "成功加载的扩展",
31
+ requested: "计划加载的扩展",
32
+ sha256: "内容校验码",
33
+ lengthChars: "字符数",
34
+ artifact: "记录文件",
35
+ run: "运行编号",
36
+ node: "节点编号",
37
+ model: "使用模型",
38
+ rank: "执行顺序",
39
+ origin: "结果来源",
40
+ duration: "耗时",
41
+ attempt: "第几次执行",
42
+ declared: "是否找到运行前设置",
43
+ dispatched: "是否已把任务交给执行器",
44
+ "node status": "节点状态",
45
+ "context digest": "本次上下文校验码",
46
+ "captured at": "记录时间",
47
+ components: "上下文组成项数量",
48
+ truncations: "被截断的内容数量",
49
+ skills: "加载的技能数量",
50
+ extensions: "加载的扩展数量",
51
+ tools: "可用工具数量",
52
+ parent: "来源运行",
53
+ "graph sha256": "文件关系校验码",
54
+ path: "文件位置",
55
+ media: "文件类型",
56
+ schema: "数据格式",
57
+ materialization: "文件生成状态",
58
+ bytes: "文件大小(字节)",
59
+ revision: "是否可以替换",
60
+ supersedes: "替换前版本校验码",
61
+ producer: "由哪个节点生成",
62
+ required: "是否必须使用",
63
+ "Direct consumers": "会直接使用此文件的节点",
64
+ "运行类型": "运行类型",
65
+ "来源运行": "来源运行",
66
+ "发起方式": "为什么创建这次运行",
67
+ "人工选择节点": "人工选择的起点",
68
+ "从此节点重新执行": "实际重新执行的起点",
69
+ "重跑计划哈希": "重跑计划校验码",
70
+ });
71
+
72
+ const FIELD_HELP = Object.freeze({
73
+ executor: "这一步是由 AI、命令,还是系统规则来完成。",
74
+ role: "这个节点在整条流程里负责规划、修改、审查还是验证。",
75
+ complexity: "系统对这一步工作量和推理难度的预估。",
76
+ writePolicy: "这一步是否能修改文件,以及能修改到什么程度。",
77
+ toolProfile: "这一步被允许使用哪一类工具。",
78
+ depends_on: "这些节点完成后,这一步才能开始。",
79
+ dependsPolicy: "前置节点出现失败或跳过时,这一步是否还能继续。",
80
+ failureAwareDependsOn: "即使这些前置节点失败,本节点仍可读取它们留下的信息。",
81
+ runIf: "只有预设条件成立时,这一步才会执行。",
82
+ kind: "系统实际采用的执行方法。",
83
+ modelHint: "配置建议使用的 AI 模型,实际模型以执行记录为准。",
84
+ preset: "系统预先定义好的一套处理步骤。",
85
+ cwd: "命令从哪个文件夹开始运行。",
86
+ timeoutMs: "执行超过这段时间后会被判定为超时。",
87
+ nonZeroExitPolicy: "命令返回失败时,是立即停止还是仅记录结果。",
88
+ gates: "开始或结束前必须通过的检查。",
89
+ handlers: "这个节点内部会依次调用的处理步骤。",
90
+ status: "这一步目前进行到什么状态。",
91
+ outputMode: "结果需要按普通文本还是固定结构返回。",
92
+ firstProtocolLine: "结果第一行必须遵守的格式。",
93
+ resolved: "实际成功加载并可供节点使用的扩展。",
94
+ requested: "运行计划原本要求加载的扩展。",
95
+ sha256: "用于确认内容有没有变化的一串校验值。",
96
+ lengthChars: "保存内容包含多少个字符。",
97
+ artifact: "这条记录在工作区中的保存位置。",
98
+ run: "这次完整运行的唯一编号。",
99
+ node: "当前步骤的唯一编号。",
100
+ model: "这一步实际使用的 AI 模型。",
101
+ rank: "这一步位于依赖流程的第几层,不等同于执行次数。",
102
+ origin: "当前结果是本次生成、沿用旧结果,还是人工替换而来。",
103
+ duration: "这一步从开始到结束花费的时间。",
104
+ attempt: "当前查看的是第几次执行尝试。",
105
+ declared: "运行开始前是否保存了这一步的设置。",
106
+ dispatched: "任务是否已经真正交给执行器。",
107
+ "node status": "交给执行器之后,这一步最终处于什么状态。",
108
+ "context digest": "用于确认节点实际收到的整组内容是否变化。",
109
+ "captured at": "系统记录节点实际上下文的时间。",
110
+ components: "节点实际收到的上下文由多少部分组成。",
111
+ truncations: "有多少部分因为过长而只提供了节选。",
112
+ skills: "本次执行实际提供了多少项技能。",
113
+ extensions: "本次执行实际加载了多少个扩展。",
114
+ tools: "本次执行允许调用多少种工具。",
115
+ parent: "当前运行是从哪一次旧运行继续而来。",
116
+ "graph sha256": "用于确认文件生产和使用关系没有变化。",
117
+ path: "文件在工作区中的相对位置。",
118
+ media: "文件的内容类型,例如 JSON 或纯文本。",
119
+ schema: "结构化文件必须符合的数据规则。",
120
+ materialization: "登记的文件是否已经真实生成,并且与记录一致。",
121
+ bytes: "文件占用的存储大小。",
122
+ revision: "这个文件是否允许上传新版本并从后续节点继续。",
123
+ supersedes: "被当前版本替换掉的旧文件校验值。",
124
+ producer: "最初生成这个文件的节点。",
125
+ required: "后续节点是否必须使用这个文件。",
126
+ "Direct consumers": "会直接读取这个文件的下一批节点。",
127
+ "运行类型": "这是首次运行,还是从旧运行继续创建的新运行。",
128
+ "来源运行": "新运行所依据的旧运行编号。",
129
+ "发起方式": "为什么会从旧运行创建这次新运行。",
130
+ "人工选择节点": "操作者希望从哪个节点开始重新执行。",
131
+ "从此节点重新执行": "系统检查依赖后,最终决定从哪个节点开始。",
132
+ "重跑计划哈希": "用于确认预览计划和真正执行时的计划完全一致。",
133
+ });
134
+
135
+ const FIELD_VALUE_LABELS = Object.freeze({
136
+ executor: {
137
+ pi: "AI 执行",
138
+ shell: "命令执行",
139
+ static: "系统直接生成",
140
+ },
141
+ kind: {
142
+ pi: "AI 执行",
143
+ shell: "命令执行",
144
+ static: "系统直接生成",
145
+ },
146
+ complexity: {
147
+ LOW: "较简单",
148
+ MED: "中等",
149
+ HIGH: "较复杂",
150
+ },
151
+ role: {
152
+ planner: "任务规划",
153
+ implementer: "执行修改",
154
+ reviewer: "结果审查",
155
+ verifier: "验证结果",
156
+ closeout: "收尾确认",
157
+ scout: "信息收集",
158
+ supervisor: "流程监督",
159
+ },
160
+ writePolicy: {
161
+ "read-only": "只读,不修改文件",
162
+ exclusive: "仅此节点可以修改指定文件",
163
+ "docs-only": "只允许修改文档",
164
+ },
165
+ toolProfile: {
166
+ "read-only": "只读工具",
167
+ write: "可修改文件的工具",
168
+ },
169
+ status: {
170
+ PENDING: "等待执行",
171
+ RUNNING: "正在执行",
172
+ FINISHED: "已完成",
173
+ ERROR: "执行失败",
174
+ SKIPPED: "已跳过",
175
+ pending: "等待执行",
176
+ running: "正在执行",
177
+ finished: "已完成",
178
+ completed: "已完成",
179
+ succeeded: "成功",
180
+ failed: "失败",
181
+ error: "执行失败",
182
+ skipped: "已跳过",
183
+ captured: "已记录",
184
+ missing: "没有记录",
185
+ invalid: "记录不可用",
186
+ available: "可用",
187
+ unavailable: "不可用",
188
+ },
189
+ declared: {
190
+ available: "已保存",
191
+ missing: "未保存",
192
+ invalid: "记录不可用",
193
+ },
194
+ dispatched: {
195
+ dispatched: "已下发",
196
+ pending: "尚未下发",
197
+ missing: "没有下发记录",
198
+ },
199
+ dependsPolicy: {
200
+ all: "所有前置节点成功后才执行",
201
+ "all-or-condition-skip": "前置节点成功,或按条件允许跳过后执行",
202
+ },
203
+ nonZeroExitPolicy: {
204
+ fail: "命令失败就停止",
205
+ record: "记录失败结果后继续",
206
+ },
207
+ outputMode: {
208
+ "structured-required": "必须按固定结构输出",
209
+ text: "普通文本",
210
+ },
211
+ "node status": {
212
+ PENDING: "等待执行",
213
+ RUNNING: "正在执行",
214
+ FINISHED: "已完成",
215
+ ERROR: "执行失败",
216
+ SKIPPED: "已跳过",
217
+ },
218
+ materialization: {
219
+ materialized: "文件已生成",
220
+ missing: "文件缺失",
221
+ mismatch: "文件与登记信息不一致",
222
+ "not-recorded": "没有生成记录",
223
+ },
224
+ revision: {
225
+ eligible: "可以替换",
226
+ blocked: "不能替换",
227
+ },
228
+ origin: {
229
+ executed: "本次运行生成",
230
+ imported: "沿用上一次运行的结果",
231
+ overridden: "使用了人工替换的新文件",
232
+ unknown: "暂时无法确定",
233
+ },
234
+ required: {
235
+ yes: "必须使用",
236
+ no: "可选",
237
+ true: "必须使用",
238
+ false: "可选",
239
+ },
240
+ "发起方式": {
241
+ "artifact-override": "替换产出后继续",
242
+ "prompt-override": "修改提示词后重跑",
243
+ "node-rerun": "从指定节点重跑",
244
+ },
245
+ "运行类型": {
246
+ root: "首次运行",
247
+ continuation: "从旧运行继续的新运行",
248
+ },
249
+ "差异类型": {
250
+ text: "文本文件",
251
+ json: "结构化数据文件(JSON)",
252
+ binary: "二进制文件",
253
+ },
254
+ "风险级别": {
255
+ low: "较低",
256
+ medium: "中等",
257
+ high: "较高",
258
+ },
259
+ });
260
+
261
+ const LIST_LABELS = Object.freeze({
262
+ skills: "可用技能",
263
+ "piExtensions(声明)": "计划加载的 AI 扩展",
264
+ requested: "计划加载的扩展",
265
+ allowedPaths: "允许读取或修改的范围",
266
+ forbiddenPaths: "禁止访问或修改的范围",
267
+ writeSet: "本节点实际可以修改的范围",
268
+ "Direct consumers": "会直接使用此文件的节点",
269
+ });
270
+
271
+ const COMMON_VALUE_LABELS = Object.freeze({
272
+ unknown: "暂时无法确定",
273
+ "(none)": "无",
274
+ "(parse failed)": "无法解析",
275
+ pass: "通过",
276
+ fail: "失败",
277
+ warning: "有提醒",
278
+ true: "是",
279
+ false: "否",
280
+ "system-prompt": "系统说明",
281
+ "dag-pi-system-prompt": "系统说明",
282
+ "dag-pi-user-message": "任务消息",
283
+ "managed-task-contract": "任务约定",
284
+ "developer-prompt": "开发约束",
285
+ "user-prompt": "用户要求",
286
+ "task-contract": "任务约定",
287
+ "execution-constraint": "执行限制",
288
+ "context-file": "补充资料",
289
+ "upstream-artifact": "上游文件",
290
+ "tool-contract": "工具使用规则",
291
+ "runtime-fact": "运行信息",
292
+ full: "完整包含",
293
+ excerpt: "只包含节选",
294
+ summary: "只包含摘要",
295
+ "reference-only": "只提供引用位置",
296
+ omitted: "未包含",
297
+ });
298
+
299
+ export function inspectorFieldLabel(field) {
300
+ const raw = String(field ?? "");
301
+ return FIELD_LABELS[raw] ?? LIST_LABELS[raw] ?? raw;
302
+ }
303
+
304
+ export function inspectorValueLabel(field, value) {
305
+ const rawField = String(field ?? "");
306
+ const rawValue = String(value ?? "");
307
+ if (rawField === "runIf" && rawValue) return "满足预设条件时执行";
308
+ return (
309
+ FIELD_VALUE_LABELS[rawField]?.[rawValue] ??
310
+ COMMON_VALUE_LABELS[rawValue] ??
311
+ rawValue
312
+ );
313
+ }
314
+
315
+ export function inspectorFieldHelp(field) {
316
+ return FIELD_HELP[String(field ?? "")] ?? null;
317
+ }
318
+
319
+ export function inspectorListValueLabel(value) {
320
+ const raw = String(value ?? "");
321
+ const separator = raw.indexOf(":");
322
+ if (separator > 0) {
323
+ const token = raw.slice(0, separator);
324
+ const humanToken = COMMON_VALUE_LABELS[token];
325
+ if (humanToken) return `${humanToken}${raw.slice(separator)}`;
326
+ }
327
+ return COMMON_VALUE_LABELS[raw] ?? raw;
328
+ }
329
+
330
+ export function describeInspectorMeta(field, value) {
331
+ const rawLabel = String(field ?? "");
332
+ const rawValueText = String(value ?? "");
333
+ const label = inspectorFieldLabel(rawLabel);
334
+ const humanValue = inspectorValueLabel(rawLabel, rawValueText);
335
+ return {
336
+ label,
337
+ value: humanValue,
338
+ help: inspectorFieldHelp(rawLabel),
339
+ rawLabel: label === rawLabel ? null : rawLabel,
340
+ rawValue: humanValue === rawValueText ? null : rawValueText,
341
+ };
342
+ }
@@ -12,7 +12,7 @@ const NODE_PURPOSE_BY_ID = {
12
12
  "implement-pi": "在允许路径内按计划改代码,完成本轮主实现。",
13
13
  "implement-core": "在允许路径内完成核心实现,不越出约定写入范围。",
14
14
  "repair-pi": "只修验证暴露出的可修复问题,不重开需求、不扩大 writeSet。",
15
- "verify-shell": "跑冻结的验证命令,用退出码证明实现是否达标。",
15
+ "verify-shell": "运行预先确定的验证命令,用命令结果判断是否达标。",
16
16
  "soft-verify-shell": "先做软验证,留下证据供过程监督,不立刻判整单失败。",
17
17
  "hard-verify-shell": "硬验证:命令必须通过,作为后续审查与收口的事实。",
18
18
  "review-pi": "对照需求与 diff 做只读审查,给出通过或需修订。",
@@ -35,14 +35,14 @@ const NODE_PURPOSE_BY_ID = {
35
35
  "static-invariant-shell": "跑静态不变量检查,确认约定结构与约束仍成立。",
36
36
  "changeset-impact-shell": "评估本轮 diff 的影响面,标出高风险改动。",
37
37
  "closeout-artifact-shell": "收集收口所需的确定性产物与证据路径。",
38
- "final-verify-shell": "收口前最后一轮冻结验证,作为完成权威。",
38
+ "final-verify-shell": "收尾前运行最后一轮固定验证,作为完成依据。",
39
39
  "closeout-summary-pi": "把验证与交付事实写成简短交接摘要。",
40
40
 
41
41
  "frontend-contract-pi": "把前端需求整理成可追踪契约:页面、状态、验收与边界。",
42
42
  "frontend-contract-import-shell": "导入并固化前端实现契约,供后续设计、写入与验证节点使用。",
43
43
  "frontend-scout-pi": "只读侦察前端结构、组件与接口用法,不改文件。",
44
44
  "frontend-plan-pi": "选定实现与 Mock/API 策略,输出可执行的前端实现契约补丁。",
45
- "frontend-design-policy-shell": "确定前端设计与 Mock/API 策略,冻结后续实现必须遵守的规则。",
45
+ "frontend-design-policy-shell": "确定前端设计和数据对接方案,并保存后续实现必须遵守的规则。",
46
46
  "frontend-design-review-pi": "审查前端计划是否可写:通过则沿用原计划,否则要求修订。",
47
47
  "frontend-plan-revision-pi": "按设计审查意见修订前端契约,不扩大范围。",
48
48
  "frontend-final-design-review-pi": "复核修订后的前端计划,只有通过才能授权写入。",
@@ -51,9 +51,9 @@ const NODE_PURPOSE_BY_ID = {
51
51
  "frontend-lint-baseline-shell": "记录写入前的 lint 基线,供实现后对比,不阻断写入。",
52
52
  "frontend-implement-pi": "按已批准契约改前端代码、状态与交互,留在 writeSet 内。",
53
53
  "frontend-verify-assess-shell": "跑静态/行为/Mock 验证并评估能否有界修复。",
54
- "frontend-verify-shell": "执行冻结的前端验证命令,产出可复查的通过或失败证据。",
54
+ "frontend-verify-shell": "运行预先确定的前端检查,留下可复查的通过或失败结果。",
55
55
  "frontend-repair-pi": "只修评估为可修复的前端失败,不重开需求。",
56
- "frontend-reverify-shell": "修复后用同一套冻结命令复验。",
56
+ "frontend-reverify-shell": "修复后用同一套检查再次验证。",
57
57
  "frontend-review-context-shell": "打包真实 diff 与有效验证证据,供审查节点使用。",
58
58
  "frontend-review-pi": "对照契约审查前端实现与证据,给出通过或需修订。",
59
59
  "frontend-review-gate-shell": "前端审查门禁:结论为通过才进入收口。",
@@ -85,7 +85,7 @@ const NODE_PURPOSE_BY_ID = {
85
85
  "validate-backend-test-environment-shell": "检查 Python/pytest 与测试布局是否可跑,失败则不消耗模型。",
86
86
  "backend-test-analysis-contract-shell": "固化后端测试分析契约与布局。",
87
87
  "backend-test-environment-scout-pi": "侦察后端测试环境与入口,不改业务代码。",
88
- "backend-test-execution-contract-shell": "冻结后端测试如何执行、产物写到哪里。",
88
+ "backend-test-execution-contract-shell": "确定后端测试如何执行、结果保存到哪里。",
89
89
  "generate-backend-md-plan-pi": "生成中文模块索引与用例卡片计划。",
90
90
  "materialize-backend-md-module-manifest-shell": "把 Markdown 模块清单落到磁盘。",
91
91
  "review-and-revise-backend-md-cases-pi": "独立审查并修订 Markdown 用例。",
@@ -145,7 +145,7 @@ function describeFromPattern(nodeId) {
145
145
  return "确定性门禁:核验上游结论,通过才放行后续节点。";
146
146
  }
147
147
  if (id.endsWith("-shell") && id.includes("verify")) {
148
- return "跑冻结验证命令,留下可复查的通过/失败证据。";
148
+ return "运行预先确定的验证命令,留下可复查的通过或失败结果。";
149
149
  }
150
150
  if (id.endsWith("-shell") && (id.includes("report") || id.includes("manifest"))) {
151
151
  return "把本轮证据整理成报告或清单,不改业务代码。";
@@ -181,9 +181,9 @@ function describeFromPattern(nodeId) {
181
181
  }
182
182
 
183
183
  function describeFromExecutor(executor) {
184
- if (executor === "shell") return "运行确定性命令并留下证据。";
185
- if (executor === "pi") return "由模型执行该步骤,范围受节点契约约束。";
186
- if (executor === "static") return "按冻结规则直接给出结果,不调用模型。";
184
+ if (executor === "shell") return "由系统运行预先设置的命令,并保存执行结果。";
185
+ if (executor === "pi") return "由 AI 完成这一步,能做的事情受运行设置限制。";
186
+ if (executor === "static") return "按预先确定的规则直接给出结果,不调用 AI。";
187
187
  return "";
188
188
  }
189
189
 
@@ -1,5 +1,24 @@
1
+ import { isRowNavigationClick } from "./router.js";
1
2
  /** DOM helpers (Observe UI R5). */
2
3
 
4
+ /** Compact action with a visible icon and an accessible, focusable tooltip. */
5
+ export function iconButton(label, icon, className = "") {
6
+ const button = el("button", `observe-icon-button ${className}`.trim());
7
+ button.type = "button";
8
+ setIconButton(button, label, icon);
9
+ return button;
10
+ }
11
+
12
+ export function setIconButton(button, label, icon) {
13
+ button.setAttribute("aria-label", label);
14
+ button.setAttribute("data-tooltip", label);
15
+ button.setAttribute("title", label);
16
+ while (button.firstChild) button.removeChild(button.firstChild);
17
+ const glyph = el("i", icon);
18
+ glyph.setAttribute("aria-hidden", "true");
19
+ button.appendChild(glyph);
20
+ }
21
+
3
22
  /**
4
23
  * Stable key → node maps, kept per (parent, scope) so reconcileKeyed never
5
24
  * depends on dataset support. A WeakMap keyed by parent holds a map of
@@ -205,7 +224,7 @@ export function buildTable(headers, rows) {
205
224
  if (row.className) tr.className = row.className;
206
225
  if (row.onClick) {
207
226
  tr.classList.add("clickable");
208
- tr.addEventListener("click", row.onClick);
227
+ tr.addEventListener("click", (event) => { if (isRowNavigationClick(event)) row.onClick(event); });
209
228
  }
210
229
  for (const cell of row.cells) {
211
230
  const td = document.createElement("td");
@@ -69,3 +69,5 @@ export function taskIdentityKey(
69
69
  featureId: string | null | undefined,
70
70
  taskId: string | null | undefined,
71
71
  ): string;
72
+
73
+ export function matchesPoolTaskFilter(task: Record<string, unknown>, filters?: { status?: string; q?: string ;}): boolean;
@@ -151,3 +151,9 @@ export function collectPlannerReadyTasks(features) {
151
151
  export function taskIdentityKey(featureId, taskId) {
152
152
  return `${featureId ?? ""}\0${taskId ?? ""}`;
153
153
  }
154
+
155
+ export function matchesPoolTaskFilter(task, filters = {}) {
156
+ if (!matchesPoolStatusFilter(task.status, filters.status)) return false;
157
+ const query = String(filters.q ?? "").trim().toLocaleLowerCase();
158
+ return !query || [task.title, task.taskId, task.featureId, task.workerRunId, task.failureCategory, task.recommendedFollowUp].join(" ").toLocaleLowerCase().includes(query);
159
+ }
@@ -405,3 +405,10 @@ export function formatLedgerSummary(summary) {
405
405
  }
406
406
  return lines.join("\n");
407
407
  }
408
+
409
+ /** A batch ending does not imply all child tasks passed. */
410
+ export function batchStatusBadge(batch) {
411
+ const status = String(batch?.status ?? "").toLowerCase();
412
+ if (["succeeded", "completed"].includes(status)) return el("span", "badge", "已结束");
413
+ return badge(batch?.status);
414
+ }
@@ -132,8 +132,8 @@
132
132
 
133
133
  <section data-view="dag" id="view-dag" class="view" hidden>
134
134
  <div class="view-heading">
135
- <p class="view-kicker">Agent DAG</p>
136
- <h2>DAG 详情</h2>
135
+ <p class="view-kicker">自动执行流程</p>
136
+ <h2>运行详情</h2>
137
137
  </div>
138
138
  <section
139
139
  id="dag-relations"
@@ -240,11 +240,11 @@
240
240
  <section data-view="failures" id="view-failures" class="view" hidden>
241
241
  <div class="view-heading">
242
242
  <p class="view-kicker">Attention Queue</p>
243
- <h2>异常 Task</h2>
243
+ <h2>异常任务</h2>
244
244
  <p>按运行状态和建议跟进项集中处理需要人工介入的 Task。</p>
245
245
  </div>
246
246
  <div id="failures-empty" class="panel empty-state" hidden>
247
- 当前没有异常 Task
247
+ 当前没有异常任务
248
248
  </div>
249
249
  <section id="failures-list" class="panel panel-table"></section>
250
250
  </section>