@tea-agent/loop-agent 0.39.0-beta.1 → 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 +538 -166
  238. package/dist/workflows/dag/frontend-plan-render.js +24 -0
  239. package/dist/workflows/dag/frontend-prewrite-gate.js +388 -392
  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 -613
  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 -58
  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
@@ -0,0 +1,46 @@
1
+ /** 与 router.js 对应的类型声明(供 vitest/TS 侧导入契约测试)。 */
2
+
3
+ export type InspectHashRoute = {
4
+ view: string;
5
+ batchRunId?: string;
6
+ workerRunId?: string;
7
+ dagRunId?: string;
8
+ featureId?: string;
9
+ taskId?: string;
10
+ scheduleId?: string;
11
+ page?: number;
12
+ pageSize?: number;
13
+ filters?: { status?: string; q?: string };
14
+ };
15
+
16
+ export function parseHashRoute(hashValue: string): InspectHashRoute;
17
+ export function parseRoute(): InspectHashRoute;
18
+ export function setNavigateHandler(
19
+ handler: ((href: string) => void) | null,
20
+ ): void;
21
+ export function inspectPathToCanonicalHref(path: string): string;
22
+ export function navigate(path: string): void;
23
+
24
+ export const DAG_HISTORY_DEFAULT_PAGE: number;
25
+ export const DAG_HISTORY_DEFAULT_PAGE_SIZE: number;
26
+ export const DAG_HISTORY_ALLOWED_PAGE_SIZES: readonly number[];
27
+
28
+ export function clampDagHistoryPageSize(value: unknown): number;
29
+ export function clampDagHistoryPage(
30
+ value: unknown,
31
+ totalPages?: number,
32
+ ): number;
33
+ export function parseDagHistoryQuery(hashValue: string): {
34
+ page: number;
35
+ pageSize: number;
36
+ };
37
+ export function buildDagHistoryHash(page: unknown, pageSize: unknown): string;
38
+ export function parseHashFilters(hashValue: string): {
39
+ status?: string;
40
+ q?: string;
41
+ };
42
+ export function parseHashRouteWithFilters(hashValue: string): InspectHashRoute;
43
+ export function buildHashPath(
44
+ path: string,
45
+ filters?: Record<string, unknown>,
46
+ ): string;
@@ -1,7 +1,10 @@
1
1
  /** Hash routing for Observe UI (R5). */
2
2
 
3
3
  export function parseHashRoute(hashValue) {
4
- const hash = (hashValue.replace(/^#/, "") || "/").split("?")[0] || "/";
4
+ let hash = (hashValue.replace(/^#/, "") || "/").split("?")[0] || "/";
5
+ if (!hash.startsWith("/")) hash = `/${hash}`;
6
+ if (hash === "/inspect") hash = "/";
7
+ else if (hash.startsWith("/inspect/")) hash = hash.slice("/inspect".length) || "/";
5
8
  const batchMatch = /^\/batch\/([^/]+)$/.exec(hash);
6
9
  if (batchMatch) {
7
10
  return { view: "batch", batchRunId: decodeURIComponent(batchMatch[1]) };
@@ -61,7 +64,28 @@ export function parseRoute() {
61
64
  return parseHashRouteWithFilters(location.hash);
62
65
  }
63
66
 
67
+ let navigateHandler = null;
68
+
69
+ export function setNavigateHandler(handler) {
70
+ navigateHandler = typeof handler === "function" ? handler : null;
71
+ }
72
+
73
+ export function inspectPathToCanonicalHref(path) {
74
+ const raw = String(path ?? "");
75
+ if (raw.startsWith("/#/inspect")) return raw;
76
+ if (raw.startsWith("#/inspect")) return `/${raw}`;
77
+ const stripped = raw.replace(/^#/, "");
78
+ const withSlash = stripped.startsWith("/") ? stripped : `/${stripped}`;
79
+ if (withSlash === "/inspect" || withSlash === "/") return "/#/inspect";
80
+ if (withSlash.startsWith("/inspect/")) return `/#${withSlash}`;
81
+ return `/#/inspect${withSlash}`;
82
+ }
83
+
64
84
  export function navigate(path) {
85
+ if (navigateHandler) {
86
+ navigateHandler(inspectPathToCanonicalHref(path));
87
+ return;
88
+ }
65
89
  location.hash = path.startsWith("#") ? path.slice(1) : path;
66
90
  }
67
91
 
@@ -0,0 +1,50 @@
1
+ /** 与 state.js 对应的类型声明(供 vitest/TS 侧导入契约测试)。 */
2
+
3
+ export type ViewStateKind = "loading" | "empty" | "degraded" | "error";
4
+
5
+ export type ViewStateDescriptor = {
6
+ kind: ViewStateKind;
7
+ className: string;
8
+ role: string | null;
9
+ ariaLive: string | null;
10
+ message: string;
11
+ detail: string | null;
12
+ messageClass: string | null;
13
+ };
14
+
15
+ export const uiState: {
16
+ lastSnapshot: unknown;
17
+ specEvidenceDetail: {
18
+ source: string;
19
+ path: string;
20
+ loading: boolean;
21
+ error: string | null;
22
+ data: unknown;
23
+ triggerId: string | null;
24
+ } | null;
25
+ dagNodeExecutionOutputCache: Map<string, unknown> | null;
26
+ [key: string]: unknown;
27
+ };
28
+
29
+ export function setWorkspaceScope(workspaceId: string | null): void;
30
+ export function workspaceScope(): string | null;
31
+ export function scopedApiUrl(url: string): string;
32
+ export function workspaceRequestSignal(): AbortSignal | undefined;
33
+ export function fetchWithWorkspaceScope(
34
+ url: string,
35
+ init?: RequestInit,
36
+ ): Promise<Response>;
37
+ export function abortWorkspaceRequests(): void;
38
+ export function setWorkspaceActive(active: boolean): void;
39
+ export function stopTimers(): void;
40
+ export function pauseForegroundTimers(): void;
41
+
42
+ /** Multi-workspace atomic scope switch (2026-08-26, AC-006). */
43
+ export function applyWorkspaceScopeSwitch(
44
+ nextWorkspaceId: string | null,
45
+ routeValue?: (() => void) | string,
46
+ options?: {
47
+ route?: (hashValue: string) => void;
48
+ onTrace?: (trace: string[]) => void;
49
+ },
50
+ ): string[];
@@ -61,6 +61,12 @@ export const uiState = {
61
61
  dagNodeInputData: null,
62
62
  dagNodeInputError: null,
63
63
  dagNodeInputLoading: false,
64
+ /** Node-process request identity ("<dagRunId>:<nodeId>:<key>#<seq>"). */
65
+ dagNodeProcessIdentity: null,
66
+ dagNodeProcessRequestSeq: 0,
67
+ dagNodeProcessData: null,
68
+ dagNodeProcessError: null,
69
+ dagNodeProcessLoading: false,
64
70
  /**
65
71
  * Execution-output request identity ("<dagRunId>:<nodeId>:<key>#<seq>").
66
72
  * Stale async responses are rejected when this no longer matches.
@@ -76,7 +82,7 @@ export const uiState = {
76
82
  dagNodeExecutionOutputLoading: false,
77
83
  dagNodeExecutionOutputError: null,
78
84
  dagNodeExecutionOutputKey: null,
79
- /** When true,「执行过程」展开 message_start/end 原始协议事件。 */
85
+ /** When true,「执行过程」展开 message_start/end 原始协议事件。默认隐藏,用户可点选展开。 */
80
86
  sessionTimelineShowProtocol: false,
81
87
  /** Open <details> keys restored across timeline re-renders. */
82
88
  sessionTimelineOpenDetails: null,
@@ -110,6 +116,8 @@ export const uiState = {
110
116
  /** Last-rendered spec-evidence list, used to restore the list synchronously. */
111
117
  specEvidenceListEvidence: null,
112
118
  pollingGeneration: 0,
119
+ /** Hosted Inspect workspace is foreground. Standalone defaults to active. */
120
+ workspaceActive: true,
113
121
  };
114
122
 
115
123
  /** Per-dagRunId graph viewport restore map (stable Map instance). */
@@ -222,6 +230,11 @@ export function makeDagNodeInputIdentity(dagRunId, nodeId) {
222
230
  return `${dagRunId}:${nodeId}#${uiState.dagNodeInputRequestSeq}`;
223
231
  }
224
232
 
233
+ export function makeDagNodeProcessIdentity(dagRunId, nodeId, key) {
234
+ uiState.dagNodeProcessRequestSeq += 1;
235
+ return `${dagRunId}:${nodeId}:${key ?? "latest"}#${uiState.dagNodeProcessRequestSeq}`;
236
+ }
237
+
225
238
  /** Build a fresh execution-output identity token (includes key). */
226
239
  export function makeDagNodeExecutionOutputIdentity(dagRunId, nodeId, key) {
227
240
  uiState.dagNodeExecutionOutputRequestSeq += 1;
@@ -268,16 +281,186 @@ export function isPageVisible() {
268
281
  );
269
282
  }
270
283
 
284
+ export function isWorkspaceActive() {
285
+ return uiState.workspaceActive !== false;
286
+ }
287
+
288
+ export function setWorkspaceActive(active) {
289
+ uiState.workspaceActive = Boolean(active);
290
+ }
291
+
292
+ /**
293
+ * Multi-workspace scope (2026-08-23): every Observe GET must carry the
294
+ * current workspaceId (AC-002/AC-003). The scope is synced from the parent
295
+ * Console shell hash (`?workspaceId=`) or via postMessage for hosted mode;
296
+ * standalone pages default to null and all workspace-scoped routes fail closed
297
+ * until the host or hash publishes an explicit workspace id.
298
+ */
299
+ let currentWorkspaceScope = null;
300
+ let currentWorkspaceRequestController =
301
+ typeof AbortController === "undefined" ? null : new AbortController();
302
+
303
+ export function setWorkspaceScope(workspaceId) {
304
+ currentWorkspaceScope =
305
+ typeof workspaceId === "string" && workspaceId.trim()
306
+ ? workspaceId.trim()
307
+ : null;
308
+ }
309
+
310
+ export function workspaceScope() {
311
+ return currentWorkspaceScope;
312
+ }
313
+
314
+ /** Signal shared by every workspace-scoped Observe request in the active scope. */
315
+ export function workspaceRequestSignal() {
316
+ if (
317
+ typeof AbortController !== "undefined" &&
318
+ (!currentWorkspaceRequestController ||
319
+ currentWorkspaceRequestController.signal.aborted)
320
+ ) {
321
+ currentWorkspaceRequestController = new AbortController();
322
+ }
323
+ return currentWorkspaceRequestController?.signal;
324
+ }
325
+
326
+ function combinedRequestSignal(scopeSignal, requestSignal) {
327
+ const signals = [scopeSignal, requestSignal].filter(Boolean);
328
+ if (signals.length <= 1) return { signal: signals[0], cleanup: () => {} };
329
+ const controller = new AbortController();
330
+ const abort = () => controller.abort();
331
+ for (const signal of signals) {
332
+ if (signal.aborted) abort();
333
+ else signal.addEventListener("abort", abort, { once: true });
334
+ }
335
+ return {
336
+ signal: controller.signal,
337
+ cleanup: () => {
338
+ for (const signal of signals) signal.removeEventListener("abort", abort);
339
+ },
340
+ };
341
+ }
342
+
343
+ /** Fetch through the current workspace boundary and abort on any scope swap. */
344
+ export async function fetchWithWorkspaceScope(url, init = {}) {
345
+ const { signal: requestSignal, ...rest } = init;
346
+ const combined = combinedRequestSignal(
347
+ workspaceRequestSignal(),
348
+ requestSignal,
349
+ );
350
+ try {
351
+ return await fetch(scopedApiUrl(url), {
352
+ ...rest,
353
+ ...(combined.signal ? { signal: combined.signal } : {}),
354
+ });
355
+ } finally {
356
+ combined.cleanup();
357
+ }
358
+ }
359
+
360
+ /** Abort every old-scope request and invalidate request identity guards. */
361
+ export function abortWorkspaceRequests() {
362
+ currentWorkspaceRequestController?.abort();
363
+ currentWorkspaceRequestController =
364
+ typeof AbortController === "undefined" ? null : new AbortController();
365
+ uiState.dagHistoryAbortController?.abort?.();
366
+ uiState.dagHistoryAbortController = null;
367
+ uiState.dagHistoryRequestSeq += 1;
368
+ uiState.dagHistoryPrefetchGeneration += 1;
369
+ uiState.dagNodeInputRequestSeq += 1;
370
+ uiState.dagNodeProcessRequestSeq += 1;
371
+ uiState.dagNodeExecutionOutputRequestSeq += 1;
372
+ }
373
+
374
+ /** Multi-workspace atomic scope switch (2026-08-26, AC-006).
375
+ *
376
+ * Contract order — strictly sequential, no interleaving:
377
+ * 1. abort old — stop every poll/SSE so no late request can race the swap;
378
+ * 2. clear old — drop cached run/task/selection state of the old scope;
379
+ * 3. set scope — publish the new workspaceId for scopedApiUrl;
380
+ * 4. reload new — re-route/re-render with the new scope active.
381
+ *
382
+ * Observability: each stage appends to the returned trace so tests (and
383
+ * diagnostics) can assert the exact ordering; there is no window in which a
384
+ * new route is requested with the old scope or vice versa.
385
+ */
386
+ export function applyWorkspaceScopeSwitch(
387
+ nextWorkspaceId,
388
+ routeValue,
389
+ options = {},
390
+ ) {
391
+ const trace = [];
392
+ // 1. abort old
393
+ abortWorkspaceRequests();
394
+ stopTimers();
395
+ pauseForegroundTimers();
396
+ trace.push("abort-old");
397
+ // 2. clear old
398
+ uiState.lastSnapshot = null;
399
+ uiState.specEvidenceDetail = null;
400
+ uiState.specEvidenceListEvidence = null;
401
+ clearDagNodeExecutionOutputCache();
402
+ trace.push("clear-old");
403
+ // 3. set scope
404
+ setWorkspaceScope(nextWorkspaceId);
405
+ trace.push(`set-scope:${workspaceScope() ?? ""}`);
406
+ // 4. route/reload new
407
+ if (typeof routeValue === "function") routeValue();
408
+ else if (typeof routeValue === "string") options.route?.(routeValue);
409
+ trace.push("route-new");
410
+ if (options.onTrace) options.onTrace(trace);
411
+ return trace;
412
+ }
413
+
414
+ /** Append ?workspaceId= to an observe API URL (real request path kept). */
415
+ export function scopedApiUrl(url) {
416
+ const raw = String(url ?? "");
417
+ if (!currentWorkspaceScope || !raw.startsWith("/api/")) return raw;
418
+ const qIndex = raw.indexOf("?");
419
+ if (qIndex >= 0) {
420
+ const params = new URLSearchParams(raw.slice(qIndex + 1));
421
+ if (params.has("workspaceId")) return raw;
422
+ params.set("workspaceId", currentWorkspaceScope);
423
+ return `${raw.slice(0, qIndex)}?${params.toString()}`;
424
+ }
425
+ return `${raw}?workspaceId=${encodeURIComponent(currentWorkspaceScope)}`;
426
+ }
427
+
271
428
  export function detailPollDelay(status, isVisible) {
272
429
  const normalizedStatus = (status ?? "").toLowerCase().replace(/-/g, "_");
273
430
  if (TERMINAL_RUN_STATUSES.has(normalizedStatus)) return null;
431
+ if (!isWorkspaceActive()) return null;
274
432
  return isVisible ? ACTIVE_DETAIL_POLL_MS : HIDDEN_POLL_MS;
275
433
  }
276
434
 
277
435
  export function dashboardPollDelay() {
436
+ if (!isWorkspaceActive()) return null;
278
437
  return isPageVisible() ? DASHBOARD_POLL_MS : HIDDEN_POLL_MS;
279
438
  }
280
439
 
440
+ /** Stop pausable timers without destroying route/selection/scroll. */
441
+ export function pauseForegroundTimers() {
442
+ if (uiState.dashboardTimer) {
443
+ clearTimeout(uiState.dashboardTimer);
444
+ uiState.dashboardTimer = null;
445
+ }
446
+ if (uiState.runPollTimer) {
447
+ clearTimeout(uiState.runPollTimer);
448
+ uiState.runPollTimer = null;
449
+ }
450
+ if (uiState.dagPollTimer) {
451
+ clearTimeout(uiState.dagPollTimer);
452
+ uiState.dagPollTimer = null;
453
+ }
454
+ if (uiState.poolTimer) {
455
+ clearTimeout(uiState.poolTimer);
456
+ uiState.poolTimer = null;
457
+ }
458
+ if (uiState.taskPollTimer) {
459
+ clearTimeout(uiState.taskPollTimer);
460
+ uiState.taskPollTimer = null;
461
+ }
462
+ }
463
+
281
464
  export function updateDagGraphViewportState(
282
465
  _previous,
283
466
  dagRunId,