@fitchmultz/pi-subagents 0.44.7 → 0.45.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 (947) hide show
  1. package/CHANGELOG.md +258 -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 +79 -0
  111. package/dist/pi-intercom/bridge-http.js +86 -0
  112. package/dist/pi-intercom/bridge-protocol.js +106 -0
  113. package/dist/pi-intercom/bridge-routes.js +64 -0
  114. package/dist/pi-intercom/bridge-session.js +416 -0
  115. package/dist/pi-intercom/bridge.js +182 -603
  116. package/dist/pi-intercom/broker/broker.js +236 -244
  117. package/dist/pi-intercom/broker/client.js +189 -304
  118. package/dist/pi-intercom/broker/connection.js +165 -0
  119. package/dist/pi-intercom/broker/framing.js +5 -3
  120. package/dist/pi-intercom/broker/paths.js +4 -1
  121. package/dist/pi-intercom/broker/pid.js +53 -25
  122. package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
  123. package/dist/pi-intercom/broker/snapshots.js +188 -0
  124. package/dist/pi-intercom/broker/spawn.js +36 -25
  125. package/dist/pi-intercom/config.js +85 -71
  126. package/dist/pi-intercom/connection.js +297 -0
  127. package/dist/pi-intercom/identity.js +58 -0
  128. package/dist/pi-intercom/inbound-delivery.js +356 -0
  129. package/dist/pi-intercom/inbound-journal.js +303 -0
  130. package/dist/pi-intercom/inbound-record.js +113 -0
  131. package/dist/pi-intercom/inbound.js +179 -0
  132. package/dist/pi-intercom/index.js +79 -2933
  133. package/dist/pi-intercom/inspection.js +62 -0
  134. package/dist/pi-intercom/interview.js +236 -0
  135. package/dist/pi-intercom/lifecycle.js +168 -0
  136. package/dist/pi-intercom/message-format.js +69 -0
  137. package/dist/pi-intercom/outbound.js +304 -0
  138. package/dist/pi-intercom/peer-awareness.js +66 -0
  139. package/dist/pi-intercom/reply-tracker.js +62 -43
  140. package/dist/pi-intercom/reply-wait.js +201 -0
  141. package/dist/pi-intercom/runtime-types.js +3 -0
  142. package/dist/pi-intercom/session-events.js +180 -0
  143. package/dist/pi-intercom/session-targets.js +42 -34
  144. package/dist/pi-intercom/subagent-events.js +238 -0
  145. package/dist/pi-intercom/subagent-live-events.js +129 -86
  146. package/dist/pi-intercom/supervisor.js +282 -0
  147. package/dist/pi-intercom/tool-arguments.js +74 -0
  148. package/dist/pi-intercom/tool-registration.js +95 -0
  149. package/dist/pi-intercom/tool-results.js +38 -0
  150. package/dist/pi-intercom/tool-schemas.js +82 -0
  151. package/dist/pi-intercom/tools.js +51 -0
  152. package/dist/pi-intercom/topic-actions.js +177 -0
  153. package/dist/pi-intercom/topics.js +177 -92
  154. package/dist/pi-intercom/transport.js +1 -0
  155. package/dist/pi-intercom/types.js +151 -114
  156. package/dist/pi-intercom/ui/compose-paste.js +93 -0
  157. package/dist/pi-intercom/ui/compose.js +121 -143
  158. package/dist/pi-intercom/ui/inline-message.js +59 -59
  159. package/dist/pi-intercom/ui/message-renderers.js +147 -0
  160. package/dist/pi-intercom/ui/overlay.js +181 -0
  161. package/dist/pi-intercom/ui/session-format.js +124 -0
  162. package/dist/pi-intercom/ui/session-list.js +76 -43
  163. package/dist/pi-intercom/ui/tool-renderers.js +110 -0
  164. package/dist/pi-intercom/ui/topic-view.js +88 -0
  165. package/dist/pi-intercom/validation.js +59 -0
  166. package/dist/runs/background/async-chain-plan.js +265 -0
  167. package/dist/runs/background/async-control.js +134 -58
  168. package/dist/runs/background/async-execution.js +136 -633
  169. package/dist/runs/background/async-job-admission.js +40 -0
  170. package/dist/runs/background/async-job-projection.js +169 -0
  171. package/dist/runs/background/async-job-tracker.js +297 -327
  172. package/dist/runs/background/async-launch.js +216 -0
  173. package/dist/runs/background/async-plan.js +116 -0
  174. package/dist/runs/background/async-result-file.js +47 -23
  175. package/dist/runs/background/async-resume.js +195 -253
  176. package/dist/runs/background/async-run-discovery.js +213 -0
  177. package/dist/runs/background/async-run-location.js +135 -0
  178. package/dist/runs/background/async-run-record.js +1 -0
  179. package/dist/runs/background/async-run-repair.js +223 -0
  180. package/dist/runs/background/async-run-summary.js +1 -0
  181. package/dist/runs/background/async-single-plan.js +105 -0
  182. package/dist/runs/background/async-status-projection.js +155 -0
  183. package/dist/runs/background/async-status-render.js +117 -0
  184. package/dist/runs/background/async-status-validation.js +181 -0
  185. package/dist/runs/background/async-status.js +3 -442
  186. package/dist/runs/background/async-value.js +21 -0
  187. package/dist/runs/background/completion-dedupe.js +36 -12
  188. package/dist/runs/background/completion-delivery.js +211 -205
  189. package/dist/runs/background/completion-receipts.js +237 -0
  190. package/dist/runs/background/legacy-status-acceptance.js +34 -0
  191. package/dist/runs/background/notify.js +96 -48
  192. package/dist/runs/background/parallel-groups.js +36 -19
  193. package/dist/runs/background/result-payload.js +178 -0
  194. package/dist/runs/background/result-watcher.js +348 -339
  195. package/dist/runs/background/run-id-resolver.js +53 -33
  196. package/dist/runs/background/run-schemas.js +189 -0
  197. package/dist/runs/background/run-status-contracts.js +14 -0
  198. package/dist/runs/background/run-status-render.js +270 -0
  199. package/dist/runs/background/run-status.js +231 -339
  200. package/dist/runs/background/runner-attempt-output.js +155 -0
  201. package/dist/runs/background/runner-attempt.js +263 -0
  202. package/dist/runs/background/runner-child-executor.js +166 -0
  203. package/dist/runs/background/runner-child-observer.js +192 -0
  204. package/dist/runs/background/runner-completion-summary.js +71 -0
  205. package/dist/runs/background/runner-completion.js +211 -0
  206. package/dist/runs/background/runner-config.js +1 -0
  207. package/dist/runs/background/runner-contract.js +1 -0
  208. package/dist/runs/background/runner-dynamic.js +121 -0
  209. package/dist/runs/background/runner-finalization.js +149 -0
  210. package/dist/runs/background/runner-graph.js +68 -0
  211. package/dist/runs/background/runner-initial-status.js +60 -0
  212. package/dist/runs/background/runner-lifecycle.js +142 -0
  213. package/dist/runs/background/runner-monitor.js +309 -0
  214. package/dist/runs/background/runner-parallel.js +204 -0
  215. package/dist/runs/background/runner-prepare-step.js +86 -0
  216. package/dist/runs/background/runner-reporting.js +153 -0
  217. package/dist/runs/background/runner-status.js +148 -0
  218. package/dist/runs/background/runner-step-output.js +92 -0
  219. package/dist/runs/background/runner-step-record.js +45 -0
  220. package/dist/runs/background/runner-step.js +112 -0
  221. package/dist/runs/background/runner-streaming.js +173 -0
  222. package/dist/runs/background/runner-workflow.js +213 -0
  223. package/dist/runs/background/stale-run-reconciler.js +155 -292
  224. package/dist/runs/background/subagent-runner-launcher.js +33 -13
  225. package/dist/runs/background/subagent-runner.js +51 -1842
  226. package/dist/runs/background/top-level-async.js +2 -1
  227. package/dist/runs/foreground/chain-clarify.js +293 -1017
  228. package/dist/runs/foreground/clarification-draft.js +87 -0
  229. package/dist/runs/foreground/clarify-contracts.js +1 -0
  230. package/dist/runs/foreground/clarify-invocation.js +129 -38
  231. package/dist/runs/foreground/clarify-text-editor.js +210 -0
  232. package/dist/runs/foreground/clarify-view.js +167 -0
  233. package/dist/runs/foreground/execution-input.js +226 -353
  234. package/dist/runs/foreground/execution-routing.js +33 -0
  235. package/dist/runs/foreground/execution-timeout.js +81 -0
  236. package/dist/runs/foreground/foreground-control.js +222 -763
  237. package/dist/runs/foreground/foreground-memory.js +99 -0
  238. package/dist/runs/foreground/invocation-context.js +55 -0
  239. package/dist/runs/foreground/invocation-execution.js +331 -0
  240. package/dist/runs/foreground/invocation-expansion.js +48 -0
  241. package/dist/runs/foreground/management-actions.js +295 -0
  242. package/dist/runs/foreground/nested-control.js +179 -0
  243. package/dist/runs/foreground/question-continuation.js +78 -0
  244. package/dist/runs/foreground/question-control.js +155 -50
  245. package/dist/runs/foreground/resume-target.js +221 -0
  246. package/dist/runs/foreground/revival-launch-policy.js +58 -0
  247. package/dist/runs/foreground/run-async-path.js +190 -178
  248. package/dist/runs/foreground/run-interrupt.js +164 -0
  249. package/dist/runs/foreground/run-nudge.js +278 -0
  250. package/dist/runs/foreground/saved-revival.js +251 -0
  251. package/dist/runs/foreground/subagent-executor.js +135 -424
  252. package/dist/runs/foreground/subagent-params.js +67 -30
  253. package/dist/runs/foreground/wait-observation.js +104 -0
  254. package/dist/runs/foreground/wait-registration.js +17 -0
  255. package/dist/runs/foreground/wait-run.js +283 -123
  256. package/dist/runs/shared/acceptance-contract.js +193 -99
  257. package/dist/runs/shared/acceptance-defaults.js +1 -0
  258. package/dist/runs/shared/acceptance-evaluation.js +201 -181
  259. package/dist/runs/shared/acceptance-finalization.js +256 -180
  260. package/dist/runs/shared/acceptance-outcome.js +53 -0
  261. package/dist/runs/shared/acceptance-reports.js +137 -72
  262. package/dist/runs/shared/acceptance-submission.js +167 -0
  263. package/dist/runs/shared/acceptance-verification.js +100 -0
  264. package/dist/runs/shared/chain-outputs.js +80 -52
  265. package/dist/runs/shared/child-attempt-types.js +1 -0
  266. package/dist/runs/shared/child-attempt.js +314 -667
  267. package/dist/runs/shared/child-boundaries.js +173 -0
  268. package/dist/runs/shared/child-context-filter.js +44 -0
  269. package/dist/runs/shared/child-event-observer.js +390 -0
  270. package/dist/runs/shared/child-execution-cwd.js +73 -43
  271. package/dist/runs/shared/child-execution-outcome.js +72 -0
  272. package/dist/runs/shared/child-invocation.js +54 -0
  273. package/dist/runs/shared/child-message-validation.js +215 -0
  274. package/dist/runs/shared/child-native-accounting.js +106 -0
  275. package/dist/runs/shared/child-native-observation.js +69 -0
  276. package/dist/runs/shared/child-observation-spool.js +164 -0
  277. package/dist/runs/shared/child-observations.js +157 -76
  278. package/dist/runs/shared/child-presence.js +3 -0
  279. package/dist/runs/shared/child-route-env.js +119 -0
  280. package/dist/runs/shared/child-stream-observer.js +221 -0
  281. package/dist/runs/shared/child-stream-projection.js +137 -0
  282. package/dist/runs/shared/child-structured-tool.js +27 -0
  283. package/dist/runs/shared/claude-code.js +121 -158
  284. package/dist/runs/shared/claude-model.js +42 -0
  285. package/dist/runs/shared/claude-session.js +83 -0
  286. package/dist/runs/shared/claude-types.js +1 -0
  287. package/dist/runs/shared/completion-guard.js +18 -18
  288. package/dist/runs/shared/control-event-policy.js +8 -0
  289. package/dist/runs/shared/control-notification-owner.js +13 -0
  290. package/dist/runs/shared/dynamic-fanout.js +188 -173
  291. package/dist/runs/shared/dynamic-item.js +102 -0
  292. package/dist/runs/shared/history-index.js +62 -36
  293. package/dist/runs/shared/legacy-async-recovery.js +114 -0
  294. package/dist/runs/shared/legacy-output-recovery.js +148 -0
  295. package/dist/runs/shared/mcp-config-schema.js +36 -0
  296. package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
  297. package/dist/runs/shared/model-fallback.js +97 -38
  298. package/dist/runs/shared/mutating-tool-guard.js +128 -88
  299. package/dist/runs/shared/native-finalization-types.js +1 -0
  300. package/dist/runs/shared/native-finalization.js +155 -76
  301. package/dist/runs/shared/native-usage.js +238 -98
  302. package/dist/runs/shared/nested-control-records.js +128 -0
  303. package/dist/runs/shared/nested-events.js +8 -700
  304. package/dist/runs/shared/nested-path.js +32 -28
  305. package/dist/runs/shared/nested-projection.js +155 -0
  306. package/dist/runs/shared/nested-protocol.js +18 -0
  307. package/dist/runs/shared/nested-registry.js +191 -0
  308. package/dist/runs/shared/nested-render.js +106 -58
  309. package/dist/runs/shared/nested-route.js +220 -0
  310. package/dist/runs/shared/nested-validation.js +216 -0
  311. package/dist/runs/shared/owned-child-evidence.js +125 -0
  312. package/dist/runs/shared/owned-run-list.js +146 -0
  313. package/dist/runs/shared/owned-run-observation.js +267 -0
  314. package/dist/runs/shared/owned-run-progress.js +109 -0
  315. package/dist/runs/shared/owned-run-read-state.js +1 -0
  316. package/dist/runs/shared/owned-run-results.js +202 -0
  317. package/dist/runs/shared/owned-run-status.js +180 -0
  318. package/dist/runs/shared/owned-run-view.js +51 -0
  319. package/dist/runs/shared/owned-workflow-details.js +17 -0
  320. package/dist/runs/shared/owner-output.js +43 -0
  321. package/dist/runs/shared/parallel-utils.js +36 -28
  322. package/dist/runs/shared/parent-receipts.js +90 -32
  323. package/dist/runs/shared/parent-usage.js +169 -57
  324. package/dist/runs/shared/pi-args.js +108 -201
  325. package/dist/runs/shared/pi-launch-input.js +1 -0
  326. package/dist/runs/shared/pi-session-launch.js +86 -0
  327. package/dist/runs/shared/pi-spawn.js +35 -21
  328. package/dist/runs/shared/run-history-queries.js +126 -35
  329. package/dist/runs/shared/run-history.js +101 -35
  330. package/dist/runs/shared/run-metadata-paths.js +14 -0
  331. package/dist/runs/shared/run-metadata.js +158 -0
  332. package/dist/runs/shared/run-persistence.js +131 -0
  333. package/dist/runs/shared/run-records.js +9 -679
  334. package/dist/runs/shared/run-restoration.js +338 -0
  335. package/dist/runs/shared/run-state-owner.js +26 -0
  336. package/dist/runs/shared/session-cwd-preload.js +27 -18
  337. package/dist/runs/shared/single-output.js +148 -70
  338. package/dist/runs/shared/stable-value.js +15 -0
  339. package/dist/runs/shared/streaming-text.js +23 -12
  340. package/dist/runs/shared/structured-output.js +25 -13
  341. package/dist/runs/shared/subagent-control.js +167 -100
  342. package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
  343. package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
  344. package/dist/runs/shared/supervisor-question-state.js +145 -0
  345. package/dist/runs/shared/supervisor-questions.js +185 -254
  346. package/dist/runs/shared/workflow-graph.js +259 -167
  347. package/dist/runs/shared/workflow-policy.js +120 -48
  348. package/dist/runs/shared/worktree-contract.js +1 -0
  349. package/dist/runs/shared/worktree-hook.js +138 -0
  350. package/dist/runs/shared/worktree-location.js +47 -0
  351. package/dist/runs/shared/worktree-preservation.js +8 -0
  352. package/dist/runs/shared/worktree-process.js +107 -0
  353. package/dist/runs/shared/worktree.js +183 -322
  354. package/dist/shared/agent-context-policy.js +34 -44
  355. package/dist/shared/agent-dir.js +14 -0
  356. package/dist/shared/artifacts.js +30 -12
  357. package/dist/shared/atomic-json.js +4 -1
  358. package/dist/shared/chain-files.js +72 -0
  359. package/dist/shared/concurrency.js +18 -0
  360. package/dist/shared/content-preview.js +115 -0
  361. package/dist/shared/cooperative.js +5 -2
  362. package/dist/shared/execution-cwd.js +13 -5
  363. package/dist/shared/file-coalescer.js +2 -1
  364. package/dist/shared/fork-context.js +10 -12
  365. package/dist/shared/formatters.js +45 -19
  366. package/dist/shared/journal-frames.js +164 -0
  367. package/dist/shared/journal-projections.js +121 -0
  368. package/dist/shared/journal-reader.js +6 -407
  369. package/dist/shared/json-projection.js +191 -0
  370. package/dist/shared/lazy-tools.js +19 -8
  371. package/dist/shared/message-output.js +116 -0
  372. package/dist/shared/model-info.js +31 -14
  373. package/dist/shared/native-import.js +20 -0
  374. package/dist/shared/native-journal.js +140 -0
  375. package/dist/shared/native-session.js +5 -2
  376. package/dist/shared/native-tui.js +7 -2
  377. package/dist/shared/native-typebox.js +15 -3
  378. package/dist/shared/output-page.js +63 -0
  379. package/dist/shared/post-exit-stdio-guard.js +128 -88
  380. package/dist/shared/prompt-sections.js +2 -0
  381. package/dist/shared/session-entries.js +70 -35
  382. package/dist/shared/session-identity.js +5 -3
  383. package/dist/shared/settings.js +62 -192
  384. package/dist/shared/status-format.js +97 -37
  385. package/dist/shared/task-file-policy.js +24 -0
  386. package/dist/shared/temp-root.js +44 -15
  387. package/dist/shared/types/acceptance.js +1 -0
  388. package/dist/shared/types/async.js +1 -0
  389. package/dist/shared/types/config.js +1 -0
  390. package/dist/shared/types/details.js +1 -0
  391. package/dist/shared/types/history.js +1 -0
  392. package/dist/shared/types/inputs.js +1 -0
  393. package/dist/shared/types/intercom.js +1 -0
  394. package/dist/shared/types/launch.js +1 -0
  395. package/dist/shared/types/messages.js +1 -0
  396. package/dist/shared/types/nested.js +1 -0
  397. package/dist/shared/types/owned-runs.js +1 -0
  398. package/dist/shared/types/progress.js +1 -0
  399. package/dist/shared/types/questions.js +1 -0
  400. package/dist/shared/types/results.js +1 -0
  401. package/dist/shared/types/state.js +1 -0
  402. package/dist/shared/types/usage.js +1 -0
  403. package/dist/shared/types/workflow.js +1 -0
  404. package/dist/shared/types.js +75 -30
  405. package/dist/shared/unknown.js +52 -0
  406. package/dist/shared/utils.js +54 -260
  407. package/dist/slash/command-discovery.js +82 -0
  408. package/dist/slash/command-input.js +190 -0
  409. package/dist/slash/prompt-template-bridge.js +94 -270
  410. package/dist/slash/prompt-template-contract.js +77 -0
  411. package/dist/slash/prompt-template-results.js +125 -0
  412. package/dist/slash/request-protocol.js +68 -0
  413. package/dist/slash/result-delivery.js +237 -0
  414. package/dist/slash/saved-chain.js +78 -0
  415. package/dist/slash/slash-bridge.js +123 -89
  416. package/dist/slash/slash-commands.js +101 -572
  417. package/dist/slash/slash-live-state.js +68 -47
  418. package/dist/tui/action-hints.js +50 -22
  419. package/dist/tui/activity-lines.js +32 -0
  420. package/dist/tui/agent-browser.js +290 -0
  421. package/dist/tui/agent-controls.js +289 -0
  422. package/dist/tui/agent-conversation.js +444 -0
  423. package/dist/tui/agent-dock.js +171 -0
  424. package/dist/tui/agent-history.js +50 -183
  425. package/dist/tui/agent-model.js +62 -0
  426. package/dist/tui/agent-picker.js +262 -0
  427. package/dist/tui/agent-view.js +232 -1564
  428. package/dist/tui/compact-results.js +193 -0
  429. package/dist/tui/conversation-details.js +190 -0
  430. package/dist/tui/conversation-frame.js +135 -0
  431. package/dist/tui/conversation-history.js +201 -0
  432. package/dist/tui/conversation-menu.js +78 -0
  433. package/dist/tui/conversation-notices.js +79 -0
  434. package/dist/tui/conversation-selection.js +58 -0
  435. package/dist/tui/conversation-viewport.js +129 -0
  436. package/dist/tui/direction-message.js +27 -0
  437. package/dist/tui/display.js +282 -0
  438. package/dist/tui/editor-viewport.js +18 -0
  439. package/dist/tui/expanded-content.js +87 -0
  440. package/dist/tui/expanded-multi.js +170 -0
  441. package/dist/tui/expanded-single.js +65 -0
  442. package/dist/tui/history-cards.js +216 -0
  443. package/dist/tui/history-display.js +238 -0
  444. package/dist/tui/history-json.js +16 -0
  445. package/dist/tui/history-metadata.js +152 -0
  446. package/dist/tui/history-record.js +251 -0
  447. package/dist/tui/history-text.js +34 -0
  448. package/dist/tui/indexed-history.js +116 -0
  449. package/dist/tui/nested-widget.js +120 -0
  450. package/dist/tui/picker-page.js +59 -0
  451. package/dist/tui/render.js +58 -1501
  452. package/dist/tui/result-facts.js +64 -0
  453. package/dist/tui/task-observation.js +59 -0
  454. package/dist/tui/task-store.js +366 -0
  455. package/dist/tui/text-values.js +16 -0
  456. package/dist/tui/view-connections.js +47 -0
  457. package/dist/tui/view-model.js +94 -0
  458. package/dist/tui/view-persistence.js +51 -0
  459. package/dist/tui/view-ports.js +1 -0
  460. package/dist/tui/view-session.js +37 -0
  461. package/dist/tui/widget-details.js +144 -0
  462. package/dist/tui/widget-status.js +245 -0
  463. package/dist/tui/widget.js +145 -0
  464. package/dist/tui/workflow-labels.js +223 -0
  465. package/dist/tui/workflow-outcomes.js +124 -0
  466. package/docs/code-quality.md +38 -0
  467. package/docs/development.md +99 -0
  468. package/docs/intercom-bridge.md +22 -17
  469. package/docs/intercom.md +132 -106
  470. package/docs/performance.md +19 -17
  471. package/docs/reference.md +1472 -0
  472. package/generated/RunValidators.d.ts +28 -0
  473. package/generated/RunValidators.js +2 -0
  474. package/package.json +27 -6
  475. package/prompts/parallel-cleanup.md +3 -0
  476. package/prompts/parallel-context-build.md +3 -0
  477. package/prompts/parallel-handoff-plan.md +6 -0
  478. package/prompts/parallel-research.md +4 -0
  479. package/prompts/parallel-review.md +2 -0
  480. package/prompts/review-loop.md +2 -0
  481. package/scripts/build.mjs +129 -85
  482. package/scripts/check-compat.mjs +48 -11
  483. package/scripts/compat-host.mjs +35 -7
  484. package/scripts/generate-run-schemas.mjs +210 -0
  485. package/scripts/intercom-bridge-credentials.mjs +155 -28
  486. package/scripts/intercom-remote.mjs +175 -50
  487. package/scripts/local-install-smoke.mjs +47 -37
  488. package/scripts/native-package-smoke.mjs +135 -25
  489. package/scripts/package-smoke.mjs +360 -140
  490. package/scripts/prepare.mjs +54 -34
  491. package/scripts/real-pi-processes.mjs +261 -0
  492. package/scripts/real-pi-smoke.mjs +432 -351
  493. package/scripts/run-tests.mjs +29 -15
  494. package/skills/pi-intercom/SKILL.md +11 -11
  495. package/skills/pi-intercom/references/peer-sessions.md +7 -2
  496. package/skills/pi-subagents/SKILL.md +1 -1
  497. package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
  498. package/src/agents/agent-defaults.ts +13 -0
  499. package/src/agents/agent-definition.ts +253 -0
  500. package/src/agents/agent-management.ts +111 -808
  501. package/src/agents/agent-scope.ts +7 -3
  502. package/src/agents/agent-selection.ts +26 -16
  503. package/src/agents/agent-serializer.ts +84 -93
  504. package/src/agents/agents.ts +199 -906
  505. package/src/agents/builtin-overrides.ts +297 -0
  506. package/src/agents/chain-serializer.ts +3 -329
  507. package/src/agents/config-values.ts +57 -0
  508. package/src/agents/discovery-paths.ts +134 -0
  509. package/src/agents/frontmatter.ts +35 -17
  510. package/src/agents/identity.ts +49 -18
  511. package/src/agents/json-chain.ts +305 -0
  512. package/src/agents/management-config.ts +342 -0
  513. package/src/agents/management-format.ts +243 -0
  514. package/src/agents/management-persistence.ts +408 -0
  515. package/src/agents/management-targets.ts +260 -0
  516. package/src/agents/management-warnings.ts +115 -0
  517. package/src/agents/markdown-chain.ts +237 -0
  518. package/src/agents/package-agents.ts +231 -0
  519. package/src/agents/skill-files.ts +182 -0
  520. package/src/agents/skill-search-paths.ts +289 -0
  521. package/src/agents/skill-types.ts +31 -0
  522. package/src/agents/skills.ts +152 -610
  523. package/src/extension/acceptance-schema.ts +88 -0
  524. package/src/extension/chain-schema.ts +276 -0
  525. package/src/extension/child-runtime.ts +302 -0
  526. package/src/extension/compact-tools.ts +259 -102
  527. package/src/extension/config-schema.ts +59 -0
  528. package/src/extension/config.ts +39 -17
  529. package/src/extension/control-notice-schema.ts +55 -0
  530. package/src/extension/control-notices.ts +57 -33
  531. package/src/extension/delegation-bridges.ts +59 -0
  532. package/src/extension/doctor.ts +171 -135
  533. package/src/extension/everyday-schemas.ts +252 -0
  534. package/src/extension/fanout-child.ts +29 -308
  535. package/src/extension/index.ts +17 -642
  536. package/src/extension/message-renderers.ts +334 -0
  537. package/src/extension/nested-control-inbox.ts +196 -0
  538. package/src/extension/parent-runtime.ts +405 -0
  539. package/src/extension/primary-tool.ts +130 -0
  540. package/src/extension/result-snapshot.ts +35 -0
  541. package/src/extension/runtime-reload.ts +72 -0
  542. package/src/extension/runtime-storage.ts +49 -0
  543. package/src/extension/schema-overrides.ts +114 -0
  544. package/src/extension/schemas.ts +451 -418
  545. package/src/extension/tool-input.ts +40 -13
  546. package/src/extension/tool-result.ts +45 -14
  547. package/src/history/answer-texts.ts +74 -0
  548. package/src/history/canonical-result.ts +127 -51
  549. package/src/history/canonical-selection.ts +54 -0
  550. package/src/history/database-generation.ts +86 -0
  551. package/src/history/database.ts +86 -48
  552. package/src/history/entry-ingestion.ts +129 -0
  553. package/src/history/index.ts +426 -148
  554. package/src/history/ingest.ts +372 -342
  555. package/src/history/output-digests.ts +41 -0
  556. package/src/history/preview.ts +235 -0
  557. package/src/history/prune.ts +48 -0
  558. package/src/history/queries.ts +122 -256
  559. package/src/history/query-scope.ts +278 -0
  560. package/src/history/rows.ts +118 -0
  561. package/src/history/run-projection.ts +164 -0
  562. package/src/history/run-queries.ts +199 -0
  563. package/src/history/schema.ts +34 -0
  564. package/src/history/search-queries.ts +216 -0
  565. package/src/history/selected-record.ts +140 -0
  566. package/src/history/source-file.ts +51 -0
  567. package/src/history/source-watches.ts +156 -0
  568. package/src/history/store.ts +310 -197
  569. package/src/history/text-chunks.ts +181 -0
  570. package/src/history/text.ts +43 -0
  571. package/src/history/transcript-queries.ts +251 -0
  572. package/src/history/types.ts +27 -164
  573. package/src/history/values.ts +36 -0
  574. package/src/history/wire-inputs.ts +141 -0
  575. package/src/history/wire-models.ts +51 -0
  576. package/src/history/worker-runtime.ts +502 -0
  577. package/src/history/worker.ts +94 -336
  578. package/src/intercom/intercom-bridge.ts +136 -69
  579. package/src/intercom/live-intercom.ts +197 -92
  580. package/src/intercom/nested-result-tree.ts +213 -0
  581. package/src/intercom/result-delivery.ts +56 -0
  582. package/src/intercom/result-intercom.ts +364 -382
  583. package/src/pi-intercom/agent-dir.ts +9 -3
  584. package/src/pi-intercom/async.ts +33 -0
  585. package/src/pi-intercom/bridge-ask.ts +64 -0
  586. package/src/pi-intercom/bridge-config.ts +101 -0
  587. package/src/pi-intercom/bridge-http.ts +97 -0
  588. package/src/pi-intercom/bridge-protocol.ts +123 -0
  589. package/src/pi-intercom/bridge-routes.ts +90 -0
  590. package/src/pi-intercom/bridge-session.ts +506 -0
  591. package/src/pi-intercom/bridge.ts +258 -547
  592. package/src/pi-intercom/broker/broker.ts +326 -263
  593. package/src/pi-intercom/broker/client.ts +273 -354
  594. package/src/pi-intercom/broker/connection.ts +192 -0
  595. package/src/pi-intercom/broker/framing.ts +11 -6
  596. package/src/pi-intercom/broker/paths.ts +28 -25
  597. package/src/pi-intercom/broker/pid.ts +68 -24
  598. package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
  599. package/src/pi-intercom/broker/snapshots.ts +241 -0
  600. package/src/pi-intercom/broker/spawn.ts +58 -34
  601. package/src/pi-intercom/config.ts +113 -108
  602. package/src/pi-intercom/connection.ts +346 -0
  603. package/src/pi-intercom/identity.ts +71 -0
  604. package/src/pi-intercom/inbound-delivery.ts +450 -0
  605. package/src/pi-intercom/inbound-journal.ts +350 -0
  606. package/src/pi-intercom/inbound-record.ts +141 -0
  607. package/src/pi-intercom/inbound.ts +237 -0
  608. package/src/pi-intercom/index.ts +86 -2923
  609. package/src/pi-intercom/inspection.ts +82 -0
  610. package/src/pi-intercom/interview.ts +295 -0
  611. package/src/pi-intercom/lifecycle.ts +183 -0
  612. package/src/pi-intercom/message-format.ts +77 -0
  613. package/src/pi-intercom/outbound.ts +418 -0
  614. package/src/pi-intercom/peer-awareness.ts +84 -0
  615. package/src/pi-intercom/reply-tracker.ts +121 -59
  616. package/src/pi-intercom/reply-wait.ts +247 -0
  617. package/src/pi-intercom/runtime-types.ts +97 -0
  618. package/src/pi-intercom/session-events.ts +247 -0
  619. package/src/pi-intercom/session-targets.ts +124 -72
  620. package/src/pi-intercom/subagent-events.ts +299 -0
  621. package/src/pi-intercom/subagent-live-events.ts +212 -109
  622. package/src/pi-intercom/supervisor.ts +362 -0
  623. package/src/pi-intercom/tool-arguments.ts +120 -0
  624. package/src/pi-intercom/tool-registration.ts +121 -0
  625. package/src/pi-intercom/tool-results.ts +54 -0
  626. package/src/pi-intercom/tool-schemas.ts +134 -0
  627. package/src/pi-intercom/tools.ts +80 -0
  628. package/src/pi-intercom/topic-actions.ts +243 -0
  629. package/src/pi-intercom/topics.ts +267 -121
  630. package/src/pi-intercom/transport.ts +14 -0
  631. package/src/pi-intercom/types.ts +288 -190
  632. package/src/pi-intercom/ui/compose-paste.ts +109 -0
  633. package/src/pi-intercom/ui/compose.ts +173 -157
  634. package/src/pi-intercom/ui/inline-message.ts +80 -62
  635. package/src/pi-intercom/ui/message-renderers.ts +182 -0
  636. package/src/pi-intercom/ui/overlay.ts +238 -0
  637. package/src/pi-intercom/ui/session-format.ts +146 -0
  638. package/src/pi-intercom/ui/session-list.ts +145 -62
  639. package/src/pi-intercom/ui/tool-renderers.ts +148 -0
  640. package/src/pi-intercom/ui/topic-view.ts +107 -0
  641. package/src/pi-intercom/validation.ts +69 -0
  642. package/src/runs/background/async-chain-plan.ts +451 -0
  643. package/src/runs/background/async-control.ts +201 -71
  644. package/src/runs/background/async-execution.ts +206 -829
  645. package/src/runs/background/async-job-admission.ts +54 -0
  646. package/src/runs/background/async-job-projection.ts +225 -0
  647. package/src/runs/background/async-job-tracker.ts +416 -360
  648. package/src/runs/background/async-launch.ts +319 -0
  649. package/src/runs/background/async-plan.ts +285 -0
  650. package/src/runs/background/async-result-file.ts +79 -37
  651. package/src/runs/background/async-resume.ts +338 -285
  652. package/src/runs/background/async-run-discovery.ts +270 -0
  653. package/src/runs/background/async-run-location.ts +194 -0
  654. package/src/runs/background/async-run-record.ts +14 -0
  655. package/src/runs/background/async-run-repair.ts +307 -0
  656. package/src/runs/background/async-run-summary.ts +71 -0
  657. package/src/runs/background/async-single-plan.ts +168 -0
  658. package/src/runs/background/async-status-projection.ts +188 -0
  659. package/src/runs/background/async-status-render.ts +164 -0
  660. package/src/runs/background/async-status-validation.ts +238 -0
  661. package/src/runs/background/async-status.ts +9 -481
  662. package/src/runs/background/async-value.ts +29 -0
  663. package/src/runs/background/completion-dedupe.ts +103 -54
  664. package/src/runs/background/completion-delivery.ts +313 -187
  665. package/src/runs/background/completion-receipts.ts +309 -0
  666. package/src/runs/background/legacy-status-acceptance.ts +38 -0
  667. package/src/runs/background/notify.ts +167 -106
  668. package/src/runs/background/parallel-groups.ts +95 -46
  669. package/src/runs/background/result-payload.ts +268 -0
  670. package/src/runs/background/result-watcher.ts +484 -387
  671. package/src/runs/background/run-id-resolver.ts +126 -57
  672. package/src/runs/background/run-schemas.ts +240 -0
  673. package/src/runs/background/run-status-contracts.ts +46 -0
  674. package/src/runs/background/run-status-render.ts +364 -0
  675. package/src/runs/background/run-status.ts +338 -356
  676. package/src/runs/background/runner-attempt-output.ts +281 -0
  677. package/src/runs/background/runner-attempt.ts +354 -0
  678. package/src/runs/background/runner-child-executor.ts +232 -0
  679. package/src/runs/background/runner-child-observer.ts +270 -0
  680. package/src/runs/background/runner-completion-summary.ts +106 -0
  681. package/src/runs/background/runner-completion.ts +274 -0
  682. package/src/runs/background/runner-config.ts +52 -0
  683. package/src/runs/background/runner-contract.ts +51 -0
  684. package/src/runs/background/runner-dynamic.ts +185 -0
  685. package/src/runs/background/runner-finalization.ts +203 -0
  686. package/src/runs/background/runner-graph.ts +91 -0
  687. package/src/runs/background/runner-initial-status.ts +72 -0
  688. package/src/runs/background/runner-lifecycle.ts +159 -0
  689. package/src/runs/background/runner-monitor.ts +399 -0
  690. package/src/runs/background/runner-parallel.ts +280 -0
  691. package/src/runs/background/runner-prepare-step.ts +128 -0
  692. package/src/runs/background/runner-reporting.ts +192 -0
  693. package/src/runs/background/runner-status.ts +220 -0
  694. package/src/runs/background/runner-step-output.ts +158 -0
  695. package/src/runs/background/runner-step-record.ts +76 -0
  696. package/src/runs/background/runner-step.ts +150 -0
  697. package/src/runs/background/runner-streaming.ts +220 -0
  698. package/src/runs/background/runner-workflow.ts +284 -0
  699. package/src/runs/background/stale-run-reconciler.ts +279 -336
  700. package/src/runs/background/subagent-runner-launcher.ts +67 -35
  701. package/src/runs/background/subagent-runner.ts +80 -2048
  702. package/src/runs/background/top-level-async.ts +9 -7
  703. package/src/runs/foreground/chain-clarify.ts +499 -1334
  704. package/src/runs/foreground/clarification-draft.ts +92 -0
  705. package/src/runs/foreground/clarify-contracts.ts +33 -0
  706. package/src/runs/foreground/clarify-invocation.ts +192 -65
  707. package/src/runs/foreground/clarify-text-editor.ts +229 -0
  708. package/src/runs/foreground/clarify-view.ts +222 -0
  709. package/src/runs/foreground/execution-input.ts +358 -424
  710. package/src/runs/foreground/execution-routing.ts +41 -0
  711. package/src/runs/foreground/execution-timeout.ts +92 -0
  712. package/src/runs/foreground/foreground-control.ts +333 -812
  713. package/src/runs/foreground/foreground-memory.ts +132 -0
  714. package/src/runs/foreground/invocation-context.ts +88 -0
  715. package/src/runs/foreground/invocation-execution.ts +465 -0
  716. package/src/runs/foreground/invocation-expansion.ts +58 -0
  717. package/src/runs/foreground/management-actions.ts +360 -0
  718. package/src/runs/foreground/nested-control.ts +248 -0
  719. package/src/runs/foreground/question-continuation.ts +112 -0
  720. package/src/runs/foreground/question-control.ts +297 -70
  721. package/src/runs/foreground/resume-target.ts +330 -0
  722. package/src/runs/foreground/revival-launch-policy.ts +112 -0
  723. package/src/runs/foreground/run-async-path.ts +307 -223
  724. package/src/runs/foreground/run-interrupt.ts +202 -0
  725. package/src/runs/foreground/run-nudge.ts +355 -0
  726. package/src/runs/foreground/saved-revival.ts +356 -0
  727. package/src/runs/foreground/subagent-executor.ts +195 -493
  728. package/src/runs/foreground/subagent-params.ts +314 -242
  729. package/src/runs/foreground/wait-observation.ts +160 -0
  730. package/src/runs/foreground/wait-registration.ts +18 -0
  731. package/src/runs/foreground/wait-run.ts +361 -119
  732. package/src/runs/shared/acceptance-contract.ts +410 -209
  733. package/src/runs/shared/acceptance-defaults.ts +1 -0
  734. package/src/runs/shared/acceptance-evaluation.ts +314 -240
  735. package/src/runs/shared/acceptance-finalization.ts +447 -305
  736. package/src/runs/shared/acceptance-outcome.ts +69 -0
  737. package/src/runs/shared/acceptance-reports.ts +220 -126
  738. package/src/runs/shared/acceptance-submission.ts +251 -0
  739. package/src/runs/shared/acceptance-verification.ts +118 -0
  740. package/src/runs/shared/acceptance.ts +25 -25
  741. package/src/runs/shared/chain-outputs.ts +190 -98
  742. package/src/runs/shared/child-attempt-types.ts +118 -0
  743. package/src/runs/shared/child-attempt.ts +372 -608
  744. package/src/runs/shared/child-boundaries.ts +217 -0
  745. package/src/runs/shared/child-context-filter.ts +53 -0
  746. package/src/runs/shared/child-event-observer.ts +496 -0
  747. package/src/runs/shared/child-execution-cwd.ts +139 -68
  748. package/src/runs/shared/child-execution-outcome.ts +103 -0
  749. package/src/runs/shared/child-invocation.ts +74 -0
  750. package/src/runs/shared/child-message-validation.ts +233 -0
  751. package/src/runs/shared/child-native-accounting.ts +154 -0
  752. package/src/runs/shared/child-native-observation.ts +79 -0
  753. package/src/runs/shared/child-observation-spool.ts +188 -0
  754. package/src/runs/shared/child-observations.ts +219 -89
  755. package/src/runs/shared/child-presence.ts +6 -0
  756. package/src/runs/shared/child-route-env.ts +142 -0
  757. package/src/runs/shared/child-stream-observer.ts +302 -0
  758. package/src/runs/shared/child-stream-projection.ts +160 -0
  759. package/src/runs/shared/child-structured-tool.ts +38 -0
  760. package/src/runs/shared/claude-code.ts +201 -228
  761. package/src/runs/shared/claude-model.ts +67 -0
  762. package/src/runs/shared/claude-session.ts +124 -0
  763. package/src/runs/shared/claude-types.ts +31 -0
  764. package/src/runs/shared/completion-guard.ts +35 -26
  765. package/src/runs/shared/control-event-policy.ts +15 -0
  766. package/src/runs/shared/control-notification-owner.ts +20 -0
  767. package/src/runs/shared/dynamic-fanout.ts +402 -238
  768. package/src/runs/shared/dynamic-item.ts +114 -0
  769. package/src/runs/shared/history-index.ts +112 -51
  770. package/src/runs/shared/legacy-async-recovery.ts +153 -0
  771. package/src/runs/shared/legacy-output-recovery.ts +214 -0
  772. package/src/runs/shared/mcp-config-schema.ts +46 -0
  773. package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
  774. package/src/runs/shared/model-fallback.ts +302 -180
  775. package/src/runs/shared/mutating-tool-guard.ts +259 -158
  776. package/src/runs/shared/native-finalization-types.ts +29 -0
  777. package/src/runs/shared/native-finalization.ts +233 -109
  778. package/src/runs/shared/native-usage.ts +379 -96
  779. package/src/runs/shared/nested-control-records.ts +178 -0
  780. package/src/runs/shared/nested-events.ts +45 -752
  781. package/src/runs/shared/nested-path.ts +47 -34
  782. package/src/runs/shared/nested-projection.ts +230 -0
  783. package/src/runs/shared/nested-protocol.ts +67 -0
  784. package/src/runs/shared/nested-registry.ts +273 -0
  785. package/src/runs/shared/nested-render.ts +198 -100
  786. package/src/runs/shared/nested-route.ts +292 -0
  787. package/src/runs/shared/nested-validation.ts +291 -0
  788. package/src/runs/shared/owned-child-evidence.ts +184 -0
  789. package/src/runs/shared/owned-run-list.ts +187 -0
  790. package/src/runs/shared/owned-run-observation.ts +368 -0
  791. package/src/runs/shared/owned-run-progress.ts +172 -0
  792. package/src/runs/shared/owned-run-read-state.ts +7 -0
  793. package/src/runs/shared/owned-run-results.ts +289 -0
  794. package/src/runs/shared/owned-run-status.ts +239 -0
  795. package/src/runs/shared/owned-run-view.ts +65 -0
  796. package/src/runs/shared/owned-workflow-details.ts +24 -0
  797. package/src/runs/shared/owner-output.ts +73 -0
  798. package/src/runs/shared/parallel-utils.ts +93 -129
  799. package/src/runs/shared/parent-receipts.ts +177 -50
  800. package/src/runs/shared/parent-usage.ts +314 -91
  801. package/src/runs/shared/pi-args.ts +241 -311
  802. package/src/runs/shared/pi-launch-input.ts +48 -0
  803. package/src/runs/shared/pi-session-launch.ts +94 -0
  804. package/src/runs/shared/pi-spawn.ts +57 -33
  805. package/src/runs/shared/run-history-queries.ts +189 -38
  806. package/src/runs/shared/run-history.ts +197 -76
  807. package/src/runs/shared/run-id-ambiguity.ts +7 -3
  808. package/src/runs/shared/run-metadata-paths.ts +17 -0
  809. package/src/runs/shared/run-metadata.ts +240 -0
  810. package/src/runs/shared/run-persistence.ts +181 -0
  811. package/src/runs/shared/run-records.ts +19 -607
  812. package/src/runs/shared/run-restoration.ts +455 -0
  813. package/src/runs/shared/run-state-owner.ts +31 -0
  814. package/src/runs/shared/session-cwd-preload.ts +39 -19
  815. package/src/runs/shared/single-output.ts +358 -205
  816. package/src/runs/shared/stable-value.ts +15 -0
  817. package/src/runs/shared/streaming-text.ts +39 -12
  818. package/src/runs/shared/structured-output.ts +76 -46
  819. package/src/runs/shared/subagent-control.ts +330 -197
  820. package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
  821. package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
  822. package/src/runs/shared/supervisor-question-state.ts +221 -0
  823. package/src/runs/shared/supervisor-questions.ts +396 -401
  824. package/src/runs/shared/workflow-graph.ts +400 -198
  825. package/src/runs/shared/workflow-policy.ts +245 -110
  826. package/src/runs/shared/worktree-contract.ts +29 -0
  827. package/src/runs/shared/worktree-hook.ts +181 -0
  828. package/src/runs/shared/worktree-location.ts +61 -0
  829. package/src/runs/shared/worktree-preservation.ts +10 -0
  830. package/src/runs/shared/worktree-process.ts +132 -0
  831. package/src/runs/shared/worktree.ts +459 -587
  832. package/src/shared/agent-context-policy.ts +176 -145
  833. package/src/shared/agent-dir.ts +15 -0
  834. package/src/shared/artifacts.ts +99 -68
  835. package/src/shared/atomic-json.ts +14 -11
  836. package/src/shared/chain-files.ts +72 -0
  837. package/src/shared/concurrency.ts +27 -0
  838. package/src/shared/content-preview.ts +117 -0
  839. package/src/shared/cooperative.ts +17 -13
  840. package/src/shared/execution-cwd.ts +34 -9
  841. package/src/shared/file-coalescer.ts +24 -22
  842. package/src/shared/fork-context.ts +52 -48
  843. package/src/shared/formatters.ts +88 -47
  844. package/src/shared/journal-frames.ts +197 -0
  845. package/src/shared/journal-projections.ts +133 -0
  846. package/src/shared/journal-reader.ts +18 -333
  847. package/src/shared/json-projection.ts +224 -0
  848. package/src/shared/lazy-tools.ts +76 -27
  849. package/src/shared/message-output.ts +146 -0
  850. package/src/shared/model-info.ts +94 -58
  851. package/src/shared/native-import.ts +25 -0
  852. package/src/shared/native-journal.ts +172 -0
  853. package/src/shared/native-session.ts +8 -3
  854. package/src/shared/native-tui.ts +13 -3
  855. package/src/shared/native-typebox.ts +18 -3
  856. package/src/shared/output-page.ts +76 -0
  857. package/src/shared/post-exit-stdio-guard.ts +232 -172
  858. package/src/shared/prompt-sections.ts +13 -7
  859. package/src/shared/session-entries.ts +103 -44
  860. package/src/shared/session-identity.ts +17 -10
  861. package/src/shared/settings.ts +182 -367
  862. package/src/shared/status-format.ts +207 -98
  863. package/src/shared/stream-json.d.ts +10 -0
  864. package/src/shared/task-file-policy.ts +35 -0
  865. package/src/shared/temp-root.ts +122 -71
  866. package/src/shared/types/acceptance.ts +149 -0
  867. package/src/shared/types/async.ts +247 -0
  868. package/src/shared/types/config.ts +139 -0
  869. package/src/shared/types/details.ts +104 -0
  870. package/src/shared/types/history.ts +217 -0
  871. package/src/shared/types/inputs.ts +4 -0
  872. package/src/shared/types/intercom.ts +57 -0
  873. package/src/shared/types/launch.ts +39 -0
  874. package/src/shared/types/messages.ts +104 -0
  875. package/src/shared/types/nested.ts +153 -0
  876. package/src/shared/types/owned-runs.ts +148 -0
  877. package/src/shared/types/progress.ts +106 -0
  878. package/src/shared/types/questions.ts +103 -0
  879. package/src/shared/types/results.ts +119 -0
  880. package/src/shared/types/state.ts +56 -0
  881. package/src/shared/types/usage.ts +36 -0
  882. package/src/shared/types/workflow.ts +187 -0
  883. package/src/shared/types.ts +222 -1161
  884. package/src/shared/ui-mode.ts +1 -1
  885. package/src/shared/unknown.ts +59 -0
  886. package/src/shared/utils.ts +111 -305
  887. package/src/slash/command-discovery.ts +109 -0
  888. package/src/slash/command-input.ts +232 -0
  889. package/src/slash/prompt-template-bridge.ts +153 -400
  890. package/src/slash/prompt-template-contract.ts +152 -0
  891. package/src/slash/prompt-template-results.ts +189 -0
  892. package/src/slash/request-protocol.ts +87 -0
  893. package/src/slash/result-delivery.ts +312 -0
  894. package/src/slash/saved-chain.ts +115 -0
  895. package/src/slash/slash-bridge.ts +202 -156
  896. package/src/slash/slash-commands.ts +176 -598
  897. package/src/slash/slash-live-state.ts +287 -229
  898. package/src/tui/action-hints.ts +147 -61
  899. package/src/tui/activity-lines.ts +40 -0
  900. package/src/tui/agent-browser.ts +354 -0
  901. package/src/tui/agent-controls.ts +355 -0
  902. package/src/tui/agent-conversation.ts +514 -0
  903. package/src/tui/agent-dock.ts +250 -0
  904. package/src/tui/agent-history.ts +78 -203
  905. package/src/tui/agent-model.ts +78 -0
  906. package/src/tui/agent-picker.ts +325 -0
  907. package/src/tui/agent-view.ts +391 -1333
  908. package/src/tui/compact-results.ts +342 -0
  909. package/src/tui/conversation-details.ts +206 -0
  910. package/src/tui/conversation-frame.ts +184 -0
  911. package/src/tui/conversation-history.ts +246 -0
  912. package/src/tui/conversation-menu.ts +119 -0
  913. package/src/tui/conversation-notices.ts +116 -0
  914. package/src/tui/conversation-selection.ts +66 -0
  915. package/src/tui/conversation-viewport.ts +169 -0
  916. package/src/tui/direction-message.ts +35 -0
  917. package/src/tui/display.ts +409 -0
  918. package/src/tui/editor-viewport.ts +19 -0
  919. package/src/tui/expanded-content.ts +134 -0
  920. package/src/tui/expanded-multi.ts +264 -0
  921. package/src/tui/expanded-single.ts +92 -0
  922. package/src/tui/history-cards.ts +316 -0
  923. package/src/tui/history-display.ts +334 -0
  924. package/src/tui/history-json.ts +17 -0
  925. package/src/tui/history-metadata.ts +177 -0
  926. package/src/tui/history-record.ts +321 -0
  927. package/src/tui/history-text.ts +34 -0
  928. package/src/tui/indexed-history.ts +149 -0
  929. package/src/tui/nested-widget.ts +192 -0
  930. package/src/tui/picker-page.ts +80 -0
  931. package/src/tui/render.ts +100 -1546
  932. package/src/tui/result-facts.ts +99 -0
  933. package/src/tui/task-observation.ts +96 -0
  934. package/src/tui/task-store.ts +432 -0
  935. package/src/tui/text-values.ts +20 -0
  936. package/src/tui/view-connections.ts +64 -0
  937. package/src/tui/view-model.ts +181 -0
  938. package/src/tui/view-persistence.ts +57 -0
  939. package/src/tui/view-ports.ts +55 -0
  940. package/src/tui/view-session.ts +42 -0
  941. package/src/tui/widget-details.ts +220 -0
  942. package/src/tui/widget-status.ts +331 -0
  943. package/src/tui/widget.ts +208 -0
  944. package/src/tui/workflow-labels.ts +340 -0
  945. package/src/tui/workflow-outcomes.ts +150 -0
  946. package/tsconfig.build.json +11 -10
  947. package/tsconfig.json +30 -17
@@ -1,923 +1,82 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import { defaultInheritProjectContext, defaultInheritSkills, defaultSystemPromptMode, discoverAgents, discoverAgentsAll, buildRuntimeName, frontmatterNameForConfig, parsePackageName, } from "./agents.js";
4
- import { serializeAgent } from "./agent-serializer.js";
5
- import { serializeChain, serializeJsonChain } from "./chain-serializer.js";
6
- import { discoverAvailableSkills } from "./skills.js";
7
- import { isClaudeCodeModel } from "../runs/shared/claude-code.js";
8
- import { resolveEffectiveThinking } from "../shared/model-info.js";
9
- function result(text, isError = false) {
10
- return { content: [{ type: "text", text }], isError, details: { mode: "management", results: [] } };
11
- }
12
- function parseCsv(value) {
13
- return [...new Set(value.split(",").map((v) => v.trim()).filter(Boolean))];
14
- }
15
- function configObject(config) {
16
- let val = config;
17
- if (typeof val === "string") {
18
- try {
19
- val = JSON.parse(val);
20
- }
21
- catch (error) {
22
- const message = error instanceof Error ? error.message : String(error);
23
- return { error: `config must be valid JSON: ${message}` };
24
- }
25
- }
26
- if (!val || typeof val !== "object" || Array.isArray(val))
27
- return {};
28
- return { value: val };
29
- }
30
- function hasKey(obj, key) {
31
- return Object.prototype.hasOwnProperty.call(obj, key);
32
- }
33
- function asDisambiguationScope(scope) {
34
- if (scope === "user" || scope === "project")
35
- return scope;
36
- return undefined;
37
- }
38
- function normalizeListScope(scope) {
39
- if (scope === undefined)
40
- return "both";
41
- if (scope === "user" || scope === "project" || scope === "both")
42
- return scope;
43
- return undefined;
44
- }
45
- function sanitizeName(name) {
46
- return name.toLowerCase().trim().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
47
- }
48
- function parsePackageConfig(value) {
49
- return parsePackageName(value, "config.package");
50
- }
51
- function allAgents(d) {
52
- return [...d.builtin, ...d.package, ...d.user, ...d.project];
53
- }
54
- function discoveryOptions(ctx) {
55
- return { projectTrusted: ctx.isProjectTrusted() };
56
- }
57
- function availableNames(ctx, kind, scope = "both") {
58
- const d = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx), scope);
59
- const items = kind === "agent" ? allAgents(d) : d.chains;
60
- return [...new Set(items.map((x) => x.name))].sort((a, b) => a.localeCompare(b));
61
- }
62
- function findAgents(name, ctx, scope = "both") {
63
- const d = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx), scope);
64
- const raw = name.trim();
65
- const sanitized = sanitizeName(raw);
66
- return allAgents(d)
67
- .filter((a) => (scope === "both" || a.source === scope) && (a.name === raw || a.name === sanitized))
68
- .sort((a, b) => a.source.localeCompare(b.source));
69
- }
70
- function findChains(name, ctx, scope = "both") {
71
- const raw = name.trim();
72
- const sanitized = sanitizeName(raw);
73
- return discoverAgentsAll(ctx.cwd, discoveryOptions(ctx), scope).chains
74
- .filter((c) => (scope === "both" || c.source === scope) && (c.name === raw || c.name === sanitized))
75
- .sort((a, b) => a.source.localeCompare(b.source));
76
- }
77
- function findEffectiveAgents(name, ctx, scope = "both") {
78
- const raw = name.trim();
79
- const sanitized = sanitizeName(raw);
80
- return discoverAgents(ctx.cwd, scope, discoveryOptions(ctx)).agents
81
- .filter((a) => a.name === raw || a.name === sanitized);
82
- }
83
- function nameExistsInScope(ctx, scope, name, excludePath) {
84
- const d = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx), scope);
85
- for (const a of scope === "user" ? d.user : d.project) {
86
- if (a.name === name && a.filePath !== excludePath)
87
- return true;
88
- }
89
- for (const c of d.chains) {
90
- if (c.source === scope && c.name === name && c.filePath !== excludePath)
91
- return true;
92
- }
93
- return false;
94
- }
95
- function unknownChainAgents(ctx, steps) {
96
- const d = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx));
97
- const known = new Set(allAgents(d).map((a) => a.name));
98
- return [...new Set(steps.map((s) => s.agent).filter((agent) => typeof agent === "string" && !known.has(agent)))].sort((a, b) => a.localeCompare(b));
99
- }
100
- function chainStepWarnings(ctx, steps) {
101
- const warnings = [];
102
- const available = new Set(discoverAvailableSkills(ctx.cwd, discoveryOptions(ctx)).map((s) => s.name));
103
- for (let i = 0; i < steps.length; i++) {
104
- const s = steps[i];
105
- if (s.model && !isClaudeCodeModel(s.model)) {
106
- const found = ctx.modelRegistry.getAvailable().some((m) => `${m.provider}/${m.id}` === s.model || m.id === s.model);
107
- if (!found)
108
- warnings.push(`Warning: step ${i + 1} (${s.agent}): model '${s.model}' is not in the current model registry.`);
109
- }
110
- if (Array.isArray(s.skills) && s.skills.length > 0) {
111
- const missing = s.skills.filter((sk) => !available.has(sk));
112
- if (missing.length)
113
- warnings.push(`Warning: step ${i + 1} (${s.agent}): skills not found: ${missing.join(", ")}.`);
114
- }
115
- }
116
- return warnings;
117
- }
118
- function modelWarning(ctx, model) {
119
- if (!model || isClaudeCodeModel(model))
120
- return undefined;
121
- const found = ctx.modelRegistry.getAvailable().some((m) => `${m.provider}/${m.id}` === model || m.id === model);
122
- return found ? undefined : `Warning: model '${model}' is not in the current model registry.`;
123
- }
124
- function fallbackModelsWarning(ctx, fallbackModels) {
125
- if (!fallbackModels || fallbackModels.length === 0)
126
- return undefined;
127
- const available = new Set(ctx.modelRegistry.getAvailable().flatMap((m) => [`${m.provider}/${m.id}`, m.id]));
128
- const missing = fallbackModels.filter((model) => !isClaudeCodeModel(model) && !available.has(model));
129
- return missing.length ? `Warning: fallback models not in the current model registry: ${missing.join(", ")}.` : undefined;
130
- }
131
- function skillsWarning(ctx, skills) {
132
- if (!skills || skills.length === 0)
133
- return undefined;
134
- const available = new Set(discoverAvailableSkills(ctx.cwd, discoveryOptions(ctx)).map((s) => s.name));
135
- const missing = skills.filter((s) => !available.has(s));
136
- return missing.length ? `Warning: skills not found: ${missing.join(", ")}.` : undefined;
137
- }
138
- const SAVED_CHAIN_STEP_KEYS = new Set(["agent", "task", "phase", "label", "as", "outputSchema", "output", "outputMode", "reads", "model", "skills", "progress"]);
139
- function parseStepList(raw) {
140
- if (!Array.isArray(raw))
141
- return { error: "config.steps must be an array." };
142
- if (raw.length === 0)
143
- return { error: "config.steps must include at least one step." };
144
- const steps = [];
145
- for (let i = 0; i < raw.length; i++) {
146
- const item = raw[i];
147
- if (!item || typeof item !== "object" || Array.isArray(item))
148
- return { error: `config.steps[${i}] must be an object.` };
149
- const s = item;
150
- if (hasKey(s, "skill"))
151
- return { error: `config.steps[${i}].skill is not supported; use skills.` };
152
- const unknownKeys = Object.keys(s).filter((key) => !SAVED_CHAIN_STEP_KEYS.has(key));
153
- if (unknownKeys.length)
154
- return { error: `config.steps[${i}] has unknown field${unknownKeys.length === 1 ? "" : "s"}: ${unknownKeys.join(", ")}.` };
155
- if (typeof s.agent !== "string" || !s.agent.trim())
156
- return { error: `config.steps[${i}].agent must be a non-empty string.` };
157
- const step = { agent: s.agent.trim(), task: typeof s.task === "string" ? s.task : "" };
158
- if (hasKey(s, "phase")) {
159
- if (typeof s.phase === "string")
160
- step.phase = s.phase;
161
- else
162
- return { error: `config.steps[${i}].phase must be a string.` };
163
- }
164
- if (hasKey(s, "label")) {
165
- if (typeof s.label === "string")
166
- step.label = s.label;
167
- else
168
- return { error: `config.steps[${i}].label must be a string.` };
169
- }
170
- if (hasKey(s, "as")) {
171
- if (typeof s.as === "string")
172
- step.as = s.as;
173
- else
174
- return { error: `config.steps[${i}].as must be a string.` };
175
- }
176
- if (hasKey(s, "outputSchema")) {
177
- if (typeof s.outputSchema === "string")
178
- step.outputSchema = s.outputSchema;
179
- else
180
- return { error: `config.steps[${i}].outputSchema must be a schema file path string for saved chains.` };
181
- }
182
- if (hasKey(s, "output")) {
183
- if (s.output === false)
184
- step.output = false;
185
- else if (typeof s.output === "string")
186
- step.output = s.output;
187
- else
188
- return { error: `config.steps[${i}].output must be a string or false.` };
189
- }
190
- if (hasKey(s, "outputMode")) {
191
- if (s.outputMode === "inline" || s.outputMode === "file-only")
192
- step.outputMode = s.outputMode;
193
- else
194
- return { error: `config.steps[${i}].outputMode must be 'inline' or 'file-only'.` };
195
- }
196
- if (hasKey(s, "reads")) {
197
- if (s.reads === false)
198
- step.reads = false;
199
- else if (Array.isArray(s.reads) && s.reads.every((value) => typeof value === "string"))
200
- step.reads = s.reads.map((value) => value.trim()).filter(Boolean);
201
- else
202
- return { error: `config.steps[${i}].reads must be a string array or false.` };
203
- }
204
- if (hasKey(s, "model")) {
205
- if (typeof s.model === "string")
206
- step.model = s.model;
207
- else
208
- return { error: `config.steps[${i}].model must be a string.` };
209
- }
210
- if (hasKey(s, "skill")) {
211
- return { error: `config.steps[${i}].skill is not supported for saved chains; use skills (array or false).` };
212
- }
213
- if (hasKey(s, "skills")) {
214
- if (s.skills === false)
215
- step.skills = false;
216
- else if (Array.isArray(s.skills) && s.skills.every((value) => typeof value === "string"))
217
- step.skills = s.skills.map((value) => value.trim()).filter(Boolean);
218
- else
219
- return { error: `config.steps[${i}].skills must be a string array or false.` };
220
- }
221
- if (hasKey(s, "progress")) {
222
- if (typeof s.progress === "boolean")
223
- step.progress = s.progress;
224
- else
225
- return { error: `config.steps[${i}].progress must be a boolean.` };
226
- }
227
- steps.push(step);
228
- }
229
- return { steps };
230
- }
231
- function parseTools(raw) {
232
- const tools = [];
233
- const mcpDirectTools = [];
234
- for (const item of parseCsv(raw)) {
235
- if (item.startsWith("mcp:")) {
236
- const direct = item.slice(4).trim();
237
- if (direct)
238
- mcpDirectTools.push(direct);
239
- }
240
- else
241
- tools.push(item);
242
- }
243
- return { tools: tools.length ? tools : undefined, mcpDirectTools: mcpDirectTools.length ? mcpDirectTools : undefined };
244
- }
245
- const CHAIN_CONFIG_KEYS = new Set(["name", "package", "description", "scope", "steps"]);
246
- function validateChainConfigKeys(cfg) {
247
- const unknownKeys = Object.keys(cfg).filter((key) => !CHAIN_CONFIG_KEYS.has(key));
248
- return unknownKeys.length ? `config has unknown field${unknownKeys.length === 1 ? "" : "s"}: ${unknownKeys.join(", ")}.` : undefined;
249
- }
250
- const AGENT_CONFIG_KEYS = new Set([
251
- "name", "package", "description", "scope", "systemPrompt", "model", "fallbackModels", "tools", "skills", "extensions", "thinking",
252
- "systemPromptMode", "inheritProjectContext", "inheritSkills", "defaultContext", "output", "reads", "progress", "allowSubagents",
253
- "maxSubagentDepth", "maxExecutionTimeMs", "maxTokens", "completionGuard",
254
- ]);
255
- function applyAgentConfig(target, cfg) {
256
- const unknownKeys = Object.keys(cfg).filter((key) => !AGENT_CONFIG_KEYS.has(key));
257
- if (unknownKeys.length)
258
- return `config has unknown field${unknownKeys.length === 1 ? "" : "s"}: ${unknownKeys.join(", ")}.`;
259
- if (hasKey(cfg, "systemPrompt")) {
260
- if (cfg.systemPrompt === false || cfg.systemPrompt === "")
261
- target.systemPrompt = "";
262
- else if (typeof cfg.systemPrompt === "string")
263
- target.systemPrompt = cfg.systemPrompt;
264
- else
265
- return "config.systemPrompt must be a string or false when provided.";
266
- }
267
- if (hasKey(cfg, "model")) {
268
- if (cfg.model === false || cfg.model === "")
269
- target.model = undefined;
270
- else if (typeof cfg.model === "string")
271
- target.model = cfg.model.trim() || undefined;
272
- else
273
- return "config.model must be a string or false when provided.";
274
- }
275
- if (hasKey(cfg, "fallbackModels")) {
276
- if (cfg.fallbackModels === false || cfg.fallbackModels === "")
277
- target.fallbackModels = undefined;
278
- else if (typeof cfg.fallbackModels === "string") {
279
- const models = parseCsv(cfg.fallbackModels);
280
- target.fallbackModels = models.length ? models : undefined;
281
- }
282
- else if (Array.isArray(cfg.fallbackModels)) {
283
- const models = cfg.fallbackModels
284
- .filter((value) => typeof value === "string")
285
- .map((value) => value.trim())
286
- .filter(Boolean);
287
- target.fallbackModels = models.length ? [...new Set(models)] : undefined;
288
- }
289
- else
290
- return "config.fallbackModels must be a comma-separated string, string array, or false when provided.";
291
- }
292
- if (hasKey(cfg, "tools")) {
293
- if (cfg.tools === false || cfg.tools === "") {
294
- target.tools = undefined;
295
- target.mcpDirectTools = undefined;
296
- }
297
- else if (typeof cfg.tools === "string") {
298
- const parsed = parseTools(cfg.tools);
299
- target.tools = parsed.tools;
300
- target.mcpDirectTools = parsed.mcpDirectTools;
301
- }
302
- else
303
- return "config.tools must be a comma-separated string or false when provided.";
304
- }
305
- if (hasKey(cfg, "skills")) {
306
- if (cfg.skills === false || cfg.skills === "")
307
- target.skills = undefined;
308
- else if (typeof cfg.skills === "string") {
309
- const skills = parseCsv(cfg.skills);
310
- target.skills = skills.length ? skills : undefined;
311
- }
312
- else
313
- return "config.skills must be a comma-separated string or false when provided.";
314
- }
315
- if (hasKey(cfg, "extensions")) {
316
- if (cfg.extensions === false)
317
- target.extensions = undefined;
318
- else if (cfg.extensions === "")
319
- target.extensions = [];
320
- else if (typeof cfg.extensions === "string")
321
- target.extensions = parseCsv(cfg.extensions);
322
- else
323
- return "config.extensions must be a comma-separated string, empty string, or false when provided.";
324
- }
325
- if (hasKey(cfg, "thinking")) {
326
- if (cfg.thinking === false || cfg.thinking === "")
327
- target.thinking = undefined;
328
- else if (typeof cfg.thinking === "string")
329
- target.thinking = cfg.thinking.trim() || undefined;
330
- else
331
- return "config.thinking must be a string or false when provided.";
332
- }
333
- if (hasKey(cfg, "systemPromptMode")) {
334
- if (cfg.systemPromptMode === "append" || cfg.systemPromptMode === "replace")
335
- target.systemPromptMode = cfg.systemPromptMode;
336
- else
337
- return "config.systemPromptMode must be 'append' or 'replace' when provided.";
338
- }
339
- if (hasKey(cfg, "inheritProjectContext")) {
340
- if (typeof cfg.inheritProjectContext !== "boolean")
341
- return "config.inheritProjectContext must be a boolean when provided.";
342
- target.inheritProjectContext = cfg.inheritProjectContext;
343
- }
344
- if (hasKey(cfg, "inheritSkills")) {
345
- if (typeof cfg.inheritSkills !== "boolean")
346
- return "config.inheritSkills must be a boolean when provided.";
347
- target.inheritSkills = cfg.inheritSkills;
348
- }
349
- if (hasKey(cfg, "defaultContext")) {
350
- if (cfg.defaultContext === false || cfg.defaultContext === "")
351
- target.defaultContext = undefined;
352
- else if (cfg.defaultContext === "fresh" || cfg.defaultContext === "fork")
353
- target.defaultContext = cfg.defaultContext;
354
- else
355
- return "config.defaultContext must be 'fresh', 'fork', or false when provided.";
356
- }
357
- if (hasKey(cfg, "output")) {
358
- if (cfg.output === false || cfg.output === "")
359
- target.output = undefined;
360
- else if (typeof cfg.output === "string")
361
- target.output = cfg.output;
362
- else
363
- return "config.output must be a string or false when provided.";
364
- }
365
- if (hasKey(cfg, "reads")) {
366
- if (cfg.reads === false || cfg.reads === "")
367
- target.defaultReads = undefined;
368
- else if (typeof cfg.reads === "string") {
369
- const reads = parseCsv(cfg.reads);
370
- target.defaultReads = reads.length ? reads : undefined;
371
- }
372
- else
373
- return "config.reads must be a comma-separated string or false when provided.";
374
- }
375
- if (hasKey(cfg, "progress")) {
376
- if (typeof cfg.progress !== "boolean")
377
- return "config.progress must be a boolean when provided.";
378
- target.defaultProgress = cfg.progress;
379
- }
380
- if (hasKey(cfg, "allowSubagents")) {
381
- if (typeof cfg.allowSubagents !== "boolean")
382
- return "config.allowSubagents must be a boolean when provided.";
383
- target.allowSubagents = cfg.allowSubagents;
384
- }
385
- if (hasKey(cfg, "maxSubagentDepth")) {
386
- if (cfg.maxSubagentDepth === false || cfg.maxSubagentDepth === "")
387
- target.maxSubagentDepth = undefined;
388
- else if (typeof cfg.maxSubagentDepth === "number" && Number.isInteger(cfg.maxSubagentDepth) && cfg.maxSubagentDepth >= 0) {
389
- target.maxSubagentDepth = cfg.maxSubagentDepth;
390
- }
391
- else
392
- return "config.maxSubagentDepth must be an integer >= 0 or false when provided.";
393
- }
394
- if (hasKey(cfg, "maxExecutionTimeMs")) {
395
- if (cfg.maxExecutionTimeMs === false || cfg.maxExecutionTimeMs === "")
396
- target.maxExecutionTimeMs = undefined;
397
- else if (typeof cfg.maxExecutionTimeMs === "number" && Number.isInteger(cfg.maxExecutionTimeMs) && cfg.maxExecutionTimeMs >= 1) {
398
- target.maxExecutionTimeMs = cfg.maxExecutionTimeMs;
399
- }
400
- else
401
- return "config.maxExecutionTimeMs must be an integer >= 1 or false when provided.";
402
- }
403
- if (hasKey(cfg, "maxTokens")) {
404
- if (cfg.maxTokens === false || cfg.maxTokens === "")
405
- target.maxTokens = undefined;
406
- else if (typeof cfg.maxTokens === "number" && Number.isInteger(cfg.maxTokens) && cfg.maxTokens >= 1) {
407
- target.maxTokens = cfg.maxTokens;
408
- }
409
- else
410
- return "config.maxTokens must be an integer >= 1 or false when provided.";
411
- }
412
- if (hasKey(cfg, "completionGuard")) {
413
- if (typeof cfg.completionGuard !== "boolean")
414
- return "config.completionGuard must be a boolean when provided.";
415
- target.completionGuard = cfg.completionGuard;
416
- }
417
- return undefined;
418
- }
419
- function isMutableTarget(target) {
420
- return target.source === "user" || target.source === "project";
421
- }
422
- function resolveTarget(kind, name, matches, ctx, scopeHint) {
423
- const mutable = matches.filter(isMutableTarget);
424
- if (mutable.length === 0) {
425
- if (matches.length > 0) {
426
- return result(`${kind === "agent" ? "Agent" : "Chain"} '${name}' is ${matches[0].source} and cannot be modified. Create a same-named ${kind} in user or project scope to override it.`, true);
427
- }
428
- const available = availableNames(ctx, kind);
429
- return result(`${kind === "agent" ? "Agent" : "Chain"} '${name}' not found. Available: ${available.join(", ") || "none"}.`, true);
430
- }
431
- if (mutable.length === 1)
432
- return mutable[0];
433
- const scope = asDisambiguationScope(scopeHint);
434
- if (!scope) {
435
- const paths = mutable.map((m) => `${m.source}: ${m.filePath}`).join("\n");
436
- const sources = new Set(mutable.map((entry) => entry.source));
437
- return sources.size === 1
438
- ? result(`${kind === "agent" ? "Agent" : "Chain"} '${name}' has multiple definitions in ${mutable[0].source} scope and cannot be modified safely. Remove or rename one definition first.\n${paths}`, true)
439
- : result(`${kind === "agent" ? "Agent" : "Chain"} '${name}' exists in both scopes. Specify agentScope: 'user' or 'project'.\n${paths}`, true);
440
- }
441
- const scoped = mutable.filter((m) => m.source === scope);
442
- if (scoped.length === 0)
443
- return result(`${kind === "agent" ? "Agent" : "Chain"} '${name}' not found in scope '${scope}'.`, true);
444
- if (scoped.length > 1) {
445
- return result(`${kind === "agent" ? "Agent" : "Chain"} '${name}' has multiple definitions in scope '${scope}' and cannot be modified safely. Remove or rename one definition first:\n${scoped.map((entry) => entry.filePath).join("\n")}`, true);
446
- }
447
- return scoped[0];
448
- }
449
- function renamePath(kind, currentPath, newName, scope, ctx) {
450
- if (nameExistsInScope(ctx, scope, newName, currentPath))
451
- return { error: `Name '${newName}' already exists in ${scope} scope.` };
452
- const ext = kind === "agent" ? ".md" : currentPath.endsWith(".chain.json") ? ".chain.json" : ".chain.md";
453
- const filePath = path.join(path.dirname(currentPath), `${newName}${ext}`);
454
- if (fs.existsSync(filePath) && filePath !== currentPath) {
455
- return { error: `File already exists at ${filePath} but is not a valid ${kind} definition. Remove or rename it first.` };
456
- }
457
- fs.renameSync(currentPath, filePath);
458
- return { filePath };
459
- }
460
- function formatModelDefaults(agent) {
461
- const thinking = resolveEffectiveThinking(agent.model, agent.thinking) ?? agent.thinking;
462
- const inherited = "inherited runtime default (unset)";
463
- const fallbacks = agent.fallbackModels?.map((model) => `${model} (thinking: ${resolveEffectiveThinking(model, agent.thinking ?? thinking) ?? inherited})`);
464
- return [
465
- `Model: ${agent.model ?? "inherited from parent (resolved at launch)"}`,
466
- `Thinking: ${thinking ?? inherited}`,
467
- `Fallback models: ${fallbacks?.length ? fallbacks.join(", ") : "none configured"}`,
468
- ];
469
- }
470
- function formatAgentDetail(agent) {
471
- const tools = [...(agent.tools ?? []), ...(agent.mcpDirectTools ?? []).map((t) => `mcp:${t}`)];
472
- const lines = [`Agent: ${agent.name} (${agent.source})`, `Path: ${agent.filePath}`, `Description: ${agent.description}`];
473
- if (agent.packageName) {
474
- lines.push(`Local name: ${frontmatterNameForConfig(agent)}`);
475
- lines.push(`Package: ${agent.packageName}`);
476
- }
477
- lines.push(...formatModelDefaults(agent));
478
- if (tools.length)
479
- lines.push(`Tools: ${tools.join(", ")}`);
480
- if (agent.skills?.length)
481
- lines.push(`Skills: ${agent.skills.join(", ")}`);
482
- lines.push(`System prompt mode: ${agent.systemPromptMode}`);
483
- lines.push(`Inherit project context: ${agent.inheritProjectContext ? "true" : "false"}`);
484
- lines.push(`Inherit skills: ${agent.inheritSkills ? "true" : "false"}`);
485
- if (agent.defaultContext)
486
- lines.push(`Default context: ${agent.defaultContext}`);
487
- if (agent.source === "builtin")
488
- lines.push(`Disabled: ${agent.disabled ? "true" : "false"}`);
489
- if (agent.extensions !== undefined)
490
- lines.push(`Extensions: ${agent.extensions.length ? agent.extensions.join(", ") : "(none)"}`);
491
- if (agent.output)
492
- lines.push(`Output: ${agent.output}`);
493
- if (agent.defaultReads?.length)
494
- lines.push(`Reads: ${agent.defaultReads.join(", ")}`);
495
- if (agent.defaultProgress)
496
- lines.push("Progress: true");
497
- if (agent.allowSubagents)
498
- lines.push("Allow subagents: true");
499
- if (agent.maxSubagentDepth !== undefined)
500
- lines.push(`Max subagent depth: ${agent.maxSubagentDepth}`);
501
- if (agent.maxExecutionTimeMs !== undefined)
502
- lines.push(`Max execution time: ${agent.maxExecutionTimeMs}ms`);
503
- if (agent.maxTokens !== undefined)
504
- lines.push(`Max tokens: ${agent.maxTokens}`);
505
- if (agent.completionGuard !== undefined)
506
- lines.push(`Completion guard: ${agent.completionGuard}`);
507
- if (agent.systemPrompt.trim())
508
- lines.push("", "System Prompt:", agent.systemPrompt);
509
- return lines.join("\n");
510
- }
511
- function formatChainStepDetail(step, index) {
512
- const lines = [];
513
- if (step.expand || step.collect) {
514
- const parallel = step.parallel && !Array.isArray(step.parallel) && typeof step.parallel === "object" ? step.parallel : undefined;
515
- const expand = step.expand && typeof step.expand === "object" ? step.expand : undefined;
516
- const collect = step.collect && typeof step.collect === "object" ? step.collect : undefined;
517
- lines.push(`${index + 1}. Dynamic fanout${typeof collect?.as === "string" ? ` -> ${collect.as}` : ""}`);
518
- if (expand?.from)
519
- lines.push(` Expand: ${String(expand.from.output ?? "?")}${String(expand.from.path ?? "")}`);
520
- if (typeof expand?.item === "string")
521
- lines.push(` Item variable: ${expand.item}`);
522
- if (typeof expand?.key === "string")
523
- lines.push(` Key: ${expand.key}`);
524
- if (typeof expand?.maxItems === "number")
525
- lines.push(` Max items: ${expand.maxItems}`);
526
- if (typeof expand?.onEmpty === "string")
527
- lines.push(` On empty: ${expand.onEmpty}`);
528
- if (parallel?.agent)
529
- lines.push(` Agent: ${String(parallel.agent)}`);
530
- if (typeof parallel?.label === "string")
531
- lines.push(` Label: ${parallel.label}`);
532
- if (typeof parallel?.task === "string" && parallel.task.trim())
533
- lines.push(` Task: ${parallel.task}`);
534
- if (parallel?.outputSchema)
535
- lines.push(" Structured output: true");
536
- if (collect?.outputSchema)
537
- lines.push(" Collect schema: true");
538
- if (step.concurrency !== undefined)
539
- lines.push(` Concurrency: ${step.concurrency}`);
540
- if (step.failFast !== undefined)
541
- lines.push(` Fail fast: ${step.failFast ? "true" : "false"}`);
542
- return lines;
543
- }
544
- lines.push(`${index + 1}. ${step.agent}`);
545
- if (step.task?.trim())
546
- lines.push(` Task: ${step.task}`);
547
- if (step.output === false)
548
- lines.push(" Output: false");
549
- else if (step.output)
550
- lines.push(` Output: ${step.output}`);
551
- if (step.outputMode)
552
- lines.push(` Output mode: ${step.outputMode}`);
553
- if (step.reads === false)
554
- lines.push(" Reads: false");
555
- else if (Array.isArray(step.reads) && step.reads.length > 0)
556
- lines.push(` Reads: ${step.reads.join(", ")}`);
557
- if (step.model)
558
- lines.push(` Model: ${step.model}`);
559
- if (step.skills === false)
560
- lines.push(" Skills: false");
561
- else if (Array.isArray(step.skills) && step.skills.length > 0)
562
- lines.push(` Skills: ${step.skills.join(", ")}`);
563
- if (step.progress !== undefined)
564
- lines.push(` Progress: ${step.progress ? "true" : "false"}`);
565
- return lines;
566
- }
567
- function formatChainDetail(chain) {
568
- const lines = [`Chain: ${chain.name} (${chain.source})`, `Path: ${chain.filePath}`, `Description: ${chain.description}`];
569
- if (chain.packageName) {
570
- lines.push(`Local name: ${frontmatterNameForConfig(chain)}`);
571
- lines.push(`Package: ${chain.packageName}`);
572
- }
573
- lines.push("", "Steps:");
574
- for (let i = 0; i < chain.steps.length; i++) {
575
- lines.push(...formatChainStepDetail(chain.steps[i], i));
576
- }
577
- return lines.join("\n");
578
- }
579
- const AGENT_ROLE_HINTS = {
580
- Recon: "Use for read-only codebase mapping, grep/delta sweeps, and external facts.",
581
- Planning: "Use when decomposition or an implementation handoff matters.",
582
- Implementation: "Use for bounded code/doc changes after scope is clear.",
583
- Review: "Use for independent validation, regressions, and drift checks.",
584
- Coordination: "Use for generic delegation or high-context decision checks.",
585
- Specialized: "Use only when the task matches the skill description.",
586
- "Custom/other": "Project/user agents not classified by the builtins.",
587
- };
588
- function agentListRole(agent) {
589
- const name = agent.name.split(".").at(-1) ?? agent.name;
590
- if (["scout", "context-builder", "researcher"].includes(name))
591
- return "Recon";
592
- if (name === "planner")
593
- return "Planning";
594
- if (["worker", "fixer"].includes(name))
595
- return "Implementation";
596
- if (name === "reviewer" || name.includes("review"))
597
- return "Review";
598
- if (["delegate", "oracle"].includes(name))
599
- return "Coordination";
600
- if (agent.source === "builtin")
601
- return "Specialized";
602
- return "Custom/other";
603
- }
604
- function formatAgentListLine(a) {
605
- return `- ${a.name} (${a.source}${a.defaultContext ? `, context: ${a.defaultContext}` : ""}): ${a.description}\n ${formatModelDefaults(a).join("; ")}`;
606
- }
1
+ import { discoverAgents, discoverAgentsAll } from "./agents.js";
2
+ import { formatAgentGroups, formatAgentDetail, formatChainDetail } from "./management-format.js";
3
+ import { handleCreate, handleUpdate, handleDelete } from "./management-persistence.js";
4
+ import { result, normalizeListScope, discoveryOptions, findEffectiveAgents, findChains, availableNamesText, } from "./management-targets.js";
5
+ export { handleCreate, handleUpdate } from "./management-persistence.js";
607
6
  export function handleList(params, ctx) {
608
7
  const scope = normalizeListScope(params.agentScope);
609
- if (!scope)
8
+ if (scope === undefined) {
610
9
  return result("agentScope must be 'user', 'project', or 'both'.", true);
611
- const d = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx), scope);
612
- const agents = discoverAgents(ctx.cwd, scope, discoveryOptions(ctx)).agents
613
- .sort((a, b) => a.name.localeCompare(b.name));
614
- const chains = d.chains.filter((c) => scope === "both" || c.source === scope).sort((a, b) => a.name.localeCompare(b.name));
615
- const diagnostics = [...d.agentDiagnostics, ...d.chainDiagnostics];
616
- const roleOrder = ["Recon", "Planning", "Implementation", "Review", "Coordination", "Specialized", "Custom/other"];
617
- const lines = ["Executable agents (grouped by role):"];
618
- if (!agents.length) {
619
- lines.push("- (none)");
620
10
  }
621
- else {
622
- for (const role of roleOrder) {
623
- const group = agents.filter((agent) => agentListRole(agent) === role);
624
- if (!group.length)
625
- continue;
626
- lines.push(``, `**${role}** — ${AGENT_ROLE_HINTS[role]}`, ...group.map(formatAgentListLine));
627
- }
628
- }
629
- lines.push("", "Chains:", ...(chains.length ? chains.map((c) => `- ${c.name} (${c.source}): ${c.description}`) : ["- (none)"]), ...(diagnostics.length ? ["", "Discovery diagnostics:", ...diagnostics.map((entry) => `- ${entry.filePath}: ${entry.error}`)] : []));
630
- return result(lines.join("\n"));
11
+ const discovery = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx), scope);
12
+ const agents = discoverAgents(ctx.cwd, scope, discoveryOptions(ctx)).agents.sort((a, b) => a.name.localeCompare(b.name));
13
+ const chains = discovery.chains
14
+ .filter((chain) => scope === "both" || chain.source === scope)
15
+ .sort((a, b) => a.name.localeCompare(b.name));
16
+ const diagnostics = [...discovery.agentDiagnostics, ...discovery.chainDiagnostics];
17
+ return result([
18
+ ...formatAgentGroups(agents),
19
+ "",
20
+ "Chains:",
21
+ ...(chains.length > 0
22
+ ? chains.map((chain) => `- ${chain.name} (${chain.source}): ${chain.description}`)
23
+ : ["- (none)"]),
24
+ ...(diagnostics.length > 0
25
+ ? [
26
+ "",
27
+ "Discovery diagnostics:",
28
+ ...diagnostics.map((entry) => `- ${entry.filePath}: ${entry.error}`),
29
+ ]
30
+ : []),
31
+ ].join("\n"));
32
+ }
33
+ function getBlocks(kind, name, ctx, scope) {
34
+ const matches = kind === "agent" ? findEffectiveAgents(name, ctx, scope) : findChains(name, ctx, scope);
35
+ if (matches.length === 0) {
36
+ return {
37
+ found: false,
38
+ blocks: [
39
+ `${kind === "agent" ? "Agent" : "Chain"} '${name}' not found. Available: ${availableNamesText(ctx, kind, scope)}.`,
40
+ ],
41
+ };
42
+ }
43
+ return {
44
+ found: true,
45
+ blocks: matches.map((match) => "steps" in match ? formatChainDetail(match) : formatAgentDetail(match)),
46
+ };
631
47
  }
632
48
  function handleGet(params, ctx) {
633
- if (!params.agent && !params.chainName)
49
+ const agent = params.agent ?? "";
50
+ const chain = params.chainName ?? "";
51
+ if (agent.length === 0 && chain.length === 0) {
634
52
  return result("Specify 'agent' or 'chainName' for get.", true);
635
- const hasBoth = Boolean(params.agent && params.chainName);
636
- const blocks = [];
637
- let anyFound = false;
53
+ }
638
54
  const scope = normalizeListScope(params.agentScope);
639
- if (!scope)
55
+ if (scope === undefined) {
640
56
  return result("agentScope must be 'user', 'project', or 'both'.", true);
641
- if (params.agent) {
642
- const matches = findEffectiveAgents(params.agent, ctx, scope);
643
- if (!matches.length) {
644
- const msg = `Agent '${params.agent}' not found. Available: ${availableNames(ctx, "agent", scope).join(", ") || "none"}.`;
645
- if (!hasBoth)
646
- return result(msg, true);
647
- blocks.push(msg);
648
- }
649
- else {
650
- anyFound = true;
651
- blocks.push(...matches.map(formatAgentDetail));
652
- }
653
- }
654
- if (params.chainName) {
655
- const matches = findChains(params.chainName, ctx, scope);
656
- if (!matches.length) {
657
- const msg = `Chain '${params.chainName}' not found. Available: ${availableNames(ctx, "chain", scope).join(", ") || "none"}.`;
658
- if (!hasBoth)
659
- return result(msg, true);
660
- blocks.push(msg);
661
- }
662
- else {
663
- anyFound = true;
664
- blocks.push(...matches.map(formatChainDetail));
665
- }
666
57
  }
667
- return result(blocks.join("\n\n"), !anyFound);
668
- }
669
- export function handleCreate(params, ctx) {
670
- const parsedConfig = configObject(params.config);
671
- if (parsedConfig.error)
672
- return result(parsedConfig.error, true);
673
- const cfg = parsedConfig.value;
674
- if (!cfg)
675
- return result("config required for create.", true);
676
- if (typeof cfg.name !== "string" || !cfg.name.trim())
677
- return result("config.name is required and must be a non-empty string.", true);
678
- if (typeof cfg.description !== "string" || !cfg.description.trim())
679
- return result("config.description is required and must be a non-empty string.", true);
680
- const name = sanitizeName(cfg.name);
681
- if (!name)
682
- return result("config.name is invalid after sanitization. Use letters, numbers, spaces, or hyphens.", true);
683
- const parsedPackage = parsePackageConfig(cfg.package);
684
- if (parsedPackage.error)
685
- return result(parsedPackage.error, true);
686
- const runtimeName = buildRuntimeName(name, parsedPackage.packageName);
687
- const scopeRaw = cfg.scope ?? "user";
688
- if (scopeRaw !== "user" && scopeRaw !== "project")
689
- return result("config.scope must be 'user' or 'project'.", true);
690
- const scope = scopeRaw;
691
- const isChain = hasKey(cfg, "steps");
692
- const options = discoveryOptions(ctx);
693
- if (scope === "project" && options.projectTrusted === false)
694
- return result("Project scope is not available because this project is untrusted. Run from a trusted project or use scope: 'user'.", true);
695
- const d = discoverAgentsAll(ctx.cwd, options);
696
- const targetDir = isChain
697
- ? scope === "user" ? d.userChainDir : d.projectChainDir ?? path.join(ctx.cwd, ".pi", "chains")
698
- : scope === "user" ? d.userDir : d.projectDir ?? path.join(ctx.cwd, ".pi", "agents");
699
- fs.mkdirSync(targetDir, { recursive: true });
700
- if (nameExistsInScope(ctx, scope, runtimeName))
701
- return result(`Name '${runtimeName}' already exists in ${scope} scope. Use update instead.`, true);
702
- const targetPath = path.join(targetDir, isChain ? `${runtimeName}.chain.md` : `${runtimeName}.md`);
703
- if (fs.existsSync(targetPath))
704
- return result(`File already exists at ${targetPath} but is not a valid ${isChain ? "chain" : "agent"} definition. Remove or rename it first.`, true);
705
- const warnings = [];
706
- if (!isChain && d.builtin.some((a) => a.name === runtimeName))
707
- warnings.push(`Note: this shadows the builtin agent '${runtimeName}'.`);
708
- if (isChain) {
709
- const keyError = validateChainConfigKeys(cfg);
710
- if (keyError)
711
- return result(keyError, true);
712
- const parsed = parseStepList(cfg.steps);
713
- if (parsed.error)
714
- return result(parsed.error, true);
715
- const chain = { name: runtimeName, localName: name, packageName: parsedPackage.packageName, description: cfg.description.trim(), source: scope, filePath: targetPath, steps: parsed.steps };
716
- fs.writeFileSync(targetPath, serializeChain(chain), "utf-8");
717
- const missing = unknownChainAgents(ctx, chain.steps);
718
- if (missing.length)
719
- warnings.push(`Warning: chain steps reference unknown agents: ${missing.join(", ")}.`);
720
- warnings.push(...chainStepWarnings(ctx, chain.steps));
721
- return result([`Created chain '${runtimeName}' at ${targetPath}.`, ...warnings].join("\n"));
722
- }
723
- const agent = {
724
- name: runtimeName,
725
- localName: name,
726
- packageName: parsedPackage.packageName,
727
- description: cfg.description.trim(),
728
- source: scope,
729
- filePath: targetPath,
730
- systemPrompt: "",
731
- systemPromptMode: defaultSystemPromptMode(name),
732
- inheritProjectContext: defaultInheritProjectContext(name),
733
- inheritSkills: defaultInheritSkills(),
734
- maxSubagentDepth: 0,
735
- };
736
- const applyError = applyAgentConfig(agent, cfg);
737
- if (applyError)
738
- return result(applyError, true);
739
- const mw = modelWarning(ctx, agent.model);
740
- if (mw)
741
- warnings.push(mw);
742
- const fmw = fallbackModelsWarning(ctx, agent.fallbackModels);
743
- if (fmw)
744
- warnings.push(fmw);
745
- const sw = skillsWarning(ctx, agent.skills);
746
- if (sw)
747
- warnings.push(sw);
748
- fs.writeFileSync(targetPath, serializeAgent(agent), "utf-8");
749
- return result([`Created agent '${runtimeName}' at ${targetPath}.`, ...warnings].join("\n"));
750
- }
751
- export function handleUpdate(params, ctx) {
752
- if (!params.agent && !params.chainName)
753
- return result("Specify 'agent' or 'chainName' for update.", true);
754
- if (params.agent && params.chainName)
755
- return result("Specify either 'agent' or 'chainName', not both.", true);
756
- const parsedConfig = configObject(params.config);
757
- if (parsedConfig.error)
758
- return result(parsedConfig.error, true);
759
- const cfg = parsedConfig.value;
760
- if (!cfg)
761
- return result("config required for update.", true);
762
- const warnings = [];
763
- if (params.agent) {
764
- const scopeHint = asDisambiguationScope(params.agentScope);
765
- const targetOrError = resolveTarget("agent", params.agent, findAgents(params.agent, ctx, scopeHint ?? "both"), ctx, params.agentScope);
766
- if ("content" in targetOrError)
767
- return targetOrError;
768
- const target = targetOrError;
769
- const updated = { ...target };
770
- const oldName = target.name;
771
- if (hasKey(cfg, "name") && (typeof cfg.name !== "string" || !cfg.name.trim()))
772
- return result("config.name must be a non-empty string when provided.", true);
773
- if (hasKey(cfg, "description") && (typeof cfg.description !== "string" || !cfg.description.trim()))
774
- return result("config.description must be a non-empty string when provided.", true);
775
- let newLocalName = target.localName ?? frontmatterNameForConfig(target);
776
- if (hasKey(cfg, "name")) {
777
- newLocalName = sanitizeName(cfg.name);
778
- if (!newLocalName)
779
- return result("config.name is invalid after sanitization.", true);
780
- }
781
- let newPackageName = target.packageName;
782
- if (hasKey(cfg, "package")) {
783
- const parsedPackage = parsePackageConfig(cfg.package);
784
- if (parsedPackage.error)
785
- return result(parsedPackage.error, true);
786
- newPackageName = parsedPackage.packageName;
787
- }
788
- const applyError = applyAgentConfig(updated, cfg);
789
- if (applyError)
790
- return result(applyError, true);
791
- updated.localName = newLocalName;
792
- updated.packageName = newPackageName;
793
- updated.name = buildRuntimeName(newLocalName, newPackageName);
794
- if (hasKey(cfg, "description"))
795
- updated.description = cfg.description.trim();
796
- if (hasKey(cfg, "model")) {
797
- const mw = modelWarning(ctx, updated.model);
798
- if (mw)
799
- warnings.push(mw);
800
- }
801
- if (hasKey(cfg, "fallbackModels")) {
802
- const fmw = fallbackModelsWarning(ctx, updated.fallbackModels);
803
- if (fmw)
804
- warnings.push(fmw);
805
- }
806
- if (hasKey(cfg, "skills")) {
807
- const sw = skillsWarning(ctx, updated.skills);
808
- if (sw)
809
- warnings.push(sw);
810
- }
811
- if (updated.name !== oldName) {
812
- const renamed = renamePath("agent", target.filePath, updated.name, target.source, ctx);
813
- if (renamed.error)
814
- return result(renamed.error, true);
815
- updated.filePath = renamed.filePath;
816
- }
817
- fs.writeFileSync(updated.filePath, serializeAgent(updated), "utf-8");
818
- if (updated.name !== oldName) {
819
- const refs = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx)).chains.filter((c) => c.steps.some((s) => s.agent === oldName)).map((c) => `${c.name} (${c.source})`);
820
- if (refs.length)
821
- warnings.push(`Warning: chains still reference '${oldName}': ${refs.join(", ")}.`);
822
- }
823
- const headline = updated.name === oldName
824
- ? `Updated agent '${updated.name}' at ${updated.filePath}.`
825
- : `Updated agent '${oldName}' to '${updated.name}' at ${updated.filePath}.`;
826
- return result([headline, ...warnings].join("\n"));
827
- }
828
- const scopeHint = asDisambiguationScope(params.agentScope);
829
- const targetOrError = resolveTarget("chain", params.chainName, findChains(params.chainName, ctx, scopeHint ?? "both"), ctx, params.agentScope);
830
- if ("content" in targetOrError)
831
- return targetOrError;
832
- const target = targetOrError;
833
- const keyError = validateChainConfigKeys(cfg);
834
- if (keyError)
835
- return result(keyError, true);
836
- const updated = { ...target, steps: [...target.steps] };
837
- const oldName = target.name;
838
- if (hasKey(cfg, "name") && (typeof cfg.name !== "string" || !cfg.name.trim()))
839
- return result("config.name must be a non-empty string when provided.", true);
840
- if (hasKey(cfg, "description") && (typeof cfg.description !== "string" || !cfg.description.trim()))
841
- return result("config.description must be a non-empty string when provided.", true);
842
- let newLocalName = target.localName ?? frontmatterNameForConfig(target);
843
- if (hasKey(cfg, "name")) {
844
- newLocalName = sanitizeName(cfg.name);
845
- if (!newLocalName)
846
- return result("config.name is invalid after sanitization.", true);
847
- }
848
- let newPackageName = target.packageName;
849
- if (hasKey(cfg, "package")) {
850
- const parsedPackage = parsePackageConfig(cfg.package);
851
- if (parsedPackage.error)
852
- return result(parsedPackage.error, true);
853
- newPackageName = parsedPackage.packageName;
854
- }
855
- let parsedSteps;
856
- if (hasKey(cfg, "steps")) {
857
- const parsed = parseStepList(cfg.steps);
858
- if (parsed.error)
859
- return result(parsed.error, true);
860
- parsedSteps = parsed.steps;
861
- }
862
- updated.localName = newLocalName;
863
- updated.packageName = newPackageName;
864
- updated.name = buildRuntimeName(newLocalName, newPackageName);
865
- if (hasKey(cfg, "description"))
866
- updated.description = cfg.description.trim();
867
- if (parsedSteps) {
868
- updated.steps = parsedSteps;
869
- const missing = unknownChainAgents(ctx, updated.steps);
870
- if (missing.length)
871
- warnings.push(`Warning: chain steps reference unknown agents: ${missing.join(", ")}.`);
872
- warnings.push(...chainStepWarnings(ctx, updated.steps));
873
- }
874
- if (updated.name !== oldName) {
875
- const renamed = renamePath("chain", target.filePath, updated.name, target.source, ctx);
876
- if (renamed.error)
877
- return result(renamed.error, true);
878
- updated.filePath = renamed.filePath;
879
- }
880
- fs.writeFileSync(updated.filePath, updated.filePath.endsWith(".chain.json") ? serializeJsonChain(updated) : serializeChain(updated), "utf-8");
881
- const headline = updated.name === oldName
882
- ? `Updated chain '${updated.name}' at ${updated.filePath}.`
883
- : `Updated chain '${oldName}' to '${updated.name}' at ${updated.filePath}.`;
884
- return result([headline, ...warnings].join("\n"));
885
- }
886
- function handleDelete(params, ctx) {
887
- if (!params.agent && !params.chainName)
888
- return result("Specify 'agent' or 'chainName' for delete.", true);
889
- if (params.agent && params.chainName)
890
- return result("Specify either 'agent' or 'chainName', not both.", true);
891
- const scopeHint = asDisambiguationScope(params.agentScope);
892
- if (params.agent) {
893
- const targetOrError = resolveTarget("agent", params.agent, findAgents(params.agent, ctx, scopeHint ?? "both"), ctx, params.agentScope);
894
- if ("content" in targetOrError)
895
- return targetOrError;
896
- const target = targetOrError;
897
- fs.unlinkSync(target.filePath);
898
- const refs = discoverAgentsAll(ctx.cwd, discoveryOptions(ctx)).chains.filter((c) => c.steps.some((s) => s.agent === target.name)).map((c) => `${c.name} (${c.source})`);
899
- const lines = [`Deleted agent '${target.name}' at ${target.filePath}.`];
900
- if (refs.length)
901
- lines.push(`Warning: chains reference deleted agent '${target.name}': ${refs.join(", ")}.`);
902
- return result(lines.join("\n"));
903
- }
904
- const targetOrError = resolveTarget("chain", params.chainName, findChains(params.chainName, ctx, scopeHint ?? "both"), ctx, params.agentScope);
905
- if ("content" in targetOrError)
906
- return targetOrError;
907
- const target = targetOrError;
908
- fs.unlinkSync(target.filePath);
909
- return result(`Deleted chain '${target.name}' at ${target.filePath}.`);
58
+ const blocks = [
59
+ ...(agent.length > 0 ? [getBlocks("agent", agent, ctx, scope)] : []),
60
+ ...(chain.length > 0 ? [getBlocks("chain", chain, ctx, scope)] : []),
61
+ ];
62
+ return result(blocks.flatMap((block) => block.blocks).join("\n\n"), !blocks.some((block) => block.found));
910
63
  }
911
64
  export function handleManagementAction(action, params, ctx) {
912
65
  if (params.agentScope !== undefined && normalizeListScope(params.agentScope) === undefined) {
913
66
  return result("agentScope must be 'user', 'project', or 'both'.", true);
914
67
  }
915
68
  switch (action) {
916
- case "list": return handleList(params, ctx);
917
- case "get": return handleGet(params, ctx);
918
- case "create": return handleCreate(params, ctx);
919
- case "update": return handleUpdate(params, ctx);
920
- case "delete": return handleDelete(params, ctx);
921
- default: return result(`Unknown action: ${action}`, true);
69
+ case "list":
70
+ return handleList(params, ctx);
71
+ case "get":
72
+ return handleGet(params, ctx);
73
+ case "create":
74
+ return handleCreate(params, ctx);
75
+ case "update":
76
+ return handleUpdate(params, ctx);
77
+ case "delete":
78
+ return handleDelete(params, ctx);
79
+ default:
80
+ return result(`Unknown action: ${action}`, true);
922
81
  }
923
82
  }