@agimon-ai/doompi-team 0.0.1-alpha.80 → 0.0.1-alpha.82

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 (735) hide show
  1. package/dist/agentDiscovery-D3Vu9QU6.cjs +1643 -0
  2. package/dist/agentDiscovery-D3Vu9QU6.cjs.map +1 -0
  3. package/dist/agentDiscovery-DgXMJJJF.mjs +1535 -0
  4. package/dist/agentDiscovery-DgXMJJJF.mjs.map +1 -0
  5. package/dist/apiContracts.cjs +162 -0
  6. package/dist/apiContracts.cjs.map +1 -0
  7. package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
  8. package/dist/apiContracts.mjs +157 -0
  9. package/dist/apiContracts.mjs.map +1 -0
  10. package/dist/atomicJson-D0346bt5.cjs +178 -0
  11. package/dist/atomicJson-D0346bt5.cjs.map +1 -0
  12. package/dist/{src/services/atomicJson/index.mjs → atomicJson-D2t0CDh9.mjs} +71 -3
  13. package/dist/atomicJson-D2t0CDh9.mjs.map +1 -0
  14. package/dist/{src/schemas/team/capabilityCeiling.cjs → capabilityCeiling-0YDyGeCI.cjs} +38 -9
  15. package/dist/{src/schemas/team/capabilityCeiling.cjs.map → capabilityCeiling-0YDyGeCI.cjs.map} +1 -1
  16. package/dist/{src/schemas/team/capabilityCeiling.mjs → capabilityCeiling-CCnsGR_0.mjs} +3 -3
  17. package/dist/{src/schemas/team/capabilityCeiling.mjs.map → capabilityCeiling-CCnsGR_0.mjs.map} +1 -1
  18. package/dist/{capability-ceiling.cjs → capabilityCeiling.cjs} +2 -2
  19. package/dist/{src/schemas/team/capabilityCeiling.d.mts → capabilityCeiling.d.mts} +2 -2
  20. package/dist/capabilityCeiling.d.mts.map +1 -0
  21. package/dist/capabilityCeiling.mjs +3 -0
  22. package/dist/delegation.cjs +39 -8
  23. package/dist/delegation.cjs.map +1 -0
  24. package/dist/delegation.d.mts +268 -2
  25. package/dist/delegation.d.mts.map +1 -0
  26. package/dist/delegation.mjs +32 -1
  27. package/dist/delegation.mjs.map +1 -0
  28. package/dist/env.cjs +5 -5
  29. package/dist/env.d.mts +1 -1
  30. package/dist/env.mjs +1 -1
  31. package/dist/environment-B7voHuOW.d.mts +63 -0
  32. package/dist/environment-B7voHuOW.d.mts.map +1 -0
  33. package/dist/environment-BJlyiI1i.cjs +320 -0
  34. package/dist/environment-BJlyiI1i.cjs.map +1 -0
  35. package/dist/{src/types/environment.mjs → environment-mGLVOOPQ.mjs} +3 -3
  36. package/dist/environment-mGLVOOPQ.mjs.map +1 -0
  37. package/dist/extensions/mcp.cjs +3 -3
  38. package/dist/extensions/mcp.cjs.map +1 -1
  39. package/dist/extensions/mcp.d.mts +1 -1
  40. package/dist/extensions/mcp.d.mts.map +1 -1
  41. package/dist/extensions/mcp.mjs +1 -1
  42. package/dist/extensions/mcp.mjs.map +1 -1
  43. package/dist/extensions/pi.cjs +3852 -36
  44. package/dist/extensions/pi.cjs.map +1 -1
  45. package/dist/extensions/pi.d.mts +1 -1
  46. package/dist/extensions/pi.d.mts.map +1 -1
  47. package/dist/extensions/pi.mjs +3834 -20
  48. package/dist/extensions/pi.mjs.map +1 -1
  49. package/dist/extensions/server.cjs +848 -18
  50. package/dist/extensions/server.cjs.map +1 -1
  51. package/dist/extensions/server.d.mts +1 -1
  52. package/dist/extensions/server.d.mts.map +1 -1
  53. package/dist/extensions/server.mjs +839 -9
  54. package/dist/extensions/server.mjs.map +1 -1
  55. package/dist/extensions/web.mjs +152 -80
  56. package/dist/extensions/web.mjs.map +1 -1
  57. package/dist/externalProcessIpc-BBviI58c.cjs +696 -0
  58. package/dist/externalProcessIpc-BBviI58c.cjs.map +1 -0
  59. package/dist/externalProcessIpc-DYaTptMO.mjs +584 -0
  60. package/dist/externalProcessIpc-DYaTptMO.mjs.map +1 -0
  61. package/dist/{fable-plan-api.cjs → fablePlan.cjs} +1 -1
  62. package/dist/fablePlan.d.mts +2 -0
  63. package/dist/fablePlan.mjs +2 -0
  64. package/dist/{src/schemas/fablePlanApi.mjs → fablePlanApi-BIxknm4r.mjs} +2 -2
  65. package/dist/fablePlanApi-BIxknm4r.mjs.map +1 -0
  66. package/dist/{src/schemas/fablePlanApi.cjs → fablePlanApi-CW-iehCk.cjs} +91 -16
  67. package/dist/fablePlanApi-CW-iehCk.cjs.map +1 -0
  68. package/dist/{src/schemas/fablePlanApi.d.mts → fablePlanApi-DmtPQBCc.d.mts} +27 -26
  69. package/dist/fablePlanApi-DmtPQBCc.d.mts.map +1 -0
  70. package/dist/{fable-plan.cjs → fablePlanApi.cjs} +1 -1
  71. package/dist/fablePlanApi.d.mts +2 -0
  72. package/dist/fablePlanApi.mjs +2 -0
  73. package/dist/index.cjs +48 -2
  74. package/dist/index.cjs.map +1 -0
  75. package/dist/index.d.mts +160 -2
  76. package/dist/index.d.mts.map +1 -0
  77. package/dist/index.mjs +44 -1
  78. package/dist/index.mjs.map +1 -0
  79. package/dist/runs/background/cliRunnerEntry.cjs +167 -24
  80. package/dist/runs/background/cliRunnerEntry.cjs.map +1 -1
  81. package/dist/runs/background/cliRunnerEntry.mjs +149 -6
  82. package/dist/runs/background/cliRunnerEntry.mjs.map +1 -1
  83. package/dist/{runtime-subagent-policy.cjs → runtimeSubagentPolicy.cjs} +1 -1
  84. package/dist/runtimeSubagentPolicy.d.mts +2 -0
  85. package/dist/runtimeSubagentPolicy.mjs +2 -0
  86. package/dist/{runtime-subagent-tool.cjs → runtimeSubagentTool.cjs} +1 -1
  87. package/dist/runtimeSubagentTool.d.mts +2 -0
  88. package/dist/runtimeSubagentTool.mjs +2 -0
  89. package/dist/{src/schemas/subagentPolicy.d.cts → subagentPolicy-ALJam4GN.d.mts} +8 -7
  90. package/dist/subagentPolicy-ALJam4GN.d.mts.map +1 -0
  91. package/dist/{src/schemas/subagentPolicy.cjs → subagentPolicy-DQRyKDH-.cjs} +19 -4
  92. package/dist/subagentPolicy-DQRyKDH-.cjs.map +1 -0
  93. package/dist/{src/schemas/subagentPolicy.mjs → subagentPolicy-DxjsKeyj.mjs} +2 -2
  94. package/dist/subagentPolicy-DxjsKeyj.mjs.map +1 -0
  95. package/dist/{subagent-policy.cjs → subagentPolicy.cjs} +1 -1
  96. package/dist/subagentPolicy.d.mts +2 -0
  97. package/dist/subagentPolicy.mjs +2 -0
  98. package/dist/{src/schemas/subagentTool.d.mts → subagentTool-6prjmrQG.d.mts} +12 -12
  99. package/dist/subagentTool-6prjmrQG.d.mts.map +1 -0
  100. package/dist/{src/schemas/subagentTool.mjs → subagentTool-Cy4c4po6.mjs} +3 -3
  101. package/dist/subagentTool-Cy4c4po6.mjs.map +1 -0
  102. package/dist/{src/schemas/subagentTool.cjs → subagentTool-nyAYDNis.cjs} +44 -10
  103. package/dist/subagentTool-nyAYDNis.cjs.map +1 -0
  104. package/dist/{subagent-tool.cjs → subagentTool.cjs} +1 -1
  105. package/dist/subagentTool.d.mts +2 -0
  106. package/dist/subagentTool.mjs +2 -0
  107. package/dist/teamRuntime-DtprPI0M.mjs +5633 -0
  108. package/dist/teamRuntime-DtprPI0M.mjs.map +1 -0
  109. package/dist/teamRuntime-V1A7a8rX.cjs +5881 -0
  110. package/dist/teamRuntime-V1A7a8rX.cjs.map +1 -0
  111. package/dist/{src/services/teamSnapshot/index.mjs → teamSnapshot-DgaANhBs.mjs} +2 -2
  112. package/dist/teamSnapshot-DgaANhBs.mjs.map +1 -0
  113. package/dist/{src/services/teamSnapshot/index.cjs → teamSnapshot-oKuGFdYc.cjs} +13 -3
  114. package/dist/teamSnapshot-oKuGFdYc.cjs.map +1 -0
  115. package/dist/teamSnapshot.cjs +4 -0
  116. package/dist/{src/services/nativeTeamChannel/index.d.cts → teamSnapshot.d.mts} +18 -10
  117. package/dist/teamSnapshot.d.mts.map +1 -0
  118. package/dist/teamSnapshot.mjs +2 -0
  119. package/package.json +60 -60
  120. package/dist/_virtual/_rolldown/runtime.cjs +0 -23
  121. package/dist/api-contracts.cjs +0 -7
  122. package/dist/api-contracts.d.cts +0 -2
  123. package/dist/api-contracts.d.mts +0 -2
  124. package/dist/api-contracts.mjs +0 -2
  125. package/dist/capability-ceiling.d.cts +0 -3
  126. package/dist/capability-ceiling.d.mts +0 -3
  127. package/dist/capability-ceiling.mjs +0 -3
  128. package/dist/delegation-api.d.mts +0 -2
  129. package/dist/delegation.d.cts +0 -3
  130. package/dist/env.d.cts +0 -2
  131. package/dist/extensions/mcp.d.cts +0 -5
  132. package/dist/extensions/mcp.d.cts.map +0 -1
  133. package/dist/extensions/pi.d.cts +0 -5
  134. package/dist/extensions/pi.d.cts.map +0 -1
  135. package/dist/extensions/server.d.cts +0 -5
  136. package/dist/extensions/server.d.cts.map +0 -1
  137. package/dist/fable-plan-api.d.cts +0 -2
  138. package/dist/fable-plan-api.d.mts +0 -2
  139. package/dist/fable-plan-api.mjs +0 -2
  140. package/dist/fable-plan.d.cts +0 -2
  141. package/dist/fable-plan.d.mts +0 -2
  142. package/dist/fable-plan.mjs +0 -2
  143. package/dist/index.d.cts +0 -2
  144. package/dist/runs/background/cliRunnerEntry.d.cts +0 -1
  145. package/dist/runtime-subagent-policy.d.cts +0 -2
  146. package/dist/runtime-subagent-policy.d.mts +0 -2
  147. package/dist/runtime-subagent-policy.mjs +0 -2
  148. package/dist/runtime-subagent-tool.d.cts +0 -2
  149. package/dist/runtime-subagent-tool.d.mts +0 -2
  150. package/dist/runtime-subagent-tool.mjs +0 -2
  151. package/dist/src/constants/team.cjs +0 -12
  152. package/dist/src/constants/team.cjs.map +0 -1
  153. package/dist/src/constants/team.mjs +0 -9
  154. package/dist/src/constants/team.mjs.map +0 -1
  155. package/dist/src/extensions/(backend)/channel/_lib/subagent-catalog.cjs +0 -60
  156. package/dist/src/extensions/(backend)/channel/_lib/subagent-catalog.cjs.map +0 -1
  157. package/dist/src/extensions/(backend)/channel/_lib/subagent-catalog.mjs +0 -59
  158. package/dist/src/extensions/(backend)/channel/_lib/subagent-catalog.mjs.map +0 -1
  159. package/dist/src/extensions/(backend)/channel/_lib/subagent-runs.cjs +0 -66
  160. package/dist/src/extensions/(backend)/channel/_lib/subagent-runs.cjs.map +0 -1
  161. package/dist/src/extensions/(backend)/channel/_lib/subagent-runs.mjs +0 -65
  162. package/dist/src/extensions/(backend)/channel/_lib/subagent-runs.mjs.map +0 -1
  163. package/dist/src/extensions/(backend)/channel/subagent-catalog.server.cjs +0 -7
  164. package/dist/src/extensions/(backend)/channel/subagent-catalog.server.cjs.map +0 -1
  165. package/dist/src/extensions/(backend)/channel/subagent-catalog.server.mjs +0 -8
  166. package/dist/src/extensions/(backend)/channel/subagent-catalog.server.mjs.map +0 -1
  167. package/dist/src/extensions/(backend)/channel/subagent-runs.server.cjs +0 -7
  168. package/dist/src/extensions/(backend)/channel/subagent-runs.server.cjs.map +0 -1
  169. package/dist/src/extensions/(backend)/channel/subagent-runs.server.mjs +0 -8
  170. package/dist/src/extensions/(backend)/channel/subagent-runs.server.mjs.map +0 -1
  171. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs +0 -426
  172. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs.map +0 -1
  173. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs +0 -426
  174. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs.map +0 -1
  175. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs +0 -279
  176. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs.map +0 -1
  177. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs +0 -279
  178. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs.map +0 -1
  179. package/dist/src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.cjs +0 -109
  180. package/dist/src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.cjs.map +0 -1
  181. package/dist/src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.mjs +0 -104
  182. package/dist/src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.mjs.map +0 -1
  183. package/dist/src/extensions/workspaces/sessions/(backend)/api/route.server.cjs +0 -7
  184. package/dist/src/extensions/workspaces/sessions/(backend)/api/route.server.cjs.map +0 -1
  185. package/dist/src/extensions/workspaces/sessions/(backend)/api/route.server.mjs +0 -8
  186. package/dist/src/extensions/workspaces/sessions/(backend)/api/route.server.mjs.map +0 -1
  187. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/launch.cjs +0 -160
  188. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/launch.cjs.map +0 -1
  189. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/launch.mjs +0 -154
  190. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/launch.mjs.map +0 -1
  191. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/parallel.cli.cjs +0 -107
  192. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/parallel.cli.cjs.map +0 -1
  193. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/parallel.cli.mjs +0 -102
  194. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/parallel.cli.mjs.map +0 -1
  195. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/ready.cjs +0 -14
  196. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/ready.cjs.map +0 -1
  197. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/ready.mjs +0 -14
  198. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/ready.mjs.map +0 -1
  199. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/run.cli.cjs +0 -33
  200. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/run.cli.cjs.map +0 -1
  201. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/run.cli.mjs +0 -32
  202. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/run.cli.mjs.map +0 -1
  203. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-doctor.cli.cjs +0 -25
  204. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-doctor.cli.cjs.map +0 -1
  205. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-doctor.cli.mjs +0 -24
  206. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-doctor.cli.mjs.map +0 -1
  207. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-fleet.cli.cjs +0 -58
  208. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-fleet.cli.cjs.map +0 -1
  209. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-fleet.cli.mjs +0 -56
  210. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-fleet.cli.mjs.map +0 -1
  211. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-list.cli.cjs +0 -49
  212. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-list.cli.cjs.map +0 -1
  213. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-list.cli.mjs +0 -48
  214. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-list.cli.mjs.map +0 -1
  215. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-steer.cli.cjs +0 -33
  216. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-steer.cli.cjs.map +0 -1
  217. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-steer.cli.mjs +0 -32
  218. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-steer.cli.mjs.map +0 -1
  219. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-stop.cli.cjs +0 -54
  220. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-stop.cli.cjs.map +0 -1
  221. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-stop.cli.mjs +0 -52
  222. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/subagents-stop.cli.mjs.map +0 -1
  223. package/dist/src/extensions/workspaces/sessions/(backend)/command/parallel.cli.cjs +0 -7
  224. package/dist/src/extensions/workspaces/sessions/(backend)/command/parallel.cli.cjs.map +0 -1
  225. package/dist/src/extensions/workspaces/sessions/(backend)/command/parallel.cli.mjs +0 -8
  226. package/dist/src/extensions/workspaces/sessions/(backend)/command/parallel.cli.mjs.map +0 -1
  227. package/dist/src/extensions/workspaces/sessions/(backend)/command/run.cli.cjs +0 -7
  228. package/dist/src/extensions/workspaces/sessions/(backend)/command/run.cli.cjs.map +0 -1
  229. package/dist/src/extensions/workspaces/sessions/(backend)/command/run.cli.mjs +0 -8
  230. package/dist/src/extensions/workspaces/sessions/(backend)/command/run.cli.mjs.map +0 -1
  231. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-doctor.cli.cjs +0 -7
  232. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-doctor.cli.cjs.map +0 -1
  233. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-doctor.cli.mjs +0 -8
  234. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-doctor.cli.mjs.map +0 -1
  235. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-fleet.cli.cjs +0 -8
  236. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-fleet.cli.cjs.map +0 -1
  237. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-fleet.cli.mjs +0 -9
  238. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-fleet.cli.mjs.map +0 -1
  239. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-list.cli.cjs +0 -12
  240. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-list.cli.cjs.map +0 -1
  241. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-list.cli.mjs +0 -13
  242. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-list.cli.mjs.map +0 -1
  243. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-steer.cli.cjs +0 -7
  244. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-steer.cli.cjs.map +0 -1
  245. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-steer.cli.mjs +0 -8
  246. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-steer.cli.mjs.map +0 -1
  247. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-stop.cli.cjs +0 -7
  248. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-stop.cli.cjs.map +0 -1
  249. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-stop.cli.mjs +0 -8
  250. package/dist/src/extensions/workspaces/sessions/(backend)/command/subagents-stop.cli.mjs.map +0 -1
  251. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/before-agent-start.cli.cjs +0 -11
  252. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/before-agent-start.cli.cjs.map +0 -1
  253. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/before-agent-start.cli.mjs +0 -11
  254. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/before-agent-start.cli.mjs.map +0 -1
  255. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-shutdown.cli.cjs +0 -6
  256. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-shutdown.cli.cjs.map +0 -1
  257. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-shutdown.cli.mjs +0 -6
  258. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-shutdown.cli.mjs.map +0 -1
  259. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs +0 -6
  260. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs.map +0 -1
  261. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs +0 -6
  262. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs.map +0 -1
  263. package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.cjs +0 -7
  264. package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.cjs.map +0 -1
  265. package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.mjs +0 -8
  266. package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.mjs.map +0 -1
  267. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.cjs +0 -7
  268. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.cjs.map +0 -1
  269. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.mjs +0 -8
  270. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.mjs.map +0 -1
  271. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +0 -7
  272. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +0 -1
  273. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +0 -8
  274. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +0 -1
  275. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.cjs +0 -23
  276. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.cjs.map +0 -1
  277. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.mjs +0 -23
  278. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.mjs.map +0 -1
  279. package/dist/src/extensions/workspaces/sessions/(backend)/resource/team.server.cjs +0 -7
  280. package/dist/src/extensions/workspaces/sessions/(backend)/resource/team.server.cjs.map +0 -1
  281. package/dist/src/extensions/workspaces/sessions/(backend)/resource/team.server.mjs +0 -8
  282. package/dist/src/extensions/workspaces/sessions/(backend)/resource/team.server.mjs.map +0 -1
  283. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +0 -11
  284. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +0 -1
  285. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +0 -12
  286. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +0 -1
  287. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +0 -7
  288. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +0 -1
  289. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +0 -8
  290. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +0 -1
  291. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/intercom.cli.cjs +0 -27
  292. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/intercom.cli.cjs.map +0 -1
  293. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/intercom.cli.mjs +0 -27
  294. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/intercom.cli.mjs.map +0 -1
  295. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/subagent.cli.cjs +0 -32
  296. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/subagent.cli.cjs.map +0 -1
  297. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/subagent.cli.mjs +0 -32
  298. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/subagent.cli.mjs.map +0 -1
  299. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.cli.cjs +0 -7
  300. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.cli.cjs.map +0 -1
  301. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.cli.mjs +0 -8
  302. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.cli.mjs.map +0 -1
  303. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.cjs +0 -7
  304. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.cjs.map +0 -1
  305. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.mjs +0 -8
  306. package/dist/src/extensions/workspaces/sessions/(backend)/tool/intercom.server.mjs.map +0 -1
  307. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.cli.cjs +0 -7
  308. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.cli.cjs.map +0 -1
  309. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.cli.mjs +0 -8
  310. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.cli.mjs.map +0 -1
  311. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.cjs +0 -7
  312. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.cjs.map +0 -1
  313. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.mjs +0 -8
  314. package/dist/src/extensions/workspaces/sessions/(backend)/tool/subagent.server.mjs.map +0 -1
  315. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/completionNotice.cjs +0 -40
  316. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/completionNotice.cjs.map +0 -1
  317. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/completionNotice.mjs +0 -40
  318. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/completionNotice.mjs.map +0 -1
  319. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/intercom-message.cli.cjs +0 -37
  320. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/intercom-message.cli.cjs.map +0 -1
  321. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/intercom-message.cli.mjs +0 -35
  322. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/intercom-message.cli.mjs.map +0 -1
  323. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/slashRunNotice.cjs +0 -37
  324. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/slashRunNotice.cjs.map +0 -1
  325. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/slashRunNotice.mjs +0 -37
  326. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/slashRunNotice.mjs.map +0 -1
  327. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-notify.cli.cjs +0 -23
  328. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-notify.cli.cjs.map +0 -1
  329. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-notify.cli.mjs +0 -22
  330. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-notify.cli.mjs.map +0 -1
  331. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-slash-result.cli.cjs +0 -23
  332. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-slash-result.cli.cjs.map +0 -1
  333. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-slash-result.cli.mjs +0 -22
  334. package/dist/src/extensions/workspaces/sessions/(frontend)/message/_lib/subagent-slash-result.cli.mjs.map +0 -1
  335. package/dist/src/extensions/workspaces/sessions/(frontend)/message/intercom-message.cli.cjs +0 -7
  336. package/dist/src/extensions/workspaces/sessions/(frontend)/message/intercom-message.cli.cjs.map +0 -1
  337. package/dist/src/extensions/workspaces/sessions/(frontend)/message/intercom-message.cli.mjs +0 -8
  338. package/dist/src/extensions/workspaces/sessions/(frontend)/message/intercom-message.cli.mjs.map +0 -1
  339. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-notify.cli.cjs +0 -7
  340. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-notify.cli.cjs.map +0 -1
  341. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-notify.cli.mjs +0 -8
  342. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-notify.cli.mjs.map +0 -1
  343. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-slash-result.cli.cjs +0 -7
  344. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-slash-result.cli.cjs.map +0 -1
  345. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-slash-result.cli.mjs +0 -8
  346. package/dist/src/extensions/workspaces/sessions/(frontend)/message/subagent-slash-result.cli.mjs.map +0 -1
  347. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agent-catalog.cli.cjs +0 -336
  348. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agent-catalog.cli.cjs.map +0 -1
  349. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agent-catalog.cli.mjs +0 -334
  350. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agent-catalog.cli.mjs.map +0 -1
  351. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agentResourceProjection.cjs +0 -209
  352. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agentResourceProjection.cjs.map +0 -1
  353. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agentResourceProjection.mjs +0 -208
  354. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/agentResourceProjection.mjs.map +0 -1
  355. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/contributions.cjs +0 -118
  356. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/contributions.cjs.map +0 -1
  357. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/contributions.mjs +0 -117
  358. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/contributions.mjs.map +0 -1
  359. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleet.cli.cjs +0 -628
  360. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleet.cli.cjs.map +0 -1
  361. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleet.cli.mjs +0 -625
  362. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleet.cli.mjs.map +0 -1
  363. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetAgentView.cjs +0 -95
  364. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetAgentView.cjs.map +0 -1
  365. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetAgentView.mjs +0 -90
  366. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetAgentView.mjs.map +0 -1
  367. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetStatus.cjs +0 -120
  368. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetStatus.cjs.map +0 -1
  369. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetStatus.mjs +0 -117
  370. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetStatus.mjs.map +0 -1
  371. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetTranscript.cjs +0 -204
  372. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetTranscript.cjs.map +0 -1
  373. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetTranscript.mjs +0 -204
  374. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/fleetTranscript.mjs.map +0 -1
  375. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/subagent.cli.cjs +0 -83
  376. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/subagent.cli.cjs.map +0 -1
  377. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/subagent.cli.mjs +0 -81
  378. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/subagent.cli.mjs.map +0 -1
  379. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/subagent.cli.cjs +0 -7
  380. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/subagent.cli.cjs.map +0 -1
  381. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/subagent.cli.mjs +0 -8
  382. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/subagent.cli.mjs.map +0 -1
  383. package/dist/src/models/slashResult.cjs +0 -6
  384. package/dist/src/models/slashResult.cjs.map +0 -1
  385. package/dist/src/models/slashResult.mjs +0 -6
  386. package/dist/src/models/slashResult.mjs.map +0 -1
  387. package/dist/src/schemas/apiContracts.cjs +0 -115
  388. package/dist/src/schemas/apiContracts.cjs.map +0 -1
  389. package/dist/src/schemas/apiContracts.d.cts +0 -53
  390. package/dist/src/schemas/apiContracts.d.cts.map +0 -1
  391. package/dist/src/schemas/apiContracts.mjs +0 -112
  392. package/dist/src/schemas/apiContracts.mjs.map +0 -1
  393. package/dist/src/schemas/fablePlanApi.cjs.map +0 -1
  394. package/dist/src/schemas/fablePlanApi.d.cts +0 -96
  395. package/dist/src/schemas/fablePlanApi.d.cts.map +0 -1
  396. package/dist/src/schemas/fablePlanApi.d.mts.map +0 -1
  397. package/dist/src/schemas/fablePlanApi.mjs.map +0 -1
  398. package/dist/src/schemas/subagentPolicy.cjs.map +0 -1
  399. package/dist/src/schemas/subagentPolicy.d.cts.map +0 -1
  400. package/dist/src/schemas/subagentPolicy.d.mts +0 -32
  401. package/dist/src/schemas/subagentPolicy.d.mts.map +0 -1
  402. package/dist/src/schemas/subagentPolicy.mjs.map +0 -1
  403. package/dist/src/schemas/subagentTool.cjs.map +0 -1
  404. package/dist/src/schemas/subagentTool.d.cts +0 -103
  405. package/dist/src/schemas/subagentTool.d.cts.map +0 -1
  406. package/dist/src/schemas/subagentTool.d.mts.map +0 -1
  407. package/dist/src/schemas/subagentTool.mjs.map +0 -1
  408. package/dist/src/schemas/team/capabilityCeiling.d.cts +0 -46
  409. package/dist/src/schemas/team/capabilityCeiling.d.cts.map +0 -1
  410. package/dist/src/schemas/team/capabilityCeiling.d.mts.map +0 -1
  411. package/dist/src/schemas/team/delegation.cjs +0 -39
  412. package/dist/src/schemas/team/delegation.cjs.map +0 -1
  413. package/dist/src/schemas/team/delegation.d.cts +0 -268
  414. package/dist/src/schemas/team/delegation.d.cts.map +0 -1
  415. package/dist/src/schemas/team/delegation.d.mts +0 -268
  416. package/dist/src/schemas/team/delegation.d.mts.map +0 -1
  417. package/dist/src/schemas/team/delegation.mjs +0 -33
  418. package/dist/src/schemas/team/delegation.mjs.map +0 -1
  419. package/dist/src/schemas/team/packageConfig.cjs +0 -81
  420. package/dist/src/schemas/team/packageConfig.cjs.map +0 -1
  421. package/dist/src/schemas/team/packageConfig.mjs +0 -79
  422. package/dist/src/schemas/team/packageConfig.mjs.map +0 -1
  423. package/dist/src/services/admissionGate/index.cjs +0 -75
  424. package/dist/src/services/admissionGate/index.cjs.map +0 -1
  425. package/dist/src/services/admissionGate/index.mjs +0 -74
  426. package/dist/src/services/admissionGate/index.mjs.map +0 -1
  427. package/dist/src/services/agentDiscovery/index.cjs +0 -204
  428. package/dist/src/services/agentDiscovery/index.cjs.map +0 -1
  429. package/dist/src/services/agentDiscovery/index.mjs +0 -198
  430. package/dist/src/services/agentDiscovery/index.mjs.map +0 -1
  431. package/dist/src/services/agentFrontmatter/index.cjs +0 -155
  432. package/dist/src/services/agentFrontmatter/index.cjs.map +0 -1
  433. package/dist/src/services/agentFrontmatter/index.mjs +0 -154
  434. package/dist/src/services/agentFrontmatter/index.mjs.map +0 -1
  435. package/dist/src/services/agentIdentity/index.cjs +0 -324
  436. package/dist/src/services/agentIdentity/index.cjs.map +0 -1
  437. package/dist/src/services/agentIdentity/index.mjs +0 -315
  438. package/dist/src/services/agentIdentity/index.mjs.map +0 -1
  439. package/dist/src/services/agentLoader/index.cjs +0 -326
  440. package/dist/src/services/agentLoader/index.cjs.map +0 -1
  441. package/dist/src/services/agentLoader/index.mjs +0 -313
  442. package/dist/src/services/agentLoader/index.mjs.map +0 -1
  443. package/dist/src/services/agentMemory/index.cjs +0 -99
  444. package/dist/src/services/agentMemory/index.cjs.map +0 -1
  445. package/dist/src/services/agentMemory/index.mjs +0 -65
  446. package/dist/src/services/agentMemory/index.mjs.map +0 -1
  447. package/dist/src/services/agentProjectRoot/index.cjs +0 -182
  448. package/dist/src/services/agentProjectRoot/index.cjs.map +0 -1
  449. package/dist/src/services/agentProjectRoot/index.mjs +0 -168
  450. package/dist/src/services/agentProjectRoot/index.mjs.map +0 -1
  451. package/dist/src/services/agentSettings/index.cjs +0 -472
  452. package/dist/src/services/agentSettings/index.cjs.map +0 -1
  453. package/dist/src/services/agentSettings/index.mjs +0 -423
  454. package/dist/src/services/agentSettings/index.mjs.map +0 -1
  455. package/dist/src/services/agentSkills/index.cjs +0 -486
  456. package/dist/src/services/agentSkills/index.cjs.map +0 -1
  457. package/dist/src/services/agentSkills/index.mjs +0 -479
  458. package/dist/src/services/agentSkills/index.mjs.map +0 -1
  459. package/dist/src/services/asyncExecution/index.cjs +0 -233
  460. package/dist/src/services/asyncExecution/index.cjs.map +0 -1
  461. package/dist/src/services/asyncExecution/index.mjs +0 -225
  462. package/dist/src/services/asyncExecution/index.mjs.map +0 -1
  463. package/dist/src/services/asyncJobTracker/index.cjs +0 -258
  464. package/dist/src/services/asyncJobTracker/index.cjs.map +0 -1
  465. package/dist/src/services/asyncJobTracker/index.mjs +0 -256
  466. package/dist/src/services/asyncJobTracker/index.mjs.map +0 -1
  467. package/dist/src/services/atomicJson/index.cjs +0 -74
  468. package/dist/src/services/atomicJson/index.cjs.map +0 -1
  469. package/dist/src/services/atomicJson/index.mjs.map +0 -1
  470. package/dist/src/services/boundedKeySet/index.cjs +0 -54
  471. package/dist/src/services/boundedKeySet/index.cjs.map +0 -1
  472. package/dist/src/services/boundedKeySet/index.mjs +0 -54
  473. package/dist/src/services/boundedKeySet/index.mjs.map +0 -1
  474. package/dist/src/services/chainExpression/index.cjs +0 -167
  475. package/dist/src/services/chainExpression/index.cjs.map +0 -1
  476. package/dist/src/services/chainExpression/index.mjs +0 -162
  477. package/dist/src/services/chainExpression/index.mjs.map +0 -1
  478. package/dist/src/services/claudeFableProfile/index.cjs +0 -193
  479. package/dist/src/services/claudeFableProfile/index.cjs.map +0 -1
  480. package/dist/src/services/claudeFableProfile/index.mjs +0 -181
  481. package/dist/src/services/claudeFableProfile/index.mjs.map +0 -1
  482. package/dist/src/services/completionBatcher/index.cjs +0 -98
  483. package/dist/src/services/completionBatcher/index.cjs.map +0 -1
  484. package/dist/src/services/completionBatcher/index.mjs +0 -96
  485. package/dist/src/services/completionBatcher/index.mjs.map +0 -1
  486. package/dist/src/services/config/index.cjs +0 -115
  487. package/dist/src/services/config/index.cjs.map +0 -1
  488. package/dist/src/services/config/index.mjs +0 -111
  489. package/dist/src/services/config/index.mjs.map +0 -1
  490. package/dist/src/services/configDir/index.cjs +0 -125
  491. package/dist/src/services/configDir/index.cjs.map +0 -1
  492. package/dist/src/services/configDir/index.mjs +0 -116
  493. package/dist/src/services/configDir/index.mjs.map +0 -1
  494. package/dist/src/services/delegationBridge/index.cjs +0 -280
  495. package/dist/src/services/delegationBridge/index.cjs.map +0 -1
  496. package/dist/src/services/delegationBridge/index.mjs +0 -280
  497. package/dist/src/services/delegationBridge/index.mjs.map +0 -1
  498. package/dist/src/services/depthGuard/index.cjs +0 -64
  499. package/dist/src/services/depthGuard/index.cjs.map +0 -1
  500. package/dist/src/services/depthGuard/index.mjs +0 -63
  501. package/dist/src/services/depthGuard/index.mjs.map +0 -1
  502. package/dist/src/services/directRunBackgroundWork/index.cjs +0 -23
  503. package/dist/src/services/directRunBackgroundWork/index.cjs.map +0 -1
  504. package/dist/src/services/directRunBackgroundWork/index.mjs +0 -23
  505. package/dist/src/services/directRunBackgroundWork/index.mjs.map +0 -1
  506. package/dist/src/services/displayFormat/index.cjs +0 -51
  507. package/dist/src/services/displayFormat/index.cjs.map +0 -1
  508. package/dist/src/services/displayFormat/index.mjs +0 -48
  509. package/dist/src/services/displayFormat/index.mjs.map +0 -1
  510. package/dist/src/services/doctor/index.cjs +0 -151
  511. package/dist/src/services/doctor/index.cjs.map +0 -1
  512. package/dist/src/services/doctor/index.mjs +0 -148
  513. package/dist/src/services/doctor/index.mjs.map +0 -1
  514. package/dist/src/services/errors/index.cjs +0 -21
  515. package/dist/src/services/errors/index.cjs.map +0 -1
  516. package/dist/src/services/errors/index.mjs +0 -20
  517. package/dist/src/services/errors/index.mjs.map +0 -1
  518. package/dist/src/services/externalProcessIpc/index.cjs +0 -303
  519. package/dist/src/services/externalProcessIpc/index.cjs.map +0 -1
  520. package/dist/src/services/externalProcessIpc/index.mjs +0 -293
  521. package/dist/src/services/externalProcessIpc/index.mjs.map +0 -1
  522. package/dist/src/services/fablePlanBridge/index.cjs +0 -237
  523. package/dist/src/services/fablePlanBridge/index.cjs.map +0 -1
  524. package/dist/src/services/fablePlanBridge/index.mjs +0 -235
  525. package/dist/src/services/fablePlanBridge/index.mjs.map +0 -1
  526. package/dist/src/services/fileSystemRetry/index.cjs +0 -75
  527. package/dist/src/services/fileSystemRetry/index.cjs.map +0 -1
  528. package/dist/src/services/fileSystemRetry/index.mjs +0 -72
  529. package/dist/src/services/fileSystemRetry/index.mjs.map +0 -1
  530. package/dist/src/services/fleetTranscript/index.cjs +0 -306
  531. package/dist/src/services/fleetTranscript/index.cjs.map +0 -1
  532. package/dist/src/services/fleetTranscript/index.mjs +0 -302
  533. package/dist/src/services/fleetTranscript/index.mjs.map +0 -1
  534. package/dist/src/services/headlessIntercomTool/index.cjs +0 -19
  535. package/dist/src/services/headlessIntercomTool/index.cjs.map +0 -1
  536. package/dist/src/services/headlessIntercomTool/index.mjs +0 -19
  537. package/dist/src/services/headlessIntercomTool/index.mjs.map +0 -1
  538. package/dist/src/services/headlessSubagentTool/index.cjs +0 -177
  539. package/dist/src/services/headlessSubagentTool/index.cjs.map +0 -1
  540. package/dist/src/services/headlessSubagentTool/index.mjs +0 -177
  541. package/dist/src/services/headlessSubagentTool/index.mjs.map +0 -1
  542. package/dist/src/services/intercomBridge/index.cjs +0 -63
  543. package/dist/src/services/intercomBridge/index.cjs.map +0 -1
  544. package/dist/src/services/intercomBridge/index.mjs +0 -61
  545. package/dist/src/services/intercomBridge/index.mjs.map +0 -1
  546. package/dist/src/services/lruCache/index.cjs +0 -64
  547. package/dist/src/services/lruCache/index.cjs.map +0 -1
  548. package/dist/src/services/lruCache/index.mjs +0 -64
  549. package/dist/src/services/lruCache/index.mjs.map +0 -1
  550. package/dist/src/services/managementActions/index.cjs +0 -147
  551. package/dist/src/services/managementActions/index.cjs.map +0 -1
  552. package/dist/src/services/managementActions/index.mjs +0 -147
  553. package/dist/src/services/managementActions/index.mjs.map +0 -1
  554. package/dist/src/services/mcpDirectToolAllowlist/index.cjs +0 -32
  555. package/dist/src/services/mcpDirectToolAllowlist/index.cjs.map +0 -1
  556. package/dist/src/services/mcpDirectToolAllowlist/index.mjs +0 -32
  557. package/dist/src/services/mcpDirectToolAllowlist/index.mjs.map +0 -1
  558. package/dist/src/services/mcpTools/index.cjs +0 -14
  559. package/dist/src/services/mcpTools/index.cjs.map +0 -1
  560. package/dist/src/services/mcpTools/index.mjs +0 -13
  561. package/dist/src/services/mcpTools/index.mjs.map +0 -1
  562. package/dist/src/services/modelFallback/index.cjs +0 -69
  563. package/dist/src/services/modelFallback/index.cjs.map +0 -1
  564. package/dist/src/services/modelFallback/index.mjs +0 -67
  565. package/dist/src/services/modelFallback/index.mjs.map +0 -1
  566. package/dist/src/services/modelInfo/index.cjs +0 -59
  567. package/dist/src/services/modelInfo/index.cjs.map +0 -1
  568. package/dist/src/services/modelInfo/index.mjs +0 -57
  569. package/dist/src/services/modelInfo/index.mjs.map +0 -1
  570. package/dist/src/services/modelResolution/index.cjs +0 -147
  571. package/dist/src/services/modelResolution/index.cjs.map +0 -1
  572. package/dist/src/services/modelResolution/index.mjs +0 -144
  573. package/dist/src/services/modelResolution/index.mjs.map +0 -1
  574. package/dist/src/services/modelScope/index.cjs +0 -47
  575. package/dist/src/services/modelScope/index.cjs.map +0 -1
  576. package/dist/src/services/modelScope/index.mjs +0 -46
  577. package/dist/src/services/modelScope/index.mjs.map +0 -1
  578. package/dist/src/services/nativeFleetTranscript/index.cjs +0 -87
  579. package/dist/src/services/nativeFleetTranscript/index.cjs.map +0 -1
  580. package/dist/src/services/nativeFleetTranscript/index.mjs +0 -87
  581. package/dist/src/services/nativeFleetTranscript/index.mjs.map +0 -1
  582. package/dist/src/services/nativeRunCoordinator/index.cjs +0 -137
  583. package/dist/src/services/nativeRunCoordinator/index.cjs.map +0 -1
  584. package/dist/src/services/nativeRunCoordinator/index.mjs +0 -137
  585. package/dist/src/services/nativeRunCoordinator/index.mjs.map +0 -1
  586. package/dist/src/services/nativeRunProjection/index.cjs +0 -49
  587. package/dist/src/services/nativeRunProjection/index.cjs.map +0 -1
  588. package/dist/src/services/nativeRunProjection/index.mjs +0 -48
  589. package/dist/src/services/nativeRunProjection/index.mjs.map +0 -1
  590. package/dist/src/services/nativeTeamChannel/index.cjs +0 -554
  591. package/dist/src/services/nativeTeamChannel/index.cjs.map +0 -1
  592. package/dist/src/services/nativeTeamChannel/index.d.cts.map +0 -1
  593. package/dist/src/services/nativeTeamChannel/index.d.mts +0 -51
  594. package/dist/src/services/nativeTeamChannel/index.d.mts.map +0 -1
  595. package/dist/src/services/nativeTeamChannel/index.mjs +0 -549
  596. package/dist/src/services/nativeTeamChannel/index.mjs.map +0 -1
  597. package/dist/src/services/notify/index.cjs +0 -318
  598. package/dist/src/services/notify/index.cjs.map +0 -1
  599. package/dist/src/services/notify/index.mjs +0 -313
  600. package/dist/src/services/notify/index.mjs.map +0 -1
  601. package/dist/src/services/operationJournal/index.cjs +0 -66
  602. package/dist/src/services/operationJournal/index.cjs.map +0 -1
  603. package/dist/src/services/operationJournal/index.mjs +0 -62
  604. package/dist/src/services/operationJournal/index.mjs.map +0 -1
  605. package/dist/src/services/orchestratorPrompt/index.cjs +0 -97
  606. package/dist/src/services/orchestratorPrompt/index.cjs.map +0 -1
  607. package/dist/src/services/orchestratorPrompt/index.mjs +0 -94
  608. package/dist/src/services/orchestratorPrompt/index.mjs.map +0 -1
  609. package/dist/src/services/pollScheduler/index.cjs +0 -199
  610. package/dist/src/services/pollScheduler/index.cjs.map +0 -1
  611. package/dist/src/services/pollScheduler/index.mjs +0 -199
  612. package/dist/src/services/pollScheduler/index.mjs.map +0 -1
  613. package/dist/src/services/runWithConcurrency/index.cjs +0 -49
  614. package/dist/src/services/runWithConcurrency/index.cjs.map +0 -1
  615. package/dist/src/services/runWithConcurrency/index.mjs +0 -49
  616. package/dist/src/services/runWithConcurrency/index.mjs.map +0 -1
  617. package/dist/src/services/runtimeRegistry/index.cjs +0 -92
  618. package/dist/src/services/runtimeRegistry/index.cjs.map +0 -1
  619. package/dist/src/services/runtimeRegistry/index.mjs +0 -89
  620. package/dist/src/services/runtimeRegistry/index.mjs.map +0 -1
  621. package/dist/src/services/sessionLifecycle/index.cjs +0 -50
  622. package/dist/src/services/sessionLifecycle/index.cjs.map +0 -1
  623. package/dist/src/services/sessionLifecycle/index.mjs +0 -49
  624. package/dist/src/services/sessionLifecycle/index.mjs.map +0 -1
  625. package/dist/src/services/sessionPaths/index.cjs +0 -136
  626. package/dist/src/services/sessionPaths/index.cjs.map +0 -1
  627. package/dist/src/services/sessionPaths/index.mjs +0 -121
  628. package/dist/src/services/sessionPaths/index.mjs.map +0 -1
  629. package/dist/src/services/spawnHandshake/index.cjs +0 -54
  630. package/dist/src/services/spawnHandshake/index.cjs.map +0 -1
  631. package/dist/src/services/spawnHandshake/index.mjs +0 -54
  632. package/dist/src/services/spawnHandshake/index.mjs.map +0 -1
  633. package/dist/src/services/spawnPlan/index.cjs +0 -678
  634. package/dist/src/services/spawnPlan/index.cjs.map +0 -1
  635. package/dist/src/services/spawnPlan/index.mjs +0 -672
  636. package/dist/src/services/spawnPlan/index.mjs.map +0 -1
  637. package/dist/src/services/spawnRequestMapping/index.cjs +0 -64
  638. package/dist/src/services/spawnRequestMapping/index.cjs.map +0 -1
  639. package/dist/src/services/spawnRequestMapping/index.mjs +0 -62
  640. package/dist/src/services/spawnRequestMapping/index.mjs.map +0 -1
  641. package/dist/src/services/statusViews/index.cjs +0 -87
  642. package/dist/src/services/statusViews/index.cjs.map +0 -1
  643. package/dist/src/services/statusViews/index.mjs +0 -86
  644. package/dist/src/services/statusViews/index.mjs.map +0 -1
  645. package/dist/src/services/statusWriter/index.cjs +0 -154
  646. package/dist/src/services/statusWriter/index.cjs.map +0 -1
  647. package/dist/src/services/statusWriter/index.mjs +0 -151
  648. package/dist/src/services/statusWriter/index.mjs.map +0 -1
  649. package/dist/src/services/subagentLaunch/index.cjs +0 -91
  650. package/dist/src/services/subagentLaunch/index.cjs.map +0 -1
  651. package/dist/src/services/subagentLaunch/index.mjs +0 -89
  652. package/dist/src/services/subagentLaunch/index.mjs.map +0 -1
  653. package/dist/src/services/subagentLaunchContract/index.cjs +0 -48
  654. package/dist/src/services/subagentLaunchContract/index.cjs.map +0 -1
  655. package/dist/src/services/subagentLaunchContract/index.d.cts +0 -28
  656. package/dist/src/services/subagentLaunchContract/index.d.cts.map +0 -1
  657. package/dist/src/services/subagentLaunchContract/index.d.mts +0 -28
  658. package/dist/src/services/subagentLaunchContract/index.d.mts.map +0 -1
  659. package/dist/src/services/subagentLaunchContract/index.mjs +0 -45
  660. package/dist/src/services/subagentLaunchContract/index.mjs.map +0 -1
  661. package/dist/src/services/subagentPolicyService/index.cjs +0 -41
  662. package/dist/src/services/subagentPolicyService/index.cjs.map +0 -1
  663. package/dist/src/services/subagentPolicyService/index.mjs +0 -41
  664. package/dist/src/services/subagentPolicyService/index.mjs.map +0 -1
  665. package/dist/src/services/subagentTool/index.cjs +0 -310
  666. package/dist/src/services/subagentTool/index.cjs.map +0 -1
  667. package/dist/src/services/subagentTool/index.mjs +0 -304
  668. package/dist/src/services/subagentTool/index.mjs.map +0 -1
  669. package/dist/src/services/subagentWait/index.cjs +0 -111
  670. package/dist/src/services/subagentWait/index.cjs.map +0 -1
  671. package/dist/src/services/subagentWait/index.mjs +0 -111
  672. package/dist/src/services/subagentWait/index.mjs.map +0 -1
  673. package/dist/src/services/suspendedRuns/index.cjs +0 -163
  674. package/dist/src/services/suspendedRuns/index.cjs.map +0 -1
  675. package/dist/src/services/suspendedRuns/index.mjs +0 -153
  676. package/dist/src/services/suspendedRuns/index.mjs.map +0 -1
  677. package/dist/src/services/teamCollaboration/index.cjs +0 -109
  678. package/dist/src/services/teamCollaboration/index.cjs.map +0 -1
  679. package/dist/src/services/teamCollaboration/index.mjs +0 -108
  680. package/dist/src/services/teamCollaboration/index.mjs.map +0 -1
  681. package/dist/src/services/teamRuntime/index.cjs +0 -106
  682. package/dist/src/services/teamRuntime/index.cjs.map +0 -1
  683. package/dist/src/services/teamRuntime/index.mjs +0 -106
  684. package/dist/src/services/teamRuntime/index.mjs.map +0 -1
  685. package/dist/src/services/teamSnapshot/index.cjs.map +0 -1
  686. package/dist/src/services/teamSnapshot/index.d.cts +0 -10
  687. package/dist/src/services/teamSnapshot/index.d.cts.map +0 -1
  688. package/dist/src/services/teamSnapshot/index.d.mts +0 -10
  689. package/dist/src/services/teamSnapshot/index.d.mts.map +0 -1
  690. package/dist/src/services/teamSnapshot/index.mjs.map +0 -1
  691. package/dist/src/services/toolDescription/index.cjs +0 -23
  692. package/dist/src/services/toolDescription/index.cjs.map +0 -1
  693. package/dist/src/services/toolDescription/index.mjs +0 -23
  694. package/dist/src/services/toolDescription/index.mjs.map +0 -1
  695. package/dist/src/services/versioned/index.cjs +0 -33
  696. package/dist/src/services/versioned/index.cjs.map +0 -1
  697. package/dist/src/services/versioned/index.mjs +0 -33
  698. package/dist/src/services/versioned/index.mjs.map +0 -1
  699. package/dist/src/services/webSubagentCatalog/index.cjs +0 -44
  700. package/dist/src/services/webSubagentCatalog/index.cjs.map +0 -1
  701. package/dist/src/services/webSubagentCatalog/index.mjs +0 -42
  702. package/dist/src/services/webSubagentCatalog/index.mjs.map +0 -1
  703. package/dist/src/types/agent.d.cts +0 -119
  704. package/dist/src/types/agent.d.cts.map +0 -1
  705. package/dist/src/types/agent.d.mts +0 -119
  706. package/dist/src/types/agent.d.mts.map +0 -1
  707. package/dist/src/types/environment.cjs +0 -133
  708. package/dist/src/types/environment.cjs.map +0 -1
  709. package/dist/src/types/environment.d.cts +0 -63
  710. package/dist/src/types/environment.d.cts.map +0 -1
  711. package/dist/src/types/environment.d.mts +0 -63
  712. package/dist/src/types/environment.d.mts.map +0 -1
  713. package/dist/src/types/environment.mjs.map +0 -1
  714. package/dist/src/types/index.d.cts +0 -16
  715. package/dist/src/types/index.d.cts.map +0 -1
  716. package/dist/src/types/index.d.mts +0 -16
  717. package/dist/src/types/index.d.mts.map +0 -1
  718. package/dist/src/types/webSubagents.cjs +0 -8
  719. package/dist/src/types/webSubagents.cjs.map +0 -1
  720. package/dist/src/types/webSubagents.mjs +0 -7
  721. package/dist/src/types/webSubagents.mjs.map +0 -1
  722. package/dist/subagent-policy.d.cts +0 -2
  723. package/dist/subagent-policy.d.mts +0 -2
  724. package/dist/subagent-policy.mjs +0 -2
  725. package/dist/subagent-tool.d.cts +0 -2
  726. package/dist/subagent-tool.d.mts +0 -2
  727. package/dist/subagent-tool.mjs +0 -2
  728. package/dist/team-snapshot.cjs +0 -4
  729. package/dist/team-snapshot.d.cts +0 -2
  730. package/dist/team-snapshot.d.mts +0 -2
  731. package/dist/team-snapshot.mjs +0 -2
  732. /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
  733. /package/dist/{delegation-api.cjs → delegationApi.cjs} +0 -0
  734. /package/dist/{delegation-api.d.cts → delegationApi.d.mts} +0 -0
  735. /package/dist/{delegation-api.mjs → delegationApi.mjs} +0 -0
@@ -0,0 +1,1643 @@
1
+ const require_atomicJson = require("./atomicJson-D0346bt5.cjs");
2
+ let node_fs = require("node:fs");
3
+ node_fs = require_atomicJson.__toESM(node_fs, 1);
4
+ let node_path = require("node:path");
5
+ node_path = require_atomicJson.__toESM(node_path, 1);
6
+ let _agimon_ai_doompi_config = require("@agimon-ai/doompi-config");
7
+ let node_os = require("node:os");
8
+ node_os = require_atomicJson.__toESM(node_os, 1);
9
+ //#region src/schemas/team/packageConfig.ts
10
+ const DOOMPI_TEAM_PACKAGE = "@agimon-ai/doompi-team";
11
+ const TEAM_CONFIG_KEYS = ["models", "excludeTools"];
12
+ const TEAM_MODEL_KEYS = ["model", "thinking"];
13
+ const THINKING_VALUES = /* @__PURE__ */ new Set([
14
+ "off",
15
+ "minimal",
16
+ "low",
17
+ "medium",
18
+ "high",
19
+ "xhigh",
20
+ "max"
21
+ ]);
22
+ function isRecord(value) {
23
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24
+ }
25
+ function assertKnownKeys(value, keys, location) {
26
+ const unsupported = Object.keys(value).filter((key) => !keys.includes(key));
27
+ if (unsupported.length > 0) throw new Error(`${location} has unsupported field(s): ${unsupported.join(", ")}`);
28
+ }
29
+ /** Validate and normalize one Team-owned package configuration mapping. */
30
+ function parseTeamPackageConfig(value, location) {
31
+ if (!isRecord(value)) throw new Error(`${location} must be a mapping`);
32
+ assertKnownKeys(value, TEAM_CONFIG_KEYS, location);
33
+ const hasModels = Object.hasOwn(value, "models");
34
+ const hasExcludeTools = Object.hasOwn(value, "excludeTools");
35
+ if (!hasModels && !hasExcludeTools) throw new Error(`${location} must define models or excludeTools`);
36
+ let models;
37
+ if (hasModels) {
38
+ if (!Array.isArray(value.models) || value.models.length === 0) throw new Error(`${location}.models must be a non-empty array`);
39
+ models = value.models.map((entry, index) => {
40
+ const entryLocation = `${location}.models[${index}]`;
41
+ if (!isRecord(entry)) throw new Error(`${entryLocation} must be a mapping`);
42
+ assertKnownKeys(entry, TEAM_MODEL_KEYS, entryLocation);
43
+ if (typeof entry.model !== "string" || !entry.model.trim()) throw new Error(`${entryLocation}.model must be a non-empty string`);
44
+ if (entry.thinking !== void 0 && (typeof entry.thinking !== "string" || !THINKING_VALUES.has(entry.thinking))) throw new Error(`${entryLocation}.thinking must be one of: ${[...THINKING_VALUES].join(", ")}`);
45
+ return {
46
+ model: entry.model.trim(),
47
+ ...entry.thinking ? { thinking: entry.thinking } : {}
48
+ };
49
+ });
50
+ }
51
+ let excludeTools;
52
+ if (hasExcludeTools) {
53
+ if (!Array.isArray(value.excludeTools) || value.excludeTools.length === 0) throw new Error(`${location}.excludeTools must be a non-empty array`);
54
+ excludeTools = [...new Set(value.excludeTools.map((entry, index) => {
55
+ if (typeof entry !== "string" || !entry.trim()) throw new Error(`${location}.excludeTools[${index}] must be a non-empty string`);
56
+ return entry.trim();
57
+ }))];
58
+ }
59
+ return {
60
+ ...models ? { models } : {},
61
+ ...excludeTools ? { excludeTools } : {}
62
+ };
63
+ }
64
+ /** Merge Team configurations contributed by selected layers in selection order. */
65
+ function mergeTeamPackageConfigurations(entries) {
66
+ let models;
67
+ const excludeTools = /* @__PURE__ */ new Set();
68
+ let hasExcludeTools = false;
69
+ for (const entry of entries) {
70
+ const location = `Package "${entry.specifier}" config in layer "${entry.layer}" of .doom/modes.yaml`;
71
+ const next = parseTeamPackageConfig(entry.config, location);
72
+ if (next.models) models = next.models.map((model) => ({ ...model }));
73
+ if (next.excludeTools) {
74
+ hasExcludeTools = true;
75
+ for (const tool of next.excludeTools) excludeTools.add(tool);
76
+ }
77
+ }
78
+ if (!models && !hasExcludeTools) return void 0;
79
+ return {
80
+ ...models ? { models } : {},
81
+ ...hasExcludeTools ? { excludeTools: [...excludeTools] } : {}
82
+ };
83
+ }
84
+ //#endregion
85
+ //#region src/services/agentFrontmatter/index.ts
86
+ /**
87
+ * Parsing the YAML frontmatter block at the head of an agent or chain file.
88
+ *
89
+ * This is a deliberately partial YAML reader, not a call into a YAML library.
90
+ * The block is read once, keys are kept as raw strings, and each consumer
91
+ * interprets its own key. That is what lets an unrecognised key survive a
92
+ * read/write round-trip: the loader copies it into `extraFields` verbatim
93
+ * instead of losing it to a typed parse.
94
+ *
95
+ * DESIGN PATTERNS:
96
+ * - Nested and folded blocks are captured as one string with newlines intact.
97
+ * A consumer that wants structure re-parses that string with a real YAML
98
+ * parser, so structural validation stays with the field that needs it
99
+ * - Common leading whitespace is stripped from a block, so a serializer can
100
+ * re-indent to its own level without the original indent accumulating
101
+ *
102
+ * AVOID:
103
+ * - Growing this into a general YAML parser; hand a block value to `yaml`
104
+ * instead
105
+ * - Interpreting field semantics here
106
+ */
107
+ const OPENING_FENCE = "---";
108
+ /** Length of the opening `---` fence, before the newline that follows it. */
109
+ const FENCE_LENGTH = 3;
110
+ /** Length of the fence plus its trailing newline, used to slice past it. */
111
+ const FENCE_WITH_NEWLINE_LENGTH = 4;
112
+ /** Offset of the first frontmatter character: past `---\n`. */
113
+ const FRONTMATTER_START_INDEX = FENCE_WITH_NEWLINE_LENGTH;
114
+ /** The closing fence as it appears mid-document, searched from after the opener. */
115
+ const CLOSING_FENCE = "\n---";
116
+ const FOLDED_BLOCK_INDICATORS = /* @__PURE__ */ new Set([">", ">-"]);
117
+ /** Escape regex metacharacters so a literal string can be used in a RegExp. */
118
+ function escapeRegex(value) {
119
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
120
+ }
121
+ /**
122
+ * Fold a YAML folded block scalar.
123
+ *
124
+ * Folding joins lines with a space, except that more-indented lines and blank
125
+ * separators are structural in YAML and must survive as real newlines. Getting
126
+ * this wrong silently reflows a user's prompt, so the two cases are tracked
127
+ * explicitly rather than approximated by a global replace.
128
+ */
129
+ function foldBlock(block) {
130
+ let folded = "";
131
+ let hasContent = false;
132
+ let previousIsMoreIndented = false;
133
+ let blankLines = 0;
134
+ for (const line of block.split("\n")) {
135
+ const current = line.trimEnd();
136
+ if (current.trim() === "") {
137
+ if (hasContent) blankLines++;
138
+ continue;
139
+ }
140
+ const currentIsMoreIndented = current.length > current.trimStart().length;
141
+ if (hasContent) {
142
+ if (blankLines > 0) folded += "\n".repeat(blankLines + (previousIsMoreIndented || currentIsMoreIndented ? 1 : 0));
143
+ else folded += previousIsMoreIndented || currentIsMoreIndented ? "\n" : " ";
144
+ }
145
+ folded += current;
146
+ hasContent = true;
147
+ previousIsMoreIndented = currentIsMoreIndented;
148
+ blankLines = 0;
149
+ }
150
+ return folded.trim();
151
+ }
152
+ /**
153
+ * Read a list-valued field written either comma-separated or as a block list.
154
+ *
155
+ * Only a leading `- ` marker is treated as a list bullet. A bare hyphen inside
156
+ * a value is left alone, so hyphenated names like `context-builder` survive.
157
+ */
158
+ function parseFrontmatterList(raw) {
159
+ if (raw === void 0) return void 0;
160
+ return raw.split("\n").flatMap((line) => {
161
+ const value = line.trim();
162
+ return (value.match(/^-\s+(.+)$/)?.[1] ?? value).split(",");
163
+ }).map((value) => value.trim()).filter(Boolean);
164
+ }
165
+ /** Strip the block's common leading whitespace so it can be re-indented later. */
166
+ function dedentBlock(blockLines) {
167
+ const rawBlock = blockLines.join("\n");
168
+ const prefix = rawBlock.match(/^[ \t]+(?=\S)/m)?.[0] ?? "";
169
+ if (!prefix) return rawBlock;
170
+ return rawBlock.replace(new RegExp(`^${escapeRegex(prefix)}`, "gm"), "").replace(/^\n/, "");
171
+ }
172
+ /**
173
+ * Split a file into its frontmatter map and its body.
174
+ *
175
+ * A file with no opening fence, or with an unterminated one, is treated as all
176
+ * body with empty frontmatter. The loader then rejects it for want of a name,
177
+ * which is the right outcome: a malformed file should be skipped, not crash a
178
+ * directory sweep.
179
+ */
180
+ function parseFrontmatter(content) {
181
+ const frontmatter = {};
182
+ const normalized = content.replace(/\r\n/g, "\n");
183
+ if (!normalized.startsWith(OPENING_FENCE)) return {
184
+ frontmatter,
185
+ body: normalized
186
+ };
187
+ const endIndex = normalized.indexOf(CLOSING_FENCE, FENCE_LENGTH);
188
+ if (endIndex === -1) return {
189
+ frontmatter,
190
+ body: normalized
191
+ };
192
+ const frontmatterBlock = normalized.slice(FRONTMATTER_START_INDEX, endIndex);
193
+ const body = normalized.slice(endIndex + FENCE_WITH_NEWLINE_LENGTH).trim();
194
+ let currentKey = null;
195
+ let currentBlockLines = null;
196
+ let currentIndent = null;
197
+ let currentFolded = false;
198
+ const flushBlock = () => {
199
+ if (currentKey === null || currentBlockLines === null) return;
200
+ const stripped = dedentBlock(currentBlockLines);
201
+ frontmatter[currentKey] = currentFolded ? foldBlock(stripped) : stripped;
202
+ currentKey = null;
203
+ currentBlockLines = null;
204
+ currentIndent = null;
205
+ currentFolded = false;
206
+ };
207
+ for (const line of frontmatterBlock.split("\n")) {
208
+ const indent = line.search(/\S|$/);
209
+ const trimmed = line.trim();
210
+ if (currentKey !== null && currentBlockLines !== null && (indent > (currentIndent ?? 0) || currentFolded && trimmed === "")) {
211
+ currentBlockLines.push(line);
212
+ continue;
213
+ }
214
+ flushBlock();
215
+ const match = line.match(/^([\w-]+):\s*(.*)$/);
216
+ if (!match) continue;
217
+ const key = match[1] ?? "";
218
+ const rawValue = (match[2] ?? "").trim();
219
+ const isQuoted = rawValue.startsWith("\"") && rawValue.endsWith("\"") || rawValue.startsWith("'") && rawValue.endsWith("'");
220
+ const value = isQuoted ? rawValue.slice(1, -1) : rawValue;
221
+ const isFolded = !isQuoted && FOLDED_BLOCK_INDICATORS.has(rawValue);
222
+ if (value === "" || isFolded) {
223
+ currentKey = key;
224
+ currentBlockLines = [];
225
+ currentIndent = indent;
226
+ currentFolded = isFolded;
227
+ } else frontmatter[key] = value;
228
+ }
229
+ flushBlock();
230
+ return {
231
+ frontmatter,
232
+ body
233
+ };
234
+ }
235
+ //#endregion
236
+ //#region src/services/configDir/index.ts
237
+ /**
238
+ * Locating the coding agent's config directory.
239
+ *
240
+ * The directory is normally `.pi`, but a rebranded build of the coding agent
241
+ * can rename it, so the real name is discovered from the running installation
242
+ * rather than assumed. Discovery order runs from most to least authoritative:
243
+ * the loaded module's own export, then an explicitly configured package root,
244
+ * then a walk upward from the process entry point, then the default.
245
+ *
246
+ * DESIGN PATTERNS:
247
+ * - Resolution is a pure function of its inputs; the process-wide convenience
248
+ * wrapper is a separate, memoized entry point
249
+ * - Every discovery step is best-effort. A detached runner must still start
250
+ * when package metadata is unreadable, so failures fall through to the default
251
+ *
252
+ * PERFORMANCE:
253
+ * `getConfigDirName` is memoized because the uncached path walks from the entry
254
+ * point to the filesystem root, reading and parsing a package.json per level.
255
+ * Callers join it into paths, so it was previously re-walked per path built.
256
+ *
257
+ * AVOID:
258
+ * - Hardcoding `.pi` at a call site
259
+ * - Calling the uncached resolver on a hot path
260
+ */
261
+ const DEFAULT_CONFIG_DIR_NAME = ".pi";
262
+ const PI_CODING_AGENT_PACKAGE_NAME = "@earendil-works/pi-coding-agent";
263
+ const AGENT_DIR_NAME = "agent";
264
+ const HOME_ALIAS = "~";
265
+ const HOME_ALIAS_PREFIX = "~/";
266
+ /** Overrides the upward package walk when the installation root is known. */
267
+ const PI_CODING_AGENT_PACKAGE_ROOT_ENV = "PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";
268
+ function validConfigDirName(value) {
269
+ return typeof value === "string" && value.trim() ? value : void 0;
270
+ }
271
+ /** Read the config dir name from a directory, if it is the coding agent's package root. */
272
+ function readConfigDirNameFromPackageRoot(packageRoot) {
273
+ if (!packageRoot) return void 0;
274
+ try {
275
+ const manifest = JSON.parse(node_fs.readFileSync(node_path.join(packageRoot, "package.json"), "utf-8"));
276
+ if (typeof manifest !== "object" || manifest === null) return void 0;
277
+ const record = manifest;
278
+ if (record.name !== PI_CODING_AGENT_PACKAGE_NAME) return void 0;
279
+ return validConfigDirName((typeof record.piConfig === "object" && record.piConfig !== null ? record.piConfig : void 0)?.configDir);
280
+ } catch {
281
+ return;
282
+ }
283
+ }
284
+ function resolveConfigDirNameFromPackageJson(entryPoint = process.argv[1], packageRoot = process.env[PI_CODING_AGENT_PACKAGE_ROOT_ENV]) {
285
+ const configuredRootValue = readConfigDirNameFromPackageRoot(packageRoot);
286
+ if (configuredRootValue) return configuredRootValue;
287
+ if (!entryPoint) return void 0;
288
+ try {
289
+ let dir = node_path.dirname(node_fs.realpathSync(entryPoint));
290
+ while (dir !== node_path.dirname(dir)) {
291
+ const value = readConfigDirNameFromPackageRoot(dir);
292
+ if (value) return value;
293
+ dir = node_path.dirname(dir);
294
+ }
295
+ } catch {}
296
+ }
297
+ /**
298
+ * Resolve the config directory name from explicit inputs.
299
+ *
300
+ * Pure with respect to its arguments, which is what makes it testable; the
301
+ * process-wide answer comes from `getConfigDirName`.
302
+ */
303
+ function resolveConfigDirName(codingAgentModule, entryPoint, packageRoot) {
304
+ return (codingAgentModule && typeof codingAgentModule === "object" ? validConfigDirName(codingAgentModule.CONFIG_DIR_NAME) : void 0) ?? resolveConfigDirNameFromPackageJson(entryPoint, packageRoot) ?? DEFAULT_CONFIG_DIR_NAME;
305
+ }
306
+ let memoizedConfigDirName;
307
+ /** The config directory name for this process. Resolved once, then reused. */
308
+ function getConfigDirName(environment = process.env) {
309
+ if (environment !== process.env) return resolveConfigDirName(void 0, process.argv[1], environment["PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT"] ?? "");
310
+ memoizedConfigDirName ??= resolveConfigDirName();
311
+ return memoizedConfigDirName;
312
+ }
313
+ /** The project-local config directory, for example `<projectRoot>/.pi`. */
314
+ function getProjectConfigDir(projectRoot, environment = process.env) {
315
+ return node_path.join(projectRoot, getConfigDirName(environment));
316
+ }
317
+ /** Read a JSON settings file as an object, retaining strict path-specific errors. */
318
+ function readSettingsFileStrict(filePath) {
319
+ if (!node_fs.existsSync(filePath)) return {};
320
+ let raw;
321
+ try {
322
+ raw = node_fs.readFileSync(filePath, "utf-8");
323
+ } catch (error) {
324
+ const message = error instanceof Error ? error.message : String(error);
325
+ throw new Error(`Failed to read settings file '${filePath}': ${message}`, { cause: error });
326
+ }
327
+ let parsed;
328
+ try {
329
+ parsed = JSON.parse(raw);
330
+ } catch (error) {
331
+ const message = error instanceof Error ? error.message : String(error);
332
+ throw new Error(`Failed to parse settings file '${filePath}': ${message}`, { cause: error });
333
+ }
334
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error(`Settings file '${filePath}' must contain a JSON object.`);
335
+ return parsed;
336
+ }
337
+ /** The user-level agent directory, honouring `~` expansion in the override. */
338
+ function getAgentDir(environment = process.env) {
339
+ const configured = environment.PI_CODING_AGENT_DIR;
340
+ const homeDirectory = environment.HOME ?? node_os.homedir();
341
+ if (configured === HOME_ALIAS) return homeDirectory;
342
+ if (configured?.startsWith(HOME_ALIAS_PREFIX)) return node_path.join(homeDirectory, configured.slice(2));
343
+ return configured || node_path.join(homeDirectory, getConfigDirName(environment), AGENT_DIR_NAME);
344
+ }
345
+ //#endregion
346
+ //#region src/services/agentProjectRoot/index.ts
347
+ /**
348
+ * Locating the project root that agent configuration hangs off.
349
+ *
350
+ * A project root is any ancestor of the working directory that carries a config
351
+ * directory or a legacy `.agents` directory. There can be several: a package
352
+ * inside a monorepo and the monorepo itself both qualify. Which one wins is a
353
+ * setting, because both answers are legitimate. Teams that keep one shared set
354
+ * of agents at the repository root want `git-root`, teams that give each package
355
+ * its own want `nearest`, and neither can be inferred from the tree alone.
356
+ *
357
+ * DESIGN PATTERNS:
358
+ * - Candidates are collected once, nearest first, then a policy picks from them.
359
+ * Separating collection from policy is what lets `git-root` be answered
360
+ * without a second walk
361
+ * - Path derivation goes through `shared/configDir.ts`, so a rebranded build
362
+ * that renames its config directory needs no change here
363
+ *
364
+ * AVOID:
365
+ * - Hardcoding the config directory name; it is discovered, not assumed
366
+ * - Treating the nearest candidate as the project root without reading the
367
+ * setting first
368
+ */
369
+ const SETTINGS_FILE_NAME = "settings.json";
370
+ const GIT_DIR_NAME$1 = ".git";
371
+ /**
372
+ * Bare `.agents`. Two roles, one name: under a project root it is the legacy
373
+ * location that predates the config directory, under the home directory it is
374
+ * the current one. Both are read.
375
+ */
376
+ const DOT_AGENTS_DIR_NAME = ".agents";
377
+ /** Agents inside a config directory, project-level or user-level. */
378
+ const AGENTS_DIR_NAME = "agents";
379
+ const SUBAGENTS_SETTINGS_KEY$1 = "subagents";
380
+ const PROJECT_ROOT_RESOLUTION_KEY = "projectRootResolution";
381
+ /** Stable cache identity for equivalent absolute, relative, and symlinked cwd spellings. */
382
+ function canonicalizeDiscoveryCwd(cwd) {
383
+ const resolved = node_path.resolve(cwd);
384
+ try {
385
+ return node_fs.realpathSync.native(resolved);
386
+ } catch {
387
+ return resolved;
388
+ }
389
+ }
390
+ /** Whether a path exists and is a directory. Any failure reads as "no". */
391
+ function isDirectory$1(dirPath) {
392
+ try {
393
+ return node_fs.statSync(dirPath).isDirectory();
394
+ } catch {
395
+ return false;
396
+ }
397
+ }
398
+ /** True when `dir` carries either marker that makes it a project root. */
399
+ function isProjectRootCandidate(dir, environment = process.env) {
400
+ return isDirectory$1(getProjectConfigDir(dir, environment)) || isDirectory$1(node_path.join(dir, DOT_AGENTS_DIR_NAME));
401
+ }
402
+ /** Every project root above `cwd`, nearest first. */
403
+ function findProjectRootCandidates(cwd, environment = process.env) {
404
+ const roots = [];
405
+ let currentDir = cwd;
406
+ while (true) {
407
+ if (isProjectRootCandidate(currentDir, environment)) roots.push(currentDir);
408
+ const parentDir = node_path.dirname(currentDir);
409
+ if (parentDir === currentDir) return roots;
410
+ currentDir = parentDir;
411
+ }
412
+ }
413
+ /**
414
+ * Nearest ancestor containing `.git`.
415
+ *
416
+ * Existence is enough: a worktree or submodule has a `.git` file rather than a
417
+ * directory, and both are real repository roots.
418
+ */
419
+ function findNearestGitRoot(cwd) {
420
+ let currentDir = cwd;
421
+ while (true) {
422
+ if (node_fs.existsSync(node_path.join(currentDir, GIT_DIR_NAME$1))) return currentDir;
423
+ const parentDir = node_path.dirname(currentDir);
424
+ if (parentDir === currentDir) return null;
425
+ currentDir = parentDir;
426
+ }
427
+ }
428
+ /**
429
+ * Read a candidate's declared resolution policy.
430
+ *
431
+ * Deliberately throws on an unrecognised value rather than falling back: a typo
432
+ * here silently changes which agents the whole session sees.
433
+ */
434
+ function readProjectRootResolution(projectRoot, environment = process.env) {
435
+ const settingsPath = node_path.join(getProjectConfigDir(projectRoot, environment), SETTINGS_FILE_NAME);
436
+ if (!node_fs.existsSync(settingsPath)) return void 0;
437
+ const subagents = readSettingsFileStrict(settingsPath)[SUBAGENTS_SETTINGS_KEY$1];
438
+ if (!subagents || typeof subagents !== "object" || Array.isArray(subagents)) return void 0;
439
+ const value = subagents[PROJECT_ROOT_RESOLUTION_KEY];
440
+ if (value === void 0) return void 0;
441
+ if (value === "nearest" || value === "git-root") return value;
442
+ throw new Error(`Subagent settings in '${settingsPath}' have invalid '${PROJECT_ROOT_RESOLUTION_KEY}'; expected 'nearest' or 'git-root'.`);
443
+ }
444
+ /**
445
+ * The project root to use, honouring the resolution policy.
446
+ *
447
+ * The policy is read from the nearest candidate first so a package can opt out
448
+ * of its monorepo's shared agents, and from the git root second so a repository
449
+ * can claim its packages without editing each one.
450
+ */
451
+ function findConfiguredProjectRoot(cwd, environment = process.env) {
452
+ const candidates = findProjectRootCandidates(cwd, environment);
453
+ const nearestRoot = candidates[0];
454
+ if (!nearestRoot) return null;
455
+ const nearestMode = readProjectRootResolution(nearestRoot, environment);
456
+ if (nearestMode === "nearest") return nearestRoot;
457
+ const gitRoot = findNearestGitRoot(cwd);
458
+ const gitProjectRoot = gitRoot ? candidates.find((candidate) => node_path.resolve(candidate) === node_path.resolve(gitRoot)) : void 0;
459
+ if (gitProjectRoot && (nearestMode === "git-root" || readProjectRootResolution(gitProjectRoot, environment) === "git-root")) return gitProjectRoot;
460
+ return nearestRoot;
461
+ }
462
+ /**
463
+ * User-level agent directories, in load order.
464
+ *
465
+ * Two locations, not one: agents used to live in the config directory and now
466
+ * also live in `~/.agents`, and both are still read so an existing setup keeps
467
+ * working after the move. Returned unfiltered because the caller reads each
468
+ * directory anyway and a missing one costs nothing.
469
+ */
470
+ function userAgentDirs(environment = process.env) {
471
+ return [node_path.join(getAgentDir(environment), AGENTS_DIR_NAME), node_path.join(environment.HOME ?? node_os.homedir(), DOT_AGENTS_DIR_NAME)];
472
+ }
473
+ /** The user-level settings file. Always resolvable, unlike the project one. */
474
+ function getUserAgentSettingsPath(environment = process.env) {
475
+ return node_path.join(getAgentDir(environment), SETTINGS_FILE_NAME);
476
+ }
477
+ /** The project settings file, or null when `cwd` sits under no project root. */
478
+ function getProjectAgentSettingsPath(cwd, environment = process.env) {
479
+ const projectRoot = findConfiguredProjectRoot(cwd, environment);
480
+ return projectRoot ? node_path.join(getProjectConfigDir(projectRoot, environment), SETTINGS_FILE_NAME) : null;
481
+ }
482
+ /**
483
+ * Project agent directories for `cwd`.
484
+ *
485
+ * `readDirs` holds only directories that exist, so discovery never stats twice,
486
+ * and lists the legacy location first so a project mid-migration still resolves.
487
+ * `preferredDir` is where a newly created agent should be written, and is
488
+ * returned whether or not it exists yet.
489
+ */
490
+ function resolveNearestProjectAgentDirs(cwd, environment = process.env) {
491
+ const projectRoot = findConfiguredProjectRoot(cwd, environment);
492
+ if (!projectRoot) return {
493
+ readDirs: [],
494
+ preferredDir: null
495
+ };
496
+ const legacyDir = node_path.join(projectRoot, DOT_AGENTS_DIR_NAME);
497
+ const preferredDir = node_path.join(getProjectConfigDir(projectRoot, environment), AGENTS_DIR_NAME);
498
+ const readDirs = [];
499
+ if (isDirectory$1(legacyDir)) readDirs.push(legacyDir);
500
+ if (isDirectory$1(preferredDir)) readDirs.push(preferredDir);
501
+ return {
502
+ readDirs,
503
+ preferredDir
504
+ };
505
+ }
506
+ //#endregion
507
+ //#region src/services/agentMemory/index.ts
508
+ /**
509
+ * Per-agent persistent memory, injected into a child system prompt.
510
+ *
511
+ * An agent may opt into a durable, role-specific memory scope via its `memory`
512
+ * frontmatter. The opening lines of a `MEMORY.md` in the resolved directory are
513
+ * injected so a recurring custom agent can recall accumulated role notes:
514
+ * threat models, gotchas, verified commands, decisions. An agent with no write
515
+ * tools gets a read-only variant of the block instead.
516
+ *
517
+ * DESIGN PATTERNS:
518
+ * - The directory is derived from the agent's name, never from a user-supplied
519
+ * path, so no agent can name its way into another agent's notes
520
+ * - The file is opened once with O_NOFOLLOW and every subsequent check runs on
521
+ * that descriptor, so a symlink swapped in after the check cannot be followed
522
+ * - Reads are capped in both lines and bytes, and stop early. A memory file that
523
+ * grew unbounded must not be able to consume the child's whole context window
524
+ * - Every containment failure degrades to no injection. A prompt with no memory
525
+ * is correct; a prompt pointed at an unverified path is not
526
+ *
527
+ * WHY THE DIRECTORY IS NAMESPACED:
528
+ * Memory lives under a dedicated `agent-memory/` subdirectory so it can never
529
+ * collide with the coding agent's own `memory/{project}/` tree.
530
+ *
531
+ * AVOID:
532
+ * - Injecting memory contents without the boundary instruction; the file is data
533
+ * a previous run wrote, and a prompt-injection payload could have landed in it
534
+ * - Re-stat'ing by path between the open and the read
535
+ */
536
+ /** Tools that let an agent append to its own memory file. */
537
+ const WRITE_TOOLS = /* @__PURE__ */ new Set([
538
+ "edit",
539
+ "write",
540
+ "bash"
541
+ ]);
542
+ function unquoteFrontmatterValue(value) {
543
+ const trimmed = value.trim();
544
+ if (trimmed.startsWith("\"") && trimmed.endsWith("\"") || trimmed.startsWith("'") && trimmed.endsWith("'")) return trimmed.slice(1, -1);
545
+ return trimmed;
546
+ }
547
+ function parseMemoryScope(value) {
548
+ return value === "project" || value === "user" ? value : void 0;
549
+ }
550
+ function parseMemoryBoolean(value) {
551
+ if (value === "true") return true;
552
+ if (value === "false") return false;
553
+ }
554
+ function parsePositiveInteger(value) {
555
+ if (value === void 0) return void 0;
556
+ const parsed = Number(value);
557
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : void 0;
558
+ }
559
+ /** Split a `memory` frontmatter block into key/value pairs, either spelling. */
560
+ function readMemoryEntries(raw) {
561
+ const entries = /* @__PURE__ */ new Map();
562
+ const inlineObject = raw.trim().match(/^\{(.*)\}$/s);
563
+ const parts = inlineObject?.[1] !== void 0 ? inlineObject[1].split(",") : raw.split("\n");
564
+ for (const part of parts) {
565
+ const match = part.trim().match(/^([\w-]+)\s*:\s*(.*)$/);
566
+ if (!match?.[1] || match[2] === void 0) continue;
567
+ entries.set(match[1], unquoteFrontmatterValue(match[2]));
568
+ }
569
+ return entries;
570
+ }
571
+ /**
572
+ * Parse a `memory` frontmatter block, or undefined when it declares nothing.
573
+ *
574
+ * Accepts both the inline `{ scope: project }` form and the indented block form,
575
+ * because agent files in the wild use each.
576
+ */
577
+ function parseMemoryFrontmatter(raw) {
578
+ if (!raw) return void 0;
579
+ const entries = readMemoryEntries(raw);
580
+ const enabled = parseMemoryBoolean(entries.get("enabled"));
581
+ const scope = parseMemoryScope(entries.get("scope"));
582
+ const maxEntries = parsePositiveInteger(entries.get("maxEntries"));
583
+ if (enabled === void 0 && scope === void 0 && maxEntries === void 0) return void 0;
584
+ const config = {};
585
+ if (enabled !== void 0) config.enabled = enabled;
586
+ if (scope !== void 0) config.scope = scope;
587
+ if (maxEntries !== void 0) config.maxEntries = maxEntries;
588
+ return config;
589
+ }
590
+ /** Whether an agent can write files this run. An unset `tools` inherits the builtins. */
591
+ function agentHasWriteTools(agent) {
592
+ const tools = agent.tools;
593
+ if (!tools) return true;
594
+ return tools.some((tool) => WRITE_TOOLS.has(tool));
595
+ }
596
+ //#endregion
597
+ //#region src/services/agentSettings/index.ts
598
+ /**
599
+ * Agent settings: reading them, and applying what they say to discovered agents.
600
+ *
601
+ * Two things live here because they are the same contract seen from both ends.
602
+ * Reading turns untyped JSON on disk into settings; applying folds those
603
+ * settings over the agents discovery found. The precedence is fixed: project
604
+ * settings beat user settings, an explicit per-agent override beats a bulk
605
+ * switch, and for a custom agent the agent's own frontmatter beats both.
606
+ *
607
+ * That last rule is why builtins and custom agents take different paths.
608
+ * Overriding a builtin replaces values outright, because a builtin has no file
609
+ * the user could have edited instead. Overriding a custom agent only fills
610
+ * fields its frontmatter left unset, so a settings default never silently
611
+ * contradicts what the author wrote in the file.
612
+ *
613
+ * DESIGN PATTERNS:
614
+ * - Reading is strict and throws with the offending path and field. A settings
615
+ * file that is quietly half-ignored is worse than one that refuses to load,
616
+ * because the user sees agents behaving in ways their config does not explain
617
+ * - Applying is pure and copy-on-write. Every `apply*` returns new configs and
618
+ * never mutates its input, so a cached discovery result cannot be corrupted
619
+ * by a later pass over it
620
+ * - Overriding a builtin snapshots the values it replaced into `override.base`,
621
+ * which is what makes removing the override restore the builtin exactly
622
+ *
623
+ * AVOID:
624
+ * - Trusting any shape read off disk without a real guard
625
+ * - Mutating an `AgentConfig` in place
626
+ * - Writing a settings file non-atomically; it holds the user's overrides
627
+ */
628
+ const SUBAGENTS_SETTINGS_KEY = "subagents";
629
+ const AGENT_OVERRIDES_KEY = "agentOverrides";
630
+ /** Prefix marking a tool the child calls on an MCP server directly. */
631
+ const MCP_DIRECT_TOOL_PREFIX = "mcp:";
632
+ /**
633
+ * Returned whenever there is nothing to read.
634
+ *
635
+ * Shared rather than freshly built per call because it is returned on the hot
636
+ * discovery path for every session with no project settings file.
637
+ */
638
+ const EMPTY_SUBAGENT_SETTINGS = { overrides: {} };
639
+ /**
640
+ * Which fields of a config came from its file's frontmatter.
641
+ *
642
+ * Keyed by the config object rather than by agent name because configs are
643
+ * copied on write: each `apply*` pass produces new objects, and the new one
644
+ * inherits the entry so later passes still know what the author declared.
645
+ * A WeakMap means a discarded config's entry is collectable with it.
646
+ */
647
+ const agentFrontmatterFields = /* @__PURE__ */ new WeakMap();
648
+ /** Record which fields a freshly parsed config took from frontmatter. */
649
+ function setAgentFrontmatterFields(agent, fields) {
650
+ agentFrontmatterFields.set(agent, fields);
651
+ }
652
+ /** True when the agent's file declared any of `fields` in its frontmatter. */
653
+ function agentHasFrontmatterField(agent, ...fields) {
654
+ const frontmatterFields = agentFrontmatterFields.get(agent);
655
+ return frontmatterFields ? fields.some((field) => frontmatterFields.has(field)) : false;
656
+ }
657
+ /** Carry the frontmatter record onto a copy produced by an `apply*` pass. */
658
+ function inheritFrontmatterFields(source, next) {
659
+ const frontmatterFields = agentFrontmatterFields.get(source);
660
+ if (frontmatterFields) agentFrontmatterFields.set(next, frontmatterFields);
661
+ return next;
662
+ }
663
+ /** Split a flat tool list into host tools and direct MCP tools. */
664
+ function splitToolList$1(rawTools) {
665
+ const mcpDirectTools = [];
666
+ const tools = [];
667
+ for (const tool of rawTools ?? []) if (tool.startsWith(MCP_DIRECT_TOOL_PREFIX)) mcpDirectTools.push(tool.slice(4));
668
+ else tools.push(tool);
669
+ return {
670
+ ...rawTools !== void 0 ? { tools } : {},
671
+ ...mcpDirectTools.length > 0 ? { mcpDirectTools } : {}
672
+ };
673
+ }
674
+ /** Read a settings object at `key`, or undefined when it is absent or not an object. */
675
+ function readObjectField(source, key) {
676
+ const value = source[key];
677
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
678
+ return value;
679
+ }
680
+ /**
681
+ * Parse the model-scope block.
682
+ *
683
+ * Lives here rather than beside the scope enforcement logic because parsing is
684
+ * a settings concern and the agents domain may not reach into the runs domain.
685
+ */
686
+ function parseModelScopeConfig(value, filePath) {
687
+ if (value === void 0) return void 0;
688
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Subagent settings in '${filePath}' have invalid 'modelScope'; expected an object.`);
689
+ const input = value;
690
+ const config = {};
691
+ if ("enforce" in input) {
692
+ if (typeof input.enforce !== "boolean") throw new Error(`Subagent settings in '${filePath}' have invalid 'modelScope.enforce'; expected a boolean.`);
693
+ config.enforce = input.enforce;
694
+ }
695
+ if ("allow" in input) {
696
+ if (!Array.isArray(input.allow)) throw new Error(`Subagent settings in '${filePath}' have invalid 'modelScope.allow'; expected an array of strings.`);
697
+ const allow = [];
698
+ for (const entry of input.allow) {
699
+ if (typeof entry !== "string") throw new Error(`Subagent settings in '${filePath}' have invalid 'modelScope.allow'; expected an array of strings.`);
700
+ const trimmed = entry.trim();
701
+ if (trimmed) allow.push(trimmed);
702
+ }
703
+ if (allow.length === 0) throw new Error(`Subagent settings in '${filePath}' have invalid 'modelScope.allow'; expected a non-empty array of patterns.`);
704
+ config.allow = allow;
705
+ }
706
+ if (config.enforce === true && (!config.allow || config.allow.length === 0)) throw new Error(`Subagent settings in '${filePath}' set modelScope.enforce without a non-empty 'allow' list; supply allowed model patterns or disable enforcement.`);
707
+ return Object.keys(config).length > 0 ? config : void 0;
708
+ }
709
+ /**
710
+ * Parse a string-array override field, which may also be `false` to clear it.
711
+ *
712
+ * Empty entries are dropped rather than rejected: trailing commas in a hand
713
+ * edited list are common and unambiguous.
714
+ */
715
+ function parseOverrideStringArrayOrFalse(value, meta) {
716
+ if (value === void 0) return void 0;
717
+ if (value === false) return false;
718
+ if (!Array.isArray(value)) throw new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid '${meta.field}'; expected an array of strings or false.`);
719
+ const items = [];
720
+ for (const item of value) {
721
+ if (typeof item !== "string") throw new Error(`Builtin override '${meta.name}' in '${meta.filePath}' has invalid '${meta.field}'; expected an array of strings or false.`);
722
+ const trimmed = item.trim();
723
+ if (trimmed) items.push(trimmed);
724
+ }
725
+ return items;
726
+ }
727
+ /**
728
+ * Parse one entry of `subagents.agentOverrides`.
729
+ *
730
+ * Returns undefined for an entry that declared nothing, so an empty object in
731
+ * the file does not register as an override and mark the agent as overridden.
732
+ */
733
+ function parseBuiltinOverrideEntry(name, value, filePath) {
734
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Builtin override '${name}' in '${filePath}' must be an object.`);
735
+ const input = value;
736
+ const override = {};
737
+ if ("model" in input) {
738
+ if (typeof input.model === "string" || input.model === false) override.model = input.model;
739
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'model'; expected a string or false.`);
740
+ }
741
+ if ("thinking" in input) {
742
+ if (typeof input.thinking === "string" || input.thinking === false) override.thinking = input.thinking;
743
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'thinking'; expected a string or false.`);
744
+ }
745
+ if ("systemPromptMode" in input) {
746
+ if (input.systemPromptMode === "append" || input.systemPromptMode === "replace") override.systemPromptMode = input.systemPromptMode;
747
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'systemPromptMode'; expected 'append' or 'replace'.`);
748
+ }
749
+ if ("inheritProjectContext" in input) {
750
+ if (typeof input.inheritProjectContext === "boolean") override.inheritProjectContext = input.inheritProjectContext;
751
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritProjectContext'; expected a boolean.`);
752
+ }
753
+ if ("inheritSkills" in input) {
754
+ if (typeof input.inheritSkills === "boolean") override.inheritSkills = input.inheritSkills;
755
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'inheritSkills'; expected a boolean.`);
756
+ }
757
+ if ("defaultContext" in input) {
758
+ if (input.defaultContext === "fresh" || input.defaultContext === "fork" || input.defaultContext === false) override.defaultContext = input.defaultContext;
759
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'defaultContext'; expected 'fresh', 'fork', or false.`);
760
+ }
761
+ if ("disabled" in input) {
762
+ if (typeof input.disabled === "boolean") override.disabled = input.disabled;
763
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'disabled'; expected a boolean.`);
764
+ }
765
+ if ("completionGuard" in input) {
766
+ if (typeof input.completionGuard === "boolean") override.completionGuard = input.completionGuard;
767
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'completionGuard'; expected a boolean.`);
768
+ }
769
+ if ("toolBudget" in input) {
770
+ const toolBudget = parseToolBudgetOverride(input.toolBudget, name, filePath);
771
+ if (toolBudget !== void 0) override.toolBudget = toolBudget;
772
+ }
773
+ if ("systemPrompt" in input) {
774
+ if (typeof input.systemPrompt === "string") override.systemPrompt = input.systemPrompt;
775
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'systemPrompt'; expected a string.`);
776
+ }
777
+ const parseArrayField = (field) => parseOverrideStringArrayOrFalse(input[field], {
778
+ filePath,
779
+ name,
780
+ field
781
+ });
782
+ const fallbackModels = parseArrayField("fallbackModels");
783
+ if (fallbackModels !== void 0) override.fallbackModels = fallbackModels;
784
+ const skills = parseArrayField("skills");
785
+ if (skills !== void 0) override.skills = skills;
786
+ const tools = parseArrayField("tools");
787
+ if (tools !== void 0) override.tools = tools;
788
+ const extensions = parseArrayField("extensions");
789
+ if (extensions !== void 0) override.extensions = extensions;
790
+ const subagentOnlyExtensions = parseArrayField("subagentOnlyExtensions");
791
+ if (subagentOnlyExtensions !== void 0) override.subagentOnlyExtensions = subagentOnlyExtensions;
792
+ return Object.keys(override).length > 0 ? override : void 0;
793
+ }
794
+ /**
795
+ * Parse a `toolBudget` override.
796
+ *
797
+ * `hard` is required by the contract, so an object without a usable one is
798
+ * rejected here instead of producing a budget that never blocks.
799
+ */
800
+ function parseToolBudgetOverride(value, name, filePath) {
801
+ if (value === false) return false;
802
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'toolBudget'; expected an object or false.`);
803
+ const input = value;
804
+ if (typeof input.hard !== "number") throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'toolBudget.hard'; expected a number.`);
805
+ const budget = { hard: input.hard };
806
+ if ("soft" in input) {
807
+ if (typeof input.soft !== "number") throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'toolBudget.soft'; expected a number.`);
808
+ budget.soft = input.soft;
809
+ }
810
+ if ("block" in input) {
811
+ if (input.block === "*") budget.block = "*";
812
+ else if (Array.isArray(input.block) && input.block.every((entry) => typeof entry === "string")) budget.block = [...input.block];
813
+ else throw new Error(`Builtin override '${name}' in '${filePath}' has invalid 'toolBudget.block'; expected an array of strings or '*'.`);
814
+ }
815
+ return budget;
816
+ }
817
+ /** Read and validate one settings file's `subagents` block. */
818
+ function readSubagentSettings(filePath) {
819
+ if (!filePath) return EMPTY_SUBAGENT_SETTINGS;
820
+ const subagentsObject = readObjectField(readSettingsFileStrict(filePath), SUBAGENTS_SETTINGS_KEY);
821
+ if (!subagentsObject) return EMPTY_SUBAGENT_SETTINGS;
822
+ let disableBuiltins;
823
+ if ("disableBuiltins" in subagentsObject) {
824
+ if (typeof subagentsObject.disableBuiltins === "boolean") disableBuiltins = subagentsObject.disableBuiltins;
825
+ else throw new Error(`Subagent settings in '${filePath}' have invalid 'disableBuiltins'; expected a boolean.`);
826
+ }
827
+ let disableThinking;
828
+ if ("disableThinking" in subagentsObject) {
829
+ if (typeof subagentsObject.disableThinking === "boolean") disableThinking = subagentsObject.disableThinking;
830
+ else throw new Error(`Subagent settings in '${filePath}' have invalid 'disableThinking'; expected a boolean.`);
831
+ }
832
+ let defaultModel;
833
+ if ("defaultModel" in subagentsObject) {
834
+ if (typeof subagentsObject.defaultModel === "string" && subagentsObject.defaultModel.trim()) defaultModel = subagentsObject.defaultModel.trim();
835
+ else throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultModel'; expected a non-empty string.`);
836
+ }
837
+ let defaultThinking;
838
+ if ("defaultThinking" in subagentsObject) {
839
+ if (typeof subagentsObject.defaultThinking === "string" && subagentsObject.defaultThinking.trim()) defaultThinking = subagentsObject.defaultThinking.trim();
840
+ else throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultThinking'; expected a non-empty string.`);
841
+ }
842
+ let defaultExtensions;
843
+ if ("defaultExtensions" in subagentsObject) {
844
+ const raw = subagentsObject.defaultExtensions;
845
+ if (!Array.isArray(raw) || raw.some((item) => typeof item !== "string" || !item.trim())) throw new Error(`Subagent settings in '${filePath}' have invalid 'defaultExtensions'; expected an array of non-empty strings.`);
846
+ defaultExtensions = raw.map((item) => String(item).trim());
847
+ }
848
+ const modelScope = parseModelScopeConfig(subagentsObject.modelScope, filePath);
849
+ const overrides = {};
850
+ const agentOverrides = readObjectField(subagentsObject, AGENT_OVERRIDES_KEY);
851
+ if (agentOverrides) for (const [name, value] of Object.entries(agentOverrides)) {
852
+ const override = parseBuiltinOverrideEntry(name, value, filePath);
853
+ if (override) overrides[name] = override;
854
+ }
855
+ return {
856
+ overrides,
857
+ defaultModel,
858
+ defaultThinking,
859
+ defaultExtensions,
860
+ disableBuiltins,
861
+ disableThinking,
862
+ modelScope
863
+ };
864
+ }
865
+ /** Which settings file supplies `defaultModel`, project winning over user. */
866
+ function resolveSubagentDefaultModel(userSettings, projectSettings, userSettingsPath, projectSettingsPath) {
867
+ if (projectSettingsPath && projectSettings.defaultModel !== void 0) return {
868
+ type: "subagents.defaultModel",
869
+ scope: "project",
870
+ path: projectSettingsPath,
871
+ model: projectSettings.defaultModel
872
+ };
873
+ return userSettings.defaultModel !== void 0 ? {
874
+ type: "subagents.defaultModel",
875
+ scope: "user",
876
+ path: userSettingsPath,
877
+ model: userSettings.defaultModel
878
+ } : void 0;
879
+ }
880
+ /**
881
+ * Fill in the default model for agents that declared none.
882
+ *
883
+ * `modelSource` is recorded alongside so callers can tell an inherited model
884
+ * from a requested one, which decides how hard model-scope enforcement bites.
885
+ */
886
+ function applySubagentDefaultModel(agents, defaultModel) {
887
+ if (!defaultModel) return agents;
888
+ return agents.map((agent) => {
889
+ if (agent.model !== void 0) return agent;
890
+ return inheritFrontmatterFields(agent, {
891
+ ...agent,
892
+ model: defaultModel.model,
893
+ modelSource: defaultModel
894
+ });
895
+ });
896
+ }
897
+ /** Fill in fallback models only when the agent declared no fallback policy. */
898
+ function applySubagentDefaultFallbackModels(agents, fallbackModels) {
899
+ if (fallbackModels === void 0) return agents;
900
+ return agents.map((agent) => {
901
+ if (agent.fallbackModels !== void 0) return agent;
902
+ return inheritFrontmatterFields(agent, {
903
+ ...agent,
904
+ fallbackModels: [...fallbackModels]
905
+ });
906
+ });
907
+ }
908
+ function resolveSubagentDefaultThinking(userSettings, projectSettings, projectSettingsPath) {
909
+ if (projectSettingsPath && projectSettings.defaultThinking !== void 0) return projectSettings.defaultThinking;
910
+ return userSettings.defaultThinking;
911
+ }
912
+ function applySubagentDefaultThinking(agents, defaultThinking) {
913
+ if (defaultThinking === void 0) return agents;
914
+ return agents.map((agent) => {
915
+ if (agent.thinking !== void 0) return agent;
916
+ return inheritFrontmatterFields(agent, {
917
+ ...agent,
918
+ thinking: defaultThinking
919
+ });
920
+ });
921
+ }
922
+ function resolveSubagentDefaultExtensions(userSettings, projectSettings, projectSettingsPath) {
923
+ if (projectSettingsPath && projectSettings.defaultExtensions !== void 0) return projectSettings.defaultExtensions;
924
+ return userSettings.defaultExtensions;
925
+ }
926
+ /**
927
+ * Fill in default extensions for agents that declared none.
928
+ *
929
+ * The `extensionsFromDefault` flag matters when the agent is later overridden:
930
+ * a snapshot must not record a settings default as if the builtin had declared
931
+ * it, or removing the override would bake the default in permanently.
932
+ */
933
+ function applySubagentDefaultExtensions(agents, defaultExtensions) {
934
+ if (defaultExtensions === void 0) return agents;
935
+ return agents.map((agent) => {
936
+ if (agent.extensions !== void 0) return agent;
937
+ return inheritFrontmatterFields(agent, {
938
+ ...agent,
939
+ extensions: [...defaultExtensions],
940
+ extensionsFromDefault: true
941
+ });
942
+ });
943
+ }
944
+ function applySubagentDefaults(agents, defaultModel, defaultThinking, defaultExtensions, defaultFallbackModels) {
945
+ return applySubagentDefaultExtensions(applySubagentDefaultThinking(applySubagentDefaultFallbackModels(applySubagentDefaultModel(agents, defaultModel), defaultFallbackModels), defaultThinking), defaultExtensions);
946
+ }
947
+ /**
948
+ * Snapshot the fields an override may replace, so it can be undone.
949
+ *
950
+ * `extensions` is omitted when it came from a settings default rather than the
951
+ * agent itself; restoring it would turn a default into a permanent value.
952
+ */
953
+ function cloneOverrideBase(agent) {
954
+ return {
955
+ model: agent.model,
956
+ fallbackModels: agent.fallbackModels ? [...agent.fallbackModels] : void 0,
957
+ thinking: agent.thinking,
958
+ systemPromptMode: agent.systemPromptMode,
959
+ inheritProjectContext: agent.inheritProjectContext,
960
+ inheritSkills: agent.inheritSkills,
961
+ defaultContext: agent.defaultContext,
962
+ disabled: agent.disabled,
963
+ systemPrompt: agent.systemPrompt,
964
+ skills: agent.skills ? [...agent.skills] : void 0,
965
+ skillPath: agent.skillPath ? [...agent.skillPath] : void 0,
966
+ tools: agent.tools ? [...agent.tools] : void 0,
967
+ mcpDirectTools: agent.mcpDirectTools ? [...agent.mcpDirectTools] : void 0,
968
+ extensions: agent.extensionsFromDefault ? void 0 : agent.extensions ? [...agent.extensions] : void 0,
969
+ subagentOnlyExtensions: agent.subagentOnlyExtensions ? [...agent.subagentOnlyExtensions] : void 0,
970
+ completionGuard: agent.completionGuard,
971
+ toolBudget: agent.toolBudget
972
+ };
973
+ }
974
+ /**
975
+ * Apply an override to a custom agent, filling only unset fields.
976
+ *
977
+ * A custom agent has a file the user could have edited, so a settings value
978
+ * must never contradict its frontmatter. Nothing is copied and no `override`
979
+ * is recorded unless at least one field was actually filled, which keeps agents
980
+ * that declared everything from being reported as overridden.
981
+ */
982
+ function applyCustomAgentOverride(agent, override, meta) {
983
+ let next;
984
+ let anyFilled = false;
985
+ const mutable = () => {
986
+ next ??= { ...agent };
987
+ return next;
988
+ };
989
+ const fill = (field, frontmatterFields, value) => {
990
+ if (agentHasFrontmatterField(agent, ...frontmatterFields)) return;
991
+ mutable()[field] = value;
992
+ anyFilled = true;
993
+ };
994
+ if (override.model !== void 0 && !agentHasFrontmatterField(agent, "model")) {
995
+ const target = mutable();
996
+ target.model = override.model === false ? void 0 : override.model;
997
+ target.modelSource = void 0;
998
+ anyFilled = true;
999
+ }
1000
+ if (override.fallbackModels !== void 0) fill("fallbackModels", ["fallbackModels"], override.fallbackModels === false ? void 0 : [...override.fallbackModels]);
1001
+ if (override.thinking !== void 0) fill("thinking", ["thinking"], override.thinking === false ? void 0 : override.thinking);
1002
+ if (override.systemPromptMode !== void 0) fill("systemPromptMode", ["systemPromptMode"], override.systemPromptMode);
1003
+ if (override.inheritProjectContext !== void 0) fill("inheritProjectContext", ["inheritProjectContext"], override.inheritProjectContext);
1004
+ if (override.inheritSkills !== void 0) fill("inheritSkills", ["inheritSkills"], override.inheritSkills);
1005
+ if (override.defaultContext !== void 0) fill("defaultContext", ["defaultContext"], override.defaultContext === false ? void 0 : override.defaultContext);
1006
+ if (override.disabled !== void 0 && agent.disabled === void 0) {
1007
+ mutable().disabled = override.disabled;
1008
+ anyFilled = true;
1009
+ }
1010
+ if (override.skills !== void 0) fill("skills", ["skill", "skills"], override.skills === false ? void 0 : [...override.skills]);
1011
+ if (override.tools !== void 0 && !agentHasFrontmatterField(agent, "tools")) {
1012
+ const { tools, mcpDirectTools } = splitToolList$1(override.tools === false ? [] : override.tools);
1013
+ const target = mutable();
1014
+ target.tools = tools;
1015
+ target.mcpDirectTools = mcpDirectTools;
1016
+ anyFilled = true;
1017
+ }
1018
+ if (override.extensions !== void 0) fill("extensions", ["extensions"], override.extensions === false ? void 0 : [...override.extensions]);
1019
+ if (override.subagentOnlyExtensions !== void 0) fill("subagentOnlyExtensions", ["subagentOnlyExtensions"], override.subagentOnlyExtensions === false ? void 0 : [...override.subagentOnlyExtensions]);
1020
+ if (override.completionGuard !== void 0) fill("completionGuard", ["completionGuard"], override.completionGuard);
1021
+ if (override.toolBudget !== void 0) fill("toolBudget", ["toolBudget"], override.toolBudget === false ? void 0 : override.toolBudget);
1022
+ if (!anyFilled || !next) return agent;
1023
+ next.override = {
1024
+ ...meta,
1025
+ base: cloneOverrideBase(agent)
1026
+ };
1027
+ return inheritFrontmatterFields(agent, next);
1028
+ }
1029
+ function applyCustomAgentOverrides(agents, userSettings, projectSettings, userSettingsPath, projectSettingsPath) {
1030
+ return agents.map((agent) => {
1031
+ const projectOverride = projectSettings.overrides[agent.name];
1032
+ if (projectOverride && projectSettingsPath) return applyCustomAgentOverride(agent, projectOverride, {
1033
+ scope: "project",
1034
+ path: projectSettingsPath
1035
+ });
1036
+ const userOverride = userSettings.overrides[agent.name];
1037
+ if (userOverride) return applyCustomAgentOverride(agent, userOverride, {
1038
+ scope: "user",
1039
+ path: userSettingsPath
1040
+ });
1041
+ return agent;
1042
+ });
1043
+ }
1044
+ //#endregion
1045
+ //#region src/services/agentLoader/index.ts
1046
+ /**
1047
+ * Reading agent definitions off disk into `AgentConfig` values.
1048
+ *
1049
+ * One markdown file is one agent: YAML frontmatter declares how the child run
1050
+ * should be shaped, and the body is its system prompt. This module owns the walk
1051
+ * that finds those files and the field-by-field interpretation of what it finds.
1052
+ * Precedence between sources, settings defaults, and builtin overrides are
1053
+ * applied by discovery afterwards, never here.
1054
+ *
1055
+ * DESIGN PATTERNS:
1056
+ * - A malformed value fails loudly, a malformed file is skipped quietly. A file
1057
+ * missing `name` or `description` is simply not an agent and must not stop the
1058
+ * sweep, but a `timeoutMs` of "soon" is an authoring mistake that has to
1059
+ * surface rather than be silently dropped
1060
+ * - Frontmatter keys this module does not interpret are copied into
1061
+ * `extraFields` verbatim, so a later writer can round-trip a file it did not
1062
+ * fully understand
1063
+ * - The directory walk prunes at project boundaries, so an agent directory that
1064
+ * happens to contain a checked-out sub-repository does not absorb its agents
1065
+ *
1066
+ * ASYNC-ONLY:
1067
+ * This package has no synchronous run mode, so the `async` frontmatter field is
1068
+ * not interpreted. It falls through into `extraFields` like any other key,
1069
+ * which keeps a definition written for the predecessor readable here.
1070
+ *
1071
+ * AVOID:
1072
+ * - Applying settings defaults or builtin overrides in this module
1073
+ * - Adding a field here without adding it to `LOADER_KNOWN_FIELDS`, which would
1074
+ * leak it into `extraFields` and get it written back twice
1075
+ */
1076
+ /**
1077
+ * The one builtin that extends the host's context instead of replacing it.
1078
+ *
1079
+ * `delegate` exists to carry out work on the operator's behalf in the same
1080
+ * project, so it inherits the host system prompt and project context. Every
1081
+ * other agent starts clean, which is what makes its output reproducible.
1082
+ */
1083
+ const CONTEXT_INHERITING_BUILTIN = "delegate";
1084
+ function defaultSystemPromptMode(name) {
1085
+ return name === CONTEXT_INHERITING_BUILTIN ? "append" : "replace";
1086
+ }
1087
+ function defaultInheritProjectContext(name) {
1088
+ return name === CONTEXT_INHERITING_BUILTIN;
1089
+ }
1090
+ function defaultInheritSkills() {
1091
+ return false;
1092
+ }
1093
+ /**
1094
+ * Every frontmatter key this module interprets.
1095
+ *
1096
+ * Anything absent from this set is preserved in `extraFields` instead. `async`
1097
+ * is deliberately absent: this package is async-only, so the key is data to
1098
+ * carry, not a setting to honour.
1099
+ */
1100
+ const LOADER_KNOWN_FIELDS = /* @__PURE__ */ new Set([
1101
+ "name",
1102
+ "package",
1103
+ "description",
1104
+ "tools",
1105
+ "model",
1106
+ "fallbackModels",
1107
+ "thinking",
1108
+ "systemPromptMode",
1109
+ "inheritProjectContext",
1110
+ "inheritSkills",
1111
+ "defaultContext",
1112
+ "timeoutMs",
1113
+ "skill",
1114
+ "skills",
1115
+ "skillPath",
1116
+ "extensions",
1117
+ "subagentOnlyExtensions",
1118
+ "output",
1119
+ "defaultReads",
1120
+ "defaultProgress",
1121
+ "interactive",
1122
+ "maxSubagentDepth",
1123
+ "completionGuard",
1124
+ "toolBudget",
1125
+ "memory"
1126
+ ]);
1127
+ const TRUE_LITERAL = "true";
1128
+ const FALSE_LITERAL = "false";
1129
+ /** Frontmatter carries strings, so a boolean field is a tri-state until parsed. */
1130
+ function parseOptionalBoolean(raw) {
1131
+ if (raw === TRUE_LITERAL) return true;
1132
+ if (raw === FALSE_LITERAL) return false;
1133
+ }
1134
+ /** A package-qualified agent name: dot-separated lowercase segments. */
1135
+ const IDENTIFIER_PATTERN = /^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/;
1136
+ const PACKAGE_NAME_SEPARATOR = ".";
1137
+ /**
1138
+ * Reduce an authored package name to the canonical form used in runtime names.
1139
+ *
1140
+ * Sanitizing rather than rejecting outright keeps a human-written `My Tools`
1141
+ * usable, while the pattern check afterwards still rejects anything that
1142
+ * sanitizes down to nothing meaningful.
1143
+ */
1144
+ function normalizePackageName(value) {
1145
+ const trimmed = value?.trim();
1146
+ if (!trimmed) return void 0;
1147
+ return trimmed.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9.-]/g, "").replace(/-+/g, "-").replace(/\.+/g, ".").replace(/(?:^[-.]+|[-.]+$)/g, "");
1148
+ }
1149
+ /** Validate a `package` frontmatter value. An absent or empty value is not an error. */
1150
+ function parsePackageName(value, label = "package") {
1151
+ if (value === void 0 || value === false || value === "") return { packageName: void 0 };
1152
+ if (typeof value !== "string") return { error: `${label} must be a string or false when provided.` };
1153
+ const packageName = normalizePackageName(value);
1154
+ if (!packageName || !IDENTIFIER_PATTERN.test(packageName)) return { error: `${label} is invalid after sanitization.` };
1155
+ return { packageName };
1156
+ }
1157
+ /** The name an agent is addressed by, qualified when it belongs to a package. */
1158
+ function buildRuntimeName(localName, packageName) {
1159
+ const trimmedPackage = packageName?.trim();
1160
+ return trimmedPackage ? `${trimmedPackage}${PACKAGE_NAME_SEPARATOR}${localName}` : localName;
1161
+ }
1162
+ /** Marks a tool that is reached through an MCP server rather than the host. */
1163
+ const MCP_TOOL_PREFIX = "mcp:";
1164
+ /**
1165
+ * Split an authored `tools` list into host tools and MCP tools.
1166
+ *
1167
+ * The two are separate fields on `AgentConfig` because they are enforced by
1168
+ * different layers, but a single flat list is what an author wants to write.
1169
+ */
1170
+ function splitToolList(rawTools) {
1171
+ const mcpDirectTools = [];
1172
+ const tools = [];
1173
+ for (const tool of rawTools ?? []) if (tool.startsWith(MCP_TOOL_PREFIX)) mcpDirectTools.push(tool.slice(4));
1174
+ else tools.push(tool);
1175
+ return {
1176
+ ...rawTools !== void 0 ? { tools } : {},
1177
+ ...mcpDirectTools.length > 0 ? { mcpDirectTools } : {}
1178
+ };
1179
+ }
1180
+ const DISCOVERY_PRUNED_DIR_NAMES = /* @__PURE__ */ new Set([".git", "node_modules"]);
1181
+ const GIT_DIR_NAME = ".git";
1182
+ const LEGACY_AGENTS_DIR_NAME = ".agents";
1183
+ const LEGACY_SKILLS_DIR_NAME = "skills";
1184
+ const AGENT_FILE_EXTENSION = ".md";
1185
+ const CHAIN_FILE_EXTENSION = ".chain.md";
1186
+ function isDirectory(target) {
1187
+ try {
1188
+ return node_fs.statSync(target).isDirectory();
1189
+ } catch {
1190
+ return false;
1191
+ }
1192
+ }
1193
+ /** A directory that owns its own agent configuration is a separate project. */
1194
+ function isDiscoveryNestedProjectRoot(dir, environment) {
1195
+ return isDirectory(getProjectConfigDir(dir, environment)) || isDirectory(node_path.join(dir, LEGACY_AGENTS_DIR_NAME));
1196
+ }
1197
+ /**
1198
+ * Decide whether the walk should skip a subdirectory.
1199
+ *
1200
+ * A nested repository or nested project root is pruned because its agents
1201
+ * belong to that project, not to the one being scanned. The root itself is
1202
+ * exempt: scanning a project's own agent directory must not prune it.
1203
+ */
1204
+ function shouldPruneDiscoveryDir(rootDir, dir, dirName, environment) {
1205
+ if (DISCOVERY_PRUNED_DIR_NAMES.has(dirName)) return true;
1206
+ if (node_fs.existsSync(node_path.join(dir, GIT_DIR_NAME))) return true;
1207
+ return node_path.resolve(dir) !== node_path.resolve(rootDir) && isDiscoveryNestedProjectRoot(dir, environment);
1208
+ }
1209
+ /**
1210
+ * Collect matching files under `dir`, sorted so discovery order is stable.
1211
+ *
1212
+ * Symlinked entries are followed as files, because staging an agent by symlink
1213
+ * is a supported way to share one definition across projects.
1214
+ */
1215
+ function listFilesRecursive(dir, predicate, rootDir = dir, environment = process.env) {
1216
+ const files = [];
1217
+ if (!node_fs.existsSync(dir)) return files;
1218
+ let entries;
1219
+ try {
1220
+ entries = node_fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
1221
+ } catch {
1222
+ return files;
1223
+ }
1224
+ for (const entry of entries) {
1225
+ const filePath = node_path.join(dir, entry.name);
1226
+ if (entry.isDirectory()) {
1227
+ if (!shouldPruneDiscoveryDir(rootDir, filePath, entry.name, environment)) files.push(...listFilesRecursive(filePath, predicate, rootDir, environment));
1228
+ continue;
1229
+ }
1230
+ if (!entry.isFile() && !entry.isSymbolicLink()) continue;
1231
+ if (!predicate(entry.name)) continue;
1232
+ files.push(filePath);
1233
+ }
1234
+ return files;
1235
+ }
1236
+ /**
1237
+ * Recognise a file that lives under a legacy `.agents/skills/` directory.
1238
+ *
1239
+ * Those markdown files are skill documents, not agent definitions, and they
1240
+ * predate the split. They would otherwise be loaded as nameless agents.
1241
+ */
1242
+ function isLegacyAgentSkillPath(rootDir, filePath) {
1243
+ const parts = node_path.relative(rootDir, filePath).split(node_path.sep).map((part) => part.toLowerCase());
1244
+ if (node_path.basename(rootDir).toLowerCase() === LEGACY_AGENTS_DIR_NAME) parts.unshift(LEGACY_AGENTS_DIR_NAME);
1245
+ return parts.some((part, index) => part === LEGACY_AGENTS_DIR_NAME && parts[index + 1] === LEGACY_SKILLS_DIR_NAME);
1246
+ }
1247
+ function parseSystemPromptMode(raw, localName) {
1248
+ if (raw === "replace" || raw === "append") return raw;
1249
+ return defaultSystemPromptMode(localName);
1250
+ }
1251
+ function parseDefaultContext(raw) {
1252
+ return raw === "fork" || raw === "fresh" ? raw : void 0;
1253
+ }
1254
+ function parseTimeoutMs(raw, localName) {
1255
+ if (raw === void 0) return void 0;
1256
+ const parsed = Number(raw);
1257
+ if (!Number.isInteger(parsed) || parsed <= 0) throw new Error(`Agent '${localName}' has invalid timeoutMs frontmatter; expected a positive integer.`);
1258
+ return parsed;
1259
+ }
1260
+ function parseToolBudget(raw, localName) {
1261
+ if (raw === void 0 || !raw.trim()) return void 0;
1262
+ const parsed = JSON.parse(raw);
1263
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) throw new Error(`Agent '${localName}' has invalid toolBudget frontmatter; expected a JSON object.`);
1264
+ return parsed;
1265
+ }
1266
+ /** True for an agent definition file, false for a chain or anything else. */
1267
+ function isAgentFileName(fileName) {
1268
+ return fileName.endsWith(AGENT_FILE_EXTENSION) && !fileName.endsWith(CHAIN_FILE_EXTENSION);
1269
+ }
1270
+ /**
1271
+ * Load every agent definition under `dir`.
1272
+ *
1273
+ * The returned configs carry only what the file itself declared. Settings
1274
+ * defaults, builtin overrides, and cross-source precedence are the caller's job.
1275
+ */
1276
+ function loadAgentsFromDir(dir, source, environment = process.env) {
1277
+ const agents = [];
1278
+ for (const filePath of listFilesRecursive(dir, isAgentFileName, dir, environment)) {
1279
+ if (isLegacyAgentSkillPath(dir, filePath)) continue;
1280
+ let content;
1281
+ try {
1282
+ content = node_fs.readFileSync(filePath, "utf-8");
1283
+ } catch {
1284
+ continue;
1285
+ }
1286
+ const { frontmatter, body } = parseFrontmatter(content);
1287
+ if (!frontmatter.name || !frontmatter.description) continue;
1288
+ const localName = frontmatter.name;
1289
+ const parsedPackage = parsePackageName(frontmatter.package, `Agent '${localName}' package`);
1290
+ if (parsedPackage.error) continue;
1291
+ const rawTools = parseFrontmatterList(frontmatter.tools);
1292
+ const { tools, mcpDirectTools } = splitToolList(rawTools);
1293
+ const skills = parseFrontmatterList(frontmatter.skill || frontmatter.skills);
1294
+ const skillPath = parseFrontmatterList(frontmatter.skillPath);
1295
+ const fallbackModels = parseFrontmatterList(frontmatter.fallbackModels);
1296
+ const defaultReads = parseFrontmatterList(frontmatter.defaultReads);
1297
+ const maxSubagentDepth = Number(frontmatter.maxSubagentDepth);
1298
+ const extraFields = {};
1299
+ for (const [key, value] of Object.entries(frontmatter)) if (!LOADER_KNOWN_FIELDS.has(key)) extraFields[key] = value;
1300
+ const agent = {
1301
+ name: buildRuntimeName(localName, parsedPackage.packageName),
1302
+ localName,
1303
+ packageName: parsedPackage.packageName,
1304
+ description: frontmatter.description,
1305
+ tools: rawTools !== void 0 ? tools ?? [] : void 0,
1306
+ mcpDirectTools: mcpDirectTools && mcpDirectTools.length > 0 ? mcpDirectTools : void 0,
1307
+ model: frontmatter.model,
1308
+ fallbackModels: fallbackModels && fallbackModels.length > 0 ? fallbackModels : void 0,
1309
+ thinking: frontmatter.thinking === FALSE_LITERAL ? false : frontmatter.thinking,
1310
+ systemPromptMode: parseSystemPromptMode(frontmatter.systemPromptMode, localName),
1311
+ inheritProjectContext: parseOptionalBoolean(frontmatter.inheritProjectContext) ?? defaultInheritProjectContext(localName),
1312
+ inheritSkills: parseOptionalBoolean(frontmatter.inheritSkills) ?? defaultInheritSkills(),
1313
+ defaultContext: parseDefaultContext(frontmatter.defaultContext),
1314
+ defaultTimeoutMs: parseTimeoutMs(frontmatter.timeoutMs, localName),
1315
+ systemPrompt: body,
1316
+ source,
1317
+ filePath,
1318
+ skills: skills && skills.length > 0 ? skills : void 0,
1319
+ skillPath: skillPath && skillPath.length > 0 ? skillPath : void 0,
1320
+ extensions: parseFrontmatterList(frontmatter.extensions),
1321
+ subagentOnlyExtensions: parseFrontmatterList(frontmatter.subagentOnlyExtensions),
1322
+ output: frontmatter.output,
1323
+ defaultReads: defaultReads && defaultReads.length > 0 ? defaultReads : void 0,
1324
+ defaultProgress: frontmatter.defaultProgress === TRUE_LITERAL,
1325
+ interactive: frontmatter.interactive === TRUE_LITERAL,
1326
+ maxSubagentDepth: Number.isInteger(maxSubagentDepth) && maxSubagentDepth >= 0 ? maxSubagentDepth : void 0,
1327
+ completionGuard: parseOptionalBoolean(frontmatter.completionGuard),
1328
+ toolBudget: parseToolBudget(frontmatter.toolBudget, localName),
1329
+ memory: parseMemoryFrontmatter(frontmatter.memory),
1330
+ extraFields: Object.keys(extraFields).length > 0 ? extraFields : void 0
1331
+ };
1332
+ setAgentFrontmatterFields(agent, new Set(Object.keys(frontmatter)));
1333
+ agents.push(agent);
1334
+ }
1335
+ return agents;
1336
+ }
1337
+ /**
1338
+ * Read-only agent directories contributed by plugins.
1339
+ *
1340
+ * Read from the environment on every call rather than captured once, because a
1341
+ * host can stage a plugin directory after this module is first imported.
1342
+ */
1343
+ function pluginAgentDirs(environment = process.env) {
1344
+ return (environment["PI_SUBAGENT_EXTRA_AGENT_DIRS"] ?? "").split(node_path.delimiter).map((directory) => directory.trim()).filter((directory) => directory.length > 0);
1345
+ }
1346
+ //#endregion
1347
+ //#region src/services/lruCache/index.ts
1348
+ /**
1349
+ * LruCache - a bounded cache with least-recently-used eviction.
1350
+ *
1351
+ * DESIGN PATTERNS:
1352
+ * - Backed by a Map, which iterates in insertion order. Re-inserting a key on
1353
+ * read moves it to the end, so the first key is always the least recently used
1354
+ *
1355
+ * WHY LRU AND NOT FIFO:
1356
+ * The predecessor package evicted in insertion order at a cap of 50. Once more
1357
+ * than 50 runs were live it evicted the entry it was about to read next, so the
1358
+ * cache degenerated to a permanent miss while still paying for the stat that
1359
+ * populated it. Recency-based eviction keeps the hot entries.
1360
+ *
1361
+ * AVOID:
1362
+ * - Reading through `map.get` directly anywhere; that skips the recency update
1363
+ */
1364
+ const MINIMUM_CAPACITY = 1;
1365
+ var LruCache = class {
1366
+ entries = /* @__PURE__ */ new Map();
1367
+ capacity;
1368
+ constructor(capacity) {
1369
+ if (!Number.isInteger(capacity) || capacity < MINIMUM_CAPACITY) throw new Error(`LruCache capacity must be an integer of at least ${MINIMUM_CAPACITY}.`);
1370
+ this.capacity = capacity;
1371
+ }
1372
+ get size() {
1373
+ return this.entries.size;
1374
+ }
1375
+ has(key) {
1376
+ return this.entries.has(key);
1377
+ }
1378
+ /** Read a value, marking it most recently used. */
1379
+ get(key) {
1380
+ if (!this.entries.has(key)) return void 0;
1381
+ const value = this.entries.get(key);
1382
+ this.entries.delete(key);
1383
+ this.entries.set(key, value);
1384
+ return value;
1385
+ }
1386
+ /** Insert or replace a value, marking it most recently used. */
1387
+ set(key, value) {
1388
+ if (this.entries.has(key)) this.entries.delete(key);
1389
+ this.entries.set(key, value);
1390
+ while (this.entries.size > this.capacity) {
1391
+ const oldest = this.entries.keys().next();
1392
+ if (oldest.done === true) break;
1393
+ this.entries.delete(oldest.value);
1394
+ }
1395
+ }
1396
+ delete(key) {
1397
+ return this.entries.delete(key);
1398
+ }
1399
+ clear() {
1400
+ this.entries.clear();
1401
+ }
1402
+ /** Keys from least to most recently used. Intended for tests and diagnostics. */
1403
+ keysFromOldest() {
1404
+ return [...this.entries.keys()];
1405
+ }
1406
+ };
1407
+ //#endregion
1408
+ //#region src/services/agentDiscovery/index.ts
1409
+ /**
1410
+ * Cached discovery of the agents visible from a working directory.
1411
+ *
1412
+ * WHY THIS IS A SERVICE AND NOT A FUNCTION:
1413
+ * Discovery reads two settings files and walks every agent directory in scope,
1414
+ * parsing the frontmatter of every file it finds. The slash-command completion
1415
+ * path asks for the agent list on each keystroke, and preflight asks again for
1416
+ * each launch, so the predecessor's plain function re-walked the tree many times
1417
+ * per second. Caching needs somewhere to live, and invalidation needs an owner.
1418
+ *
1419
+ * DESIGN PATTERNS:
1420
+ * - Two-layer validity. A short TTL bounds how stale an answer can be, and a
1421
+ * cheap source fingerprint catches the common edits sooner than the TTL would
1422
+ * - Bounded by an LRU keyed on cwd and scope, so a long session that visits many
1423
+ * directories cannot grow the cache without limit
1424
+ * - Mutations invalidate explicitly rather than relying on the TTL, so an agent
1425
+ * the user just created is visible immediately
1426
+ *
1427
+ * WHY THE FINGERPRINT IS NOT ENOUGH ON ITS OWN:
1428
+ * It stats the settings files and the agent directories, not every agent file.
1429
+ * A directory's mtime moves when a file is added or removed but not when an
1430
+ * existing file's contents change, so an in-place edit is caught by the TTL
1431
+ * rather than by the fingerprint. Stat'ing every agent file on every keystroke
1432
+ * would reintroduce the cost this cache exists to remove.
1433
+ *
1434
+ * AVOID:
1435
+ * - Handing out the cached array without copying it; a caller that sorts or
1436
+ * splices in place would corrupt every later reader
1437
+ * - Raising the TTL to hide a missing invalidate call
1438
+ */
1439
+ /** How long a discovery result may be reused without revalidation. */
1440
+ const DISCOVERY_TTL_MS = 5e3;
1441
+ /**
1442
+ * How many (cwd, scope) combinations stay cached.
1443
+ *
1444
+ * A session works in a handful of directories and there are three scopes, so
1445
+ * this is far above real usage; it exists to bound a pathological case.
1446
+ */
1447
+ const MAX_CACHED_DISCOVERIES = 64;
1448
+ const FINGERPRINT_FIELD_SEPARATOR = ":";
1449
+ const FINGERPRINT_ENTRY_SEPARATOR = "|";
1450
+ const MISSING_SOURCE_MARKER = "-";
1451
+ const MAJOR_MODES_CONFIG_RELATIVE_PATH = node_path.join(".doom", "modes.yaml");
1452
+ const THINKING_SUFFIX = /:(?:off|minimal|low|medium|high|xhigh|max)$/;
1453
+ /**
1454
+ * Merge the sources into one list, later sources shadowing earlier ones.
1455
+ *
1456
+ * Precedence is plugin, then user, then project: the definition closest to the
1457
+ * work being done wins, which is what lets a repository pin an agent that the
1458
+ * user has also defined globally.
1459
+ */
1460
+ function mergeAgentsForScope(scope, userAgents, projectAgents, pluginAgents = []) {
1461
+ const byName = /* @__PURE__ */ new Map();
1462
+ for (const agent of pluginAgents) byName.set(agent.name, agent);
1463
+ if (scope !== "project") for (const agent of userAgents) byName.set(agent.name, agent);
1464
+ if (scope !== "user") for (const agent of projectAgents) byName.set(agent.name, agent);
1465
+ return [...byName.values()];
1466
+ }
1467
+ /** Size and mtime of one path, or a marker when it does not exist. */
1468
+ function stampOf(target) {
1469
+ try {
1470
+ const stat = node_fs.statSync(target);
1471
+ return `${target}${FINGERPRINT_FIELD_SEPARATOR}${stat.mtimeMs}${FINGERPRINT_FIELD_SEPARATOR}${stat.size}`;
1472
+ } catch {
1473
+ return `${target}${FINGERPRINT_FIELD_SEPARATOR}${MISSING_SOURCE_MARKER}`;
1474
+ }
1475
+ }
1476
+ /** Resolve Team-owned package configuration from the current parent harness state. */
1477
+ function resolveActiveTeamPackageConfig(environment = process.env) {
1478
+ const harness = (0, _agimon_ai_doompi_config.loadHarnessState)(environment).state;
1479
+ if (!harness.root) return void 0;
1480
+ const layers = (0, _agimon_ai_doompi_config.loadMajorModesConfig)(harness.root, environment.HOME);
1481
+ const config = mergeTeamPackageConfigurations((0, _agimon_ai_doompi_config.resolvePackageConfigurations)(layers, harness.layers, DOOMPI_TEAM_PACKAGE));
1482
+ return config ? {
1483
+ config,
1484
+ path: node_path.join(harness.root, MAJOR_MODES_CONFIG_RELATIVE_PATH)
1485
+ } : void 0;
1486
+ }
1487
+ function teamModelSpecs(config) {
1488
+ if (!config?.models) return void 0;
1489
+ return config.models.map(({ model, thinking }) => thinking ? `${model.replace(THINKING_SUFFIX, "")}:${thinking}` : model);
1490
+ }
1491
+ /** Resolve Team's ordered package model policy without merging it into an agent definition. */
1492
+ function resolveActiveTeamModelSpecs(environment = process.env) {
1493
+ return teamModelSpecs(resolveActiveTeamPackageConfig(environment)?.config);
1494
+ }
1495
+ var AgentDiscoveryService = class {
1496
+ environment;
1497
+ constructor(environment = process.env) {
1498
+ this.environment = environment;
1499
+ }
1500
+ cache = new LruCache(MAX_CACHED_DISCOVERIES);
1501
+ /**
1502
+ * Seams for tests, as protected members rather than constructor arguments.
1503
+ *
1504
+ * Runtime tuning is not part of this service's dependency contract. A test
1505
+ * subclass overrides these values without abstracting the clock.
1506
+ */
1507
+ ttlMs = DISCOVERY_TTL_MS;
1508
+ now() {
1509
+ return Date.now();
1510
+ }
1511
+ discover(cwd, scope) {
1512
+ const resolvedCwd = node_path.resolve(cwd);
1513
+ const canonicalCwd = canonicalizeDiscoveryCwd(resolvedCwd);
1514
+ const key = `${scope}${FINGERPRINT_ENTRY_SEPARATOR}${canonicalCwd}`;
1515
+ const cached = this.cache.get(key);
1516
+ const timestamp = this.now();
1517
+ if (cached && cached.expiresAt > timestamp && cached.fingerprint === this.fingerprint(canonicalCwd)) return cloneResult(cached.result);
1518
+ const result = this.load(resolvedCwd, scope);
1519
+ this.cache.set(key, {
1520
+ result,
1521
+ expiresAt: timestamp + this.ttlMs,
1522
+ fingerprint: this.fingerprint(canonicalCwd)
1523
+ });
1524
+ return cloneResult(result);
1525
+ }
1526
+ find(cwd, scope, name) {
1527
+ return this.discover(cwd, scope).agents.find((agent) => agent.name === name);
1528
+ }
1529
+ invalidate() {
1530
+ this.cache.clear();
1531
+ }
1532
+ /**
1533
+ * A cheap stamp of everything discovery reads at the directory level.
1534
+ *
1535
+ * Deliberately independent of scope: a user-scoped and a project-scoped lookup
1536
+ * from the same directory read overlapping sources, and computing one stamp
1537
+ * keeps the stat count fixed regardless of how many scopes are queried.
1538
+ */
1539
+ fingerprint(cwd) {
1540
+ const harness = (0, _agimon_ai_doompi_config.loadHarnessState)(this.environment).state;
1541
+ const sources = [
1542
+ getUserAgentSettingsPath(this.environment),
1543
+ getProjectAgentSettingsPath(cwd, this.environment) ?? MISSING_SOURCE_MARKER,
1544
+ ...userAgentDirs(this.environment),
1545
+ ...resolveNearestProjectAgentDirs(cwd, this.environment).readDirs,
1546
+ ...pluginAgentDirs(this.environment)
1547
+ ];
1548
+ if (harness.root) sources.push(node_path.join(harness.root, MAJOR_MODES_CONFIG_RELATIVE_PATH));
1549
+ return [...sources.map(stampOf), `active-layers${FINGERPRINT_FIELD_SEPARATOR}${harness.layers.join(",")}`].join(FINGERPRINT_ENTRY_SEPARATOR);
1550
+ }
1551
+ /**
1552
+ * The uncached read. Protected so a test can count how often it actually runs,
1553
+ * which is the only direct way to assert that the cache is doing its job.
1554
+ */
1555
+ load(cwd, scope) {
1556
+ const userSettingsPath = getUserAgentSettingsPath(this.environment);
1557
+ const projectSettingsPath = getProjectAgentSettingsPath(cwd, this.environment);
1558
+ const userSettings = scope === "project" ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(userSettingsPath);
1559
+ const projectSettings = scope === "user" ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(projectSettingsPath);
1560
+ const legacyDefaultModel = resolveSubagentDefaultModel(userSettings, projectSettings, userSettingsPath, projectSettingsPath);
1561
+ const teamPackage = resolveActiveTeamPackageConfig(this.environment);
1562
+ const packagePrimaryModel = teamModelSpecs(teamPackage?.config)?.[0];
1563
+ const defaultModel = packagePrimaryModel && teamPackage ? {
1564
+ type: "packages.team.defaultModel",
1565
+ scope: "package",
1566
+ path: teamPackage.path,
1567
+ model: packagePrimaryModel
1568
+ } : legacyDefaultModel;
1569
+ const defaultThinking = resolveSubagentDefaultThinking(userSettings, projectSettings, projectSettingsPath);
1570
+ const defaultExtensions = resolveSubagentDefaultExtensions(userSettings, projectSettings, projectSettingsPath);
1571
+ const resolve = (agents) => applyCustomAgentOverrides(applySubagentDefaults(agents, defaultModel, defaultThinking, defaultExtensions), userSettings, projectSettings, userSettingsPath, projectSettingsPath);
1572
+ const plugin = resolve(pluginAgentDirs(this.environment).flatMap((directory) => loadAgentsFromDir(directory, "plugin", this.environment)));
1573
+ return {
1574
+ agents: mergeAgentsForScope(scope, scope === "project" ? [] : resolve(userAgentDirs(this.environment).flatMap((directory) => loadAgentsFromDir(directory, "user", this.environment))), scope === "user" ? [] : resolve(resolveNearestProjectAgentDirs(cwd, this.environment).readDirs.flatMap((directory) => loadAgentsFromDir(directory, "project", this.environment))), plugin).filter((agent) => agent.disabled !== true),
1575
+ projectAgentsDir: resolveNearestProjectAgentDirs(cwd, this.environment).preferredDir,
1576
+ modelScope: projectSettings.modelScope ?? userSettings.modelScope
1577
+ };
1578
+ }
1579
+ };
1580
+ /**
1581
+ * Copy the parts a caller could mutate in place.
1582
+ *
1583
+ * The agent objects themselves are treated as immutable by every consumer, so
1584
+ * only the array is copied; deep-cloning every config on each keystroke would
1585
+ * cost more than the walk this cache replaced.
1586
+ */
1587
+ function cloneResult(result) {
1588
+ return {
1589
+ ...result,
1590
+ agents: [...result.agents]
1591
+ };
1592
+ }
1593
+ //#endregion
1594
+ Object.defineProperty(exports, "AgentDiscoveryService", {
1595
+ enumerable: true,
1596
+ get: function() {
1597
+ return AgentDiscoveryService;
1598
+ }
1599
+ });
1600
+ Object.defineProperty(exports, "LruCache", {
1601
+ enumerable: true,
1602
+ get: function() {
1603
+ return LruCache;
1604
+ }
1605
+ });
1606
+ Object.defineProperty(exports, "agentHasWriteTools", {
1607
+ enumerable: true,
1608
+ get: function() {
1609
+ return agentHasWriteTools;
1610
+ }
1611
+ });
1612
+ Object.defineProperty(exports, "canonicalizeDiscoveryCwd", {
1613
+ enumerable: true,
1614
+ get: function() {
1615
+ return canonicalizeDiscoveryCwd;
1616
+ }
1617
+ });
1618
+ Object.defineProperty(exports, "getAgentDir", {
1619
+ enumerable: true,
1620
+ get: function() {
1621
+ return getAgentDir;
1622
+ }
1623
+ });
1624
+ Object.defineProperty(exports, "getProjectConfigDir", {
1625
+ enumerable: true,
1626
+ get: function() {
1627
+ return getProjectConfigDir;
1628
+ }
1629
+ });
1630
+ Object.defineProperty(exports, "resolveActiveTeamModelSpecs", {
1631
+ enumerable: true,
1632
+ get: function() {
1633
+ return resolveActiveTeamModelSpecs;
1634
+ }
1635
+ });
1636
+ Object.defineProperty(exports, "resolveActiveTeamPackageConfig", {
1637
+ enumerable: true,
1638
+ get: function() {
1639
+ return resolveActiveTeamPackageConfig;
1640
+ }
1641
+ });
1642
+
1643
+ //# sourceMappingURL=agentDiscovery-D3Vu9QU6.cjs.map