@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
@@ -9,10 +9,17 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
9
  };
10
10
  import { randomUUID } from "node:crypto";
11
11
  import { Inject, Injectable } from "@nestjs/common";
12
+ import { sql } from "kysely";
13
+ import { componentOn } from "../catalog/component-state.js";
14
+ import { ownerOf, ownersOf } from "../catalog/ownership.js";
12
15
  import { KernelDb } from "../infra/database/kernel-db.js";
13
16
  import { canonicalJson } from "../tools/canonical-json.js";
14
17
  import { loadLegacyScope } from "../tools/legacy-data.js";
15
18
  import { needsLegacyScope, normalizeToolKeys } from "./definition.js";
19
+ /** The roster type of a template: `<plugin>:<name>`, the bare `<name>` without a plugin. */
20
+ export const templateTypeOf = (plugin, name) => plugin ? `${plugin}:${name}` : name;
21
+ /** Plugin install statuses that make a plugin on in the org (phase 1, org catalog state). */
22
+ const LIVE_INSTALL = ["installing", "installed", "upgrading"];
16
23
  const baseQuery = (db, orgId) => db
17
24
  .selectFrom("agent_templates as t")
18
25
  .innerJoin("agent_template_versions as v", (j) => j.onRef("v.template_id", "=", "t.id").onRef("v.version", "=", "t.current_version"))
@@ -22,6 +29,8 @@ const baseQuery = (db, orgId) => db
22
29
  "t.plugin_name",
23
30
  "t.current_version",
24
31
  "t.catalog_item_id",
32
+ "t.platform_template_id",
33
+ "t.pinned_version",
25
34
  "v.definition",
26
35
  "v.source_format",
27
36
  "v.catalog_version",
@@ -29,34 +38,448 @@ const baseQuery = (db, orgId) => db
29
38
  .where("t.org_id", "=", orgId)
30
39
  .where("t.deleted_at", "is", null);
31
40
  /**
32
- * A stored template row; its tool keys read as current keys (tool naming spec §8.3): old builtin
33
- * names always, rc `<x>__<tool>` keys with `scope` (see {@link scopedRows}).
41
+ * The ids among `platformIds` of the live platform templates owned by `orgId` (promoted from its
42
+ * own templates, ruling P3-3).
34
43
  */
35
- const rowOf = (r, scope) => ({
44
+ async function ownedPlatformIds(db, orgId, platformIds) {
45
+ if (platformIds.length === 0)
46
+ return new Set();
47
+ const rows = await db
48
+ .selectFrom("platform_agent_templates")
49
+ .select("id")
50
+ .where("id", "in", [...new Set(platformIds)])
51
+ .where("owner_org_id", "=", orgId)
52
+ .where("deleted_at", "is", null)
53
+ .execute();
54
+ return new Set(rows.map((r) => r.id));
55
+ }
56
+ /**
57
+ * Stored rows as {@link TemplateRow}s; tool keys read as current keys (tool naming spec §8.3): old
58
+ * builtin names always, rc `<x>__<tool>` keys with the org's legacy scope, read once when needed.
59
+ */
60
+ async function normalized(db, orgId, rows) {
61
+ const scope = rows.some((r) => needsLegacyScope(r.definition))
62
+ ? await loadLegacyScope(db, orgId)
63
+ : undefined;
64
+ return rows.map(({ definition, ...r }) => ({
65
+ ...r,
66
+ template: normalizeToolKeys(definition, scope),
67
+ }));
68
+ }
69
+ const orgRaw = (r) => ({
36
70
  id: r.id,
37
71
  name: r.name,
38
72
  plugin: r.plugin_name,
39
73
  version: r.current_version,
40
- template: normalizeToolKeys(r.definition, scope),
74
+ definition: r.definition,
41
75
  sourceFormat: r.source_format,
42
76
  catalogItemId: r.catalog_item_id,
43
77
  catalogVersion: r.catalog_version,
78
+ // a pinned copy keeps its link but serves its own version: no platform content source
79
+ origin: "org",
44
80
  });
45
- /** The rows of one org as {@link TemplateRow}s, reading the org's legacy scope once when needed. */
46
- async function scopedRows(db, orgId, rows) {
47
- const scope = rows.some((r) => needsLegacyScope(r.definition))
48
- ? await loadLegacyScope(db, orgId)
49
- : undefined;
50
- return rows.map((r) => rowOf(r, scope));
81
+ /** The live platform template rows on in the org (`ids`: only those), before any type clash. */
82
+ async function platformRowsOn(db, orgId, ids) {
83
+ if (ids !== undefined && ids.length === 0)
84
+ return [];
85
+ let q = db
86
+ .selectFrom("platform_agent_templates as p")
87
+ .innerJoin("platform_agent_template_versions as v", (j) => j.onRef("v.template_id", "=", "p.id").onRef("v.version", "=", "p.current_version"))
88
+ .leftJoin("catalog_items as c", (j) => j.onRef("c.id", "=", "p.catalog_item_id").on("c.deleted_at", "is", null))
89
+ .select((eb) => [
90
+ "p.id",
91
+ "p.name",
92
+ "p.plugin_name",
93
+ "p.catalog_item_id",
94
+ "p.current_version",
95
+ "p.scope_mode",
96
+ "p.scope",
97
+ "v.definition",
98
+ "v.source_format",
99
+ "v.catalog_version",
100
+ "c.id as item_id",
101
+ "c.disabled as item_disabled",
102
+ "c.builtin as item_builtin",
103
+ eb
104
+ .exists(eb
105
+ .selectFrom("plugin_installs as a")
106
+ .select("a.id")
107
+ .whereRef("a.item_id", "=", "p.catalog_item_id")
108
+ .where("a.org_id", "=", orgId)
109
+ .where("a.status", "in", [...LIVE_INSTALL]))
110
+ .as("installed"),
111
+ eb
112
+ .exists(eb
113
+ .selectFrom("component_scope_orgs as l")
114
+ .select("l.org_id")
115
+ .where("l.kind", "=", "agent_template")
116
+ .whereRef("l.component_id", "=", "p.id")
117
+ .where("l.org_id", "=", orgId))
118
+ .as("listed"),
119
+ eb
120
+ .selectFrom("component_org_switches as w")
121
+ .select("w.enabled")
122
+ .where("w.kind", "=", "agent_template")
123
+ .whereRef("w.component_id", "=", "p.id")
124
+ .where("w.org_id", "=", orgId)
125
+ .as("switch"),
126
+ ])
127
+ .where("p.deleted_at", "is", null)
128
+ .where("p.disabled", "=", false);
129
+ if (ids !== undefined)
130
+ q = q.where("p.id", "in", [...ids]);
131
+ // the predicate of component scope (catalog/component-state.ts); `disabled` is filtered above
132
+ return (await q.execute()).filter((r) => componentOn({ scopeMode: r.scope_mode, scope: r.scope, disabled: false, itemId: r.catalog_item_id }, r.catalog_item_id === null
133
+ ? null
134
+ : {
135
+ live: r.item_id !== null,
136
+ disabled: r.item_disabled === true,
137
+ builtin: r.item_builtin === true,
138
+ // the plugin's own scope and list do not decide whether a component is on
139
+ scope: "optional",
140
+ listed: false,
141
+ installed: Boolean(r.installed),
142
+ }, Boolean(r.listed), r.switch ?? null));
143
+ }
144
+ /**
145
+ * The ids among `ids` of the platform templates on in the org (see {@link platformOn}), whatever
146
+ * the org's own templates are.
147
+ */
148
+ export async function platformTemplatesOn(db, orgId, ids) {
149
+ return new Set((await platformRowsOn(db, orgId, ids)).map((r) => r.id));
51
150
  }
52
- /** The live templates of `ids` in the org (deleted and foreign ids are left out), by id. */
53
- export async function loadTemplates(db, orgId, ids) {
151
+ /**
152
+ * Rule 10 for platform agent template `component` (`plugin` / `name`: its roster type) newly
153
+ * offered to the org (ruling P4-13, as `skillNameClashes` for skills): the org's own live rows of
154
+ * that type (unlinked, or pinned) that are no copy of it (linked to it, or from its plugin), and
155
+ * the other platform templates of that type on in the org (two orgs' shared templates of one bare
156
+ * name, P3-5). `skills`: the clashing template ids; `owners`: each one's owner, in the same order
157
+ * (an org row without a plugin is the org's own; a plugin's row its catalog item's owner; a
158
+ * platform row its `owner_org_id`); `plugins`: the clashing platform templates' plugins.
159
+ */
160
+ export async function templateTypeClashes(db, orgId, component) {
161
+ const own = await db
162
+ .selectFrom("agent_templates as t")
163
+ .select(["t.id", "t.platform_template_id", "t.catalog_item_id"])
164
+ .where("t.org_id", "=", orgId)
165
+ .where("t.deleted_at", "is", null)
166
+ .where("t.name", "=", component.name)
167
+ .where((eb) => component.plugin === null
168
+ ? eb("t.plugin_name", "is", null)
169
+ : eb("t.plugin_name", "=", component.plugin))
170
+ .where((eb) => eb.or([eb("t.platform_template_id", "is", null), eb("t.pinned_version", "is not", null)]))
171
+ .execute();
172
+ const ownRows = own.filter((r) => r.platform_template_id !== component.id &&
173
+ (component.itemId === null || r.catalog_item_id !== component.itemId));
174
+ const others = await db
175
+ .selectFrom("platform_agent_templates")
176
+ .select(["id", "plugin_name", "owner_org_id"])
177
+ .where("name", "=", component.name)
178
+ .where((eb) => component.plugin === null
179
+ ? eb("plugin_name", "is", null)
180
+ : eb("plugin_name", "=", component.plugin))
181
+ .where("deleted_at", "is", null)
182
+ .where("id", "!=", component.id)
183
+ .execute();
184
+ const on = await platformTemplatesOn(db, orgId, others.map((o) => o.id));
185
+ const platform = others.filter((o) => on.has(o.id));
186
+ // a plugin's row: its catalog item's owner (`catalog_items.id` is a uuid, the column text)
187
+ const itemIds = [
188
+ ...new Set(ownRows.flatMap((r) => (r.catalog_item_id === null ? [] : [r.catalog_item_id]))),
189
+ ];
190
+ const itemOwner = new Map((itemIds.length === 0
191
+ ? []
192
+ : await db
193
+ .selectFrom("catalog_items")
194
+ .select(["id", "owner_org_id"])
195
+ .where(sql `id::text`, "in", itemIds)
196
+ .execute()).map((i) => [String(i.id), i.owner_org_id]));
197
+ const ownerIds = [
198
+ ...ownRows.map((r) => component.plugin === null
199
+ ? orgId
200
+ : r.catalog_item_id === null
201
+ ? null
202
+ : (itemOwner.get(r.catalog_item_id) ?? null)),
203
+ ...platform.map((o) => o.owner_org_id),
204
+ ];
205
+ const owners = await ownersOf(db, ownerIds.filter((x) => x !== null));
206
+ return {
207
+ skills: [...ownRows.map((r) => r.id), ...platform.map((o) => o.id)],
208
+ plugins: platform.flatMap((o) => (o.plugin_name === null ? [] : [o.plugin_name])),
209
+ owners: ownerIds.map((x) => ownerOf(x, owners)),
210
+ };
211
+ }
212
+ /**
213
+ * The ids among `ids` (platform templates that org copies are pinned to) whose pinned copies the
214
+ * org may use (ruling P2-18): the platform template is on in the org, or it was removed by a
215
+ * plugin update (soft-deleted, ruling P2-7: a pinned copy then keeps its own version as the org's).
216
+ */
217
+ async function pinnedTemplateLinksServed(db, orgId, ids) {
54
218
  if (ids.length === 0)
219
+ return new Set();
220
+ const removed = await db
221
+ .selectFrom("platform_agent_templates")
222
+ .select("id")
223
+ .where("id", "in", [...ids])
224
+ .where("deleted_at", "is not", null)
225
+ .execute();
226
+ return new Set([...(await platformTemplatesOn(db, orgId, ids)), ...removed.map((r) => r.id)]);
227
+ }
228
+ /**
229
+ * The platform templates on in the org (`ids`: only those), minus the ones whose type an org
230
+ * template of its own (unlinked, or pinned) already has (the org's wins; logged unless it is a copy
231
+ * of the same component: linked to it, or from the same catalog item; `shadowed` maps such a
232
+ * platform id to that org row's id). On in the org:
233
+ * - never when the template or its plugin is disabled (or its plugin is deleted);
234
+ * - `follow`: its plugin is on in the org (a live install, or builtin) and no component switch of
235
+ * the org says off;
236
+ * - `own`: `wantedOn` over the template's own scope, the org's list membership and its switch.
237
+ * One query for the templates with their plugin and org state, one for the org's clashing rows.
238
+ */
239
+ async function platformOn(db, orgId, ids, log) {
240
+ const shadowed = new Map();
241
+ const rows = await platformRowsOn(db, orgId, ids);
242
+ if (rows.length === 0)
243
+ return { rows: [], shadowed };
244
+ const own = await db
245
+ .selectFrom("agent_templates")
246
+ .select(["id", "name", "plugin_name", "platform_template_id", "catalog_item_id"])
247
+ .where("org_id", "=", orgId)
248
+ .where("deleted_at", "is", null)
249
+ .where((eb) => eb.or([eb("platform_template_id", "is", null), eb("pinned_version", "is not", null)]))
250
+ .where("name", "in", [...new Set(rows.map((r) => r.name))])
251
+ .execute();
252
+ const ownByType = new Map(own.map((r) => [templateTypeOf(r.plugin_name, r.name), r]));
253
+ const out = [];
254
+ for (const r of rows.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))) {
255
+ const o = ownByType.get(templateTypeOf(r.plugin_name, r.name));
256
+ if (o) {
257
+ const sameComponent = o.platform_template_id === r.id ||
258
+ (o.catalog_item_id !== null && o.catalog_item_id === r.catalog_item_id);
259
+ if (!sameComponent) {
260
+ log?.warn("platform agent template shadowed by an org template of the same type", {
261
+ orgId,
262
+ type: templateTypeOf(r.plugin_name, r.name),
263
+ platformTemplateId: r.id,
264
+ templateId: o.id,
265
+ });
266
+ }
267
+ else {
268
+ shadowed.set(r.id, o.id);
269
+ }
270
+ continue;
271
+ }
272
+ out.push({
273
+ id: r.id,
274
+ name: r.name,
275
+ plugin: r.plugin_name,
276
+ version: r.current_version,
277
+ definition: r.definition,
278
+ sourceFormat: r.source_format,
279
+ catalogItemId: r.catalog_item_id,
280
+ catalogVersion: r.catalog_version,
281
+ origin: "platform",
282
+ platformTemplateId: r.id,
283
+ });
284
+ }
285
+ return { rows: out, shadowed };
286
+ }
287
+ /**
288
+ * The org's live templates by id (`ids`; ids that are no usable template are missing): an org
289
+ * template with its current version; an org copy linked to a platform template without a pin
290
+ * (ruling B2) as that platform template's current version under the copy's id, while the platform
291
+ * template is on in the org; a pinned copy as its own version while its platform template is on in
292
+ * the org (ruling P2-18); a platform template id while it is on in the org, or, when an org row
293
+ * of the same component (unlinked or pinned) wins its type, as that row (its `id` is the row's: the
294
+ * roster lists the platform id as an alias). Deleted and foreign ids are left out. `log` receives
295
+ * the type-clash warnings.
296
+ */
297
+ export async function loadTemplates(db, orgId, ids, log) {
298
+ const unique = [...new Set(ids)];
299
+ if (unique.length === 0)
55
300
  return new Map();
56
- const rows = await baseQuery(db, orgId)
57
- .where("t.id", "in", [...ids])
301
+ const rows = await baseQuery(db, orgId).where("t.id", "in", unique).execute();
302
+ const linked = new Set(rows.filter((r) => r.platform_template_id !== null && r.pinned_version === null));
303
+ const known = new Set(rows.map((r) => r.id));
304
+ const platformIds = [
305
+ ...new Set([
306
+ ...unique.filter((id) => !known.has(id)),
307
+ ...[...linked].map((r) => r.platform_template_id),
308
+ ]),
309
+ ];
310
+ const on = await platformOn(db, orgId, platformIds, log);
311
+ const platform = new Map(on.rows.map((p) => [p.id, p]));
312
+ const owned = await ownedPlatformIds(db, orgId, [...linked].map((r) => r.platform_template_id));
313
+ // ruling P2-18: a pinned copy serves its own version while its platform template is on
314
+ const pinnedOn = await pinnedTemplateLinksServed(db, orgId, [
315
+ ...new Set(rows.flatMap((r) => r.platform_template_id !== null && r.pinned_version !== null
316
+ ? [r.platform_template_id]
317
+ : [])),
318
+ ]);
319
+ // a selected platform id shadowed by an org row of the same component resolves to that row
320
+ const shadowIds = unique.filter((id) => !known.has(id) && on.shadowed.has(id));
321
+ const shadowRows = new Map((shadowIds.length === 0
322
+ ? []
323
+ : await baseQuery(db, orgId)
324
+ .where("t.id", "in", [...new Set(shadowIds.map((id) => on.shadowed.get(id)))])
325
+ .execute()).map((r) => [r.id, orgRaw(r)]));
326
+ const raw = [];
327
+ for (const r of rows) {
328
+ if (linked.has(r)) {
329
+ const p = platform.get(r.platform_template_id);
330
+ if (!p)
331
+ continue;
332
+ if (!owned.has(p.id)) {
333
+ raw.push({ key: r.id, row: { ...p, id: r.id } });
334
+ }
335
+ else if (r.current_version === p.version) {
336
+ // the org's own template, promoted (ruling P3-3) at the same version: its own stored
337
+ // version, so the roster and `subagent_started` see what they saw before
338
+ raw.push({ key: r.id, row: orgRaw(r) });
339
+ }
340
+ else {
341
+ // a newer platform version: under its id, with the copy's roster type
342
+ raw.push({ key: r.id, row: { ...p, id: r.id, plugin: r.plugin_name, ownedCopy: true } });
343
+ }
344
+ continue;
345
+ }
346
+ if (r.platform_template_id !== null && !pinnedOn.has(r.platform_template_id))
347
+ continue;
348
+ raw.push({ key: r.id, row: orgRaw(r) });
349
+ }
350
+ for (const id of unique) {
351
+ if (known.has(id))
352
+ continue;
353
+ const p = platform.get(id);
354
+ if (p) {
355
+ raw.push({ key: id, row: p });
356
+ continue;
357
+ }
358
+ const o = shadowRows.get(on.shadowed.get(id) ?? "");
359
+ if (o)
360
+ raw.push({ key: id, row: o });
361
+ }
362
+ const done = await normalized(db, orgId, raw.map((x) => x.row));
363
+ return new Map(raw.map((x, i) => [x.key, done[i]]));
364
+ }
365
+ /**
366
+ * The org's usable templates, by plugin (none first), name and id: its own live templates
367
+ * (unlinked, or pinned while their platform template is on in the org, ruling P2-18) and the platform templates on in the org (see {@link platformOn}). An org
368
+ * copy linked without a pin is not listed: its platform template is; except the org's own template
369
+ * it promoted (ruling P3-3), listed once under its own id instead of the platform template. `log`
370
+ * receives the type-clash warnings.
371
+ */
372
+ export async function usableTemplates(db, orgId, log) {
373
+ const own = await baseQuery(db, orgId)
374
+ .where((eb) => eb.or([eb("t.platform_template_id", "is", null), eb("t.pinned_version", "is not", null)]))
375
+ .execute();
376
+ // ruling P2-18: a pinned copy follows its platform template's availability (the pin fixes the
377
+ // version only)
378
+ const pinnedOn = await pinnedTemplateLinksServed(db, orgId, [
379
+ ...new Set(own.flatMap((r) => (r.platform_template_id === null ? [] : [r.platform_template_id]))),
380
+ ]);
381
+ // the org's own templates it promoted: under their own ids, instead of their platform templates
382
+ const promoted = await db
383
+ .selectFrom("agent_templates as t")
384
+ .innerJoin("platform_agent_templates as p", "p.id", "t.platform_template_id")
385
+ .select(["t.id", "t.platform_template_id"])
386
+ .where("t.org_id", "=", orgId)
387
+ .where("t.deleted_at", "is", null)
388
+ .where("t.pinned_version", "is", null)
389
+ .where("p.owner_org_id", "=", orgId)
390
+ .where("p.deleted_at", "is", null)
58
391
  .execute();
59
- return new Map((await scopedRows(db, orgId, rows)).map((t) => [t.id, t]));
392
+ const promotedTo = new Set(promoted.map((r) => r.platform_template_id));
393
+ const served = promoted.length === 0
394
+ ? []
395
+ : [
396
+ ...(await loadTemplates(db, orgId, promoted.map((r) => r.id), log)).values(),
397
+ ];
398
+ const rows = [
399
+ ...(await normalized(db, orgId, [
400
+ ...own
401
+ .filter((r) => r.platform_template_id === null || pinnedOn.has(r.platform_template_id))
402
+ .map(orgRaw),
403
+ ...(await platformOn(db, orgId, undefined, log)).rows.filter((p) => !promotedTo.has(p.id)),
404
+ ])),
405
+ ...served,
406
+ ];
407
+ const key = (t) => [t.plugin ?? "", t.name, t.id];
408
+ return rows.sort((a, b) => {
409
+ const [x, y] = [key(a), key(b)];
410
+ for (let i = 0; i < x.length; i++) {
411
+ if (x[i] !== y[i])
412
+ return x[i] < y[i] ? -1 : 1;
413
+ }
414
+ return 0;
415
+ });
416
+ }
417
+ /**
418
+ * The one "org's own template" predicate (rulings P3-6, P3-46, P4-13), shared by the template
419
+ * routes and `OwnedItems`: the org's live row `id` is its own when it is an org template (no
420
+ * plugin, no catalog item) that is unlinked, or linked without a pin to a live platform row the
421
+ * org owns (promoted on share). Returns the row (`forUpdate`: locked), `{ own: false, name }` for
422
+ * a row of the org that is not its own (a plugin's template, a copy of another owner's platform
423
+ * template), or undefined when the org has no live row `id`.
424
+ */
425
+ export async function readOwnTemplate(db, orgId, id, forUpdate) {
426
+ let q = db
427
+ .selectFrom("agent_templates as t")
428
+ .leftJoin("platform_agent_templates as p", "p.id", "t.platform_template_id")
429
+ .select([
430
+ "t.id",
431
+ "t.name",
432
+ "t.current_version",
433
+ "t.shareable",
434
+ "t.plugin_name",
435
+ "t.catalog_item_id",
436
+ "t.platform_template_id",
437
+ "t.pinned_version",
438
+ "p.owner_org_id",
439
+ "p.deleted_at as p_deleted_at",
440
+ ])
441
+ .where("t.id", "=", id)
442
+ .where("t.org_id", "=", orgId)
443
+ .where("t.deleted_at", "is", null);
444
+ if (forUpdate)
445
+ q = q.forUpdate("t");
446
+ const r = await q.executeTakeFirst();
447
+ if (!r)
448
+ return undefined;
449
+ const notOwn = { own: false, name: r.name };
450
+ if (r.plugin_name !== null || r.catalog_item_id !== null)
451
+ return notOwn;
452
+ const own = {
453
+ id: r.id,
454
+ name: r.name,
455
+ current_version: r.current_version,
456
+ shareable: r.shareable,
457
+ };
458
+ if (r.platform_template_id === null)
459
+ return { ...own, link: null };
460
+ const promoted = r.pinned_version === null && r.owner_org_id === orgId && r.p_deleted_at === null;
461
+ return promoted ? { ...own, link: r.platform_template_id } : notOwn;
462
+ }
463
+ /**
464
+ * The listing view of a usable template; `linkedIds`: the org's unpinned copies linked to it (a
465
+ * platform template only).
466
+ */
467
+ export function templateViewOf(t, linkedIds) {
468
+ return {
469
+ id: t.id,
470
+ name: t.name,
471
+ plugin: t.plugin,
472
+ type: templateTypeOf(t.plugin, t.name),
473
+ description: typeof t.template.description === "string" ? t.template.description : "",
474
+ model: t.template.model ?? "inherit",
475
+ version: t.version,
476
+ sourceFormat: t.sourceFormat,
477
+ catalogItemId: t.catalogItemId,
478
+ catalogVersion: t.catalogVersion,
479
+ // the org's own template it promoted is the org's own, whatever version it serves
480
+ origin: t.ownedCopy ? "org" : t.origin,
481
+ ...(t.origin === "platform" && !t.ownedCopy && { linkedIds }),
482
+ };
60
483
  }
61
484
  /** Reads the org's agent templates (consumed by the roster, the agent page and Task 19's API). */
62
485
  let AgentTemplatesService = class AgentTemplatesService {
@@ -64,40 +487,35 @@ let AgentTemplatesService = class AgentTemplatesService {
64
487
  constructor(db) {
65
488
  this.db = db;
66
489
  }
67
- /** Every live template of the org, by plugin then name. */
490
+ /**
491
+ * Every usable template of the org ({@link usableTemplates}), by plugin then name; a platform
492
+ * template carries the ids of the org's unpinned copies linked to it (`linkedIds`).
493
+ */
68
494
  async listForOrg(orgId) {
69
- const rows = await baseQuery(this.db.db, orgId)
70
- .orderBy("t.plugin_name")
71
- .orderBy("t.name")
72
- .execute();
73
- return rows.map((r) => {
74
- const t = rowOf(r);
75
- return {
76
- id: t.id,
77
- name: t.name,
78
- plugin: t.plugin,
79
- type: `${t.plugin}:${t.name}`,
80
- description: typeof t.template.description === "string" ? t.template.description : "",
81
- model: t.template.model ?? "inherit",
82
- version: t.version,
83
- sourceFormat: t.sourceFormat,
84
- catalogItemId: t.catalogItemId,
85
- catalogVersion: t.catalogVersion,
86
- };
87
- });
495
+ const usable = await usableTemplates(this.db.db, orgId);
496
+ const platformIds = usable.filter((t) => t.origin === "platform").map((t) => t.id);
497
+ const links = platformIds.length === 0
498
+ ? []
499
+ : await this.db.db
500
+ .selectFrom("agent_templates")
501
+ .select(["id", "platform_template_id"])
502
+ .where("org_id", "=", orgId)
503
+ .where("deleted_at", "is", null)
504
+ .where("pinned_version", "is", null)
505
+ .where("platform_template_id", "in", platformIds)
506
+ .orderBy("id")
507
+ .execute();
508
+ const linked = new Map();
509
+ for (const l of links) {
510
+ const k = l.platform_template_id;
511
+ linked.set(k, [...(linked.get(k) ?? []), l.id]);
512
+ }
513
+ return usable.map((t) => templateViewOf(t, linked.get(t.id) ?? []));
88
514
  }
89
- /** A live template by id or by `<plugin>:<name>`; null when there is none. */
515
+ /** A usable template by id or by its roster type; null when there is none. */
90
516
  async resolve(orgId, ref) {
91
- const i = ref.indexOf(":");
92
- let q = baseQuery(this.db.db, orgId);
93
- q =
94
- i < 0
95
- ? q.where("t.id", "=", ref)
96
- : q.where("t.plugin_name", "=", ref.slice(0, i)).where("t.name", "=", ref.slice(i + 1));
97
- const r = await q.executeTakeFirst();
98
- if (!r)
99
- return null;
100
- const [t] = await scopedRows(this.db.db, orgId, [r]);
517
+ const t = (await loadTemplates(this.db.db, orgId, [ref])).get(ref) ??
518
+ (await usableTemplates(this.db.db, orgId)).find((u) => templateTypeOf(u.plugin, u.name) === ref);
101
519
  if (!t)
102
520
  return null;
103
521
  return { id: t.id, version: t.version, plugin: t.plugin, template: t.template };
@@ -109,9 +527,10 @@ AgentTemplatesService = __decorate([
109
527
  ], AgentTemplatesService);
110
528
  export { AgentTemplatesService };
111
529
  /**
112
- * Writes `template` as the org's live template `<plugin>:<name>` in the caller's transaction (the
113
- * caller holds the org row lock): a new template (version 1, `created`), a new version of the live
114
- * one when its definition differs (`changed`, the version added), or nothing when it is equal.
530
+ * Writes `template` as the org's live template `<plugin>:<name>` (the bare `<name>` when `plugin`
531
+ * is null) in the caller's transaction (the caller holds the org row lock): a new template
532
+ * (version 1, `created`), a new version of the live one when its definition differs (`changed`,
533
+ * the version added), or nothing when it is equal.
115
534
  */
116
535
  export async function putTemplateVersionIn(t, s, template) {
117
536
  const live = await t
@@ -119,7 +538,7 @@ export async function putTemplateVersionIn(t, s, template) {
119
538
  .innerJoin("agent_template_versions as v", (j) => j.onRef("v.template_id", "=", "a.id").onRef("v.version", "=", "a.current_version"))
120
539
  .select(["a.id", "a.current_version", "v.definition"])
121
540
  .where("a.org_id", "=", s.orgId)
122
- .where("a.plugin_name", "=", s.plugin)
541
+ .where((eb) => s.plugin === null ? eb("a.plugin_name", "is", null) : eb("a.plugin_name", "=", s.plugin))
123
542
  .where("a.name", "=", template.name)
124
543
  .where("a.deleted_at", "is", null)
125
544
  .forUpdate("a")
@@ -136,7 +555,7 @@ export async function putTemplateVersionIn(t, s, template) {
136
555
  id,
137
556
  org_id: s.orgId,
138
557
  name: template.name,
139
- catalog_item_id: s.catalogItemId,
558
+ catalog_item_id: s.catalogItemId ?? null,
140
559
  plugin_name: s.plugin,
141
560
  current_version: 1,
142
561
  })
@@ -155,7 +574,11 @@ export async function putTemplateVersionIn(t, s, template) {
155
574
  if (live) {
156
575
  await t
157
576
  .updateTable("agent_templates")
158
- .set({ current_version: version, catalog_item_id: s.catalogItemId, updated_at: new Date() })
577
+ .set({
578
+ current_version: version,
579
+ catalog_item_id: s.catalogItemId ?? null,
580
+ updated_at: new Date(),
581
+ })
159
582
  .where("id", "=", id)
160
583
  .execute();
161
584
  }
@@ -7,6 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { Module } from "@nestjs/common";
8
8
  import { ConversationAccessModule } from "../conversations/access.js";
9
9
  import { EventLogModule } from "../conversations/event-log.js";
10
+ import { EnvironmentsModule } from "../environments/environments.module.js";
10
11
  import { SandboxModule } from "../sandbox/sandbox.module.js";
11
12
  import { BackgroundTaskFinisher } from "./finish.js";
12
13
  import { BackgroundTaskStopper } from "./stop.js";
@@ -24,7 +25,13 @@ let BackgroundModule = class BackgroundModule {
24
25
  };
25
26
  BackgroundModule = __decorate([
26
27
  Module({
27
- imports: [BackgroundStoreModule, SandboxModule, EventLogModule, ConversationAccessModule],
28
+ imports: [
29
+ BackgroundStoreModule,
30
+ SandboxModule,
31
+ EnvironmentsModule,
32
+ EventLogModule,
33
+ ConversationAccessModule,
34
+ ],
28
35
  providers: [BackgroundTaskFinisher, BackgroundTaskStopper, BackgroundTasks],
29
36
  exports: [BackgroundStoreModule, BackgroundTaskFinisher, BackgroundTaskStopper, BackgroundTasks],
30
37
  })
@@ -6,9 +6,10 @@ import { type BackgroundTaskRow, BackgroundTaskStore } from "./store.js";
6
6
  export type BackgroundFinish = Parameters<BackgroundTaskStore["finish"]>[1];
7
7
  /**
8
8
  * Who stopped a task, when its finish must never wake the conversation: a person (who is looking at
9
- * it) or the deletion of the conversation.
9
+ * it), the deletion of the conversation, or the end of the sub-agent that owns it (a fork's run, a
10
+ * stopped background sub-agent).
10
11
  */
11
- export type BackgroundStoppedBy = "person" | "deletion";
12
+ export type BackgroundStoppedBy = "person" | "deletion" | "subagent_end";
12
13
  /** The idempotency key of a task's `background_task_finished` event. */
13
14
  export declare const finishedEventKey: (taskId: string) => string;
14
15
  /**
@@ -1,9 +1,10 @@
1
1
  import { TransactionHost } from "../infra/database/transaction-host.js";
2
2
  import { XactLock } from "../infra/database/xact-lock.js";
3
3
  /**
4
- * The launch lock of one sandbox (decision R9: one provider per transaction-scoped lock):
5
- * serializes background task reservations in a sandbox, so the count of running tasks checked
6
- * against `sandbox.background.maxTasks` and the insert of the new row are one step. Joins the
4
+ * The launch lock of one root conversation (decision R9: one provider per transaction-scoped
5
+ * lock): serializes background task reservations in its tree, so the count of running tasks
6
+ * checked against `sandbox.background.maxTasks` (per root conversation, whatever environment it
7
+ * works in) and the insert of the new row are one step. Joins the
7
8
  * caller's transaction (`mandatory`), which holds it until it ends.
8
9
  */
9
10
  export declare class BackgroundLaunchLock {