@fitchmultz/pi-subagents 0.44.7 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (955) hide show
  1. package/CHANGELOG.md +264 -7
  2. package/LICENSE +1 -0
  3. package/README.md +58 -1483
  4. package/agents/context-builder.md +19 -1
  5. package/agents/debugger.md +10 -3
  6. package/agents/delegate.md +1 -0
  7. package/agents/fixer.md +4 -1
  8. package/agents/oracle.md +13 -2
  9. package/agents/planner.md +14 -3
  10. package/agents/researcher.md +11 -2
  11. package/agents/reviewer-claude.md +11 -2
  12. package/agents/reviewer-gpt.md +12 -2
  13. package/agents/reviewer-ponytail.md +11 -1
  14. package/agents/reviewer-security.md +13 -2
  15. package/agents/reviewer.md +12 -3
  16. package/agents/scout.md +12 -1
  17. package/agents/ui-designer.md +10 -3
  18. package/agents/watcher.md +1 -0
  19. package/agents/worker.md +8 -2
  20. package/agents/writer.md +6 -3
  21. package/dist/agents/agent-defaults.js +9 -0
  22. package/dist/agents/agent-definition.js +196 -0
  23. package/dist/agents/agent-management.js +64 -905
  24. package/dist/agents/agent-scope.js +4 -2
  25. package/dist/agents/agent-selection.js +10 -5
  26. package/dist/agents/agent-serializer.js +55 -67
  27. package/dist/agents/agents.js +75 -716
  28. package/dist/agents/builtin-overrides.js +218 -0
  29. package/dist/agents/chain-serializer.js +3 -367
  30. package/dist/agents/config-values.js +52 -0
  31. package/dist/agents/discovery-paths.js +91 -0
  32. package/dist/agents/frontmatter.js +15 -5
  33. package/dist/agents/identity.js +25 -8
  34. package/dist/agents/json-chain.js +254 -0
  35. package/dist/agents/management-config.js +332 -0
  36. package/dist/agents/management-format.js +231 -0
  37. package/dist/agents/management-persistence.js +287 -0
  38. package/dist/agents/management-targets.js +136 -0
  39. package/dist/agents/management-warnings.js +81 -0
  40. package/dist/agents/markdown-chain.js +210 -0
  41. package/dist/agents/package-agents.js +154 -0
  42. package/dist/agents/skill-files.js +157 -0
  43. package/dist/agents/skill-search-paths.js +246 -0
  44. package/dist/agents/skill-types.js +1 -0
  45. package/dist/agents/skills.js +54 -499
  46. package/dist/extension/acceptance-schema.js +55 -0
  47. package/dist/extension/build-info.js +1 -1
  48. package/dist/extension/chain-schema.js +196 -0
  49. package/dist/extension/child-runtime.js +237 -0
  50. package/dist/extension/compact-tools.js +122 -51
  51. package/dist/extension/config-schema.js +29 -0
  52. package/dist/extension/config.js +27 -11
  53. package/dist/extension/control-notice-schema.js +37 -0
  54. package/dist/extension/control-notices.js +13 -6
  55. package/dist/extension/delegation-bridges.js +43 -0
  56. package/dist/extension/doctor.js +48 -25
  57. package/dist/extension/everyday-schemas.js +207 -0
  58. package/dist/extension/fanout-child.js +18 -319
  59. package/dist/extension/index.js +8 -563
  60. package/dist/extension/message-renderers.js +225 -0
  61. package/dist/extension/nested-control-inbox.js +154 -0
  62. package/dist/extension/parent-runtime.js +339 -0
  63. package/dist/extension/primary-tool.js +69 -0
  64. package/dist/extension/result-snapshot.js +22 -0
  65. package/dist/extension/runtime-reload.js +62 -0
  66. package/dist/extension/runtime-storage.js +43 -0
  67. package/dist/extension/schema-overrides.js +75 -0
  68. package/dist/extension/schemas.js +265 -336
  69. package/dist/extension/tool-input.js +27 -12
  70. package/dist/extension/tool-result.js +19 -4
  71. package/dist/history/answer-texts.js +57 -0
  72. package/dist/history/canonical-result.js +76 -43
  73. package/dist/history/canonical-selection.js +40 -0
  74. package/dist/history/database-generation.js +82 -0
  75. package/dist/history/database.js +57 -33
  76. package/dist/history/entry-ingestion.js +61 -0
  77. package/dist/history/index.js +242 -97
  78. package/dist/history/ingest.js +168 -331
  79. package/dist/history/output-digests.js +40 -0
  80. package/dist/history/preview.js +210 -0
  81. package/dist/history/prune.js +33 -0
  82. package/dist/history/queries.js +60 -349
  83. package/dist/history/query-scope.js +190 -0
  84. package/dist/history/rows.js +77 -0
  85. package/dist/history/run-projection.js +137 -0
  86. package/dist/history/run-queries.js +153 -0
  87. package/dist/history/schema.js +31 -0
  88. package/dist/history/search-queries.js +163 -0
  89. package/dist/history/selected-record.js +108 -0
  90. package/dist/history/source-file.js +45 -0
  91. package/dist/history/source-watches.js +141 -0
  92. package/dist/history/store.js +164 -153
  93. package/dist/history/text-chunks.js +169 -0
  94. package/dist/history/text.js +35 -0
  95. package/dist/history/transcript-queries.js +177 -0
  96. package/dist/history/types.js +5 -1
  97. package/dist/history/values.js +36 -0
  98. package/dist/history/wire-inputs.js +122 -0
  99. package/dist/history/wire-models.js +38 -0
  100. package/dist/history/worker-runtime.js +441 -0
  101. package/dist/history/worker.js +66 -462
  102. package/dist/intercom/intercom-bridge.js +48 -20
  103. package/dist/intercom/live-intercom.js +80 -23
  104. package/dist/intercom/nested-result-tree.js +163 -0
  105. package/dist/intercom/result-delivery.js +40 -0
  106. package/dist/intercom/result-intercom.js +178 -261
  107. package/dist/pi-intercom/agent-dir.js +7 -3
  108. package/dist/pi-intercom/async.js +27 -0
  109. package/dist/pi-intercom/bridge-ask.js +57 -0
  110. package/dist/pi-intercom/bridge-config.js +89 -0
  111. package/dist/pi-intercom/bridge-http.js +86 -0
  112. package/dist/pi-intercom/bridge-launch-policy.js +88 -0
  113. package/dist/pi-intercom/bridge-launch.js +217 -0
  114. package/dist/pi-intercom/bridge-protocol.js +106 -0
  115. package/dist/pi-intercom/bridge-routes.js +72 -0
  116. package/dist/pi-intercom/bridge-rpc-process.js +264 -0
  117. package/dist/pi-intercom/bridge-session.js +420 -0
  118. package/dist/pi-intercom/bridge.js +221 -606
  119. package/dist/pi-intercom/broker/broker.js +236 -244
  120. package/dist/pi-intercom/broker/client.js +189 -304
  121. package/dist/pi-intercom/broker/connection.js +165 -0
  122. package/dist/pi-intercom/broker/framing.js +5 -3
  123. package/dist/pi-intercom/broker/paths.js +4 -1
  124. package/dist/pi-intercom/broker/pid.js +53 -25
  125. package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
  126. package/dist/pi-intercom/broker/snapshots.js +188 -0
  127. package/dist/pi-intercom/broker/spawn.js +36 -25
  128. package/dist/pi-intercom/config.js +85 -71
  129. package/dist/pi-intercom/connection.js +297 -0
  130. package/dist/pi-intercom/identity.js +58 -0
  131. package/dist/pi-intercom/inbound-delivery.js +356 -0
  132. package/dist/pi-intercom/inbound-journal.js +303 -0
  133. package/dist/pi-intercom/inbound-record.js +113 -0
  134. package/dist/pi-intercom/inbound.js +179 -0
  135. package/dist/pi-intercom/index.js +79 -2933
  136. package/dist/pi-intercom/inspection.js +62 -0
  137. package/dist/pi-intercom/interview.js +236 -0
  138. package/dist/pi-intercom/lifecycle.js +168 -0
  139. package/dist/pi-intercom/message-format.js +69 -0
  140. package/dist/pi-intercom/outbound.js +304 -0
  141. package/dist/pi-intercom/peer-awareness.js +66 -0
  142. package/dist/pi-intercom/reply-tracker.js +62 -43
  143. package/dist/pi-intercom/reply-wait.js +201 -0
  144. package/dist/pi-intercom/runtime-types.js +3 -0
  145. package/dist/pi-intercom/session-events.js +180 -0
  146. package/dist/pi-intercom/session-targets.js +42 -34
  147. package/dist/pi-intercom/subagent-events.js +238 -0
  148. package/dist/pi-intercom/subagent-live-events.js +129 -86
  149. package/dist/pi-intercom/supervisor.js +282 -0
  150. package/dist/pi-intercom/tool-arguments.js +74 -0
  151. package/dist/pi-intercom/tool-registration.js +95 -0
  152. package/dist/pi-intercom/tool-results.js +38 -0
  153. package/dist/pi-intercom/tool-schemas.js +82 -0
  154. package/dist/pi-intercom/tools.js +51 -0
  155. package/dist/pi-intercom/topic-actions.js +177 -0
  156. package/dist/pi-intercom/topics.js +177 -92
  157. package/dist/pi-intercom/transport.js +1 -0
  158. package/dist/pi-intercom/types.js +151 -114
  159. package/dist/pi-intercom/ui/compose-paste.js +93 -0
  160. package/dist/pi-intercom/ui/compose.js +121 -143
  161. package/dist/pi-intercom/ui/inline-message.js +59 -59
  162. package/dist/pi-intercom/ui/message-renderers.js +147 -0
  163. package/dist/pi-intercom/ui/overlay.js +181 -0
  164. package/dist/pi-intercom/ui/session-format.js +124 -0
  165. package/dist/pi-intercom/ui/session-list.js +76 -43
  166. package/dist/pi-intercom/ui/tool-renderers.js +110 -0
  167. package/dist/pi-intercom/ui/topic-view.js +88 -0
  168. package/dist/pi-intercom/validation.js +59 -0
  169. package/dist/runs/background/async-chain-plan.js +265 -0
  170. package/dist/runs/background/async-control.js +134 -58
  171. package/dist/runs/background/async-execution.js +136 -633
  172. package/dist/runs/background/async-job-admission.js +40 -0
  173. package/dist/runs/background/async-job-projection.js +169 -0
  174. package/dist/runs/background/async-job-tracker.js +297 -327
  175. package/dist/runs/background/async-launch.js +216 -0
  176. package/dist/runs/background/async-plan.js +116 -0
  177. package/dist/runs/background/async-result-file.js +47 -23
  178. package/dist/runs/background/async-resume.js +195 -253
  179. package/dist/runs/background/async-run-discovery.js +213 -0
  180. package/dist/runs/background/async-run-location.js +135 -0
  181. package/dist/runs/background/async-run-record.js +1 -0
  182. package/dist/runs/background/async-run-repair.js +223 -0
  183. package/dist/runs/background/async-run-summary.js +1 -0
  184. package/dist/runs/background/async-single-plan.js +105 -0
  185. package/dist/runs/background/async-status-projection.js +155 -0
  186. package/dist/runs/background/async-status-render.js +117 -0
  187. package/dist/runs/background/async-status-validation.js +181 -0
  188. package/dist/runs/background/async-status.js +3 -442
  189. package/dist/runs/background/async-value.js +21 -0
  190. package/dist/runs/background/completion-dedupe.js +36 -12
  191. package/dist/runs/background/completion-delivery.js +211 -205
  192. package/dist/runs/background/completion-receipts.js +237 -0
  193. package/dist/runs/background/legacy-status-acceptance.js +34 -0
  194. package/dist/runs/background/notify.js +96 -48
  195. package/dist/runs/background/parallel-groups.js +36 -19
  196. package/dist/runs/background/result-payload.js +178 -0
  197. package/dist/runs/background/result-watcher.js +348 -339
  198. package/dist/runs/background/run-id-resolver.js +53 -33
  199. package/dist/runs/background/run-schemas.js +189 -0
  200. package/dist/runs/background/run-status-contracts.js +14 -0
  201. package/dist/runs/background/run-status-render.js +270 -0
  202. package/dist/runs/background/run-status.js +231 -339
  203. package/dist/runs/background/runner-attempt-output.js +155 -0
  204. package/dist/runs/background/runner-attempt.js +263 -0
  205. package/dist/runs/background/runner-child-executor.js +166 -0
  206. package/dist/runs/background/runner-child-observer.js +192 -0
  207. package/dist/runs/background/runner-completion-summary.js +71 -0
  208. package/dist/runs/background/runner-completion.js +211 -0
  209. package/dist/runs/background/runner-config.js +1 -0
  210. package/dist/runs/background/runner-contract.js +1 -0
  211. package/dist/runs/background/runner-dynamic.js +121 -0
  212. package/dist/runs/background/runner-finalization.js +149 -0
  213. package/dist/runs/background/runner-graph.js +68 -0
  214. package/dist/runs/background/runner-initial-status.js +60 -0
  215. package/dist/runs/background/runner-lifecycle.js +142 -0
  216. package/dist/runs/background/runner-monitor.js +309 -0
  217. package/dist/runs/background/runner-parallel.js +204 -0
  218. package/dist/runs/background/runner-prepare-step.js +86 -0
  219. package/dist/runs/background/runner-reporting.js +153 -0
  220. package/dist/runs/background/runner-status.js +148 -0
  221. package/dist/runs/background/runner-step-output.js +92 -0
  222. package/dist/runs/background/runner-step-record.js +45 -0
  223. package/dist/runs/background/runner-step.js +112 -0
  224. package/dist/runs/background/runner-streaming.js +173 -0
  225. package/dist/runs/background/runner-workflow.js +213 -0
  226. package/dist/runs/background/stale-run-reconciler.js +155 -292
  227. package/dist/runs/background/subagent-runner-launcher.js +33 -13
  228. package/dist/runs/background/subagent-runner.js +51 -1842
  229. package/dist/runs/background/top-level-async.js +2 -1
  230. package/dist/runs/foreground/chain-clarify.js +293 -1017
  231. package/dist/runs/foreground/clarification-draft.js +87 -0
  232. package/dist/runs/foreground/clarify-contracts.js +1 -0
  233. package/dist/runs/foreground/clarify-invocation.js +129 -38
  234. package/dist/runs/foreground/clarify-text-editor.js +210 -0
  235. package/dist/runs/foreground/clarify-view.js +167 -0
  236. package/dist/runs/foreground/execution-input.js +226 -353
  237. package/dist/runs/foreground/execution-routing.js +33 -0
  238. package/dist/runs/foreground/execution-timeout.js +81 -0
  239. package/dist/runs/foreground/foreground-control.js +222 -763
  240. package/dist/runs/foreground/foreground-memory.js +99 -0
  241. package/dist/runs/foreground/invocation-context.js +55 -0
  242. package/dist/runs/foreground/invocation-execution.js +331 -0
  243. package/dist/runs/foreground/invocation-expansion.js +48 -0
  244. package/dist/runs/foreground/management-actions.js +295 -0
  245. package/dist/runs/foreground/nested-control.js +179 -0
  246. package/dist/runs/foreground/question-continuation.js +78 -0
  247. package/dist/runs/foreground/question-control.js +155 -50
  248. package/dist/runs/foreground/resume-target.js +221 -0
  249. package/dist/runs/foreground/revival-launch-policy.js +58 -0
  250. package/dist/runs/foreground/run-async-path.js +190 -178
  251. package/dist/runs/foreground/run-interrupt.js +164 -0
  252. package/dist/runs/foreground/run-nudge.js +278 -0
  253. package/dist/runs/foreground/saved-revival.js +251 -0
  254. package/dist/runs/foreground/subagent-executor.js +135 -424
  255. package/dist/runs/foreground/subagent-params.js +67 -30
  256. package/dist/runs/foreground/wait-observation.js +104 -0
  257. package/dist/runs/foreground/wait-registration.js +17 -0
  258. package/dist/runs/foreground/wait-run.js +283 -123
  259. package/dist/runs/shared/acceptance-contract.js +193 -99
  260. package/dist/runs/shared/acceptance-defaults.js +1 -0
  261. package/dist/runs/shared/acceptance-evaluation.js +201 -181
  262. package/dist/runs/shared/acceptance-finalization.js +256 -180
  263. package/dist/runs/shared/acceptance-outcome.js +53 -0
  264. package/dist/runs/shared/acceptance-reports.js +137 -72
  265. package/dist/runs/shared/acceptance-submission.js +167 -0
  266. package/dist/runs/shared/acceptance-verification.js +100 -0
  267. package/dist/runs/shared/chain-outputs.js +80 -52
  268. package/dist/runs/shared/child-attempt-types.js +1 -0
  269. package/dist/runs/shared/child-attempt.js +314 -667
  270. package/dist/runs/shared/child-boundaries.js +173 -0
  271. package/dist/runs/shared/child-context-filter.js +44 -0
  272. package/dist/runs/shared/child-event-observer.js +390 -0
  273. package/dist/runs/shared/child-execution-cwd.js +73 -43
  274. package/dist/runs/shared/child-execution-outcome.js +72 -0
  275. package/dist/runs/shared/child-invocation.js +54 -0
  276. package/dist/runs/shared/child-message-validation.js +215 -0
  277. package/dist/runs/shared/child-native-accounting.js +106 -0
  278. package/dist/runs/shared/child-native-observation.js +69 -0
  279. package/dist/runs/shared/child-observation-spool.js +164 -0
  280. package/dist/runs/shared/child-observations.js +157 -76
  281. package/dist/runs/shared/child-presence.js +3 -0
  282. package/dist/runs/shared/child-route-env.js +119 -0
  283. package/dist/runs/shared/child-stream-observer.js +221 -0
  284. package/dist/runs/shared/child-stream-projection.js +137 -0
  285. package/dist/runs/shared/child-structured-tool.js +27 -0
  286. package/dist/runs/shared/claude-code.js +121 -158
  287. package/dist/runs/shared/claude-model.js +42 -0
  288. package/dist/runs/shared/claude-session.js +83 -0
  289. package/dist/runs/shared/claude-types.js +1 -0
  290. package/dist/runs/shared/completion-guard.js +18 -18
  291. package/dist/runs/shared/control-event-policy.js +8 -0
  292. package/dist/runs/shared/control-notification-owner.js +13 -0
  293. package/dist/runs/shared/dynamic-fanout.js +188 -173
  294. package/dist/runs/shared/dynamic-item.js +102 -0
  295. package/dist/runs/shared/history-index.js +62 -36
  296. package/dist/runs/shared/legacy-async-recovery.js +114 -0
  297. package/dist/runs/shared/legacy-output-recovery.js +148 -0
  298. package/dist/runs/shared/mcp-config-schema.js +36 -0
  299. package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
  300. package/dist/runs/shared/model-fallback.js +97 -38
  301. package/dist/runs/shared/mutating-tool-guard.js +128 -88
  302. package/dist/runs/shared/native-finalization-types.js +1 -0
  303. package/dist/runs/shared/native-finalization.js +155 -76
  304. package/dist/runs/shared/native-usage.js +238 -98
  305. package/dist/runs/shared/nested-control-records.js +128 -0
  306. package/dist/runs/shared/nested-events.js +8 -700
  307. package/dist/runs/shared/nested-path.js +32 -28
  308. package/dist/runs/shared/nested-projection.js +155 -0
  309. package/dist/runs/shared/nested-protocol.js +18 -0
  310. package/dist/runs/shared/nested-registry.js +191 -0
  311. package/dist/runs/shared/nested-render.js +106 -58
  312. package/dist/runs/shared/nested-route.js +220 -0
  313. package/dist/runs/shared/nested-validation.js +216 -0
  314. package/dist/runs/shared/owned-child-evidence.js +125 -0
  315. package/dist/runs/shared/owned-run-list.js +146 -0
  316. package/dist/runs/shared/owned-run-observation.js +267 -0
  317. package/dist/runs/shared/owned-run-progress.js +109 -0
  318. package/dist/runs/shared/owned-run-read-state.js +1 -0
  319. package/dist/runs/shared/owned-run-results.js +202 -0
  320. package/dist/runs/shared/owned-run-status.js +180 -0
  321. package/dist/runs/shared/owned-run-view.js +51 -0
  322. package/dist/runs/shared/owned-workflow-details.js +17 -0
  323. package/dist/runs/shared/owner-output.js +43 -0
  324. package/dist/runs/shared/parallel-utils.js +36 -28
  325. package/dist/runs/shared/parent-receipts.js +90 -32
  326. package/dist/runs/shared/parent-usage.js +169 -57
  327. package/dist/runs/shared/pi-args.js +108 -201
  328. package/dist/runs/shared/pi-launch-input.js +1 -0
  329. package/dist/runs/shared/pi-session-launch.js +86 -0
  330. package/dist/runs/shared/pi-spawn.js +35 -21
  331. package/dist/runs/shared/run-history-queries.js +126 -35
  332. package/dist/runs/shared/run-history.js +101 -35
  333. package/dist/runs/shared/run-metadata-paths.js +14 -0
  334. package/dist/runs/shared/run-metadata.js +158 -0
  335. package/dist/runs/shared/run-persistence.js +131 -0
  336. package/dist/runs/shared/run-records.js +9 -679
  337. package/dist/runs/shared/run-restoration.js +338 -0
  338. package/dist/runs/shared/run-state-owner.js +26 -0
  339. package/dist/runs/shared/session-cwd-preload.js +27 -18
  340. package/dist/runs/shared/single-output.js +148 -70
  341. package/dist/runs/shared/stable-value.js +15 -0
  342. package/dist/runs/shared/streaming-text.js +23 -12
  343. package/dist/runs/shared/structured-output.js +25 -13
  344. package/dist/runs/shared/subagent-control.js +167 -100
  345. package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
  346. package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
  347. package/dist/runs/shared/supervisor-question-state.js +145 -0
  348. package/dist/runs/shared/supervisor-questions.js +185 -254
  349. package/dist/runs/shared/workflow-graph.js +259 -167
  350. package/dist/runs/shared/workflow-policy.js +120 -48
  351. package/dist/runs/shared/worktree-contract.js +1 -0
  352. package/dist/runs/shared/worktree-hook.js +138 -0
  353. package/dist/runs/shared/worktree-location.js +47 -0
  354. package/dist/runs/shared/worktree-preservation.js +8 -0
  355. package/dist/runs/shared/worktree-process.js +107 -0
  356. package/dist/runs/shared/worktree.js +183 -322
  357. package/dist/shared/agent-context-policy.js +34 -44
  358. package/dist/shared/agent-dir.js +14 -0
  359. package/dist/shared/artifacts.js +30 -12
  360. package/dist/shared/atomic-json.js +4 -1
  361. package/dist/shared/chain-files.js +72 -0
  362. package/dist/shared/concurrency.js +18 -0
  363. package/dist/shared/content-preview.js +115 -0
  364. package/dist/shared/cooperative.js +5 -2
  365. package/dist/shared/execution-cwd.js +13 -5
  366. package/dist/shared/file-coalescer.js +2 -1
  367. package/dist/shared/fork-context.js +10 -12
  368. package/dist/shared/formatters.js +45 -19
  369. package/dist/shared/journal-frames.js +164 -0
  370. package/dist/shared/journal-projections.js +121 -0
  371. package/dist/shared/journal-reader.js +6 -407
  372. package/dist/shared/json-projection.js +191 -0
  373. package/dist/shared/lazy-tools.js +19 -8
  374. package/dist/shared/message-output.js +116 -0
  375. package/dist/shared/model-info.js +31 -14
  376. package/dist/shared/native-import.js +20 -0
  377. package/dist/shared/native-journal.js +140 -0
  378. package/dist/shared/native-session-loader.js +17 -0
  379. package/dist/shared/native-session.js +2 -13
  380. package/dist/shared/native-tui.js +7 -2
  381. package/dist/shared/native-typebox.js +15 -3
  382. package/dist/shared/output-page.js +63 -0
  383. package/dist/shared/post-exit-stdio-guard.js +128 -88
  384. package/dist/shared/prompt-sections.js +2 -0
  385. package/dist/shared/session-entries.js +70 -35
  386. package/dist/shared/session-identity.js +5 -3
  387. package/dist/shared/settings.js +62 -192
  388. package/dist/shared/status-format.js +97 -37
  389. package/dist/shared/task-file-policy.js +24 -0
  390. package/dist/shared/temp-root.js +44 -15
  391. package/dist/shared/types/acceptance.js +1 -0
  392. package/dist/shared/types/async.js +1 -0
  393. package/dist/shared/types/config.js +1 -0
  394. package/dist/shared/types/details.js +1 -0
  395. package/dist/shared/types/history.js +1 -0
  396. package/dist/shared/types/inputs.js +1 -0
  397. package/dist/shared/types/intercom.js +1 -0
  398. package/dist/shared/types/launch.js +1 -0
  399. package/dist/shared/types/messages.js +1 -0
  400. package/dist/shared/types/nested.js +1 -0
  401. package/dist/shared/types/owned-runs.js +1 -0
  402. package/dist/shared/types/progress.js +1 -0
  403. package/dist/shared/types/questions.js +1 -0
  404. package/dist/shared/types/results.js +1 -0
  405. package/dist/shared/types/state.js +1 -0
  406. package/dist/shared/types/usage.js +1 -0
  407. package/dist/shared/types/workflow.js +1 -0
  408. package/dist/shared/types.js +75 -30
  409. package/dist/shared/unknown.js +52 -0
  410. package/dist/shared/utils.js +54 -260
  411. package/dist/slash/command-discovery.js +82 -0
  412. package/dist/slash/command-input.js +190 -0
  413. package/dist/slash/prompt-template-bridge.js +94 -270
  414. package/dist/slash/prompt-template-contract.js +77 -0
  415. package/dist/slash/prompt-template-results.js +125 -0
  416. package/dist/slash/request-protocol.js +68 -0
  417. package/dist/slash/result-delivery.js +237 -0
  418. package/dist/slash/saved-chain.js +78 -0
  419. package/dist/slash/slash-bridge.js +123 -89
  420. package/dist/slash/slash-commands.js +101 -572
  421. package/dist/slash/slash-live-state.js +68 -47
  422. package/dist/tui/action-hints.js +50 -22
  423. package/dist/tui/activity-lines.js +32 -0
  424. package/dist/tui/agent-browser.js +290 -0
  425. package/dist/tui/agent-controls.js +289 -0
  426. package/dist/tui/agent-conversation.js +444 -0
  427. package/dist/tui/agent-dock.js +171 -0
  428. package/dist/tui/agent-history.js +50 -183
  429. package/dist/tui/agent-model.js +62 -0
  430. package/dist/tui/agent-picker.js +262 -0
  431. package/dist/tui/agent-view.js +232 -1564
  432. package/dist/tui/compact-results.js +193 -0
  433. package/dist/tui/conversation-details.js +190 -0
  434. package/dist/tui/conversation-frame.js +135 -0
  435. package/dist/tui/conversation-history.js +201 -0
  436. package/dist/tui/conversation-menu.js +78 -0
  437. package/dist/tui/conversation-notices.js +79 -0
  438. package/dist/tui/conversation-selection.js +58 -0
  439. package/dist/tui/conversation-viewport.js +129 -0
  440. package/dist/tui/direction-message.js +27 -0
  441. package/dist/tui/display.js +282 -0
  442. package/dist/tui/editor-viewport.js +18 -0
  443. package/dist/tui/expanded-content.js +87 -0
  444. package/dist/tui/expanded-multi.js +170 -0
  445. package/dist/tui/expanded-single.js +65 -0
  446. package/dist/tui/history-cards.js +216 -0
  447. package/dist/tui/history-display.js +238 -0
  448. package/dist/tui/history-json.js +16 -0
  449. package/dist/tui/history-metadata.js +152 -0
  450. package/dist/tui/history-record.js +251 -0
  451. package/dist/tui/history-text.js +34 -0
  452. package/dist/tui/indexed-history.js +116 -0
  453. package/dist/tui/nested-widget.js +120 -0
  454. package/dist/tui/picker-page.js +59 -0
  455. package/dist/tui/render.js +58 -1501
  456. package/dist/tui/result-facts.js +64 -0
  457. package/dist/tui/task-observation.js +59 -0
  458. package/dist/tui/task-store.js +366 -0
  459. package/dist/tui/text-values.js +16 -0
  460. package/dist/tui/view-connections.js +47 -0
  461. package/dist/tui/view-model.js +94 -0
  462. package/dist/tui/view-persistence.js +51 -0
  463. package/dist/tui/view-ports.js +1 -0
  464. package/dist/tui/view-session.js +37 -0
  465. package/dist/tui/widget-details.js +144 -0
  466. package/dist/tui/widget-status.js +245 -0
  467. package/dist/tui/widget.js +145 -0
  468. package/dist/tui/workflow-labels.js +223 -0
  469. package/dist/tui/workflow-outcomes.js +124 -0
  470. package/docs/code-quality.md +38 -0
  471. package/docs/development.md +99 -0
  472. package/docs/intercom-bridge.md +77 -22
  473. package/docs/intercom.md +132 -106
  474. package/docs/performance.md +19 -17
  475. package/docs/reference.md +1472 -0
  476. package/generated/RunValidators.d.ts +28 -0
  477. package/generated/RunValidators.js +2 -0
  478. package/package.json +27 -6
  479. package/prompts/parallel-cleanup.md +3 -0
  480. package/prompts/parallel-context-build.md +3 -0
  481. package/prompts/parallel-handoff-plan.md +6 -0
  482. package/prompts/parallel-research.md +4 -0
  483. package/prompts/parallel-review.md +2 -0
  484. package/prompts/review-loop.md +2 -0
  485. package/scripts/build.mjs +129 -85
  486. package/scripts/check-compat.mjs +48 -11
  487. package/scripts/compat-host.mjs +35 -7
  488. package/scripts/generate-run-schemas.mjs +210 -0
  489. package/scripts/intercom-bridge-credentials.mjs +158 -29
  490. package/scripts/intercom-remote.mjs +213 -52
  491. package/scripts/local-install-smoke.mjs +47 -37
  492. package/scripts/native-package-smoke.mjs +135 -25
  493. package/scripts/package-smoke.mjs +360 -140
  494. package/scripts/prepare.mjs +54 -34
  495. package/scripts/real-pi-processes.mjs +261 -0
  496. package/scripts/real-pi-smoke.mjs +432 -351
  497. package/scripts/run-tests.mjs +29 -15
  498. package/skills/pi-intercom/SKILL.md +11 -11
  499. package/skills/pi-intercom/references/peer-sessions.md +7 -2
  500. package/skills/pi-subagents/SKILL.md +1 -1
  501. package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
  502. package/src/agents/agent-defaults.ts +13 -0
  503. package/src/agents/agent-definition.ts +253 -0
  504. package/src/agents/agent-management.ts +111 -808
  505. package/src/agents/agent-scope.ts +7 -3
  506. package/src/agents/agent-selection.ts +26 -16
  507. package/src/agents/agent-serializer.ts +84 -93
  508. package/src/agents/agents.ts +199 -906
  509. package/src/agents/builtin-overrides.ts +297 -0
  510. package/src/agents/chain-serializer.ts +3 -329
  511. package/src/agents/config-values.ts +57 -0
  512. package/src/agents/discovery-paths.ts +134 -0
  513. package/src/agents/frontmatter.ts +35 -17
  514. package/src/agents/identity.ts +49 -18
  515. package/src/agents/json-chain.ts +305 -0
  516. package/src/agents/management-config.ts +342 -0
  517. package/src/agents/management-format.ts +243 -0
  518. package/src/agents/management-persistence.ts +408 -0
  519. package/src/agents/management-targets.ts +260 -0
  520. package/src/agents/management-warnings.ts +115 -0
  521. package/src/agents/markdown-chain.ts +237 -0
  522. package/src/agents/package-agents.ts +231 -0
  523. package/src/agents/skill-files.ts +182 -0
  524. package/src/agents/skill-search-paths.ts +289 -0
  525. package/src/agents/skill-types.ts +31 -0
  526. package/src/agents/skills.ts +152 -610
  527. package/src/extension/acceptance-schema.ts +88 -0
  528. package/src/extension/chain-schema.ts +276 -0
  529. package/src/extension/child-runtime.ts +302 -0
  530. package/src/extension/compact-tools.ts +259 -102
  531. package/src/extension/config-schema.ts +59 -0
  532. package/src/extension/config.ts +39 -17
  533. package/src/extension/control-notice-schema.ts +55 -0
  534. package/src/extension/control-notices.ts +57 -33
  535. package/src/extension/delegation-bridges.ts +59 -0
  536. package/src/extension/doctor.ts +171 -135
  537. package/src/extension/everyday-schemas.ts +252 -0
  538. package/src/extension/fanout-child.ts +29 -308
  539. package/src/extension/index.ts +17 -642
  540. package/src/extension/message-renderers.ts +334 -0
  541. package/src/extension/nested-control-inbox.ts +196 -0
  542. package/src/extension/parent-runtime.ts +405 -0
  543. package/src/extension/primary-tool.ts +130 -0
  544. package/src/extension/result-snapshot.ts +35 -0
  545. package/src/extension/runtime-reload.ts +72 -0
  546. package/src/extension/runtime-storage.ts +49 -0
  547. package/src/extension/schema-overrides.ts +114 -0
  548. package/src/extension/schemas.ts +451 -418
  549. package/src/extension/tool-input.ts +40 -13
  550. package/src/extension/tool-result.ts +45 -14
  551. package/src/history/answer-texts.ts +74 -0
  552. package/src/history/canonical-result.ts +127 -51
  553. package/src/history/canonical-selection.ts +54 -0
  554. package/src/history/database-generation.ts +86 -0
  555. package/src/history/database.ts +86 -48
  556. package/src/history/entry-ingestion.ts +129 -0
  557. package/src/history/index.ts +426 -148
  558. package/src/history/ingest.ts +372 -342
  559. package/src/history/output-digests.ts +41 -0
  560. package/src/history/preview.ts +235 -0
  561. package/src/history/prune.ts +48 -0
  562. package/src/history/queries.ts +122 -256
  563. package/src/history/query-scope.ts +278 -0
  564. package/src/history/rows.ts +118 -0
  565. package/src/history/run-projection.ts +164 -0
  566. package/src/history/run-queries.ts +199 -0
  567. package/src/history/schema.ts +34 -0
  568. package/src/history/search-queries.ts +216 -0
  569. package/src/history/selected-record.ts +140 -0
  570. package/src/history/source-file.ts +51 -0
  571. package/src/history/source-watches.ts +156 -0
  572. package/src/history/store.ts +310 -197
  573. package/src/history/text-chunks.ts +181 -0
  574. package/src/history/text.ts +43 -0
  575. package/src/history/transcript-queries.ts +251 -0
  576. package/src/history/types.ts +27 -164
  577. package/src/history/values.ts +36 -0
  578. package/src/history/wire-inputs.ts +141 -0
  579. package/src/history/wire-models.ts +51 -0
  580. package/src/history/worker-runtime.ts +502 -0
  581. package/src/history/worker.ts +94 -336
  582. package/src/intercom/intercom-bridge.ts +136 -69
  583. package/src/intercom/live-intercom.ts +197 -92
  584. package/src/intercom/nested-result-tree.ts +213 -0
  585. package/src/intercom/result-delivery.ts +56 -0
  586. package/src/intercom/result-intercom.ts +364 -382
  587. package/src/pi-intercom/agent-dir.ts +9 -3
  588. package/src/pi-intercom/async.ts +33 -0
  589. package/src/pi-intercom/bridge-ask.ts +64 -0
  590. package/src/pi-intercom/bridge-config.ts +120 -0
  591. package/src/pi-intercom/bridge-http.ts +97 -0
  592. package/src/pi-intercom/bridge-launch-policy.ts +109 -0
  593. package/src/pi-intercom/bridge-launch.ts +317 -0
  594. package/src/pi-intercom/bridge-protocol.ts +123 -0
  595. package/src/pi-intercom/bridge-routes.ts +105 -0
  596. package/src/pi-intercom/bridge-rpc-process.ts +293 -0
  597. package/src/pi-intercom/bridge-session.ts +510 -0
  598. package/src/pi-intercom/bridge.ts +305 -549
  599. package/src/pi-intercom/broker/broker.ts +326 -263
  600. package/src/pi-intercom/broker/client.ts +273 -354
  601. package/src/pi-intercom/broker/connection.ts +192 -0
  602. package/src/pi-intercom/broker/framing.ts +11 -6
  603. package/src/pi-intercom/broker/paths.ts +28 -25
  604. package/src/pi-intercom/broker/pid.ts +68 -24
  605. package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
  606. package/src/pi-intercom/broker/snapshots.ts +241 -0
  607. package/src/pi-intercom/broker/spawn.ts +58 -34
  608. package/src/pi-intercom/config.ts +113 -108
  609. package/src/pi-intercom/connection.ts +346 -0
  610. package/src/pi-intercom/identity.ts +71 -0
  611. package/src/pi-intercom/inbound-delivery.ts +450 -0
  612. package/src/pi-intercom/inbound-journal.ts +350 -0
  613. package/src/pi-intercom/inbound-record.ts +141 -0
  614. package/src/pi-intercom/inbound.ts +237 -0
  615. package/src/pi-intercom/index.ts +86 -2923
  616. package/src/pi-intercom/inspection.ts +82 -0
  617. package/src/pi-intercom/interview.ts +295 -0
  618. package/src/pi-intercom/lifecycle.ts +183 -0
  619. package/src/pi-intercom/message-format.ts +77 -0
  620. package/src/pi-intercom/outbound.ts +418 -0
  621. package/src/pi-intercom/peer-awareness.ts +84 -0
  622. package/src/pi-intercom/reply-tracker.ts +121 -59
  623. package/src/pi-intercom/reply-wait.ts +247 -0
  624. package/src/pi-intercom/runtime-types.ts +97 -0
  625. package/src/pi-intercom/session-events.ts +247 -0
  626. package/src/pi-intercom/session-targets.ts +124 -72
  627. package/src/pi-intercom/subagent-events.ts +299 -0
  628. package/src/pi-intercom/subagent-live-events.ts +212 -109
  629. package/src/pi-intercom/supervisor.ts +362 -0
  630. package/src/pi-intercom/tool-arguments.ts +120 -0
  631. package/src/pi-intercom/tool-registration.ts +121 -0
  632. package/src/pi-intercom/tool-results.ts +54 -0
  633. package/src/pi-intercom/tool-schemas.ts +134 -0
  634. package/src/pi-intercom/tools.ts +80 -0
  635. package/src/pi-intercom/topic-actions.ts +243 -0
  636. package/src/pi-intercom/topics.ts +267 -121
  637. package/src/pi-intercom/transport.ts +14 -0
  638. package/src/pi-intercom/types.ts +288 -190
  639. package/src/pi-intercom/ui/compose-paste.ts +109 -0
  640. package/src/pi-intercom/ui/compose.ts +173 -157
  641. package/src/pi-intercom/ui/inline-message.ts +80 -62
  642. package/src/pi-intercom/ui/message-renderers.ts +182 -0
  643. package/src/pi-intercom/ui/overlay.ts +238 -0
  644. package/src/pi-intercom/ui/session-format.ts +146 -0
  645. package/src/pi-intercom/ui/session-list.ts +145 -62
  646. package/src/pi-intercom/ui/tool-renderers.ts +148 -0
  647. package/src/pi-intercom/ui/topic-view.ts +107 -0
  648. package/src/pi-intercom/validation.ts +69 -0
  649. package/src/runs/background/async-chain-plan.ts +451 -0
  650. package/src/runs/background/async-control.ts +201 -71
  651. package/src/runs/background/async-execution.ts +206 -829
  652. package/src/runs/background/async-job-admission.ts +54 -0
  653. package/src/runs/background/async-job-projection.ts +225 -0
  654. package/src/runs/background/async-job-tracker.ts +416 -360
  655. package/src/runs/background/async-launch.ts +319 -0
  656. package/src/runs/background/async-plan.ts +285 -0
  657. package/src/runs/background/async-result-file.ts +79 -37
  658. package/src/runs/background/async-resume.ts +338 -285
  659. package/src/runs/background/async-run-discovery.ts +270 -0
  660. package/src/runs/background/async-run-location.ts +194 -0
  661. package/src/runs/background/async-run-record.ts +14 -0
  662. package/src/runs/background/async-run-repair.ts +307 -0
  663. package/src/runs/background/async-run-summary.ts +71 -0
  664. package/src/runs/background/async-single-plan.ts +168 -0
  665. package/src/runs/background/async-status-projection.ts +188 -0
  666. package/src/runs/background/async-status-render.ts +164 -0
  667. package/src/runs/background/async-status-validation.ts +238 -0
  668. package/src/runs/background/async-status.ts +9 -481
  669. package/src/runs/background/async-value.ts +29 -0
  670. package/src/runs/background/completion-dedupe.ts +103 -54
  671. package/src/runs/background/completion-delivery.ts +313 -187
  672. package/src/runs/background/completion-receipts.ts +309 -0
  673. package/src/runs/background/legacy-status-acceptance.ts +38 -0
  674. package/src/runs/background/notify.ts +167 -106
  675. package/src/runs/background/parallel-groups.ts +95 -46
  676. package/src/runs/background/result-payload.ts +268 -0
  677. package/src/runs/background/result-watcher.ts +484 -387
  678. package/src/runs/background/run-id-resolver.ts +126 -57
  679. package/src/runs/background/run-schemas.ts +240 -0
  680. package/src/runs/background/run-status-contracts.ts +46 -0
  681. package/src/runs/background/run-status-render.ts +364 -0
  682. package/src/runs/background/run-status.ts +338 -356
  683. package/src/runs/background/runner-attempt-output.ts +281 -0
  684. package/src/runs/background/runner-attempt.ts +354 -0
  685. package/src/runs/background/runner-child-executor.ts +232 -0
  686. package/src/runs/background/runner-child-observer.ts +270 -0
  687. package/src/runs/background/runner-completion-summary.ts +106 -0
  688. package/src/runs/background/runner-completion.ts +274 -0
  689. package/src/runs/background/runner-config.ts +52 -0
  690. package/src/runs/background/runner-contract.ts +51 -0
  691. package/src/runs/background/runner-dynamic.ts +185 -0
  692. package/src/runs/background/runner-finalization.ts +203 -0
  693. package/src/runs/background/runner-graph.ts +91 -0
  694. package/src/runs/background/runner-initial-status.ts +72 -0
  695. package/src/runs/background/runner-lifecycle.ts +159 -0
  696. package/src/runs/background/runner-monitor.ts +399 -0
  697. package/src/runs/background/runner-parallel.ts +280 -0
  698. package/src/runs/background/runner-prepare-step.ts +128 -0
  699. package/src/runs/background/runner-reporting.ts +192 -0
  700. package/src/runs/background/runner-status.ts +220 -0
  701. package/src/runs/background/runner-step-output.ts +158 -0
  702. package/src/runs/background/runner-step-record.ts +76 -0
  703. package/src/runs/background/runner-step.ts +150 -0
  704. package/src/runs/background/runner-streaming.ts +220 -0
  705. package/src/runs/background/runner-workflow.ts +284 -0
  706. package/src/runs/background/stale-run-reconciler.ts +279 -336
  707. package/src/runs/background/subagent-runner-launcher.ts +67 -35
  708. package/src/runs/background/subagent-runner.ts +80 -2048
  709. package/src/runs/background/top-level-async.ts +9 -7
  710. package/src/runs/foreground/chain-clarify.ts +499 -1334
  711. package/src/runs/foreground/clarification-draft.ts +92 -0
  712. package/src/runs/foreground/clarify-contracts.ts +33 -0
  713. package/src/runs/foreground/clarify-invocation.ts +192 -65
  714. package/src/runs/foreground/clarify-text-editor.ts +229 -0
  715. package/src/runs/foreground/clarify-view.ts +222 -0
  716. package/src/runs/foreground/execution-input.ts +358 -424
  717. package/src/runs/foreground/execution-routing.ts +41 -0
  718. package/src/runs/foreground/execution-timeout.ts +92 -0
  719. package/src/runs/foreground/foreground-control.ts +333 -812
  720. package/src/runs/foreground/foreground-memory.ts +132 -0
  721. package/src/runs/foreground/invocation-context.ts +88 -0
  722. package/src/runs/foreground/invocation-execution.ts +465 -0
  723. package/src/runs/foreground/invocation-expansion.ts +58 -0
  724. package/src/runs/foreground/management-actions.ts +360 -0
  725. package/src/runs/foreground/nested-control.ts +248 -0
  726. package/src/runs/foreground/question-continuation.ts +112 -0
  727. package/src/runs/foreground/question-control.ts +297 -70
  728. package/src/runs/foreground/resume-target.ts +330 -0
  729. package/src/runs/foreground/revival-launch-policy.ts +112 -0
  730. package/src/runs/foreground/run-async-path.ts +307 -223
  731. package/src/runs/foreground/run-interrupt.ts +202 -0
  732. package/src/runs/foreground/run-nudge.ts +355 -0
  733. package/src/runs/foreground/saved-revival.ts +356 -0
  734. package/src/runs/foreground/subagent-executor.ts +195 -493
  735. package/src/runs/foreground/subagent-params.ts +314 -242
  736. package/src/runs/foreground/wait-observation.ts +160 -0
  737. package/src/runs/foreground/wait-registration.ts +18 -0
  738. package/src/runs/foreground/wait-run.ts +361 -119
  739. package/src/runs/shared/acceptance-contract.ts +410 -209
  740. package/src/runs/shared/acceptance-defaults.ts +1 -0
  741. package/src/runs/shared/acceptance-evaluation.ts +314 -240
  742. package/src/runs/shared/acceptance-finalization.ts +447 -305
  743. package/src/runs/shared/acceptance-outcome.ts +69 -0
  744. package/src/runs/shared/acceptance-reports.ts +220 -126
  745. package/src/runs/shared/acceptance-submission.ts +251 -0
  746. package/src/runs/shared/acceptance-verification.ts +118 -0
  747. package/src/runs/shared/acceptance.ts +25 -25
  748. package/src/runs/shared/chain-outputs.ts +190 -98
  749. package/src/runs/shared/child-attempt-types.ts +118 -0
  750. package/src/runs/shared/child-attempt.ts +372 -608
  751. package/src/runs/shared/child-boundaries.ts +217 -0
  752. package/src/runs/shared/child-context-filter.ts +53 -0
  753. package/src/runs/shared/child-event-observer.ts +496 -0
  754. package/src/runs/shared/child-execution-cwd.ts +139 -68
  755. package/src/runs/shared/child-execution-outcome.ts +103 -0
  756. package/src/runs/shared/child-invocation.ts +74 -0
  757. package/src/runs/shared/child-message-validation.ts +233 -0
  758. package/src/runs/shared/child-native-accounting.ts +154 -0
  759. package/src/runs/shared/child-native-observation.ts +79 -0
  760. package/src/runs/shared/child-observation-spool.ts +188 -0
  761. package/src/runs/shared/child-observations.ts +219 -89
  762. package/src/runs/shared/child-presence.ts +6 -0
  763. package/src/runs/shared/child-route-env.ts +142 -0
  764. package/src/runs/shared/child-stream-observer.ts +302 -0
  765. package/src/runs/shared/child-stream-projection.ts +160 -0
  766. package/src/runs/shared/child-structured-tool.ts +38 -0
  767. package/src/runs/shared/claude-code.ts +201 -228
  768. package/src/runs/shared/claude-model.ts +67 -0
  769. package/src/runs/shared/claude-session.ts +124 -0
  770. package/src/runs/shared/claude-types.ts +31 -0
  771. package/src/runs/shared/completion-guard.ts +35 -26
  772. package/src/runs/shared/control-event-policy.ts +15 -0
  773. package/src/runs/shared/control-notification-owner.ts +20 -0
  774. package/src/runs/shared/dynamic-fanout.ts +402 -238
  775. package/src/runs/shared/dynamic-item.ts +114 -0
  776. package/src/runs/shared/history-index.ts +112 -51
  777. package/src/runs/shared/legacy-async-recovery.ts +153 -0
  778. package/src/runs/shared/legacy-output-recovery.ts +214 -0
  779. package/src/runs/shared/mcp-config-schema.ts +46 -0
  780. package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
  781. package/src/runs/shared/model-fallback.ts +302 -180
  782. package/src/runs/shared/mutating-tool-guard.ts +259 -158
  783. package/src/runs/shared/native-finalization-types.ts +29 -0
  784. package/src/runs/shared/native-finalization.ts +233 -109
  785. package/src/runs/shared/native-usage.ts +379 -96
  786. package/src/runs/shared/nested-control-records.ts +178 -0
  787. package/src/runs/shared/nested-events.ts +45 -752
  788. package/src/runs/shared/nested-path.ts +47 -34
  789. package/src/runs/shared/nested-projection.ts +230 -0
  790. package/src/runs/shared/nested-protocol.ts +67 -0
  791. package/src/runs/shared/nested-registry.ts +273 -0
  792. package/src/runs/shared/nested-render.ts +198 -100
  793. package/src/runs/shared/nested-route.ts +292 -0
  794. package/src/runs/shared/nested-validation.ts +291 -0
  795. package/src/runs/shared/owned-child-evidence.ts +184 -0
  796. package/src/runs/shared/owned-run-list.ts +187 -0
  797. package/src/runs/shared/owned-run-observation.ts +368 -0
  798. package/src/runs/shared/owned-run-progress.ts +172 -0
  799. package/src/runs/shared/owned-run-read-state.ts +7 -0
  800. package/src/runs/shared/owned-run-results.ts +289 -0
  801. package/src/runs/shared/owned-run-status.ts +239 -0
  802. package/src/runs/shared/owned-run-view.ts +65 -0
  803. package/src/runs/shared/owned-workflow-details.ts +24 -0
  804. package/src/runs/shared/owner-output.ts +73 -0
  805. package/src/runs/shared/parallel-utils.ts +93 -129
  806. package/src/runs/shared/parent-receipts.ts +177 -50
  807. package/src/runs/shared/parent-usage.ts +314 -91
  808. package/src/runs/shared/pi-args.ts +241 -311
  809. package/src/runs/shared/pi-launch-input.ts +48 -0
  810. package/src/runs/shared/pi-session-launch.ts +94 -0
  811. package/src/runs/shared/pi-spawn.ts +57 -33
  812. package/src/runs/shared/run-history-queries.ts +189 -38
  813. package/src/runs/shared/run-history.ts +197 -76
  814. package/src/runs/shared/run-id-ambiguity.ts +7 -3
  815. package/src/runs/shared/run-metadata-paths.ts +17 -0
  816. package/src/runs/shared/run-metadata.ts +240 -0
  817. package/src/runs/shared/run-persistence.ts +181 -0
  818. package/src/runs/shared/run-records.ts +19 -607
  819. package/src/runs/shared/run-restoration.ts +455 -0
  820. package/src/runs/shared/run-state-owner.ts +31 -0
  821. package/src/runs/shared/session-cwd-preload.ts +39 -19
  822. package/src/runs/shared/single-output.ts +358 -205
  823. package/src/runs/shared/stable-value.ts +15 -0
  824. package/src/runs/shared/streaming-text.ts +39 -12
  825. package/src/runs/shared/structured-output.ts +76 -46
  826. package/src/runs/shared/subagent-control.ts +330 -197
  827. package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
  828. package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
  829. package/src/runs/shared/supervisor-question-state.ts +221 -0
  830. package/src/runs/shared/supervisor-questions.ts +396 -401
  831. package/src/runs/shared/workflow-graph.ts +400 -198
  832. package/src/runs/shared/workflow-policy.ts +245 -110
  833. package/src/runs/shared/worktree-contract.ts +29 -0
  834. package/src/runs/shared/worktree-hook.ts +181 -0
  835. package/src/runs/shared/worktree-location.ts +61 -0
  836. package/src/runs/shared/worktree-preservation.ts +10 -0
  837. package/src/runs/shared/worktree-process.ts +132 -0
  838. package/src/runs/shared/worktree.ts +459 -587
  839. package/src/shared/agent-context-policy.ts +176 -145
  840. package/src/shared/agent-dir.ts +15 -0
  841. package/src/shared/artifacts.ts +99 -68
  842. package/src/shared/atomic-json.ts +14 -11
  843. package/src/shared/chain-files.ts +72 -0
  844. package/src/shared/concurrency.ts +27 -0
  845. package/src/shared/content-preview.ts +117 -0
  846. package/src/shared/cooperative.ts +17 -13
  847. package/src/shared/execution-cwd.ts +34 -9
  848. package/src/shared/file-coalescer.ts +24 -22
  849. package/src/shared/fork-context.ts +52 -48
  850. package/src/shared/formatters.ts +88 -47
  851. package/src/shared/journal-frames.ts +197 -0
  852. package/src/shared/journal-projections.ts +133 -0
  853. package/src/shared/journal-reader.ts +18 -333
  854. package/src/shared/json-projection.ts +224 -0
  855. package/src/shared/lazy-tools.ts +76 -27
  856. package/src/shared/message-output.ts +146 -0
  857. package/src/shared/model-info.ts +94 -58
  858. package/src/shared/native-import.ts +25 -0
  859. package/src/shared/native-journal.ts +172 -0
  860. package/src/shared/native-session-loader.ts +13 -0
  861. package/src/shared/native-session.ts +3 -5
  862. package/src/shared/native-tui.ts +13 -3
  863. package/src/shared/native-typebox.ts +18 -3
  864. package/src/shared/output-page.ts +76 -0
  865. package/src/shared/post-exit-stdio-guard.ts +232 -172
  866. package/src/shared/prompt-sections.ts +13 -7
  867. package/src/shared/session-entries.ts +103 -44
  868. package/src/shared/session-identity.ts +17 -10
  869. package/src/shared/settings.ts +182 -367
  870. package/src/shared/status-format.ts +207 -98
  871. package/src/shared/stream-json.d.ts +10 -0
  872. package/src/shared/task-file-policy.ts +35 -0
  873. package/src/shared/temp-root.ts +122 -71
  874. package/src/shared/types/acceptance.ts +149 -0
  875. package/src/shared/types/async.ts +247 -0
  876. package/src/shared/types/config.ts +139 -0
  877. package/src/shared/types/details.ts +104 -0
  878. package/src/shared/types/history.ts +217 -0
  879. package/src/shared/types/inputs.ts +4 -0
  880. package/src/shared/types/intercom.ts +57 -0
  881. package/src/shared/types/launch.ts +39 -0
  882. package/src/shared/types/messages.ts +104 -0
  883. package/src/shared/types/nested.ts +153 -0
  884. package/src/shared/types/owned-runs.ts +148 -0
  885. package/src/shared/types/progress.ts +106 -0
  886. package/src/shared/types/questions.ts +103 -0
  887. package/src/shared/types/results.ts +119 -0
  888. package/src/shared/types/state.ts +56 -0
  889. package/src/shared/types/usage.ts +36 -0
  890. package/src/shared/types/workflow.ts +187 -0
  891. package/src/shared/types.ts +222 -1161
  892. package/src/shared/ui-mode.ts +1 -1
  893. package/src/shared/unknown.ts +59 -0
  894. package/src/shared/utils.ts +111 -305
  895. package/src/slash/command-discovery.ts +109 -0
  896. package/src/slash/command-input.ts +232 -0
  897. package/src/slash/prompt-template-bridge.ts +153 -400
  898. package/src/slash/prompt-template-contract.ts +152 -0
  899. package/src/slash/prompt-template-results.ts +189 -0
  900. package/src/slash/request-protocol.ts +87 -0
  901. package/src/slash/result-delivery.ts +312 -0
  902. package/src/slash/saved-chain.ts +115 -0
  903. package/src/slash/slash-bridge.ts +202 -156
  904. package/src/slash/slash-commands.ts +176 -598
  905. package/src/slash/slash-live-state.ts +287 -229
  906. package/src/tui/action-hints.ts +147 -61
  907. package/src/tui/activity-lines.ts +40 -0
  908. package/src/tui/agent-browser.ts +354 -0
  909. package/src/tui/agent-controls.ts +355 -0
  910. package/src/tui/agent-conversation.ts +514 -0
  911. package/src/tui/agent-dock.ts +250 -0
  912. package/src/tui/agent-history.ts +78 -203
  913. package/src/tui/agent-model.ts +78 -0
  914. package/src/tui/agent-picker.ts +325 -0
  915. package/src/tui/agent-view.ts +391 -1333
  916. package/src/tui/compact-results.ts +342 -0
  917. package/src/tui/conversation-details.ts +206 -0
  918. package/src/tui/conversation-frame.ts +184 -0
  919. package/src/tui/conversation-history.ts +246 -0
  920. package/src/tui/conversation-menu.ts +119 -0
  921. package/src/tui/conversation-notices.ts +116 -0
  922. package/src/tui/conversation-selection.ts +66 -0
  923. package/src/tui/conversation-viewport.ts +169 -0
  924. package/src/tui/direction-message.ts +35 -0
  925. package/src/tui/display.ts +409 -0
  926. package/src/tui/editor-viewport.ts +19 -0
  927. package/src/tui/expanded-content.ts +134 -0
  928. package/src/tui/expanded-multi.ts +264 -0
  929. package/src/tui/expanded-single.ts +92 -0
  930. package/src/tui/history-cards.ts +316 -0
  931. package/src/tui/history-display.ts +334 -0
  932. package/src/tui/history-json.ts +17 -0
  933. package/src/tui/history-metadata.ts +177 -0
  934. package/src/tui/history-record.ts +321 -0
  935. package/src/tui/history-text.ts +34 -0
  936. package/src/tui/indexed-history.ts +149 -0
  937. package/src/tui/nested-widget.ts +192 -0
  938. package/src/tui/picker-page.ts +80 -0
  939. package/src/tui/render.ts +100 -1546
  940. package/src/tui/result-facts.ts +99 -0
  941. package/src/tui/task-observation.ts +96 -0
  942. package/src/tui/task-store.ts +432 -0
  943. package/src/tui/text-values.ts +20 -0
  944. package/src/tui/view-connections.ts +64 -0
  945. package/src/tui/view-model.ts +181 -0
  946. package/src/tui/view-persistence.ts +57 -0
  947. package/src/tui/view-ports.ts +55 -0
  948. package/src/tui/view-session.ts +42 -0
  949. package/src/tui/widget-details.ts +220 -0
  950. package/src/tui/widget-status.ts +331 -0
  951. package/src/tui/widget.ts +208 -0
  952. package/src/tui/workflow-labels.ts +340 -0
  953. package/src/tui/workflow-outcomes.ts +150 -0
  954. package/tsconfig.build.json +11 -10
  955. package/tsconfig.json +30 -17
@@ -1,353 +1,495 @@
1
- import { isDeepStrictEqual } from "node:util";
2
- import type { Message } from "@earendil-works/pi-ai";
3
- import { createStructuredOutputRuntime, readStructuredOutput, validateStructuredOutputValue, type StructuredOutputRuntime } from "./structured-output.ts";
4
1
  import type {
5
- AcceptanceFinalizationTurn,
6
- AcceptanceLedger,
7
- AcceptanceReport,
8
- JsonSchemaObject,
9
- ResolvedAcceptanceConfig,
2
+ AcceptanceFinalizationTurn,
3
+ AcceptanceLedger,
4
+ AcceptanceReport,
5
+ JsonSchemaObject,
6
+ ResolvedAcceptanceConfig,
10
7
  } from "../../shared/types.ts";
11
8
  import { acceptanceFailureMessage, evaluateAcceptance } from "./acceptance-evaluation.ts";
12
- import { acceptanceSelfReviewConfig, formatEvidenceReportFieldMapping, shouldRunAcceptanceFinalization } from "./acceptance-contract.ts";
13
- import type { AttemptOutcome } from "./model-fallback.ts";
14
- import { isFailFastAbort } from "./parallel-utils.ts";
15
- import { ACCEPTANCE_REPORT_SCHEMA, formatAcceptanceReportExample, parseAcceptanceReport, stripAcceptanceReport, validateAcceptanceReportShape } from "./acceptance-reports.ts";
9
+ import {
10
+ acceptanceSelfReviewConfig,
11
+ formatEvidenceReportFieldMapping,
12
+ formatAcceptanceRequirements,
13
+ shouldRunAcceptanceFinalization,
14
+ } from "./acceptance-contract.ts";
15
+ import type { ExecutionOutcome } from "./acceptance-outcome.ts";
16
+ export { resolveExecutionOutcome } from "./acceptance-outcome.ts";
17
+ import {
18
+ formatAcceptanceReportExample,
19
+ parseAcceptanceReport,
20
+ stripAcceptanceReport,
21
+ } from "./acceptance-reports.ts";
16
22
 
17
- type FinalizationReportRuntime = StructuredOutputRuntime & { publicOutputSchema?: JsonSchemaObject };
23
+ import { reportAuditOutput, type FinalizationReportSubmission } from "./acceptance-submission.ts";
24
+ export {
25
+ createFinalizationReportRuntime,
26
+ readFinalizationReport,
27
+ type FinalizationReportSubmission,
28
+ } from "./acceptance-submission.ts";
18
29
 
19
- export function createFinalizationReportRuntime(publicOutputSchema?: JsonSchemaObject): FinalizationReportRuntime {
20
- const runtime = createStructuredOutputRuntime({
21
- type: "object", properties: {
22
- // A schema resource keeps root-local references (including recursive "#") scoped to the public answer.
23
- answer: publicOutputSchema ? { $id: "urn:pi-subagents:public-output", ...publicOutputSchema }
24
- : { type: "string", pattern: "\\S", description: "Complete standalone final answer, including every requested handoff detail." },
25
- report: ACCEPTANCE_REPORT_SCHEMA,
26
- }, required: ["answer", "report"], additionalProperties: false,
27
- });
28
- return { ...runtime, publicOutputSchema };
30
+ export function formatUnconfirmedFinalizationOutput(output: string): string {
31
+ return `UNCONFIRMED task report — retained for audit only; finalization did not deliver a current complete report.\n\n${stripAcceptanceReport(output)}`;
29
32
  }
30
33
 
31
- export interface FinalizationReportSubmission {
32
- output: string;
33
- structuredOutput?: unknown;
34
- report?: AcceptanceReport;
35
- reportSubmissionError?: string;
36
- unconfirmedOutput?: string;
34
+ export function resolveFinalizationOutput(rawOutput: string, previousOutput: string): string {
35
+ const prose = stripAcceptanceReport(rawOutput);
36
+ if (prose.trim().length > 0) {
37
+ return prose;
38
+ }
39
+ const report = parseAcceptanceReport(rawOutput).report;
40
+ const summary = report?.diffSummary?.trim() ?? "";
41
+ if (summary.length > 0) {
42
+ return summary;
43
+ }
44
+ const notes = report?.notes?.trim() ?? "";
45
+ return notes.length > 0 ? notes : previousOutput;
37
46
  }
38
47
 
39
- function readReportValue(value: unknown, publicOutputSchema?: JsonSchemaObject): (FinalizationReportSubmission & { report: AcceptanceReport }) | undefined {
40
- if (!value || typeof value !== "object") return;
41
- // Stored legacy runtimes retain their original string schema.
42
- if (!publicOutputSchema && "report" in value && typeof value.report === "string") {
43
- const parsed = parseAcceptanceReport(value.report);
44
- if (parsed.report) return { output: value.report, report: parsed.report };
45
- }
46
- if (!("answer" in value) || !("report" in value)) return;
47
- if (validateAcceptanceReportShape(value.report)) return;
48
- if (publicOutputSchema) {
49
- if (validateStructuredOutputValue(publicOutputSchema, value.answer).status === "invalid") return;
50
- return { output: JSON.stringify(value.answer), structuredOutput: value.answer, report: value.report as AcceptanceReport };
51
- }
52
- if (typeof value.answer !== "string" || !value.answer.trim()) return;
53
- return { output: value.answer, report: value.report as AcceptanceReport };
48
+ interface RunAcceptanceInput {
49
+ readonly acceptance: ResolvedAcceptanceConfig;
50
+ readonly initial: ExecutionOutcome;
51
+ readonly initialOutput: string;
52
+ readonly initialReport?: AcceptanceReport;
53
+ readonly initialAcceptance?: AcceptanceLedger;
54
+ readonly sessionFile?: string;
55
+ readonly cwd: string;
56
+ readonly signal?: AbortSignal;
57
+ readonly nativeReport?: boolean;
58
+ readonly outputSchema?: JsonSchemaObject;
59
+ readonly recordedTurns?: number;
60
+ readonly runTurn: (prompt: string, turn: number, sessionFile: string) => Promise<ReviewResult>;
54
61
  }
62
+ type ReviewResult = FinalizationReportSubmission & {
63
+ readonly error?: string;
64
+ readonly acceptance?: AcceptanceLedger;
65
+ };
55
66
 
56
- function reportAuditOutput(submission: { output: string; report?: AcceptanceReport }): string {
57
- return submission.report && !parseAcceptanceReport(submission.output).report
58
- ? `${submission.output}\n\n\`\`\`acceptance-report\n${JSON.stringify(submission.report)}\n\`\`\`` : submission.output;
67
+ function skipSelfReview(input: RunAcceptanceInput, ledger: AcceptanceLedger): boolean {
68
+ return (
69
+ ledger.status === "blocked" ||
70
+ !shouldRunAcceptanceFinalization(input.acceptance) ||
71
+ input.initial.exitCode !== 0 ||
72
+ (input.initial.error ?? "").length > 0 ||
73
+ input.initial.interrupted === true ||
74
+ (input.signal?.aborted === true && (input.recordedTurns ?? 0) === 0)
75
+ );
59
76
  }
60
77
 
61
- /** Pass the current attempt's messages, or its starting offset in a shared native session. */
62
- export function readFinalizationReport(messages: Message[], runtime: FinalizationReportRuntime, options: { messageOffset?: number; structuredResult?: boolean } = {}): FinalizationReportSubmission {
63
- messages = messages.slice(options.messageOffset ?? 0);
64
- const captured = readStructuredOutput(runtime);
65
- const submitted = readReportValue(captured.value, runtime.publicOutputSchema);
66
- // Older submissions are audit evidence only, never the current output below.
67
- const successfulIds = new Set(messages.flatMap((message) => message.role === "toolResult" && message.toolName === "structured_output" && message.isError === false ? [message.toolCallId] : []));
68
- let unconfirmedOutput = submitted && reportAuditOutput(submitted);
69
- for (const message of messages) {
70
- if (message.role !== "assistant" || !Array.isArray(message.content)) continue;
71
- for (const call of message.content) {
72
- if (call.type !== "toolCall" || call.name !== "structured_output" || !successfulIds.has(call.id)) continue;
73
- const value = call.arguments.value;
74
- const previous = readReportValue(value, runtime.publicOutputSchema);
75
- if (previous && validateStructuredOutputValue(runtime.schema, value).status === "valid") unconfirmedOutput = reportAuditOutput(previous);
76
- }
77
- }
78
- const rejected = (reason: string): FinalizationReportSubmission => ({
79
- output: "", reportSubmissionError: `No current finalization report: ${reason}`, unconfirmedOutput,
80
- });
81
- const index = messages.findLastIndex((message) => message.role === "assistant");
82
- const last = messages[index];
83
- if (last?.role !== "assistant" || last.errorMessage || !["stop", "toolUse"].includes(last.stopReason) || !Array.isArray(last.content)) {
84
- return rejected("the latest assistant turn did not finish successfully.");
85
- }
86
- // Claude Code returns its schema-constrained payload in the terminal result event, not a Pi tool call.
87
- if (options.structuredResult) {
88
- if (captured.error) return rejected(captured.error);
89
- return submitted ? { ...submitted, unconfirmedOutput } : rejected("the submission must contain a complete answer and a valid acceptance report.");
90
- }
91
- const calls = last.content.filter((part) => part.type === "toolCall");
92
- if (calls.length !== 1 || calls[0]!.name !== "structured_output") return rejected("the latest assistant turn must submit structured_output as its only tool call.");
93
- const call = calls[0]!;
94
- const result = messages.slice(index + 1).findLast((message) => message.role === "toolResult" && message.toolCallId === call.id);
95
- if (result?.role !== "toolResult" || result.toolName !== "structured_output" || result.isError !== false) return rejected("the latest structured_output call has no matching successful result.");
96
- if (captured.error) return rejected(captured.error);
97
- if (!isDeepStrictEqual(captured.value, call.arguments.value)) return rejected("the capture does not match the latest submission.");
98
- if (!submitted) return rejected("the submission must contain a complete answer and a valid acceptance report.");
99
- return { ...submitted, unconfirmedOutput };
100
- }
78
+ /** Owns ordered continuation, cumulative audit evidence, and the authoritative current ledger. */
79
+ class AcceptanceReview {
80
+ private readonly input: RunAcceptanceInput & { readonly sessionFile: string };
81
+ private readonly initialLedger: AcceptanceLedger;
82
+ private readonly selfReview: ResolvedAcceptanceConfig;
83
+ private readonly turns: AcceptanceFinalizationTurn[] = [];
84
+ private authoritativeLedger: AcceptanceLedger;
85
+ private previousFailure: string | undefined;
86
+ private auditOutput: string;
101
87
 
102
- export function formatUnconfirmedFinalizationOutput(output: string): string {
103
- return `UNCONFIRMED task report — retained for audit only; finalization did not deliver a current complete report.\n\n${stripAcceptanceReport(output)}`;
104
- }
88
+ constructor(
89
+ input: RunAcceptanceInput & { readonly sessionFile: string },
90
+ initialLedger: AcceptanceLedger,
91
+ selfReview: ResolvedAcceptanceConfig,
92
+ ) {
93
+ this.input = input;
94
+ this.initialLedger = initialLedger;
95
+ this.selfReview = selfReview;
96
+ this.authoritativeLedger = initialLedger;
97
+ this.previousFailure = acceptanceFailureMessage(initialLedger);
98
+ this.auditOutput = reportAuditOutput({
99
+ output: input.initialOutput,
100
+ report: input.initialReport,
101
+ });
102
+ }
105
103
 
106
- export function resolveFinalizationOutput(rawOutput: string, previousOutput: string): string {
107
- const prose = stripAcceptanceReport(rawOutput);
108
- if (prose.trim()) return prose;
109
- const report = parseAcceptanceReport(rawOutput).report;
110
- return report?.diffSummary?.trim() || report?.notes?.trim() || previousOutput;
111
- }
104
+ private finish(status: "completed" | "blocked" | "failed"): AcceptanceLedger {
105
+ return attachFinalizationToLedger({
106
+ initialLedger: this.initialLedger,
107
+ authoritativeLedger: this.authoritativeLedger,
108
+ turns: this.turns,
109
+ status,
110
+ maxTurns: this.input.acceptance.finalization.maxTurns,
111
+ });
112
+ }
112
113
 
113
- type ExecutionOutcome = Pick<AttemptOutcome, "exitCode" | "error" | "interrupted" | "timedOut" | "resourceLimitExceeded">;
114
+ private processFailure(
115
+ result: ReviewResult,
116
+ turn: number,
117
+ prompt: string,
118
+ ): AcceptanceLedger | undefined {
119
+ if (result.error === undefined || result.error.length === 0) {
120
+ return undefined;
121
+ }
122
+ this.turns.push({
123
+ ...createFinalizationProcessFailureTurn({
124
+ turn,
125
+ prompt,
126
+ rawOutput: result.output,
127
+ message: result.error,
128
+ }),
129
+ ...(this.input.nativeReport === true ? { unconfirmedOutput: this.auditOutput } : {}),
130
+ });
131
+ const ledger = buildFinalizationProcessFailureLedger({
132
+ initialLedger: this.initialLedger,
133
+ turns: this.turns,
134
+ maxTurns: this.input.acceptance.finalization.maxTurns,
135
+ message: result.error,
136
+ });
137
+ return this.input.nativeReport === true
138
+ ? {
139
+ ...ledger,
140
+ childReport: undefined,
141
+ childReportParseError: result.reportSubmissionError,
142
+ unconfirmedOutput: this.auditOutput,
143
+ }
144
+ : ledger;
145
+ }
114
146
 
115
- export function resolveExecutionOutcome(input: {
116
- result: ExecutionOutcome;
117
- acceptance?: AcceptanceLedger;
118
- signal?: AbortSignal;
119
- interruptSignal?: AbortSignal;
120
- }): ExecutionOutcome {
121
- const { result } = input;
122
- if (input.signal?.aborted && input.signal.reason instanceof Error && input.signal.reason.name === "TimeoutError") {
123
- return { ...result, exitCode: 124, timedOut: true, interrupted: false, error: input.signal.reason.message || "Subagent timed out." };
124
- }
125
- if (input.signal?.aborted) return { ...result, exitCode: 1, interrupted: false, error: "Subagent cancelled." };
126
- if (isFailFastAbort(input.interruptSignal)) return { ...result, exitCode: -1, interrupted: false, error: "Interrupted due to fail-fast" };
127
- if (result.timedOut || result.resourceLimitExceeded) return { ...result, exitCode: result.timedOut ? 124 : 1, interrupted: result.interrupted === undefined ? undefined : false };
128
- if (input.interruptSignal?.aborted || result.interrupted) return { ...result, exitCode: 0, interrupted: true, error: undefined };
129
- const failure = input.acceptance?.explicit ? acceptanceFailureMessage(input.acceptance) : undefined;
130
- if (failure && result.exitCode === 0) return { ...result, exitCode: 1, error: result.error ? `${result.error}\n${failure}` : failure };
131
- return result;
132
- }
147
+ private async evaluateTurn(result: ReviewResult): Promise<AcceptanceLedger> {
148
+ const submissionError = result.reportSubmissionError;
149
+ const rejectedSubmission = submissionError !== undefined && submissionError.length > 0;
150
+ // Replay the native boundary's checks, not the workspace left by a later repair.
151
+ let ledger =
152
+ !rejectedSubmission && result.acceptance
153
+ ? result.acceptance
154
+ : await evaluateAcceptance({
155
+ acceptance: this.selfReview,
156
+ governing: this.input.acceptance,
157
+ output: rejectedSubmission ? "" : result.output,
158
+ report: rejectedSubmission ? undefined : result.report,
159
+ cwd: this.input.cwd,
160
+ signal: this.input.signal,
161
+ });
162
+ if (rejectedSubmission) {
163
+ ledger = {
164
+ ...ledger,
165
+ childReportParseError: submissionError,
166
+ runtimeChecks: [{ id: "finalization-report", status: "failed", message: submissionError }],
167
+ };
168
+ }
169
+ if (this.input.nativeReport === true && (ledger.childReportParseError ?? "").length > 0) {
170
+ ledger = { ...ledger, unconfirmedOutput: this.auditOutput };
171
+ }
172
+ return ledger;
173
+ }
174
+
175
+ private async completeReview(result: ReviewResult): Promise<AcceptanceLedger> {
176
+ if (result.acceptance || this.selfReview !== this.input.acceptance) {
177
+ this.authoritativeLedger = await evaluateAcceptance({
178
+ acceptance: this.input.acceptance,
179
+ output: result.output,
180
+ report: result.report,
181
+ cwd: this.input.cwd,
182
+ signal: this.input.signal,
183
+ });
184
+ }
185
+ return this.finish(this.input.signal?.aborted === true ? "failed" : "completed");
186
+ }
133
187
 
134
- export async function evaluateRunAcceptance(input: {
135
- acceptance: ResolvedAcceptanceConfig;
136
- initial: ExecutionOutcome;
137
- initialOutput: string;
138
- initialReport?: AcceptanceReport;
139
- initialAcceptance?: AcceptanceLedger;
140
- sessionFile?: string;
141
- cwd: string;
142
- signal?: AbortSignal;
143
- nativeReport?: boolean;
144
- outputSchema?: JsonSchemaObject;
145
- recordedTurns?: number;
146
- runTurn: (prompt: string, turn: number, sessionFile: string) => Promise<FinalizationReportSubmission & { error?: string; acceptance?: AcceptanceLedger }>;
147
- }): Promise<AcceptanceLedger> {
148
- const review = shouldRunAcceptanceFinalization(input.acceptance);
149
- const selfReview = review ? acceptanceSelfReviewConfig(input.acceptance) : input.acceptance;
150
- const initialLedger = input.initialAcceptance ?? await evaluateAcceptance({ acceptance: selfReview, governing: input.acceptance, output: input.initialOutput, report: input.initialReport, cwd: input.cwd, signal: input.signal });
151
- if (initialLedger.status === "blocked" || !review || input.initial.exitCode !== 0 || input.initial.error || input.initial.interrupted || (input.signal?.aborted && !input.recordedTurns)) return initialLedger;
188
+ private runTurn(turn: number, prompt: string): Promise<ReviewResult> {
189
+ if (this.input.signal?.aborted === true && turn > (this.input.recordedTurns ?? 0)) {
190
+ return Promise.resolve({ output: "", error: "Acceptance finalization cancelled." });
191
+ }
192
+ return this.input.runTurn(prompt, turn, this.input.sessionFile);
193
+ }
152
194
 
153
- const maxTurns = input.acceptance.finalization.maxTurns;
154
- const turns: AcceptanceFinalizationTurn[] = [];
155
- if (!input.sessionFile) {
156
- const message = "Acceptance finalization requires a session file for same-session continuation.";
157
- turns.push(createFinalizationProcessFailureTurn({ turn: 1, prompt: "", message }));
158
- return buildFinalizationProcessFailureLedger({ initialLedger, turns, maxTurns, message });
159
- }
160
- let previousFailure = acceptanceFailureMessage(initialLedger);
161
- let authoritativeLedger = initialLedger;
162
- let auditOutput = reportAuditOutput({ output: input.initialOutput, report: input.initialReport });
163
- for (let turn = 1; turn <= maxTurns; turn++) {
164
- const prompt = formatAcceptanceFinalizationPrompt({ acceptance: input.acceptance, initialOutput: input.initialOutput, initialLedger, turn, maxTurns, previousFailure, nativeReport: input.nativeReport, outputSchema: input.outputSchema });
165
- const result = input.signal?.aborted && turn > (input.recordedTurns ?? 0)
166
- ? { output: "", error: "Acceptance finalization cancelled." }
167
- : await input.runTurn(prompt, turn, input.sessionFile);
168
- const retained = result.unconfirmedOutput ?? reportAuditOutput(result);
169
- if (input.nativeReport && parseAcceptanceReport(retained).report) auditOutput = retained;
170
- if (result.error) {
171
- turns.push({ ...createFinalizationProcessFailureTurn({ turn, prompt, rawOutput: result.output, message: result.error }),
172
- ...(input.nativeReport ? { unconfirmedOutput: auditOutput } : {}) });
173
- const ledger = buildFinalizationProcessFailureLedger({ initialLedger, turns, maxTurns, message: result.error });
174
- return input.nativeReport ? { ...ledger, childReport: undefined, childReportParseError: result.reportSubmissionError, unconfirmedOutput: auditOutput } : ledger;
175
- }
176
- // Replay each native boundary's checks, not the workspace left by a later repair.
177
- authoritativeLedger = !result.reportSubmissionError && result.acceptance
178
- ? result.acceptance
179
- : await evaluateAcceptance({ acceptance: selfReview, governing: input.acceptance, output: result.reportSubmissionError ? "" : result.output, report: result.reportSubmissionError ? undefined : result.report, cwd: input.cwd, signal: input.signal });
180
- if (result.reportSubmissionError) {
181
- authoritativeLedger.childReportParseError = result.reportSubmissionError;
182
- authoritativeLedger.runtimeChecks = [{ id: "finalization-report", status: "failed", message: result.reportSubmissionError }];
183
- }
184
- if (input.nativeReport && authoritativeLedger.childReportParseError) authoritativeLedger.unconfirmedOutput = auditOutput;
185
- turns.push(createFinalizationTurn({ turn, prompt, rawOutput: result.output, ledger: authoritativeLedger }));
186
- if (authoritativeLedger.status === "blocked") return attachFinalizationToLedger({ initialLedger, authoritativeLedger, turns, status: "blocked", maxTurns });
187
- const failure = acceptanceFailureMessage(authoritativeLedger);
188
- if (!failure && !input.signal?.aborted) {
189
- if (result.acceptance || selfReview !== input.acceptance) authoritativeLedger = await evaluateAcceptance({ acceptance: input.acceptance, output: result.output, report: result.report, cwd: input.cwd, signal: input.signal });
190
- return attachFinalizationToLedger({ initialLedger, authoritativeLedger, turns, status: input.signal?.aborted ? "failed" : "completed", maxTurns });
191
- }
192
- if (input.signal?.aborted) break;
193
- previousFailure = failure;
194
- }
195
- return attachFinalizationToLedger({ initialLedger, authoritativeLedger, turns, status: "failed", maxTurns });
195
+ private retainAudit(result: ReviewResult): void {
196
+ const retained = result.unconfirmedOutput ?? reportAuditOutput(result);
197
+ if (this.input.nativeReport === true && parseAcceptanceReport(retained).report) {
198
+ this.auditOutput = retained;
199
+ }
200
+ }
201
+
202
+ private async performTurn(turn: number): Promise<AcceptanceLedger | undefined> {
203
+ const prompt = formatAcceptanceFinalizationPrompt({
204
+ acceptance: this.input.acceptance,
205
+ initialOutput: this.input.initialOutput,
206
+ initialLedger: this.initialLedger,
207
+ turn,
208
+ maxTurns: this.input.acceptance.finalization.maxTurns,
209
+ previousFailure: this.previousFailure,
210
+ nativeReport: this.input.nativeReport,
211
+ outputSchema: this.input.outputSchema,
212
+ });
213
+ const result = await this.runTurn(turn, prompt);
214
+ this.retainAudit(result);
215
+ const processFailure = this.processFailure(result, turn, prompt);
216
+ if (processFailure) {
217
+ return processFailure;
218
+ }
219
+ this.authoritativeLedger = await this.evaluateTurn(result);
220
+ this.turns.push(
221
+ createFinalizationTurn({
222
+ turn,
223
+ prompt,
224
+ rawOutput: result.output,
225
+ ledger: this.authoritativeLedger,
226
+ }),
227
+ );
228
+ if (this.authoritativeLedger.status === "blocked") {
229
+ return this.finish("blocked");
230
+ }
231
+ const failure = acceptanceFailureMessage(this.authoritativeLedger);
232
+ if (failure === undefined && this.input.signal?.aborted !== true) {
233
+ return this.completeReview(result);
234
+ }
235
+ if (this.input.signal?.aborted === true) {
236
+ return this.finish("failed");
237
+ }
238
+ this.previousFailure = failure;
239
+ return undefined;
240
+ }
241
+
242
+ async run(): Promise<AcceptanceLedger> {
243
+ for (let turn = 1; turn <= this.input.acceptance.finalization.maxTurns; turn++) {
244
+ // Each repair resumes the same session and consumes the preceding turn's authoritative outcome.
245
+ // oxlint-disable-next-line no-await-in-loop
246
+ const finished = await this.performTurn(turn);
247
+ if (finished) {
248
+ return finished;
249
+ }
250
+ }
251
+ return this.finish("failed");
252
+ }
253
+ }
254
+
255
+ export async function evaluateRunAcceptance(input: RunAcceptanceInput): Promise<AcceptanceLedger> {
256
+ const review = shouldRunAcceptanceFinalization(input.acceptance);
257
+ const selfReview = review ? acceptanceSelfReviewConfig(input.acceptance) : input.acceptance;
258
+ const initialLedger =
259
+ input.initialAcceptance ??
260
+ (await evaluateAcceptance({
261
+ acceptance: selfReview,
262
+ governing: input.acceptance,
263
+ output: input.initialOutput,
264
+ report: input.initialReport,
265
+ cwd: input.cwd,
266
+ signal: input.signal,
267
+ }));
268
+ if (skipSelfReview(input, initialLedger)) {
269
+ return initialLedger;
270
+ }
271
+ if (input.sessionFile === undefined || input.sessionFile.length === 0) {
272
+ const message =
273
+ "Acceptance finalization requires a session file for same-session continuation.";
274
+ const turns = [createFinalizationProcessFailureTurn({ turn: 1, prompt: "", message })];
275
+ return buildFinalizationProcessFailureLedger({
276
+ initialLedger,
277
+ turns,
278
+ maxTurns: input.acceptance.finalization.maxTurns,
279
+ message,
280
+ });
281
+ }
282
+ return new AcceptanceReview(
283
+ { ...input, sessionFile: input.sessionFile },
284
+ initialLedger,
285
+ selfReview,
286
+ ).run();
196
287
  }
197
288
 
198
289
  const INITIAL_OUTPUT_LIMIT = 8_000;
199
290
 
200
291
  function truncateForPrompt(value: string): string {
201
- const trimmed = stripAcceptanceReport(value).trim();
202
- if (trimmed.length <= INITIAL_OUTPUT_LIMIT) return trimmed || "(initial output was empty after removing acceptance-report)";
203
- return `${trimmed.slice(0, INITIAL_OUTPUT_LIMIT)}\n...[truncated]`;
292
+ const trimmed = stripAcceptanceReport(value).trim();
293
+ if (trimmed.length <= INITIAL_OUTPUT_LIMIT) {
294
+ return trimmed.length > 0
295
+ ? trimmed
296
+ : "(initial output was empty after removing acceptance-report)";
297
+ }
298
+ return `${trimmed.slice(0, INITIAL_OUTPUT_LIMIT)}\n...[truncated]`;
204
299
  }
205
300
 
206
301
  function formatReportForPrompt(ledger: AcceptanceLedger): string {
207
- if (ledger.childReport) return JSON.stringify(ledger.childReport, null, 2);
208
- return `Missing or malformed acceptance report: ${ledger.childReportParseError ?? "no parse detail"}`;
302
+ if (ledger.childReport) {
303
+ return JSON.stringify(ledger.childReport, null, 2);
304
+ }
305
+ return `Missing or malformed acceptance report: ${ledger.childReportParseError ?? "no parse detail"}`;
306
+ }
307
+
308
+ function initialReviewEvidence(
309
+ output: string,
310
+ ledger: AcceptanceLedger,
311
+ previousFailure: string | undefined,
312
+ ): string[] {
313
+ const lines = [
314
+ "",
315
+ "Initial visible output:",
316
+ truncateForPrompt(output),
317
+ "",
318
+ "Initial acceptance report:",
319
+ formatReportForPrompt(ledger),
320
+ ];
321
+ if (previousFailure !== undefined && previousFailure.length > 0) {
322
+ lines.push("", "Previous finalization failure to address:", previousFailure);
323
+ }
324
+ return lines;
325
+ }
326
+
327
+ function finalizationInstructions(nativeReport: boolean, schema?: JsonSchemaObject): string[] {
328
+ if (schema) {
329
+ const action = nativeReport
330
+ ? "Your final action must be a sole `structured_output` tool call with {value:{answer,report}}."
331
+ : "Return the schema-constrained JSON object {answer,report}.";
332
+ return [
333
+ `${action} answer must be the complete current public payload matching outputSchema below, including all repairs; do not embed it in a prose string. report is the private typed acceptance object. This submission replaces the initial payload. If more activity follows submission, resubmit the complete current answer and report.\noutputSchema: ${JSON.stringify(schema)}`,
334
+ ];
335
+ }
336
+ const action = nativeReport
337
+ ? "Now do the self-check. Your final action must be a sole `structured_output` tool call with {value:{answer,report}}. answer must contain the complete standalone final answer with the current result and every requested handoff detail (including paths, identifiers, findings, and evidence), repairs or remaining blockers. report is a typed object matching the schema, never JSON embedded in a string. This answer replaces the initial answer; do not replace useful details with only a statement that you rechecked them. If additional messages prompt more activity after submission, resubmit the complete current answer and report as your final action; a prose-only reply does not finalize the task."
338
+ : "Now do the self-check. Return a standalone final answer with the current result and every requested handoff detail (including paths, identifiers, findings, and evidence). This answer replaces the initial answer; do not replace useful details with only a statement that you rechecked them. Include repairs or remaining blockers, then finish with exactly one fenced JSON block tagged `acceptance-report`.";
339
+ return [action, formatAcceptanceReportExample(nativeReport)];
209
340
  }
210
341
 
211
342
  export function formatAcceptanceFinalizationPrompt(input: {
212
- acceptance: ResolvedAcceptanceConfig;
213
- initialOutput: string;
214
- initialLedger: AcceptanceLedger;
215
- turn: number;
216
- maxTurns: number;
217
- previousFailure?: string;
218
- nativeReport?: boolean;
219
- outputSchema?: JsonSchemaObject;
343
+ readonly acceptance: ResolvedAcceptanceConfig;
344
+ readonly initialOutput: string;
345
+ readonly initialLedger: AcceptanceLedger;
346
+ readonly turn: number;
347
+ readonly maxTurns: number;
348
+ readonly previousFailure?: string;
349
+ readonly nativeReport?: boolean;
350
+ readonly outputSchema?: JsonSchemaObject;
220
351
  }): string {
221
- const evidence = [...new Set([...input.acceptance.evidence, ...input.acceptance.criteria.flatMap((criterion) => criterion.evidence)])];
222
- const lines = [
223
- "## Acceptance Finalization",
224
- "You are continuing the same subagent session. Before this run can be accepted, compare the current work to the acceptance contract and the evidence below.",
225
- `This is finalization turn ${input.turn} of ${input.maxTurns}. The run will be rejected if the contract is still not satisfied after turn ${input.maxTurns}.`,
226
- "",
227
- "If a criterion is incomplete and fixable in this session, keep working now before returning the final report.",
228
- "Only an observed human-only boundary, such as Touch ID or an unavailable MFA code, may use criterion status blocked with concrete evidence and a nonempty humanAction describing the exact action needed. Preserve completed criteria/evidence; blocked acceptance is incomplete and stops further review and verification until explicit Continue. Ordinary errors, missing evidence, or fixable work remain not-satisfied, not blocked; explain the blocker in residualRisks.",
229
- "Do not claim a criterion is satisfied unless the current work has concrete evidence from files, commands, validation output, or other inspectable artifacts.",
230
- "Report cumulative evidence for the whole delegated task, not just this finalization turn. Retain still-valid changed files, tests, commands, and other evidence from the initial report; correct or remove evidence only when the final state invalidates it. No new edits during review does not mean changedFiles is empty.",
231
- "",
232
- "## Acceptance Contract",
233
- "Criteria:",
234
- ...(input.acceptance.criteria.length ? input.acceptance.criteria.map((criterion) => `- ${criterion.id}: ${criterion.must}${criterion.evidence.length ? ` (evidence: ${criterion.evidence.join(", ")})` : ""}`) : ["- No explicit criteria were configured; satisfy the requested task and required evidence/checks."]),
235
- "",
236
- `Required evidence: ${evidence.join(", ") || "none explicitly requested"}`,
237
- ];
238
- if (evidence.length > 0) {
239
- lines.push(
240
- "",
241
- `Structured evidence must be present in the ${input.nativeReport || input.outputSchema ? "typed report object" : "final `acceptance-report` JSON fields"}. Markdown sections in the visible answer do not satisfy required evidence by themselves. If the previous visible output already included the evidence, copy or summarize it into the matching JSON field.`,
242
- "Evidence field mapping:",
243
- ...formatEvidenceReportFieldMapping(evidence),
244
- );
245
- }
246
- if (input.acceptance.verify.length > 0) {
247
- lines.push("", "Runtime verification commands that must pass:", ...input.acceptance.verify.map((command) => `- ${command.id}: ${command.command}`));
248
- }
249
- if (input.acceptance.stopRules.length > 0) {
250
- lines.push("", "Stop rules are hard constraints while deciding whether to continue, stop as blocked, or report success:", ...input.acceptance.stopRules.map((rule) => `- ${rule}`));
251
- }
252
- lines.push(
253
- "",
254
- "Initial visible output:",
255
- truncateForPrompt(input.initialOutput),
256
- "",
257
- "Initial acceptance report:",
258
- formatReportForPrompt(input.initialLedger),
259
- );
260
- if (input.previousFailure) {
261
- lines.push("", "Previous finalization failure to address:", input.previousFailure);
262
- }
263
- lines.push(
264
- "",
265
- input.outputSchema
266
- ? `${input.nativeReport ? "Your final action must be a sole `structured_output` tool call with {value:{answer,report}}." : "Return the schema-constrained JSON object {answer,report}."} answer must be the complete current public payload matching outputSchema below, including all repairs; do not embed it in a prose string. report is the private typed acceptance object. This submission replaces the initial payload. If more activity follows submission, resubmit the complete current answer and report.\noutputSchema: ${JSON.stringify(input.outputSchema)}`
267
- : input.nativeReport
268
- ? "Now do the self-check. Your final action must be a sole `structured_output` tool call with {value:{answer,report}}. answer must contain the complete standalone final answer with the current result and every requested handoff detail (including paths, identifiers, findings, and evidence), repairs or remaining blockers. report is a typed object matching the schema, never JSON embedded in a string. This answer replaces the initial answer; do not replace useful details with only a statement that you rechecked them. If additional messages prompt more activity after submission, resubmit the complete current answer and report as your final action; a prose-only reply does not finalize the task."
269
- : "Now do the self-check. Return a standalone final answer with the current result and every requested handoff detail (including paths, identifiers, findings, and evidence). This answer replaces the initial answer; do not replace useful details with only a statement that you rechecked them. Include repairs or remaining blockers, then finish with exactly one fenced JSON block tagged `acceptance-report`.",
270
- ...(input.outputSchema ? [] : [formatAcceptanceReportExample(input.nativeReport)]),
271
- );
272
- return lines.join("\n");
352
+ const evidence = [
353
+ ...new Set([
354
+ ...input.acceptance.evidence,
355
+ ...input.acceptance.criteria.flatMap((criterion) => criterion.evidence),
356
+ ]),
357
+ ];
358
+ const lines = [
359
+ "## Acceptance Finalization",
360
+ "You are continuing the same subagent session. Before this run can be accepted, compare the current work to the acceptance contract and the evidence below.",
361
+ `This is finalization turn ${input.turn} of ${input.maxTurns}. The run will be rejected if the contract is still not satisfied after turn ${input.maxTurns}.`,
362
+ "",
363
+ "If a criterion is incomplete and fixable in this session, keep working now before returning the final report.",
364
+ "Only an observed human-only boundary, such as Touch ID or an unavailable MFA code, may use criterion status blocked with concrete evidence and a nonempty humanAction describing the exact action needed. Preserve completed criteria/evidence; blocked acceptance is incomplete and stops further review and verification until explicit Continue. Ordinary errors, missing evidence, or fixable work remain not-satisfied, not blocked; explain the blocker in residualRisks.",
365
+ "Do not claim a criterion is satisfied unless the current work has concrete evidence from files, commands, validation output, or other inspectable artifacts.",
366
+ "Report cumulative evidence for the whole delegated task, not just this finalization turn. Retain still-valid changed files, tests, commands, and other evidence from the initial report; correct or remove evidence only when the final state invalidates it. No new edits during review does not mean changedFiles is empty.",
367
+ "",
368
+ "## Acceptance Contract",
369
+ ...formatAcceptanceRequirements(
370
+ input.acceptance.criteria,
371
+ evidence,
372
+ "- No explicit criteria were configured; satisfy the requested task and required evidence/checks.",
373
+ ),
374
+ ];
375
+ if (evidence.length > 0) {
376
+ lines.push(
377
+ "",
378
+ `Structured evidence must be present in the ${input.nativeReport === true || input.outputSchema ? "typed report object" : "final `acceptance-report` JSON fields"}. Markdown sections in the visible answer do not satisfy required evidence by themselves. If the previous visible output already included the evidence, copy or summarize it into the matching JSON field.`,
379
+ "Evidence field mapping:",
380
+ ...formatEvidenceReportFieldMapping(evidence),
381
+ );
382
+ }
383
+ if (input.acceptance.verify.length > 0) {
384
+ lines.push(
385
+ "",
386
+ "Runtime verification commands that must pass:",
387
+ ...input.acceptance.verify.map((command) => `- ${command.id}: ${command.command}`),
388
+ );
389
+ }
390
+ if (input.acceptance.stopRules.length > 0) {
391
+ lines.push(
392
+ "",
393
+ "Stop rules are hard constraints while deciding whether to continue, stop as blocked, or report success:",
394
+ ...input.acceptance.stopRules.map((rule) => `- ${rule}`),
395
+ );
396
+ }
397
+ lines.push(
398
+ ...initialReviewEvidence(input.initialOutput, input.initialLedger, input.previousFailure),
399
+ "",
400
+ ...finalizationInstructions(input.nativeReport === true, input.outputSchema),
401
+ );
402
+ return lines.join("\n");
273
403
  }
274
404
 
275
405
  export function createFinalizationTurn(input: {
276
- turn: number;
277
- prompt: string;
278
- rawOutput: string;
279
- ledger: AcceptanceLedger;
406
+ readonly turn: number;
407
+ readonly prompt: string;
408
+ readonly rawOutput: string;
409
+ readonly ledger: AcceptanceLedger;
280
410
  }): AcceptanceFinalizationTurn {
281
- const failureMessage = acceptanceFailureMessage(input.ledger);
282
- return {
283
- turn: input.turn,
284
- prompt: input.prompt,
285
- status: input.ledger.status,
286
- rawOutput: input.rawOutput,
287
- ...(input.ledger.unconfirmedOutput !== undefined ? { unconfirmedOutput: input.ledger.unconfirmedOutput } : {}),
288
- ...(input.ledger.childReport ? { report: input.ledger.childReport } : {}),
289
- ...(input.ledger.childReportParseError ? { parseError: input.ledger.childReportParseError } : {}),
290
- runtimeChecks: input.ledger.runtimeChecks,
291
- verifyRuns: input.ledger.verifyRuns,
292
- ...(failureMessage ? { failureMessage } : {}),
293
- };
411
+ const failureMessage = acceptanceFailureMessage(input.ledger);
412
+ return {
413
+ turn: input.turn,
414
+ prompt: input.prompt,
415
+ status: input.ledger.status,
416
+ rawOutput: input.rawOutput,
417
+ ...(input.ledger.unconfirmedOutput !== undefined
418
+ ? { unconfirmedOutput: input.ledger.unconfirmedOutput }
419
+ : {}),
420
+ ...(input.ledger.childReport ? { report: input.ledger.childReport } : {}),
421
+ ...(input.ledger.childReportParseError !== undefined &&
422
+ input.ledger.childReportParseError.length > 0
423
+ ? { parseError: input.ledger.childReportParseError }
424
+ : {}),
425
+ runtimeChecks: input.ledger.runtimeChecks,
426
+ verifyRuns: input.ledger.verifyRuns,
427
+ ...(failureMessage !== undefined && failureMessage.length > 0 ? { failureMessage } : {}),
428
+ };
294
429
  }
295
430
 
296
431
  export function createFinalizationProcessFailureTurn(input: {
297
- turn: number;
298
- prompt: string;
299
- rawOutput?: string;
300
- message: string;
432
+ readonly turn: number;
433
+ readonly prompt: string;
434
+ readonly rawOutput?: string;
435
+ readonly message: string;
301
436
  }): AcceptanceFinalizationTurn {
302
- return {
303
- turn: input.turn,
304
- prompt: input.prompt,
305
- status: "rejected",
306
- ...(input.rawOutput ? { rawOutput: input.rawOutput } : {}),
307
- runtimeChecks: [{ id: "finalization-process", status: "failed", message: input.message }],
308
- verifyRuns: [],
309
- failureMessage: `Acceptance rejected: ${input.message}`,
310
- };
437
+ return {
438
+ turn: input.turn,
439
+ prompt: input.prompt,
440
+ status: "rejected",
441
+ ...(input.rawOutput !== undefined && input.rawOutput.length > 0
442
+ ? { rawOutput: input.rawOutput }
443
+ : {}),
444
+ runtimeChecks: [{ id: "finalization-process", status: "failed", message: input.message }],
445
+ verifyRuns: [],
446
+ failureMessage: `Acceptance rejected: ${input.message}`,
447
+ };
311
448
  }
312
449
 
313
450
  export function attachFinalizationToLedger(input: {
314
- initialLedger: AcceptanceLedger;
315
- authoritativeLedger: AcceptanceLedger;
316
- turns: AcceptanceFinalizationTurn[];
317
- status: "completed" | "blocked" | "failed";
318
- maxTurns: number;
451
+ readonly initialLedger: AcceptanceLedger;
452
+ readonly authoritativeLedger: AcceptanceLedger;
453
+ readonly turns: readonly AcceptanceFinalizationTurn[];
454
+ readonly status: "completed" | "blocked" | "failed";
455
+ readonly maxTurns: number;
319
456
  }): AcceptanceLedger {
320
- return {
321
- ...input.authoritativeLedger,
322
- ...(input.initialLedger.childReport ? { initialChildReport: input.initialLedger.childReport } : {}),
323
- ...(input.initialLedger.childReportParseError ? { initialChildReportParseError: input.initialLedger.childReportParseError } : {}),
324
- finalization: {
325
- mode: "self-review-loop",
326
- status: input.status,
327
- maxTurns: input.maxTurns,
328
- turns: input.turns,
329
- },
330
- };
457
+ return {
458
+ ...input.authoritativeLedger,
459
+ ...(input.initialLedger.childReport
460
+ ? { initialChildReport: input.initialLedger.childReport }
461
+ : {}),
462
+ ...(input.initialLedger.childReportParseError !== undefined &&
463
+ input.initialLedger.childReportParseError.length > 0
464
+ ? { initialChildReportParseError: input.initialLedger.childReportParseError }
465
+ : {}),
466
+ finalization: {
467
+ mode: "self-review-loop",
468
+ status: input.status,
469
+ maxTurns: input.maxTurns,
470
+ turns: input.turns,
471
+ },
472
+ };
331
473
  }
332
474
 
333
475
  export function buildFinalizationProcessFailureLedger(input: {
334
- initialLedger: AcceptanceLedger;
335
- turns: AcceptanceFinalizationTurn[];
336
- maxTurns: number;
337
- message: string;
476
+ readonly initialLedger: AcceptanceLedger;
477
+ readonly turns: readonly AcceptanceFinalizationTurn[];
478
+ readonly maxTurns: number;
479
+ readonly message: string;
338
480
  }): AcceptanceLedger {
339
- return attachFinalizationToLedger({
340
- initialLedger: input.initialLedger,
341
- authoritativeLedger: {
342
- ...input.initialLedger,
343
- status: "rejected",
344
- runtimeChecks: [
345
- ...input.initialLedger.runtimeChecks,
346
- { id: "finalization-process", status: "failed", message: input.message },
347
- ],
348
- },
349
- turns: input.turns,
350
- status: "failed",
351
- maxTurns: input.maxTurns,
352
- });
481
+ return attachFinalizationToLedger({
482
+ initialLedger: input.initialLedger,
483
+ authoritativeLedger: {
484
+ ...input.initialLedger,
485
+ status: "rejected",
486
+ runtimeChecks: [
487
+ ...input.initialLedger.runtimeChecks,
488
+ { id: "finalization-process", status: "failed", message: input.message },
489
+ ],
490
+ },
491
+ turns: input.turns,
492
+ status: "failed",
493
+ maxTurns: input.maxTurns,
494
+ });
353
495
  }