pi-subagents 0.68.0 → 0.70.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 (1450) hide show
  1. package/CHANGELOG.md +62 -1
  2. package/agents/reviewer.md +3 -2
  3. package/docs/agents.md +10 -2
  4. package/docs/configuration.md +1 -1
  5. package/docs/extension-api.md +1 -1
  6. package/docs/models.md +3 -1
  7. package/docs/observability.md +6 -0
  8. package/docs/tool-reference.md +23 -2
  9. package/docs/watchdog.md +2 -0
  10. package/docs/workflows.md +54 -2
  11. package/index.d.ts +3 -0
  12. package/index.d.ts.map +1 -0
  13. package/index.js +10 -0
  14. package/index.js.map +1 -0
  15. package/package.json +89 -73
  16. package/runner-peer-loader.mjs +4 -7
  17. package/runner-peer-preload.mjs +5 -7
  18. package/skills/pi-subagents/references/execution-controls.md +3 -1
  19. package/skills/pi-subagents/references/prompting-and-roles.md +2 -2
  20. package/src/agents/advertised-agent-prompt.d.ts +8 -0
  21. package/src/agents/advertised-agent-prompt.d.ts.map +1 -0
  22. package/src/agents/advertised-agent-prompt.js +77 -0
  23. package/src/agents/advertised-agent-prompt.js.map +1 -0
  24. package/src/agents/agent-management.d.ts +27 -0
  25. package/src/agents/agent-management.d.ts.map +1 -0
  26. package/src/agents/agent-management.js +1528 -0
  27. package/src/agents/agent-management.js.map +1 -0
  28. package/src/agents/agent-memory.d.ts +49 -0
  29. package/src/agents/agent-memory.d.ts.map +1 -0
  30. package/src/agents/agent-memory.js +349 -0
  31. package/src/agents/agent-memory.js.map +1 -0
  32. package/src/agents/agent-refinements.d.ts +100 -0
  33. package/src/agents/agent-refinements.d.ts.map +1 -0
  34. package/src/agents/agent-refinements.js +569 -0
  35. package/src/agents/agent-refinements.js.map +1 -0
  36. package/src/agents/agent-scope.d.ts +3 -0
  37. package/src/agents/agent-scope.d.ts.map +1 -0
  38. package/src/agents/agent-scope.js +6 -0
  39. package/src/agents/agent-scope.js.map +1 -0
  40. package/src/agents/agent-selection.d.ts +3 -0
  41. package/src/agents/agent-selection.d.ts.map +1 -0
  42. package/src/agents/agent-selection.js +23 -0
  43. package/src/agents/agent-selection.js.map +1 -0
  44. package/src/agents/agent-serializer.d.ts +8 -0
  45. package/src/agents/agent-serializer.d.ts.map +1 -0
  46. package/src/agents/agent-serializer.js +200 -0
  47. package/src/agents/agent-serializer.js.map +1 -0
  48. package/src/agents/agents.d.ts +313 -0
  49. package/src/agents/agents.d.ts.map +1 -0
  50. package/src/agents/agents.js +2622 -0
  51. package/src/agents/agents.js.map +1 -0
  52. package/src/agents/builtin-names.d.ts +2 -0
  53. package/src/agents/builtin-names.d.ts.map +1 -0
  54. package/src/agents/builtin-names.js +17 -0
  55. package/src/agents/builtin-names.js.map +1 -0
  56. package/src/agents/chain-serializer.d.ts +7 -0
  57. package/src/agents/chain-serializer.d.ts.map +1 -0
  58. package/src/agents/chain-serializer.js +319 -0
  59. package/src/agents/chain-serializer.js.map +1 -0
  60. package/src/agents/frontmatter.d.ts +16 -0
  61. package/src/agents/frontmatter.d.ts.map +1 -0
  62. package/src/agents/frontmatter.js +142 -0
  63. package/src/agents/frontmatter.js.map +1 -0
  64. package/src/agents/identity.d.ts +8 -0
  65. package/src/agents/identity.d.ts.map +1 -0
  66. package/src/agents/identity.js +30 -0
  67. package/src/agents/identity.js.map +1 -0
  68. package/src/agents/proactive-skills.d.ts +35 -0
  69. package/src/agents/proactive-skills.d.ts.map +1 -0
  70. package/src/agents/proactive-skills.js +154 -0
  71. package/src/agents/proactive-skills.js.map +1 -0
  72. package/src/agents/runtime-agent-events.d.ts +27 -0
  73. package/src/agents/runtime-agent-events.d.ts.map +1 -0
  74. package/src/agents/runtime-agent-events.js +53 -0
  75. package/src/agents/runtime-agent-events.js.map +1 -0
  76. package/src/agents/runtime-agent-registry.d.ts +59 -0
  77. package/src/agents/runtime-agent-registry.d.ts.map +1 -0
  78. package/src/agents/runtime-agent-registry.js +390 -0
  79. package/src/agents/runtime-agent-registry.js.map +1 -0
  80. package/src/agents/skills.d.ts +33 -0
  81. package/src/agents/skills.d.ts.map +1 -0
  82. package/src/agents/skills.js +685 -0
  83. package/src/agents/skills.js.map +1 -0
  84. package/src/api/agents.d.ts +5 -0
  85. package/src/api/agents.d.ts.map +1 -0
  86. package/src/api/agents.js +3 -0
  87. package/src/api/agents.js.map +1 -0
  88. package/src/api/background-work.d.ts +39 -0
  89. package/src/api/background-work.d.ts.map +1 -0
  90. package/src/api/background-work.js +165 -0
  91. package/src/api/background-work.js.map +1 -0
  92. package/src/api/capability-ceiling.d.ts +2 -0
  93. package/src/api/capability-ceiling.d.ts.map +1 -0
  94. package/src/api/capability-ceiling.js +2 -0
  95. package/src/api/capability-ceiling.js.map +1 -0
  96. package/src/api/child-tool-plan.d.ts +2 -0
  97. package/src/api/child-tool-plan.d.ts.map +1 -0
  98. package/src/api/child-tool-plan.js +2 -0
  99. package/src/api/child-tool-plan.js.map +1 -0
  100. package/src/api/control-channel.d.ts +2 -0
  101. package/src/api/control-channel.d.ts.map +1 -0
  102. package/src/api/control-channel.js +2 -0
  103. package/src/api/control-channel.js.map +1 -0
  104. package/src/api/delegation.d.ts +99 -0
  105. package/src/api/delegation.d.ts.map +1 -0
  106. package/src/api/delegation.js +9 -0
  107. package/src/api/delegation.js.map +1 -0
  108. package/src/api/external-job-provider.d.ts +58 -0
  109. package/src/api/external-job-provider.d.ts.map +1 -0
  110. package/src/api/external-job-provider.js +140 -0
  111. package/src/api/external-job-provider.js.map +1 -0
  112. package/src/api/external-runs.d.ts +48 -0
  113. package/src/api/external-runs.d.ts.map +1 -0
  114. package/src/api/external-runs.js +245 -0
  115. package/src/api/external-runs.js.map +1 -0
  116. package/src/api/intercom-bridge.d.ts +2 -0
  117. package/src/api/intercom-bridge.d.ts.map +1 -0
  118. package/src/api/intercom-bridge.js +2 -0
  119. package/src/api/intercom-bridge.js.map +1 -0
  120. package/src/api/preflight.d.ts +173 -0
  121. package/src/api/preflight.d.ts.map +1 -0
  122. package/src/api/preflight.js +362 -0
  123. package/src/api/preflight.js.map +1 -0
  124. package/src/api/project-panes.d.ts +8 -0
  125. package/src/api/project-panes.d.ts.map +1 -0
  126. package/src/api/project-panes.js +8 -0
  127. package/src/api/project-panes.js.map +1 -0
  128. package/src/api/required-child-extensions.d.ts +2 -0
  129. package/src/api/required-child-extensions.d.ts.map +1 -0
  130. package/src/api/required-child-extensions.js +2 -0
  131. package/src/api/required-child-extensions.js.map +1 -0
  132. package/src/api/shared-types.d.ts +2 -0
  133. package/src/api/shared-types.d.ts.map +1 -0
  134. package/src/api/shared-types.js +2 -0
  135. package/src/api/shared-types.js.map +1 -0
  136. package/src/api/workflow-resources.d.ts +3 -0
  137. package/src/api/workflow-resources.d.ts.map +1 -0
  138. package/src/api/workflow-resources.js +2 -0
  139. package/src/api/workflow-resources.js.map +1 -0
  140. package/src/extension/config.d.ts +8 -0
  141. package/src/extension/config.d.ts.map +1 -0
  142. package/src/extension/config.js +245 -0
  143. package/src/extension/config.js.map +1 -0
  144. package/src/extension/control-notices.d.ts +19 -0
  145. package/src/extension/control-notices.d.ts.map +1 -0
  146. package/src/extension/control-notices.js +34 -0
  147. package/src/extension/control-notices.js.map +1 -0
  148. package/src/extension/doctor.d.ts +33 -0
  149. package/src/extension/doctor.d.ts.map +1 -0
  150. package/src/extension/doctor.js +231 -0
  151. package/src/extension/doctor.js.map +1 -0
  152. package/src/extension/fanout-child.d.ts +7 -0
  153. package/src/extension/fanout-child.d.ts.map +1 -0
  154. package/src/extension/fanout-child.js +261 -0
  155. package/src/extension/fanout-child.js.map +1 -0
  156. package/src/extension/herdr-pi-bridge.d.ts +17 -0
  157. package/src/extension/herdr-pi-bridge.d.ts.map +1 -0
  158. package/src/extension/herdr-pi-bridge.js +243 -0
  159. package/src/extension/herdr-pi-bridge.js.map +1 -0
  160. package/src/extension/index.d.ts +20 -0
  161. package/src/extension/index.d.ts.map +1 -0
  162. package/src/extension/index.js +1108 -0
  163. package/src/extension/index.js.map +1 -0
  164. package/src/extension/public-execution.d.ts +62 -0
  165. package/src/extension/public-execution.d.ts.map +1 -0
  166. package/src/extension/public-execution.js +174 -0
  167. package/src/extension/public-execution.js.map +1 -0
  168. package/src/extension/rpc.d.ts +83 -0
  169. package/src/extension/rpc.d.ts.map +1 -0
  170. package/src/extension/rpc.js +687 -0
  171. package/src/extension/rpc.js.map +1 -0
  172. package/src/extension/schemas.d.ts +252 -0
  173. package/src/extension/schemas.d.ts.map +1 -0
  174. package/src/extension/schemas.js +396 -0
  175. package/src/extension/schemas.js.map +1 -0
  176. package/src/extension/steering-notices.d.ts +15 -0
  177. package/src/extension/steering-notices.d.ts.map +1 -0
  178. package/src/extension/steering-notices.js +23 -0
  179. package/src/extension/steering-notices.js.map +1 -0
  180. package/src/extension/subagent-guide.d.ts +4 -0
  181. package/src/extension/subagent-guide.d.ts.map +1 -0
  182. package/src/extension/subagent-guide.js +35 -0
  183. package/src/extension/subagent-guide.js.map +1 -0
  184. package/src/extension/tool-description.d.ts +20 -0
  185. package/src/extension/tool-description.d.ts.map +1 -0
  186. package/src/extension/tool-description.js +160 -0
  187. package/src/extension/tool-description.js.map +1 -0
  188. package/src/extension/tool-result.d.ts +10 -0
  189. package/src/extension/tool-result.d.ts.map +1 -0
  190. package/src/extension/tool-result.js +17 -0
  191. package/src/extension/tool-result.js.map +1 -0
  192. package/src/inspectors/actions.d.ts +23 -0
  193. package/src/inspectors/actions.d.ts.map +1 -0
  194. package/src/inspectors/actions.js +155 -0
  195. package/src/inspectors/actions.js.map +1 -0
  196. package/src/inspectors/ghostty/actions.d.ts +12 -0
  197. package/src/inspectors/ghostty/actions.d.ts.map +1 -0
  198. package/src/inspectors/ghostty/actions.js +63 -0
  199. package/src/inspectors/ghostty/actions.js.map +1 -0
  200. package/src/inspectors/ghostty/plugin.d.ts +8 -0
  201. package/src/inspectors/ghostty/plugin.d.ts.map +1 -0
  202. package/src/inspectors/ghostty/plugin.js +24 -0
  203. package/src/inspectors/ghostty/plugin.js.map +1 -0
  204. package/src/inspectors/herdr/actions.d.ts +26 -0
  205. package/src/inspectors/herdr/actions.d.ts.map +1 -0
  206. package/src/inspectors/herdr/actions.js +134 -0
  207. package/src/inspectors/herdr/actions.js.map +1 -0
  208. package/src/inspectors/herdr/client.d.ts +42 -0
  209. package/src/inspectors/herdr/client.d.ts.map +1 -0
  210. package/src/inspectors/herdr/client.js +130 -0
  211. package/src/inspectors/herdr/client.js.map +1 -0
  212. package/src/inspectors/herdr/focus.d.ts +25 -0
  213. package/src/inspectors/herdr/focus.d.ts.map +1 -0
  214. package/src/inspectors/herdr/focus.js +50 -0
  215. package/src/inspectors/herdr/focus.js.map +1 -0
  216. package/src/inspectors/herdr/plugin.d.ts +7 -0
  217. package/src/inspectors/herdr/plugin.d.ts.map +1 -0
  218. package/src/inspectors/herdr/plugin.js +15 -0
  219. package/src/inspectors/herdr/plugin.js.map +1 -0
  220. package/src/inspectors/herdr/project-panes.d.ts +137 -0
  221. package/src/inspectors/herdr/project-panes.d.ts.map +1 -0
  222. package/src/inspectors/herdr/project-panes.js +608 -0
  223. package/src/inspectors/herdr/project-panes.js.map +1 -0
  224. package/src/inspectors/inspector-runner.d.ts +24 -0
  225. package/src/inspectors/inspector-runner.d.ts.map +1 -0
  226. package/src/inspectors/inspector-runner.js +162 -0
  227. package/src/inspectors/inspector-runner.js.map +1 -0
  228. package/src/inspectors/plugins.d.ts +4 -0
  229. package/src/inspectors/plugins.d.ts.map +1 -0
  230. package/src/inspectors/plugins.js +7 -0
  231. package/src/inspectors/plugins.js.map +1 -0
  232. package/src/inspectors/session-roots-codec.d.ts +16 -0
  233. package/src/inspectors/session-roots-codec.d.ts.map +1 -0
  234. package/src/inspectors/session-roots-codec.js +33 -0
  235. package/src/inspectors/session-roots-codec.js.map +1 -0
  236. package/src/inspectors/shell-command.d.ts +2 -0
  237. package/src/inspectors/shell-command.d.ts.map +1 -0
  238. package/src/inspectors/shell-command.js +17 -0
  239. package/src/inspectors/shell-command.js.map +1 -0
  240. package/src/inspectors/types.d.ts +49 -0
  241. package/src/inspectors/types.d.ts.map +1 -0
  242. package/src/inspectors/types.js +2 -0
  243. package/src/inspectors/types.js.map +1 -0
  244. package/src/integrations/herdr-status.d.ts +46 -0
  245. package/src/integrations/herdr-status.d.ts.map +1 -0
  246. package/src/integrations/herdr-status.js +371 -0
  247. package/src/integrations/herdr-status.js.map +1 -0
  248. package/src/integrations/pi-web-session-liveness.d.ts +20 -0
  249. package/src/integrations/pi-web-session-liveness.d.ts.map +1 -0
  250. package/src/integrations/pi-web-session-liveness.js +54 -0
  251. package/src/integrations/pi-web-session-liveness.js.map +1 -0
  252. package/src/intercom/intercom-bridge.d.ts +59 -0
  253. package/src/intercom/intercom-bridge.d.ts.map +1 -0
  254. package/src/intercom/intercom-bridge.js +192 -0
  255. package/src/intercom/intercom-bridge.js.map +1 -0
  256. package/src/intercom/native-supervisor-channel.d.ts +64 -0
  257. package/src/intercom/native-supervisor-channel.d.ts.map +1 -0
  258. package/src/intercom/native-supervisor-channel.js +894 -0
  259. package/src/intercom/native-supervisor-channel.js.map +1 -0
  260. package/src/intercom/result-intercom.d.ts +36 -0
  261. package/src/intercom/result-intercom.d.ts.map +1 -0
  262. package/src/intercom/result-intercom.js +372 -0
  263. package/src/intercom/result-intercom.js.map +1 -0
  264. package/src/intercom/supervisor-ui.d.ts +40 -0
  265. package/src/intercom/supervisor-ui.d.ts.map +1 -0
  266. package/src/intercom/supervisor-ui.js +202 -0
  267. package/src/intercom/supervisor-ui.js.map +1 -0
  268. package/src/missions/actions.d.ts +55 -0
  269. package/src/missions/actions.d.ts.map +1 -0
  270. package/src/missions/actions.js +396 -0
  271. package/src/missions/actions.js.map +1 -0
  272. package/src/missions/goal-driver.d.ts +16 -0
  273. package/src/missions/goal-driver.d.ts.map +1 -0
  274. package/src/missions/goal-driver.js +157 -0
  275. package/src/missions/goal-driver.js.map +1 -0
  276. package/src/missions/lifecycle.d.ts +40 -0
  277. package/src/missions/lifecycle.d.ts.map +1 -0
  278. package/src/missions/lifecycle.js +352 -0
  279. package/src/missions/lifecycle.js.map +1 -0
  280. package/src/missions/store.d.ts +22 -0
  281. package/src/missions/store.d.ts.map +1 -0
  282. package/src/missions/store.js +573 -0
  283. package/src/missions/store.js.map +1 -0
  284. package/src/missions/types.d.ts +168 -0
  285. package/src/missions/types.d.ts.map +1 -0
  286. package/src/missions/types.js +10 -0
  287. package/src/missions/types.js.map +1 -0
  288. package/src/missions/workflow-state.d.ts +15 -0
  289. package/src/missions/workflow-state.d.ts.map +1 -0
  290. package/src/missions/workflow-state.js +274 -0
  291. package/src/missions/workflow-state.js.map +1 -0
  292. package/src/policy/authority.d.ts +10 -0
  293. package/src/policy/authority.d.ts.map +1 -0
  294. package/src/policy/authority.js +42 -0
  295. package/src/policy/authority.js.map +1 -0
  296. package/src/profiles/profiles.d.ts +135 -0
  297. package/src/profiles/profiles.d.ts.map +1 -0
  298. package/src/profiles/profiles.js +520 -0
  299. package/src/profiles/profiles.js.map +1 -0
  300. package/src/runs/background/active-async-capacity.d.ts +100 -0
  301. package/src/runs/background/active-async-capacity.d.ts.map +1 -0
  302. package/src/runs/background/active-async-capacity.js +492 -0
  303. package/src/runs/background/active-async-capacity.js.map +1 -0
  304. package/src/runs/background/active-run-index.d.ts +13 -0
  305. package/src/runs/background/active-run-index.d.ts.map +1 -0
  306. package/src/runs/background/active-run-index.js +158 -0
  307. package/src/runs/background/active-run-index.js.map +1 -0
  308. package/src/runs/background/async-execution.d.ts +274 -0
  309. package/src/runs/background/async-execution.d.ts.map +1 -0
  310. package/src/runs/background/async-execution.js +1989 -0
  311. package/src/runs/background/async-execution.js.map +1 -0
  312. package/src/runs/background/async-job-tracker.d.ts +28 -0
  313. package/src/runs/background/async-job-tracker.d.ts.map +1 -0
  314. package/src/runs/background/async-job-tracker.js +876 -0
  315. package/src/runs/background/async-job-tracker.js.map +1 -0
  316. package/src/runs/background/async-resume.d.ts +59 -0
  317. package/src/runs/background/async-resume.d.ts.map +1 -0
  318. package/src/runs/background/async-resume.js +670 -0
  319. package/src/runs/background/async-resume.js.map +1 -0
  320. package/src/runs/background/async-retention.d.ts +45 -0
  321. package/src/runs/background/async-retention.d.ts.map +1 -0
  322. package/src/runs/background/async-retention.js +884 -0
  323. package/src/runs/background/async-retention.js.map +1 -0
  324. package/src/runs/background/async-status-snapshot.d.ts +10 -0
  325. package/src/runs/background/async-status-snapshot.d.ts.map +1 -0
  326. package/src/runs/background/async-status-snapshot.js +25 -0
  327. package/src/runs/background/async-status-snapshot.js.map +1 -0
  328. package/src/runs/background/async-status.d.ts +169 -0
  329. package/src/runs/background/async-status.d.ts.map +1 -0
  330. package/src/runs/background/async-status.js +673 -0
  331. package/src/runs/background/async-status.js.map +1 -0
  332. package/src/runs/background/auto-drain.d.ts +17 -0
  333. package/src/runs/background/auto-drain.d.ts.map +1 -0
  334. package/src/runs/background/auto-drain.js +73 -0
  335. package/src/runs/background/auto-drain.js.map +1 -0
  336. package/src/runs/background/binary-bootstrap.d.ts +9 -0
  337. package/src/runs/background/binary-bootstrap.d.ts.map +1 -0
  338. package/src/runs/background/binary-bootstrap.js +41 -0
  339. package/src/runs/background/binary-bootstrap.js.map +1 -0
  340. package/src/runs/background/chain-append.d.ts +35 -0
  341. package/src/runs/background/chain-append.d.ts.map +1 -0
  342. package/src/runs/background/chain-append.js +300 -0
  343. package/src/runs/background/chain-append.js.map +1 -0
  344. package/src/runs/background/chain-root-attachment.d.ts +49 -0
  345. package/src/runs/background/chain-root-attachment.d.ts.map +1 -0
  346. package/src/runs/background/chain-root-attachment.js +184 -0
  347. package/src/runs/background/chain-root-attachment.js.map +1 -0
  348. package/src/runs/background/completion-batcher.d.ts +52 -0
  349. package/src/runs/background/completion-batcher.d.ts.map +1 -0
  350. package/src/runs/background/completion-batcher.js +120 -0
  351. package/src/runs/background/completion-batcher.js.map +1 -0
  352. package/src/runs/background/completion-dedupe.d.ts +14 -0
  353. package/src/runs/background/completion-dedupe.d.ts.map +1 -0
  354. package/src/runs/background/completion-dedupe.js +49 -0
  355. package/src/runs/background/completion-dedupe.js.map +1 -0
  356. package/src/runs/background/completion-replay.d.ts +48 -0
  357. package/src/runs/background/completion-replay.d.ts.map +1 -0
  358. package/src/runs/background/completion-replay.js +267 -0
  359. package/src/runs/background/completion-replay.js.map +1 -0
  360. package/src/runs/background/control-channel.d.ts +156 -0
  361. package/src/runs/background/control-channel.d.ts.map +1 -0
  362. package/src/runs/background/control-channel.js +521 -0
  363. package/src/runs/background/control-channel.js.map +1 -0
  364. package/src/runs/background/fleet-view.d.ts +64 -0
  365. package/src/runs/background/fleet-view.d.ts.map +1 -0
  366. package/src/runs/background/fleet-view.js +648 -0
  367. package/src/runs/background/fleet-view.js.map +1 -0
  368. package/src/runs/background/index-segment.d.ts +16 -0
  369. package/src/runs/background/index-segment.d.ts.map +1 -0
  370. package/src/runs/background/index-segment.js +59 -0
  371. package/src/runs/background/index-segment.js.map +1 -0
  372. package/src/runs/background/inspect-rpc.d.ts +60 -0
  373. package/src/runs/background/inspect-rpc.d.ts.map +1 -0
  374. package/src/runs/background/inspect-rpc.js +406 -0
  375. package/src/runs/background/inspect-rpc.js.map +1 -0
  376. package/src/runs/background/notify.d.ts +162 -0
  377. package/src/runs/background/notify.d.ts.map +1 -0
  378. package/src/runs/background/notify.js +665 -0
  379. package/src/runs/background/notify.js.map +1 -0
  380. package/src/runs/background/owned-process-tree.d.ts +11 -0
  381. package/src/runs/background/owned-process-tree.d.ts.map +1 -0
  382. package/src/runs/background/owned-process-tree.js +117 -0
  383. package/src/runs/background/owned-process-tree.js.map +1 -0
  384. package/src/runs/background/parallel-groups.d.ts +4 -0
  385. package/src/runs/background/parallel-groups.d.ts.map +1 -0
  386. package/src/runs/background/parallel-groups.js +47 -0
  387. package/src/runs/background/parallel-groups.js.map +1 -0
  388. package/src/runs/background/process-terminal.d.ts +34 -0
  389. package/src/runs/background/process-terminal.d.ts.map +1 -0
  390. package/src/runs/background/process-terminal.js +305 -0
  391. package/src/runs/background/process-terminal.js.map +1 -0
  392. package/src/runs/background/result-delivery-ownership.d.ts +11 -0
  393. package/src/runs/background/result-delivery-ownership.d.ts.map +1 -0
  394. package/src/runs/background/result-delivery-ownership.js +37 -0
  395. package/src/runs/background/result-delivery-ownership.js.map +1 -0
  396. package/src/runs/background/result-files.d.ts +33 -0
  397. package/src/runs/background/result-files.d.ts.map +1 -0
  398. package/src/runs/background/result-files.js +528 -0
  399. package/src/runs/background/result-files.js.map +1 -0
  400. package/src/runs/background/result-watcher.d.ts +87 -0
  401. package/src/runs/background/result-watcher.d.ts.map +1 -0
  402. package/src/runs/background/result-watcher.js +764 -0
  403. package/src/runs/background/result-watcher.js.map +1 -0
  404. package/src/runs/background/resume-guidance.d.ts +5 -0
  405. package/src/runs/background/resume-guidance.d.ts.map +1 -0
  406. package/src/runs/background/resume-guidance.js +57 -0
  407. package/src/runs/background/resume-guidance.js.map +1 -0
  408. package/src/runs/background/retained-children.d.ts +25 -0
  409. package/src/runs/background/retained-children.d.ts.map +1 -0
  410. package/src/runs/background/retained-children.js +128 -0
  411. package/src/runs/background/retained-children.js.map +1 -0
  412. package/src/runs/background/retained-nested-route-tracker.d.ts +13 -0
  413. package/src/runs/background/retained-nested-route-tracker.d.ts.map +1 -0
  414. package/src/runs/background/retained-nested-route-tracker.js +91 -0
  415. package/src/runs/background/retained-nested-route-tracker.js.map +1 -0
  416. package/src/runs/background/run-child-session.d.ts +123 -0
  417. package/src/runs/background/run-child-session.d.ts.map +1 -0
  418. package/src/runs/background/run-child-session.js +602 -0
  419. package/src/runs/background/run-child-session.js.map +1 -0
  420. package/src/runs/background/run-id-query.d.ts +4 -0
  421. package/src/runs/background/run-id-query.d.ts.map +1 -0
  422. package/src/runs/background/run-id-query.js +7 -0
  423. package/src/runs/background/run-id-query.js.map +1 -0
  424. package/src/runs/background/run-id-resolver.d.ts +23 -0
  425. package/src/runs/background/run-id-resolver.d.ts.map +1 -0
  426. package/src/runs/background/run-id-resolver.js +170 -0
  427. package/src/runs/background/run-id-resolver.js.map +1 -0
  428. package/src/runs/background/run-status.d.ts +26 -0
  429. package/src/runs/background/run-status.d.ts.map +1 -0
  430. package/src/runs/background/run-status.js +826 -0
  431. package/src/runs/background/run-status.js.map +1 -0
  432. package/src/runs/background/runner-aliases.d.ts +17 -0
  433. package/src/runs/background/runner-aliases.d.ts.map +1 -0
  434. package/src/runs/background/runner-aliases.js +141 -0
  435. package/src/runs/background/runner-aliases.js.map +1 -0
  436. package/src/runs/background/runner-child-launch.d.ts +24 -0
  437. package/src/runs/background/runner-child-launch.d.ts.map +1 -0
  438. package/src/runs/background/runner-child-launch.js +68 -0
  439. package/src/runs/background/runner-child-launch.js.map +1 -0
  440. package/src/runs/background/runner-child-sessions.d.ts +7 -0
  441. package/src/runs/background/runner-child-sessions.d.ts.map +1 -0
  442. package/src/runs/background/runner-child-sessions.js +35 -0
  443. package/src/runs/background/runner-child-sessions.js.map +1 -0
  444. package/src/runs/background/runner-http-dispatcher.d.ts +43 -0
  445. package/src/runs/background/runner-http-dispatcher.d.ts.map +1 -0
  446. package/src/runs/background/runner-http-dispatcher.js +114 -0
  447. package/src/runs/background/runner-http-dispatcher.js.map +1 -0
  448. package/src/runs/background/scheduled-runs.d.ts +116 -0
  449. package/src/runs/background/scheduled-runs.d.ts.map +1 -0
  450. package/src/runs/background/scheduled-runs.js +1024 -0
  451. package/src/runs/background/scheduled-runs.js.map +1 -0
  452. package/src/runs/background/stale-run-reconciler.d.ts +37 -0
  453. package/src/runs/background/stale-run-reconciler.d.ts.map +1 -0
  454. package/src/runs/background/stale-run-reconciler.js +393 -0
  455. package/src/runs/background/stale-run-reconciler.js.map +1 -0
  456. package/src/runs/background/steering.d.ts +52 -0
  457. package/src/runs/background/steering.d.ts.map +1 -0
  458. package/src/runs/background/steering.js +247 -0
  459. package/src/runs/background/steering.js.map +1 -0
  460. package/src/runs/background/subagent-runner.d.ts +201 -0
  461. package/src/runs/background/subagent-runner.d.ts.map +1 -0
  462. package/src/runs/background/subagent-runner.js +5134 -0
  463. package/src/runs/background/subagent-runner.js.map +1 -0
  464. package/src/runs/background/subagent-wait.d.ts +122 -0
  465. package/src/runs/background/subagent-wait.d.ts.map +1 -0
  466. package/src/runs/background/subagent-wait.js +735 -0
  467. package/src/runs/background/subagent-wait.js.map +1 -0
  468. package/src/runs/background/terminal-run-index.d.ts +8 -0
  469. package/src/runs/background/terminal-run-index.d.ts.map +1 -0
  470. package/src/runs/background/terminal-run-index.js +123 -0
  471. package/src/runs/background/terminal-run-index.js.map +1 -0
  472. package/src/runs/background/top-level-async.d.ts +8 -0
  473. package/src/runs/background/top-level-async.d.ts.map +1 -0
  474. package/src/runs/background/top-level-async.js +6 -0
  475. package/src/runs/background/top-level-async.js.map +1 -0
  476. package/src/runs/background/wait-completions.d.ts +29 -0
  477. package/src/runs/background/wait-completions.d.ts.map +1 -0
  478. package/src/runs/background/wait-completions.js +264 -0
  479. package/src/runs/background/wait-completions.js.map +1 -0
  480. package/src/runs/background/wait-config.d.ts +9 -0
  481. package/src/runs/background/wait-config.d.ts.map +1 -0
  482. package/src/runs/background/wait-config.js +47 -0
  483. package/src/runs/background/wait-config.js.map +1 -0
  484. package/src/runs/background/wait-subscriptions.d.ts +27 -0
  485. package/src/runs/background/wait-subscriptions.d.ts.map +1 -0
  486. package/src/runs/background/wait-subscriptions.js +337 -0
  487. package/src/runs/background/wait-subscriptions.js.map +1 -0
  488. package/src/runs/background/wait-tool.d.ts +7 -0
  489. package/src/runs/background/wait-tool.d.ts.map +1 -0
  490. package/src/runs/background/wait-tool.js +36 -0
  491. package/src/runs/background/wait-tool.js.map +1 -0
  492. package/src/runs/foreground/async-dismiss-action.d.ts +7 -0
  493. package/src/runs/foreground/async-dismiss-action.d.ts.map +1 -0
  494. package/src/runs/foreground/async-dismiss-action.js +82 -0
  495. package/src/runs/foreground/async-dismiss-action.js.map +1 -0
  496. package/src/runs/foreground/async-steering-action.d.ts +32 -0
  497. package/src/runs/foreground/async-steering-action.d.ts.map +1 -0
  498. package/src/runs/foreground/async-steering-action.js +270 -0
  499. package/src/runs/foreground/async-steering-action.js.map +1 -0
  500. package/src/runs/foreground/async-stop-action.d.ts +7 -0
  501. package/src/runs/foreground/async-stop-action.d.ts.map +1 -0
  502. package/src/runs/foreground/async-stop-action.js +171 -0
  503. package/src/runs/foreground/async-stop-action.js.map +1 -0
  504. package/src/runs/foreground/execution.d.ts +11 -0
  505. package/src/runs/foreground/execution.d.ts.map +1 -0
  506. package/src/runs/foreground/execution.js +2186 -0
  507. package/src/runs/foreground/execution.js.map +1 -0
  508. package/src/runs/foreground/foreground-control.d.ts +25 -0
  509. package/src/runs/foreground/foreground-control.d.ts.map +1 -0
  510. package/src/runs/foreground/foreground-control.js +139 -0
  511. package/src/runs/foreground/foreground-control.js.map +1 -0
  512. package/src/runs/foreground/foreground-history.d.ts +12 -0
  513. package/src/runs/foreground/foreground-history.d.ts.map +1 -0
  514. package/src/runs/foreground/foreground-history.js +165 -0
  515. package/src/runs/foreground/foreground-history.js.map +1 -0
  516. package/src/runs/foreground/prompt-audit.d.ts +33 -0
  517. package/src/runs/foreground/prompt-audit.d.ts.map +1 -0
  518. package/src/runs/foreground/prompt-audit.js +143 -0
  519. package/src/runs/foreground/prompt-audit.js.map +1 -0
  520. package/src/runs/foreground/subagent-executor.d.ts +296 -0
  521. package/src/runs/foreground/subagent-executor.d.ts.map +1 -0
  522. package/src/runs/foreground/subagent-executor.js +7047 -0
  523. package/src/runs/foreground/subagent-executor.js.map +1 -0
  524. package/src/runs/foreground/workflow-detach-reconcile.d.ts +16 -0
  525. package/src/runs/foreground/workflow-detach-reconcile.d.ts.map +1 -0
  526. package/src/runs/foreground/workflow-detach-reconcile.js +284 -0
  527. package/src/runs/foreground/workflow-detach-reconcile.js.map +1 -0
  528. package/src/runs/foreground/workflow-foreground-steering.d.ts +44 -0
  529. package/src/runs/foreground/workflow-foreground-steering.d.ts.map +1 -0
  530. package/src/runs/foreground/workflow-foreground-steering.js +149 -0
  531. package/src/runs/foreground/workflow-foreground-steering.js.map +1 -0
  532. package/src/runs/shared/abort-recovery.d.ts +27 -0
  533. package/src/runs/shared/abort-recovery.d.ts.map +1 -0
  534. package/src/runs/shared/abort-recovery.js +109 -0
  535. package/src/runs/shared/abort-recovery.js.map +1 -0
  536. package/src/runs/shared/acceptance.d.ts +145 -0
  537. package/src/runs/shared/acceptance.d.ts.map +1 -0
  538. package/src/runs/shared/acceptance.js +1650 -0
  539. package/src/runs/shared/acceptance.js.map +1 -0
  540. package/src/runs/shared/agent-contract.d.ts +6 -0
  541. package/src/runs/shared/agent-contract.d.ts.map +1 -0
  542. package/src/runs/shared/agent-contract.js +36 -0
  543. package/src/runs/shared/agent-contract.js.map +1 -0
  544. package/src/runs/shared/async-status-projection.d.ts +94 -0
  545. package/src/runs/shared/async-status-projection.d.ts.map +1 -0
  546. package/src/runs/shared/async-status-projection.js +542 -0
  547. package/src/runs/shared/async-status-projection.js.map +1 -0
  548. package/src/runs/shared/background-process-options.d.ts +5 -0
  549. package/src/runs/shared/background-process-options.d.ts.map +1 -0
  550. package/src/runs/shared/background-process-options.js +7 -0
  551. package/src/runs/shared/background-process-options.js.map +1 -0
  552. package/src/runs/shared/capability-ceiling.d.ts +58 -0
  553. package/src/runs/shared/capability-ceiling.d.ts.map +1 -0
  554. package/src/runs/shared/capability-ceiling.js +179 -0
  555. package/src/runs/shared/capability-ceiling.js.map +1 -0
  556. package/src/runs/shared/chain-outputs.d.ts +19 -0
  557. package/src/runs/shared/chain-outputs.d.ts.map +1 -0
  558. package/src/runs/shared/chain-outputs.js +105 -0
  559. package/src/runs/shared/chain-outputs.js.map +1 -0
  560. package/src/runs/shared/child-hooks.d.ts +34 -0
  561. package/src/runs/shared/child-hooks.d.ts.map +1 -0
  562. package/src/runs/shared/child-hooks.js +188 -0
  563. package/src/runs/shared/child-hooks.js.map +1 -0
  564. package/src/runs/shared/child-identity.d.ts +24 -0
  565. package/src/runs/shared/child-identity.d.ts.map +1 -0
  566. package/src/runs/shared/child-identity.js +41 -0
  567. package/src/runs/shared/child-identity.js.map +1 -0
  568. package/src/runs/shared/child-launch-plan.d.ts +71 -0
  569. package/src/runs/shared/child-launch-plan.d.ts.map +1 -0
  570. package/src/runs/shared/child-launch-plan.js +89 -0
  571. package/src/runs/shared/child-launch-plan.js.map +1 -0
  572. package/src/runs/shared/child-launch.d.ts +114 -0
  573. package/src/runs/shared/child-launch.d.ts.map +1 -0
  574. package/src/runs/shared/child-launch.js +231 -0
  575. package/src/runs/shared/child-launch.js.map +1 -0
  576. package/src/runs/shared/child-lifecycle.d.ts +14 -0
  577. package/src/runs/shared/child-lifecycle.d.ts.map +1 -0
  578. package/src/runs/shared/child-lifecycle.js +23 -0
  579. package/src/runs/shared/child-lifecycle.js.map +1 -0
  580. package/src/runs/shared/child-runtime-config.d.ts +102 -0
  581. package/src/runs/shared/child-runtime-config.d.ts.map +1 -0
  582. package/src/runs/shared/child-runtime-config.js +39 -0
  583. package/src/runs/shared/child-runtime-config.js.map +1 -0
  584. package/src/runs/shared/child-session.d.ts +155 -0
  585. package/src/runs/shared/child-session.d.ts.map +1 -0
  586. package/src/runs/shared/child-session.js +347 -0
  587. package/src/runs/shared/child-session.js.map +1 -0
  588. package/src/runs/shared/child-tool-plan.d.ts +73 -0
  589. package/src/runs/shared/child-tool-plan.d.ts.map +1 -0
  590. package/src/runs/shared/child-tool-plan.js +380 -0
  591. package/src/runs/shared/child-tool-plan.js.map +1 -0
  592. package/src/runs/shared/claude-code-adapter.d.ts +25 -0
  593. package/src/runs/shared/claude-code-adapter.d.ts.map +1 -0
  594. package/src/runs/shared/claude-code-adapter.js +120 -0
  595. package/src/runs/shared/claude-code-adapter.js.map +1 -0
  596. package/src/runs/shared/codex-exec-adapter.d.ts +26 -0
  597. package/src/runs/shared/codex-exec-adapter.d.ts.map +1 -0
  598. package/src/runs/shared/codex-exec-adapter.js +128 -0
  599. package/src/runs/shared/codex-exec-adapter.js.map +1 -0
  600. package/src/runs/shared/completion-evidence.d.ts +31 -0
  601. package/src/runs/shared/completion-evidence.d.ts.map +1 -0
  602. package/src/runs/shared/completion-evidence.js +54 -0
  603. package/src/runs/shared/completion-evidence.js.map +1 -0
  604. package/src/runs/shared/completion-guard.d.ts +35 -0
  605. package/src/runs/shared/completion-guard.d.ts.map +1 -0
  606. package/src/runs/shared/completion-guard.js +214 -0
  607. package/src/runs/shared/completion-guard.js.map +1 -0
  608. package/src/runs/shared/context-mode.d.ts +13 -0
  609. package/src/runs/shared/context-mode.d.ts.map +1 -0
  610. package/src/runs/shared/context-mode.js +39 -0
  611. package/src/runs/shared/context-mode.js.map +1 -0
  612. package/src/runs/shared/cursor-agent-adapter.d.ts +27 -0
  613. package/src/runs/shared/cursor-agent-adapter.d.ts.map +1 -0
  614. package/src/runs/shared/cursor-agent-adapter.js +100 -0
  615. package/src/runs/shared/cursor-agent-adapter.js.map +1 -0
  616. package/src/runs/shared/dynamic-fanout.d.ts +50 -0
  617. package/src/runs/shared/dynamic-fanout.d.ts.map +1 -0
  618. package/src/runs/shared/dynamic-fanout.js +274 -0
  619. package/src/runs/shared/dynamic-fanout.js.map +1 -0
  620. package/src/runs/shared/effective-system-prompt.d.ts +18 -0
  621. package/src/runs/shared/effective-system-prompt.d.ts.map +1 -0
  622. package/src/runs/shared/effective-system-prompt.js +23 -0
  623. package/src/runs/shared/effective-system-prompt.js.map +1 -0
  624. package/src/runs/shared/extension-bindings.d.ts +17 -0
  625. package/src/runs/shared/extension-bindings.d.ts.map +1 -0
  626. package/src/runs/shared/extension-bindings.js +83 -0
  627. package/src/runs/shared/extension-bindings.js.map +1 -0
  628. package/src/runs/shared/external-cli-contract.d.ts +30 -0
  629. package/src/runs/shared/external-cli-contract.d.ts.map +1 -0
  630. package/src/runs/shared/external-cli-contract.js +146 -0
  631. package/src/runs/shared/external-cli-contract.js.map +1 -0
  632. package/src/runs/shared/external-cli-preflight.d.ts +32 -0
  633. package/src/runs/shared/external-cli-preflight.d.ts.map +1 -0
  634. package/src/runs/shared/external-cli-preflight.js +116 -0
  635. package/src/runs/shared/external-cli-preflight.js.map +1 -0
  636. package/src/runs/shared/external-cli-runner.d.ts +66 -0
  637. package/src/runs/shared/external-cli-runner.d.ts.map +1 -0
  638. package/src/runs/shared/external-cli-runner.js +421 -0
  639. package/src/runs/shared/external-cli-runner.js.map +1 -0
  640. package/src/runs/shared/external-job-bridge.d.ts +18 -0
  641. package/src/runs/shared/external-job-bridge.d.ts.map +1 -0
  642. package/src/runs/shared/external-job-bridge.js +424 -0
  643. package/src/runs/shared/external-job-bridge.js.map +1 -0
  644. package/src/runs/shared/external-job-runner.d.ts +45 -0
  645. package/src/runs/shared/external-job-runner.d.ts.map +1 -0
  646. package/src/runs/shared/external-job-runner.js +353 -0
  647. package/src/runs/shared/external-job-runner.js.map +1 -0
  648. package/src/runs/shared/fast-mode-extension.d.ts +4 -0
  649. package/src/runs/shared/fast-mode-extension.d.ts.map +1 -0
  650. package/src/runs/shared/fast-mode-extension.js +9 -0
  651. package/src/runs/shared/fast-mode-extension.js.map +1 -0
  652. package/src/runs/shared/herdr-connection.d.ts +71 -0
  653. package/src/runs/shared/herdr-connection.d.ts.map +1 -0
  654. package/src/runs/shared/herdr-connection.js +258 -0
  655. package/src/runs/shared/herdr-connection.js.map +1 -0
  656. package/src/runs/shared/herdr-external-adapters.d.ts +148 -0
  657. package/src/runs/shared/herdr-external-adapters.d.ts.map +1 -0
  658. package/src/runs/shared/herdr-external-adapters.js +405 -0
  659. package/src/runs/shared/herdr-external-adapters.js.map +1 -0
  660. package/src/runs/shared/herdr-machine.d.ts +48 -0
  661. package/src/runs/shared/herdr-machine.d.ts.map +1 -0
  662. package/src/runs/shared/herdr-machine.js +247 -0
  663. package/src/runs/shared/herdr-machine.js.map +1 -0
  664. package/src/runs/shared/herdr-pi-protocol.d.ts +22 -0
  665. package/src/runs/shared/herdr-pi-protocol.d.ts.map +1 -0
  666. package/src/runs/shared/herdr-pi-protocol.js +58 -0
  667. package/src/runs/shared/herdr-pi-protocol.js.map +1 -0
  668. package/src/runs/shared/herdr-placed-run.d.ts +267 -0
  669. package/src/runs/shared/herdr-placed-run.d.ts.map +1 -0
  670. package/src/runs/shared/herdr-placed-run.js +716 -0
  671. package/src/runs/shared/herdr-placed-run.js.map +1 -0
  672. package/src/runs/shared/host-step-status.d.ts +34 -0
  673. package/src/runs/shared/host-step-status.d.ts.map +1 -0
  674. package/src/runs/shared/host-step-status.js +245 -0
  675. package/src/runs/shared/host-step-status.js.map +1 -0
  676. package/src/runs/shared/lane-metadata.d.ts +24 -0
  677. package/src/runs/shared/lane-metadata.d.ts.map +1 -0
  678. package/src/runs/shared/lane-metadata.js +127 -0
  679. package/src/runs/shared/lane-metadata.js.map +1 -0
  680. package/src/runs/shared/launch-cwd.d.ts +2 -0
  681. package/src/runs/shared/launch-cwd.d.ts.map +1 -0
  682. package/src/runs/shared/launch-cwd.js +17 -0
  683. package/src/runs/shared/launch-cwd.js.map +1 -0
  684. package/src/runs/shared/llm-intent-arbiter.d.ts +48 -0
  685. package/src/runs/shared/llm-intent-arbiter.d.ts.map +1 -0
  686. package/src/runs/shared/llm-intent-arbiter.js +235 -0
  687. package/src/runs/shared/llm-intent-arbiter.js.map +1 -0
  688. package/src/runs/shared/long-running-guard.d.ts +33 -0
  689. package/src/runs/shared/long-running-guard.d.ts.map +1 -0
  690. package/src/runs/shared/long-running-guard.js +199 -0
  691. package/src/runs/shared/long-running-guard.js.map +1 -0
  692. package/src/runs/shared/mcp-config-sources.d.ts +30 -0
  693. package/src/runs/shared/mcp-config-sources.d.ts.map +1 -0
  694. package/src/runs/shared/mcp-config-sources.js +419 -0
  695. package/src/runs/shared/mcp-config-sources.js.map +1 -0
  696. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts +59 -0
  697. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts.map +1 -0
  698. package/src/runs/shared/mcp-direct-tool-allowlist.js +400 -0
  699. package/src/runs/shared/mcp-direct-tool-allowlist.js.map +1 -0
  700. package/src/runs/shared/mcp-direct-tool-grant.d.ts +41 -0
  701. package/src/runs/shared/mcp-direct-tool-grant.d.ts.map +1 -0
  702. package/src/runs/shared/mcp-direct-tool-grant.js +146 -0
  703. package/src/runs/shared/mcp-direct-tool-grant.js.map +1 -0
  704. package/src/runs/shared/model-resolution-diagnostic.d.ts +22 -0
  705. package/src/runs/shared/model-resolution-diagnostic.d.ts.map +1 -0
  706. package/src/runs/shared/model-resolution-diagnostic.js +65 -0
  707. package/src/runs/shared/model-resolution-diagnostic.js.map +1 -0
  708. package/src/runs/shared/model-resolution.d.ts +92 -0
  709. package/src/runs/shared/model-resolution.d.ts.map +1 -0
  710. package/src/runs/shared/model-resolution.js +343 -0
  711. package/src/runs/shared/model-resolution.js.map +1 -0
  712. package/src/runs/shared/model-scope.d.ts +68 -0
  713. package/src/runs/shared/model-scope.d.ts.map +1 -0
  714. package/src/runs/shared/model-scope.js +156 -0
  715. package/src/runs/shared/model-scope.js.map +1 -0
  716. package/src/runs/shared/mutation-evidence.d.ts +19 -0
  717. package/src/runs/shared/mutation-evidence.d.ts.map +1 -0
  718. package/src/runs/shared/mutation-evidence.js +199 -0
  719. package/src/runs/shared/mutation-evidence.js.map +1 -0
  720. package/src/runs/shared/nested-events.d.ts +134 -0
  721. package/src/runs/shared/nested-events.d.ts.map +1 -0
  722. package/src/runs/shared/nested-events.js +1056 -0
  723. package/src/runs/shared/nested-events.js.map +1 -0
  724. package/src/runs/shared/nested-path.d.ts +9 -0
  725. package/src/runs/shared/nested-path.d.ts.map +1 -0
  726. package/src/runs/shared/nested-path.js +35 -0
  727. package/src/runs/shared/nested-path.js.map +1 -0
  728. package/src/runs/shared/nested-render.d.ts +21 -0
  729. package/src/runs/shared/nested-render.d.ts.map +1 -0
  730. package/src/runs/shared/nested-render.js +116 -0
  731. package/src/runs/shared/nested-render.js.map +1 -0
  732. package/src/runs/shared/orca-progress-tabs.d.ts +33 -0
  733. package/src/runs/shared/orca-progress-tabs.d.ts.map +1 -0
  734. package/src/runs/shared/orca-progress-tabs.js +527 -0
  735. package/src/runs/shared/orca-progress-tabs.js.map +1 -0
  736. package/src/runs/shared/parallel-handoff.d.ts +73 -0
  737. package/src/runs/shared/parallel-handoff.d.ts.map +1 -0
  738. package/src/runs/shared/parallel-handoff.js +733 -0
  739. package/src/runs/shared/parallel-handoff.js.map +1 -0
  740. package/src/runs/shared/parallel-utils.d.ts +165 -0
  741. package/src/runs/shared/parallel-utils.d.ts.map +1 -0
  742. package/src/runs/shared/parallel-utils.js +126 -0
  743. package/src/runs/shared/parallel-utils.js.map +1 -0
  744. package/src/runs/shared/permissions.d.ts +13 -0
  745. package/src/runs/shared/permissions.d.ts.map +1 -0
  746. package/src/runs/shared/permissions.js +93 -0
  747. package/src/runs/shared/permissions.js.map +1 -0
  748. package/src/runs/shared/pi-spawn.d.ts +28 -0
  749. package/src/runs/shared/pi-spawn.d.ts.map +1 -0
  750. package/src/runs/shared/pi-spawn.js +156 -0
  751. package/src/runs/shared/pi-spawn.js.map +1 -0
  752. package/src/runs/shared/process-signal.d.ts +16 -0
  753. package/src/runs/shared/process-signal.d.ts.map +1 -0
  754. package/src/runs/shared/process-signal.js +22 -0
  755. package/src/runs/shared/process-signal.js.map +1 -0
  756. package/src/runs/shared/readonly-drain-observation.d.ts +26 -0
  757. package/src/runs/shared/readonly-drain-observation.d.ts.map +1 -0
  758. package/src/runs/shared/readonly-drain-observation.js +51 -0
  759. package/src/runs/shared/readonly-drain-observation.js.map +1 -0
  760. package/src/runs/shared/run-fanout-budget.d.ts +15 -0
  761. package/src/runs/shared/run-fanout-budget.d.ts.map +1 -0
  762. package/src/runs/shared/run-fanout-budget.js +259 -0
  763. package/src/runs/shared/run-fanout-budget.js.map +1 -0
  764. package/src/runs/shared/run-history.d.ts +20 -0
  765. package/src/runs/shared/run-history.d.ts.map +1 -0
  766. package/src/runs/shared/run-history.js +200 -0
  767. package/src/runs/shared/run-history.js.map +1 -0
  768. package/src/runs/shared/runtime-acknowledged-extensions.d.ts +8 -0
  769. package/src/runs/shared/runtime-acknowledged-extensions.d.ts.map +1 -0
  770. package/src/runs/shared/runtime-acknowledged-extensions.js +45 -0
  771. package/src/runs/shared/runtime-acknowledged-extensions.js.map +1 -0
  772. package/src/runs/shared/session-lease.d.ts +70 -0
  773. package/src/runs/shared/session-lease.d.ts.map +1 -0
  774. package/src/runs/shared/session-lease.js +251 -0
  775. package/src/runs/shared/session-lease.js.map +1 -0
  776. package/src/runs/shared/single-output.d.ts +61 -0
  777. package/src/runs/shared/single-output.d.ts.map +1 -0
  778. package/src/runs/shared/single-output.js +263 -0
  779. package/src/runs/shared/single-output.js.map +1 -0
  780. package/src/runs/shared/spawn-budget.d.ts +21 -0
  781. package/src/runs/shared/spawn-budget.d.ts.map +1 -0
  782. package/src/runs/shared/spawn-budget.js +94 -0
  783. package/src/runs/shared/spawn-budget.js.map +1 -0
  784. package/src/runs/shared/structured-output.d.ts +57 -0
  785. package/src/runs/shared/structured-output.d.ts.map +1 -0
  786. package/src/runs/shared/structured-output.js +391 -0
  787. package/src/runs/shared/structured-output.js.map +1 -0
  788. package/src/runs/shared/subagent-control.d.ts +50 -0
  789. package/src/runs/shared/subagent-control.d.ts.map +1 -0
  790. package/src/runs/shared/subagent-control.js +247 -0
  791. package/src/runs/shared/subagent-control.js.map +1 -0
  792. package/src/runs/shared/subagent-prompt-runtime.d.ts +28 -0
  793. package/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -0
  794. package/src/runs/shared/subagent-prompt-runtime.js +548 -0
  795. package/src/runs/shared/subagent-prompt-runtime.js.map +1 -0
  796. package/src/runs/shared/task-intent.d.ts +38 -0
  797. package/src/runs/shared/task-intent.d.ts.map +1 -0
  798. package/src/runs/shared/task-intent.js +213 -0
  799. package/src/runs/shared/task-intent.js.map +1 -0
  800. package/src/runs/shared/tool-availability.d.ts +17 -0
  801. package/src/runs/shared/tool-availability.d.ts.map +1 -0
  802. package/src/runs/shared/tool-availability.js +30 -0
  803. package/src/runs/shared/tool-availability.js.map +1 -0
  804. package/src/runs/shared/tool-budget.d.ts +22 -0
  805. package/src/runs/shared/tool-budget.d.ts.map +1 -0
  806. package/src/runs/shared/tool-budget.js +79 -0
  807. package/src/runs/shared/tool-budget.js.map +1 -0
  808. package/src/runs/shared/tool-timeout.d.ts +32 -0
  809. package/src/runs/shared/tool-timeout.d.ts.map +1 -0
  810. package/src/runs/shared/tool-timeout.js +74 -0
  811. package/src/runs/shared/tool-timeout.js.map +1 -0
  812. package/src/runs/shared/usage-budget.d.ts +8 -0
  813. package/src/runs/shared/usage-budget.d.ts.map +1 -0
  814. package/src/runs/shared/usage-budget.js +75 -0
  815. package/src/runs/shared/usage-budget.js.map +1 -0
  816. package/src/runs/shared/usage-reconciliation.d.ts +9 -0
  817. package/src/runs/shared/usage-reconciliation.d.ts.map +1 -0
  818. package/src/runs/shared/usage-reconciliation.js +72 -0
  819. package/src/runs/shared/usage-reconciliation.js.map +1 -0
  820. package/src/runs/shared/workflow-async-child-guidance.d.ts +4 -0
  821. package/src/runs/shared/workflow-async-child-guidance.d.ts.map +1 -0
  822. package/src/runs/shared/workflow-async-child-guidance.js +18 -0
  823. package/src/runs/shared/workflow-async-child-guidance.js.map +1 -0
  824. package/src/runs/shared/workflow-graph.d.ts +32 -0
  825. package/src/runs/shared/workflow-graph.d.ts.map +1 -0
  826. package/src/runs/shared/workflow-graph.js +222 -0
  827. package/src/runs/shared/workflow-graph.js.map +1 -0
  828. package/src/runs/shared/worktree-cleanup-plan.d.ts +78 -0
  829. package/src/runs/shared/worktree-cleanup-plan.d.ts.map +1 -0
  830. package/src/runs/shared/worktree-cleanup-plan.js +782 -0
  831. package/src/runs/shared/worktree-cleanup-plan.js.map +1 -0
  832. package/src/runs/shared/worktree-setup-command.d.ts +39 -0
  833. package/src/runs/shared/worktree-setup-command.d.ts.map +1 -0
  834. package/src/runs/shared/worktree-setup-command.js +201 -0
  835. package/src/runs/shared/worktree-setup-command.js.map +1 -0
  836. package/src/runs/shared/worktree.d.ts +179 -0
  837. package/src/runs/shared/worktree.d.ts.map +1 -0
  838. package/src/runs/shared/worktree.js +1333 -0
  839. package/src/runs/shared/worktree.js.map +1 -0
  840. package/src/shared/accessible-dir.d.ts +12 -0
  841. package/src/shared/accessible-dir.d.ts.map +1 -0
  842. package/src/shared/accessible-dir.js +37 -0
  843. package/src/shared/accessible-dir.js.map +1 -0
  844. package/src/shared/agent-stream-options.d.ts +6 -0
  845. package/src/shared/agent-stream-options.d.ts.map +1 -0
  846. package/src/shared/agent-stream-options.js +4 -0
  847. package/src/shared/agent-stream-options.js.map +1 -0
  848. package/src/shared/artifacts.d.ts +23 -0
  849. package/src/shared/artifacts.d.ts.map +1 -0
  850. package/src/shared/artifacts.js +273 -0
  851. package/src/shared/artifacts.js.map +1 -0
  852. package/src/shared/atomic-json.d.ts +19 -0
  853. package/src/shared/atomic-json.d.ts.map +1 -0
  854. package/src/shared/atomic-json.js +60 -0
  855. package/src/shared/atomic-json.js.map +1 -0
  856. package/src/shared/capacity-resilient-json.d.ts +27 -0
  857. package/src/shared/capacity-resilient-json.d.ts.map +1 -0
  858. package/src/shared/capacity-resilient-json.js +87 -0
  859. package/src/shared/capacity-resilient-json.js.map +1 -0
  860. package/src/shared/child-cache-retention.d.ts +30 -0
  861. package/src/shared/child-cache-retention.d.ts.map +1 -0
  862. package/src/shared/child-cache-retention.js +41 -0
  863. package/src/shared/child-cache-retention.js.map +1 -0
  864. package/src/shared/child-session-name.d.ts +9 -0
  865. package/src/shared/child-session-name.d.ts.map +1 -0
  866. package/src/shared/child-session-name.js +39 -0
  867. package/src/shared/child-session-name.js.map +1 -0
  868. package/src/shared/child-transcript.d.ts +38 -0
  869. package/src/shared/child-transcript.d.ts.map +1 -0
  870. package/src/shared/child-transcript.js +226 -0
  871. package/src/shared/child-transcript.js.map +1 -0
  872. package/src/shared/completion-owner.d.ts +3 -0
  873. package/src/shared/completion-owner.d.ts.map +1 -0
  874. package/src/shared/completion-owner.js +9 -0
  875. package/src/shared/completion-owner.js.map +1 -0
  876. package/src/shared/display-text.d.ts +6 -0
  877. package/src/shared/display-text.d.ts.map +1 -0
  878. package/src/shared/display-text.js +155 -0
  879. package/src/shared/display-text.js.map +1 -0
  880. package/src/shared/extension-context.d.ts +6 -0
  881. package/src/shared/extension-context.d.ts.map +1 -0
  882. package/src/shared/extension-context.js +22 -0
  883. package/src/shared/extension-context.js.map +1 -0
  884. package/src/shared/file-coalescer.d.ts +12 -0
  885. package/src/shared/file-coalescer.d.ts.map +1 -0
  886. package/src/shared/file-coalescer.js +35 -0
  887. package/src/shared/file-coalescer.js.map +1 -0
  888. package/src/shared/file-system-retry.d.ts +32 -0
  889. package/src/shared/file-system-retry.d.ts.map +1 -0
  890. package/src/shared/file-system-retry.js +85 -0
  891. package/src/shared/file-system-retry.js.map +1 -0
  892. package/src/shared/fork-context.d.ts +59 -0
  893. package/src/shared/fork-context.d.ts.map +1 -0
  894. package/src/shared/fork-context.js +171 -0
  895. package/src/shared/fork-context.js.map +1 -0
  896. package/src/shared/fork-session-cwd.d.ts +3 -0
  897. package/src/shared/fork-session-cwd.d.ts.map +1 -0
  898. package/src/shared/fork-session-cwd.js +24 -0
  899. package/src/shared/fork-session-cwd.js.map +1 -0
  900. package/src/shared/formatters.d.ts +36 -0
  901. package/src/shared/formatters.d.ts.map +1 -0
  902. package/src/shared/formatters.js +143 -0
  903. package/src/shared/formatters.js.map +1 -0
  904. package/src/shared/jsonl-writer.d.ts +21 -0
  905. package/src/shared/jsonl-writer.d.ts.map +1 -0
  906. package/src/shared/jsonl-writer.js +68 -0
  907. package/src/shared/jsonl-writer.js.map +1 -0
  908. package/src/shared/launch-contract.d.ts +64 -0
  909. package/src/shared/launch-contract.d.ts.map +1 -0
  910. package/src/shared/launch-contract.js +141 -0
  911. package/src/shared/launch-contract.js.map +1 -0
  912. package/src/shared/model-info.d.ts +44 -0
  913. package/src/shared/model-info.d.ts.map +1 -0
  914. package/src/shared/model-info.js +73 -0
  915. package/src/shared/model-info.js.map +1 -0
  916. package/src/shared/model-response-aliases.d.ts +2 -0
  917. package/src/shared/model-response-aliases.d.ts.map +1 -0
  918. package/src/shared/model-response-aliases.js +16 -0
  919. package/src/shared/model-response-aliases.js.map +1 -0
  920. package/src/shared/node-executable.d.ts +2 -0
  921. package/src/shared/node-executable.d.ts.map +1 -0
  922. package/src/shared/node-executable.js +21 -0
  923. package/src/shared/node-executable.js.map +1 -0
  924. package/src/shared/opencode-session-headers.d.ts +13 -0
  925. package/src/shared/opencode-session-headers.d.ts.map +1 -0
  926. package/src/shared/opencode-session-headers.js +27 -0
  927. package/src/shared/opencode-session-headers.js.map +1 -0
  928. package/src/shared/prompt-resources.d.ts +6 -0
  929. package/src/shared/prompt-resources.d.ts.map +1 -0
  930. package/src/shared/prompt-resources.js +11 -0
  931. package/src/shared/prompt-resources.js.map +1 -0
  932. package/src/shared/pruned-fork.d.ts +35 -0
  933. package/src/shared/pruned-fork.d.ts.map +1 -0
  934. package/src/shared/pruned-fork.js +424 -0
  935. package/src/shared/pruned-fork.js.map +1 -0
  936. package/src/shared/required-child-extensions.d.ts +20 -0
  937. package/src/shared/required-child-extensions.d.ts.map +1 -0
  938. package/src/shared/required-child-extensions.js +74 -0
  939. package/src/shared/required-child-extensions.js.map +1 -0
  940. package/src/shared/session-file-trust.d.ts +2 -0
  941. package/src/shared/session-file-trust.d.ts.map +1 -0
  942. package/src/shared/session-file-trust.js +21 -0
  943. package/src/shared/session-file-trust.js.map +1 -0
  944. package/src/shared/session-identity.d.ts +7 -0
  945. package/src/shared/session-identity.d.ts.map +1 -0
  946. package/src/shared/session-identity.js +7 -0
  947. package/src/shared/session-identity.js.map +1 -0
  948. package/src/shared/session-tokens.d.ts +3 -0
  949. package/src/shared/session-tokens.d.ts.map +1 -0
  950. package/src/shared/session-tokens.js +59 -0
  951. package/src/shared/session-tokens.js.map +1 -0
  952. package/src/shared/settings.d.ts +147 -0
  953. package/src/shared/settings.d.ts.map +1 -0
  954. package/src/shared/settings.js +248 -0
  955. package/src/shared/settings.js.map +1 -0
  956. package/src/shared/shortcuts.d.ts +2 -0
  957. package/src/shared/shortcuts.d.ts.map +1 -0
  958. package/src/shared/shortcuts.js +18 -0
  959. package/src/shared/shortcuts.js.map +1 -0
  960. package/src/shared/status-format.d.ts +10 -0
  961. package/src/shared/status-format.d.ts.map +1 -0
  962. package/src/shared/status-format.js +61 -0
  963. package/src/shared/status-format.js.map +1 -0
  964. package/src/shared/thinking-ceiling.d.ts +14 -0
  965. package/src/shared/thinking-ceiling.d.ts.map +1 -0
  966. package/src/shared/thinking-ceiling.js +38 -0
  967. package/src/shared/thinking-ceiling.js.map +1 -0
  968. package/src/shared/types.d.ts +2667 -0
  969. package/src/shared/types.d.ts.map +1 -0
  970. package/src/shared/types.js +265 -0
  971. package/src/shared/types.js.map +1 -0
  972. package/src/shared/utf8.d.ts +6 -0
  973. package/src/shared/utf8.d.ts.map +1 -0
  974. package/src/shared/utf8.js +13 -0
  975. package/src/shared/utf8.js.map +1 -0
  976. package/src/shared/utils.d.ts +71 -0
  977. package/src/shared/utils.d.ts.map +1 -0
  978. package/src/shared/utils.js +593 -0
  979. package/src/shared/utils.js.map +1 -0
  980. package/src/shared/watch-strategy.d.ts +3 -0
  981. package/src/shared/watch-strategy.d.ts.map +1 -0
  982. package/src/shared/watch-strategy.js +6 -0
  983. package/src/shared/watch-strategy.js.map +1 -0
  984. package/src/shared/workflow-child-permit.d.ts +59 -0
  985. package/src/shared/workflow-child-permit.d.ts.map +1 -0
  986. package/src/shared/workflow-child-permit.js +160 -0
  987. package/src/shared/workflow-child-permit.js.map +1 -0
  988. package/src/slash/delegation-adapters.d.ts +147 -0
  989. package/src/slash/delegation-adapters.d.ts.map +1 -0
  990. package/src/slash/delegation-adapters.js +293 -0
  991. package/src/slash/delegation-adapters.js.map +1 -0
  992. package/src/slash/delegation-json.d.ts +11 -0
  993. package/src/slash/delegation-json.d.ts.map +1 -0
  994. package/src/slash/delegation-json.js +118 -0
  995. package/src/slash/delegation-json.js.map +1 -0
  996. package/src/slash/delegation-request.d.ts +13 -0
  997. package/src/slash/delegation-request.d.ts.map +1 -0
  998. package/src/slash/delegation-request.js +175 -0
  999. package/src/slash/delegation-request.js.map +1 -0
  1000. package/src/slash/prompt-template-bridge.d.ts +27 -0
  1001. package/src/slash/prompt-template-bridge.d.ts.map +1 -0
  1002. package/src/slash/prompt-template-bridge.js +380 -0
  1003. package/src/slash/prompt-template-bridge.js.map +1 -0
  1004. package/src/slash/prompt-workflows.d.ts +22 -0
  1005. package/src/slash/prompt-workflows.d.ts.map +1 -0
  1006. package/src/slash/prompt-workflows.js +261 -0
  1007. package/src/slash/prompt-workflows.js.map +1 -0
  1008. package/src/slash/selector.d.ts +48 -0
  1009. package/src/slash/selector.d.ts.map +1 -0
  1010. package/src/slash/selector.js +118 -0
  1011. package/src/slash/selector.js.map +1 -0
  1012. package/src/slash/slash-bridge.d.ts +31 -0
  1013. package/src/slash/slash-bridge.d.ts.map +1 -0
  1014. package/src/slash/slash-bridge.js +133 -0
  1015. package/src/slash/slash-bridge.js.map +1 -0
  1016. package/src/slash/slash-commands.d.ts +9 -0
  1017. package/src/slash/slash-commands.d.ts.map +1 -0
  1018. package/src/slash/slash-commands.js +1295 -0
  1019. package/src/slash/slash-commands.js.map +1 -0
  1020. package/src/slash/slash-live-state.d.ts +22 -0
  1021. package/src/slash/slash-live-state.d.ts.map +1 -0
  1022. package/src/slash/slash-live-state.js +264 -0
  1023. package/src/slash/slash-live-state.js.map +1 -0
  1024. package/src/slash/subagents-admin.d.ts +3 -0
  1025. package/src/slash/subagents-admin.d.ts.map +1 -0
  1026. package/src/slash/subagents-admin.js +454 -0
  1027. package/src/slash/subagents-admin.js.map +1 -0
  1028. package/src/tui/fleet-status.d.ts +86 -0
  1029. package/src/tui/fleet-status.d.ts.map +1 -0
  1030. package/src/tui/fleet-status.js +1083 -0
  1031. package/src/tui/fleet-status.js.map +1 -0
  1032. package/src/tui/fleet-transcript.d.ts +50 -0
  1033. package/src/tui/fleet-transcript.d.ts.map +1 -0
  1034. package/src/tui/fleet-transcript.js +497 -0
  1035. package/src/tui/fleet-transcript.js.map +1 -0
  1036. package/src/tui/fleet.d.ts +169 -0
  1037. package/src/tui/fleet.d.ts.map +1 -0
  1038. package/src/tui/fleet.js +1412 -0
  1039. package/src/tui/fleet.js.map +1 -0
  1040. package/src/tui/render-helpers.d.ts +24 -0
  1041. package/src/tui/render-helpers.d.ts.map +1 -0
  1042. package/src/tui/render-helpers.js +101 -0
  1043. package/src/tui/render-helpers.js.map +1 -0
  1044. package/src/tui/render.d.ts +61 -0
  1045. package/src/tui/render.d.ts.map +1 -0
  1046. package/src/tui/render.js +3607 -0
  1047. package/src/tui/render.js.map +1 -0
  1048. package/src/watchdog/change-signature.d.ts +8 -0
  1049. package/src/watchdog/change-signature.d.ts.map +1 -0
  1050. package/src/watchdog/change-signature.js +246 -0
  1051. package/src/watchdog/change-signature.js.map +1 -0
  1052. package/src/watchdog/child-status.d.ts +54 -0
  1053. package/src/watchdog/child-status.d.ts.map +1 -0
  1054. package/src/watchdog/child-status.js +188 -0
  1055. package/src/watchdog/child-status.js.map +1 -0
  1056. package/src/watchdog/diff-tool.d.ts +23 -0
  1057. package/src/watchdog/diff-tool.d.ts.map +1 -0
  1058. package/src/watchdog/diff-tool.js +84 -0
  1059. package/src/watchdog/diff-tool.js.map +1 -0
  1060. package/src/watchdog/emission-guard.d.ts +37 -0
  1061. package/src/watchdog/emission-guard.d.ts.map +1 -0
  1062. package/src/watchdog/emission-guard.js +98 -0
  1063. package/src/watchdog/emission-guard.js.map +1 -0
  1064. package/src/watchdog/guidance.d.ts +4 -0
  1065. package/src/watchdog/guidance.d.ts.map +1 -0
  1066. package/src/watchdog/guidance.js +20 -0
  1067. package/src/watchdog/guidance.js.map +1 -0
  1068. package/src/watchdog/lsp-diagnostics.d.ts +18 -0
  1069. package/src/watchdog/lsp-diagnostics.d.ts.map +1 -0
  1070. package/src/watchdog/lsp-diagnostics.js +490 -0
  1071. package/src/watchdog/lsp-diagnostics.js.map +1 -0
  1072. package/src/watchdog/model-selection.d.ts +25 -0
  1073. package/src/watchdog/model-selection.d.ts.map +1 -0
  1074. package/src/watchdog/model-selection.js +168 -0
  1075. package/src/watchdog/model-selection.js.map +1 -0
  1076. package/src/watchdog/permission-arbiter.d.ts +21 -0
  1077. package/src/watchdog/permission-arbiter.d.ts.map +1 -0
  1078. package/src/watchdog/permission-arbiter.js +136 -0
  1079. package/src/watchdog/permission-arbiter.js.map +1 -0
  1080. package/src/watchdog/register-child.d.ts +12 -0
  1081. package/src/watchdog/register-child.d.ts.map +1 -0
  1082. package/src/watchdog/register-child.js +120 -0
  1083. package/src/watchdog/register-child.js.map +1 -0
  1084. package/src/watchdog/register-main.d.ts +10 -0
  1085. package/src/watchdog/register-main.d.ts.map +1 -0
  1086. package/src/watchdog/register-main.js +419 -0
  1087. package/src/watchdog/register-main.js.map +1 -0
  1088. package/src/watchdog/render.d.ts +12 -0
  1089. package/src/watchdog/render.d.ts.map +1 -0
  1090. package/src/watchdog/render.js +52 -0
  1091. package/src/watchdog/render.js.map +1 -0
  1092. package/src/watchdog/review.d.ts +36 -0
  1093. package/src/watchdog/review.d.ts.map +1 -0
  1094. package/src/watchdog/review.js +318 -0
  1095. package/src/watchdog/review.js.map +1 -0
  1096. package/src/watchdog/rules.d.ts +22 -0
  1097. package/src/watchdog/rules.d.ts.map +1 -0
  1098. package/src/watchdog/rules.js +59 -0
  1099. package/src/watchdog/rules.js.map +1 -0
  1100. package/src/watchdog/runtime.d.ts +196 -0
  1101. package/src/watchdog/runtime.d.ts.map +1 -0
  1102. package/src/watchdog/runtime.js +862 -0
  1103. package/src/watchdog/runtime.js.map +1 -0
  1104. package/src/watchdog/scope.d.ts +15 -0
  1105. package/src/watchdog/scope.d.ts.map +1 -0
  1106. package/src/watchdog/scope.js +45 -0
  1107. package/src/watchdog/scope.js.map +1 -0
  1108. package/src/watchdog/settings.d.ts +30 -0
  1109. package/src/watchdog/settings.d.ts.map +1 -0
  1110. package/src/watchdog/settings.js +476 -0
  1111. package/src/watchdog/settings.js.map +1 -0
  1112. package/src/watchdog/tool-actions.d.ts +18 -0
  1113. package/src/watchdog/tool-actions.d.ts.map +1 -0
  1114. package/src/watchdog/tool-actions.js +151 -0
  1115. package/src/watchdog/tool-actions.js.map +1 -0
  1116. package/src/watchdog/turn-delta.d.ts +12 -0
  1117. package/src/watchdog/turn-delta.d.ts.map +1 -0
  1118. package/src/watchdog/turn-delta.js +185 -0
  1119. package/src/watchdog/turn-delta.js.map +1 -0
  1120. package/src/watchdog/types.d.ts +142 -0
  1121. package/src/watchdog/types.d.ts.map +1 -0
  1122. package/src/watchdog/types.js +28 -0
  1123. package/src/watchdog/types.js.map +1 -0
  1124. package/src/watchdog/warning-format.d.ts +8 -0
  1125. package/src/watchdog/warning-format.d.ts.map +1 -0
  1126. package/src/watchdog/warning-format.js +60 -0
  1127. package/src/watchdog/warning-format.js.map +1 -0
  1128. package/src/workflows/chat-progress.d.ts +38 -0
  1129. package/src/workflows/chat-progress.d.ts.map +1 -0
  1130. package/src/workflows/chat-progress.js +130 -0
  1131. package/src/workflows/chat-progress.js.map +1 -0
  1132. package/src/workflows/host-command.d.ts +31 -0
  1133. package/src/workflows/host-command.d.ts.map +1 -0
  1134. package/src/workflows/host-command.js +228 -0
  1135. package/src/workflows/host-command.js.map +1 -0
  1136. package/src/workflows/scripted-workflow.d.ts +195 -0
  1137. package/src/workflows/scripted-workflow.d.ts.map +1 -0
  1138. package/src/workflows/scripted-workflow.js +2636 -0
  1139. package/src/workflows/scripted-workflow.js.map +1 -0
  1140. package/src/workflows/workflow-checklist.d.ts +124 -0
  1141. package/src/workflows/workflow-checklist.d.ts.map +1 -0
  1142. package/src/workflows/workflow-checklist.js +312 -0
  1143. package/src/workflows/workflow-checklist.js.map +1 -0
  1144. package/src/workflows/workflow-child-summary.d.ts +20 -0
  1145. package/src/workflows/workflow-child-summary.d.ts.map +1 -0
  1146. package/src/workflows/workflow-child-summary.js +179 -0
  1147. package/src/workflows/workflow-child-summary.js.map +1 -0
  1148. package/src/workflows/workflow-preflight.d.ts +59 -0
  1149. package/src/workflows/workflow-preflight.d.ts.map +1 -0
  1150. package/src/workflows/workflow-preflight.js +289 -0
  1151. package/src/workflows/workflow-preflight.js.map +1 -0
  1152. package/src/workflows/workflow-receipt.d.ts +35 -0
  1153. package/src/workflows/workflow-receipt.d.ts.map +1 -0
  1154. package/src/workflows/workflow-receipt.js +449 -0
  1155. package/src/workflows/workflow-receipt.js.map +1 -0
  1156. package/src/workflows/workflow-resources.d.ts +43 -0
  1157. package/src/workflows/workflow-resources.d.ts.map +1 -0
  1158. package/src/workflows/workflow-resources.js +230 -0
  1159. package/src/workflows/workflow-resources.js.map +1 -0
  1160. package/src/workflows/workflow-settlement.d.ts +85 -0
  1161. package/src/workflows/workflow-settlement.d.ts.map +1 -0
  1162. package/src/workflows/workflow-settlement.js +204 -0
  1163. package/src/workflows/workflow-settlement.js.map +1 -0
  1164. package/index.ts +0 -13
  1165. package/src/agents/advertised-agent-prompt.ts +0 -94
  1166. package/src/agents/agent-management.ts +0 -1417
  1167. package/src/agents/agent-memory.ts +0 -254
  1168. package/src/agents/agent-refinements.ts +0 -624
  1169. package/src/agents/agent-scope.ts +0 -6
  1170. package/src/agents/agent-selection.ts +0 -25
  1171. package/src/agents/agent-serializer.ts +0 -182
  1172. package/src/agents/agents.ts +0 -2917
  1173. package/src/agents/builtin-names.ts +0 -16
  1174. package/src/agents/chain-serializer.ts +0 -285
  1175. package/src/agents/frontmatter.ts +0 -153
  1176. package/src/agents/identity.ts +0 -30
  1177. package/src/agents/proactive-skills.ts +0 -194
  1178. package/src/agents/runtime-agent-events.ts +0 -70
  1179. package/src/agents/runtime-agent-registry.ts +0 -430
  1180. package/src/agents/skills.ts +0 -754
  1181. package/src/api/agents.ts +0 -12
  1182. package/src/api/background-work.ts +0 -206
  1183. package/src/api/capability-ceiling.ts +0 -16
  1184. package/src/api/child-tool-plan.ts +0 -5
  1185. package/src/api/control-channel.ts +0 -4
  1186. package/src/api/delegation.ts +0 -116
  1187. package/src/api/external-job-provider.ts +0 -195
  1188. package/src/api/external-runs.ts +0 -282
  1189. package/src/api/intercom-bridge.ts +0 -3
  1190. package/src/api/preflight.ts +0 -539
  1191. package/src/api/project-panes.ts +0 -32
  1192. package/src/api/required-child-extensions.ts +0 -6
  1193. package/src/api/shared-types.ts +0 -29
  1194. package/src/api/workflow-resources.ts +0 -6
  1195. package/src/extension/config.ts +0 -230
  1196. package/src/extension/control-notices.ts +0 -58
  1197. package/src/extension/doctor.ts +0 -270
  1198. package/src/extension/fanout-child.ts +0 -265
  1199. package/src/extension/herdr-pi-bridge.ts +0 -160
  1200. package/src/extension/index.ts +0 -1205
  1201. package/src/extension/public-execution.ts +0 -225
  1202. package/src/extension/rpc.ts +0 -848
  1203. package/src/extension/schemas.ts +0 -422
  1204. package/src/extension/steering-notices.ts +0 -35
  1205. package/src/extension/subagent-guide.ts +0 -39
  1206. package/src/extension/tool-description.ts +0 -175
  1207. package/src/extension/tool-result.ts +0 -19
  1208. package/src/inspectors/actions.ts +0 -148
  1209. package/src/inspectors/ghostty/actions.ts +0 -74
  1210. package/src/inspectors/ghostty/plugin.ts +0 -17
  1211. package/src/inspectors/herdr/actions.ts +0 -155
  1212. package/src/inspectors/herdr/client.ts +0 -130
  1213. package/src/inspectors/herdr/focus.ts +0 -55
  1214. package/src/inspectors/herdr/plugin.ts +0 -20
  1215. package/src/inspectors/herdr/project-panes.ts +0 -730
  1216. package/src/inspectors/inspector-runner.ts +0 -153
  1217. package/src/inspectors/plugins.ts +0 -8
  1218. package/src/inspectors/session-roots-codec.ts +0 -31
  1219. package/src/inspectors/shell-command.ts +0 -16
  1220. package/src/inspectors/types.ts +0 -51
  1221. package/src/integrations/herdr-status.ts +0 -400
  1222. package/src/integrations/pi-web-session-liveness.ts +0 -73
  1223. package/src/intercom/intercom-bridge.ts +0 -233
  1224. package/src/intercom/native-supervisor-channel.ts +0 -917
  1225. package/src/intercom/result-intercom.ts +0 -423
  1226. package/src/intercom/supervisor-ui.ts +0 -244
  1227. package/src/missions/actions.ts +0 -433
  1228. package/src/missions/goal-driver.ts +0 -164
  1229. package/src/missions/lifecycle.ts +0 -367
  1230. package/src/missions/store.ts +0 -584
  1231. package/src/missions/types.ts +0 -190
  1232. package/src/missions/workflow-state.ts +0 -281
  1233. package/src/policy/authority.ts +0 -50
  1234. package/src/profiles/profiles.ts +0 -668
  1235. package/src/runs/background/active-async-capacity.ts +0 -520
  1236. package/src/runs/background/active-run-index.ts +0 -155
  1237. package/src/runs/background/async-execution.ts +0 -2278
  1238. package/src/runs/background/async-job-tracker.ts +0 -826
  1239. package/src/runs/background/async-resume.ts +0 -647
  1240. package/src/runs/background/async-retention.ts +0 -912
  1241. package/src/runs/background/async-status-snapshot.ts +0 -46
  1242. package/src/runs/background/async-status.ts +0 -771
  1243. package/src/runs/background/auto-drain.ts +0 -92
  1244. package/src/runs/background/binary-bootstrap.ts +0 -38
  1245. package/src/runs/background/chain-append.ts +0 -321
  1246. package/src/runs/background/chain-root-attachment.ts +0 -259
  1247. package/src/runs/background/completion-batcher.ts +0 -168
  1248. package/src/runs/background/completion-dedupe.ts +0 -58
  1249. package/src/runs/background/completion-replay.ts +0 -287
  1250. package/src/runs/background/control-channel.ts +0 -600
  1251. package/src/runs/background/fleet-view.ts +0 -648
  1252. package/src/runs/background/index-segment.ts +0 -59
  1253. package/src/runs/background/inspect-rpc.ts +0 -443
  1254. package/src/runs/background/notify.ts +0 -819
  1255. package/src/runs/background/owned-process-tree.ts +0 -131
  1256. package/src/runs/background/parallel-groups.ts +0 -45
  1257. package/src/runs/background/process-terminal.ts +0 -310
  1258. package/src/runs/background/result-delivery-ownership.ts +0 -45
  1259. package/src/runs/background/result-files.ts +0 -523
  1260. package/src/runs/background/result-watcher.ts +0 -809
  1261. package/src/runs/background/resume-guidance.ts +0 -56
  1262. package/src/runs/background/retained-children.ts +0 -135
  1263. package/src/runs/background/retained-nested-route-tracker.ts +0 -96
  1264. package/src/runs/background/run-child-session.ts +0 -690
  1265. package/src/runs/background/run-id-query.ts +0 -7
  1266. package/src/runs/background/run-id-resolver.ts +0 -175
  1267. package/src/runs/background/run-status.ts +0 -786
  1268. package/src/runs/background/runner-aliases.ts +0 -142
  1269. package/src/runs/background/runner-child-launch.ts +0 -91
  1270. package/src/runs/background/runner-child-sessions.ts +0 -32
  1271. package/src/runs/background/runner-http-dispatcher.ts +0 -119
  1272. package/src/runs/background/scheduled-runs.ts +0 -1012
  1273. package/src/runs/background/stale-run-reconciler.ts +0 -436
  1274. package/src/runs/background/steering.ts +0 -260
  1275. package/src/runs/background/subagent-runner.ts +0 -5341
  1276. package/src/runs/background/subagent-wait.ts +0 -876
  1277. package/src/runs/background/terminal-run-index.ts +0 -138
  1278. package/src/runs/background/top-level-async.ts +0 -14
  1279. package/src/runs/background/wait-completions.ts +0 -261
  1280. package/src/runs/background/wait-config.ts +0 -50
  1281. package/src/runs/background/wait-subscriptions.ts +0 -354
  1282. package/src/runs/background/wait-tool.ts +0 -45
  1283. package/src/runs/foreground/async-dismiss-action.ts +0 -86
  1284. package/src/runs/foreground/async-steering-action.ts +0 -276
  1285. package/src/runs/foreground/async-stop-action.ts +0 -176
  1286. package/src/runs/foreground/execution.ts +0 -2231
  1287. package/src/runs/foreground/foreground-control.ts +0 -157
  1288. package/src/runs/foreground/foreground-history.ts +0 -163
  1289. package/src/runs/foreground/prompt-audit.ts +0 -178
  1290. package/src/runs/foreground/subagent-executor.ts +0 -7511
  1291. package/src/runs/foreground/workflow-detach-reconcile.ts +0 -304
  1292. package/src/runs/foreground/workflow-foreground-steering.ts +0 -169
  1293. package/src/runs/shared/abort-recovery.ts +0 -119
  1294. package/src/runs/shared/acceptance.ts +0 -1565
  1295. package/src/runs/shared/agent-contract.ts +0 -38
  1296. package/src/runs/shared/async-status-projection.ts +0 -659
  1297. package/src/runs/shared/background-process-options.ts +0 -9
  1298. package/src/runs/shared/capability-ceiling.ts +0 -211
  1299. package/src/runs/shared/chain-outputs.ts +0 -116
  1300. package/src/runs/shared/child-hooks.ts +0 -189
  1301. package/src/runs/shared/child-identity.ts +0 -62
  1302. package/src/runs/shared/child-launch-plan.ts +0 -163
  1303. package/src/runs/shared/child-launch.ts +0 -342
  1304. package/src/runs/shared/child-lifecycle.ts +0 -28
  1305. package/src/runs/shared/child-runtime-config.ts +0 -133
  1306. package/src/runs/shared/child-session.ts +0 -448
  1307. package/src/runs/shared/child-tool-plan.ts +0 -661
  1308. package/src/runs/shared/claude-code-adapter.ts +0 -133
  1309. package/src/runs/shared/codex-exec-adapter.ts +0 -129
  1310. package/src/runs/shared/completion-evidence.ts +0 -89
  1311. package/src/runs/shared/completion-guard.ts +0 -255
  1312. package/src/runs/shared/context-mode.ts +0 -44
  1313. package/src/runs/shared/cursor-agent-adapter.ts +0 -114
  1314. package/src/runs/shared/dynamic-fanout.ts +0 -297
  1315. package/src/runs/shared/effective-system-prompt.ts +0 -33
  1316. package/src/runs/shared/extension-bindings.ts +0 -78
  1317. package/src/runs/shared/external-cli-contract.ts +0 -177
  1318. package/src/runs/shared/external-cli-preflight.ts +0 -142
  1319. package/src/runs/shared/external-cli-runner.ts +0 -431
  1320. package/src/runs/shared/external-job-bridge.ts +0 -460
  1321. package/src/runs/shared/external-job-runner.ts +0 -389
  1322. package/src/runs/shared/fast-mode-extension.ts +0 -10
  1323. package/src/runs/shared/herdr-connection.ts +0 -134
  1324. package/src/runs/shared/herdr-external-adapters.ts +0 -169
  1325. package/src/runs/shared/herdr-machine.ts +0 -279
  1326. package/src/runs/shared/herdr-pi-protocol.ts +0 -59
  1327. package/src/runs/shared/herdr-placed-run.ts +0 -263
  1328. package/src/runs/shared/host-step-status.ts +0 -231
  1329. package/src/runs/shared/lane-metadata.ts +0 -126
  1330. package/src/runs/shared/launch-cwd.ts +0 -16
  1331. package/src/runs/shared/llm-intent-arbiter.ts +0 -321
  1332. package/src/runs/shared/long-running-guard.ts +0 -221
  1333. package/src/runs/shared/mcp-config-sources.ts +0 -422
  1334. package/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -484
  1335. package/src/runs/shared/mcp-direct-tool-grant.ts +0 -194
  1336. package/src/runs/shared/model-resolution-diagnostic.ts +0 -76
  1337. package/src/runs/shared/model-resolution.ts +0 -441
  1338. package/src/runs/shared/model-scope.ts +0 -205
  1339. package/src/runs/shared/mutation-evidence.ts +0 -199
  1340. package/src/runs/shared/nested-events.ts +0 -1079
  1341. package/src/runs/shared/nested-path.ts +0 -38
  1342. package/src/runs/shared/nested-render.ts +0 -127
  1343. package/src/runs/shared/orca-progress-tabs.ts +0 -510
  1344. package/src/runs/shared/parallel-handoff.ts +0 -741
  1345. package/src/runs/shared/parallel-utils.ts +0 -279
  1346. package/src/runs/shared/permissions.ts +0 -86
  1347. package/src/runs/shared/pi-spawn.ts +0 -207
  1348. package/src/runs/shared/process-signal.ts +0 -35
  1349. package/src/runs/shared/readonly-drain-observation.ts +0 -42
  1350. package/src/runs/shared/run-fanout-budget.ts +0 -267
  1351. package/src/runs/shared/run-history.ts +0 -201
  1352. package/src/runs/shared/runtime-acknowledged-extensions.ts +0 -44
  1353. package/src/runs/shared/session-lease.ts +0 -293
  1354. package/src/runs/shared/single-output.ts +0 -304
  1355. package/src/runs/shared/spawn-budget.ts +0 -128
  1356. package/src/runs/shared/structured-output.ts +0 -236
  1357. package/src/runs/shared/subagent-control.ts +0 -294
  1358. package/src/runs/shared/subagent-prompt-runtime.ts +0 -545
  1359. package/src/runs/shared/task-intent.ts +0 -244
  1360. package/src/runs/shared/tool-availability.ts +0 -37
  1361. package/src/runs/shared/tool-budget.ts +0 -66
  1362. package/src/runs/shared/tool-timeout.ts +0 -93
  1363. package/src/runs/shared/usage-budget.ts +0 -65
  1364. package/src/runs/shared/workflow-async-child-guidance.ts +0 -18
  1365. package/src/runs/shared/workflow-graph.ts +0 -225
  1366. package/src/runs/shared/worktree-cleanup-plan.ts +0 -869
  1367. package/src/runs/shared/worktree-setup-command.ts +0 -213
  1368. package/src/runs/shared/worktree.ts +0 -1516
  1369. package/src/shared/accessible-dir.ts +0 -47
  1370. package/src/shared/agent-stream-options.ts +0 -5
  1371. package/src/shared/artifacts.ts +0 -281
  1372. package/src/shared/atomic-json.ts +0 -83
  1373. package/src/shared/capacity-resilient-json.ts +0 -102
  1374. package/src/shared/child-cache-retention.ts +0 -43
  1375. package/src/shared/child-session-name.ts +0 -46
  1376. package/src/shared/child-transcript.ts +0 -264
  1377. package/src/shared/completion-owner.ts +0 -14
  1378. package/src/shared/display-text.ts +0 -150
  1379. package/src/shared/extension-context.ts +0 -24
  1380. package/src/shared/file-coalescer.ts +0 -49
  1381. package/src/shared/file-system-retry.ts +0 -95
  1382. package/src/shared/fork-context.ts +0 -236
  1383. package/src/shared/fork-session-cwd.ts +0 -27
  1384. package/src/shared/formatters.ts +0 -146
  1385. package/src/shared/jsonl-writer.ts +0 -92
  1386. package/src/shared/launch-contract.ts +0 -198
  1387. package/src/shared/model-info.ts +0 -101
  1388. package/src/shared/model-response-aliases.ts +0 -13
  1389. package/src/shared/node-executable.ts +0 -21
  1390. package/src/shared/opencode-session-headers.ts +0 -30
  1391. package/src/shared/prompt-resources.ts +0 -11
  1392. package/src/shared/pruned-fork.ts +0 -450
  1393. package/src/shared/required-child-extensions.ts +0 -81
  1394. package/src/shared/session-file-trust.ts +0 -19
  1395. package/src/shared/session-identity.ts +0 -10
  1396. package/src/shared/session-tokens.ts +0 -55
  1397. package/src/shared/settings.ts +0 -412
  1398. package/src/shared/shortcuts.ts +0 -13
  1399. package/src/shared/status-format.ts +0 -55
  1400. package/src/shared/thinking-ceiling.ts +0 -46
  1401. package/src/shared/types.ts +0 -2972
  1402. package/src/shared/utf8.ts +0 -11
  1403. package/src/shared/utils.ts +0 -608
  1404. package/src/shared/watch-strategy.ts +0 -12
  1405. package/src/shared/workflow-child-permit.ts +0 -212
  1406. package/src/slash/delegation-adapters.ts +0 -428
  1407. package/src/slash/delegation-json.ts +0 -108
  1408. package/src/slash/delegation-request.ts +0 -176
  1409. package/src/slash/prompt-template-bridge.ts +0 -419
  1410. package/src/slash/prompt-workflows.ts +0 -287
  1411. package/src/slash/selector.ts +0 -147
  1412. package/src/slash/slash-bridge.ts +0 -192
  1413. package/src/slash/slash-commands.ts +0 -1325
  1414. package/src/slash/slash-live-state.ts +0 -310
  1415. package/src/slash/subagents-admin.ts +0 -460
  1416. package/src/tui/fleet-status.ts +0 -1109
  1417. package/src/tui/fleet-transcript.ts +0 -536
  1418. package/src/tui/fleet.ts +0 -1448
  1419. package/src/tui/render-helpers.ts +0 -111
  1420. package/src/tui/render.ts +0 -3721
  1421. package/src/types/pi-runtime-compat.d.ts +0 -8
  1422. package/src/watchdog/change-signature.ts +0 -260
  1423. package/src/watchdog/child-status.ts +0 -225
  1424. package/src/watchdog/diff-tool.ts +0 -77
  1425. package/src/watchdog/emission-guard.ts +0 -125
  1426. package/src/watchdog/guidance.ts +0 -20
  1427. package/src/watchdog/lsp-diagnostics.ts +0 -538
  1428. package/src/watchdog/model-selection.ts +0 -187
  1429. package/src/watchdog/permission-arbiter.ts +0 -156
  1430. package/src/watchdog/register-child.ts +0 -128
  1431. package/src/watchdog/register-main.ts +0 -445
  1432. package/src/watchdog/render.ts +0 -53
  1433. package/src/watchdog/review.ts +0 -363
  1434. package/src/watchdog/rules.ts +0 -70
  1435. package/src/watchdog/runtime.ts +0 -924
  1436. package/src/watchdog/scope.ts +0 -51
  1437. package/src/watchdog/settings.ts +0 -515
  1438. package/src/watchdog/tool-actions.ts +0 -156
  1439. package/src/watchdog/turn-delta.ts +0 -184
  1440. package/src/watchdog/types.ts +0 -186
  1441. package/src/watchdog/warning-format.ts +0 -72
  1442. package/src/workflows/chat-progress.ts +0 -152
  1443. package/src/workflows/host-command.ts +0 -235
  1444. package/src/workflows/scripted-workflow.ts +0 -2553
  1445. package/src/workflows/workflow-checklist.ts +0 -436
  1446. package/src/workflows/workflow-child-summary.ts +0 -170
  1447. package/src/workflows/workflow-preflight.ts +0 -297
  1448. package/src/workflows/workflow-receipt.ts +0 -384
  1449. package/src/workflows/workflow-resources.ts +0 -236
  1450. package/src/workflows/workflow-settlement.ts +0 -249
@@ -0,0 +1,2622 @@
1
+ /**
2
+ * Agent discovery and configuration
3
+ */
4
+ import { execSync } from "node:child_process";
5
+ import * as fs from "node:fs";
6
+ import { parse as parseYaml } from "yaml";
7
+ import * as os from "node:os";
8
+ import * as path from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ import { CODE_OWNED_EXTERNAL_CLI_ADAPTER_LABEL, isCodeOwnedExternalCliAdapterId, parseExternalCliCapabilityNarrowing, validateCodeOwnedProfileRunner } from "../runs/shared/external-cli-contract.js";
11
+ import { getAgentDir, getProjectConfigDir } from "../shared/utils.js";
12
+ import { expandHomePath } from "../shared/settings.js";
13
+ import { KNOWN_FIELDS } from "./agent-serializer.js";
14
+ import { parseChain, parseJsonChain } from "./chain-serializer.js";
15
+ import { mergeAgentsForScope } from "./agent-selection.js";
16
+ import { parseFrontmatter, parseFrontmatterList } from "./frontmatter.js";
17
+ import { buildRuntimeName, parsePackageName } from "./identity.js";
18
+ import { parseModelScopeConfig } from "../runs/shared/model-scope.js";
19
+ export { BUILTIN_AGENT_NAMES } from "./builtin-names.js";
20
+ export { buildRuntimeName, frontmatterNameForConfig, parsePackageName } from "./identity.js";
21
+ import { parseMemoryFrontmatter } from "./agent-memory.js";
22
+ import { validateAcceptanceInput } from "../runs/shared/acceptance.js";
23
+ import { validatePermissionRules } from "../runs/shared/permissions.js";
24
+ import { parseThinkingLevel } from "../shared/thinking-ceiling.js";
25
+ import { assertJsonSchemaObject } from "../runs/shared/structured-output.js";
26
+ import { normalizeCapabilityCeilingAllowedAgents } from "../runs/shared/capability-ceiling.js";
27
+ export function defaultSystemPromptMode(name) {
28
+ return name === "delegate" ? "append" : "replace";
29
+ }
30
+ export function defaultInheritProjectContext(name) {
31
+ return name === "delegate";
32
+ }
33
+ export function defaultInheritSkills() {
34
+ return false;
35
+ }
36
+ const EMPTY_SUBAGENT_SETTINGS = { overrides: {}, providerOverrides: {} };
37
+ const agentFrontmatterFields = new WeakMap();
38
+ const AGENT_SOURCE_PRIORITY = {
39
+ builtin: 0,
40
+ package: 1,
41
+ user: 2,
42
+ project: 3,
43
+ runtime: 4,
44
+ };
45
+ function agentDefinitionPriority(definition) {
46
+ return AGENT_SOURCE_PRIORITY[definition.source] * 1_000_000
47
+ + (definition.discoveryPriority ?? 0);
48
+ }
49
+ export function findBlockingAgentDiagnostic(name, agent, diagnostics) {
50
+ const normalizedName = name.trim();
51
+ const agents = Array.isArray(agent) ? agent : agent ? [agent] : [];
52
+ let match;
53
+ for (const diagnostic of diagnostics ?? []) {
54
+ if ((diagnostic.runtimeName === normalizedName
55
+ || (diagnostic.name === normalizedName && (!diagnostic.packageSpecified
56
+ || diagnostic.runtimeName === undefined
57
+ || agents.some((agent) => agent.name === diagnostic.runtimeName && agent.localName === diagnostic.name))))
58
+ && (!match || agentDefinitionPriority(diagnostic) > agentDefinitionPriority(match))) {
59
+ match = diagnostic;
60
+ }
61
+ }
62
+ const highestPriority = Math.max(...agents.map(agentDefinitionPriority), -Infinity);
63
+ return !agents.length || (match && agentDefinitionPriority(match) > highestPriority) ? match : undefined;
64
+ }
65
+ /** Create formatter input from the exact discovery operation used for resolution. */
66
+ export function unknownAgentDiagnosticContext(discovered) {
67
+ return {
68
+ cwd: discovered.cwd,
69
+ scope: discovered.scope,
70
+ directories: discovered.directories,
71
+ agents: discovered.agents,
72
+ };
73
+ }
74
+ /** Render local discovery evidence without exposing filesystem error details. */
75
+ export function formatUnknownAgentError(name, context, prefix = "Unknown agent") {
76
+ const directories = context.directories.map((directory) => {
77
+ const state = directory.state === "candidates"
78
+ ? `${directory.candidateCount ?? 0} candidate${directory.candidateCount === 1 ? "" : "s"}`
79
+ : directory.state === "empty" ? "present but empty"
80
+ : directory.state === "not-directory" ? "not a directory"
81
+ : directory.state;
82
+ return `- ${directory.source}: ${directory.path} (${state})`;
83
+ });
84
+ const agents = [...context.agents]
85
+ .sort((left, right) => left.name.localeCompare(right.name) || left.source.localeCompare(right.source))
86
+ .map((agent) => `- ${agent.name} (${agent.source})`);
87
+ return [
88
+ `${prefix}: ${name}`,
89
+ `Effective cwd: ${path.resolve(context.cwd)}`,
90
+ "Consulted agent-definition directories:",
91
+ ...(directories.length ? directories : ["- (none)"]),
92
+ "Discovered agents:",
93
+ ...(agents.length ? agents : ["- (none)"]),
94
+ ].join("\n");
95
+ }
96
+ function getUserChainDir() {
97
+ return path.join(getAgentDir(), "chains");
98
+ }
99
+ let cachedGlobalNpmRoot = null;
100
+ function readJsonFileBestEffort(filePath) {
101
+ try {
102
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
103
+ }
104
+ catch {
105
+ // Installed package scans are opportunistic; bad third-party manifests
106
+ // should not break local agent discovery.
107
+ return null;
108
+ }
109
+ }
110
+ function isSafePackagePath(value) {
111
+ return value.length > 0
112
+ && !path.isAbsolute(value)
113
+ && value.split(/[\\/]/).every((part) => part.length > 0 && part !== "." && part !== "..");
114
+ }
115
+ function parseNpmPackageName(source) {
116
+ const spec = source.slice(4).trim();
117
+ if (!spec)
118
+ return undefined;
119
+ const match = spec.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);
120
+ const packageName = match?.[1] ?? spec;
121
+ return isSafePackagePath(packageName) ? packageName : undefined;
122
+ }
123
+ function stripGitRef(repoPath) {
124
+ const atIndex = repoPath.indexOf("@");
125
+ const hashIndex = repoPath.indexOf("#");
126
+ const refIndex = [atIndex, hashIndex].filter((index) => index >= 0).sort((a, b) => a - b)[0];
127
+ return refIndex === undefined ? repoPath : repoPath.slice(0, refIndex);
128
+ }
129
+ function parseGitPackagePath(source) {
130
+ const spec = source.slice(4).trim();
131
+ if (!spec)
132
+ return undefined;
133
+ let host = "";
134
+ let repoPath = "";
135
+ const scpLike = spec.match(/^git@([^:]+):(.+)$/);
136
+ if (scpLike) {
137
+ host = scpLike[1] ?? "";
138
+ repoPath = scpLike[2] ?? "";
139
+ }
140
+ else if (/^[a-z][a-z0-9+.-]*:\/\//i.test(spec)) {
141
+ try {
142
+ const url = new URL(spec);
143
+ host = url.hostname;
144
+ repoPath = url.pathname.replace(/^\/+/, "");
145
+ }
146
+ catch {
147
+ return undefined;
148
+ }
149
+ }
150
+ else {
151
+ const slashIndex = spec.indexOf("/");
152
+ if (slashIndex < 0)
153
+ return undefined;
154
+ host = spec.slice(0, slashIndex);
155
+ repoPath = spec.slice(slashIndex + 1);
156
+ }
157
+ const normalizedPath = stripGitRef(repoPath).replace(/\.git$/, "").replace(/^\/+/, "");
158
+ if (!host || !isSafePackagePath(host) || !isSafePackagePath(normalizedPath) || normalizedPath.split(/[\\/]/).length < 2) {
159
+ return undefined;
160
+ }
161
+ return { host, repoPath: normalizedPath };
162
+ }
163
+ function resolveSettingsPackageRoot(source, baseDir) {
164
+ const trimmed = source.trim();
165
+ if (!trimmed)
166
+ return undefined;
167
+ if (trimmed.startsWith("git:")) {
168
+ const parsed = parseGitPackagePath(trimmed);
169
+ return parsed ? path.join(baseDir, "git", parsed.host, parsed.repoPath) : undefined;
170
+ }
171
+ if (trimmed.startsWith("npm:")) {
172
+ const packageName = parseNpmPackageName(trimmed);
173
+ return packageName ? path.join(baseDir, "npm", "node_modules", packageName) : undefined;
174
+ }
175
+ const normalized = trimmed.startsWith("file:") ? trimmed.slice(5) : trimmed;
176
+ if (normalized === "~")
177
+ return os.homedir();
178
+ if (normalized.startsWith("~/"))
179
+ return path.join(os.homedir(), normalized.slice(2));
180
+ if (path.isAbsolute(normalized))
181
+ return normalized;
182
+ if (normalized === "." || normalized === ".." || normalized.startsWith("./") || normalized.startsWith("../")) {
183
+ return path.resolve(baseDir, normalized);
184
+ }
185
+ if (/^https?:\/\//i.test(trimmed)) {
186
+ const parsed = parseGitPackagePath(`git:${trimmed}`);
187
+ return parsed ? path.join(baseDir, "git", parsed.host, parsed.repoPath) : undefined;
188
+ }
189
+ return undefined;
190
+ }
191
+ function getGlobalNpmRoot() {
192
+ const offline = process.env.PI_OFFLINE?.toLowerCase();
193
+ if (offline === "1" || offline === "true" || offline === "yes")
194
+ return null;
195
+ if (cachedGlobalNpmRoot !== null)
196
+ return cachedGlobalNpmRoot;
197
+ const windowsGlobalRoot = process.platform === "win32" && process.env.APPDATA
198
+ ? path.join(process.env.APPDATA, "npm", "node_modules")
199
+ : undefined;
200
+ if (windowsGlobalRoot) {
201
+ try {
202
+ if (fs.statSync(windowsGlobalRoot).isDirectory()) {
203
+ cachedGlobalNpmRoot = fs.realpathSync(windowsGlobalRoot);
204
+ return cachedGlobalNpmRoot;
205
+ }
206
+ }
207
+ catch {
208
+ // Fall through if the directory disappears while resolving it.
209
+ }
210
+ }
211
+ try {
212
+ cachedGlobalNpmRoot = fs.realpathSync(execSync("npm root -g", { encoding: "utf-8", timeout: 5000, windowsHide: true, stdio: ["ignore", "pipe", "ignore"] }).trim());
213
+ return cachedGlobalNpmRoot;
214
+ }
215
+ catch {
216
+ cachedGlobalNpmRoot = "";
217
+ return null;
218
+ }
219
+ }
220
+ function stringArray(value) {
221
+ if (!Array.isArray(value))
222
+ return [];
223
+ return value.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
224
+ }
225
+ function packageMetadata(pkg, packageRoot) {
226
+ const name = typeof pkg.name === "string" && pkg.name.trim() ? pkg.name.trim() : undefined;
227
+ const version = typeof pkg.version === "string" && pkg.version.trim() ? pkg.version.trim() : undefined;
228
+ return {
229
+ packageRoot,
230
+ ...(name ? { packageName: name } : {}),
231
+ ...(version ? { packageVersion: version } : {}),
232
+ };
233
+ }
234
+ function extractSubagentPathsFromPackageRoot(packageRoot, scope) {
235
+ const packageJsonPath = path.join(packageRoot, "package.json");
236
+ const pkg = readJsonFileBestEffort(packageJsonPath);
237
+ if (!pkg || typeof pkg !== "object" || Array.isArray(pkg))
238
+ return { agents: [], chains: [], watchPaths: [packageJsonPath], settingsErrors: {} };
239
+ const pkgRecord = pkg;
240
+ const metadata = packageMetadata(pkgRecord, packageRoot);
241
+ const roots = [];
242
+ const piSubagents = pkgRecord["pi-subagents"];
243
+ if (piSubagents && typeof piSubagents === "object" && !Array.isArray(piSubagents)) {
244
+ roots.push(piSubagents);
245
+ }
246
+ const pi = pkgRecord.pi;
247
+ if (pi && typeof pi === "object" && !Array.isArray(pi)) {
248
+ const subagents = pi.subagents;
249
+ if (subagents && typeof subagents === "object" && !Array.isArray(subagents)) {
250
+ roots.push(subagents);
251
+ }
252
+ }
253
+ const agents = [];
254
+ const chains = [];
255
+ for (const root of roots) {
256
+ for (const entry of stringArray(root.agents))
257
+ agents.push({ dir: path.resolve(packageRoot, entry), scope, ...metadata });
258
+ for (const entry of stringArray(root.chains))
259
+ chains.push({ dir: path.resolve(packageRoot, entry), scope, packageRoot });
260
+ }
261
+ return { agents, chains, watchPaths: [packageJsonPath], settingsErrors: {} };
262
+ }
263
+ function collectPackageRootsFromNodeModules(nodeModulesDir, watchPaths) {
264
+ const roots = [];
265
+ watchPaths?.push(nodeModulesDir);
266
+ if (!fs.existsSync(nodeModulesDir))
267
+ return roots;
268
+ let entries;
269
+ try {
270
+ entries = fs.readdirSync(nodeModulesDir, { withFileTypes: true });
271
+ }
272
+ catch {
273
+ return roots;
274
+ }
275
+ for (const entry of entries) {
276
+ if (entry.name.startsWith("."))
277
+ continue;
278
+ if (!entry.isDirectory() && !entry.isSymbolicLink())
279
+ continue;
280
+ if (entry.name.startsWith("@")) {
281
+ const scopeDir = path.join(nodeModulesDir, entry.name);
282
+ watchPaths?.push(scopeDir);
283
+ let scopeEntries;
284
+ try {
285
+ scopeEntries = fs.readdirSync(scopeDir, { withFileTypes: true });
286
+ }
287
+ catch {
288
+ continue;
289
+ }
290
+ for (const scopeEntry of scopeEntries) {
291
+ if (scopeEntry.name.startsWith("."))
292
+ continue;
293
+ if (!scopeEntry.isDirectory() && !scopeEntry.isSymbolicLink())
294
+ continue;
295
+ roots.push(path.join(scopeDir, scopeEntry.name));
296
+ }
297
+ continue;
298
+ }
299
+ roots.push(path.join(nodeModulesDir, entry.name));
300
+ }
301
+ return roots;
302
+ }
303
+ function collectSettingsPackageRoots(settingsFile, baseDir) {
304
+ const settings = readSettingsFileStrict(settingsFile);
305
+ const packages = settings.packages;
306
+ if (!Array.isArray(packages))
307
+ return [];
308
+ const roots = [];
309
+ for (const entry of packages) {
310
+ const packageSource = typeof entry === "string"
311
+ ? entry
312
+ : typeof entry === "object" && entry !== null && "source" in entry && typeof entry.source === "string"
313
+ ? entry.source
314
+ : undefined;
315
+ if (!packageSource)
316
+ continue;
317
+ const packageRoot = resolveSettingsPackageRoot(packageSource, baseDir);
318
+ if (packageRoot)
319
+ roots.push(packageRoot);
320
+ }
321
+ return roots;
322
+ }
323
+ function collectPackageSubagentPaths(cwd, options = { includeUser: true, includeProject: true }) {
324
+ const agentDir = getAgentDir();
325
+ const projectRoot = findConfiguredProjectRoot(cwd) ?? cwd;
326
+ const packageRoots = [
327
+ { root: projectRoot, scope: "root" },
328
+ ];
329
+ const watchPaths = [path.join(projectRoot, "package.json")];
330
+ const settingsErrors = {};
331
+ const collectScopedSettingsRoots = (scope, settingsFile, baseDir) => {
332
+ try {
333
+ return collectSettingsPackageRoots(settingsFile, baseDir);
334
+ }
335
+ catch (error) {
336
+ // The raw source snapshot includes both settings scopes. Defer a
337
+ // strict failure until a projection actually selects this scope so an
338
+ // unrelated malformed settings file stays out of scoped discovery.
339
+ settingsErrors[scope] = error instanceof Error
340
+ ? error
341
+ : new Error(`Failed to read settings file '${settingsFile}': ${String(error)}`, { cause: error });
342
+ return [];
343
+ }
344
+ };
345
+ if (options.includeProject) {
346
+ const projectConfigDir = getProjectConfigDir(projectRoot);
347
+ const nodeModulesDir = path.join(projectConfigDir, "npm", "node_modules");
348
+ packageRoots.push(...collectPackageRootsFromNodeModules(nodeModulesDir, watchPaths).map((root) => ({ root, scope: "project" })));
349
+ packageRoots.push(...collectScopedSettingsRoots("project", path.join(projectConfigDir, "settings.json"), projectConfigDir).map((root) => ({ root, scope: "project" })));
350
+ }
351
+ if (options.includeUser) {
352
+ const nodeModulesDir = path.join(agentDir, "npm", "node_modules");
353
+ packageRoots.push(...collectPackageRootsFromNodeModules(nodeModulesDir, watchPaths).map((root) => ({ root, scope: "user" })));
354
+ packageRoots.push(...collectScopedSettingsRoots("user", path.join(agentDir, "settings.json"), agentDir).map((root) => ({ root, scope: "user" })));
355
+ }
356
+ if (options.includeUser) {
357
+ const globalRoot = getGlobalNpmRoot();
358
+ if (globalRoot) {
359
+ packageRoots.push(...collectPackageRootsFromNodeModules(globalRoot, watchPaths).map((root) => ({ root, scope: "user" })));
360
+ }
361
+ }
362
+ const seenRoots = new Map();
363
+ const seenAgents = new Map();
364
+ const seenChains = new Map();
365
+ const agents = [];
366
+ const chains = [];
367
+ for (const { root: packageRoot, scope } of packageRoots) {
368
+ const resolvedRoot = path.resolve(packageRoot);
369
+ const scopes = seenRoots.get(resolvedRoot);
370
+ if (scopes !== undefined) {
371
+ scopes.add(scope);
372
+ continue;
373
+ }
374
+ const packageScopes = new Set([scope]);
375
+ seenRoots.set(resolvedRoot, packageScopes);
376
+ const paths = extractSubagentPathsFromPackageRoot(resolvedRoot, packageScopes);
377
+ watchPaths.push(...paths.watchPaths);
378
+ for (const agentPath of paths.agents) {
379
+ const agentKey = `${agentPath.dir}\u0000${agentPath.packageRoot}`;
380
+ const existing = seenAgents.get(agentKey);
381
+ if (existing) {
382
+ for (const packageScope of agentPath.scope)
383
+ existing.scope.add(packageScope);
384
+ continue;
385
+ }
386
+ seenAgents.set(agentKey, agentPath);
387
+ agents.push(agentPath);
388
+ }
389
+ for (const chainDir of paths.chains) {
390
+ const chainKey = `${chainDir.dir}\u0000${chainDir.packageRoot}`;
391
+ const existing = seenChains.get(chainKey);
392
+ if (existing) {
393
+ for (const packageScope of chainDir.scope)
394
+ existing.scope.add(packageScope);
395
+ continue;
396
+ }
397
+ seenChains.set(chainKey, chainDir);
398
+ chains.push(chainDir);
399
+ }
400
+ }
401
+ return { agents, chains, watchPaths, settingsErrors };
402
+ }
403
+ function normalizeAgentAliases(rawAliases, agentName) {
404
+ const aliases = [...new Set((rawAliases ?? []).map((alias) => alias.trim()).filter(Boolean))]
405
+ .filter((alias) => alias !== agentName);
406
+ return aliases.length > 0 ? aliases : undefined;
407
+ }
408
+ function effectiveAgentMatch(matches) {
409
+ const distinctNames = [...new Set(matches.map((agent) => agent.name))];
410
+ if (distinctNames.length === 1) {
411
+ const sourceRank = new Map([["builtin", 0], ["package", 1], ["user", 2], ["project", 3], ["runtime", 4]]);
412
+ const agent = [...matches].sort((a, b) => (sourceRank.get(b.source) ?? 0) - (sourceRank.get(a.source) ?? 0))[0];
413
+ return agent ? { agent } : {};
414
+ }
415
+ return {};
416
+ }
417
+ export function resolveAgentName(name, agents) {
418
+ const raw = name.trim();
419
+ const canonical = agents.filter((agent) => agent.name === raw);
420
+ if (canonical.length === 1)
421
+ return canonical[0] ? { agent: canonical[0] } : {};
422
+ if (canonical.length > 1) {
423
+ const effective = effectiveAgentMatch(canonical);
424
+ if (effective.agent)
425
+ return effective;
426
+ return { error: `Ambiguous agent name '${name}': ${canonical.map((agent) => agent.name).join(", ")}` };
427
+ }
428
+ const local = agents.filter((agent) => agent.localName === raw);
429
+ if (local.length === 1)
430
+ return local[0] ? { agent: local[0] } : {};
431
+ if (local.length > 1) {
432
+ const effective = effectiveAgentMatch(local);
433
+ if (effective.agent)
434
+ return effective;
435
+ return { error: `Ambiguous local agent name '${name}': ${local.map((agent) => agent.name).join(", ")}` };
436
+ }
437
+ const aliases = agents.filter((agent) => agent.aliases?.includes(raw));
438
+ if (aliases.length === 1)
439
+ return aliases[0] ? { agent: aliases[0] } : {};
440
+ if (aliases.length > 1) {
441
+ const effective = effectiveAgentMatch(aliases);
442
+ if (effective.agent)
443
+ return effective;
444
+ return { error: `Ambiguous agent alias '${name}': ${aliases.map((agent) => agent.name).join(", ")}` };
445
+ }
446
+ return {};
447
+ }
448
+ function splitToolList(rawTools) {
449
+ const mcpDirectTools = [];
450
+ const tools = [];
451
+ for (const tool of rawTools ?? []) {
452
+ if (tool.startsWith("mcp:")) {
453
+ mcpDirectTools.push(tool.slice(4));
454
+ }
455
+ else {
456
+ tools.push(tool);
457
+ }
458
+ }
459
+ return {
460
+ ...(rawTools !== undefined ? { tools } : {}),
461
+ ...(mcpDirectTools.length > 0 ? { mcpDirectTools } : {}),
462
+ };
463
+ }
464
+ function joinToolList(config) {
465
+ const joined = [
466
+ ...(config.tools ?? []),
467
+ ...(config.mcpDirectTools ?? []).map((tool) => `mcp:${tool}`),
468
+ ];
469
+ return joined.length > 0 ? joined : undefined;
470
+ }
471
+ function arraysEqual(a, b) {
472
+ if (!a && !b)
473
+ return true;
474
+ if (!a || !b)
475
+ return false;
476
+ if (a.length !== b.length)
477
+ return false;
478
+ for (let i = 0; i < a.length; i++) {
479
+ if (a[i] !== b[i])
480
+ return false;
481
+ }
482
+ return true;
483
+ }
484
+ function cloneOverrideBase(agent) {
485
+ return {
486
+ description: agent.description,
487
+ ...(agent.machine !== undefined ? { machine: agent.machine } : {}),
488
+ ...(agent.output !== undefined ? { output: agent.output } : {}),
489
+ ...(agent.outputMode !== undefined ? { outputMode: agent.outputMode } : {}),
490
+ ...(agent.defaultReads !== undefined ? { defaultReads: [...agent.defaultReads] } : {}),
491
+ ...(agent.model !== undefined ? { model: agent.model } : {}),
492
+ ...(agent.modelProvider !== undefined ? { modelProvider: agent.modelProvider } : {}),
493
+ ...(agent.fast !== undefined ? { fast: agent.fast } : {}),
494
+ ...(agent.thinking !== undefined ? { thinking: agent.thinking } : {}),
495
+ systemPromptMode: agent.systemPromptMode,
496
+ inheritProjectContext: agent.inheritProjectContext,
497
+ inheritGlobalContext: agent.inheritGlobalContext,
498
+ inheritSkills: agent.inheritSkills,
499
+ ...(agent.defaultContext !== undefined ? { defaultContext: agent.defaultContext } : {}),
500
+ ...(agent.acceptanceRole !== undefined ? { acceptanceRole: agent.acceptanceRole } : {}),
501
+ ...(agent.disabled !== undefined ? { disabled: agent.disabled } : {}),
502
+ systemPrompt: agent.systemPrompt,
503
+ ...(agent.skills ? { skills: [...agent.skills] } : {}),
504
+ ...(agent.skillPath ? { skillPath: [...agent.skillPath] } : {}),
505
+ ...(agent.tools ? { tools: [...agent.tools] } : {}),
506
+ ...(agent.excludeTools ? { excludeTools: [...agent.excludeTools] } : {}),
507
+ ...(agent.allowNestedSubagents !== undefined ? { allowNestedSubagents: agent.allowNestedSubagents } : {}),
508
+ ...(agent.allowedAgents !== undefined ? { allowedAgents: [...agent.allowedAgents] } : {}),
509
+ ...(agent.mcpDirectTools ? { mcpDirectTools: [...agent.mcpDirectTools] } : {}),
510
+ ...(!agent.extensionsFromDefault && agent.extensions ? { extensions: [...agent.extensions] } : {}),
511
+ ...(agent.subagentOnlyExtensions ? { subagentOnlyExtensions: [...agent.subagentOnlyExtensions] } : {}),
512
+ ...(agent.mutationTools ? { mutationTools: [...agent.mutationTools] } : {}),
513
+ ...(agent.completionGuard !== undefined ? { completionGuard: agent.completionGuard } : {}),
514
+ ...(agent.toolBudget !== undefined ? { toolBudget: agent.toolBudget } : {}),
515
+ };
516
+ }
517
+ function cloneOverrideValue(override) {
518
+ return {
519
+ ...(override.description !== undefined ? { description: override.description } : {}),
520
+ ...(override.machine !== undefined ? { machine: override.machine } : {}),
521
+ ...(override.output !== undefined ? { output: override.output } : {}),
522
+ ...(override.outputMode !== undefined ? { outputMode: override.outputMode } : {}),
523
+ ...(override.defaultReads !== undefined ? { defaultReads: override.defaultReads === false ? false : [...override.defaultReads] } : {}),
524
+ ...(override.model !== undefined ? { model: override.model } : {}),
525
+ ...(override.defaultProvider !== undefined ? { defaultProvider: override.defaultProvider } : {}),
526
+ ...(override.fast !== undefined ? { fast: override.fast } : {}),
527
+ ...(override.thinking !== undefined ? { thinking: override.thinking } : {}),
528
+ ...(override.systemPromptMode !== undefined ? { systemPromptMode: override.systemPromptMode } : {}),
529
+ ...(override.inheritProjectContext !== undefined ? { inheritProjectContext: override.inheritProjectContext } : {}),
530
+ ...(override.inheritGlobalContext !== undefined ? { inheritGlobalContext: override.inheritGlobalContext } : {}),
531
+ ...(override.inheritSkills !== undefined ? { inheritSkills: override.inheritSkills } : {}),
532
+ ...(override.defaultContext !== undefined ? { defaultContext: override.defaultContext } : {}),
533
+ ...(override.acceptanceRole !== undefined ? { acceptanceRole: override.acceptanceRole } : {}),
534
+ ...(override.disabled !== undefined ? { disabled: override.disabled } : {}),
535
+ ...(override.systemPrompt !== undefined ? { systemPrompt: override.systemPrompt } : {}),
536
+ ...(override.skills !== undefined ? { skills: override.skills === false ? false : [...override.skills] } : {}),
537
+ ...(override.tools !== undefined ? { tools: Array.isArray(override.tools) ? [...override.tools] : override.tools } : {}),
538
+ ...(override.excludeTools !== undefined ? { excludeTools: override.excludeTools === false ? false : [...override.excludeTools] } : {}),
539
+ ...(override.allowNestedSubagents !== undefined ? { allowNestedSubagents: override.allowNestedSubagents } : {}),
540
+ ...(override.allowedAgents !== undefined ? { allowedAgents: override.allowedAgents === false ? false : [...override.allowedAgents] } : {}),
541
+ ...(override.extensions !== undefined ? { extensions: override.extensions === false ? false : [...override.extensions] } : {}),
542
+ ...(override.subagentOnlyExtensions !== undefined ? { subagentOnlyExtensions: override.subagentOnlyExtensions === false ? false : [...override.subagentOnlyExtensions] } : {}),
543
+ ...(override.mutationTools !== undefined ? { mutationTools: override.mutationTools === false ? false : [...override.mutationTools] } : {}),
544
+ ...(override.completionGuard !== undefined ? { completionGuard: override.completionGuard } : {}),
545
+ ...(override.toolBudget !== undefined ? { toolBudget: override.toolBudget === false ? false : { ...override.toolBudget, ...(Array.isArray(override.toolBudget.block) ? { block: [...override.toolBudget.block] } : {}) } } : {}),
546
+ };
547
+ }
548
+ function isProjectRootCandidate(dir) {
549
+ return isDirectory(getProjectConfigDir(dir)) || isDirectory(path.join(dir, ".agents"));
550
+ }
551
+ function findProjectRootCandidates(cwd) {
552
+ const roots = [];
553
+ const windowsProfile = process.env.HOMEDRIVE && process.env.HOMEPATH
554
+ ? `${process.env.HOMEDRIVE}${process.env.HOMEPATH}`
555
+ : undefined;
556
+ const homeDirs = new Set([os.homedir(), process.env.HOME, process.env.USERPROFILE, windowsProfile]
557
+ .filter((value) => Boolean(value?.trim()))
558
+ .filter(isDirectory)
559
+ .map((value) => fs.realpathSync.native(value)));
560
+ let currentDir = cwd;
561
+ while (true) {
562
+ // ~/.pi and ~/.agents are user configuration, never an implicit project.
563
+ if (isDirectory(currentDir) && homeDirs.has(fs.realpathSync.native(currentDir)))
564
+ return roots;
565
+ if (isProjectRootCandidate(currentDir))
566
+ roots.push(currentDir);
567
+ const parentDir = path.dirname(currentDir);
568
+ if (parentDir === currentDir)
569
+ return roots;
570
+ currentDir = parentDir;
571
+ }
572
+ }
573
+ export function findNearestGitRoot(cwd) {
574
+ let currentDir = cwd;
575
+ while (true) {
576
+ if (fs.existsSync(path.join(currentDir, ".git")))
577
+ return currentDir;
578
+ const parentDir = path.dirname(currentDir);
579
+ if (parentDir === currentDir)
580
+ return null;
581
+ currentDir = parentDir;
582
+ }
583
+ }
584
+ function readProjectRootResolution(projectRoot) {
585
+ const settingsPath = path.join(getProjectConfigDir(projectRoot), "settings.json");
586
+ if (!fs.existsSync(settingsPath))
587
+ return undefined;
588
+ const settings = readSettingsFileStrict(settingsPath);
589
+ const subagents = settings.subagents;
590
+ if (!subagents || typeof subagents !== "object" || Array.isArray(subagents))
591
+ return undefined;
592
+ const value = subagents.projectRootResolution;
593
+ if (value === undefined)
594
+ return undefined;
595
+ if (value === "nearest" || value === "git-root")
596
+ return value;
597
+ throw new Error(`Subagent settings in '${settingsPath}' have invalid 'projectRootResolution'; expected 'nearest' or 'git-root'.`);
598
+ }
599
+ export function findNearestProjectRoot(cwd) {
600
+ return findProjectRootCandidates(cwd)[0] ?? null;
601
+ }
602
+ export function findConfiguredProjectRoot(cwd) {
603
+ const candidates = findProjectRootCandidates(cwd);
604
+ const nearestRoot = candidates[0];
605
+ if (!nearestRoot)
606
+ return null;
607
+ let policyRoot;
608
+ let policyRootIndex = -1;
609
+ for (const [index, candidate] of candidates.entries()) {
610
+ const mode = readProjectRootResolution(candidate);
611
+ if (mode === "nearest")
612
+ return nearestRoot;
613
+ if (mode === "git-root") {
614
+ policyRoot = candidate;
615
+ policyRootIndex = index;
616
+ break;
617
+ }
618
+ }
619
+ if (!policyRoot)
620
+ return nearestRoot;
621
+ const gitRoot = findNearestGitRoot(cwd);
622
+ const gitProjectRoot = gitRoot
623
+ ? candidates.slice(policyRootIndex).find((candidate) => path.resolve(candidate) === path.resolve(gitRoot))
624
+ : undefined;
625
+ const configuredGitRoot = fs.existsSync(path.join(policyRoot, ".git")) ? policyRoot : undefined;
626
+ return gitProjectRoot ?? configuredGitRoot ?? nearestRoot;
627
+ }
628
+ function getUserAgentSettingsPath() {
629
+ return path.join(getAgentDir(), "settings.json");
630
+ }
631
+ function getProjectAgentSettingsPath(cwd) {
632
+ const projectRoot = findConfiguredProjectRoot(cwd);
633
+ return projectRoot ? path.join(getProjectConfigDir(projectRoot), "settings.json") : null;
634
+ }
635
+ function readSettingsFileStrict(filePath) {
636
+ if (!fs.existsSync(filePath))
637
+ return {};
638
+ let raw;
639
+ try {
640
+ raw = fs.readFileSync(filePath, "utf-8");
641
+ }
642
+ catch (error) {
643
+ const message = error instanceof Error ? error.message : String(error);
644
+ throw new Error(`Failed to read settings file '${filePath}': ${message}`, { cause: error });
645
+ }
646
+ let parsed;
647
+ try {
648
+ parsed = JSON.parse(raw);
649
+ }
650
+ catch (error) {
651
+ const message = error instanceof Error ? error.message : String(error);
652
+ throw new Error(`Failed to parse settings file '${filePath}': ${message}`, { cause: error });
653
+ }
654
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
655
+ throw new Error(`Settings file '${filePath}' must contain a JSON object.`);
656
+ }
657
+ return parsed;
658
+ }
659
+ function writeSettingsFile(filePath, settings) {
660
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
661
+ fs.writeFileSync(filePath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
662
+ }
663
+ function parseOverrideStringArrayOrFalse(value, meta) {
664
+ if (value === undefined)
665
+ return undefined;
666
+ if (value === false)
667
+ return false;
668
+ if (!Array.isArray(value)) {
669
+ throw new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid '${meta.field}'; expected an array of strings or false.`);
670
+ }
671
+ const items = [];
672
+ for (const item of value) {
673
+ if (typeof item !== "string") {
674
+ throw new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid '${meta.field}'; expected an array of strings or false.`);
675
+ }
676
+ const trimmed = item.trim();
677
+ if (trimmed)
678
+ items.push(trimmed);
679
+ }
680
+ return items;
681
+ }
682
+ function parseToolsOverride(value, meta) {
683
+ if (typeof value === "string" && value.trim() === "inherit")
684
+ return "inherit";
685
+ if (value === undefined || value === false || Array.isArray(value)) {
686
+ return parseOverrideStringArrayOrFalse(value, { ...meta, field: "tools" });
687
+ }
688
+ throw new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid 'tools'; expected an array of strings, "inherit", or false.`);
689
+ }
690
+ function validateOptionalMachine(value, label) {
691
+ if (value === undefined || value === false)
692
+ return undefined;
693
+ if (typeof value !== "string" || !value.trim())
694
+ throw new Error(label + " must be a non-empty string or false.");
695
+ const machine = value.trim();
696
+ if (machine.length > 128)
697
+ throw new Error(label + " must be 128 characters or fewer.");
698
+ if (/[\u0000-\u001f\u007f]/u.test(machine))
699
+ throw new Error(label + " contains control characters.");
700
+ return machine;
701
+ }
702
+ function parseBuiltinOverrideEntry(name, value, filePath) {
703
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
704
+ throw new Error(`Builtin override '${name}' in '${filePath}' must be an object.`);
705
+ }
706
+ const input = value;
707
+ if (Object.hasOwn(input, "fallbackModels")) {
708
+ throw new Error(`Builtin override '${name}' in '${filePath}' uses removed field 'fallbackModels'; configure one model instead.`);
709
+ }
710
+ const override = {};
711
+ if ("description" in input) {
712
+ if (typeof input.description === "string" && input.description.trim()) {
713
+ override.description = input.description.trim();
714
+ }
715
+ else {
716
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'description'; expected a non-empty string.`);
717
+ }
718
+ }
719
+ if ("output" in input) {
720
+ if ((typeof input.output === "string" && input.output.trim()) || input.output === false)
721
+ override.output = input.output;
722
+ else
723
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'output'; expected a non-empty string or false.`);
724
+ }
725
+ if ("outputMode" in input) {
726
+ if (input.outputMode === "inline" || input.outputMode === "file-only") {
727
+ override.outputMode = input.outputMode;
728
+ }
729
+ else {
730
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'outputMode'; expected 'inline' or 'file-only'.`);
731
+ }
732
+ }
733
+ if ("model" in input) {
734
+ if (typeof input.model === "string" || input.model === false)
735
+ override.model = input.model;
736
+ else
737
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'model'; expected a string or false.`);
738
+ }
739
+ if ("fast" in input) {
740
+ if (typeof input.fast === "boolean")
741
+ override.fast = input.fast;
742
+ else
743
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'fast'; expected a boolean.`);
744
+ }
745
+ if ("thinking" in input) {
746
+ if (typeof input.thinking === "string" || input.thinking === false)
747
+ override.thinking = input.thinking;
748
+ else
749
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'thinking'; expected a string or false.`);
750
+ }
751
+ if ("systemPromptMode" in input) {
752
+ if (input.systemPromptMode === "append" || input.systemPromptMode === "replace") {
753
+ override.systemPromptMode = input.systemPromptMode;
754
+ }
755
+ else {
756
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'systemPromptMode'; expected 'append' or 'replace'.`);
757
+ }
758
+ }
759
+ if ("inheritProjectContext" in input) {
760
+ if (typeof input.inheritProjectContext === "boolean") {
761
+ override.inheritProjectContext = input.inheritProjectContext;
762
+ }
763
+ else {
764
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritProjectContext'; expected a boolean.`);
765
+ }
766
+ }
767
+ if ("inheritGlobalContext" in input) {
768
+ if (typeof input.inheritGlobalContext === "boolean") {
769
+ override.inheritGlobalContext = input.inheritGlobalContext;
770
+ }
771
+ else {
772
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritGlobalContext'; expected a boolean.`);
773
+ }
774
+ }
775
+ if ("inheritSkills" in input) {
776
+ if (typeof input.inheritSkills === "boolean") {
777
+ override.inheritSkills = input.inheritSkills;
778
+ }
779
+ else {
780
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritSkills'; expected a boolean.`);
781
+ }
782
+ }
783
+ if ("defaultContext" in input) {
784
+ if (input.defaultContext === "fresh" || input.defaultContext === "fork" || input.defaultContext === false) {
785
+ override.defaultContext = input.defaultContext;
786
+ }
787
+ else {
788
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'defaultContext'; expected 'fresh', 'fork', or false.`);
789
+ }
790
+ }
791
+ if ("acceptanceRole" in input) {
792
+ if (input.acceptanceRole === "read-only" || input.acceptanceRole === "writer" || input.acceptanceRole === false) {
793
+ override.acceptanceRole = input.acceptanceRole;
794
+ }
795
+ else {
796
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'acceptanceRole'; expected 'read-only', 'writer', or false.`);
797
+ }
798
+ }
799
+ if ("disabled" in input) {
800
+ if (typeof input.disabled === "boolean") {
801
+ override.disabled = input.disabled;
802
+ }
803
+ else {
804
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'disabled'; expected a boolean.`);
805
+ }
806
+ }
807
+ if ("completionGuard" in input) {
808
+ if (typeof input.completionGuard === "boolean") {
809
+ override.completionGuard = input.completionGuard;
810
+ }
811
+ else {
812
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'completionGuard'; expected a boolean.`);
813
+ }
814
+ }
815
+ if ("toolBudget" in input) {
816
+ if (input.toolBudget === false) {
817
+ override.toolBudget = false;
818
+ }
819
+ else if (input.toolBudget && typeof input.toolBudget === "object" && !Array.isArray(input.toolBudget)) {
820
+ override.toolBudget = input.toolBudget;
821
+ }
822
+ else {
823
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'toolBudget'; expected an object or false.`);
824
+ }
825
+ }
826
+ if ("systemPrompt" in input) {
827
+ if (typeof input.systemPrompt === "string")
828
+ override.systemPrompt = input.systemPrompt;
829
+ else
830
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'systemPrompt'; expected a string.`);
831
+ }
832
+ if (input.machine === false)
833
+ override.machine = false;
834
+ else {
835
+ const machine = validateOptionalMachine(input.machine, `Builtin override '${name}' in '${filePath}' field 'machine'`);
836
+ if (machine !== undefined)
837
+ override.machine = machine;
838
+ }
839
+ const defaultReads = parseOverrideStringArrayOrFalse(input.defaultReads, { filePath, name, field: "defaultReads" });
840
+ if (defaultReads !== undefined)
841
+ override.defaultReads = defaultReads;
842
+ if ("defaultProvider" in input) {
843
+ if (input.defaultProvider === false)
844
+ override.defaultProvider = false;
845
+ else if (typeof input.defaultProvider === "string" && input.defaultProvider.trim())
846
+ override.defaultProvider = input.defaultProvider.trim();
847
+ else
848
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'defaultProvider'; expected a non-empty string or false.`);
849
+ }
850
+ const skills = parseOverrideStringArrayOrFalse(input.skills, { filePath, name, field: "skills" });
851
+ if (skills !== undefined)
852
+ override.skills = skills;
853
+ const tools = parseToolsOverride(input.tools, { filePath, name });
854
+ if (tools !== undefined)
855
+ override.tools = tools;
856
+ const excludeTools = parseOverrideStringArrayOrFalse(input.excludeTools, { filePath, name, field: "excludeTools" });
857
+ if (excludeTools !== undefined)
858
+ override.excludeTools = excludeTools;
859
+ if ("allowNestedSubagents" in input) {
860
+ if (typeof input.allowNestedSubagents === "boolean")
861
+ override.allowNestedSubagents = input.allowNestedSubagents;
862
+ else
863
+ throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'allowNestedSubagents'; expected a boolean.`);
864
+ }
865
+ const allowedAgents = parseOverrideStringArrayOrFalse(input.allowedAgents, { filePath, name, field: "allowedAgents" });
866
+ if (allowedAgents !== undefined)
867
+ override.allowedAgents = allowedAgents === false ? false : normalizeCapabilityCeilingAllowedAgents(allowedAgents);
868
+ const extensions = parseOverrideStringArrayOrFalse(input.extensions, { filePath, name, field: "extensions" });
869
+ if (extensions !== undefined)
870
+ override.extensions = extensions;
871
+ const subagentOnlyExtensions = parseOverrideStringArrayOrFalse(input.subagentOnlyExtensions, { filePath, name, field: "subagentOnlyExtensions" });
872
+ if (subagentOnlyExtensions !== undefined)
873
+ override.subagentOnlyExtensions = subagentOnlyExtensions;
874
+ const mutationTools = parseOverrideStringArrayOrFalse(input.mutationTools, { filePath, name, field: "mutationTools" });
875
+ if (mutationTools !== undefined)
876
+ override.mutationTools = mutationTools;
877
+ return Object.keys(override).length > 0 ? override : undefined;
878
+ }
879
+ function readSubagentSettings(filePath) {
880
+ if (!filePath)
881
+ return EMPTY_SUBAGENT_SETTINGS;
882
+ const settings = readSettingsFileStrict(filePath);
883
+ const subagents = settings.subagents;
884
+ if (!subagents || typeof subagents !== "object" || Array.isArray(subagents))
885
+ return EMPTY_SUBAGENT_SETTINGS;
886
+ const subagentsObject = subagents;
887
+ let disableBuiltins;
888
+ if ("disableBuiltins" in subagentsObject) {
889
+ if (typeof subagentsObject.disableBuiltins === "boolean") {
890
+ disableBuiltins = subagentsObject.disableBuiltins;
891
+ }
892
+ else {
893
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'disableBuiltins'; expected a boolean.`);
894
+ }
895
+ }
896
+ let disableThinking;
897
+ if ("disableThinking" in subagentsObject) {
898
+ if (typeof subagentsObject.disableThinking === "boolean") {
899
+ disableThinking = subagentsObject.disableThinking;
900
+ }
901
+ else {
902
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'disableThinking'; expected a boolean.`);
903
+ }
904
+ }
905
+ let defaultModel;
906
+ if ("defaultModel" in subagentsObject) {
907
+ if (typeof subagentsObject.defaultModel === "string" && subagentsObject.defaultModel.trim()) {
908
+ defaultModel = subagentsObject.defaultModel.trim();
909
+ }
910
+ else {
911
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultModel'; expected a non-empty string.`);
912
+ }
913
+ }
914
+ let defaultProvider;
915
+ if ("defaultProvider" in subagentsObject) {
916
+ if (typeof subagentsObject.defaultProvider === "string" && subagentsObject.defaultProvider.trim()) {
917
+ defaultProvider = subagentsObject.defaultProvider.trim();
918
+ }
919
+ else {
920
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultProvider'; expected a non-empty string.`);
921
+ }
922
+ }
923
+ let defaultThinking;
924
+ if ("defaultThinking" in subagentsObject) {
925
+ if (typeof subagentsObject.defaultThinking === "string" && subagentsObject.defaultThinking.trim()) {
926
+ defaultThinking = subagentsObject.defaultThinking.trim();
927
+ }
928
+ else {
929
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultThinking'; expected a non-empty string.`);
930
+ }
931
+ }
932
+ let maxThinking;
933
+ if ("maxThinking" in subagentsObject) {
934
+ try {
935
+ maxThinking = parseThinkingLevel(subagentsObject.maxThinking, `'${filePath}' subagents.maxThinking`);
936
+ }
937
+ catch (error) {
938
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'maxThinking'; expected one of off, minimal, low, medium, high, xhigh, or max.`, { cause: error instanceof Error ? error : undefined });
939
+ }
940
+ }
941
+ let defaultExtensions;
942
+ if ("defaultExtensions" in subagentsObject) {
943
+ if (!Array.isArray(subagentsObject.defaultExtensions)
944
+ || subagentsObject.defaultExtensions.some((item) => typeof item !== "string" || !item.trim())) {
945
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultExtensions'; expected an array of non-empty strings.`);
946
+ }
947
+ defaultExtensions = subagentsObject.defaultExtensions.map((item) => item.trim());
948
+ }
949
+ let defaultSubagentOnlyExtensions;
950
+ if ("defaultSubagentOnlyExtensions" in subagentsObject) {
951
+ if (!Array.isArray(subagentsObject.defaultSubagentOnlyExtensions)
952
+ || subagentsObject.defaultSubagentOnlyExtensions.some((item) => typeof item !== "string" || !item.trim())) {
953
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultSubagentOnlyExtensions'; expected an array of non-empty strings.`);
954
+ }
955
+ defaultSubagentOnlyExtensions = subagentsObject.defaultSubagentOnlyExtensions.map((item) => item.trim());
956
+ }
957
+ let agentScanDirs;
958
+ if ("agentScanDirs" in subagentsObject) {
959
+ if (!Array.isArray(subagentsObject.agentScanDirs)
960
+ || subagentsObject.agentScanDirs.some((item) => typeof item !== "string" || !item.trim())) {
961
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'agentScanDirs'; expected an array of non-empty strings.`);
962
+ }
963
+ agentScanDirs = subagentsObject.agentScanDirs.map((item) => item.trim());
964
+ }
965
+ let agentExcludeDirs;
966
+ if ("agentExcludeDirs" in subagentsObject) {
967
+ if (!Array.isArray(subagentsObject.agentExcludeDirs)
968
+ || subagentsObject.agentExcludeDirs.some((item) => typeof item !== "string" || !item.trim())) {
969
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'agentExcludeDirs'; expected an array of non-empty strings.`);
970
+ }
971
+ agentExcludeDirs = subagentsObject.agentExcludeDirs.map((item) => item.trim());
972
+ }
973
+ const modelScope = parseModelScopeConfig(subagentsObject.modelScope, { filePath });
974
+ const parsed = {};
975
+ const providerOverrides = {};
976
+ const agentOverrides = subagentsObject.agentOverrides;
977
+ const agentOverridesByProvider = subagentsObject.agentOverridesByProvider;
978
+ const parsedSettings = {
979
+ overrides: parsed,
980
+ providerOverrides,
981
+ ...(defaultModel !== undefined ? { defaultModel } : {}),
982
+ ...(defaultProvider !== undefined ? { defaultProvider } : {}),
983
+ ...(defaultThinking !== undefined ? { defaultThinking } : {}),
984
+ ...(maxThinking !== undefined ? { maxThinking } : {}),
985
+ ...(defaultExtensions !== undefined ? { defaultExtensions } : {}),
986
+ ...(defaultSubagentOnlyExtensions !== undefined ? { defaultSubagentOnlyExtensions } : {}),
987
+ ...(agentScanDirs !== undefined ? { agentScanDirs } : {}),
988
+ ...(agentExcludeDirs !== undefined ? { agentExcludeDirs } : {}),
989
+ ...(disableBuiltins !== undefined ? { disableBuiltins } : {}),
990
+ ...(disableThinking !== undefined ? { disableThinking } : {}),
991
+ ...(modelScope !== undefined ? { modelScope } : {}),
992
+ };
993
+ if (agentOverrides && typeof agentOverrides === "object" && !Array.isArray(agentOverrides)) {
994
+ for (const [name, value] of Object.entries(agentOverrides)) {
995
+ const override = parseBuiltinOverrideEntry(name, value, filePath);
996
+ if (override)
997
+ parsed[name] = override;
998
+ }
999
+ }
1000
+ if (agentOverridesByProvider !== undefined) {
1001
+ if (!agentOverridesByProvider || typeof agentOverridesByProvider !== "object" || Array.isArray(agentOverridesByProvider)) {
1002
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'agentOverridesByProvider'; expected an object keyed by provider.`);
1003
+ }
1004
+ for (const [provider, value] of Object.entries(agentOverridesByProvider)) {
1005
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
1006
+ throw new Error(`Subagent settings in '${filePath}' have invalid 'agentOverridesByProvider.${provider}'; expected an object keyed by agent.`);
1007
+ }
1008
+ const entries = {};
1009
+ for (const [agentName, agentValue] of Object.entries(value)) {
1010
+ const override = parseBuiltinOverrideEntry(`agentOverridesByProvider.${provider}.${agentName}`, agentValue, filePath);
1011
+ if (override)
1012
+ entries[agentName] = override;
1013
+ }
1014
+ providerOverrides[provider] = entries;
1015
+ }
1016
+ }
1017
+ return parsedSettings;
1018
+ }
1019
+ function selectProviderOverrides(settings, provider) {
1020
+ if (!provider)
1021
+ return settings;
1022
+ const selected = settings.providerOverrides[provider];
1023
+ if (!selected)
1024
+ return settings;
1025
+ const overrides = { ...settings.overrides };
1026
+ for (const [name, override] of Object.entries(selected)) {
1027
+ overrides[name] = { ...overrides[name], ...override };
1028
+ }
1029
+ return { ...settings, overrides };
1030
+ }
1031
+ function resolveSubagentDefaultProvider(userSettings, projectSettings, projectSettingsPath) {
1032
+ if (projectSettingsPath && projectSettings.defaultProvider !== undefined)
1033
+ return projectSettings.defaultProvider;
1034
+ return userSettings.defaultProvider;
1035
+ }
1036
+ function resolveSubagentDefaultModel(userSettings, projectSettings, userSettingsPath, projectSettingsPath, defaultProvider) {
1037
+ if (projectSettingsPath && projectSettings.defaultModel !== undefined) {
1038
+ return { type: "subagents.defaultModel", scope: "project", path: projectSettingsPath, model: projectSettings.defaultModel, ...(defaultProvider ? { defaultProvider } : {}) };
1039
+ }
1040
+ return userSettings.defaultModel !== undefined
1041
+ ? { type: "subagents.defaultModel", scope: "user", path: userSettingsPath, model: userSettings.defaultModel, ...(defaultProvider ? { defaultProvider } : {}) }
1042
+ : undefined;
1043
+ }
1044
+ function applySubagentDefaultModel(agents, defaultModel, defaultProvider) {
1045
+ if (!defaultModel && !defaultProvider)
1046
+ return agents;
1047
+ return agents.map((agent) => {
1048
+ if (agent.model !== undefined && (agent.modelProvider !== undefined || !defaultProvider))
1049
+ return agent;
1050
+ const next = {
1051
+ ...agent,
1052
+ ...(agent.model === undefined && defaultModel ? { model: defaultModel.model, modelSource: defaultModel } : {}),
1053
+ ...(defaultProvider ? { modelProvider: defaultProvider } : {}),
1054
+ };
1055
+ const frontmatterFields = agentFrontmatterFields.get(agent);
1056
+ if (frontmatterFields)
1057
+ agentFrontmatterFields.set(next, frontmatterFields);
1058
+ return next;
1059
+ });
1060
+ }
1061
+ function resolveSubagentDefaultThinking(userSettings, projectSettings, projectSettingsPath) {
1062
+ if (projectSettingsPath && projectSettings.defaultThinking !== undefined)
1063
+ return projectSettings.defaultThinking;
1064
+ return userSettings.defaultThinking;
1065
+ }
1066
+ function applySubagentDefaultThinking(agents, defaultThinking) {
1067
+ if (defaultThinking === undefined)
1068
+ return agents;
1069
+ return agents.map((agent) => {
1070
+ if (agent.thinking !== undefined)
1071
+ return agent;
1072
+ const next = { ...agent, thinking: defaultThinking };
1073
+ const frontmatterFields = agentFrontmatterFields.get(agent);
1074
+ if (frontmatterFields)
1075
+ agentFrontmatterFields.set(next, frontmatterFields);
1076
+ return next;
1077
+ });
1078
+ }
1079
+ function resolveSubagentMaxThinking(userSettings, projectSettings, projectSettingsPath) {
1080
+ if (projectSettingsPath && projectSettings.maxThinking !== undefined)
1081
+ return projectSettings.maxThinking;
1082
+ return userSettings.maxThinking;
1083
+ }
1084
+ function applySubagentMaxThinking(agents, maxThinking) {
1085
+ if (maxThinking === undefined)
1086
+ return agents;
1087
+ return agents.map((agent) => agent.maxThinking === maxThinking ? agent : { ...agent, maxThinking });
1088
+ }
1089
+ function resolveSubagentDefaultExtensions(userSettings, projectSettings, projectSettingsPath) {
1090
+ if (projectSettingsPath && projectSettings.defaultExtensions !== undefined)
1091
+ return projectSettings.defaultExtensions;
1092
+ return userSettings.defaultExtensions;
1093
+ }
1094
+ function applySubagentDefaultExtensions(agents, defaultExtensions) {
1095
+ if (defaultExtensions === undefined)
1096
+ return agents;
1097
+ return agents.map((agent) => {
1098
+ if (agent.extensions !== undefined)
1099
+ return agent;
1100
+ const next = { ...agent, extensions: [...defaultExtensions], extensionsFromDefault: true };
1101
+ const frontmatterFields = agentFrontmatterFields.get(agent);
1102
+ if (frontmatterFields)
1103
+ agentFrontmatterFields.set(next, frontmatterFields);
1104
+ return next;
1105
+ });
1106
+ }
1107
+ function resolveSubagentDefaultSubagentOnlyExtensions(userSettings, projectSettings, projectSettingsPath) {
1108
+ if (projectSettingsPath && projectSettings.defaultSubagentOnlyExtensions !== undefined)
1109
+ return projectSettings.defaultSubagentOnlyExtensions;
1110
+ return userSettings.defaultSubagentOnlyExtensions;
1111
+ }
1112
+ function applySubagentDefaultSubagentOnlyExtensions(agents, defaultSubagentOnlyExtensions) {
1113
+ if (defaultSubagentOnlyExtensions === undefined)
1114
+ return agents;
1115
+ return agents.map((agent) => {
1116
+ if (agent.subagentOnlyExtensions !== undefined)
1117
+ return agent;
1118
+ const next = { ...agent, subagentOnlyExtensions: [...defaultSubagentOnlyExtensions] };
1119
+ const frontmatterFields = agentFrontmatterFields.get(agent);
1120
+ if (frontmatterFields)
1121
+ agentFrontmatterFields.set(next, frontmatterFields);
1122
+ return next;
1123
+ });
1124
+ }
1125
+ function applySubagentDefaults(agents, defaultModel, defaultProvider, defaultThinking, defaultExtensions, defaultSubagentOnlyExtensions) {
1126
+ return applySubagentDefaultSubagentOnlyExtensions(applySubagentDefaultExtensions(applySubagentDefaultThinking(applySubagentDefaultModel(agents, defaultModel, defaultProvider), defaultThinking), defaultExtensions), defaultSubagentOnlyExtensions);
1127
+ }
1128
+ function applyToolsOverride(target, toolsOverride) {
1129
+ if (toolsOverride === "inherit") {
1130
+ delete target.tools;
1131
+ delete target.mcpDirectTools;
1132
+ return;
1133
+ }
1134
+ const { tools, mcpDirectTools } = splitToolList(toolsOverride === false ? [] : toolsOverride);
1135
+ if (tools === undefined)
1136
+ delete target.tools;
1137
+ else
1138
+ target.tools = tools;
1139
+ if (mcpDirectTools === undefined)
1140
+ delete target.mcpDirectTools;
1141
+ else
1142
+ target.mcpDirectTools = mcpDirectTools;
1143
+ }
1144
+ function applyBuiltinOverride(agent, override, meta) {
1145
+ const overrideInfo = {
1146
+ ...meta,
1147
+ base: agent.override?.base ?? cloneOverrideBase(agent),
1148
+ fields: [...new Set([...(agent.override?.fields ?? []), ...Object.keys(override)])].sort(),
1149
+ fieldScopes: Object.fromEntries(Object.entries({ ...(agent.override?.fieldScopes ?? {}) }).map(([field, scopes]) => [field, [...scopes]])),
1150
+ };
1151
+ for (const field of Object.keys(override)) {
1152
+ const scopes = overrideInfo.fieldScopes[field] ?? [];
1153
+ overrideInfo.fieldScopes[field] = [...new Set([...scopes, meta.scope])].sort();
1154
+ }
1155
+ const next = {
1156
+ ...agent,
1157
+ override: overrideInfo,
1158
+ };
1159
+ if (override.description !== undefined)
1160
+ next.description = override.description;
1161
+ if (override.machine !== undefined) {
1162
+ if (override.machine === false)
1163
+ delete next.machine;
1164
+ else
1165
+ next.machine = override.machine;
1166
+ }
1167
+ if (override.output !== undefined) {
1168
+ if (override.output === false)
1169
+ delete next.output;
1170
+ else
1171
+ next.output = override.output;
1172
+ }
1173
+ if (override.outputMode !== undefined)
1174
+ next.outputMode = override.outputMode;
1175
+ if (override.defaultReads !== undefined) {
1176
+ if (override.defaultReads === false)
1177
+ delete next.defaultReads;
1178
+ else
1179
+ next.defaultReads = [...override.defaultReads];
1180
+ }
1181
+ if (override.model !== undefined) {
1182
+ if (override.model === false)
1183
+ delete next.model;
1184
+ else
1185
+ next.model = override.model;
1186
+ delete next.modelSource;
1187
+ }
1188
+ if (override.defaultProvider !== undefined) {
1189
+ if (override.defaultProvider === false)
1190
+ delete next.modelProvider;
1191
+ else
1192
+ next.modelProvider = override.defaultProvider;
1193
+ }
1194
+ if (override.fast !== undefined)
1195
+ next.fast = override.fast;
1196
+ if (override.thinking !== undefined) {
1197
+ if (override.thinking === false)
1198
+ delete next.thinking;
1199
+ else
1200
+ next.thinking = override.thinking;
1201
+ }
1202
+ if (override.systemPromptMode !== undefined)
1203
+ next.systemPromptMode = override.systemPromptMode;
1204
+ if (override.inheritProjectContext !== undefined)
1205
+ next.inheritProjectContext = override.inheritProjectContext;
1206
+ if (override.inheritGlobalContext !== undefined)
1207
+ next.inheritGlobalContext = override.inheritGlobalContext;
1208
+ if (override.inheritSkills !== undefined)
1209
+ next.inheritSkills = override.inheritSkills;
1210
+ if (override.defaultContext !== undefined) {
1211
+ if (override.defaultContext === false)
1212
+ delete next.defaultContext;
1213
+ else
1214
+ next.defaultContext = override.defaultContext;
1215
+ }
1216
+ if (override.acceptanceRole !== undefined) {
1217
+ if (override.acceptanceRole === false)
1218
+ delete next.acceptanceRole;
1219
+ else
1220
+ next.acceptanceRole = override.acceptanceRole;
1221
+ }
1222
+ if (override.disabled !== undefined)
1223
+ next.disabled = override.disabled;
1224
+ if (override.systemPrompt !== undefined)
1225
+ next.systemPrompt = override.systemPrompt;
1226
+ if (override.skills !== undefined) {
1227
+ if (override.skills === false)
1228
+ delete next.skills;
1229
+ else
1230
+ next.skills = [...override.skills];
1231
+ }
1232
+ if (override.tools !== undefined)
1233
+ applyToolsOverride(next, override.tools);
1234
+ if (override.excludeTools !== undefined) {
1235
+ if (override.excludeTools === false)
1236
+ delete next.excludeTools;
1237
+ else
1238
+ next.excludeTools = [...override.excludeTools];
1239
+ }
1240
+ if (override.allowNestedSubagents !== undefined)
1241
+ next.allowNestedSubagents = override.allowNestedSubagents;
1242
+ if (override.allowedAgents !== undefined) {
1243
+ if (override.allowedAgents === false)
1244
+ delete next.allowedAgents;
1245
+ else
1246
+ next.allowedAgents = [...override.allowedAgents];
1247
+ }
1248
+ if (override.extensions !== undefined) {
1249
+ if (override.extensions === false)
1250
+ delete next.extensions;
1251
+ else
1252
+ next.extensions = [...override.extensions];
1253
+ }
1254
+ if (override.subagentOnlyExtensions !== undefined) {
1255
+ if (override.subagentOnlyExtensions === false)
1256
+ delete next.subagentOnlyExtensions;
1257
+ else
1258
+ next.subagentOnlyExtensions = [...override.subagentOnlyExtensions];
1259
+ }
1260
+ if (override.mutationTools !== undefined) {
1261
+ if (override.mutationTools === false)
1262
+ delete next.mutationTools;
1263
+ else
1264
+ next.mutationTools = [...override.mutationTools];
1265
+ }
1266
+ if (override.completionGuard !== undefined)
1267
+ next.completionGuard = override.completionGuard;
1268
+ if (override.toolBudget !== undefined) {
1269
+ if (override.toolBudget === false)
1270
+ delete next.toolBudget;
1271
+ else
1272
+ next.toolBudget = override.toolBudget;
1273
+ }
1274
+ return next;
1275
+ }
1276
+ function clearBuiltinThinking(agent, meta) {
1277
+ if (agent.thinking === undefined)
1278
+ return agent;
1279
+ const { thinking: _thinking, ...next } = agent;
1280
+ return { ...next, override: agent.override ?? { ...meta, base: cloneOverrideBase(agent) } };
1281
+ }
1282
+ function applyBuiltinOverrides(builtinAgents, userSettings, projectSettings, userSettingsPath, projectSettingsPath) {
1283
+ const projectBulkDisabled = projectSettings.disableBuiltins === true && projectSettingsPath !== null;
1284
+ const userBulkDisabled = projectSettings.disableBuiltins === undefined && userSettings.disableBuiltins === true;
1285
+ const projectThinkingConfigured = projectSettings.disableThinking !== undefined && projectSettingsPath !== null;
1286
+ const disableThinking = projectThinkingConfigured ? projectSettings.disableThinking === true : userSettings.disableThinking === true;
1287
+ const disableThinkingMeta = projectThinkingConfigured
1288
+ ? { scope: "project", path: projectSettingsPath }
1289
+ : { scope: "user", path: userSettingsPath };
1290
+ const applyGlobalThinking = (agent, hasExplicitThinkingOverride) => {
1291
+ if (!disableThinking || hasExplicitThinkingOverride)
1292
+ return agent;
1293
+ return clearBuiltinThinking(agent, disableThinkingMeta);
1294
+ };
1295
+ return builtinAgents.map((agent) => {
1296
+ const projectOverride = projectSettings.overrides[agent.name];
1297
+ if (projectOverride && projectSettingsPath) {
1298
+ return applyGlobalThinking(applyBuiltinOverride(agent, projectOverride, { scope: "project", path: projectSettingsPath }), projectOverride.thinking !== undefined);
1299
+ }
1300
+ if (projectBulkDisabled && projectSettingsPath) {
1301
+ return applyGlobalThinking(applyBuiltinOverride(agent, { disabled: true }, { scope: "project", path: projectSettingsPath }), false);
1302
+ }
1303
+ const userOverride = userSettings.overrides[agent.name];
1304
+ if (userOverride) {
1305
+ return applyGlobalThinking(applyBuiltinOverride(agent, userOverride, { scope: "user", path: userSettingsPath }), !projectThinkingConfigured && userOverride.thinking !== undefined);
1306
+ }
1307
+ if (userBulkDisabled) {
1308
+ return applyGlobalThinking(applyBuiltinOverride(agent, { disabled: true }, { scope: "user", path: userSettingsPath }), false);
1309
+ }
1310
+ return applyGlobalThinking(agent, false);
1311
+ });
1312
+ }
1313
+ function applyCustomAgentOverride(agent, override, meta) {
1314
+ const next = applyBuiltinOverride(agent, override, meta);
1315
+ const frontmatterFields = agentFrontmatterFields.get(agent);
1316
+ if (frontmatterFields)
1317
+ agentFrontmatterFields.set(next, frontmatterFields);
1318
+ return next;
1319
+ }
1320
+ function applyCustomAgentOverrides(agents, userSettings, projectSettings, userSettingsPath, projectSettingsPath) {
1321
+ // Apply user then project so project fields win without dropping user-only fields.
1322
+ return agents.map((agent) => {
1323
+ const userOverride = userSettings.overrides[agent.name];
1324
+ const withUserOverride = userOverride
1325
+ ? applyCustomAgentOverride(agent, userOverride, { scope: "user", path: userSettingsPath })
1326
+ : agent;
1327
+ const projectOverride = projectSettings.overrides[agent.name];
1328
+ if (projectOverride && projectSettingsPath) {
1329
+ return applyCustomAgentOverride(withUserOverride, projectOverride, { scope: "project", path: projectSettingsPath });
1330
+ }
1331
+ return withUserOverride;
1332
+ });
1333
+ }
1334
+ export function buildBuiltinOverrideConfig(base, draft) {
1335
+ const override = {};
1336
+ if (draft.machine !== base.machine)
1337
+ override.machine = draft.machine ?? false;
1338
+ if (draft.description !== undefined) {
1339
+ const description = draft.description.trim();
1340
+ if (description && description !== base.description)
1341
+ override.description = description;
1342
+ }
1343
+ if (draft.output !== base.output)
1344
+ override.output = draft.output ?? false;
1345
+ if (draft.outputMode !== undefined && draft.outputMode !== base.outputMode)
1346
+ override.outputMode = draft.outputMode;
1347
+ if (!arraysEqual(draft.defaultReads, base.defaultReads))
1348
+ override.defaultReads = draft.defaultReads ? [...draft.defaultReads] : false;
1349
+ if (draft.model !== base.model)
1350
+ override.model = draft.model ?? false;
1351
+ if (draft.modelProvider !== base.modelProvider)
1352
+ override.defaultProvider = draft.modelProvider ?? false;
1353
+ if (draft.fast !== base.fast)
1354
+ override.fast = draft.fast === true;
1355
+ if (draft.thinking !== base.thinking)
1356
+ override.thinking = draft.thinking ?? false;
1357
+ if (draft.systemPromptMode !== base.systemPromptMode)
1358
+ override.systemPromptMode = draft.systemPromptMode;
1359
+ if (draft.inheritProjectContext !== base.inheritProjectContext)
1360
+ override.inheritProjectContext = draft.inheritProjectContext;
1361
+ if (draft.inheritGlobalContext !== base.inheritGlobalContext)
1362
+ override.inheritGlobalContext = draft.inheritGlobalContext;
1363
+ if (draft.inheritSkills !== base.inheritSkills)
1364
+ override.inheritSkills = draft.inheritSkills;
1365
+ if (draft.defaultContext !== base.defaultContext)
1366
+ override.defaultContext = draft.defaultContext ?? false;
1367
+ if (draft.acceptanceRole !== base.acceptanceRole)
1368
+ override.acceptanceRole = draft.acceptanceRole ?? false;
1369
+ if (draft.disabled !== base.disabled)
1370
+ override.disabled = draft.disabled ?? false;
1371
+ if (draft.systemPrompt !== base.systemPrompt)
1372
+ override.systemPrompt = draft.systemPrompt;
1373
+ if (!arraysEqual(draft.skills, base.skills))
1374
+ override.skills = draft.skills ? [...draft.skills] : false;
1375
+ const baseTools = joinToolList(base);
1376
+ const draftTools = joinToolList(draft);
1377
+ if (!arraysEqual(draftTools, baseTools))
1378
+ override.tools = draftTools ? [...draftTools] : false;
1379
+ if (!arraysEqual(draft.excludeTools, base.excludeTools))
1380
+ override.excludeTools = draft.excludeTools ? [...draft.excludeTools] : false;
1381
+ if (draft.allowNestedSubagents !== base.allowNestedSubagents)
1382
+ override.allowNestedSubagents = draft.allowNestedSubagents === true;
1383
+ if (!arraysEqual(draft.extensions, base.extensions))
1384
+ override.extensions = draft.extensions ? [...draft.extensions] : false;
1385
+ if (!arraysEqual(draft.subagentOnlyExtensions, base.subagentOnlyExtensions)) {
1386
+ override.subagentOnlyExtensions = draft.subagentOnlyExtensions ? [...draft.subagentOnlyExtensions] : false;
1387
+ }
1388
+ if (!arraysEqual(draft.mutationTools, base.mutationTools))
1389
+ override.mutationTools = draft.mutationTools ? [...draft.mutationTools] : false;
1390
+ if ((draft.completionGuard !== false) !== (base.completionGuard !== false)) {
1391
+ override.completionGuard = draft.completionGuard !== false;
1392
+ }
1393
+ if (JSON.stringify(draft.toolBudget) !== JSON.stringify(base.toolBudget))
1394
+ override.toolBudget = draft.toolBudget ?? false;
1395
+ return Object.keys(override).length > 0 ? override : undefined;
1396
+ }
1397
+ export function saveBuiltinAgentOverride(cwd, name, scope, override) {
1398
+ const filePath = scope === "project" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();
1399
+ if (!filePath)
1400
+ throw new Error("Project override is not available here. No project config root was found.");
1401
+ const settings = readSettingsFileStrict(filePath);
1402
+ const subagents = settings.subagents && typeof settings.subagents === "object" && !Array.isArray(settings.subagents)
1403
+ ? { ...settings.subagents }
1404
+ : {};
1405
+ const agentOverrides = subagents.agentOverrides && typeof subagents.agentOverrides === "object" && !Array.isArray(subagents.agentOverrides)
1406
+ ? { ...subagents.agentOverrides }
1407
+ : {};
1408
+ agentOverrides[name] = cloneOverrideValue(override);
1409
+ subagents.agentOverrides = agentOverrides;
1410
+ settings.subagents = subagents;
1411
+ writeSettingsFile(filePath, settings);
1412
+ return filePath;
1413
+ }
1414
+ export function removeBuiltinAgentOverride(cwd, name, scope, options) {
1415
+ const filePath = scope === "project" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();
1416
+ if (!filePath)
1417
+ throw new Error("Project override is not available here. No project config root was found.");
1418
+ if (!fs.existsSync(filePath))
1419
+ return { path: filePath, removed: false, machinePreserved: false };
1420
+ const settings = readSettingsFileStrict(filePath);
1421
+ const subagents = settings.subagents;
1422
+ if (!subagents || typeof subagents !== "object" || Array.isArray(subagents))
1423
+ return { path: filePath, removed: false, machinePreserved: false };
1424
+ const nextSubagents = { ...subagents };
1425
+ const agentOverrides = nextSubagents.agentOverrides;
1426
+ if (!agentOverrides || typeof agentOverrides !== "object" || Array.isArray(agentOverrides))
1427
+ return { path: filePath, removed: false, machinePreserved: false };
1428
+ const nextOverrides = { ...agentOverrides };
1429
+ const current = nextOverrides[name];
1430
+ if (!Object.prototype.hasOwnProperty.call(nextOverrides, name))
1431
+ return { path: filePath, removed: false, machinePreserved: false };
1432
+ const configuredMachine = current && typeof current === "object" && !Array.isArray(current) ? current.machine : undefined;
1433
+ const machine = configuredMachine === false || (typeof configuredMachine === "string" && configuredMachine.trim()) ? configuredMachine : undefined;
1434
+ if (options?.preserveMachine && machine !== undefined)
1435
+ nextOverrides[name] = { machine };
1436
+ else
1437
+ delete nextOverrides[name];
1438
+ if (Object.keys(nextOverrides).length > 0)
1439
+ nextSubagents.agentOverrides = nextOverrides;
1440
+ else
1441
+ delete nextSubagents.agentOverrides;
1442
+ if (Object.keys(nextSubagents).length > 0)
1443
+ settings.subagents = nextSubagents;
1444
+ else
1445
+ delete settings.subagents;
1446
+ writeSettingsFile(filePath, settings);
1447
+ return { path: filePath, removed: true, machinePreserved: options?.preserveMachine === true && machine !== undefined };
1448
+ }
1449
+ export function mergeBuiltinAgentOverride(cwd, name, scope, fields) {
1450
+ const filePath = scope === "project" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();
1451
+ if (!filePath)
1452
+ throw new Error("Project override is not available here. No project config root was found.");
1453
+ const settings = readSettingsFileStrict(filePath);
1454
+ const subagents = settings.subagents && typeof settings.subagents === "object" && !Array.isArray(settings.subagents)
1455
+ ? { ...settings.subagents }
1456
+ : {};
1457
+ const agentOverrides = subagents.agentOverrides && typeof subagents.agentOverrides === "object" && !Array.isArray(subagents.agentOverrides)
1458
+ ? { ...subagents.agentOverrides }
1459
+ : {};
1460
+ const existing = agentOverrides[name];
1461
+ const base = existing && typeof existing === "object" && !Array.isArray(existing)
1462
+ ? existing
1463
+ : {};
1464
+ agentOverrides[name] = { ...base, ...cloneOverrideValue(fields) };
1465
+ subagents.agentOverrides = agentOverrides;
1466
+ settings.subagents = subagents;
1467
+ writeSettingsFile(filePath, settings);
1468
+ return filePath;
1469
+ }
1470
+ export function removeBuiltinAgentOverrideFields(cwd, name, scope, fields) {
1471
+ const filePath = scope === "project" ? getProjectAgentSettingsPath(cwd) : getUserAgentSettingsPath();
1472
+ if (!filePath)
1473
+ throw new Error("Project override is not available here. No project config root was found.");
1474
+ if (!fs.existsSync(filePath))
1475
+ return { path: filePath, removed: false };
1476
+ const settings = readSettingsFileStrict(filePath);
1477
+ const subagents = settings.subagents;
1478
+ if (!subagents || typeof subagents !== "object" || Array.isArray(subagents))
1479
+ return { path: filePath, removed: false };
1480
+ const agentOverrides = subagents.agentOverrides;
1481
+ if (!agentOverrides || typeof agentOverrides !== "object" || Array.isArray(agentOverrides))
1482
+ return { path: filePath, removed: false };
1483
+ const entry = agentOverrides[name];
1484
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
1485
+ return { path: filePath, removed: false };
1486
+ const nextEntry = { ...entry };
1487
+ let removed = false;
1488
+ for (const field of fields) {
1489
+ if (Object.prototype.hasOwnProperty.call(nextEntry, field)) {
1490
+ delete nextEntry[field];
1491
+ removed = true;
1492
+ }
1493
+ }
1494
+ if (!removed)
1495
+ return { path: filePath, removed: false };
1496
+ const nextSubagents = { ...subagents };
1497
+ if (Object.keys(nextEntry).length > 0) {
1498
+ nextSubagents.agentOverrides[name] = nextEntry;
1499
+ }
1500
+ else {
1501
+ const nextOverrides = { ...agentOverrides };
1502
+ delete nextOverrides[name];
1503
+ if (Object.keys(nextOverrides).length > 0)
1504
+ nextSubagents.agentOverrides = nextOverrides;
1505
+ else
1506
+ delete nextSubagents.agentOverrides;
1507
+ }
1508
+ if (Object.keys(nextSubagents).length > 0)
1509
+ settings.subagents = nextSubagents;
1510
+ else
1511
+ delete settings.subagents;
1512
+ writeSettingsFile(filePath, settings);
1513
+ return { path: filePath, removed: true };
1514
+ }
1515
+ const DISCOVERY_PRUNED_DIR_NAMES = new Set([".git", "node_modules", ".pi", "sync-backups"]);
1516
+ function isDiscoveryNestedProjectRoot(dir) {
1517
+ return isDirectory(getProjectConfigDir(dir)) || isDirectory(path.join(dir, ".agents"));
1518
+ }
1519
+ function shouldPruneDiscoveryDir(rootDir, dir, dirName) {
1520
+ if (DISCOVERY_PRUNED_DIR_NAMES.has(dirName))
1521
+ return true;
1522
+ if (fs.existsSync(path.join(dir, ".git")))
1523
+ return true;
1524
+ return path.resolve(dir) !== path.resolve(rootDir) && isDiscoveryNestedProjectRoot(dir);
1525
+ }
1526
+ function listFilesRecursive(dir, predicate, rootDir = dir, visitedDirectories = new Set(), inspectedDirectories = new Set()) {
1527
+ const files = [];
1528
+ if (!fs.existsSync(dir))
1529
+ return files;
1530
+ inspectedDirectories.add(path.resolve(dir));
1531
+ let realDir;
1532
+ try {
1533
+ realDir = fs.realpathSync(dir);
1534
+ }
1535
+ catch {
1536
+ return files;
1537
+ }
1538
+ if (visitedDirectories.has(realDir))
1539
+ return files;
1540
+ visitedDirectories.add(realDir);
1541
+ let entries;
1542
+ try {
1543
+ entries = fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
1544
+ }
1545
+ catch {
1546
+ return files;
1547
+ }
1548
+ for (const entry of entries) {
1549
+ const filePath = path.join(dir, entry.name);
1550
+ let isDirectory = entry.isDirectory();
1551
+ if (entry.isSymbolicLink()) {
1552
+ try {
1553
+ isDirectory = fs.statSync(filePath).isDirectory();
1554
+ }
1555
+ catch {
1556
+ isDirectory = false;
1557
+ }
1558
+ }
1559
+ if (isDirectory) {
1560
+ if (!shouldPruneDiscoveryDir(rootDir, filePath, entry.name)) {
1561
+ files.push(...listFilesRecursive(filePath, predicate, rootDir, visitedDirectories, inspectedDirectories));
1562
+ }
1563
+ continue;
1564
+ }
1565
+ if (!entry.isFile() && !entry.isSymbolicLink())
1566
+ continue;
1567
+ if (!predicate(entry.name))
1568
+ continue;
1569
+ files.push(filePath);
1570
+ }
1571
+ return files;
1572
+ }
1573
+ const agentDefinitionInspectionDirectories = new WeakMap();
1574
+ function rememberAgentDefinitionInspection(inspection, directories) {
1575
+ agentDefinitionInspectionDirectories.set(inspection, [...new Set([...directories].map((directory) => path.resolve(directory)))]);
1576
+ return inspection;
1577
+ }
1578
+ function inspectedAgentDefinitionDirectories(inspection, root) {
1579
+ return agentDefinitionInspectionDirectories.get(inspection) ?? [path.resolve(root)];
1580
+ }
1581
+ const DEFAULT_AGENT_DEFINITION_INSPECTION_FS = {
1582
+ existsSync: fs.existsSync,
1583
+ realpathSync: fs.realpathSync,
1584
+ statSync: fs.statSync,
1585
+ readdirSync: (dir) => fs.readdirSync(dir, { withFileTypes: true }),
1586
+ };
1587
+ /**
1588
+ * Inspect one agent-definition directory while retaining traversal failure
1589
+ * state. A nested unreadable directory makes the whole inspection unavailable,
1590
+ * preventing a partial traversal from being reported as empty or complete.
1591
+ */
1592
+ export function inspectAgentDefinitionDirectory(dir, operations = DEFAULT_AGENT_DEFINITION_INSPECTION_FS, isExcluded = () => false) {
1593
+ const root = path.resolve(dir);
1594
+ if (isExcluded(root))
1595
+ return rememberAgentDefinitionInspection({ files: [], state: "empty" }, []);
1596
+ try {
1597
+ if (!operations.existsSync(root))
1598
+ return rememberAgentDefinitionInspection({ files: [], state: "absent" }, [root]);
1599
+ if (!operations.statSync(root).isDirectory())
1600
+ return rememberAgentDefinitionInspection({ files: [], state: "not-directory" }, [root]);
1601
+ }
1602
+ catch {
1603
+ return rememberAgentDefinitionInspection({ files: [], state: "unreadable" }, [root]);
1604
+ }
1605
+ const files = [];
1606
+ let unreadable = false;
1607
+ const visitedDirectories = new Set();
1608
+ const inspectedDirectories = new Set();
1609
+ const visit = (current) => {
1610
+ inspectedDirectories.add(path.resolve(current));
1611
+ let realDir;
1612
+ try {
1613
+ realDir = operations.realpathSync?.(current) ?? path.resolve(current);
1614
+ }
1615
+ catch {
1616
+ unreadable = true;
1617
+ return;
1618
+ }
1619
+ if (visitedDirectories.has(realDir))
1620
+ return;
1621
+ visitedDirectories.add(realDir);
1622
+ let entries;
1623
+ try {
1624
+ entries = operations.readdirSync(current).sort((a, b) => a.name.localeCompare(b.name));
1625
+ }
1626
+ catch {
1627
+ unreadable = true;
1628
+ return;
1629
+ }
1630
+ for (const entry of entries) {
1631
+ const filePath = path.join(current, entry.name);
1632
+ if (isExcluded(filePath))
1633
+ continue;
1634
+ let isDirectory = entry.isDirectory();
1635
+ if (entry.isSymbolicLink()) {
1636
+ try {
1637
+ isDirectory = operations.statSync(filePath).isDirectory();
1638
+ }
1639
+ catch {
1640
+ isDirectory = false;
1641
+ }
1642
+ }
1643
+ if (isDirectory) {
1644
+ if (!shouldPruneDiscoveryDir(root, filePath, entry.name))
1645
+ visit(filePath);
1646
+ continue;
1647
+ }
1648
+ if ((entry.isFile() || entry.isSymbolicLink()) && entry.name.endsWith(".md") && !entry.name.endsWith(".chain.md") && !isLegacyAgentSkillPath(root, filePath))
1649
+ files.push(filePath);
1650
+ }
1651
+ };
1652
+ visit(root);
1653
+ return rememberAgentDefinitionInspection({ files, state: unreadable ? "unreadable" : files.length ? "candidates" : "empty" }, inspectedDirectories);
1654
+ }
1655
+ function isLegacyAgentSkillPath(rootDir, filePath) {
1656
+ const relative = path.relative(rootDir, filePath);
1657
+ const parts = relative.split(path.sep).map((part) => part.toLowerCase());
1658
+ if (path.basename(rootDir).toLowerCase() === ".agents") {
1659
+ parts.unshift(".agents");
1660
+ }
1661
+ return parts.some((part, index) => part === ".agents" && parts[index + 1] === "skills");
1662
+ }
1663
+ function isJsonSerializable(value) {
1664
+ if (value === null || typeof value === "string" || typeof value === "boolean")
1665
+ return true;
1666
+ if (typeof value === "number")
1667
+ return Number.isFinite(value);
1668
+ if (Array.isArray(value))
1669
+ return value.every(isJsonSerializable);
1670
+ if (value && typeof value === "object")
1671
+ return Object.values(value).every(isJsonSerializable);
1672
+ return false;
1673
+ }
1674
+ function parseAgentRunnerFrontmatter(raw, agentName) {
1675
+ if (raw === undefined || !raw.trim())
1676
+ return undefined;
1677
+ let parsed;
1678
+ try {
1679
+ parsed = parseYaml(raw);
1680
+ }
1681
+ catch (error) {
1682
+ throw new Error(`Agent '${agentName}' has invalid runner frontmatter: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
1683
+ }
1684
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
1685
+ throw new Error(`Agent '${agentName}' has invalid runner frontmatter; expected an object.`);
1686
+ }
1687
+ const runner = parsed;
1688
+ if (runner.type === "pi") {
1689
+ if (Object.keys(runner).some((key) => key !== "type"))
1690
+ throw new Error(`Agent '${agentName}' has invalid Pi runner frontmatter; only 'type' is supported.`);
1691
+ return { type: "pi" };
1692
+ }
1693
+ if (runner.type === "external-job") {
1694
+ if (typeof runner.provider !== "string" || !runner.provider.trim() || runner.provider.trim() !== runner.provider) {
1695
+ throw new Error(`Agent '${agentName}' external-job runner requires a non-empty trimmed provider string.`);
1696
+ }
1697
+ if (runner.options !== undefined && (!runner.options || typeof runner.options !== "object" || Array.isArray(runner.options) || !isJsonSerializable(runner.options))) {
1698
+ throw new Error(`Agent '${agentName}' external-job runner options must be a JSON-serializable object.`);
1699
+ }
1700
+ const supported = new Set(["type", "provider", "options"]);
1701
+ const unknown = Object.keys(runner).filter((key) => !supported.has(key));
1702
+ if (unknown.length > 0)
1703
+ throw new Error(`Agent '${agentName}' external-job runner has unsupported fields: ${unknown.join(", ")}.`);
1704
+ return {
1705
+ type: "external-job",
1706
+ provider: runner.provider,
1707
+ ...(runner.options ? { options: runner.options } : {}),
1708
+ };
1709
+ }
1710
+ if (runner.type !== "external-cli") {
1711
+ throw new Error(`Agent '${agentName}' has invalid runner.type; expected 'pi', 'external-cli', or 'external-job'.`);
1712
+ }
1713
+ if (typeof runner.command !== "string" || !runner.command.trim()) {
1714
+ throw new Error(`Agent '${agentName}' external-cli runner requires a non-empty command string.`);
1715
+ }
1716
+ if (runner.args !== undefined && (!Array.isArray(runner.args) || runner.args.some((arg) => typeof arg !== "string"))) {
1717
+ throw new Error(`Agent '${agentName}' external-cli runner args must be an array of strings.`);
1718
+ }
1719
+ if (runner.adapter !== undefined && !isCodeOwnedExternalCliAdapterId(runner.adapter))
1720
+ throw new Error(`Agent '${agentName}' external-cli runner adapter must be ${CODE_OWNED_EXTERNAL_CLI_ADAPTER_LABEL}.`);
1721
+ if (runner.adapter !== undefined && Array.isArray(runner.args) && runner.args.length > 0)
1722
+ throw new Error(`Agent '${agentName}' ${runner.adapter} adapter owns its argv; runner args are not supported.`);
1723
+ if (runner.promptDelivery !== undefined && runner.promptDelivery !== "stdin") {
1724
+ throw new Error(`Agent '${agentName}' external-cli runner promptDelivery must be 'stdin'.`);
1725
+ }
1726
+ const capabilities = parseExternalCliCapabilityNarrowing(runner.capabilities, `Agent '${agentName}' external-cli runner capabilities`);
1727
+ const supported = new Set(["type", "adapter", "command", "args", "promptDelivery", "capabilities"]);
1728
+ const unknown = Object.keys(runner).filter((key) => !supported.has(key));
1729
+ if (unknown.length > 0)
1730
+ throw new Error(`Agent '${agentName}' external-cli runner has unsupported fields: ${unknown.join(", ")}.`);
1731
+ const runnerArgs = Array.isArray(runner.args) ? runner.args.filter((arg) => typeof arg === "string") : undefined;
1732
+ return {
1733
+ type: "external-cli",
1734
+ ...(isCodeOwnedExternalCliAdapterId(runner.adapter) ? { adapter: runner.adapter } : {}),
1735
+ command: runner.command.trim(),
1736
+ ...(runnerArgs?.length ? { args: runnerArgs } : {}),
1737
+ ...(runner.promptDelivery ? { promptDelivery: "stdin" } : {}),
1738
+ ...(capabilities ? { capabilities } : {}),
1739
+ };
1740
+ }
1741
+ function validateExternalRunnerProfile(frontmatter, agentName, runner) {
1742
+ if (runner?.type !== "external-cli" && runner?.type !== "external-job")
1743
+ return;
1744
+ const unsupported = ["tools", "excludeTools", "allowNestedSubagents", "allowedAgents", "model", "thinking", "extensions", "subagentOnlyExtensions", "mutationTools", "maxSubagentDepth", "completionGuard", "skills", "skill", "skillPath", "toolBudget", "permission", "permissions"]
1745
+ .filter((field) => frontmatter[field] !== undefined);
1746
+ if (unsupported.length > 0) {
1747
+ throw new Error(`Agent '${agentName}' uses runner.type='${runner.type}' and declares unsupported Pi-only fields: ${unsupported.join(", ")}.`);
1748
+ }
1749
+ }
1750
+ function parseAgentAcceptanceFrontmatter(raw, agentName) {
1751
+ if (raw === undefined || !raw.trim())
1752
+ return undefined;
1753
+ let parsed;
1754
+ try {
1755
+ parsed = parseYaml(raw);
1756
+ }
1757
+ catch (error) {
1758
+ throw new Error(`Agent '${agentName}' has invalid acceptance frontmatter: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
1759
+ }
1760
+ const errors = validateAcceptanceInput(parsed, `Agent '${agentName}' acceptance frontmatter`);
1761
+ if (errors.length > 0)
1762
+ throw new Error(errors.join(" "));
1763
+ return parsed;
1764
+ }
1765
+ function readAgentDefinitionFiles(dir, inspection = inspectAgentDefinitionDirectory(dir)) {
1766
+ const files = [];
1767
+ for (const filePath of inspection.files) {
1768
+ if (isLegacyAgentSkillPath(dir, filePath)) {
1769
+ continue;
1770
+ }
1771
+ try {
1772
+ files.push({ filePath, content: fs.readFileSync(filePath, "utf-8") });
1773
+ }
1774
+ catch {
1775
+ continue;
1776
+ }
1777
+ }
1778
+ return files;
1779
+ }
1780
+ function resolveAgentRelativeExtensionPaths(paths, agentFilePath) {
1781
+ if (paths === undefined)
1782
+ return undefined;
1783
+ const baseDir = path.dirname(agentFilePath);
1784
+ return paths.map((entry) => {
1785
+ const trimmed = entry.trim();
1786
+ if (trimmed === "." || trimmed === ".." || trimmed.startsWith("./") || trimmed.startsWith("../")) {
1787
+ return path.resolve(baseDir, trimmed);
1788
+ }
1789
+ return entry;
1790
+ });
1791
+ }
1792
+ function loadAgentsFromDefinitionFiles(files, source, discoveryPriority, packageSource) {
1793
+ const agents = [];
1794
+ const diagnostics = [];
1795
+ for (const { filePath, content } of files) {
1796
+ let name;
1797
+ let runtimeName;
1798
+ let packageSpecified = false;
1799
+ try {
1800
+ const { frontmatter, body } = parseFrontmatter(content);
1801
+ if (!frontmatter.name || !frontmatter.description) {
1802
+ continue;
1803
+ }
1804
+ const localName = frontmatter.name;
1805
+ name = localName;
1806
+ const parsedPackage = parsePackageName(frontmatter.package, `Agent '${localName}' package`);
1807
+ packageSpecified = parsedPackage.packageName !== undefined || parsedPackage.error !== undefined;
1808
+ if (parsedPackage.error)
1809
+ throw new Error(parsedPackage.error);
1810
+ const packageName = parsedPackage.packageName;
1811
+ runtimeName = buildRuntimeName(localName, packageName);
1812
+ const runner = parseAgentRunnerFrontmatter(frontmatter.runner, localName);
1813
+ validateExternalRunnerProfile(frontmatter, localName, runner);
1814
+ let advertise;
1815
+ if (frontmatter.advertise !== undefined) {
1816
+ if (frontmatter.advertise === "true")
1817
+ advertise = true;
1818
+ else if (frontmatter.advertise === "false")
1819
+ advertise = false;
1820
+ else
1821
+ throw new Error(`Agent '${localName}' has invalid advertise frontmatter; expected true or false.`);
1822
+ }
1823
+ const rawTools = parseFrontmatterList(frontmatter.tools);
1824
+ const parsedTools = splitToolList(rawTools);
1825
+ const tools = parsedTools.tools ?? [];
1826
+ const mcpDirectTools = parsedTools.mcpDirectTools ?? [];
1827
+ const excludeTools = parseFrontmatterList(frontmatter.excludeTools);
1828
+ const parsedAllowedAgents = parseFrontmatterList(frontmatter.allowedAgents);
1829
+ const allowedAgents = parsedAllowedAgents === undefined ? undefined : normalizeCapabilityCeilingAllowedAgents(parsedAllowedAgents);
1830
+ const defaultReads = parseFrontmatterList(frontmatter.defaultReads);
1831
+ const aliases = normalizeAgentAliases(parseFrontmatterList(frontmatter.aliases ?? frontmatter.alias), runtimeName);
1832
+ const profileError = validateCodeOwnedProfileRunner({ name: runtimeName, localName, aliases, runner });
1833
+ if (profileError)
1834
+ throw new Error(profileError);
1835
+ const skillStr = frontmatter.skill || frontmatter.skills;
1836
+ const skills = parseFrontmatterList(skillStr);
1837
+ const skillPath = parseFrontmatterList(frontmatter.skillPath);
1838
+ if (frontmatter.fallbackModels !== undefined)
1839
+ throw new Error(`Agent '${filePath}' uses removed frontmatter field 'fallbackModels'. Configure one model instead.`);
1840
+ const systemPromptMode = frontmatter.systemPromptMode === "replace"
1841
+ ? "replace"
1842
+ : frontmatter.systemPromptMode === "append"
1843
+ ? "append"
1844
+ : defaultSystemPromptMode(localName);
1845
+ const inheritProjectContext = frontmatter.inheritProjectContext === "true"
1846
+ ? true
1847
+ : frontmatter.inheritProjectContext === "false"
1848
+ ? false
1849
+ : defaultInheritProjectContext(localName);
1850
+ const inheritGlobalContext = frontmatter.inheritGlobalContext === "true";
1851
+ const inheritSkills = frontmatter.inheritSkills === "true"
1852
+ ? true
1853
+ : frontmatter.inheritSkills === "false"
1854
+ ? false
1855
+ : defaultInheritSkills();
1856
+ const defaultContext = frontmatter.defaultContext === "fork"
1857
+ ? "fork"
1858
+ : frontmatter.defaultContext === "fresh"
1859
+ ? "fresh"
1860
+ : undefined;
1861
+ let defaultAsync;
1862
+ if (frontmatter.async !== undefined) {
1863
+ if (frontmatter.async === "true")
1864
+ defaultAsync = true;
1865
+ else if (frontmatter.async === "false")
1866
+ defaultAsync = false;
1867
+ else
1868
+ throw new Error(`Agent '${localName}' has invalid async frontmatter; expected true or false.`);
1869
+ }
1870
+ let defaultTimeoutMs;
1871
+ if (frontmatter.timeoutMs !== undefined) {
1872
+ const parsed = Number(frontmatter.timeoutMs);
1873
+ if (!Number.isInteger(parsed) || parsed <= 0) {
1874
+ throw new Error(`Agent '${localName}' has invalid timeoutMs frontmatter; expected a positive integer.`);
1875
+ }
1876
+ defaultTimeoutMs = parsed;
1877
+ }
1878
+ let defaultToolTimeoutMs;
1879
+ if (frontmatter.toolTimeoutMs !== undefined) {
1880
+ const parsed = Number(frontmatter.toolTimeoutMs);
1881
+ if (!Number.isInteger(parsed) || parsed <= 0 || parsed > 2_147_483_647) {
1882
+ throw new Error(`Agent '${localName}' has invalid toolTimeoutMs frontmatter; expected a positive integer no larger than 2147483647.`);
1883
+ }
1884
+ defaultToolTimeoutMs = parsed;
1885
+ }
1886
+ const defaultAcceptance = parseAgentAcceptanceFrontmatter(frontmatter.acceptance, localName);
1887
+ let outputMode;
1888
+ if (frontmatter.outputMode !== undefined) {
1889
+ if (frontmatter.outputMode === "inline" || frontmatter.outputMode === "file-only")
1890
+ outputMode = frontmatter.outputMode;
1891
+ else
1892
+ throw new Error(`Agent '${localName}' has invalid outputMode frontmatter; expected 'inline' or 'file-only'.`);
1893
+ }
1894
+ let acceptanceRole;
1895
+ if (frontmatter.acceptanceRole !== undefined && frontmatter.acceptanceRole.trim()) {
1896
+ if (frontmatter.acceptanceRole === "read-only" || frontmatter.acceptanceRole === "writer")
1897
+ acceptanceRole = frontmatter.acceptanceRole;
1898
+ else
1899
+ throw new Error(`Agent '${localName}' has invalid acceptanceRole frontmatter; expected 'read-only' or 'writer'.`);
1900
+ }
1901
+ const extensions = resolveAgentRelativeExtensionPaths(parseFrontmatterList(frontmatter.extensions), filePath);
1902
+ const subagentOnlyExtensions = resolveAgentRelativeExtensionPaths(parseFrontmatterList(frontmatter.subagentOnlyExtensions), filePath);
1903
+ const mutationTools = parseFrontmatterList(frontmatter.mutationTools);
1904
+ let fast;
1905
+ if (frontmatter.fast !== undefined) {
1906
+ if (frontmatter.fast === "true")
1907
+ fast = true;
1908
+ else if (frontmatter.fast === "false")
1909
+ fast = false;
1910
+ else
1911
+ throw new Error(`Agent '${localName}' has invalid fast frontmatter; expected true or false.`);
1912
+ }
1913
+ let allowNestedSubagents;
1914
+ if (frontmatter.allowNestedSubagents !== undefined) {
1915
+ if (frontmatter.allowNestedSubagents === "true")
1916
+ allowNestedSubagents = true;
1917
+ else if (frontmatter.allowNestedSubagents === "false")
1918
+ allowNestedSubagents = false;
1919
+ else
1920
+ throw new Error(`Agent '${localName}' has invalid allowNestedSubagents frontmatter; expected true or false.`);
1921
+ }
1922
+ const extraFields = {};
1923
+ for (const [key, value] of Object.entries(frontmatter)) {
1924
+ if (!KNOWN_FIELDS.has(key))
1925
+ extraFields[key] = value;
1926
+ }
1927
+ const parsedMaxSubagentDepth = Number(frontmatter.maxSubagentDepth);
1928
+ if (frontmatter.permission !== undefined && frontmatter.permissions !== undefined) {
1929
+ throw new Error(`Agent '${localName}' cannot declare both permission and permissions frontmatter.`);
1930
+ }
1931
+ const permissionSource = frontmatter.permissions ?? frontmatter.permission;
1932
+ const permissions = permissionSource?.trim()
1933
+ ? validatePermissionRules(parseYaml(permissionSource), `Agent '${localName}' permissions`)
1934
+ : undefined;
1935
+ let toolBudget;
1936
+ if (frontmatter.toolBudget !== undefined && frontmatter.toolBudget.trim()) {
1937
+ const parsed = JSON.parse(frontmatter.toolBudget);
1938
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
1939
+ throw new Error(`Agent '${localName}' has invalid toolBudget frontmatter; expected a JSON object.`);
1940
+ }
1941
+ toolBudget = parsed;
1942
+ }
1943
+ let outputSchema;
1944
+ if (frontmatter.outputSchema !== undefined && frontmatter.outputSchema.trim()) {
1945
+ const parsed = JSON.parse(frontmatter.outputSchema);
1946
+ assertJsonSchemaObject(parsed, `Agent '${localName}' outputSchema`);
1947
+ outputSchema = parsed;
1948
+ }
1949
+ const completionGuard = frontmatter.completionGuard === "false"
1950
+ ? false
1951
+ : frontmatter.completionGuard === "true"
1952
+ ? true
1953
+ : undefined;
1954
+ const maxSubagentDepth = Number.isInteger(parsedMaxSubagentDepth) && parsedMaxSubagentDepth >= 0
1955
+ ? parsedMaxSubagentDepth
1956
+ : undefined;
1957
+ const memory = parseMemoryFrontmatter(frontmatter.memory);
1958
+ const machine = validateOptionalMachine(frontmatter.machine, `Agent '${runtimeName}' frontmatter 'machine'`);
1959
+ const agent = {
1960
+ name: runtimeName,
1961
+ ...(runner !== undefined ? { runner } : {}),
1962
+ localName,
1963
+ ...(packageName !== undefined ? { packageName } : {}),
1964
+ ...(packageSource?.packageName ? { packageSourceName: packageSource.packageName } : {}),
1965
+ ...(packageSource?.packageVersion ? { packageSourceVersion: packageSource.packageVersion } : {}),
1966
+ ...(packageSource?.packageRoot ? { packageSourceRoot: packageSource.packageRoot } : {}),
1967
+ description: frontmatter.description,
1968
+ ...(advertise !== undefined ? { advertise } : {}),
1969
+ ...(aliases !== undefined ? { aliases } : {}),
1970
+ ...(rawTools !== undefined ? { tools } : {}),
1971
+ ...(excludeTools !== undefined ? { excludeTools } : {}),
1972
+ ...(allowNestedSubagents !== undefined ? { allowNestedSubagents } : {}),
1973
+ ...(allowedAgents !== undefined ? { allowedAgents } : {}),
1974
+ ...(mcpDirectTools.length > 0 ? { mcpDirectTools } : {}),
1975
+ ...(frontmatter.model !== undefined ? { model: frontmatter.model } : {}),
1976
+ ...(fast !== undefined ? { fast } : {}),
1977
+ ...(frontmatter.thinking !== undefined ? { thinking: frontmatter.thinking === "false" ? false : frontmatter.thinking } : {}),
1978
+ systemPromptMode,
1979
+ inheritProjectContext,
1980
+ inheritGlobalContext,
1981
+ inheritSkills,
1982
+ ...(defaultContext !== undefined ? { defaultContext } : {}),
1983
+ ...(defaultAsync !== undefined ? { defaultAsync } : {}),
1984
+ ...(defaultTimeoutMs !== undefined ? { defaultTimeoutMs } : {}),
1985
+ ...(defaultToolTimeoutMs !== undefined ? { defaultToolTimeoutMs } : {}),
1986
+ ...(defaultAcceptance !== undefined ? { defaultAcceptance } : {}),
1987
+ ...(acceptanceRole !== undefined ? { acceptanceRole } : {}),
1988
+ systemPrompt: body,
1989
+ source,
1990
+ filePath,
1991
+ ...(discoveryPriority !== undefined ? { discoveryPriority } : {}),
1992
+ ...(skills?.length ? { skills } : {}),
1993
+ ...(skillPath?.length ? { skillPath } : {}),
1994
+ ...(extensions !== undefined ? { extensions } : {}),
1995
+ ...(subagentOnlyExtensions !== undefined ? { subagentOnlyExtensions } : {}),
1996
+ ...(mutationTools?.length ? { mutationTools } : {}),
1997
+ ...(machine !== undefined ? { machine } : {}),
1998
+ ...(frontmatter.output !== undefined ? { output: frontmatter.output } : {}),
1999
+ ...(outputMode !== undefined ? { outputMode } : {}),
2000
+ ...(outputSchema !== undefined ? { outputSchema } : {}),
2001
+ ...(defaultReads?.length ? { defaultReads } : {}),
2002
+ defaultProgress: frontmatter.defaultProgress === "true",
2003
+ interactive: frontmatter.interactive === "true",
2004
+ ...(maxSubagentDepth !== undefined ? { maxSubagentDepth } : {}),
2005
+ ...(completionGuard !== undefined ? { completionGuard } : {}),
2006
+ ...(toolBudget !== undefined ? { toolBudget } : {}),
2007
+ ...(permissions !== undefined ? { permissions } : {}),
2008
+ ...(memory !== undefined ? { memory } : {}),
2009
+ ...(Object.keys(extraFields).length > 0 ? { extraFields } : {}),
2010
+ };
2011
+ agentFrontmatterFields.set(agent, new Set(Object.keys(frontmatter)));
2012
+ agents.push(agent);
2013
+ }
2014
+ catch (error) {
2015
+ diagnostics.push({ source, filePath, ...(name ? { name } : {}), ...(runtimeName && runtimeName !== name ? { runtimeName } : {}), ...(packageSpecified ? { packageSpecified: true } : {}), ...(discoveryPriority !== undefined ? { discoveryPriority } : {}), error: error instanceof Error ? error.message : String(error) });
2016
+ }
2017
+ }
2018
+ return { agents, diagnostics };
2019
+ }
2020
+ function loadAgentsFromDir(dir, source, discoveryPriority, packageSource, inspection = inspectAgentDefinitionDirectory(dir)) {
2021
+ return loadAgentsFromDefinitionFiles(readAgentDefinitionFiles(dir, inspection), source, discoveryPriority, packageSource);
2022
+ }
2023
+ function reportAgentDefinitionDirectory(source, dir, inspection) {
2024
+ return {
2025
+ source,
2026
+ path: path.resolve(dir),
2027
+ state: inspection.state,
2028
+ ...(inspection.state === "candidates" ? { candidateCount: inspection.files.length } : {}),
2029
+ };
2030
+ }
2031
+ function loadChainsFromDir(dir, source) {
2032
+ const chains = new Map();
2033
+ const diagnostics = [];
2034
+ const directories = new Set();
2035
+ const files = listFilesRecursive(dir, (fileName) => fileName.endsWith(".chain.md") || fileName.endsWith(".chain.json"), dir, new Set(), directories);
2036
+ for (const filePath of files) {
2037
+ let content;
2038
+ try {
2039
+ content = fs.readFileSync(filePath, "utf-8");
2040
+ }
2041
+ catch {
2042
+ continue;
2043
+ }
2044
+ try {
2045
+ const chain = filePath.endsWith(".chain.json") ? parseJsonChain(content, source, filePath) : parseChain(content, source, filePath);
2046
+ const existing = chains.get(chain.name);
2047
+ if (existing && existing.filePath.endsWith(".chain.json") && filePath.endsWith(".chain.md"))
2048
+ continue;
2049
+ chains.set(chain.name, chain);
2050
+ }
2051
+ catch (error) {
2052
+ diagnostics.push({ source, filePath, error: error instanceof Error ? error.message : String(error) });
2053
+ continue;
2054
+ }
2055
+ }
2056
+ return { chains: Array.from(chains.values()), diagnostics, files, directories: [...directories] };
2057
+ }
2058
+ function isDirectory(p) {
2059
+ try {
2060
+ return fs.statSync(p).isDirectory();
2061
+ }
2062
+ catch {
2063
+ return false;
2064
+ }
2065
+ }
2066
+ function resolveNearestProjectAgentDirs(cwd) {
2067
+ const projectRoot = findConfiguredProjectRoot(cwd);
2068
+ if (!projectRoot)
2069
+ return { readDirs: [], candidateDirs: [], preferredDir: null };
2070
+ const legacyDir = path.join(projectRoot, ".agents");
2071
+ const preferredDir = path.join(getProjectConfigDir(projectRoot), "agents");
2072
+ const candidateDirs = [legacyDir, preferredDir];
2073
+ const readDirs = [];
2074
+ if (isDirectory(legacyDir))
2075
+ readDirs.push(legacyDir);
2076
+ if (isDirectory(preferredDir))
2077
+ readDirs.push(preferredDir);
2078
+ return { readDirs, candidateDirs, preferredDir };
2079
+ }
2080
+ function resolveNearestProjectChainDirs(cwd) {
2081
+ const projectRoot = findConfiguredProjectRoot(cwd);
2082
+ if (!projectRoot)
2083
+ return { readDirs: [], preferredDir: null };
2084
+ const preferredDir = path.join(getProjectConfigDir(projectRoot), "chains");
2085
+ return {
2086
+ readDirs: isDirectory(preferredDir) ? [preferredDir] : [],
2087
+ preferredDir,
2088
+ };
2089
+ }
2090
+ const BUILTIN_AGENTS_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "agents");
2091
+ // Candidate files and inspection state must describe the same cached builtin scan.
2092
+ const BUILTIN_AGENT_DEFINITION_INSPECTION = inspectAgentDefinitionDirectory(BUILTIN_AGENTS_DIR);
2093
+ const BUILTIN_AGENT_DEFINITION_FILES = readAgentDefinitionFiles(BUILTIN_AGENTS_DIR, BUILTIN_AGENT_DEFINITION_INSPECTION);
2094
+ export const EXTRA_AGENT_DIRS_ENV = "PI_SUBAGENT_EXTRA_AGENT_DIRS";
2095
+ // Additional read-only directories to scan for agent definitions, supplied by the
2096
+ // launcher via PI_SUBAGENT_EXTRA_AGENT_DIRS (PATH-style, split on os/path delimiter).
2097
+ // Lets a hermetic wrapper (e.g. a Nix-store install) expose bundled agents without
2098
+ // copying or symlinking them into the writable agent dir. Loaded as "user" source,
2099
+ // at lower precedence than agents the user placed in their own agent dir.
2100
+ function extraUserAgentDirs() {
2101
+ const raw = process.env[EXTRA_AGENT_DIRS_ENV];
2102
+ if (!raw)
2103
+ return [];
2104
+ return raw
2105
+ .split(path.delimiter)
2106
+ .map((dir) => dir.trim())
2107
+ .filter((dir) => dir.length > 0);
2108
+ }
2109
+ function readConfiguredAgentScanDirs(filePath, key = "agentScanDirs") {
2110
+ if (!filePath)
2111
+ return [];
2112
+ try {
2113
+ const settings = readSettingsFileStrict(filePath);
2114
+ const subagents = settings.subagents;
2115
+ if (!subagents || typeof subagents !== "object" || Array.isArray(subagents))
2116
+ return [];
2117
+ const dirs = subagents[key];
2118
+ return Array.isArray(dirs) ? dirs.filter((dir) => typeof dir === "string" && dir.trim().length > 0) : [];
2119
+ }
2120
+ catch {
2121
+ return [];
2122
+ }
2123
+ }
2124
+ // Resolve existing ancestors to canonicalize missing descendants of symlinks.
2125
+ function canonicalAgentPath(filePath) {
2126
+ const resolved = path.resolve(filePath);
2127
+ try {
2128
+ return fs.realpathSync(resolved);
2129
+ }
2130
+ catch {
2131
+ const parent = path.dirname(resolved);
2132
+ return parent === resolved ? resolved : path.join(canonicalAgentPath(parent), path.basename(resolved));
2133
+ }
2134
+ }
2135
+ function agentExclusionRoots(userSettingsPath, projectSettingsPath) {
2136
+ return [userSettingsPath, projectSettingsPath].flatMap((settingsPath) => settingsPath
2137
+ ? readConfiguredAgentScanDirs(settingsPath, "agentExcludeDirs").map((entry) => {
2138
+ const resolved = path.resolve(path.dirname(settingsPath), expandHomePath(entry.trim()).replace(/[\\/]+/g, path.sep));
2139
+ return { resolved, real: canonicalAgentPath(resolved) };
2140
+ }) : []);
2141
+ }
2142
+ function agentExclusions(roots) {
2143
+ return (filePath) => {
2144
+ if (!roots.length)
2145
+ return false;
2146
+ if (roots.some((root) => isPathWithin(root.resolved, filePath)))
2147
+ return true;
2148
+ const real = canonicalAgentPath(filePath);
2149
+ return roots.some((root) => isPathWithin(root.real, real));
2150
+ };
2151
+ }
2152
+ function expandAgentScanDirPattern(pattern, isExcluded) {
2153
+ const expanded = expandHomePath(pattern.trim()).replace(/[\\/]+/g, path.sep);
2154
+ if (!expanded)
2155
+ return { dirs: [], watchPaths: [] };
2156
+ const wildcardMatches = [...expanded.matchAll(/\*/g)];
2157
+ if (wildcardMatches.length === 0) {
2158
+ const dir = path.resolve(expanded);
2159
+ return { dirs: !isExcluded(dir) && fs.existsSync(dir) ? [dir] : [], watchPaths: [dir] };
2160
+ }
2161
+ const parts = expanded.split(path.sep);
2162
+ const wildcardIndex = parts.findIndex((part) => part.includes("*"));
2163
+ if (wildcardMatches.length !== 1 || wildcardIndex === -1 || parts[wildcardIndex] !== "*")
2164
+ return { dirs: [], watchPaths: [] };
2165
+ const base = path.resolve(parts.slice(0, wildcardIndex).join(path.sep) || path.sep);
2166
+ if (isExcluded(base))
2167
+ return { dirs: [], watchPaths: [base] };
2168
+ const rest = parts.slice(wildcardIndex + 1);
2169
+ let entries;
2170
+ try {
2171
+ entries = fs.readdirSync(base, { withFileTypes: true });
2172
+ }
2173
+ catch {
2174
+ return { dirs: [], watchPaths: [base] };
2175
+ }
2176
+ const candidateDirs = entries.filter((entry) => entry.isDirectory()).map((entry) => path.join(base, entry.name, ...rest));
2177
+ return {
2178
+ dirs: candidateDirs.filter((dir) => !isExcluded(dir) && fs.existsSync(dir)),
2179
+ watchPaths: [base, ...candidateDirs],
2180
+ };
2181
+ }
2182
+ function settingsAgentScanDirs(entries, isExcluded) {
2183
+ const dirs = new Set();
2184
+ const watchPaths = new Set();
2185
+ for (const entry of entries) {
2186
+ const expanded = expandAgentScanDirPattern(entry, isExcluded);
2187
+ for (const dir of expanded.dirs)
2188
+ dirs.add(dir);
2189
+ for (const watchPath of expanded.watchPaths)
2190
+ watchPaths.add(watchPath);
2191
+ }
2192
+ return { dirs: [...dirs], watchPaths: [...watchPaths] };
2193
+ }
2194
+ const agentDiscoveryCache = new Map();
2195
+ function isPathWithin(root, candidate) {
2196
+ const relative = path.relative(path.resolve(root), path.resolve(candidate));
2197
+ return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
2198
+ }
2199
+ function addDirectoryWatchPaths(paths, root, files, directories = []) {
2200
+ const resolvedRoot = path.resolve(root);
2201
+ paths.add(resolvedRoot);
2202
+ // The initial recursive inspection is already bounded to this discovery
2203
+ // root. Keep every visited directory in the fingerprint so a file added to
2204
+ // an existing empty nested directory invalidates the snapshot too.
2205
+ for (const directory of directories) {
2206
+ if (isPathWithin(resolvedRoot, directory))
2207
+ paths.add(path.resolve(directory));
2208
+ }
2209
+ for (const file of files) {
2210
+ paths.add(path.resolve(file));
2211
+ let current = path.resolve(path.dirname(file));
2212
+ while (isPathWithin(resolvedRoot, current)) {
2213
+ paths.add(current);
2214
+ if (current === resolvedRoot)
2215
+ break;
2216
+ current = path.dirname(current);
2217
+ }
2218
+ }
2219
+ }
2220
+ function watchPathSignature(filePath, isExcluded) {
2221
+ try {
2222
+ const stat = fs.statSync(filePath);
2223
+ if (stat.isDirectory()) {
2224
+ const entries = fs.readdirSync(filePath, { withFileTypes: true })
2225
+ .filter((entry) => !isExcluded || !isExcluded(path.join(filePath, entry.name)))
2226
+ .sort((left, right) => left.name.localeCompare(right.name))
2227
+ .map((entry) => `${entry.name}:${entry.isDirectory() ? "d" : entry.isSymbolicLink() ? (isExcluded ? `l:${canonicalAgentPath(path.join(filePath, entry.name))}` : "l") : "f"}`)
2228
+ .join("|");
2229
+ return `directory:${entries}`;
2230
+ }
2231
+ return `file:${stat.size}:${stat.mtimeMs}`;
2232
+ }
2233
+ catch {
2234
+ return "missing";
2235
+ }
2236
+ }
2237
+ function discoveryFingerprint(sources) {
2238
+ const exclusionIdentity = JSON.stringify(sources.exclusionRoots.map((root) => ({ resolved: root.resolved, real: canonicalAgentPath(root.resolved) })));
2239
+ // A retargeted exclusion needs a fresh scan before fingerprinting old roots.
2240
+ if (exclusionIdentity !== JSON.stringify(sources.exclusionRoots))
2241
+ return exclusionIdentity;
2242
+ const rootIdentities = JSON.stringify(sources.identityWatchPaths.map((root) => [root, canonicalAgentPath(root)]));
2243
+ // Package metadata can redirect agents outside an excluded tree without chains.
2244
+ const unfilteredPaths = new Set([...sources.packageSubagentPaths.watchPaths, ...(sources.chainWatchPaths ?? [])]);
2245
+ return exclusionIdentity + "\n" + rootIdentities + "\n" + [...new Set([...sources.watchPaths, ...unfilteredPaths])]
2246
+ .filter((filePath) => unfilteredPaths.has(filePath) || filePath === sources.userSettingsPath || filePath === sources.projectSettingsPath || !sources.isExcluded(filePath))
2247
+ .sort((left, right) => left.localeCompare(right))
2248
+ .map((filePath) => `${filePath}:${watchPathSignature(filePath, sources.exclusionRoots.length && !unfilteredPaths.has(filePath) ? sources.isExcluded : undefined)}`)
2249
+ .join("\n");
2250
+ }
2251
+ function discoveryCacheKey(cwd, preferredModelProvider) {
2252
+ return JSON.stringify([
2253
+ path.resolve(cwd),
2254
+ preferredModelProvider ?? null,
2255
+ getProjectConfigDir(path.resolve(cwd)),
2256
+ getAgentDir(),
2257
+ os.homedir(),
2258
+ process.env.HOME ?? "",
2259
+ process.env.USERPROFILE ?? "",
2260
+ process.env[EXTRA_AGENT_DIRS_ENV] ?? "",
2261
+ process.env.PI_OFFLINE ?? "",
2262
+ process.env.APPDATA ?? "",
2263
+ ]);
2264
+ }
2265
+ function projectDiscoveryWatchPaths(cwd) {
2266
+ const paths = [];
2267
+ let current = path.resolve(cwd);
2268
+ while (true) {
2269
+ paths.push(getProjectConfigDir(current), path.join(current, ".agents"), path.join(current, ".git"));
2270
+ const parent = path.dirname(current);
2271
+ if (parent === current)
2272
+ break;
2273
+ current = parent;
2274
+ }
2275
+ return paths;
2276
+ }
2277
+ function packageEntryIncluded(scope, packageScopes) {
2278
+ if (scope === "both" || packageScopes.has("root"))
2279
+ return true;
2280
+ return packageScopes.has(scope);
2281
+ }
2282
+ function buildAgentDiscoverySources(cwd, preferredModelProvider) {
2283
+ const effectiveCwd = path.resolve(cwd);
2284
+ const userDirOld = path.join(getAgentDir(), "agents");
2285
+ const userDirNew = path.join(os.homedir(), ".agents");
2286
+ const userChainDir = getUserChainDir();
2287
+ const { readDirs: projectAgentDirs, candidateDirs: projectCandidateDirs, preferredDir: projectAgentsDir } = resolveNearestProjectAgentDirs(effectiveCwd);
2288
+ const { readDirs: projectChainDirs, preferredDir: projectChainDir } = resolveNearestProjectChainDirs(effectiveCwd);
2289
+ const userSettingsPath = getUserAgentSettingsPath();
2290
+ const projectSettingsPath = getProjectAgentSettingsPath(effectiveCwd);
2291
+ const packageSubagentPaths = collectPackageSubagentPaths(effectiveCwd);
2292
+ const exclusionRoots = agentExclusionRoots(userSettingsPath, projectSettingsPath);
2293
+ const isExcluded = agentExclusions(exclusionRoots);
2294
+ const userScanDirs = settingsAgentScanDirs(readConfiguredAgentScanDirs(userSettingsPath), isExcluded);
2295
+ const projectScanDirs = settingsAgentScanDirs(readConfiguredAgentScanDirs(projectSettingsPath), isExcluded);
2296
+ const builtinLoaded = loadAgentsFromDefinitionFiles(BUILTIN_AGENT_DEFINITION_FILES, "builtin");
2297
+ const userLoaded = [...extraUserAgentDirs(), ...userScanDirs.dirs, userDirOld, userDirNew].filter((dir) => !isExcluded(dir)).map((dir, discoveryPriority) => {
2298
+ const inspection = inspectAgentDefinitionDirectory(dir, undefined, isExcluded);
2299
+ return { dir, inspection, loaded: loadAgentsFromDir(dir, "user", discoveryPriority, undefined, inspection) };
2300
+ });
2301
+ const projectInspections = new Map(projectCandidateDirs.filter((dir) => !isExcluded(dir)).map((dir) => [dir, inspectAgentDefinitionDirectory(dir, undefined, isExcluded)]));
2302
+ const projectLoaded = [...projectScanDirs.dirs, ...projectAgentDirs].filter((dir) => !isExcluded(dir)).map((dir, discoveryPriority) => {
2303
+ const inspection = projectInspections.get(dir) ?? inspectAgentDefinitionDirectory(dir, undefined, isExcluded);
2304
+ return { dir, inspection, loaded: loadAgentsFromDir(dir, "project", dir === projectAgentsDir ? 1 : discoveryPriority, undefined, inspection) };
2305
+ });
2306
+ const packageLoaded = packageSubagentPaths.agents.filter((entry) => !isExcluded(entry.dir)).map((entry, index) => {
2307
+ const inspection = inspectAgentDefinitionDirectory(entry.dir, undefined, isExcluded);
2308
+ return { dir: entry.dir, inspection, packageEntry: entry, loaded: loadAgentsFromDir(entry.dir, "package", packageSubagentPaths.agents.length - index, entry, inspection) };
2309
+ });
2310
+ const watchPaths = new Set([
2311
+ userSettingsPath,
2312
+ ...(projectSettingsPath ? [projectSettingsPath] : []),
2313
+ ...projectDiscoveryWatchPaths(effectiveCwd),
2314
+ ...findProjectRootCandidates(effectiveCwd).map((root) => path.join(getProjectConfigDir(root), "settings.json")),
2315
+ ...userScanDirs.watchPaths,
2316
+ ...projectScanDirs.watchPaths,
2317
+ ...packageSubagentPaths.watchPaths,
2318
+ ]);
2319
+ for (const directory of userLoaded)
2320
+ addDirectoryWatchPaths(watchPaths, directory.dir, directory.inspection.files, inspectedAgentDefinitionDirectories(directory.inspection, directory.dir));
2321
+ for (const dir of projectCandidateDirs) {
2322
+ const inspection = projectInspections.get(dir);
2323
+ addDirectoryWatchPaths(watchPaths, dir, inspection?.files ?? [], inspection ? inspectedAgentDefinitionDirectories(inspection, dir) : []);
2324
+ }
2325
+ for (const directory of projectLoaded)
2326
+ addDirectoryWatchPaths(watchPaths, directory.dir, directory.inspection.files, inspectedAgentDefinitionDirectories(directory.inspection, directory.dir));
2327
+ for (const directory of packageLoaded)
2328
+ addDirectoryWatchPaths(watchPaths, directory.dir, directory.inspection.files, inspectedAgentDefinitionDirectories(directory.inspection, directory.dir));
2329
+ const userDir = process.env.PI_CODING_AGENT_DIR ? userDirOld : fs.existsSync(userDirNew) ? userDirNew : userDirOld;
2330
+ return {
2331
+ cwd: effectiveCwd,
2332
+ ...(preferredModelProvider !== undefined ? { preferredModelProvider } : {}),
2333
+ userDir,
2334
+ userDirOld,
2335
+ userDirNew,
2336
+ userChainDir,
2337
+ projectAgentDirs,
2338
+ projectCandidateDirs: projectCandidateDirs.filter((dir) => !isExcluded(dir)),
2339
+ projectAgentsDir,
2340
+ projectChainDirs,
2341
+ projectChainDir,
2342
+ userSettingsPath,
2343
+ projectSettingsPath,
2344
+ packageSubagentPaths,
2345
+ builtinLoaded,
2346
+ userLoaded,
2347
+ projectLoaded,
2348
+ projectInspections,
2349
+ packageLoaded,
2350
+ isExcluded,
2351
+ exclusionRoots,
2352
+ // Aliases outside excluded lexical subtrees can be retargeted into allowed
2353
+ // storage. Watch only their identity, never the excluded target's contents.
2354
+ identityWatchPaths: [...new Set([
2355
+ ...userScanDirs.watchPaths, ...projectScanDirs.watchPaths,
2356
+ ...extraUserAgentDirs(), userDirOld, userDirNew, ...projectCandidateDirs,
2357
+ ...packageSubagentPaths.agents.map((entry) => entry.dir),
2358
+ ])]
2359
+ .filter((dir) => !exclusionRoots.some((root) => isPathWithin(root.resolved, dir)) && isExcluded(dir)),
2360
+ watchPaths: [...watchPaths].filter((filePath) => !isExcluded(filePath) || filePath === userSettingsPath || filePath === projectSettingsPath),
2361
+ };
2362
+ }
2363
+ function ensureDiscoveryChains(sources) {
2364
+ if (sources.userChains)
2365
+ return;
2366
+ sources.packageChainLoaded = sources.packageSubagentPaths.chains.map((entry) => ({ entry, loaded: loadChainsFromDir(entry.dir, "package") }));
2367
+ sources.userChains = loadChainsFromDir(sources.userChainDir, "user");
2368
+ sources.projectChainLoaded = sources.projectChainDirs.map((dir) => ({ dir, loaded: loadChainsFromDir(dir, "project") }));
2369
+ const watchPaths = new Set(sources.packageSubagentPaths.watchPaths);
2370
+ addDirectoryWatchPaths(watchPaths, sources.userChainDir, sources.userChains.files, sources.userChains.directories);
2371
+ for (const chain of sources.projectChainLoaded)
2372
+ addDirectoryWatchPaths(watchPaths, chain.dir, chain.loaded.files, chain.loaded.directories);
2373
+ for (const chain of sources.packageChainLoaded)
2374
+ addDirectoryWatchPaths(watchPaths, chain.entry.dir, chain.loaded.files, chain.loaded.directories);
2375
+ sources.chainWatchPaths = watchPaths;
2376
+ sources.watchPaths = [...new Set([...sources.watchPaths, ...watchPaths])];
2377
+ }
2378
+ function getAgentDiscoverySources(cwd, preferredModelProvider, includeChains = false) {
2379
+ const key = discoveryCacheKey(cwd, preferredModelProvider);
2380
+ const cached = agentDiscoveryCache.get(key);
2381
+ if (cached && cached.fingerprint === discoveryFingerprint(cached.sources)) {
2382
+ if (includeChains) {
2383
+ ensureDiscoveryChains(cached.sources);
2384
+ cached.fingerprint = discoveryFingerprint(cached.sources);
2385
+ }
2386
+ return cached.sources;
2387
+ }
2388
+ const sources = buildAgentDiscoverySources(cwd, preferredModelProvider);
2389
+ const entry = { sources, fingerprint: discoveryFingerprint(sources) };
2390
+ agentDiscoveryCache.set(key, entry);
2391
+ if (includeChains) {
2392
+ ensureDiscoveryChains(sources);
2393
+ entry.fingerprint = discoveryFingerprint(sources);
2394
+ }
2395
+ return sources;
2396
+ }
2397
+ /** Clear process-local discovery snapshots, primarily for hosts that reload settings in place. */
2398
+ export function clearAgentDiscoveryCache() {
2399
+ agentDiscoveryCache.clear();
2400
+ }
2401
+ function ensureSettingsForScope(sources, scope, preferredModelProvider) {
2402
+ if (scope !== "project" && sources.userSettings === undefined) {
2403
+ if (sources.packageSubagentPaths.settingsErrors.user)
2404
+ throw sources.packageSubagentPaths.settingsErrors.user;
2405
+ sources.userSettings = selectProviderOverrides(readSubagentSettings(sources.userSettingsPath), preferredModelProvider);
2406
+ }
2407
+ if (scope !== "user" && sources.projectSettings === undefined) {
2408
+ if (sources.packageSubagentPaths.settingsErrors.project)
2409
+ throw sources.packageSubagentPaths.settingsErrors.project;
2410
+ sources.projectSettings = selectProviderOverrides(readSubagentSettings(sources.projectSettingsPath), preferredModelProvider);
2411
+ }
2412
+ }
2413
+ function settingsForScope(sources, scope) {
2414
+ // Parse only settings that participate in this projection. The source cache
2415
+ // still retains both source trees, while malformed out-of-scope settings do
2416
+ // not make an otherwise valid scoped projection fail.
2417
+ ensureSettingsForScope(sources, scope, sources.preferredModelProvider);
2418
+ return {
2419
+ user: scope === "project" ? EMPTY_SUBAGENT_SETTINGS : sources.userSettings ?? EMPTY_SUBAGENT_SETTINGS,
2420
+ project: scope === "user" ? EMPTY_SUBAGENT_SETTINGS : sources.projectSettings ?? EMPTY_SUBAGENT_SETTINGS,
2421
+ };
2422
+ }
2423
+ function configuredAgentsForScope(sources, scope, settingsScope = scope) {
2424
+ const { user: userSettings, project: projectSettings } = settingsForScope(sources, settingsScope);
2425
+ const defaultProvider = resolveSubagentDefaultProvider(userSettings, projectSettings, sources.projectSettingsPath);
2426
+ const defaultModel = resolveSubagentDefaultModel(userSettings, projectSettings, sources.userSettingsPath, sources.projectSettingsPath, defaultProvider);
2427
+ const defaultThinking = resolveSubagentDefaultThinking(userSettings, projectSettings, sources.projectSettingsPath);
2428
+ const maxThinking = resolveSubagentMaxThinking(userSettings, projectSettings, sources.projectSettingsPath);
2429
+ const defaultExtensions = resolveSubagentDefaultExtensions(userSettings, projectSettings, sources.projectSettingsPath);
2430
+ const defaultSubagentOnlyExtensions = resolveSubagentDefaultSubagentOnlyExtensions(userSettings, projectSettings, sources.projectSettingsPath);
2431
+ const applyDefaults = (agents) => applySubagentDefaults(agents, defaultModel, defaultProvider, defaultThinking, defaultExtensions, defaultSubagentOnlyExtensions);
2432
+ const builtin = applyBuiltinOverrides(applyDefaults(sources.builtinLoaded.agents), userSettings, projectSettings, sources.userSettingsPath, sources.projectSettingsPath);
2433
+ const user = applyCustomAgentOverrides(applyDefaults(scope === "project" ? [] : sources.userLoaded.flatMap((loaded) => loaded.loaded.agents)), userSettings, projectSettings, sources.userSettingsPath, sources.projectSettingsPath);
2434
+ const projectMap = new Map();
2435
+ if (scope !== "user")
2436
+ for (const loaded of sources.projectLoaded)
2437
+ for (const agent of loaded.loaded.agents)
2438
+ projectMap.set(agent.name, agent);
2439
+ const project = applyCustomAgentOverrides(applyDefaults(Array.from(projectMap.values())), userSettings, projectSettings, sources.userSettingsPath, sources.projectSettingsPath);
2440
+ const packageMap = new Map();
2441
+ for (const loaded of sources.packageLoaded) {
2442
+ if (!loaded.packageEntry || !packageEntryIncluded(scope, loaded.packageEntry.scope))
2443
+ continue;
2444
+ for (const agent of loaded.loaded.agents)
2445
+ if (!packageMap.has(agent.name))
2446
+ packageMap.set(agent.name, agent);
2447
+ }
2448
+ const packageAgents = applyCustomAgentOverrides(applyDefaults(Array.from(packageMap.values())), userSettings, projectSettings, sources.userSettingsPath, sources.projectSettingsPath);
2449
+ return {
2450
+ builtin,
2451
+ package: packageAgents,
2452
+ user,
2453
+ project,
2454
+ userSettings,
2455
+ projectSettings,
2456
+ maxThinking,
2457
+ modelScope: projectSettings.modelScope ?? userSettings.modelScope,
2458
+ };
2459
+ }
2460
+ function discoveryDirectories(sources, scope) {
2461
+ const directories = [reportAgentDefinitionDirectory("builtin", BUILTIN_AGENTS_DIR, BUILTIN_AGENT_DEFINITION_INSPECTION)];
2462
+ if (scope !== "project")
2463
+ for (const directory of sources.userLoaded)
2464
+ directories.push(reportAgentDefinitionDirectory("user", directory.dir, directory.inspection));
2465
+ if (scope !== "user") {
2466
+ const reported = new Set();
2467
+ for (const dir of sources.projectCandidateDirs) {
2468
+ reported.add(path.resolve(dir));
2469
+ directories.push(reportAgentDefinitionDirectory("project", dir, sources.projectInspections.get(dir)));
2470
+ }
2471
+ for (const directory of sources.projectLoaded) {
2472
+ if (!reported.has(path.resolve(directory.dir)))
2473
+ directories.push(reportAgentDefinitionDirectory("project", directory.dir, directory.inspection));
2474
+ }
2475
+ }
2476
+ for (const directory of sources.packageLoaded) {
2477
+ if (directory.packageEntry && packageEntryIncluded(scope, directory.packageEntry.scope))
2478
+ directories.push(reportAgentDefinitionDirectory("package", directory.dir, directory.inspection));
2479
+ }
2480
+ return directories;
2481
+ }
2482
+ function discoveryDiagnostics(sources, scope) {
2483
+ return [
2484
+ ...sources.builtinLoaded.diagnostics,
2485
+ ...(scope === "project" ? [] : sources.userLoaded.flatMap((loaded) => loaded.loaded.diagnostics)),
2486
+ ...(scope === "user" ? [] : sources.projectLoaded.flatMap((loaded) => loaded.loaded.diagnostics)),
2487
+ ...sources.packageLoaded
2488
+ .filter((loaded) => loaded.packageEntry && packageEntryIncluded(scope, loaded.packageEntry.scope))
2489
+ .flatMap((loaded) => loaded.loaded.diagnostics),
2490
+ ];
2491
+ }
2492
+ function buildEffectiveDiscovery(sources, scope) {
2493
+ const configured = configuredAgentsForScope(sources, scope);
2494
+ const agents = applySubagentMaxThinking(mergeAgentsForScope(scope, configured.user, configured.project, configured.builtin, configured.package).filter((agent) => agent.disabled !== true), configured.maxThinking);
2495
+ return {
2496
+ agents,
2497
+ agentDiagnostics: discoveryDiagnostics(sources, scope),
2498
+ projectAgentsDir: sources.projectAgentsDir,
2499
+ cwd: sources.cwd,
2500
+ scope,
2501
+ directories: discoveryDirectories(sources, scope),
2502
+ ...(configured.modelScope !== undefined ? { modelScope: configured.modelScope } : {}),
2503
+ ...(configured.maxThinking !== undefined ? { maxThinking: configured.maxThinking } : {}),
2504
+ };
2505
+ }
2506
+ function buildAllDiscovery(sources, includeChains, settingsScope) {
2507
+ if (includeChains)
2508
+ ensureDiscoveryChains(sources);
2509
+ const configured = configuredAgentsForScope(sources, "both", settingsScope);
2510
+ const packageChainMap = new Map();
2511
+ const packageChainDiagnostics = [];
2512
+ for (const chain of sources.packageChainLoaded ?? []) {
2513
+ packageChainDiagnostics.push(...chain.loaded.diagnostics);
2514
+ for (const definition of chain.loaded.chains)
2515
+ if (!packageChainMap.has(definition.name))
2516
+ packageChainMap.set(definition.name, definition);
2517
+ }
2518
+ const projectChainMap = new Map();
2519
+ const projectChainDiagnostics = [];
2520
+ for (const chain of sources.projectChainLoaded ?? []) {
2521
+ projectChainDiagnostics.push(...chain.loaded.diagnostics);
2522
+ for (const definition of chain.loaded.chains)
2523
+ projectChainMap.set(definition.name, definition);
2524
+ }
2525
+ const chains = [
2526
+ ...Array.from(packageChainMap.values()),
2527
+ ...(sources.userChains?.chains ?? []),
2528
+ ...Array.from(projectChainMap.values()),
2529
+ ];
2530
+ return {
2531
+ builtin: applySubagentMaxThinking(configured.builtin, configured.maxThinking),
2532
+ package: applySubagentMaxThinking(configured.package, configured.maxThinking),
2533
+ user: applySubagentMaxThinking(configured.user, configured.maxThinking),
2534
+ project: applySubagentMaxThinking(configured.project, configured.maxThinking),
2535
+ agentDiagnostics: [
2536
+ ...sources.builtinLoaded.diagnostics,
2537
+ ...sources.userLoaded.flatMap((loaded) => loaded.loaded.diagnostics),
2538
+ ...sources.packageLoaded.flatMap((loaded) => loaded.loaded.diagnostics),
2539
+ ...sources.projectLoaded.flatMap((loaded) => loaded.loaded.diagnostics),
2540
+ ],
2541
+ chains,
2542
+ chainDiagnostics: [...packageChainDiagnostics, ...(sources.userChains?.diagnostics ?? []), ...projectChainDiagnostics],
2543
+ userDir: sources.userDir,
2544
+ projectDir: sources.projectAgentsDir,
2545
+ userChainDir: sources.userChainDir,
2546
+ projectChainDir: sources.projectChainDir,
2547
+ userSettingsPath: sources.userSettingsPath,
2548
+ projectSettingsPath: sources.projectSettingsPath,
2549
+ ...(configured.maxThinking !== undefined ? { maxThinking: configured.maxThinking } : {}),
2550
+ };
2551
+ }
2552
+ export function discoverAgentSnapshot(cwd, scope, preferredModelProvider, options = {}) {
2553
+ const includeChains = options.includeChains !== false;
2554
+ const sources = getAgentDiscoverySources(cwd, preferredModelProvider, includeChains);
2555
+ return { effective: buildEffectiveDiscovery(sources, scope), all: buildAllDiscovery(sources, includeChains, scope) };
2556
+ }
2557
+ function discoverAgentsUncached(cwd, scope, preferredModelProvider) {
2558
+ const effectiveCwd = path.resolve(cwd);
2559
+ const userDirOld = path.join(getAgentDir(), "agents");
2560
+ const userDirNew = path.join(os.homedir(), ".agents");
2561
+ const { readDirs: projectAgentDirs, candidateDirs: projectCandidateDirs, preferredDir: projectAgentsDir } = resolveNearestProjectAgentDirs(effectiveCwd);
2562
+ const userSettingsPath = getUserAgentSettingsPath();
2563
+ const projectSettingsPath = getProjectAgentSettingsPath(effectiveCwd);
2564
+ const userSettings = selectProviderOverrides(scope === "project" ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(userSettingsPath), preferredModelProvider);
2565
+ const projectSettings = selectProviderOverrides(scope === "user" ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(projectSettingsPath), preferredModelProvider);
2566
+ const defaultProvider = resolveSubagentDefaultProvider(userSettings, projectSettings, projectSettingsPath);
2567
+ const defaultModel = resolveSubagentDefaultModel(userSettings, projectSettings, userSettingsPath, projectSettingsPath, defaultProvider);
2568
+ const defaultThinking = resolveSubagentDefaultThinking(userSettings, projectSettings, projectSettingsPath);
2569
+ const maxThinking = resolveSubagentMaxThinking(userSettings, projectSettings, projectSettingsPath);
2570
+ const defaultExtensions = resolveSubagentDefaultExtensions(userSettings, projectSettings, projectSettingsPath);
2571
+ const defaultSubagentOnlyExtensions = resolveSubagentDefaultSubagentOnlyExtensions(userSettings, projectSettings, projectSettingsPath);
2572
+ const modelScope = projectSettings.modelScope ?? userSettings.modelScope;
2573
+ const packageSubagentPaths = collectPackageSubagentPaths(effectiveCwd, { includeUser: scope !== "project", includeProject: scope !== "user" });
2574
+ const isExcluded = agentExclusions(agentExclusionRoots(userSettingsPath, projectSettingsPath));
2575
+ const directories = [reportAgentDefinitionDirectory("builtin", BUILTIN_AGENTS_DIR, BUILTIN_AGENT_DEFINITION_INSPECTION)];
2576
+ const builtinLoaded = loadAgentsFromDefinitionFiles(BUILTIN_AGENT_DEFINITION_FILES, "builtin");
2577
+ const applyDefaults = (agents) => applySubagentDefaults(agents, defaultModel, defaultProvider, defaultThinking, defaultExtensions, defaultSubagentOnlyExtensions);
2578
+ const builtinAgents = applyBuiltinOverrides(applyDefaults(builtinLoaded.agents), userSettings, projectSettings, userSettingsPath, projectSettingsPath);
2579
+ const userScanDirs = settingsAgentScanDirs(userSettings.agentScanDirs ?? [], isExcluded);
2580
+ const projectScanDirs = settingsAgentScanDirs(projectSettings.agentScanDirs ?? [], isExcluded);
2581
+ const userLoaded = scope === "project" ? [] : [...extraUserAgentDirs(), ...userScanDirs.dirs, userDirOld, userDirNew].filter((dir) => !isExcluded(dir)).map((dir, discoveryPriority) => {
2582
+ const inspection = inspectAgentDefinitionDirectory(dir, undefined, isExcluded);
2583
+ directories.push(reportAgentDefinitionDirectory("user", dir, inspection));
2584
+ return loadAgentsFromDir(dir, "user", discoveryPriority, undefined, inspection);
2585
+ });
2586
+ const userAgents = applyCustomAgentOverrides(applyDefaults(userLoaded.flatMap((loaded) => loaded.agents)), userSettings, projectSettings, userSettingsPath, projectSettingsPath);
2587
+ const projectInspections = scope === "user" ? new Map() : new Map(projectCandidateDirs.filter((dir) => !isExcluded(dir)).map((dir) => [dir, inspectAgentDefinitionDirectory(dir, undefined, isExcluded)]));
2588
+ if (scope !== "user")
2589
+ for (const [dir, inspection] of projectInspections)
2590
+ directories.push(reportAgentDefinitionDirectory("project", dir, inspection));
2591
+ const projectLoaded = scope === "user" ? [] : [...projectScanDirs.dirs, ...projectAgentDirs].filter((dir) => !isExcluded(dir)).map((dir, discoveryPriority) => {
2592
+ const inspection = projectInspections.get(dir) ?? inspectAgentDefinitionDirectory(dir, undefined, isExcluded);
2593
+ if (!projectInspections.has(dir))
2594
+ directories.push(reportAgentDefinitionDirectory("project", dir, inspection));
2595
+ return loadAgentsFromDir(dir, "project", dir === projectAgentsDir ? 1 : discoveryPriority, undefined, inspection);
2596
+ });
2597
+ const projectAgents = applyCustomAgentOverrides(applyDefaults(projectLoaded.flatMap((loaded) => loaded.agents)), userSettings, projectSettings, userSettingsPath, projectSettingsPath);
2598
+ const packageLoaded = packageSubagentPaths.agents.filter((entry) => !isExcluded(entry.dir)).map((entry, index) => {
2599
+ const inspection = inspectAgentDefinitionDirectory(entry.dir, undefined, isExcluded);
2600
+ directories.push(reportAgentDefinitionDirectory("package", entry.dir, inspection));
2601
+ return loadAgentsFromDir(entry.dir, "package", packageSubagentPaths.agents.length - index, entry, inspection);
2602
+ });
2603
+ const packageMap = new Map();
2604
+ for (const loaded of packageLoaded)
2605
+ for (const agent of loaded.agents)
2606
+ if (!packageMap.has(agent.name))
2607
+ packageMap.set(agent.name, agent);
2608
+ const packageAgents = applyCustomAgentOverrides(applyDefaults(Array.from(packageMap.values())), userSettings, projectSettings, userSettingsPath, projectSettingsPath);
2609
+ const agents = applySubagentMaxThinking(mergeAgentsForScope(scope, userAgents, projectAgents, builtinAgents, packageAgents).filter((agent) => agent.disabled !== true), maxThinking);
2610
+ const agentDiagnostics = [...builtinLoaded.diagnostics, ...userLoaded.flatMap((loaded) => loaded.diagnostics), ...projectLoaded.flatMap((loaded) => loaded.diagnostics), ...packageLoaded.flatMap((loaded) => loaded.diagnostics)];
2611
+ return { agents, agentDiagnostics, projectAgentsDir, cwd: effectiveCwd, scope, directories, ...(modelScope !== undefined ? { modelScope } : {}), ...(maxThinking !== undefined ? { maxThinking } : {}) };
2612
+ }
2613
+ export function discoverAgents(cwd, scope, preferredModelProvider) {
2614
+ if (scope !== "both")
2615
+ return discoverAgentsUncached(cwd, scope, preferredModelProvider);
2616
+ const sources = getAgentDiscoverySources(cwd, preferredModelProvider);
2617
+ return buildEffectiveDiscovery(sources, scope);
2618
+ }
2619
+ export function discoverAgentsAll(cwd, preferredModelProvider) {
2620
+ return discoverAgentSnapshot(cwd, "both", preferredModelProvider).all;
2621
+ }
2622
+ //# sourceMappingURL=agents.js.map