@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
@@ -4,441 +4,474 @@
4
4
 
5
5
  import { Type } from "../shared/native-typebox.ts";
6
6
  import { SUBAGENT_ACTIONS } from "../shared/types.ts";
7
+ import { AcceptanceOverride } from "./acceptance-schema.ts";
8
+ import { ChainItemSchema } from "./chain-schema.ts";
9
+ import { AgentRunsValidationParams } from "./everyday-schemas.ts";
10
+ import {
11
+ HistoryQueryFields,
12
+ JsonSchemaObject,
13
+ ModelOverride,
14
+ OutputModeOverride,
15
+ SkillOverride,
16
+ TaskItem,
17
+ requiredObject,
18
+ } from "./schema-overrides.ts";
19
+ export { AcceptanceOverride, DelegateAcceptance } from "./acceptance-schema.ts";
20
+ export { ChainItemSchema } from "./chain-schema.ts";
21
+ export { DelegateParams, AgentRunsValidationParams, AgentRunsParams } from "./everyday-schemas.ts";
7
22
 
8
- const requiredObject = (...required: string[]) => ({ type: "object" as const, required });
23
+ const MaxOutputOverride = Type.Object(
24
+ {
25
+ bytes: Type.Optional(
26
+ Type.Integer({ minimum: 1, description: "Max output bytes before truncation." }),
27
+ ),
28
+ lines: Type.Optional(
29
+ Type.Integer({ minimum: 1, description: "Max output lines before truncation." }),
30
+ ),
31
+ },
32
+ {
33
+ additionalProperties: false,
34
+ description: "Final output truncation limits. Defaults: 200KB, 5000 lines.",
35
+ },
36
+ );
9
37
 
10
- const SkillOverride = Type.Unsafe({
11
- anyOf: [
12
- { type: "array", items: { type: "string", minLength: 1 } },
13
- { type: "boolean" },
14
- { type: "string" },
15
- ],
16
- description: "Skill name(s): string, comma-separated string, array, or false to disable",
17
- });
38
+ const ControlOverrides = Type.Object(
39
+ {
40
+ enabled: Type.Optional(
41
+ Type.Boolean({
42
+ description: "Enable/disable subagent control attention tracking for this run",
43
+ }),
44
+ ),
45
+ needsAttentionAfterMs: Type.Optional(
46
+ Type.Integer({
47
+ minimum: 1,
48
+ description:
49
+ "No-activity window (ms) before a run needs attention. Default 600000 (10 min).",
50
+ }),
51
+ ),
52
+ failedToolAttemptsBeforeAttention: Type.Optional(
53
+ Type.Integer({
54
+ minimum: 1,
55
+ description: "Consecutive mutating-tool failures before needs_attention (default: 3)",
56
+ }),
57
+ ),
58
+ notifyOn: Type.Optional(
59
+ Type.Array(Type.Enum(["needs_attention"] as const, { type: "string" }), {
60
+ description:
61
+ "Control event types that should notify the parent/orchestrator. Defaults to needs_attention.",
62
+ }),
63
+ ),
64
+ notifyChannels: Type.Optional(
65
+ Type.Array(Type.Enum(["event", "async", "intercom"] as const, { type: "string" }), {
66
+ description:
67
+ "Notification channels to use when available. Defaults to event, async, and intercom.",
68
+ }),
69
+ ),
70
+ },
71
+ { additionalProperties: false },
72
+ );
18
73
 
19
- const OutputOverride = Type.Unsafe({
20
- anyOf: [
21
- { type: "string", minLength: 1 },
22
- { type: "boolean" },
23
- ],
24
- description: "Output file path, or false to disable file output.",
25
- });
74
+ export const SubagentParams = Type.Object(
75
+ {
76
+ agent: Type.Optional(
77
+ Type.String({
78
+ minLength: 1,
79
+ description:
80
+ "Agent name; on resume/answer, adopt the current profile including model, thinking and fallbacks; a separate model override wins. Otherwise keep saved settings.",
81
+ }),
82
+ ),
83
+ task: Type.Optional(
84
+ Type.String({
85
+ minLength: 1,
86
+ description: "Task (SINGLE mode, optional for self-contained agents)",
87
+ }),
88
+ ),
89
+ label: TaskItem.properties.label,
90
+ // Management action (when present, tool operates in management mode)
91
+ action: Type.Optional(
92
+ Type.Enum([...SUBAGENT_ACTIONS] as const, {
93
+ type: "string",
94
+ description:
95
+ "Management/control action. Omit for execution mode. nudge sends a live intercom nudge to a running child.",
96
+ }),
97
+ ),
98
+ id: Type.Optional(
99
+ Type.String({
100
+ description:
101
+ "Run id or prefix for status/interrupt/extend/resume/nudge/questions/answer/review actions.",
102
+ }),
103
+ ),
104
+ runId: Type.Optional(
105
+ Type.String({
106
+ description:
107
+ "Target run ID; prefer id. Defaults to the most recently active controllable run for interrupt/extend/nudge.",
108
+ }),
109
+ ),
110
+ questionId: AgentRunsValidationParams.properties.questionId,
111
+ decision: Type.Optional(
112
+ Type.Enum(["accepted", "needs_changes"] as const, {
113
+ type: "string",
114
+ description:
115
+ "Parent-only review decision; not sent to the child. Put actionable instructions in resume/nudge. Does not launch work or change runtime acceptance.",
116
+ }),
117
+ ),
118
+ offset: Type.Optional(
119
+ Type.Integer({ minimum: 0, description: "Status list/questions offset." }),
120
+ ),
121
+ limit: AgentRunsValidationParams.properties.limit,
122
+ ...HistoryQueryFields,
123
+ full: Type.Optional(
124
+ Type.Boolean({
125
+ description:
126
+ "Exact status only: include the full task and saved launch configuration; default is concise.",
127
+ }),
128
+ ),
129
+ dir: Type.Optional(
130
+ Type.String({
131
+ description: "Async run directory for status/resume.",
132
+ }),
133
+ ),
134
+ index: Type.Optional(
135
+ Type.Integer({
136
+ minimum: 0,
137
+ description: "Zero-based child index for actions that target a specific child.",
138
+ }),
139
+ ),
140
+ message: Type.Optional(
141
+ Type.String({
142
+ description:
143
+ "Follow-up for resume, nudge text, answer, or parent-only review note. Review notes are not sent to the child; put actionable instructions in resume/nudge. Use index for multi-child runs.",
144
+ }),
145
+ ),
146
+ extendMs: Type.Optional(
147
+ Type.Integer({
148
+ minimum: 1,
149
+ description: "Additional ms for extend; defaults to timeoutMs/maxRuntimeMs.",
150
+ }),
151
+ ),
152
+ // Chain identifier for management (can't reuse 'chain' — that's the execution array)
153
+ chainName: Type.Optional(
154
+ Type.String({
155
+ description: "Chain name for get/update/delete management actions",
156
+ }),
157
+ ),
158
+ // Agent/chain configuration for create/update (nested to avoid conflicts with execution fields)
159
+ config: Type.Optional(
160
+ Type.Unsafe({
161
+ anyOf: [{ type: "object", additionalProperties: true }, { type: "string" }],
162
+ description:
163
+ "Agent or chain config for create/update (object or JSON string). Agent keys: name, package, description, scope ('user'|'project'), systemPrompt, systemPromptMode, inheritProjectContext, inheritSkills, defaultContext, model, tools, allowSubagents, extensions, skills, thinking, output, reads, progress, maxSubagentDepth, maxExecutionTimeMs, maxTokens. Chain keys: name, package, description, scope, steps (array of {agent, task?, output?, outputMode?, reads?, model?, skills?, progress?}). Presence of 'steps' creates a chain.",
164
+ }),
165
+ ),
166
+ tasks: Type.Optional(
167
+ Type.Array(TaskItem, {
168
+ minItems: 1,
169
+ description: "PARALLEL mode: concurrent [{agent, task, ...}] tasks.",
170
+ }),
171
+ ),
172
+ concurrency: Type.Optional(
173
+ Type.Integer({
174
+ minimum: 1,
175
+ description: "PARALLEL mode: max concurrent parallel tasks (default 4).",
176
+ }),
177
+ ),
178
+ timeoutMs: Type.Optional(
179
+ Type.Integer({
180
+ minimum: 1,
181
+ description:
182
+ "Foreground wall-clock timeout (ms); on expiry children are soft-interrupted. When async is omitted, a timeout implies foreground execution; explicit async runs reject it. Short reviewer budgets are raised to a floor; planner/researcher budgets only from run-history data.",
183
+ }),
184
+ ),
185
+ maxRuntimeMs: Type.Optional(
186
+ Type.Integer({
187
+ minimum: 1,
188
+ description: "Alias for timeoutMs; same foreground-only policy.",
189
+ }),
190
+ ),
191
+ maxOutput: Type.Optional(MaxOutputOverride),
192
+ worktree: Type.Optional(
193
+ Type.Boolean({
194
+ description:
195
+ "Isolated git worktrees per parallel task; requires clean git state; per-worktree diffs included.",
196
+ }),
197
+ ),
198
+ chain: Type.Optional(
199
+ Type.Array(ChainItemSchema, {
200
+ minItems: 1,
201
+ description:
202
+ "CHAIN mode: sequential pipeline; each step's response becomes {previous} for the next.",
203
+ }),
204
+ ),
205
+ context: Type.Optional(
206
+ Type.Enum(["fresh", "fork"] as const, {
207
+ type: "string",
208
+ description:
209
+ "'fresh' or 'fork' (branch from parent session); overrides each agent's defaultContext. Fork is rejected for agents whose effective model uses the anthropic/ provider.",
210
+ }),
211
+ ),
212
+ chainDir: Type.Optional(
213
+ Type.String({
214
+ description: "Directory for chain artifacts (default: temp, auto-cleaned after 24h)",
215
+ }),
216
+ ),
217
+ async: Type.Optional(
218
+ Type.Boolean({
219
+ description:
220
+ "Run in background. Stock top-level default: true; set false for foreground execution.",
221
+ }),
222
+ ),
223
+ agentScope: Type.Optional(
224
+ Type.Enum(["user", "project", "both"] as const, {
225
+ type: "string",
226
+ description:
227
+ "Agent discovery scope: 'user', 'project', or 'both' (default; project wins collisions)",
228
+ }),
229
+ ),
230
+ cwd: Type.Optional(Type.String()),
231
+ artifacts: Type.Optional(
232
+ Type.Boolean({ description: "Write debug artifacts (default: true)" }),
233
+ ),
234
+ includeProgress: Type.Optional(
235
+ Type.Boolean({ description: "Include full progress in result (default: false)" }),
236
+ ),
237
+ progress: Type.Optional(
238
+ Type.Boolean({ description: "Enable progress.md tracking for a single agent run" }),
239
+ ),
240
+ share: Type.Optional(
241
+ Type.Boolean({ description: "Upload session to GitHub Gist for sharing (default: false)" }),
242
+ ),
243
+ sessionDir: Type.Optional(
244
+ Type.String({ description: "Directory for session logs (default: temp)" }),
245
+ ),
246
+ // Clarification TUI
247
+ clarify: Type.Optional(
248
+ Type.Boolean({
249
+ description: "Show TUI to preview/edit before execution; explicit true forces foreground.",
250
+ }),
251
+ ),
252
+ control: Type.Optional(ControlOverrides),
253
+ // Solo agent overrides
254
+ output: Type.Optional(
255
+ Type.Unsafe({
256
+ anyOf: [{ type: "string" }, { type: "boolean" }],
257
+ description:
258
+ "Output file for single agent, or false to disable. Relative paths resolve against cwd.",
259
+ }),
260
+ ),
261
+ outputMode: Type.Optional(OutputModeOverride),
262
+ skill: Type.Optional(SkillOverride),
263
+ model: ModelOverride,
264
+ outputSchema: Type.Optional(JsonSchemaObject),
265
+ acceptance: Type.Optional(AcceptanceOverride),
266
+ },
267
+ {
268
+ additionalProperties: false,
269
+ allOf: [
270
+ {
271
+ if: { ...requiredObject("action"), properties: { action: { enum: ["answer"] } } },
26
272
 
27
- const OutputModeOverride = Type.Enum(["inline", "file-only"] as const, {
28
- type: "string",
29
- description: "inline (default) or file-only; file-only requires output to be a path.",
30
- });
273
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
274
+ // oxlint-disable-next-line unicorn/no-thenable
275
+ then: {
276
+ allOf: [
277
+ requiredObject("questionId", "message"),
278
+ { anyOf: [requiredObject("id"), requiredObject("runId")] },
279
+ ],
280
+ },
281
+ },
282
+ {
283
+ if: { ...requiredObject("action"), properties: { action: { enum: ["review"] } } },
31
284
 
32
- const ReadsOverride = Type.Unsafe({
33
- anyOf: [
34
- { type: "array", items: { type: "string", minLength: 1 } },
35
- { type: "boolean" },
36
- ],
37
- description: "Files to read before running, or false to disable",
38
- });
285
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
286
+ // oxlint-disable-next-line unicorn/no-thenable
287
+ then: {
288
+ allOf: [
289
+ requiredObject("decision"),
290
+ { anyOf: [requiredObject("id"), requiredObject("runId")] },
291
+ ],
292
+ },
293
+ },
294
+ {
295
+ not: {
296
+ anyOf: [
297
+ requiredObject("agent", "tasks"),
298
+ requiredObject("agent", "chain"),
299
+ requiredObject("tasks", "chain"),
300
+ requiredObject("cursor", "offset"),
301
+ requiredObject("cursor", "before"),
302
+ ],
303
+ },
304
+ },
305
+ {
306
+ if: requiredObject("decision"),
39
307
 
40
- const MaxOutputOverride = Type.Object({
41
- bytes: Type.Optional(Type.Integer({ minimum: 1, description: "Max output bytes before truncation." })),
42
- lines: Type.Optional(Type.Integer({ minimum: 1, description: "Max output lines before truncation." })),
43
- }, {
44
- additionalProperties: false,
45
- description: "Final output truncation limits. Defaults: 200KB, 5000 lines.",
46
- });
308
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
309
+ // oxlint-disable-next-line unicorn/no-thenable
310
+ then: { ...requiredObject("action"), properties: { action: { enum: ["review"] } } },
311
+ },
312
+ {
313
+ if: { ...requiredObject("action"), properties: { action: { enum: ["history"] } } },
47
314
 
48
- const JsonSchemaObject = Type.Unsafe({
49
- type: "object",
50
- additionalProperties: true,
51
- description: "JSON Schema (object root) for strict structured output.",
52
- });
315
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
316
+ // oxlint-disable-next-line unicorn/no-thenable
317
+ then: { anyOf: [requiredObject("id"), requiredObject("runId")] },
318
+ },
319
+ {
320
+ if: { ...requiredObject("action"), properties: { action: { enum: ["search"] } } },
53
321
 
54
- const AcceptanceEvidenceKind = Type.Enum([
55
- "changed-files",
56
- "tests-added",
57
- "commands-run",
58
- "validation-output",
59
- "residual-risks",
60
- "no-staged-files",
61
- "diff-summary",
62
- "review-findings",
63
- "manual-notes",
64
- ] as const, { type: "string" });
322
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
323
+ // oxlint-disable-next-line unicorn/no-thenable
324
+ then: requiredObject("query"),
325
+ },
326
+ {
327
+ if: requiredObject("offset"),
65
328
 
66
- const AcceptanceGateSchema = Type.Object({
67
- id: Type.String({ minLength: 1 }),
68
- must: Type.String({ minLength: 1 }),
69
- evidence: Type.Optional(Type.Array(AcceptanceEvidenceKind)),
70
- severity: Type.Optional(Type.Enum(["required", "recommended"] as const, { type: "string" })),
71
- }, { additionalProperties: false });
329
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
330
+ // oxlint-disable-next-line unicorn/no-thenable
331
+ then: {
332
+ ...requiredObject("action"),
333
+ properties: { action: { enum: ["status", "questions"] } },
334
+ },
335
+ },
336
+ {
337
+ if: requiredObject("limit"),
338
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
339
+ // oxlint-disable-next-line unicorn/no-thenable
340
+ then: {
341
+ ...requiredObject("action"),
342
+ properties: { action: { enum: ["status", "questions", "history", "search"] } },
343
+ },
344
+ },
345
+ {
346
+ if: requiredObject("cursor"),
72
347
 
73
- const AcceptanceVerifyCommandSchema = Type.Object({
74
- id: Type.String({ minLength: 1 }),
75
- command: Type.String({ minLength: 1 }),
76
- timeoutMs: Type.Optional(Type.Integer({ minimum: 1 })),
77
- cwd: Type.Optional(Type.String()),
78
- env: Type.Optional(Type.Unsafe({ type: "object", additionalProperties: { type: "string" } })),
79
- allowFailure: Type.Optional(Type.Boolean()),
80
- }, { additionalProperties: false });
348
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
349
+ // oxlint-disable-next-line unicorn/no-thenable
350
+ then: {
351
+ ...requiredObject("action"),
352
+ properties: { action: { enum: ["status", "history", "search"] } },
353
+ },
354
+ },
355
+ {
356
+ if: requiredObject("sort"),
81
357
 
82
- export const AcceptanceOverride = Type.Unsafe({
83
- type: "object",
84
- properties: {
85
- criteria: {
86
- type: "array",
87
- items: {
88
- anyOf: [
89
- { type: "string", minLength: 1 },
90
- AcceptanceGateSchema,
91
- ],
92
- },
93
- },
94
- evidence: { type: "array", items: AcceptanceEvidenceKind },
95
- verify: { type: "array", items: AcceptanceVerifyCommandSchema },
96
- stopRules: { type: "array", items: { type: "string", minLength: 1 } },
97
- maxFinalizationTurns: { type: "integer", minimum: 1, maximum: 10 },
98
- },
99
- additionalProperties: false,
100
- description: "Optional acceptance contract. criteria=definition of done, evidence/verify=proof, stopRules=constraints, maxFinalizationTurns=self-review budget; at least one required. no-staged-files requires the entire Git index to be empty, including pre-existing staged paths. Continue/resume/answer overrides apply only to newly started continuations, never to a live child's acceptance. See the pi-subagents skill.",
101
- });
358
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
359
+ // oxlint-disable-next-line unicorn/no-thenable
360
+ then: {
361
+ ...requiredObject("action"),
362
+ properties: { action: { enum: ["status", "search"] } },
363
+ },
364
+ },
365
+ {
366
+ if: {
367
+ allOf: [
368
+ { ...requiredObject("action"), properties: { action: { enum: ["search"] } } },
369
+ requiredObject("index"),
370
+ ],
371
+ },
102
372
 
103
- // The everyday tools use closed acceptance shapes. Advanced callers retain the full contract below.
104
- export const DelegateAcceptance = Type.Object({
105
- criteria: Type.Optional(Type.Array(AcceptanceGateSchema)),
106
- evidence: Type.Optional(Type.Array(AcceptanceEvidenceKind)),
107
- verify: Type.Optional(Type.Array(Type.Object({
108
- ...AcceptanceVerifyCommandSchema.properties,
109
- env: Type.Optional(Type.Array(Type.Object({ name: Type.String({ minLength: 1 }), value: Type.String() }, { additionalProperties: false }))),
110
- }, { additionalProperties: false }))),
111
- stopRules: Type.Optional(Type.Array(Type.String({ minLength: 1 }))),
112
- maxFinalizationTurns: Type.Optional(Type.Integer({ minimum: 1, maximum: 10 })),
113
- }, { additionalProperties: false, description: "Acceptance criteria, evidence, verification commands and stop rules. Criteria use objects; verification environment uses unique name/value pairs. Self-review budget: 1–10 turns." });
373
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
374
+ // oxlint-disable-next-line unicorn/no-thenable
375
+ then: { anyOf: [requiredObject("id"), requiredObject("runId")] },
376
+ },
377
+ {
378
+ if: { anyOf: [requiredObject("state"), requiredObject("text")] },
114
379
 
115
- const ModelOverride = Type.Optional(Type.String({
116
- description: 'Profiles are defaults; warranted overrides are allowed subject to user instructions and provider authorization. Use model: "provider/model:high" to pin route/effort (no profile fallbacks; same-choice transport retries remain). Omit for profile fallbacks. No standalone thinking argument.',
117
- }));
380
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
381
+ // oxlint-disable-next-line unicorn/no-thenable
382
+ then: { ...requiredObject("action"), properties: { action: { enum: ["status"] } } },
383
+ },
384
+ {
385
+ if: requiredObject("query"),
118
386
 
119
- const TaskItem = Type.Object({
120
- agent: Type.String({ minLength: 1 }),
121
- task: Type.String({ minLength: 1 }),
122
- label: Type.Optional(Type.String({ minLength: 1, description: "Short task label for the Agents strip and conversation." })),
123
- cwd: Type.Optional(Type.String()),
124
- count: Type.Optional(Type.Integer({ minimum: 1, description: "Repeat this parallel task N times." })),
125
- outputSchema: Type.Optional(JsonSchemaObject),
126
- output: Type.Optional(OutputOverride),
127
- outputMode: Type.Optional(OutputModeOverride),
128
- reads: Type.Optional(ReadsOverride),
129
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking for this task" })),
130
- model: ModelOverride,
131
- skill: Type.Optional(SkillOverride),
132
- acceptance: Type.Optional(AcceptanceOverride),
133
- }, { additionalProperties: false });
387
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
388
+ // oxlint-disable-next-line unicorn/no-thenable
389
+ then: { ...requiredObject("action"), properties: { action: { enum: ["search"] } } },
390
+ },
391
+ {
392
+ if: requiredObject("before"),
134
393
 
135
- // Parallel task item (within a parallel step)
136
- const ParallelTaskSchema = Type.Object({
137
- agent: Type.String({ minLength: 1 }),
138
- task: Type.Optional(Type.String({ minLength: 1, description: "Task template with {task}, {previous}, {chain_dir} variables. Defaults to {previous}." })),
139
- phase: Type.Optional(Type.String({ description: "Phase/group label for status and graph rendering." })),
140
- label: Type.Optional(Type.String({ description: "User-facing label for this parallel task." })),
141
- as: Type.Optional(Type.String({ description: "Safe identifier used as {outputs.name} in later chain steps." })),
142
- outputSchema: Type.Optional(JsonSchemaObject),
143
- cwd: Type.Optional(Type.String()),
144
- count: Type.Optional(Type.Integer({ minimum: 1, description: "Repeat this parallel task N times." })),
145
- output: Type.Optional(OutputOverride),
146
- outputMode: Type.Optional(OutputModeOverride),
147
- reads: Type.Optional(ReadsOverride),
148
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking in {chain_dir}" })),
149
- skill: Type.Optional(SkillOverride),
150
- model: ModelOverride,
151
- acceptance: Type.Optional(AcceptanceOverride),
152
- }, { additionalProperties: false });
394
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
395
+ // oxlint-disable-next-line unicorn/no-thenable
396
+ then: { ...requiredObject("action"), properties: { action: { enum: ["history"] } } },
397
+ },
398
+ {
399
+ if: { ...requiredObject("action"), properties: { action: { enum: ["status"] } } },
153
400
 
154
- const DynamicExpandSchema = Type.Object({
155
- from: Type.Object({
156
- output: Type.String({ description: "Prior named structured output to expand from." }),
157
- path: Type.String({ description: "JSON Pointer into the structured output, e.g. /items." }),
158
- }, { additionalProperties: false }),
159
- item: Type.Optional(Type.String({ description: "Template variable name for each item. Defaults to item." })),
160
- key: Type.Optional(Type.String({ description: "JSON Pointer relative to each item for stable child ids." })),
161
- maxItems: Type.Optional(Type.Integer({ minimum: 0, description: "Required fanout bound unless configured globally." })),
162
- onEmpty: Type.Optional(Type.Enum(["skip", "fail"] as const, { type: "string", description: "Empty input behavior. Defaults to skip." })),
163
- }, { additionalProperties: false });
401
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
402
+ // oxlint-disable-next-line unicorn/no-thenable
403
+ then: { properties: { sort: { enum: ["attention", "newest", "oldest"] } } },
404
+ },
405
+ {
406
+ if: { ...requiredObject("action"), properties: { action: { enum: ["search"] } } },
164
407
 
165
- const DynamicParallelTemplateSchema = Type.Object({
166
- agent: Type.String({ minLength: 1 }),
167
- task: Type.Optional(Type.String({ minLength: 1, description: "Task template with {item}, {item.path}, {task}, {previous}, {chain_dir}, {outputs.name} variables." })),
168
- phase: Type.Optional(Type.String({ description: "Phase/group label for status and graph rendering." })),
169
- label: Type.Optional(Type.String({ description: "User-facing label; item templates supported." })),
170
- outputSchema: Type.Optional(JsonSchemaObject),
171
- cwd: Type.Optional(Type.String()),
172
- output: Type.Optional(OutputOverride),
173
- outputMode: Type.Optional(OutputModeOverride),
174
- reads: Type.Optional(ReadsOverride),
175
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking in {chain_dir}" })),
176
- skill: Type.Optional(SkillOverride),
177
- model: ModelOverride,
178
- acceptance: Type.Optional(AcceptanceOverride),
179
- }, { additionalProperties: false });
408
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
409
+ // oxlint-disable-next-line unicorn/no-thenable
410
+ then: { properties: { sort: { enum: ["relevance", "newest"] } } },
411
+ },
412
+ {
413
+ if: requiredObject("full"),
180
414
 
181
- const DynamicCollectSchema = Type.Object({
182
- as: Type.String({ description: "Safe output name for the ordered collected result array." }),
183
- outputSchema: Type.Optional(JsonSchemaObject),
184
- }, { additionalProperties: false });
415
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
416
+ // oxlint-disable-next-line unicorn/no-thenable
417
+ then: {
418
+ allOf: [
419
+ { ...requiredObject("action"), properties: { action: { enum: ["status"] } } },
420
+ { anyOf: [requiredObject("id"), requiredObject("runId"), requiredObject("dir")] },
421
+ ],
422
+ },
423
+ },
424
+ {
425
+ if: requiredObject("worktree"),
426
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
427
+ // oxlint-disable-next-line unicorn/no-thenable
428
+ then: requiredObject("tasks"),
429
+ },
430
+ {
431
+ if: requiredObject("concurrency"),
432
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
433
+ // oxlint-disable-next-line unicorn/no-thenable
434
+ then: requiredObject("tasks"),
435
+ },
436
+ {
437
+ if: requiredObject("chainDir"),
438
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
439
+ // oxlint-disable-next-line unicorn/no-thenable
440
+ then: requiredObject("chain"),
441
+ },
442
+ {
443
+ if: {
444
+ anyOf: [
445
+ requiredObject("output"),
446
+ requiredObject("outputMode"),
447
+ requiredObject("skill"),
448
+ requiredObject("model"),
449
+ requiredObject("outputSchema"),
450
+ requiredObject("progress"),
451
+ ],
452
+ },
185
453
 
186
- // Flattened so chain steps do not need an object-shape anyOf/oneOf union.
187
- export const ChainItemSchema = Type.Object({
188
- agent: Type.Optional(Type.String({ minLength: 1, description: "Sequential step agent name" })),
189
- task: Type.Optional(Type.String({
190
- minLength: 1,
191
- description: "Task template: {task}=original request, {previous}=prior step response, {chain_dir}=shared folder, {outputs.name}=prior named output. Required for first step; defaults to '{previous}'."
192
- })),
193
- phase: Type.Optional(Type.String({ description: "Phase/group label for status and graph rendering." })),
194
- label: Type.Optional(Type.String({ description: "User-facing label for this chain step." })),
195
- as: Type.Optional(Type.String({ description: "Safe identifier used as {outputs.name} in later chain steps." })),
196
- outputSchema: Type.Optional(JsonSchemaObject),
197
- cwd: Type.Optional(Type.String()),
198
- output: Type.Optional(OutputOverride),
199
- outputMode: Type.Optional(OutputModeOverride),
200
- reads: Type.Optional(ReadsOverride),
201
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking in {chain_dir}" })),
202
- skill: Type.Optional(SkillOverride),
203
- model: ModelOverride,
204
- acceptance: Type.Optional(AcceptanceOverride),
205
- parallel: Type.Optional(Type.Unsafe({
206
- anyOf: [
207
- Type.Array(ParallelTaskSchema, { minItems: 1, description: "Tasks to run in parallel" }),
208
- DynamicParallelTemplateSchema,
209
- ],
210
- description: "Static parallel tasks array, or a single dynamic fanout child template when expand/collect are present.",
211
- })),
212
- expand: Type.Optional(DynamicExpandSchema),
213
- collect: Type.Optional(DynamicCollectSchema),
214
- concurrency: Type.Optional(Type.Integer({ minimum: 1, description: "Max concurrent tasks (default: 4)" })),
215
- failFast: Type.Optional(Type.Boolean({ description: "Stop on first failure (default: false)" })),
216
- worktree: Type.Optional(Type.Boolean({
217
- description: "Create isolated git worktrees for each parallel task."
218
- })),
219
- }, {
220
- description: "Chain step: {agent, task?} sequential, {parallel: [...]} concurrent, or {expand, parallel: {...}, collect} dynamic fanout.",
221
- additionalProperties: false,
222
- allOf: [
223
- { anyOf: [requiredObject("agent"), requiredObject("parallel")] },
224
- { not: { anyOf: [
225
- requiredObject("agent", "parallel"),
226
- { ...requiredObject("expand"), properties: { parallel: { type: "array", items: {} } } },
227
- ] } },
228
- { if: requiredObject("expand"), then: { ...requiredObject("parallel", "collect"), properties: { parallel: { type: "object" } } } },
229
- { if: requiredObject("collect"), then: { ...requiredObject("expand", "parallel"), properties: { parallel: { type: "object" } } } },
230
- { if: { ...requiredObject("parallel"), properties: { parallel: { type: "object" } } }, then: requiredObject("expand", "collect") },
231
- { if: requiredObject("agent"), then: { not: { anyOf: [requiredObject("concurrency"), requiredObject("failFast"), requiredObject("worktree")] } } },
232
- { if: { ...requiredObject("parallel"), properties: { parallel: { type: "array", items: {} } } }, then: { not: { anyOf: [
233
- requiredObject("task"), requiredObject("phase"), requiredObject("label"), requiredObject("as"), requiredObject("outputSchema"),
234
- requiredObject("output"), requiredObject("outputMode"), requiredObject("reads"), requiredObject("progress"),
235
- requiredObject("skill"), requiredObject("model"), requiredObject("acceptance"), requiredObject("expand"), requiredObject("collect"),
236
- ] } } },
237
- { if: { ...requiredObject("parallel"), properties: { parallel: { type: "object" } } }, then: { not: { anyOf: [
238
- requiredObject("task"), requiredObject("as"), requiredObject("outputSchema"), requiredObject("cwd"), requiredObject("output"),
239
- requiredObject("outputMode"), requiredObject("reads"), requiredObject("progress"), requiredObject("skill"),
240
- requiredObject("model"), requiredObject("acceptance"), requiredObject("worktree"),
241
- ] } } },
242
- ],
243
- });
454
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
455
+ // oxlint-disable-next-line unicorn/no-thenable
456
+ then: {
457
+ anyOf: [
458
+ requiredObject("agent"),
459
+ { ...requiredObject("action"), properties: { action: { enum: ["resume", "answer"] } } },
460
+ ],
461
+ },
462
+ },
463
+ {
464
+ if: requiredObject("acceptance"),
244
465
 
245
- const ControlOverrides = Type.Object({
246
- enabled: Type.Optional(Type.Boolean({ description: "Enable/disable subagent control attention tracking for this run" })),
247
- needsAttentionAfterMs: Type.Optional(Type.Integer({ minimum: 1, description: "No-activity window (ms) before a run needs attention. Default 600000 (10 min)." })),
248
- failedToolAttemptsBeforeAttention: Type.Optional(Type.Integer({ minimum: 1, description: "Consecutive mutating-tool failures before needs_attention (default: 3)" })),
249
- notifyOn: Type.Optional(Type.Array(Type.Enum(["needs_attention"] as const, { type: "string" }), {
250
- description: "Control event types that should notify the parent/orchestrator. Defaults to needs_attention.",
251
- })),
252
- notifyChannels: Type.Optional(Type.Array(Type.Enum(["event", "async", "intercom"] as const, { type: "string" }), {
253
- description: "Notification channels to use when available. Defaults to event, async, and intercom.",
254
- })),
255
- }, { additionalProperties: false });
256
-
257
- export const DelegateParams = Type.Object({
258
- agent: TaskItem.properties.agent,
259
- task: TaskItem.properties.task,
260
- label: TaskItem.properties.label,
261
- cwd: TaskItem.properties.cwd,
262
- model: TaskItem.properties.model,
263
- context: Type.Optional(Type.Enum(["fresh", "fork"] as const, { type: "string", description: "Override the profile's context policy." })),
264
- async: Type.Optional(Type.Boolean({ description: "Background by default; false waits for the result." })),
265
- worktree: Type.Optional(Type.Boolean({ description: "Isolate this writer in a Git worktree; return its patch. Requires a clean checkout." })),
266
- output: TaskItem.properties.output,
267
- acceptance: Type.Optional(DelegateAcceptance),
268
- }, { additionalProperties: false });
269
-
270
- const HistoryQueryFields = {
271
- cursor: Type.Optional(Type.String({ minLength: 1, description: "Opaque page cursor returned by list/history/search; expires when the indexed snapshot changes." })),
272
- sort: Type.Optional(Type.Enum(["attention", "newest", "oldest", "relevance"] as const, { type: "string", description: "List: attention (default), newest, oldest. Search: relevance (default), newest." })),
273
- state: Type.Optional(Type.Enum(["live", "completed", "failed", "blocked", "paused", "unknown"] as const, { type: "string", description: "List only: execution-state filter, applied before paging." })),
274
- text: Type.Optional(Type.String({ minLength: 1, description: "List only: filter saved task/assignment text before paging." })),
275
- query: Type.Optional(Type.String({ minLength: 1, description: 'Search visible saved text using 1–12 lexical words (all must match) or one double-quoted phrase. Operators, punctuation and prefixes are rejected. Thinking, images, tool arguments and hidden data are excluded.' })),
276
- before: Type.Optional(Type.Integer({ minimum: 1, description: "History only: exclusive native-entry position returned by the earlier page; omit for the latest page." })),
277
- };
278
-
279
- export const AgentRunsValidationParams = Type.Object({
280
- action: Type.Enum(["list", "inspect", "history", "search", "nudge", "stop", "continue", "profiles", "questions", "answer", "review"] as const, { type: "string" }),
281
- id: Type.Optional(Type.String({ minLength: 1, description: "Run ID or unambiguous prefix." })),
282
- questionId: Type.Optional(Type.String({ minLength: 1, description: "Durable supervisor question ID for exact questions lookup or answer." })),
283
- async: Type.Optional(Type.Boolean({ description: "Continue/answer: false waits for the actual continuation result." })),
284
- index: Type.Optional(Type.Integer({ minimum: 0, description: "Child index for a multi-child run." })),
285
- message: Type.Optional(Type.String({ minLength: 1, description: "Guidance, follow-up, answer, or optional parent-only review note. Review notes are not sent to the child; put actionable instructions in continue/nudge. Only continue/answer can start a saved child." })),
286
- decision: Type.Optional(Type.Enum(["accepted", "needs_changes"] as const, { type: "string", description: "Parent-only review outcome; not sent to the child. Separate from execution and runtime acceptance checks." })),
287
- offset: Type.Optional(Type.Integer({ minimum: 0, description: "List/questions offset; history is retained regardless of page size." })),
288
- limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 100, description: "Results per list/questions/search/history page (default 20; history 100)." })),
289
- ...HistoryQueryFields,
290
- full: Type.Optional(Type.Boolean({ description: "Inspect only: include the full task and saved launch configuration. Default is a concise report; stored data is unchanged." })),
291
- agent: Type.Optional(Type.String({ minLength: 1, description: "List/search: filter by child agent. Continue/answer: adopt this current profile, including model, thinking and fallbacks; a separate model override wins. Otherwise keep saved settings. Required for old runs without a saved profile." })),
292
- model: TaskItem.properties.model,
293
- cwd: TaskItem.properties.cwd,
294
- output: TaskItem.properties.output,
295
- acceptance: TaskItem.properties.acceptance,
296
- }, {
297
- additionalProperties: false,
298
- allOf: [
299
- { if: { properties: { action: { enum: ["inspect", "history", "nudge", "stop", "continue", "answer", "review"] } } }, then: requiredObject("id") },
300
- { if: { properties: { action: { enum: ["search"] } } }, then: requiredObject("query") },
301
- { if: { properties: { action: { enum: ["nudge", "continue", "answer"] } } }, then: requiredObject("message") },
302
- { if: { properties: { action: { enum: ["answer"] } } }, then: requiredObject("questionId") },
303
- { if: { properties: { action: { enum: ["review"] } } }, then: requiredObject("decision") },
304
- { if: { anyOf: [requiredObject("async"), requiredObject("model"), requiredObject("cwd"), requiredObject("output"), requiredObject("acceptance")] }, then: { properties: { action: { enum: ["continue", "answer"] } } } },
305
- { if: requiredObject("agent"), then: { properties: { action: { enum: ["list", "search", "continue", "answer"] } } } },
306
- { if: requiredObject("offset"), then: { properties: { action: { enum: ["list", "questions"] } } } },
307
- { if: requiredObject("limit"), then: { properties: { action: { enum: ["list", "questions", "history", "search"] } } } },
308
- { if: requiredObject("cursor"), then: { properties: { action: { enum: ["list", "history", "search"] } } } },
309
- { if: requiredObject("sort"), then: { properties: { action: { enum: ["list", "search"] } } } },
310
- { not: { anyOf: [requiredObject("cursor", "offset"), requiredObject("cursor", "before")] } },
311
- { if: { allOf: [{ properties: { action: { enum: ["search"] } } }, requiredObject("index")] }, then: requiredObject("id") },
312
- { if: { anyOf: [requiredObject("state"), requiredObject("text")] }, then: { properties: { action: { enum: ["list"] } } } },
313
- { if: requiredObject("query"), then: { properties: { action: { enum: ["search"] } } } },
314
- { if: requiredObject("before"), then: { properties: { action: { enum: ["history"] } } } },
315
- { if: { properties: { action: { enum: ["list"] } } }, then: { properties: { sort: { enum: ["attention", "newest", "oldest"] } } } },
316
- { if: { properties: { action: { enum: ["search"] } } }, then: { properties: { sort: { enum: ["relevance", "newest"] } } } },
317
- { if: requiredObject("decision"), then: { properties: { action: { enum: ["review"] } } } },
318
- { if: requiredObject("full"), then: { properties: { action: { enum: ["inspect"] } } } },
319
- ],
320
- });
321
-
322
- export const AgentRunsParams = Type.Object({
323
- ...AgentRunsValidationParams.properties,
324
- acceptance: Type.Optional(DelegateAcceptance),
325
- }, { additionalProperties: false });
326
-
327
- export const SubagentParams = Type.Object({
328
- agent: Type.Optional(Type.String({ minLength: 1, description: "Agent name; on resume/answer, adopt the current profile including model, thinking and fallbacks; a separate model override wins. Otherwise keep saved settings." })),
329
- task: Type.Optional(Type.String({ minLength: 1, description: "Task (SINGLE mode, optional for self-contained agents)" })),
330
- label: TaskItem.properties.label,
331
- // Management action (when present, tool operates in management mode)
332
- action: Type.Optional(Type.Enum([...SUBAGENT_ACTIONS] as const, {
333
- type: "string",
334
- description: "Management/control action. Omit for execution mode. nudge sends a live intercom nudge to a running child."
335
- })),
336
- id: Type.Optional(Type.String({
337
- description: "Run id or prefix for status/interrupt/extend/resume/nudge/questions/answer/review actions."
338
- })),
339
- runId: Type.Optional(Type.String({
340
- description: "Target run ID; prefer id. Defaults to the most recently active controllable run for interrupt/extend/nudge."
341
- })),
342
- questionId: AgentRunsValidationParams.properties.questionId,
343
- decision: Type.Optional(Type.Enum(["accepted", "needs_changes"] as const, { type: "string", description: "Parent-only review decision; not sent to the child. Put actionable instructions in resume/nudge. Does not launch work or change runtime acceptance." })),
344
- offset: Type.Optional(Type.Integer({ minimum: 0, description: "Status list/questions offset." })),
345
- limit: AgentRunsValidationParams.properties.limit,
346
- ...HistoryQueryFields,
347
- full: Type.Optional(Type.Boolean({ description: "Exact status only: include the full task and saved launch configuration; default is concise." })),
348
- dir: Type.Optional(Type.String({
349
- description: "Async run directory for status/resume."
350
- })),
351
- index: Type.Optional(Type.Integer({ minimum: 0, description: "Zero-based child index for actions that target a specific child." })),
352
- message: Type.Optional(Type.String({ description: "Follow-up for resume, nudge text, answer, or parent-only review note. Review notes are not sent to the child; put actionable instructions in resume/nudge. Use index for multi-child runs." })),
353
- extendMs: Type.Optional(Type.Integer({ minimum: 1, description: "Additional ms for extend; defaults to timeoutMs/maxRuntimeMs." })),
354
- // Chain identifier for management (can't reuse 'chain' — that's the execution array)
355
- chainName: Type.Optional(Type.String({
356
- description: "Chain name for get/update/delete management actions"
357
- })),
358
- // Agent/chain configuration for create/update (nested to avoid conflicts with execution fields)
359
- config: Type.Optional(Type.Unsafe({
360
- anyOf: [
361
- { type: "object", additionalProperties: true },
362
- { type: "string" },
363
- ],
364
- description: "Agent or chain config for create/update (object or JSON string). Agent keys: name, package, description, scope ('user'|'project'), systemPrompt, systemPromptMode, inheritProjectContext, inheritSkills, defaultContext, model, tools, allowSubagents, extensions, skills, thinking, output, reads, progress, maxSubagentDepth, maxExecutionTimeMs, maxTokens. Chain keys: name, package, description, scope, steps (array of {agent, task?, output?, outputMode?, reads?, model?, skills?, progress?}). Presence of 'steps' creates a chain."
365
- })),
366
- tasks: Type.Optional(Type.Array(TaskItem, { minItems: 1, description: "PARALLEL mode: concurrent [{agent, task, ...}] tasks." })),
367
- concurrency: Type.Optional(Type.Integer({ minimum: 1, description: "PARALLEL mode: max concurrent parallel tasks (default 4)." })),
368
- timeoutMs: Type.Optional(Type.Integer({ minimum: 1, description: "Foreground wall-clock timeout (ms); on expiry children are soft-interrupted. When async is omitted, a timeout implies foreground execution; explicit async runs reject it. Short reviewer budgets are raised to a floor; planner/researcher budgets only from run-history data." })),
369
- maxRuntimeMs: Type.Optional(Type.Integer({ minimum: 1, description: "Alias for timeoutMs; same foreground-only policy." })),
370
- maxOutput: Type.Optional(MaxOutputOverride),
371
- worktree: Type.Optional(Type.Boolean({
372
- description: "Isolated git worktrees per parallel task; requires clean git state; per-worktree diffs included."
373
- })),
374
- chain: Type.Optional(Type.Array(ChainItemSchema, { minItems: 1, description: "CHAIN mode: sequential pipeline; each step's response becomes {previous} for the next." })),
375
- context: Type.Optional(Type.Enum(["fresh", "fork"] as const, {
376
- type: "string",
377
- description: "'fresh' or 'fork' (branch from parent session); overrides each agent's defaultContext. Fork is rejected for agents whose effective model uses the anthropic/ provider.",
378
- })),
379
- chainDir: Type.Optional(Type.String({ description: "Directory for chain artifacts (default: temp, auto-cleaned after 24h)" })),
380
- async: Type.Optional(Type.Boolean({ description: "Run in background. Stock top-level default: true; set false for foreground execution." })),
381
- agentScope: Type.Optional(Type.Enum(["user", "project", "both"] as const, { type: "string", description: "Agent discovery scope: 'user', 'project', or 'both' (default; project wins collisions)" })),
382
- cwd: Type.Optional(Type.String()),
383
- artifacts: Type.Optional(Type.Boolean({ description: "Write debug artifacts (default: true)" })),
384
- includeProgress: Type.Optional(Type.Boolean({ description: "Include full progress in result (default: false)" })),
385
- progress: Type.Optional(Type.Boolean({ description: "Enable progress.md tracking for a single agent run" })),
386
- share: Type.Optional(Type.Boolean({ description: "Upload session to GitHub Gist for sharing (default: false)" })),
387
- sessionDir: Type.Optional(
388
- Type.String({ description: "Directory for session logs (default: temp)" }),
389
- ),
390
- // Clarification TUI
391
- clarify: Type.Optional(Type.Boolean({ description: "Show TUI to preview/edit before execution; explicit true forces foreground." })),
392
- control: Type.Optional(ControlOverrides),
393
- // Solo agent overrides
394
- output: Type.Optional(Type.Unsafe({
395
- anyOf: [
396
- { type: "string" },
397
- { type: "boolean" },
398
- ],
399
- description: "Output file for single agent, or false to disable. Relative paths resolve against cwd.",
400
- })),
401
- outputMode: Type.Optional(OutputModeOverride),
402
- skill: Type.Optional(SkillOverride),
403
- model: ModelOverride,
404
- outputSchema: Type.Optional(JsonSchemaObject),
405
- acceptance: Type.Optional(AcceptanceOverride),
406
- }, {
407
- additionalProperties: false,
408
- allOf: [
409
- { if: { ...requiredObject("action"), properties: { action: { enum: ["answer"] } } }, then: { allOf: [requiredObject("questionId", "message"), { anyOf: [requiredObject("id"), requiredObject("runId")] }] } },
410
- { if: { ...requiredObject("action"), properties: { action: { enum: ["review"] } } }, then: { allOf: [requiredObject("decision"), { anyOf: [requiredObject("id"), requiredObject("runId")] }] } },
411
- { not: { anyOf: [
412
- requiredObject("agent", "tasks"),
413
- requiredObject("agent", "chain"),
414
- requiredObject("tasks", "chain"),
415
- requiredObject("cursor", "offset"),
416
- requiredObject("cursor", "before"),
417
- ] } },
418
- { if: requiredObject("decision"), then: { ...requiredObject("action"), properties: { action: { enum: ["review"] } } } },
419
- { if: { ...requiredObject("action"), properties: { action: { enum: ["history"] } } }, then: { anyOf: [requiredObject("id"), requiredObject("runId")] } },
420
- { if: { ...requiredObject("action"), properties: { action: { enum: ["search"] } } }, then: requiredObject("query") },
421
- { if: requiredObject("offset"), then: { ...requiredObject("action"), properties: { action: { enum: ["status", "questions"] } } } },
422
- { if: requiredObject("limit"), then: { ...requiredObject("action"), properties: { action: { enum: ["status", "questions", "history", "search"] } } } },
423
- { if: requiredObject("cursor"), then: { ...requiredObject("action"), properties: { action: { enum: ["status", "history", "search"] } } } },
424
- { if: requiredObject("sort"), then: { ...requiredObject("action"), properties: { action: { enum: ["status", "search"] } } } },
425
- { if: { allOf: [{ ...requiredObject("action"), properties: { action: { enum: ["search"] } } }, requiredObject("index")] }, then: { anyOf: [requiredObject("id"), requiredObject("runId")] } },
426
- { if: { anyOf: [requiredObject("state"), requiredObject("text")] }, then: { ...requiredObject("action"), properties: { action: { enum: ["status"] } } } },
427
- { if: requiredObject("query"), then: { ...requiredObject("action"), properties: { action: { enum: ["search"] } } } },
428
- { if: requiredObject("before"), then: { ...requiredObject("action"), properties: { action: { enum: ["history"] } } } },
429
- { if: { ...requiredObject("action"), properties: { action: { enum: ["status"] } } }, then: { properties: { sort: { enum: ["attention", "newest", "oldest"] } } } },
430
- { if: { ...requiredObject("action"), properties: { action: { enum: ["search"] } } }, then: { properties: { sort: { enum: ["relevance", "newest"] } } } },
431
- { if: requiredObject("full"), then: { allOf: [{ ...requiredObject("action"), properties: { action: { enum: ["status"] } } }, { anyOf: [requiredObject("id"), requiredObject("runId"), requiredObject("dir")] }] } },
432
- { if: requiredObject("worktree"), then: requiredObject("tasks") },
433
- { if: requiredObject("concurrency"), then: requiredObject("tasks") },
434
- { if: requiredObject("chainDir"), then: requiredObject("chain") },
435
- { if: { anyOf: [
436
- requiredObject("output"), requiredObject("outputMode"), requiredObject("skill"), requiredObject("model"),
437
- requiredObject("outputSchema"), requiredObject("progress"),
438
- ] }, then: { anyOf: [requiredObject("agent"), { ...requiredObject("action"), properties: { action: { enum: ["resume", "answer"] } } }] } },
439
- { if: requiredObject("acceptance"), then: { anyOf: [
440
- requiredObject("agent"),
441
- { ...requiredObject("action"), properties: { action: { enum: ["resume", "answer"] } } },
442
- ] } },
443
- ],
444
- });
466
+ // JSON Schema's non-callable consequence keyword is not a Promise method.
467
+ // oxlint-disable-next-line unicorn/no-thenable
468
+ then: {
469
+ anyOf: [
470
+ requiredObject("agent"),
471
+ { ...requiredObject("action"), properties: { action: { enum: ["resume", "answer"] } } },
472
+ ],
473
+ },
474
+ },
475
+ ],
476
+ },
477
+ );