@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.5

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 (507) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +39 -13
  3. package/dist/admin/admin.controller.js +33 -17
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +51 -22
  19. package/dist/agents/agents.service.js +172 -70
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/org-templates.d.ts +176 -0
  27. package/dist/agents/org-templates.js +827 -0
  28. package/dist/agents/pending-connector-requests.d.ts +77 -0
  29. package/dist/agents/pending-connector-requests.js +215 -0
  30. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  31. package/dist/agents/pending-connectors.controller.js +91 -0
  32. package/dist/agents/pending-connectors.service.d.ts +62 -0
  33. package/dist/agents/pending-connectors.service.js +282 -0
  34. package/dist/agents/templates.controller.d.ts +86 -5
  35. package/dist/agents/templates.controller.js +171 -7
  36. package/dist/agents/templates.d.ts +127 -23
  37. package/dist/agents/templates.js +475 -52
  38. package/dist/background/background.module.js +8 -1
  39. package/dist/background/finish.d.ts +3 -2
  40. package/dist/background/launch-lock.d.ts +4 -3
  41. package/dist/background/launch-lock.js +4 -3
  42. package/dist/background/poll.job.d.ts +9 -6
  43. package/dist/background/poll.job.js +30 -22
  44. package/dist/background/session.d.ts +13 -2
  45. package/dist/background/session.js +13 -0
  46. package/dist/background/stop.d.ts +12 -6
  47. package/dist/background/stop.js +57 -39
  48. package/dist/background/store.d.ts +18 -6
  49. package/dist/background/store.js +12 -6
  50. package/dist/background/tasks.service.d.ts +15 -5
  51. package/dist/background/tasks.service.js +42 -17
  52. package/dist/background/wake-rules.d.ts +27 -18
  53. package/dist/background/wake-rules.js +52 -22
  54. package/dist/background/wake.d.ts +13 -11
  55. package/dist/background/wake.js +20 -14
  56. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  57. package/dist/catalog/admin-catalog.controller.js +213 -42
  58. package/dist/catalog/catalog-content.d.ts +58 -32
  59. package/dist/catalog/catalog-content.js +34 -8
  60. package/dist/catalog/catalog-import.module.d.ts +7 -0
  61. package/dist/catalog/catalog-import.module.js +60 -0
  62. package/dist/catalog/catalog-items.d.ts +111 -7
  63. package/dist/catalog/catalog-items.js +279 -13
  64. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  65. package/dist/catalog/catalog-scope.service.js +1116 -0
  66. package/dist/catalog/catalog.module.d.ts +7 -9
  67. package/dist/catalog/catalog.module.js +41 -31
  68. package/dist/catalog/catalog.service.d.ts +101 -29
  69. package/dist/catalog/catalog.service.js +104 -106
  70. package/dist/catalog/cli.d.ts +11 -1
  71. package/dist/catalog/cli.js +26 -1
  72. package/dist/catalog/component-promotion.d.ts +96 -0
  73. package/dist/catalog/component-promotion.js +395 -0
  74. package/dist/catalog/component-scope.controller.d.ts +152 -0
  75. package/dist/catalog/component-scope.controller.js +287 -0
  76. package/dist/catalog/component-scope.service.d.ts +303 -0
  77. package/dist/catalog/component-scope.service.js +936 -0
  78. package/dist/catalog/component-state.d.ts +174 -0
  79. package/dist/catalog/component-state.js +437 -0
  80. package/dist/catalog/job-ids.d.ts +30 -0
  81. package/dist/catalog/job-ids.js +25 -0
  82. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  83. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  84. package/dist/catalog/marketplaces.controller.js +56 -7
  85. package/dist/catalog/marketplaces.service.d.ts +54 -14
  86. package/dist/catalog/marketplaces.service.js +71 -22
  87. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  88. package/dist/catalog/org-catalog.controller.js +181 -65
  89. package/dist/catalog/org-catalog.service.d.ts +65 -33
  90. package/dist/catalog/org-catalog.service.js +324 -157
  91. package/dist/catalog/org-extension-switch.d.ts +41 -0
  92. package/dist/catalog/org-extension-switch.js +115 -0
  93. package/dist/catalog/org-extension.controller.d.ts +119 -0
  94. package/dist/catalog/org-extension.controller.js +266 -0
  95. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  96. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  97. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  98. package/dist/catalog/org-plugin-uploads.js +116 -0
  99. package/dist/catalog/owned-items.d.ts +184 -0
  100. package/dist/catalog/owned-items.js +789 -0
  101. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  102. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  103. package/dist/catalog/ownership.d.ts +172 -0
  104. package/dist/catalog/ownership.js +326 -0
  105. package/dist/catalog/platform-components.d.ts +221 -0
  106. package/dist/catalog/platform-components.js +761 -0
  107. package/dist/catalog/platform-migration.d.ts +115 -0
  108. package/dist/catalog/platform-migration.js +582 -0
  109. package/dist/catalog/plugin-import.d.ts +178 -34
  110. package/dist/catalog/plugin-import.js +622 -82
  111. package/dist/catalog/plugin-install.d.ts +185 -41
  112. package/dist/catalog/plugin-install.js +758 -126
  113. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  114. package/dist/catalog/plugin-upgrade.js +1147 -1136
  115. package/dist/catalog/request-rules.d.ts +65 -0
  116. package/dist/catalog/request-rules.js +217 -0
  117. package/dist/catalog/requests.service.d.ts +193 -118
  118. package/dist/catalog/requests.service.js +526 -343
  119. package/dist/catalog/reserved-names.d.ts +8 -0
  120. package/dist/catalog/reserved-names.js +42 -0
  121. package/dist/catalog/scope-orgs.d.ts +21 -0
  122. package/dist/catalog/scope-orgs.js +67 -0
  123. package/dist/catalog/scope-state.d.ts +35 -0
  124. package/dist/catalog/scope-state.js +87 -0
  125. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  126. package/dist/catalog/scope-sync-workers.js +29 -0
  127. package/dist/catalog/scope-sync.d.ts +176 -0
  128. package/dist/catalog/scope-sync.js +576 -0
  129. package/dist/catalog/scope.d.ts +42 -0
  130. package/dist/catalog/scope.js +42 -0
  131. package/dist/catalog/unshare.d.ts +22 -0
  132. package/dist/catalog/unshare.js +118 -0
  133. package/dist/channels/actions.js +1 -0
  134. package/dist/channels/cards.js +20 -2
  135. package/dist/channels/channels.module.js +2 -0
  136. package/dist/channels/inbound.d.ts +9 -1
  137. package/dist/channels/inbound.js +67 -5
  138. package/dist/channels/phrases.d.ts +35 -0
  139. package/dist/channels/phrases.js +29 -0
  140. package/dist/config/docs.js +3 -1
  141. package/dist/config/schema.d.ts +6 -2
  142. package/dist/config/schema.js +46 -22
  143. package/dist/conversations/access.d.ts +6 -4
  144. package/dist/conversations/access.js +27 -5
  145. package/dist/conversations/agent-tree.d.ts +46 -0
  146. package/dist/conversations/agent-tree.js +92 -0
  147. package/dist/conversations/conversations.controller.d.ts +43 -18
  148. package/dist/conversations/conversations.controller.js +79 -38
  149. package/dist/conversations/conversations.module.d.ts +1 -1
  150. package/dist/conversations/conversations.module.js +7 -7
  151. package/dist/conversations/conversations.service.d.ts +69 -12
  152. package/dist/conversations/conversations.service.js +106 -27
  153. package/dist/conversations/environment-status.d.ts +24 -0
  154. package/dist/conversations/environment-status.js +71 -0
  155. package/dist/conversations/event-log.d.ts +20 -5
  156. package/dist/conversations/event-log.js +60 -0
  157. package/dist/conversations/events.d.ts +84 -2
  158. package/dist/conversations/events.js +91 -17
  159. package/dist/conversations/queue.service.d.ts +1 -1
  160. package/dist/conversations/queue.service.js +5 -0
  161. package/dist/conversations/titles.d.ts +5 -3
  162. package/dist/conversations/titles.js +21 -8
  163. package/dist/conversations/tree.d.ts +17 -0
  164. package/dist/conversations/tree.js +42 -0
  165. package/dist/ctx/create-ctx.d.ts +5 -0
  166. package/dist/ctx/create-ctx.js +15 -5
  167. package/dist/db/kernel-schema.d.ts +362 -18
  168. package/dist/environments/access.d.ts +41 -0
  169. package/dist/environments/access.js +77 -0
  170. package/dist/environments/conversation-environments.d.ts +61 -0
  171. package/dist/environments/conversation-environments.js +170 -0
  172. package/dist/environments/dto.d.ts +25 -0
  173. package/dist/environments/dto.js +12 -0
  174. package/dist/environments/environments.controller.d.ts +33 -0
  175. package/dist/environments/environments.controller.js +110 -0
  176. package/dist/environments/environments.module.d.ts +8 -0
  177. package/dist/environments/environments.module.js +27 -0
  178. package/dist/environments/environments.service.d.ts +153 -0
  179. package/dist/environments/environments.service.js +541 -0
  180. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  181. package/dist/environments/legacy-cleanup.job.js +141 -0
  182. package/dist/errors.d.ts +82 -2
  183. package/dist/errors.js +82 -2
  184. package/dist/evals/reconstruct.d.ts +18 -9
  185. package/dist/evals/reconstruct.js +26 -7
  186. package/dist/evals/run-replay.d.ts +4 -2
  187. package/dist/evals/run-replay.js +16 -4
  188. package/dist/evals/step-replay.d.ts +2 -5
  189. package/dist/evals/step-replay.js +1 -1
  190. package/dist/evals/trajectory.service.d.ts +8 -3
  191. package/dist/evals/trajectory.service.js +26 -14
  192. package/dist/evals/worker.d.ts +5 -5
  193. package/dist/evals/worker.js +9 -3
  194. package/dist/extensions/admin-ops.d.ts +36 -10
  195. package/dist/extensions/admin-ops.js +65 -42
  196. package/dist/extensions/admin-view.d.ts +37 -10
  197. package/dist/extensions/admin-view.js +103 -20
  198. package/dist/extensions/bootstrap.d.ts +17 -4
  199. package/dist/extensions/bootstrap.js +70 -9
  200. package/dist/extensions/cli.d.ts +12 -0
  201. package/dist/extensions/cli.js +11 -2
  202. package/dist/extensions/deployment-config.d.ts +28 -5
  203. package/dist/extensions/deployment-config.js +48 -7
  204. package/dist/extensions/effective-config.d.ts +127 -0
  205. package/dist/extensions/effective-config.js +368 -0
  206. package/dist/extensions/extensions.module.js +8 -2
  207. package/dist/extensions/hooks.d.ts +37 -4
  208. package/dist/extensions/hooks.js +82 -16
  209. package/dist/extensions/host.d.ts +19 -1
  210. package/dist/extensions/host.js +30 -7
  211. package/dist/extensions/installs.d.ts +20 -8
  212. package/dist/extensions/installs.js +37 -15
  213. package/dist/extensions/org-config.d.ts +75 -6
  214. package/dist/extensions/org-config.js +184 -32
  215. package/dist/extensions/org-levels.d.ts +37 -0
  216. package/dist/extensions/org-levels.js +71 -0
  217. package/dist/extensions/org-overrides.d.ts +151 -0
  218. package/dist/extensions/org-overrides.js +524 -0
  219. package/dist/extensions/permission-view.d.ts +16 -4
  220. package/dist/extensions/permission-view.js +4 -4
  221. package/dist/extensions/plugin-items.d.ts +21 -0
  222. package/dist/extensions/plugin-items.js +42 -0
  223. package/dist/extensions/point-defaults.d.ts +12 -5
  224. package/dist/extensions/point-defaults.js +37 -9
  225. package/dist/extensions/resolve.d.ts +5 -1
  226. package/dist/extensions/resolve.js +15 -2
  227. package/dist/files/previewers.d.ts +8 -1
  228. package/dist/files/previewers.js +35 -6
  229. package/dist/http/api.module.js +23 -3
  230. package/dist/http/app.d.ts +11 -2
  231. package/dist/http/app.js +31 -5
  232. package/dist/identity/accounts.d.ts +29 -29
  233. package/dist/identity/accounts.js +47 -47
  234. package/dist/identity/audit.d.ts +2 -1
  235. package/dist/identity/auth.guard.d.ts +13 -5
  236. package/dist/identity/auth.guard.js +26 -9
  237. package/dist/identity/identity.module.d.ts +1 -1
  238. package/dist/identity/identity.module.js +4 -4
  239. package/dist/identity/me.controller.js +1 -1
  240. package/dist/identity/principal.d.ts +3 -3
  241. package/dist/identity/principal.js +3 -3
  242. package/dist/identity/settings.d.ts +22 -11
  243. package/dist/identity/settings.js +53 -18
  244. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  245. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  246. package/dist/inbox/inbox.module.d.ts +4 -1
  247. package/dist/inbox/inbox.module.js +7 -3
  248. package/dist/inbox/inbox.service.d.ts +62 -3
  249. package/dist/inbox/inbox.service.js +74 -4
  250. package/dist/inbox/org-notices.d.ts +63 -0
  251. package/dist/inbox/org-notices.js +91 -0
  252. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  253. package/dist/inbox/platform-inbox.controller.js +58 -0
  254. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  255. package/dist/inbox/platform-inbox.service.js +263 -0
  256. package/dist/inbox/platform-notices.d.ts +19 -0
  257. package/dist/inbox/platform-notices.js +9 -0
  258. package/dist/index.d.ts +1 -1
  259. package/dist/index.js +1 -1
  260. package/dist/infra/cli/kernel-cli.module.js +9 -1
  261. package/dist/infra/config/kernel-config.service.js +21 -1
  262. package/dist/infra/database/xact-lock.d.ts +1 -1
  263. package/dist/infra/database/xact-lock.js +1 -1
  264. package/dist/infra/events/kernel-events.d.ts +11 -2
  265. package/dist/infra/queue/add-job-once.d.ts +14 -0
  266. package/dist/infra/queue/add-job-once.js +16 -0
  267. package/dist/kernel.module.js +6 -0
  268. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  269. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  270. package/dist/models/prices.d.ts +5 -5
  271. package/dist/models/prices.js +4 -4
  272. package/dist/models/purposes.controller.d.ts +6 -4
  273. package/dist/models/purposes.controller.js +13 -7
  274. package/dist/models/purposes.d.ts +20 -9
  275. package/dist/models/purposes.js +17 -8
  276. package/dist/orgs/directory-sync.d.ts +14 -5
  277. package/dist/orgs/directory-sync.js +41 -17
  278. package/dist/orgs/offboarding.d.ts +9 -7
  279. package/dist/orgs/offboarding.js +28 -17
  280. package/dist/orgs/org-lock.d.ts +5 -0
  281. package/dist/orgs/org-lock.js +13 -0
  282. package/dist/orgs/org.guard.d.ts +10 -0
  283. package/dist/orgs/org.guard.js +43 -32
  284. package/dist/orgs/orgs.module.js +3 -0
  285. package/dist/orgs/orgs.service.d.ts +20 -7
  286. package/dist/orgs/orgs.service.js +32 -12
  287. package/dist/orgs/roles.d.ts +1 -1
  288. package/dist/orgs/roles.js +5 -1
  289. package/dist/orgs/settings.controller.d.ts +1 -1
  290. package/dist/orgs/settings.service.d.ts +15 -3
  291. package/dist/orgs/settings.service.js +6 -2
  292. package/dist/overrides.d.ts +3 -0
  293. package/dist/overrides.js +2 -0
  294. package/dist/platform/actor.d.ts +48 -0
  295. package/dist/platform/actor.js +100 -0
  296. package/dist/platform/agent-docs.d.ts +18 -0
  297. package/dist/platform/agent-docs.js +59 -0
  298. package/dist/platform/availability.d.ts +14 -0
  299. package/dist/platform/availability.js +43 -0
  300. package/dist/platform/errors.d.ts +11 -0
  301. package/dist/platform/errors.js +26 -0
  302. package/dist/platform/exclusions.d.ts +12 -0
  303. package/dist/platform/exclusions.js +1387 -0
  304. package/dist/platform/method.d.ts +6 -0
  305. package/dist/platform/method.js +15 -0
  306. package/dist/platform/operation.d.ts +92 -0
  307. package/dist/platform/operation.js +35 -0
  308. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  309. package/dist/platform/ops/agent-templates.ops.js +92 -0
  310. package/dist/platform/ops/agents.ops.d.ts +19 -0
  311. package/dist/platform/ops/agents.ops.js +294 -0
  312. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  313. package/dist/platform/ops/connectors.ops.js +126 -0
  314. package/dist/platform/ops/errors.d.ts +11 -0
  315. package/dist/platform/ops/errors.js +22 -0
  316. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  317. package/dist/platform/ops/extensions.ops.js +116 -0
  318. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  319. package/dist/platform/ops/marketplaces.ops.js +157 -0
  320. package/dist/platform/ops/paging.d.ts +14 -0
  321. package/dist/platform/ops/paging.js +20 -0
  322. package/dist/platform/ops/platform.ops.d.ts +23 -0
  323. package/dist/platform/ops/platform.ops.js +158 -0
  324. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  325. package/dist/platform/ops/plugins.ops.js +377 -0
  326. package/dist/platform/ops/requests.ops.d.ts +14 -0
  327. package/dist/platform/ops/requests.ops.js +153 -0
  328. package/dist/platform/ops/role.d.ts +4 -0
  329. package/dist/platform/ops/role.js +10 -0
  330. package/dist/platform/ops/skills.ops.d.ts +13 -0
  331. package/dist/platform/ops/skills.ops.js +98 -0
  332. package/dist/platform/ops/summary.d.ts +10 -0
  333. package/dist/platform/ops/summary.js +18 -0
  334. package/dist/platform/platform-ops.module.d.ts +7 -0
  335. package/dist/platform/platform-ops.module.js +55 -0
  336. package/dist/platform/platform.module.d.ts +8 -0
  337. package/dist/platform/platform.module.js +25 -0
  338. package/dist/platform/redact-orgs.d.ts +7 -0
  339. package/dist/platform/redact-orgs.js +52 -0
  340. package/dist/platform/registry.d.ts +30 -0
  341. package/dist/platform/registry.js +111 -0
  342. package/dist/roles/worker-role.d.ts +6 -4
  343. package/dist/roles/worker-role.js +14 -7
  344. package/dist/roles/worker.module.d.ts +1 -1
  345. package/dist/roles/worker.module.js +9 -1
  346. package/dist/runtime/context/build.d.ts +6 -4
  347. package/dist/runtime/context/build.js +26 -7
  348. package/dist/runtime/context/claude-tools.d.ts +2 -1
  349. package/dist/runtime/context/claude-tools.js +5 -4
  350. package/dist/runtime/context/compaction.js +9 -0
  351. package/dist/runtime/context/reminders.d.ts +2 -0
  352. package/dist/runtime/context/reminders.js +2 -0
  353. package/dist/runtime/context/skills.js +9 -2
  354. package/dist/runtime/context/tool-changes.d.ts +27 -0
  355. package/dist/runtime/context/tool-changes.js +60 -0
  356. package/dist/runtime/hook-calls.js +2 -0
  357. package/dist/runtime/langgraph-loop.d.ts +3 -1
  358. package/dist/runtime/langgraph-loop.js +35 -17
  359. package/dist/runtime/loop.d.ts +32 -4
  360. package/dist/runtime/maintenance.d.ts +7 -4
  361. package/dist/runtime/maintenance.js +23 -8
  362. package/dist/runtime/model-call.d.ts +30 -8
  363. package/dist/runtime/model-call.js +69 -19
  364. package/dist/runtime/run-control.d.ts +11 -1
  365. package/dist/runtime/run-control.js +12 -0
  366. package/dist/runtime/run-drafts.d.ts +85 -0
  367. package/dist/runtime/run-drafts.js +230 -0
  368. package/dist/runtime/run-jobs.d.ts +3 -5
  369. package/dist/runtime/run-jobs.js +3 -7
  370. package/dist/runtime/run-queue.d.ts +37 -3
  371. package/dist/runtime/run-queue.js +188 -11
  372. package/dist/runtime/run-worker.d.ts +11 -5
  373. package/dist/runtime/run-worker.js +54 -31
  374. package/dist/runtime/runtime.module.js +3 -0
  375. package/dist/runtime/step-log.d.ts +9 -4
  376. package/dist/runtime/step-log.js +8 -5
  377. package/dist/runtime/stream.controller.d.ts +23 -1
  378. package/dist/runtime/stream.controller.js +60 -3
  379. package/dist/runtime/stream.d.ts +4 -1
  380. package/dist/runtime/stream.js +27 -3
  381. package/dist/runtime/subagents/child.d.ts +55 -7
  382. package/dist/runtime/subagents/child.js +105 -7
  383. package/dist/runtime/subagents/definition.d.ts +12 -3
  384. package/dist/runtime/subagents/definition.js +43 -29
  385. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  386. package/dist/runtime/subagents/deliveries.js +228 -0
  387. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  388. package/dist/runtime/subagents/dispatch.js +212 -141
  389. package/dist/runtime/subagents/limits.d.ts +24 -5
  390. package/dist/runtime/subagents/limits.js +40 -6
  391. package/dist/runtime/subagents/messages.d.ts +95 -0
  392. package/dist/runtime/subagents/messages.js +328 -0
  393. package/dist/runtime/subagents/preamble.d.ts +4 -4
  394. package/dist/runtime/subagents/preamble.js +9 -7
  395. package/dist/runtime/subagents/progress.d.ts +8 -6
  396. package/dist/runtime/subagents/progress.js +11 -6
  397. package/dist/runtime/subagents/render.d.ts +30 -0
  398. package/dist/runtime/subagents/render.js +53 -0
  399. package/dist/runtime/subagents/roster.d.ts +24 -7
  400. package/dist/runtime/subagents/roster.js +47 -11
  401. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  402. package/dist/runtime/subagents/skill-fork.js +8 -4
  403. package/dist/runtime/subagents/status.d.ts +14 -0
  404. package/dist/runtime/subagents/status.js +23 -0
  405. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  406. package/dist/runtime/subagents/subagents.service.js +11 -6
  407. package/dist/runtime/usage-report.js +17 -12
  408. package/dist/runtime/waits.d.ts +140 -37
  409. package/dist/runtime/waits.js +394 -106
  410. package/dist/sandbox/jobs.d.ts +40 -13
  411. package/dist/sandbox/jobs.js +57 -20
  412. package/dist/sandbox/leases.d.ts +37 -54
  413. package/dist/sandbox/leases.js +71 -115
  414. package/dist/sandbox/providers.d.ts +2 -2
  415. package/dist/sandbox/providers.js +1 -1
  416. package/dist/sandbox/sandbox.module.d.ts +3 -2
  417. package/dist/sandbox/sandbox.module.js +4 -3
  418. package/dist/sandbox/sandbox.service.d.ts +229 -134
  419. package/dist/sandbox/sandbox.service.js +630 -409
  420. package/dist/skills/catalog.d.ts +3 -2
  421. package/dist/skills/catalog.js +21 -43
  422. package/dist/skills/changes.controller.d.ts +7 -0
  423. package/dist/skills/changes.controller.js +19 -1
  424. package/dist/skills/invoke.js +8 -3
  425. package/dist/skills/package.d.ts +20 -1
  426. package/dist/skills/package.js +28 -1
  427. package/dist/skills/skills.controller.d.ts +39 -4
  428. package/dist/skills/skills.controller.js +88 -10
  429. package/dist/skills/skills.module.js +10 -1
  430. package/dist/skills/skills.service.d.ts +106 -26
  431. package/dist/skills/skills.service.js +421 -75
  432. package/dist/skills/usable.d.ts +81 -0
  433. package/dist/skills/usable.js +379 -0
  434. package/dist/tools/approvals.service.d.ts +20 -2
  435. package/dist/tools/approvals.service.js +23 -4
  436. package/dist/tools/builtin-names.d.ts +21 -5
  437. package/dist/tools/builtin-names.js +30 -5
  438. package/dist/tools/builtins/agent.d.ts +23 -21
  439. package/dist/tools/builtins/agent.js +62 -55
  440. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  441. package/dist/tools/builtins/builtin-tools.js +37 -12
  442. package/dist/tools/builtins/handback.d.ts +28 -0
  443. package/dist/tools/builtins/handback.js +53 -0
  444. package/dist/tools/builtins/platform.d.ts +34 -0
  445. package/dist/tools/builtins/platform.js +362 -0
  446. package/dist/tools/builtins/sandbox/bash.js +13 -3
  447. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  448. package/dist/tools/builtins/sandbox/common.js +80 -45
  449. package/dist/tools/builtins/sandbox/edit.js +2 -2
  450. package/dist/tools/builtins/sandbox/glob.js +2 -2
  451. package/dist/tools/builtins/sandbox/grep.js +2 -4
  452. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  453. package/dist/tools/builtins/sandbox/index.js +1 -1
  454. package/dist/tools/builtins/sandbox/read.js +1 -1
  455. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  456. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  457. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  458. package/dist/tools/builtins/sandbox/write.js +2 -2
  459. package/dist/tools/builtins/send-message.d.ts +56 -0
  460. package/dist/tools/builtins/send-message.js +100 -0
  461. package/dist/tools/builtins/skill-load.d.ts +22 -14
  462. package/dist/tools/builtins/skill-load.js +86 -57
  463. package/dist/tools/builtins/skill-write.js +1 -1
  464. package/dist/tools/builtins/web/extract.js +5 -1
  465. package/dist/tools/builtins/web/fetch.js +1 -0
  466. package/dist/tools/builtins/web/search.js +1 -0
  467. package/dist/tools/connectors.controller.d.ts +10 -0
  468. package/dist/tools/connectors.controller.js +12 -0
  469. package/dist/tools/connectors.service.d.ts +46 -5
  470. package/dist/tools/connectors.service.js +94 -15
  471. package/dist/tools/extension-tools.controller.d.ts +14 -0
  472. package/dist/tools/extension-tools.controller.js +37 -0
  473. package/dist/tools/info.d.ts +42 -1
  474. package/dist/tools/info.js +64 -1
  475. package/dist/tools/org-tool-switches.d.ts +74 -0
  476. package/dist/tools/org-tool-switches.js +184 -0
  477. package/dist/tools/pipeline.d.ts +46 -40
  478. package/dist/tools/pipeline.js +187 -364
  479. package/dist/tools/policy.d.ts +1 -1
  480. package/dist/tools/policy.js +36 -16
  481. package/dist/tools/registry.d.ts +98 -5
  482. package/dist/tools/registry.js +87 -9
  483. package/dist/tools/tools.module.js +12 -2
  484. package/dist/ui/views.d.ts +2 -1
  485. package/dist/ui/views.js +17 -3
  486. package/package.json +3 -3
  487. package/src/migrations/0074_subagent_tree.sql +50 -0
  488. package/src/migrations/0075_plugin_scope.sql +61 -0
  489. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  490. package/src/migrations/0077_scope_requests.sql +52 -0
  491. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  492. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  493. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  494. package/src/migrations/0081_platform_components.sql +129 -0
  495. package/src/migrations/0082_platform_migration.sql +33 -0
  496. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  497. package/src/migrations/0084_org_owned_items.sql +85 -0
  498. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  499. package/src/migrations/0086_org_layering.sql +30 -0
  500. package/src/migrations/0087_approval_summary.sql +6 -0
  501. package/src/migrations/0088_environments.sql +80 -0
  502. package/dist/catalog/upgrade-targets.d.ts +0 -56
  503. package/dist/catalog/upgrade-targets.js +0 -90
  504. package/dist/conversations/sandbox-status.d.ts +0 -24
  505. package/dist/conversations/sandbox-status.js +0 -52
  506. package/dist/extensions/org-config.controller.d.ts +0 -32
  507. package/dist/extensions/org-config.controller.js +0 -70
@@ -11,13 +11,17 @@ import { isSandboxGoneError } from "@capybara-hq/plugin-sdk";
11
11
  import { Inject, Injectable } from "@nestjs/common";
12
12
  import { ConversationAccess } from "../conversations/access.js";
13
13
  import { EventLog } from "../conversations/event-log.js";
14
+ import { conversationTree } from "../conversations/tree.js";
15
+ import { ConversationEnvironments } from "../environments/conversation-environments.js";
14
16
  import { ApiError } from "../errors.js";
15
17
  import { audit } from "../identity/audit.js";
16
18
  import { KernelDb } from "../infra/database/kernel-db.js";
19
+ import { rootConversationOf } from "../runtime/subagents/child.js";
17
20
  import { SandboxService } from "../sandbox/sandbox.service.js";
18
21
  import { UUID_RE } from "../ui/registry.js";
19
22
  import { finishedEventKey } from "./finish.js";
20
23
  import { TASK_ID_RE, TASKS_DIR } from "./launch.js";
24
+ import { actingAs } from "./session.js";
21
25
  import { BackgroundTaskStopper } from "./stop.js";
22
26
  import { BackgroundTaskStore } from "./store.js";
23
27
  /** The most bytes of output one read returns. */
@@ -29,7 +33,7 @@ const taskNotFound = () => new ApiError("background_task.not_found", "Background
29
33
  /**
30
34
  * The HTTP side of background tasks (spec 2026-11-05-background-bash-design §5): the tasks of a
31
35
  * conversation and of its sub-agents, stopping one, reading its output. A task is reachable
32
- * through the conversation that owns it or through that conversation's parent, and only by a
36
+ * through the conversation that owns it or through any conversation above it, and only by a
33
37
  * person who may see the conversation (`ConversationAccess`, the rule of `GET :id`, which is also
34
38
  * what `POST :id/abort` checks: the owner).
35
39
  */
@@ -40,28 +44,27 @@ let BackgroundTasks = class BackgroundTasks {
40
44
  sandbox;
41
45
  eventLog;
42
46
  db;
43
- constructor(access, store, stopper, sandbox, eventLog, db) {
47
+ environments;
48
+ constructor(access, store, stopper, sandbox, eventLog, db, environments) {
44
49
  this.access = access;
45
50
  this.store = store;
46
51
  this.stopper = stopper;
47
52
  this.sandbox = sandbox;
48
53
  this.eventLog = eventLog;
49
54
  this.db = db;
55
+ this.environments = environments;
50
56
  }
51
- /** The conversation and its sub-agents' conversations; `conversation.not_found` when not visible. */
57
+ /**
58
+ * The conversation and every sub-agent conversation below it (grandchildren too: their tasks run
59
+ * in the root's sandbox, agent map spec §6); `conversation.not_found` when not visible.
60
+ */
52
61
  async scope(orgId, conversationId, accountId) {
53
62
  if (!UUID_RE.test(conversationId) ||
54
63
  !(await this.access.isAccessible(orgId, conversationId, accountId))) {
55
64
  throw conversationNotFound();
56
65
  }
57
- const children = await this.db
58
- .selectFrom("conversations")
59
- .select("id")
60
- .where("org_id", "=", orgId)
61
- .where("parent_conversation_id", "=", conversationId)
62
- .where("kind", "=", "subagent")
63
- .execute();
64
- return [conversationId, ...children.map((c) => c.id)];
66
+ // the conversation is the org's (isAccessible), and so is every sub-agent conversation below it
67
+ return (await conversationTree(this.db.db, conversationId)).map((c) => c.id);
65
68
  }
66
69
  view(task, conversationId) {
67
70
  return {
@@ -111,18 +114,39 @@ let BackgroundTasks = class BackgroundTasks {
111
114
  return this.view(after, conversationId);
112
115
  }
113
116
  /**
114
- * The end of the task's output, at most `tail` bytes. Read live when the task's sandbox instance
115
- * runs (never resuming a suspended sandbox); a finished task whose sandbox does not run answers
117
+ * Whether the task's environment may still be used by its conversation's owner (the access
118
+ * re-check every sandbox tool call makes); when it may not, the live read is skipped.
119
+ */
120
+ async environmentUsable(orgId, taskConversationId) {
121
+ try {
122
+ await this.environments.forTool(orgId, await rootConversationOf(this.db.db, taskConversationId));
123
+ return true;
124
+ }
125
+ catch (e) {
126
+ if (e instanceof ApiError)
127
+ return false;
128
+ throw e;
129
+ }
130
+ }
131
+ /**
132
+ * The end of the task's output, at most `tail` bytes. Read live when the task's environment
133
+ * instance runs (never resuming a suspended one); a finished task whose sandbox does not run answers
116
134
  * with the last lines its finished event kept. Anything else is
117
135
  * `background_task.output_unavailable` (409).
118
136
  */
119
137
  async output(orgId, conversationId, accountId, taskId, tail) {
120
138
  const task = await this.owned(orgId, conversationId, accountId, taskId);
121
- if (task.sid !== null && task.sandboxCreatedAt !== null && this.sandbox.available) {
139
+ if (task.sid !== null &&
140
+ task.sandboxCreatedAt !== null &&
141
+ task.environmentId !== null &&
142
+ this.sandbox.available &&
143
+ (await this.environmentUsable(orgId, task.conversationId))) {
122
144
  const createdAt = task.sandboxCreatedAt;
145
+ // the person reading it acts in the task's conversation
146
+ const actor = { accountId, conversationId: task.conversationId };
123
147
  try {
124
- const r = await this.sandbox.ifRunning(task.sandboxConversationId, { createdAt }, async (p, h, signal) => {
125
- const res = await p.exec(h, {
148
+ const r = await this.sandbox.ifRunning(task.environmentId, { createdAt }, async (p, h, signal) => {
149
+ const res = await actingAs(p, actor).exec(h, {
126
150
  command: tailScript(task.id, tail),
127
151
  cwd: "/workspace",
128
152
  timeoutMs: OUTPUT_READ_TIMEOUT_MS,
@@ -155,7 +179,8 @@ BackgroundTasks = __decorate([
155
179
  __param(2, Inject(BackgroundTaskStopper)),
156
180
  __param(3, Inject(SandboxService)),
157
181
  __param(4, Inject(EventLog)),
158
- __param(5, Inject(KernelDb))
182
+ __param(5, Inject(KernelDb)),
183
+ __param(6, Inject(ConversationEnvironments))
159
184
  ], BackgroundTasks);
160
185
  export { BackgroundTasks };
161
186
  /** Prints `size <bytes>` and `out <base64 of the last `tail` bytes>`. Relative to `/workspace`. */
@@ -1,9 +1,10 @@
1
1
  import type { KernelSchemaDb } from "../db/kernel-schema.js";
2
2
  /**
3
- * The wake rules of a finished background task (spec 2026-11-05-background-bash-design §3), read
4
- * by `RunQueue.ensureRun` in its transaction: every path that may start a run (a finish, the end of
5
- * a run, the delayed wake job, a page opening) applies the same rules. `BackgroundWake` is what
6
- * calls `ensureRun` when a task finishes.
3
+ * The wake rules of an idle conversation (spec 2026-11-05-background-bash-design §3, generalized
4
+ * by agent map spec §5.3 to a second event kind): a finished background task or a sub-agent's
5
+ * delivery starts a run. Read by `RunQueue.ensureRun` in its transaction: every path that may start
6
+ * a run (a finish, a delivery, the end of a run, the delayed wake job, a page opening) applies the
7
+ * same rules. `BackgroundWake` is what calls `ensureRun` when a task finishes or a delivery lands.
7
8
  */
8
9
  /** No two wakes of one conversation start within this window. */
9
10
  export declare const WAKE_WINDOW_MS = 60000;
@@ -21,8 +22,8 @@ export interface BgWakeJobData {
21
22
  retry?: number;
22
23
  }
23
24
  /**
24
- * What a conversation's unconsumed finishes decide:
25
- * - `wake`: start a run whose boundary is the finish at `seq`, as `triggerAccountId`;
25
+ * What a conversation's unconsumed wake events decide:
26
+ * - `wake`: start a run whose boundary is the event at `seq`, as `triggerAccountId`;
26
27
  * - `later`: a wake started less than {@link WAKE_WINDOW_MS} ago; the window ends at `windowEnd`
27
28
  * (epoch ms, the database's clock), `delayMs` from now;
28
29
  * - null: nothing wakes the conversation.
@@ -37,21 +38,29 @@ export type WakeDecision = {
37
38
  delayMs: number;
38
39
  } | null;
39
40
  /**
40
- * The wake decision for a chat conversation that is idle, whose queue is not paused and has no
41
- * unconsumed message (the caller checked these under the conversation's row lock). A finish
42
- * wakes it when:
43
- * - it is after `consumed`, not `reported` (a tool call already told the model) and has no
44
- * `stoppedBy` (`"person"`: that person is looking at the conversation; `"deletion"`: the
45
- * conversation is being deleted);
46
- * - it belongs to a task of this conversation (the join on `conversation_id` reads the task's
47
- * trigger account). A sub-agent's task is excluded by the conversation's kind, not here: its
48
- * finish is in the child's log, and `ensureRun` never wakes a non-chat conversation;
41
+ * The wake decision for a conversation that is idle and has no unconsumed message (the caller
42
+ * checked these under the conversation's row lock): a chat conversation (`rootId` = its own id) or
43
+ * a sub-agent's (`rootId` = the root of its tree). An event wakes it when:
44
+ * - it is after `consumed` and is either
45
+ * - a `background_task_finished` of a task of this conversation (the join on `conversation_id`
46
+ * reads the task's trigger account) that is not `reported` (a tool call already told the model)
47
+ * and has no `stoppedBy` (`"person"`: that person is looking at the conversation;
48
+ * `"deletion"`: the conversation is being deleted), or
49
+ * - a `subagent_delivery` (its own `triggerAccountId`: the trigger account of the child run that
50
+ * delivered it, agent map spec §7), except the finish of a child that was stopped
51
+ * (`status: "aborted"`: a person's stop of it or of a sub-agent above it, a tree stop, the
52
+ * deletion of the root), for the same reason as a person's task stop; a tree stop thus never
53
+ * wakes the stopped ancestors through their descendants' finishes, which land after them;
49
54
  * - the wake setting is on (the org's override, else `deploymentOn`);
50
- * - the task's trigger account can still send to the conversation (`canSend`);
51
- * - no other wake started in the last {@link WAKE_WINDOW_MS} (else `later`).
52
- * The boundary is the newest finish whose trigger account can send.
55
+ * - the root's queue is not paused and the root is not deleted (a paused root holds the wakes of
56
+ * the whole tree, agent map spec §5.3);
57
+ * - the event's trigger account can still send to the root (`canSend`, which the caller binds to
58
+ * the root);
59
+ * - no other wake of this conversation started in the last {@link WAKE_WINDOW_MS} (else `later`).
60
+ * The boundary is the newest event whose trigger account can send.
53
61
  */
54
62
  export declare function wakeDecisionIn(t: KernelSchemaDb, conv: {
55
63
  id: string;
56
64
  orgId: string;
65
+ rootId: string;
57
66
  }, consumed: number, deploymentOn: boolean, canSend: (accountId: string) => Promise<boolean>): Promise<WakeDecision>;
@@ -1,10 +1,11 @@
1
1
  import { sql } from "kysely";
2
2
  import { effectiveWakeOnBackgroundTask, readOrgSettings } from "../orgs/settings.service.js";
3
3
  /**
4
- * The wake rules of a finished background task (spec 2026-11-05-background-bash-design §3), read
5
- * by `RunQueue.ensureRun` in its transaction: every path that may start a run (a finish, the end of
6
- * a run, the delayed wake job, a page opening) applies the same rules. `BackgroundWake` is what
7
- * calls `ensureRun` when a task finishes.
4
+ * The wake rules of an idle conversation (spec 2026-11-05-background-bash-design §3, generalized
5
+ * by agent map spec §5.3 to a second event kind): a finished background task or a sub-agent's
6
+ * delivery starts a run. Read by `RunQueue.ensureRun` in its transaction: every path that may start
7
+ * a run (a finish, a delivery, the end of a run, the delayed wake job, a page opening) applies the
8
+ * same rules. `BackgroundWake` is what calls `ensureRun` when a task finishes or a delivery lands.
8
9
  */
9
10
  /** No two wakes of one conversation start within this window. */
10
11
  export const WAKE_WINDOW_MS = 60_000;
@@ -16,30 +17,39 @@ export const BG_WAKE_JOB = "bg-wake";
16
17
  * BullMQ ignores an add under the id of the job still running.
17
18
  */
18
19
  export const bgWakeJobId = (conversationId, windowEnd, retry = 0) => `bg-wake-${conversationId}-${windowEnd}${retry > 0 ? `-r${retry}` : ""}`;
19
- /** How many unconsumed finishes are tried for a trigger account that can still send. */
20
+ /** How many unconsumed events are tried for a trigger account that can still send. */
20
21
  const CANDIDATES = 20;
22
+ /** The event types whose run is a wake run (its boundary, `runs.trigger_seq`, is one of them). */
23
+ const WAKE_EVENT_TYPES = ["background_task_finished", "subagent_delivery"];
21
24
  /**
22
- * The wake decision for a chat conversation that is idle, whose queue is not paused and has no
23
- * unconsumed message (the caller checked these under the conversation's row lock). A finish
24
- * wakes it when:
25
- * - it is after `consumed`, not `reported` (a tool call already told the model) and has no
26
- * `stoppedBy` (`"person"`: that person is looking at the conversation; `"deletion"`: the
27
- * conversation is being deleted);
28
- * - it belongs to a task of this conversation (the join on `conversation_id` reads the task's
29
- * trigger account). A sub-agent's task is excluded by the conversation's kind, not here: its
30
- * finish is in the child's log, and `ensureRun` never wakes a non-chat conversation;
25
+ * The wake decision for a conversation that is idle and has no unconsumed message (the caller
26
+ * checked these under the conversation's row lock): a chat conversation (`rootId` = its own id) or
27
+ * a sub-agent's (`rootId` = the root of its tree). An event wakes it when:
28
+ * - it is after `consumed` and is either
29
+ * - a `background_task_finished` of a task of this conversation (the join on `conversation_id`
30
+ * reads the task's trigger account) that is not `reported` (a tool call already told the model)
31
+ * and has no `stoppedBy` (`"person"`: that person is looking at the conversation;
32
+ * `"deletion"`: the conversation is being deleted), or
33
+ * - a `subagent_delivery` (its own `triggerAccountId`: the trigger account of the child run that
34
+ * delivered it, agent map spec §7), except the finish of a child that was stopped
35
+ * (`status: "aborted"`: a person's stop of it or of a sub-agent above it, a tree stop, the
36
+ * deletion of the root), for the same reason as a person's task stop; a tree stop thus never
37
+ * wakes the stopped ancestors through their descendants' finishes, which land after them;
31
38
  * - the wake setting is on (the org's override, else `deploymentOn`);
32
- * - the task's trigger account can still send to the conversation (`canSend`);
33
- * - no other wake started in the last {@link WAKE_WINDOW_MS} (else `later`).
34
- * The boundary is the newest finish whose trigger account can send.
39
+ * - the root's queue is not paused and the root is not deleted (a paused root holds the wakes of
40
+ * the whole tree, agent map spec §5.3);
41
+ * - the event's trigger account can still send to the root (`canSend`, which the caller binds to
42
+ * the root);
43
+ * - no other wake of this conversation started in the last {@link WAKE_WINDOW_MS} (else `later`).
44
+ * The boundary is the newest event whose trigger account can send.
35
45
  */
36
46
  export async function wakeDecisionIn(t, conv, consumed, deploymentOn, canSend) {
37
- const candidates = await t
47
+ const finishes = await t
38
48
  .selectFrom("conversation_events as e")
39
49
  .innerJoin("background_tasks as b", (j) => j
40
50
  .on(sql `b.id = e.payload ->> 'taskId'`)
41
51
  .onRef("b.conversation_id", "=", "e.conversation_id"))
42
- .select(["e.seq", "b.trigger_account_id"])
52
+ .select(["e.seq", "b.trigger_account_id as account"])
43
53
  .where("e.conversation_id", "=", conv.id)
44
54
  .where("e.type", "=", "background_task_finished")
45
55
  .where("e.seq", ">", String(consumed))
@@ -48,15 +58,35 @@ export async function wakeDecisionIn(t, conv, consumed, deploymentOn, canSend) {
48
58
  .orderBy("e.seq", "desc")
49
59
  .limit(CANDIDATES)
50
60
  .execute();
61
+ const deliveries = await t
62
+ .selectFrom("conversation_events as e")
63
+ .select(["e.seq", sql `e.payload ->> 'triggerAccountId'`.as("account")])
64
+ .where("e.conversation_id", "=", conv.id)
65
+ .where("e.type", "=", "subagent_delivery")
66
+ .where("e.seq", ">", String(consumed))
67
+ .where(sql `e.payload ->> 'status' IS DISTINCT FROM 'aborted'`)
68
+ .orderBy("e.seq", "desc")
69
+ .limit(CANDIDATES)
70
+ .execute();
71
+ const candidates = [...finishes, ...deliveries]
72
+ .sort((a, b) => Number(b.seq) - Number(a.seq))
73
+ .slice(0, CANDIDATES);
51
74
  if (candidates.length === 0)
52
75
  return null;
53
76
  const org = (await readOrgSettings(t, conv.orgId)).wakeOnBackgroundTask;
54
77
  if (!effectiveWakeOnBackgroundTask(deploymentOn, org))
55
78
  return null;
79
+ const root = await t
80
+ .selectFrom("conversations")
81
+ .select(["queue_paused", "deleted_at"])
82
+ .where("id", "=", conv.rootId)
83
+ .executeTakeFirst();
84
+ if (!root || root.queue_paused || root.deleted_at !== null)
85
+ return null;
56
86
  let boundary;
57
87
  for (const c of candidates) {
58
- if (await canSend(c.trigger_account_id)) {
59
- boundary = { seq: Number(c.seq), triggerAccountId: c.trigger_account_id };
88
+ if (await canSend(c.account)) {
89
+ boundary = { seq: Number(c.seq), triggerAccountId: c.account };
60
90
  break;
61
91
  }
62
92
  }
@@ -71,7 +101,7 @@ export async function wakeDecisionIn(t, conv, consumed, deploymentOn, canSend) {
71
101
  sql `floor(extract(epoch from now()) * 1000)::bigint`.as("now"),
72
102
  ])
73
103
  .where("r.conversation_id", "=", conv.id)
74
- .where("w.type", "=", "background_task_finished")
104
+ .where("w.type", "in", WAKE_EVENT_TYPES)
75
105
  .executeTakeFirst();
76
106
  if (last?.started != null) {
77
107
  const windowEnd = Number(last.started) + WAKE_WINDOW_MS;
@@ -4,24 +4,26 @@ import { KernelEvents } from "../infra/events/kernel-events.js";
4
4
  import { RunQueue } from "../runtime/run-queue.js";
5
5
  /**
6
6
  * Wakes an idle conversation when one of its background tasks finished (spec
7
- * 2026-11-05-background-bash-design §3). {@link BackgroundTaskFinisher} announces the committed
8
- * finish (`background_task.finished`, an in-process domain event: the finisher's module sits
9
- * below the runtime); {@link onFinished} asks the run queue for a run. The wake rules themselves
10
- * (own task, not reported, the wake setting, the queue not paused, the trigger account can still
11
- * send, the 60 s window and its delayed `bg-wake` job) are applied by `RunQueue.ensureRun` in its
12
- * transaction (`wakeDecisionIn`, ./wake-rules.ts), so a run's end, the delayed job and a page
13
- * opening apply the same rules. Provided by `RuntimeModule`.
7
+ * 2026-11-05-background-bash-design §3) or a sub-agent delivered to it (agent map spec §5.3).
8
+ * {@link BackgroundTaskFinisher} announces the committed finish (`background_task.finished`) and
9
+ * `SubagentDeliveries` the committed delivery (`subagent.delivered`), both in-process domain
10
+ * events emitted after the commit; {@link onFinished} asks the run queue for a run. The wake rules
11
+ * themselves (own task, not reported, the wake setting, the root's queue not paused, the trigger
12
+ * account can still send to the root, the 60 s window and its delayed `bg-wake` job) are applied
13
+ * by `RunQueue.ensureRun` in its transaction (`wakeDecisionIn`, ./wake-rules.ts), so a run's end,
14
+ * the delayed job and a page opening apply the same rules; a lost event is re-derived by the next
15
+ * of them. Provided by `RuntimeModule`.
14
16
  */
15
17
  export declare class BackgroundWake implements OnApplicationShutdown {
16
18
  private readonly runs;
17
19
  private readonly log;
18
- /** Drops the subscription (the events may outlive this instance). */
20
+ /** Drops the subscriptions (the events may outlive this instance). */
19
21
  private readonly unsubscribe;
20
22
  constructor(runs: Pick<RunQueue, "ensureRun">, events: KernelEvents, log: Pick<Logger, "warn">);
21
23
  /**
22
- * A task of `conversationId` finished (after the commit): starts a wake run when the rules
23
- * allow it, or schedules one at the end of the wake window. A run in progress absorbs the finish
24
- * at its next step instead, or its end starts the wake. Never throws.
24
+ * A task of `conversationId` finished, or a sub-agent delivered to it (after the commit): starts
25
+ * a wake run when the rules allow it, or schedules one at the end of the wake window. A run in
26
+ * progress absorbs the event at its next step instead, or its end starts the wake. Never throws.
25
27
  */
26
28
  onFinished(conversationId: string): Promise<void>;
27
29
  onApplicationShutdown(): void;
@@ -13,39 +13,45 @@ import { KERNEL_LOGGER } from "../infra/tokens.js";
13
13
  import { RunQueue } from "../runtime/run-queue.js";
14
14
  /**
15
15
  * Wakes an idle conversation when one of its background tasks finished (spec
16
- * 2026-11-05-background-bash-design §3). {@link BackgroundTaskFinisher} announces the committed
17
- * finish (`background_task.finished`, an in-process domain event: the finisher's module sits
18
- * below the runtime); {@link onFinished} asks the run queue for a run. The wake rules themselves
19
- * (own task, not reported, the wake setting, the queue not paused, the trigger account can still
20
- * send, the 60 s window and its delayed `bg-wake` job) are applied by `RunQueue.ensureRun` in its
21
- * transaction (`wakeDecisionIn`, ./wake-rules.ts), so a run's end, the delayed job and a page
22
- * opening apply the same rules. Provided by `RuntimeModule`.
16
+ * 2026-11-05-background-bash-design §3) or a sub-agent delivered to it (agent map spec §5.3).
17
+ * {@link BackgroundTaskFinisher} announces the committed finish (`background_task.finished`) and
18
+ * `SubagentDeliveries` the committed delivery (`subagent.delivered`), both in-process domain
19
+ * events emitted after the commit; {@link onFinished} asks the run queue for a run. The wake rules
20
+ * themselves (own task, not reported, the wake setting, the root's queue not paused, the trigger
21
+ * account can still send to the root, the 60 s window and its delayed `bg-wake` job) are applied
22
+ * by `RunQueue.ensureRun` in its transaction (`wakeDecisionIn`, ./wake-rules.ts), so a run's end,
23
+ * the delayed job and a page opening apply the same rules; a lost event is re-derived by the next
24
+ * of them. Provided by `RuntimeModule`.
23
25
  */
24
26
  let BackgroundWake = class BackgroundWake {
25
27
  runs;
26
28
  log;
27
- /** Drops the subscription (the events may outlive this instance). */
29
+ /** Drops the subscriptions (the events may outlive this instance). */
28
30
  unsubscribe;
29
31
  constructor(runs, events, log) {
30
32
  this.runs = runs;
31
33
  this.log = log;
32
- this.unsubscribe = events.on("background_task.finished", ({ conversationId }) => this.onFinished(conversationId));
34
+ this.unsubscribe = [
35
+ events.on("background_task.finished", ({ conversationId }) => this.onFinished(conversationId)),
36
+ events.on("subagent.delivered", ({ conversationId }) => this.onFinished(conversationId)),
37
+ ];
33
38
  }
34
39
  /**
35
- * A task of `conversationId` finished (after the commit): starts a wake run when the rules
36
- * allow it, or schedules one at the end of the wake window. A run in progress absorbs the finish
37
- * at its next step instead, or its end starts the wake. Never throws.
40
+ * A task of `conversationId` finished, or a sub-agent delivered to it (after the commit): starts
41
+ * a wake run when the rules allow it, or schedules one at the end of the wake window. A run in
42
+ * progress absorbs the event at its next step instead, or its end starts the wake. Never throws.
38
43
  */
39
44
  async onFinished(conversationId) {
40
45
  try {
41
46
  await this.runs.ensureRun(conversationId);
42
47
  }
43
48
  catch (err) {
44
- this.log.warn("background task wake failed", { conversationId, err });
49
+ this.log.warn("background wake failed", { conversationId, err });
45
50
  }
46
51
  }
47
52
  onApplicationShutdown() {
48
- this.unsubscribe();
53
+ for (const off of this.unsubscribe)
54
+ off();
49
55
  }
50
56
  };
51
57
  BackgroundWake = __decorate([
@@ -1,10 +1,11 @@
1
1
  import type { FastifyReply } from "fastify";
2
2
  import { z } from "zod";
3
- import type { AdminExtensionView } from "../extensions/permission-view.js";
4
3
  import { type Principal } from "../identity/principal.js";
5
4
  import { type CatalogItemDetail, type CatalogItemView, CatalogService, type PermissionsMismatch } from "./catalog.service.js";
5
+ import { CatalogScopeService, type ScopePreview } from "./catalog-scope.service.js";
6
6
  import { OrgCatalogService } from "./org-catalog.service.js";
7
7
  import { type PluginConfirmResult, PluginImport, type PluginReview } from "./plugin-import.js";
8
+ import { PlatformPluginUpdater, type PlatformUpdatePreview, type PlatformUpdateResult } from "./plugin-upgrade.js";
8
9
  declare const NpmBody: z.ZodObject<{
9
10
  package: z.ZodString;
10
11
  version: z.ZodOptional<z.ZodString>;
@@ -14,21 +15,42 @@ declare const GitBody: z.ZodObject<{
14
15
  ref: z.ZodOptional<z.ZodString>;
15
16
  path: z.ZodOptional<z.ZodString>;
16
17
  }, z.core.$strict>;
17
- declare const PolicyBody: z.ZodObject<{
18
- policy: z.ZodEnum<{
19
- allow: "allow";
20
- disabled: "disabled";
21
- needs_approval: "needs_approval";
22
- }>;
23
- }, z.core.$strip>;
24
- declare const InstallBody: z.ZodObject<{
25
- version: z.ZodString;
26
- }, z.core.$strip>;
27
18
  declare const ConfirmBody: z.ZodObject<{
28
19
  reviewHash: z.ZodString;
29
- deployExtension: z.ZodBoolean;
20
+ scope: z.ZodOptional<z.ZodEnum<{
21
+ all: "all";
22
+ named: "named";
23
+ optional: "optional";
24
+ }>>;
25
+ orgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
26
  pinnedSuggestions: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
- }, z.core.$strip>;
27
+ }, z.core.$strict>;
28
+ /** `{ scope, orgs? }` (a scope change) or `{ disabled: true }` (a disable), not both. */
29
+ declare const ScopePreviewBody: z.ZodObject<{
30
+ scope: z.ZodOptional<z.ZodEnum<{
31
+ all: "all";
32
+ named: "named";
33
+ optional: "optional";
34
+ }>>;
35
+ orgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
36
+ disabled: z.ZodOptional<z.ZodLiteral<true>>;
37
+ }, z.core.$strict>;
38
+ declare const ScopeBody: z.ZodObject<{
39
+ scope: z.ZodEnum<{
40
+ all: "all";
41
+ named: "named";
42
+ optional: "optional";
43
+ }>;
44
+ orgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
45
+ scopeHash: z.ZodString;
46
+ }, z.core.$strict>;
47
+ declare const DisabledBody: z.ZodObject<{
48
+ disabled: z.ZodBoolean;
49
+ scopeHash: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$strict>;
51
+ declare const ShownBody: z.ZodObject<{
52
+ shownToOthers: z.ZodBoolean;
53
+ }, z.core.$strict>;
32
54
  declare const ListQuery: z.ZodObject<{
33
55
  includeDeleted: z.ZodOptional<z.ZodEnum<{
34
56
  false: "false";
@@ -36,18 +58,38 @@ declare const ListQuery: z.ZodObject<{
36
58
  }>>;
37
59
  limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
38
60
  offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
61
+ pending: z.ZodOptional<z.ZodEnum<{
62
+ false: "false";
63
+ true: "true";
64
+ }>>;
39
65
  }, z.core.$strip>;
66
+ declare const ConfirmPermissionsBody: z.ZodObject<{
67
+ permissionsHash: z.ZodString;
68
+ }, z.core.$strict>;
69
+ /** The reason shown to the owner org in its `upload_rejected` notice (optional). */
70
+ declare const RejectBody: z.ZodObject<{
71
+ reason: z.ZodOptional<z.ZodString>;
72
+ }, z.core.$strict>;
73
+ declare const UpdatePreviewBody: z.ZodObject<{
74
+ version: z.ZodString;
75
+ }, z.core.$strict>;
76
+ declare const UpdateBody: z.ZodObject<{
77
+ version: z.ZodString;
78
+ diffHash: z.ZodString;
79
+ }, z.core.$strict>;
40
80
  /**
41
- * The enterprise catalog (`/api/v1/admin/catalog/*`, enterprise admins): plugin import (upload / npm
42
- * prepare, then confirm), the item list and detail, policy, delete, and installing an item's
43
- * extension on the deployment. Writes re-check the enterprise admin inside the service's lock and are
81
+ * The platform catalog (`/api/v1/admin/catalog/*`, super admins): plugin import (upload / npm
82
+ * prepare, then confirm, which installs the plugin's extension), the item list and detail, scope and
83
+ * disable (previewed, then confirmed with `scopeHash`), delete. Writes re-check the super admin inside the service's lock and are
44
84
  * audited.
45
85
  */
46
86
  export declare class AdminCatalogController {
47
87
  private readonly catalog;
48
88
  private readonly pluginImport;
49
89
  private readonly orgCatalog;
50
- constructor(catalog: CatalogService, pluginImport: PluginImport, orgCatalog: OrgCatalogService);
90
+ private readonly scope;
91
+ private readonly updater;
92
+ constructor(catalog: CatalogService, pluginImport: PluginImport, orgCatalog: OrgCatalogService, scope: CatalogScopeService, updater: PlatformPluginUpdater);
51
93
  /**
52
94
  * Prepares the import of an uploaded plugin (an npm-pack tgz as the raw body,
53
95
  * `application/octet-stream`, at most `packages.maxBytes`): reads and checks the whole plugin
@@ -97,11 +139,13 @@ export declare class AdminCatalogController {
97
139
  permissionsMismatch?: PermissionsMismatch;
98
140
  }>;
99
141
  /**
100
- * Confirms a staged import: approves the plugin's extension when this import installs it (writes
101
- * its snapshot) and creates the item or adds the version; with `deployExtension` it installs and
102
- * enables the plugin's own extension after the commit and returns `{ item, deploy }`, where
103
- * `deploy` says enabled / failed (+ code); a failed deploy does not make the committed import fail
104
- * (retry from the extension admin by sha256). A foreseeable failure (a downgrade to a version with
142
+ * Confirms a staged import: approves the plugin's extension when this import installs or upgrades
143
+ * it (writes its snapshot), creates the item (with `scope`, default `optional`; `orgs` only with
144
+ * `named`, each an existing org, else 400 `validation_failed`) or adds the version, installs and
145
+ * enables the plugin's own extension after the commit and enqueues the item's scope sync; returns
146
+ * `{ item, deploy }`, where `deploy` says enabled / failed (+ code), null without an extension to
147
+ * deploy; a failed deploy does not make the committed import fail (retry from the extension admin
148
+ * by sha256). An unknown field (the removed `deployExtension`) -> 400 `validation_failed`. A foreseeable failure (a downgrade to a version with
105
149
  * unrun migrations) is a 409 `extension.downgrade_unsupported` before anything is written.
106
150
  * Staging missing or expired -> 404 `plugin.staging_not_found`; `reviewHash` differs or the
107
151
  * extension on the deployment changed -> 409 `plugin.review_stale`. `pinnedSuggestions` (skill
@@ -129,15 +173,70 @@ export declare class AdminCatalogController {
129
173
  * `sendCatalogIcon`). No icon -> 404 `catalog.icon_not_found`.
130
174
  */
131
175
  icon(id: string, reply: FastifyReply): Promise<void>;
132
- /** 改策略(allow / needs_approval / disabled)。 */
133
- setPolicy(principal: Principal, id: string, body: z.infer<typeof PolicyBody>): Promise<CatalogItemView>;
134
- /** 删除条目(软删除,已安装的组件不受影响)。 */
135
- remove(principal: Principal, id: string): Promise<void>;
136
176
  /**
137
- * Installs the extension of a version of an item on the deployment (a new install starts disabled;
138
- * unapproved permissions still need approval). A version without an extension -> 409
139
- * `catalog.no_extension`.
177
+ * What a scope change (`{ scope, orgs? }`, `orgs` only with `named`) or a disable
178
+ * (`{ disabled: true }`) would take away: `{ affected: [{ orgId, orgName, agents,
179
+ * connectorsKept }], needsConfig, scopeHash }` (spec §5 rule 8; nothing written; the connectors
180
+ * stay as the orgs' own). A builtin item -> 409 `plugin.builtin`; unknown
181
+ * orgs -> 400 `validation_failed`.
182
+ */
183
+ previewScope(id: string, body: z.infer<typeof ScopePreviewBody>): Promise<ScopePreview>;
184
+ /**
185
+ * Changes the scope, confirmed with the preview's `scopeHash` (recomputed under the item row lock;
186
+ * a difference -> 409 `plugin.scope_stale`); bumps the scope version, audits
187
+ * `catalog.scope_changed` and enqueues the scope sync. Builtin -> 409 `plugin.builtin`.
188
+ */
189
+ setScope(principal: Principal, id: string, body: z.infer<typeof ScopeBody>): Promise<CatalogItemView>;
190
+ /**
191
+ * Disables the plugin on the whole deployment (`scopeHash` of the `{ disabled: true }` preview
192
+ * required; the scope sync then uninstalls it everywhere, its scope and the org switches are kept)
193
+ * or enables it again (no hash; the sync reinstalls where it is wanted). Builtin -> 409
194
+ * `plugin.builtin`; a stale hash -> 409 `plugin.scope_stale`.
195
+ */
196
+ setDisabled(principal: Principal, id: string, body: z.infer<typeof DisabledBody>): Promise<CatalogItemView>;
197
+ /**
198
+ * Confirms the item's extension permissions (the admin's 待确认; body `{ permissionsHash }` from
199
+ * the item view): approves the current permission set (snapshot source `web`) and installs and
200
+ * enables an extension that was never deployed. A changed set -> 409 `extension.approval_stale`;
201
+ * nothing to confirm -> 409 `extension.not_pending`. Returns the item. An org's upload
202
+ * (`owner.kind` org, ruling P3-10): the digest of its pending version's package; a first version
203
+ * is installed, approved, enabled and synced, a new version applied by the platform update
204
+ * (the item removed meanwhile -> 409 `catalog.item_removed`, P3-21).
140
205
  */
141
- installToDeployment(principal: Principal, id: string, body: z.infer<typeof InstallBody>): Promise<AdminExtensionView>;
206
+ confirmPermissions(principal: Principal, id: string, body: z.infer<typeof ConfirmPermissionsBody>): Promise<CatalogItemView>;
207
+ /**
208
+ * Rejects an org upload's pending version (ruling P3-10; body `{ reason? }`, told to the owner
209
+ * org in `upload_rejected`): a first version is removed (its name free again), a new version's
210
+ * pending state cleared. Nothing pending, or a platform item (pre-flight F11) -> 409
211
+ * `extension.not_pending`. 204.
212
+ */
213
+ reject(principal: Principal, id: string, body: z.infer<typeof RejectBody>): Promise<void>;
214
+ /**
215
+ * Whether orgs outside a `named` item's list see it as requestable (spec §5.1 rule 1). Hiding it
216
+ * keeps pending requests as they are; new requests from unlisted orgs are then 404. Never makes
217
+ * anything usable, so no preview and no scope sync. Audits `catalog.shown_changed`.
218
+ */
219
+ setShown(principal: Principal, id: string, body: z.infer<typeof ShownBody>): Promise<CatalogItemView>;
220
+ /**
221
+ * What updating the platform plugin to `version` would do (spec §7.1, `PlatformPluginUpdater`):
222
+ * `{ itemId, name, from, to, components: [{ kind, id, name, change: added | removed | upgrade |
223
+ * downgrade | same, from, to, updatedOnOwn, ownScope, pinnedOrgs, kept? }], extension,
224
+ * connectorOrgs: [{ orgId, connectors, needsConfig }], diffHash }`. Nothing written. The same
225
+ * version, a target the deployment's extension or a dependent plugin cannot take -> 409
226
+ * `plugin.upgrade_target_invalid`; an added skill named like one in use where the plugin is on
227
+ * -> 409 `plugin.skill_conflict`; disabled -> 403 `catalog.item_disabled`.
228
+ */
229
+ previewUpdate(id: string, body: z.infer<typeof UpdatePreviewBody>): Promise<PlatformUpdatePreview>;
230
+ /**
231
+ * Updates the platform plugin, confirmed with the preview's `diffHash` (recomputed under the item
232
+ * lock; a difference -> 409 `plugin.upgrade_stale`; another update running -> 409
233
+ * `plugin.install_in_progress`). A failure undoes everything -> 502 `plugin.upgrade_failed`.
234
+ * Audits `plugin.platform_updated`. A version an org upload waits with (or an item whose first
235
+ * version waits) -> 409 `catalog.item_pending`: confirm it in 待确认 (pre-flight F8); the
236
+ * preview answers the same.
237
+ */
238
+ update(principal: Principal, id: string, body: z.infer<typeof UpdateBody>): Promise<PlatformUpdateResult>;
239
+ /** 删除条目(软删除,已安装的组件不受影响)。 */
240
+ remove(principal: Principal, id: string): Promise<void>;
142
241
  }
143
242
  export {};