@ashx-j/lunr 0.2.11 → 0.2.13

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 (342) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +211 -236
  3. package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
  4. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-tui.js +28 -11
  6. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  7. package/dist/builtin-extensions/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/index.js +0 -2
  9. package/dist/builtin-extensions/index.js.map +1 -1
  10. package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  12. package/dist/builtin-extensions/lunr-cron.js +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  14. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
  16. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
  18. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
  20. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +6 -7
  23. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +7 -14
  27. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
  29. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
  31. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
  33. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +32 -47
  35. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
  37. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
  40. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  41. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +90 -109
  42. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +3 -2
  44. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +37 -50
  46. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +31 -13
  56. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
  58. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
  61. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +48 -20
  63. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +2 -2
  65. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +90 -64
  67. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
  69. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +262 -161
  71. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -1
  73. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
  74. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +24 -33
  75. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
  76. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +25 -0
  77. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
  78. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
  79. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
  80. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
  81. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
  82. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
  83. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
  84. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  85. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  86. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +5 -0
  87. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  88. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +9 -3
  89. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  90. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  91. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +2 -2
  92. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  93. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
  94. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
  95. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +20 -17
  96. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
  97. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
  98. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
  99. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
  100. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
  101. package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
  102. package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
  104. package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
  105. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +80 -20
  106. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
  108. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  109. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
  110. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +20 -32
  112. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  113. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +2 -1
  114. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  115. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +23 -449
  116. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  118. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
  120. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
  122. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
  124. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
  125. package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
  126. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  127. package/dist/builtin-extensions/simple-pi-memory.js +41 -17
  128. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  129. package/dist/catalog/models.json +1 -1
  130. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  131. package/dist/catalog/providers/azure-openai-responses.json +1 -1
  132. package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
  133. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  134. package/dist/catalog/providers/fireworks.json +1 -1
  135. package/dist/catalog/providers/github-copilot.json +1 -1
  136. package/dist/catalog/providers/huggingface.json +1 -1
  137. package/dist/catalog/providers/minimax-cn.json +1 -1
  138. package/dist/catalog/providers/minimax.json +1 -1
  139. package/dist/catalog/providers/mistral.json +1 -1
  140. package/dist/catalog/providers/nvidia.json +1 -1
  141. package/dist/catalog/providers/openai.json +1 -1
  142. package/dist/catalog/providers/opencode-go.json +1 -1
  143. package/dist/catalog/providers/opencode.json +1 -1
  144. package/dist/catalog/providers/openrouter.json +1 -1
  145. package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
  146. package/dist/catalog/providers/qwen-cloud.json +1 -1
  147. package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
  148. package/dist/catalog/providers/qwen-token-plan.json +1 -1
  149. package/dist/catalog/providers/together.json +1 -1
  150. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  151. package/dist/catalog/providers/zai-coding-cn.json +1 -1
  152. package/dist/catalog/providers/zai.json +1 -1
  153. package/dist/catalog/publication.json +3 -3
  154. package/dist/core/agent-session.d.ts +7 -1
  155. package/dist/core/agent-session.d.ts.map +1 -1
  156. package/dist/core/agent-session.js +34 -4
  157. package/dist/core/agent-session.js.map +1 -1
  158. package/dist/core/context-breakdown.d.ts +3 -1
  159. package/dist/core/context-breakdown.d.ts.map +1 -1
  160. package/dist/core/context-breakdown.js +5 -2
  161. package/dist/core/context-breakdown.js.map +1 -1
  162. package/dist/core/customize.d.ts +2 -0
  163. package/dist/core/customize.d.ts.map +1 -1
  164. package/dist/core/customize.js +6 -0
  165. package/dist/core/customize.js.map +1 -1
  166. package/dist/core/memory-cap.d.ts +4 -8
  167. package/dist/core/memory-cap.d.ts.map +1 -1
  168. package/dist/core/memory-cap.js +8 -8
  169. package/dist/core/memory-cap.js.map +1 -1
  170. package/dist/core/permissions.d.ts +2 -0
  171. package/dist/core/permissions.d.ts.map +1 -1
  172. package/dist/core/permissions.js +30 -14
  173. package/dist/core/permissions.js.map +1 -1
  174. package/dist/core/plan-mode.d.ts.map +1 -1
  175. package/dist/core/plan-mode.js +1 -9
  176. package/dist/core/plan-mode.js.map +1 -1
  177. package/dist/core/rollback.d.ts.map +1 -1
  178. package/dist/core/rollback.js +1 -1
  179. package/dist/core/rollback.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +16 -5
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js +37 -10
  183. package/dist/core/settings-manager.js.map +1 -1
  184. package/dist/core/slash-commands.d.ts.map +1 -1
  185. package/dist/core/slash-commands.js +1 -5
  186. package/dist/core/slash-commands.js.map +1 -1
  187. package/dist/core/subagent-permission-inherit.d.ts +34 -22
  188. package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
  189. package/dist/core/subagent-permission-inherit.js +37 -80
  190. package/dist/core/subagent-permission-inherit.js.map +1 -1
  191. package/dist/core/swarm.d.ts.map +1 -1
  192. package/dist/core/swarm.js +13 -7
  193. package/dist/core/swarm.js.map +1 -1
  194. package/dist/core/system-prompt.d.ts +6 -4
  195. package/dist/core/system-prompt.d.ts.map +1 -1
  196. package/dist/core/system-prompt.js +38 -48
  197. package/dist/core/system-prompt.js.map +1 -1
  198. package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
  199. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  200. package/dist/core/usage-adapters/openai-codex.js +22 -17
  201. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  202. package/dist/core/usage-service.d.ts +10 -1
  203. package/dist/core/usage-service.d.ts.map +1 -1
  204. package/dist/core/usage-service.js +17 -6
  205. package/dist/core/usage-service.js.map +1 -1
  206. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  207. package/dist/gateway/agent-bridge.js +1 -4
  208. package/dist/gateway/agent-bridge.js.map +1 -1
  209. package/dist/gateway/cron.d.ts.map +1 -1
  210. package/dist/gateway/cron.js +1 -4
  211. package/dist/gateway/cron.js.map +1 -1
  212. package/dist/index.d.ts +1 -1
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js.map +1 -1
  215. package/dist/main.d.ts.map +1 -1
  216. package/dist/main.js +0 -5
  217. package/dist/main.js.map +1 -1
  218. package/dist/migrations.d.ts +2 -0
  219. package/dist/migrations.d.ts.map +1 -1
  220. package/dist/migrations.js +21 -0
  221. package/dist/migrations.js.map +1 -1
  222. package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
  223. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/settings-selector.js +122 -162
  225. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  226. package/dist/modes/interactive/components/usage-view.d.ts +1 -1
  227. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  228. package/dist/modes/interactive/components/usage-view.js +7 -4
  229. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  230. package/dist/modes/interactive/interactive-mode.d.ts +1 -2
  231. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  232. package/dist/modes/interactive/interactive-mode.js +55 -96
  233. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  234. package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
  235. package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
  236. package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
  237. package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
  238. package/docs/compaction.md +23 -23
  239. package/docs/containerization.md +24 -24
  240. package/docs/custom-provider.md +18 -18
  241. package/docs/development.md +16 -15
  242. package/docs/docs.json +6 -2
  243. package/docs/extensions.md +82 -80
  244. package/docs/features.md +102 -0
  245. package/docs/index.md +25 -19
  246. package/docs/json.md +7 -7
  247. package/docs/keybindings.md +4 -4
  248. package/docs/models.md +2 -2
  249. package/docs/packages.md +38 -42
  250. package/docs/prompt-templates.md +4 -4
  251. package/docs/providers.md +22 -10
  252. package/docs/quickstart.md +81 -46
  253. package/docs/rpc.md +7 -13
  254. package/docs/sdk.md +43 -41
  255. package/docs/security.md +18 -18
  256. package/docs/session-format.md +9 -9
  257. package/docs/sessions.md +13 -12
  258. package/docs/settings.md +63 -24
  259. package/docs/shell-aliases.md +2 -2
  260. package/docs/skills.md +21 -11
  261. package/docs/terminal-setup.md +5 -5
  262. package/docs/termux.md +7 -7
  263. package/docs/themes.md +12 -14
  264. package/docs/tmux.md +4 -4
  265. package/docs/tui.md +23 -23
  266. package/docs/usage.md +112 -87
  267. package/docs/windows.md +10 -2
  268. package/examples/README.md +3 -1
  269. package/examples/extensions/README.md +6 -6
  270. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  271. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  272. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  273. package/examples/extensions/doom-overlay/README.md +2 -2
  274. package/examples/extensions/gondolin/package-lock.json +2 -2
  275. package/examples/extensions/gondolin/package.json +1 -1
  276. package/examples/extensions/plan-mode/README.md +3 -1
  277. package/examples/extensions/sandbox/package-lock.json +2 -2
  278. package/examples/extensions/sandbox/package.json +1 -1
  279. package/examples/extensions/subagent/README.md +13 -11
  280. package/examples/extensions/todo.ts +2 -1
  281. package/examples/extensions/with-deps/package-lock.json +2 -2
  282. package/examples/extensions/with-deps/package.json +1 -1
  283. package/examples/sdk/README.md +9 -5
  284. package/package.json +6 -7
  285. package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
  286. package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
  287. package/dist/builtin-extensions/lunr-behavior.js +0 -213
  288. package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
  289. package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
  290. package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
  291. package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
  292. package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
  293. package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
  294. package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
  295. package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
  296. package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
  297. package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
  298. package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
  299. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
  300. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
  301. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
  302. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
  303. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
  304. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
  305. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
  306. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
  307. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
  308. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
  309. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
  310. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
  311. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
  312. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
  313. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
  314. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
  315. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
  316. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
  317. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
  318. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
  319. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
  320. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
  321. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
  322. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
  323. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
  324. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
  325. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
  326. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
  327. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
  328. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
  329. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
  330. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
  331. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
  332. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
  333. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
  334. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
  335. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
  336. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
  337. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
  338. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
  339. package/dist/core/behavior-preset.d.ts +0 -60
  340. package/dist/core/behavior-preset.d.ts.map +0 -1
  341. package/dist/core/behavior-preset.js +0 -257
  342. package/dist/core/behavior-preset.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-management.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/agents/agent-management.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAiCxE,OAAO,KAAK,EAAmB,OAAO,EAAE,eAAe,EAAoB,MAAM,oBAAoB,CAAC;AAKtG,KAAK,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,eAAe,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC;AAE3I,UAAU,gBAAgB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AA+kBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,CA0BrG;AAiHD,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,CA2DvG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,CA2GvG;AAwJD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,CAcjI","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport {\n\ttype AgentConfig,\n\ttype AgentScope,\n\ttype AgentSource,\n\ttype ChainConfig,\n\ttype ChainStepConfig,\n\tBUILTIN_AGENT_NAMES,\n\tdefaultInheritProjectContext,\n\tdefaultInheritSkills,\n\tdefaultSystemPromptMode,\n\tdiscoverAgentsAll,\n\tbuildRuntimeName,\n\tfrontmatterNameForConfig,\n\tparsePackageName,\n\tmergeBuiltinAgentOverride,\n\tremoveBuiltinAgentOverride,\n\tremoveBuiltinAgentOverrideFields,\n} from \"./agents.ts\";\nimport { serializeAgent } from \"./agent-serializer.ts\";\nimport { advertisedDefaultContext } from \"../shared/lunr-child-context.ts\";\nimport { mergeAgentsForScope } from \"./agent-selection.ts\";\nimport { serializeChain, serializeJsonChain } from \"./chain-serializer.ts\";\nimport { discoverAvailableSkills, resolveSkills } from \"./skills.ts\";\nimport {\n\tbuildProactiveSkillSubagentRecommendationLines,\n} from \"./proactive-skills.ts\";\nimport { parseFrontmatter } from \"./frontmatter.ts\";\nimport { toModelInfo } from \"../shared/model-info.ts\";\nimport { resolveSubagentModelOverride, type ParentModel } from \"../runs/shared/model-fallback.ts\";\nimport { validateToolBudgetConfig } from \"../runs/shared/tool-budget.ts\";\nimport { resolveTurnBudgetConfig } from \"../runs/shared/turn-budget.ts\";\nimport { validateAcceptanceInput } from \"../runs/shared/acceptance.ts\";\nimport type { AcceptanceInput, Details, ExtensionConfig, ToolBudgetConfig } from \"../shared/types.ts\";\nimport { getProjectConfigDir } from \"../shared/utils.ts\";\n\ntype ManagementAction = \"list\" | \"get\" | \"models\" | \"create\" | \"update\" | \"delete\" | \"eject\" | \"disable\" | \"enable\" | \"reset\";\ntype ManagementScope = \"user\" | \"project\";\ntype ManagementContext = Pick<ExtensionContext, \"cwd\" | \"modelRegistry\"> & { model?: ExtensionContext[\"model\"]; config?: ExtensionConfig };\n\ninterface ManagementParams {\n\taction?: string;\n\tagent?: string;\n\tchainName?: string;\n\tagentScope?: string;\n\tconfig?: unknown;\n}\n\nfunction result(text: string, isError = false): AgentToolResult<Details> {\n\treturn { content: [{ type: \"text\", text }], isError, details: { mode: \"management\", results: [] } };\n}\n\nfunction parseCsv(value: string): string[] {\n\treturn [...new Set(value.split(\",\").map((v) => v.trim()).filter(Boolean))];\n}\n\nfunction configObject(config: unknown): { value?: Record<string, unknown>; error?: string } {\n\tlet val = config;\n\tif (typeof val === \"string\") {\n\t\ttry {\n\t\t\tval = JSON.parse(val);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\treturn { error: `config must be valid JSON: ${message}` };\n\t\t}\n\t}\n\tif (!val || typeof val !== \"object\" || Array.isArray(val)) return {};\n\treturn { value: val as Record<string, unknown> };\n}\n\nfunction hasKey(obj: Record<string, unknown>, key: string): boolean {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction asDisambiguationScope(scope: unknown): ManagementScope | undefined {\n\tif (scope === \"user\" || scope === \"project\") return scope;\n\treturn undefined;\n}\n\nfunction actionScope(scope: unknown, action: ManagementAction): { scope?: ManagementScope; error?: AgentToolResult<Details> } {\n\tif (scope === undefined) return { scope: \"user\" };\n\tconst parsed = asDisambiguationScope(scope);\n\treturn parsed ? { scope: parsed } : { error: result(`agentScope must be 'user' or 'project' for ${action}.`, true) };\n}\n\nfunction normalizeListScope(scope: unknown): AgentScope | undefined {\n\tif (scope === undefined) return \"both\";\n\tif (scope === \"user\" || scope === \"project\" || scope === \"both\") return scope;\n\treturn undefined;\n}\n\nfunction sanitizeName(name: string): string {\n\treturn name.toLowerCase().trim().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\").replace(/-+/g, \"-\").replace(/^-+|-+$/g, \"\");\n}\n\nfunction parsePackageConfig(value: unknown): { packageName?: string; error?: string } {\n\treturn parsePackageName(value, \"config.package\");\n}\n\nfunction allAgents(d: { builtin: AgentConfig[]; package: AgentConfig[]; user: AgentConfig[]; project: AgentConfig[] }): AgentConfig[] {\n\treturn [...d.builtin, ...d.package, ...d.user, ...d.project];\n}\n\nfunction availableNames(cwd: string, kind: \"agent\" | \"chain\"): string[] {\n\tconst d = discoverAgentsAll(cwd);\n\tconst items = kind === \"agent\" ? allAgents(d) : d.chains;\n\treturn [...new Set(items.map((x) => x.name))].sort((a, b) => a.localeCompare(b));\n}\n\nfunction findAgents(name: string, cwd: string, scope: AgentScope = \"both\"): AgentConfig[] {\n\tconst d = discoverAgentsAll(cwd);\n\tconst raw = name.trim();\n\tconst sanitized = sanitizeName(raw);\n\treturn allAgents(d)\n\t\t.filter((a) => (scope === \"both\" || a.source === scope) && (a.name === raw || a.name === sanitized))\n\t\t.sort((a, b) => a.source.localeCompare(b.source));\n}\n\nfunction findChains(name: string, cwd: string, scope: AgentScope = \"both\"): ChainConfig[] {\n\tconst raw = name.trim();\n\tconst sanitized = sanitizeName(raw);\n\treturn discoverAgentsAll(cwd).chains\n\t\t.filter((c) => (scope === \"both\" || c.source === scope) && (c.name === raw || c.name === sanitized))\n\t\t.sort((a, b) => a.source.localeCompare(b.source));\n}\n\nconst AGENT_SOURCE_PRECEDENCE: Record<AgentSource, number> = { builtin: 0, package: 1, user: 2, project: 3 };\n\n// Returns the highest-precedence agent for a name (project > user > package > builtin,\n// matching mergeAgentsForScope for \"both\"), including disabled agents so disable/enable/reset\n// can locate agents that runtime discovery filters out.\nfunction pickEffectiveAgent(d: ReturnType<typeof discoverAgentsAll>, name: string): AgentConfig | undefined {\n\tconst raw = name.trim();\n\tconst sanitized = sanitizeName(raw);\n\tconst matches = allAgents(d).filter((a) => a.name === raw || a.name === sanitized);\n\tif (matches.length === 0) return undefined;\n\treturn matches.reduce((best, agent) => (AGENT_SOURCE_PRECEDENCE[agent.source] > AGENT_SOURCE_PRECEDENCE[best.source] ? agent : best));\n}\n\nfunction nameExistsInScope(cwd: string, scope: ManagementScope, name: string, excludePath?: string): boolean {\n\tconst d = discoverAgentsAll(cwd);\n\tfor (const a of scope === \"user\" ? d.user : d.project) {\n\t\tif (a.name === name && a.filePath !== excludePath) return true;\n\t}\n\tfor (const c of d.chains) {\n\t\tif (c.source === scope && c.name === name && c.filePath !== excludePath) return true;\n\t}\n\treturn false;\n}\n\nfunction isMutableSource(source: AgentSource): source is ManagementScope {\n\treturn source === \"user\" || source === \"project\";\n}\n\nfunction unknownChainAgents(cwd: string, steps: ChainStepConfig[]): string[] {\n\tconst d = discoverAgentsAll(cwd);\n\tconst known = new Set(allAgents(d).map((a) => a.name));\n\treturn [...new Set(steps.map((s) => s.agent).filter((a) => !known.has(a)))].sort((a, b) => a.localeCompare(b));\n}\n\nfunction chainStepWarnings(ctx: ManagementContext, steps: ChainStepConfig[]): string[] {\n\tconst warnings: string[] = [];\n\tconst available = new Set(discoverAvailableSkills(ctx.cwd).map((s) => s.name));\n\tfor (let i = 0; i < steps.length; i++) {\n\t\tconst s = steps[i]!;\n\t\tif (s.model) {\n\t\t\tconst found = ctx.modelRegistry.getAvailable().some((m) => `${m.provider}/${m.id}` === s.model || m.id === s.model);\n\t\t\tif (!found) warnings.push(`Warning: step ${i + 1} (${s.agent}): model '${s.model}' is not in the current model registry.`);\n\t\t}\n\t\tif (Array.isArray(s.skills) && s.skills.length > 0) {\n\t\t\tconst missing = s.skills.filter((sk) => !available.has(sk));\n\t\t\tif (missing.length) warnings.push(`Warning: step ${i + 1} (${s.agent}): skills not found: ${missing.join(\", \")}.`);\n\t\t}\n\t}\n\treturn warnings;\n}\n\nfunction modelWarning(ctx: ManagementContext, model: string | undefined): string | undefined {\n\tif (!model) return undefined;\n\tconst found = ctx.modelRegistry.getAvailable().some((m) => `${m.provider}/${m.id}` === model || m.id === model);\n\treturn found ? undefined : `Warning: model '${model}' is not in the current model registry.`;\n}\n\nfunction fallbackModelsWarning(ctx: ManagementContext, fallbackModels: string[] | undefined): string | undefined {\n\tif (!fallbackModels || fallbackModels.length === 0) return undefined;\n\tconst available = new Set(ctx.modelRegistry.getAvailable().flatMap((m) => [`${m.provider}/${m.id}`, m.id]));\n\tconst missing = fallbackModels.filter((model) => !available.has(model));\n\treturn missing.length ? `Warning: fallback models not in the current model registry: ${missing.join(\", \")}.` : undefined;\n}\n\nfunction skillsWarning(cwd: string, agent: Pick<AgentConfig, \"skills\" | \"skillPath\" | \"filePath\">): string | undefined {\n\tif (!agent.skills?.length) return undefined;\n\tconst { missing } = resolveSkills(\n\t\tagent.skills,\n\t\tcwd,\n\t\tagent.skillPath,\n\t\tagent.filePath ? path.dirname(agent.filePath) : cwd,\n\t);\n\treturn missing.length ? `Warning: skills not found: ${missing.join(\", \")}.` : undefined;\n}\n\nfunction editableAgentConfig(agent: AgentConfig): AgentConfig {\n\tconst base = agent.override?.base;\n\tif (!base) return { ...agent };\n\n\treturn {\n\t\t...agent,\n\t\tmodel: base.model,\n\t\tfallbackModels: base.fallbackModels ? [...base.fallbackModels] : undefined,\n\t\tthinking: base.thinking,\n\t\tsystemPromptMode: base.systemPromptMode,\n\t\tinheritProjectContext: base.inheritProjectContext,\n\t\tinheritSkills: base.inheritSkills,\n\t\tdefaultContext: base.defaultContext,\n\t\tacceptanceRole: base.acceptanceRole,\n\t\tdisabled: base.disabled,\n\t\tsystemPrompt: base.systemPrompt,\n\t\tskills: base.skills ? [...base.skills] : undefined,\n\t\tskillPath: base.skillPath ? [...base.skillPath] : undefined,\n\t\ttools: base.tools ? [...base.tools] : undefined,\n\t\tmcpDirectTools: base.mcpDirectTools ? [...base.mcpDirectTools] : undefined,\n\t\tsubagentOnlyExtensions: base.subagentOnlyExtensions ? [...base.subagentOnlyExtensions] : undefined,\n\t\tcompletionGuard: base.completionGuard,\n\t\toverride: undefined,\n\t};\n}\n\nfunction readAgentFrontmatterFields(filePath: string): Set<string> {\n\ttry {\n\t\tconst { frontmatter } = parseFrontmatter(fs.readFileSync(filePath, \"utf-8\"));\n\t\treturn new Set(Object.keys(frontmatter));\n\t} catch {\n\t\treturn new Set();\n\t}\n}\n\nfunction preservedAgentFrontmatterFields(agent: AgentConfig, cfg: Record<string, unknown>): Set<string> {\n\tconst fields = readAgentFrontmatterFields(agent.filePath);\n\tconst changed = (...names: string[]) => {\n\t\tfor (const name of names) fields.delete(name);\n\t};\n\n\tif (hasKey(cfg, \"name\")) changed(\"name\");\n\tif (hasKey(cfg, \"package\")) changed(\"package\");\n\tif (hasKey(cfg, \"description\")) changed(\"description\");\n\tif (hasKey(cfg, \"systemPrompt\")) changed(\"systemPrompt\");\n\tif (hasKey(cfg, \"model\")) changed(\"model\");\n\tif (hasKey(cfg, \"fallbackModels\")) changed(\"fallbackModels\");\n\tif (hasKey(cfg, \"tools\")) changed(\"tools\");\n\tif (hasKey(cfg, \"skills\")) changed(\"skill\", \"skills\");\n\tif (hasKey(cfg, \"skillPath\")) changed(\"skillPath\");\n\tif (hasKey(cfg, \"extensions\")) changed(\"extensions\");\n\tif (hasKey(cfg, \"subagentOnlyExtensions\")) changed(\"subagentOnlyExtensions\");\n\tif (hasKey(cfg, \"thinking\")) {\n\t\tchanged(\"thinking\");\n\t\tif (cfg.thinking === \"off\") fields.add(\"thinking\");\n\t}\n\tif (hasKey(cfg, \"systemPromptMode\")) {\n\t\tchanged(\"systemPromptMode\");\n\t\tfields.add(\"systemPromptMode\");\n\t}\n\tif (hasKey(cfg, \"inheritProjectContext\")) {\n\t\tchanged(\"inheritProjectContext\");\n\t\tfields.add(\"inheritProjectContext\");\n\t}\n\tif (hasKey(cfg, \"inheritSkills\")) {\n\t\tchanged(\"inheritSkills\");\n\t\tfields.add(\"inheritSkills\");\n\t}\n\tif (hasKey(cfg, \"defaultContext\")) changed(\"defaultContext\");\n\tif (hasKey(cfg, \"async\")) changed(\"async\");\n\tif (hasKey(cfg, \"timeoutMs\")) changed(\"timeoutMs\");\n\tif (hasKey(cfg, \"turnBudget\")) changed(\"turnBudget\");\n\tif (hasKey(cfg, \"acceptance\")) changed(\"acceptance\");\n\tif (hasKey(cfg, \"acceptanceRole\")) changed(\"acceptanceRole\");\n\tif (hasKey(cfg, \"output\")) changed(\"output\");\n\tif (hasKey(cfg, \"reads\")) changed(\"defaultReads\");\n\tif (hasKey(cfg, \"progress\")) changed(\"defaultProgress\");\n\tif (hasKey(cfg, \"maxSubagentDepth\")) changed(\"maxSubagentDepth\");\n\tif (hasKey(cfg, \"completionGuard\")) {\n\t\tchanged(\"completionGuard\");\n\t\tif (cfg.completionGuard === true) fields.add(\"completionGuard\");\n\t}\n\tif (hasKey(cfg, \"toolBudget\")) changed(\"toolBudget\");\n\n\treturn fields;\n}\n\nfunction parseStepList(raw: unknown): { steps?: ChainStepConfig[]; error?: string } {\n\tif (!Array.isArray(raw)) return { error: \"config.steps must be an array.\" };\n\tif (raw.length === 0) return { error: \"config.steps must include at least one step.\" };\n\tconst steps: ChainStepConfig[] = [];\n\tfor (let i = 0; i < raw.length; i++) {\n\t\tconst item = raw[i];\n\t\tif (!item || typeof item !== \"object\" || Array.isArray(item)) return { error: `config.steps[${i}] must be an object.` };\n\t\tconst s = item as Record<string, unknown>;\n\t\tif (typeof s.agent !== \"string\" || !s.agent.trim()) return { error: `config.steps[${i}].agent must be a non-empty string.` };\n\t\tconst step: ChainStepConfig = { agent: s.agent.trim(), task: typeof s.task === \"string\" ? s.task : \"\" };\n\t\tif (hasKey(s, \"phase\")) {\n\t\t\tif (typeof s.phase === \"string\") step.phase = s.phase;\n\t\t\telse return { error: `config.steps[${i}].phase must be a string.` };\n\t\t}\n\t\tif (hasKey(s, \"label\")) {\n\t\t\tif (typeof s.label === \"string\") step.label = s.label;\n\t\t\telse return { error: `config.steps[${i}].label must be a string.` };\n\t\t}\n\t\tif (hasKey(s, \"as\")) {\n\t\t\tif (typeof s.as === \"string\") step.as = s.as;\n\t\t\telse return { error: `config.steps[${i}].as must be a string.` };\n\t\t}\n\t\tif (hasKey(s, \"outputSchema\")) {\n\t\t\tif (typeof s.outputSchema === \"string\") step.outputSchema = s.outputSchema;\n\t\t\telse return { error: `config.steps[${i}].outputSchema must be a schema file path string for saved chains.` };\n\t\t}\n\t\tif (hasKey(s, \"output\")) {\n\t\t\tif (s.output === false) step.output = false;\n\t\t\telse if (typeof s.output === \"string\") step.output = s.output;\n\t\t\telse return { error: `config.steps[${i}].output must be a string or false.` };\n\t\t}\n\t\tif (hasKey(s, \"outputMode\")) {\n\t\t\tif (s.outputMode === \"inline\" || s.outputMode === \"file-only\") step.outputMode = s.outputMode;\n\t\t\telse return { error: `config.steps[${i}].outputMode must be 'inline' or 'file-only'.` };\n\t\t}\n\t\tif (hasKey(s, \"reads\")) {\n\t\t\tif (s.reads === false) step.reads = false;\n\t\t\telse if (Array.isArray(s.reads)) step.reads = s.reads.filter((v): v is string => typeof v === \"string\").map((v) => v.trim()).filter(Boolean);\n\t\t\telse return { error: `config.steps[${i}].reads must be an array or false.` };\n\t\t}\n\t\tif (hasKey(s, \"model\")) {\n\t\t\tif (typeof s.model === \"string\") step.model = s.model;\n\t\t\telse return { error: `config.steps[${i}].model must be a string.` };\n\t\t}\n\t\tif (hasKey(s, \"skills\")) {\n\t\t\tif (s.skills === false) step.skills = false;\n\t\t\telse if (Array.isArray(s.skills)) step.skills = s.skills.filter((v): v is string => typeof v === \"string\").map((v) => v.trim()).filter(Boolean);\n\t\t\telse return { error: `config.steps[${i}].skills must be an array or false.` };\n\t\t}\n\t\tif (hasKey(s, \"progress\")) {\n\t\t\tif (typeof s.progress === \"boolean\") step.progress = s.progress;\n\t\t\telse return { error: `config.steps[${i}].progress must be a boolean.` };\n\t\t}\n\t\tif (hasKey(s, \"toolBudget\")) {\n\t\t\tconst validation = validateToolBudgetConfig(s.toolBudget, `config.steps[${i}].toolBudget`);\n\t\t\tif (validation.error) return { error: validation.error };\n\t\t\tstep.toolBudget = s.toolBudget as ChainStepConfig[\"toolBudget\"];\n\t\t}\n\t\tsteps.push(step);\n\t}\n\treturn { steps };\n}\n\nfunction parseTools(raw: string): { tools?: string[]; mcpDirectTools?: string[] } {\n\tconst tools: string[] = [];\n\tconst mcpDirectTools: string[] = [];\n\tfor (const item of parseCsv(raw)) {\n\t\tif (item.startsWith(\"mcp:\")) {\n\t\t\tconst direct = item.slice(4).trim();\n\t\t\tif (direct) mcpDirectTools.push(direct);\n\t\t} else tools.push(item);\n\t}\n\treturn { tools: tools.length ? tools : undefined, mcpDirectTools: mcpDirectTools.length ? mcpDirectTools : undefined };\n}\n\nfunction applyAgentConfig(target: AgentConfig, cfg: Record<string, unknown>): string | undefined {\n\tif (hasKey(cfg, \"systemPrompt\")) {\n\t\tif (cfg.systemPrompt === false || cfg.systemPrompt === \"\") target.systemPrompt = \"\";\n\t\telse if (typeof cfg.systemPrompt === \"string\") target.systemPrompt = cfg.systemPrompt;\n\t\telse return \"config.systemPrompt must be a string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"model\")) {\n\t\tif (cfg.model === false || cfg.model === \"\") target.model = undefined;\n\t\telse if (typeof cfg.model === \"string\") target.model = cfg.model.trim() || undefined;\n\t\telse return \"config.model must be a string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"fallbackModels\")) {\n\t\tif (cfg.fallbackModels === false || cfg.fallbackModels === \"\") target.fallbackModels = undefined;\n\t\telse if (typeof cfg.fallbackModels === \"string\") {\n\t\t\tconst models = parseCsv(cfg.fallbackModels);\n\t\t\ttarget.fallbackModels = models.length ? models : undefined;\n\t\t} else if (Array.isArray(cfg.fallbackModels)) {\n\t\t\tconst models = cfg.fallbackModels\n\t\t\t\t.filter((value): value is string => typeof value === \"string\")\n\t\t\t\t.map((value) => value.trim())\n\t\t\t\t.filter(Boolean);\n\t\t\ttarget.fallbackModels = models.length ? [...new Set(models)] : undefined;\n\t\t} else return \"config.fallbackModels must be a comma-separated string, string array, or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"tools\")) {\n\t\tif (cfg.tools === false || cfg.tools === \"\") { target.tools = undefined; target.mcpDirectTools = undefined; }\n\t\telse if (typeof cfg.tools === \"string\") { const parsed = parseTools(cfg.tools); target.tools = parsed.tools; target.mcpDirectTools = parsed.mcpDirectTools; }\n\t\telse return \"config.tools must be a comma-separated string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"skills\")) {\n\t\tif (cfg.skills === false || cfg.skills === \"\") target.skills = undefined;\n\t\telse if (typeof cfg.skills === \"string\") { const skills = parseCsv(cfg.skills); target.skills = skills.length ? skills : undefined; }\n\t\telse return \"config.skills must be a comma-separated string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"skillPath\")) {\n\t\tif (cfg.skillPath === false || cfg.skillPath === \"\") target.skillPath = undefined;\n\t\telse if (typeof cfg.skillPath === \"string\") { const skillPath = parseCsv(cfg.skillPath); target.skillPath = skillPath.length ? skillPath : undefined; }\n\t\telse if (Array.isArray(cfg.skillPath) && cfg.skillPath.every((entry) => typeof entry === \"string\")) {\n\t\t\tconst skillPath = [...new Set(cfg.skillPath.map((entry) => entry.trim()).filter(Boolean))];\n\t\t\ttarget.skillPath = skillPath.length ? skillPath : undefined;\n\t\t} else return \"config.skillPath must be a comma-separated string, string array, or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"extensions\")) {\n\t\tif (cfg.extensions === false) target.extensions = undefined;\n\t\telse if (cfg.extensions === \"\") target.extensions = [];\n\t\telse if (typeof cfg.extensions === \"string\") target.extensions = parseCsv(cfg.extensions);\n\t\telse return \"config.extensions must be a comma-separated string, empty string, or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"subagentOnlyExtensions\")) {\n\t\tif (cfg.subagentOnlyExtensions === false) target.subagentOnlyExtensions = undefined;\n\t\telse if (cfg.subagentOnlyExtensions === \"\") target.subagentOnlyExtensions = [];\n\t\telse if (typeof cfg.subagentOnlyExtensions === \"string\") target.subagentOnlyExtensions = parseCsv(cfg.subagentOnlyExtensions);\n\t\telse return \"config.subagentOnlyExtensions must be a comma-separated string, empty string, or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"thinking\")) {\n\t\tif (cfg.thinking === false || cfg.thinking === \"\") target.thinking = undefined;\n\t\telse if (typeof cfg.thinking === \"string\") target.thinking = cfg.thinking.trim() || undefined;\n\t\telse return \"config.thinking must be a string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"systemPromptMode\")) {\n\t\tif (cfg.systemPromptMode === \"append\" || cfg.systemPromptMode === \"replace\") target.systemPromptMode = cfg.systemPromptMode;\n\t\telse return \"config.systemPromptMode must be 'append' or 'replace' when provided.\";\n\t}\n\tif (hasKey(cfg, \"inheritProjectContext\")) {\n\t\tif (typeof cfg.inheritProjectContext !== \"boolean\") return \"config.inheritProjectContext must be a boolean when provided.\";\n\t\ttarget.inheritProjectContext = cfg.inheritProjectContext;\n\t}\n\tif (hasKey(cfg, \"inheritSkills\")) {\n\t\tif (typeof cfg.inheritSkills !== \"boolean\") return \"config.inheritSkills must be a boolean when provided.\";\n\t\ttarget.inheritSkills = cfg.inheritSkills;\n\t}\n\tif (hasKey(cfg, \"defaultContext\")) {\n\t\tif (cfg.defaultContext === false || cfg.defaultContext === \"\") target.defaultContext = undefined;\n\t\telse if (cfg.defaultContext === \"fresh\" || cfg.defaultContext === \"fork\") target.defaultContext = cfg.defaultContext;\n\t\telse return \"config.defaultContext must be 'fresh', 'fork', or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"async\")) {\n\t\tif (cfg.async === \"\") target.defaultAsync = undefined;\n\t\telse if (typeof cfg.async === \"boolean\") target.defaultAsync = cfg.async;\n\t\telse return \"config.async must be a boolean or empty string when provided.\";\n\t}\n\tif (hasKey(cfg, \"timeoutMs\")) {\n\t\tif (cfg.timeoutMs === false || cfg.timeoutMs === \"\") target.defaultTimeoutMs = undefined;\n\t\telse if (typeof cfg.timeoutMs === \"number\" && Number.isInteger(cfg.timeoutMs) && cfg.timeoutMs > 0) target.defaultTimeoutMs = cfg.timeoutMs;\n\t\telse return \"config.timeoutMs must be a positive integer or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"turnBudget\")) {\n\t\tif (cfg.turnBudget === false || cfg.turnBudget === \"\") target.defaultTurnBudget = undefined;\n\t\telse {\n\t\t\tconst resolved = resolveTurnBudgetConfig(cfg.turnBudget, \"config.turnBudget\");\n\t\t\tif (resolved.error) return resolved.error;\n\t\t\ttarget.defaultTurnBudget = resolved.turnBudget;\n\t\t}\n\t}\n\tif (hasKey(cfg, \"acceptance\")) {\n\t\tif (cfg.acceptance === \"\") target.defaultAcceptance = undefined;\n\t\telse {\n\t\t\tconst errors = validateAcceptanceInput(cfg.acceptance, \"config.acceptance\");\n\t\t\tif (errors.length > 0) return errors.join(\" \");\n\t\t\ttarget.defaultAcceptance = cfg.acceptance as AcceptanceInput;\n\t\t}\n\t}\n\tif (hasKey(cfg, \"acceptanceRole\")) {\n\t\tif (cfg.acceptanceRole === false || cfg.acceptanceRole === \"\") target.acceptanceRole = undefined;\n\t\telse if (cfg.acceptanceRole === \"read-only\" || cfg.acceptanceRole === \"writer\") target.acceptanceRole = cfg.acceptanceRole;\n\t\telse return \"config.acceptanceRole must be 'read-only', 'writer', or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"output\")) {\n\t\tif (cfg.output === false || cfg.output === \"\") target.output = undefined;\n\t\telse if (typeof cfg.output === \"string\") target.output = cfg.output;\n\t\telse return \"config.output must be a string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"reads\")) {\n\t\tif (cfg.reads === false || cfg.reads === \"\") target.defaultReads = undefined;\n\t\telse if (typeof cfg.reads === \"string\") {\n\t\t\tconst reads = parseCsv(cfg.reads);\n\t\t\ttarget.defaultReads = reads.length ? reads : undefined;\n\t\t} else return \"config.reads must be a comma-separated string or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"progress\")) {\n\t\tif (typeof cfg.progress !== \"boolean\") return \"config.progress must be a boolean when provided.\";\n\t\ttarget.defaultProgress = cfg.progress;\n\t}\n\tif (hasKey(cfg, \"maxSubagentDepth\")) {\n\t\tif (cfg.maxSubagentDepth === false || cfg.maxSubagentDepth === \"\") target.maxSubagentDepth = undefined;\n\t\telse if (typeof cfg.maxSubagentDepth === \"number\" && Number.isInteger(cfg.maxSubagentDepth) && cfg.maxSubagentDepth >= 0) {\n\t\t\ttarget.maxSubagentDepth = cfg.maxSubagentDepth;\n\t\t} else return \"config.maxSubagentDepth must be an integer >= 0 or false when provided.\";\n\t}\n\tif (hasKey(cfg, \"completionGuard\")) {\n\t\tif (typeof cfg.completionGuard !== \"boolean\") return \"config.completionGuard must be a boolean when provided.\";\n\t\ttarget.completionGuard = cfg.completionGuard;\n\t}\n\tif (hasKey(cfg, \"toolBudget\")) {\n\t\tif (cfg.toolBudget === false || cfg.toolBudget === \"\") target.toolBudget = undefined;\n\t\telse {\n\t\t\tconst validation = validateToolBudgetConfig(cfg.toolBudget, \"config.toolBudget\");\n\t\t\tif (validation.error) return validation.error;\n\t\t\ttarget.toolBudget = cfg.toolBudget as ToolBudgetConfig;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction resolveTarget<T extends { source: AgentSource; filePath: string }>(\n\tkind: \"agent\" | \"chain\",\n\tname: string,\n\tmatches: T[],\n\tcwd: string,\n\tscopeHint?: string,\n): T | AgentToolResult<Details> {\n\tconst mutable = matches.filter((m): m is T & { source: ManagementScope } => isMutableSource(m.source));\n\tif (mutable.length === 0) {\n\t\tif (matches.length > 0) {\n\t\t\treturn result(`${kind === \"agent\" ? \"Agent\" : \"Chain\"} '${name}' is read-only and cannot be modified. Create a same-named ${kind} in user or project scope to override it.`, true);\n\t\t}\n\t\tconst available = availableNames(cwd, kind);\n\t\treturn result(`${kind === \"agent\" ? \"Agent\" : \"Chain\"} '${name}' not found. Available: ${available.join(\", \") || \"none\"}.`, true);\n\t}\n\tif (mutable.length === 1) return mutable[0]!;\n\tconst scope = asDisambiguationScope(scopeHint);\n\tif (!scope) {\n\t\tconst paths = mutable.map((m) => `${m.source}: ${m.filePath}`).join(\"\\n\");\n\t\treturn result(`${kind === \"agent\" ? \"Agent\" : \"Chain\"} '${name}' exists in both scopes. Specify agentScope: 'user' or 'project'.\\n${paths}`, true);\n\t}\n\tconst scoped = mutable.filter((m) => m.source === scope);\n\tif (scoped.length === 0) return result(`${kind === \"agent\" ? \"Agent\" : \"Chain\"} '${name}' not found in scope '${scope}'.`, true);\n\tif (scoped.length > 1) return result(`Multiple ${kind}s named '${name}' found in scope '${scope}': ${scoped.map((m) => m.filePath).join(\", \")}`, true);\n\treturn scoped[0]!;\n}\n\nfunction renamePath(\n\tkind: \"agent\" | \"chain\",\n\tcurrentPath: string,\n\tnewName: string,\n\tscope: ManagementScope,\n\tcwd: string,\n): { filePath?: string; error?: string } {\n\tif (nameExistsInScope(cwd, scope, newName, currentPath)) return { error: `Name '${newName}' already exists in ${scope} scope.` };\n\tconst ext = kind === \"agent\" ? \".md\" : currentPath.endsWith(\".chain.json\") ? \".chain.json\" : \".chain.md\";\n\tconst filePath = path.join(path.dirname(currentPath), `${newName}${ext}`);\n\tif (fs.existsSync(filePath) && filePath !== currentPath) {\n\t\treturn { error: `File already exists at ${filePath} but is not a valid ${kind} definition. Remove or rename it first.` };\n\t}\n\tfs.renameSync(currentPath, filePath);\n\treturn { filePath };\n}\n\nfunction formatAgentDetail(agent: AgentConfig): string {\n\tconst tools = [...(agent.tools ?? []), ...(agent.mcpDirectTools ?? []).map((t) => `mcp:${t}`)];\n\tconst lines: string[] = [`Agent: ${agent.name} (${agent.source})`, `Path: ${agent.filePath}`, `Description: ${agent.description}`];\n\tif (agent.packageName) {\n\t\tlines.push(`Local name: ${frontmatterNameForConfig(agent)}`);\n\t\tlines.push(`Package: ${agent.packageName}`);\n\t}\n\tif (agent.model) lines.push(`Model: ${agent.model}`);\n\tif (agent.fallbackModels?.length) lines.push(`Fallback models: ${agent.fallbackModels.join(\", \")}`);\n\tif (tools.length) lines.push(`Tools: ${tools.join(\", \")}`);\n\tif (agent.skills?.length) lines.push(`Skills: ${agent.skills.join(\", \")}`);\n\tif (agent.skillPath?.length) lines.push(`Skill paths: ${agent.skillPath.join(\", \")}`);\n\tlines.push(`System prompt mode: ${agent.systemPromptMode}`);\n\tlines.push(`Inherit project context: ${agent.inheritProjectContext ? \"true\" : \"false\"}`);\n\tlines.push(`Inherit skills: ${agent.inheritSkills ? \"true\" : \"false\"}`);\n\tlines.push(`Default context: ${advertisedDefaultContext(agent.defaultContext)}`);\n\tif (agent.defaultAsync !== undefined) lines.push(`Async: ${agent.defaultAsync ? \"true\" : \"false\"}`);\n\tif (agent.defaultTimeoutMs !== undefined) lines.push(`Timeout: ${agent.defaultTimeoutMs}ms`);\n\tif (agent.defaultTurnBudget) lines.push(`Turn budget: ${JSON.stringify(agent.defaultTurnBudget)}`);\n\tif (agent.defaultAcceptance !== undefined) lines.push(`Acceptance: ${typeof agent.defaultAcceptance === \"object\" ? JSON.stringify(agent.defaultAcceptance) : String(agent.defaultAcceptance)}`);\n\tif (agent.acceptanceRole) lines.push(`Acceptance role: ${agent.acceptanceRole}`);\n\tif (agent.source === \"builtin\") lines.push(`Disabled: ${agent.disabled ? \"true\" : \"false\"}`);\n\tif (agent.extensions !== undefined) lines.push(`Extensions: ${agent.extensions.length ? agent.extensions.join(\", \") : \"(none)\"}`);\n\tif (agent.subagentOnlyExtensions !== undefined) lines.push(`Subagent-only extensions: ${agent.subagentOnlyExtensions.length ? agent.subagentOnlyExtensions.join(\", \") : \"(none)\"}`);\n\tif (agent.thinking) lines.push(`Thinking: ${agent.thinking}`);\n\tif (agent.output) lines.push(`Output: ${agent.output}`);\n\tif (agent.defaultReads?.length) lines.push(`Reads: ${agent.defaultReads.join(\", \")}`);\n\tif (agent.defaultProgress) lines.push(\"Progress: true\");\n\tif (agent.maxSubagentDepth !== undefined) lines.push(`Max subagent depth: ${agent.maxSubagentDepth}`);\n\tif (agent.completionGuard === false) lines.push(\"Completion guard: false\");\n\tif (agent.toolBudget) lines.push(`Tool budget: ${JSON.stringify(agent.toolBudget)}`);\n\tif (agent.memory) lines.push(`Memory: ${agent.memory.scope} scope, path: ${agent.memory.path}`);\n\tif (agent.systemPrompt.trim()) lines.push(\"\", \"System Prompt:\", agent.systemPrompt);\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatChainStepDetail(step: ChainStepConfig, index: number): string[] {\n\tconst lines: string[] = [];\n\tif (step.expand || step.collect) {\n\t\tconst parallel = step.parallel && !Array.isArray(step.parallel) && typeof step.parallel === \"object\" ? step.parallel as { agent?: unknown; task?: unknown; label?: unknown; outputSchema?: unknown } : undefined;\n\t\tconst expand = step.expand && typeof step.expand === \"object\" ? step.expand as { from?: { output?: unknown; path?: unknown }; item?: unknown; key?: unknown; maxItems?: unknown; onEmpty?: unknown } : undefined;\n\t\tconst collect = step.collect && typeof step.collect === \"object\" ? step.collect as { as?: unknown; outputSchema?: unknown } : undefined;\n\t\tlines.push(`${index + 1}. Dynamic fanout${typeof collect?.as === \"string\" ? ` -> ${collect.as}` : \"\"}`);\n\t\tif (expand?.from) lines.push(` Expand: ${String(expand.from.output ?? \"?\")}${String(expand.from.path ?? \"\")}`);\n\t\tif (typeof expand?.item === \"string\") lines.push(` Item variable: ${expand.item}`);\n\t\tif (typeof expand?.key === \"string\") lines.push(` Key: ${expand.key}`);\n\t\tif (typeof expand?.maxItems === \"number\") lines.push(` Max items: ${expand.maxItems}`);\n\t\tif (typeof expand?.onEmpty === \"string\") lines.push(` On empty: ${expand.onEmpty}`);\n\t\tif (parallel?.agent) lines.push(` Agent: ${String(parallel.agent)}`);\n\t\tif (typeof parallel?.label === \"string\") lines.push(` Label: ${parallel.label}`);\n\t\tif (typeof parallel?.task === \"string\" && parallel.task.trim()) lines.push(` Task: ${parallel.task}`);\n\t\tif (parallel?.outputSchema) lines.push(\" Structured output: true\");\n\t\tif (parallel && \"toolBudget\" in parallel) lines.push(` Tool budget: ${JSON.stringify((parallel as { toolBudget?: unknown }).toolBudget)}`);\n\t\tif (collect?.outputSchema) lines.push(\" Collect schema: true\");\n\t\tif (step.concurrency !== undefined) lines.push(` Concurrency: ${step.concurrency}`);\n\t\tif (step.failFast !== undefined) lines.push(` Fail fast: ${step.failFast ? \"true\" : \"false\"}`);\n\t\treturn lines;\n\t}\n\tlines.push(`${index + 1}. ${step.agent}`);\n\tif (step.task?.trim()) lines.push(` Task: ${step.task}`);\n\tif (step.output === false) lines.push(\" Output: false\");\n\telse if (step.output) lines.push(` Output: ${step.output}`);\n\tif (step.outputMode) lines.push(` Output mode: ${step.outputMode}`);\n\tif (step.toolBudget) lines.push(` Tool budget: ${JSON.stringify(step.toolBudget)}`);\n\tif (step.reads === false) lines.push(\" Reads: false\");\n\telse if (Array.isArray(step.reads) && step.reads.length > 0) lines.push(` Reads: ${step.reads.join(\", \")}`);\n\tif (step.model) lines.push(` Model: ${step.model}`);\n\tif (step.skills === false) lines.push(\" Skills: false\");\n\telse if (Array.isArray(step.skills) && step.skills.length > 0) lines.push(` Skills: ${step.skills.join(\", \")}`);\n\tif (step.progress !== undefined) lines.push(` Progress: ${step.progress ? \"true\" : \"false\"}`);\n\treturn lines;\n}\n\nfunction formatChainDetail(chain: ChainConfig): string {\n\tconst lines: string[] = [`Chain: ${chain.name} (${chain.source})`, `Path: ${chain.filePath}`, `Description: ${chain.description}`];\n\tif (chain.packageName) {\n\t\tlines.push(`Local name: ${frontmatterNameForConfig(chain)}`);\n\t\tlines.push(`Package: ${chain.packageName}`);\n\t}\n\tlines.push(\"\", \"Steps:\");\n\tfor (let i = 0; i < chain.steps.length; i++) {\n\t\tlines.push(...formatChainStepDetail(chain.steps[i]!, i));\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport function handleList(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tconst scope = normalizeListScope(params.agentScope) ?? \"both\";\n\tconst d = discoverAgentsAll(ctx.cwd);\n\tconst scopedAgents = mergeAgentsForScope(scope, d.user, d.project, d.builtin, d.package)\n\t\t.sort((a, b) => a.name.localeCompare(b.name));\n\tconst agents = scopedAgents.filter((a) => !a.disabled);\n\tconst chains = d.chains.filter((c) => scope === \"both\" || c.source === \"package\" || c.source === scope).sort((a, b) => a.name.localeCompare(b.name));\n\tconst diagnostics = d.chainDiagnostics.filter((entry) => scope === \"both\" || entry.source === scope);\n\tconst proactiveSuggestions = buildProactiveSkillSubagentRecommendationLines({\n\t\tagents,\n\t\tchains,\n\t\tconfig: ctx.config?.proactiveSkillSubagents,\n\t\tdiscoverAvailableSkills: () => discoverAvailableSkills(ctx.cwd),\n\t});\n\tconst lines = [\n\t\t\"Executable agents:\",\n\t\t...(agents.length\n\t\t\t? agents.map((a) => `- ${a.name} (${a.source}, context: ${advertisedDefaultContext(a.defaultContext)}): ${a.description}`)\n\t\t\t: [\"- (none)\"]),\n\t\t\"\",\n\t\t\"Chains:\",\n\t\t...(chains.length ? chains.map((c) => `- ${c.name} (${c.source}): ${c.description}`) : [\"- (none)\"]),\n\t\t...(proactiveSuggestions.length ? [\"\", ...proactiveSuggestions] : []),\n\t\t...(diagnostics.length ? [\"\", \"Chain diagnostics:\", ...diagnostics.map((entry) => `- ${entry.filePath}: ${entry.error}`)] : []),\n\t];\n\treturn result(lines.join(\"\\n\"));\n}\n\nfunction formatModelSource(agent: AgentConfig, currentModel: ParentModel | undefined): string {\n\tif (agent.override && agent.model !== agent.override.base.model) {\n\t\treturn `${agent.override.scope} override`;\n\t}\n\tif (agent.modelSource?.type === \"subagents.defaultModel\" && agent.model === agent.modelSource.model) {\n\t\treturn `${agent.modelSource.scope} defaultModel`;\n\t}\n\tif (agent.model) return \"builtin agent config\";\n\tif (currentModel) return \"inherits current session model\";\n\treturn \"inherit requested, but no current session model is available\";\n}\n\nfunction handleModels(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tconst requestedAgent = params.agent?.trim();\n\tif (requestedAgent && !(BUILTIN_AGENT_NAMES as readonly string[]).includes(requestedAgent)) {\n\t\treturn result(`Builtin agent '${requestedAgent}' not found. Available: ${BUILTIN_AGENT_NAMES.join(\", \")}.`, true);\n\t}\n\n\tconst discovered = discoverAgentsAll(ctx.cwd);\n\tconst builtinByName = new Map(discovered.builtin.map((agent) => [agent.name, agent]));\n\tconst availableModels = ctx.modelRegistry.getAvailable().map(toModelInfo);\n\tconst currentModel = ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined;\n\tconst preferredProvider = ctx.model?.provider;\n\tconst names = requestedAgent ? [requestedAgent] : [...BUILTIN_AGENT_NAMES];\n\n\tif (requestedAgent) {\n\t\tconst agent = builtinByName.get(requestedAgent);\n\t\tif (!agent) return result(`Builtin agent '${requestedAgent}' not found.`, true);\n\t\tconst resolvedModel = resolveSubagentModelOverride(agent.model, currentModel, availableModels, preferredProvider);\n\t\tconst lines = [\n\t\t\t\"Builtin subagent model\",\n\t\t\t\"\",\n\t\t\t`Agent: ${requestedAgent}`,\n\t\t\t\"Effective model:\",\n\t\t\t` ${resolvedModel ?? \"(unresolved)\"}`,\n\t\t\t`Source: ${formatModelSource(agent, currentModel)}`,\n\t\t];\n\t\tif (agent.override) {\n\t\t\tlines.push(\"Override file:\");\n\t\t\tlines.push(` ${agent.override.path}`);\n\t\t}\n\t\tif (agent.model && resolvedModel && agent.model !== resolvedModel) {\n\t\t\tlines.push(\"Requested model setting:\");\n\t\t\tlines.push(` ${agent.model}`);\n\t\t}\n\t\tif (agent.disabled) lines.push(\"Disabled: true\");\n\t\tlines.push(\"Current session model:\");\n\t\tlines.push(` ${currentModel ? `${currentModel.provider}/${currentModel.id}` : \"(unavailable)\"}`);\n\t\treturn result(lines.join(\"\\n\"));\n\t}\n\n\tconst lines = [\n\t\t\"Builtin subagent models\",\n\t\t\"\",\n\t\t\"Current session model:\",\n\t\t` ${currentModel ? `${currentModel.provider}/${currentModel.id}` : \"(unavailable)\"}`,\n\t\t\"\",\n\t];\n\n\tfor (const name of names) {\n\t\tconst agent = builtinByName.get(name);\n\t\tif (!agent) {\n\t\t\tlines.push(name);\n\t\t\tlines.push(\" model:\");\n\t\t\tlines.push(\" (builtin definition not found)\");\n\t\t\tlines.push(\" source: missing\");\n\t\t\tlines.push(\"\");\n\t\t\tcontinue;\n\t\t}\n\t\tconst resolvedModel = resolveSubagentModelOverride(agent.model, currentModel, availableModels, preferredProvider);\n\t\tconst source = `${formatModelSource(agent, currentModel)}${agent.disabled ? \"; disabled\" : \"\"}`;\n\t\tlines.push(name);\n\t\tlines.push(\" model:\");\n\t\tlines.push(` ${resolvedModel ?? \"(unresolved)\"}`);\n\t\tlines.push(` source: ${source}`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn result(lines.join(\"\\n\"));\n}\n\nfunction handleGet(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent && !params.chainName) return result(\"Specify 'agent' or 'chainName' for get.\", true);\n\tconst hasBoth = Boolean(params.agent && params.chainName);\n\tconst blocks: string[] = [];\n\tlet anyFound = false;\n\tif (params.agent) {\n\t\tconst matches = findAgents(params.agent, ctx.cwd, \"both\");\n\t\tif (!matches.length) {\n\t\t\tconst msg = `Agent '${params.agent}' not found. Available: ${availableNames(ctx.cwd, \"agent\").join(\", \") || \"none\"}.`;\n\t\t\tif (!hasBoth) return result(msg, true);\n\t\t\tblocks.push(msg);\n\t\t} else {\n\t\t\tanyFound = true;\n\t\t\tblocks.push(...matches.map(formatAgentDetail));\n\t\t}\n\t}\n\tif (params.chainName) {\n\t\tconst matches = findChains(params.chainName, ctx.cwd, \"both\");\n\t\tif (!matches.length) {\n\t\t\tconst msg = `Chain '${params.chainName}' not found. Available: ${availableNames(ctx.cwd, \"chain\").join(\", \") || \"none\"}.`;\n\t\t\tif (!hasBoth) return result(msg, true);\n\t\t\tblocks.push(msg);\n\t\t} else {\n\t\t\tanyFound = true;\n\t\t\tblocks.push(...matches.map(formatChainDetail));\n\t\t}\n\t}\n\treturn result(blocks.join(\"\\n\\n\"), !anyFound);\n}\n\nexport function handleCreate(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tconst parsedConfig = configObject(params.config);\n\tif (parsedConfig.error) return result(parsedConfig.error, true);\n\tconst cfg = parsedConfig.value;\n\tif (!cfg) return result(\"config required for create.\", true);\n\tif (typeof cfg.name !== \"string\" || !cfg.name.trim()) return result(\"config.name is required and must be a non-empty string.\", true);\n\tif (typeof cfg.description !== \"string\" || !cfg.description.trim()) return result(\"config.description is required and must be a non-empty string.\", true);\n\tconst name = sanitizeName(cfg.name);\n\tif (!name) return result(\"config.name is invalid after sanitization. Use letters, numbers, spaces, or hyphens.\", true);\n\tconst parsedPackage = parsePackageConfig(cfg.package);\n\tif (parsedPackage.error) return result(parsedPackage.error, true);\n\tconst runtimeName = buildRuntimeName(name, parsedPackage.packageName);\n\tconst scopeRaw = cfg.scope ?? \"user\";\n\tif (scopeRaw !== \"user\" && scopeRaw !== \"project\") return result(\"config.scope must be 'user' or 'project'.\", true);\n\tconst scope = scopeRaw as ManagementScope;\n\tconst isChain = hasKey(cfg, \"steps\");\n\tconst d = discoverAgentsAll(ctx.cwd);\n\tconst projectConfigDir = getProjectConfigDir(ctx.cwd);\n\tconst targetDir = isChain\n\t\t? scope === \"user\" ? d.userChainDir : d.projectChainDir ?? path.join(projectConfigDir, \"chains\")\n\t\t: scope === \"user\" ? d.userDir : d.projectDir ?? path.join(projectConfigDir, \"agents\");\n\tfs.mkdirSync(targetDir, { recursive: true });\n\tif (nameExistsInScope(ctx.cwd, scope, runtimeName)) return result(`Name '${runtimeName}' already exists in ${scope} scope. Use update instead.`, true);\n\tconst targetPath = path.join(targetDir, isChain ? `${runtimeName}.chain.md` : `${runtimeName}.md`);\n\tif (fs.existsSync(targetPath)) return result(`File already exists at ${targetPath} but is not a valid ${isChain ? \"chain\" : \"agent\"} definition. Remove or rename it first.`, true);\n\tconst warnings: string[] = [];\n\tif (!isChain && d.builtin.some((a) => a.name === runtimeName)) warnings.push(`Note: this shadows the builtin agent '${runtimeName}'.`);\n\tif (isChain) {\n\t\tconst parsed = parseStepList(cfg.steps);\n\t\tif (parsed.error) return result(parsed.error, true);\n\t\tconst chain: ChainConfig = { name: runtimeName, localName: name, packageName: parsedPackage.packageName, description: cfg.description.trim(), source: scope, filePath: targetPath, steps: parsed.steps! };\n\t\tfs.writeFileSync(targetPath, serializeChain(chain), \"utf-8\");\n\t\tconst missing = unknownChainAgents(ctx.cwd, chain.steps);\n\t\tif (missing.length) warnings.push(`Warning: chain steps reference unknown agents: ${missing.join(\", \")}.`);\n\t\twarnings.push(...chainStepWarnings(ctx, chain.steps));\n\t\treturn result([`Created chain '${runtimeName}' at ${targetPath}.`, ...warnings].join(\"\\n\"));\n\t}\n\tconst agent: AgentConfig = {\n\t\tname: runtimeName,\n\t\tlocalName: name,\n\t\tpackageName: parsedPackage.packageName,\n\t\tdescription: cfg.description.trim(),\n\t\tsource: scope,\n\t\tfilePath: targetPath,\n\t\tsystemPrompt: \"\",\n\t\tsystemPromptMode: defaultSystemPromptMode(name),\n\t\tinheritProjectContext: defaultInheritProjectContext(name),\n\t\tinheritSkills: defaultInheritSkills(),\n\t};\n\tconst applyError = applyAgentConfig(agent, cfg);\n\tif (applyError) return result(applyError, true);\n\tconst mw = modelWarning(ctx, agent.model);\n\tif (mw) warnings.push(mw);\n\tconst fmw = fallbackModelsWarning(ctx, agent.fallbackModels);\n\tif (fmw) warnings.push(fmw);\n\tconst sw = skillsWarning(ctx.cwd, agent);\n\tif (sw) warnings.push(sw);\n\tfs.writeFileSync(targetPath, serializeAgent(agent), \"utf-8\");\n\treturn result([`Created agent '${runtimeName}' at ${targetPath}.`, ...warnings].join(\"\\n\"));\n}\n\nexport function handleUpdate(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent && !params.chainName) return result(\"Specify 'agent' or 'chainName' for update.\", true);\n\tif (params.agent && params.chainName) return result(\"Specify either 'agent' or 'chainName', not both.\", true);\n\tconst parsedConfig = configObject(params.config);\n\tif (parsedConfig.error) return result(parsedConfig.error, true);\n\tconst cfg = parsedConfig.value;\n\tif (!cfg) return result(\"config required for update.\", true);\n\tconst warnings: string[] = [];\n\tif (params.agent) {\n\t\tconst scopeHint = asDisambiguationScope(params.agentScope);\n\t\tconst targetOrError = resolveTarget(\"agent\", params.agent, findAgents(params.agent, ctx.cwd, scopeHint ?? \"both\"), ctx.cwd, params.agentScope);\n\t\tif (\"content\" in targetOrError) return targetOrError;\n\t\tconst target = targetOrError;\n\t\tconst updated = editableAgentConfig(target);\n\t\tconst oldName = target.name;\n\t\tif (hasKey(cfg, \"name\") && (typeof cfg.name !== \"string\" || !cfg.name.trim())) return result(\"config.name must be a non-empty string when provided.\", true);\n\t\tif (hasKey(cfg, \"description\") && (typeof cfg.description !== \"string\" || !cfg.description.trim())) return result(\"config.description must be a non-empty string when provided.\", true);\n\t\tlet newLocalName = target.localName ?? frontmatterNameForConfig(target);\n\t\tif (hasKey(cfg, \"name\")) {\n\t\t\tnewLocalName = sanitizeName(cfg.name as string);\n\t\t\tif (!newLocalName) return result(\"config.name is invalid after sanitization.\", true);\n\t\t}\n\t\tlet newPackageName = target.packageName;\n\t\tif (hasKey(cfg, \"package\")) {\n\t\t\tconst parsedPackage = parsePackageConfig(cfg.package);\n\t\t\tif (parsedPackage.error) return result(parsedPackage.error, true);\n\t\t\tnewPackageName = parsedPackage.packageName;\n\t\t}\n\t\tconst applyError = applyAgentConfig(updated, cfg);\n\t\tif (applyError) return result(applyError, true);\n\t\tconst preserveFrontmatterFields = preservedAgentFrontmatterFields(target, cfg);\n\t\tupdated.localName = newLocalName;\n\t\tupdated.packageName = newPackageName;\n\t\tupdated.name = buildRuntimeName(newLocalName, newPackageName);\n\t\tif (hasKey(cfg, \"description\")) updated.description = (cfg.description as string).trim();\n\t\tif (hasKey(cfg, \"model\")) {\n\t\t\tconst mw = modelWarning(ctx, updated.model);\n\t\t\tif (mw) warnings.push(mw);\n\t\t}\n\t\tif (hasKey(cfg, \"fallbackModels\")) {\n\t\t\tconst fmw = fallbackModelsWarning(ctx, updated.fallbackModels);\n\t\t\tif (fmw) warnings.push(fmw);\n\t\t}\n\t\tif (hasKey(cfg, \"skills\") || hasKey(cfg, \"skillPath\")) {\n\t\t\tconst sw = skillsWarning(ctx.cwd, updated);\n\t\t\tif (sw) warnings.push(sw);\n\t\t}\n\t\tif (updated.name !== oldName) {\n\t\t\tconst renamed = renamePath(\"agent\", target.filePath, updated.name, target.source, ctx.cwd);\n\t\t\tif (renamed.error) return result(renamed.error, true);\n\t\t\tupdated.filePath = renamed.filePath!;\n\t\t}\n\t\tfs.writeFileSync(updated.filePath, serializeAgent(updated, { preserveFrontmatterFields }), \"utf-8\");\n\t\tif (updated.name !== oldName) {\n\t\t\tconst refs = discoverAgentsAll(ctx.cwd).chains.filter((c) => c.steps.some((s) => s.agent === oldName)).map((c) => `${c.name} (${c.source})`);\n\t\t\tif (refs.length) warnings.push(`Warning: chains still reference '${oldName}': ${refs.join(\", \")}.`);\n\t\t}\n\t\tconst headline = updated.name === oldName\n\t\t\t? `Updated agent '${updated.name}' at ${updated.filePath}.`\n\t\t\t: `Updated agent '${oldName}' to '${updated.name}' at ${updated.filePath}.`;\n\t\treturn result([headline, ...warnings].join(\"\\n\"));\n\t}\n\tconst scopeHint = asDisambiguationScope(params.agentScope);\n\tconst targetOrError = resolveTarget(\"chain\", params.chainName!, findChains(params.chainName!, ctx.cwd, scopeHint ?? \"both\"), ctx.cwd, params.agentScope);\n\tif (\"content\" in targetOrError) return targetOrError;\n\tconst target = targetOrError;\n\tconst updated: ChainConfig = { ...target, steps: [...target.steps] };\n\tconst oldName = target.name;\n\tif (hasKey(cfg, \"name\") && (typeof cfg.name !== \"string\" || !cfg.name.trim())) return result(\"config.name must be a non-empty string when provided.\", true);\n\tif (hasKey(cfg, \"description\") && (typeof cfg.description !== \"string\" || !cfg.description.trim())) return result(\"config.description must be a non-empty string when provided.\", true);\n\tlet newLocalName = target.localName ?? frontmatterNameForConfig(target);\n\tif (hasKey(cfg, \"name\")) {\n\t\tnewLocalName = sanitizeName(cfg.name as string);\n\t\tif (!newLocalName) return result(\"config.name is invalid after sanitization.\", true);\n\t}\n\tlet newPackageName = target.packageName;\n\tif (hasKey(cfg, \"package\")) {\n\t\tconst parsedPackage = parsePackageConfig(cfg.package);\n\t\tif (parsedPackage.error) return result(parsedPackage.error, true);\n\t\tnewPackageName = parsedPackage.packageName;\n\t}\n\tlet parsedSteps: ChainStepConfig[] | undefined;\n\tif (hasKey(cfg, \"steps\")) {\n\t\tconst parsed = parseStepList(cfg.steps);\n\t\tif (parsed.error) return result(parsed.error, true);\n\t\tparsedSteps = parsed.steps!;\n\t}\n\tupdated.localName = newLocalName;\n\tupdated.packageName = newPackageName;\n\tupdated.name = buildRuntimeName(newLocalName, newPackageName);\n\tif (hasKey(cfg, \"description\")) updated.description = (cfg.description as string).trim();\n\tif (parsedSteps) {\n\t\tupdated.steps = parsedSteps;\n\t\tconst missing = unknownChainAgents(ctx.cwd, updated.steps);\n\t\tif (missing.length) warnings.push(`Warning: chain steps reference unknown agents: ${missing.join(\", \")}.`);\n\t\twarnings.push(...chainStepWarnings(ctx, updated.steps));\n\t}\n\tif (updated.name !== oldName) {\n\t\tconst renamed = renamePath(\"chain\", target.filePath, updated.name, target.source, ctx.cwd);\n\t\tif (renamed.error) return result(renamed.error, true);\n\t\tupdated.filePath = renamed.filePath!;\n\t}\n\tfs.writeFileSync(updated.filePath, updated.filePath.endsWith(\".chain.json\") ? serializeJsonChain(updated) : serializeChain(updated), \"utf-8\");\n\tconst headline = updated.name === oldName\n\t\t? `Updated chain '${updated.name}' at ${updated.filePath}.`\n\t\t: `Updated chain '${oldName}' to '${updated.name}' at ${updated.filePath}.`;\n\treturn result([headline, ...warnings].join(\"\\n\"));\n}\n\nfunction handleDelete(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent && !params.chainName) return result(\"Specify 'agent' or 'chainName' for delete.\", true);\n\tif (params.agent && params.chainName) return result(\"Specify either 'agent' or 'chainName', not both.\", true);\n\tconst scopeHint = asDisambiguationScope(params.agentScope);\n\tif (params.agent) {\n\t\tconst targetOrError = resolveTarget(\"agent\", params.agent, findAgents(params.agent, ctx.cwd, scopeHint ?? \"both\"), ctx.cwd, params.agentScope);\n\t\tif (\"content\" in targetOrError) return targetOrError;\n\t\tconst target = targetOrError;\n\t\tfs.unlinkSync(target.filePath);\n\t\tconst refs = discoverAgentsAll(ctx.cwd).chains.filter((c) => c.steps.some((s) => s.agent === target.name)).map((c) => `${c.name} (${c.source})`);\n\t\tconst lines = [`Deleted agent '${target.name}' at ${target.filePath}.`];\n\t\tif (refs.length) lines.push(`Warning: chains reference deleted agent '${target.name}': ${refs.join(\", \")}.`);\n\t\treturn result(lines.join(\"\\n\"));\n\t}\n\tconst targetOrError = resolveTarget(\"chain\", params.chainName!, findChains(params.chainName!, ctx.cwd, scopeHint ?? \"both\"), ctx.cwd, params.agentScope);\n\tif (\"content\" in targetOrError) return targetOrError;\n\tconst target = targetOrError;\n\tfs.unlinkSync(target.filePath);\n\treturn result(`Deleted chain '${target.name}' at ${target.filePath}.`);\n}\n\nfunction handleEject(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent) return result(\"Specify 'agent' for eject.\", true);\n\tconst raw = params.agent.trim();\n\tconst sanitized = sanitizeName(raw);\n\tconst parsedScope = actionScope(params.agentScope, \"eject\");\n\tif (parsedScope.error) return parsedScope.error;\n\tconst scope = parsedScope.scope!;\n\tconst d = discoverAgentsAll(ctx.cwd);\n\tconst source = [...d.package, ...d.builtin].find((a) => a.name === raw || a.name === sanitized);\n\tif (!source) {\n\t\treturn result(`Agent '${raw}' not found or is not a bundled/package agent. eject copies a builtin or package agent to ${scope} scope so it can be customized. Available: ${availableNames(ctx.cwd, \"agent\").join(\", \") || \"none\"}.`, true);\n\t}\n\tconst runtimeName = source.name;\n\tconst existingCustom = (scope === \"user\" ? d.user : d.project).find((a) => a.name === runtimeName);\n\tif (existingCustom) {\n\t\treturn result(`Agent '${runtimeName}' is already a custom ${scope} agent at ${existingCustom.filePath}. Edit it with { action: \"update\", agent: \"${runtimeName}\" } or delete it first.`, true);\n\t}\n\tif (nameExistsInScope(ctx.cwd, scope, runtimeName)) {\n\t\treturn result(`An agent or chain named '${runtimeName}' already exists in ${scope} scope. Remove or rename it first.`, true);\n\t}\n\tconst projectConfigDir = getProjectConfigDir(ctx.cwd);\n\tconst targetDir = scope === \"user\" ? d.userDir : d.projectDir ?? path.join(projectConfigDir, \"agents\");\n\tfs.mkdirSync(targetDir, { recursive: true });\n\tconst targetPath = path.join(targetDir, `${runtimeName}.md`);\n\tif (fs.existsSync(targetPath)) {\n\t\treturn result(`File already exists at ${targetPath} but is not a valid agent definition. Remove or rename it first.`, true);\n\t}\n\tlet content: string;\n\ttry {\n\t\tcontent = fs.readFileSync(source.filePath, \"utf-8\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn result(`Failed to read source agent at ${source.filePath}: ${message}`, true);\n\t}\n\tfs.writeFileSync(targetPath, content, \"utf-8\");\n\treturn result(`Ejected agent '${runtimeName}' from ${source.source} to ${scope} scope at ${targetPath}. Edit it there to customize; it shadows the bundled ${source.source} agent of the same name.`);\n}\n\nfunction handleDisable(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent) return result(\"Specify 'agent' for disable.\", true);\n\tconst raw = params.agent.trim();\n\tconst parsedScope = actionScope(params.agentScope, \"disable\");\n\tif (parsedScope.error) return parsedScope.error;\n\tconst scope = parsedScope.scope!;\n\tconst d = discoverAgentsAll(ctx.cwd);\n\tif (scope === \"project\" && d.projectSettingsPath === null) {\n\t\treturn result(\"Project override is not available here: no project config root (.pi or .agents) was found above the cwd. Use agentScope: 'user' or run from inside a project.\", true);\n\t}\n\tconst effective = pickEffectiveAgent(d, raw);\n\tif (!effective) {\n\t\treturn result(`Agent '${raw}' not found. Available: ${availableNames(ctx.cwd, \"agent\").join(\", \") || \"none\"}.`, true);\n\t}\n\tconst runtimeName = effective.name;\n\tconst settingsPath = mergeBuiltinAgentOverride(ctx.cwd, runtimeName, scope, { disabled: true });\n\tconst after = pickEffectiveAgent(discoverAgentsAll(ctx.cwd), raw);\n\tif (after?.disabled === true) {\n\t\treturn result(`Disabled agent '${runtimeName}' via ${scope} settings override at ${settingsPath}. It is now hidden from runtime discovery and { action: \"list\" }.`);\n\t}\n\treturn result(`Wrote a disabled override for '${runtimeName}' at ${settingsPath}, but the agent is still enabled. A higher-precedence ${after?.override?.scope ?? \"project\"} override is likely winning. Try agentScope: '${after?.override?.scope ?? \"project\"}'.`, true);\n}\n\nfunction handleEnable(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent) return result(\"Specify 'agent' for enable.\", true);\n\tconst raw = params.agent.trim();\n\tconst parsedScope = actionScope(params.agentScope, \"enable\");\n\tif (parsedScope.error) return parsedScope.error;\n\tconst scope = parsedScope.scope!;\n\tconst d = discoverAgentsAll(ctx.cwd);\n\tif (scope === \"project\" && d.projectSettingsPath === null) {\n\t\treturn result(\"Project override is not available here: no project config root (.pi or .agents) was found above the cwd. Use agentScope: 'user' or run from inside a project.\", true);\n\t}\n\tconst effective = pickEffectiveAgent(d, raw);\n\tif (!effective) {\n\t\treturn result(`Agent '${raw}' not found. Available: ${availableNames(ctx.cwd, \"agent\").join(\", \") || \"none\"}.`, true);\n\t}\n\tconst runtimeName = effective.name;\n\tconst { path: settingsPath, removed } = removeBuiltinAgentOverrideFields(ctx.cwd, runtimeName, scope, [\"disabled\"]);\n\tconst after = pickEffectiveAgent(discoverAgentsAll(ctx.cwd), raw);\n\tif (after && after.disabled !== true) {\n\t\tif (removed) return result(`Enabled agent '${runtimeName}' (removed disabled override at ${settingsPath}).`);\n\t\treturn result(`Agent '${runtimeName}' is already enabled.`);\n\t}\n\tif (after?.override?.scope && after.override.scope !== scope) {\n\t\treturn result(`Agent '${runtimeName}' is still disabled via a ${after.override.scope} scope override at ${after.override.path}. Specify agentScope: '${after.override.scope}' to enable it.`, true);\n\t}\n\treturn result(`Agent '${runtimeName}' is still disabled after removing the ${scope} disabled override. It may be hidden via subagents.disableBuiltins in ${after?.override?.scope ?? scope} settings at ${after?.override?.path ?? settingsPath}.`, true);\n}\n\nfunction handleReset(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tif (!params.agent) return result(\"Specify 'agent' for reset.\", true);\n\tconst raw = params.agent.trim();\n\tconst sanitized = sanitizeName(raw);\n\tconst parsedScope = actionScope(params.agentScope, \"reset\");\n\tif (parsedScope.error) return parsedScope.error;\n\tconst scope = parsedScope.scope!;\n\tconst d = discoverAgentsAll(ctx.cwd);\n\tif (scope === \"project\" && d.projectSettingsPath === null) {\n\t\treturn result(\"Project override is not available here: no project config root (.pi or .agents) was found above the cwd. Use agentScope: 'user' or run from inside a project.\", true);\n\t}\n\tconst bundled = [...d.package, ...d.builtin].find((a) => a.name === raw || a.name === sanitized);\n\tif (!bundled) {\n\t\tconst custom = [...d.user, ...d.project].find((a) => a.name === raw || a.name === sanitized);\n\t\tif (custom) {\n\t\t\treturn result(`Agent '${raw}' has no bundled default to reset to. Use { action: \"delete\", agent: \"${custom.name}\" } to remove the custom ${custom.source} agent.`, true);\n\t\t}\n\t\treturn result(`Agent '${raw}' not found. Available: ${availableNames(ctx.cwd, \"agent\").join(\", \") || \"none\"}.`, true);\n\t}\n\tconst runtimeName = bundled.name;\n\tconst custom = (scope === \"user\" ? d.user : d.project).find((a) => a.name === raw || a.name === sanitized);\n\tconst lines: string[] = [];\n\tif (custom) {\n\t\tfs.unlinkSync(custom.filePath);\n\t\tlines.push(`Deleted custom ${scope} agent file at ${custom.filePath}.`);\n\t}\n\tconst overrideRemoval = removeBuiltinAgentOverride(ctx.cwd, runtimeName, scope);\n\tif (overrideRemoval.removed) lines.push(`Removed ${scope} settings override at ${overrideRemoval.path}.`);\n\tif (lines.length === 0) {\n\t\tconst otherScope = scope === \"user\" ? \"project\" : \"user\";\n\t\tconst otherCustom = (otherScope === \"user\" ? d.user : d.project).find((a) => a.name === raw || a.name === sanitized);\n\t\tconst hasOtherOverride = bundled.override?.scope === otherScope;\n\t\tconst note = (otherCustom || hasOtherOverride)\n\t\t\t? ` Customization exists in ${otherScope} scope; specify agentScope: '${otherScope}' to reset it.`\n\t\t\t: \"\";\n\t\treturn result(`Agent '${runtimeName}' has no ${scope} customization to reset.${note} It is at its bundled ${bundled.source} default.`);\n\t}\n\tlines.push(`Reset agent '${runtimeName}' to its bundled ${bundled.source} default.`);\n\treturn result(lines.join(\"\\n\"));\n}\n\nexport function handleManagementAction(action: string, params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {\n\tswitch (action as ManagementAction) {\n\t\tcase \"list\": return handleList(params, ctx);\n\t\tcase \"get\": return handleGet(params, ctx);\n\t\tcase \"models\": return handleModels(params, ctx);\n\t\tcase \"create\": return handleCreate(params, ctx);\n\t\tcase \"update\": return handleUpdate(params, ctx);\n\t\tcase \"delete\": return handleDelete(params, ctx);\n\t\tcase \"eject\": return handleEject(params, ctx);\n\t\tcase \"disable\": return handleDisable(params, ctx);\n\t\tcase \"enable\": return handleEnable(params, ctx);\n\t\tcase \"reset\": return handleReset(params, ctx);\n\t\tdefault: return result(`Unknown action: ${action}`, true);\n\t}\n}\n"]}