@agimon-ai/doompi-team 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (727) hide show
  1. package/README.md +33 -17
  2. package/dist/adapters/asyncJobTracker.cjs +2 -0
  3. package/dist/adapters/asyncJobTracker.cjs.map +1 -0
  4. package/dist/adapters/asyncJobTracker.mjs +2 -0
  5. package/dist/adapters/asyncJobTracker.mjs.map +1 -0
  6. package/dist/adapters/atomicJson.cjs +2 -0
  7. package/dist/adapters/atomicJson.cjs.map +1 -0
  8. package/dist/adapters/atomicJson.mjs +2 -0
  9. package/dist/adapters/atomicJson.mjs.map +1 -0
  10. package/dist/adapters/pi/extension.cjs +2 -0
  11. package/dist/adapters/pi/extension.cjs.map +1 -0
  12. package/dist/adapters/pi/extension.mjs +2 -0
  13. package/dist/adapters/pi/extension.mjs.map +1 -0
  14. package/dist/adapters/pollScheduler.cjs +2 -0
  15. package/dist/adapters/pollScheduler.cjs.map +1 -0
  16. package/dist/adapters/pollScheduler.mjs +2 -0
  17. package/dist/adapters/pollScheduler.mjs.map +1 -0
  18. package/dist/adapters/process/childTranscript.cjs +5 -0
  19. package/dist/adapters/process/childTranscript.cjs.map +1 -0
  20. package/dist/adapters/process/childTranscript.mjs +5 -0
  21. package/dist/adapters/process/childTranscript.mjs.map +1 -0
  22. package/dist/adapters/process/env.cjs +2 -0
  23. package/dist/adapters/process/env.cjs.map +1 -0
  24. package/dist/adapters/process/env.d.cts +69 -0
  25. package/dist/adapters/process/env.d.cts.map +1 -0
  26. package/dist/adapters/process/env.d.mts +69 -0
  27. package/dist/adapters/process/env.d.mts.map +1 -0
  28. package/dist/adapters/process/env.mjs +2 -0
  29. package/dist/adapters/process/env.mjs.map +1 -0
  30. package/dist/adapters/process/sdkRunnerEntry.cjs +2 -0
  31. package/dist/adapters/process/sdkRunnerEntry.cjs.map +1 -0
  32. package/dist/adapters/process/sdkRunnerEntry.d.cts +5 -0
  33. package/dist/adapters/process/sdkRunnerEntry.d.cts.map +1 -0
  34. package/dist/adapters/process/sdkRunnerEntry.d.mts +5 -0
  35. package/dist/adapters/process/sdkRunnerEntry.d.mts.map +1 -0
  36. package/dist/adapters/process/sdkRunnerEntry.mjs +2 -0
  37. package/dist/adapters/process/sdkRunnerEntry.mjs.map +1 -0
  38. package/dist/adapters/processTerminal.cjs +2 -0
  39. package/dist/adapters/processTerminal.cjs.map +1 -0
  40. package/dist/adapters/processTerminal.mjs +2 -0
  41. package/dist/adapters/processTerminal.mjs.map +1 -0
  42. package/dist/adapters/resultWatcher.cjs +2 -0
  43. package/dist/adapters/resultWatcher.cjs.map +1 -0
  44. package/dist/adapters/resultWatcher.mjs +2 -0
  45. package/dist/adapters/resultWatcher.mjs.map +1 -0
  46. package/dist/adapters/runIdResolver.cjs +2 -0
  47. package/dist/adapters/runIdResolver.cjs.map +1 -0
  48. package/dist/adapters/runIdResolver.mjs +2 -0
  49. package/dist/adapters/runIdResolver.mjs.map +1 -0
  50. package/dist/adapters/runRegistry.cjs +2 -0
  51. package/dist/adapters/runRegistry.cjs.map +1 -0
  52. package/dist/adapters/runRegistry.mjs +2 -0
  53. package/dist/adapters/runRegistry.mjs.map +1 -0
  54. package/dist/adapters/scopeOwner.cjs +2 -0
  55. package/dist/adapters/scopeOwner.cjs.map +1 -0
  56. package/dist/adapters/scopeOwner.mjs +2 -0
  57. package/dist/adapters/scopeOwner.mjs.map +1 -0
  58. package/dist/adapters/staleRunReconciler.cjs +2 -0
  59. package/dist/adapters/staleRunReconciler.cjs.map +1 -0
  60. package/dist/adapters/staleRunReconciler.mjs +2 -0
  61. package/dist/adapters/staleRunReconciler.mjs.map +1 -0
  62. package/dist/adapters/statusReader.cjs +2 -0
  63. package/dist/adapters/statusReader.cjs.map +1 -0
  64. package/dist/adapters/statusReader.mjs +2 -0
  65. package/dist/adapters/statusReader.mjs.map +1 -0
  66. package/dist/adapters/suspendedRuns.cjs +6 -0
  67. package/dist/adapters/suspendedRuns.cjs.map +1 -0
  68. package/dist/adapters/suspendedRuns.mjs +6 -0
  69. package/dist/adapters/suspendedRuns.mjs.map +1 -0
  70. package/dist/api/backgroundWork.cjs +1 -1
  71. package/dist/api/backgroundWork.d.cts +2 -2
  72. package/dist/api/backgroundWork.d.mts +2 -2
  73. package/dist/api/backgroundWork.mjs +1 -1
  74. package/dist/api/capabilityCeiling.cjs +1 -1
  75. package/dist/api/capabilityCeiling.d.cts +3 -3
  76. package/dist/api/capabilityCeiling.d.mts +3 -3
  77. package/dist/api/capabilityCeiling.mjs +1 -2
  78. package/dist/api/delegation.cjs +1 -1
  79. package/dist/api/delegation.d.cts +1 -1
  80. package/dist/api/delegation.d.mts +1 -1
  81. package/dist/api/delegation.mjs +1 -1
  82. package/dist/api/teamSnapshot.cjs +1 -1
  83. package/dist/api/teamSnapshot.d.cts +2 -2
  84. package/dist/api/teamSnapshot.d.mts +2 -2
  85. package/dist/api/teamSnapshot.mjs +1 -2
  86. package/dist/commands/slash/chainExpression.cjs.map +1 -0
  87. package/dist/commands/slash/chainExpression.mjs.map +1 -0
  88. package/dist/commands/slash/doctor.cjs +5 -0
  89. package/dist/commands/slash/doctor.cjs.map +1 -0
  90. package/dist/commands/slash/doctor.mjs +5 -0
  91. package/dist/{slash/doctor.cjs.map → commands/slash/doctor.mjs.map} +1 -1
  92. package/dist/{slash → commands/slash}/slashCommands.cjs +1 -1
  93. package/dist/commands/slash/slashCommands.cjs.map +1 -0
  94. package/dist/{slash → commands/slash}/slashCommands.mjs +2 -2
  95. package/dist/commands/slash/slashCommands.mjs.map +1 -0
  96. package/dist/commands/slash/spawnRequestMapping.cjs.map +1 -0
  97. package/dist/commands/slash/spawnRequestMapping.mjs.map +1 -0
  98. package/dist/commands/slash/subagentLaunch.cjs +2 -0
  99. package/dist/commands/slash/subagentLaunch.cjs.map +1 -0
  100. package/dist/commands/slash/subagentLaunch.mjs +2 -0
  101. package/dist/commands/slash/subagentLaunch.mjs.map +1 -0
  102. package/dist/container/globalBridge.cjs.map +1 -1
  103. package/dist/container/globalBridge.d.cts +1 -1
  104. package/dist/container/globalBridge.d.mts +1 -1
  105. package/dist/container/globalBridge.mjs.map +1 -1
  106. package/dist/container/index.cjs +1 -1
  107. package/dist/container/index.cjs.map +1 -1
  108. package/dist/container/index.d.cts +2 -1
  109. package/dist/container/index.d.cts.map +1 -1
  110. package/dist/container/index.d.mts +2 -1
  111. package/dist/container/index.d.mts.map +1 -1
  112. package/dist/container/index.mjs +1 -1
  113. package/dist/container/index.mjs.map +1 -1
  114. package/dist/container/modules/agents.cjs +1 -1
  115. package/dist/container/modules/agents.cjs.map +1 -1
  116. package/dist/container/modules/agents.mjs +1 -1
  117. package/dist/container/modules/agents.mjs.map +1 -1
  118. package/dist/container/modules/core.cjs +1 -1
  119. package/dist/container/modules/core.cjs.map +1 -1
  120. package/dist/container/modules/core.mjs +1 -1
  121. package/dist/container/modules/core.mjs.map +1 -1
  122. package/dist/container/modules/extensions.cjs +1 -1
  123. package/dist/container/modules/extensions.cjs.map +1 -1
  124. package/dist/container/modules/extensions.mjs +1 -1
  125. package/dist/container/modules/extensions.mjs.map +1 -1
  126. package/dist/container/modules/intercom.cjs +1 -1
  127. package/dist/container/modules/intercom.cjs.map +1 -1
  128. package/dist/container/modules/intercom.mjs +1 -1
  129. package/dist/container/modules/intercom.mjs.map +1 -1
  130. package/dist/container/modules/runs.cjs +1 -1
  131. package/dist/container/modules/runs.cjs.map +1 -1
  132. package/dist/container/modules/runs.mjs +1 -1
  133. package/dist/container/modules/runs.mjs.map +1 -1
  134. package/dist/container/types.cjs +1 -1
  135. package/dist/container/types.cjs.map +1 -1
  136. package/dist/container/types.d.cts +1 -0
  137. package/dist/container/types.d.cts.map +1 -1
  138. package/dist/container/types.d.mts +1 -0
  139. package/dist/container/types.d.mts.map +1 -1
  140. package/dist/container/types.mjs +1 -1
  141. package/dist/container/types.mjs.map +1 -1
  142. package/dist/env.cjs +1 -2
  143. package/dist/env.d.cts +2 -65
  144. package/dist/env.d.mts +2 -65
  145. package/dist/env.mjs +1 -1
  146. package/dist/env.mjs.map +1 -1
  147. package/dist/extensions/config.cjs.map +1 -1
  148. package/dist/extensions/config.mjs.map +1 -1
  149. package/dist/extensions/delegationBridge.cjs.map +1 -1
  150. package/dist/extensions/delegationBridge.mjs.map +1 -1
  151. package/dist/extensions/doom.cjs +1 -1
  152. package/dist/extensions/doom.cjs.map +1 -1
  153. package/dist/extensions/doom.mjs +1 -1
  154. package/dist/extensions/doom.mjs.map +1 -1
  155. package/dist/extensions/fablePlanBridge.cjs +1 -1
  156. package/dist/extensions/fablePlanBridge.cjs.map +1 -1
  157. package/dist/extensions/fablePlanBridge.mjs +1 -1
  158. package/dist/extensions/fablePlanBridge.mjs.map +1 -1
  159. package/dist/extensions/managementActions.cjs +1 -1
  160. package/dist/extensions/managementActions.cjs.map +1 -1
  161. package/dist/extensions/managementActions.mjs +1 -1
  162. package/dist/extensions/managementActions.mjs.map +1 -1
  163. package/dist/extensions/operationJournal.cjs +1 -1
  164. package/dist/extensions/operationJournal.cjs.map +1 -1
  165. package/dist/extensions/operationJournal.mjs +1 -1
  166. package/dist/extensions/operationJournal.mjs.map +1 -1
  167. package/dist/extensions/orchestratorPrompt.cjs +5 -6
  168. package/dist/extensions/orchestratorPrompt.cjs.map +1 -1
  169. package/dist/extensions/orchestratorPrompt.mjs +5 -6
  170. package/dist/extensions/orchestratorPrompt.mjs.map +1 -1
  171. package/dist/extensions/schemas.mjs.map +1 -1
  172. package/dist/extensions/spawnPlan.cjs +3 -2
  173. package/dist/extensions/spawnPlan.cjs.map +1 -1
  174. package/dist/extensions/spawnPlan.mjs +3 -2
  175. package/dist/extensions/spawnPlan.mjs.map +1 -1
  176. package/dist/extensions/standard.cjs +1 -1
  177. package/dist/extensions/standard.cjs.map +1 -1
  178. package/dist/extensions/standard.mjs +1 -1
  179. package/dist/extensions/standard.mjs.map +1 -1
  180. package/dist/extensions/statusViews.cjs +1 -1
  181. package/dist/extensions/statusViews.cjs.map +1 -1
  182. package/dist/extensions/statusViews.mjs +2 -2
  183. package/dist/extensions/statusViews.mjs.map +1 -1
  184. package/dist/extensions/subagentPromptRuntime.cjs +11 -11
  185. package/dist/extensions/subagentPromptRuntime.cjs.map +1 -1
  186. package/dist/extensions/subagentPromptRuntime.d.cts.map +1 -1
  187. package/dist/extensions/subagentPromptRuntime.d.mts.map +1 -1
  188. package/dist/extensions/subagentPromptRuntime.mjs +5 -5
  189. package/dist/extensions/subagentPromptRuntime.mjs.map +1 -1
  190. package/dist/extensions/subagentTool.cjs +5 -6
  191. package/dist/extensions/subagentTool.cjs.map +1 -1
  192. package/dist/extensions/subagentTool.mjs +5 -6
  193. package/dist/extensions/subagentTool.mjs.map +1 -1
  194. package/dist/extensions/toolDescription.cjs +1 -1
  195. package/dist/extensions/toolDescription.cjs.map +1 -1
  196. package/dist/extensions/toolDescription.mjs +1 -1
  197. package/dist/extensions/toolDescription.mjs.map +1 -1
  198. package/dist/index.cjs +1 -1
  199. package/dist/index.cjs.map +1 -1
  200. package/dist/index.d.cts +2 -2
  201. package/dist/index.d.cts.map +1 -1
  202. package/dist/index.d.mts +2 -2
  203. package/dist/index.d.mts.map +1 -1
  204. package/dist/index.mjs +1 -1
  205. package/dist/index.mjs.map +1 -1
  206. package/dist/runs/background/cliRunnerEntry.cjs +1 -2
  207. package/dist/runs/background/cliRunnerEntry.mjs +1 -2
  208. package/dist/runs/sdkRunnerEntry.cjs +1 -2
  209. package/dist/runs/sdkRunnerEntry.d.cts +2 -1
  210. package/dist/runs/sdkRunnerEntry.d.mts +2 -1
  211. package/dist/runs/sdkRunnerEntry.mjs +1 -2
  212. package/dist/schemas/team/backgroundWork.cjs +2 -0
  213. package/dist/schemas/team/backgroundWork.cjs.map +1 -0
  214. package/dist/{protocol → schemas/team}/backgroundWork.d.cts +2 -2
  215. package/dist/schemas/team/backgroundWork.d.cts.map +1 -0
  216. package/dist/{protocol → schemas/team}/backgroundWork.d.mts +2 -2
  217. package/dist/schemas/team/backgroundWork.d.mts.map +1 -0
  218. package/dist/schemas/team/backgroundWork.mjs +2 -0
  219. package/dist/{protocol/backgroundWork.cjs.map → schemas/team/backgroundWork.mjs.map} +1 -1
  220. package/dist/schemas/team/capabilityCeiling.cjs +2 -0
  221. package/dist/schemas/team/capabilityCeiling.cjs.map +1 -0
  222. package/dist/{protocol → schemas/team}/capabilityCeiling.d.cts +3 -3
  223. package/dist/schemas/team/capabilityCeiling.d.cts.map +1 -0
  224. package/dist/{protocol → schemas/team}/capabilityCeiling.d.mts +3 -3
  225. package/dist/schemas/team/capabilityCeiling.d.mts.map +1 -0
  226. package/dist/schemas/team/capabilityCeiling.mjs +2 -0
  227. package/dist/schemas/team/capabilityCeiling.mjs.map +1 -0
  228. package/dist/schemas/team/delegation.cjs.map +1 -0
  229. package/dist/{protocol → schemas/team}/delegation.d.cts +1 -1
  230. package/dist/schemas/team/delegation.d.cts.map +1 -0
  231. package/dist/{protocol → schemas/team}/delegation.d.mts +1 -1
  232. package/dist/schemas/team/delegation.d.mts.map +1 -0
  233. package/dist/schemas/team/delegation.mjs.map +1 -0
  234. package/dist/schemas/team/packageConfig.cjs +2 -0
  235. package/dist/schemas/team/packageConfig.cjs.map +1 -0
  236. package/dist/schemas/team/packageConfig.mjs +2 -0
  237. package/dist/schemas/team/packageConfig.mjs.map +1 -0
  238. package/dist/services/agents/discovery.cjs +2 -0
  239. package/dist/services/agents/discovery.cjs.map +1 -0
  240. package/dist/services/agents/discovery.mjs +2 -0
  241. package/dist/services/agents/discovery.mjs.map +1 -0
  242. package/dist/services/agents/frontmatter.cjs.map +1 -0
  243. package/dist/{agents → services/agents}/frontmatter.mjs +1 -1
  244. package/dist/services/agents/frontmatter.mjs.map +1 -0
  245. package/dist/services/agents/loader.cjs +2 -0
  246. package/dist/services/agents/loader.cjs.map +1 -0
  247. package/dist/services/agents/loader.mjs +2 -0
  248. package/dist/services/agents/loader.mjs.map +1 -0
  249. package/dist/services/agents/memory.cjs +3 -0
  250. package/dist/services/agents/memory.cjs.map +1 -0
  251. package/dist/{agents → services/agents}/memory.mjs +1 -1
  252. package/dist/services/agents/memory.mjs.map +1 -0
  253. package/dist/services/agents/projectRoot.cjs +2 -0
  254. package/dist/services/agents/projectRoot.cjs.map +1 -0
  255. package/dist/services/agents/projectRoot.mjs +2 -0
  256. package/dist/services/agents/projectRoot.mjs.map +1 -0
  257. package/dist/services/agents/settings.cjs +2 -0
  258. package/dist/services/agents/settings.cjs.map +1 -0
  259. package/dist/services/agents/settings.mjs +2 -0
  260. package/dist/services/agents/settings.mjs.map +1 -0
  261. package/dist/services/agents/skills.cjs +0 -0
  262. package/dist/services/agents/skills.cjs.map +1 -0
  263. package/dist/services/agents/skills.mjs +5 -0
  264. package/dist/services/agents/skills.mjs.map +1 -0
  265. package/dist/{agents → services/agents}/types.d.cts +4 -4
  266. package/dist/services/agents/types.d.cts.map +1 -0
  267. package/dist/{agents → services/agents}/types.d.mts +4 -4
  268. package/dist/services/agents/types.d.mts.map +1 -0
  269. package/dist/services/api/backgroundWork.cjs +1 -0
  270. package/dist/services/api/backgroundWork.d.cts +1 -0
  271. package/dist/services/api/backgroundWork.d.mts +1 -0
  272. package/dist/services/api/backgroundWork.mjs +1 -0
  273. package/dist/services/api/capabilityCeiling.cjs +1 -0
  274. package/dist/services/api/capabilityCeiling.d.cts +2 -0
  275. package/dist/services/api/capabilityCeiling.d.mts +2 -0
  276. package/dist/services/api/capabilityCeiling.mjs +2 -0
  277. package/dist/services/api/capabilityCeiling.mjs.map +1 -0
  278. package/dist/services/api/teamSnapshot.cjs +1 -0
  279. package/dist/services/api/teamSnapshot.d.cts +1 -0
  280. package/dist/services/api/teamSnapshot.d.mts +1 -0
  281. package/dist/services/api/teamSnapshot.mjs +2 -0
  282. package/dist/services/api/teamSnapshot.mjs.map +1 -0
  283. package/dist/services/intercom/intercomBridge.cjs.map +1 -0
  284. package/dist/services/intercom/intercomBridge.mjs.map +1 -0
  285. package/dist/services/intercom/nativeTeamChannel.cjs +5 -0
  286. package/dist/services/intercom/nativeTeamChannel.cjs.map +1 -0
  287. package/dist/{intercom → services/intercom}/nativeTeamChannel.d.cts +1 -1
  288. package/dist/services/intercom/nativeTeamChannel.d.cts.map +1 -0
  289. package/dist/{intercom → services/intercom}/nativeTeamChannel.d.mts +1 -1
  290. package/dist/services/intercom/nativeTeamChannel.d.mts.map +1 -0
  291. package/dist/services/intercom/nativeTeamChannel.mjs +5 -0
  292. package/dist/services/intercom/nativeTeamChannel.mjs.map +1 -0
  293. package/dist/services/intercom/supervisorControlChannel.cjs +2 -0
  294. package/dist/services/intercom/supervisorControlChannel.cjs.map +1 -0
  295. package/dist/{intercom → services/intercom}/supervisorControlChannel.mjs +1 -1
  296. package/dist/services/intercom/supervisorControlChannel.mjs.map +1 -0
  297. package/dist/services/runs/background/asyncExecution.cjs +2 -0
  298. package/dist/services/runs/background/asyncExecution.cjs.map +1 -0
  299. package/dist/services/runs/background/asyncExecution.mjs +2 -0
  300. package/dist/services/runs/background/asyncExecution.mjs.map +1 -0
  301. package/dist/services/runs/background/asyncJobTracker.cjs +1 -0
  302. package/dist/services/runs/background/asyncJobTracker.mjs +2 -0
  303. package/dist/services/runs/background/asyncJobTracker.mjs.map +1 -0
  304. package/dist/services/runs/background/cliRunnerEntry.cjs +2 -0
  305. package/dist/services/runs/background/cliRunnerEntry.cjs.map +1 -0
  306. package/dist/services/runs/background/cliRunnerEntry.mjs +2 -0
  307. package/dist/services/runs/background/cliRunnerEntry.mjs.map +1 -0
  308. package/dist/services/runs/background/completionBatcher.cjs.map +1 -0
  309. package/dist/services/runs/background/completionBatcher.mjs +2 -0
  310. package/dist/services/runs/background/completionBatcher.mjs.map +1 -0
  311. package/dist/{runs → services/runs}/background/notify.cjs +1 -1
  312. package/dist/services/runs/background/notify.cjs.map +1 -0
  313. package/dist/{runs → services/runs}/background/notify.mjs +1 -1
  314. package/dist/services/runs/background/notify.mjs.map +1 -0
  315. package/dist/services/runs/background/parentWatchdog.cjs.map +1 -0
  316. package/dist/services/runs/background/parentWatchdog.mjs.map +1 -0
  317. package/dist/services/runs/background/processTerminal.cjs +1 -0
  318. package/dist/services/runs/background/processTerminal.mjs +2 -0
  319. package/dist/services/runs/background/processTerminal.mjs.map +1 -0
  320. package/dist/services/runs/background/resultWatcher.cjs +1 -0
  321. package/dist/services/runs/background/resultWatcher.mjs +2 -0
  322. package/dist/services/runs/background/resultWatcher.mjs.map +1 -0
  323. package/dist/services/runs/background/runIdResolver.cjs +1 -0
  324. package/dist/services/runs/background/runIdResolver.mjs +2 -0
  325. package/dist/services/runs/background/runIdResolver.mjs.map +1 -0
  326. package/dist/services/runs/background/runnerBootstrap.cjs +2 -0
  327. package/dist/services/runs/background/runnerBootstrap.cjs.map +1 -0
  328. package/dist/services/runs/background/runnerBootstrap.mjs +2 -0
  329. package/dist/services/runs/background/runnerBootstrap.mjs.map +1 -0
  330. package/dist/services/runs/background/runnerExecution.cjs +2 -0
  331. package/dist/services/runs/background/runnerExecution.cjs.map +1 -0
  332. package/dist/services/runs/background/runnerExecution.mjs +2 -0
  333. package/dist/services/runs/background/runnerExecution.mjs.map +1 -0
  334. package/dist/{runs → services/runs}/background/runnerReporting.cjs +2 -2
  335. package/dist/services/runs/background/runnerReporting.cjs.map +1 -0
  336. package/dist/{runs → services/runs}/background/runnerReporting.mjs +2 -2
  337. package/dist/services/runs/background/runnerReporting.mjs.map +1 -0
  338. package/dist/services/runs/background/runnerTeamMembership.cjs +2 -0
  339. package/dist/services/runs/background/runnerTeamMembership.cjs.map +1 -0
  340. package/dist/services/runs/background/runnerTeamMembership.mjs +2 -0
  341. package/dist/services/runs/background/runnerTeamMembership.mjs.map +1 -0
  342. package/dist/services/runs/background/spawnHandshake.cjs +2 -0
  343. package/dist/services/runs/background/spawnHandshake.cjs.map +1 -0
  344. package/dist/services/runs/background/spawnHandshake.mjs +2 -0
  345. package/dist/services/runs/background/spawnHandshake.mjs.map +1 -0
  346. package/dist/services/runs/background/staleRunReconciler.cjs +1 -0
  347. package/dist/services/runs/background/staleRunReconciler.mjs +2 -0
  348. package/dist/services/runs/background/staleRunReconciler.mjs.map +1 -0
  349. package/dist/services/runs/background/statusReader.cjs +1 -0
  350. package/dist/services/runs/background/statusReader.mjs +2 -0
  351. package/dist/services/runs/background/statusReader.mjs.map +1 -0
  352. package/dist/services/runs/background/statusWriter.cjs +2 -0
  353. package/dist/services/runs/background/statusWriter.cjs.map +1 -0
  354. package/dist/services/runs/background/statusWriter.mjs +2 -0
  355. package/dist/services/runs/background/statusWriter.mjs.map +1 -0
  356. package/dist/services/runs/background/subagentWait.cjs +2 -0
  357. package/dist/services/runs/background/subagentWait.cjs.map +1 -0
  358. package/dist/services/runs/background/subagentWait.mjs +2 -0
  359. package/dist/services/runs/background/subagentWait.mjs.map +1 -0
  360. package/dist/{runs/background/terminalPersistence.mjs → services/runs/background/terminalPersistence.cjs} +2 -2
  361. package/dist/services/runs/background/terminalPersistence.cjs.map +1 -0
  362. package/dist/services/runs/background/terminalPersistence.mjs +2 -0
  363. package/dist/services/runs/background/terminalPersistence.mjs.map +1 -0
  364. package/dist/services/runs/extensionErrorTelemetry.cjs +2 -0
  365. package/dist/services/runs/extensionErrorTelemetry.cjs.map +1 -0
  366. package/dist/services/runs/extensionErrorTelemetry.mjs +2 -0
  367. package/dist/services/runs/extensionErrorTelemetry.mjs.map +1 -0
  368. package/dist/services/runs/registry/processGroup.cjs.map +1 -0
  369. package/dist/services/runs/registry/processGroup.mjs.map +1 -0
  370. package/dist/services/runs/registry/runRegistry.cjs +1 -0
  371. package/dist/services/runs/registry/runRegistry.mjs +2 -0
  372. package/dist/services/runs/registry/runRegistry.mjs.map +1 -0
  373. package/dist/services/runs/registry/sessionLifecycle.cjs +2 -0
  374. package/dist/services/runs/registry/sessionLifecycle.cjs.map +1 -0
  375. package/dist/services/runs/registry/sessionLifecycle.mjs +2 -0
  376. package/dist/services/runs/registry/sessionLifecycle.mjs.map +1 -0
  377. package/dist/services/runs/registry/suspendedRuns.cjs +1 -0
  378. package/dist/services/runs/registry/suspendedRuns.mjs +2 -0
  379. package/dist/services/runs/registry/suspendedRuns.mjs.map +1 -0
  380. package/dist/services/runs/sdkRunnerEntry.cjs +1 -0
  381. package/dist/services/runs/sdkRunnerEntry.mjs +1 -0
  382. package/dist/services/runs/shared/claudeFableProfile.cjs +4 -0
  383. package/dist/services/runs/shared/claudeFableProfile.cjs.map +1 -0
  384. package/dist/services/runs/shared/claudeFableProfile.mjs +4 -0
  385. package/dist/services/runs/shared/claudeFableProfile.mjs.map +1 -0
  386. package/dist/services/runs/shared/depthGuard.cjs +2 -0
  387. package/dist/services/runs/shared/depthGuard.cjs.map +1 -0
  388. package/dist/services/runs/shared/depthGuard.mjs +2 -0
  389. package/dist/services/runs/shared/depthGuard.mjs.map +1 -0
  390. package/dist/services/runs/shared/mcpDirectToolAllowlist.cjs +2 -0
  391. package/dist/services/runs/shared/mcpDirectToolAllowlist.cjs.map +1 -0
  392. package/dist/services/runs/shared/mcpDirectToolAllowlist.mjs +2 -0
  393. package/dist/services/runs/shared/mcpDirectToolAllowlist.mjs.map +1 -0
  394. package/dist/services/runs/shared/modelFallback.cjs +2 -0
  395. package/dist/services/runs/shared/modelFallback.cjs.map +1 -0
  396. package/dist/services/runs/shared/modelFallback.mjs +2 -0
  397. package/dist/services/runs/shared/modelFallback.mjs.map +1 -0
  398. package/dist/services/runs/shared/modelScope.cjs +2 -0
  399. package/dist/services/runs/shared/modelScope.cjs.map +1 -0
  400. package/dist/services/runs/shared/modelScope.mjs +2 -0
  401. package/dist/services/runs/shared/modelScope.mjs.map +1 -0
  402. package/dist/services/runs/shared/nestedPath.cjs +2 -0
  403. package/dist/services/runs/shared/nestedPath.cjs.map +1 -0
  404. package/dist/services/runs/shared/nestedPath.mjs +2 -0
  405. package/dist/services/runs/shared/nestedPath.mjs.map +1 -0
  406. package/dist/services/runs/shared/piArgs.cjs +2 -0
  407. package/dist/services/runs/shared/piArgs.cjs.map +1 -0
  408. package/dist/services/runs/shared/piArgs.mjs +2 -0
  409. package/dist/services/runs/shared/piArgs.mjs.map +1 -0
  410. package/dist/services/runs/shared/piSpawn.cjs +2 -0
  411. package/dist/services/runs/shared/piSpawn.cjs.map +1 -0
  412. package/dist/services/runs/shared/piSpawn.mjs +2 -0
  413. package/dist/services/runs/shared/piSpawn.mjs.map +1 -0
  414. package/dist/services/runs/shared/runWithConcurrency.cjs +2 -0
  415. package/dist/services/runs/shared/runWithConcurrency.cjs.map +1 -0
  416. package/dist/services/runs/shared/runWithConcurrency.d.cts +25 -0
  417. package/dist/services/runs/shared/runWithConcurrency.d.cts.map +1 -0
  418. package/dist/services/runs/shared/runWithConcurrency.d.mts +25 -0
  419. package/dist/services/runs/shared/runWithConcurrency.d.mts.map +1 -0
  420. package/dist/services/runs/shared/runWithConcurrency.mjs +2 -0
  421. package/dist/services/runs/shared/runWithConcurrency.mjs.map +1 -0
  422. package/dist/services/runs/shared/runtimeRegistry.cjs +2 -0
  423. package/dist/services/runs/shared/runtimeRegistry.cjs.map +1 -0
  424. package/dist/services/runs/shared/runtimeRegistry.mjs +2 -0
  425. package/dist/services/runs/shared/runtimeRegistry.mjs.map +1 -0
  426. package/dist/services/runs/shared/structuredOutput.cjs +2 -0
  427. package/dist/{runs → services/runs}/shared/structuredOutput.cjs.map +1 -1
  428. package/dist/services/runs/shared/structuredOutput.mjs +2 -0
  429. package/dist/{runs → services/runs}/shared/structuredOutput.mjs.map +1 -1
  430. package/dist/services/runs/shared/toolAvailability.cjs +2 -0
  431. package/dist/services/runs/shared/toolAvailability.cjs.map +1 -0
  432. package/dist/services/runs/shared/toolAvailability.mjs +2 -0
  433. package/dist/services/runs/shared/toolAvailability.mjs.map +1 -0
  434. package/dist/services/runs/shared/toolBudget.cjs +2 -0
  435. package/dist/services/runs/shared/toolBudget.cjs.map +1 -0
  436. package/dist/services/runs/shared/toolBudget.mjs +2 -0
  437. package/dist/services/runs/shared/toolBudget.mjs.map +1 -0
  438. package/dist/shared/artifacts.cjs.map +1 -1
  439. package/dist/shared/artifacts.mjs.map +1 -1
  440. package/dist/shared/atomicJson.cjs +1 -2
  441. package/dist/shared/atomicJson.mjs +1 -1
  442. package/dist/shared/atomicJson.mjs.map +1 -1
  443. package/dist/shared/childTranscript.cjs +1 -5
  444. package/dist/shared/childTranscript.mjs +1 -4
  445. package/dist/shared/childTranscript.mjs.map +1 -1
  446. package/dist/shared/fileSystemRetry.cjs +1 -1
  447. package/dist/shared/fileSystemRetry.cjs.map +1 -1
  448. package/dist/shared/fileSystemRetry.mjs +1 -1
  449. package/dist/shared/fileSystemRetry.mjs.map +1 -1
  450. package/dist/shared/formatters.cjs.map +1 -1
  451. package/dist/shared/formatters.mjs.map +1 -1
  452. package/dist/shared/paths.cjs +1 -1
  453. package/dist/shared/paths.cjs.map +1 -1
  454. package/dist/shared/paths.mjs +1 -1
  455. package/dist/shared/paths.mjs.map +1 -1
  456. package/dist/shared/pollScheduler.cjs +1 -2
  457. package/dist/shared/pollScheduler.mjs +1 -1
  458. package/dist/shared/pollScheduler.mjs.map +1 -1
  459. package/dist/shared/scopeOwner.cjs +1 -2
  460. package/dist/shared/scopeOwner.mjs +1 -1
  461. package/dist/shared/scopeOwner.mjs.map +1 -1
  462. package/dist/tui/agentCatalog.cjs +1 -1
  463. package/dist/tui/agentCatalog.cjs.map +1 -1
  464. package/dist/tui/agentCatalog.mjs +1 -1
  465. package/dist/tui/agentCatalog.mjs.map +1 -1
  466. package/dist/tui/agentResourceProjection.cjs +1 -1
  467. package/dist/tui/agentResourceProjection.cjs.map +1 -1
  468. package/dist/tui/agentResourceProjection.mjs +1 -1
  469. package/dist/tui/agentResourceProjection.mjs.map +1 -1
  470. package/dist/tui/completionNotice.cjs +1 -1
  471. package/dist/tui/completionNotice.cjs.map +1 -1
  472. package/dist/tui/completionNotice.mjs +1 -1
  473. package/dist/tui/completionNotice.mjs.map +1 -1
  474. package/dist/tui/fleet.cjs +2 -2
  475. package/dist/tui/fleet.cjs.map +1 -1
  476. package/dist/tui/fleet.mjs +2 -2
  477. package/dist/tui/fleet.mjs.map +1 -1
  478. package/dist/tui/fleetAgentView.cjs.map +1 -1
  479. package/dist/tui/fleetAgentView.mjs.map +1 -1
  480. package/dist/tui/fleetStatus.cjs +1 -1
  481. package/dist/tui/fleetStatus.cjs.map +1 -1
  482. package/dist/tui/fleetStatus.mjs +1 -1
  483. package/dist/tui/fleetStatus.mjs.map +1 -1
  484. package/dist/tui/fleetTranscript.cjs +1 -1
  485. package/dist/tui/fleetTranscript.cjs.map +1 -1
  486. package/dist/tui/fleetTranscript.mjs +1 -1
  487. package/dist/tui/fleetTranscript.mjs.map +1 -1
  488. package/dist/tui/register.cjs +1 -1
  489. package/dist/tui/register.cjs.map +1 -1
  490. package/dist/tui/register.mjs +1 -1
  491. package/dist/tui/register.mjs.map +1 -1
  492. package/dist/tui/subagentToolRender.cjs +3 -0
  493. package/dist/tui/subagentToolRender.cjs.map +1 -0
  494. package/dist/tui/subagentToolRender.mjs +3 -0
  495. package/dist/tui/subagentToolRender.mjs.map +1 -0
  496. package/dist/{types.d.cts → types/index.d.cts} +2 -2
  497. package/dist/types/index.d.cts.map +1 -0
  498. package/dist/{types.d.mts → types/index.d.mts} +2 -2
  499. package/dist/types/index.d.mts.map +1 -0
  500. package/package.json +23 -16
  501. package/dist/agents/discovery.cjs +0 -2
  502. package/dist/agents/discovery.cjs.map +0 -1
  503. package/dist/agents/discovery.mjs +0 -2
  504. package/dist/agents/discovery.mjs.map +0 -1
  505. package/dist/agents/frontmatter.cjs.map +0 -1
  506. package/dist/agents/frontmatter.mjs.map +0 -1
  507. package/dist/agents/loader.cjs +0 -2
  508. package/dist/agents/loader.cjs.map +0 -1
  509. package/dist/agents/loader.mjs +0 -2
  510. package/dist/agents/loader.mjs.map +0 -1
  511. package/dist/agents/memory.cjs +0 -3
  512. package/dist/agents/memory.cjs.map +0 -1
  513. package/dist/agents/memory.mjs.map +0 -1
  514. package/dist/agents/projectRoot.cjs +0 -2
  515. package/dist/agents/projectRoot.cjs.map +0 -1
  516. package/dist/agents/projectRoot.mjs +0 -2
  517. package/dist/agents/projectRoot.mjs.map +0 -1
  518. package/dist/agents/settings.cjs +0 -2
  519. package/dist/agents/settings.cjs.map +0 -1
  520. package/dist/agents/settings.mjs +0 -2
  521. package/dist/agents/settings.mjs.map +0 -1
  522. package/dist/agents/skills.cjs +0 -0
  523. package/dist/agents/skills.cjs.map +0 -1
  524. package/dist/agents/skills.mjs +0 -5
  525. package/dist/agents/skills.mjs.map +0 -1
  526. package/dist/agents/types.d.cts.map +0 -1
  527. package/dist/agents/types.d.mts.map +0 -1
  528. package/dist/api/capabilityCeiling.mjs.map +0 -1
  529. package/dist/api/teamSnapshot.mjs.map +0 -1
  530. package/dist/env.cjs.map +0 -1
  531. package/dist/env.d.cts.map +0 -1
  532. package/dist/env.d.mts.map +0 -1
  533. package/dist/extension.cjs +0 -2
  534. package/dist/extension.cjs.map +0 -1
  535. package/dist/extension.mjs +0 -2
  536. package/dist/extension.mjs.map +0 -1
  537. package/dist/intercom/intercomBridge.cjs.map +0 -1
  538. package/dist/intercom/intercomBridge.mjs.map +0 -1
  539. package/dist/intercom/nativeTeamChannel.cjs +0 -5
  540. package/dist/intercom/nativeTeamChannel.cjs.map +0 -1
  541. package/dist/intercom/nativeTeamChannel.d.cts.map +0 -1
  542. package/dist/intercom/nativeTeamChannel.d.mts.map +0 -1
  543. package/dist/intercom/nativeTeamChannel.mjs +0 -5
  544. package/dist/intercom/nativeTeamChannel.mjs.map +0 -1
  545. package/dist/intercom/supervisorControlChannel.cjs +0 -2
  546. package/dist/intercom/supervisorControlChannel.cjs.map +0 -1
  547. package/dist/intercom/supervisorControlChannel.mjs.map +0 -1
  548. package/dist/protocol/backgroundWork.cjs +0 -2
  549. package/dist/protocol/backgroundWork.d.cts.map +0 -1
  550. package/dist/protocol/backgroundWork.d.mts.map +0 -1
  551. package/dist/protocol/backgroundWork.mjs +0 -2
  552. package/dist/protocol/backgroundWork.mjs.map +0 -1
  553. package/dist/protocol/capabilityCeiling.cjs +0 -2
  554. package/dist/protocol/capabilityCeiling.cjs.map +0 -1
  555. package/dist/protocol/capabilityCeiling.d.cts.map +0 -1
  556. package/dist/protocol/capabilityCeiling.d.mts.map +0 -1
  557. package/dist/protocol/capabilityCeiling.mjs +0 -2
  558. package/dist/protocol/capabilityCeiling.mjs.map +0 -1
  559. package/dist/protocol/delegation.cjs.map +0 -1
  560. package/dist/protocol/delegation.d.cts.map +0 -1
  561. package/dist/protocol/delegation.d.mts.map +0 -1
  562. package/dist/protocol/delegation.mjs.map +0 -1
  563. package/dist/runs/background/asyncExecution.cjs +0 -2
  564. package/dist/runs/background/asyncExecution.cjs.map +0 -1
  565. package/dist/runs/background/asyncExecution.mjs +0 -2
  566. package/dist/runs/background/asyncExecution.mjs.map +0 -1
  567. package/dist/runs/background/asyncJobTracker.cjs +0 -2
  568. package/dist/runs/background/asyncJobTracker.cjs.map +0 -1
  569. package/dist/runs/background/asyncJobTracker.mjs +0 -2
  570. package/dist/runs/background/asyncJobTracker.mjs.map +0 -1
  571. package/dist/runs/background/cliRunnerEntry.cjs.map +0 -1
  572. package/dist/runs/background/cliRunnerEntry.mjs.map +0 -1
  573. package/dist/runs/background/completionBatcher.cjs.map +0 -1
  574. package/dist/runs/background/completionBatcher.mjs +0 -2
  575. package/dist/runs/background/completionBatcher.mjs.map +0 -1
  576. package/dist/runs/background/notify.cjs.map +0 -1
  577. package/dist/runs/background/notify.mjs.map +0 -1
  578. package/dist/runs/background/parentWatchdog.cjs.map +0 -1
  579. package/dist/runs/background/parentWatchdog.mjs.map +0 -1
  580. package/dist/runs/background/processTerminal.cjs +0 -2
  581. package/dist/runs/background/processTerminal.cjs.map +0 -1
  582. package/dist/runs/background/processTerminal.mjs +0 -2
  583. package/dist/runs/background/processTerminal.mjs.map +0 -1
  584. package/dist/runs/background/resultWatcher.cjs +0 -2
  585. package/dist/runs/background/resultWatcher.cjs.map +0 -1
  586. package/dist/runs/background/resultWatcher.mjs +0 -2
  587. package/dist/runs/background/resultWatcher.mjs.map +0 -1
  588. package/dist/runs/background/runIdResolver.cjs +0 -2
  589. package/dist/runs/background/runIdResolver.cjs.map +0 -1
  590. package/dist/runs/background/runIdResolver.mjs +0 -2
  591. package/dist/runs/background/runIdResolver.mjs.map +0 -1
  592. package/dist/runs/background/runnerBootstrap.cjs +0 -2
  593. package/dist/runs/background/runnerBootstrap.cjs.map +0 -1
  594. package/dist/runs/background/runnerBootstrap.mjs +0 -2
  595. package/dist/runs/background/runnerBootstrap.mjs.map +0 -1
  596. package/dist/runs/background/runnerExecution.cjs +0 -2
  597. package/dist/runs/background/runnerExecution.cjs.map +0 -1
  598. package/dist/runs/background/runnerExecution.mjs +0 -2
  599. package/dist/runs/background/runnerExecution.mjs.map +0 -1
  600. package/dist/runs/background/runnerReporting.cjs.map +0 -1
  601. package/dist/runs/background/runnerReporting.mjs.map +0 -1
  602. package/dist/runs/background/runnerTeamMembership.cjs +0 -2
  603. package/dist/runs/background/runnerTeamMembership.cjs.map +0 -1
  604. package/dist/runs/background/runnerTeamMembership.mjs +0 -2
  605. package/dist/runs/background/runnerTeamMembership.mjs.map +0 -1
  606. package/dist/runs/background/spawnHandshake.cjs +0 -2
  607. package/dist/runs/background/spawnHandshake.cjs.map +0 -1
  608. package/dist/runs/background/spawnHandshake.mjs +0 -2
  609. package/dist/runs/background/spawnHandshake.mjs.map +0 -1
  610. package/dist/runs/background/staleRunReconciler.cjs +0 -2
  611. package/dist/runs/background/staleRunReconciler.cjs.map +0 -1
  612. package/dist/runs/background/staleRunReconciler.mjs +0 -2
  613. package/dist/runs/background/staleRunReconciler.mjs.map +0 -1
  614. package/dist/runs/background/statusReader.cjs +0 -2
  615. package/dist/runs/background/statusReader.cjs.map +0 -1
  616. package/dist/runs/background/statusReader.mjs +0 -2
  617. package/dist/runs/background/statusReader.mjs.map +0 -1
  618. package/dist/runs/background/statusWriter.cjs +0 -2
  619. package/dist/runs/background/statusWriter.cjs.map +0 -1
  620. package/dist/runs/background/statusWriter.mjs +0 -2
  621. package/dist/runs/background/statusWriter.mjs.map +0 -1
  622. package/dist/runs/background/subagentWait.cjs +0 -2
  623. package/dist/runs/background/subagentWait.cjs.map +0 -1
  624. package/dist/runs/background/subagentWait.mjs +0 -2
  625. package/dist/runs/background/subagentWait.mjs.map +0 -1
  626. package/dist/runs/background/terminalPersistence.cjs +0 -2
  627. package/dist/runs/background/terminalPersistence.cjs.map +0 -1
  628. package/dist/runs/background/terminalPersistence.mjs.map +0 -1
  629. package/dist/runs/registry/processGroup.cjs.map +0 -1
  630. package/dist/runs/registry/processGroup.mjs.map +0 -1
  631. package/dist/runs/registry/runRegistry.cjs +0 -2
  632. package/dist/runs/registry/runRegistry.cjs.map +0 -1
  633. package/dist/runs/registry/runRegistry.mjs +0 -2
  634. package/dist/runs/registry/runRegistry.mjs.map +0 -1
  635. package/dist/runs/registry/sessionLifecycle.cjs +0 -2
  636. package/dist/runs/registry/sessionLifecycle.cjs.map +0 -1
  637. package/dist/runs/registry/sessionLifecycle.mjs +0 -2
  638. package/dist/runs/registry/sessionLifecycle.mjs.map +0 -1
  639. package/dist/runs/registry/suspendedRuns.cjs +0 -4
  640. package/dist/runs/registry/suspendedRuns.cjs.map +0 -1
  641. package/dist/runs/registry/suspendedRuns.mjs +0 -4
  642. package/dist/runs/registry/suspendedRuns.mjs.map +0 -1
  643. package/dist/runs/sdkRunnerEntry.cjs.map +0 -1
  644. package/dist/runs/sdkRunnerEntry.mjs.map +0 -1
  645. package/dist/runs/shared/claudeFableProfile.cjs +0 -4
  646. package/dist/runs/shared/claudeFableProfile.cjs.map +0 -1
  647. package/dist/runs/shared/claudeFableProfile.mjs +0 -4
  648. package/dist/runs/shared/claudeFableProfile.mjs.map +0 -1
  649. package/dist/runs/shared/depthGuard.cjs +0 -2
  650. package/dist/runs/shared/depthGuard.cjs.map +0 -1
  651. package/dist/runs/shared/depthGuard.mjs +0 -2
  652. package/dist/runs/shared/depthGuard.mjs.map +0 -1
  653. package/dist/runs/shared/mcpDirectToolAllowlist.cjs +0 -2
  654. package/dist/runs/shared/mcpDirectToolAllowlist.cjs.map +0 -1
  655. package/dist/runs/shared/mcpDirectToolAllowlist.mjs +0 -2
  656. package/dist/runs/shared/mcpDirectToolAllowlist.mjs.map +0 -1
  657. package/dist/runs/shared/modelFallback.cjs +0 -2
  658. package/dist/runs/shared/modelFallback.cjs.map +0 -1
  659. package/dist/runs/shared/modelFallback.mjs +0 -2
  660. package/dist/runs/shared/modelFallback.mjs.map +0 -1
  661. package/dist/runs/shared/modelScope.cjs +0 -2
  662. package/dist/runs/shared/modelScope.cjs.map +0 -1
  663. package/dist/runs/shared/modelScope.mjs +0 -2
  664. package/dist/runs/shared/modelScope.mjs.map +0 -1
  665. package/dist/runs/shared/nestedPath.cjs +0 -2
  666. package/dist/runs/shared/nestedPath.cjs.map +0 -1
  667. package/dist/runs/shared/nestedPath.mjs +0 -2
  668. package/dist/runs/shared/nestedPath.mjs.map +0 -1
  669. package/dist/runs/shared/piArgs.cjs +0 -2
  670. package/dist/runs/shared/piArgs.cjs.map +0 -1
  671. package/dist/runs/shared/piArgs.mjs +0 -2
  672. package/dist/runs/shared/piArgs.mjs.map +0 -1
  673. package/dist/runs/shared/piSpawn.cjs +0 -2
  674. package/dist/runs/shared/piSpawn.cjs.map +0 -1
  675. package/dist/runs/shared/piSpawn.mjs +0 -2
  676. package/dist/runs/shared/piSpawn.mjs.map +0 -1
  677. package/dist/runs/shared/runWithConcurrency.cjs +0 -2
  678. package/dist/runs/shared/runWithConcurrency.cjs.map +0 -1
  679. package/dist/runs/shared/runWithConcurrency.mjs +0 -2
  680. package/dist/runs/shared/runWithConcurrency.mjs.map +0 -1
  681. package/dist/runs/shared/runtimeRegistry.cjs +0 -2
  682. package/dist/runs/shared/runtimeRegistry.cjs.map +0 -1
  683. package/dist/runs/shared/runtimeRegistry.mjs +0 -2
  684. package/dist/runs/shared/runtimeRegistry.mjs.map +0 -1
  685. package/dist/runs/shared/structuredOutput.cjs +0 -2
  686. package/dist/runs/shared/structuredOutput.mjs +0 -2
  687. package/dist/runs/shared/toolAvailability.cjs +0 -2
  688. package/dist/runs/shared/toolAvailability.cjs.map +0 -1
  689. package/dist/runs/shared/toolAvailability.mjs +0 -2
  690. package/dist/runs/shared/toolAvailability.mjs.map +0 -1
  691. package/dist/runs/shared/toolBudget.cjs +0 -2
  692. package/dist/runs/shared/toolBudget.cjs.map +0 -1
  693. package/dist/runs/shared/toolBudget.mjs +0 -2
  694. package/dist/runs/shared/toolBudget.mjs.map +0 -1
  695. package/dist/shared/atomicJson.cjs.map +0 -1
  696. package/dist/shared/childTranscript.cjs.map +0 -1
  697. package/dist/shared/pollScheduler.cjs.map +0 -1
  698. package/dist/shared/scopeOwner.cjs.map +0 -1
  699. package/dist/slash/chainExpression.cjs.map +0 -1
  700. package/dist/slash/chainExpression.mjs.map +0 -1
  701. package/dist/slash/doctor.cjs +0 -5
  702. package/dist/slash/doctor.mjs +0 -5
  703. package/dist/slash/doctor.mjs.map +0 -1
  704. package/dist/slash/slashCommands.cjs.map +0 -1
  705. package/dist/slash/slashCommands.mjs.map +0 -1
  706. package/dist/slash/spawnRequestMapping.cjs.map +0 -1
  707. package/dist/slash/spawnRequestMapping.mjs.map +0 -1
  708. package/dist/slash/subagentLaunch.cjs +0 -2
  709. package/dist/slash/subagentLaunch.cjs.map +0 -1
  710. package/dist/slash/subagentLaunch.mjs +0 -2
  711. package/dist/slash/subagentLaunch.mjs.map +0 -1
  712. package/dist/types.d.cts.map +0 -1
  713. package/dist/types.d.mts.map +0 -1
  714. /package/dist/{slash → commands/slash}/chainExpression.cjs +0 -0
  715. /package/dist/{slash → commands/slash}/chainExpression.mjs +0 -0
  716. /package/dist/{slash → commands/slash}/spawnRequestMapping.cjs +0 -0
  717. /package/dist/{slash → commands/slash}/spawnRequestMapping.mjs +0 -0
  718. /package/dist/{protocol → schemas/team}/delegation.cjs +0 -0
  719. /package/dist/{protocol → schemas/team}/delegation.mjs +0 -0
  720. /package/dist/{agents → services/agents}/frontmatter.cjs +0 -0
  721. /package/dist/{intercom → services/intercom}/intercomBridge.cjs +0 -0
  722. /package/dist/{intercom → services/intercom}/intercomBridge.mjs +0 -0
  723. /package/dist/{runs → services/runs}/background/completionBatcher.cjs +0 -0
  724. /package/dist/{runs → services/runs}/background/parentWatchdog.cjs +0 -0
  725. /package/dist/{runs → services/runs}/background/parentWatchdog.mjs +0 -0
  726. /package/dist/{runs → services/runs}/registry/processGroup.cjs +0 -0
  727. /package/dist/{runs → services/runs}/registry/processGroup.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundWork.cjs","names":["GlobalStateBridge"],"sources":["../../src/protocol/backgroundWork.ts"],"sourcesContent":["/**\n * Background-work registry - a cross-bundle protocol.\n *\n * DESIGN PATTERNS:\n * - Process-global registry keyed by `Symbol.for`, so every bundle that speaks\n * the protocol shares one map regardless of how many copies are loaded\n * - Validate on read as well as on write: entries can be authored by a foreign\n * bundle of any version\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The key strings and version number below are shared with doom-pi-subagents\n * and with consumers built against it. During cutover both packages can be\n * loaded at once and must attach to the same registry, so these literals are\n * reproduced verbatim and pinned by contract tests.\n *\n * AVOID:\n * - Renaming the keys to a doom-team namespace; that would silently split the\n * registry in two and hide half the in-flight work from the parent\n */\n\nimport { GlobalStateBridge } from '../container/globalBridge.ts';\nimport type { IGlobalStateBridge } from '../types.ts';\n\nexport const BACKGROUND_WORK_PROTOCOL_VERSION = 1;\nexport const BACKGROUND_WORK_REGISTRY_KEY = 'pi-subagents.background-work.v1';\n\n/**\n * Backward-compatible cross-package registration bridge. Its shape is separate\n * from the v1 registry so existing hosts can keep validating that registry.\n */\nexport const BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY = 'pi-subagents.background-work.registration.v1';\nexport type BackgroundWorkRegistrationBridge = (provider: BackgroundWorkProvider) => () => void;\n\nconst MAX_PROVIDER_NAME_LENGTH = 128;\nconst MAX_PROVIDERS = 100;\nconst MAX_ITEM_ID_LENGTH = 256;\nconst MAX_SESSION_ID_LENGTH = 256;\nconst MAX_WAKE_CHANNEL_LENGTH = 256;\nconst MAX_ITEMS_PER_PROVIDER = 10_000;\nconst PROVIDER_FIELDS = ['name', 'listActiveWork', 'wakeChannels', 'reconcile'];\n\nexport interface BackgroundWorkItem {\n id: string;\n sessionId: string;\n}\n\nexport interface BackgroundWorkReconcileContext {\n sessionId: string;\n nowMs: number;\n}\n\nexport interface BackgroundWorkProvider {\n name: string;\n listActiveWork(): readonly BackgroundWorkItem[];\n wakeChannels?: readonly string[];\n reconcile?(context: BackgroundWorkReconcileContext): void;\n}\n\nexport interface RegisteredBackgroundWorkItem extends BackgroundWorkItem {\n provider: string;\n}\n\nexport interface BackgroundWorkSnapshot {\n providers: readonly string[];\n items: readonly RegisteredBackgroundWorkItem[];\n}\n\ninterface BackgroundWorkRegistry {\n version: typeof BACKGROUND_WORK_PROTOCOL_VERSION;\n providers: Map<string, BackgroundWorkProvider>;\n}\n\n/**\n * The public API functions are called by extensions that hold no container, so\n * they fall back to a standalone bridge. The bridge is a stateless accessor,\n * which makes this safe.\n */\nfunction bridgeFor(bridge?: IGlobalStateBridge): IGlobalStateBridge {\n return bridge ?? new GlobalStateBridge();\n}\n\nfunction adoptRegistry(existing: unknown): BackgroundWorkRegistry {\n if (!existing || typeof existing !== 'object' || Array.isArray(existing)) {\n throw new Error(`Malformed background-work registry at Symbol.for(\"${BACKGROUND_WORK_REGISTRY_KEY}\").`);\n }\n const candidate = existing as Partial<BackgroundWorkRegistry>;\n if (candidate.version !== BACKGROUND_WORK_PROTOCOL_VERSION || !(candidate.providers instanceof Map)) {\n throw new Error(`Unsupported background-work registry at Symbol.for(\"${BACKGROUND_WORK_REGISTRY_KEY}\").`);\n }\n return candidate as BackgroundWorkRegistry;\n}\n\nfunction registry(bridge?: IGlobalStateBridge): BackgroundWorkRegistry {\n return bridgeFor(bridge).protocolSlot<BackgroundWorkRegistry>(\n BACKGROUND_WORK_REGISTRY_KEY,\n () => ({ version: BACKGROUND_WORK_PROTOCOL_VERSION, providers: new Map() }),\n adoptRegistry,\n );\n}\n\nfunction validateString(value: unknown, field: string, maxLength: number): string {\n if (typeof value !== 'string' || value.length === 0 || value.trim() !== value) {\n throw new Error(`${field} must be a non-empty string without leading or trailing whitespace.`);\n }\n if (value.length > maxLength) throw new Error(`${field} must be at most ${maxLength} characters.`);\n if (value.includes('\\0')) throw new Error(`${field} must not contain NUL characters.`);\n return value;\n}\n\nfunction validateProvider(value: unknown): BackgroundWorkProvider {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Background-work provider must be an object.');\n }\n const provider = value as Record<string, unknown>;\n const unknownFields = Object.keys(provider).filter((key) => !PROVIDER_FIELDS.includes(key));\n if (unknownFields.length > 0) {\n throw new Error(`Background-work provider has unknown fields: ${unknownFields.join(', ')}.`);\n }\n const name = validateString(provider.name, 'Background-work provider name', MAX_PROVIDER_NAME_LENGTH);\n if (typeof provider.listActiveWork !== 'function') {\n throw new Error(`Background-work provider '${name}' must expose listActiveWork().`);\n }\n if (provider.reconcile !== undefined && typeof provider.reconcile !== 'function') {\n throw new Error(`Background-work provider '${name}' reconcile must be a function when provided.`);\n }\n if (provider.wakeChannels !== undefined) {\n if (!Array.isArray(provider.wakeChannels)) {\n throw new Error(`Background-work provider '${name}' wakeChannels must be an array when provided.`);\n }\n const channels = provider.wakeChannels.map((channel, index) =>\n validateString(channel, `Background-work provider '${name}' wakeChannels[${index}]`, MAX_WAKE_CHANNEL_LENGTH),\n );\n if (new Set(channels).size !== channels.length) {\n throw new Error(`Background-work provider '${name}' wakeChannels must not contain duplicates.`);\n }\n }\n return value as BackgroundWorkProvider;\n}\n\nfunction validateItem(provider: string, value: unknown, index: number): BackgroundWorkItem {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Background-work provider '${provider}' item ${index} must be an object.`);\n }\n const item = value as Record<string, unknown>;\n const unknownFields = Object.keys(item).filter((key) => key !== 'id' && key !== 'sessionId');\n if (unknownFields.length > 0) {\n throw new Error(\n `Background-work provider '${provider}' item ${index} has unknown fields: ${unknownFields.join(', ')}.`,\n );\n }\n return {\n id: validateString(item.id, `Background-work provider '${provider}' item ${index} id`, MAX_ITEM_ID_LENGTH),\n sessionId: validateString(\n item.sessionId,\n `Background-work provider '${provider}' item ${index} sessionId`,\n MAX_SESSION_ID_LENGTH,\n ),\n };\n}\n\n/**\n * Register or replace one process-local background-work provider. The returned\n * disposer only removes this exact registration, so an old extension reload\n * cannot unregister its replacement.\n */\nexport function registerBackgroundWorkProvider(\n provider: BackgroundWorkProvider,\n bridge?: IGlobalStateBridge,\n): () => void {\n const validated = validateProvider(provider);\n const current = registry(bridge);\n if (!current.providers.has(validated.name) && current.providers.size >= MAX_PROVIDERS) {\n throw new Error(`Background-work registry supports at most ${MAX_PROVIDERS} providers.`);\n }\n current.providers.set(validated.name, validated);\n return () => {\n if (current.providers.get(validated.name) === validated) current.providers.delete(validated.name);\n };\n}\n\nexport function listBackgroundWorkProviders(bridge?: IGlobalStateBridge): readonly BackgroundWorkProvider[] {\n const current = registry(bridge);\n if (current.providers.size > MAX_PROVIDERS) {\n throw new Error(`Background-work registry contains more than ${MAX_PROVIDERS} providers.`);\n }\n const providers: BackgroundWorkProvider[] = [];\n for (const [key, value] of current.providers) {\n const provider = validateProvider(value);\n if (key !== provider.name) {\n throw new Error(`Background-work registry key '${key}' does not match provider name '${provider.name}'.`);\n }\n providers.push(provider);\n }\n return providers;\n}\n\n/** Read validated provider wake channels without reconciling or listing work. */\nexport function listBackgroundWorkWakeChannels(bridge?: IGlobalStateBridge): readonly string[] {\n const channels = new Set<string>();\n for (const provider of listBackgroundWorkProviders(bridge)) {\n for (const channel of provider.wakeChannels ?? []) channels.add(channel);\n }\n return [...channels];\n}\n\n/** Reconcile and snapshot active provider work owned by one exact Pi session. */\nexport function snapshotBackgroundWork(\n sessionId: string,\n nowMs = Date.now(),\n bridge?: IGlobalStateBridge,\n): BackgroundWorkSnapshot {\n validateString(sessionId, 'Background-work snapshot sessionId', MAX_SESSION_ID_LENGTH);\n const providers = listBackgroundWorkProviders(bridge);\n const items: RegisteredBackgroundWorkItem[] = [];\n const identities = new Set<string>();\n for (const provider of providers) {\n try {\n provider.reconcile?.({ sessionId, nowMs });\n } catch (error) {\n throw new Error(\n `Background-work provider '${provider.name}' reconcile failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n let active: readonly BackgroundWorkItem[];\n try {\n active = provider.listActiveWork();\n } catch (error) {\n throw new Error(\n `Background-work provider '${provider.name}' listActiveWork failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n if (!Array.isArray(active)) {\n throw new Error(`Background-work provider '${provider.name}' listActiveWork() must return an array.`);\n }\n if (active.length > MAX_ITEMS_PER_PROVIDER) {\n throw new Error(\n `Background-work provider '${provider.name}' returned ${active.length} items; maximum is ${MAX_ITEMS_PER_PROVIDER}.`,\n );\n }\n active.forEach((value, index) => {\n const item = validateItem(provider.name, value, index);\n const identity = `${provider.name}\\0${item.sessionId}\\0${item.id}`;\n if (identities.has(identity)) {\n throw new Error(\n `Background-work provider '${provider.name}' returned duplicate item '${item.id}' for session '${item.sessionId}'.`,\n );\n }\n identities.add(identity);\n if (item.sessionId === sessionId) items.push({ provider: provider.name, ...item });\n });\n }\n return { providers: providers.map((provider) => provider.name), items };\n}\n\n/**\n * Publish the registration bridge for hosts that discover it by symbol rather\n * than by import. First writer wins, so a bundle loaded alongside this one keeps\n * whichever function it already installed.\n */\nexport function installBackgroundWorkRegistrationBridge(bridge?: IGlobalStateBridge): void {\n bridgeFor(bridge).claimProtocolSlot(\n BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY,\n registerBackgroundWorkProvider as BackgroundWorkRegistrationBridge,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"backgroundWork.mjs","names":[],"sources":["../../../src/schemas/team/backgroundWork.ts"],"sourcesContent":["/**\n * Background-work registry - a cross-bundle protocol.\n *\n * DESIGN PATTERNS:\n * - Process-global registry keyed by `Symbol.for`, so every bundle that speaks\n * the protocol shares one map regardless of how many copies are loaded\n * - Validate on read as well as on write: entries can be authored by a foreign\n * bundle of any version\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The key strings and version number below are shared with doom-pi-subagents\n * and with consumers built against it. During cutover both packages can be\n * loaded at once and must attach to the same registry, so these literals are\n * reproduced verbatim and pinned by contract tests.\n *\n * AVOID:\n * - Renaming the keys to a doom-team namespace; that would silently split the\n * registry in two and hide half the in-flight work from the parent\n */\n\nimport { GlobalStateBridge } from '../../container/globalBridge.ts';\nimport type { IGlobalStateBridge } from '../../types/index.ts';\n\nexport const BACKGROUND_WORK_PROTOCOL_VERSION = 1;\nexport const BACKGROUND_WORK_REGISTRY_KEY = 'pi-subagents.background-work.v1';\n\n/**\n * Backward-compatible cross-package registration bridge. Its shape is separate\n * from the v1 registry so existing hosts can keep validating that registry.\n */\nexport const BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY = 'pi-subagents.background-work.registration.v1';\nexport type BackgroundWorkRegistrationBridge = (provider: BackgroundWorkProvider) => () => void;\n\nconst MAX_PROVIDER_NAME_LENGTH = 128;\nconst MAX_PROVIDERS = 100;\nconst MAX_ITEM_ID_LENGTH = 256;\nconst MAX_SESSION_ID_LENGTH = 256;\nconst MAX_WAKE_CHANNEL_LENGTH = 256;\nconst MAX_ITEMS_PER_PROVIDER = 10_000;\nconst PROVIDER_FIELDS = ['name', 'listActiveWork', 'wakeChannels', 'reconcile'];\n\nexport interface BackgroundWorkItem {\n id: string;\n sessionId: string;\n}\n\nexport interface BackgroundWorkReconcileContext {\n sessionId: string;\n nowMs: number;\n}\n\nexport interface BackgroundWorkProvider {\n name: string;\n listActiveWork(): readonly BackgroundWorkItem[];\n wakeChannels?: readonly string[];\n reconcile?(context: BackgroundWorkReconcileContext): void;\n}\n\nexport interface RegisteredBackgroundWorkItem extends BackgroundWorkItem {\n provider: string;\n}\n\nexport interface BackgroundWorkSnapshot {\n providers: readonly string[];\n items: readonly RegisteredBackgroundWorkItem[];\n}\n\ninterface BackgroundWorkRegistry {\n version: typeof BACKGROUND_WORK_PROTOCOL_VERSION;\n providers: Map<string, BackgroundWorkProvider>;\n}\n\n/**\n * The public API functions are called by extensions that hold no container, so\n * they fall back to a standalone bridge. The bridge is a stateless accessor,\n * which makes this safe.\n */\nfunction bridgeFor(bridge?: IGlobalStateBridge): IGlobalStateBridge {\n return bridge ?? new GlobalStateBridge();\n}\n\nfunction adoptRegistry(existing: unknown): BackgroundWorkRegistry {\n if (!existing || typeof existing !== 'object' || Array.isArray(existing)) {\n throw new Error(`Malformed background-work registry at Symbol.for(\"${BACKGROUND_WORK_REGISTRY_KEY}\").`);\n }\n const candidate = existing as Partial<BackgroundWorkRegistry>;\n if (candidate.version !== BACKGROUND_WORK_PROTOCOL_VERSION || !(candidate.providers instanceof Map)) {\n throw new Error(`Unsupported background-work registry at Symbol.for(\"${BACKGROUND_WORK_REGISTRY_KEY}\").`);\n }\n return candidate as BackgroundWorkRegistry;\n}\n\nfunction registry(bridge?: IGlobalStateBridge): BackgroundWorkRegistry {\n return bridgeFor(bridge).protocolSlot<BackgroundWorkRegistry>(\n BACKGROUND_WORK_REGISTRY_KEY,\n () => ({ version: BACKGROUND_WORK_PROTOCOL_VERSION, providers: new Map() }),\n adoptRegistry,\n );\n}\n\nfunction validateString(value: unknown, field: string, maxLength: number): string {\n if (typeof value !== 'string' || value.length === 0 || value.trim() !== value) {\n throw new Error(`${field} must be a non-empty string without leading or trailing whitespace.`);\n }\n if (value.length > maxLength) throw new Error(`${field} must be at most ${maxLength} characters.`);\n if (value.includes('\\0')) throw new Error(`${field} must not contain NUL characters.`);\n return value;\n}\n\nfunction validateProvider(value: unknown): BackgroundWorkProvider {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Background-work provider must be an object.');\n }\n const provider = value as Record<string, unknown>;\n const unknownFields = Object.keys(provider).filter((key) => !PROVIDER_FIELDS.includes(key));\n if (unknownFields.length > 0) {\n throw new Error(`Background-work provider has unknown fields: ${unknownFields.join(', ')}.`);\n }\n const name = validateString(provider.name, 'Background-work provider name', MAX_PROVIDER_NAME_LENGTH);\n if (typeof provider.listActiveWork !== 'function') {\n throw new Error(`Background-work provider '${name}' must expose listActiveWork().`);\n }\n if (provider.reconcile !== undefined && typeof provider.reconcile !== 'function') {\n throw new Error(`Background-work provider '${name}' reconcile must be a function when provided.`);\n }\n if (provider.wakeChannels !== undefined) {\n if (!Array.isArray(provider.wakeChannels)) {\n throw new Error(`Background-work provider '${name}' wakeChannels must be an array when provided.`);\n }\n const channels = provider.wakeChannels.map((channel, index) =>\n validateString(channel, `Background-work provider '${name}' wakeChannels[${index}]`, MAX_WAKE_CHANNEL_LENGTH),\n );\n if (new Set(channels).size !== channels.length) {\n throw new Error(`Background-work provider '${name}' wakeChannels must not contain duplicates.`);\n }\n }\n return value as BackgroundWorkProvider;\n}\n\nfunction validateItem(provider: string, value: unknown, index: number): BackgroundWorkItem {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Background-work provider '${provider}' item ${index} must be an object.`);\n }\n const item = value as Record<string, unknown>;\n const unknownFields = Object.keys(item).filter((key) => key !== 'id' && key !== 'sessionId');\n if (unknownFields.length > 0) {\n throw new Error(\n `Background-work provider '${provider}' item ${index} has unknown fields: ${unknownFields.join(', ')}.`,\n );\n }\n return {\n id: validateString(item.id, `Background-work provider '${provider}' item ${index} id`, MAX_ITEM_ID_LENGTH),\n sessionId: validateString(\n item.sessionId,\n `Background-work provider '${provider}' item ${index} sessionId`,\n MAX_SESSION_ID_LENGTH,\n ),\n };\n}\n\n/**\n * Register or replace one process-local background-work provider. The returned\n * disposer only removes this exact registration, so an old extension reload\n * cannot unregister its replacement.\n */\nexport function registerBackgroundWorkProvider(\n provider: BackgroundWorkProvider,\n bridge?: IGlobalStateBridge,\n): () => void {\n const validated = validateProvider(provider);\n const current = registry(bridge);\n if (!current.providers.has(validated.name) && current.providers.size >= MAX_PROVIDERS) {\n throw new Error(`Background-work registry supports at most ${MAX_PROVIDERS} providers.`);\n }\n current.providers.set(validated.name, validated);\n return () => {\n if (current.providers.get(validated.name) === validated) current.providers.delete(validated.name);\n };\n}\n\nexport function listBackgroundWorkProviders(bridge?: IGlobalStateBridge): readonly BackgroundWorkProvider[] {\n const current = registry(bridge);\n if (current.providers.size > MAX_PROVIDERS) {\n throw new Error(`Background-work registry contains more than ${MAX_PROVIDERS} providers.`);\n }\n const providers: BackgroundWorkProvider[] = [];\n for (const [key, value] of current.providers) {\n const provider = validateProvider(value);\n if (key !== provider.name) {\n throw new Error(`Background-work registry key '${key}' does not match provider name '${provider.name}'.`);\n }\n providers.push(provider);\n }\n return providers;\n}\n\n/** Read validated provider wake channels without reconciling or listing work. */\nexport function listBackgroundWorkWakeChannels(bridge?: IGlobalStateBridge): readonly string[] {\n const channels = new Set<string>();\n for (const provider of listBackgroundWorkProviders(bridge)) {\n for (const channel of provider.wakeChannels ?? []) channels.add(channel);\n }\n return [...channels];\n}\n\n/** Reconcile and snapshot active provider work owned by one exact Pi session. */\nexport function snapshotBackgroundWork(\n sessionId: string,\n nowMs = Date.now(),\n bridge?: IGlobalStateBridge,\n): BackgroundWorkSnapshot {\n validateString(sessionId, 'Background-work snapshot sessionId', MAX_SESSION_ID_LENGTH);\n const providers = listBackgroundWorkProviders(bridge);\n const items: RegisteredBackgroundWorkItem[] = [];\n const identities = new Set<string>();\n for (const provider of providers) {\n try {\n provider.reconcile?.({ sessionId, nowMs });\n } catch (error) {\n throw new Error(\n `Background-work provider '${provider.name}' reconcile failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n let active: readonly BackgroundWorkItem[];\n try {\n active = provider.listActiveWork();\n } catch (error) {\n throw new Error(\n `Background-work provider '${provider.name}' listActiveWork failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n if (!Array.isArray(active)) {\n throw new Error(`Background-work provider '${provider.name}' listActiveWork() must return an array.`);\n }\n if (active.length > MAX_ITEMS_PER_PROVIDER) {\n throw new Error(\n `Background-work provider '${provider.name}' returned ${active.length} items; maximum is ${MAX_ITEMS_PER_PROVIDER}.`,\n );\n }\n active.forEach((value, index) => {\n const item = validateItem(provider.name, value, index);\n const identity = `${provider.name}\\0${item.sessionId}\\0${item.id}`;\n if (identities.has(identity)) {\n throw new Error(\n `Background-work provider '${provider.name}' returned duplicate item '${item.id}' for session '${item.sessionId}'.`,\n );\n }\n identities.add(identity);\n if (item.sessionId === sessionId) items.push({ provider: provider.name, ...item });\n });\n }\n return { providers: providers.map((provider) => provider.name), items };\n}\n\n/**\n * Publish the registration bridge for hosts that discover it by symbol rather\n * than by import. First writer wins, so a bundle loaded alongside this one keeps\n * whichever function it already installed.\n */\nexport function installBackgroundWorkRegistrationBridge(bridge?: IGlobalStateBridge): void {\n bridgeFor(bridge).claimProtocolSlot(\n BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY,\n registerBackgroundWorkProvider as BackgroundWorkRegistrationBridge,\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../container/globalBridge.cjs`),t=require(`../../adapters/process/env.cjs`);let n=require(`node:buffer`);const r=`pi-subagents.capability-ceiling.v1`,i=/^[A-Za-z0-9][A-Za-z0-9/_.:-]+$/u,a=/^[A-Za-z0-9_.:-]+$/u;function o(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e<=31||e===127))return!0}return!1}var s=class{policies=new Map;register(e,t){let n=d({...e.allowedTools?{allowedTools:e.allowedTools}:{},...e.requiredTools?{requiredTools:e.requiredTools}:{},...e.allowMcpTools===!0?{allowMcpTools:!0}:{},...e.allowedExternalProfiles?{allowedExternalProfiles:e.allowedExternalProfiles}:{},denyExtensions:e.denyExtensions===!0});n.sources=[e.owner],this.policies.set(e.owner,{generation:t,ceiling:n})}update(e,t){this.policies.get(e.owner)?.generation===t&&this.register(e,t)}remove(e,t){this.policies.get(e)?.generation===t&&this.policies.delete(e)}clear(){this.policies.clear()}resolve(e){return m(e,...[...this.policies.values()].map(({ceiling:e})=>e))}};function c(t){return t??new e.GlobalStateBridge}function l(e){return c(e).protocolSlot(r,()=>new Map,e=>{if(e instanceof Map)return e;throw Error(`Malformed capability ceiling registry at Symbol.for("${r}").`)})}function u(e,t){if(typeof e!=`string`||!e.trim()||o(e)||n.Buffer.byteLength(e.trim(),`utf8`)>256)throw Error(`Invalid capability ceiling ${t}; expected a non-empty string without control characters (max 256 UTF-8 bytes).`);return e.trim()}function d(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Invalid capability ceiling; expected an object.`);let t=Object.hasOwn(e,`allowedTools`),r=Object.hasOwn(e,`requiredTools`),o=Object.hasOwn(e,`allowMcpTools`),s=Object.hasOwn(e,`allowedExternalProfiles`),c=Object.hasOwn(e,`denyExtensions`);if(!t&&!r&&!o&&!s&&!c)throw Error(`Invalid capability ceiling; expected allowedTools, requiredTools, allowMcpTools, allowedExternalProfiles, or denyExtensions.`);if(o&&typeof e.allowMcpTools!=`boolean`)throw Error(`Invalid capability ceiling allowMcpTools; expected a boolean.`);if(c&&typeof e.denyExtensions!=`boolean`)throw Error(`Invalid capability ceiling denyExtensions; expected a boolean.`);let l=(e,t)=>{if(!Array.isArray(e))throw Error(`Invalid capability ceiling ${t}; expected an array.`);if(e.length>256)throw Error(`Invalid capability ceiling ${t}; expected at most 256 names.`);return[...new Set(e.map(e=>{let r=u(e,`${t} entry`);if(!a.test(r))throw Error(`Invalid capability ceiling ${t} entry '${r}'.`);if(n.Buffer.byteLength(r,`utf8`)>128)throw Error(`Invalid capability ceiling ${t} entry '${r}'; max 128 UTF-8 bytes.`);return r}))].sort((e,t)=>e.localeCompare(t))},d=t?l(e.allowedTools,`allowedTools`):void 0,f=r?l(e.requiredTools,`requiredTools`):void 0,p=[];if(Object.hasOwn(e,`allowedExternalProfiles`)){if(!Array.isArray(e.allowedExternalProfiles))throw Error(`Invalid capability ceiling allowedExternalProfiles; expected an array.`);if(e.allowedExternalProfiles.length>32)throw Error(`Invalid capability ceiling allowedExternalProfiles; expected at most 32 names.`);p=[...new Set(e.allowedExternalProfiles.map(e=>{let t=u(e,`allowedExternalProfiles entry`);if(!i.test(t)||n.Buffer.byteLength(t,`utf8`)>128)throw Error(`Invalid capability ceiling allowedExternalProfiles entry '${t}'.`);return t}))].sort((e,t)=>e.localeCompare(t))}return{version:2,...d?{allowedTools:d}:{},...f?.length?{requiredTools:f}:{},...e.allowMcpTools===!0?{allowMcpTools:!0}:{},allowedExternalProfiles:p,denyExtensions:e.denyExtensions===!0,sources:[]}}function f(e,t=`capability ceiling`){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Invalid ${t}; expected an object.`);let n=e;if(n.version!==2)throw Error(`Invalid ${t} version.`);let r=d(n),i=n.sources;if(!Array.isArray(i)||i.some(e=>typeof e!=`string`))throw Error(`Invalid ${t} sources; expected an array of strings.`);return r.sources=[...new Set(i.map(e=>u(e,`${t} source`)))].sort(),r}function p(e,t){let n=u(e.sessionId,`sessionId`),r=u(e.source,`source`),i=Symbol(r),a=l(t),o=a.get(n);o||(o=new Map,a.set(n,o));let s=o,c=e=>{let t=d(e);t.sources=[r],s.set(i,{source:r,ceiling:t})};c(e.ceiling);let f=!1;return{update(e){if(f)throw Error(`Cannot update a disposed capability ceiling handle.`);c(e)},dispose(){f||(f=!0,s.delete(i),s.size===0&&a.delete(n))}}}function m(...e){let t=e.filter(e=>e!==void 0);if(t.length===0)return;let n=t.filter(e=>e.allowedTools!==void 0).map(e=>new Set(e.allowedTools)),r;n.length>0&&(r=[...n[0]].filter(e=>n.every(t=>t.has(e))).sort());let i=[...new Set(t.flatMap(e=>e.requiredTools??[]))].filter(e=>!r||r.includes(e)).sort((e,t)=>e.localeCompare(t)),a=t.map(e=>new Set(e.allowedExternalProfiles)),o=[...a[0]].filter(e=>a.every(t=>t.has(e))).sort((e,t)=>e.localeCompare(t));return{version:2,...r?{allowedTools:r}:{},...i.length?{requiredTools:i}:{},...t.every(e=>e.allowMcpTools===!0)?{allowMcpTools:!0}:{},allowedExternalProfiles:o,denyExtensions:t.some(e=>e.denyExtensions),sources:[...new Set(t.flatMap(e=>e.sources))].sort()}}function h(e,t,n){let r=[];if(e){let t=l(n).get(e);t&&r.push(...Array.from(t.values(),({ceiling:e})=>e))}return m(t,...r)}function g(e,n){return h(e,v(process.env[t.SUBAGENT_CAPABILITY_CEILING_ENV]),n)}function _(e){if(e)return n.Buffer.from(JSON.stringify(e),`utf8`).toString(`base64url`)}function v(e){if(e===void 0||e===``)return;let t;try{t=JSON.parse(n.Buffer.from(e,`base64url`).toString(`utf8`))}catch(e){throw Error(`Invalid inherited capability ceiling: ${e instanceof Error?e.message:String(e)}`)}if(!t||typeof t!=`object`||Array.isArray(t)||t.version!==2)throw Error(`Invalid inherited capability ceiling version.`);return f(t,`inherited capability ceiling`)}exports.SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY=r,exports.SUBAGENT_CAPABILITY_CEILING_VERSION=2,exports.SubagentCapabilityPolicyStore=s,exports.decodeSubagentCapabilityCeiling=v,exports.encodeSubagentCapabilityCeiling=_,exports.intersectSubagentCapabilityCeilings=m,exports.parseSubagentCapabilityCeiling=f,exports.registerSubagentCapabilityCeiling=p,exports.resolveCurrentSubagentCapabilityCeiling=g,exports.resolveSubagentCapabilityCeiling=h;
2
+ //# sourceMappingURL=capabilityCeiling.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling.cjs","names":["GlobalStateBridge","Buffer","SUBAGENT_CAPABILITY_CEILING_ENV"],"sources":["../../../src/schemas/team/capabilityCeiling.ts"],"sourcesContent":["/**\n * Capability ceilings - a cross-bundle protocol.\n *\n * A ceiling is an upper bound on what a spawned subagent may do, contributed by\n * any extension in the session. Ceilings intersect: every registered ceiling\n * applies and the effective tool set is the intersection of all of them. A\n * policy may require tools for its children, but those requirements are always\n * clamped to that same effective upper bound.\n *\n * DESIGN PATTERNS:\n * - Registry keyed by `Symbol.for`, shared with every bundle speaking the protocol\n * - Registrations are keyed by an opaque token, so one source can hold several\n * and disposing one never disturbs another\n * - Normalised on the way in: names deduplicated and sorted, so encoded ceilings\n * compare byte-for-byte across processes\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The registry key, version, and env var below are shared with\n * doom-pi-subagents and with doom-plan, which registers ceilings today. Pinned\n * by contract tests.\n *\n * AVOID:\n * - Letting required tools or MCP grants bypass the intersected allowedTools ceiling\n */\n\nimport { Buffer } from 'node:buffer';\nimport type { SubagentPolicy } from '@agimon-ai/doompi-extension-contracts/subagent-policy';\nimport { SUBAGENT_CAPABILITY_CEILING_ENV } from '../../adapters/process/env.ts';\nimport { GlobalStateBridge } from '../../container/globalBridge.ts';\nimport type { IGlobalStateBridge } from '../../types/index.ts';\n\nexport const SUBAGENT_CAPABILITY_CEILING_VERSION = 2 as const;\nexport const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = 'pi-subagents.capability-ceiling.v1';\nexport { SUBAGENT_CAPABILITY_CEILING_ENV };\n\nconst MAX_TEXT_BYTES = 256;\nconst MAX_TOOL_NAME_BYTES = 128;\nconst MAX_ALLOWED_TOOLS = 256;\nconst MAX_ALLOWED_EXTERNAL_PROFILES = 32;\nconst MAX_EXTERNAL_PROFILE_NAME_BYTES = 128;\nconst EXTERNAL_PROFILE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9/_.:-]+$/u;\nconst TOOL_NAME_PATTERN = /^[A-Za-z0-9_.:-]+$/u;\nconst LAST_C0_CONTROL_CODE = 0x1f;\nconst DELETE_CODE = 0x7f;\n\n/**\n * Ceiling text crosses a process boundary and is rendered in the TUI, so control\n * characters are rejected. Scanning code points avoids a control-character\n * regex, which lints as a hazard even when the escapes are explicit.\n */\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= LAST_C0_CONTROL_CODE || code === DELETE_CODE)) return true;\n }\n return false;\n}\n\nexport type SubagentCapabilityCeiling = {\n allowedTools?: readonly string[];\n requiredTools?: readonly string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles?: readonly string[];\n denyExtensions?: boolean;\n};\n\nexport interface ResolvedSubagentCapabilityCeiling {\n version: typeof SUBAGENT_CAPABILITY_CEILING_VERSION;\n allowedTools?: string[];\n requiredTools?: string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles: string[];\n denyExtensions: boolean;\n sources: string[];\n}\n\nexport interface SubagentCapabilityAudit {\n ceiling: ResolvedSubagentCapabilityCeiling;\n requestedTools?: string[];\n effectiveTools: string[];\n removedTools: string[];\n internalTools: string[];\n extensionsDenied: boolean;\n removedExtensionCount: number;\n requestedMcpToolCount: number;\n effectiveMcpTools: string[];\n}\n\nexport interface RegisterSubagentCapabilityCeilingOptions {\n sessionId: string;\n source: string;\n ceiling: SubagentCapabilityCeiling;\n}\n\nexport interface SubagentCapabilityCeilingHandle {\n update(ceiling: SubagentCapabilityCeiling): void;\n dispose(): void;\n}\n\ninterface TypedPolicyRegistration {\n generation: string;\n ceiling: ResolvedSubagentCapabilityCeiling;\n}\n\nexport class SubagentCapabilityPolicyStore {\n private readonly policies = new Map<string, TypedPolicyRegistration>();\n\n register(policy: SubagentPolicy, generation: string): void {\n const ceiling = normalizeCeiling({\n ...(policy.allowedTools ? { allowedTools: policy.allowedTools } : {}),\n ...(policy.requiredTools ? { requiredTools: policy.requiredTools } : {}),\n ...(policy.allowMcpTools === true ? { allowMcpTools: true } : {}),\n ...(policy.allowedExternalProfiles ? { allowedExternalProfiles: policy.allowedExternalProfiles } : {}),\n denyExtensions: policy.denyExtensions === true,\n });\n ceiling.sources = [policy.owner];\n this.policies.set(policy.owner, { generation, ceiling });\n }\n\n update(policy: SubagentPolicy, generation: string): void {\n if (this.policies.get(policy.owner)?.generation !== generation) return;\n this.register(policy, generation);\n }\n\n remove(owner: string, generation: string): void {\n if (this.policies.get(owner)?.generation === generation) this.policies.delete(owner);\n }\n\n clear(): void {\n this.policies.clear();\n }\n\n resolve(inherited?: ResolvedSubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling | undefined {\n return intersectSubagentCapabilityCeilings(inherited, ...[...this.policies.values()].map(({ ceiling }) => ceiling));\n }\n}\n\ntype Registration = { source: string; ceiling: ResolvedSubagentCapabilityCeiling };\ntype Registry = Map<string, Map<symbol, Registration>>;\n\nfunction bridgeFor(bridge?: IGlobalStateBridge): IGlobalStateBridge {\n return bridge ?? new GlobalStateBridge();\n}\n\nfunction registry(bridge?: IGlobalStateBridge): Registry {\n return bridgeFor(bridge).protocolSlot<Registry>(\n SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY,\n () => new Map(),\n (existing) => {\n if (existing instanceof Map) return existing as Registry;\n throw new Error(\n `Malformed capability ceiling registry at Symbol.for(\"${SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY}\").`,\n );\n },\n );\n}\n\nfunction validateText(value: unknown, field: string): string {\n if (\n typeof value !== 'string' ||\n !value.trim() ||\n hasControlCharacter(value) ||\n Buffer.byteLength(value.trim(), 'utf8') > MAX_TEXT_BYTES\n ) {\n throw new Error(\n `Invalid capability ceiling ${field}; expected a non-empty string without control characters (max ${MAX_TEXT_BYTES} UTF-8 bytes).`,\n );\n }\n return value.trim();\n}\n\nfunction normalizeCeiling(ceiling: SubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling {\n if (!ceiling || typeof ceiling !== 'object' || Array.isArray(ceiling)) {\n throw new Error('Invalid capability ceiling; expected an object.');\n }\n const hasAllowedTools = Object.hasOwn(ceiling, 'allowedTools');\n const hasRequiredTools = Object.hasOwn(ceiling, 'requiredTools');\n const hasAllowMcpTools = Object.hasOwn(ceiling, 'allowMcpTools');\n const hasAllowedExternalProfiles = Object.hasOwn(ceiling, 'allowedExternalProfiles');\n const hasDenyExtensions = Object.hasOwn(ceiling, 'denyExtensions');\n if (!hasAllowedTools && !hasRequiredTools && !hasAllowMcpTools && !hasAllowedExternalProfiles && !hasDenyExtensions) {\n throw new Error(\n 'Invalid capability ceiling; expected allowedTools, requiredTools, allowMcpTools, allowedExternalProfiles, or denyExtensions.',\n );\n }\n if (hasAllowMcpTools && typeof ceiling.allowMcpTools !== 'boolean') {\n throw new Error('Invalid capability ceiling allowMcpTools; expected a boolean.');\n }\n if (hasDenyExtensions && typeof ceiling.denyExtensions !== 'boolean') {\n throw new Error('Invalid capability ceiling denyExtensions; expected a boolean.');\n }\n const normalizeTools = (value: readonly string[] | undefined, field: 'allowedTools' | 'requiredTools') => {\n if (!Array.isArray(value)) throw new Error(`Invalid capability ceiling ${field}; expected an array.`);\n if (value.length > MAX_ALLOWED_TOOLS) {\n throw new Error(`Invalid capability ceiling ${field}; expected at most ${MAX_ALLOWED_TOOLS} names.`);\n }\n return [\n ...new Set(\n value.map((tool) => {\n const name = validateText(tool, `${field} entry`);\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid capability ceiling ${field} entry '${name}'.`);\n }\n if (Buffer.byteLength(name, 'utf8') > MAX_TOOL_NAME_BYTES) {\n throw new Error(\n `Invalid capability ceiling ${field} entry '${name}'; max ${MAX_TOOL_NAME_BYTES} UTF-8 bytes.`,\n );\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n };\n const allowedTools = hasAllowedTools ? normalizeTools(ceiling.allowedTools, 'allowedTools') : undefined;\n const requiredTools = hasRequiredTools ? normalizeTools(ceiling.requiredTools, 'requiredTools') : undefined;\n let allowedExternalProfiles: string[] = [];\n if (Object.hasOwn(ceiling, 'allowedExternalProfiles')) {\n if (!Array.isArray(ceiling.allowedExternalProfiles)) {\n throw new Error('Invalid capability ceiling allowedExternalProfiles; expected an array.');\n }\n if (ceiling.allowedExternalProfiles.length > MAX_ALLOWED_EXTERNAL_PROFILES) {\n throw new Error(\n `Invalid capability ceiling allowedExternalProfiles; expected at most ${MAX_ALLOWED_EXTERNAL_PROFILES} names.`,\n );\n }\n allowedExternalProfiles = [\n ...new Set(\n ceiling.allowedExternalProfiles.map((profile) => {\n const name = validateText(profile, 'allowedExternalProfiles entry');\n if (\n !EXTERNAL_PROFILE_PATTERN.test(name) ||\n Buffer.byteLength(name, 'utf8') > MAX_EXTERNAL_PROFILE_NAME_BYTES\n ) {\n throw new Error(`Invalid capability ceiling allowedExternalProfiles entry '${name}'.`);\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n }\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools?.length ? { requiredTools } : {}),\n ...(ceiling.allowMcpTools === true ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: ceiling.denyExtensions === true,\n sources: [],\n };\n}\n\nexport function parseSubagentCapabilityCeiling(\n value: unknown,\n field = 'capability ceiling',\n): ResolvedSubagentCapabilityCeiling {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${field}; expected an object.`);\n }\n const record = value as Record<string, unknown>;\n if (record.version !== SUBAGENT_CAPABILITY_CEILING_VERSION) throw new Error(`Invalid ${field} version.`);\n const normalized = normalizeCeiling(record as SubagentCapabilityCeiling);\n const sources = record.sources;\n if (!Array.isArray(sources) || sources.some((source) => typeof source !== 'string')) {\n throw new Error(`Invalid ${field} sources; expected an array of strings.`);\n }\n normalized.sources = [...new Set(sources.map((source) => validateText(source, `${field} source`)))].sort();\n return normalized;\n}\n\nexport function registerSubagentCapabilityCeiling(\n options: RegisterSubagentCapabilityCeilingOptions,\n bridge?: IGlobalStateBridge,\n): SubagentCapabilityCeilingHandle {\n const sessionId = validateText(options.sessionId, 'sessionId');\n const source = validateText(options.source, 'source');\n const token = Symbol(source);\n const store = registry(bridge);\n let session = store.get(sessionId);\n if (!session) {\n session = new Map();\n store.set(sessionId, session);\n }\n const registrations = session;\n const write = (ceiling: SubagentCapabilityCeiling): void => {\n const normalized = normalizeCeiling(ceiling);\n normalized.sources = [source];\n registrations.set(token, { source, ceiling: normalized });\n };\n write(options.ceiling);\n let disposed = false;\n return {\n update(ceiling) {\n if (disposed) throw new Error('Cannot update a disposed capability ceiling handle.');\n write(ceiling);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n registrations.delete(token);\n if (registrations.size === 0) store.delete(sessionId);\n },\n };\n}\n\nexport function intersectSubagentCapabilityCeilings(\n ...ceilings: Array<ResolvedSubagentCapabilityCeiling | undefined>\n): ResolvedSubagentCapabilityCeiling | undefined {\n const active = ceilings.filter((ceiling): ceiling is ResolvedSubagentCapabilityCeiling => ceiling !== undefined);\n if (active.length === 0) return undefined;\n const definedLists = active\n .filter((ceiling) => ceiling.allowedTools !== undefined)\n .map((ceiling) => new Set(ceiling.allowedTools));\n let allowedTools: string[] | undefined;\n if (definedLists.length > 0) {\n allowedTools = [...definedLists[0]!].filter((tool) => definedLists.every((list) => list.has(tool))).sort();\n }\n const requiredTools = [...new Set(active.flatMap((ceiling) => ceiling.requiredTools ?? []))]\n .filter((tool) => !allowedTools || allowedTools.includes(tool))\n .sort((left, right) => left.localeCompare(right));\n const profileSets = active.map((ceiling) => new Set(ceiling.allowedExternalProfiles));\n const allowedExternalProfiles = [...profileSets[0]!]\n .filter((profile) => profileSets.every((profiles) => profiles.has(profile)))\n .sort((left, right) => left.localeCompare(right));\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools.length ? { requiredTools } : {}),\n ...(active.every((ceiling) => ceiling.allowMcpTools === true) ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: active.some((ceiling) => ceiling.denyExtensions),\n sources: [...new Set(active.flatMap((ceiling) => ceiling.sources))].sort(),\n };\n}\n\nexport function resolveSubagentCapabilityCeiling(\n sessionId: string | undefined,\n inherited?: ResolvedSubagentCapabilityCeiling,\n bridge?: IGlobalStateBridge,\n): ResolvedSubagentCapabilityCeiling | undefined {\n const active: ResolvedSubagentCapabilityCeiling[] = [];\n if (sessionId) {\n const registrations = registry(bridge).get(sessionId);\n if (registrations) active.push(...Array.from(registrations.values(), ({ ceiling }) => ceiling));\n }\n return intersectSubagentCapabilityCeilings(inherited, ...active);\n}\n\nexport function resolveCurrentSubagentCapabilityCeiling(\n sessionId: string | undefined,\n bridge?: IGlobalStateBridge,\n): ResolvedSubagentCapabilityCeiling | undefined {\n return resolveSubagentCapabilityCeiling(\n sessionId,\n decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),\n bridge,\n );\n}\n\nexport function encodeSubagentCapabilityCeiling(\n ceiling: ResolvedSubagentCapabilityCeiling | undefined,\n): string | undefined {\n if (!ceiling) return undefined;\n return Buffer.from(JSON.stringify(ceiling), 'utf8').toString('base64url');\n}\n\nexport function decodeSubagentCapabilityCeiling(\n value: string | undefined,\n): ResolvedSubagentCapabilityCeiling | undefined {\n if (value === undefined || value === '') return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));\n } catch (error) {\n throw new Error(`Invalid inherited capability ceiling: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed) ||\n (parsed as { version?: unknown }).version !== SUBAGENT_CAPABILITY_CEILING_VERSION\n ) {\n throw new Error('Invalid inherited capability ceiling version.');\n }\n return parseSubagentCapabilityCeiling(parsed, 'inherited capability ceiling');\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { IGlobalStateBridge } from "../types.cjs";
2
- import { SUBAGENT_CAPABILITY_CEILING_ENV } from "../env.cjs";
3
- //#region src/protocol/capabilityCeiling.d.ts
1
+ import { IGlobalStateBridge } from "../../types/index.cjs";
2
+ import { SUBAGENT_CAPABILITY_CEILING_ENV } from "../../adapters/process/env.cjs";
3
+ //#region src/schemas/team/capabilityCeiling.d.ts
4
4
  declare const SUBAGENT_CAPABILITY_CEILING_VERSION: 2;
5
5
  declare const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = "pi-subagents.capability-ceiling.v1";
6
6
  type SubagentCapabilityCeiling = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling.d.cts","names":[],"sources":["../../../src/schemas/team/capabilityCeiling.ts"],"mappings":";;;cA+Ba,mCAAA;AAAA,cACA,wCAAA;AAAA,KA0BD,yBAAA;EACV,YAAA;EACA,aAAA;EACA,aAAA;EACA,uBAAA;EACA,cAAA;AAAA;AAAA,UAGe,iCAAA;EACf,OAAA,SAAgB,mCAAA;EAChB,YAAA;EACA,aAAA;EACA,aAAA;EACA,uBAAA;EACA,cAAA;EACA,OAAA;AAAA;AAAA,UAGe,uBAAA;EACf,OAAA,EAAS,iCAAA;EACT,cAAA;EACA,cAAA;EACA,YAAA;EACA,aAAA;EACA,gBAAA;EACA,qBAAA;EACA,qBAAA;EACA,iBAAA;AAAA;AAAA,UAGe,wCAAA;EACf,SAAA;EACA,MAAA;EACA,OAAA,EAAS,yBAAA;AAAA;AAAA,UAGM,+BAAA;EACf,MAAA,CAAO,OAAA,EAAS,yBAAA;EAChB,OAAA;AAAA;AAAA,iBA2Jc,8BAAA,CACd,KAAA,WACA,KAAA,YACC,iCAAA;AAAA,iBAea,iCAAA,CACd,OAAA,EAAS,wCAAA,EACT,MAAA,GAAS,kBAAA,GACR,+BAAA;AAAA,iBAgCa,mCAAA,CAAA,GACX,QAAA,EAAU,KAAA,CAAM,iCAAA,gBAClB,iCAAA;AAAA,iBA4Ba,gCAAA,CACd,SAAA,sBACA,SAAA,GAAY,iCAAA,EACZ,MAAA,GAAS,kBAAA,GACR,iCAAA;AAAA,iBASa,uCAAA,CACd,SAAA,sBACA,MAAA,GAAS,kBAAA,GACR,iCAAA;AAAA,iBAQa,+BAAA,CACd,OAAA,EAAS,iCAAA;AAAA,iBAMK,+BAAA,CACd,KAAA,uBACC,iCAAA"}
@@ -1,6 +1,6 @@
1
- import { IGlobalStateBridge } from "../types.mjs";
2
- import { SUBAGENT_CAPABILITY_CEILING_ENV } from "../env.mjs";
3
- //#region src/protocol/capabilityCeiling.d.ts
1
+ import { IGlobalStateBridge } from "../../types/index.mjs";
2
+ import { SUBAGENT_CAPABILITY_CEILING_ENV } from "../../adapters/process/env.mjs";
3
+ //#region src/schemas/team/capabilityCeiling.d.ts
4
4
  declare const SUBAGENT_CAPABILITY_CEILING_VERSION: 2;
5
5
  declare const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = "pi-subagents.capability-ceiling.v1";
6
6
  type SubagentCapabilityCeiling = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling.d.mts","names":[],"sources":["../../../src/schemas/team/capabilityCeiling.ts"],"mappings":";;;cA+Ba,mCAAA;AAAA,cACA,wCAAA;AAAA,KA0BD,yBAAA;EACV,YAAA;EACA,aAAA;EACA,aAAA;EACA,uBAAA;EACA,cAAA;AAAA;AAAA,UAGe,iCAAA;EACf,OAAA,SAAgB,mCAAA;EAChB,YAAA;EACA,aAAA;EACA,aAAA;EACA,uBAAA;EACA,cAAA;EACA,OAAA;AAAA;AAAA,UAGe,uBAAA;EACf,OAAA,EAAS,iCAAA;EACT,cAAA;EACA,cAAA;EACA,YAAA;EACA,aAAA;EACA,gBAAA;EACA,qBAAA;EACA,qBAAA;EACA,iBAAA;AAAA;AAAA,UAGe,wCAAA;EACf,SAAA;EACA,MAAA;EACA,OAAA,EAAS,yBAAA;AAAA;AAAA,UAGM,+BAAA;EACf,MAAA,CAAO,OAAA,EAAS,yBAAA;EAChB,OAAA;AAAA;AAAA,iBA2Jc,8BAAA,CACd,KAAA,WACA,KAAA,YACC,iCAAA;AAAA,iBAea,iCAAA,CACd,OAAA,EAAS,wCAAA,EACT,MAAA,GAAS,kBAAA,GACR,+BAAA;AAAA,iBAgCa,mCAAA,CAAA,GACX,QAAA,EAAU,KAAA,CAAM,iCAAA,gBAClB,iCAAA;AAAA,iBA4Ba,gCAAA,CACd,SAAA,sBACA,SAAA,GAAY,iCAAA,EACZ,MAAA,GAAS,kBAAA,GACR,iCAAA;AAAA,iBASa,uCAAA,CACd,SAAA,sBACA,MAAA,GAAS,kBAAA,GACR,iCAAA;AAAA,iBAQa,+BAAA,CACd,OAAA,EAAS,iCAAA;AAAA,iBAMK,+BAAA,CACd,KAAA,uBACC,iCAAA"}
@@ -0,0 +1,2 @@
1
+ import{__esmMin as e}from"../../_virtual/_rolldown/runtime.mjs";import{GlobalStateBridge as t,init_globalBridge as n}from"../../container/globalBridge.mjs";import{SUBAGENT_CAPABILITY_CEILING_ENV as r,init_env as i}from"../../adapters/process/env.mjs";import{Buffer as a}from"node:buffer";function o(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e<=D||e===O))return!0}return!1}function s(e){return e??new t}function c(e){return s(e).protocolSlot(y,()=>new Map,e=>{if(e instanceof Map)return e;throw Error(`Malformed capability ceiling registry at Symbol.for("${y}").`)})}function l(e,t){if(typeof e!=`string`||!e.trim()||o(e)||a.byteLength(e.trim(),`utf8`)>b)throw Error(`Invalid capability ceiling ${t}; expected a non-empty string without control characters (max ${b} UTF-8 bytes).`);return e.trim()}function u(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Invalid capability ceiling; expected an object.`);let t=Object.hasOwn(e,`allowedTools`),n=Object.hasOwn(e,`requiredTools`),r=Object.hasOwn(e,`allowMcpTools`),i=Object.hasOwn(e,`allowedExternalProfiles`),o=Object.hasOwn(e,`denyExtensions`);if(!t&&!n&&!r&&!i&&!o)throw Error(`Invalid capability ceiling; expected allowedTools, requiredTools, allowMcpTools, allowedExternalProfiles, or denyExtensions.`);if(r&&typeof e.allowMcpTools!=`boolean`)throw Error(`Invalid capability ceiling allowMcpTools; expected a boolean.`);if(o&&typeof e.denyExtensions!=`boolean`)throw Error(`Invalid capability ceiling denyExtensions; expected a boolean.`);let s=(e,t)=>{if(!Array.isArray(e))throw Error(`Invalid capability ceiling ${t}; expected an array.`);if(e.length>S)throw Error(`Invalid capability ceiling ${t}; expected at most ${S} names.`);return[...new Set(e.map(e=>{let n=l(e,`${t} entry`);if(!E.test(n))throw Error(`Invalid capability ceiling ${t} entry '${n}'.`);if(a.byteLength(n,`utf8`)>x)throw Error(`Invalid capability ceiling ${t} entry '${n}'; max ${x} UTF-8 bytes.`);return n}))].sort((e,t)=>e.localeCompare(t))},c=t?s(e.allowedTools,`allowedTools`):void 0,u=n?s(e.requiredTools,`requiredTools`):void 0,d=[];if(Object.hasOwn(e,`allowedExternalProfiles`)){if(!Array.isArray(e.allowedExternalProfiles))throw Error(`Invalid capability ceiling allowedExternalProfiles; expected an array.`);if(e.allowedExternalProfiles.length>C)throw Error(`Invalid capability ceiling allowedExternalProfiles; expected at most ${C} names.`);d=[...new Set(e.allowedExternalProfiles.map(e=>{let t=l(e,`allowedExternalProfiles entry`);if(!T.test(t)||a.byteLength(t,`utf8`)>w)throw Error(`Invalid capability ceiling allowedExternalProfiles entry '${t}'.`);return t}))].sort((e,t)=>e.localeCompare(t))}return{version:2,...c?{allowedTools:c}:{},...u?.length?{requiredTools:u}:{},...e.allowMcpTools===!0?{allowMcpTools:!0}:{},allowedExternalProfiles:d,denyExtensions:e.denyExtensions===!0,sources:[]}}function d(e,t=`capability ceiling`){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Invalid ${t}; expected an object.`);let n=e;if(n.version!==2)throw Error(`Invalid ${t} version.`);let r=u(n),i=n.sources;if(!Array.isArray(i)||i.some(e=>typeof e!=`string`))throw Error(`Invalid ${t} sources; expected an array of strings.`);return r.sources=[...new Set(i.map(e=>l(e,`${t} source`)))].sort(),r}function f(e,t){let n=l(e.sessionId,`sessionId`),r=l(e.source,`source`),i=Symbol(r),a=c(t),o=a.get(n);o||(o=new Map,a.set(n,o));let s=o,d=e=>{let t=u(e);t.sources=[r],s.set(i,{source:r,ceiling:t})};d(e.ceiling);let f=!1;return{update(e){if(f)throw Error(`Cannot update a disposed capability ceiling handle.`);d(e)},dispose(){f||(f=!0,s.delete(i),s.size===0&&a.delete(n))}}}function p(...e){let t=e.filter(e=>e!==void 0);if(t.length===0)return;let n=t.filter(e=>e.allowedTools!==void 0).map(e=>new Set(e.allowedTools)),r;n.length>0&&(r=[...n[0]].filter(e=>n.every(t=>t.has(e))).sort());let i=[...new Set(t.flatMap(e=>e.requiredTools??[]))].filter(e=>!r||r.includes(e)).sort((e,t)=>e.localeCompare(t)),a=t.map(e=>new Set(e.allowedExternalProfiles)),o=[...a[0]].filter(e=>a.every(t=>t.has(e))).sort((e,t)=>e.localeCompare(t));return{version:2,...r?{allowedTools:r}:{},...i.length?{requiredTools:i}:{},...t.every(e=>e.allowMcpTools===!0)?{allowMcpTools:!0}:{},allowedExternalProfiles:o,denyExtensions:t.some(e=>e.denyExtensions),sources:[...new Set(t.flatMap(e=>e.sources))].sort()}}function m(e,t,n){let r=[];if(e){let t=c(n).get(e);t&&r.push(...Array.from(t.values(),({ceiling:e})=>e))}return p(t,...r)}function h(e,t){return m(e,_(process.env[r]),t)}function g(e){if(e)return a.from(JSON.stringify(e),`utf8`).toString(`base64url`)}function _(e){if(e===void 0||e===``)return;let t;try{t=JSON.parse(a.from(e,`base64url`).toString(`utf8`))}catch(e){throw Error(`Invalid inherited capability ceiling: ${e instanceof Error?e.message:String(e)}`)}if(!t||typeof t!=`object`||Array.isArray(t)||t.version!==2)throw Error(`Invalid inherited capability ceiling version.`);return d(t,`inherited capability ceiling`)}var v,y,b,x,S,C,w,T,E,D,O,k,A=e((()=>{i(),n(),v=2,y=`pi-subagents.capability-ceiling.v1`,b=256,x=128,S=256,C=32,w=128,T=/^[A-Za-z0-9][A-Za-z0-9/_.:-]+$/u,E=/^[A-Za-z0-9_.:-]+$/u,D=31,O=127,k=class{policies=new Map;register(e,t){let n=u({...e.allowedTools?{allowedTools:e.allowedTools}:{},...e.requiredTools?{requiredTools:e.requiredTools}:{},...e.allowMcpTools===!0?{allowMcpTools:!0}:{},...e.allowedExternalProfiles?{allowedExternalProfiles:e.allowedExternalProfiles}:{},denyExtensions:e.denyExtensions===!0});n.sources=[e.owner],this.policies.set(e.owner,{generation:t,ceiling:n})}update(e,t){this.policies.get(e.owner)?.generation===t&&this.register(e,t)}remove(e,t){this.policies.get(e)?.generation===t&&this.policies.delete(e)}clear(){this.policies.clear()}resolve(e){return p(e,...[...this.policies.values()].map(({ceiling:e})=>e))}}}));A();export{y as SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY,v as SUBAGENT_CAPABILITY_CEILING_VERSION,k as SubagentCapabilityPolicyStore,_ as decodeSubagentCapabilityCeiling,g as encodeSubagentCapabilityCeiling,A as init_capabilityCeiling,p as intersectSubagentCapabilityCeilings,d as parseSubagentCapabilityCeiling,f as registerSubagentCapabilityCeiling,h as resolveCurrentSubagentCapabilityCeiling,m as resolveSubagentCapabilityCeiling};
2
+ //# sourceMappingURL=capabilityCeiling.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling.mjs","names":[],"sources":["../../../src/schemas/team/capabilityCeiling.ts"],"sourcesContent":["/**\n * Capability ceilings - a cross-bundle protocol.\n *\n * A ceiling is an upper bound on what a spawned subagent may do, contributed by\n * any extension in the session. Ceilings intersect: every registered ceiling\n * applies and the effective tool set is the intersection of all of them. A\n * policy may require tools for its children, but those requirements are always\n * clamped to that same effective upper bound.\n *\n * DESIGN PATTERNS:\n * - Registry keyed by `Symbol.for`, shared with every bundle speaking the protocol\n * - Registrations are keyed by an opaque token, so one source can hold several\n * and disposing one never disturbs another\n * - Normalised on the way in: names deduplicated and sorted, so encoded ceilings\n * compare byte-for-byte across processes\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The registry key, version, and env var below are shared with\n * doom-pi-subagents and with doom-plan, which registers ceilings today. Pinned\n * by contract tests.\n *\n * AVOID:\n * - Letting required tools or MCP grants bypass the intersected allowedTools ceiling\n */\n\nimport { Buffer } from 'node:buffer';\nimport type { SubagentPolicy } from '@agimon-ai/doompi-extension-contracts/subagent-policy';\nimport { SUBAGENT_CAPABILITY_CEILING_ENV } from '../../adapters/process/env.ts';\nimport { GlobalStateBridge } from '../../container/globalBridge.ts';\nimport type { IGlobalStateBridge } from '../../types/index.ts';\n\nexport const SUBAGENT_CAPABILITY_CEILING_VERSION = 2 as const;\nexport const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = 'pi-subagents.capability-ceiling.v1';\nexport { SUBAGENT_CAPABILITY_CEILING_ENV };\n\nconst MAX_TEXT_BYTES = 256;\nconst MAX_TOOL_NAME_BYTES = 128;\nconst MAX_ALLOWED_TOOLS = 256;\nconst MAX_ALLOWED_EXTERNAL_PROFILES = 32;\nconst MAX_EXTERNAL_PROFILE_NAME_BYTES = 128;\nconst EXTERNAL_PROFILE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9/_.:-]+$/u;\nconst TOOL_NAME_PATTERN = /^[A-Za-z0-9_.:-]+$/u;\nconst LAST_C0_CONTROL_CODE = 0x1f;\nconst DELETE_CODE = 0x7f;\n\n/**\n * Ceiling text crosses a process boundary and is rendered in the TUI, so control\n * characters are rejected. Scanning code points avoids a control-character\n * regex, which lints as a hazard even when the escapes are explicit.\n */\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= LAST_C0_CONTROL_CODE || code === DELETE_CODE)) return true;\n }\n return false;\n}\n\nexport type SubagentCapabilityCeiling = {\n allowedTools?: readonly string[];\n requiredTools?: readonly string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles?: readonly string[];\n denyExtensions?: boolean;\n};\n\nexport interface ResolvedSubagentCapabilityCeiling {\n version: typeof SUBAGENT_CAPABILITY_CEILING_VERSION;\n allowedTools?: string[];\n requiredTools?: string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles: string[];\n denyExtensions: boolean;\n sources: string[];\n}\n\nexport interface SubagentCapabilityAudit {\n ceiling: ResolvedSubagentCapabilityCeiling;\n requestedTools?: string[];\n effectiveTools: string[];\n removedTools: string[];\n internalTools: string[];\n extensionsDenied: boolean;\n removedExtensionCount: number;\n requestedMcpToolCount: number;\n effectiveMcpTools: string[];\n}\n\nexport interface RegisterSubagentCapabilityCeilingOptions {\n sessionId: string;\n source: string;\n ceiling: SubagentCapabilityCeiling;\n}\n\nexport interface SubagentCapabilityCeilingHandle {\n update(ceiling: SubagentCapabilityCeiling): void;\n dispose(): void;\n}\n\ninterface TypedPolicyRegistration {\n generation: string;\n ceiling: ResolvedSubagentCapabilityCeiling;\n}\n\nexport class SubagentCapabilityPolicyStore {\n private readonly policies = new Map<string, TypedPolicyRegistration>();\n\n register(policy: SubagentPolicy, generation: string): void {\n const ceiling = normalizeCeiling({\n ...(policy.allowedTools ? { allowedTools: policy.allowedTools } : {}),\n ...(policy.requiredTools ? { requiredTools: policy.requiredTools } : {}),\n ...(policy.allowMcpTools === true ? { allowMcpTools: true } : {}),\n ...(policy.allowedExternalProfiles ? { allowedExternalProfiles: policy.allowedExternalProfiles } : {}),\n denyExtensions: policy.denyExtensions === true,\n });\n ceiling.sources = [policy.owner];\n this.policies.set(policy.owner, { generation, ceiling });\n }\n\n update(policy: SubagentPolicy, generation: string): void {\n if (this.policies.get(policy.owner)?.generation !== generation) return;\n this.register(policy, generation);\n }\n\n remove(owner: string, generation: string): void {\n if (this.policies.get(owner)?.generation === generation) this.policies.delete(owner);\n }\n\n clear(): void {\n this.policies.clear();\n }\n\n resolve(inherited?: ResolvedSubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling | undefined {\n return intersectSubagentCapabilityCeilings(inherited, ...[...this.policies.values()].map(({ ceiling }) => ceiling));\n }\n}\n\ntype Registration = { source: string; ceiling: ResolvedSubagentCapabilityCeiling };\ntype Registry = Map<string, Map<symbol, Registration>>;\n\nfunction bridgeFor(bridge?: IGlobalStateBridge): IGlobalStateBridge {\n return bridge ?? new GlobalStateBridge();\n}\n\nfunction registry(bridge?: IGlobalStateBridge): Registry {\n return bridgeFor(bridge).protocolSlot<Registry>(\n SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY,\n () => new Map(),\n (existing) => {\n if (existing instanceof Map) return existing as Registry;\n throw new Error(\n `Malformed capability ceiling registry at Symbol.for(\"${SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY}\").`,\n );\n },\n );\n}\n\nfunction validateText(value: unknown, field: string): string {\n if (\n typeof value !== 'string' ||\n !value.trim() ||\n hasControlCharacter(value) ||\n Buffer.byteLength(value.trim(), 'utf8') > MAX_TEXT_BYTES\n ) {\n throw new Error(\n `Invalid capability ceiling ${field}; expected a non-empty string without control characters (max ${MAX_TEXT_BYTES} UTF-8 bytes).`,\n );\n }\n return value.trim();\n}\n\nfunction normalizeCeiling(ceiling: SubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling {\n if (!ceiling || typeof ceiling !== 'object' || Array.isArray(ceiling)) {\n throw new Error('Invalid capability ceiling; expected an object.');\n }\n const hasAllowedTools = Object.hasOwn(ceiling, 'allowedTools');\n const hasRequiredTools = Object.hasOwn(ceiling, 'requiredTools');\n const hasAllowMcpTools = Object.hasOwn(ceiling, 'allowMcpTools');\n const hasAllowedExternalProfiles = Object.hasOwn(ceiling, 'allowedExternalProfiles');\n const hasDenyExtensions = Object.hasOwn(ceiling, 'denyExtensions');\n if (!hasAllowedTools && !hasRequiredTools && !hasAllowMcpTools && !hasAllowedExternalProfiles && !hasDenyExtensions) {\n throw new Error(\n 'Invalid capability ceiling; expected allowedTools, requiredTools, allowMcpTools, allowedExternalProfiles, or denyExtensions.',\n );\n }\n if (hasAllowMcpTools && typeof ceiling.allowMcpTools !== 'boolean') {\n throw new Error('Invalid capability ceiling allowMcpTools; expected a boolean.');\n }\n if (hasDenyExtensions && typeof ceiling.denyExtensions !== 'boolean') {\n throw new Error('Invalid capability ceiling denyExtensions; expected a boolean.');\n }\n const normalizeTools = (value: readonly string[] | undefined, field: 'allowedTools' | 'requiredTools') => {\n if (!Array.isArray(value)) throw new Error(`Invalid capability ceiling ${field}; expected an array.`);\n if (value.length > MAX_ALLOWED_TOOLS) {\n throw new Error(`Invalid capability ceiling ${field}; expected at most ${MAX_ALLOWED_TOOLS} names.`);\n }\n return [\n ...new Set(\n value.map((tool) => {\n const name = validateText(tool, `${field} entry`);\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid capability ceiling ${field} entry '${name}'.`);\n }\n if (Buffer.byteLength(name, 'utf8') > MAX_TOOL_NAME_BYTES) {\n throw new Error(\n `Invalid capability ceiling ${field} entry '${name}'; max ${MAX_TOOL_NAME_BYTES} UTF-8 bytes.`,\n );\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n };\n const allowedTools = hasAllowedTools ? normalizeTools(ceiling.allowedTools, 'allowedTools') : undefined;\n const requiredTools = hasRequiredTools ? normalizeTools(ceiling.requiredTools, 'requiredTools') : undefined;\n let allowedExternalProfiles: string[] = [];\n if (Object.hasOwn(ceiling, 'allowedExternalProfiles')) {\n if (!Array.isArray(ceiling.allowedExternalProfiles)) {\n throw new Error('Invalid capability ceiling allowedExternalProfiles; expected an array.');\n }\n if (ceiling.allowedExternalProfiles.length > MAX_ALLOWED_EXTERNAL_PROFILES) {\n throw new Error(\n `Invalid capability ceiling allowedExternalProfiles; expected at most ${MAX_ALLOWED_EXTERNAL_PROFILES} names.`,\n );\n }\n allowedExternalProfiles = [\n ...new Set(\n ceiling.allowedExternalProfiles.map((profile) => {\n const name = validateText(profile, 'allowedExternalProfiles entry');\n if (\n !EXTERNAL_PROFILE_PATTERN.test(name) ||\n Buffer.byteLength(name, 'utf8') > MAX_EXTERNAL_PROFILE_NAME_BYTES\n ) {\n throw new Error(`Invalid capability ceiling allowedExternalProfiles entry '${name}'.`);\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n }\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools?.length ? { requiredTools } : {}),\n ...(ceiling.allowMcpTools === true ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: ceiling.denyExtensions === true,\n sources: [],\n };\n}\n\nexport function parseSubagentCapabilityCeiling(\n value: unknown,\n field = 'capability ceiling',\n): ResolvedSubagentCapabilityCeiling {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${field}; expected an object.`);\n }\n const record = value as Record<string, unknown>;\n if (record.version !== SUBAGENT_CAPABILITY_CEILING_VERSION) throw new Error(`Invalid ${field} version.`);\n const normalized = normalizeCeiling(record as SubagentCapabilityCeiling);\n const sources = record.sources;\n if (!Array.isArray(sources) || sources.some((source) => typeof source !== 'string')) {\n throw new Error(`Invalid ${field} sources; expected an array of strings.`);\n }\n normalized.sources = [...new Set(sources.map((source) => validateText(source, `${field} source`)))].sort();\n return normalized;\n}\n\nexport function registerSubagentCapabilityCeiling(\n options: RegisterSubagentCapabilityCeilingOptions,\n bridge?: IGlobalStateBridge,\n): SubagentCapabilityCeilingHandle {\n const sessionId = validateText(options.sessionId, 'sessionId');\n const source = validateText(options.source, 'source');\n const token = Symbol(source);\n const store = registry(bridge);\n let session = store.get(sessionId);\n if (!session) {\n session = new Map();\n store.set(sessionId, session);\n }\n const registrations = session;\n const write = (ceiling: SubagentCapabilityCeiling): void => {\n const normalized = normalizeCeiling(ceiling);\n normalized.sources = [source];\n registrations.set(token, { source, ceiling: normalized });\n };\n write(options.ceiling);\n let disposed = false;\n return {\n update(ceiling) {\n if (disposed) throw new Error('Cannot update a disposed capability ceiling handle.');\n write(ceiling);\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n registrations.delete(token);\n if (registrations.size === 0) store.delete(sessionId);\n },\n };\n}\n\nexport function intersectSubagentCapabilityCeilings(\n ...ceilings: Array<ResolvedSubagentCapabilityCeiling | undefined>\n): ResolvedSubagentCapabilityCeiling | undefined {\n const active = ceilings.filter((ceiling): ceiling is ResolvedSubagentCapabilityCeiling => ceiling !== undefined);\n if (active.length === 0) return undefined;\n const definedLists = active\n .filter((ceiling) => ceiling.allowedTools !== undefined)\n .map((ceiling) => new Set(ceiling.allowedTools));\n let allowedTools: string[] | undefined;\n if (definedLists.length > 0) {\n allowedTools = [...definedLists[0]!].filter((tool) => definedLists.every((list) => list.has(tool))).sort();\n }\n const requiredTools = [...new Set(active.flatMap((ceiling) => ceiling.requiredTools ?? []))]\n .filter((tool) => !allowedTools || allowedTools.includes(tool))\n .sort((left, right) => left.localeCompare(right));\n const profileSets = active.map((ceiling) => new Set(ceiling.allowedExternalProfiles));\n const allowedExternalProfiles = [...profileSets[0]!]\n .filter((profile) => profileSets.every((profiles) => profiles.has(profile)))\n .sort((left, right) => left.localeCompare(right));\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools.length ? { requiredTools } : {}),\n ...(active.every((ceiling) => ceiling.allowMcpTools === true) ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: active.some((ceiling) => ceiling.denyExtensions),\n sources: [...new Set(active.flatMap((ceiling) => ceiling.sources))].sort(),\n };\n}\n\nexport function resolveSubagentCapabilityCeiling(\n sessionId: string | undefined,\n inherited?: ResolvedSubagentCapabilityCeiling,\n bridge?: IGlobalStateBridge,\n): ResolvedSubagentCapabilityCeiling | undefined {\n const active: ResolvedSubagentCapabilityCeiling[] = [];\n if (sessionId) {\n const registrations = registry(bridge).get(sessionId);\n if (registrations) active.push(...Array.from(registrations.values(), ({ ceiling }) => ceiling));\n }\n return intersectSubagentCapabilityCeilings(inherited, ...active);\n}\n\nexport function resolveCurrentSubagentCapabilityCeiling(\n sessionId: string | undefined,\n bridge?: IGlobalStateBridge,\n): ResolvedSubagentCapabilityCeiling | undefined {\n return resolveSubagentCapabilityCeiling(\n sessionId,\n decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),\n bridge,\n );\n}\n\nexport function encodeSubagentCapabilityCeiling(\n ceiling: ResolvedSubagentCapabilityCeiling | undefined,\n): string | undefined {\n if (!ceiling) return undefined;\n return Buffer.from(JSON.stringify(ceiling), 'utf8').toString('base64url');\n}\n\nexport function decodeSubagentCapabilityCeiling(\n value: string | undefined,\n): ResolvedSubagentCapabilityCeiling | undefined {\n if (value === undefined || value === '') return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));\n } catch (error) {\n throw new Error(`Invalid inherited capability ceiling: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed) ||\n (parsed as { version?: unknown }).version !== SUBAGENT_CAPABILITY_CEILING_VERSION\n ) {\n throw new Error('Invalid inherited capability ceiling version.');\n }\n return parseSubagentCapabilityCeiling(parsed, 'inherited capability ceiling');\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.cjs","names":[],"sources":["../../../src/schemas/team/delegation.ts"],"sourcesContent":["/**\n * Subagent delegation - a cross-extension event protocol.\n *\n * Delegation lets another extension ask this runtime to run a subagent without\n * depending on its internals: the requester emits a request event and receives\n * started/update/response events back over the host event bus.\n *\n * Two generations coexist. V1 correlates purely by `requestId`. V2 adds\n * `ownerRunId` and `nodeId` so one owner can fan out to many nodes and have each\n * reply routed back, and it carries a typed `result` request.\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The event names and version numbers below are shared with doom-pi-subagents\n * and with doom-task and agiflow-pi-extension, which speak this protocol today.\n * The event names deliberately keep their `prompt-template:` prefix: that is the\n * established transport, and renaming it would silently stop delivery. Pinned by\n * contract tests.\n *\n * AVOID:\n * - Adding a required field to an existing version; add a version instead\n */\n\nexport const SUBAGENT_DELEGATION_PROTOCOL_VERSION = 1 as const;\nexport const SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION = 2 as const;\n\n// This is the established extension-to-extension transport. The public API\n// intentionally reuses it instead of adding a second event protocol.\nexport const SUBAGENT_DELEGATION_REQUEST_EVENT = 'prompt-template:subagent:request';\nexport const SUBAGENT_DELEGATION_STARTED_EVENT = 'prompt-template:subagent:started';\nexport const SUBAGENT_DELEGATION_UPDATE_EVENT = 'prompt-template:subagent:update';\nexport const SUBAGENT_DELEGATION_RESPONSE_EVENT = 'prompt-template:subagent:response';\nexport const SUBAGENT_DELEGATION_CANCEL_EVENT = 'prompt-template:subagent:cancel';\n\nexport interface SubagentDelegationTurnBudget {\n maxTurns: number;\n graceTurns?: number;\n}\n\nexport interface SubagentDelegationToolBudget {\n soft?: number;\n hard: number;\n block?: string[] | '*';\n}\n\nexport interface SubagentDelegationAgentContract {\n version: 1;\n}\n\nexport type SubagentDelegationJsonSchemaObject = Record<string, unknown>;\n\nexport interface SubagentDelegationExecutionResult {\n status: 'completed' | 'failed' | 'paused' | 'stopped' | 'detached';\n success: boolean;\n exitCode: number;\n error?: string;\n interrupted?: boolean;\n timedOut?: boolean;\n stopped?: boolean;\n detached?: boolean;\n}\n\nexport interface SubagentDelegationReviewResult {\n status: 'not-requested' | 'review-required' | 'reviewed' | 'blockers';\n findings?: Array<{ severity: 'blocker' | 'non-blocking'; file?: string; issue: string; rationale: string }>;\n}\n\nexport interface SubagentDelegationEffectsResult {\n fileMutation?: {\n status: 'not-requested' | 'not-applicable' | 'observed' | 'missing';\n expected: boolean;\n attempted: boolean;\n message?: string;\n };\n}\n\nexport type SubagentDelegationAcceptanceEvidence =\n | 'changed-files'\n | 'tests-added'\n | 'commands-run'\n | 'validation-output'\n | 'residual-risks'\n | 'no-staged-files'\n | 'diff-summary'\n | 'review-findings'\n | 'manual-notes';\n\nexport interface SubagentDelegationAcceptanceCriterion {\n id: string;\n must: string;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n severity?: 'required' | 'recommended';\n}\n\nexport interface SubagentDelegationAcceptanceVerifyCommand {\n id: string;\n command: string;\n timeoutMs?: number;\n cwd?: string;\n env?: Record<string, string>;\n allowFailure?: boolean;\n}\n\nexport interface SubagentDelegationAcceptanceReview {\n agent?: string;\n focus?: string;\n required?: boolean;\n}\n\ninterface SubagentDelegationAcceptanceFields {\n criteria?: Array<string | SubagentDelegationAcceptanceCriterion>;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n verify?: SubagentDelegationAcceptanceVerifyCommand[];\n review?: SubagentDelegationAcceptanceReview | false;\n stopRules?: string[];\n}\n\nexport type SubagentDelegationAcceptanceConfig = SubagentDelegationAcceptanceFields &\n ({ level: 'none'; reason: string } | { level?: 'auto' | 'attested' | 'checked' | 'verified'; reason?: string });\n\nexport type SubagentDelegationAcceptance =\n | 'auto'\n | 'attested'\n | 'checked'\n | 'verified'\n | false\n | SubagentDelegationAcceptanceConfig;\n\nexport interface SubagentDelegationRequest {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n output?: string | boolean;\n outputMode?: 'inline' | 'file-only';\n outputSchema?: SubagentDelegationJsonSchemaObject;\n agentContract?: SubagentDelegationAgentContract;\n acceptance?: SubagentDelegationAcceptance;\n artifacts?: boolean;\n /** Foreground remains the compatibility default. */\n runMode?: 'foreground' | 'detached';\n /** Optional task identity shown to active root-session teammates. */\n teamTask?: { id: string; subject: string };\n}\n\nexport interface SubagentDelegationStarted {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n runId?: string;\n}\n\nexport interface SubagentDelegationUpdate extends SubagentDelegationStarted {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationStatus =\n | 'completed'\n | 'failed'\n | 'timed_out'\n | 'cancelled'\n | 'interrupted'\n | 'turn_budget_exhausted'\n | 'tool_budget_exhausted'\n | 'structured_output_failed'\n | 'acceptance_failed'\n | 'invalid_request'\n | 'unavailable_context';\n\nexport type SubagentDelegationAcceptanceStatus =\n | 'pending'\n | 'not-required'\n | 'claimed'\n | 'attested'\n | 'checked'\n | 'verified'\n | 'review-required'\n | 'reviewed'\n | 'accepted'\n | 'rejected';\n\nexport interface SubagentDelegationAcceptanceResult {\n status: SubagentDelegationAcceptanceStatus;\n evidenceStatus: Exclude<SubagentDelegationAcceptanceStatus, 'review-required' | 'reviewed' | 'accepted'>;\n explicit: boolean;\n}\n\nexport interface SubagentDelegationResponse extends SubagentDelegationStarted {\n status: SubagentDelegationStatus;\n error?: string;\n runId?: string;\n childIndex?: number;\n agent?: string;\n model?: string;\n exitCode?: number;\n execution?: SubagentDelegationExecutionResult;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n acceptance?: SubagentDelegationAcceptanceResult;\n review?: SubagentDelegationReviewResult;\n effects?: SubagentDelegationEffectsResult;\n turns?: number;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n warnings?: string[];\n}\n\nexport interface SubagentDelegationCancel extends SubagentDelegationStarted {}\n\nexport type SubagentDelegationV2Thinking = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nexport type SubagentDelegationV2ResultRequest =\n | { kind: 'text' }\n | { kind: 'structured'; schema: SubagentDelegationJsonSchemaObject };\n\nexport interface SubagentDelegationV2Request {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n thinking?: SubagentDelegationV2Thinking;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n result: SubagentDelegationV2ResultRequest;\n}\n\nexport interface SubagentDelegationV2Started {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n}\n\nexport interface SubagentDelegationV2Update extends SubagentDelegationV2Started {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationV2Status = SubagentDelegationStatus | 'duplicate_node';\n\nexport type SubagentDelegationV2Value = { kind: 'text'; text: string } | { kind: 'structured'; value: unknown };\n\nexport interface SubagentDelegationV2Usage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n turns: number;\n toolCalls: number;\n durationMs: number;\n}\n\nexport interface SubagentDelegationV2TerminalResponse extends SubagentDelegationV2Started {\n status: Exclude<SubagentDelegationV2Status, 'invalid_request'>;\n error?: string;\n runId?: string;\n agent?: string;\n model?: string;\n thinking?: string;\n exitCode?: number;\n launchContractDigest?: string;\n result?: SubagentDelegationV2Value;\n usage?: SubagentDelegationV2Usage;\n}\n\n/** A malformed V2 request can only be correlated by the valid identity fields it supplied. */\nexport interface SubagentDelegationV2InvalidResponse {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId?: string;\n nodeId?: string;\n status: 'invalid_request';\n error?: string;\n}\n\nexport type SubagentDelegationV2Response = SubagentDelegationV2TerminalResponse | SubagentDelegationV2InvalidResponse;\n\nexport interface SubagentDelegationV2Cancel extends SubagentDelegationV2Started {}\n"],"mappings":""}
@@ -1,4 +1,4 @@
1
- //#region src/protocol/delegation.d.ts
1
+ //#region src/schemas/team/delegation.d.ts
2
2
  /**
3
3
  * Subagent delegation - a cross-extension event protocol.
4
4
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.d.cts","names":[],"sources":["../../../src/schemas/team/delegation.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region src/protocol/delegation.d.ts
1
+ //#region src/schemas/team/delegation.d.ts
2
2
  /**
3
3
  * Subagent delegation - a cross-extension event protocol.
4
4
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.d.mts","names":[],"sources":["../../../src/schemas/team/delegation.ts"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.mjs","names":[],"sources":["../../../src/schemas/team/delegation.ts"],"sourcesContent":["/**\n * Subagent delegation - a cross-extension event protocol.\n *\n * Delegation lets another extension ask this runtime to run a subagent without\n * depending on its internals: the requester emits a request event and receives\n * started/update/response events back over the host event bus.\n *\n * Two generations coexist. V1 correlates purely by `requestId`. V2 adds\n * `ownerRunId` and `nodeId` so one owner can fan out to many nodes and have each\n * reply routed back, and it carries a typed `result` request.\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The event names and version numbers below are shared with doom-pi-subagents\n * and with doom-task and agiflow-pi-extension, which speak this protocol today.\n * The event names deliberately keep their `prompt-template:` prefix: that is the\n * established transport, and renaming it would silently stop delivery. Pinned by\n * contract tests.\n *\n * AVOID:\n * - Adding a required field to an existing version; add a version instead\n */\n\nexport const SUBAGENT_DELEGATION_PROTOCOL_VERSION = 1 as const;\nexport const SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION = 2 as const;\n\n// This is the established extension-to-extension transport. The public API\n// intentionally reuses it instead of adding a second event protocol.\nexport const SUBAGENT_DELEGATION_REQUEST_EVENT = 'prompt-template:subagent:request';\nexport const SUBAGENT_DELEGATION_STARTED_EVENT = 'prompt-template:subagent:started';\nexport const SUBAGENT_DELEGATION_UPDATE_EVENT = 'prompt-template:subagent:update';\nexport const SUBAGENT_DELEGATION_RESPONSE_EVENT = 'prompt-template:subagent:response';\nexport const SUBAGENT_DELEGATION_CANCEL_EVENT = 'prompt-template:subagent:cancel';\n\nexport interface SubagentDelegationTurnBudget {\n maxTurns: number;\n graceTurns?: number;\n}\n\nexport interface SubagentDelegationToolBudget {\n soft?: number;\n hard: number;\n block?: string[] | '*';\n}\n\nexport interface SubagentDelegationAgentContract {\n version: 1;\n}\n\nexport type SubagentDelegationJsonSchemaObject = Record<string, unknown>;\n\nexport interface SubagentDelegationExecutionResult {\n status: 'completed' | 'failed' | 'paused' | 'stopped' | 'detached';\n success: boolean;\n exitCode: number;\n error?: string;\n interrupted?: boolean;\n timedOut?: boolean;\n stopped?: boolean;\n detached?: boolean;\n}\n\nexport interface SubagentDelegationReviewResult {\n status: 'not-requested' | 'review-required' | 'reviewed' | 'blockers';\n findings?: Array<{ severity: 'blocker' | 'non-blocking'; file?: string; issue: string; rationale: string }>;\n}\n\nexport interface SubagentDelegationEffectsResult {\n fileMutation?: {\n status: 'not-requested' | 'not-applicable' | 'observed' | 'missing';\n expected: boolean;\n attempted: boolean;\n message?: string;\n };\n}\n\nexport type SubagentDelegationAcceptanceEvidence =\n | 'changed-files'\n | 'tests-added'\n | 'commands-run'\n | 'validation-output'\n | 'residual-risks'\n | 'no-staged-files'\n | 'diff-summary'\n | 'review-findings'\n | 'manual-notes';\n\nexport interface SubagentDelegationAcceptanceCriterion {\n id: string;\n must: string;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n severity?: 'required' | 'recommended';\n}\n\nexport interface SubagentDelegationAcceptanceVerifyCommand {\n id: string;\n command: string;\n timeoutMs?: number;\n cwd?: string;\n env?: Record<string, string>;\n allowFailure?: boolean;\n}\n\nexport interface SubagentDelegationAcceptanceReview {\n agent?: string;\n focus?: string;\n required?: boolean;\n}\n\ninterface SubagentDelegationAcceptanceFields {\n criteria?: Array<string | SubagentDelegationAcceptanceCriterion>;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n verify?: SubagentDelegationAcceptanceVerifyCommand[];\n review?: SubagentDelegationAcceptanceReview | false;\n stopRules?: string[];\n}\n\nexport type SubagentDelegationAcceptanceConfig = SubagentDelegationAcceptanceFields &\n ({ level: 'none'; reason: string } | { level?: 'auto' | 'attested' | 'checked' | 'verified'; reason?: string });\n\nexport type SubagentDelegationAcceptance =\n | 'auto'\n | 'attested'\n | 'checked'\n | 'verified'\n | false\n | SubagentDelegationAcceptanceConfig;\n\nexport interface SubagentDelegationRequest {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n output?: string | boolean;\n outputMode?: 'inline' | 'file-only';\n outputSchema?: SubagentDelegationJsonSchemaObject;\n agentContract?: SubagentDelegationAgentContract;\n acceptance?: SubagentDelegationAcceptance;\n artifacts?: boolean;\n /** Foreground remains the compatibility default. */\n runMode?: 'foreground' | 'detached';\n /** Optional task identity shown to active root-session teammates. */\n teamTask?: { id: string; subject: string };\n}\n\nexport interface SubagentDelegationStarted {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n runId?: string;\n}\n\nexport interface SubagentDelegationUpdate extends SubagentDelegationStarted {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationStatus =\n | 'completed'\n | 'failed'\n | 'timed_out'\n | 'cancelled'\n | 'interrupted'\n | 'turn_budget_exhausted'\n | 'tool_budget_exhausted'\n | 'structured_output_failed'\n | 'acceptance_failed'\n | 'invalid_request'\n | 'unavailable_context';\n\nexport type SubagentDelegationAcceptanceStatus =\n | 'pending'\n | 'not-required'\n | 'claimed'\n | 'attested'\n | 'checked'\n | 'verified'\n | 'review-required'\n | 'reviewed'\n | 'accepted'\n | 'rejected';\n\nexport interface SubagentDelegationAcceptanceResult {\n status: SubagentDelegationAcceptanceStatus;\n evidenceStatus: Exclude<SubagentDelegationAcceptanceStatus, 'review-required' | 'reviewed' | 'accepted'>;\n explicit: boolean;\n}\n\nexport interface SubagentDelegationResponse extends SubagentDelegationStarted {\n status: SubagentDelegationStatus;\n error?: string;\n runId?: string;\n childIndex?: number;\n agent?: string;\n model?: string;\n exitCode?: number;\n execution?: SubagentDelegationExecutionResult;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n acceptance?: SubagentDelegationAcceptanceResult;\n review?: SubagentDelegationReviewResult;\n effects?: SubagentDelegationEffectsResult;\n turns?: number;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n warnings?: string[];\n}\n\nexport interface SubagentDelegationCancel extends SubagentDelegationStarted {}\n\nexport type SubagentDelegationV2Thinking = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nexport type SubagentDelegationV2ResultRequest =\n | { kind: 'text' }\n | { kind: 'structured'; schema: SubagentDelegationJsonSchemaObject };\n\nexport interface SubagentDelegationV2Request {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n thinking?: SubagentDelegationV2Thinking;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n result: SubagentDelegationV2ResultRequest;\n}\n\nexport interface SubagentDelegationV2Started {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n}\n\nexport interface SubagentDelegationV2Update extends SubagentDelegationV2Started {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationV2Status = SubagentDelegationStatus | 'duplicate_node';\n\nexport type SubagentDelegationV2Value = { kind: 'text'; text: string } | { kind: 'structured'; value: unknown };\n\nexport interface SubagentDelegationV2Usage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n turns: number;\n toolCalls: number;\n durationMs: number;\n}\n\nexport interface SubagentDelegationV2TerminalResponse extends SubagentDelegationV2Started {\n status: Exclude<SubagentDelegationV2Status, 'invalid_request'>;\n error?: string;\n runId?: string;\n agent?: string;\n model?: string;\n thinking?: string;\n exitCode?: number;\n launchContractDigest?: string;\n result?: SubagentDelegationV2Value;\n usage?: SubagentDelegationV2Usage;\n}\n\n/** A malformed V2 request can only be correlated by the valid identity fields it supplied. */\nexport interface SubagentDelegationV2InvalidResponse {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId?: string;\n nodeId?: string;\n status: 'invalid_request';\n error?: string;\n}\n\nexport type SubagentDelegationV2Response = SubagentDelegationV2TerminalResponse | SubagentDelegationV2InvalidResponse;\n\nexport interface SubagentDelegationV2Cancel extends SubagentDelegationV2Started {}\n"],"mappings":"AAsBA,MAAa,EAAuC,EACvC,EAA0C,EAI1C,EAAoC,mCACpC,EAAoC,mCACpC,EAAmC,kCACnC,EAAqC,oCACrC,EAAmC"}
@@ -0,0 +1,2 @@
1
+ const e=[`models`,`excludeTools`],t=[`model`,`thinking`],n=new Set([`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`]);function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e,t,n){let r=Object.keys(e).filter(e=>!t.includes(e));if(r.length>0)throw Error(`${n} has unsupported field(s): ${r.join(`, `)}`)}function a(a,o){if(!r(a))throw Error(`${o} must be a mapping`);i(a,e,o);let s=Object.hasOwn(a,`models`),c=Object.hasOwn(a,`excludeTools`);if(!s&&!c)throw Error(`${o} must define models or excludeTools`);let l;if(s){if(!Array.isArray(a.models)||a.models.length===0)throw Error(`${o}.models must be a non-empty array`);l=a.models.map((e,a)=>{let s=`${o}.models[${a}]`;if(!r(e))throw Error(`${s} must be a mapping`);if(i(e,t,s),typeof e.model!=`string`||!e.model.trim())throw Error(`${s}.model must be a non-empty string`);if(e.thinking!==void 0&&(typeof e.thinking!=`string`||!n.has(e.thinking)))throw Error(`${s}.thinking must be one of: ${[...n].join(`, `)}`);return{model:e.model.trim(),...e.thinking?{thinking:e.thinking}:{}}})}let u;if(c){if(!Array.isArray(a.excludeTools)||a.excludeTools.length===0)throw Error(`${o}.excludeTools must be a non-empty array`);u=[...new Set(a.excludeTools.map((e,t)=>{if(typeof e!=`string`||!e.trim())throw Error(`${o}.excludeTools[${t}] must be a non-empty string`);return e.trim()}))]}return{...l?{models:l}:{},...u?{excludeTools:u}:{}}}function o(e){let t,n=new Set,r=!1;for(let i of e){let e=`Package "${i.specifier}" config in layer "${i.layer}" of .doom/modes.yaml`,o=a(i.config,e);if(o.models&&(t=o.models.map(e=>({...e}))),o.excludeTools){r=!0;for(let e of o.excludeTools)n.add(e)}}if(!(!t&&!r))return{...t?{models:t}:{},...r?{excludeTools:[...n]}:{}}}exports.DOOMPI_TEAM_PACKAGE=`@agimon-ai/doompi-team`,exports.mergeTeamPackageConfigurations=o;
2
+ //# sourceMappingURL=packageConfig.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageConfig.cjs","names":[],"sources":["../../../src/schemas/team/packageConfig.ts"],"sourcesContent":["/**\n * Configuration owned by the @agimon-ai/doompi-team package entry in modes.yaml.\n *\n * DESIGN PATTERNS:\n * - Doompi Config validates the generic package-entry envelope; Team validates\n * only the fields it owns.\n * - Selected layers are merged in order: later model lists replace earlier\n * lists, while excluded tools are unioned in first-seen order.\n *\n * CODING STANDARDS:\n * - Reject unknown fields and malformed values with their YAML location.\n * - Return normalized copies so callers cannot mutate parsed source objects.\n *\n * AVOID:\n * - Adding Team-specific fields to doompi-config's generic layer schema.\n * - Accepting the removed layer-level config shape as a compatibility alias.\n */\n\nimport type { PlanningThinkingLevel, ResolvedPackageConfiguration } from '@agimon-ai/doompi-config';\n\nexport const DOOMPI_TEAM_PACKAGE = '@agimon-ai/doompi-team';\n\nconst TEAM_CONFIG_KEYS = ['models', 'excludeTools'] as const;\nconst TEAM_MODEL_KEYS = ['model', 'thinking'] as const;\nconst THINKING_VALUES = new Set<PlanningThinkingLevel>(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max']);\n\nexport interface TeamPackageModelConfig {\n model: string;\n thinking?: PlanningThinkingLevel;\n}\n\nexport interface TeamPackageConfig {\n models?: TeamPackageModelConfig[];\n excludeTools?: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction assertKnownKeys(value: Record<string, unknown>, keys: readonly string[], location: string): void {\n const unsupported = Object.keys(value).filter((key) => !keys.includes(key));\n if (unsupported.length > 0) {\n throw new Error(`${location} has unsupported field(s): ${unsupported.join(', ')}`);\n }\n}\n\n/** Validate and normalize one Team-owned package configuration mapping. */\nexport function parseTeamPackageConfig(value: unknown, location: string): TeamPackageConfig {\n if (!isRecord(value)) throw new Error(`${location} must be a mapping`);\n assertKnownKeys(value, TEAM_CONFIG_KEYS, location);\n const hasModels = Object.hasOwn(value, 'models');\n const hasExcludeTools = Object.hasOwn(value, 'excludeTools');\n if (!hasModels && !hasExcludeTools) {\n throw new Error(`${location} must define models or excludeTools`);\n }\n\n let models: TeamPackageModelConfig[] | undefined;\n if (hasModels) {\n if (!Array.isArray(value.models) || value.models.length === 0) {\n throw new Error(`${location}.models must be a non-empty array`);\n }\n models = value.models.map((entry, index): TeamPackageModelConfig => {\n const entryLocation = `${location}.models[${index}]`;\n if (!isRecord(entry)) throw new Error(`${entryLocation} must be a mapping`);\n assertKnownKeys(entry, TEAM_MODEL_KEYS, entryLocation);\n if (typeof entry.model !== 'string' || !entry.model.trim()) {\n throw new Error(`${entryLocation}.model must be a non-empty string`);\n }\n if (\n entry.thinking !== undefined &&\n (typeof entry.thinking !== 'string' || !THINKING_VALUES.has(entry.thinking as PlanningThinkingLevel))\n ) {\n throw new Error(`${entryLocation}.thinking must be one of: ${[...THINKING_VALUES].join(', ')}`);\n }\n return {\n model: entry.model.trim(),\n ...(entry.thinking ? { thinking: entry.thinking as PlanningThinkingLevel } : {}),\n };\n });\n }\n\n let excludeTools: string[] | undefined;\n if (hasExcludeTools) {\n if (!Array.isArray(value.excludeTools) || value.excludeTools.length === 0) {\n throw new Error(`${location}.excludeTools must be a non-empty array`);\n }\n excludeTools = [\n ...new Set(\n value.excludeTools.map((entry, index) => {\n if (typeof entry !== 'string' || !entry.trim()) {\n throw new Error(`${location}.excludeTools[${index}] must be a non-empty string`);\n }\n return entry.trim();\n }),\n ),\n ];\n }\n\n return {\n ...(models ? { models } : {}),\n ...(excludeTools ? { excludeTools } : {}),\n };\n}\n\n/** Merge Team configurations contributed by selected layers in selection order. */\nexport function mergeTeamPackageConfigurations(\n entries: readonly ResolvedPackageConfiguration[],\n): TeamPackageConfig | undefined {\n let models: TeamPackageModelConfig[] | undefined;\n const excludeTools = new Set<string>();\n let hasExcludeTools = false;\n for (const entry of entries) {\n const location = `Package \"${entry.specifier}\" config in layer \"${entry.layer}\" of .doom/modes.yaml`;\n const next = parseTeamPackageConfig(entry.config, location);\n if (next.models) models = next.models.map((model) => ({ ...model }));\n if (next.excludeTools) {\n hasExcludeTools = true;\n for (const tool of next.excludeTools) excludeTools.add(tool);\n }\n }\n if (!models && !hasExcludeTools) return undefined;\n return {\n ...(models ? { models } : {}),\n ...(hasExcludeTools ? { excludeTools: [...excludeTools] } : {}),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{__esmMin as e}from"../../_virtual/_rolldown/runtime.mjs";function t(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function n(e,t,n){let r=Object.keys(e).filter(e=>!t.includes(e));if(r.length>0)throw Error(`${n} has unsupported field(s): ${r.join(`, `)}`)}function r(e,r){if(!t(e))throw Error(`${r} must be a mapping`);n(e,o,r);let i=Object.hasOwn(e,`models`),a=Object.hasOwn(e,`excludeTools`);if(!i&&!a)throw Error(`${r} must define models or excludeTools`);let l;if(i){if(!Array.isArray(e.models)||e.models.length===0)throw Error(`${r}.models must be a non-empty array`);l=e.models.map((e,i)=>{let a=`${r}.models[${i}]`;if(!t(e))throw Error(`${a} must be a mapping`);if(n(e,s,a),typeof e.model!=`string`||!e.model.trim())throw Error(`${a}.model must be a non-empty string`);if(e.thinking!==void 0&&(typeof e.thinking!=`string`||!c.has(e.thinking)))throw Error(`${a}.thinking must be one of: ${[...c].join(`, `)}`);return{model:e.model.trim(),...e.thinking?{thinking:e.thinking}:{}}})}let u;if(a){if(!Array.isArray(e.excludeTools)||e.excludeTools.length===0)throw Error(`${r}.excludeTools must be a non-empty array`);u=[...new Set(e.excludeTools.map((e,t)=>{if(typeof e!=`string`||!e.trim())throw Error(`${r}.excludeTools[${t}] must be a non-empty string`);return e.trim()}))]}return{...l?{models:l}:{},...u?{excludeTools:u}:{}}}function i(e){let t,n=new Set,i=!1;for(let a of e){let e=`Package "${a.specifier}" config in layer "${a.layer}" of .doom/modes.yaml`,o=r(a.config,e);if(o.models&&(t=o.models.map(e=>({...e}))),o.excludeTools){i=!0;for(let e of o.excludeTools)n.add(e)}}if(!(!t&&!i))return{...t?{models:t}:{},...i?{excludeTools:[...n]}:{}}}var a,o,s,c,l=e((()=>{a=`@agimon-ai/doompi-team`,o=[`models`,`excludeTools`],s=[`model`,`thinking`],c=new Set([`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`])}));l();export{a as DOOMPI_TEAM_PACKAGE,l as init_packageConfig,i as mergeTeamPackageConfigurations};
2
+ //# sourceMappingURL=packageConfig.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageConfig.mjs","names":[],"sources":["../../../src/schemas/team/packageConfig.ts"],"sourcesContent":["/**\n * Configuration owned by the @agimon-ai/doompi-team package entry in modes.yaml.\n *\n * DESIGN PATTERNS:\n * - Doompi Config validates the generic package-entry envelope; Team validates\n * only the fields it owns.\n * - Selected layers are merged in order: later model lists replace earlier\n * lists, while excluded tools are unioned in first-seen order.\n *\n * CODING STANDARDS:\n * - Reject unknown fields and malformed values with their YAML location.\n * - Return normalized copies so callers cannot mutate parsed source objects.\n *\n * AVOID:\n * - Adding Team-specific fields to doompi-config's generic layer schema.\n * - Accepting the removed layer-level config shape as a compatibility alias.\n */\n\nimport type { PlanningThinkingLevel, ResolvedPackageConfiguration } from '@agimon-ai/doompi-config';\n\nexport const DOOMPI_TEAM_PACKAGE = '@agimon-ai/doompi-team';\n\nconst TEAM_CONFIG_KEYS = ['models', 'excludeTools'] as const;\nconst TEAM_MODEL_KEYS = ['model', 'thinking'] as const;\nconst THINKING_VALUES = new Set<PlanningThinkingLevel>(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max']);\n\nexport interface TeamPackageModelConfig {\n model: string;\n thinking?: PlanningThinkingLevel;\n}\n\nexport interface TeamPackageConfig {\n models?: TeamPackageModelConfig[];\n excludeTools?: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction assertKnownKeys(value: Record<string, unknown>, keys: readonly string[], location: string): void {\n const unsupported = Object.keys(value).filter((key) => !keys.includes(key));\n if (unsupported.length > 0) {\n throw new Error(`${location} has unsupported field(s): ${unsupported.join(', ')}`);\n }\n}\n\n/** Validate and normalize one Team-owned package configuration mapping. */\nexport function parseTeamPackageConfig(value: unknown, location: string): TeamPackageConfig {\n if (!isRecord(value)) throw new Error(`${location} must be a mapping`);\n assertKnownKeys(value, TEAM_CONFIG_KEYS, location);\n const hasModels = Object.hasOwn(value, 'models');\n const hasExcludeTools = Object.hasOwn(value, 'excludeTools');\n if (!hasModels && !hasExcludeTools) {\n throw new Error(`${location} must define models or excludeTools`);\n }\n\n let models: TeamPackageModelConfig[] | undefined;\n if (hasModels) {\n if (!Array.isArray(value.models) || value.models.length === 0) {\n throw new Error(`${location}.models must be a non-empty array`);\n }\n models = value.models.map((entry, index): TeamPackageModelConfig => {\n const entryLocation = `${location}.models[${index}]`;\n if (!isRecord(entry)) throw new Error(`${entryLocation} must be a mapping`);\n assertKnownKeys(entry, TEAM_MODEL_KEYS, entryLocation);\n if (typeof entry.model !== 'string' || !entry.model.trim()) {\n throw new Error(`${entryLocation}.model must be a non-empty string`);\n }\n if (\n entry.thinking !== undefined &&\n (typeof entry.thinking !== 'string' || !THINKING_VALUES.has(entry.thinking as PlanningThinkingLevel))\n ) {\n throw new Error(`${entryLocation}.thinking must be one of: ${[...THINKING_VALUES].join(', ')}`);\n }\n return {\n model: entry.model.trim(),\n ...(entry.thinking ? { thinking: entry.thinking as PlanningThinkingLevel } : {}),\n };\n });\n }\n\n let excludeTools: string[] | undefined;\n if (hasExcludeTools) {\n if (!Array.isArray(value.excludeTools) || value.excludeTools.length === 0) {\n throw new Error(`${location}.excludeTools must be a non-empty array`);\n }\n excludeTools = [\n ...new Set(\n value.excludeTools.map((entry, index) => {\n if (typeof entry !== 'string' || !entry.trim()) {\n throw new Error(`${location}.excludeTools[${index}] must be a non-empty string`);\n }\n return entry.trim();\n }),\n ),\n ];\n }\n\n return {\n ...(models ? { models } : {}),\n ...(excludeTools ? { excludeTools } : {}),\n };\n}\n\n/** Merge Team configurations contributed by selected layers in selection order. */\nexport function mergeTeamPackageConfigurations(\n entries: readonly ResolvedPackageConfiguration[],\n): TeamPackageConfig | undefined {\n let models: TeamPackageModelConfig[] | undefined;\n const excludeTools = new Set<string>();\n let hasExcludeTools = false;\n for (const entry of entries) {\n const location = `Package \"${entry.specifier}\" config in layer \"${entry.layer}\" of .doom/modes.yaml`;\n const next = parseTeamPackageConfig(entry.config, location);\n if (next.models) models = next.models.map((model) => ({ ...model }));\n if (next.excludeTools) {\n hasExcludeTools = true;\n for (const tool of next.excludeTools) excludeTools.add(tool);\n }\n }\n if (!models && !hasExcludeTools) return undefined;\n return {\n ...(models ? { models } : {}),\n ...(hasExcludeTools ? { excludeTools: [...excludeTools] } : {}),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs`),n=require(`../../schemas/team/packageConfig.cjs`),r=require(`../../shared/lruCache.cjs`),i=require(`./projectRoot.cjs`),a=require(`./settings.cjs`),o=require(`./loader.cjs`);let s=require(`node:fs`);s=e.__toESM(s,1);let c=require(`node:path`);c=e.__toESM(c,1);let l=require(`inversify`),u=require(`@agimon-ai/doompi-config`);const d=c.join(`.doom`,`modes.yaml`),f=/:(?:off|minimal|low|medium|high|xhigh|max)$/;function p(e,t,n,r=[]){let i=new Map;for(let e of r)i.set(e.name,e);if(e!==`project`)for(let e of t)i.set(e.name,e);if(e!==`user`)for(let e of n)i.set(e.name,e);return[...i.values()]}function m(e){try{let t=s.statSync(e);return`${e}:${t.mtimeMs}:${t.size}`}catch{return`${e}:-`}}function h(){let e=(0,u.getHarnessState)();if(!e.root||e.layers.length===0)return;let t=n.mergeTeamPackageConfigurations((0,u.resolvePackageConfigurations)((0,u.loadMajorModesConfig)(e.root),e.layers,n.DOOMPI_TEAM_PACKAGE));return t?{config:t,path:c.join(e.root,d)}:void 0}function g(e){if(e?.models)return e.models.map(({model:e,thinking:t})=>t?`${e.replace(f,``)}:${t}`:e)}function _(){return g(h()?.config)}let v=class{cache=new r.LruCache(64);ttlMs=5e3;now(){return Date.now()}discover(e,t){let n=c.resolve(e),r=i.canonicalizeDiscoveryCwd(n),a=`${t}|${r}`,o=this.cache.get(a),s=this.now();if(o&&o.expiresAt>s&&o.fingerprint===this.fingerprint(r))return y(o.result);let l=this.load(n,t);return this.cache.set(a,{result:l,expiresAt:s+this.ttlMs,fingerprint:this.fingerprint(r)}),y(l)}find(e,t,n){return this.discover(e,t).agents.find(e=>e.name===n)}invalidate(){this.cache.clear()}fingerprint(e){let t=(0,u.getHarnessState)(),n=[i.getUserAgentSettingsPath(),i.getProjectAgentSettingsPath(e)??`-`,...i.userAgentDirs(),...i.resolveNearestProjectAgentDirs(e).readDirs,...o.pluginAgentDirs()];return t.root&&n.push(c.join(t.root,d)),[...n.map(m),`active-layers:${t.layers.join(`,`)}`].join(`|`)}load(e,t){let n=i.getUserAgentSettingsPath(),r=i.getProjectAgentSettingsPath(e),s=t===`project`?a.EMPTY_SUBAGENT_SETTINGS:a.readSubagentSettings(n),c=t===`user`?a.EMPTY_SUBAGENT_SETTINGS:a.readSubagentSettings(r),l=a.resolveSubagentDefaultModel(s,c,n,r),u=h(),d=g(u?.config)?.[0],f=d&&u?{type:`packages.team.defaultModel`,scope:`package`,path:u.path,model:d}:l,m=a.resolveSubagentDefaultThinking(s,c,r),_=a.resolveSubagentDefaultExtensions(s,c,r),v=e=>a.applyCustomAgentOverrides(a.applySubagentDefaults(e,f,m,_),s,c,n,r),y=v(o.pluginAgentDirs().flatMap(e=>o.loadAgentsFromDir(e,`plugin`)));return{agents:p(t,t===`project`?[]:v(i.userAgentDirs().flatMap(e=>o.loadAgentsFromDir(e,`user`))),t===`user`?[]:v(i.resolveNearestProjectAgentDirs(e).readDirs.flatMap(e=>o.loadAgentsFromDir(e,`project`))),y).filter(e=>e.disabled!==!0),projectAgentsDir:i.resolveNearestProjectAgentDirs(e).preferredDir,modelScope:c.modelScope??s.modelScope}}};v=t.__decorate([(0,l.injectable)()],v);function y(e){return{...e,agents:[...e.agents]}}Object.defineProperty(exports,`AgentDiscoveryService`,{enumerable:!0,get:function(){return v}}),exports.resolveActiveTeamModelSpecs=_,exports.resolveActiveTeamPackageConfig=h;
2
+ //# sourceMappingURL=discovery.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.cjs","names":["path","fs","mergeTeamPackageConfigurations","DOOMPI_TEAM_PACKAGE","LruCache","canonicalizeDiscoveryCwd","getUserAgentSettingsPath","getProjectAgentSettingsPath","userAgentDirs","resolveNearestProjectAgentDirs","pluginAgentDirs","EMPTY_SUBAGENT_SETTINGS","readSubagentSettings","resolveSubagentDefaultModel","resolveSubagentDefaultThinking","resolveSubagentDefaultExtensions","applyCustomAgentOverrides","applySubagentDefaults","loadAgentsFromDir"],"sources":["../../../src/services/agents/discovery.ts"],"sourcesContent":["/**\n * Cached discovery of the agents visible from a working directory.\n *\n * WHY THIS IS A SERVICE AND NOT A FUNCTION:\n * Discovery reads two settings files and walks every agent directory in scope,\n * parsing the frontmatter of every file it finds. The slash-command completion\n * path asks for the agent list on each keystroke, and preflight asks again for\n * each launch, so the predecessor's plain function re-walked the tree many times\n * per second. Caching needs somewhere to live, and invalidation needs an owner.\n *\n * DESIGN PATTERNS:\n * - Two-layer validity. A short TTL bounds how stale an answer can be, and a\n * cheap source fingerprint catches the common edits sooner than the TTL would\n * - Bounded by an LRU keyed on cwd and scope, so a long session that visits many\n * directories cannot grow the cache without limit\n * - Mutations invalidate explicitly rather than relying on the TTL, so an agent\n * the user just created is visible immediately\n *\n * WHY THE FINGERPRINT IS NOT ENOUGH ON ITS OWN:\n * It stats the settings files and the agent directories, not every agent file.\n * A directory's mtime moves when a file is added or removed but not when an\n * existing file's contents change, so an in-place edit is caught by the TTL\n * rather than by the fingerprint. Stat'ing every agent file on every keystroke\n * would reintroduce the cost this cache exists to remove.\n *\n * AVOID:\n * - Handing out the cached array without copying it; a caller that sorts or\n * splices in place would corrupt every later reader\n * - Raising the TTL to hide a missing invalidate call\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getHarnessState, loadMajorModesConfig, resolvePackageConfigurations } from '@agimon-ai/doompi-config';\nimport { injectable } from 'inversify';\n\nimport {\n DOOMPI_TEAM_PACKAGE,\n mergeTeamPackageConfigurations,\n type TeamPackageConfig,\n} from '../../schemas/team/packageConfig.ts';\nimport { LruCache } from '../../shared/lruCache.ts';\nimport { loadAgentsFromDir, pluginAgentDirs } from './loader.ts';\nimport {\n canonicalizeDiscoveryCwd,\n getProjectAgentSettingsPath,\n getUserAgentSettingsPath,\n resolveNearestProjectAgentDirs,\n userAgentDirs,\n} from './projectRoot.ts';\nimport {\n applyCustomAgentOverrides,\n applySubagentDefaults,\n EMPTY_SUBAGENT_SETTINGS,\n readSubagentSettings,\n resolveSubagentDefaultExtensions,\n resolveSubagentDefaultModel,\n resolveSubagentDefaultThinking,\n} from './settings.ts';\nimport type {\n AgentConfig,\n AgentDiscoveryResult,\n AgentScope,\n IAgentDiscoveryService,\n SubagentSettings,\n} from './types.ts';\n\n/** How long a discovery result may be reused without revalidation. */\nconst DISCOVERY_TTL_MS = 5_000;\n\n/**\n * How many (cwd, scope) combinations stay cached.\n *\n * A session works in a handful of directories and there are three scopes, so\n * this is far above real usage; it exists to bound a pathological case.\n */\nconst MAX_CACHED_DISCOVERIES = 64;\n\nconst FINGERPRINT_FIELD_SEPARATOR = ':';\nconst FINGERPRINT_ENTRY_SEPARATOR = '|';\nconst MISSING_SOURCE_MARKER = '-';\nconst MAJOR_MODES_CONFIG_RELATIVE_PATH = path.join('.doom', 'modes.yaml');\nconst THINKING_SUFFIX = /:(?:off|minimal|low|medium|high|xhigh|max)$/;\n\ninterface CacheEntry {\n result: AgentDiscoveryResult;\n expiresAt: number;\n fingerprint: string;\n}\n\n/**\n * Merge the sources into one list, later sources shadowing earlier ones.\n *\n * Precedence is plugin, then user, then project: the definition closest to the\n * work being done wins, which is what lets a repository pin an agent that the\n * user has also defined globally.\n */\nexport function mergeAgentsForScope(\n scope: AgentScope,\n userAgents: AgentConfig[],\n projectAgents: AgentConfig[],\n pluginAgents: AgentConfig[] = [],\n): AgentConfig[] {\n const byName = new Map<string, AgentConfig>();\n for (const agent of pluginAgents) byName.set(agent.name, agent);\n if (scope !== 'project') {\n for (const agent of userAgents) byName.set(agent.name, agent);\n }\n if (scope !== 'user') {\n for (const agent of projectAgents) byName.set(agent.name, agent);\n }\n return [...byName.values()];\n}\n\n/** Size and mtime of one path, or a marker when it does not exist. */\nfunction stampOf(target: string): string {\n try {\n const stat = fs.statSync(target);\n return `${target}${FINGERPRINT_FIELD_SEPARATOR}${stat.mtimeMs}${FINGERPRINT_FIELD_SEPARATOR}${stat.size}`;\n } catch {\n // A missing settings file or agent directory is a normal state, and it has\n // to be distinguishable from a present one so that creating it invalidates.\n return `${target}${FINGERPRINT_FIELD_SEPARATOR}${MISSING_SOURCE_MARKER}`;\n }\n}\n\nexport interface ActiveTeamPackageConfig {\n config: TeamPackageConfig;\n path: string;\n}\n\n/** Resolve Team-owned package configuration from the current parent harness state. */\nexport function resolveActiveTeamPackageConfig(): ActiveTeamPackageConfig | undefined {\n const harness = getHarnessState();\n if (!harness.root || harness.layers.length === 0) return undefined;\n const layers = loadMajorModesConfig(harness.root);\n const entries = resolvePackageConfigurations(layers, harness.layers, DOOMPI_TEAM_PACKAGE);\n const config = mergeTeamPackageConfigurations(entries);\n return config ? { config, path: path.join(harness.root, MAJOR_MODES_CONFIG_RELATIVE_PATH) } : undefined;\n}\n\nfunction teamModelSpecs(config: TeamPackageConfig | undefined): string[] | undefined {\n if (!config?.models) return undefined;\n return config.models.map(({ model, thinking }) =>\n thinking ? `${model.replace(THINKING_SUFFIX, '')}:${thinking}` : model,\n );\n}\n\n/** Resolve Team's ordered package model policy without merging it into an agent definition. */\nexport function resolveActiveTeamModelSpecs(): string[] | undefined {\n return teamModelSpecs(resolveActiveTeamPackageConfig()?.config);\n}\n\n@injectable()\nexport class AgentDiscoveryService implements IAgentDiscoveryService {\n private readonly cache = new LruCache<string, CacheEntry>(MAX_CACHED_DISCOVERIES);\n\n /**\n * Seams for tests, as protected members rather than constructor arguments.\n *\n * The container resolves this service by type, and inversify cannot supply a\n * primitive like a TTL, so configuration cannot arrive through the\n * constructor. The repo convention is also not to abstract the clock, so a\n * test subclass overrides these instead.\n */\n protected readonly ttlMs: number = DISCOVERY_TTL_MS;\n\n protected now(): number {\n return Date.now();\n }\n\n discover(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n const resolvedCwd = path.resolve(cwd);\n const canonicalCwd = canonicalizeDiscoveryCwd(resolvedCwd);\n const key = `${scope}${FINGERPRINT_ENTRY_SEPARATOR}${canonicalCwd}`;\n const cached = this.cache.get(key);\n const timestamp = this.now();\n\n if (cached && cached.expiresAt > timestamp && cached.fingerprint === this.fingerprint(canonicalCwd)) {\n return cloneResult(cached.result);\n }\n\n const result = this.load(resolvedCwd, scope);\n this.cache.set(key, {\n result,\n expiresAt: timestamp + this.ttlMs,\n fingerprint: this.fingerprint(canonicalCwd),\n });\n return cloneResult(result);\n }\n\n find(cwd: string, scope: AgentScope, name: string): AgentConfig | undefined {\n return this.discover(cwd, scope).agents.find((agent) => agent.name === name);\n }\n\n invalidate(): void {\n this.cache.clear();\n }\n\n /**\n * A cheap stamp of everything discovery reads at the directory level.\n *\n * Deliberately independent of scope: a user-scoped and a project-scoped lookup\n * from the same directory read overlapping sources, and computing one stamp\n * keeps the stat count fixed regardless of how many scopes are queried.\n */\n private fingerprint(cwd: string): string {\n const harness = getHarnessState();\n const sources = [\n getUserAgentSettingsPath(),\n getProjectAgentSettingsPath(cwd) ?? MISSING_SOURCE_MARKER,\n ...userAgentDirs(),\n ...resolveNearestProjectAgentDirs(cwd).readDirs,\n ...pluginAgentDirs(),\n ];\n if (harness.root) sources.push(path.join(harness.root, MAJOR_MODES_CONFIG_RELATIVE_PATH));\n return [...sources.map(stampOf), `active-layers${FINGERPRINT_FIELD_SEPARATOR}${harness.layers.join(',')}`].join(\n FINGERPRINT_ENTRY_SEPARATOR,\n );\n }\n\n /**\n * The uncached read. Protected so a test can count how often it actually runs,\n * which is the only direct way to assert that the cache is doing its job.\n */\n protected load(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n const userSettingsPath = getUserAgentSettingsPath();\n const projectSettingsPath = getProjectAgentSettingsPath(cwd);\n const userSettings: SubagentSettings =\n scope === 'project' ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(userSettingsPath);\n const projectSettings: SubagentSettings =\n scope === 'user' ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(projectSettingsPath);\n\n const legacyDefaultModel = resolveSubagentDefaultModel(\n userSettings,\n projectSettings,\n userSettingsPath,\n projectSettingsPath,\n );\n const teamPackage = resolveActiveTeamPackageConfig();\n const packageModels = teamModelSpecs(teamPackage?.config);\n const packagePrimaryModel = packageModels?.[0];\n const defaultModel =\n packagePrimaryModel && teamPackage\n ? {\n type: 'packages.team.defaultModel' as const,\n scope: 'package' as const,\n path: teamPackage.path,\n model: packagePrimaryModel,\n }\n : legacyDefaultModel;\n const defaultThinking = resolveSubagentDefaultThinking(userSettings, projectSettings, projectSettingsPath);\n const defaultExtensions = resolveSubagentDefaultExtensions(userSettings, projectSettings, projectSettingsPath);\n\n const resolve = (agents: AgentConfig[]): AgentConfig[] =>\n applyCustomAgentOverrides(\n applySubagentDefaults(agents, defaultModel, defaultThinking, defaultExtensions),\n userSettings,\n projectSettings,\n userSettingsPath,\n projectSettingsPath,\n );\n\n const plugin = resolve(pluginAgentDirs().flatMap((directory) => loadAgentsFromDir(directory, 'plugin')));\n const user =\n scope === 'project' ? [] : resolve(userAgentDirs().flatMap((directory) => loadAgentsFromDir(directory, 'user')));\n const project =\n scope === 'user'\n ? []\n : resolve(\n resolveNearestProjectAgentDirs(cwd).readDirs.flatMap((directory) =>\n loadAgentsFromDir(directory, 'project'),\n ),\n );\n\n return {\n // A disabled agent is dropped last, so that an override which re-enables\n // one has already been applied by the time this runs.\n agents: mergeAgentsForScope(scope, user, project, plugin).filter((agent) => agent.disabled !== true),\n projectAgentsDir: resolveNearestProjectAgentDirs(cwd).preferredDir,\n modelScope: projectSettings.modelScope ?? userSettings.modelScope,\n };\n }\n}\n\n/**\n * Copy the parts a caller could mutate in place.\n *\n * The agent objects themselves are treated as immutable by every consumer, so\n * only the array is copied; deep-cloning every config on each keystroke would\n * cost more than the walk this cache replaced.\n */\nfunction cloneResult(result: AgentDiscoveryResult): AgentDiscoveryResult {\n return { ...result, agents: [...result.agents] };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{__esmMin as e}from"../../_virtual/_rolldown/runtime.mjs";import{__decorate as t,init_decorate as n}from"../../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";import{DOOMPI_TEAM_PACKAGE as r,init_packageConfig as i,mergeTeamPackageConfigurations as a}from"../../schemas/team/packageConfig.mjs";import{LruCache as o,init_lruCache as s}from"../../shared/lruCache.mjs";import{canonicalizeDiscoveryCwd as c,getProjectAgentSettingsPath as l,getUserAgentSettingsPath as u,init_projectRoot as d,resolveNearestProjectAgentDirs as f,userAgentDirs as p}from"./projectRoot.mjs";import{EMPTY_SUBAGENT_SETTINGS as m,applyCustomAgentOverrides as h,applySubagentDefaults as g,init_settings as _,readSubagentSettings as v,resolveSubagentDefaultExtensions as y,resolveSubagentDefaultModel as b,resolveSubagentDefaultThinking as x}from"./settings.mjs";import{init_loader as S,loadAgentsFromDir as C,pluginAgentDirs as w}from"./loader.mjs";import*as T from"node:fs";import*as E from"node:path";import{injectable as D}from"inversify";import{getHarnessState as O,loadMajorModesConfig as k,resolvePackageConfigurations as A}from"@agimon-ai/doompi-config";function j(e,t,n,r=[]){let i=new Map;for(let e of r)i.set(e.name,e);if(e!==`project`)for(let e of t)i.set(e.name,e);if(e!==`user`)for(let e of n)i.set(e.name,e);return[...i.values()]}function M(e){try{let t=T.statSync(e);return`${e}${z}${t.mtimeMs}${z}${t.size}`}catch{return`${e}${z}${V}`}}function N(){let e=O();if(!e.root||e.layers.length===0)return;let t=a(A(k(e.root),e.layers,r));return t?{config:t,path:E.join(e.root,H)}:void 0}function P(e){if(e?.models)return e.models.map(({model:e,thinking:t})=>t?`${e.replace(U,``)}:${t}`:e)}function F(){return P(N()?.config)}function I(e){return{...e,agents:[...e.agents]}}var L,R,z,B,V,H,U,W,G=e((()=>{i(),s(),S(),d(),_(),n(),L=5e3,R=64,z=`:`,B=`|`,V=`-`,H=E.join(`.doom`,`modes.yaml`),U=/:(?:off|minimal|low|medium|high|xhigh|max)$/,W=class{cache=new o(R);ttlMs=L;now(){return Date.now()}discover(e,t){let n=E.resolve(e),r=c(n),i=`${t}${B}${r}`,a=this.cache.get(i),o=this.now();if(a&&a.expiresAt>o&&a.fingerprint===this.fingerprint(r))return I(a.result);let s=this.load(n,t);return this.cache.set(i,{result:s,expiresAt:o+this.ttlMs,fingerprint:this.fingerprint(r)}),I(s)}find(e,t,n){return this.discover(e,t).agents.find(e=>e.name===n)}invalidate(){this.cache.clear()}fingerprint(e){let t=O(),n=[u(),l(e)??V,...p(),...f(e).readDirs,...w()];return t.root&&n.push(E.join(t.root,H)),[...n.map(M),`active-layers${z}${t.layers.join(`,`)}`].join(B)}load(e,t){let n=u(),r=l(e),i=t===`project`?m:v(n),a=t===`user`?m:v(r),o=b(i,a,n,r),s=N(),c=P(s?.config)?.[0],d=c&&s?{type:`packages.team.defaultModel`,scope:`package`,path:s.path,model:c}:o,_=x(i,a,r),S=y(i,a,r),T=e=>h(g(e,d,_,S),i,a,n,r),E=T(w().flatMap(e=>C(e,`plugin`)));return{agents:j(t,t===`project`?[]:T(p().flatMap(e=>C(e,`user`))),t===`user`?[]:T(f(e).readDirs.flatMap(e=>C(e,`project`))),E).filter(e=>e.disabled!==!0),projectAgentsDir:f(e).preferredDir,modelScope:a.modelScope??i.modelScope}}},W=t([D()],W)}));G();export{W as AgentDiscoveryService,G as init_discovery,F as resolveActiveTeamModelSpecs,N as resolveActiveTeamPackageConfig};
2
+ //# sourceMappingURL=discovery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.mjs","names":[],"sources":["../../../src/services/agents/discovery.ts"],"sourcesContent":["/**\n * Cached discovery of the agents visible from a working directory.\n *\n * WHY THIS IS A SERVICE AND NOT A FUNCTION:\n * Discovery reads two settings files and walks every agent directory in scope,\n * parsing the frontmatter of every file it finds. The slash-command completion\n * path asks for the agent list on each keystroke, and preflight asks again for\n * each launch, so the predecessor's plain function re-walked the tree many times\n * per second. Caching needs somewhere to live, and invalidation needs an owner.\n *\n * DESIGN PATTERNS:\n * - Two-layer validity. A short TTL bounds how stale an answer can be, and a\n * cheap source fingerprint catches the common edits sooner than the TTL would\n * - Bounded by an LRU keyed on cwd and scope, so a long session that visits many\n * directories cannot grow the cache without limit\n * - Mutations invalidate explicitly rather than relying on the TTL, so an agent\n * the user just created is visible immediately\n *\n * WHY THE FINGERPRINT IS NOT ENOUGH ON ITS OWN:\n * It stats the settings files and the agent directories, not every agent file.\n * A directory's mtime moves when a file is added or removed but not when an\n * existing file's contents change, so an in-place edit is caught by the TTL\n * rather than by the fingerprint. Stat'ing every agent file on every keystroke\n * would reintroduce the cost this cache exists to remove.\n *\n * AVOID:\n * - Handing out the cached array without copying it; a caller that sorts or\n * splices in place would corrupt every later reader\n * - Raising the TTL to hide a missing invalidate call\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getHarnessState, loadMajorModesConfig, resolvePackageConfigurations } from '@agimon-ai/doompi-config';\nimport { injectable } from 'inversify';\n\nimport {\n DOOMPI_TEAM_PACKAGE,\n mergeTeamPackageConfigurations,\n type TeamPackageConfig,\n} from '../../schemas/team/packageConfig.ts';\nimport { LruCache } from '../../shared/lruCache.ts';\nimport { loadAgentsFromDir, pluginAgentDirs } from './loader.ts';\nimport {\n canonicalizeDiscoveryCwd,\n getProjectAgentSettingsPath,\n getUserAgentSettingsPath,\n resolveNearestProjectAgentDirs,\n userAgentDirs,\n} from './projectRoot.ts';\nimport {\n applyCustomAgentOverrides,\n applySubagentDefaults,\n EMPTY_SUBAGENT_SETTINGS,\n readSubagentSettings,\n resolveSubagentDefaultExtensions,\n resolveSubagentDefaultModel,\n resolveSubagentDefaultThinking,\n} from './settings.ts';\nimport type {\n AgentConfig,\n AgentDiscoveryResult,\n AgentScope,\n IAgentDiscoveryService,\n SubagentSettings,\n} from './types.ts';\n\n/** How long a discovery result may be reused without revalidation. */\nconst DISCOVERY_TTL_MS = 5_000;\n\n/**\n * How many (cwd, scope) combinations stay cached.\n *\n * A session works in a handful of directories and there are three scopes, so\n * this is far above real usage; it exists to bound a pathological case.\n */\nconst MAX_CACHED_DISCOVERIES = 64;\n\nconst FINGERPRINT_FIELD_SEPARATOR = ':';\nconst FINGERPRINT_ENTRY_SEPARATOR = '|';\nconst MISSING_SOURCE_MARKER = '-';\nconst MAJOR_MODES_CONFIG_RELATIVE_PATH = path.join('.doom', 'modes.yaml');\nconst THINKING_SUFFIX = /:(?:off|minimal|low|medium|high|xhigh|max)$/;\n\ninterface CacheEntry {\n result: AgentDiscoveryResult;\n expiresAt: number;\n fingerprint: string;\n}\n\n/**\n * Merge the sources into one list, later sources shadowing earlier ones.\n *\n * Precedence is plugin, then user, then project: the definition closest to the\n * work being done wins, which is what lets a repository pin an agent that the\n * user has also defined globally.\n */\nexport function mergeAgentsForScope(\n scope: AgentScope,\n userAgents: AgentConfig[],\n projectAgents: AgentConfig[],\n pluginAgents: AgentConfig[] = [],\n): AgentConfig[] {\n const byName = new Map<string, AgentConfig>();\n for (const agent of pluginAgents) byName.set(agent.name, agent);\n if (scope !== 'project') {\n for (const agent of userAgents) byName.set(agent.name, agent);\n }\n if (scope !== 'user') {\n for (const agent of projectAgents) byName.set(agent.name, agent);\n }\n return [...byName.values()];\n}\n\n/** Size and mtime of one path, or a marker when it does not exist. */\nfunction stampOf(target: string): string {\n try {\n const stat = fs.statSync(target);\n return `${target}${FINGERPRINT_FIELD_SEPARATOR}${stat.mtimeMs}${FINGERPRINT_FIELD_SEPARATOR}${stat.size}`;\n } catch {\n // A missing settings file or agent directory is a normal state, and it has\n // to be distinguishable from a present one so that creating it invalidates.\n return `${target}${FINGERPRINT_FIELD_SEPARATOR}${MISSING_SOURCE_MARKER}`;\n }\n}\n\nexport interface ActiveTeamPackageConfig {\n config: TeamPackageConfig;\n path: string;\n}\n\n/** Resolve Team-owned package configuration from the current parent harness state. */\nexport function resolveActiveTeamPackageConfig(): ActiveTeamPackageConfig | undefined {\n const harness = getHarnessState();\n if (!harness.root || harness.layers.length === 0) return undefined;\n const layers = loadMajorModesConfig(harness.root);\n const entries = resolvePackageConfigurations(layers, harness.layers, DOOMPI_TEAM_PACKAGE);\n const config = mergeTeamPackageConfigurations(entries);\n return config ? { config, path: path.join(harness.root, MAJOR_MODES_CONFIG_RELATIVE_PATH) } : undefined;\n}\n\nfunction teamModelSpecs(config: TeamPackageConfig | undefined): string[] | undefined {\n if (!config?.models) return undefined;\n return config.models.map(({ model, thinking }) =>\n thinking ? `${model.replace(THINKING_SUFFIX, '')}:${thinking}` : model,\n );\n}\n\n/** Resolve Team's ordered package model policy without merging it into an agent definition. */\nexport function resolveActiveTeamModelSpecs(): string[] | undefined {\n return teamModelSpecs(resolveActiveTeamPackageConfig()?.config);\n}\n\n@injectable()\nexport class AgentDiscoveryService implements IAgentDiscoveryService {\n private readonly cache = new LruCache<string, CacheEntry>(MAX_CACHED_DISCOVERIES);\n\n /**\n * Seams for tests, as protected members rather than constructor arguments.\n *\n * The container resolves this service by type, and inversify cannot supply a\n * primitive like a TTL, so configuration cannot arrive through the\n * constructor. The repo convention is also not to abstract the clock, so a\n * test subclass overrides these instead.\n */\n protected readonly ttlMs: number = DISCOVERY_TTL_MS;\n\n protected now(): number {\n return Date.now();\n }\n\n discover(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n const resolvedCwd = path.resolve(cwd);\n const canonicalCwd = canonicalizeDiscoveryCwd(resolvedCwd);\n const key = `${scope}${FINGERPRINT_ENTRY_SEPARATOR}${canonicalCwd}`;\n const cached = this.cache.get(key);\n const timestamp = this.now();\n\n if (cached && cached.expiresAt > timestamp && cached.fingerprint === this.fingerprint(canonicalCwd)) {\n return cloneResult(cached.result);\n }\n\n const result = this.load(resolvedCwd, scope);\n this.cache.set(key, {\n result,\n expiresAt: timestamp + this.ttlMs,\n fingerprint: this.fingerprint(canonicalCwd),\n });\n return cloneResult(result);\n }\n\n find(cwd: string, scope: AgentScope, name: string): AgentConfig | undefined {\n return this.discover(cwd, scope).agents.find((agent) => agent.name === name);\n }\n\n invalidate(): void {\n this.cache.clear();\n }\n\n /**\n * A cheap stamp of everything discovery reads at the directory level.\n *\n * Deliberately independent of scope: a user-scoped and a project-scoped lookup\n * from the same directory read overlapping sources, and computing one stamp\n * keeps the stat count fixed regardless of how many scopes are queried.\n */\n private fingerprint(cwd: string): string {\n const harness = getHarnessState();\n const sources = [\n getUserAgentSettingsPath(),\n getProjectAgentSettingsPath(cwd) ?? MISSING_SOURCE_MARKER,\n ...userAgentDirs(),\n ...resolveNearestProjectAgentDirs(cwd).readDirs,\n ...pluginAgentDirs(),\n ];\n if (harness.root) sources.push(path.join(harness.root, MAJOR_MODES_CONFIG_RELATIVE_PATH));\n return [...sources.map(stampOf), `active-layers${FINGERPRINT_FIELD_SEPARATOR}${harness.layers.join(',')}`].join(\n FINGERPRINT_ENTRY_SEPARATOR,\n );\n }\n\n /**\n * The uncached read. Protected so a test can count how often it actually runs,\n * which is the only direct way to assert that the cache is doing its job.\n */\n protected load(cwd: string, scope: AgentScope): AgentDiscoveryResult {\n const userSettingsPath = getUserAgentSettingsPath();\n const projectSettingsPath = getProjectAgentSettingsPath(cwd);\n const userSettings: SubagentSettings =\n scope === 'project' ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(userSettingsPath);\n const projectSettings: SubagentSettings =\n scope === 'user' ? EMPTY_SUBAGENT_SETTINGS : readSubagentSettings(projectSettingsPath);\n\n const legacyDefaultModel = resolveSubagentDefaultModel(\n userSettings,\n projectSettings,\n userSettingsPath,\n projectSettingsPath,\n );\n const teamPackage = resolveActiveTeamPackageConfig();\n const packageModels = teamModelSpecs(teamPackage?.config);\n const packagePrimaryModel = packageModels?.[0];\n const defaultModel =\n packagePrimaryModel && teamPackage\n ? {\n type: 'packages.team.defaultModel' as const,\n scope: 'package' as const,\n path: teamPackage.path,\n model: packagePrimaryModel,\n }\n : legacyDefaultModel;\n const defaultThinking = resolveSubagentDefaultThinking(userSettings, projectSettings, projectSettingsPath);\n const defaultExtensions = resolveSubagentDefaultExtensions(userSettings, projectSettings, projectSettingsPath);\n\n const resolve = (agents: AgentConfig[]): AgentConfig[] =>\n applyCustomAgentOverrides(\n applySubagentDefaults(agents, defaultModel, defaultThinking, defaultExtensions),\n userSettings,\n projectSettings,\n userSettingsPath,\n projectSettingsPath,\n );\n\n const plugin = resolve(pluginAgentDirs().flatMap((directory) => loadAgentsFromDir(directory, 'plugin')));\n const user =\n scope === 'project' ? [] : resolve(userAgentDirs().flatMap((directory) => loadAgentsFromDir(directory, 'user')));\n const project =\n scope === 'user'\n ? []\n : resolve(\n resolveNearestProjectAgentDirs(cwd).readDirs.flatMap((directory) =>\n loadAgentsFromDir(directory, 'project'),\n ),\n );\n\n return {\n // A disabled agent is dropped last, so that an override which re-enables\n // one has already been applied by the time this runs.\n agents: mergeAgentsForScope(scope, user, project, plugin).filter((agent) => agent.disabled !== true),\n projectAgentsDir: resolveNearestProjectAgentDirs(cwd).preferredDir,\n modelScope: projectSettings.modelScope ?? userSettings.modelScope,\n };\n }\n}\n\n/**\n * Copy the parts a caller could mutate in place.\n *\n * The agent objects themselves are treated as immutable by every consumer, so\n * only the array is copied; deep-cloning every config on each keystroke would\n * cost more than the walk this cache replaced.\n */\nfunction cloneResult(result: AgentDiscoveryResult): AgentDiscoveryResult {\n return { ...result, agents: [...result.agents] };\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.cjs","names":[],"sources":["../../../src/services/agents/frontmatter.ts"],"sourcesContent":["/**\n * Parsing the YAML frontmatter block at the head of an agent or chain file.\n *\n * This is a deliberately partial YAML reader, not a call into a YAML library.\n * The block is read once, keys are kept as raw strings, and each consumer\n * interprets its own key. That is what lets an unrecognised key survive a\n * read/write round-trip: the loader copies it into `extraFields` verbatim\n * instead of losing it to a typed parse.\n *\n * DESIGN PATTERNS:\n * - Nested and folded blocks are captured as one string with newlines intact.\n * A consumer that wants structure re-parses that string with a real YAML\n * parser, so structural validation stays with the field that needs it\n * - Common leading whitespace is stripped from a block, so a serializer can\n * re-indent to its own level without the original indent accumulating\n *\n * AVOID:\n * - Growing this into a general YAML parser; hand a block value to `yaml`\n * instead\n * - Interpreting field semantics here\n */\n\nconst OPENING_FENCE = '---';\n/** Length of the opening `---` fence, before the newline that follows it. */\nconst FENCE_LENGTH = OPENING_FENCE.length;\n/** Length of the fence plus its trailing newline, used to slice past it. */\nconst FENCE_WITH_NEWLINE_LENGTH = FENCE_LENGTH + 1;\n/** Offset of the first frontmatter character: past `---\\n`. */\nconst FRONTMATTER_START_INDEX = FENCE_WITH_NEWLINE_LENGTH;\n/** The closing fence as it appears mid-document, searched from after the opener. */\nconst CLOSING_FENCE = '\\n---';\n\nconst FOLDED_BLOCK_INDICATORS = new Set(['>', '>-']);\n\n/** Escape regex metacharacters so a literal string can be used in a RegExp. */\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Fold a YAML folded block scalar.\n *\n * Folding joins lines with a space, except that more-indented lines and blank\n * separators are structural in YAML and must survive as real newlines. Getting\n * this wrong silently reflows a user's prompt, so the two cases are tracked\n * explicitly rather than approximated by a global replace.\n */\nfunction foldBlock(block: string): string {\n let folded = '';\n let hasContent = false;\n let previousIsMoreIndented = false;\n let blankLines = 0;\n\n for (const line of block.split('\\n')) {\n const current = line.trimEnd();\n if (current.trim() === '') {\n if (hasContent) blankLines++;\n continue;\n }\n\n const currentIsMoreIndented = current.length > current.trimStart().length;\n if (hasContent) {\n if (blankLines > 0) {\n folded += '\\n'.repeat(blankLines + (previousIsMoreIndented || currentIsMoreIndented ? 1 : 0));\n } else {\n folded += previousIsMoreIndented || currentIsMoreIndented ? '\\n' : ' ';\n }\n }\n folded += current;\n hasContent = true;\n previousIsMoreIndented = currentIsMoreIndented;\n blankLines = 0;\n }\n\n return folded.trim();\n}\n\n/**\n * Read a list-valued field written either comma-separated or as a block list.\n *\n * Only a leading `- ` marker is treated as a list bullet. A bare hyphen inside\n * a value is left alone, so hyphenated names like `context-builder` survive.\n */\nexport function parseFrontmatterList(raw: string | undefined): string[] | undefined {\n if (raw === undefined) return undefined;\n return raw\n .split('\\n')\n .flatMap((line) => {\n const value = line.trim();\n const listItem = value.match(/^-\\s+(.+)$/);\n return (listItem?.[1] ?? value).split(',');\n })\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\n/** A frontmatter block reduced to raw string values, plus the body after it. */\nexport interface ParsedFrontmatter {\n frontmatter: Record<string, string>;\n body: string;\n}\n\n/** Strip the block's common leading whitespace so it can be re-indented later. */\nfunction dedentBlock(blockLines: string[]): string {\n const rawBlock = blockLines.join('\\n');\n const leadingSpaces = rawBlock.match(/^[ \\t]+(?=\\S)/m);\n const prefix = leadingSpaces?.[0] ?? '';\n if (!prefix) return rawBlock;\n return rawBlock.replace(new RegExp(`^${escapeRegex(prefix)}`, 'gm'), '').replace(/^\\n/, '');\n}\n\n/**\n * Split a file into its frontmatter map and its body.\n *\n * A file with no opening fence, or with an unterminated one, is treated as all\n * body with empty frontmatter. The loader then rejects it for want of a name,\n * which is the right outcome: a malformed file should be skipped, not crash a\n * directory sweep.\n */\nexport function parseFrontmatter(content: string): ParsedFrontmatter {\n const frontmatter: Record<string, string> = {};\n const normalized = content.replace(/\\r\\n/g, '\\n');\n\n if (!normalized.startsWith(OPENING_FENCE)) {\n return { frontmatter, body: normalized };\n }\n\n const endIndex = normalized.indexOf(CLOSING_FENCE, FENCE_LENGTH);\n if (endIndex === -1) {\n return { frontmatter, body: normalized };\n }\n\n const frontmatterBlock = normalized.slice(FRONTMATTER_START_INDEX, endIndex);\n const body = normalized.slice(endIndex + FENCE_WITH_NEWLINE_LENGTH).trim();\n\n let currentKey: string | null = null;\n let currentBlockLines: string[] | null = null;\n let currentIndent: number | null = null;\n let currentFolded = false;\n\n const flushBlock = (): void => {\n if (currentKey === null || currentBlockLines === null) return;\n const stripped = dedentBlock(currentBlockLines);\n frontmatter[currentKey] = currentFolded ? foldBlock(stripped) : stripped;\n currentKey = null;\n currentBlockLines = null;\n currentIndent = null;\n currentFolded = false;\n };\n\n for (const line of frontmatterBlock.split('\\n')) {\n const indent = line.search(/\\S|$/);\n const trimmed = line.trim();\n\n // A line indented past its key belongs to that key's block. A folded block\n // also absorbs blank lines, because they are its paragraph separators.\n if (\n currentKey !== null &&\n currentBlockLines !== null &&\n (indent > (currentIndent ?? 0) || (currentFolded && trimmed === ''))\n ) {\n currentBlockLines.push(line);\n continue;\n }\n\n flushBlock();\n\n const match = line.match(/^([\\w-]+):\\s*(.*)$/);\n if (!match) continue; // Comments and blank lines carry no field.\n\n const key = match[1] ?? '';\n const rawValue = (match[2] ?? '').trim();\n const isQuoted =\n (rawValue.startsWith('\"') && rawValue.endsWith('\"')) || (rawValue.startsWith(\"'\") && rawValue.endsWith(\"'\"));\n const value = isQuoted ? rawValue.slice(1, -1) : rawValue;\n const isFolded = !isQuoted && FOLDED_BLOCK_INDICATORS.has(rawValue);\n\n if (value === '' || isFolded) {\n // The value has not arrived yet; it is whatever indents under this key.\n currentKey = key;\n currentBlockLines = [];\n currentIndent = indent;\n currentFolded = isFolded;\n } else {\n frontmatter[key] = value;\n }\n }\n\n flushBlock();\n\n return { frontmatter, body };\n}\n"],"mappings":"AAsBA,MAUM,EAA0B,IAAI,IAAI,CAAC,IAAK,KAAK,CAAC,CAGpD,SAAS,EAAY,EAAuB,CAC1C,OAAO,EAAM,QAAQ,sBAAuB,OAAO,CAWrD,SAAS,EAAU,EAAuB,CACxC,IAAI,EAAS,GACT,EAAa,GACb,EAAyB,GACzB,EAAa,EAEjB,IAAK,IAAM,KAAQ,EAAM,MAAM;EAAK,CAAE,CACpC,IAAM,EAAU,EAAK,SAAS,CAC9B,GAAI,EAAQ,MAAM,GAAK,GAAI,CACrB,GAAY,IAChB,SAGF,IAAM,EAAwB,EAAQ,OAAS,EAAQ,WAAW,CAAC,OAC/D,IACE,EAAa,EACf,GAAU;EAAK,OAAO,GAAc,GAA0B,EAAwB,EAAI,GAAG,CAE7F,GAAU,GAA0B,EAAwB;EAAO,KAGvE,GAAU,EACV,EAAa,GACb,EAAyB,EACzB,EAAa,EAGf,OAAO,EAAO,MAAM,CAStB,SAAgB,EAAqB,EAA+C,CAC9E,OAAQ,IAAA,GACZ,OAAO,EACJ,MAAM;EAAK,CACX,QAAS,GAAS,CACjB,IAAM,EAAQ,EAAK,MAAM,CAEzB,OADiB,EAAM,MAAM,aACb,GAAG,IAAM,GAAO,MAAM,IAAI,EAC1C,CACD,IAAK,GAAU,EAAM,MAAM,CAAC,CAC5B,OAAO,QAAQ,CAUpB,SAAS,EAAY,EAA8B,CACjD,IAAM,EAAW,EAAW,KAAK;EAAK,CAEhC,EADgB,EAAS,MAAM,iBACT,GAAG,IAAM,GAErC,OADK,EACE,EAAS,QAAY,OAAO,IAAI,EAAY,EAAO,GAAI,KAAK,CAAE,GAAG,CAAC,QAAQ,MAAO,GAAG,CADvE,EAYtB,SAAgB,EAAiB,EAAoC,CACnE,IAAM,EAAsC,EAAE,CACxC,EAAa,EAAQ,QAAQ,QAAS;EAAK,CAEjD,GAAI,CAAC,EAAW,WAAW,MAAc,CACvC,MAAO,CAAE,cAAa,KAAM,EAAY,CAG1C,IAAM,EAAW,EAAW,QAAQ;KAAe,EAAa,CAChE,GAAI,IAAa,GACf,MAAO,CAAE,cAAa,KAAM,EAAY,CAG1C,IAAM,EAAmB,EAAW,MAAM,EAAyB,EAAS,CACtE,EAAO,EAAW,MAAM,EAAW,EAA0B,CAAC,MAAM,CAEtE,EAA4B,KAC5B,EAAqC,KACrC,EAA+B,KAC/B,EAAgB,GAEd,MAAyB,CAC7B,GAAI,IAAe,MAAQ,IAAsB,KAAM,OACvD,IAAM,EAAW,EAAY,EAAkB,CAC/C,EAAY,GAAc,EAAgB,EAAU,EAAS,CAAG,EAChE,EAAa,KACb,EAAoB,KACpB,EAAgB,KAChB,EAAgB,IAGlB,IAAK,IAAM,KAAQ,EAAiB,MAAM;EAAK,CAAE,CAC/C,IAAM,EAAS,EAAK,OAAO,OAAO,CAC5B,EAAU,EAAK,MAAM,CAI3B,GACE,IAAe,MACf,IAAsB,OACrB,GAAU,GAAiB,IAAO,GAAiB,IAAY,IAChE,CACA,EAAkB,KAAK,EAAK,CAC5B,SAGF,GAAY,CAEZ,IAAM,EAAQ,EAAK,MAAM,qBAAqB,CAC9C,GAAI,CAAC,EAAO,SAEZ,IAAM,EAAM,EAAM,IAAM,GAClB,GAAY,EAAM,IAAM,IAAI,MAAM,CAClC,EACH,EAAS,WAAW,IAAI,EAAI,EAAS,SAAS,IAAI,EAAM,EAAS,WAAW,IAAI,EAAI,EAAS,SAAS,IAAI,CACvG,EAAQ,EAAW,EAAS,MAAM,EAAG,GAAG,CAAG,EAC3C,EAAW,CAAC,GAAY,EAAwB,IAAI,EAAS,CAE/D,IAAU,IAAM,GAElB,EAAa,EACb,EAAoB,EAAE,CACtB,EAAgB,EAChB,EAAgB,GAEhB,EAAY,GAAO,EAMvB,OAFA,GAAY,CAEL,CAAE,cAAa,OAAM"}
@@ -1,4 +1,4 @@
1
- import{__esmMin as e}from"../_virtual/_rolldown/runtime.mjs";function t(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function n(e){let t=``,n=!1,r=!1,i=0;for(let a of e.split(`
1
+ import{__esmMin as e}from"../../_virtual/_rolldown/runtime.mjs";function t(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function n(e){let t=``,n=!1,r=!1,i=0;for(let a of e.split(`
2
2
  `)){let e=a.trimEnd();if(e.trim()===``){n&&i++;continue}let o=e.length>e.trimStart().length;n&&(i>0?t+=`
3
3
  `.repeat(i+(r||o?1:0)):t+=r||o?`
4
4
  `:` `),t+=e,n=!0,r=o,i=0}return t.trim()}function r(e){if(e!==void 0)return e.split(`
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.mjs","names":[],"sources":["../../../src/services/agents/frontmatter.ts"],"sourcesContent":["/**\n * Parsing the YAML frontmatter block at the head of an agent or chain file.\n *\n * This is a deliberately partial YAML reader, not a call into a YAML library.\n * The block is read once, keys are kept as raw strings, and each consumer\n * interprets its own key. That is what lets an unrecognised key survive a\n * read/write round-trip: the loader copies it into `extraFields` verbatim\n * instead of losing it to a typed parse.\n *\n * DESIGN PATTERNS:\n * - Nested and folded blocks are captured as one string with newlines intact.\n * A consumer that wants structure re-parses that string with a real YAML\n * parser, so structural validation stays with the field that needs it\n * - Common leading whitespace is stripped from a block, so a serializer can\n * re-indent to its own level without the original indent accumulating\n *\n * AVOID:\n * - Growing this into a general YAML parser; hand a block value to `yaml`\n * instead\n * - Interpreting field semantics here\n */\n\nconst OPENING_FENCE = '---';\n/** Length of the opening `---` fence, before the newline that follows it. */\nconst FENCE_LENGTH = OPENING_FENCE.length;\n/** Length of the fence plus its trailing newline, used to slice past it. */\nconst FENCE_WITH_NEWLINE_LENGTH = FENCE_LENGTH + 1;\n/** Offset of the first frontmatter character: past `---\\n`. */\nconst FRONTMATTER_START_INDEX = FENCE_WITH_NEWLINE_LENGTH;\n/** The closing fence as it appears mid-document, searched from after the opener. */\nconst CLOSING_FENCE = '\\n---';\n\nconst FOLDED_BLOCK_INDICATORS = new Set(['>', '>-']);\n\n/** Escape regex metacharacters so a literal string can be used in a RegExp. */\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Fold a YAML folded block scalar.\n *\n * Folding joins lines with a space, except that more-indented lines and blank\n * separators are structural in YAML and must survive as real newlines. Getting\n * this wrong silently reflows a user's prompt, so the two cases are tracked\n * explicitly rather than approximated by a global replace.\n */\nfunction foldBlock(block: string): string {\n let folded = '';\n let hasContent = false;\n let previousIsMoreIndented = false;\n let blankLines = 0;\n\n for (const line of block.split('\\n')) {\n const current = line.trimEnd();\n if (current.trim() === '') {\n if (hasContent) blankLines++;\n continue;\n }\n\n const currentIsMoreIndented = current.length > current.trimStart().length;\n if (hasContent) {\n if (blankLines > 0) {\n folded += '\\n'.repeat(blankLines + (previousIsMoreIndented || currentIsMoreIndented ? 1 : 0));\n } else {\n folded += previousIsMoreIndented || currentIsMoreIndented ? '\\n' : ' ';\n }\n }\n folded += current;\n hasContent = true;\n previousIsMoreIndented = currentIsMoreIndented;\n blankLines = 0;\n }\n\n return folded.trim();\n}\n\n/**\n * Read a list-valued field written either comma-separated or as a block list.\n *\n * Only a leading `- ` marker is treated as a list bullet. A bare hyphen inside\n * a value is left alone, so hyphenated names like `context-builder` survive.\n */\nexport function parseFrontmatterList(raw: string | undefined): string[] | undefined {\n if (raw === undefined) return undefined;\n return raw\n .split('\\n')\n .flatMap((line) => {\n const value = line.trim();\n const listItem = value.match(/^-\\s+(.+)$/);\n return (listItem?.[1] ?? value).split(',');\n })\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\n/** A frontmatter block reduced to raw string values, plus the body after it. */\nexport interface ParsedFrontmatter {\n frontmatter: Record<string, string>;\n body: string;\n}\n\n/** Strip the block's common leading whitespace so it can be re-indented later. */\nfunction dedentBlock(blockLines: string[]): string {\n const rawBlock = blockLines.join('\\n');\n const leadingSpaces = rawBlock.match(/^[ \\t]+(?=\\S)/m);\n const prefix = leadingSpaces?.[0] ?? '';\n if (!prefix) return rawBlock;\n return rawBlock.replace(new RegExp(`^${escapeRegex(prefix)}`, 'gm'), '').replace(/^\\n/, '');\n}\n\n/**\n * Split a file into its frontmatter map and its body.\n *\n * A file with no opening fence, or with an unterminated one, is treated as all\n * body with empty frontmatter. The loader then rejects it for want of a name,\n * which is the right outcome: a malformed file should be skipped, not crash a\n * directory sweep.\n */\nexport function parseFrontmatter(content: string): ParsedFrontmatter {\n const frontmatter: Record<string, string> = {};\n const normalized = content.replace(/\\r\\n/g, '\\n');\n\n if (!normalized.startsWith(OPENING_FENCE)) {\n return { frontmatter, body: normalized };\n }\n\n const endIndex = normalized.indexOf(CLOSING_FENCE, FENCE_LENGTH);\n if (endIndex === -1) {\n return { frontmatter, body: normalized };\n }\n\n const frontmatterBlock = normalized.slice(FRONTMATTER_START_INDEX, endIndex);\n const body = normalized.slice(endIndex + FENCE_WITH_NEWLINE_LENGTH).trim();\n\n let currentKey: string | null = null;\n let currentBlockLines: string[] | null = null;\n let currentIndent: number | null = null;\n let currentFolded = false;\n\n const flushBlock = (): void => {\n if (currentKey === null || currentBlockLines === null) return;\n const stripped = dedentBlock(currentBlockLines);\n frontmatter[currentKey] = currentFolded ? foldBlock(stripped) : stripped;\n currentKey = null;\n currentBlockLines = null;\n currentIndent = null;\n currentFolded = false;\n };\n\n for (const line of frontmatterBlock.split('\\n')) {\n const indent = line.search(/\\S|$/);\n const trimmed = line.trim();\n\n // A line indented past its key belongs to that key's block. A folded block\n // also absorbs blank lines, because they are its paragraph separators.\n if (\n currentKey !== null &&\n currentBlockLines !== null &&\n (indent > (currentIndent ?? 0) || (currentFolded && trimmed === ''))\n ) {\n currentBlockLines.push(line);\n continue;\n }\n\n flushBlock();\n\n const match = line.match(/^([\\w-]+):\\s*(.*)$/);\n if (!match) continue; // Comments and blank lines carry no field.\n\n const key = match[1] ?? '';\n const rawValue = (match[2] ?? '').trim();\n const isQuoted =\n (rawValue.startsWith('\"') && rawValue.endsWith('\"')) || (rawValue.startsWith(\"'\") && rawValue.endsWith(\"'\"));\n const value = isQuoted ? rawValue.slice(1, -1) : rawValue;\n const isFolded = !isQuoted && FOLDED_BLOCK_INDICATORS.has(rawValue);\n\n if (value === '' || isFolded) {\n // The value has not arrived yet; it is whatever indents under this key.\n currentKey = key;\n currentBlockLines = [];\n currentIndent = indent;\n currentFolded = isFolded;\n } else {\n frontmatter[key] = value;\n }\n }\n\n flushBlock();\n\n return { frontmatter, body };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../../shared/configDir.cjs`),n=require(`./frontmatter.cjs`),r=require(`./memory.cjs`),i=require(`./settings.cjs`);let a=require(`node:fs`);a=e.__toESM(a,1);let o=require(`node:path`);o=e.__toESM(o,1);const s=`delegate`;function c(e){return e===s?`append`:`replace`}function l(e){return e===s}function u(){return!1}const d=new Set([`name`,`package`,`description`,`tools`,`model`,`fallbackModels`,`thinking`,`systemPromptMode`,`inheritProjectContext`,`inheritSkills`,`defaultContext`,`timeoutMs`,`skill`,`skills`,`skillPath`,`extensions`,`subagentOnlyExtensions`,`output`,`defaultReads`,`defaultProgress`,`interactive`,`maxSubagentDepth`,`completionGuard`,`toolBudget`,`memory`]),f=`true`,p=`false`;function m(e){if(e===f)return!0;if(e===p)return!1}const h=/^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/;function g(e){let t=e?.trim();if(t)return t.toLowerCase().replace(/\s+/g,`-`).replace(/[^a-z0-9.-]/g,``).replace(/-+/g,`-`).replace(/\.+/g,`.`).replace(/(?:^[-.]+|[-.]+$)/g,``)}function _(e,t=`package`){if(e===void 0||e===!1||e===``)return{packageName:void 0};if(typeof e!=`string`)return{error:`${t} must be a string or false when provided.`};let n=g(e);return!n||!h.test(n)?{error:`${t} is invalid after sanitization.`}:{packageName:n}}function v(e,t){let n=t?.trim();return n?`${n}.${e}`:e}function y(e){let t=[],n=[];for(let r of e??[])r.startsWith(`mcp:`)?t.push(r.slice(4)):n.push(r);return{...e===void 0?{}:{tools:n},...t.length>0?{mcpDirectTools:t}:{}}}const b=new Set([`.git`,`node_modules`]),x=`.agents`;function S(e){try{return a.statSync(e).isDirectory()}catch{return!1}}function C(e){return S(t.getProjectConfigDir(e))||S(o.join(e,x))}function w(e,t,n){return b.has(n)||a.existsSync(o.join(t,`.git`))?!0:o.resolve(t)!==o.resolve(e)&&C(t)}function T(e,t,n=e){let r=[];if(!a.existsSync(e))return r;let i;try{i=a.readdirSync(e,{withFileTypes:!0}).sort((e,t)=>e.name.localeCompare(t.name))}catch{return r}for(let a of i){let i=o.join(e,a.name);if(a.isDirectory()){w(n,i,a.name)||r.push(...T(i,t,n));continue}!a.isFile()&&!a.isSymbolicLink()||t(a.name)&&r.push(i)}return r}function E(e,t){let n=o.relative(e,t).split(o.sep).map(e=>e.toLowerCase());return o.basename(e).toLowerCase()===x&&n.unshift(x),n.some((e,t)=>e===x&&n[t+1]===`skills`)}function D(e,t){return e===`replace`||e===`append`?e:c(t)}function O(e){return e===`fork`||e===`fresh`?e:void 0}function k(e,t){if(e===void 0)return;let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(`Agent '${t}' has invalid timeoutMs frontmatter; expected a positive integer.`);return n}function A(e,t){if(e===void 0||!e.trim())return;let n=JSON.parse(e);if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`Agent '${t}' has invalid toolBudget frontmatter; expected a JSON object.`);return n}function j(e){return e.endsWith(`.md`)&&!e.endsWith(`.chain.md`)}function M(e,t){let o=[];for(let s of T(e,j)){if(E(e,s))continue;let c;try{c=a.readFileSync(s,`utf-8`)}catch{continue}let{frontmatter:h,body:g}=n.parseFrontmatter(c);if(!h.name||!h.description)continue;let b=h.name,x=_(h.package,`Agent '${b}' package`);if(x.error)continue;let S=n.parseFrontmatterList(h.tools),{tools:C,mcpDirectTools:w}=y(S),T=n.parseFrontmatterList(h.skill||h.skills),j=n.parseFrontmatterList(h.skillPath),M=n.parseFrontmatterList(h.fallbackModels),N=n.parseFrontmatterList(h.defaultReads),P=Number(h.maxSubagentDepth),F={};for(let[e,t]of Object.entries(h))d.has(e)||(F[e]=t);let I={name:v(b,x.packageName),localName:b,packageName:x.packageName,description:h.description,tools:S===void 0?void 0:C??[],mcpDirectTools:w&&w.length>0?w:void 0,model:h.model,fallbackModels:M&&M.length>0?M:void 0,thinking:h.thinking===p?!1:h.thinking,systemPromptMode:D(h.systemPromptMode,b),inheritProjectContext:m(h.inheritProjectContext)??l(b),inheritSkills:m(h.inheritSkills)??u(),defaultContext:O(h.defaultContext),defaultTimeoutMs:k(h.timeoutMs,b),systemPrompt:g,source:t,filePath:s,skills:T&&T.length>0?T:void 0,skillPath:j&&j.length>0?j:void 0,extensions:n.parseFrontmatterList(h.extensions),subagentOnlyExtensions:n.parseFrontmatterList(h.subagentOnlyExtensions),output:h.output,defaultReads:N&&N.length>0?N:void 0,defaultProgress:h.defaultProgress===f,interactive:h.interactive===f,maxSubagentDepth:Number.isInteger(P)&&P>=0?P:void 0,completionGuard:m(h.completionGuard),toolBudget:A(h.toolBudget,b),memory:r.parseMemoryFrontmatter(h.memory),extraFields:Object.keys(F).length>0?F:void 0};i.setAgentFrontmatterFields(I,new Set(Object.keys(h))),o.push(I)}return o}function N(){return(process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS??``).split(o.delimiter).map(e=>e.trim()).filter(e=>e.length>0)}exports.loadAgentsFromDir=M,exports.pluginAgentDirs=N;
2
+ //# sourceMappingURL=loader.cjs.map