@tea-agent/loop-agent 0.39.0-beta.0 → 0.39.0-beta.10

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 (331) hide show
  1. package/AGENTS.md +4 -1
  2. package/CHANGELOG.md +248 -95
  3. package/README.md +9 -5
  4. package/bin/loop-agent.js +7 -3
  5. package/dist/application/task-lifecycle/advance.js +12 -0
  6. package/dist/application/task-lifecycle/recommendations.js +13 -2
  7. package/dist/build-stamp.json +3 -3
  8. package/dist/cli/command-definitions.js +23 -5
  9. package/dist/cli/program.js +21 -2
  10. package/dist/cli/update/notifier.js +2 -2
  11. package/dist/cli/update/runtime-activity.js +1 -29
  12. package/dist/cli.js +2 -1
  13. package/dist/commands/client-recovery.js +3 -0
  14. package/dist/commands/dag-follow-up.js +138 -0
  15. package/dist/commands/dag-rerun.js +55 -1
  16. package/dist/commands/init-model-catalog.js +464 -0
  17. package/dist/commands/init-upgrade.js +265 -97
  18. package/dist/commands/init.js +455 -28
  19. package/dist/commands/inspect-next.js +8 -0
  20. package/dist/commands/task-advance.js +19 -0
  21. package/dist/executors/dag-pi-executor.js +2306 -61
  22. package/dist/executors/pi-executor.js +7 -0
  23. package/dist/executors/pi-extension-resolver.js +233 -0
  24. package/dist/executors/pi-playwright-cli-tool.js +74 -28
  25. package/dist/executors/pi-read-budget-policy.js +239 -0
  26. package/dist/executors/pi-sdk-executor.js +180 -33
  27. package/dist/executors/shell-executor.js +1249 -224
  28. package/dist/executors/shell-write-guard.js +14 -0
  29. package/dist/executors/workspace-write-snapshot.js +68 -0
  30. package/dist/infrastructure/harness/atomic-write.js +23 -0
  31. package/dist/shared/dag-failure-category.js +150 -0
  32. package/dist/shared/dag-prompt-override.js +27 -0
  33. package/dist/shared/openspec-spec.js +70 -4
  34. package/dist/shared/operator/capabilities.js +39 -0
  35. package/dist/shared/playwright-cli-command-policy.js +15 -0
  36. package/dist/shared/update/console-notifier.js +100 -0
  37. package/dist/{cli → shared}/update/npm-client.js +70 -15
  38. package/dist/{cli → shared}/update/state.js +41 -13
  39. package/dist/task/config-types.js +50 -5
  40. package/dist/task/contract/apply.js +11 -1
  41. package/dist/task/contract/constants.js +2 -0
  42. package/dist/task/contract/hash.js +3 -0
  43. package/dist/task/contract/observe.js +25 -4
  44. package/dist/task/contract/paths.js +2 -1
  45. package/dist/task/contract/project.js +18 -1
  46. package/dist/task/contract/schema.js +4 -1
  47. package/dist/task/contract/transaction.js +12 -0
  48. package/dist/task/frontend-project-capability.js +199 -18
  49. package/dist/task/source-prepare/completeness.js +188 -0
  50. package/dist/task/source-prepare/fragment-inventory.js +477 -0
  51. package/dist/task/source-prepare/index.js +3 -0
  52. package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
  53. package/dist/task/source-prepare/ledger-review.js +214 -0
  54. package/dist/task/source-prepare/ledger.js +545 -0
  55. package/dist/task/source-prepare/parse-intent.js +24 -4
  56. package/dist/task/source-prepare/prepare.js +298 -1
  57. package/dist/task/source-prepare/semantic-intake.js +25 -5
  58. package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
  59. package/dist/task/source-prepare/types.js +22 -0
  60. package/dist/task/source-references.js +22 -1
  61. package/dist/worker/cli.js +18 -2
  62. package/dist/worker/console/chat/chat-event-store.js +62 -4
  63. package/dist/worker/console/chat/context-panel.js +7 -0
  64. package/dist/worker/console/chat/deferred-turn.js +12 -0
  65. package/dist/worker/console/chat/operation-card.js +8 -1
  66. package/dist/worker/console/chat/pi-console-config.js +81 -10
  67. package/dist/worker/console/chat/pi-runtime.js +264 -16
  68. package/dist/worker/console/chat/provider-error.js +98 -0
  69. package/dist/worker/console/chat/routes.js +298 -32
  70. package/dist/worker/console/chat/session-stats.js +179 -0
  71. package/dist/worker/console/chat/session-store.js +93 -63
  72. package/dist/worker/console/chat/todos.js +115 -0
  73. package/dist/worker/console/chat/tool-preview.js +42 -0
  74. package/dist/worker/console/chat/turn-process.js +20 -55
  75. package/dist/worker/console/chat/user-questions.js +266 -0
  76. package/dist/worker/console/chat/workspace-landing.js +14 -0
  77. package/dist/worker/console/console-handoff.js +82 -0
  78. package/dist/worker/console/console-update-and-init.js +115 -0
  79. package/dist/worker/console/console-update-runtime.js +84 -0
  80. package/dist/worker/console/dag-execution-receipt.js +33 -0
  81. package/dist/worker/console/draft-store.js +49 -0
  82. package/dist/worker/console/frontend-human-decision-adapter.js +19 -0
  83. package/dist/worker/console/frontend-split-operation-adapter.js +20 -0
  84. package/dist/worker/console/index.js +3 -0
  85. package/dist/worker/console/inspect-split.js +18 -0
  86. package/dist/worker/console/native-directory-picker.js +13 -0
  87. package/dist/worker/console/operation-run-facts.js +19 -3
  88. package/dist/worker/console/operation-store.js +227 -7
  89. package/dist/worker/console/operator-actions.js +388 -0
  90. package/dist/worker/console/operator-surface-health.js +1 -0
  91. package/dist/worker/console/operator-user-error.js +2 -2
  92. package/dist/worker/console/prd-intake-bridge.js +13 -0
  93. package/dist/worker/console/routes.js +355 -3
  94. package/dist/worker/console/security.js +67 -13
  95. package/dist/worker/console/server.js +609 -164
  96. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C4kVYweA.js → abnfDiagram-N423BO3Z-BAsjg7ew.js} +1 -1
  97. package/dist/worker/console/static/assets/{arc-Bj2M8iO5.js → arc-CyIlrwZw.js} +1 -1
  98. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CLlXe4-6.js → architectureDiagram-T3A2C74G-Bo4tobhH.js} +1 -1
  99. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-psEp5xH0.js → blockDiagram-VBNYF7ZC-Dfpow9gu.js} +1 -1
  100. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DeKcOCGJ.js → c4Diagram-5PPSVZJV-DPmzG_B4.js} +1 -1
  101. package/dist/worker/console/static/assets/channel-DSrJAn0-.js +1 -0
  102. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-K0C744p1.js → chunk-2GRJ4B5K-pKQpB1UW.js} +1 -1
  103. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-xbNw4J9-.js → chunk-2Q5K7J3B-5n9YYquZ.js} +1 -1
  104. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DjLaSDUO.js → chunk-5RXB4S5H-DP3CtA2a.js} +1 -1
  105. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CtiPlKel.js → chunk-5VM5RSS4-DYxMJPUy.js} +1 -1
  106. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DZtolir7.js → chunk-6Q2QTUOP-CS3D50Io.js} +1 -1
  107. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CPcdNeew.js → chunk-GF5L2VYU-gSdDfo5_.js} +1 -1
  108. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-NgHc6V37.js → chunk-JWPE2WC7-A48q0ZNt.js} +1 -1
  109. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DQ_T-hg8.js → chunk-KBJHAD2P-ow8Mm3DY.js} +1 -1
  110. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DgLsxcVP.js → chunk-RYQCIY6F-CMKfLWYE.js} +1 -1
  111. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-UrVoM9z1.js → chunk-XXDRQBXY-BiTBdQPX.js} +1 -1
  112. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DeMmPl0_.js +1 -0
  113. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DeMmPl0_.js +1 -0
  114. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CLkYvTb3.js → cose-bilkent-JH36ORCC-Cm7exRz_.js} +1 -1
  115. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BwT_xKrE.js → cynefin-VYW2F7L2-D9O5qGOu.js} +1 -1
  116. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Bi9tuzif.js → cynefinDiagram-MW4NZA55-CkvQnako.js} +1 -1
  117. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BCIqkWBV.js → dagre-VZM6K2ZE-B1rzp7CB.js} +1 -1
  118. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dip6l9_Z.js → diagram-7IWD3JNH-BP07Ipcc.js} +1 -1
  119. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B-xkh_wK.js → diagram-B4RE2ZJO-BlPzweQb.js} +1 -1
  120. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DZO0kTt_.js → diagram-LBJQPF4R-CxPa7n0S.js} +1 -1
  121. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-D6ZplNbZ.js → diagram-Q27KOJAE-CMTZs53A.js} +1 -1
  122. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPekbhoS.js → diagram-UB23O5K3-CxG_X52r.js} +1 -1
  123. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BtmaJpK5.js → ebnfDiagram-BXEA7PRR-D8axtJM0.js} +1 -1
  124. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-6DS0Xc44.js → erDiagram-JOGREHBK-DIsGzn7b.js} +1 -1
  125. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CihnROSm.js → flowDiagram-UKHOOZJN-CU9zkDG0.js} +1 -1
  126. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CZC4zOE2.js → ganttDiagram-PKOTCBZU-DCjTmz5P.js} +1 -1
  127. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Dq1fhzGN.js → gitGraphDiagram-DS77QQ5N-BksdmFzg.js} +1 -1
  128. package/dist/worker/console/static/assets/index-B-O5ChYq.css +1 -0
  129. package/dist/worker/console/static/assets/index-CfnY8AQx.js +407 -0
  130. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DlSl4BGx.js → infoDiagram-6WML65LV-CGzzzJtL.js} +1 -1
  131. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-snnzFl_U.js → ishikawaDiagram-WSZJBQD7-BdseB80N.js} +1 -1
  132. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-BDE7qpMx.js → journeyDiagram-NVQOT4AX-DM9gsgha.js} +1 -1
  133. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CD2Ci04G.js → kanban-definition-27J2QSJJ-3q-_9R2b.js} +1 -1
  134. package/dist/worker/console/static/assets/{linear-DdnapKIH.js → linear-B8N-Mxsd.js} +1 -1
  135. package/dist/worker/console/static/assets/{mermaid.core-BVjAT9b8.js → mermaid.core-EPIHUUsu.js} +5 -5
  136. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-D0yJk-zA.js → mindmap-definition-FAOFIHXS-CxwO12aa.js} +1 -1
  137. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BVo9tFP-.js → pegDiagram-VL7TDLO6-bPqbVX6Y.js} +1 -1
  138. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DnOV-mZ_.js → pieDiagram-7S7Q4E2Y-KzqIvzeX.js} +1 -1
  139. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CzUJo58i.js → quadrantDiagram-CIZ2JOQS-CyofpWiV.js} +1 -1
  140. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Bvikrolh.js → railroadDiagram-AXF67PYL-cTWJvLTP.js} +1 -1
  141. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-DtaSVCap.js → requirementDiagram-LRYGKXZP-BK--q27B.js} +1 -1
  142. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-C2c9A0wW.js → sankeyDiagram-W5VNT64P-C0SDOHXK.js} +1 -1
  143. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DmXJcU7r.js → sequenceDiagram-SI44F4Z6-Cong6YIo.js} +1 -1
  144. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B4GUFW92.js → sizeCapture-X5ZJPWSS-DUVkgZx8.js} +1 -1
  145. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Dsad2MXf.js → stateDiagram-OKZ733FA-C7XgxuZg.js} +1 -1
  146. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Dzbnd5oX.js +1 -0
  147. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DGq48Fbi.js → swimlanes-SLNWSIFB-D9Ayvwcy.js} +2 -2
  148. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BY0hHk6G.js +8 -0
  149. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CSSi6OFf.js → timeline-definition-Z64GVDOM-Byb000cH.js} +1 -1
  150. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BqyzPrWv.js → vennDiagram-T6HMQDX7-DMLegPt4.js} +1 -1
  151. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DlznVb6S.js → wardleyDiagram-T6FBY63Y-ChMMeOsP.js} +1 -1
  152. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CfBcgJ_K.js → xychartDiagram-ELKLHX3M-bEMEPisW.js} +1 -1
  153. package/dist/worker/console/static/index.html +2 -2
  154. package/dist/worker/console/static-src/active-run-badge.js +17 -0
  155. package/dist/worker/console/static-src/app/console-types.js +68 -4
  156. package/dist/worker/console/static-src/app/useConsoleShell.js +30 -12
  157. package/dist/worker/console/static-src/app/useOperatorActions.js +41 -6
  158. package/dist/worker/console/static-src/app/useRecoveryConsole.js +45 -10
  159. package/dist/worker/console/static-src/app/useRunProgress.js +47 -0
  160. package/dist/worker/console/static-src/app/useTaskWizard.js +74 -2
  161. package/dist/worker/console/static-src/night/useNightBoard.js +8 -5
  162. package/dist/worker/console/static-src/operator-chat/cards/failure-category-advice.js +25 -0
  163. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +140 -8
  164. package/dist/worker/console/static-src/operator-chat/details-dag-actions.js +122 -0
  165. package/dist/worker/console/static-src/operator-chat/input-history.js +76 -0
  166. package/dist/worker/console/static-src/operator-chat/mutation-gate.js +1 -1
  167. package/dist/worker/console/static-src/operator-chat/refs.js +3 -0
  168. package/dist/worker/console/static-src/operator-chat/runtime-selection-labels.js +27 -0
  169. package/dist/worker/console/static-src/operator-chat/turn-submission.js +16 -3
  170. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +168 -72
  171. package/dist/worker/console/static-src/operator-chat/useChatStream.js +102 -21
  172. package/dist/worker/console/static-src/operator-chat/useChatThread.js +184 -4
  173. package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
  174. package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +63 -9
  175. package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
  176. package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +3 -3
  177. package/dist/worker/console/static-src/pages/tasks/run-id-resolution.js +79 -0
  178. package/dist/worker/console/static-src/pages/tasks/run-ownership-verify.js +23 -0
  179. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +110 -0
  180. package/dist/worker/console/static-src/shell/useWorkspaces.js +299 -0
  181. package/dist/worker/console/static-src/shell/workspace-route.js +337 -0
  182. package/dist/worker/console/workspace-context.js +344 -0
  183. package/dist/worker/console/workspace-registry.js +214 -0
  184. package/dist/worker/loop-agent/loop-agent-client.js +7 -3
  185. package/dist/worker/materialize/frontend-split-task-materializer.js +72 -0
  186. package/dist/worker/materialize/harness-task-lineage.js +5 -2
  187. package/dist/worker/observability/init-runtime-activity.js +26 -0
  188. package/dist/worker/observability/read-model.js +22 -0
  189. package/dist/worker/observe/node-input.js +160 -3
  190. package/dist/worker/observe/node-process.js +377 -0
  191. package/dist/worker/observe/routes.js +224 -3
  192. package/dist/worker/observe/server.js +4 -0
  193. package/dist/worker/observe/shell-handler-keys.js +34 -0
  194. package/dist/worker/observe/static/api.js +90 -4
  195. package/dist/worker/observe/static/app.js +18 -70
  196. package/dist/worker/observe/static/constants.js +8 -1
  197. package/dist/worker/observe/static/dag-history-labels.js +4 -0
  198. package/dist/worker/observe/static/dag-node-purpose.d.ts +6 -0
  199. package/dist/worker/observe/static/dag-node-purpose.js +208 -0
  200. package/dist/worker/observe/static/format.js +60 -0
  201. package/dist/worker/observe/static/index.html +6 -1
  202. package/dist/worker/observe/static/inspect-workspace.js +307 -0
  203. package/dist/worker/observe/static/markdown-render.js +20 -1
  204. package/dist/worker/observe/static/operator-chrome.css +145 -20
  205. package/dist/worker/observe/static/operator-chrome.d.ts +20 -3
  206. package/dist/worker/observe/static/operator-chrome.js +330 -96
  207. package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
  208. package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
  209. package/dist/worker/observe/static/router.d.ts +46 -0
  210. package/dist/worker/observe/static/router.js +25 -1
  211. package/dist/worker/observe/static/state.d.ts +50 -0
  212. package/dist/worker/observe/static/state.js +184 -1
  213. package/dist/worker/observe/static/styles.css +395 -0
  214. package/dist/worker/observe/static/views/dag-graph.js +4 -2
  215. package/dist/worker/observe/static/views/dag-inspector.js +1067 -9
  216. package/dist/worker/observe/static/views/dag.d.ts +13 -0
  217. package/dist/worker/observe/static/views/dag.js +14 -5
  218. package/dist/worker/observe/static/views/dashboard.js +6 -4
  219. package/dist/worker/observe/static/views/failures.js +5 -2
  220. package/dist/worker/observe/static/views/night.js +2 -2
  221. package/dist/worker/observe/static/views/pool.js +1 -0
  222. package/dist/worker/observe/static/views/run.js +3 -1
  223. package/dist/worker/observe/static/views/session-timeline.js +78 -9
  224. package/dist/worker/observe/static/views/task.js +56 -1
  225. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +49 -3
  226. package/dist/workflows/dag/backend-test-markdown-workflow.js +176 -1
  227. package/dist/workflows/dag/backend-test-pytest-collection.js +98 -14
  228. package/dist/workflows/dag/backend-test-writer-completeness.js +10 -5
  229. package/dist/workflows/dag/contract-output-registry.js +15 -0
  230. package/dist/workflows/dag/contract-validator-registrations.js +1 -2
  231. package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
  232. package/dist/workflows/dag/dynamic-runtime/map.js +1 -1
  233. package/dist/workflows/dag/failure-category.js +7 -116
  234. package/dist/workflows/dag/frontend-closeout.js +221 -0
  235. package/dist/workflows/dag/frontend-design-policy.js +400 -0
  236. package/dist/workflows/dag/frontend-human-decision.js +182 -0
  237. package/dist/workflows/dag/frontend-implementation-contract.js +534 -178
  238. package/dist/workflows/dag/frontend-plan-render.js +24 -0
  239. package/dist/workflows/dag/frontend-prewrite-gate.js +371 -393
  240. package/dist/workflows/dag/frontend-provider-capability-matrix.js +159 -0
  241. package/dist/workflows/dag/frontend-recovery-capsule.js +455 -0
  242. package/dist/workflows/dag/frontend-recovery-controller.js +202 -0
  243. package/dist/workflows/dag/frontend-recovery-lineage.js +178 -0
  244. package/dist/workflows/dag/frontend-recovery-plan.js +17 -10
  245. package/dist/workflows/dag/frontend-recovery-run.js +33 -20
  246. package/dist/workflows/dag/frontend-repair.js +7 -424
  247. package/dist/workflows/dag/frontend-review-context.js +288 -14
  248. package/dist/workflows/dag/frontend-review-findings.js +270 -0
  249. package/dist/workflows/dag/frontend-risk.js +15 -2
  250. package/dist/workflows/dag/frontend-shadow-dual-write.js +814 -0
  251. package/dist/workflows/dag/frontend-shape-capsule-store.js +191 -0
  252. package/dist/workflows/dag/frontend-shape-facts.js +409 -0
  253. package/dist/workflows/dag/frontend-shape.js +427 -0
  254. package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
  255. package/dist/workflows/dag/frontend-split-application-service.js +203 -0
  256. package/dist/workflows/dag/frontend-split-orchestrator.js +899 -0
  257. package/dist/workflows/dag/frontend-test-case-checklist.js +30 -4
  258. package/dist/workflows/dag/frontend-test-case-manifest.js +11 -4
  259. package/dist/workflows/dag/frontend-test-case-quality.js +11 -16
  260. package/dist/workflows/dag/frontend-test-environment-probe.js +230 -0
  261. package/dist/workflows/dag/frontend-test-html-report.js +3 -1
  262. package/dist/workflows/dag/frontend-test-l5-report.js +3 -1
  263. package/dist/workflows/dag/frontend-test-layout.js +159 -0
  264. package/dist/workflows/dag/frontend-test-markdown.js +61 -0
  265. package/dist/workflows/dag/frontend-test-result-contract.js +188 -42
  266. package/dist/workflows/dag/frontend-test-standard-scenarios.js +70 -0
  267. package/dist/workflows/dag/frontend-typed-event-store.js +452 -0
  268. package/dist/workflows/dag/frontend-typed-event-transaction.js +180 -0
  269. package/dist/workflows/dag/frontend-verification-trace.js +52 -17
  270. package/dist/workflows/dag/frontend-worktree-diff.js +250 -17
  271. package/dist/workflows/dag/frontend-writer-admission.js +272 -0
  272. package/dist/workflows/dag/frontend-writer-status.js +244 -0
  273. package/dist/workflows/dag/init-hybrid.js +984 -618
  274. package/dist/workflows/dag/interrupt-request.js +10 -3
  275. package/dist/workflows/dag/lifecycle.js +3 -3
  276. package/dist/workflows/dag/node-execution.js +468 -34
  277. package/dist/workflows/dag/prompt.js +44 -19
  278. package/dist/workflows/dag/recovery-lease.js +80 -0
  279. package/dist/workflows/dag/report.js +37 -1
  280. package/dist/workflows/dag/rerun-feedback.js +124 -1
  281. package/dist/workflows/dag/rerun-plan.js +144 -5
  282. package/dist/workflows/dag/rerun-run.js +81 -6
  283. package/dist/workflows/dag/rerun-task.js +29 -0
  284. package/dist/workflows/dag/retry-policy.js +318 -8
  285. package/dist/workflows/dag/runner.js +429 -122
  286. package/dist/workflows/dag/scheduler.js +114 -16
  287. package/dist/workflows/dag/structured-output-repair.js +712 -0
  288. package/dist/workflows/dag/types.js +321 -31
  289. package/dist/workflows/dag/upstream-artifacts.js +0 -4
  290. package/dist/workflows/dag/validate.js +92 -32
  291. package/docs/README.md +2 -0
  292. package/docs/architecture/evolution.md +45 -0
  293. package/docs/init-surface.manifest.json +9 -0
  294. package/docs/operations/README.md +1 -1
  295. package/docs/operations/local-development-environment.md +21 -0
  296. package/docs/templates/README.md +2 -1
  297. package/docs/templates/agent-dag-report.schema.json +8 -2
  298. package/docs/templates/agent-dag.schema.json +45 -1
  299. package/docs/templates/frontend-implementation-contract.schema.json +684 -24
  300. package/docs/templates/frontend-test-case-checklist.md +2 -2
  301. package/docs/templates/frontend-test-dag.json +8 -10
  302. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +1 -1
  303. package/docs/templates/init-managed-agents.md +13 -3
  304. package/docs/templates/spec-registry.schema.json +45 -0
  305. package/harness.json +3 -3
  306. package/package.json +7 -1
  307. package/scripts/next-info.mjs +356 -0
  308. package/scripts/next-publish-gate.mjs +238 -0
  309. package/scripts/release-source-binding.mjs +251 -0
  310. package/skills/codebase-scout/SKILL.md +1 -1
  311. package/skills/fe-test-ui-scout/SKILL.md +65 -0
  312. package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
  313. package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
  314. package/skills/frontend-bounded-implement/SKILL.md +8 -14
  315. package/skills/frontend-design-review/SKILL.md +20 -41
  316. package/skills/frontend-implementation/SKILL.md +3 -4
  317. package/skills/frontend-implementation/references/design-spec.md +15 -10
  318. package/skills/frontend-implementation/references/node-contracts.md +23 -13
  319. package/skills/frontend-review/SKILL.md +22 -14
  320. package/skills/frontend-review/references/review-findings.md +6 -7
  321. package/skills/loop-agent/references/command-reference.md +12 -4
  322. package/skills/loop-agent/references/hybrid-dag.md +8 -1
  323. package/skills/playwright-cli/SKILL.md +23 -1
  324. package/skills/playwright-cli-case-generator/SKILL.md +29 -8
  325. package/dist/worker/console/static/assets/channel-CPF4N7pf.js +0 -1
  326. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C2DwA_Y1.js +0 -1
  327. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C2DwA_Y1.js +0 -1
  328. package/dist/worker/console/static/assets/index-DTZOKgAn.js +0 -404
  329. package/dist/worker/console/static/assets/index-Ya5FE7cD.css +0 -1
  330. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-B8FB_cNk.js +0 -1
  331. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CrZYaWfx.js +0 -8
@@ -1,5 +1,6 @@
1
1
  import { access, readFile } from "node:fs/promises";
2
2
  import { buildOperatorCapabilitiesDocument, OFFICIAL_TAIL_ACTION_IDS, } from "../../shared/operator/capabilities.js";
3
+ import { DAG_RERUN_PROMPT_OVERRIDE_ENV, isDagRerunPromptOverrideEnabled, MAX_DAG_RERUN_PROMPT_OVERRIDE_CHARS, } from "../../shared/dag-prompt-override.js";
3
4
  import { buildOperatorResult, operatorFailed, operatorSucceeded, } from "../../shared/operator/envelope.js";
4
5
  import { CANONICAL_TASK_ID_PATTERN, formatLocalBusinessDate, getTaskPaths, loadTaskConfig, } from "../../task/runtime.js";
5
6
  import { diffTaskContract, validateDraftForTask, } from "../../task/contract/index.js";
@@ -401,6 +402,85 @@ async function runReadCli(ctx, args, command) {
401
402
  });
402
403
  }
403
404
  }
405
+ /**
406
+ * Parse and bound the experimental promptOverrides action param. The env
407
+ * switch is checked separately so disabled deployments fail closed before any
408
+ * staging happens. `mode` defaults to "replace"; "append" keeps the frozen
409
+ * base prompt and only appends the operator text as a marked addendum.
410
+ */
411
+ function parsePromptOverrideParams(raw) {
412
+ if (raw === undefined || raw === null)
413
+ return { kind: "ok", overrides: [] };
414
+ if (!Array.isArray(raw)) {
415
+ return {
416
+ kind: "error",
417
+ message: "promptOverrides must be an array of {nodeId, prompt, mode?}",
418
+ };
419
+ }
420
+ if (raw.length === 0)
421
+ return { kind: "ok", overrides: [] };
422
+ if (raw.length > 8) {
423
+ return { kind: "error", message: "promptOverrides supports at most 8 nodes" };
424
+ }
425
+ const overrides = [];
426
+ const seen = new Set();
427
+ for (const item of raw) {
428
+ if (!item || typeof item !== "object") {
429
+ return {
430
+ kind: "error",
431
+ message: "promptOverrides entries must be objects {nodeId, prompt, mode?}",
432
+ };
433
+ }
434
+ const record = item;
435
+ const nodeId = typeof record.nodeId === "string" ? record.nodeId.trim() : "";
436
+ const prompt = typeof record.prompt === "string" ? record.prompt : "";
437
+ const mode = record.mode === undefined || record.mode === null
438
+ ? undefined
439
+ : typeof record.mode === "string"
440
+ ? record.mode
441
+ : "invalid";
442
+ if (!nodeId) {
443
+ return { kind: "error", message: "promptOverrides nodeId is required" };
444
+ }
445
+ if (seen.has(nodeId)) {
446
+ return {
447
+ kind: "error",
448
+ message: `promptOverrides contains duplicate nodeId: ${nodeId}`,
449
+ };
450
+ }
451
+ seen.add(nodeId);
452
+ if (mode !== undefined && mode !== "append" && mode !== "replace") {
453
+ return {
454
+ kind: "error",
455
+ message: `promptOverrides mode for ${nodeId} must be append or replace`,
456
+ };
457
+ }
458
+ if (!prompt.trim() || prompt.length > MAX_DAG_RERUN_PROMPT_OVERRIDE_CHARS) {
459
+ return {
460
+ kind: "error",
461
+ message: `promptOverrides prompt for ${nodeId} must be 1-${MAX_DAG_RERUN_PROMPT_OVERRIDE_CHARS} characters`,
462
+ };
463
+ }
464
+ overrides.push(mode === undefined ? { nodeId, prompt } : { nodeId, prompt, mode });
465
+ }
466
+ return { kind: "ok", overrides };
467
+ }
468
+ /** Stage override bodies under app-data and build `--prompt-override` CLI
469
+ * args. The flag carries the mode: `--prompt-override-append` for append. */
470
+ async function buildPromptOverrideCliArgs(ctx, overrides) {
471
+ const args = [];
472
+ for (const override of overrides) {
473
+ const staged = await stageUtf8Text(ctx.appData, override.prompt, {
474
+ extension: ".md",
475
+ label: `prompt-override-${override.nodeId}`,
476
+ });
477
+ const flag = override.mode === "append"
478
+ ? "--prompt-override-append"
479
+ : "--prompt-override";
480
+ args.push(flag, `${override.nodeId}@${staged.path}`);
481
+ }
482
+ return args;
483
+ }
404
484
  async function acceptOperation(ctx, input) {
405
485
  const created = await ctx.operations.create({
406
486
  clientRequestId: input.clientRequestId,
@@ -456,6 +536,184 @@ async function acceptOperation(ctx, input) {
456
536
  },
457
537
  };
458
538
  }
539
+ function splitRuntimeMissing(action) {
540
+ return {
541
+ kind: "error",
542
+ status: 503,
543
+ body: operatorFailed({
544
+ command: action,
545
+ outcome: "blocked",
546
+ code: "INTERNAL_ERROR",
547
+ message: `${action} is unavailable: frontend split runtime is not wired`,
548
+ }),
549
+ };
550
+ }
551
+ function numOf(v) {
552
+ return typeof v === "number" ? v : Number(v);
553
+ }
554
+ function splitCommandBase(p) {
555
+ return {
556
+ operationId: str(p.operationId) ?? "",
557
+ expectedRevision: numOf(p.expectedRevision),
558
+ expectedParentDigest: str(p.expectedParentDigest) ?? "",
559
+ expectedManifestDigest: str(p.expectedManifestDigest) ?? "",
560
+ };
561
+ }
562
+ function splitCommandDispatch(action, result) {
563
+ if (result.outcome === "conflict") {
564
+ return {
565
+ kind: "error",
566
+ status: 409,
567
+ body: operatorFailed({
568
+ command: action,
569
+ outcome: "conflict",
570
+ code: "CONFLICT",
571
+ message: "frontend split CAS conflict (stale revision or binding)",
572
+ }),
573
+ };
574
+ }
575
+ return { kind: "sync", status: 200, body: operatorSucceeded(action, result) };
576
+ }
577
+ async function runSplitAction(action, run) {
578
+ try {
579
+ const result = await run();
580
+ if (result && typeof result === "object" && "outcome" in result) {
581
+ return splitCommandDispatch(action, result);
582
+ }
583
+ return {
584
+ kind: "sync",
585
+ status: 200,
586
+ body: operatorSucceeded(action, result),
587
+ };
588
+ }
589
+ catch (error) {
590
+ return invalid(action, error instanceof Error ? error.message : String(error));
591
+ }
592
+ }
593
+ function humanDecisionDispatch(action, result) {
594
+ if (result.outcome === "rejected") {
595
+ return {
596
+ kind: "error",
597
+ status: 409,
598
+ body: operatorFailed({
599
+ command: action,
600
+ outcome: "conflict",
601
+ code: "CONFLICT",
602
+ message: result.reason,
603
+ details: { projection: result.projection },
604
+ }),
605
+ };
606
+ }
607
+ return { kind: "sync", status: 200, body: operatorSucceeded(action, result) };
608
+ }
609
+ async function runHumanDecisionAction(action, run) {
610
+ try {
611
+ return humanDecisionDispatch(action, await run());
612
+ }
613
+ catch (error) {
614
+ return invalid(action, error instanceof Error ? error.message : String(error));
615
+ }
616
+ }
617
+ async function acceptConsoleUpdateAndInit(ctx, clientRequestId, channel) {
618
+ if (!ctx.consoleUpdateExecutor) {
619
+ return {
620
+ kind: "error",
621
+ status: 503,
622
+ body: operatorFailed({
623
+ command: "consoleUpdateAndInit",
624
+ outcome: "blocked",
625
+ code: "CONSOLE_UPDATE_UNAVAILABLE",
626
+ message: "Console update runtime is unavailable",
627
+ }),
628
+ };
629
+ }
630
+ const created = await ctx.operations.create({
631
+ clientRequestId,
632
+ action: "consoleUpdateAndInit",
633
+ actionParams: { channel },
634
+ });
635
+ if (created.kind === "conflict") {
636
+ return {
637
+ kind: "error",
638
+ status: 409,
639
+ body: operatorFailed({
640
+ command: "consoleUpdateAndInit",
641
+ outcome: "conflict",
642
+ code: "REQUEST_ID_REUSE_CONFLICT",
643
+ message: created.message,
644
+ }),
645
+ };
646
+ }
647
+ if (created.kind === "idempotent") {
648
+ return {
649
+ kind: "accepted",
650
+ status: 202,
651
+ body: {
652
+ operationId: created.operation.operationId,
653
+ state: created.operation.state,
654
+ clientRequestId: created.operation.clientRequestId,
655
+ action: created.operation.action,
656
+ },
657
+ };
658
+ }
659
+ queueMicrotask(() => {
660
+ void (async () => {
661
+ const operationId = created.operation.operationId;
662
+ await ctx.operations.update(operationId, {
663
+ state: "running",
664
+ startedAt: new Date().toISOString(),
665
+ });
666
+ ctx.events.append(operationId, {
667
+ at: new Date().toISOString(),
668
+ kind: "state",
669
+ state: "running",
670
+ message: `checking runtime, npm ${channel}, and safe initialization`,
671
+ });
672
+ try {
673
+ const result = await ctx.consoleUpdateExecutor(channel);
674
+ const state = result.state;
675
+ const next = await ctx.operations.update(operationId, {
676
+ state,
677
+ finishedAt: new Date().toISOString(),
678
+ result: result,
679
+ ...(result.errorCode ? { errorCode: result.errorCode } : {}),
680
+ ...(result.errorMessage ? { errorMessage: result.errorMessage } : {}),
681
+ });
682
+ ctx.events.append(operationId, {
683
+ at: new Date().toISOString(),
684
+ kind: "state",
685
+ state: next.state,
686
+ message: result.errorMessage ?? `console maintenance ${next.state}`,
687
+ });
688
+ }
689
+ catch (error) {
690
+ const message = error instanceof Error ? error.message : String(error);
691
+ const next = await ctx.operations.update(operationId, {
692
+ state: "needs-reconcile",
693
+ finishedAt: new Date().toISOString(),
694
+ errorCode: "CONSOLE_UPDATE_EXCEPTION",
695
+ errorMessage: message,
696
+ });
697
+ ctx.events.append(operationId, {
698
+ at: new Date().toISOString(),
699
+ kind: "error",
700
+ state: next.state,
701
+ message,
702
+ });
703
+ }
704
+ })();
705
+ });
706
+ return {
707
+ kind: "accepted",
708
+ status: 202,
709
+ body: {
710
+ operationId: created.operation.operationId,
711
+ state: created.operation.state,
712
+ clientRequestId: created.operation.clientRequestId,
713
+ action: created.operation.action,
714
+ },
715
+ };
716
+ }
459
717
  export async function dispatchOperatorAction(ctx, req) {
460
718
  const action = req.action?.trim();
461
719
  if (!action) {
@@ -486,6 +744,31 @@ export async function dispatchOperatorAction(ctx, req) {
486
744
  };
487
745
  }
488
746
  const p = paramsOf(req);
747
+ if (action === "consoleUpdateAndInit") {
748
+ if (req.source !== "human-ui") {
749
+ return {
750
+ kind: "error",
751
+ status: 403,
752
+ body: operatorFailed({
753
+ command: action,
754
+ outcome: "blocked",
755
+ code: "HUMAN_UI_REQUIRED",
756
+ message: "consoleUpdateAndInit is available only from the Operate UI",
757
+ }),
758
+ };
759
+ }
760
+ if (!req.clientRequestId?.trim()) {
761
+ return invalid(action, "clientRequestId is required");
762
+ }
763
+ if (Object.keys(p).some((key) => key !== "channel")) {
764
+ return invalid(action, "only channel may be provided");
765
+ }
766
+ const channel = p.channel ?? "latest";
767
+ if (channel !== "latest" && channel !== "next") {
768
+ return invalid(action, "channel must be latest or next");
769
+ }
770
+ return acceptConsoleUpdateAndInit(ctx, req.clientRequestId, channel);
771
+ }
489
772
  switch (action) {
490
773
  case "operatorCapabilities": {
491
774
  const doc = buildOperatorCapabilitiesDocument();
@@ -2078,12 +2361,35 @@ export async function dispatchOperatorAction(ctx, req) {
2078
2361
  }
2079
2362
  return accepted;
2080
2363
  }
2364
+ case "dagPromptOverrideConfig": {
2365
+ // The prompt-edit entry is visible by default. The internal environment
2366
+ // switch remains an emergency kill switch and is reflected here.
2367
+ return {
2368
+ kind: "sync",
2369
+ status: 200,
2370
+ body: operatorSucceeded(action, {
2371
+ enabled: isDagRerunPromptOverrideEnabled(),
2372
+ envVar: DAG_RERUN_PROMPT_OVERRIDE_ENV,
2373
+ }),
2374
+ };
2375
+ }
2081
2376
  case "dagRerunPlan": {
2082
2377
  const runId = str(p.runId);
2083
2378
  const fromNode = str(p.fromNode);
2084
2379
  if (!runId || !fromNode) {
2085
2380
  return invalid(action, "runId and fromNode are required");
2086
2381
  }
2382
+ const parsedOverrides = parsePromptOverrideParams(p.promptOverrides);
2383
+ if (parsedOverrides.kind === "error") {
2384
+ return invalid(action, parsedOverrides.message);
2385
+ }
2386
+ if (parsedOverrides.overrides.length > 0 &&
2387
+ !isDagRerunPromptOverrideEnabled()) {
2388
+ return invalid(action, `prompt override rerun is disabled by ${DAG_RERUN_PROMPT_OVERRIDE_ENV}; unset it or use a value other than 0, false, or off to enable this experimental capability`);
2389
+ }
2390
+ const overrideArgs = parsedOverrides.overrides.length > 0
2391
+ ? await buildPromptOverrideCliArgs(ctx, parsedOverrides.overrides)
2392
+ : [];
2087
2393
  const body = await runReadCli(ctx, [
2088
2394
  "dag",
2089
2395
  "rerun",
@@ -2092,6 +2398,7 @@ export async function dispatchOperatorAction(ctx, req) {
2092
2398
  "--from-node",
2093
2399
  fromNode,
2094
2400
  "--plan",
2401
+ ...overrideArgs,
2095
2402
  "--json",
2096
2403
  ], "dag rerun plan");
2097
2404
  return { kind: "sync", status: body.ok ? 200 : 400, body };
@@ -2105,6 +2412,17 @@ export async function dispatchOperatorAction(ctx, req) {
2105
2412
  if (!runId || !fromNode || !planHash || !reason || !clientRequestId) {
2106
2413
  return invalid(action, "runId, fromNode, planHash, reason, and clientRequestId are required");
2107
2414
  }
2415
+ const parsedOverrides = parsePromptOverrideParams(p.promptOverrides);
2416
+ if (parsedOverrides.kind === "error") {
2417
+ return invalid(action, parsedOverrides.message);
2418
+ }
2419
+ if (parsedOverrides.overrides.length > 0 &&
2420
+ !isDagRerunPromptOverrideEnabled()) {
2421
+ return invalid(action, `prompt override rerun is disabled by ${DAG_RERUN_PROMPT_OVERRIDE_ENV}; unset it or use a value other than 0, false, or off to enable this experimental capability`);
2422
+ }
2423
+ const overrideArgs = parsedOverrides.overrides.length > 0
2424
+ ? await buildPromptOverrideCliArgs(ctx, parsedOverrides.overrides)
2425
+ : [];
2108
2426
  return acceptOperation(ctx, {
2109
2427
  action,
2110
2428
  actionParams: p,
@@ -2122,6 +2440,7 @@ export async function dispatchOperatorAction(ctx, req) {
2122
2440
  clientRequestId,
2123
2441
  "--reason",
2124
2442
  reason,
2443
+ ...overrideArgs,
2125
2444
  "--json",
2126
2445
  ],
2127
2446
  });
@@ -2606,6 +2925,75 @@ export async function dispatchOperatorAction(ctx, req) {
2606
2925
  }),
2607
2926
  };
2608
2927
  }
2928
+ case "frontendSplitWakeup": {
2929
+ if (!ctx.splitOrchestrator)
2930
+ return splitRuntimeMissing(action);
2931
+ return runSplitAction(action, () => ctx.splitOrchestrator.wakeupChildren(splitCommandBase(p)));
2932
+ }
2933
+ case "frontendSplitChildCallback": {
2934
+ if (!ctx.splitOrchestrator)
2935
+ return splitRuntimeMissing(action);
2936
+ return runSplitAction(action, () => ctx.splitOrchestrator.childCallback({
2937
+ ...splitCommandBase(p),
2938
+ observation: p.observation,
2939
+ }));
2940
+ }
2941
+ case "frontendSplitWakeupIntegration": {
2942
+ if (!ctx.splitOrchestrator)
2943
+ return splitRuntimeMissing(action);
2944
+ return runSplitAction(action, () => ctx.splitOrchestrator.wakeupIntegration(splitCommandBase(p)));
2945
+ }
2946
+ case "frontendSplitIntegrationCallback": {
2947
+ if (!ctx.splitOrchestrator)
2948
+ return splitRuntimeMissing(action);
2949
+ return runSplitAction(action, () => ctx.splitOrchestrator.integrationCallback({
2950
+ ...splitCommandBase(p),
2951
+ completion: p.completion,
2952
+ }));
2953
+ }
2954
+ case "frontendSplitFinalize": {
2955
+ if (!ctx.splitOrchestrator)
2956
+ return splitRuntimeMissing(action);
2957
+ return runSplitAction(action, () => ctx.splitOrchestrator.finalize(splitCommandBase(p)));
2958
+ }
2959
+ case "frontendHumanDecisionMaterialize": {
2960
+ if (!ctx.humanDecisionAdapter)
2961
+ return splitRuntimeMissing(action);
2962
+ return runHumanDecisionAction(action, () => ctx.humanDecisionAdapter.materialize({
2963
+ operationId: str(p.operationId) ?? "",
2964
+ expectedRecordRevision: numOf(p.expectedRecordRevision),
2965
+ expectedProjectionDigest: str(p.expectedProjectionDigest) ?? "",
2966
+ envelope: p.envelope,
2967
+ }));
2968
+ }
2969
+ case "frontendHumanDecisionApprove": {
2970
+ if (!ctx.humanDecisionAdapter)
2971
+ return splitRuntimeMissing(action);
2972
+ return runHumanDecisionAction(action, () => ctx.humanDecisionAdapter.consume({
2973
+ operationId: str(p.operationId) ?? "",
2974
+ expectedRecordRevision: numOf(p.expectedRecordRevision),
2975
+ expectedProjectionDigest: str(p.expectedProjectionDigest) ?? "",
2976
+ receipt: p.receipt,
2977
+ currentTargetDigest: str(p.currentTargetDigest) ?? "",
2978
+ now: str(p.now) ?? new Date().toISOString(),
2979
+ }));
2980
+ }
2981
+ case "frontendSplitInitialize": {
2982
+ if (!ctx.humanDecisionAdapter)
2983
+ return splitRuntimeMissing(action);
2984
+ return runHumanDecisionAction(action, () => ctx.humanDecisionAdapter.initializeSplit({
2985
+ operationId: str(p.operationId) ?? "",
2986
+ expectedRecordRevision: numOf(p.expectedRecordRevision),
2987
+ expectedProjectionDigest: str(p.expectedProjectionDigest) ?? "",
2988
+ execution: p.execution,
2989
+ manifest: p.manifest,
2990
+ receipt: p.receipt,
2991
+ currentTargetDigest: str(p.currentTargetDigest) ?? "",
2992
+ now: str(p.now) ?? new Date().toISOString(),
2993
+ activeWriterOperationId: str(p.activeWriterOperationId) ?? null,
2994
+ activeProviderOperationId: str(p.activeProviderOperationId) ?? null,
2995
+ }));
2996
+ }
2609
2997
  default: {
2610
2998
  // M5 official-command coverage uses one generic tail for newly registered
2611
2999
  // CLI actions. It remains inside dispatchOperatorAction (the sole dispatch
@@ -12,6 +12,7 @@ export function buildOperatorSurfaceHealthV1(input) {
12
12
  repoName: input.repoRoot.split(/[\\/]/).filter(Boolean).pop() ?? "repository",
13
13
  packageName,
14
14
  packageVersion,
15
+ consoleInstanceId: input.consoleInstanceId,
15
16
  piReadiness: input.piReadiness,
16
17
  inspect: {
17
18
  ready: input.inspectReady,
@@ -3,7 +3,7 @@ import { rewriteRecoveryOperatorError } from "./recovery-error-copy.js";
3
3
  const MUTATION_GATE_COPY = [
4
4
  {
5
5
  pattern: /invalid (boot capability|confirmation header) token/i,
6
- copy: "页面已过期(控制台已重启),请刷新页面(F5)后重试。",
6
+ copy: "页面凭证已失效(控制台可能已重启),请刷新页面(F5)后重试。",
7
7
  },
8
8
  {
9
9
  pattern: /mutation requires boot capability cookie|mutation requires confirmation header token/i,
@@ -23,7 +23,7 @@ export function formatOperatorUserError(message) {
23
23
  if (recovery)
24
24
  return recovery;
25
25
  if (/controller identity changed|package fingerprint changed|entry binary sha256 changed/i.test(raw)) {
26
- return "控制器版本已变更(Console 启动后代码被重新编译)。请重启 Console 后再试,一次会话中途不要升级/重建控制器。";
26
+ return "控制器版本已变更(Console 启动后代码被重新编译,或提交了 package.json / bin / dist / skills 等指纹范围文件)。请重启 Console 进程使其重新加载当前构建后再重试本操作;一次会话中途不要重建控制器。";
27
27
  }
28
28
  if (/Pi session file missing or not openable|cannot reopen chat session .* no persisted Pi session file/i.test(raw)) {
29
29
  return "该对话的 Pi 会话文件已丢失,无法恢复上下文。请新建对话继续(历史记录无法重开)。";
@@ -9,6 +9,7 @@ import { getTaskPaths } from "../../task/runtime.js";
9
9
  import { SEMANTIC_INTAKE_ARTIFACT_REL, } from "../../task/source-prepare/semantic-intake.js";
10
10
  import { extractRequirementFactsFromMarkdown } from "../../task/source-prepare/parse-intent.js";
11
11
  import { filterPlaceholderPaths, isNonPlaceholderPath, } from "../../task/source-prepare/placeholder-paths.js";
12
+ import { summarizeLedgerPayload, } from "./draft-store.js";
12
13
  import { emptyDraft } from "./interview/grill-me.js";
13
14
  import { normalizeConsoleWorkflowKind } from "./workflow-kinds.js";
14
15
  function asStringList(value) {
@@ -219,6 +220,15 @@ export async function buildDraftFromTaskIntake(input) {
219
220
  const paths = getTaskPaths(input.repoRoot, input.taskId);
220
221
  const warnings = warningList(input.advanceJson);
221
222
  const lifecycleState = lifecycleFromAdvanceJson(input.advanceJson);
223
+ // Source fidelity ledger 安全摘要透传(AC-009):来自 advance/prepare 结果,
224
+ // 未知形状安全丢弃,绝不携带未截断原文。
225
+ const advanceRoot = input.advanceJson && typeof input.advanceJson === "object"
226
+ ? input.advanceJson
227
+ : {};
228
+ const ledgerSummary = summarizeLedgerPayload(advanceRoot.ledgerSummary) ??
229
+ summarizeLedgerPayload(advanceRoot.result && typeof advanceRoot.result === "object"
230
+ ? advanceRoot.result.ledgerSummary
231
+ : undefined);
222
232
  const semanticApplied = warnings.some((w) => w.code === "SEMANTIC_INTAKE_APPLIED");
223
233
  const semanticFailed = warnings.find((w) => w.code === "SEMANTIC_INTAKE_PI_FAILED" ||
224
234
  w.code === "SEMANTIC_INTAKE_INVALID_OUTPUT" ||
@@ -427,11 +437,14 @@ export async function buildDraftFromTaskIntake(input) {
427
437
  if (input.engineering) {
428
438
  draft = applyEngineeringBoundaryToDraft(draft, input.engineering);
429
439
  }
440
+ // AC-BLOCK-002:摘要仅经响应返回 UI 视图模型,不写入 draft(防止 strict
441
+ // taskContractDraftSchema 因未知 ledgerSummary 键拒绝 canonical draft)。
430
442
  return {
431
443
  draft,
432
444
  parseStatus,
433
445
  semanticIntake,
434
446
  gaps,
447
+ ...(ledgerSummary ? { ledgerSummary } : {}),
435
448
  lifecycleState,
436
449
  };
437
450
  }