@zhixuan92/multi-model-agent-core 3.12.7 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1486) hide show
  1. package/README.md +135 -2
  2. package/dist/bounded-execution/activity-tracker-types.d.ts +77 -0
  3. package/dist/bounded-execution/activity-tracker-types.d.ts.map +1 -0
  4. package/dist/bounded-execution/activity-tracker-types.js +23 -0
  5. package/dist/bounded-execution/activity-tracker-types.js.map +1 -0
  6. package/dist/bounded-execution/activity-tracker.d.ts +67 -0
  7. package/dist/bounded-execution/activity-tracker.d.ts.map +1 -0
  8. package/dist/bounded-execution/activity-tracker.js +381 -0
  9. package/dist/bounded-execution/activity-tracker.js.map +1 -0
  10. package/dist/bounded-execution/cost-compute.d.ts +27 -0
  11. package/dist/bounded-execution/cost-compute.d.ts.map +1 -0
  12. package/dist/bounded-execution/cost-compute.js +72 -0
  13. package/dist/bounded-execution/cost-compute.js.map +1 -0
  14. package/dist/bounded-execution/cost-meter.d.ts +20 -0
  15. package/dist/bounded-execution/cost-meter.d.ts.map +1 -0
  16. package/dist/bounded-execution/cost-meter.js +21 -0
  17. package/dist/bounded-execution/cost-meter.js.map +1 -0
  18. package/dist/bounded-execution/cost-rollup.d.ts +17 -0
  19. package/dist/bounded-execution/cost-rollup.d.ts.map +1 -0
  20. package/dist/bounded-execution/cost-rollup.js +40 -0
  21. package/dist/bounded-execution/cost-rollup.js.map +1 -0
  22. package/dist/bounded-execution/error-classifier.d.ts +11 -0
  23. package/dist/bounded-execution/error-classifier.d.ts.map +1 -0
  24. package/dist/bounded-execution/error-classifier.js +23 -0
  25. package/dist/bounded-execution/error-classifier.js.map +1 -0
  26. package/dist/bounded-execution/file-artifact-check.d.ts.map +1 -0
  27. package/dist/bounded-execution/file-artifact-check.js.map +1 -0
  28. package/dist/bounded-execution/idle-guard.d.ts +8 -0
  29. package/dist/bounded-execution/idle-guard.d.ts.map +1 -0
  30. package/dist/bounded-execution/idle-guard.js +18 -0
  31. package/dist/bounded-execution/idle-guard.js.map +1 -0
  32. package/dist/bounded-execution/index.d.ts +7 -0
  33. package/dist/bounded-execution/index.d.ts.map +1 -0
  34. package/dist/bounded-execution/index.js +8 -0
  35. package/dist/bounded-execution/index.js.map +1 -0
  36. package/dist/bounded-execution/wall-clock-guard.d.ts +8 -0
  37. package/dist/bounded-execution/wall-clock-guard.d.ts.map +1 -0
  38. package/dist/bounded-execution/wall-clock-guard.js +27 -0
  39. package/dist/bounded-execution/wall-clock-guard.js.map +1 -0
  40. package/dist/cleanup/batch-retention-sweeper.d.ts +7 -0
  41. package/dist/cleanup/batch-retention-sweeper.d.ts.map +1 -0
  42. package/dist/cleanup/batch-retention-sweeper.js +10 -0
  43. package/dist/cleanup/batch-retention-sweeper.js.map +1 -0
  44. package/dist/cleanup/context-block-gc-sweeper.d.ts +8 -0
  45. package/dist/cleanup/context-block-gc-sweeper.d.ts.map +1 -0
  46. package/dist/cleanup/context-block-gc-sweeper.js +12 -0
  47. package/dist/cleanup/context-block-gc-sweeper.js.map +1 -0
  48. package/dist/cleanup/index.d.ts +5 -0
  49. package/dist/cleanup/index.d.ts.map +1 -0
  50. package/dist/cleanup/index.js +6 -0
  51. package/dist/cleanup/index.js.map +1 -0
  52. package/dist/cleanup/project-idle-cleanup.d.ts +7 -0
  53. package/dist/cleanup/project-idle-cleanup.d.ts.map +1 -0
  54. package/dist/cleanup/project-idle-cleanup.js +15 -0
  55. package/dist/cleanup/project-idle-cleanup.js.map +1 -0
  56. package/dist/cleanup/shutdown-coordinator.d.ts +7 -0
  57. package/dist/cleanup/shutdown-coordinator.d.ts.map +1 -0
  58. package/dist/cleanup/shutdown-coordinator.js +13 -0
  59. package/dist/cleanup/shutdown-coordinator.js.map +1 -0
  60. package/dist/config/canonical-model-identity.d.ts.map +1 -0
  61. package/dist/config/canonical-model-identity.js.map +1 -0
  62. package/dist/config/config-resolver.d.ts +47 -0
  63. package/dist/config/config-resolver.d.ts.map +1 -0
  64. package/dist/config/config-resolver.js +57 -0
  65. package/dist/config/config-resolver.js.map +1 -0
  66. package/dist/config/index.d.ts +8 -0
  67. package/dist/config/index.d.ts.map +1 -0
  68. package/dist/config/index.js +9 -0
  69. package/dist/config/index.js.map +1 -0
  70. package/dist/config/load.d.ts +2 -7
  71. package/dist/config/load.d.ts.map +1 -1
  72. package/dist/config/load.js +4 -16
  73. package/dist/config/load.js.map +1 -1
  74. package/dist/config/model-profile-registry.d.ts +121 -0
  75. package/dist/config/model-profile-registry.d.ts.map +1 -0
  76. package/dist/config/model-profile-registry.js +382 -0
  77. package/dist/config/model-profile-registry.js.map +1 -0
  78. package/dist/config/pricing-table.d.ts +16 -0
  79. package/dist/config/pricing-table.d.ts.map +1 -0
  80. package/dist/config/pricing-table.js +51 -0
  81. package/dist/config/pricing-table.js.map +1 -0
  82. package/dist/config/schema.d.ts +8 -72
  83. package/dist/config/schema.d.ts.map +1 -1
  84. package/dist/config/schema.js +8 -12
  85. package/dist/config/schema.js.map +1 -1
  86. package/dist/config/tier-policy-registry.d.ts +12 -0
  87. package/dist/config/tier-policy-registry.d.ts.map +1 -0
  88. package/dist/config/tier-policy-registry.js +13 -0
  89. package/dist/config/tier-policy-registry.js.map +1 -0
  90. package/dist/error-codes.d.ts +36 -1
  91. package/dist/error-codes.d.ts.map +1 -1
  92. package/dist/error-codes.js +52 -1
  93. package/dist/error-codes.js.map +1 -1
  94. package/dist/escalation/agent-resolver.d.ts +7 -0
  95. package/dist/escalation/agent-resolver.d.ts.map +1 -0
  96. package/dist/escalation/agent-resolver.js +16 -0
  97. package/dist/escalation/agent-resolver.js.map +1 -0
  98. package/dist/escalation/delegate-with-escalation.d.ts +28 -0
  99. package/dist/escalation/delegate-with-escalation.d.ts.map +1 -0
  100. package/dist/escalation/delegate-with-escalation.js +205 -0
  101. package/dist/escalation/delegate-with-escalation.js.map +1 -0
  102. package/dist/escalation/escalation-policy.d.ts +18 -0
  103. package/dist/escalation/escalation-policy.d.ts.map +1 -0
  104. package/dist/escalation/escalation-policy.js +34 -0
  105. package/dist/escalation/escalation-policy.js.map +1 -0
  106. package/dist/escalation/fallback-helpers.d.ts +22 -0
  107. package/dist/escalation/fallback-helpers.d.ts.map +1 -0
  108. package/dist/escalation/fallback-helpers.js +46 -0
  109. package/dist/escalation/fallback-helpers.js.map +1 -0
  110. package/dist/escalation/fallback-types.d.ts +60 -0
  111. package/dist/escalation/fallback-types.d.ts.map +1 -0
  112. package/dist/escalation/fallback-types.js +11 -0
  113. package/dist/escalation/fallback-types.js.map +1 -0
  114. package/dist/escalation/fallback.d.ts +3 -85
  115. package/dist/escalation/fallback.d.ts.map +1 -1
  116. package/dist/escalation/fallback.js +26 -130
  117. package/dist/escalation/fallback.js.map +1 -1
  118. package/dist/escalation/index.d.ts +3 -0
  119. package/dist/escalation/index.d.ts.map +1 -0
  120. package/dist/escalation/index.js +4 -0
  121. package/dist/escalation/index.js.map +1 -0
  122. package/dist/escalation/types.d.ts.map +1 -0
  123. package/dist/escalation/types.js.map +1 -0
  124. package/dist/events/caller-response-channel.d.ts +17 -0
  125. package/dist/events/caller-response-channel.d.ts.map +1 -0
  126. package/dist/events/caller-response-channel.js +10 -0
  127. package/dist/events/caller-response-channel.js.map +1 -0
  128. package/dist/events/clamp.d.ts.map +1 -0
  129. package/dist/events/clamp.js.map +1 -0
  130. package/dist/events/cloud-events.d.ts +114 -0
  131. package/dist/events/cloud-events.d.ts.map +1 -0
  132. package/dist/events/cloud-events.js +59 -0
  133. package/dist/events/cloud-events.js.map +1 -0
  134. package/dist/events/concern-classifier.d.ts +9 -0
  135. package/dist/events/concern-classifier.d.ts.map +1 -0
  136. package/dist/events/concern-classifier.js.map +1 -0
  137. package/dist/events/consent-rules.d.ts.map +1 -0
  138. package/dist/events/consent-rules.js.map +1 -0
  139. package/dist/events/diagnostics-types.d.ts +65 -0
  140. package/dist/events/diagnostics-types.d.ts.map +1 -0
  141. package/dist/events/diagnostics-types.js +2 -0
  142. package/dist/events/diagnostics-types.js.map +1 -0
  143. package/dist/events/event-base.d.ts +14 -0
  144. package/dist/events/event-base.d.ts.map +1 -0
  145. package/dist/events/event-base.js +24 -0
  146. package/dist/events/event-base.js.map +1 -0
  147. package/dist/events/event-builder.d.ts +20 -0
  148. package/dist/events/event-builder.d.ts.map +1 -0
  149. package/dist/events/event-builder.js +347 -0
  150. package/dist/events/event-builder.js.map +1 -0
  151. package/dist/events/event-emitter.d.ts +30 -0
  152. package/dist/events/event-emitter.d.ts.map +1 -0
  153. package/dist/events/event-emitter.js +58 -0
  154. package/dist/events/event-emitter.js.map +1 -0
  155. package/dist/events/http-server-log.d.ts +63 -0
  156. package/dist/events/http-server-log.d.ts.map +1 -0
  157. package/dist/events/http-server-log.js.map +1 -0
  158. package/dist/events/index.d.ts +6 -0
  159. package/dist/events/index.d.ts.map +1 -0
  160. package/dist/events/index.js +7 -0
  161. package/dist/events/index.js.map +1 -0
  162. package/dist/events/jsonl-writer.d.ts.map +1 -0
  163. package/dist/events/jsonl-writer.js.map +1 -0
  164. package/dist/events/local-log-sink.d.ts +10 -0
  165. package/dist/events/local-log-sink.d.ts.map +1 -0
  166. package/dist/events/local-log-sink.js.map +1 -0
  167. package/dist/events/normalize.d.ts +18 -0
  168. package/dist/events/normalize.d.ts.map +1 -0
  169. package/dist/events/normalize.js +18 -0
  170. package/dist/events/normalize.js.map +1 -0
  171. package/dist/events/observability-events.d.ts +1196 -0
  172. package/dist/events/observability-events.d.ts.map +1 -0
  173. package/dist/events/observability-events.js +380 -0
  174. package/dist/events/observability-events.js.map +1 -0
  175. package/dist/events/privacy-filter.d.ts +2 -0
  176. package/dist/events/privacy-filter.d.ts.map +1 -0
  177. package/dist/events/privacy-filter.js +10 -0
  178. package/dist/events/privacy-filter.js.map +1 -0
  179. package/dist/events/request-spill.d.ts.map +1 -0
  180. package/dist/events/request-spill.js.map +1 -0
  181. package/dist/events/telemetry-channel.d.ts +9 -0
  182. package/dist/events/telemetry-channel.d.ts.map +1 -0
  183. package/dist/events/telemetry-channel.js +16 -0
  184. package/dist/events/telemetry-channel.js.map +1 -0
  185. package/dist/events/telemetry-sink.d.ts +12 -0
  186. package/dist/events/telemetry-sink.d.ts.map +1 -0
  187. package/dist/events/telemetry-sink.js +24 -0
  188. package/dist/events/telemetry-sink.js.map +1 -0
  189. package/dist/events/telemetry-types.d.ts +1509 -0
  190. package/dist/events/telemetry-types.d.ts.map +1 -0
  191. package/dist/events/telemetry-types.js +289 -0
  192. package/dist/events/telemetry-types.js.map +1 -0
  193. package/dist/events/verbose-line.d.ts.map +1 -0
  194. package/dist/events/verbose-line.js +99 -0
  195. package/dist/events/verbose-line.js.map +1 -0
  196. package/dist/events/verbose-log-channel.d.ts +9 -0
  197. package/dist/events/verbose-log-channel.d.ts.map +1 -0
  198. package/dist/events/verbose-log-channel.js +26 -0
  199. package/dist/events/verbose-log-channel.js.map +1 -0
  200. package/dist/identity/auth-token-store.d.ts +17 -0
  201. package/dist/identity/auth-token-store.d.ts.map +1 -0
  202. package/dist/identity/auth-token-store.js +67 -0
  203. package/dist/identity/auth-token-store.js.map +1 -0
  204. package/dist/identity/cwd-validator.d.ts +6 -0
  205. package/dist/identity/cwd-validator.d.ts.map +1 -0
  206. package/dist/identity/cwd-validator.js +16 -0
  207. package/dist/identity/cwd-validator.js.map +1 -0
  208. package/dist/identity/host-allowlist.d.ts +6 -0
  209. package/dist/identity/host-allowlist.d.ts.map +1 -0
  210. package/dist/identity/host-allowlist.js +11 -0
  211. package/dist/identity/host-allowlist.js.map +1 -0
  212. package/dist/identity/index.d.ts +6 -0
  213. package/dist/identity/index.d.ts.map +1 -0
  214. package/dist/identity/index.js +7 -0
  215. package/dist/identity/index.js.map +1 -0
  216. package/dist/identity/secret-redactor.d.ts +2 -0
  217. package/dist/identity/secret-redactor.d.ts.map +1 -0
  218. package/dist/identity/secret-redactor.js +35 -0
  219. package/dist/identity/secret-redactor.js.map +1 -0
  220. package/dist/identity/ssrf-guard.d.ts +4 -0
  221. package/dist/identity/ssrf-guard.d.ts.map +1 -0
  222. package/dist/identity/ssrf-guard.js +19 -0
  223. package/dist/identity/ssrf-guard.js.map +1 -0
  224. package/dist/index.d.ts +69 -46
  225. package/dist/index.d.ts.map +1 -1
  226. package/dist/index.js +48 -30
  227. package/dist/index.js.map +1 -1
  228. package/dist/intake/brief-compiler-slots/audit.d.ts +23 -0
  229. package/dist/intake/brief-compiler-slots/audit.d.ts.map +1 -0
  230. package/dist/intake/brief-compiler-slots/audit.js +61 -0
  231. package/dist/intake/brief-compiler-slots/audit.js.map +1 -0
  232. package/dist/intake/brief-compiler-slots/debug.d.ts +41 -0
  233. package/dist/intake/brief-compiler-slots/debug.d.ts.map +1 -0
  234. package/dist/intake/brief-compiler-slots/debug.js +49 -0
  235. package/dist/intake/brief-compiler-slots/debug.js.map +1 -0
  236. package/dist/intake/brief-compiler-slots/delegate.d.ts +29 -0
  237. package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -0
  238. package/dist/intake/brief-compiler-slots/delegate.js +44 -0
  239. package/dist/intake/brief-compiler-slots/delegate.js.map +1 -0
  240. package/dist/intake/brief-compiler-slots/execute-plan.d.ts +49 -0
  241. package/dist/intake/brief-compiler-slots/execute-plan.d.ts.map +1 -0
  242. package/dist/intake/brief-compiler-slots/execute-plan.js +146 -0
  243. package/dist/intake/brief-compiler-slots/execute-plan.js.map +1 -0
  244. package/dist/intake/brief-compiler-slots/explore.d.ts +43 -0
  245. package/dist/intake/brief-compiler-slots/explore.d.ts.map +1 -0
  246. package/dist/intake/brief-compiler-slots/explore.js +116 -0
  247. package/dist/intake/brief-compiler-slots/explore.js.map +1 -0
  248. package/dist/intake/brief-compiler-slots/investigate.d.ts +26 -0
  249. package/dist/intake/brief-compiler-slots/investigate.d.ts.map +1 -0
  250. package/dist/intake/brief-compiler-slots/investigate.js +42 -0
  251. package/dist/intake/brief-compiler-slots/investigate.js.map +1 -0
  252. package/dist/intake/brief-compiler-slots/register-context-block.d.ts +17 -0
  253. package/dist/intake/brief-compiler-slots/register-context-block.d.ts.map +1 -0
  254. package/dist/intake/brief-compiler-slots/register-context-block.js +17 -0
  255. package/dist/intake/brief-compiler-slots/register-context-block.js.map +1 -0
  256. package/dist/intake/brief-compiler-slots/retry.d.ts +20 -0
  257. package/dist/intake/brief-compiler-slots/retry.d.ts.map +1 -0
  258. package/dist/intake/brief-compiler-slots/retry.js +37 -0
  259. package/dist/intake/brief-compiler-slots/retry.js.map +1 -0
  260. package/dist/intake/brief-compiler-slots/review.d.ts +34 -0
  261. package/dist/intake/brief-compiler-slots/review.d.ts.map +1 -0
  262. package/dist/intake/brief-compiler-slots/review.js +85 -0
  263. package/dist/intake/brief-compiler-slots/review.js.map +1 -0
  264. package/dist/intake/brief-compiler-slots/verify.d.ts +21 -0
  265. package/dist/intake/brief-compiler-slots/verify.d.ts.map +1 -0
  266. package/dist/intake/brief-compiler-slots/verify.js +62 -0
  267. package/dist/intake/brief-compiler-slots/verify.js.map +1 -0
  268. package/dist/intake/brief-compiler.d.ts +9 -0
  269. package/dist/intake/brief-compiler.d.ts.map +1 -0
  270. package/dist/intake/brief-compiler.js +8 -0
  271. package/dist/intake/brief-compiler.js.map +1 -0
  272. package/dist/intake/classify.d.ts.map +1 -1
  273. package/dist/intake/classify.js +3 -2
  274. package/dist/intake/classify.js.map +1 -1
  275. package/dist/intake/field-inferer.d.ts +10 -0
  276. package/dist/intake/field-inferer.d.ts.map +1 -0
  277. package/dist/intake/field-inferer.js +57 -0
  278. package/dist/intake/field-inferer.js.map +1 -0
  279. package/dist/intake/host-allowlist-builder.d.ts +25 -0
  280. package/dist/intake/host-allowlist-builder.d.ts.map +1 -0
  281. package/dist/intake/host-allowlist-builder.js +102 -0
  282. package/dist/intake/host-allowlist-builder.js.map +1 -0
  283. package/dist/intake/index.d.ts +5 -0
  284. package/dist/intake/index.d.ts.map +1 -0
  285. package/dist/intake/index.js +6 -0
  286. package/dist/intake/index.js.map +1 -0
  287. package/dist/intake/pipeline.d.ts +2 -2
  288. package/dist/intake/pipeline.d.ts.map +1 -1
  289. package/dist/intake/pipeline.js +7 -73
  290. package/dist/intake/pipeline.js.map +1 -1
  291. package/dist/intake/plan-extractor.d.ts +20 -0
  292. package/dist/intake/plan-extractor.d.ts.map +1 -0
  293. package/dist/intake/plan-extractor.js +87 -0
  294. package/dist/intake/plan-extractor.js.map +1 -0
  295. package/dist/intake/resolve.d.ts +2 -3
  296. package/dist/intake/resolve.d.ts.map +1 -1
  297. package/dist/intake/resolve.js +4 -12
  298. package/dist/intake/resolve.js.map +1 -1
  299. package/dist/intake/types.d.ts +3 -53
  300. package/dist/intake/types.d.ts.map +1 -1
  301. package/dist/intake/verify-referenced-blocks.d.ts +5 -0
  302. package/dist/intake/verify-referenced-blocks.d.ts.map +1 -0
  303. package/dist/intake/verify-referenced-blocks.js +9 -0
  304. package/dist/intake/verify-referenced-blocks.js.map +1 -0
  305. package/dist/lifecycle/auto-commit.d.ts +18 -0
  306. package/dist/lifecycle/auto-commit.d.ts.map +1 -0
  307. package/dist/lifecycle/auto-commit.js.map +1 -0
  308. package/dist/lifecycle/auto-register-context-block.d.ts +11 -0
  309. package/dist/lifecycle/auto-register-context-block.d.ts.map +1 -0
  310. package/dist/lifecycle/auto-register-context-block.js +18 -0
  311. package/dist/lifecycle/auto-register-context-block.js.map +1 -0
  312. package/dist/lifecycle/executor-output-types.d.ts +51 -0
  313. package/dist/lifecycle/executor-output-types.d.ts.map +1 -0
  314. package/dist/lifecycle/executor-output-types.js +2 -0
  315. package/dist/lifecycle/executor-output-types.js.map +1 -0
  316. package/dist/lifecycle/fallback-report.d.ts.map +1 -0
  317. package/dist/lifecycle/fallback-report.js.map +1 -0
  318. package/dist/lifecycle/handlers/baseline-handlers.d.ts +7 -0
  319. package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -0
  320. package/dist/lifecycle/handlers/baseline-handlers.js +193 -0
  321. package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -0
  322. package/dist/lifecycle/handlers/commit-stage.d.ts +16 -0
  323. package/dist/lifecycle/handlers/commit-stage.d.ts.map +1 -0
  324. package/dist/lifecycle/handlers/commit-stage.js +52 -0
  325. package/dist/lifecycle/handlers/commit-stage.js.map +1 -0
  326. package/dist/lifecycle/handlers/derive-terminal-status.d.ts +10 -0
  327. package/dist/lifecycle/handlers/derive-terminal-status.d.ts.map +1 -0
  328. package/dist/lifecycle/handlers/derive-terminal-status.js +35 -0
  329. package/dist/lifecycle/handlers/derive-terminal-status.js.map +1 -0
  330. package/dist/lifecycle/handlers/execution-context-builder.d.ts +5 -0
  331. package/dist/lifecycle/handlers/execution-context-builder.d.ts.map +1 -0
  332. package/dist/lifecycle/handlers/execution-context-builder.js +16 -0
  333. package/dist/lifecycle/handlers/execution-context-builder.js.map +1 -0
  334. package/dist/lifecycle/handlers/git-commit-handler.d.ts +19 -0
  335. package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +1 -0
  336. package/dist/lifecycle/handlers/git-commit-handler.js +52 -0
  337. package/dist/lifecycle/handlers/git-commit-handler.js.map +1 -0
  338. package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +19 -0
  339. package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -0
  340. package/dist/lifecycle/handlers/prepare-execution-context-handler.js +38 -0
  341. package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -0
  342. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts +22 -0
  343. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +1 -0
  344. package/dist/lifecycle/handlers/quality-chain-handlers.js +189 -0
  345. package/dist/lifecycle/handlers/quality-chain-handlers.js.map +1 -0
  346. package/dist/lifecycle/handlers/register-context-block-handlers.d.ts +3 -0
  347. package/dist/lifecycle/handlers/register-context-block-handlers.d.ts.map +1 -0
  348. package/dist/lifecycle/handlers/register-context-block-handlers.js +18 -0
  349. package/dist/lifecycle/handlers/register-context-block-handlers.js.map +1 -0
  350. package/dist/lifecycle/handlers/review-diff-handler.d.ts +31 -0
  351. package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +1 -0
  352. package/dist/lifecycle/handlers/review-diff-handler.js +107 -0
  353. package/dist/lifecycle/handlers/review-diff-handler.js.map +1 -0
  354. package/dist/lifecycle/handlers/run-verify-command-handler.d.ts +25 -0
  355. package/dist/lifecycle/handlers/run-verify-command-handler.d.ts.map +1 -0
  356. package/dist/lifecycle/handlers/run-verify-command-handler.js +75 -0
  357. package/dist/lifecycle/handlers/run-verify-command-handler.js.map +1 -0
  358. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts +21 -0
  359. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +1 -0
  360. package/dist/lifecycle/handlers/spec-chain-handlers.js +158 -0
  361. package/dist/lifecycle/handlers/spec-chain-handlers.js.map +1 -0
  362. package/dist/lifecycle/handlers/task-executor.d.ts +10 -0
  363. package/dist/lifecycle/handlers/task-executor.d.ts.map +1 -0
  364. package/dist/lifecycle/handlers/task-executor.js +16 -0
  365. package/dist/lifecycle/handlers/task-executor.js.map +1 -0
  366. package/dist/lifecycle/handlers/terminal-handlers.d.ts +6 -0
  367. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -0
  368. package/dist/lifecycle/handlers/terminal-handlers.js +106 -0
  369. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -0
  370. package/dist/lifecycle/handlers/verify-stage.d.ts +37 -0
  371. package/dist/lifecycle/handlers/verify-stage.d.ts.map +1 -0
  372. package/dist/lifecycle/handlers/verify-stage.js +208 -0
  373. package/dist/lifecycle/handlers/verify-stage.js.map +1 -0
  374. package/dist/lifecycle/index.d.ts +3 -0
  375. package/dist/lifecycle/index.d.ts.map +1 -0
  376. package/dist/lifecycle/index.js +4 -0
  377. package/dist/lifecycle/index.js.map +1 -0
  378. package/dist/lifecycle/lifecycle-context.d.ts +98 -0
  379. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -0
  380. package/dist/lifecycle/lifecycle-context.js +2 -0
  381. package/dist/lifecycle/lifecycle-context.js.map +1 -0
  382. package/dist/lifecycle/lifecycle-dispatcher.d.ts +36 -0
  383. package/dist/lifecycle/lifecycle-dispatcher.d.ts.map +1 -0
  384. package/dist/lifecycle/lifecycle-dispatcher.js +51 -0
  385. package/dist/lifecycle/lifecycle-dispatcher.js.map +1 -0
  386. package/dist/lifecycle/lifecycle-driver.d.ts +9 -0
  387. package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -0
  388. package/dist/lifecycle/lifecycle-driver.js +30 -0
  389. package/dist/lifecycle/lifecycle-driver.js.map +1 -0
  390. package/dist/lifecycle/metadata-repair.d.ts.map +1 -0
  391. package/dist/lifecycle/metadata-repair.js +33 -0
  392. package/dist/lifecycle/metadata-repair.js.map +1 -0
  393. package/dist/lifecycle/plan-extraction.d.ts.map +1 -0
  394. package/dist/lifecycle/plan-extraction.js.map +1 -0
  395. package/dist/lifecycle/shared-compute.d.ts +5 -0
  396. package/dist/lifecycle/shared-compute.d.ts.map +1 -0
  397. package/dist/lifecycle/shared-compute.js +19 -0
  398. package/dist/lifecycle/shared-compute.js.map +1 -0
  399. package/dist/lifecycle/stage-idle-tracker.d.ts.map +1 -0
  400. package/dist/lifecycle/stage-idle-tracker.js.map +1 -0
  401. package/dist/lifecycle/stage-plan-builder.d.ts +4 -0
  402. package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -0
  403. package/dist/lifecycle/stage-plan-builder.js +173 -0
  404. package/dist/lifecycle/stage-plan-builder.js.map +1 -0
  405. package/dist/lifecycle/stage-plan-types.d.ts +102 -0
  406. package/dist/lifecycle/stage-plan-types.d.ts.map +1 -0
  407. package/dist/lifecycle/stage-plan-types.js +2 -0
  408. package/dist/lifecycle/stage-plan-types.js.map +1 -0
  409. package/dist/lifecycle/stage-stats.d.ts +88 -0
  410. package/dist/lifecycle/stage-stats.d.ts.map +1 -0
  411. package/dist/lifecycle/stage-stats.js +156 -0
  412. package/dist/lifecycle/stage-stats.js.map +1 -0
  413. package/dist/lifecycle/task-completion-summary.d.ts.map +1 -0
  414. package/dist/lifecycle/task-completion-summary.js +93 -0
  415. package/dist/lifecycle/task-completion-summary.js.map +1 -0
  416. package/dist/lifecycle/task-executor.d.ts +24 -0
  417. package/dist/lifecycle/task-executor.d.ts.map +1 -0
  418. package/dist/lifecycle/task-executor.js +207 -0
  419. package/dist/lifecycle/task-executor.js.map +1 -0
  420. package/dist/lifecycle/task-runner.d.ts +79 -0
  421. package/dist/lifecycle/task-runner.d.ts.map +1 -0
  422. package/dist/lifecycle/task-runner.js +254 -0
  423. package/dist/lifecycle/task-runner.js.map +1 -0
  424. package/dist/lifecycle/tool-config-types.d.ts +27 -0
  425. package/dist/lifecycle/tool-config-types.d.ts.map +1 -0
  426. package/dist/lifecycle/tool-config-types.js +2 -0
  427. package/dist/lifecycle/tool-config-types.js.map +1 -0
  428. package/dist/lifecycle/worker-status.d.ts +9 -0
  429. package/dist/lifecycle/worker-status.d.ts.map +1 -0
  430. package/dist/lifecycle/worker-status.js +19 -0
  431. package/dist/lifecycle/worker-status.js.map +1 -0
  432. package/dist/model-profiles.json +607 -125
  433. package/dist/providers/anthropic-messages-adapter.d.ts +18 -0
  434. package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -0
  435. package/dist/providers/anthropic-messages-adapter.js +81 -0
  436. package/dist/providers/anthropic-messages-adapter.js.map +1 -0
  437. package/dist/providers/base/research-tools.d.ts.map +1 -0
  438. package/dist/providers/base/research-tools.js.map +1 -0
  439. package/dist/providers/base/result-builders.d.ts +82 -0
  440. package/dist/providers/base/result-builders.d.ts.map +1 -0
  441. package/dist/providers/base/result-builders.js +112 -0
  442. package/dist/providers/base/result-builders.js.map +1 -0
  443. package/dist/providers/base/time-check.d.ts.map +1 -0
  444. package/dist/providers/base/time-check.js.map +1 -0
  445. package/dist/providers/base/types.d.ts +53 -0
  446. package/dist/providers/base/types.d.ts.map +1 -0
  447. package/dist/providers/base/types.js.map +1 -0
  448. package/dist/providers/base/usage-accumulator.d.ts +9 -0
  449. package/dist/providers/base/usage-accumulator.d.ts.map +1 -0
  450. package/dist/providers/base/usage-accumulator.js +20 -0
  451. package/dist/providers/base/usage-accumulator.js.map +1 -0
  452. package/dist/providers/call-cache.d.ts.map +1 -0
  453. package/dist/providers/call-cache.js.map +1 -0
  454. package/dist/providers/error-classification.d.ts +49 -0
  455. package/dist/providers/error-classification.d.ts.map +1 -0
  456. package/dist/providers/error-classification.js +140 -0
  457. package/dist/providers/error-classification.js.map +1 -0
  458. package/dist/providers/file-tracker.d.ts +47 -0
  459. package/dist/providers/file-tracker.d.ts.map +1 -0
  460. package/dist/providers/file-tracker.js +71 -0
  461. package/dist/providers/file-tracker.js.map +1 -0
  462. package/dist/providers/index.d.ts +16 -0
  463. package/dist/providers/index.d.ts.map +1 -0
  464. package/dist/providers/index.js +17 -0
  465. package/dist/providers/index.js.map +1 -0
  466. package/dist/providers/injection-type.d.ts.map +1 -0
  467. package/dist/providers/injection-type.js.map +1 -0
  468. package/dist/providers/make-runner-shell.d.ts +4 -0
  469. package/dist/providers/make-runner-shell.d.ts.map +1 -0
  470. package/dist/providers/make-runner-shell.js +69 -0
  471. package/dist/providers/make-runner-shell.js.map +1 -0
  472. package/dist/providers/openai-chat-adapter.d.ts +17 -0
  473. package/dist/providers/openai-chat-adapter.d.ts.map +1 -0
  474. package/dist/providers/openai-chat-adapter.js +87 -0
  475. package/dist/providers/openai-chat-adapter.js.map +1 -0
  476. package/dist/providers/openai-responses-adapter.d.ts +16 -0
  477. package/dist/providers/openai-responses-adapter.d.ts.map +1 -0
  478. package/dist/providers/openai-responses-adapter.js +109 -0
  479. package/dist/providers/openai-responses-adapter.js.map +1 -0
  480. package/dist/providers/openai-usage-interceptor.d.ts.map +1 -0
  481. package/dist/providers/openai-usage-interceptor.js +121 -0
  482. package/dist/providers/openai-usage-interceptor.js.map +1 -0
  483. package/dist/providers/prevention.d.ts.map +1 -0
  484. package/dist/providers/prevention.js +108 -0
  485. package/dist/providers/prevention.js.map +1 -0
  486. package/dist/providers/provider-factory.d.ts +13 -0
  487. package/dist/providers/provider-factory.d.ts.map +1 -0
  488. package/dist/providers/provider-factory.js +127 -0
  489. package/dist/providers/provider-factory.js.map +1 -0
  490. package/dist/providers/runner-adapter.d.ts +42 -0
  491. package/dist/providers/runner-adapter.d.ts.map +1 -0
  492. package/dist/providers/runner-adapter.js +2 -0
  493. package/dist/providers/runner-adapter.js.map +1 -0
  494. package/dist/providers/runner-shell-types.d.ts +37 -0
  495. package/dist/providers/runner-shell-types.d.ts.map +1 -0
  496. package/dist/providers/runner-shell-types.js +2 -0
  497. package/dist/providers/runner-shell-types.js.map +1 -0
  498. package/dist/providers/runner-shell.d.ts +8 -0
  499. package/dist/providers/runner-shell.d.ts.map +1 -0
  500. package/dist/providers/runner-shell.js +78 -0
  501. package/dist/providers/runner-shell.js.map +1 -0
  502. package/dist/providers/runner-types.d.ts +174 -0
  503. package/dist/providers/runner-types.d.ts.map +1 -0
  504. package/dist/providers/runner-types.js +2 -0
  505. package/dist/providers/runner-types.js.map +1 -0
  506. package/dist/providers/scratchpad-salvager.d.ts +19 -0
  507. package/dist/providers/scratchpad-salvager.d.ts.map +1 -0
  508. package/dist/providers/scratchpad-salvager.js +44 -0
  509. package/dist/providers/scratchpad-salvager.js.map +1 -0
  510. package/dist/providers/stall-detector.d.ts +22 -0
  511. package/dist/providers/stall-detector.d.ts.map +1 -0
  512. package/dist/providers/stall-detector.js +43 -0
  513. package/dist/providers/stall-detector.js.map +1 -0
  514. package/dist/providers/supervision.d.ts +108 -0
  515. package/dist/providers/supervision.d.ts.map +1 -0
  516. package/dist/providers/supervision.js +272 -0
  517. package/dist/providers/supervision.js.map +1 -0
  518. package/dist/providers/text-scratchpad.d.ts +28 -0
  519. package/dist/providers/text-scratchpad.d.ts.map +1 -0
  520. package/dist/providers/text-scratchpad.js +49 -0
  521. package/dist/providers/text-scratchpad.js.map +1 -0
  522. package/dist/providers/tool-definitions.d.ts +6 -0
  523. package/dist/providers/tool-definitions.d.ts.map +1 -0
  524. package/dist/providers/tool-definitions.js +236 -0
  525. package/dist/providers/tool-definitions.js.map +1 -0
  526. package/dist/providers/tool-implementations.d.ts +26 -0
  527. package/dist/providers/tool-implementations.d.ts.map +1 -0
  528. package/dist/providers/tool-implementations.js +221 -0
  529. package/dist/providers/tool-implementations.js.map +1 -0
  530. package/dist/providers/tool-tracker.d.ts +14 -0
  531. package/dist/providers/tool-tracker.d.ts.map +1 -0
  532. package/dist/providers/tool-tracker.js +13 -0
  533. package/dist/providers/tool-tracker.js.map +1 -0
  534. package/dist/reporting/batch-persister.d.ts +4 -0
  535. package/dist/reporting/batch-persister.d.ts.map +1 -0
  536. package/dist/reporting/batch-persister.js +11 -0
  537. package/dist/reporting/batch-persister.js.map +1 -0
  538. package/dist/reporting/commit-stage-runner.d.ts +12 -0
  539. package/dist/reporting/commit-stage-runner.d.ts.map +1 -0
  540. package/dist/reporting/commit-stage-runner.js +43 -0
  541. package/dist/reporting/commit-stage-runner.js.map +1 -0
  542. package/dist/reporting/compose-terminal-headline.d.ts +0 -1
  543. package/dist/reporting/compose-terminal-headline.d.ts.map +1 -1
  544. package/dist/reporting/compose-terminal-headline.js +2 -5
  545. package/dist/reporting/compose-terminal-headline.js.map +1 -1
  546. package/dist/reporting/derive-explore-status.d.ts +1 -1
  547. package/dist/reporting/derive-explore-status.d.ts.map +1 -1
  548. package/dist/reporting/derive-explore-status.js +2 -6
  549. package/dist/reporting/derive-explore-status.js.map +1 -1
  550. package/dist/reporting/derive-investigate-status.d.ts +2 -4
  551. package/dist/reporting/derive-investigate-status.d.ts.map +1 -1
  552. package/dist/reporting/derive-investigate-status.js +3 -10
  553. package/dist/reporting/derive-investigate-status.js.map +1 -1
  554. package/dist/reporting/headline-composer.d.ts +17 -0
  555. package/dist/reporting/headline-composer.d.ts.map +1 -0
  556. package/dist/reporting/headline-composer.js +10 -0
  557. package/dist/reporting/headline-composer.js.map +1 -0
  558. package/dist/reporting/headline-templates/audit.d.ts +3 -0
  559. package/dist/reporting/headline-templates/audit.d.ts.map +1 -0
  560. package/dist/reporting/headline-templates/audit.js +12 -0
  561. package/dist/reporting/headline-templates/audit.js.map +1 -0
  562. package/dist/reporting/headline-templates/debug.d.ts +8 -0
  563. package/dist/reporting/headline-templates/debug.d.ts.map +1 -0
  564. package/dist/reporting/headline-templates/debug.js +15 -0
  565. package/dist/reporting/headline-templates/debug.js.map +1 -0
  566. package/dist/reporting/headline-templates/delegate.d.ts +3 -0
  567. package/dist/reporting/headline-templates/delegate.d.ts.map +1 -0
  568. package/dist/reporting/headline-templates/delegate.js +12 -0
  569. package/dist/reporting/headline-templates/delegate.js.map +1 -0
  570. package/dist/reporting/headline-templates/execute-plan.d.ts +3 -0
  571. package/dist/reporting/headline-templates/execute-plan.d.ts.map +1 -0
  572. package/dist/reporting/headline-templates/execute-plan.js +14 -0
  573. package/dist/reporting/headline-templates/execute-plan.js.map +1 -0
  574. package/dist/reporting/headline-templates/explore.d.ts +3 -0
  575. package/dist/reporting/headline-templates/explore.d.ts.map +1 -0
  576. package/dist/reporting/headline-templates/explore.js +13 -0
  577. package/dist/reporting/headline-templates/explore.js.map +1 -0
  578. package/dist/reporting/headline-templates/investigate.d.ts +13 -0
  579. package/dist/reporting/headline-templates/investigate.d.ts.map +1 -0
  580. package/dist/reporting/headline-templates/investigate.js +53 -0
  581. package/dist/reporting/headline-templates/investigate.js.map +1 -0
  582. package/dist/reporting/headline-templates/register-context-block.d.ts +3 -0
  583. package/dist/reporting/headline-templates/register-context-block.d.ts.map +1 -0
  584. package/dist/reporting/headline-templates/register-context-block.js +6 -0
  585. package/dist/reporting/headline-templates/register-context-block.js.map +1 -0
  586. package/dist/reporting/headline-templates/retry.d.ts +3 -0
  587. package/dist/reporting/headline-templates/retry.d.ts.map +1 -0
  588. package/dist/reporting/headline-templates/retry.js +9 -0
  589. package/dist/reporting/headline-templates/retry.js.map +1 -0
  590. package/dist/reporting/headline-templates/review.d.ts +3 -0
  591. package/dist/reporting/headline-templates/review.d.ts.map +1 -0
  592. package/dist/reporting/headline-templates/review.js +15 -0
  593. package/dist/reporting/headline-templates/review.js.map +1 -0
  594. package/dist/reporting/headline-templates/verify.d.ts +3 -0
  595. package/dist/reporting/headline-templates/verify.d.ts.map +1 -0
  596. package/dist/reporting/headline-templates/verify.js +12 -0
  597. package/dist/reporting/headline-templates/verify.js.map +1 -0
  598. package/dist/reporting/index.d.ts +9 -0
  599. package/dist/reporting/index.d.ts.map +1 -0
  600. package/dist/reporting/index.js +10 -0
  601. package/dist/reporting/index.js.map +1 -0
  602. package/dist/reporting/report-parser-slots/audit-report.d.ts +13 -0
  603. package/dist/reporting/report-parser-slots/audit-report.d.ts.map +1 -0
  604. package/dist/reporting/report-parser-slots/audit-report.js +9 -0
  605. package/dist/reporting/report-parser-slots/audit-report.js.map +1 -0
  606. package/dist/reporting/report-parser-slots/debug-report.d.ts +9 -0
  607. package/dist/reporting/report-parser-slots/debug-report.d.ts.map +1 -0
  608. package/dist/reporting/report-parser-slots/debug-report.js +9 -0
  609. package/dist/reporting/report-parser-slots/debug-report.js.map +1 -0
  610. package/dist/reporting/report-parser-slots/delegate-report.d.ts +8 -0
  611. package/dist/reporting/report-parser-slots/delegate-report.d.ts.map +1 -0
  612. package/dist/reporting/report-parser-slots/delegate-report.js +19 -0
  613. package/dist/reporting/report-parser-slots/delegate-report.js.map +1 -0
  614. package/dist/reporting/report-parser-slots/execute-plan-report.d.ts +11 -0
  615. package/dist/reporting/report-parser-slots/execute-plan-report.d.ts.map +1 -0
  616. package/dist/reporting/report-parser-slots/execute-plan-report.js +9 -0
  617. package/dist/reporting/report-parser-slots/execute-plan-report.js.map +1 -0
  618. package/dist/reporting/report-parser-slots/explore-report.d.ts +17 -0
  619. package/dist/reporting/report-parser-slots/explore-report.d.ts.map +1 -0
  620. package/dist/reporting/report-parser-slots/explore-report.js +9 -0
  621. package/dist/reporting/report-parser-slots/explore-report.js.map +1 -0
  622. package/dist/reporting/report-parser-slots/investigate-report.d.ts +46 -0
  623. package/dist/reporting/report-parser-slots/investigate-report.d.ts.map +1 -0
  624. package/dist/reporting/report-parser-slots/investigate-report.js +159 -0
  625. package/dist/reporting/report-parser-slots/investigate-report.js.map +1 -0
  626. package/dist/reporting/report-parser-slots/register-context-block-report.d.ts +8 -0
  627. package/dist/reporting/report-parser-slots/register-context-block-report.d.ts.map +1 -0
  628. package/dist/reporting/report-parser-slots/register-context-block-report.js +9 -0
  629. package/dist/reporting/report-parser-slots/register-context-block-report.js.map +1 -0
  630. package/dist/reporting/report-parser-slots/retry-report.d.ts +8 -0
  631. package/dist/reporting/report-parser-slots/retry-report.d.ts.map +1 -0
  632. package/dist/reporting/report-parser-slots/retry-report.js +9 -0
  633. package/dist/reporting/report-parser-slots/retry-report.js.map +1 -0
  634. package/dist/reporting/report-parser-slots/review-report.d.ts +14 -0
  635. package/dist/reporting/report-parser-slots/review-report.d.ts.map +1 -0
  636. package/dist/reporting/report-parser-slots/review-report.js +9 -0
  637. package/dist/reporting/report-parser-slots/review-report.js.map +1 -0
  638. package/dist/reporting/report-parser-slots/verify-report.d.ts +10 -0
  639. package/dist/reporting/report-parser-slots/verify-report.d.ts.map +1 -0
  640. package/dist/reporting/report-parser-slots/verify-report.js +9 -0
  641. package/dist/reporting/report-parser-slots/verify-report.js.map +1 -0
  642. package/dist/reporting/response-envelope-builder.d.ts +32 -0
  643. package/dist/reporting/response-envelope-builder.d.ts.map +1 -0
  644. package/dist/reporting/response-envelope-builder.js +26 -0
  645. package/dist/reporting/response-envelope-builder.js.map +1 -0
  646. package/dist/reporting/structured-report-parser.d.ts +9 -0
  647. package/dist/reporting/structured-report-parser.d.ts.map +1 -0
  648. package/dist/reporting/structured-report-parser.js +8 -0
  649. package/dist/reporting/structured-report-parser.js.map +1 -0
  650. package/dist/reporting/structured-report.js +1 -1
  651. package/dist/reporting/terminal-block-registrar.d.ts +14 -0
  652. package/dist/reporting/terminal-block-registrar.d.ts.map +1 -0
  653. package/dist/reporting/terminal-block-registrar.js +17 -0
  654. package/dist/reporting/terminal-block-registrar.js.map +1 -0
  655. package/dist/reporting/terminal-status-deriver.d.ts +22 -0
  656. package/dist/reporting/terminal-status-deriver.d.ts.map +1 -0
  657. package/dist/reporting/terminal-status-deriver.js +38 -0
  658. package/dist/reporting/terminal-status-deriver.js.map +1 -0
  659. package/dist/reporting/verify-stage-runner.d.ts +21 -0
  660. package/dist/reporting/verify-stage-runner.d.ts.map +1 -0
  661. package/dist/reporting/verify-stage-runner.js +102 -0
  662. package/dist/reporting/verify-stage-runner.js.map +1 -0
  663. package/dist/research/explore-orchestrator.d.ts +14 -0
  664. package/dist/research/explore-orchestrator.d.ts.map +1 -0
  665. package/dist/research/explore-orchestrator.js +363 -0
  666. package/dist/research/explore-orchestrator.js.map +1 -0
  667. package/dist/research/index.d.ts +3 -0
  668. package/dist/research/index.d.ts.map +1 -0
  669. package/dist/research/index.js +4 -0
  670. package/dist/research/index.js.map +1 -0
  671. package/dist/research/web-fetch-helpers.d.ts +48 -0
  672. package/dist/research/web-fetch-helpers.d.ts.map +1 -0
  673. package/dist/research/web-fetch-helpers.js +225 -0
  674. package/dist/research/web-fetch-helpers.js.map +1 -0
  675. package/dist/research/web-fetch.d.ts.map +1 -1
  676. package/dist/research/web-fetch.js +1 -230
  677. package/dist/research/web-fetch.js.map +1 -1
  678. package/dist/review/annotator-engine.d.ts +30 -0
  679. package/dist/review/annotator-engine.d.ts.map +1 -0
  680. package/dist/review/annotator-engine.js +40 -0
  681. package/dist/review/annotator-engine.js.map +1 -0
  682. package/dist/review/annotator-output-parser.d.ts +13 -0
  683. package/dist/review/annotator-output-parser.d.ts.map +1 -0
  684. package/dist/review/annotator-output-parser.js +24 -0
  685. package/dist/review/annotator-output-parser.js.map +1 -0
  686. package/dist/review/annotator-prompt-builder.d.ts +9 -0
  687. package/dist/review/annotator-prompt-builder.d.ts.map +1 -0
  688. package/dist/review/annotator-prompt-builder.js +28 -0
  689. package/dist/review/annotator-prompt-builder.js.map +1 -0
  690. package/dist/review/default-engines.d.ts +5 -0
  691. package/dist/review/default-engines.d.ts.map +1 -0
  692. package/dist/review/default-engines.js +24 -0
  693. package/dist/review/default-engines.js.map +1 -0
  694. package/dist/review/index.d.ts +8 -0
  695. package/dist/review/index.d.ts.map +1 -0
  696. package/dist/review/index.js +9 -0
  697. package/dist/review/index.js.map +1 -0
  698. package/dist/review/review-types.d.ts +15 -0
  699. package/dist/review/review-types.d.ts.map +1 -0
  700. package/dist/review/review-types.js +3 -0
  701. package/dist/review/review-types.js.map +1 -0
  702. package/dist/review/review-verdict-aggregator.d.ts +17 -0
  703. package/dist/review/review-verdict-aggregator.d.ts.map +1 -0
  704. package/dist/review/review-verdict-aggregator.js +30 -0
  705. package/dist/review/review-verdict-aggregator.js.map +1 -0
  706. package/dist/review/review-verdict-mapping.d.ts +16 -0
  707. package/dist/review/review-verdict-mapping.d.ts.map +1 -0
  708. package/dist/review/review-verdict-mapping.js +24 -0
  709. package/dist/review/review-verdict-mapping.js.map +1 -0
  710. package/dist/review/reviewer-engine.d.ts +54 -0
  711. package/dist/review/reviewer-engine.d.ts.map +1 -0
  712. package/dist/review/reviewer-engine.js +58 -0
  713. package/dist/review/reviewer-engine.js.map +1 -0
  714. package/dist/review/reviewer-output-parser.d.ts +17 -0
  715. package/dist/review/reviewer-output-parser.d.ts.map +1 -0
  716. package/dist/review/reviewer-output-parser.js +62 -0
  717. package/dist/review/reviewer-output-parser.js.map +1 -0
  718. package/dist/review/reviewer-prompt-builder.d.ts +34 -0
  719. package/dist/review/reviewer-prompt-builder.d.ts.map +1 -0
  720. package/dist/review/reviewer-prompt-builder.js +28 -0
  721. package/dist/review/reviewer-prompt-builder.js.map +1 -0
  722. package/dist/review/templates/annotator-audit.d.ts +3 -0
  723. package/dist/review/templates/annotator-audit.d.ts.map +1 -0
  724. package/dist/review/templates/annotator-audit.js +5 -0
  725. package/dist/review/templates/annotator-audit.js.map +1 -0
  726. package/dist/review/templates/annotator-debug.d.ts +3 -0
  727. package/dist/review/templates/annotator-debug.d.ts.map +1 -0
  728. package/dist/review/templates/annotator-debug.js +5 -0
  729. package/dist/review/templates/annotator-debug.js.map +1 -0
  730. package/dist/review/templates/annotator-investigate.d.ts +3 -0
  731. package/dist/review/templates/annotator-investigate.d.ts.map +1 -0
  732. package/dist/review/templates/annotator-investigate.js +5 -0
  733. package/dist/review/templates/annotator-investigate.js.map +1 -0
  734. package/dist/review/templates/annotator-review.d.ts +3 -0
  735. package/dist/review/templates/annotator-review.d.ts.map +1 -0
  736. package/dist/review/templates/annotator-review.js +5 -0
  737. package/dist/review/templates/annotator-review.js.map +1 -0
  738. package/dist/review/templates/annotator-shared.d.ts +10 -0
  739. package/dist/review/templates/annotator-shared.d.ts.map +1 -0
  740. package/dist/review/templates/annotator-shared.js +62 -0
  741. package/dist/review/templates/annotator-shared.js.map +1 -0
  742. package/dist/review/templates/annotator-verify.d.ts +3 -0
  743. package/dist/review/templates/annotator-verify.d.ts.map +1 -0
  744. package/dist/review/templates/annotator-verify.js +5 -0
  745. package/dist/review/templates/annotator-verify.js.map +1 -0
  746. package/dist/review/templates/diff-review.d.ts +3 -0
  747. package/dist/review/templates/diff-review.d.ts.map +1 -0
  748. package/dist/review/templates/diff-review.js +7 -0
  749. package/dist/review/templates/diff-review.js.map +1 -0
  750. package/dist/review/templates/quality-review-artifact.d.ts +3 -0
  751. package/dist/review/templates/quality-review-artifact.d.ts.map +1 -0
  752. package/dist/review/templates/quality-review-artifact.js +8 -0
  753. package/dist/review/templates/quality-review-artifact.js.map +1 -0
  754. package/dist/review/templates/quality-review-audit.d.ts +3 -0
  755. package/dist/review/templates/quality-review-audit.d.ts.map +1 -0
  756. package/dist/review/templates/quality-review-audit.js +9 -0
  757. package/dist/review/templates/quality-review-audit.js.map +1 -0
  758. package/dist/review/templates/quality-review-debug.d.ts +3 -0
  759. package/dist/review/templates/quality-review-debug.d.ts.map +1 -0
  760. package/dist/review/templates/quality-review-debug.js +9 -0
  761. package/dist/review/templates/quality-review-debug.js.map +1 -0
  762. package/dist/review/templates/quality-review-investigate.d.ts +3 -0
  763. package/dist/review/templates/quality-review-investigate.d.ts.map +1 -0
  764. package/dist/review/templates/quality-review-investigate.js +9 -0
  765. package/dist/review/templates/quality-review-investigate.js.map +1 -0
  766. package/dist/review/templates/quality-review-review.d.ts +3 -0
  767. package/dist/review/templates/quality-review-review.d.ts.map +1 -0
  768. package/dist/review/templates/quality-review-review.js +9 -0
  769. package/dist/review/templates/quality-review-review.js.map +1 -0
  770. package/dist/review/templates/quality-review-verify.d.ts +3 -0
  771. package/dist/review/templates/quality-review-verify.d.ts.map +1 -0
  772. package/dist/review/templates/quality-review-verify.js +9 -0
  773. package/dist/review/templates/quality-review-verify.js.map +1 -0
  774. package/dist/review/templates/shared.d.ts +9 -0
  775. package/dist/review/templates/shared.d.ts.map +1 -0
  776. package/dist/review/templates/shared.js +2 -0
  777. package/dist/review/templates/shared.js.map +1 -0
  778. package/dist/review/templates/spec-review.d.ts +3 -0
  779. package/dist/review/templates/spec-review.d.ts.map +1 -0
  780. package/dist/review/templates/spec-review.js +8 -0
  781. package/dist/review/templates/spec-review.js.map +1 -0
  782. package/dist/stores/batch-cache.d.ts +29 -0
  783. package/dist/stores/batch-cache.d.ts.map +1 -0
  784. package/dist/stores/batch-cache.js +89 -0
  785. package/dist/stores/batch-cache.js.map +1 -0
  786. package/dist/stores/batch-registry.d.ts +101 -0
  787. package/dist/stores/batch-registry.d.ts.map +1 -0
  788. package/dist/stores/batch-registry.js +171 -0
  789. package/dist/stores/batch-registry.js.map +1 -0
  790. package/dist/stores/context-block-tool.d.ts +92 -0
  791. package/dist/stores/context-block-tool.d.ts.map +1 -0
  792. package/dist/stores/context-block-tool.js +137 -0
  793. package/dist/stores/context-block-tool.js.map +1 -0
  794. package/dist/stores/expand-context-blocks.d.ts +20 -0
  795. package/dist/stores/expand-context-blocks.d.ts.map +1 -0
  796. package/dist/stores/expand-context-blocks.js +46 -0
  797. package/dist/stores/expand-context-blocks.js.map +1 -0
  798. package/dist/stores/index.d.ts +4 -0
  799. package/dist/stores/index.d.ts.map +1 -0
  800. package/dist/stores/index.js +5 -0
  801. package/dist/stores/index.js.map +1 -0
  802. package/dist/stores/project-context-registry.d.ts +17 -0
  803. package/dist/stores/project-context-registry.d.ts.map +1 -0
  804. package/dist/stores/project-context-registry.js +16 -0
  805. package/dist/stores/project-context-registry.js.map +1 -0
  806. package/dist/tool-surface/discover.d.ts +29 -0
  807. package/dist/tool-surface/discover.d.ts.map +1 -0
  808. package/dist/tool-surface/discover.js +102 -0
  809. package/dist/tool-surface/discover.js.map +1 -0
  810. package/dist/tool-surface/include-utils.d.ts +27 -0
  811. package/dist/tool-surface/include-utils.d.ts.map +1 -0
  812. package/dist/tool-surface/include-utils.js +90 -0
  813. package/dist/tool-surface/include-utils.js.map +1 -0
  814. package/dist/tool-surface/index.d.ts +6 -0
  815. package/dist/tool-surface/index.d.ts.map +1 -0
  816. package/dist/tool-surface/index.js +7 -0
  817. package/dist/tool-surface/index.js.map +1 -0
  818. package/dist/tool-surface/manifest.d.ts +94 -0
  819. package/dist/tool-surface/manifest.d.ts.map +1 -0
  820. package/dist/tool-surface/manifest.js +234 -0
  821. package/dist/tool-surface/manifest.js.map +1 -0
  822. package/dist/tool-surface/openapi-generator.d.ts +15 -0
  823. package/dist/tool-surface/openapi-generator.d.ts.map +1 -0
  824. package/dist/tool-surface/openapi-generator.js +261 -0
  825. package/dist/tool-surface/openapi-generator.js.map +1 -0
  826. package/dist/tool-surface/register-all-tools.d.ts +4 -0
  827. package/dist/tool-surface/register-all-tools.d.ts.map +1 -0
  828. package/dist/tool-surface/register-all-tools.js +33 -0
  829. package/dist/tool-surface/register-all-tools.js.map +1 -0
  830. package/dist/tool-surface/skill-installer-common.d.ts +48 -0
  831. package/dist/tool-surface/skill-installer-common.d.ts.map +1 -0
  832. package/dist/tool-surface/skill-installer-common.js +195 -0
  833. package/dist/tool-surface/skill-installer-common.js.map +1 -0
  834. package/dist/tool-surface/skill-installer.d.ts +10 -0
  835. package/dist/tool-surface/skill-installer.d.ts.map +1 -0
  836. package/dist/tool-surface/skill-installer.js +20 -0
  837. package/dist/tool-surface/skill-installer.js.map +1 -0
  838. package/dist/tool-surface/skill-installers/claude-code.d.ts +43 -0
  839. package/dist/tool-surface/skill-installers/claude-code.d.ts.map +1 -0
  840. package/dist/tool-surface/skill-installers/claude-code.js +65 -0
  841. package/dist/tool-surface/skill-installers/claude-code.js.map +1 -0
  842. package/dist/tool-surface/skill-installers/codex-cli.d.ts +27 -0
  843. package/dist/tool-surface/skill-installers/codex-cli.d.ts.map +1 -0
  844. package/dist/tool-surface/skill-installers/codex-cli.js +84 -0
  845. package/dist/tool-surface/skill-installers/codex-cli.js.map +1 -0
  846. package/dist/tool-surface/skill-installers/cursor.d.ts +72 -0
  847. package/dist/tool-surface/skill-installers/cursor.d.ts.map +1 -0
  848. package/dist/tool-surface/skill-installers/cursor.js +81 -0
  849. package/dist/tool-surface/skill-installers/cursor.js.map +1 -0
  850. package/dist/tool-surface/skill-installers/gemini-cli.d.ts +66 -0
  851. package/dist/tool-surface/skill-installers/gemini-cli.d.ts.map +1 -0
  852. package/dist/tool-surface/skill-installers/gemini-cli.js +111 -0
  853. package/dist/tool-surface/skill-installers/gemini-cli.js.map +1 -0
  854. package/dist/tool-surface/skill-manifest-sync.d.ts +11 -0
  855. package/dist/tool-surface/skill-manifest-sync.d.ts.map +1 -0
  856. package/dist/tool-surface/skill-manifest-sync.js +65 -0
  857. package/dist/tool-surface/skill-manifest-sync.js.map +1 -0
  858. package/dist/tool-surface/tool-surface-registry.d.ts +34 -0
  859. package/dist/tool-surface/tool-surface-registry.d.ts.map +1 -0
  860. package/dist/tool-surface/tool-surface-registry.js +23 -0
  861. package/dist/tool-surface/tool-surface-registry.js.map +1 -0
  862. package/dist/tools/audit/schema.d.ts +67 -0
  863. package/dist/tools/audit/schema.d.ts.map +1 -0
  864. package/dist/tools/audit/schema.js +19 -0
  865. package/dist/tools/audit/schema.js.map +1 -0
  866. package/dist/tools/audit/tool-config.d.ts +17 -0
  867. package/dist/tools/audit/tool-config.d.ts.map +1 -0
  868. package/dist/tools/audit/tool-config.js +144 -0
  869. package/dist/tools/audit/tool-config.js.map +1 -0
  870. package/dist/tools/debug/schema.d.ts +57 -0
  871. package/dist/tools/debug/schema.d.ts.map +1 -0
  872. package/dist/tools/debug/schema.js +16 -0
  873. package/dist/tools/debug/schema.js.map +1 -0
  874. package/dist/tools/debug/tool-config.d.ts +7 -0
  875. package/dist/tools/debug/tool-config.d.ts.map +1 -0
  876. package/dist/tools/debug/tool-config.js +79 -0
  877. package/dist/tools/debug/tool-config.js.map +1 -0
  878. package/dist/tools/delegate/schema.d.ts +70 -0
  879. package/dist/tools/delegate/schema.d.ts.map +1 -0
  880. package/dist/tools/delegate/schema.js +18 -0
  881. package/dist/tools/delegate/schema.js.map +1 -0
  882. package/dist/tools/delegate/tool-config.d.ts +17 -0
  883. package/dist/tools/delegate/tool-config.d.ts.map +1 -0
  884. package/dist/tools/delegate/tool-config.js +56 -0
  885. package/dist/tools/delegate/tool-config.js.map +1 -0
  886. package/dist/tools/execute-plan/schema.d.ts +66 -0
  887. package/dist/tools/execute-plan/schema.d.ts.map +1 -0
  888. package/dist/tools/execute-plan/schema.js +34 -0
  889. package/dist/tools/execute-plan/schema.js.map +1 -0
  890. package/dist/tools/execute-plan/tool-config.d.ts +21 -0
  891. package/dist/tools/execute-plan/tool-config.d.ts.map +1 -0
  892. package/dist/tools/execute-plan/tool-config.js +76 -0
  893. package/dist/tools/execute-plan/tool-config.js.map +1 -0
  894. package/dist/tools/explore/schema.d.ts +9 -0
  895. package/dist/tools/explore/schema.d.ts.map +1 -0
  896. package/dist/tools/explore/schema.js +64 -0
  897. package/dist/tools/explore/schema.js.map +1 -0
  898. package/dist/tools/explore/tool-config.d.ts +7 -0
  899. package/dist/tools/explore/tool-config.d.ts.map +1 -0
  900. package/dist/tools/explore/tool-config.js +36 -0
  901. package/dist/tools/explore/tool-config.js.map +1 -0
  902. package/dist/tools/index.d.ts +11 -0
  903. package/dist/tools/index.d.ts.map +1 -0
  904. package/dist/tools/index.js +16 -0
  905. package/dist/tools/index.js.map +1 -0
  906. package/dist/tools/investigate/schema.d.ts +59 -0
  907. package/dist/tools/investigate/schema.d.ts.map +1 -0
  908. package/dist/tools/investigate/schema.js +12 -0
  909. package/dist/tools/investigate/schema.js.map +1 -0
  910. package/dist/tools/investigate/tool-config.d.ts +23 -0
  911. package/dist/tools/investigate/tool-config.d.ts.map +1 -0
  912. package/dist/tools/investigate/tool-config.js +93 -0
  913. package/dist/tools/investigate/tool-config.js.map +1 -0
  914. package/dist/tools/register-context-block/schema.d.ts +8 -0
  915. package/dist/tools/register-context-block/schema.d.ts.map +1 -0
  916. package/dist/tools/register-context-block/schema.js +7 -0
  917. package/dist/tools/register-context-block/schema.js.map +1 -0
  918. package/dist/tools/register-context-block/tool-config.d.ts +6 -0
  919. package/dist/tools/register-context-block/tool-config.d.ts.map +1 -0
  920. package/dist/tools/register-context-block/tool-config.js +38 -0
  921. package/dist/tools/register-context-block/tool-config.js.map +1 -0
  922. package/dist/tools/retry/schema.d.ts +54 -0
  923. package/dist/tools/retry/schema.d.ts.map +1 -0
  924. package/dist/tools/retry/schema.js +12 -0
  925. package/dist/tools/retry/schema.js.map +1 -0
  926. package/dist/tools/retry/tool-config.d.ts +11 -0
  927. package/dist/tools/retry/tool-config.d.ts.map +1 -0
  928. package/dist/tools/retry/tool-config.js +60 -0
  929. package/dist/tools/retry/tool-config.js.map +1 -0
  930. package/dist/tools/review/schema.d.ts +61 -0
  931. package/dist/tools/review/schema.d.ts.map +1 -0
  932. package/dist/tools/review/schema.js +16 -0
  933. package/dist/tools/review/schema.js.map +1 -0
  934. package/dist/tools/review/tool-config.d.ts +7 -0
  935. package/dist/tools/review/tool-config.d.ts.map +1 -0
  936. package/dist/tools/review/tool-config.js +85 -0
  937. package/dist/tools/review/tool-config.js.map +1 -0
  938. package/dist/tools/shared-output.d.ts +56 -0
  939. package/dist/tools/shared-output.d.ts.map +1 -0
  940. package/dist/tools/shared-output.js +33 -0
  941. package/dist/tools/shared-output.js.map +1 -0
  942. package/dist/tools/verify/schema.d.ts +56 -0
  943. package/dist/tools/verify/schema.d.ts.map +1 -0
  944. package/dist/tools/verify/schema.js +16 -0
  945. package/dist/tools/verify/schema.js.map +1 -0
  946. package/dist/tools/verify/tool-config.d.ts +14 -0
  947. package/dist/tools/verify/tool-config.d.ts.map +1 -0
  948. package/dist/tools/verify/tool-config.js +112 -0
  949. package/dist/tools/verify/tool-config.js.map +1 -0
  950. package/dist/transport/http-listener.d.ts +37 -0
  951. package/dist/transport/http-listener.d.ts.map +1 -0
  952. package/dist/transport/http-listener.js +50 -0
  953. package/dist/transport/http-listener.js.map +1 -0
  954. package/dist/transport/index.d.ts +4 -0
  955. package/dist/transport/index.d.ts.map +1 -0
  956. package/dist/transport/index.js +4 -0
  957. package/dist/transport/index.js.map +1 -0
  958. package/dist/transport/loopback-enforcer.d.ts +29 -0
  959. package/dist/transport/loopback-enforcer.d.ts.map +1 -0
  960. package/dist/transport/loopback-enforcer.js +71 -0
  961. package/dist/transport/loopback-enforcer.js.map +1 -0
  962. package/dist/transport/route-dispatcher.d.ts +34 -0
  963. package/dist/transport/route-dispatcher.d.ts.map +1 -0
  964. package/dist/transport/route-dispatcher.js +62 -0
  965. package/dist/transport/route-dispatcher.js.map +1 -0
  966. package/dist/types/config.d.ts +138 -0
  967. package/dist/types/config.d.ts.map +1 -0
  968. package/dist/types/config.js +2 -0
  969. package/dist/types/config.js.map +1 -0
  970. package/dist/types/enums.d.ts +168 -0
  971. package/dist/types/enums.d.ts.map +1 -0
  972. package/dist/types/enums.js +113 -0
  973. package/dist/types/enums.js.map +1 -0
  974. package/dist/types/run-result.d.ts +130 -0
  975. package/dist/types/run-result.d.ts.map +1 -0
  976. package/dist/types/run-result.js +2 -0
  977. package/dist/types/run-result.js.map +1 -0
  978. package/dist/types/stage-stats.d.ts +85 -0
  979. package/dist/types/stage-stats.d.ts.map +1 -0
  980. package/dist/types/stage-stats.js +6 -0
  981. package/dist/types/stage-stats.js.map +1 -0
  982. package/dist/types/task-spec.d.ts +48 -0
  983. package/dist/types/task-spec.d.ts.map +1 -0
  984. package/dist/types/task-spec.js +2 -0
  985. package/dist/types/task-spec.js.map +1 -0
  986. package/dist/types.d.ts +5 -405
  987. package/dist/types.d.ts.map +1 -1
  988. package/dist/types.js +5 -26
  989. package/dist/types.js.map +1 -1
  990. package/package.json +221 -204
  991. package/dist/auth/claude-oauth.d.ts +0 -6
  992. package/dist/auth/claude-oauth.d.ts.map +0 -1
  993. package/dist/auth/claude-oauth.js +0 -8
  994. package/dist/auth/claude-oauth.js.map +0 -1
  995. package/dist/auth/codex-oauth.d.ts +0 -6
  996. package/dist/auth/codex-oauth.d.ts.map +0 -1
  997. package/dist/auth/codex-oauth.js +0 -50
  998. package/dist/auth/codex-oauth.js.map +0 -1
  999. package/dist/auto-commit.d.ts +0 -18
  1000. package/dist/auto-commit.d.ts.map +0 -1
  1001. package/dist/auto-commit.js.map +0 -1
  1002. package/dist/batch-cache.d.ts +0 -27
  1003. package/dist/batch-cache.d.ts.map +0 -1
  1004. package/dist/batch-cache.js +0 -71
  1005. package/dist/batch-cache.js.map +0 -1
  1006. package/dist/batch-registry.d.ts +0 -85
  1007. package/dist/batch-registry.d.ts.map +0 -1
  1008. package/dist/batch-registry.js +0 -170
  1009. package/dist/batch-registry.js.map +0 -1
  1010. package/dist/config/read-only-review-flag.d.ts +0 -8
  1011. package/dist/config/read-only-review-flag.d.ts.map +0 -1
  1012. package/dist/config/read-only-review-flag.js +0 -14
  1013. package/dist/config/read-only-review-flag.js.map +0 -1
  1014. package/dist/context/context-block-store.d.ts +0 -85
  1015. package/dist/context/context-block-store.d.ts.map +0 -1
  1016. package/dist/context/context-block-store.js +0 -114
  1017. package/dist/context/context-block-store.js.map +0 -1
  1018. package/dist/context/expand-context-blocks.d.ts +0 -20
  1019. package/dist/context/expand-context-blocks.d.ts.map +0 -1
  1020. package/dist/context/expand-context-blocks.js +0 -46
  1021. package/dist/context/expand-context-blocks.js.map +0 -1
  1022. package/dist/cost/compute.d.ts +0 -33
  1023. package/dist/cost/compute.d.ts.map +0 -1
  1024. package/dist/cost/compute.js +0 -67
  1025. package/dist/cost/compute.js.map +0 -1
  1026. package/dist/cost/cost-meter.d.ts +0 -13
  1027. package/dist/cost/cost-meter.d.ts.map +0 -1
  1028. package/dist/cost/cost-meter.js +0 -20
  1029. package/dist/cost/cost-meter.js.map +0 -1
  1030. package/dist/cost/rollup.d.ts +0 -18
  1031. package/dist/cost/rollup.d.ts.map +0 -1
  1032. package/dist/cost/rollup.js +0 -43
  1033. package/dist/cost/rollup.js.map +0 -1
  1034. package/dist/delegate-with-escalation.d.ts +0 -28
  1035. package/dist/delegate-with-escalation.d.ts.map +0 -1
  1036. package/dist/delegate-with-escalation.js +0 -205
  1037. package/dist/delegate-with-escalation.js.map +0 -1
  1038. package/dist/diagnostics/http-server-log.d.ts +0 -63
  1039. package/dist/diagnostics/http-server-log.d.ts.map +0 -1
  1040. package/dist/diagnostics/http-server-log.js.map +0 -1
  1041. package/dist/diagnostics/jsonl-writer.d.ts.map +0 -1
  1042. package/dist/diagnostics/jsonl-writer.js.map +0 -1
  1043. package/dist/diagnostics/request-spill.d.ts.map +0 -1
  1044. package/dist/diagnostics/request-spill.js.map +0 -1
  1045. package/dist/diagnostics/types.d.ts +0 -65
  1046. package/dist/diagnostics/types.d.ts.map +0 -1
  1047. package/dist/diagnostics/types.js.map +0 -1
  1048. package/dist/diagnostics/verbose-line.d.ts.map +0 -1
  1049. package/dist/diagnostics/verbose-line.js +0 -99
  1050. package/dist/diagnostics/verbose-line.js.map +0 -1
  1051. package/dist/effort-inference.d.ts +0 -7
  1052. package/dist/effort-inference.d.ts.map +0 -1
  1053. package/dist/effort-inference.js +0 -22
  1054. package/dist/effort-inference.js.map +0 -1
  1055. package/dist/executors/_shared/findings-schema.d.ts +0 -103
  1056. package/dist/executors/_shared/findings-schema.d.ts.map +0 -1
  1057. package/dist/executors/_shared/findings-schema.js +0 -73
  1058. package/dist/executors/_shared/findings-schema.js.map +0 -1
  1059. package/dist/executors/_shared/review-verdict-mapping.d.ts +0 -16
  1060. package/dist/executors/_shared/review-verdict-mapping.d.ts.map +0 -1
  1061. package/dist/executors/_shared/review-verdict-mapping.js +0 -24
  1062. package/dist/executors/_shared/review-verdict-mapping.js.map +0 -1
  1063. package/dist/executors/audit.d.ts +0 -7
  1064. package/dist/executors/audit.d.ts.map +0 -1
  1065. package/dist/executors/audit.js +0 -181
  1066. package/dist/executors/audit.js.map +0 -1
  1067. package/dist/executors/debug.d.ts +0 -7
  1068. package/dist/executors/debug.d.ts.map +0 -1
  1069. package/dist/executors/debug.js +0 -88
  1070. package/dist/executors/debug.js.map +0 -1
  1071. package/dist/executors/delegate.d.ts +0 -40
  1072. package/dist/executors/delegate.d.ts.map +0 -1
  1073. package/dist/executors/delegate.js +0 -151
  1074. package/dist/executors/delegate.js.map +0 -1
  1075. package/dist/executors/execute-plan.d.ts +0 -11
  1076. package/dist/executors/execute-plan.d.ts.map +0 -1
  1077. package/dist/executors/execute-plan.js +0 -160
  1078. package/dist/executors/execute-plan.js.map +0 -1
  1079. package/dist/executors/execution-context.d.ts +0 -3
  1080. package/dist/executors/execution-context.d.ts.map +0 -1
  1081. package/dist/executors/execution-context.js +0 -25
  1082. package/dist/executors/execution-context.js.map +0 -1
  1083. package/dist/executors/explore.d.ts +0 -13
  1084. package/dist/executors/explore.d.ts.map +0 -1
  1085. package/dist/executors/explore.js +0 -352
  1086. package/dist/executors/explore.js.map +0 -1
  1087. package/dist/executors/index.d.ts +0 -10
  1088. package/dist/executors/index.d.ts.map +0 -1
  1089. package/dist/executors/index.js +0 -11
  1090. package/dist/executors/index.js.map +0 -1
  1091. package/dist/executors/investigate.d.ts +0 -11
  1092. package/dist/executors/investigate.d.ts.map +0 -1
  1093. package/dist/executors/investigate.js +0 -131
  1094. package/dist/executors/investigate.js.map +0 -1
  1095. package/dist/executors/retry.d.ts +0 -20
  1096. package/dist/executors/retry.d.ts.map +0 -1
  1097. package/dist/executors/retry.js +0 -99
  1098. package/dist/executors/retry.js.map +0 -1
  1099. package/dist/executors/review.d.ts +0 -7
  1100. package/dist/executors/review.d.ts.map +0 -1
  1101. package/dist/executors/review.js +0 -152
  1102. package/dist/executors/review.js.map +0 -1
  1103. package/dist/executors/shared-compute.d.ts +0 -5
  1104. package/dist/executors/shared-compute.d.ts.map +0 -1
  1105. package/dist/executors/shared-compute.js +0 -19
  1106. package/dist/executors/shared-compute.js.map +0 -1
  1107. package/dist/executors/types.d.ts +0 -129
  1108. package/dist/executors/types.d.ts.map +0 -1
  1109. package/dist/executors/types.js.map +0 -1
  1110. package/dist/executors/verify.d.ts +0 -7
  1111. package/dist/executors/verify.d.ts.map +0 -1
  1112. package/dist/executors/verify.js +0 -163
  1113. package/dist/executors/verify.js.map +0 -1
  1114. package/dist/file-artifact-check.d.ts.map +0 -1
  1115. package/dist/file-artifact-check.js.map +0 -1
  1116. package/dist/heartbeat.d.ts +0 -139
  1117. package/dist/heartbeat.d.ts.map +0 -1
  1118. package/dist/heartbeat.js +0 -401
  1119. package/dist/heartbeat.js.map +0 -1
  1120. package/dist/intake/clarification-store.d.ts +0 -23
  1121. package/dist/intake/clarification-store.d.ts.map +0 -1
  1122. package/dist/intake/clarification-store.js +0 -106
  1123. package/dist/intake/clarification-store.js.map +0 -1
  1124. package/dist/intake/compilers/audit.d.ts +0 -8
  1125. package/dist/intake/compilers/audit.d.ts.map +0 -1
  1126. package/dist/intake/compilers/audit.js +0 -50
  1127. package/dist/intake/compilers/audit.js.map +0 -1
  1128. package/dist/intake/compilers/debug.d.ts +0 -9
  1129. package/dist/intake/compilers/debug.d.ts.map +0 -1
  1130. package/dist/intake/compilers/debug.js +0 -32
  1131. package/dist/intake/compilers/debug.js.map +0 -1
  1132. package/dist/intake/compilers/delegate.d.ts +0 -16
  1133. package/dist/intake/compilers/delegate.d.ts.map +0 -1
  1134. package/dist/intake/compilers/delegate.js +0 -32
  1135. package/dist/intake/compilers/delegate.js.map +0 -1
  1136. package/dist/intake/compilers/execute-plan.d.ts +0 -14
  1137. package/dist/intake/compilers/execute-plan.d.ts.map +0 -1
  1138. package/dist/intake/compilers/execute-plan.js +0 -49
  1139. package/dist/intake/compilers/execute-plan.js.map +0 -1
  1140. package/dist/intake/compilers/explore.d.ts +0 -29
  1141. package/dist/intake/compilers/explore.d.ts.map +0 -1
  1142. package/dist/intake/compilers/explore.js +0 -108
  1143. package/dist/intake/compilers/explore.js.map +0 -1
  1144. package/dist/intake/compilers/investigate.d.ts +0 -12
  1145. package/dist/intake/compilers/investigate.d.ts.map +0 -1
  1146. package/dist/intake/compilers/investigate.js +0 -34
  1147. package/dist/intake/compilers/investigate.js.map +0 -1
  1148. package/dist/intake/compilers/review.d.ts +0 -9
  1149. package/dist/intake/compilers/review.d.ts.map +0 -1
  1150. package/dist/intake/compilers/review.js +0 -51
  1151. package/dist/intake/compilers/review.js.map +0 -1
  1152. package/dist/intake/compilers/verify.d.ts +0 -8
  1153. package/dist/intake/compilers/verify.d.ts.map +0 -1
  1154. package/dist/intake/compilers/verify.js +0 -52
  1155. package/dist/intake/compilers/verify.js.map +0 -1
  1156. package/dist/intake/confirm.d.ts +0 -7
  1157. package/dist/intake/confirm.d.ts.map +0 -1
  1158. package/dist/intake/confirm.js +0 -109
  1159. package/dist/intake/confirm.js.map +0 -1
  1160. package/dist/intake/feature-flag.d.ts +0 -6
  1161. package/dist/intake/feature-flag.d.ts.map +0 -1
  1162. package/dist/intake/feature-flag.js +0 -13
  1163. package/dist/intake/feature-flag.js.map +0 -1
  1164. package/dist/intake/force-clarification.d.ts +0 -5
  1165. package/dist/intake/force-clarification.d.ts.map +0 -1
  1166. package/dist/intake/force-clarification.js +0 -44
  1167. package/dist/intake/force-clarification.js.map +0 -1
  1168. package/dist/intake/infer.d.ts +0 -3
  1169. package/dist/intake/infer.d.ts.map +0 -1
  1170. package/dist/intake/infer.js +0 -42
  1171. package/dist/intake/infer.js.map +0 -1
  1172. package/dist/observability/buckets.d.ts +0 -3
  1173. package/dist/observability/buckets.d.ts.map +0 -1
  1174. package/dist/observability/buckets.js +0 -21
  1175. package/dist/observability/buckets.js.map +0 -1
  1176. package/dist/observability/bus.d.ts +0 -11
  1177. package/dist/observability/bus.d.ts.map +0 -1
  1178. package/dist/observability/bus.js +0 -37
  1179. package/dist/observability/bus.js.map +0 -1
  1180. package/dist/observability/events.d.ts +0 -1276
  1181. package/dist/observability/events.d.ts.map +0 -1
  1182. package/dist/observability/events.js +0 -476
  1183. package/dist/observability/events.js.map +0 -1
  1184. package/dist/observability/local-log-sink.d.ts +0 -10
  1185. package/dist/observability/local-log-sink.d.ts.map +0 -1
  1186. package/dist/observability/local-log-sink.js.map +0 -1
  1187. package/dist/observability/telemetry-sink.d.ts +0 -12
  1188. package/dist/observability/telemetry-sink.d.ts.map +0 -1
  1189. package/dist/observability/telemetry-sink.js +0 -24
  1190. package/dist/observability/telemetry-sink.js.map +0 -1
  1191. package/dist/project-context.d.ts +0 -19
  1192. package/dist/project-context.d.ts.map +0 -1
  1193. package/dist/project-context.js +0 -18
  1194. package/dist/project-context.js.map +0 -1
  1195. package/dist/provider.d.ts +0 -5
  1196. package/dist/provider.d.ts.map +0 -1
  1197. package/dist/provider.js +0 -127
  1198. package/dist/provider.js.map +0 -1
  1199. package/dist/readiness/readiness.d.ts +0 -14
  1200. package/dist/readiness/readiness.d.ts.map +0 -1
  1201. package/dist/readiness/readiness.js +0 -162
  1202. package/dist/readiness/readiness.js.map +0 -1
  1203. package/dist/reporting/compose-investigate-headline.d.ts +0 -11
  1204. package/dist/reporting/compose-investigate-headline.d.ts.map +0 -1
  1205. package/dist/reporting/compose-investigate-headline.js +0 -29
  1206. package/dist/reporting/compose-investigate-headline.js.map +0 -1
  1207. package/dist/reporting/parse-investigation-report.d.ts +0 -39
  1208. package/dist/reporting/parse-investigation-report.d.ts.map +0 -1
  1209. package/dist/reporting/parse-investigation-report.js +0 -150
  1210. package/dist/reporting/parse-investigation-report.js.map +0 -1
  1211. package/dist/research/allowlist.d.ts +0 -25
  1212. package/dist/research/allowlist.d.ts.map +0 -1
  1213. package/dist/research/allowlist.js +0 -102
  1214. package/dist/research/allowlist.js.map +0 -1
  1215. package/dist/review/aggregate-result.d.ts +0 -5
  1216. package/dist/review/aggregate-result.d.ts.map +0 -1
  1217. package/dist/review/aggregate-result.js +0 -35
  1218. package/dist/review/aggregate-result.js.map +0 -1
  1219. package/dist/review/diff-review.d.ts +0 -46
  1220. package/dist/review/diff-review.d.ts.map +0 -1
  1221. package/dist/review/diff-review.js +0 -65
  1222. package/dist/review/diff-review.js.map +0 -1
  1223. package/dist/review/evidence.d.ts +0 -15
  1224. package/dist/review/evidence.d.ts.map +0 -1
  1225. package/dist/review/evidence.js +0 -26
  1226. package/dist/review/evidence.js.map +0 -1
  1227. package/dist/review/fallback-extraction.d.ts +0 -17
  1228. package/dist/review/fallback-extraction.d.ts.map +0 -1
  1229. package/dist/review/fallback-extraction.js +0 -189
  1230. package/dist/review/fallback-extraction.js.map +0 -1
  1231. package/dist/review/parse-reviewer-findings.d.ts +0 -26
  1232. package/dist/review/parse-reviewer-findings.d.ts.map +0 -1
  1233. package/dist/review/parse-reviewer-findings.js +0 -73
  1234. package/dist/review/parse-reviewer-findings.js.map +0 -1
  1235. package/dist/review/quality-only-prompts.d.ts +0 -33
  1236. package/dist/review/quality-only-prompts.d.ts.map +0 -1
  1237. package/dist/review/quality-only-prompts.js +0 -106
  1238. package/dist/review/quality-only-prompts.js.map +0 -1
  1239. package/dist/review/quality-reviewer.d.ts +0 -67
  1240. package/dist/review/quality-reviewer.d.ts.map +0 -1
  1241. package/dist/review/quality-reviewer.js +0 -200
  1242. package/dist/review/quality-reviewer.js.map +0 -1
  1243. package/dist/review/reviewer-prompt.d.ts +0 -14
  1244. package/dist/review/reviewer-prompt.d.ts.map +0 -1
  1245. package/dist/review/reviewer-prompt.js +0 -54
  1246. package/dist/review/reviewer-prompt.js.map +0 -1
  1247. package/dist/review/spec-reviewer.d.ts +0 -26
  1248. package/dist/review/spec-reviewer.d.ts.map +0 -1
  1249. package/dist/review/spec-reviewer.js +0 -85
  1250. package/dist/review/spec-reviewer.js.map +0 -1
  1251. package/dist/routing/canonical-model-identity.d.ts.map +0 -1
  1252. package/dist/routing/canonical-model-identity.js.map +0 -1
  1253. package/dist/routing/canonical-model.d.ts +0 -7
  1254. package/dist/routing/canonical-model.d.ts.map +0 -1
  1255. package/dist/routing/canonical-model.js +0 -11
  1256. package/dist/routing/canonical-model.js.map +0 -1
  1257. package/dist/routing/model-profiles.d.ts +0 -126
  1258. package/dist/routing/model-profiles.d.ts.map +0 -1
  1259. package/dist/routing/model-profiles.js +0 -393
  1260. package/dist/routing/model-profiles.js.map +0 -1
  1261. package/dist/routing/resolve-agent.d.ts +0 -8
  1262. package/dist/routing/resolve-agent.d.ts.map +0 -1
  1263. package/dist/routing/resolve-agent.js +0 -45
  1264. package/dist/routing/resolve-agent.js.map +0 -1
  1265. package/dist/routing/types.d.ts.map +0 -1
  1266. package/dist/routing/types.js +0 -2
  1267. package/dist/routing/types.js.map +0 -1
  1268. package/dist/run-tasks/commit-stage.d.ts +0 -16
  1269. package/dist/run-tasks/commit-stage.d.ts.map +0 -1
  1270. package/dist/run-tasks/commit-stage.js +0 -52
  1271. package/dist/run-tasks/commit-stage.js.map +0 -1
  1272. package/dist/run-tasks/derive-terminal-status.d.ts +0 -4
  1273. package/dist/run-tasks/derive-terminal-status.d.ts.map +0 -1
  1274. package/dist/run-tasks/derive-terminal-status.js +0 -25
  1275. package/dist/run-tasks/derive-terminal-status.js.map +0 -1
  1276. package/dist/run-tasks/execute-task.d.ts +0 -20
  1277. package/dist/run-tasks/execute-task.d.ts.map +0 -1
  1278. package/dist/run-tasks/execute-task.js +0 -30
  1279. package/dist/run-tasks/execute-task.js.map +0 -1
  1280. package/dist/run-tasks/fallback-report.d.ts.map +0 -1
  1281. package/dist/run-tasks/fallback-report.js.map +0 -1
  1282. package/dist/run-tasks/index.d.ts +0 -59
  1283. package/dist/run-tasks/index.d.ts.map +0 -1
  1284. package/dist/run-tasks/index.js +0 -119
  1285. package/dist/run-tasks/index.js.map +0 -1
  1286. package/dist/run-tasks/metadata-repair.d.ts.map +0 -1
  1287. package/dist/run-tasks/metadata-repair.js +0 -29
  1288. package/dist/run-tasks/metadata-repair.js.map +0 -1
  1289. package/dist/run-tasks/plan-extraction.d.ts.map +0 -1
  1290. package/dist/run-tasks/plan-extraction.js.map +0 -1
  1291. package/dist/run-tasks/reviewed-lifecycle.d.ts +0 -113
  1292. package/dist/run-tasks/reviewed-lifecycle.d.ts.map +0 -1
  1293. package/dist/run-tasks/reviewed-lifecycle.js +0 -1899
  1294. package/dist/run-tasks/reviewed-lifecycle.js.map +0 -1
  1295. package/dist/run-tasks/stage-idle-tracker.d.ts.map +0 -1
  1296. package/dist/run-tasks/stage-idle-tracker.js.map +0 -1
  1297. package/dist/run-tasks/task-completion-summary.d.ts.map +0 -1
  1298. package/dist/run-tasks/task-completion-summary.js +0 -70
  1299. package/dist/run-tasks/task-completion-summary.js.map +0 -1
  1300. package/dist/run-tasks/verify-stage.d.ts +0 -25
  1301. package/dist/run-tasks/verify-stage.d.ts.map +0 -1
  1302. package/dist/run-tasks/verify-stage.js +0 -168
  1303. package/dist/run-tasks/verify-stage.js.map +0 -1
  1304. package/dist/run-tasks/worker-status.d.ts +0 -9
  1305. package/dist/run-tasks/worker-status.d.ts.map +0 -1
  1306. package/dist/run-tasks/worker-status.js +0 -19
  1307. package/dist/run-tasks/worker-status.js.map +0 -1
  1308. package/dist/runners/base/research-tools.d.ts.map +0 -1
  1309. package/dist/runners/base/research-tools.js.map +0 -1
  1310. package/dist/runners/base/result-builders.d.ts +0 -94
  1311. package/dist/runners/base/result-builders.d.ts.map +0 -1
  1312. package/dist/runners/base/result-builders.js +0 -134
  1313. package/dist/runners/base/result-builders.js.map +0 -1
  1314. package/dist/runners/base/time-check.d.ts.map +0 -1
  1315. package/dist/runners/base/time-check.js.map +0 -1
  1316. package/dist/runners/base/types.d.ts +0 -53
  1317. package/dist/runners/base/types.d.ts.map +0 -1
  1318. package/dist/runners/base/types.js +0 -2
  1319. package/dist/runners/base/types.js.map +0 -1
  1320. package/dist/runners/base/usage-accumulator.d.ts +0 -10
  1321. package/dist/runners/base/usage-accumulator.d.ts.map +0 -1
  1322. package/dist/runners/base/usage-accumulator.js +0 -22
  1323. package/dist/runners/base/usage-accumulator.js.map +0 -1
  1324. package/dist/runners/claude-runner.d.ts +0 -17
  1325. package/dist/runners/claude-runner.d.ts.map +0 -1
  1326. package/dist/runners/claude-runner.js +0 -962
  1327. package/dist/runners/claude-runner.js.map +0 -1
  1328. package/dist/runners/codex-runner.d.ts +0 -32
  1329. package/dist/runners/codex-runner.d.ts.map +0 -1
  1330. package/dist/runners/codex-runner.js +0 -992
  1331. package/dist/runners/codex-runner.js.map +0 -1
  1332. package/dist/runners/error-classification.d.ts +0 -49
  1333. package/dist/runners/error-classification.d.ts.map +0 -1
  1334. package/dist/runners/error-classification.js +0 -140
  1335. package/dist/runners/error-classification.js.map +0 -1
  1336. package/dist/runners/injection-type.d.ts.map +0 -1
  1337. package/dist/runners/injection-type.js.map +0 -1
  1338. package/dist/runners/openai-runner.d.ts +0 -74
  1339. package/dist/runners/openai-runner.d.ts.map +0 -1
  1340. package/dist/runners/openai-runner.js +0 -934
  1341. package/dist/runners/openai-runner.js.map +0 -1
  1342. package/dist/runners/openai-usage-interceptor.d.ts.map +0 -1
  1343. package/dist/runners/openai-usage-interceptor.js +0 -121
  1344. package/dist/runners/openai-usage-interceptor.js.map +0 -1
  1345. package/dist/runners/prevention.d.ts.map +0 -1
  1346. package/dist/runners/prevention.js +0 -108
  1347. package/dist/runners/prevention.js.map +0 -1
  1348. package/dist/runners/supervision.d.ts +0 -129
  1349. package/dist/runners/supervision.d.ts.map +0 -1
  1350. package/dist/runners/supervision.js +0 -310
  1351. package/dist/runners/supervision.js.map +0 -1
  1352. package/dist/runners/types.d.ts +0 -174
  1353. package/dist/runners/types.d.ts.map +0 -1
  1354. package/dist/runners/types.js +0 -2
  1355. package/dist/runners/types.js.map +0 -1
  1356. package/dist/telemetry/bucketing.d.ts +0 -13
  1357. package/dist/telemetry/bucketing.d.ts.map +0 -1
  1358. package/dist/telemetry/bucketing.js +0 -61
  1359. package/dist/telemetry/bucketing.js.map +0 -1
  1360. package/dist/telemetry/clamp.d.ts.map +0 -1
  1361. package/dist/telemetry/clamp.js.map +0 -1
  1362. package/dist/telemetry/concern-classifier.d.ts +0 -9
  1363. package/dist/telemetry/concern-classifier.d.ts.map +0 -1
  1364. package/dist/telemetry/concern-classifier.js.map +0 -1
  1365. package/dist/telemetry/consent-rules.d.ts.map +0 -1
  1366. package/dist/telemetry/consent-rules.js.map +0 -1
  1367. package/dist/telemetry/event-builder.d.ts +0 -15
  1368. package/dist/telemetry/event-builder.d.ts.map +0 -1
  1369. package/dist/telemetry/event-builder.js +0 -327
  1370. package/dist/telemetry/event-builder.js.map +0 -1
  1371. package/dist/telemetry/field-coverage.d.ts +0 -17
  1372. package/dist/telemetry/field-coverage.d.ts.map +0 -1
  1373. package/dist/telemetry/field-coverage.js +0 -110
  1374. package/dist/telemetry/field-coverage.js.map +0 -1
  1375. package/dist/telemetry/normalize.d.ts +0 -18
  1376. package/dist/telemetry/normalize.d.ts.map +0 -1
  1377. package/dist/telemetry/normalize.js +0 -18
  1378. package/dist/telemetry/normalize.js.map +0 -1
  1379. package/dist/telemetry/types.d.ts +0 -1517
  1380. package/dist/telemetry/types.d.ts.map +0 -1
  1381. package/dist/telemetry/types.js +0 -320
  1382. package/dist/telemetry/types.js.map +0 -1
  1383. package/dist/tool-schemas/audit.d.ts +0 -71
  1384. package/dist/tool-schemas/audit.d.ts.map +0 -1
  1385. package/dist/tool-schemas/audit.js +0 -19
  1386. package/dist/tool-schemas/audit.js.map +0 -1
  1387. package/dist/tool-schemas/debug.d.ts +0 -61
  1388. package/dist/tool-schemas/debug.d.ts.map +0 -1
  1389. package/dist/tool-schemas/debug.js +0 -16
  1390. package/dist/tool-schemas/debug.js.map +0 -1
  1391. package/dist/tool-schemas/delegate.d.ts +0 -71
  1392. package/dist/tool-schemas/delegate.d.ts.map +0 -1
  1393. package/dist/tool-schemas/delegate.js +0 -21
  1394. package/dist/tool-schemas/delegate.js.map +0 -1
  1395. package/dist/tool-schemas/execute-plan.d.ts +0 -70
  1396. package/dist/tool-schemas/execute-plan.d.ts.map +0 -1
  1397. package/dist/tool-schemas/execute-plan.js +0 -34
  1398. package/dist/tool-schemas/execute-plan.js.map +0 -1
  1399. package/dist/tool-schemas/explore.d.ts +0 -9
  1400. package/dist/tool-schemas/explore.d.ts.map +0 -1
  1401. package/dist/tool-schemas/explore.js +0 -64
  1402. package/dist/tool-schemas/explore.js.map +0 -1
  1403. package/dist/tool-schemas/index.d.ts +0 -8
  1404. package/dist/tool-schemas/index.d.ts.map +0 -1
  1405. package/dist/tool-schemas/index.js +0 -9
  1406. package/dist/tool-schemas/index.js.map +0 -1
  1407. package/dist/tool-schemas/investigate.d.ts +0 -63
  1408. package/dist/tool-schemas/investigate.d.ts.map +0 -1
  1409. package/dist/tool-schemas/investigate.js +0 -12
  1410. package/dist/tool-schemas/investigate.js.map +0 -1
  1411. package/dist/tool-schemas/retry.d.ts +0 -58
  1412. package/dist/tool-schemas/retry.d.ts.map +0 -1
  1413. package/dist/tool-schemas/retry.js +0 -12
  1414. package/dist/tool-schemas/retry.js.map +0 -1
  1415. package/dist/tool-schemas/review.d.ts +0 -65
  1416. package/dist/tool-schemas/review.d.ts.map +0 -1
  1417. package/dist/tool-schemas/review.js +0 -16
  1418. package/dist/tool-schemas/review.js.map +0 -1
  1419. package/dist/tool-schemas/shared-output.d.ts +0 -60
  1420. package/dist/tool-schemas/shared-output.d.ts.map +0 -1
  1421. package/dist/tool-schemas/shared-output.js +0 -31
  1422. package/dist/tool-schemas/shared-output.js.map +0 -1
  1423. package/dist/tool-schemas/verify.d.ts +0 -60
  1424. package/dist/tool-schemas/verify.d.ts.map +0 -1
  1425. package/dist/tool-schemas/verify.js +0 -16
  1426. package/dist/tool-schemas/verify.js.map +0 -1
  1427. package/dist/tools/call-cache.d.ts.map +0 -1
  1428. package/dist/tools/call-cache.js.map +0 -1
  1429. package/dist/tools/claude-adapter.d.ts +0 -4
  1430. package/dist/tools/claude-adapter.d.ts.map +0 -1
  1431. package/dist/tools/claude-adapter.js +0 -63
  1432. package/dist/tools/claude-adapter.js.map +0 -1
  1433. package/dist/tools/definitions.d.ts +0 -26
  1434. package/dist/tools/definitions.d.ts.map +0 -1
  1435. package/dist/tools/definitions.js +0 -221
  1436. package/dist/tools/definitions.js.map +0 -1
  1437. package/dist/tools/openai-adapter.d.ts +0 -13
  1438. package/dist/tools/openai-adapter.d.ts.map +0 -1
  1439. package/dist/tools/openai-adapter.js +0 -100
  1440. package/dist/tools/openai-adapter.js.map +0 -1
  1441. package/dist/tools/scratchpad.d.ts +0 -28
  1442. package/dist/tools/scratchpad.d.ts.map +0 -1
  1443. package/dist/tools/scratchpad.js +0 -49
  1444. package/dist/tools/scratchpad.js.map +0 -1
  1445. package/dist/tools/tracker.d.ts +0 -47
  1446. package/dist/tools/tracker.d.ts.map +0 -1
  1447. package/dist/tools/tracker.js +0 -71
  1448. package/dist/tools/tracker.js.map +0 -1
  1449. /package/dist/{file-artifact-check.d.ts → bounded-execution/file-artifact-check.d.ts} +0 -0
  1450. /package/dist/{file-artifact-check.js → bounded-execution/file-artifact-check.js} +0 -0
  1451. /package/dist/{routing → config}/canonical-model-identity.d.ts +0 -0
  1452. /package/dist/{routing → config}/canonical-model-identity.js +0 -0
  1453. /package/dist/{routing → escalation}/types.d.ts +0 -0
  1454. /package/dist/{diagnostics → escalation}/types.js +0 -0
  1455. /package/dist/{telemetry → events}/clamp.d.ts +0 -0
  1456. /package/dist/{telemetry → events}/clamp.js +0 -0
  1457. /package/dist/{telemetry → events}/concern-classifier.js +0 -0
  1458. /package/dist/{telemetry → events}/consent-rules.d.ts +0 -0
  1459. /package/dist/{telemetry → events}/consent-rules.js +0 -0
  1460. /package/dist/{diagnostics → events}/http-server-log.js +0 -0
  1461. /package/dist/{diagnostics → events}/jsonl-writer.d.ts +0 -0
  1462. /package/dist/{diagnostics → events}/jsonl-writer.js +0 -0
  1463. /package/dist/{observability → events}/local-log-sink.js +0 -0
  1464. /package/dist/{diagnostics → events}/request-spill.d.ts +0 -0
  1465. /package/dist/{diagnostics → events}/request-spill.js +0 -0
  1466. /package/dist/{diagnostics → events}/verbose-line.d.ts +0 -0
  1467. /package/dist/{auto-commit.js → lifecycle/auto-commit.js} +0 -0
  1468. /package/dist/{run-tasks → lifecycle}/fallback-report.d.ts +0 -0
  1469. /package/dist/{run-tasks → lifecycle}/fallback-report.js +0 -0
  1470. /package/dist/{run-tasks → lifecycle}/metadata-repair.d.ts +0 -0
  1471. /package/dist/{run-tasks → lifecycle}/plan-extraction.d.ts +0 -0
  1472. /package/dist/{run-tasks → lifecycle}/plan-extraction.js +0 -0
  1473. /package/dist/{run-tasks → lifecycle}/stage-idle-tracker.d.ts +0 -0
  1474. /package/dist/{run-tasks → lifecycle}/stage-idle-tracker.js +0 -0
  1475. /package/dist/{run-tasks → lifecycle}/task-completion-summary.d.ts +0 -0
  1476. /package/dist/{runners → providers}/base/research-tools.d.ts +0 -0
  1477. /package/dist/{runners → providers}/base/research-tools.js +0 -0
  1478. /package/dist/{runners → providers}/base/time-check.d.ts +0 -0
  1479. /package/dist/{runners → providers}/base/time-check.js +0 -0
  1480. /package/dist/{executors → providers/base}/types.js +0 -0
  1481. /package/dist/{tools → providers}/call-cache.d.ts +0 -0
  1482. /package/dist/{tools → providers}/call-cache.js +0 -0
  1483. /package/dist/{runners → providers}/injection-type.d.ts +0 -0
  1484. /package/dist/{runners → providers}/injection-type.js +0 -0
  1485. /package/dist/{runners → providers}/openai-usage-interceptor.d.ts +0 -0
  1486. /package/dist/{runners → providers}/prevention.d.ts +0 -0
@@ -1,1899 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
- import { createProvider } from '../provider.js';
4
- import { delegateWithEscalation } from '../delegate-with-escalation.js';
5
- import { pickEscalation, pickReviewer, maxRowsFor, } from '../escalation/policy.js';
6
- import { runWithFallback, makeSyntheticRunResult, TRANSPORT_FAILURES, isReviewTransportFailure, } from '../escalation/fallback.js';
7
- import { findModelCapabilities, findModelProfile } from '../routing/model-profiles.js';
8
- import { canonicalIdentity } from '../routing/canonical-model-identity.js';
9
- import { HeartbeatTimer } from '../heartbeat.js';
10
- import { newStageIdleTracker, snapshotIdle } from './stage-idle-tracker.js';
11
- import { priceTokens, subtractTokens, resolveRateCard } from '../cost/compute.js';
12
- import { DEFAULT_TASK_TIMEOUT_MS, DEFAULT_STALL_TIMEOUT_MS, MAX_TIME_PRESTOP_RATIO } from '../config/schema.js';
13
- import { runSpecReview } from '../review/spec-reviewer.js';
14
- import { makeSkippedReviewResult } from '../review/skipped-result.js';
15
- import { runQualityReview } from '../review/quality-reviewer.js';
16
- import { runDiffReview } from '../review/diff-review.js';
17
- import { aggregateResult } from '../review/aggregate-result.js';
18
- import { buildEvidence } from '../review/evidence.js';
19
- import { parseStructuredReport } from '../reporting/structured-report.js';
20
- import { runCommitStage, readbackCommit } from './commit-stage.js';
21
- import { runVerifyStage } from './verify-stage.js';
22
- import { runMetadataRepairTurn } from './metadata-repair.js';
23
- import { partitionFilePaths, checkOutputTargets } from '../file-artifact-check.js';
24
- import { extractWorkerStatus } from './worker-status.js';
25
- import { buildFallbackImplReport, readImplementerFileContents } from './fallback-report.js';
26
- import { composeVerboseLine, toVerboseFields } from '../diagnostics/verbose-line.js';
27
- import { computeTaskCompletionSummary, formatTaskDoneLine } from './task-completion-summary.js';
28
- import { withDoneCondition } from './execute-task.js';
29
- const exec = promisify(execFile);
30
- const READ_ONLY_TOOL_NAMES = new Set([
31
- 'audit', 'review', 'verify', 'investigate', 'debug',
32
- ]);
33
- const _emptyMetrics = { inputTokens: null, outputTokens: null, cachedTokens: null, reasoningTokens: null, turnCount: null, toolCallCount: null, filesReadCount: null, filesWrittenCount: null };
34
- export function emptyStats() {
35
- return {
36
- implementing: { stage: 'implementing', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, ..._emptyMetrics },
37
- spec_rework: { stage: 'spec_rework', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, ..._emptyMetrics },
38
- quality_rework: { stage: 'quality_rework', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, ..._emptyMetrics },
39
- committing: { stage: 'committing', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, ..._emptyMetrics },
40
- verifying: { stage: 'verifying', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, outcome: null, skipReason: null, ..._emptyMetrics },
41
- spec_review: { stage: 'spec_review', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, verdict: null, roundsUsed: null, ..._emptyMetrics },
42
- quality_review: { stage: 'quality_review', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, verdict: null, roundsUsed: null, ..._emptyMetrics },
43
- diff_review: { stage: 'diff_review', entered: false, durationMs: null, costUSD: null, agentTier: null, modelFamily: null, model: null, maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0, verdict: null, roundsUsed: null, ..._emptyMetrics },
44
- };
45
- }
46
- function modelFamily(model) {
47
- return findModelProfile(model).family;
48
- }
49
- export function endBaseStage(stats, name, t0, c0, agent, finalCostUSD, idle, metrics) {
50
- // Cast through unknown — TS can't narrow stats[name] on a union-typed index;
51
- // the runtime invariant (set name's slot to its matching variant) is enforced
52
- // by the helper signature and tested by tests/run-tasks/stage-stats.test.ts.
53
- stats[name] = {
54
- stage: name,
55
- entered: true,
56
- durationMs: Date.now() - t0,
57
- costUSD: metrics?.costUSD !== undefined ? metrics.costUSD
58
- : finalCostUSD !== null && c0 !== null ? finalCostUSD - c0 : null,
59
- agentTier: agent.tier,
60
- modelFamily: modelFamily(agent.model),
61
- model: agent.model,
62
- maxIdleMs: idle?.maxIdleMs ?? 0,
63
- totalIdleMs: idle?.totalIdleMs ?? 0,
64
- activityEvents: idle?.activityEvents ?? 0,
65
- inputTokens: metrics?.inputTokens ?? null,
66
- outputTokens: metrics?.outputTokens ?? null,
67
- cachedTokens: metrics?.cachedTokens ?? null,
68
- reasoningTokens: metrics?.reasoningTokens ?? null,
69
- turnCount: metrics?.turnCount ?? null,
70
- toolCallCount: metrics?.toolCallCount ?? null,
71
- filesReadCount: metrics?.filesReadCount ?? null,
72
- filesWrittenCount: metrics?.filesWrittenCount ?? null,
73
- };
74
- }
75
- export function endReviewStage(stats, name, t0, c0, agent, finalCostUSD, idle, verdict, roundsUsed,
76
- // metrics.durationMs OVERRIDES the t0-based fallback. Use this when the
77
- // stage runs in multiple discrete invocations (initial + rework re-reviews
78
- // for spec_review and quality_review) — the caller accumulates per-call
79
- // wall time and passes the sum, instead of `Date.now() - t0` which would
80
- // span the entire review block including subsequent stages.
81
- metrics) {
82
- const durationMs = metrics?.durationMs !== undefined ? metrics.durationMs : Date.now() - t0;
83
- // Idle-tracker leak guard: stageIdle is reset at every transitionStage(),
84
- // but runAnnotationReview makes 2 sequential delegateWithEscalation calls
85
- // (attempt1 + attempt2), and tail events from cross-runner async cleanup
86
- // can land after the stage's wall-clock end, producing totalIdleMs values
87
- // that exceed durationMs (3.12.2 saw 110-145% idle ratios). Clamping here
88
- // prevents impossible values from reaching the dashboard while preserving
89
- // the legitimate per-stage signal in the common case.
90
- const rawTotalIdle = idle?.totalIdleMs ?? 0;
91
- const rawMaxIdle = idle?.maxIdleMs ?? 0;
92
- const clampedTotalIdle = Math.min(rawTotalIdle, Math.max(0, durationMs));
93
- const clampedMaxIdle = Math.min(rawMaxIdle, Math.max(0, durationMs));
94
- stats[name] = {
95
- stage: name,
96
- entered: true,
97
- durationMs,
98
- // Item 7: != null (covers both undefined AND null) — null means
99
- // "pricing unavailable, fall through to runningCostUSD computation"
100
- // rather than masking unknown as the literal 0.
101
- costUSD: metrics?.costUSD != null ? metrics.costUSD
102
- : finalCostUSD !== null && c0 !== null ? finalCostUSD - c0 : null,
103
- agentTier: agent.tier,
104
- modelFamily: modelFamily(agent.model),
105
- model: agent.model,
106
- maxIdleMs: clampedMaxIdle,
107
- totalIdleMs: clampedTotalIdle,
108
- activityEvents: idle?.activityEvents ?? 0,
109
- inputTokens: metrics?.inputTokens ?? null,
110
- outputTokens: metrics?.outputTokens ?? null,
111
- cachedTokens: metrics?.cachedTokens ?? null,
112
- reasoningTokens: metrics?.reasoningTokens ?? null,
113
- turnCount: metrics?.turnCount ?? null,
114
- toolCallCount: metrics?.toolCallCount ?? null,
115
- filesReadCount: metrics?.filesReadCount ?? null,
116
- filesWrittenCount: metrics?.filesWrittenCount ?? null,
117
- verdict,
118
- roundsUsed,
119
- };
120
- }
121
- export function emptyReworkAcc() {
122
- return {
123
- occurred: false,
124
- durationMs: 0, costUSD: 0,
125
- inputTokens: 0, outputTokens: 0, cachedTokens: 0, reasoningTokens: 0,
126
- turnCount: 0, toolCallCount: 0, filesReadCount: 0, filesWrittenCount: 0,
127
- maxIdleMs: 0, totalIdleMs: 0, activityEvents: 0,
128
- };
129
- }
130
- export function accumulateReworkIteration(acc, result, iterDurationMs, idle) {
131
- acc.occurred = true;
132
- acc.durationMs += iterDurationMs;
133
- acc.costUSD += result.usage?.costUSD ?? 0;
134
- acc.inputTokens += result.usage?.inputTokens ?? 0;
135
- acc.outputTokens += result.usage?.outputTokens ?? 0;
136
- acc.cachedTokens += result.usage?.cachedTokens ?? 0;
137
- acc.reasoningTokens += result.usage?.reasoningTokens ?? 0;
138
- acc.turnCount += result.turns ?? 0;
139
- acc.toolCallCount += result.toolCalls?.length ?? 0;
140
- acc.filesReadCount += result.filesRead?.length ?? 0;
141
- acc.filesWrittenCount += result.filesWritten?.length ?? 0;
142
- if (idle) {
143
- if (idle.maxIdleMs > acc.maxIdleMs)
144
- acc.maxIdleMs = idle.maxIdleMs;
145
- acc.totalIdleMs += idle.totalIdleMs;
146
- acc.activityEvents += idle.activityEvents;
147
- }
148
- }
149
- export function commitReworkStage(stats, name, acc, agent) {
150
- if (!acc.occurred)
151
- return;
152
- stats[name] = {
153
- stage: name,
154
- entered: true,
155
- durationMs: acc.durationMs,
156
- costUSD: acc.costUSD,
157
- agentTier: agent.tier,
158
- modelFamily: modelFamily(agent.model),
159
- model: agent.model,
160
- maxIdleMs: acc.maxIdleMs,
161
- totalIdleMs: acc.totalIdleMs,
162
- activityEvents: acc.activityEvents,
163
- inputTokens: acc.inputTokens,
164
- outputTokens: acc.outputTokens,
165
- cachedTokens: acc.cachedTokens,
166
- reasoningTokens: acc.reasoningTokens,
167
- turnCount: acc.turnCount,
168
- toolCallCount: acc.toolCallCount,
169
- filesReadCount: acc.filesReadCount,
170
- filesWrittenCount: acc.filesWrittenCount,
171
- };
172
- }
173
- export function endVerifyStage(stats, t0, c0, agent, finalCostUSD, idle, outcome, skipReason) {
174
- stats.verifying = {
175
- stage: 'verifying',
176
- entered: true,
177
- durationMs: Date.now() - t0,
178
- costUSD: finalCostUSD !== null && c0 !== null ? finalCostUSD - c0 : null,
179
- agentTier: agent.tier,
180
- modelFamily: modelFamily(agent.model),
181
- model: agent.model,
182
- maxIdleMs: idle?.maxIdleMs ?? 0,
183
- totalIdleMs: idle?.totalIdleMs ?? 0,
184
- activityEvents: idle?.activityEvents ?? 0,
185
- inputTokens: null,
186
- outputTokens: null,
187
- cachedTokens: null,
188
- reasoningTokens: null,
189
- turnCount: null,
190
- toolCallCount: null,
191
- filesReadCount: null,
192
- filesWrittenCount: null,
193
- outcome,
194
- skipReason,
195
- };
196
- }
197
- export async function executeReviewedLifecycle(task, resolved, config, taskIndex, onProgress, heartbeatWiring, diagnostics, recorder, _route, _client, _triggeringSkill, bus, qualityReviewPromptBuilder) {
198
- const reviewPolicy = task.reviewPolicy ?? 'full';
199
- const routeKey = _route ?? '';
200
- if (reviewPolicy === 'quality_only' && !READ_ONLY_TOOL_NAMES.has(routeKey)) {
201
- throw new Error(`reviewPolicy 'quality_only' is only valid for read-only routes; received '${routeKey}'. ` +
202
- `Use 'full', 'spec_only', 'diff_only', or 'off' for artifact-producing routes.`);
203
- }
204
- const otherSlot = resolved.slot === 'standard' ? 'complex' : 'standard';
205
- let escalationProvider;
206
- try {
207
- escalationProvider = createProvider(otherSlot, config);
208
- }
209
- catch {
210
- escalationProvider = undefined;
211
- }
212
- const providers = {
213
- [resolved.slot]: resolved.provider,
214
- };
215
- if (escalationProvider)
216
- providers[otherSlot] = escalationProvider;
217
- function providerFor(tier) {
218
- return providers[tier];
219
- }
220
- // Compute the implementer's canonical identity. Retained for diagnostics
221
- // and emitFallback events; NOT used to gate reviewer separation. Separation
222
- // is enforced by `forbiddenTiers: [resolved.slot]` instead — what matters is
223
- // that the reviewer runs in a different agent_type slot, not that it uses
224
- // a different model. If the user configures both slots with the same model
225
- // (or even the same backend), the review still proceeds because the slot
226
- // assignment is intentional.
227
- const implementerIdentity = (() => {
228
- try {
229
- return canonicalIdentity(resolved.provider.config);
230
- }
231
- catch {
232
- return undefined;
233
- }
234
- })();
235
- // Partition filePaths into output targets before the worker runs.
236
- // Output targets are paths that do not yet exist on disk.
237
- const { outputTargets } = partitionFilePaths(task.filePaths, task.cwd ?? process.cwd());
238
- const stageCount = reviewPolicy === 'off' ? 1 :
239
- reviewPolicy === 'spec_only' ? 3 :
240
- reviewPolicy === 'quality_only' ? 3 :
241
- 5;
242
- const verbose = diagnostics?.verbose ?? false;
243
- const verboseStreamRaw = diagnostics?.verboseStream ?? ((line) => { process.stderr.write(line + '\n'); });
244
- const verboseBatchIdEarly = heartbeatWiring?.batchId;
245
- const DEFAULT_MODE_EVENTS = new Set([
246
- 'stage_change',
247
- 'task_done_summary',
248
- 'fallback', 'fallback_unavailable',
249
- 'escalation', 'escalation_unavailable',
250
- 'stall_abort', 'cost_check', 'time_check',
251
- ]);
252
- const shortBatchEarly = verboseBatchIdEarly ? verboseBatchIdEarly.slice(0, 8) : '????????';
253
- const emitTaskEvent = (event, fields) => {
254
- if (bus && verboseBatchIdEarly !== undefined) {
255
- const schemaEvent = event === 'heartbeat_timer' ? 'task_started' : event;
256
- const cleaned = {};
257
- for (const [key, value] of Object.entries(fields)) {
258
- if (value !== undefined)
259
- cleaned[key] = value;
260
- }
261
- // Keep verbose-line field names stable while emitting schema-declared
262
- // telemetry envelopes in their authoritative persisted shape. EventSchemas
263
- // validate the full envelope at EventBus.emit in dev/test, so production
264
- // emission paths must construct schema-shaped keys before persistence.
265
- if (schemaEvent === 'task_started') {
266
- cleaned.route = routeKey || 'delegate';
267
- cleaned.cwd = task.cwd ?? process.cwd();
268
- for (const key of ['state', 'stage_count', 'tick_ms', 'reason'])
269
- delete cleaned[key];
270
- }
271
- if (event === 'verify_step') {
272
- if ('exit_code' in cleaned) {
273
- cleaned.exitCode = cleaned.exit_code;
274
- delete cleaned.exit_code;
275
- }
276
- if ('duration_ms' in cleaned) {
277
- cleaned.durationMs = cleaned.duration_ms;
278
- delete cleaned.duration_ms;
279
- }
280
- if ('error_message' in cleaned) {
281
- cleaned.errorMessage = cleaned.error_message;
282
- delete cleaned.error_message;
283
- }
284
- }
285
- if (event === 'task_completed') {
286
- if ('stages_json' in cleaned) {
287
- cleaned.stages = cleaned.stages_json;
288
- delete cleaned.stages_json;
289
- }
290
- if (!('cachedTokens' in cleaned))
291
- cleaned.cachedTokens = null;
292
- if (!('reasoningTokens' in cleaned))
293
- cleaned.reasoningTokens = null;
294
- if (!('stages' in cleaned))
295
- cleaned.stages = JSON.stringify(stats);
296
- }
297
- bus.emit({ event: schemaEvent, ts: new Date().toISOString(), batchId: verboseBatchIdEarly, taskIndex, ...cleaned });
298
- }
299
- if (verboseStreamRaw && (verbose || DEFAULT_MODE_EVENTS.has(event))) {
300
- verboseStreamRaw(composeVerboseLine({ event, ts: new Date().toISOString(), batch: shortBatchEarly, task: taskIndex, ...toVerboseFields(fields) }));
301
- }
302
- };
303
- // Start the heartbeat whenever there's a downstream consumer:
304
- // - onProgress (external progress callback from the runTasks caller)
305
- // - verbose (stderr stream needs the heartbeat's tool_call / turn_complete relay)
306
- // - recordHeartbeat (server needs heartbeat ticks to update BatchRegistry)
307
- // - logger (post-mortem JSONL logging needs the events too)
308
- // Otherwise there is no point creating a timer.
309
- const needHeartbeat = onProgress !== undefined ||
310
- verbose ||
311
- heartbeatWiring?.recordHeartbeat !== undefined ||
312
- diagnostics?.logger !== undefined ||
313
- bus !== undefined;
314
- // Synthesize an onProgress sink when the caller didn't pass one — the
315
- // heartbeat needs a place to emit heartbeat events. Discards events if
316
- // there is no external consumer. wrappedOnProgress (defined below) is
317
- // ALWAYS defined and feeds the stall watchdog regardless of consumers.
318
- const synthOnProgress = onProgress ?? (() => { });
319
- let prevCostBucket = undefined;
320
- let prevCounters = { tools: 0, read: 0, wrote: 0 };
321
- let lastNoOpEmitMs = 0;
322
- const heartbeat = needHeartbeat
323
- ? new HeartbeatTimer((event) => {
324
- if (event.kind !== 'heartbeat') {
325
- synthOnProgress(taskIndex, event);
326
- return;
327
- }
328
- const tools = event.progress.toolCalls;
329
- const read = event.progress.filesRead;
330
- const wrote = event.progress.filesWritten;
331
- const costBucket = Number.isFinite(event.costUSD) ? Math.round(event.costUSD * 10000) : null;
332
- const changed = tools !== prevCounters.tools || read !== prevCounters.read || wrote !== prevCounters.wrote || !Object.is(costBucket, prevCostBucket);
333
- const since = Date.now() - lastNoOpEmitMs;
334
- if (changed || since >= 60_000) {
335
- prevCounters = { tools, read, wrote };
336
- prevCostBucket = costBucket;
337
- lastNoOpEmitMs = Date.now();
338
- const sinceLastMs = Date.now() - prevEventAtMs;
339
- emitTaskEvent('heartbeat', {
340
- elapsed: event.elapsed,
341
- stage: event.stage,
342
- round: event.reviewRound,
343
- cap: event.attemptCap,
344
- tools: event.progress.toolCalls,
345
- read: event.progress.filesRead,
346
- wrote: event.progress.filesWritten,
347
- text: textEmissionChars,
348
- cost: event.costUSD,
349
- idle_ms: sinceLastMs,
350
- stage_idle_ms: event.stageIdleMs,
351
- });
352
- }
353
- synthOnProgress(taskIndex, event);
354
- }, {
355
- provider: resolved.provider.config.model,
356
- parentModel: task.parentModel,
357
- ...(heartbeatWiring?.batchId !== undefined && { batchId: heartbeatWiring.batchId }),
358
- ...(heartbeatWiring?.recordHeartbeat !== undefined && { recordHeartbeat: heartbeatWiring.recordHeartbeat }),
359
- })
360
- : undefined;
361
- heartbeat?.start(stageCount);
362
- emitTaskEvent('heartbeat_timer', {
363
- state: heartbeat ? 'started' : 'disabled',
364
- stage_count: stageCount,
365
- tick_ms: heartbeat ? 5000 : undefined,
366
- reason: heartbeat ? undefined : 'no_consumer',
367
- });
368
- // Stall watchdog: poll every 5s; abort if no runner event has fired for
369
- // stallTimeoutMs. Stops at lifecycle exit (cleared in the finally block
370
- // around runReviewedLifecycle's body — see end-of-function teardown).
371
- const stallWatchdogInterval = setInterval(() => {
372
- if (stallFired)
373
- return;
374
- const idleMs = Date.now() - lastRunnerEventAtMs;
375
- if (idleMs >= stallTimeoutMs) {
376
- stallFired = true;
377
- emitTaskEvent('stall_abort', { idle_ms: idleMs, threshold_ms: stallTimeoutMs });
378
- stallController.abort();
379
- }
380
- }, 5000);
381
- stallWatchdogInterval.unref?.();
382
- const implModel = resolved.provider.config.model;
383
- const progressCounters = { filesRead: 0, filesWritten: 0, toolCalls: 0 };
384
- let prevEventAtMs = Date.now();
385
- // Wrap whenever we have ANY consumer for InternalRunnerEvent (heartbeat,
386
- // verbose stream, or verbose logger). Previously this only wrapped when
387
- // the caller passed onProgress, so --verbose + HTTP handlers (which don't
388
- // pass onProgress) silently dropped every tool_call / turn_complete event.
389
- let textEmissionChars = 0;
390
- const markRunnerEvent = () => {
391
- const now = Date.now();
392
- const gap = now - stageIdle.stageLastEventMs;
393
- if (gap > stageIdle.stageMaxIdleMs)
394
- stageIdle.stageMaxIdleMs = gap;
395
- if (gap > taskMaxIdleMs)
396
- taskMaxIdleMs = gap;
397
- if (gap > 1000)
398
- stageIdle.stageTotalIdleMs += gap;
399
- stageIdle.stageActivityCount += 1;
400
- stageIdle.stageLastEventMs = now;
401
- lastRunnerEventAtMs = now;
402
- };
403
- const wrappedOnProgress = (event) => {
404
- // Watchdog: fire on every activity event regardless of telemetry consumers.
405
- // Without this, a no-consumer caller leaves lastRunnerEventAtMs frozen at
406
- // taskStartMs and the stall watchdog fires at stallTimeoutMs regardless of
407
- // actual LLM activity.
408
- if (event.kind === 'turn_start' || event.kind === 'text_emission' || event.kind === 'tool_call' || event.kind === 'turn_complete') {
409
- markRunnerEvent();
410
- }
411
- if (!needHeartbeat)
412
- return;
413
- if (event.kind === 'worker_start') {
414
- emitTaskEvent('worker_start', {
415
- model: event.model,
416
- providerType: event.providerType,
417
- tier: event.tier,
418
- });
419
- }
420
- if (event.kind === 'turn_start') {
421
- heartbeat?.markEvent('llm');
422
- prevEventAtMs = Date.now();
423
- if (verbose) {
424
- emitTaskEvent('turn_start', {
425
- turn: event.turn,
426
- provider: event.provider,
427
- model: event.model,
428
- });
429
- }
430
- }
431
- if (event.kind === 'text_emission') {
432
- prevEventAtMs = Date.now();
433
- heartbeat?.markEvent('text');
434
- textEmissionChars += event.chars;
435
- if (verbose && event.chars > 0) {
436
- const preview = event.preview.length > 60
437
- ? event.preview.slice(0, 57) + '...'
438
- : event.preview;
439
- emitTaskEvent('text_emission', {
440
- chars: event.chars,
441
- total: textEmissionChars,
442
- preview,
443
- });
444
- }
445
- }
446
- if (event.kind === 'tool_call') {
447
- heartbeat?.markEvent('tool');
448
- progressCounters.toolCalls++;
449
- const name = event.toolSummary.split('(')[0];
450
- if (name === 'readFile' || name === 'grep' || name === 'glob' || name === 'listFiles') {
451
- progressCounters.filesRead++;
452
- }
453
- else if (name === 'writeFile' || name === 'editFile') {
454
- progressCounters.filesWritten++;
455
- }
456
- heartbeat?.updateProgress(progressCounters.filesRead, progressCounters.filesWritten, progressCounters.toolCalls);
457
- const now = Date.now();
458
- const sincePrevMs = now - prevEventAtMs;
459
- prevEventAtMs = now;
460
- if (verbose) {
461
- emitTaskEvent('tool_call', {
462
- tool: event.toolSummary,
463
- duration_ms: sincePrevMs,
464
- });
465
- }
466
- }
467
- if (event.kind === 'turn_complete') {
468
- heartbeat?.markEvent('llm');
469
- const providerConfig = _activeRunnerProviderConfig ?? resolved.provider.config;
470
- // §3.5 point 2: per-turn delta tracking from cumulative usage
471
- const cur = {
472
- inputTokens: event.cumulativeInputTokens,
473
- outputTokens: event.cumulativeOutputTokens,
474
- cachedReadTokens: event.cumulativeCachedReadTokens ?? 0,
475
- cachedCreationTokens: event.cumulativeCachedCreationTokens ?? 0,
476
- reasoningTokens: event.cumulativeReasoningTokens ?? 0,
477
- };
478
- const turnTokens = subtractTokens(cur, _lastCumulative);
479
- _lastCumulative = cur;
480
- const card = resolveRateCard(providerConfig.model, {
481
- ...(providerConfig.inputCostPerMTok !== undefined && { inputCostPerMTok: providerConfig.inputCostPerMTok }),
482
- ...(providerConfig.outputCostPerMTok !== undefined && { outputCostPerMTok: providerConfig.outputCostPerMTok }),
483
- });
484
- const turnCost = card ? priceTokens(turnTokens, card) : null;
485
- if (turnCost !== null) {
486
- _currentRunnerCostUSD = (_currentRunnerCostUSD ?? 0) + turnCost;
487
- }
488
- else {
489
- _rateCardUnresolved = true;
490
- }
491
- const cumulativeCostUSD = (_completedRunnerCostUSD ?? 0) + _currentRunnerCostUSD;
492
- heartbeat?.updateCost(cumulativeCostUSD, null);
493
- if (_rateCardUnresolved) {
494
- heartbeat?.markRateCardUnresolved();
495
- }
496
- const nowTurn = Date.now();
497
- const turnDurMs = nowTurn - prevEventAtMs;
498
- prevEventAtMs = nowTurn;
499
- if (verbose) {
500
- emitTaskEvent('turn_complete', {
501
- input_tokens: event.cumulativeInputTokens,
502
- output_tokens: event.cumulativeOutputTokens,
503
- cost: turnCost,
504
- duration_ms: turnDurMs,
505
- provider: providerConfig.model,
506
- });
507
- }
508
- }
509
- };
510
- const cwd = task.cwd ?? process.cwd();
511
- const taskStartMs = Date.now();
512
- // Hard task-level wall-clock cap. Once Date.now() crosses this, no new
513
- // provider.run is dispatched (retries / tier-fallback short-circuit) and
514
- // any in-flight call gets a per-call timeoutMs clamped to remaining
515
- // budget so it returns its salvage promptly. The user gets *something*
516
- // back instead of an open-ended retry storm.
517
- const taskTimeoutMs = task.timeoutMs ?? config.defaults?.timeoutMs ?? DEFAULT_TASK_TIMEOUT_MS;
518
- const taskDeadlineMs = taskStartMs + taskTimeoutMs;
519
- // Stall watchdog: when no LLM / tool / text event has fired for this
520
- // many ms, the in-flight runner is force-aborted via `stallController`.
521
- // Catches "model is silently thinking forever" and "transport hung" —
522
- // both invisible to the wall-clock cap until the very end.
523
- const stallTimeoutMs = config.defaults.stallTimeoutMs ?? DEFAULT_STALL_TIMEOUT_MS;
524
- const stallController = new AbortController();
525
- let lastRunnerEventAtMs = taskStartMs;
526
- let stageIdle = newStageIdleTracker(taskStartMs);
527
- let taskMaxIdleMs = 0;
528
- let stallFired = false;
529
- // Track the current stage so the terminal transition can pass an accurate
530
- // `from`. Initialized to 'implementing' (matching HeartbeatTimer.start's
531
- // initial stage). Updated on every transitionStage call.
532
- let currentStage = 'implementing';
533
- function transitionStage(from, to, heartbeatPayload, jsonlPayload) {
534
- if (heartbeatPayload !== null)
535
- heartbeat?.transition(heartbeatPayload);
536
- if (jsonlPayload !== null) {
537
- emitTaskEvent('stage_change', { from, to, ...jsonlPayload });
538
- }
539
- stageIdle = newStageIdleTracker(Date.now());
540
- currentStage = to;
541
- }
542
- const commits = [];
543
- let commitError;
544
- let specAttemptIndex = 0;
545
- let qualityAttemptIndex = 0;
546
- const maxSpecRows = maxRowsFor('spec');
547
- const maxQualityRows = maxRowsFor('quality');
548
- const specUnavailable = new Map();
549
- let qualityUnavailable = new Map();
550
- let metadataRepair = 0;
551
- const maxCostUSD = task.maxCostUSD;
552
- const implementerHistory = [];
553
- const specReviewerHistory = [];
554
- const qualityReviewerHistory = [];
555
- const fallbackOverrides = [];
556
- let latestAttemptedImpl;
557
- let lastNonRejectedImpl;
558
- // Review-stage timing variables hoisted so deferred-finalizer closures
559
- // (defined below) can reference them from all early-exit paths.
560
- let specReviewT0 = 0;
561
- let specReviewC0 = null;
562
- let specReviewDurationMs = 0;
563
- let qualityReviewT0 = 0;
564
- let qualityReviewC0 = null;
565
- let qualityReviewDurationMs = 0;
566
- // Accumulated metrics from spec/quality review results — threaded to
567
- // the deferred finalizers so early-exit paths carry the same token/turn
568
- // counts the normal post-loop path always had.
569
- let specReviewMetrics = {};
570
- let qualityReviewMetrics = {};
571
- // Hoisted so deferred-finalizer closures (defined below) can reference
572
- // these from all early-exit paths. Reassigned after the corresponding
573
- // review stage runs.
574
- let specStatus = 'error';
575
- let qualityResult = { status: 'skipped', report: undefined, findings: [], errorReason: (reviewPolicy === 'full' || reviewPolicy === 'quality_only') ? 'all_tiers_unavailable' : 'skipped: reviewPolicy is spec_only' };
576
- const reviewRounds = () => ({ spec: specAttemptIndex, quality: qualityAttemptIndex, metadata: metadataRepair, cap: Math.max(maxSpecRows, maxQualityRows) });
577
- const taskCostUSD = () => (heartbeat ? heartbeat.getHeartbeatTickInfo().costUSD : null);
578
- // Per-stage stats tracking
579
- const stats = emptyStats();
580
- const resolvedModel = config.agents[resolved.slot].model;
581
- const implementerAgentInfo = {
582
- tier: resolved.slot,
583
- family: modelFamily(resolvedModel),
584
- model: resolvedModel,
585
- };
586
- // Build agent info for a specific reviewer tier. Used so review-stage
587
- // entries record the ACTUAL reviewer's model, not the implementer's
588
- // — V3 R3 (review.model != implementerModel) requires this to be
589
- // the cross-model invariant we claim. Pre-3.10.4 every endReviewStage
590
- // call hardcoded implementerAgentInfo, so R3 always fired by
591
- // construction regardless of config.
592
- const reviewerAgentInfoFor = (tier) => {
593
- const provider = providerFor(tier);
594
- const model = provider?.config.model ?? config.agents[tier]?.model ?? resolvedModel;
595
- return { tier, family: modelFamily(model), model };
596
- };
597
- // Deferred finalizers for spec_review and quality_review. Called from
598
- // the normal post-loop path AND from every early-exit path
599
- // (round_cap, cost_ceiling, time_ceiling, all_tiers_unavailable).
600
- // Idempotent on re-call; no-op when the stage was never started.
601
- let specReviewFinalized = false;
602
- let qualityReviewFinalized = false;
603
- const finalizeSpecReviewStage = () => {
604
- if (specReviewFinalized)
605
- return;
606
- if (specReviewT0 === 0)
607
- return; // never started
608
- specReviewFinalized = true;
609
- const lastReviewer = specReviewerHistory[specReviewerHistory.length - 1];
610
- const reviewerAgent = (lastReviewer === undefined || lastReviewer === 'skipped')
611
- ? implementerAgentInfo
612
- : reviewerAgentInfoFor(lastReviewer);
613
- endReviewStage(stats, 'spec_review', specReviewT0, specReviewC0, reviewerAgent, runningCostUSD(), snapshotIdle(stageIdle), specStatus === 'approved' ? 'approved'
614
- : specStatus === 'changes_required' ? 'changes_required'
615
- : specStatus === 'skipped' ? 'skipped'
616
- : specStatus === 'not_applicable' ? 'not_applicable'
617
- : 'error', specAttemptIndex, { ...specReviewMetrics, durationMs: specReviewDurationMs });
618
- };
619
- const finalizeQualityReviewStage = () => {
620
- if (qualityReviewFinalized)
621
- return;
622
- if (qualityReviewT0 === 0)
623
- return;
624
- if (reviewPolicy !== 'full' && reviewPolicy !== 'quality_only')
625
- return;
626
- qualityReviewFinalized = true;
627
- const lastReviewer = qualityReviewerHistory[qualityReviewerHistory.length - 1];
628
- const reviewerAgent = (lastReviewer === undefined || lastReviewer === 'skipped')
629
- ? implementerAgentInfo
630
- : reviewerAgentInfoFor(lastReviewer);
631
- endReviewStage(stats, 'quality_review', qualityReviewT0, qualityReviewC0, reviewerAgent, runningCostUSD(), snapshotIdle(stageIdle), qualityResult.status === 'approved' ? 'approved'
632
- : qualityResult.status === 'changes_required' ? 'changes_required'
633
- : qualityResult.status === 'annotated' ? 'annotated'
634
- : qualityResult.status === 'skipped' ? 'skipped'
635
- : 'error', qualityAttemptIndex, { ...qualityReviewMetrics, durationMs: qualityReviewDurationMs });
636
- };
637
- // §3.9: runningCostUSD must be cumulative and monotonic across explicit
638
- // runner boundaries. Runner progress reports per-runner cumulative token
639
- // counts, so lifecycle cost is completed runners + current runner partial.
640
- // Boundaries are closed from actual RunResult.usage.costUSD values rather
641
- // than inferred from drops; this handles reviewer costs greater than the
642
- // implementer and preserves reviewer-provider pricing.
643
- let _completedRunnerCostUSD = null;
644
- let _currentRunnerCostUSD = 0;
645
- let _activeRunnerProviderConfig = null;
646
- let _prevRunningCost = null;
647
- // Per-turn delta tracking state (§3.5 point 2). Reset at each
648
- // provider.run() boundary via `runAccounted`.
649
- let _lastCumulative = {
650
- inputTokens: 0, outputTokens: 0,
651
- cachedReadTokens: 0, cachedCreationTokens: 0, reasoningTokens: 0,
652
- };
653
- let _rateCardUnresolved = false;
654
- const runningCostUSD = () => {
655
- const current = _completedRunnerCostUSD !== null || _currentRunnerCostUSD !== 0
656
- ? (_completedRunnerCostUSD ?? 0) + _currentRunnerCostUSD
657
- : null;
658
- if (process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'development') {
659
- if (_prevRunningCost !== null && current !== null && current < _prevRunningCost) {
660
- throw new Error(`runningCostUSD non-monotonic: prev=${_prevRunningCost} now=${current}`);
661
- }
662
- _prevRunningCost = current;
663
- }
664
- return current;
665
- };
666
- const runAccounted = async (provider, call) => {
667
- if (_activeRunnerProviderConfig !== null) {
668
- throw new Error('lifecycle cost accounting runner overlap');
669
- }
670
- _activeRunnerProviderConfig = provider.config;
671
- _currentRunnerCostUSD = 0;
672
- _lastCumulative = {
673
- inputTokens: 0, outputTokens: 0,
674
- cachedReadTokens: 0, cachedCreationTokens: 0, reasoningTokens: 0,
675
- };
676
- _rateCardUnresolved = false;
677
- try {
678
- const result = await call();
679
- const actualCost = result?.usage?.costUSD
680
- ?? result?.metrics?.costUSD
681
- ?? _currentRunnerCostUSD;
682
- _completedRunnerCostUSD = (_completedRunnerCostUSD ?? 0) + actualCost;
683
- _currentRunnerCostUSD = 0;
684
- heartbeat?.updateCost(_completedRunnerCostUSD, null);
685
- return result;
686
- }
687
- finally {
688
- _activeRunnerProviderConfig = null;
689
- }
690
- };
691
- const policyEscalated = { spec: false, quality: false, diff: false };
692
- const emitFallback = (p) => {
693
- emitTaskEvent('fallback', p);
694
- };
695
- const emitFallbackUnavailable = (p) => {
696
- emitTaskEvent('fallback_unavailable', p);
697
- };
698
- const emitEscalationEvent = (loop, attempt, decision) => {
699
- const p = {
700
- batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop, attempt,
701
- baseTier: resolved.slot, implTier: decision.impl, reviewerTier: decision.reviewer,
702
- };
703
- emitTaskEvent('escalation', p);
704
- policyEscalated[loop] = true;
705
- };
706
- const emitEscalationUnavailable = (p) => {
707
- emitTaskEvent('escalation_unavailable', p);
708
- };
709
- // When the review loop aborts mid-flight, preserve any review-status info already set
710
- // on the base result (set by callers via abortReviewLoop({ ...res, specReviewStatus, ... })).
711
- // Defaults to 'changes_required' for whichever loop tripped — that's the only state the
712
- // loop ever fires from, by construction.
713
- function adaptForAllTiersUnavailable(base, loop, attempt, resolvedModel, salvageSource, unavailableReason) {
714
- const stageName = loop === 'spec' && attempt === 0 ? 'implementing'
715
- : loop === 'spec' ? 'spec_rework'
716
- : 'quality_rework';
717
- // Promote salvage stage stats + metrics into the global stats map so R2.1
718
- // (non-empty stages for 'incomplete') passes even when bothUnavailable
719
- // short-circuits before endBaseStage runs at the call site.
720
- if (salvageSource?.stageStats) {
721
- for (const key of Object.keys(salvageSource.stageStats)) {
722
- const val = salvageSource.stageStats[key];
723
- if (val)
724
- stats[key] = val;
725
- }
726
- }
727
- const existing = stats[stageName];
728
- if (!existing?.entered) {
729
- stats[stageName] = {
730
- stage: stageName,
731
- entered: true,
732
- durationMs: existing?.durationMs ?? salvageSource?.durationMs ?? null,
733
- costUSD: existing?.costUSD ?? salvageSource?.usage?.costUSD ?? null,
734
- agentTier: implementerAgentInfo.tier,
735
- modelFamily: modelFamily(implementerAgentInfo.model),
736
- model: implementerAgentInfo.model,
737
- maxIdleMs: 0,
738
- totalIdleMs: 0,
739
- activityEvents: 0,
740
- inputTokens: salvageSource?.usage?.inputTokens ?? null,
741
- outputTokens: salvageSource?.usage?.outputTokens ?? null,
742
- cachedTokens: salvageSource?.usage?.cachedTokens ?? null,
743
- reasoningTokens: salvageSource?.usage?.reasoningTokens ?? null,
744
- turnCount: salvageSource?.turns ?? null,
745
- toolCallCount: (salvageSource?.toolCalls?.length) || null,
746
- filesReadCount: (salvageSource?.filesRead?.length) || null,
747
- filesWrittenCount: (salvageSource?.filesWritten?.length) || null,
748
- };
749
- }
750
- finalizeSpecReviewStage();
751
- finalizeQualityReviewStage();
752
- const ship = salvageSource ?? lastNonRejectedImpl?.result ?? base;
753
- return {
754
- ...ship,
755
- status: 'incomplete',
756
- workerStatus: 'blocked',
757
- terminationReason: 'all_tiers_unavailable',
758
- reviewRounds: reviewRounds(),
759
- error: `runWithFallback: both tiers unavailable (loop=${loop}, attempt=${attempt}, role=implementer)`,
760
- errorCode: unavailableReason === 'reviewer_separation_unsatisfiable' ? 'reviewer_separation_unsatisfiable' : ship.errorCode,
761
- agents: agentEnvelope(specReviewerHistory[specReviewerHistory.length - 1] ?? 'not_applicable', qualityReviewerHistory[qualityReviewerHistory.length - 1] ?? ((reviewPolicy === 'full' || reviewPolicy === 'quality_only') ? 'not_applicable' : 'skipped')),
762
- stageStats: stats,
763
- models: {
764
- implementer: salvageSource?.models?.implementer
765
- ?? salvageSource?.stageStats?.[stageName]?.model
766
- ?? resolvedModel,
767
- specReviewer: ship.models?.specReviewer ?? null,
768
- qualityReviewer: ship.models?.qualityReviewer ?? null,
769
- },
770
- };
771
- }
772
- function reviewDidNotReject(status) {
773
- return status === 'approved' || status === 'skipped';
774
- }
775
- const implementerToolMode = task.tools ?? config.defaults.tools;
776
- const agentConfig = config.agents[resolved.slot];
777
- const implementerCapabilities = (agentConfig.capabilities ?? findModelCapabilities(agentConfig.model) ?? []);
778
- const agentEnvelope = (specReviewer, qualityReviewer) => {
779
- // Identity = the slot the executor *resolved to* before any per-call
780
- // fallback flips. This must match `stats.implementing.agentTier`
781
- // (which uses `resolved.slot` directly at line ~697). Per-call slot
782
- // drift is recorded in `fallbackOverrides` and `implementerHistory`,
783
- // not by mutating implementer identity. Pre-3.12.3 used
784
- // latestAttemptedImpl.tier here, which silently disagreed with
785
- // stage stats whenever runWithFallback flipped tiers.
786
- const implementer = resolved.slot;
787
- return {
788
- implementer,
789
- ...(implementerHistory.length > 1 || implementerHistory.some(t => t !== implementer) ? { implementerHistory } : {}),
790
- implementerToolMode,
791
- implementerCapabilities,
792
- specReviewer,
793
- ...(specReviewerHistory.length > 0 && (specReviewerHistory.length > 1 || specReviewerHistory.some(t => t === 'skipped')) ? { specReviewerHistory } : {}),
794
- qualityReviewer,
795
- ...(qualityReviewerHistory.length > 0 && (qualityReviewerHistory.length > 1 || qualityReviewerHistory.some(t => t === 'skipped')) ? { qualityReviewerHistory } : {}),
796
- ...(fallbackOverrides.length > 0 ? { fallbackOverrides } : {}),
797
- };
798
- };
799
- const abortReviewLoop = (base, terminationReason, message, aborting, wallClockMs) => {
800
- finalizeSpecReviewStage();
801
- finalizeQualityReviewStage();
802
- return {
803
- ...base,
804
- status: 'incomplete',
805
- workerStatus: 'review_loop_aborted',
806
- terminationReason: terminationReason === 'round_cap'
807
- ? 'round_cap'
808
- : {
809
- cause: terminationReason === 'cost_ceiling' ? 'cost_exceeded' : 'time_ceiling',
810
- turnsUsed: base.turns,
811
- hasFileArtifacts: (base.filesWritten ?? []).length > 0,
812
- usedShell: (base.toolCalls ?? []).some(c => c.startsWith('shell') || c.startsWith('runShell')),
813
- workerSelfAssessment: 'review_loop_aborted',
814
- wasPromoted: false,
815
- ...(wallClockMs !== undefined ? { wallClockMs } : {}),
816
- },
817
- reviewRounds: reviewRounds(),
818
- error: message,
819
- specReviewStatus: aborting === 'spec' ? 'changes_required' : (base.specReviewStatus ?? 'approved'),
820
- qualityReviewStatus: aborting === 'quality' ? 'changes_required' : (base.qualityReviewStatus ?? 'skipped'),
821
- agents: agentEnvelope(specReviewerHistory[specReviewerHistory.length - 1] ?? 'not_applicable', qualityReviewerHistory[qualityReviewerHistory.length - 1] ?? ((reviewPolicy === 'full' || reviewPolicy === 'quality_only') ? 'not_applicable' : 'skipped')),
822
- stageStats: stats,
823
- };
824
- };
825
- const defaultVerification = { status: 'skipped', steps: [], totalDurationMs: 0, skipReason: 'no_command' };
826
- let latestVerification = defaultVerification;
827
- async function runVerificationStage() {
828
- transitionStage('implementing', 'verifying', { stage: 'verifying', stageIndex: 4 }, {});
829
- const overallVerificationStart = Date.now();
830
- const verifyCostStart = runningCostUSD();
831
- const verification = await runVerifyStage({
832
- cwd,
833
- verifyCommand: task.verifyCommand,
834
- taskTimeoutMs: task.timeoutMs ?? config.defaults?.timeoutMs ?? DEFAULT_TASK_TIMEOUT_MS,
835
- taskStartMs,
836
- });
837
- latestVerification = verification;
838
- endVerifyStage(stats, overallVerificationStart, verifyCostStart, implementerAgentInfo, runningCostUSD(), snapshotIdle(stageIdle), verification.status === 'passed' ? 'passed'
839
- : verification.status === 'failed' ? 'failed'
840
- : verification.status === 'skipped' ? 'skipped'
841
- : 'not_applicable', verification.skipReason ?? null);
842
- for (const step of verification.steps) {
843
- emitTaskEvent('verify_step', {
844
- command: step.command,
845
- status: step.status,
846
- exit_code: step.exitCode,
847
- signal: step.signal,
848
- duration_ms: step.durationMs,
849
- error_message: step.errorMessage ?? undefined,
850
- });
851
- }
852
- if (verification.status === 'skipped') {
853
- emitTaskEvent('verify_skipped', { reason: verification.skipReason ?? 'no_command', stage: 'verifying' });
854
- }
855
- return verification;
856
- }
857
- function signalize(result) {
858
- const cause = typeof result.terminationReason === 'object' ? result.terminationReason.cause : result.terminationReason;
859
- const capExhausted = result.capExhausted
860
- ?? (result.status === 'cost_exceeded' || cause === 'cost_exceeded' || cause === 'cost_ceiling' ? 'cost'
861
- : result.status === 'timeout' || cause === 'timeout' || cause === 'time_ceiling' ? 'wall_clock'
862
- : result.status === 'incomplete' && result.turns > 1 ? 'turn'
863
- : undefined);
864
- const lifecycleClarificationRequested = result.lifecycleClarificationRequested
865
- ?? (result.status === 'brief_too_vague' || cause === 'brief_too_vague' ? true : undefined);
866
- return {
867
- ...result,
868
- ...(capExhausted !== undefined && { capExhausted }),
869
- ...(lifecycleClarificationRequested !== undefined && { lifecycleClarificationRequested }),
870
- };
871
- }
872
- function workerErrorResult(err) {
873
- const workerError = err instanceof Error ? err : new Error(String(err));
874
- return signalize({
875
- output: '',
876
- status: 'error',
877
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null, costDeltaVsParentUSD: null, cachedTokens: null, reasoningTokens: null },
878
- turns: 0,
879
- filesRead: [],
880
- filesWritten: [],
881
- toolCalls: [],
882
- outputIsDiagnostic: true,
883
- escalationLog: [],
884
- parsedFindings: null,
885
- error: workerError.message,
886
- errorCode: 'runner_crash',
887
- structuredError: { code: 'runner_crash', message: workerError.message },
888
- workerStatus: 'failed',
889
- workerError,
890
- models: {
891
- implementer: implModel,
892
- specReviewer: null,
893
- qualityReviewer: null,
894
- },
895
- });
896
- }
897
- function withVerification(result, verification = latestVerification) {
898
- return signalize({ ...result, verification, stageStats: stats });
899
- }
900
- function verificationErrorResult(base, verification) {
901
- if (verification.status !== 'error')
902
- return null;
903
- const failedIndex = verification.steps.findIndex((step) => step.status !== 'passed');
904
- const failedStep = failedIndex >= 0 ? verification.steps[failedIndex] : undefined;
905
- return withVerification({
906
- ...base,
907
- status: 'error',
908
- workerStatus: 'done_with_concerns',
909
- error: failedStep?.errorMessage ?? 'verify command error',
910
- errorCode: 'verify_command_error',
911
- commits,
912
- commitError,
913
- verification,
914
- }, verification);
915
- }
916
- function resolveOffTerminal(base, verification) {
917
- const concerns = [...(base.concerns ?? [])];
918
- let workerStatus = workerStatusForTerminal(base.workerStatus);
919
- if (verification.status === 'failed') {
920
- concerns.push({
921
- source: 'verification',
922
- severity: 'high',
923
- message: 'Verification failed after implementation.',
924
- });
925
- workerStatus = 'done_with_concerns';
926
- }
927
- if (verification.status === 'error') {
928
- const failedIndex = verification.steps.findIndex((step) => step.status !== 'passed');
929
- const failedStep = failedIndex >= 0 ? verification.steps[failedIndex] : undefined;
930
- return withVerification({
931
- ...base,
932
- status: 'error',
933
- workerStatus: 'failed',
934
- error: failedStep?.errorMessage ?? 'verify command error',
935
- errorCode: 'verify_command_error',
936
- commits,
937
- commitError,
938
- verification,
939
- }, verification);
940
- }
941
- return withVerification({
942
- ...base,
943
- status: base.status === 'ok' ? 'ok' : base.status,
944
- workerStatus,
945
- concerns,
946
- commits,
947
- commitError,
948
- verification,
949
- stageStats: stats,
950
- }, verification);
951
- }
952
- function diffReviewErrorTerminationReason(base) {
953
- return {
954
- cause: 'error',
955
- turnsUsed: base.turns,
956
- hasFileArtifacts: (base.filesWritten ?? []).length > 0,
957
- usedShell: (base.toolCalls ?? []).some(c => c.startsWith('shell') || c.startsWith('runShell')),
958
- workerSelfAssessment: 'failed',
959
- wasPromoted: false,
960
- ...(base.terminationReason && typeof base.terminationReason === 'object' && base.terminationReason.wallClockMs !== undefined ? { wallClockMs: base.terminationReason.wallClockMs } : {}),
961
- };
962
- }
963
- function resolveDiffOnlyTerminal(base, verdict, verification, diffTruncated) {
964
- const concerns = [...(base.concerns ?? [])];
965
- if ('status' in verdict && verdict.status === 'skipped') {
966
- return withVerification({
967
- ...base,
968
- workerStatus: workerStatusForTerminal(base.workerStatus),
969
- commits,
970
- commitError,
971
- verification,
972
- }, verification);
973
- }
974
- if (verdict.kind === 'reject') {
975
- return withVerification({
976
- ...base,
977
- status: 'error',
978
- workerStatus: 'failed',
979
- error: verdict.message || 'diff review rejected implementation',
980
- errorCode: 'diff_review_rejected',
981
- structuredError: {
982
- code: 'diff_review_rejected',
983
- message: verdict.message || 'diff review rejected implementation',
984
- },
985
- terminationReason: diffReviewErrorTerminationReason(base),
986
- concerns,
987
- commits,
988
- commitError,
989
- verification,
990
- }, verification);
991
- }
992
- if (verdict.kind === 'transport_failure') {
993
- return withVerification({
994
- ...base,
995
- status: verdict.status,
996
- workerStatus: 'failed',
997
- error: verdict.reason ?? `diff review transport failure: ${verdict.status}`,
998
- errorCode: verdict.status,
999
- structuredError: {
1000
- code: verdict.status,
1001
- message: verdict.reason ?? `diff review transport failure: ${verdict.status}`,
1002
- },
1003
- terminationReason: diffReviewErrorTerminationReason(base),
1004
- concerns: [...concerns, ...verdict.concerns],
1005
- commits,
1006
- commitError,
1007
- verification,
1008
- }, verification);
1009
- }
1010
- concerns.push(...verdict.concerns);
1011
- if (verification.status === 'failed') {
1012
- concerns.push({
1013
- source: 'verification',
1014
- severity: 'high',
1015
- message: 'Verification failed after implementation.',
1016
- });
1017
- }
1018
- if (diffTruncated) {
1019
- concerns.push({
1020
- source: 'diff_truncated',
1021
- severity: 'medium',
1022
- message: 'Implementation diff exceeded the reviewer evidence byte cap and was truncated.',
1023
- });
1024
- }
1025
- const hasConcerns = concerns.length > 0 || verification.status === 'failed';
1026
- return withVerification({
1027
- ...base,
1028
- status: base.status === 'ok' ? 'ok' : base.status,
1029
- workerStatus: hasConcerns ? 'done_with_concerns' : workerStatusForTerminal(base.workerStatus),
1030
- concerns,
1031
- commits,
1032
- commitError,
1033
- verification,
1034
- }, verification);
1035
- }
1036
- function workerStatusForTerminal(status) {
1037
- return status === 'needs_context' || status === 'blocked' || status === 'failed' || status === 'done_with_concerns'
1038
- ? status
1039
- : 'done';
1040
- }
1041
- async function recordWorkerCommits(from, to = 'HEAD') {
1042
- const { stdout: revs } = await exec('git', ['rev-list', '--reverse', `${from}..${to}`], { cwd });
1043
- for (const sha of revs.trim().split('\n').filter(Boolean)) {
1044
- const c = await readbackCommit(sha, cwd);
1045
- commits.push(c);
1046
- }
1047
- }
1048
- async function repairCommitMetadata(initialDiagnostic) {
1049
- let metadataAttempts = 0;
1050
- let lastZodError = initialDiagnostic || 'no commit block emitted';
1051
- let validCommit = null;
1052
- while (metadataAttempts < 2 && !validCommit) {
1053
- const preStatus = (await exec('git', ['status', '--porcelain=v1', '-z'], { cwd })).stdout;
1054
- const repaired = await runMetadataRepairTurn({ task, zodError: lastZodError, cwd, providerSlot: resolved.slot, provider: resolved.provider });
1055
- const postStatus = (await exec('git', ['status', '--porcelain=v1', '-z'], { cwd })).stdout;
1056
- metadataAttempts += 1;
1057
- if (preStatus !== postStatus) {
1058
- commitError = 'commit_metadata_repair_modified_files';
1059
- return null;
1060
- }
1061
- if (repaired.commit)
1062
- validCommit = repaired.commit;
1063
- else
1064
- lastZodError = repaired.commitDiagnostic ?? 'no commit block emitted';
1065
- }
1066
- if (!validCommit)
1067
- commitError = `commit_metadata_invalid: ${lastZodError}`;
1068
- return validCommit;
1069
- }
1070
- async function captureCommitsAfterImplementation(implResult, implReport, baselineHead) {
1071
- const porcelain = (await exec('git', ['status', '--porcelain=v1'], { cwd })).stdout;
1072
- const headNow = (await exec('git', ['rev-parse', 'HEAD'], { cwd })).stdout.trim();
1073
- const headMoved = headNow !== baselineHead;
1074
- const treeDirty = porcelain.length > 0;
1075
- if (!headMoved && !treeDirty)
1076
- return;
1077
- // Emit committing stage for both worker-committed (headMoved) and
1078
- // pending-commit (treeDirty) paths. Workers that auto-commit during
1079
- // turns leave a clean tree but moved HEAD — they must still produce
1080
- // a committing stage so telemetry includes filesCommittedCount.
1081
- transitionStage('verifying', 'committing', { stage: 'committing', stageIndex: 7 }, null);
1082
- const commitT0 = Date.now();
1083
- const commitC0 = runningCostUSD();
1084
- if (headMoved)
1085
- await recordWorkerCommits(baselineHead, 'HEAD');
1086
- if (treeDirty) {
1087
- const validCommit = implReport?.commit ?? await repairCommitMetadata(implReport?.commitDiagnostic ?? 'no commit block emitted');
1088
- if (validCommit) {
1089
- const c = await runCommitStage({ cwd, filesWritten: implResult.filesWritten, commit: validCommit });
1090
- commits.push(c);
1091
- }
1092
- }
1093
- endBaseStage(stats, 'committing', commitT0, commitC0, implementerAgentInfo, runningCostUSD(), snapshotIdle(stageIdle));
1094
- }
1095
- // Tracks the final RunResult across every exit path so the `finally` block
1096
- // below fires `recorder.recordTaskCompleted` exactly once regardless of which
1097
- // `return` the lifecycle takes — the success path, every early return inside
1098
- // the try (reviewPolicy='off', diff-only, all-tiers-unavailable, …), and the
1099
- // catch path. Without this, the recorder only fires on 2 of ~5 exit paths.
1100
- let __finalRunResult;
1101
- const __recordOnce = (r) => {
1102
- // Stamp stallTriggered and taskMaxIdleMs on every exit path.
1103
- // The watchdog flag is owned by this scope; surfacing it on the
1104
- // RunResult lets the caller (and telemetry) distinguish "no progress"
1105
- // aborts from cap exhaustion. taskMaxIdleMs is always populated so the
1106
- // task_completed JSONL event has it regardless of early return.
1107
- const stamped = {
1108
- ...r,
1109
- ...(stallFired ? { stallTriggered: true } : {}),
1110
- taskMaxIdleMs,
1111
- };
1112
- if (__finalRunResult === undefined)
1113
- __finalRunResult = stamped;
1114
- return stamped;
1115
- };
1116
- try {
1117
- // The dirty-tree precondition + git baseline only apply to artifact-producing tasks
1118
- // (those with autoCommit === true). Non-artifact presets — audit, review, verify,
1119
- // debug — neither produce commits nor read git state, so they bypass the check
1120
- // entirely. Per spec Section A: "Non-artifact tasks (audits, analyses, read-only
1121
- // investigations) skip stages 3 and 4."
1122
- const isArtifactProducing = task.autoCommit === true;
1123
- let baselineHead = '';
1124
- if (isArtifactProducing) {
1125
- baselineHead = (await exec('git', ['rev-parse', 'HEAD'], { cwd })).stdout.trim();
1126
- const baselinePorcelain = (await exec('git', ['status', '--porcelain=v1', '-z'], { cwd })).stdout;
1127
- if (baselinePorcelain.length !== 0) {
1128
- return withVerification({
1129
- output: `Sub-agent error: task.cwd ${cwd} had pre-existing modifications`,
1130
- status: 'error',
1131
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null, costDeltaVsParentUSD: null, cachedTokens: null, reasoningTokens: null },
1132
- turns: 0,
1133
- filesRead: [],
1134
- filesWritten: [],
1135
- toolCalls: [],
1136
- outputIsDiagnostic: true,
1137
- escalationLog: [],
1138
- parsedFindings: null,
1139
- error: `task.cwd ${cwd} had pre-existing modifications`,
1140
- errorCode: 'dirty_worktree',
1141
- commits,
1142
- });
1143
- }
1144
- }
1145
- const initialDecision = pickEscalation({
1146
- loop: 'spec',
1147
- attemptIndex: 0,
1148
- baseTier: resolved.slot,
1149
- });
1150
- const implT0 = Date.now();
1151
- const implC0 = runningCostUSD();
1152
- const initialImpl = await runWithFallback({
1153
- assigned: initialDecision.impl,
1154
- providerFor,
1155
- unavailableTiers: specUnavailable,
1156
- isTransportFailure: (r) => TRANSPORT_FAILURES.has(r.status) && r.capExhausted === undefined,
1157
- getStatus: (r) => r.status,
1158
- makeSyntheticFailure: (assigned) => makeSyntheticRunResult(assigned, 'all_tiers_unavailable'),
1159
- call: (provider) => runAccounted(provider, () => delegateWithEscalation(withDoneCondition(task), [provider], { explicitlyPinned: false, onProgress: wrappedOnProgress, taskDeadlineMs, abortSignal: stallController.signal, assignedTier: initialDecision.impl })),
1160
- });
1161
- if (initialImpl.fallbackFired || initialImpl.bothUnavailable) {
1162
- fallbackOverrides.push({
1163
- role: 'implementer',
1164
- loop: 'spec',
1165
- attempt: 0,
1166
- assigned: initialDecision.impl,
1167
- used: initialImpl.usedTier,
1168
- reason: (initialImpl.fallbackReason ?? initialImpl.unavailableReason),
1169
- triggeringStatus: initialImpl.fallbackTriggeringStatus,
1170
- bothUnavailable: initialImpl.bothUnavailable,
1171
- });
1172
- }
1173
- if (initialImpl.fallbackFired) {
1174
- emitFallback({
1175
- batchId: heartbeatWiring?.batchId ?? '', taskIndex,
1176
- loop: 'spec', attempt: 0, role: 'implementer',
1177
- assignedTier: initialDecision.impl,
1178
- usedTier: initialImpl.usedTier,
1179
- reason: initialImpl.fallbackReason,
1180
- triggeringStatus: initialImpl.fallbackTriggeringStatus,
1181
- violatesSeparation: false,
1182
- });
1183
- }
1184
- if (initialImpl.bothUnavailable) {
1185
- emitFallbackUnavailable({
1186
- batchId: heartbeatWiring?.batchId ?? '', taskIndex,
1187
- loop: 'spec', attempt: 0, role: 'implementer',
1188
- assignedTier: initialDecision.impl,
1189
- reason: initialImpl.unavailableReason,
1190
- });
1191
- return __recordOnce(adaptForAllTiersUnavailable(initialImpl.result, 'spec', 0, resolvedModel, initialImpl.salvageResult, initialImpl.unavailableReason));
1192
- }
1193
- let implResult = initialImpl.result;
1194
- latestAttemptedImpl = { tier: initialImpl.usedTier, result: implResult };
1195
- lastNonRejectedImpl = { tier: initialImpl.usedTier, result: implResult };
1196
- implementerHistory.push(initialImpl.usedTier);
1197
- endBaseStage(stats, 'implementing', implT0, implC0, implementerAgentInfo, runningCostUSD(), snapshotIdle(stageIdle), {
1198
- inputTokens: implResult.usage?.inputTokens ?? 0,
1199
- outputTokens: implResult.usage?.outputTokens ?? 0,
1200
- cachedTokens: implResult.usage?.cachedTokens ?? 0,
1201
- reasoningTokens: implResult.usage?.reasoningTokens ?? 0,
1202
- turnCount: implResult.turns,
1203
- toolCallCount: implResult.toolCalls?.length ?? 0,
1204
- filesReadCount: implResult.filesRead?.length ?? 0,
1205
- filesWrittenCount: implResult.filesWritten?.length ?? 0,
1206
- costUSD: implResult.usage?.costUSD ?? undefined,
1207
- });
1208
- specAttemptIndex = 1;
1209
- const implReport = parseStructuredReport(implResult.output);
1210
- const workerStatus = extractWorkerStatus(implReport);
1211
- // Item 9: surface silent-incomplete via errorCode — the delegation layer
1212
- // cascades result.status as a fallback errorCode (e.g., 'incomplete'),
1213
- // which is not an informative error code. Replace it when the runner
1214
- // produced no parseable summary — the operator can now filter on
1215
- // 'incomplete_no_summary' instead of guessing.
1216
- //
1217
- // parseStructuredReport always returns a report object and has a
1218
- // last-resort fallback that treats the first paragraph as an implicit
1219
- // summary, so implReport.summary alone is not a reliable signal. Treat
1220
- // the run as having a structured summary only when a real ## Summary
1221
- // section exists and parses to non-placeholder content.
1222
- const hasSummaryHeader = /\n##\s+summary\s*\n/i.test(implResult.output) || /^##\s+summary\s*\n/im.test(implResult.output);
1223
- const summaryText = (hasSummaryHeader ? implReport.summary : null)?.trim().toLowerCase() ?? '';
1224
- const hasStructuredSummary = hasSummaryHeader && summaryText !== ''
1225
- && !['none', '(none)', 'n/a', 'na', 'todo', 'tbd'].includes(summaryText);
1226
- if (implResult.status === 'incomplete' && !hasStructuredSummary) {
1227
- const cascadedFallback = implResult.errorCode === implResult.status;
1228
- if (!implResult.errorCode || cascadedFallback) {
1229
- implResult = { ...implResult, errorCode: 'incomplete_no_summary' };
1230
- }
1231
- }
1232
- if (implResult.status === 'ok' && isArtifactProducing) {
1233
- await captureCommitsAfterImplementation(implResult, implReport, baselineHead);
1234
- }
1235
- const verification = isArtifactProducing ? await runVerificationStage() : defaultVerification;
1236
- const verifyError = verificationErrorResult(implResult, verification);
1237
- if (verifyError)
1238
- return verifyError;
1239
- const filePathsInteracted = task.filePaths && task.filePaths.length > 0
1240
- ? [...(implResult.filesRead ?? []), ...implResult.filesWritten].some(f => task.filePaths.some(fp => f === fp || f.endsWith('/' + fp) || f.endsWith(fp)))
1241
- : true;
1242
- const filePathsSkipped = !filePathsInteracted;
1243
- if (implResult.filesWritten.length === 0 && reviewPolicy !== 'quality_only') {
1244
- if (reviewPolicy === 'off') {
1245
- transitionStage('verifying', 'terminal', null, {});
1246
- const terminal = resolveOffTerminal({
1247
- ...implResult,
1248
- workerStatus,
1249
- specReviewStatus: 'skipped',
1250
- qualityReviewStatus: 'skipped',
1251
- specReviewReason: 'skipped: reviewPolicy is off',
1252
- qualityReviewReason: 'skipped: reviewPolicy is off',
1253
- agents: agentEnvelope('skipped', 'skipped'),
1254
- models: {
1255
- implementer: implModel,
1256
- specReviewer: null,
1257
- qualityReviewer: null,
1258
- },
1259
- implementationReport: implReport,
1260
- structuredReport: implReport,
1261
- filePathsSkipped,
1262
- fileArtifactsMissing: implResult.status === 'ok' ? checkOutputTargets(outputTargets) : undefined,
1263
- }, verification);
1264
- return __recordOnce(terminal);
1265
- }
1266
- const effectiveImplReport = implReport ?? buildFallbackImplReport(implResult);
1267
- const earlyFileArtifactsMissing = implResult.status === 'ok' ? checkOutputTargets(outputTargets) : undefined;
1268
- const earlyStatus = implResult.status === 'ok' && earlyFileArtifactsMissing
1269
- ? 'incomplete'
1270
- : implResult.status;
1271
- return {
1272
- ...implResult,
1273
- status: earlyStatus,
1274
- workerStatus,
1275
- specReviewStatus: 'not_applicable',
1276
- qualityReviewStatus: 'not_applicable',
1277
- specReviewReason: 'task produced no file artifacts to review',
1278
- qualityReviewReason: 'task produced no file artifacts to review',
1279
- implementationReport: effectiveImplReport,
1280
- structuredReport: {
1281
- summary: '[No artifacts] task produced no file artifacts to review',
1282
- filesChanged: effectiveImplReport.filesChanged,
1283
- validationsRun: effectiveImplReport.validationsRun,
1284
- deviationsFromBrief: effectiveImplReport.deviationsFromBrief,
1285
- unresolved: effectiveImplReport.unresolved,
1286
- extraSections: effectiveImplReport.extraSections ?? {},
1287
- },
1288
- filePathsSkipped,
1289
- agents: agentEnvelope('not_applicable', 'not_applicable'),
1290
- models: {
1291
- implementer: implModel,
1292
- specReviewer: null,
1293
- qualityReviewer: null,
1294
- },
1295
- fileArtifactsMissing: earlyFileArtifactsMissing,
1296
- commits,
1297
- commitError,
1298
- verification,
1299
- stageStats: stats,
1300
- };
1301
- }
1302
- if (workerStatus === 'needs_context' || workerStatus === 'blocked') {
1303
- return {
1304
- ...implResult,
1305
- workerStatus,
1306
- specReviewStatus: 'skipped',
1307
- qualityReviewStatus: 'skipped',
1308
- specReviewReason: 'skipped: worker reported ' + workerStatus,
1309
- qualityReviewReason: 'skipped: worker reported ' + workerStatus,
1310
- agents: agentEnvelope('skipped', 'skipped'),
1311
- models: {
1312
- implementer: implModel,
1313
- specReviewer: null,
1314
- qualityReviewer: null,
1315
- },
1316
- fileArtifactsMissing: implResult.status === 'ok' ? checkOutputTargets(outputTargets) : undefined,
1317
- commits,
1318
- commitError,
1319
- verification,
1320
- stageStats: stats,
1321
- };
1322
- }
1323
- if (reviewPolicy === 'off') {
1324
- transitionStage('verifying', 'terminal', null, {});
1325
- const terminal = resolveOffTerminal({
1326
- ...implResult,
1327
- workerStatus,
1328
- specReviewStatus: 'skipped',
1329
- qualityReviewStatus: 'skipped',
1330
- specReviewReason: 'skipped: reviewPolicy is off',
1331
- qualityReviewReason: 'skipped: reviewPolicy is off',
1332
- agents: agentEnvelope('skipped', 'skipped'),
1333
- models: {
1334
- implementer: implModel,
1335
- specReviewer: null,
1336
- qualityReviewer: null,
1337
- },
1338
- implementationReport: implReport,
1339
- fileArtifactsMissing: implResult.status === 'ok' ? checkOutputTargets(outputTargets) : undefined,
1340
- }, verification);
1341
- return __recordOnce(terminal);
1342
- }
1343
- const reviewModel = providerFor(pickReviewer({ loop: 'spec', attemptIndex: 0, baseTier: resolved.slot }))?.config.model ?? null;
1344
- const packet = {
1345
- prompt: task.prompt,
1346
- scope: task.filePaths ?? [],
1347
- doneCondition: task.done ?? 'tsc passes',
1348
- };
1349
- let fileContents = await readImplementerFileContents(implResult.filesWritten, task.cwd);
1350
- const effectiveImplReport = implReport ?? buildFallbackImplReport(implResult);
1351
- const evidence = (isArtifactProducing && reviewPolicy !== 'quality_only')
1352
- ? await buildEvidence({ cwd, baselineHead, commits, verification, reviewPolicy })
1353
- : { block: '', diffTruncated: false, fullDiff: '' };
1354
- if (reviewPolicy === 'diff_only') {
1355
- const diffUnavailable = new Map();
1356
- const diffReviewerTier = pickReviewer({ loop: 'spec', attemptIndex: 0, baseTier: resolved.slot });
1357
- transitionStage('verifying', 'diff_review', { stage: 'diff_review', stageIndex: 2, reviewRound: 1, attemptCap: 1 }, {});
1358
- const diffReviewT0 = Date.now();
1359
- const diffReviewC0 = runningCostUSD();
1360
- const diffReviewT0_commit = Date.now();
1361
- const diffReviewC0_commit = runningCostUSD();
1362
- const diffCall = await runWithFallback({
1363
- assigned: diffReviewerTier,
1364
- providerFor,
1365
- unavailableTiers: diffUnavailable,
1366
- isTransportFailure: (r) => isReviewTransportFailure(r),
1367
- getStatus: (r) => r.status,
1368
- makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
1369
- forbiddenTiers: [resolved.slot],
1370
- call: (provider) => runAccounted(provider, () => runDiffReview({ cwd, diff: evidence.fullDiff, diffTruncated: evidence.diffTruncated, verification, worker: { call: (prompt, opts) => provider.run(prompt, { cwd: opts?.cwd ?? cwd, abortSignal: opts?.abortSignal, timeoutMs: opts?.timeoutMs }) }, taskDeadlineMs, abortSignal: stallController.signal })),
1371
- });
1372
- if (diffCall.fallbackFired) {
1373
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'diff', attempt: 0, role: 'diffReviewer', assignedTier: diffReviewerTier, usedTier: diffCall.usedTier, reason: diffCall.fallbackReason, triggeringStatus: diffCall.fallbackTriggeringStatus, violatesSeparation: diffCall.usedTier === implementerHistory[implementerHistory.length - 1], fallbackSeparationRespected: diffCall.fallbackSeparationRespected, assignedIdentity: diffCall.assignedIdentity ?? null, usedIdentity: diffCall.usedIdentity ?? null });
1374
- fallbackOverrides.push({ role: 'diffReviewer', loop: 'diff', attempt: 0, assigned: diffReviewerTier, used: diffCall.usedTier, reason: diffCall.fallbackReason, triggeringStatus: diffCall.fallbackTriggeringStatus, bothUnavailable: diffCall.bothUnavailable });
1375
- }
1376
- if (diffCall.bothUnavailable) {
1377
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'diff', attempt: 0, role: 'diffReviewer', assignedTier: diffReviewerTier, reason: diffCall.unavailableReason });
1378
- if (diffCall.unavailableReason === 'reviewer_separation_unsatisfiable') {
1379
- return __recordOnce(adaptForAllTiersUnavailable({ ...implResult, errorCode: 'reviewer_separation_unsatisfiable', diffReviewStatus: 'error' }, 'spec', 0, resolvedModel, implResult, diffCall.unavailableReason));
1380
- }
1381
- }
1382
- const verdict = diffCall.bothUnavailable ? makeSkippedReviewResult('all_tiers_unavailable') : diffCall.result;
1383
- const diffEnvelopeStatus = 'kind' in verdict
1384
- ? (verdict.kind === 'approve' ? 'approved'
1385
- : verdict.kind === 'concerns' ? 'approved'
1386
- : verdict.kind === 'reject' ? 'changes_required'
1387
- : 'error')
1388
- : 'skipped';
1389
- emitTaskEvent('review_decision', {
1390
- stage: 'diff_review',
1391
- verdict: 'kind' in verdict
1392
- ? (verdict.kind === 'approve' ? 'approved'
1393
- : verdict.kind === 'concerns' ? 'concerns'
1394
- : verdict.kind === 'reject' ? 'changes_required'
1395
- : 'error') // verdict.kind === 'transport_failure'
1396
- : 'skipped',
1397
- round: 1,
1398
- });
1399
- endReviewStage(stats, 'diff_review', diffReviewT0_commit, diffReviewC0_commit, reviewerAgentInfoFor((diffCall.usedTier ?? diffReviewerTier)), runningCostUSD(), snapshotIdle(stageIdle),
1400
- // Diff review uses 'approve' | 'concerns' | 'reject' | 'transport_failure' (DiffReviewVerdict),
1401
- // distinct from spec/quality verdicts. Map to the telemetry verdict enum here.
1402
- 'kind' in verdict
1403
- ? (verdict.kind === 'approve' ? 'approved'
1404
- : verdict.kind === 'concerns' ? 'approved'
1405
- : verdict.kind === 'reject' ? 'changes_required'
1406
- : 'error')
1407
- : 'skipped', 0);
1408
- return __recordOnce(resolveDiffOnlyTerminal({
1409
- ...implResult,
1410
- workerStatus,
1411
- specReviewStatus: 'skipped',
1412
- qualityReviewStatus: 'skipped',
1413
- specReviewReason: 'skipped: reviewPolicy is diff_only',
1414
- qualityReviewReason: 'skipped: reviewPolicy is diff_only',
1415
- diffReviewStatus: diffEnvelopeStatus,
1416
- implementationReport: effectiveImplReport,
1417
- fileArtifactsMissing: implResult.status === 'ok' ? checkOutputTargets(outputTargets) : undefined,
1418
- agents: agentEnvelope('skipped', 'skipped'),
1419
- models: { implementer: implModel, specReviewer: reviewModel, qualityReviewer: null },
1420
- }, verdict, verification, evidence.diffTruncated));
1421
- }
1422
- let finalImplResult = implResult;
1423
- let finalImplReport = effectiveImplReport;
1424
- let specResult;
1425
- let specReport;
1426
- let specReviewReason;
1427
- if (reviewPolicy !== 'quality_only') {
1428
- transitionStage('verifying', 'spec_review', { stage: 'spec_review', stageIndex: 2, reviewRound: 1, attemptCap: maxSpecRows }, null);
1429
- const initialReviewerTier = pickReviewer({ loop: 'spec', attemptIndex: 0, baseTier: resolved.slot });
1430
- specReviewT0 = Date.now();
1431
- specReviewC0 = runningCostUSD();
1432
- const initialSpecReviewIterStart = Date.now();
1433
- const initialSpecReview = await runWithFallback({
1434
- assigned: initialReviewerTier,
1435
- providerFor,
1436
- unavailableTiers: specUnavailable,
1437
- isTransportFailure: (r) => isReviewTransportFailure(r),
1438
- getStatus: (r) => r.status,
1439
- makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
1440
- forbiddenTiers: [resolved.slot],
1441
- call: (provider) => runAccounted(provider, () => runSpecReview(provider, packet, effectiveImplReport, fileContents, implResult.toolCalls, task.planContext, evidence.block, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)),
1442
- });
1443
- specReviewDurationMs += Date.now() - initialSpecReviewIterStart;
1444
- if (initialSpecReview.bothUnavailable) {
1445
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: 0, role: 'specReviewer', assignedTier: initialReviewerTier, reason: initialSpecReview.unavailableReason });
1446
- fallbackOverrides.push({ role: 'specReviewer', loop: 'spec', attempt: 0, assigned: initialReviewerTier, used: initialSpecReview.usedTier, reason: initialSpecReview.unavailableReason, triggeringStatus: initialSpecReview.fallbackTriggeringStatus, bothUnavailable: true });
1447
- specReviewerHistory.push('skipped');
1448
- if (initialSpecReview.unavailableReason === 'reviewer_separation_unsatisfiable') {
1449
- const unavailableBase = {
1450
- ...implResult,
1451
- specReviewStatus: 'error',
1452
- specReviewReason: 'reviewer separation unsatisfiable',
1453
- errorCode: 'reviewer_separation_unsatisfiable',
1454
- };
1455
- return __recordOnce(adaptForAllTiersUnavailable(unavailableBase, 'spec', 0, resolvedModel, implResult, initialSpecReview.unavailableReason));
1456
- }
1457
- }
1458
- else {
1459
- specReviewerHistory.push(initialSpecReview.usedTier);
1460
- if (initialSpecReview.fallbackFired) {
1461
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: 0, role: 'specReviewer', assignedTier: initialReviewerTier, usedTier: initialSpecReview.usedTier, reason: initialSpecReview.fallbackReason, triggeringStatus: initialSpecReview.fallbackTriggeringStatus, violatesSeparation: initialSpecReview.usedTier === implementerHistory[implementerHistory.length - 1], fallbackSeparationRespected: initialSpecReview.fallbackSeparationRespected, assignedIdentity: initialSpecReview.assignedIdentity ?? null, usedIdentity: initialSpecReview.usedIdentity ?? null });
1462
- fallbackOverrides.push({ role: 'specReviewer', loop: 'spec', attempt: 0, assigned: initialReviewerTier, used: initialSpecReview.usedTier, reason: initialSpecReview.fallbackReason, triggeringStatus: initialSpecReview.fallbackTriggeringStatus, bothUnavailable: false });
1463
- }
1464
- }
1465
- specResult = initialSpecReview.bothUnavailable
1466
- ? makeSkippedReviewResult('all_tiers_unavailable')
1467
- : initialSpecReview.result;
1468
- specStatus = specResult.status;
1469
- specReport = 'report' in specResult ? specResult.report : undefined;
1470
- specReviewReason = specStatus === 'skipped' ? 'all_tiers_unavailable' : ('errorReason' in specResult ? specResult.errorReason : undefined);
1471
- let prevSpecFindings = [...(specResult.findings ?? [])];
1472
- const specReworkAcc = emptyReworkAcc();
1473
- while (specStatus === 'changes_required') {
1474
- if (specAttemptIndex >= maxSpecRows)
1475
- return abortReviewLoop(finalImplResult, 'round_cap', 'review round cap reached before spec rework', 'spec');
1476
- const currentCostUSD = taskCostUSD();
1477
- if (currentCostUSD !== null && maxCostUSD !== undefined && currentCostUSD >= 0.8 * maxCostUSD) {
1478
- emitTaskEvent('cost_check', { stage: 'spec_rework', tripped: true, cost_used_usd: currentCostUSD, cost_cap_usd: maxCostUSD, cost_available: true });
1479
- return abortReviewLoop(finalImplResult, 'cost_ceiling', 'cost ceiling reached before spec rework', 'spec');
1480
- }
1481
- const wallClock = Date.now() - taskStartMs;
1482
- if (wallClock >= MAX_TIME_PRESTOP_RATIO * taskTimeoutMs) {
1483
- emitTaskEvent('time_check', { stage: 'spec_rework', tripped: true, wallClockMs: wallClock, timeoutMs: taskTimeoutMs });
1484
- return abortReviewLoop(finalImplResult, 'time_ceiling', `time ceiling reached before spec rework (${wallClock}ms >= 0.8 × ${taskTimeoutMs}ms)`, 'spec', wallClock);
1485
- }
1486
- const decision = pickEscalation({ loop: 'spec', attemptIndex: specAttemptIndex, baseTier: resolved.slot });
1487
- if (decision.isEscalated)
1488
- emitEscalationEvent('spec', specAttemptIndex, decision);
1489
- const specReworkIterStart = Date.now();
1490
- transitionStage('spec_review', 'spec_rework', { stage: 'spec_rework', stageIndex: 3, reviewRound: specAttemptIndex, attemptCap: maxSpecRows }, { attempt: specAttemptIndex, attemptCap: maxSpecRows, implTier: decision.impl, reviewerTier: decision.reviewer, escalated: decision.isEscalated });
1491
- const feedback = specResult.findings.length > 0 ? `\n\n## Spec Review Feedback (round ${specAttemptIndex}):\n${specResult.findings.map(f => `- ${f}`).join('\n')}` : '';
1492
- const reworkTask = withDoneCondition({ ...task, prompt: `${task.prompt}${feedback}` });
1493
- const reworkCall = await runWithFallback({ assigned: decision.impl, providerFor, unavailableTiers: specUnavailable, isTransportFailure: (r) => TRANSPORT_FAILURES.has(r.status) && r.capExhausted === undefined, getStatus: (r) => r.status, makeSyntheticFailure: (assigned) => makeSyntheticRunResult(assigned, 'all_tiers_unavailable'), call: (provider) => runAccounted(provider, () => delegateWithEscalation(reworkTask, [provider], { explicitlyPinned: true, onProgress: wrappedOnProgress, taskDeadlineMs, abortSignal: stallController.signal, assignedTier: decision.impl })) });
1494
- if (reworkCall.fallbackFired || reworkCall.bothUnavailable)
1495
- fallbackOverrides.push({ role: 'implementer', loop: 'spec', attempt: specAttemptIndex, assigned: decision.impl, used: reworkCall.usedTier, reason: (reworkCall.fallbackReason ?? reworkCall.unavailableReason), triggeringStatus: reworkCall.fallbackTriggeringStatus, bothUnavailable: reworkCall.bothUnavailable });
1496
- if (reworkCall.fallbackFired) {
1497
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'implementer', assignedTier: decision.impl, usedTier: reworkCall.usedTier, reason: reworkCall.fallbackReason, triggeringStatus: reworkCall.fallbackTriggeringStatus, violatesSeparation: false });
1498
- if (decision.isEscalated && reworkCall.fallbackReason === 'not_configured')
1499
- emitEscalationUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'implementer', wantedTier: decision.impl, reason: reworkCall.fallbackReason });
1500
- }
1501
- if (reworkCall.bothUnavailable) {
1502
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'implementer', assignedTier: decision.impl, reason: reworkCall.unavailableReason });
1503
- if (decision.isEscalated)
1504
- emitEscalationUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'implementer', wantedTier: decision.impl, reason: reworkCall.unavailableReason });
1505
- return __recordOnce(adaptForAllTiersUnavailable(reworkCall.result, 'spec', specAttemptIndex, resolvedModel, reworkCall.salvageResult, reworkCall.unavailableReason));
1506
- }
1507
- finalImplResult = reworkCall.result;
1508
- latestAttemptedImpl = { tier: reworkCall.usedTier, result: finalImplResult };
1509
- implementerHistory.push(reworkCall.usedTier);
1510
- const reworkReport = parseStructuredReport(finalImplResult.output);
1511
- finalImplReport = reworkReport.summary ? reworkReport : buildFallbackImplReport(finalImplResult);
1512
- fileContents = await readImplementerFileContents(finalImplResult.filesWritten, task.cwd);
1513
- accumulateReworkIteration(specReworkAcc, finalImplResult, Date.now() - specReworkIterStart, snapshotIdle(stageIdle));
1514
- commitReworkStage(stats, 'spec_rework', specReworkAcc, implementerAgentInfo);
1515
- transitionStage('spec_rework', 'spec_review', { stage: 'spec_review', stageIndex: 2, reviewRound: specAttemptIndex + 1, attemptCap: maxSpecRows }, null);
1516
- const reReviewIterStart = Date.now();
1517
- const reviewCall = await runWithFallback({ assigned: decision.reviewer, providerFor, unavailableTiers: specUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'), forbiddenTiers: [resolved.slot], call: (provider) => runAccounted(provider, () => runSpecReview(provider, packet, finalImplReport, fileContents, finalImplResult.toolCalls, task.planContext, evidence.block, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)) });
1518
- specReviewDurationMs += Date.now() - reReviewIterStart;
1519
- if (reviewCall.bothUnavailable) {
1520
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'specReviewer', assignedTier: decision.reviewer, reason: reviewCall.unavailableReason });
1521
- fallbackOverrides.push({ role: 'specReviewer', loop: 'spec', attempt: specAttemptIndex, assigned: decision.reviewer, used: reviewCall.usedTier, reason: reviewCall.unavailableReason, triggeringStatus: reviewCall.fallbackTriggeringStatus, bothUnavailable: true });
1522
- specReviewerHistory.push('skipped');
1523
- if (reviewCall.unavailableReason === 'reviewer_separation_unsatisfiable') {
1524
- const unavailableBase = {
1525
- ...finalImplResult,
1526
- specReviewStatus: 'error',
1527
- specReviewReason: 'reviewer separation unsatisfiable',
1528
- errorCode: 'reviewer_separation_unsatisfiable',
1529
- };
1530
- return __recordOnce(adaptForAllTiersUnavailable(unavailableBase, 'spec', specAttemptIndex, resolvedModel, finalImplResult, reviewCall.unavailableReason));
1531
- }
1532
- }
1533
- else {
1534
- specReviewerHistory.push(reviewCall.usedTier);
1535
- if (reviewCall.fallbackFired) {
1536
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'spec', attempt: specAttemptIndex, role: 'specReviewer', assignedTier: decision.reviewer, usedTier: reviewCall.usedTier, reason: reviewCall.fallbackReason, triggeringStatus: reviewCall.fallbackTriggeringStatus, violatesSeparation: reviewCall.usedTier === implementerHistory[implementerHistory.length - 1], fallbackSeparationRespected: reviewCall.fallbackSeparationRespected, assignedIdentity: reviewCall.assignedIdentity ?? null, usedIdentity: reviewCall.usedIdentity ?? null });
1537
- fallbackOverrides.push({ role: 'specReviewer', loop: 'spec', attempt: specAttemptIndex, assigned: decision.reviewer, used: reviewCall.usedTier, reason: reviewCall.fallbackReason, triggeringStatus: reviewCall.fallbackTriggeringStatus, bothUnavailable: false });
1538
- }
1539
- }
1540
- specResult = reviewCall.result;
1541
- specStatus = specResult.status;
1542
- specReport = 'report' in specResult ? specResult.report : undefined;
1543
- specReviewReason = specStatus === 'skipped' ? 'all_tiers_unavailable' : ('errorReason' in specResult ? specResult.errorReason : undefined);
1544
- if (reviewDidNotReject(specStatus))
1545
- lastNonRejectedImpl = { tier: implementerHistory[implementerHistory.length - 1], result: finalImplResult };
1546
- specAttemptIndex++;
1547
- if (specStatus === 'approved' || specStatus === 'skipped')
1548
- break;
1549
- const currentFindings = [...(specResult.findings ?? [])].sort().join('\0');
1550
- const prevFindings = [...prevSpecFindings].sort().join('\0');
1551
- if (currentFindings === prevFindings && currentFindings !== '')
1552
- break;
1553
- prevSpecFindings = [...(specResult.findings ?? [])];
1554
- }
1555
- }
1556
- else {
1557
- specResult = { status: 'skipped', report: undefined, findings: [], reason: 'all_tiers_unavailable' };
1558
- specStatus = 'not_applicable';
1559
- specReport = undefined;
1560
- specReviewReason = 'skipped: reviewPolicy is quality_only';
1561
- }
1562
- if (reviewPolicy === 'full' || reviewPolicy === 'quality_only') {
1563
- qualityUnavailable = new Map();
1564
- const qualityReviewerTier = pickReviewer({ loop: 'quality', attemptIndex: 0, baseTier: resolved.slot });
1565
- transitionStage(currentStage, 'quality_review', { stage: 'quality_review', stageIndex: 4, reviewRound: 1, attemptCap: maxQualityRows }, null);
1566
- qualityReviewT0 = Date.now();
1567
- qualityReviewC0 = runningCostUSD();
1568
- const initialQualityIterStart = Date.now();
1569
- const initialQuality = await runWithFallback({ assigned: qualityReviewerTier, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'), forbiddenTiers: [resolved.slot], call: (provider) => runAccounted(provider, () => runQualityReview(provider, packet, specReport ?? finalImplReport, fileContents, finalImplResult.toolCalls, finalImplResult.filesWritten, evidence.block, qualityReviewPromptBuilder, finalImplResult.output, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)) });
1570
- qualityReviewDurationMs += Date.now() - initialQualityIterStart;
1571
- if (initialQuality.bothUnavailable) {
1572
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: 0, role: 'qualityReviewer', assignedTier: qualityReviewerTier, reason: initialQuality.unavailableReason });
1573
- fallbackOverrides.push({ role: 'qualityReviewer', loop: 'quality', attempt: 0, assigned: qualityReviewerTier, used: initialQuality.usedTier, reason: initialQuality.unavailableReason, triggeringStatus: initialQuality.fallbackTriggeringStatus, bothUnavailable: true });
1574
- qualityReviewerHistory.push('skipped');
1575
- if (initialQuality.unavailableReason === 'reviewer_separation_unsatisfiable') {
1576
- const unavailableBase = {
1577
- ...finalImplResult,
1578
- qualityReviewStatus: 'error',
1579
- qualityReviewReason: 'reviewer separation unsatisfiable',
1580
- errorCode: 'reviewer_separation_unsatisfiable',
1581
- };
1582
- return __recordOnce(adaptForAllTiersUnavailable(unavailableBase, 'quality', 0, resolvedModel, finalImplResult, initialQuality.unavailableReason));
1583
- }
1584
- }
1585
- else {
1586
- qualityReviewerHistory.push(initialQuality.usedTier);
1587
- if (initialQuality.fallbackFired) {
1588
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: 0, role: 'qualityReviewer', assignedTier: qualityReviewerTier, usedTier: initialQuality.usedTier, reason: initialQuality.fallbackReason, triggeringStatus: initialQuality.fallbackTriggeringStatus, violatesSeparation: initialQuality.usedTier === implementerHistory[implementerHistory.length - 1], fallbackSeparationRespected: initialQuality.fallbackSeparationRespected, assignedIdentity: initialQuality.assignedIdentity ?? null, usedIdentity: initialQuality.usedIdentity ?? null });
1589
- fallbackOverrides.push({ role: 'qualityReviewer', loop: 'quality', attempt: 0, assigned: qualityReviewerTier, used: initialQuality.usedTier, reason: initialQuality.fallbackReason, triggeringStatus: initialQuality.fallbackTriggeringStatus, bothUnavailable: false });
1590
- }
1591
- }
1592
- qualityResult = initialQuality.result;
1593
- qualityAttemptIndex = 1;
1594
- if (reviewDidNotReject(qualityResult.status))
1595
- lastNonRejectedImpl = { tier: implementerHistory[implementerHistory.length - 1], result: finalImplResult };
1596
- if (reviewPolicy === 'quality_only') {
1597
- // Annotation model: emit one quality event per pass with severity-correction
1598
- // and mean-confidence summary fields. Then we are done — no rework loop.
1599
- const annotated = qualityResult.annotatedFindings ?? [];
1600
- // meanConfidence skips null entries (fallback path); null when ALL are null.
1601
- const numericConfidences = annotated
1602
- .map(f => f.reviewerConfidence)
1603
- .filter((c) => c !== null);
1604
- const meanConfidence = numericConfidences.length > 0
1605
- ? Math.round((numericConfidences.reduce((s, c) => s + c, 0) / numericConfidences.length) * 100) / 100
1606
- : null;
1607
- // STEP A: Funnel annotated findings into concerns[] so V3
1608
- // findingsBySeverity (built later in event-builder.ts:buildReviewStage)
1609
- // rolls them up. MUST happen before any path that records the task,
1610
- // and before emitTaskEvent below since downstream consumers may
1611
- // observe finalImplResult during emit.
1612
- if (annotated.length > 0) {
1613
- const findingsAsConcerns = annotated.map((f) => ({
1614
- source: 'quality_review',
1615
- severity: f.severity,
1616
- message: `[${f.id}] ${f.claim}`,
1617
- }));
1618
- finalImplResult = {
1619
- ...finalImplResult,
1620
- concerns: [...(finalImplResult.concerns ?? []), ...findingsAsConcerns],
1621
- annotatedFindings: annotated,
1622
- };
1623
- }
1624
- // STEP B: Emit per-pass annotation event (no rework loop in quality_only).
1625
- emitTaskEvent('read_only_review.quality', {
1626
- route: routeKey,
1627
- verdict: qualityResult.status === 'annotated' ? 'annotated'
1628
- : qualityResult.status === 'skipped' ? 'skipped'
1629
- : 'error',
1630
- iterationIndex: 1,
1631
- findingsReviewed: annotated.length,
1632
- meanConfidence,
1633
- durationMs: Date.now() - qualityReviewT0,
1634
- costUSD: runningCostUSD() !== null && qualityReviewC0 !== null ? runningCostUSD() - qualityReviewC0 : null,
1635
- });
1636
- }
1637
- else {
1638
- // Artifact-route gating model — keep the rework loop.
1639
- let prevQualityFindings = [...(qualityResult.findings ?? [])];
1640
- const qualityReworkAcc = emptyReworkAcc();
1641
- while (qualityResult.status === 'changes_required') {
1642
- if (qualityAttemptIndex >= maxQualityRows)
1643
- return abortReviewLoop(finalImplResult, 'round_cap', 'review round cap reached before quality rework', 'quality');
1644
- const currentCostUSD = taskCostUSD();
1645
- if (currentCostUSD !== null && maxCostUSD !== undefined && currentCostUSD >= 0.8 * maxCostUSD) {
1646
- emitTaskEvent('cost_check', { stage: 'quality_rework', tripped: true, cost_used_usd: currentCostUSD, cost_cap_usd: maxCostUSD, cost_available: true });
1647
- return abortReviewLoop(finalImplResult, 'cost_ceiling', 'cost ceiling reached before quality rework', 'quality');
1648
- }
1649
- const wallClock = Date.now() - taskStartMs;
1650
- if (wallClock >= MAX_TIME_PRESTOP_RATIO * taskTimeoutMs) {
1651
- emitTaskEvent('time_check', { stage: 'quality_rework', tripped: true, wallClockMs: wallClock, timeoutMs: taskTimeoutMs });
1652
- return abortReviewLoop(finalImplResult, 'time_ceiling', `time ceiling reached before quality rework (${wallClock}ms >= 0.8 × ${taskTimeoutMs}ms)`, 'quality', wallClock);
1653
- }
1654
- const decision = pickEscalation({ loop: 'quality', attemptIndex: qualityAttemptIndex, baseTier: resolved.slot });
1655
- if (decision.isEscalated)
1656
- emitEscalationEvent('quality', qualityAttemptIndex, decision);
1657
- const qualityReworkIterStart = Date.now();
1658
- transitionStage('quality_review', 'quality_rework', { stage: 'quality_rework', stageIndex: 5, reviewRound: qualityAttemptIndex, attemptCap: maxQualityRows }, { attempt: qualityAttemptIndex, attemptCap: maxQualityRows, implTier: decision.impl, reviewerTier: decision.reviewer, escalated: decision.isEscalated });
1659
- const feedback = qualityResult.findings.length > 0 ? `\n\n## Quality Review Feedback (round ${qualityAttemptIndex}):\n${qualityResult.findings.map(f => `- ${f}`).join('\n')}` : '';
1660
- const reworkTask = withDoneCondition({ ...task, prompt: `${task.prompt}${feedback}` });
1661
- const reworkCall = await runWithFallback({ assigned: decision.impl, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => TRANSPORT_FAILURES.has(r.status) && r.capExhausted === undefined, getStatus: (r) => r.status, makeSyntheticFailure: (assigned) => makeSyntheticRunResult(assigned, 'all_tiers_unavailable'), call: (provider) => runAccounted(provider, () => delegateWithEscalation(reworkTask, [provider], { explicitlyPinned: true, onProgress: wrappedOnProgress, taskDeadlineMs, abortSignal: stallController.signal, assignedTier: decision.impl })) });
1662
- if (reworkCall.fallbackFired || reworkCall.bothUnavailable)
1663
- fallbackOverrides.push({ role: 'implementer', loop: 'quality', attempt: qualityAttemptIndex, assigned: decision.impl, used: reworkCall.usedTier, reason: (reworkCall.fallbackReason ?? reworkCall.unavailableReason), triggeringStatus: reworkCall.fallbackTriggeringStatus, bothUnavailable: reworkCall.bothUnavailable });
1664
- if (reworkCall.fallbackFired)
1665
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: qualityAttemptIndex, role: 'implementer', assignedTier: decision.impl, usedTier: reworkCall.usedTier, reason: reworkCall.fallbackReason, triggeringStatus: reworkCall.fallbackTriggeringStatus, violatesSeparation: false });
1666
- if (reworkCall.bothUnavailable) {
1667
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: qualityAttemptIndex, role: 'implementer', assignedTier: decision.impl, reason: reworkCall.unavailableReason });
1668
- if (decision.isEscalated)
1669
- emitEscalationUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: qualityAttemptIndex, role: 'implementer', wantedTier: decision.impl, reason: reworkCall.unavailableReason });
1670
- return __recordOnce(adaptForAllTiersUnavailable(reworkCall.result, 'quality', qualityAttemptIndex, resolvedModel, reworkCall.salvageResult, reworkCall.unavailableReason));
1671
- }
1672
- finalImplResult = reworkCall.result;
1673
- latestAttemptedImpl = { tier: reworkCall.usedTier, result: finalImplResult };
1674
- implementerHistory.push(reworkCall.usedTier);
1675
- const reworkReport = parseStructuredReport(finalImplResult.output);
1676
- finalImplReport = reworkReport.summary ? reworkReport : buildFallbackImplReport(finalImplResult);
1677
- fileContents = await readImplementerFileContents(finalImplResult.filesWritten, task.cwd);
1678
- accumulateReworkIteration(qualityReworkAcc, finalImplResult, Date.now() - qualityReworkIterStart, snapshotIdle(stageIdle));
1679
- commitReworkStage(stats, 'quality_rework', qualityReworkAcc, implementerAgentInfo);
1680
- transitionStage('quality_rework', 'quality_review', { stage: 'quality_review', stageIndex: 4, reviewRound: qualityAttemptIndex + 1, attemptCap: maxQualityRows }, null);
1681
- const qReReviewIterStart = Date.now();
1682
- const reviewCall = await runWithFallback({ assigned: decision.reviewer, providerFor, unavailableTiers: qualityUnavailable, isTransportFailure: (r) => isReviewTransportFailure(r), getStatus: (r) => r.status, makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'), forbiddenTiers: [resolved.slot], call: (provider) => runAccounted(provider, () => runQualityReview(provider, packet, finalImplReport, fileContents, finalImplResult.toolCalls, finalImplResult.filesWritten, evidence.block, qualityReviewPromptBuilder, finalImplResult.output, taskDeadlineMs, stallController.signal, wrappedOnProgress, cwd)) });
1683
- qualityReviewDurationMs += Date.now() - qReReviewIterStart;
1684
- if (reviewCall.bothUnavailable) {
1685
- emitFallbackUnavailable({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: qualityAttemptIndex, role: 'qualityReviewer', assignedTier: decision.reviewer, reason: reviewCall.unavailableReason });
1686
- fallbackOverrides.push({ role: 'qualityReviewer', loop: 'quality', attempt: qualityAttemptIndex, assigned: decision.reviewer, used: reviewCall.usedTier, reason: reviewCall.unavailableReason, triggeringStatus: reviewCall.fallbackTriggeringStatus, bothUnavailable: true });
1687
- qualityReviewerHistory.push('skipped');
1688
- if (reviewCall.unavailableReason === 'reviewer_separation_unsatisfiable') {
1689
- const unavailableBase = {
1690
- ...finalImplResult,
1691
- qualityReviewStatus: 'error',
1692
- qualityReviewReason: 'reviewer separation unsatisfiable',
1693
- errorCode: 'reviewer_separation_unsatisfiable',
1694
- };
1695
- return __recordOnce(adaptForAllTiersUnavailable(unavailableBase, 'quality', qualityAttemptIndex, resolvedModel, finalImplResult, reviewCall.unavailableReason));
1696
- }
1697
- }
1698
- else {
1699
- qualityReviewerHistory.push(reviewCall.usedTier);
1700
- if (reviewCall.fallbackFired) {
1701
- emitFallback({ batchId: heartbeatWiring?.batchId ?? '', taskIndex, loop: 'quality', attempt: qualityAttemptIndex, role: 'qualityReviewer', assignedTier: decision.reviewer, usedTier: reviewCall.usedTier, reason: reviewCall.fallbackReason, triggeringStatus: reviewCall.fallbackTriggeringStatus, violatesSeparation: reviewCall.usedTier === implementerHistory[implementerHistory.length - 1], fallbackSeparationRespected: reviewCall.fallbackSeparationRespected, assignedIdentity: reviewCall.assignedIdentity ?? null, usedIdentity: reviewCall.usedIdentity ?? null });
1702
- fallbackOverrides.push({ role: 'qualityReviewer', loop: 'quality', attempt: qualityAttemptIndex, assigned: decision.reviewer, used: reviewCall.usedTier, reason: reviewCall.fallbackReason, triggeringStatus: reviewCall.fallbackTriggeringStatus, bothUnavailable: false });
1703
- }
1704
- }
1705
- qualityResult = reviewCall.result;
1706
- if (reviewDidNotReject(qualityResult.status))
1707
- lastNonRejectedImpl = { tier: implementerHistory[implementerHistory.length - 1], result: finalImplResult };
1708
- qualityAttemptIndex++;
1709
- if (qualityResult.status === 'approved' || qualityResult.status === 'skipped')
1710
- break;
1711
- const currentFindings = [...(qualityResult.findings ?? [])].sort().join('\0');
1712
- const prevFindings = [...prevQualityFindings].sort().join('\0');
1713
- if (currentFindings === prevFindings && currentFindings !== '')
1714
- break;
1715
- prevQualityFindings = [...(qualityResult.findings ?? [])];
1716
- }
1717
- }
1718
- }
1719
- const finalReport = specReport ?? finalImplReport;
1720
- const concerns = [...(finalImplResult.concerns ?? [])];
1721
- let finalWorkerStatus = workerStatus;
1722
- if (verification.status === 'failed') {
1723
- concerns.push({
1724
- source: 'verification',
1725
- severity: 'high',
1726
- message: 'Verification failed after implementation.',
1727
- });
1728
- if (finalWorkerStatus === 'done')
1729
- finalWorkerStatus = 'done_with_concerns';
1730
- }
1731
- if (evidence.diffTruncated) {
1732
- concerns.push({
1733
- source: 'diff_truncated',
1734
- severity: 'medium',
1735
- message: 'Implementation diff exceeded the reviewer evidence byte cap and was truncated.',
1736
- });
1737
- }
1738
- const specAggregateStatus = reviewPolicy === 'quality_only'
1739
- ? 'skipped'
1740
- : (['approved', 'changes_required', 'skipped', 'error', 'api_error', 'network_error', 'timeout'].includes(specStatus) ? specStatus : 'error');
1741
- // R3 invariant: review-stage entries must record the actual REVIEWER's
1742
- // model, not the implementer's. The last-used reviewer tier is the one
1743
- // that produced the final verdict (after any escalation during rework).
1744
- // Fall back to the implementer's tier only when no reviewer ever ran
1745
- // (skipped path), which is fine because the schema R3 then doesn't apply.
1746
- const lastSpecReviewerEntry = specReviewerHistory[specReviewerHistory.length - 1];
1747
- const lastQualityReviewerEntry = qualityReviewerHistory[qualityReviewerHistory.length - 1];
1748
- const specReviewAgent = lastSpecReviewerEntry === undefined || lastSpecReviewerEntry === 'skipped'
1749
- ? implementerAgentInfo
1750
- : reviewerAgentInfoFor(lastSpecReviewerEntry);
1751
- const qualityReviewAgent = lastQualityReviewerEntry === undefined || lastQualityReviewerEntry === 'skipped'
1752
- ? implementerAgentInfo
1753
- : reviewerAgentInfoFor(lastQualityReviewerEntry);
1754
- // Merge accumulated review-stage wall durations into the metrics
1755
- // override. endReviewStage uses the override when present and falls
1756
- // back to `Date.now() - t0` otherwise (which over-counts review-block
1757
- // span across rework + later stages).
1758
- specReviewMetrics = (specResult.metrics ?? {});
1759
- qualityReviewMetrics = (qualityResult.metrics ?? {});
1760
- finalizeSpecReviewStage();
1761
- finalizeQualityReviewStage();
1762
- const qualityAggregateStatus = qualityResult.status;
1763
- const aggregated = aggregateResult(finalReport, specReport, qualityResult.report, specAggregateStatus, qualityAggregateStatus);
1764
- // File artifact verification: check whether output targets exist on disk after all work.
1765
- // Only applies when status is ok; non-ok statuses skip verification entirely.
1766
- const fileArtifactsMissing = finalImplResult.status === 'ok' && outputTargets.length > 0
1767
- ? checkOutputTargets(outputTargets)
1768
- : undefined;
1769
- // Status downgrade: review verdicts are authoritative. File artifact verification
1770
- // is also authoritative — missing output targets downgrade ok → incomplete.
1771
- const finalStatus = finalImplResult.status === 'ok' &&
1772
- (specStatus === 'changes_required' || qualityResult.status === 'changes_required')
1773
- ? 'incomplete'
1774
- : finalImplResult.status === 'ok' && fileArtifactsMissing
1775
- ? 'incomplete'
1776
- : finalImplResult.status;
1777
- const specEnvelopeStatus = (specStatus === 'api_error' || specStatus === 'network_error' || specStatus === 'timeout' || specStatus === 'api_aborted' ? 'error' : specStatus);
1778
- const qualityEnvelopeStatus = qualityResult.status === 'api_error' || qualityResult.status === 'network_error' || qualityResult.status === 'timeout' || qualityResult.status === 'api_aborted' ? 'error' : qualityResult.status;
1779
- const runResult = {
1780
- ...finalImplResult,
1781
- status: finalStatus,
1782
- workerStatus: finalWorkerStatus,
1783
- concerns,
1784
- specReviewStatus: specEnvelopeStatus,
1785
- qualityReviewStatus: qualityEnvelopeStatus,
1786
- stageStats: stats,
1787
- reviewRounds: reviewRounds(),
1788
- specReviewReason: 'errorReason' in specResult ? specResult.errorReason : undefined,
1789
- qualityReviewReason: 'errorReason' in qualityResult ? qualityResult.errorReason : undefined,
1790
- structuredReport: aggregated,
1791
- implementationReport: finalImplReport,
1792
- specReviewReport: specReport,
1793
- qualityReviewReport: qualityResult.report,
1794
- filePathsSkipped,
1795
- agents: agentEnvelope(specReviewerHistory[specReviewerHistory.length - 1] ?? 'not_applicable', qualityReviewerHistory[qualityReviewerHistory.length - 1] ?? ((reviewPolicy === 'full' || reviewPolicy === 'quality_only') ? 'not_applicable' : 'skipped')),
1796
- models: {
1797
- implementer: implModel,
1798
- specReviewer: reviewPolicy !== 'quality_only' ? reviewModel : null,
1799
- qualityReviewer: (reviewPolicy === 'full' || reviewPolicy === 'quality_only') ? reviewModel : null,
1800
- },
1801
- fileArtifactsMissing,
1802
- commits,
1803
- commitError,
1804
- verification,
1805
- };
1806
- if (reviewPolicy === 'quality_only') {
1807
- emitTaskEvent('read_only_review.terminal', {
1808
- route: routeKey,
1809
- roundsUsed: qualityAttemptIndex,
1810
- finalQualityVerdict: qualityResult.status === 'annotated' ? 'annotated'
1811
- : qualityResult.status === 'skipped' ? 'skipped'
1812
- : 'error',
1813
- costUSD: taskCostUSD(),
1814
- durationMs: Date.now() - taskStartMs,
1815
- });
1816
- }
1817
- return __recordOnce(runResult);
1818
- }
1819
- catch (err) {
1820
- const errorRunResult = withVerification(workerErrorResult(err));
1821
- if (reviewPolicy === 'quality_only') {
1822
- emitTaskEvent('read_only_review.terminal', {
1823
- route: routeKey,
1824
- roundsUsed: qualityAttemptIndex,
1825
- finalQualityVerdict: 'error',
1826
- costUSD: taskCostUSD(),
1827
- durationMs: Date.now() - taskStartMs,
1828
- });
1829
- }
1830
- return __recordOnce(errorRunResult);
1831
- }
1832
- finally {
1833
- // Fire telemetry recorder once across every exit path. Bedrock invariant:
1834
- // telemetry failure NEVER throws to the user task.
1835
- if (__finalRunResult !== undefined) {
1836
- try {
1837
- recorder?.recordTaskCompleted({
1838
- route: _route ?? 'delegate',
1839
- taskSpec: task,
1840
- runResult: __finalRunResult,
1841
- client: _client ?? 'claude-code',
1842
- triggeringSkill: _triggeringSkill ?? 'direct',
1843
- parentModel: task.parentModel ?? null,
1844
- reviewPolicy,
1845
- verifyCommandPresent: !!(task.verifyCommand && task.verifyCommand.length > 0),
1846
- });
1847
- }
1848
- catch { /* silent */ }
1849
- // NEW in v3.9.0: local JSONL emit. Distinct from cloud — local is
1850
- // for verbose/observability consumers; cloud is for telemetry sink.
1851
- try {
1852
- const r = __finalRunResult;
1853
- emitTaskEvent('task_completed', {
1854
- status: r.status,
1855
- workerStatus: r.workerStatus ?? null,
1856
- turns: r.turns,
1857
- durationMs: r.durationMs ?? null,
1858
- filesRead: r.filesRead?.length ?? 0,
1859
- filesWritten: r.filesWritten?.length ?? 0,
1860
- toolCalls: r.toolCalls?.length ?? 0,
1861
- inputTokens: r.usage.inputTokens,
1862
- outputTokens: r.usage.outputTokens,
1863
- cachedTokens: r.usage.cachedTokens ?? null,
1864
- reasoningTokens: r.usage.reasoningTokens ?? null,
1865
- costUSD: r.usage.costUSD,
1866
- taskMaxIdleMs: r.taskMaxIdleMs ?? null,
1867
- stallTriggered: r.stallTriggered ?? false,
1868
- stages_json: diagnostics?.logger?.expectedPath() ?? null,
1869
- });
1870
- }
1871
- catch { /* silent — never break the user task */ }
1872
- try {
1873
- const summary = computeTaskCompletionSummary({
1874
- runResult: __finalRunResult,
1875
- taskIndexZero: taskIndex,
1876
- totalTasks: 1,
1877
- batchId: heartbeatWiring?.batchId ?? '',
1878
- });
1879
- emitTaskEvent('task_done_summary', {
1880
- message: formatTaskDoneLine(summary),
1881
- status: summary.terminalStatus,
1882
- duration_ms: summary.totalDurationMs,
1883
- cost_usd: summary.totalCostUSD,
1884
- input_tokens: summary.totalInputTokens,
1885
- output_tokens: summary.totalOutputTokens,
1886
- turns: summary.turns,
1887
- files_written: summary.filesWrittenCount,
1888
- spec_verdict: summary.specReviewVerdict,
1889
- quality_verdict: summary.qualityReviewVerdict,
1890
- });
1891
- }
1892
- catch { /* silent */ }
1893
- }
1894
- transitionStage(currentStage, 'terminal', { stage: 'terminal', stageIndex: 8 }, null);
1895
- heartbeat?.stop();
1896
- clearInterval(stallWatchdogInterval);
1897
- }
1898
- }
1899
- //# sourceMappingURL=reviewed-lifecycle.js.map