@agimon-ai/doompi-team 0.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (520) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +46 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs +1 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs +1 -0
  5. package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.cjs +1 -0
  6. package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.mjs +1 -0
  7. package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateParam.cjs +1 -0
  8. package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateParam.mjs +1 -0
  9. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  10. package/dist/_virtual/_rolldown/runtime.mjs +1 -0
  11. package/dist/agents/discovery.cjs +2 -0
  12. package/dist/agents/discovery.cjs.map +1 -0
  13. package/dist/agents/discovery.mjs +2 -0
  14. package/dist/agents/discovery.mjs.map +1 -0
  15. package/dist/agents/frontmatter.cjs +10 -0
  16. package/dist/agents/frontmatter.cjs.map +1 -0
  17. package/dist/agents/frontmatter.mjs +10 -0
  18. package/dist/agents/frontmatter.mjs.map +1 -0
  19. package/dist/agents/loader.cjs +2 -0
  20. package/dist/agents/loader.cjs.map +1 -0
  21. package/dist/agents/loader.mjs +2 -0
  22. package/dist/agents/loader.mjs.map +1 -0
  23. package/dist/agents/memory.cjs +3 -0
  24. package/dist/agents/memory.cjs.map +1 -0
  25. package/dist/agents/memory.mjs +3 -0
  26. package/dist/agents/memory.mjs.map +1 -0
  27. package/dist/agents/projectRoot.cjs +2 -0
  28. package/dist/agents/projectRoot.cjs.map +1 -0
  29. package/dist/agents/projectRoot.mjs +2 -0
  30. package/dist/agents/projectRoot.mjs.map +1 -0
  31. package/dist/agents/settings.cjs +2 -0
  32. package/dist/agents/settings.cjs.map +1 -0
  33. package/dist/agents/settings.mjs +2 -0
  34. package/dist/agents/settings.mjs.map +1 -0
  35. package/dist/agents/skills.cjs +0 -0
  36. package/dist/agents/skills.cjs.map +1 -0
  37. package/dist/agents/skills.mjs +5 -0
  38. package/dist/agents/skills.mjs.map +1 -0
  39. package/dist/agents/types.d.cts +121 -0
  40. package/dist/agents/types.d.cts.map +1 -0
  41. package/dist/agents/types.d.mts +121 -0
  42. package/dist/agents/types.d.mts.map +1 -0
  43. package/dist/api/backgroundWork.cjs +1 -0
  44. package/dist/api/backgroundWork.d.cts +2 -0
  45. package/dist/api/backgroundWork.d.mts +2 -0
  46. package/dist/api/backgroundWork.mjs +1 -0
  47. package/dist/api/capabilityCeiling.cjs +1 -0
  48. package/dist/api/capabilityCeiling.d.cts +3 -0
  49. package/dist/api/capabilityCeiling.d.mts +3 -0
  50. package/dist/api/capabilityCeiling.mjs +2 -0
  51. package/dist/api/capabilityCeiling.mjs.map +1 -0
  52. package/dist/api/delegation.cjs +1 -0
  53. package/dist/api/delegation.d.cts +2 -0
  54. package/dist/api/delegation.d.mts +2 -0
  55. package/dist/api/delegation.mjs +1 -0
  56. package/dist/api/teamSnapshot.cjs +1 -0
  57. package/dist/api/teamSnapshot.d.cts +2 -0
  58. package/dist/api/teamSnapshot.d.mts +2 -0
  59. package/dist/api/teamSnapshot.mjs +2 -0
  60. package/dist/api/teamSnapshot.mjs.map +1 -0
  61. package/dist/container/bindOrRebind.cjs +2 -0
  62. package/dist/container/bindOrRebind.cjs.map +1 -0
  63. package/dist/container/bindOrRebind.mjs +2 -0
  64. package/dist/container/bindOrRebind.mjs.map +1 -0
  65. package/dist/container/globalBridge.cjs +2 -0
  66. package/dist/container/globalBridge.cjs.map +1 -0
  67. package/dist/container/globalBridge.d.cts +19 -0
  68. package/dist/container/globalBridge.d.cts.map +1 -0
  69. package/dist/container/globalBridge.d.mts +19 -0
  70. package/dist/container/globalBridge.d.mts.map +1 -0
  71. package/dist/container/globalBridge.mjs +2 -0
  72. package/dist/container/globalBridge.mjs.map +1 -0
  73. package/dist/container/index.cjs +2 -0
  74. package/dist/container/index.cjs.map +1 -0
  75. package/dist/container/index.d.cts +38 -0
  76. package/dist/container/index.d.cts.map +1 -0
  77. package/dist/container/index.d.mts +38 -0
  78. package/dist/container/index.d.mts.map +1 -0
  79. package/dist/container/index.mjs +2 -0
  80. package/dist/container/index.mjs.map +1 -0
  81. package/dist/container/modules/agents.cjs +2 -0
  82. package/dist/container/modules/agents.cjs.map +1 -0
  83. package/dist/container/modules/agents.d.cts +1 -0
  84. package/dist/container/modules/agents.d.mts +1 -0
  85. package/dist/container/modules/agents.mjs +2 -0
  86. package/dist/container/modules/agents.mjs.map +1 -0
  87. package/dist/container/modules/core.cjs +2 -0
  88. package/dist/container/modules/core.cjs.map +1 -0
  89. package/dist/container/modules/core.d.cts +1 -0
  90. package/dist/container/modules/core.d.mts +1 -0
  91. package/dist/container/modules/core.mjs +2 -0
  92. package/dist/container/modules/core.mjs.map +1 -0
  93. package/dist/container/modules/extensions.cjs +2 -0
  94. package/dist/container/modules/extensions.cjs.map +1 -0
  95. package/dist/container/modules/extensions.mjs +2 -0
  96. package/dist/container/modules/extensions.mjs.map +1 -0
  97. package/dist/container/modules/intercom.cjs +2 -0
  98. package/dist/container/modules/intercom.cjs.map +1 -0
  99. package/dist/container/modules/intercom.mjs +2 -0
  100. package/dist/container/modules/intercom.mjs.map +1 -0
  101. package/dist/container/modules/runs.cjs +2 -0
  102. package/dist/container/modules/runs.cjs.map +1 -0
  103. package/dist/container/modules/runs.mjs +2 -0
  104. package/dist/container/modules/runs.mjs.map +1 -0
  105. package/dist/container/types.cjs +2 -0
  106. package/dist/container/types.cjs.map +1 -0
  107. package/dist/container/types.d.cts +45 -0
  108. package/dist/container/types.d.cts.map +1 -0
  109. package/dist/container/types.d.mts +45 -0
  110. package/dist/container/types.d.mts.map +1 -0
  111. package/dist/container/types.mjs +2 -0
  112. package/dist/container/types.mjs.map +1 -0
  113. package/dist/env.cjs +2 -0
  114. package/dist/env.cjs.map +1 -0
  115. package/dist/env.d.cts +65 -0
  116. package/dist/env.d.cts.map +1 -0
  117. package/dist/env.d.mts +65 -0
  118. package/dist/env.d.mts.map +1 -0
  119. package/dist/env.mjs +2 -0
  120. package/dist/env.mjs.map +1 -0
  121. package/dist/extension.cjs +2 -0
  122. package/dist/extension.cjs.map +1 -0
  123. package/dist/extension.mjs +2 -0
  124. package/dist/extension.mjs.map +1 -0
  125. package/dist/extensions/config.cjs +2 -0
  126. package/dist/extensions/config.cjs.map +1 -0
  127. package/dist/extensions/config.mjs +2 -0
  128. package/dist/extensions/config.mjs.map +1 -0
  129. package/dist/extensions/delegationBridge.cjs +2 -0
  130. package/dist/extensions/delegationBridge.cjs.map +1 -0
  131. package/dist/extensions/delegationBridge.mjs +2 -0
  132. package/dist/extensions/delegationBridge.mjs.map +1 -0
  133. package/dist/extensions/doom.cjs +2 -0
  134. package/dist/extensions/doom.cjs.map +1 -0
  135. package/dist/extensions/doom.d.cts +8 -0
  136. package/dist/extensions/doom.d.cts.map +1 -0
  137. package/dist/extensions/doom.d.mts +8 -0
  138. package/dist/extensions/doom.d.mts.map +1 -0
  139. package/dist/extensions/doom.mjs +2 -0
  140. package/dist/extensions/doom.mjs.map +1 -0
  141. package/dist/extensions/fablePlanBridge.cjs +2 -0
  142. package/dist/extensions/fablePlanBridge.cjs.map +1 -0
  143. package/dist/extensions/fablePlanBridge.mjs +2 -0
  144. package/dist/extensions/fablePlanBridge.mjs.map +1 -0
  145. package/dist/extensions/managementActions.cjs +2 -0
  146. package/dist/extensions/managementActions.cjs.map +1 -0
  147. package/dist/extensions/managementActions.mjs +2 -0
  148. package/dist/extensions/managementActions.mjs.map +1 -0
  149. package/dist/extensions/operationJournal.cjs +2 -0
  150. package/dist/extensions/operationJournal.cjs.map +1 -0
  151. package/dist/extensions/operationJournal.mjs +2 -0
  152. package/dist/extensions/operationJournal.mjs.map +1 -0
  153. package/dist/extensions/orchestratorPrompt.cjs +35 -0
  154. package/dist/extensions/orchestratorPrompt.cjs.map +1 -0
  155. package/dist/extensions/orchestratorPrompt.mjs +35 -0
  156. package/dist/extensions/orchestratorPrompt.mjs.map +1 -0
  157. package/dist/extensions/pi.cjs +2 -0
  158. package/dist/extensions/pi.cjs.map +1 -0
  159. package/dist/extensions/pi.d.cts +2 -0
  160. package/dist/extensions/pi.d.mts +2 -0
  161. package/dist/extensions/pi.mjs +2 -0
  162. package/dist/extensions/pi.mjs.map +1 -0
  163. package/dist/extensions/schemas.cjs +1 -0
  164. package/dist/extensions/schemas.mjs +2 -0
  165. package/dist/extensions/schemas.mjs.map +1 -0
  166. package/dist/extensions/spawnPlan.cjs +3 -0
  167. package/dist/extensions/spawnPlan.cjs.map +1 -0
  168. package/dist/extensions/spawnPlan.mjs +3 -0
  169. package/dist/extensions/spawnPlan.mjs.map +1 -0
  170. package/dist/extensions/standard.cjs +2 -0
  171. package/dist/extensions/standard.cjs.map +1 -0
  172. package/dist/extensions/standard.d.cts +8 -0
  173. package/dist/extensions/standard.d.cts.map +1 -0
  174. package/dist/extensions/standard.d.mts +8 -0
  175. package/dist/extensions/standard.d.mts.map +1 -0
  176. package/dist/extensions/standard.mjs +2 -0
  177. package/dist/extensions/standard.mjs.map +1 -0
  178. package/dist/extensions/statusViews.cjs +7 -0
  179. package/dist/extensions/statusViews.cjs.map +1 -0
  180. package/dist/extensions/statusViews.mjs +7 -0
  181. package/dist/extensions/statusViews.mjs.map +1 -0
  182. package/dist/extensions/subagentPromptRuntime.cjs +18 -0
  183. package/dist/extensions/subagentPromptRuntime.cjs.map +1 -0
  184. package/dist/extensions/subagentPromptRuntime.d.cts +58 -0
  185. package/dist/extensions/subagentPromptRuntime.d.cts.map +1 -0
  186. package/dist/extensions/subagentPromptRuntime.d.mts +58 -0
  187. package/dist/extensions/subagentPromptRuntime.d.mts.map +1 -0
  188. package/dist/extensions/subagentPromptRuntime.mjs +18 -0
  189. package/dist/extensions/subagentPromptRuntime.mjs.map +1 -0
  190. package/dist/extensions/subagentPromptRuntimeEntry.cjs +2 -0
  191. package/dist/extensions/subagentPromptRuntimeEntry.cjs.map +1 -0
  192. package/dist/extensions/subagentPromptRuntimeEntry.d.cts +2 -0
  193. package/dist/extensions/subagentPromptRuntimeEntry.d.mts +2 -0
  194. package/dist/extensions/subagentPromptRuntimeEntry.mjs +2 -0
  195. package/dist/extensions/subagentPromptRuntimeEntry.mjs.map +1 -0
  196. package/dist/extensions/subagentTool.cjs +7 -0
  197. package/dist/extensions/subagentTool.cjs.map +1 -0
  198. package/dist/extensions/subagentTool.mjs +7 -0
  199. package/dist/extensions/subagentTool.mjs.map +1 -0
  200. package/dist/extensions/toolDescription.cjs +2 -0
  201. package/dist/extensions/toolDescription.cjs.map +1 -0
  202. package/dist/extensions/toolDescription.mjs +2 -0
  203. package/dist/extensions/toolDescription.mjs.map +1 -0
  204. package/dist/index.cjs +2 -0
  205. package/dist/index.cjs.map +1 -0
  206. package/dist/index.d.cts +34 -0
  207. package/dist/index.d.cts.map +1 -0
  208. package/dist/index.d.mts +34 -0
  209. package/dist/index.d.mts.map +1 -0
  210. package/dist/index.mjs +2 -0
  211. package/dist/index.mjs.map +1 -0
  212. package/dist/intercom/intercomBridge.cjs +2 -0
  213. package/dist/intercom/intercomBridge.cjs.map +1 -0
  214. package/dist/intercom/intercomBridge.mjs +2 -0
  215. package/dist/intercom/intercomBridge.mjs.map +1 -0
  216. package/dist/intercom/nativeTeamChannel.cjs +5 -0
  217. package/dist/intercom/nativeTeamChannel.cjs.map +1 -0
  218. package/dist/intercom/nativeTeamChannel.d.cts +22 -0
  219. package/dist/intercom/nativeTeamChannel.d.cts.map +1 -0
  220. package/dist/intercom/nativeTeamChannel.d.mts +22 -0
  221. package/dist/intercom/nativeTeamChannel.d.mts.map +1 -0
  222. package/dist/intercom/nativeTeamChannel.mjs +5 -0
  223. package/dist/intercom/nativeTeamChannel.mjs.map +1 -0
  224. package/dist/intercom/supervisorControlChannel.cjs +2 -0
  225. package/dist/intercom/supervisorControlChannel.cjs.map +1 -0
  226. package/dist/intercom/supervisorControlChannel.mjs +2 -0
  227. package/dist/intercom/supervisorControlChannel.mjs.map +1 -0
  228. package/dist/protocol/backgroundWork.cjs +2 -0
  229. package/dist/protocol/backgroundWork.cjs.map +1 -0
  230. package/dist/protocol/backgroundWork.d.cts +52 -0
  231. package/dist/protocol/backgroundWork.d.cts.map +1 -0
  232. package/dist/protocol/backgroundWork.d.mts +52 -0
  233. package/dist/protocol/backgroundWork.d.mts.map +1 -0
  234. package/dist/protocol/backgroundWork.mjs +2 -0
  235. package/dist/protocol/backgroundWork.mjs.map +1 -0
  236. package/dist/protocol/capabilityCeiling.cjs +2 -0
  237. package/dist/protocol/capabilityCeiling.cjs.map +1 -0
  238. package/dist/protocol/capabilityCeiling.d.cts +51 -0
  239. package/dist/protocol/capabilityCeiling.d.cts.map +1 -0
  240. package/dist/protocol/capabilityCeiling.d.mts +51 -0
  241. package/dist/protocol/capabilityCeiling.d.mts.map +1 -0
  242. package/dist/protocol/capabilityCeiling.mjs +2 -0
  243. package/dist/protocol/capabilityCeiling.mjs.map +1 -0
  244. package/dist/protocol/delegation.cjs +2 -0
  245. package/dist/protocol/delegation.cjs.map +1 -0
  246. package/dist/protocol/delegation.d.cts +269 -0
  247. package/dist/protocol/delegation.d.cts.map +1 -0
  248. package/dist/protocol/delegation.d.mts +269 -0
  249. package/dist/protocol/delegation.d.mts.map +1 -0
  250. package/dist/protocol/delegation.mjs +2 -0
  251. package/dist/protocol/delegation.mjs.map +1 -0
  252. package/dist/runs/background/asyncExecution.cjs +2 -0
  253. package/dist/runs/background/asyncExecution.cjs.map +1 -0
  254. package/dist/runs/background/asyncExecution.mjs +2 -0
  255. package/dist/runs/background/asyncExecution.mjs.map +1 -0
  256. package/dist/runs/background/asyncJobTracker.cjs +2 -0
  257. package/dist/runs/background/asyncJobTracker.cjs.map +1 -0
  258. package/dist/runs/background/asyncJobTracker.mjs +2 -0
  259. package/dist/runs/background/asyncJobTracker.mjs.map +1 -0
  260. package/dist/runs/background/cliRunnerEntry.cjs +2 -0
  261. package/dist/runs/background/cliRunnerEntry.cjs.map +1 -0
  262. package/dist/runs/background/cliRunnerEntry.d.cts +1 -0
  263. package/dist/runs/background/cliRunnerEntry.d.mts +1 -0
  264. package/dist/runs/background/cliRunnerEntry.mjs +2 -0
  265. package/dist/runs/background/cliRunnerEntry.mjs.map +1 -0
  266. package/dist/runs/background/completionBatcher.cjs +2 -0
  267. package/dist/runs/background/completionBatcher.cjs.map +1 -0
  268. package/dist/runs/background/completionBatcher.mjs +2 -0
  269. package/dist/runs/background/completionBatcher.mjs.map +1 -0
  270. package/dist/runs/background/notify.cjs +4 -0
  271. package/dist/runs/background/notify.cjs.map +1 -0
  272. package/dist/runs/background/notify.mjs +4 -0
  273. package/dist/runs/background/notify.mjs.map +1 -0
  274. package/dist/runs/background/parentWatchdog.cjs +2 -0
  275. package/dist/runs/background/parentWatchdog.cjs.map +1 -0
  276. package/dist/runs/background/parentWatchdog.mjs +2 -0
  277. package/dist/runs/background/parentWatchdog.mjs.map +1 -0
  278. package/dist/runs/background/processTerminal.cjs +2 -0
  279. package/dist/runs/background/processTerminal.cjs.map +1 -0
  280. package/dist/runs/background/processTerminal.mjs +2 -0
  281. package/dist/runs/background/processTerminal.mjs.map +1 -0
  282. package/dist/runs/background/resultWatcher.cjs +2 -0
  283. package/dist/runs/background/resultWatcher.cjs.map +1 -0
  284. package/dist/runs/background/resultWatcher.mjs +2 -0
  285. package/dist/runs/background/resultWatcher.mjs.map +1 -0
  286. package/dist/runs/background/runIdResolver.cjs +2 -0
  287. package/dist/runs/background/runIdResolver.cjs.map +1 -0
  288. package/dist/runs/background/runIdResolver.mjs +2 -0
  289. package/dist/runs/background/runIdResolver.mjs.map +1 -0
  290. package/dist/runs/background/runnerBootstrap.cjs +2 -0
  291. package/dist/runs/background/runnerBootstrap.cjs.map +1 -0
  292. package/dist/runs/background/runnerBootstrap.mjs +2 -0
  293. package/dist/runs/background/runnerBootstrap.mjs.map +1 -0
  294. package/dist/runs/background/runnerExecution.cjs +2 -0
  295. package/dist/runs/background/runnerExecution.cjs.map +1 -0
  296. package/dist/runs/background/runnerExecution.mjs +2 -0
  297. package/dist/runs/background/runnerExecution.mjs.map +1 -0
  298. package/dist/runs/background/runnerReporting.cjs +3 -0
  299. package/dist/runs/background/runnerReporting.cjs.map +1 -0
  300. package/dist/runs/background/runnerReporting.mjs +3 -0
  301. package/dist/runs/background/runnerReporting.mjs.map +1 -0
  302. package/dist/runs/background/runnerTeamMembership.cjs +2 -0
  303. package/dist/runs/background/runnerTeamMembership.cjs.map +1 -0
  304. package/dist/runs/background/runnerTeamMembership.mjs +2 -0
  305. package/dist/runs/background/runnerTeamMembership.mjs.map +1 -0
  306. package/dist/runs/background/spawnHandshake.cjs +2 -0
  307. package/dist/runs/background/spawnHandshake.cjs.map +1 -0
  308. package/dist/runs/background/spawnHandshake.mjs +2 -0
  309. package/dist/runs/background/spawnHandshake.mjs.map +1 -0
  310. package/dist/runs/background/staleRunReconciler.cjs +2 -0
  311. package/dist/runs/background/staleRunReconciler.cjs.map +1 -0
  312. package/dist/runs/background/staleRunReconciler.mjs +2 -0
  313. package/dist/runs/background/staleRunReconciler.mjs.map +1 -0
  314. package/dist/runs/background/statusReader.cjs +2 -0
  315. package/dist/runs/background/statusReader.cjs.map +1 -0
  316. package/dist/runs/background/statusReader.mjs +2 -0
  317. package/dist/runs/background/statusReader.mjs.map +1 -0
  318. package/dist/runs/background/statusWriter.cjs +2 -0
  319. package/dist/runs/background/statusWriter.cjs.map +1 -0
  320. package/dist/runs/background/statusWriter.mjs +2 -0
  321. package/dist/runs/background/statusWriter.mjs.map +1 -0
  322. package/dist/runs/background/subagentWait.cjs +2 -0
  323. package/dist/runs/background/subagentWait.cjs.map +1 -0
  324. package/dist/runs/background/subagentWait.mjs +2 -0
  325. package/dist/runs/background/subagentWait.mjs.map +1 -0
  326. package/dist/runs/background/terminalPersistence.cjs +2 -0
  327. package/dist/runs/background/terminalPersistence.cjs.map +1 -0
  328. package/dist/runs/background/terminalPersistence.mjs +2 -0
  329. package/dist/runs/background/terminalPersistence.mjs.map +1 -0
  330. package/dist/runs/registry/processGroup.cjs +2 -0
  331. package/dist/runs/registry/processGroup.cjs.map +1 -0
  332. package/dist/runs/registry/processGroup.mjs +2 -0
  333. package/dist/runs/registry/processGroup.mjs.map +1 -0
  334. package/dist/runs/registry/runRegistry.cjs +2 -0
  335. package/dist/runs/registry/runRegistry.cjs.map +1 -0
  336. package/dist/runs/registry/runRegistry.mjs +2 -0
  337. package/dist/runs/registry/runRegistry.mjs.map +1 -0
  338. package/dist/runs/registry/sessionLifecycle.cjs +2 -0
  339. package/dist/runs/registry/sessionLifecycle.cjs.map +1 -0
  340. package/dist/runs/registry/sessionLifecycle.mjs +2 -0
  341. package/dist/runs/registry/sessionLifecycle.mjs.map +1 -0
  342. package/dist/runs/registry/suspendedRuns.cjs +4 -0
  343. package/dist/runs/registry/suspendedRuns.cjs.map +1 -0
  344. package/dist/runs/registry/suspendedRuns.mjs +4 -0
  345. package/dist/runs/registry/suspendedRuns.mjs.map +1 -0
  346. package/dist/runs/sdkRunnerEntry.cjs +2 -0
  347. package/dist/runs/sdkRunnerEntry.cjs.map +1 -0
  348. package/dist/runs/sdkRunnerEntry.d.cts +1 -0
  349. package/dist/runs/sdkRunnerEntry.d.mts +1 -0
  350. package/dist/runs/sdkRunnerEntry.mjs +2 -0
  351. package/dist/runs/sdkRunnerEntry.mjs.map +1 -0
  352. package/dist/runs/shared/claudeFableProfile.cjs +4 -0
  353. package/dist/runs/shared/claudeFableProfile.cjs.map +1 -0
  354. package/dist/runs/shared/claudeFableProfile.mjs +4 -0
  355. package/dist/runs/shared/claudeFableProfile.mjs.map +1 -0
  356. package/dist/runs/shared/depthGuard.cjs +2 -0
  357. package/dist/runs/shared/depthGuard.cjs.map +1 -0
  358. package/dist/runs/shared/depthGuard.mjs +2 -0
  359. package/dist/runs/shared/depthGuard.mjs.map +1 -0
  360. package/dist/runs/shared/mcpDirectToolAllowlist.cjs +2 -0
  361. package/dist/runs/shared/mcpDirectToolAllowlist.cjs.map +1 -0
  362. package/dist/runs/shared/mcpDirectToolAllowlist.mjs +2 -0
  363. package/dist/runs/shared/mcpDirectToolAllowlist.mjs.map +1 -0
  364. package/dist/runs/shared/modelFallback.cjs +2 -0
  365. package/dist/runs/shared/modelFallback.cjs.map +1 -0
  366. package/dist/runs/shared/modelFallback.mjs +2 -0
  367. package/dist/runs/shared/modelFallback.mjs.map +1 -0
  368. package/dist/runs/shared/modelScope.cjs +2 -0
  369. package/dist/runs/shared/modelScope.cjs.map +1 -0
  370. package/dist/runs/shared/modelScope.mjs +2 -0
  371. package/dist/runs/shared/modelScope.mjs.map +1 -0
  372. package/dist/runs/shared/nestedPath.cjs +2 -0
  373. package/dist/runs/shared/nestedPath.cjs.map +1 -0
  374. package/dist/runs/shared/nestedPath.mjs +2 -0
  375. package/dist/runs/shared/nestedPath.mjs.map +1 -0
  376. package/dist/runs/shared/piArgs.cjs +2 -0
  377. package/dist/runs/shared/piArgs.cjs.map +1 -0
  378. package/dist/runs/shared/piArgs.mjs +2 -0
  379. package/dist/runs/shared/piArgs.mjs.map +1 -0
  380. package/dist/runs/shared/piSpawn.cjs +2 -0
  381. package/dist/runs/shared/piSpawn.cjs.map +1 -0
  382. package/dist/runs/shared/piSpawn.mjs +2 -0
  383. package/dist/runs/shared/piSpawn.mjs.map +1 -0
  384. package/dist/runs/shared/runWithConcurrency.cjs +2 -0
  385. package/dist/runs/shared/runWithConcurrency.cjs.map +1 -0
  386. package/dist/runs/shared/runWithConcurrency.mjs +2 -0
  387. package/dist/runs/shared/runWithConcurrency.mjs.map +1 -0
  388. package/dist/runs/shared/runtimeRegistry.cjs +2 -0
  389. package/dist/runs/shared/runtimeRegistry.cjs.map +1 -0
  390. package/dist/runs/shared/runtimeRegistry.mjs +2 -0
  391. package/dist/runs/shared/runtimeRegistry.mjs.map +1 -0
  392. package/dist/runs/shared/structuredOutput.cjs +2 -0
  393. package/dist/runs/shared/structuredOutput.cjs.map +1 -0
  394. package/dist/runs/shared/structuredOutput.mjs +2 -0
  395. package/dist/runs/shared/structuredOutput.mjs.map +1 -0
  396. package/dist/runs/shared/toolAvailability.cjs +2 -0
  397. package/dist/runs/shared/toolAvailability.cjs.map +1 -0
  398. package/dist/runs/shared/toolAvailability.mjs +2 -0
  399. package/dist/runs/shared/toolAvailability.mjs.map +1 -0
  400. package/dist/runs/shared/toolBudget.cjs +2 -0
  401. package/dist/runs/shared/toolBudget.cjs.map +1 -0
  402. package/dist/runs/shared/toolBudget.mjs +2 -0
  403. package/dist/runs/shared/toolBudget.mjs.map +1 -0
  404. package/dist/shared/artifacts.cjs +2 -0
  405. package/dist/shared/artifacts.cjs.map +1 -0
  406. package/dist/shared/artifacts.mjs +2 -0
  407. package/dist/shared/artifacts.mjs.map +1 -0
  408. package/dist/shared/atomicJson.cjs +2 -0
  409. package/dist/shared/atomicJson.cjs.map +1 -0
  410. package/dist/shared/atomicJson.mjs +2 -0
  411. package/dist/shared/atomicJson.mjs.map +1 -0
  412. package/dist/shared/boundedKeySet.cjs +2 -0
  413. package/dist/shared/boundedKeySet.cjs.map +1 -0
  414. package/dist/shared/boundedKeySet.mjs +2 -0
  415. package/dist/shared/boundedKeySet.mjs.map +1 -0
  416. package/dist/shared/childTranscript.cjs +5 -0
  417. package/dist/shared/childTranscript.cjs.map +1 -0
  418. package/dist/shared/childTranscript.mjs +5 -0
  419. package/dist/shared/childTranscript.mjs.map +1 -0
  420. package/dist/shared/configDir.cjs +2 -0
  421. package/dist/shared/configDir.cjs.map +1 -0
  422. package/dist/shared/configDir.mjs +2 -0
  423. package/dist/shared/configDir.mjs.map +1 -0
  424. package/dist/shared/errors.cjs +2 -0
  425. package/dist/shared/errors.cjs.map +1 -0
  426. package/dist/shared/errors.mjs +2 -0
  427. package/dist/shared/errors.mjs.map +1 -0
  428. package/dist/shared/fileSystemRetry.cjs +2 -0
  429. package/dist/shared/fileSystemRetry.cjs.map +1 -0
  430. package/dist/shared/fileSystemRetry.mjs +2 -0
  431. package/dist/shared/fileSystemRetry.mjs.map +1 -0
  432. package/dist/shared/formatters.cjs +2 -0
  433. package/dist/shared/formatters.cjs.map +1 -0
  434. package/dist/shared/formatters.mjs +2 -0
  435. package/dist/shared/formatters.mjs.map +1 -0
  436. package/dist/shared/lruCache.cjs +2 -0
  437. package/dist/shared/lruCache.cjs.map +1 -0
  438. package/dist/shared/lruCache.mjs +2 -0
  439. package/dist/shared/lruCache.mjs.map +1 -0
  440. package/dist/shared/modelInfo.cjs +2 -0
  441. package/dist/shared/modelInfo.cjs.map +1 -0
  442. package/dist/shared/modelInfo.mjs +2 -0
  443. package/dist/shared/modelInfo.mjs.map +1 -0
  444. package/dist/shared/modelResolution.cjs +2 -0
  445. package/dist/shared/modelResolution.cjs.map +1 -0
  446. package/dist/shared/modelResolution.mjs +2 -0
  447. package/dist/shared/modelResolution.mjs.map +1 -0
  448. package/dist/shared/paths.cjs +2 -0
  449. package/dist/shared/paths.cjs.map +1 -0
  450. package/dist/shared/paths.mjs +2 -0
  451. package/dist/shared/paths.mjs.map +1 -0
  452. package/dist/shared/pollScheduler.cjs +2 -0
  453. package/dist/shared/pollScheduler.cjs.map +1 -0
  454. package/dist/shared/pollScheduler.mjs +2 -0
  455. package/dist/shared/pollScheduler.mjs.map +1 -0
  456. package/dist/shared/scopeOwner.cjs +2 -0
  457. package/dist/shared/scopeOwner.cjs.map +1 -0
  458. package/dist/shared/scopeOwner.mjs +2 -0
  459. package/dist/shared/scopeOwner.mjs.map +1 -0
  460. package/dist/shared/versioned.cjs +2 -0
  461. package/dist/shared/versioned.cjs.map +1 -0
  462. package/dist/shared/versioned.mjs +2 -0
  463. package/dist/shared/versioned.mjs.map +1 -0
  464. package/dist/slash/chainExpression.cjs +2 -0
  465. package/dist/slash/chainExpression.cjs.map +1 -0
  466. package/dist/slash/chainExpression.mjs +2 -0
  467. package/dist/slash/chainExpression.mjs.map +1 -0
  468. package/dist/slash/doctor.cjs +5 -0
  469. package/dist/slash/doctor.cjs.map +1 -0
  470. package/dist/slash/doctor.mjs +5 -0
  471. package/dist/slash/doctor.mjs.map +1 -0
  472. package/dist/slash/slashCommands.cjs +4 -0
  473. package/dist/slash/slashCommands.cjs.map +1 -0
  474. package/dist/slash/slashCommands.mjs +4 -0
  475. package/dist/slash/slashCommands.mjs.map +1 -0
  476. package/dist/slash/spawnRequestMapping.cjs +2 -0
  477. package/dist/slash/spawnRequestMapping.cjs.map +1 -0
  478. package/dist/slash/spawnRequestMapping.mjs +2 -0
  479. package/dist/slash/spawnRequestMapping.mjs.map +1 -0
  480. package/dist/slash/subagentLaunch.cjs +2 -0
  481. package/dist/slash/subagentLaunch.cjs.map +1 -0
  482. package/dist/slash/subagentLaunch.mjs +2 -0
  483. package/dist/slash/subagentLaunch.mjs.map +1 -0
  484. package/dist/tui/agentCatalog.cjs +2 -0
  485. package/dist/tui/agentCatalog.cjs.map +1 -0
  486. package/dist/tui/agentCatalog.mjs +2 -0
  487. package/dist/tui/agentCatalog.mjs.map +1 -0
  488. package/dist/tui/agentResourceProjection.cjs +2 -0
  489. package/dist/tui/agentResourceProjection.cjs.map +1 -0
  490. package/dist/tui/agentResourceProjection.mjs +2 -0
  491. package/dist/tui/agentResourceProjection.mjs.map +1 -0
  492. package/dist/tui/completionNotice.cjs +5 -0
  493. package/dist/tui/completionNotice.cjs.map +1 -0
  494. package/dist/tui/completionNotice.mjs +5 -0
  495. package/dist/tui/completionNotice.mjs.map +1 -0
  496. package/dist/tui/fleet.cjs +3 -0
  497. package/dist/tui/fleet.cjs.map +1 -0
  498. package/dist/tui/fleet.mjs +3 -0
  499. package/dist/tui/fleet.mjs.map +1 -0
  500. package/dist/tui/fleetAgentView.cjs +2 -0
  501. package/dist/tui/fleetAgentView.cjs.map +1 -0
  502. package/dist/tui/fleetAgentView.mjs +2 -0
  503. package/dist/tui/fleetAgentView.mjs.map +1 -0
  504. package/dist/tui/fleetStatus.cjs +2 -0
  505. package/dist/tui/fleetStatus.cjs.map +1 -0
  506. package/dist/tui/fleetStatus.mjs +2 -0
  507. package/dist/tui/fleetStatus.mjs.map +1 -0
  508. package/dist/tui/fleetTranscript.cjs +5 -0
  509. package/dist/tui/fleetTranscript.cjs.map +1 -0
  510. package/dist/tui/fleetTranscript.mjs +5 -0
  511. package/dist/tui/fleetTranscript.mjs.map +1 -0
  512. package/dist/tui/register.cjs +2 -0
  513. package/dist/tui/register.cjs.map +1 -0
  514. package/dist/tui/register.mjs +2 -0
  515. package/dist/tui/register.mjs.map +1 -0
  516. package/dist/types.d.cts +59 -0
  517. package/dist/types.d.cts.map +1 -0
  518. package/dist/types.d.mts +59 -0
  519. package/dist/types.d.mts.map +1 -0
  520. package/package.json +86 -0
@@ -0,0 +1,52 @@
1
+ import { IGlobalStateBridge } from "../types.cjs";
2
+
3
+ //#region src/protocol/backgroundWork.d.ts
4
+ declare const BACKGROUND_WORK_PROTOCOL_VERSION = 1;
5
+ declare const BACKGROUND_WORK_REGISTRY_KEY = "pi-subagents.background-work.v1";
6
+ /**
7
+ * Backward-compatible cross-package registration bridge. Its shape is separate
8
+ * from the v1 registry so existing hosts can keep validating that registry.
9
+ */
10
+ declare const BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY = "pi-subagents.background-work.registration.v1";
11
+ type BackgroundWorkRegistrationBridge = (provider: BackgroundWorkProvider) => () => void;
12
+ interface BackgroundWorkItem {
13
+ id: string;
14
+ sessionId: string;
15
+ }
16
+ interface BackgroundWorkReconcileContext {
17
+ sessionId: string;
18
+ nowMs: number;
19
+ }
20
+ interface BackgroundWorkProvider {
21
+ name: string;
22
+ listActiveWork(): readonly BackgroundWorkItem[];
23
+ wakeChannels?: readonly string[];
24
+ reconcile?(context: BackgroundWorkReconcileContext): void;
25
+ }
26
+ interface RegisteredBackgroundWorkItem extends BackgroundWorkItem {
27
+ provider: string;
28
+ }
29
+ interface BackgroundWorkSnapshot {
30
+ providers: readonly string[];
31
+ items: readonly RegisteredBackgroundWorkItem[];
32
+ }
33
+ /**
34
+ * Register or replace one process-local background-work provider. The returned
35
+ * disposer only removes this exact registration, so an old extension reload
36
+ * cannot unregister its replacement.
37
+ */
38
+ declare function registerBackgroundWorkProvider(provider: BackgroundWorkProvider, bridge?: IGlobalStateBridge): () => void;
39
+ declare function listBackgroundWorkProviders(bridge?: IGlobalStateBridge): readonly BackgroundWorkProvider[];
40
+ /** Read validated provider wake channels without reconciling or listing work. */
41
+ declare function listBackgroundWorkWakeChannels(bridge?: IGlobalStateBridge): readonly string[];
42
+ /** Reconcile and snapshot active provider work owned by one exact Pi session. */
43
+ declare function snapshotBackgroundWork(sessionId: string, nowMs?: number, bridge?: IGlobalStateBridge): BackgroundWorkSnapshot;
44
+ /**
45
+ * Publish the registration bridge for hosts that discover it by symbol rather
46
+ * than by import. First writer wins, so a bundle loaded alongside this one keeps
47
+ * whichever function it already installed.
48
+ */
49
+ declare function installBackgroundWorkRegistrationBridge(bridge?: IGlobalStateBridge): void;
50
+ //#endregion
51
+ export { BACKGROUND_WORK_PROTOCOL_VERSION, BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY, BACKGROUND_WORK_REGISTRY_KEY, BackgroundWorkItem, BackgroundWorkProvider, BackgroundWorkReconcileContext, BackgroundWorkRegistrationBridge, BackgroundWorkSnapshot, RegisteredBackgroundWorkItem, installBackgroundWorkRegistrationBridge, listBackgroundWorkProviders, listBackgroundWorkWakeChannels, registerBackgroundWorkProvider, snapshotBackgroundWork };
52
+ //# sourceMappingURL=backgroundWork.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundWork.d.cts","names":[],"sources":["../../src/protocol/backgroundWork.ts"],"mappings":";;;cAuBa,gCAAA;AAAA,cACA,4BAAA;;AAiBb;;;cAXa,uCAAA;AAAA,KACD,gCAAA,IAAoC,QAAA,EAAU,sBAAA;AAAA,UAUzC,kBAAA;EACf,EAAA;EACA,SAAA;AAAA;AAAA,UAGe,8BAAA;EACf,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,sBAAA;EACf,IAAA;EACA,cAAA,aAA2B,kBAAA;EAC3B,YAAA;EACA,SAAA,EAAW,OAAA,EAAS,8BAAA;AAAA;AAAA,UAGL,4BAAA,SAAqC,kBAAA;EACpD,QAAA;AAAA;AAAA,UAGe,sBAAA;EACf,SAAA;EACA,KAAA,WAAgB,4BAAA;AAAA;;;AAFlB;;;iBAuGgB,8BAAA,CACd,QAAA,EAAU,sBAAA,EACV,MAAA,GAAS,kBAAA;AAAA,iBAaK,2BAAA,CAA4B,MAAA,GAAS,kBAAA,YAA8B,sBAAA;;iBAiBnE,8BAAA,CAA+B,MAAA,GAAS,kBAAA;;iBASxC,sBAAA,CACd,SAAA,UACA,KAAA,WACA,MAAA,GAAS,kBAAA,GACR,sBAAA;AA7CH;;;;;AAAA,iBAgGgB,uCAAA,CAAwC,MAAA,GAAS,kBAAA"}
@@ -0,0 +1,52 @@
1
+ import { IGlobalStateBridge } from "../types.mjs";
2
+
3
+ //#region src/protocol/backgroundWork.d.ts
4
+ declare const BACKGROUND_WORK_PROTOCOL_VERSION = 1;
5
+ declare const BACKGROUND_WORK_REGISTRY_KEY = "pi-subagents.background-work.v1";
6
+ /**
7
+ * Backward-compatible cross-package registration bridge. Its shape is separate
8
+ * from the v1 registry so existing hosts can keep validating that registry.
9
+ */
10
+ declare const BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY = "pi-subagents.background-work.registration.v1";
11
+ type BackgroundWorkRegistrationBridge = (provider: BackgroundWorkProvider) => () => void;
12
+ interface BackgroundWorkItem {
13
+ id: string;
14
+ sessionId: string;
15
+ }
16
+ interface BackgroundWorkReconcileContext {
17
+ sessionId: string;
18
+ nowMs: number;
19
+ }
20
+ interface BackgroundWorkProvider {
21
+ name: string;
22
+ listActiveWork(): readonly BackgroundWorkItem[];
23
+ wakeChannels?: readonly string[];
24
+ reconcile?(context: BackgroundWorkReconcileContext): void;
25
+ }
26
+ interface RegisteredBackgroundWorkItem extends BackgroundWorkItem {
27
+ provider: string;
28
+ }
29
+ interface BackgroundWorkSnapshot {
30
+ providers: readonly string[];
31
+ items: readonly RegisteredBackgroundWorkItem[];
32
+ }
33
+ /**
34
+ * Register or replace one process-local background-work provider. The returned
35
+ * disposer only removes this exact registration, so an old extension reload
36
+ * cannot unregister its replacement.
37
+ */
38
+ declare function registerBackgroundWorkProvider(provider: BackgroundWorkProvider, bridge?: IGlobalStateBridge): () => void;
39
+ declare function listBackgroundWorkProviders(bridge?: IGlobalStateBridge): readonly BackgroundWorkProvider[];
40
+ /** Read validated provider wake channels without reconciling or listing work. */
41
+ declare function listBackgroundWorkWakeChannels(bridge?: IGlobalStateBridge): readonly string[];
42
+ /** Reconcile and snapshot active provider work owned by one exact Pi session. */
43
+ declare function snapshotBackgroundWork(sessionId: string, nowMs?: number, bridge?: IGlobalStateBridge): BackgroundWorkSnapshot;
44
+ /**
45
+ * Publish the registration bridge for hosts that discover it by symbol rather
46
+ * than by import. First writer wins, so a bundle loaded alongside this one keeps
47
+ * whichever function it already installed.
48
+ */
49
+ declare function installBackgroundWorkRegistrationBridge(bridge?: IGlobalStateBridge): void;
50
+ //#endregion
51
+ export { BACKGROUND_WORK_PROTOCOL_VERSION, BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY, BACKGROUND_WORK_REGISTRY_KEY, BackgroundWorkItem, BackgroundWorkProvider, BackgroundWorkReconcileContext, BackgroundWorkRegistrationBridge, BackgroundWorkSnapshot, RegisteredBackgroundWorkItem, installBackgroundWorkRegistrationBridge, listBackgroundWorkProviders, listBackgroundWorkWakeChannels, registerBackgroundWorkProvider, snapshotBackgroundWork };
52
+ //# sourceMappingURL=backgroundWork.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundWork.d.mts","names":[],"sources":["../../src/protocol/backgroundWork.ts"],"mappings":";;;cAuBa,gCAAA;AAAA,cACA,4BAAA;;AAiBb;;;cAXa,uCAAA;AAAA,KACD,gCAAA,IAAoC,QAAA,EAAU,sBAAA;AAAA,UAUzC,kBAAA;EACf,EAAA;EACA,SAAA;AAAA;AAAA,UAGe,8BAAA;EACf,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,sBAAA;EACf,IAAA;EACA,cAAA,aAA2B,kBAAA;EAC3B,YAAA;EACA,SAAA,EAAW,OAAA,EAAS,8BAAA;AAAA;AAAA,UAGL,4BAAA,SAAqC,kBAAA;EACpD,QAAA;AAAA;AAAA,UAGe,sBAAA;EACf,SAAA;EACA,KAAA,WAAgB,4BAAA;AAAA;;;AAFlB;;;iBAuGgB,8BAAA,CACd,QAAA,EAAU,sBAAA,EACV,MAAA,GAAS,kBAAA;AAAA,iBAaK,2BAAA,CAA4B,MAAA,GAAS,kBAAA,YAA8B,sBAAA;;iBAiBnE,8BAAA,CAA+B,MAAA,GAAS,kBAAA;;iBASxC,sBAAA,CACd,SAAA,UACA,KAAA,WACA,MAAA,GAAS,kBAAA,GACR,sBAAA;AA7CH;;;;;AAAA,iBAgGgB,uCAAA,CAAwC,MAAA,GAAS,kBAAA"}
@@ -0,0 +1,2 @@
1
+ import{GlobalStateBridge as e,init_globalBridge as t}from"../container/globalBridge.mjs";t();const n=1,r=`pi-subagents.background-work.v1`,i=`pi-subagents.background-work.registration.v1`,a=1e4,o=[`name`,`listActiveWork`,`wakeChannels`,`reconcile`];function s(t){return t??new e}function c(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Malformed background-work registry at Symbol.for("${r}").`);let t=e;if(t.version!==1||!(t.providers instanceof Map))throw Error(`Unsupported background-work registry at Symbol.for("${r}").`);return t}function l(e){return s(e).protocolSlot(r,()=>({version:1,providers:new Map}),c)}function u(e,t,n){if(typeof e!=`string`||e.length===0||e.trim()!==e)throw Error(`${t} must be a non-empty string without leading or trailing whitespace.`);if(e.length>n)throw Error(`${t} must be at most ${n} characters.`);if(e.includes(`\0`))throw Error(`${t} must not contain NUL characters.`);return e}function d(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Background-work provider must be an object.`);let t=e,n=Object.keys(t).filter(e=>!o.includes(e));if(n.length>0)throw Error(`Background-work provider has unknown fields: ${n.join(`, `)}.`);let r=u(t.name,`Background-work provider name`,128);if(typeof t.listActiveWork!=`function`)throw Error(`Background-work provider '${r}' must expose listActiveWork().`);if(t.reconcile!==void 0&&typeof t.reconcile!=`function`)throw Error(`Background-work provider '${r}' reconcile must be a function when provided.`);if(t.wakeChannels!==void 0){if(!Array.isArray(t.wakeChannels))throw Error(`Background-work provider '${r}' wakeChannels must be an array when provided.`);let e=t.wakeChannels.map((e,t)=>u(e,`Background-work provider '${r}' wakeChannels[${t}]`,256));if(new Set(e).size!==e.length)throw Error(`Background-work provider '${r}' wakeChannels must not contain duplicates.`)}return e}function f(e,t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Background-work provider '${e}' item ${n} must be an object.`);let r=t,i=Object.keys(r).filter(e=>e!==`id`&&e!==`sessionId`);if(i.length>0)throw Error(`Background-work provider '${e}' item ${n} has unknown fields: ${i.join(`, `)}.`);return{id:u(r.id,`Background-work provider '${e}' item ${n} id`,256),sessionId:u(r.sessionId,`Background-work provider '${e}' item ${n} sessionId`,256)}}function p(e,t){let n=d(e),r=l(t);if(!r.providers.has(n.name)&&r.providers.size>=100)throw Error(`Background-work registry supports at most 100 providers.`);return r.providers.set(n.name,n),()=>{r.providers.get(n.name)===n&&r.providers.delete(n.name)}}function m(e){let t=l(e);if(t.providers.size>100)throw Error(`Background-work registry contains more than 100 providers.`);let n=[];for(let[e,r]of t.providers){let t=d(r);if(e!==t.name)throw Error(`Background-work registry key '${e}' does not match provider name '${t.name}'.`);n.push(t)}return n}function h(e){let t=new Set;for(let n of m(e))for(let e of n.wakeChannels??[])t.add(e);return[...t]}function g(e,t=Date.now(),n){u(e,`Background-work snapshot sessionId`,256);let r=m(n),i=[],o=new Set;for(let n of r){try{n.reconcile?.({sessionId:e,nowMs:t})}catch(e){throw Error(`Background-work provider '${n.name}' reconcile failed: ${e instanceof Error?e.message:String(e)}`,{cause:e})}let r;try{r=n.listActiveWork()}catch(e){throw Error(`Background-work provider '${n.name}' listActiveWork failed: ${e instanceof Error?e.message:String(e)}`,{cause:e})}if(!Array.isArray(r))throw Error(`Background-work provider '${n.name}' listActiveWork() must return an array.`);if(r.length>a)throw Error(`Background-work provider '${n.name}' returned ${r.length} items; maximum is ${a}.`);r.forEach((t,r)=>{let a=f(n.name,t,r),s=`${n.name}\0${a.sessionId}\0${a.id}`;if(o.has(s))throw Error(`Background-work provider '${n.name}' returned duplicate item '${a.id}' for session '${a.sessionId}'.`);o.add(s),a.sessionId===e&&i.push({provider:n.name,...a})})}return{providers:r.map(e=>e.name),items:i}}function _(e){s(e).claimProtocolSlot(i,p)}export{n as BACKGROUND_WORK_PROTOCOL_VERSION,i as BACKGROUND_WORK_REGISTRATION_BRIDGE_KEY,r as BACKGROUND_WORK_REGISTRY_KEY,_ as installBackgroundWorkRegistrationBridge,m as listBackgroundWorkProviders,h as listBackgroundWorkWakeChannels,p as registerBackgroundWorkProvider,g as snapshotBackgroundWork};
2
+ //# sourceMappingURL=backgroundWork.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundWork.mjs","names":[],"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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"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../env.cjs`),t=require(`../container/globalBridge.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(e){return e??new t.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(t,n){return h(t,v(process.env[e.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/protocol/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 { GlobalStateBridge } from '../container/globalBridge.ts';\nimport { SUBAGENT_CAPABILITY_CEILING_ENV } from '../env.ts';\nimport type { IGlobalStateBridge } from '../types.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,51 @@
1
+ import { IGlobalStateBridge } from "../types.cjs";
2
+ import { SUBAGENT_CAPABILITY_CEILING_ENV } from "../env.cjs";
3
+ //#region src/protocol/capabilityCeiling.d.ts
4
+ declare const SUBAGENT_CAPABILITY_CEILING_VERSION: 2;
5
+ declare const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = "pi-subagents.capability-ceiling.v1";
6
+ type SubagentCapabilityCeiling = {
7
+ allowedTools?: readonly string[];
8
+ requiredTools?: readonly string[];
9
+ allowMcpTools?: boolean;
10
+ allowedExternalProfiles?: readonly string[];
11
+ denyExtensions?: boolean;
12
+ };
13
+ interface ResolvedSubagentCapabilityCeiling {
14
+ version: typeof SUBAGENT_CAPABILITY_CEILING_VERSION;
15
+ allowedTools?: string[];
16
+ requiredTools?: string[];
17
+ allowMcpTools?: boolean;
18
+ allowedExternalProfiles: string[];
19
+ denyExtensions: boolean;
20
+ sources: string[];
21
+ }
22
+ interface SubagentCapabilityAudit {
23
+ ceiling: ResolvedSubagentCapabilityCeiling;
24
+ requestedTools?: string[];
25
+ effectiveTools: string[];
26
+ removedTools: string[];
27
+ internalTools: string[];
28
+ extensionsDenied: boolean;
29
+ removedExtensionCount: number;
30
+ requestedMcpToolCount: number;
31
+ effectiveMcpTools: string[];
32
+ }
33
+ interface RegisterSubagentCapabilityCeilingOptions {
34
+ sessionId: string;
35
+ source: string;
36
+ ceiling: SubagentCapabilityCeiling;
37
+ }
38
+ interface SubagentCapabilityCeilingHandle {
39
+ update(ceiling: SubagentCapabilityCeiling): void;
40
+ dispose(): void;
41
+ }
42
+ declare function parseSubagentCapabilityCeiling(value: unknown, field?: string): ResolvedSubagentCapabilityCeiling;
43
+ declare function registerSubagentCapabilityCeiling(options: RegisterSubagentCapabilityCeilingOptions, bridge?: IGlobalStateBridge): SubagentCapabilityCeilingHandle;
44
+ declare function intersectSubagentCapabilityCeilings(...ceilings: Array<ResolvedSubagentCapabilityCeiling | undefined>): ResolvedSubagentCapabilityCeiling | undefined;
45
+ declare function resolveSubagentCapabilityCeiling(sessionId: string | undefined, inherited?: ResolvedSubagentCapabilityCeiling, bridge?: IGlobalStateBridge): ResolvedSubagentCapabilityCeiling | undefined;
46
+ declare function resolveCurrentSubagentCapabilityCeiling(sessionId: string | undefined, bridge?: IGlobalStateBridge): ResolvedSubagentCapabilityCeiling | undefined;
47
+ declare function encodeSubagentCapabilityCeiling(ceiling: ResolvedSubagentCapabilityCeiling | undefined): string | undefined;
48
+ declare function decodeSubagentCapabilityCeiling(value: string | undefined): ResolvedSubagentCapabilityCeiling | undefined;
49
+ //#endregion
50
+ export { RegisterSubagentCapabilityCeilingOptions, ResolvedSubagentCapabilityCeiling, SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY, SUBAGENT_CAPABILITY_CEILING_VERSION, SubagentCapabilityAudit, SubagentCapabilityCeiling, SubagentCapabilityCeilingHandle, decodeSubagentCapabilityCeiling, encodeSubagentCapabilityCeiling, intersectSubagentCapabilityCeilings, parseSubagentCapabilityCeiling, registerSubagentCapabilityCeiling, resolveCurrentSubagentCapabilityCeiling, resolveSubagentCapabilityCeiling };
51
+ //# sourceMappingURL=capabilityCeiling.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling.d.cts","names":[],"sources":["../../src/protocol/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,51 @@
1
+ import { IGlobalStateBridge } from "../types.mjs";
2
+ import { SUBAGENT_CAPABILITY_CEILING_ENV } from "../env.mjs";
3
+ //#region src/protocol/capabilityCeiling.d.ts
4
+ declare const SUBAGENT_CAPABILITY_CEILING_VERSION: 2;
5
+ declare const SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY = "pi-subagents.capability-ceiling.v1";
6
+ type SubagentCapabilityCeiling = {
7
+ allowedTools?: readonly string[];
8
+ requiredTools?: readonly string[];
9
+ allowMcpTools?: boolean;
10
+ allowedExternalProfiles?: readonly string[];
11
+ denyExtensions?: boolean;
12
+ };
13
+ interface ResolvedSubagentCapabilityCeiling {
14
+ version: typeof SUBAGENT_CAPABILITY_CEILING_VERSION;
15
+ allowedTools?: string[];
16
+ requiredTools?: string[];
17
+ allowMcpTools?: boolean;
18
+ allowedExternalProfiles: string[];
19
+ denyExtensions: boolean;
20
+ sources: string[];
21
+ }
22
+ interface SubagentCapabilityAudit {
23
+ ceiling: ResolvedSubagentCapabilityCeiling;
24
+ requestedTools?: string[];
25
+ effectiveTools: string[];
26
+ removedTools: string[];
27
+ internalTools: string[];
28
+ extensionsDenied: boolean;
29
+ removedExtensionCount: number;
30
+ requestedMcpToolCount: number;
31
+ effectiveMcpTools: string[];
32
+ }
33
+ interface RegisterSubagentCapabilityCeilingOptions {
34
+ sessionId: string;
35
+ source: string;
36
+ ceiling: SubagentCapabilityCeiling;
37
+ }
38
+ interface SubagentCapabilityCeilingHandle {
39
+ update(ceiling: SubagentCapabilityCeiling): void;
40
+ dispose(): void;
41
+ }
42
+ declare function parseSubagentCapabilityCeiling(value: unknown, field?: string): ResolvedSubagentCapabilityCeiling;
43
+ declare function registerSubagentCapabilityCeiling(options: RegisterSubagentCapabilityCeilingOptions, bridge?: IGlobalStateBridge): SubagentCapabilityCeilingHandle;
44
+ declare function intersectSubagentCapabilityCeilings(...ceilings: Array<ResolvedSubagentCapabilityCeiling | undefined>): ResolvedSubagentCapabilityCeiling | undefined;
45
+ declare function resolveSubagentCapabilityCeiling(sessionId: string | undefined, inherited?: ResolvedSubagentCapabilityCeiling, bridge?: IGlobalStateBridge): ResolvedSubagentCapabilityCeiling | undefined;
46
+ declare function resolveCurrentSubagentCapabilityCeiling(sessionId: string | undefined, bridge?: IGlobalStateBridge): ResolvedSubagentCapabilityCeiling | undefined;
47
+ declare function encodeSubagentCapabilityCeiling(ceiling: ResolvedSubagentCapabilityCeiling | undefined): string | undefined;
48
+ declare function decodeSubagentCapabilityCeiling(value: string | undefined): ResolvedSubagentCapabilityCeiling | undefined;
49
+ //#endregion
50
+ export { RegisterSubagentCapabilityCeilingOptions, ResolvedSubagentCapabilityCeiling, SUBAGENT_CAPABILITY_CEILING_REGISTRY_KEY, SUBAGENT_CAPABILITY_CEILING_VERSION, SubagentCapabilityAudit, SubagentCapabilityCeiling, SubagentCapabilityCeilingHandle, decodeSubagentCapabilityCeiling, encodeSubagentCapabilityCeiling, intersectSubagentCapabilityCeilings, parseSubagentCapabilityCeiling, registerSubagentCapabilityCeiling, resolveCurrentSubagentCapabilityCeiling, resolveSubagentCapabilityCeiling };
51
+ //# sourceMappingURL=capabilityCeiling.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling.d.mts","names":[],"sources":["../../src/protocol/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{SUBAGENT_CAPABILITY_CEILING_ENV as t,init_env as n}from"../env.mjs";import{GlobalStateBridge as r,init_globalBridge as i}from"../container/globalBridge.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 r}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,n){return m(e,_(process.env[t]),n)}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/protocol/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 { GlobalStateBridge } from '../container/globalBridge.ts';\nimport { SUBAGENT_CAPABILITY_CEILING_ENV } from '../env.ts';\nimport type { IGlobalStateBridge } from '../types.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":"sQAkDA,SAAS,EAAoB,EAAwB,CACnD,IAAK,IAAM,KAAa,EAAO,CAC7B,IAAM,EAAO,EAAU,YAAY,EAAE,CACrC,GAAI,IAAS,IAAA,KAAc,GAAQ,GAAwB,IAAS,GAAc,MAAO,GAE3F,MAAO,GAqFT,SAAS,EAAU,EAAiD,CAClE,OAAO,GAAU,IAAI,EAGvB,SAAS,EAAS,EAAuC,CACvD,OAAO,EAAU,EAAO,CAAC,aACvB,MACM,IAAI,IACT,GAAa,CACZ,GAAI,aAAoB,IAAK,OAAO,EACpC,MAAU,MACR,wDAAwD,EAAyC,KAClG,EAEJ,CAGH,SAAS,EAAa,EAAgB,EAAuB,CAC3D,GACE,OAAO,GAAU,UACjB,CAAC,EAAM,MAAM,EACb,EAAoB,EAAM,EAC1B,EAAO,WAAW,EAAM,MAAM,CAAE,OAAO,CAAG,EAE1C,MAAU,MACR,8BAA8B,EAAM,gEAAgE,EAAe,gBACpH,CAEH,OAAO,EAAM,MAAM,CAGrB,SAAS,EAAiB,EAAuE,CAC/F,GAAI,CAAC,GAAW,OAAO,GAAY,UAAY,MAAM,QAAQ,EAAQ,CACnE,MAAU,MAAM,kDAAkD,CAEpE,IAAM,EAAkB,OAAO,OAAO,EAAS,eAAe,CACxD,EAAmB,OAAO,OAAO,EAAS,gBAAgB,CAC1D,EAAmB,OAAO,OAAO,EAAS,gBAAgB,CAC1D,EAA6B,OAAO,OAAO,EAAS,0BAA0B,CAC9E,EAAoB,OAAO,OAAO,EAAS,iBAAiB,CAClE,GAAI,CAAC,GAAmB,CAAC,GAAoB,CAAC,GAAoB,CAAC,GAA8B,CAAC,EAChG,MAAU,MACR,+HACD,CAEH,GAAI,GAAoB,OAAO,EAAQ,eAAkB,UACvD,MAAU,MAAM,gEAAgE,CAElF,GAAI,GAAqB,OAAO,EAAQ,gBAAmB,UACzD,MAAU,MAAM,iEAAiE,CAEnF,IAAM,GAAkB,EAAsC,IAA4C,CACxG,GAAI,CAAC,MAAM,QAAQ,EAAM,CAAE,MAAU,MAAM,8BAA8B,EAAM,sBAAsB,CACrG,GAAI,EAAM,OAAS,EACjB,MAAU,MAAM,8BAA8B,EAAM,qBAAqB,EAAkB,SAAS,CAEtG,MAAO,CACL,GAAG,IAAI,IACL,EAAM,IAAK,GAAS,CAClB,IAAM,EAAO,EAAa,EAAM,GAAG,EAAM,QAAQ,CACjD,GAAI,CAAC,EAAkB,KAAK,EAAK,CAC/B,MAAU,MAAM,8BAA8B,EAAM,UAAU,EAAK,IAAI,CAEzE,GAAI,EAAO,WAAW,EAAM,OAAO,CAAG,EACpC,MAAU,MACR,8BAA8B,EAAM,UAAU,EAAK,SAAS,EAAoB,eACjF,CAEH,OAAO,GACP,CACH,CACF,CAAC,MAAM,EAAM,IAAU,EAAK,cAAc,EAAM,CAAC,EAE9C,EAAe,EAAkB,EAAe,EAAQ,aAAc,eAAe,CAAG,IAAA,GACxF,EAAgB,EAAmB,EAAe,EAAQ,cAAe,gBAAgB,CAAG,IAAA,GAC9F,EAAoC,EAAE,CAC1C,GAAI,OAAO,OAAO,EAAS,0BAA0B,CAAE,CACrD,GAAI,CAAC,MAAM,QAAQ,EAAQ,wBAAwB,CACjD,MAAU,MAAM,yEAAyE,CAE3F,GAAI,EAAQ,wBAAwB,OAAS,EAC3C,MAAU,MACR,wEAAwE,EAA8B,SACvG,CAEH,EAA0B,CACxB,GAAG,IAAI,IACL,EAAQ,wBAAwB,IAAK,GAAY,CAC/C,IAAM,EAAO,EAAa,EAAS,gCAAgC,CACnE,GACE,CAAC,EAAyB,KAAK,EAAK,EACpC,EAAO,WAAW,EAAM,OAAO,CAAG,EAElC,MAAU,MAAM,6DAA6D,EAAK,IAAI,CAExF,OAAO,GACP,CACH,CACF,CAAC,MAAM,EAAM,IAAU,EAAK,cAAc,EAAM,CAAC,CAEpD,MAAO,CACL,QAAA,EACA,GAAI,EAAe,CAAE,eAAc,CAAG,EAAE,CACxC,GAAI,GAAe,OAAS,CAAE,gBAAe,CAAG,EAAE,CAClD,GAAI,EAAQ,gBAAkB,GAAO,CAAE,cAAe,GAAM,CAAG,EAAE,CACjE,0BACA,eAAgB,EAAQ,iBAAmB,GAC3C,QAAS,EAAE,CACZ,CAGH,SAAgB,EACd,EACA,EAAQ,qBAC2B,CACnC,GAAI,CAAC,GAAS,OAAO,GAAU,UAAY,MAAM,QAAQ,EAAM,CAC7D,MAAU,MAAM,WAAW,EAAM,uBAAuB,CAE1D,IAAM,EAAS,EACf,GAAI,EAAO,UAAA,EAAiD,MAAU,MAAM,WAAW,EAAM,WAAW,CACxG,IAAM,EAAa,EAAiB,EAAoC,CAClE,EAAU,EAAO,QACvB,GAAI,CAAC,MAAM,QAAQ,EAAQ,EAAI,EAAQ,KAAM,GAAW,OAAO,GAAW,SAAS,CACjF,MAAU,MAAM,WAAW,EAAM,yCAAyC,CAG5E,MADA,GAAW,QAAU,CAAC,GAAG,IAAI,IAAI,EAAQ,IAAK,GAAW,EAAa,EAAQ,GAAG,EAAM,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CACnG,EAGT,SAAgB,EACd,EACA,EACiC,CACjC,IAAM,EAAY,EAAa,EAAQ,UAAW,YAAY,CACxD,EAAS,EAAa,EAAQ,OAAQ,SAAS,CAC/C,EAAQ,OAAO,EAAO,CACtB,EAAQ,EAAS,EAAO,CAC1B,EAAU,EAAM,IAAI,EAAU,CAC7B,IACH,EAAU,IAAI,IACd,EAAM,IAAI,EAAW,EAAQ,EAE/B,IAAM,EAAgB,EAChB,EAAS,GAA6C,CAC1D,IAAM,EAAa,EAAiB,EAAQ,CAC5C,EAAW,QAAU,CAAC,EAAO,CAC7B,EAAc,IAAI,EAAO,CAAE,SAAQ,QAAS,EAAY,CAAC,EAE3D,EAAM,EAAQ,QAAQ,CACtB,IAAI,EAAW,GACf,MAAO,CACL,OAAO,EAAS,CACd,GAAI,EAAU,MAAU,MAAM,sDAAsD,CACpF,EAAM,EAAQ,EAEhB,SAAU,CACJ,IACJ,EAAW,GACX,EAAc,OAAO,EAAM,CACvB,EAAc,OAAS,GAAG,EAAM,OAAO,EAAU,GAExD,CAGH,SAAgB,EACd,GAAG,EAC4C,CAC/C,IAAM,EAAS,EAAS,OAAQ,GAA0D,IAAY,IAAA,GAAU,CAChH,GAAI,EAAO,SAAW,EAAG,OACzB,IAAM,EAAe,EAClB,OAAQ,GAAY,EAAQ,eAAiB,IAAA,GAAU,CACvD,IAAK,GAAY,IAAI,IAAI,EAAQ,aAAa,CAAC,CAC9C,EACA,EAAa,OAAS,IACxB,EAAe,CAAC,GAAG,EAAa,GAAI,CAAC,OAAQ,GAAS,EAAa,MAAO,GAAS,EAAK,IAAI,EAAK,CAAC,CAAC,CAAC,MAAM,EAE5G,IAAM,EAAgB,CAAC,GAAG,IAAI,IAAI,EAAO,QAAS,GAAY,EAAQ,eAAiB,EAAE,CAAC,CAAC,CAAC,CACzF,OAAQ,GAAS,CAAC,GAAgB,EAAa,SAAS,EAAK,CAAC,CAC9D,MAAM,EAAM,IAAU,EAAK,cAAc,EAAM,CAAC,CAC7C,EAAc,EAAO,IAAK,GAAY,IAAI,IAAI,EAAQ,wBAAwB,CAAC,CAC/E,EAA0B,CAAC,GAAG,EAAY,GAAI,CACjD,OAAQ,GAAY,EAAY,MAAO,GAAa,EAAS,IAAI,EAAQ,CAAC,CAAC,CAC3E,MAAM,EAAM,IAAU,EAAK,cAAc,EAAM,CAAC,CACnD,MAAO,CACL,QAAA,EACA,GAAI,EAAe,CAAE,eAAc,CAAG,EAAE,CACxC,GAAI,EAAc,OAAS,CAAE,gBAAe,CAAG,EAAE,CACjD,GAAI,EAAO,MAAO,GAAY,EAAQ,gBAAkB,GAAK,CAAG,CAAE,cAAe,GAAM,CAAG,EAAE,CAC5F,0BACA,eAAgB,EAAO,KAAM,GAAY,EAAQ,eAAe,CAChE,QAAS,CAAC,GAAG,IAAI,IAAI,EAAO,QAAS,GAAY,EAAQ,QAAQ,CAAC,CAAC,CAAC,MAAM,CAC3E,CAGH,SAAgB,EACd,EACA,EACA,EAC+C,CAC/C,IAAM,EAA8C,EAAE,CACtD,GAAI,EAAW,CACb,IAAM,EAAgB,EAAS,EAAO,CAAC,IAAI,EAAU,CACjD,GAAe,EAAO,KAAK,GAAG,MAAM,KAAK,EAAc,QAAQ,EAAG,CAAE,aAAc,EAAQ,CAAC,CAEjG,OAAO,EAAoC,EAAW,GAAG,EAAO,CAGlE,SAAgB,EACd,EACA,EAC+C,CAC/C,OAAO,EACL,EACA,EAAgC,QAAQ,IAAI,GAAiC,CAC7E,EACD,CAGH,SAAgB,EACd,EACoB,CACf,KACL,OAAO,EAAO,KAAK,KAAK,UAAU,EAAQ,CAAE,OAAO,CAAC,SAAS,YAAY,CAG3E,SAAgB,EACd,EAC+C,CAC/C,GAAI,IAAU,IAAA,IAAa,IAAU,GAAI,OACzC,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAO,KAAK,EAAO,YAAY,CAAC,SAAS,OAAO,CAAC,OAC9D,EAAO,CACd,MAAU,MAAM,yCAAyC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,CAEpH,GACE,CAAC,GACD,OAAO,GAAW,UAClB,MAAM,QAAQ,EAAO,EACpB,EAAiC,UAAA,EAElC,MAAU,MAAM,gDAAgD,CAElE,OAAO,EAA+B,EAAQ,+BAA+B,0CApWd,IACL,CAG/C,EAAsC,EACtC,EAA2C,qCAGlD,EAAiB,IACjB,EAAsB,IACtB,EAAoB,IACpB,EAAgC,GAChC,EAAkC,IAClC,EAA2B,kCAC3B,EAAoB,sBACpB,EAAuB,GACvB,EAAc,IA6DP,EAAb,KAA2C,CACzC,SAA4B,IAAI,IAEhC,SAAS,EAAwB,EAA0B,CACzD,IAAM,EAAU,EAAiB,CAC/B,GAAI,EAAO,aAAe,CAAE,aAAc,EAAO,aAAc,CAAG,EAAE,CACpE,GAAI,EAAO,cAAgB,CAAE,cAAe,EAAO,cAAe,CAAG,EAAE,CACvE,GAAI,EAAO,gBAAkB,GAAO,CAAE,cAAe,GAAM,CAAG,EAAE,CAChE,GAAI,EAAO,wBAA0B,CAAE,wBAAyB,EAAO,wBAAyB,CAAG,EAAE,CACrG,eAAgB,EAAO,iBAAmB,GAC3C,CAAC,CACF,EAAQ,QAAU,CAAC,EAAO,MAAM,CAChC,KAAK,SAAS,IAAI,EAAO,MAAO,CAAE,aAAY,UAAS,CAAC,CAG1D,OAAO,EAAwB,EAA0B,CACnD,KAAK,SAAS,IAAI,EAAO,MAAM,EAAE,aAAe,GACpD,KAAK,SAAS,EAAQ,EAAW,CAGnC,OAAO,EAAe,EAA0B,CAC1C,KAAK,SAAS,IAAI,EAAM,EAAE,aAAe,GAAY,KAAK,SAAS,OAAO,EAAM,CAGtF,OAAc,CACZ,KAAK,SAAS,OAAO,CAGvB,QAAQ,EAA8F,CACpG,OAAO,EAAoC,EAAW,GAAG,CAAC,GAAG,KAAK,SAAS,QAAQ,CAAC,CAAC,KAAK,CAAE,aAAc,EAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ exports.SUBAGENT_DELEGATION_CANCEL_EVENT=`prompt-template:subagent:cancel`,exports.SUBAGENT_DELEGATION_PROTOCOL_VERSION=1,exports.SUBAGENT_DELEGATION_REQUEST_EVENT=`prompt-template:subagent:request`,exports.SUBAGENT_DELEGATION_RESPONSE_EVENT=`prompt-template:subagent:response`,exports.SUBAGENT_DELEGATION_STARTED_EVENT=`prompt-template:subagent:started`,exports.SUBAGENT_DELEGATION_UPDATE_EVENT=`prompt-template:subagent:update`,exports.SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION=2;
2
+ //# sourceMappingURL=delegation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.cjs","names":[],"sources":["../../src/protocol/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":""}