@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,21 +11,23 @@ import { isSafePackagePath, marketplaceEntryVersion, } from "@capybara-hq/plugin
11
11
  import { Inject, Injectable } from "@nestjs/common";
12
12
  import { sql } from "kysely";
13
13
  import { ApiError } from "../errors.js";
14
- import { ExtensionAdminOps } from "../extensions/admin-ops.js";
14
+ import { ExtensionAdmin } from "../extensions/admin-view.js";
15
15
  import { ExtensionInstalls } from "../extensions/installs.js";
16
+ import { PluginInstallLock } from "../extensions/locks.js";
16
17
  import { audit } from "../identity/audit.js";
17
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
18
+ import { SuperAdminLock } from "../identity/super-admin.js";
18
19
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
19
20
  import { KernelDb } from "../infra/database/kernel-db.js";
20
21
  import { TransactionHost } from "../infra/database/transaction-host.js";
21
22
  import { Transactional } from "../infra/database/transactional.decorator.js";
22
23
  import { sameRepository } from "../packages/provenance.js";
23
- import { countInstalls, itemView, marketplaceLatest } from "./catalog-items.js";
24
+ import { countInstalls, itemConfirmations, itemScopeFacts, itemView, marketplaceLatest, versionUsable, } from "./catalog-items.js";
24
25
  import { expandGitUrl, GitSourceError, gitErrorDetails, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
25
26
  import { fetchMarketplaceArchive, marketplaceNetPolicy, marketplaceUrlProblem, } from "./marketplace-fetch.js";
26
- import { entryCompatible, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, MarketplacesService, pluginNameFrom, } from "./marketplaces.service.js";
27
+ import { assertEntryNotDeprecated, entryCompatible, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, MarketplacesService, pluginNameFrom, } from "./marketplaces.service.js";
28
+ import { releaseExtensionClaim } from "./ownership.js";
27
29
  import { PluginImport } from "./plugin-import.js";
28
- import { cancelPendingRequests } from "./requests.service.js";
30
+ import { cancelPendingRequests } from "./request-rules.js";
29
31
  import { newestFirst } from "./versions.js";
30
32
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
31
33
  const notFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
@@ -77,34 +79,41 @@ function gitSource(loc, read, pinned) {
77
79
  export const CATALOG_LIST_DEFAULT_LIMIT = 200;
78
80
  export const CATALOG_LIST_MAX_LIMIT = 1000;
79
81
  /**
80
- * Enterprise catalog items (D9 / C21 / C22, `/api/v1/admin/catalog/*`, enterprise admins only). One
82
+ * Platform catalog items (D9 / C21 / C22, `/api/v1/admin/catalog/*`, super admins only). One
81
83
  * kind: every item is a plugin (spec §4), imported through {@link PluginImport} (prepare -> confirm,
82
- * one review); this service lists and shows items, changes policy, deletes, installs an item's
83
- * extension on the deployment, and prepares marketplace imports. Stateless, shared by every replica.
84
+ * one review, whose confirm installs the plugin's extension); this service lists and shows items,
85
+ * deletes, and prepares marketplace imports (scope and disable: `CatalogScopeService`). Stateless,
86
+ * shared by every replica.
84
87
  */
85
88
  let CatalogService = class CatalogService {
86
89
  kdb;
87
90
  adminLock;
88
91
  config;
89
92
  installs;
90
- ops;
93
+ admin;
91
94
  pluginImport;
92
95
  marketplaces;
96
+ installLock;
93
97
  txHost;
94
98
  constructor(kdb,
95
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the caller's transaction. */
96
- adminLock, config, installs, ops,
99
+ /** The super admin lock (identity/super-admin.ts): joins the caller's transaction. */
100
+ adminLock, config, installs,
101
+ /** The deployment's extensions with their approvals (what is pending confirmation). */
102
+ admin,
97
103
  /** Plugin import (a marketplace entry goes through its prepare). */
98
104
  pluginImport,
99
- /** The token of an enterprise marketplace (sent only to its URL's origin). */
100
- marketplaces, txHost) {
105
+ /** The token of a custom marketplace (sent only to its URL's origin). */
106
+ marketplaces,
107
+ /** Serializes a claim release with an install of that name still committing (F10). */
108
+ installLock, txHost) {
101
109
  this.kdb = kdb;
102
110
  this.adminLock = adminLock;
103
111
  this.config = config;
104
112
  this.installs = installs;
105
- this.ops = ops;
113
+ this.admin = admin;
106
114
  this.pluginImport = pluginImport;
107
115
  this.marketplaces = marketplaces;
116
+ this.installLock = installLock;
108
117
  this.txHost = txHost;
109
118
  }
110
119
  /** The kernel-schema handle of the current context (the transaction, else the pool). */
@@ -124,7 +133,8 @@ let CatalogService = class CatalogService {
124
133
  /**
125
134
  * Prepares the import of one marketplace entry (C25 / C26, spec §5.2): `version` defaults to the
126
135
  * newest compatible version the marketplace lists for `name`; the entry must be compatible with
127
- * the host (`marketplace.incompatible`); an npm source is downloaded from the configured registry
136
+ * the host (`marketplace.incompatible`) and not deprecated (`marketplace.entry_deprecated`, 409; the
137
+ * confirm does not read the marketplace again); an npm source is downloaded from the configured registry
128
138
  * and an archive source from its URL, both always verified against the marketplace's integrity
129
139
  * (`marketplace.integrity_mismatch`, nothing written). A `path` source is read from the git
130
140
  * marketplace's repository at its last refreshed commit (an http marketplace has none:
@@ -146,6 +156,7 @@ let CatalogService = class CatalogService {
146
156
  if (!entryCompatible(entry)) {
147
157
  throw new ApiError("marketplace.incompatible", `${entry.name}${version !== null ? `@${version}` : ""} needs kernel >= ${entry.minKernel}; this deployment runs kernel ${HOST_VERSIONS.kernel}`);
148
158
  }
159
+ assertEntryNotDeprecated(entry);
149
160
  const src = entry.source;
150
161
  const host = entrySourceHost(entry);
151
162
  if (host !== undefined && !hostAllowed(host, config)) {
@@ -327,6 +338,25 @@ let CatalogService = class CatalogService {
327
338
  }
328
339
  /** Same as {@link list}, plus the offset of the next page (null when there is none). */
329
340
  async page(q = {}) {
341
+ // `pending`: every item waiting for a confirmation (one list, not paged: the pending set is small)
342
+ if (q.pending === true) {
343
+ const all = await this.page({
344
+ ...(q.includeDeleted && { includeDeleted: true }),
345
+ limit: CATALOG_LIST_MAX_LIMIT,
346
+ });
347
+ const items = [...all.items];
348
+ let next = all.nextOffset;
349
+ while (next !== null) {
350
+ const more = await this.page({
351
+ ...(q.includeDeleted && { includeDeleted: true }),
352
+ limit: CATALOG_LIST_MAX_LIMIT,
353
+ offset: next,
354
+ });
355
+ items.push(...more.items);
356
+ next = more.nextOffset;
357
+ }
358
+ return { items: items.filter((i) => i.pending), nextOffset: null };
359
+ }
330
360
  const limit = Math.min(Math.max(1, q.limit ?? CATALOG_LIST_DEFAULT_LIMIT), CATALOG_LIST_MAX_LIMIT);
331
361
  const offset = Math.max(0, q.offset ?? 0);
332
362
  let query = this.db
@@ -354,19 +384,29 @@ let CatalogService = class CatalogService {
354
384
  "integrity",
355
385
  "source_detail",
356
386
  "imported_at",
387
+ "manifest",
388
+ "source_format",
389
+ "applied_at",
390
+ "rejected_at",
357
391
  ])
358
392
  .where("item_id", "in", items.map((i) => i.id))
359
393
  .execute();
394
+ const platformOwned = new Set(items.filter((i) => i.owner_org_id === null).map((i) => i.id));
360
395
  const byItem = new Map();
361
396
  for (const v of versions) {
397
+ // a platform item offers only versions it may use (a transferred org item's rejected or
398
+ // never-applied uploads stay out, ruling P3-52); an org item's pending ones show in 待确认
399
+ if (platformOwned.has(v.item_id) && !versionUsable(v))
400
+ continue;
362
401
  const list = byItem.get(v.item_id) ?? [];
363
402
  list.push(v);
364
403
  byItem.set(v.item_id, list);
365
404
  }
366
405
  const installs = await countInstalls(this.db, items, byItem);
367
406
  const latest = await marketplaceLatest(this.db, this.config.get(), items, byItem);
407
+ const facts = await itemScopeFacts(this.db, items, await itemConfirmations(this.admin, items, byItem));
368
408
  return {
369
- items: items.map((i) => itemView(i, byItem.get(i.id) ?? [], installs.get(i.id) ?? 0, latest.get(i.id))),
409
+ items: items.map((i) => itemView(i, byItem.get(i.id) ?? [], installs.get(i.id) ?? 0, latest.get(i.id), facts.get(i.id))),
370
410
  nextOffset,
371
411
  };
372
412
  }
@@ -381,20 +421,22 @@ let CatalogService = class CatalogService {
381
421
  .executeTakeFirst();
382
422
  if (!item)
383
423
  throw notFound();
384
- const rows = await this.db
424
+ const rows = (await this.db
385
425
  .selectFrom("catalog_item_versions")
386
426
  .selectAll()
387
427
  .where("item_id", "=", itemId)
388
- .execute();
428
+ .execute()).filter((v) => item.owner_org_id !== null || versionUsable(v));
389
429
  rows.sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at }, { version: b.version, importedAt: b.imported_at }));
390
430
  const byItem = new Map([[item.id, rows]]);
391
431
  const installs = await countInstalls(this.db, [item], byItem);
392
432
  const latest = await marketplaceLatest(this.db, this.config.get(), [item], byItem);
433
+ const facts = await itemScopeFacts(this.db, [item], await itemConfirmations(this.admin, [item], byItem));
393
434
  return {
394
435
  item: {
395
- ...itemView(item, rows, installs.get(item.id) ?? 0, latest.get(item.id)),
436
+ ...itemView(item, rows, installs.get(item.id) ?? 0, latest.get(item.id), facts.get(item.id)),
396
437
  packageName: item.package_name,
397
438
  deletedAt: item.deleted_at?.toISOString() ?? null,
439
+ platformVersion: item.platform_synced_version ?? item.latest_version,
398
440
  },
399
441
  versions: rows.map((v) => ({
400
442
  version: v.version,
@@ -416,43 +458,6 @@ let CatalogService = class CatalogService {
416
458
  })),
417
459
  };
418
460
  }
419
- /**
420
- * Changes the policy (audit `catalog.policy_changed`, not written when unchanged). Deleted /
421
- * missing -> `catalog.item_not_found`.
422
- */
423
- async setPolicy(actor, itemId, policy, opts = {}) {
424
- if (!UUID_RE.test(itemId))
425
- throw notFound();
426
- await this.writePolicy(actor, itemId, policy, opts);
427
- return this.view(itemId);
428
- }
429
- async writePolicy(actor, itemId, policy, opts) {
430
- const t = this.db;
431
- await this.adminLock.lockAndAuthorize(actor);
432
- const row = await t
433
- .selectFrom("catalog_items")
434
- .select(["name", "policy"])
435
- .where("id", "=", itemId)
436
- .where("deleted_at", "is", null)
437
- .forUpdate()
438
- .executeTakeFirst();
439
- if (!row)
440
- throw notFound();
441
- if (row.policy === policy)
442
- return;
443
- await t
444
- .updateTable("catalog_items")
445
- .set({ policy, updated_at: sql `now()` })
446
- .where("id", "=", itemId)
447
- .execute();
448
- await audit(t, {
449
- actorAccountId: actor,
450
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
451
- action: "catalog.policy_changed",
452
- target: itemId,
453
- detail: { name: row.name, from: row.policy, to: policy },
454
- });
455
- }
456
461
  /**
457
462
  * Deletes the item (soft delete, audit `catalog.removed`; requests still pending are cancelled in
458
463
  * the same transaction): versions and stored files are kept (installed components still refer to
@@ -465,84 +470,77 @@ let CatalogService = class CatalogService {
465
470
  await this.writeRemove(actor, itemId, opts);
466
471
  }
467
472
  async writeRemove(actor, itemId, opts) {
468
- const t = this.db;
469
473
  await this.adminLock.lockAndAuthorize(actor);
474
+ if ((await this.removeIn(actor, itemId, opts)) === null)
475
+ throw notFound();
476
+ }
477
+ /**
478
+ * The soft delete of {@link remove} in the caller's transaction, without its super admin check
479
+ * (pre-flight F14: the super admin's remove and an owner's delete or an org deletion,
480
+ * `OwnedItems.transferOrRemove`, share it): `deleted_at` set, a pending version cleared, the
481
+ * extension name claim of a first upload still waiting released (ruling P3-37, F10), pending
482
+ * requests cancelled, audit `catalog.removed` (`actor` null: the kernel). Returns the removed
483
+ * item's name, or null when it is gone already.
484
+ */
485
+ async removeIn(actor, itemId, opts = {}) {
486
+ const t = this.db;
487
+ const now = sql `now()`;
470
488
  const row = await t
471
489
  .updateTable("catalog_items")
472
490
  .set({
473
- deleted_at: sql `now()`,
474
- updated_at: sql `now()`,
491
+ deleted_at: now,
492
+ updated_at: now,
493
+ pending_version: null,
494
+ pending_by: null,
495
+ pending_at: null,
475
496
  })
476
497
  .where("id", "=", itemId)
477
498
  .where("deleted_at", "is", null)
478
- .returning(["name"])
499
+ .returning(["name", "awaiting_confirmation", "package_name", "owner_org_id"])
479
500
  .executeTakeFirst();
480
501
  if (!row)
481
- throw notFound();
502
+ return null;
503
+ // An org upload still waiting: free the name when nothing is installed under its claim
504
+ // (ruling P3-37, pre-flight F10). Under the install lock, so an install a running confirmation
505
+ // is committing is seen: that claim stays for its take-out or the cleanup job
506
+ if (row.awaiting_confirmation && row.package_name !== null) {
507
+ await this.installLock.lock(row.name);
508
+ await releaseExtensionClaim(t, row.name, row.package_name);
509
+ }
482
510
  // Pending requests for a deleted item are pointless: cancel them in the same transaction
483
511
  await cancelPendingRequests(t, { itemId }, actor, "item_removed", opts);
484
512
  await audit(t, {
485
513
  actorAccountId: actor,
486
514
  ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
515
+ // an org-owned item's removal shows in its owner org's audit log too
516
+ ...(row.owner_org_id !== null && { orgId: row.owner_org_id }),
487
517
  action: "catalog.removed",
488
518
  target: itemId,
489
- detail: { name: row.name },
490
- });
491
- }
492
- /**
493
- * Installs the extension of one version of an item on the deployment
494
- * (`ExtensionAdminOps.install`: a new install is disabled, a version change keeps the desired
495
- * state; audit `extension.installed`), with the install record linked to the item (F-AA). The
496
- * returned status may be `pending_approval` when the version's permissions are not approved yet.
497
- * A version without an extension -> `catalog.no_extension`; item or version missing ->
498
- * `catalog.item_not_found`.
499
- */
500
- async installToDeployment(actor, itemId, version, opts = {}) {
501
- if (!UUID_RE.test(itemId))
502
- throw notFound();
503
- const item = await this.db
504
- .selectFrom("catalog_items")
505
- .select(["id", "name"])
506
- .where("id", "=", itemId)
507
- .where("deleted_at", "is", null)
508
- .executeTakeFirst();
509
- if (!item)
510
- throw notFound();
511
- const v = await this.db
512
- .selectFrom("catalog_item_versions")
513
- .select("extension_sha256")
514
- .where("item_id", "=", itemId)
515
- .where("version", "=", version)
516
- .executeTakeFirst();
517
- if (!v) {
518
- throw new ApiError("catalog.item_not_found", `Version ${version} of this item not found`);
519
- }
520
- if (v.extension_sha256 === null) {
521
- throw new ApiError("catalog.no_extension", `Plugin ${item.name} ${version} has no extension; there is nothing to install on the deployment`);
522
- }
523
- return this.ops.install(item.name, v.extension_sha256, actor, opts.actorTokenId, {
524
- catalogItemId: itemId,
519
+ detail: {
520
+ name: row.name,
521
+ ...(row.owner_org_id !== null && { ownerOrgId: row.owner_org_id }),
522
+ ...(opts.reason !== undefined && { reason: opts.reason }),
523
+ },
525
524
  });
526
- }
527
- async view(itemId) {
528
- return (await this.get(itemId)).item;
525
+ return { name: row.name };
529
526
  }
530
527
  };
531
- __decorate([
532
- Transactional()
533
- ], CatalogService.prototype, "writePolicy", null);
534
528
  __decorate([
535
529
  Transactional()
536
530
  ], CatalogService.prototype, "writeRemove", null);
531
+ __decorate([
532
+ Transactional({ propagation: "mandatory" })
533
+ ], CatalogService.prototype, "removeIn", null);
537
534
  CatalogService = __decorate([
538
535
  Injectable(),
539
536
  __param(0, Inject(KernelDb)),
540
- __param(1, Inject(EnterpriseAdminLock)),
537
+ __param(1, Inject(SuperAdminLock)),
541
538
  __param(2, Inject(KernelConfigService)),
542
539
  __param(3, Inject(ExtensionInstalls)),
543
- __param(4, Inject(ExtensionAdminOps)),
540
+ __param(4, Inject(ExtensionAdmin)),
544
541
  __param(5, Inject(PluginImport)),
545
542
  __param(6, Inject(MarketplacesService)),
546
- __param(7, Inject(TransactionHost))
543
+ __param(7, Inject(PluginInstallLock)),
544
+ __param(8, Inject(TransactionHost))
547
545
  ], CatalogService);
548
546
  export { CatalogService };
@@ -4,11 +4,21 @@ import { type ExtensionCli } from "../extensions/cli.js";
4
4
  import type { KernelLogger } from "../log.js";
5
5
  import { CatalogService } from "./catalog.service.js";
6
6
  import { PluginImport } from "./plugin-import.js";
7
+ import type { PluginScope } from "./scope.js";
7
8
  /** {@link openCatalogCli}'s result: the extension CLI context plus the catalog services. */
8
9
  export interface CatalogCli extends ExtensionCli {
9
10
  catalog: CatalogService;
10
11
  /** Plugin import (prepare / confirm). The CLI acts without an account (actor `null`). */
11
12
  imports: PluginImport;
13
+ /**
14
+ * After an import's confirm: enqueues the item's plugin scope sync, as the admin console's
15
+ * confirm does, when its scope turns it on by itself (`all` or `named`). A failure only warns
16
+ * (the next worker start enqueues every item); returns whether it was enqueued.
17
+ */
18
+ enqueueScopeSync(item: {
19
+ id: string;
20
+ scope: PluginScope;
21
+ }): Promise<boolean>;
12
22
  }
13
23
  /** What the CLI can do with the deployment's object store, and why not when it cannot. */
14
24
  export type CliObjectStore = {
@@ -35,7 +45,7 @@ export declare function loadCliObjectStore(cli: Pick<ExtensionCli, "inspected" |
35
45
  * The CLI's plugin catalog context (`capybara plugins *`): {@link openExtensionCli} with the
36
46
  * catalog's {@link CatalogImportModule}, so {@link PluginImport} and {@link CatalogService} are the
37
47
  * kernel's providers. Imports run with actor `null` (the operator of the
38
- * deployment, like `capybara extensions install`: no enterprise-admin re-check, audits without an
48
+ * deployment, like `capybara extensions install`: no super-admin re-check, audits without an
39
49
  * actor, permission snapshots written with source `cli`). Files of the plugin (skills, connector
40
50
  * templates, icons) go to the deployment's object store, set up in-process from the declared or
41
51
  * installed object-store extension (see {@link loadCliObjectStore}; an installed package is synced
@@ -8,11 +8,15 @@ import { openExtensionCli } from "../extensions/cli.js";
8
8
  import { assertSecretsReachable } from "../extensions/host.js";
9
9
  import { importExtensionModule, matchesSection } from "../extensions/instance.js";
10
10
  import { packageRootOf, syncPackage } from "../extensions/sync.js";
11
+ import { KernelDb } from "../infra/database/kernel-db.js";
12
+ import { addJobOnce } from "../infra/queue/add-job-once.js";
13
+ import { REDIS } from "../infra/tokens.js";
11
14
  import { packagePath } from "../packages/tgz.js";
12
15
  import { PrefixedStorage } from "../storage/storage.service.js";
13
16
  import { CatalogImportModule } from "./catalog.module.js";
14
17
  import { CatalogService } from "./catalog.service.js";
15
18
  import { PluginImport } from "./plugin-import.js";
19
+ import { PLUGIN_SCOPE_QUEUE, scopeItemJob } from "./scope-sync.js";
16
20
  /**
17
21
  * Sets up the deployment's object-store extension inside the CLI process. The CLI hosts no
18
22
  * extensions, so this runs only the provider's `setup` with a context that offers `config` and
@@ -148,7 +152,7 @@ class CliStorage extends PrefixedStorage {
148
152
  * The CLI's plugin catalog context (`capybara plugins *`): {@link openExtensionCli} with the
149
153
  * catalog's {@link CatalogImportModule}, so {@link PluginImport} and {@link CatalogService} are the
150
154
  * kernel's providers. Imports run with actor `null` (the operator of the
151
- * deployment, like `capybara extensions install`: no enterprise-admin re-check, audits without an
155
+ * deployment, like `capybara extensions install`: no super-admin re-check, audits without an
152
156
  * actor, permission snapshots written with source `cli`). Files of the plugin (skills, connector
153
157
  * templates, icons) go to the deployment's object store, set up in-process from the declared or
154
158
  * installed object-store extension (see {@link loadCliObjectStore}; an installed package is synced
@@ -175,10 +179,31 @@ export async function openCatalogCli(config, log, opts = {}) {
175
179
  const imports = cli.app.get(PluginImport);
176
180
  imports.useCliStorage(storage);
177
181
  const catalog = cli.app.get(CatalogService);
182
+ const db = cli.app.get(KernelDb);
183
+ const redis = cli.app.get(REDIS);
178
184
  return {
179
185
  ...cli,
180
186
  catalog,
181
187
  imports,
188
+ async enqueueScopeSync(item) {
189
+ if (item.scope === "optional")
190
+ return false;
191
+ try {
192
+ const row = await db.db
193
+ .selectFrom("catalog_items")
194
+ .select("scope_version")
195
+ .where("id", "=", item.id)
196
+ .executeTakeFirst();
197
+ if (!row)
198
+ return false;
199
+ await addJobOnce(redis, PLUGIN_SCOPE_QUEUE, scopeItemJob(item.id, row.scope_version));
200
+ return true;
201
+ }
202
+ catch (err) {
203
+ log.warn("cannot enqueue the plugin scope sync; the next worker start converges the orgs", { itemId: item.id, err });
204
+ return false;
205
+ }
206
+ },
182
207
  async close() {
183
208
  await cli.close();
184
209
  await removeSyncDir();
@@ -0,0 +1,96 @@
1
+ import type { KernelSchemaDb } from "../db/kernel-schema.js";
2
+ import { ApiError } from "../errors.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
+ import { TransactionHost } from "../infra/database/transaction-host.js";
5
+ import { StorageService } from "../storage/storage.service.js";
6
+ /** The kinds an org owns as rows of its own (connector templates have none). */
7
+ export type PromotableKind = "skill" | "agent_template";
8
+ /**
9
+ * An org's own skill (org scope) or agent template, as the admin component routes see it: not
10
+ * linked (`link` null), or linked to a platform row the same org owns (`link`: that row, already
11
+ * promoted). A copy linked to a platform row of another owner is never an `OrgRow`.
12
+ */
13
+ export interface OrgRow {
14
+ kind: PromotableKind;
15
+ id: string;
16
+ orgId: string;
17
+ name: string;
18
+ /** The roster plugin of an agent template (null: a bare `<name>`); null for skills. */
19
+ plugin: string | null;
20
+ version: number;
21
+ shareable: boolean;
22
+ /** The platform row the org promoted it to, or null while it is an org row only. */
23
+ link: string | null;
24
+ /**
25
+ * Content the org created itself (ruling P3-46): a skill without plugin provenance
26
+ * (`catalog_item_id` null); an agent template without a plugin and a catalog item (an org
27
+ * template saved from an agent, ruling P4-13). Anything else is refused with 409
28
+ * `catalog.not_owned`.
29
+ */
30
+ ownable: boolean;
31
+ }
32
+ /** A promotion whose files are copied ({@link ComponentPromotion.prepare}), waiting for its rows. */
33
+ export interface PreparedPromotion {
34
+ readonly kind: PromotableKind;
35
+ readonly orgRowId: string;
36
+ readonly orgId: string;
37
+ /** The platform id it gets (the existing one when the row is promoted already). */
38
+ readonly platformId: string;
39
+ /** The org row's version the files were copied from. */
40
+ readonly version: number;
41
+ readonly already: boolean;
42
+ /** Where the files were copied (a fresh prefix, ruling P3-45); null: nothing copied. */
43
+ readonly prefix: string | null;
44
+ }
45
+ /** The org row changed between {@link ComponentPromotion.prepare} and its transaction: prepare again. */
46
+ export declare class PromotionStale extends Error {
47
+ }
48
+ /** How many times a caller prepares again after {@link PromotionStale}. */
49
+ export declare const PROMOTION_ATTEMPTS = 3;
50
+ /** 409 `catalog.not_owned`: only the org's own rows can be shared (P3-6). */
51
+ export declare function notOwnedError(what: string): ApiError;
52
+ /** 409 `component.version_stale`: the org row kept changing while it was being promoted. */
53
+ export declare const promotionStaleError: () => ApiError;
54
+ /**
55
+ * Promotes an org's own skill or agent template to a platform row when it is first shared
56
+ * (ruling P3-3). Stateless, shared by every replica.
57
+ */
58
+ export declare class ComponentPromotion {
59
+ private readonly kdb;
60
+ /** Where files are read and written (the kernel's object storage). */
61
+ private readonly files;
62
+ readonly txHost: TransactionHost;
63
+ constructor(kdb: KernelDb,
64
+ /** Where files are read and written (the kernel's object storage). */
65
+ files: StorageService, txHost: TransactionHost);
66
+ private get db();
67
+ /**
68
+ * The live org row `id` of `kind` (an org-scope skill, an agent template) of a live org, when it
69
+ * is the org's own (see {@link OrgRow}); undefined otherwise.
70
+ */
71
+ orgRow(kind: PromotableKind, id: string, forUpdate?: boolean): Promise<OrgRow | undefined>;
72
+ /**
73
+ * The first phase, outside any transaction: reads the org row and (a skill) copies its current
74
+ * version's files to `deployment/platform/skills/<platformId>/<version>/`, checking each file
75
+ * against the manifest. A row promoted already needs nothing. A failed copy throws and nothing is
76
+ * linked (the copied files stay unreferenced). Missing or not the org's own -> 404.
77
+ */
78
+ prepare(kind: PromotableKind, orgRowId: string): Promise<PreparedPromotion>;
79
+ /** Deletes a prepared promotion's files after its transaction failed (best effort, P3-45). */
80
+ discard(p: PreparedPromotion): Promise<void>;
81
+ /**
82
+ * The second phase, in the caller's transaction: re-reads the org row under its lock (after the
83
+ * org row, so an org deletion is serialized), checks the share gate on it (409
84
+ * `catalog.not_shareable`) and writes the platform row (`current_version` = the org row's, one
85
+ * version row at that number), its list `[owner]`, and the link (no pin). Idempotent: a row the
86
+ * org promoted already returns its platform id. A version written since {@link prepare} ->
87
+ * {@link PromotionStale}; a live platform row of the same name created in this org already (a
88
+ * shared item whose owner deleted it and then made a new one) -> 409 `plugin.skill_conflict`.
89
+ * Audits `component.promoted`. Returns the platform id.
90
+ */
91
+ promote(p: PreparedPromotion, actor: string | null): Promise<string>;
92
+ /** Copies the skill's current version files to its platform prefix (outside any transaction). */
93
+ private copySkillFiles;
94
+ }
95
+ /** {@link ComponentPromotion.orgRow} through `db` (readers outside the provider). */
96
+ export declare function readOrgRow(db: KernelSchemaDb, kind: PromotableKind, id: string, forUpdate?: boolean): Promise<OrgRow | undefined>;