@tea-agent/loop-agent 0.39.0-next.8 → 0.39.0

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 (254) hide show
  1. package/AGENTS.md +4 -1
  2. package/CHANGELOG.md +264 -67
  3. package/README.md +11 -5
  4. package/bin/loop-agent.js +7 -3
  5. package/dist/application/dag/generate-task-dag.js +9 -0
  6. package/dist/application/task-lifecycle/advance.js +4 -0
  7. package/dist/build-stamp.json +3 -3
  8. package/dist/cli/command-definitions.js +16 -5
  9. package/dist/cli/program.js +16 -2
  10. package/dist/cli/update/notifier.js +2 -2
  11. package/dist/cli.js +2 -1
  12. package/dist/commands/dag-rerun.js +55 -1
  13. package/dist/commands/init-model-catalog.js +464 -0
  14. package/dist/commands/init-upgrade.js +265 -97
  15. package/dist/commands/init.js +428 -27
  16. package/dist/commands/inspect-next.js +8 -0
  17. package/dist/commands/task-advance.js +31 -0
  18. package/dist/executors/dag-pi-executor.js +124 -18
  19. package/dist/executors/pi-event-serializer.js +42 -1
  20. package/dist/executors/pi-executor.js +51 -0
  21. package/dist/executors/pi-extension-resolver.js +233 -0
  22. package/dist/executors/pi-playwright-cli-tool.js +74 -28
  23. package/dist/executors/pi-sdk-executor.js +187 -59
  24. package/dist/executors/shell-executor.js +554 -33
  25. package/dist/executors/shell-write-guard.js +7 -0
  26. package/dist/shared/dag-failure-category.js +138 -0
  27. package/dist/shared/dag-prompt-override.js +28 -0
  28. package/dist/shared/operator/capabilities.js +181 -27
  29. package/dist/shared/playwright-cli-command-policy.js +15 -0
  30. package/dist/shared/update/console-notifier.js +100 -0
  31. package/dist/{cli → shared}/update/npm-client.js +41 -8
  32. package/dist/{cli → shared}/update/state.js +41 -13
  33. package/dist/task/config-types.js +28 -0
  34. package/dist/task/contract/constants.js +1 -0
  35. package/dist/task/contract/diff.js +26 -0
  36. package/dist/task/contract/project.js +5 -0
  37. package/dist/task/contract/schema.js +6 -1
  38. package/dist/task/source-prepare/build-draft.js +15 -0
  39. package/dist/task/source-prepare/parse-intent.js +24 -4
  40. package/dist/worker/cli.js +31 -1
  41. package/dist/worker/console/chat/deferred-turn.js +91 -0
  42. package/dist/worker/console/chat/mcp-inventory.js +221 -0
  43. package/dist/worker/console/chat/operation-card.js +8 -1
  44. package/dist/worker/console/chat/pi-console-config.js +81 -10
  45. package/dist/worker/console/chat/pi-runtime.js +165 -83
  46. package/dist/worker/console/chat/repo-walk.js +10 -1
  47. package/dist/worker/console/chat/routes.js +480 -55
  48. package/dist/worker/console/chat/semantic-activity.js +20 -8
  49. package/dist/worker/console/chat/session-store.js +146 -2
  50. package/dist/worker/console/chat/turn-process.js +10 -10
  51. package/dist/worker/console/dag-execution-receipt.js +33 -0
  52. package/dist/worker/console/inspect-split.js +18 -0
  53. package/dist/worker/console/operation-run-facts.js +19 -3
  54. package/dist/worker/console/operator-actions.js +195 -4
  55. package/dist/worker/console/operator-user-error.js +2 -2
  56. package/dist/worker/console/pi-readiness.js +5 -4
  57. package/dist/worker/console/recovery-cta.js +4 -4
  58. package/dist/worker/console/recovery-error-copy.js +4 -4
  59. package/dist/worker/console/routes.js +43 -2
  60. package/dist/worker/console/security.js +63 -9
  61. package/dist/worker/console/server.js +42 -6
  62. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-BLXFe4qI.js → abnfDiagram-N423BO3Z-Br92EGb7.js} +1 -1
  63. package/dist/worker/console/static/assets/{arc-7iOJeqho.js → arc-oulImtQq.js} +1 -1
  64. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CYoyj5K7.js → architectureDiagram-T3A2C74G-tyHc6aqO.js} +1 -1
  65. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-fK01JNlR.js → blockDiagram-VBNYF7ZC-CY86BSpT.js} +1 -1
  66. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-bzbw5D_Z.js → c4Diagram-5PPSVZJV-BKKsDmNs.js} +1 -1
  67. package/dist/worker/console/static/assets/channel-TY36zt-i.js +1 -0
  68. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Cf6hJFFG.js → chunk-2GRJ4B5K-CXZdjl3B.js} +1 -1
  69. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DSFXR-et.js → chunk-2Q5K7J3B-B-aIFDQ5.js} +1 -1
  70. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BagJechl.js → chunk-5RXB4S5H-BDgAW_B2.js} +1 -1
  71. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-E7QNMFaW.js → chunk-5VM5RSS4-DABa4UPR.js} +1 -1
  72. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BG_eOBrC.js → chunk-6Q2QTUOP-aGbysVOx.js} +1 -1
  73. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-Bo42dqol.js → chunk-GF5L2VYU-B8MSZDVs.js} +1 -1
  74. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-dibM-87v.js → chunk-JWPE2WC7-CpelV73g.js} +1 -1
  75. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-Bytrp3Oe.js → chunk-KBJHAD2P-BE04ty3z.js} +1 -1
  76. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DBABILrr.js → chunk-RYQCIY6F-BUxTkaaR.js} +1 -1
  77. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DCUk5Pf9.js → chunk-XXDRQBXY-CYYBVKfX.js} +1 -1
  78. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Dk7QCChM.js +1 -0
  79. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Dk7QCChM.js +1 -0
  80. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BlGE9v6E.js → cose-bilkent-JH36ORCC-CEQF_xmQ.js} +1 -1
  81. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-DGl5ewph.js → cynefin-VYW2F7L2-CqpxN5IT.js} +1 -1
  82. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-DsJ_SVH_.js → cynefinDiagram-MW4NZA55-B3PzanVi.js} +1 -1
  83. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BIhjFdzv.js → dagre-VZM6K2ZE-BSUGCNx1.js} +1 -1
  84. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dmy1ctTb.js → diagram-7IWD3JNH-CdLevU5T.js} +1 -1
  85. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-DYCtWUF3.js → diagram-B4RE2ZJO-BjpF_Kok.js} +1 -1
  86. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-BMZFHVd2.js → diagram-LBJQPF4R-C4I6NJny.js} +1 -1
  87. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-b_U8gfaO.js → diagram-Q27KOJAE-C8hecCr5.js} +1 -1
  88. package/dist/worker/console/static/assets/{diagram-UB23O5K3-Dzy_bn-I.js → diagram-UB23O5K3-Daod6tOS.js} +1 -1
  89. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DJCiMNEI.js → ebnfDiagram-BXEA7PRR-BvvmazGv.js} +1 -1
  90. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-28lD016B.js → erDiagram-JOGREHBK-DeN_vfV4.js} +1 -1
  91. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DGyHJmIw.js → flowDiagram-UKHOOZJN-D6dq1t9z.js} +1 -1
  92. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CzdwUjrO.js → ganttDiagram-PKOTCBZU-DziIdNY4.js} +1 -1
  93. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-D9bGwuo8.js → gitGraphDiagram-DS77QQ5N-Dy4s5CXr.js} +1 -1
  94. package/dist/worker/console/static/assets/index-C3GgHg-g.css +1 -0
  95. package/dist/worker/console/static/assets/index-Ci8ksvBm.js +406 -0
  96. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-LJgJUQFC.js → infoDiagram-6WML65LV-Czv5eYx2.js} +1 -1
  97. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-98LaB8zb.js → ishikawaDiagram-WSZJBQD7-Bsk3nFRT.js} +1 -1
  98. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-D-ISzwlQ.js → journeyDiagram-NVQOT4AX-DxGmNj5K.js} +1 -1
  99. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-gfYOI-EL.js → kanban-definition-27J2QSJJ-CYCFqkO_.js} +1 -1
  100. package/dist/worker/console/static/assets/{linear-CyntZgKV.js → linear-B0YzRwrd.js} +1 -1
  101. package/dist/worker/console/static/assets/{mermaid.core-BBOR7dg0.js → mermaid.core-t3EZtIGh.js} +5 -5
  102. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CQAgwPMk.js → mindmap-definition-FAOFIHXS-BTXpTv0T.js} +1 -1
  103. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DkMiZFuV.js → pegDiagram-VL7TDLO6-DU8UkKqA.js} +1 -1
  104. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DLNXa_0J.js → pieDiagram-7S7Q4E2Y-DP4y8ohp.js} +1 -1
  105. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Dc7bdzjm.js → quadrantDiagram-CIZ2JOQS-B07vNaYR.js} +1 -1
  106. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BxMB0QqW.js → railroadDiagram-AXF67PYL-xDWktb2i.js} +1 -1
  107. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-FjumoKn4.js → requirementDiagram-LRYGKXZP-BLNMKqeS.js} +1 -1
  108. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-CkhKc_E3.js → sankeyDiagram-W5VNT64P-n0adalxH.js} +1 -1
  109. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DoBWqTTH.js → sequenceDiagram-SI44F4Z6-BbnS-2DL.js} +1 -1
  110. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CQeh_YeE.js → sizeCapture-X5ZJPWSS-B4uPpCLu.js} +1 -1
  111. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-LuHmFW-I.js → stateDiagram-OKZ733FA--MMbB0fX.js} +1 -1
  112. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BqOigMQ4.js +1 -0
  113. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CHwbDctY.js → swimlanes-SLNWSIFB-BXUgp2QY.js} +2 -2
  114. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Caxz9UA2.js +8 -0
  115. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CoMngk0X.js → timeline-definition-Z64GVDOM-CsaMxki7.js} +1 -1
  116. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-CURYbtbO.js → vennDiagram-T6HMQDX7-C2IuG9iH.js} +1 -1
  117. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-BdqSECjU.js → wardleyDiagram-T6FBY63Y-CmEWOXCW.js} +1 -1
  118. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-DbMUYuAg.js → xychartDiagram-ELKLHX3M-D_9LE0MG.js} +1 -1
  119. package/dist/worker/console/static/index.html +2 -2
  120. package/dist/worker/console/static-src/app/useOperatorActions.js +1 -1
  121. package/dist/worker/console/static-src/app/useRecoveryActions.js +2 -2
  122. package/dist/worker/console/static-src/app/useRecoveryConsole.js +38 -2
  123. package/dist/worker/console/static-src/app/useRunProgress.js +46 -0
  124. package/dist/worker/console/static-src/operator-chat/cards/failure-category-advice.js +25 -0
  125. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +74 -26
  126. package/dist/worker/console/static-src/operator-chat/input-history.js +76 -0
  127. package/dist/worker/console/static-src/operator-chat/mutation-gate.js +1 -1
  128. package/dist/worker/console/static-src/operator-chat/open-preview-in-browser.js +328 -0
  129. package/dist/worker/console/static-src/operator-chat/resource-diagnostics.js +204 -0
  130. package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +8 -1
  131. package/dist/worker/console/static-src/operator-chat/turn-submission.js +54 -0
  132. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +3 -0
  133. package/dist/worker/console/static-src/operator-chat/useChatStream.js +237 -11
  134. package/dist/worker/console/static-src/operator-chat/useChatThread.js +50 -22
  135. package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
  136. package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +26 -1
  137. package/dist/worker/console/static-src/pages/tasks/run-id-resolution.js +79 -0
  138. package/dist/worker/console/static-src/pages/tasks/run-ownership-verify.js +23 -0
  139. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +110 -0
  140. package/dist/worker/loop-agent/loop-agent-client.js +7 -3
  141. package/dist/worker/materialize/harness-task-lineage.js +5 -2
  142. package/dist/worker/observability/read-model.js +22 -0
  143. package/dist/worker/observe/node-input.js +74 -3
  144. package/dist/worker/observe/node-process.js +377 -0
  145. package/dist/worker/observe/routes.js +36 -3
  146. package/dist/worker/observe/shell-handler-keys.js +34 -0
  147. package/dist/worker/observe/static/api.js +66 -0
  148. package/dist/worker/observe/static/constants.js +8 -1
  149. package/dist/worker/observe/static/dag-history-labels.js +4 -0
  150. package/dist/worker/observe/static/format.js +23 -0
  151. package/dist/worker/observe/static/markdown-render.js +20 -1
  152. package/dist/worker/observe/static/operator-chrome.js +4 -0
  153. package/dist/worker/observe/static/state.js +13 -2
  154. package/dist/worker/observe/static/styles.css +73 -0
  155. package/dist/worker/observe/static/views/dag-inspector.js +612 -8
  156. package/dist/worker/observe/static/views/dag.js +8 -1
  157. package/dist/worker/observe/static/views/failures.js +5 -2
  158. package/dist/worker/observe/static/views/session-timeline.js +78 -9
  159. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +827 -53
  160. package/dist/workflows/dag/backend-test-case-manifest.js +4 -0
  161. package/dist/workflows/dag/backend-test-execution-contract.js +18 -9
  162. package/dist/workflows/dag/backend-test-gap-fill.js +205 -0
  163. package/dist/workflows/dag/backend-test-intake-context.js +32 -0
  164. package/dist/workflows/dag/backend-test-layout.js +133 -0
  165. package/dist/workflows/dag/backend-test-markdown-workflow.js +167 -32
  166. package/dist/workflows/dag/backend-test-module-stem.js +5 -0
  167. package/dist/workflows/dag/backend-test-pytest-collection.js +368 -33
  168. package/dist/workflows/dag/backend-test-result-contract.js +1 -1
  169. package/dist/workflows/dag/backend-test-scenario-param.js +884 -140
  170. package/dist/workflows/dag/backend-test-scenario-partitions.js +321 -0
  171. package/dist/workflows/dag/backend-test-writer-completeness.js +100 -56
  172. package/dist/workflows/dag/contract-output-registry.js +15 -0
  173. package/dist/workflows/dag/contract-validator-registrations.js +3 -1
  174. package/dist/workflows/dag/convergence/controller.js +141 -0
  175. package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
  176. package/dist/workflows/dag/dynamic-runtime/map.js +25 -9
  177. package/dist/workflows/dag/dynamic-runtime/shared.js +1 -1
  178. package/dist/workflows/dag/failure-category.js +7 -116
  179. package/dist/workflows/dag/frontend-implementation-contract.js +377 -4
  180. package/dist/workflows/dag/frontend-plan-render.js +1 -1
  181. package/dist/workflows/dag/frontend-prewrite-gate.js +96 -84
  182. package/dist/workflows/dag/frontend-repair.js +14 -0
  183. package/dist/workflows/dag/frontend-risk.js +15 -2
  184. package/dist/workflows/dag/frontend-test-case-checklist.js +30 -4
  185. package/dist/workflows/dag/frontend-test-case-manifest.js +11 -4
  186. package/dist/workflows/dag/frontend-test-case-quality.js +11 -16
  187. package/dist/workflows/dag/frontend-test-environment-probe.js +230 -0
  188. package/dist/workflows/dag/frontend-test-html-report.js +3 -1
  189. package/dist/workflows/dag/frontend-test-l5-report.js +3 -1
  190. package/dist/workflows/dag/frontend-test-layout.js +159 -0
  191. package/dist/workflows/dag/frontend-test-markdown.js +61 -0
  192. package/dist/workflows/dag/frontend-test-result-contract.js +188 -42
  193. package/dist/workflows/dag/frontend-test-standard-scenarios.js +70 -0
  194. package/dist/workflows/dag/frontend-verification-trace.js +29 -4
  195. package/dist/workflows/dag/init-hybrid.js +894 -205
  196. package/dist/workflows/dag/node-execution.js +183 -15
  197. package/dist/workflows/dag/prompt.js +60 -1
  198. package/dist/workflows/dag/rerun-feedback.js +212 -0
  199. package/dist/workflows/dag/rerun-plan.js +224 -27
  200. package/dist/workflows/dag/rerun-run.js +61 -6
  201. package/dist/workflows/dag/rerun-task.js +61 -2
  202. package/dist/workflows/dag/retry-policy.js +109 -0
  203. package/dist/workflows/dag/structured-output-repair.js +712 -0
  204. package/dist/workflows/dag/types.js +143 -1
  205. package/dist/workflows/dag/validate.js +64 -20
  206. package/docs/init-surface.manifest.json +5 -0
  207. package/docs/operations/README.md +1 -1
  208. package/docs/operations/local-development-environment.md +1 -5
  209. package/docs/skills/vetted-skill-registry.md +14 -0
  210. package/docs/templates/README.md +1 -1
  211. package/docs/templates/agent-dag.schema.json +44 -0
  212. package/docs/templates/backend-test-dag.json +60 -35
  213. package/docs/templates/frontend-implementation-contract.schema.json +1 -1
  214. package/docs/templates/frontend-test-case-checklist.md +2 -2
  215. package/docs/templates/frontend-test-dag.json +8 -10
  216. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +1 -1
  217. package/docs/templates/init-managed-agents.md +13 -3
  218. package/harness.json +6 -4
  219. package/package.json +12 -4
  220. package/scripts/next-info.mjs +356 -0
  221. package/scripts/next-publish-gate.mjs +238 -0
  222. package/scripts/release-source-binding.mjs +251 -0
  223. package/skills/analyze-product-requirements/SKILL.md +8 -5
  224. package/skills/analyze-product-requirements/references/acceptance-criteria.md +1 -1
  225. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +10 -6
  226. package/skills/analyze-product-requirements/references/example.md +50 -0
  227. package/skills/analyze-product-requirements/references/forward-test-cases.md +11 -7
  228. package/skills/analyze-product-requirements/references/kb-integration.md +5 -5
  229. package/skills/analyze-product-requirements/references/product-analysis-schema.md +8 -4
  230. package/skills/analyze-product-requirements/references/product-requirement-schema.md +2 -2
  231. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +1 -1
  232. package/skills/analyze-product-requirements/scripts/test-validators.mjs +11 -1
  233. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +20 -1
  234. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +9 -0
  235. package/skills/codebase-scout/SKILL.md +1 -1
  236. package/skills/fe-test-ui-scout/SKILL.md +65 -0
  237. package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
  238. package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
  239. package/skills/frontend-implementation/references/node-contracts.md +2 -2
  240. package/skills/improve-codebase-architecture/SKILL.md +81 -0
  241. package/skills/improve-codebase-architecture/deepening.md +37 -0
  242. package/skills/improve-codebase-architecture/html-report.md +123 -0
  243. package/skills/improve-codebase-architecture/interface-design.md +44 -0
  244. package/skills/improve-codebase-architecture/language.md +53 -0
  245. package/skills/loop-agent/references/command-reference.md +11 -4
  246. package/skills/playwright-cli/SKILL.md +23 -1
  247. package/skills/playwright-cli-case-generator/SKILL.md +29 -8
  248. package/dist/worker/console/static/assets/channel-BBOTJHvD.js +0 -1
  249. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Cm8Yf8tD.js +0 -1
  250. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Cm8Yf8tD.js +0 -1
  251. package/dist/worker/console/static/assets/index-B-qWGThd.js +0 -325
  252. package/dist/worker/console/static/assets/index-C-xRgY_0.css +0 -1
  253. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DZihfdKc.js +0 -1
  254. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CKnXCjHX.js +0 -8
@@ -38,6 +38,7 @@ function hasEngineeringBoundary(input) {
38
38
  return Boolean((input.allowedPaths && input.allowedPaths.length > 0) ||
39
39
  (input.forbiddenPaths && input.forbiddenPaths.length > 0) ||
40
40
  (input.verifyCommands && input.verifyCommands.length > 0) ||
41
+ input.backendTest !== undefined ||
41
42
  input.fromText ||
42
43
  input.fromDraftPath);
43
44
  }
@@ -632,6 +633,7 @@ export async function advanceTaskLifecycle(input) {
632
633
  allowedPaths: effectiveInput.allowedPaths,
633
634
  forbiddenPaths: input.forbiddenPaths,
634
635
  verifyCommands: effectiveInput.verifyCommands,
636
+ backendTest: input.backendTest,
635
637
  },
636
638
  });
637
639
  if (!prepareResult.ok) {
@@ -687,6 +689,7 @@ export async function advanceTaskLifecycle(input) {
687
689
  allowedPaths: effectiveInput.allowedPaths,
688
690
  forbiddenPaths: input.forbiddenPaths,
689
691
  verifyCommands: effectiveInput.verifyCommands,
692
+ backendTest: input.backendTest,
690
693
  },
691
694
  });
692
695
  if (semantic.ok) {
@@ -707,6 +710,7 @@ export async function advanceTaskLifecycle(input) {
707
710
  allowedPaths: effectiveInput.allowedPaths,
708
711
  forbiddenPaths: input.forbiddenPaths,
709
712
  verifyCommands: effectiveInput.verifyCommands,
713
+ backendTest: input.backendTest,
710
714
  },
711
715
  });
712
716
  if (retry.ok) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.37.0",
4
- "gitSha": "c53a8d98d6cc4d4d10644e5bed0c0bfe9dd766a3",
5
- "builtAt": "2026-08-18T06:31:04.444Z"
3
+ "version": "0.39.0",
4
+ "gitSha": "3a40d2f56f5b7d83ab97b7c031dc20932f95d1b6",
5
+ "builtAt": "2026-08-23T13:22:08.948Z"
6
6
  }
@@ -7,6 +7,7 @@ import { runCoverageReport } from "../commands/coverage-report.js";
7
7
  import { runExamples } from "../commands/examples.js";
8
8
  import { runHandoffCheck } from "../commands/handoff-check.js";
9
9
  import { runInspect } from "../commands/inspect.js";
10
+ import { runInspectNext } from "../commands/inspect-next.js";
10
11
  import { runInstructions } from "../commands/instructions.js";
11
12
  import { runTaskAdvance } from "../commands/task-advance.js";
12
13
  import { runTaskStatus } from "../commands/task-status.js";
@@ -74,6 +75,7 @@ export function parseSummaryFlag(tokens) {
74
75
  const DOCS_SUBCOMMANDS = ["audit", "archive"];
75
76
  const INIT_SUBCOMMANDS = [
76
77
  "instructions",
78
+ "model-catalog",
77
79
  "doctor",
78
80
  "check-update",
79
81
  "update",
@@ -162,10 +164,19 @@ export const COMMAND_DEFINITIONS = [
162
164
  name: "inspect",
163
165
  adapter: "required",
164
166
  tier: "operator",
165
- intent: "Inspect the target repo harness manifest.",
166
- usage: "inspect",
167
- handler: async ({ adapter, repoRoot }) => {
168
- await runInspect(adapter, repoRoot);
167
+ intent: "Inspect the target repo harness manifest, or report the current npm next binding.",
168
+ usage: "inspect | inspect next [--json]",
169
+ subcommands: ["next"],
170
+ handler: async ({ adapter, repoRoot, subcommand, rest }) => {
171
+ if (subcommand === "next") {
172
+ await runInspectNext(repoRoot, rest.filter((arg) => Boolean(arg)));
173
+ return;
174
+ }
175
+ if (subcommand === undefined || subcommand.startsWith("-")) {
176
+ await runInspect(adapter, repoRoot);
177
+ return;
178
+ }
179
+ throw new Error("usage: inspect | inspect next [--json]");
169
180
  },
170
181
  },
171
182
  {
@@ -205,7 +216,7 @@ export const COMMAND_DEFINITIONS = [
205
216
  adapter: "none",
206
217
  tier: "primary",
207
218
  intent: "Initialize a target repository with loop-agent harness capabilities.",
208
- usage: "init [instructions|doctor|check-update|update|reconcile|upgrade] [--profile full|minimal] [--merge] [--json|--markdown] [--bootstrap-surface|--apply-safe] [--client-recovery=auto|project|user|off] [--run-id <id> --status|--continue|--report]",
219
+ usage: "init [instructions|model-catalog|doctor|check-update|update|reconcile|upgrade] [--profile full|minimal] [--merge] [--model provider/model | --low-model provider/model --med-model provider/model --high-model provider/model] [--json|--markdown] [--bootstrap-surface|--apply-safe] [--client-recovery=auto|project|user|off] [--run-id <id> --status|--continue|--report]",
209
220
  subcommands: [...INIT_SUBCOMMANDS],
210
221
  handler: async ({ repoRoot, subcommand, rest }) => {
211
222
  await runInit(repoRoot, [subcommand, ...rest].filter(Boolean), { readRuntimeActivity: readInitRuntimeActivity });
@@ -33,6 +33,7 @@ import { runHarvest } from "../commands/harvest.js";
33
33
  import { runInit } from "../commands/init.js";
34
34
  import { readInitRuntimeActivity } from "./update/runtime-activity.js";
35
35
  import { runInspect } from "../commands/inspect.js";
36
+ import { runInspectNext } from "../commands/inspect-next.js";
36
37
  import { runInstructions } from "../commands/instructions.js";
37
38
  import { runKnowledge } from "../commands/knowledge.js";
38
39
  import { runLoop } from "../commands/loop.js";
@@ -97,6 +98,9 @@ async function dispatchRegisteredCommand(commandObject, defaultRepoRoot, rawArgs
97
98
  [...rest, ...rawArgs].some((token) => token === "--json")) ||
98
99
  (command === "stats" &&
99
100
  subcommand === "context" &&
101
+ [...rest, ...rawArgs].some((token) => token === "--json")) ||
102
+ (command === "inspect" &&
103
+ subcommand === "next" &&
100
104
  [...rest, ...rawArgs].some((token) => token === "--json"));
101
105
  const repoRoot = resolveRepoRootOnly(commandObject, defaultRepoRoot, {
102
106
  quiet,
@@ -125,8 +129,15 @@ async function runTaskCommand(repoRoot, subcommand, rest) {
125
129
  async function runCommanderAction(ctx, command, subcommand, rest) {
126
130
  switch (command) {
127
131
  case "inspect":
128
- await runInspect(ctx.adapter, ctx.repoRoot);
129
- return;
132
+ if (subcommand === "next") {
133
+ await runInspectNext(ctx.repoRoot, rest);
134
+ return;
135
+ }
136
+ if (subcommand === undefined || subcommand.startsWith("-")) {
137
+ await runInspect(ctx.adapter, ctx.repoRoot);
138
+ return;
139
+ }
140
+ throw new Error("usage: inspect | inspect next [--json]");
130
141
  case "doctor":
131
142
  await runDoctor(ctx.adapter, ctx.repoRoot, compactArgs([subcommand, ...rest]));
132
143
  return;
@@ -595,6 +606,9 @@ export function buildLoopAgentProgram(options) {
595
606
  .option("--no-merge", "skip existing files")
596
607
  .option("--provider <provider>", "provider paired with a bare --model (otherwise use provider/model)")
597
608
  .option("--model <model>", "qualified provider/model, or a bare model paired with --provider")
609
+ .option("--low-model <provider/model>", "credential-ready Pi model for LOW")
610
+ .option("--med-model <provider/model>", "credential-ready Pi model for MED")
611
+ .option("--high-model <provider/model>", "credential-ready Pi model for HIGH")
598
612
  .option("--json", "print JSON")
599
613
  .option("--markdown", "print Markdown")
600
614
  .option("--bootstrap-surface", "write an inferred .harness/init-surface.json baseline")
@@ -1,6 +1,6 @@
1
1
  import { createInterface } from "node:readline/promises";
2
2
  import { evaluateLatestVersion, shouldCheckForUpdates } from "./policy.js";
3
- import { acquireUpdateLock, readUpdateState, updateLockPath, updateStatePath, writeUpdateState, } from "./state.js";
3
+ import { acquireUpdateLock, readUpdateState, updateLockPath, updateStatePath, writeUpdateState, } from "../../shared/update/state.js";
4
4
  const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
5
5
  const FAILURE_COOLDOWN_MS = 10 * 60 * 1000;
6
6
  export async function runSelfUpdateNotifier(options) {
@@ -69,7 +69,7 @@ export async function runSelfUpdateNotifier(options) {
69
69
  }
70
70
  writeStderr(`loop-agent 已更新到 ${decision.targetVersion};新版本将在下一次调用时生效。\n`);
71
71
  await safeWriteState(statePath, {
72
- schemaVersion: 1,
72
+ ...state,
73
73
  lastCheckedAt: now().toISOString(),
74
74
  latestVersion: decision.targetVersion,
75
75
  });
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { buildLoopAgentProgram } from "./cli/program.js";
7
- import { createNpmUpdateClient } from "./cli/update/npm-client.js";
7
+ import { createNpmUpdateClient } from "./shared/update/npm-client.js";
8
8
  import { runSelfUpdateNotifier } from "./cli/update/notifier.js";
9
9
  import { resolveInitSurfaceRepoRoot, runInitSurfaceNotifier, } from "./cli/update/init-surface-notifier.js";
10
10
  async function main() {
@@ -29,6 +29,7 @@ async function main() {
29
29
  client: createNpmUpdateClient({
30
30
  currentVersion,
31
31
  packageRoot,
32
+ cwd: defaultRepoRoot,
32
33
  env: process.env,
33
34
  }),
34
35
  });
@@ -1,3 +1,5 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { isDagRerunPromptOverrideEnabled } from "../shared/dag-prompt-override.js";
1
3
  import { executeDagRerun, planDagRerun, } from "../workflows/dag/rerun-run.js";
2
4
  export function parseDagRerunArgs(args) {
3
5
  if (args.length === 0) {
@@ -9,6 +11,8 @@ export function parseDagRerunArgs(args) {
9
11
  let planHash;
10
12
  let requestId;
11
13
  let reason;
14
+ const promptOverrideSpecs = [];
15
+ const promptOverrideAppendSpecs = [];
12
16
  for (let index = 0; index < args.length; index += 1) {
13
17
  const arg = args[index];
14
18
  if (arg === "--run-id")
@@ -33,6 +37,14 @@ export function parseDagRerunArgs(args) {
33
37
  reason = args[++index];
34
38
  else if (arg.startsWith("--reason="))
35
39
  reason = arg.slice("--reason=".length);
40
+ else if (arg === "--prompt-override")
41
+ promptOverrideSpecs.push(args[++index] ?? "");
42
+ else if (arg.startsWith("--prompt-override="))
43
+ promptOverrideSpecs.push(arg.slice("--prompt-override=".length));
44
+ else if (arg === "--prompt-override-append")
45
+ promptOverrideAppendSpecs.push(args[++index] ?? "");
46
+ else if (arg.startsWith("--prompt-override-append="))
47
+ promptOverrideAppendSpecs.push(arg.slice("--prompt-override-append=".length));
36
48
  else if (arg === "--json")
37
49
  continue;
38
50
  else if (arg.startsWith("-"))
@@ -50,7 +62,13 @@ export function parseDagRerunArgs(args) {
50
62
  if (planHash || requestId || reason) {
51
63
  throw new Error("dag rerun --plan cannot be combined with execute flags");
52
64
  }
53
- return { parentRunId, selectedNodeId, planOnly: true };
65
+ return {
66
+ parentRunId,
67
+ selectedNodeId,
68
+ planOnly: true,
69
+ promptOverrideSpecs,
70
+ promptOverrideAppendSpecs,
71
+ };
54
72
  }
55
73
  if (!planHash?.trim()) {
56
74
  throw new Error("dag rerun execute requires --plan-hash <hash>");
@@ -68,15 +86,50 @@ export function parseDagRerunArgs(args) {
68
86
  planHash: planHash.trim(),
69
87
  requestId: requestId.trim(),
70
88
  reason: reason.trim(),
89
+ promptOverrideSpecs,
90
+ promptOverrideAppendSpecs,
71
91
  };
72
92
  }
93
+ async function loadPromptOverrides(specs, mode) {
94
+ const overrides = [];
95
+ for (const spec of specs) {
96
+ const separator = spec.indexOf("@");
97
+ if (separator <= 0 || separator >= spec.length - 1) {
98
+ throw new Error(`dag rerun --prompt-override${mode === "append" ? "-append" : ""} expects <nodeId>@<filePath>, got: ${spec}`);
99
+ }
100
+ const nodeId = spec.slice(0, separator);
101
+ const filePath = spec.slice(separator + 1);
102
+ let prompt;
103
+ try {
104
+ prompt = await readFile(filePath, "utf-8");
105
+ }
106
+ catch (error) {
107
+ throw new Error(`cannot read prompt override file for node ${nodeId} (${filePath}): ${error instanceof Error ? error.message : String(error)}`);
108
+ }
109
+ overrides.push(mode === "append" ? { nodeId, prompt, mode } : { nodeId, prompt });
110
+ }
111
+ return overrides;
112
+ }
73
113
  export async function runDagRerun(repoRoot, rawArgs) {
74
114
  const parsed = parseDagRerunArgs(rawArgs);
115
+ let promptOverrides;
116
+ const hasOverrides = parsed.promptOverrideSpecs.length > 0 ||
117
+ parsed.promptOverrideAppendSpecs.length > 0;
118
+ if (hasOverrides) {
119
+ if (!isDagRerunPromptOverrideEnabled()) {
120
+ throw new Error("prompt override rerun is disabled; set HARNESS_DAG_RERUN_PROMPT_OVERRIDE=1 to enable this experimental capability");
121
+ }
122
+ promptOverrides = [
123
+ ...(await loadPromptOverrides(parsed.promptOverrideSpecs, "replace")),
124
+ ...(await loadPromptOverrides(parsed.promptOverrideAppendSpecs, "append")),
125
+ ];
126
+ }
75
127
  if (parsed.planOnly) {
76
128
  const plan = await planDagRerun({
77
129
  cwd: repoRoot,
78
130
  parentRunId: parsed.parentRunId,
79
131
  selectedNodeId: parsed.selectedNodeId,
132
+ promptOverrides,
80
133
  });
81
134
  const result = {
82
135
  ok: plan.eligible,
@@ -95,6 +148,7 @@ export async function runDagRerun(repoRoot, rawArgs) {
95
148
  planHash: parsed.planHash,
96
149
  requestId: parsed.requestId,
97
150
  reason: parsed.reason,
151
+ promptOverrides,
98
152
  });
99
153
  console.log(JSON.stringify(result, null, 2));
100
154
  if (!result.ok) {