@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.11

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 (1170) hide show
  1. package/bootstrap.json +85 -5
  2. package/dist/admin/admin.controller.d.ts +52 -71
  3. package/dist/admin/admin.controller.js +117 -63
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/admin.schemas.d.ts +60 -0
  7. package/dist/admin/admin.schemas.js +50 -0
  8. package/dist/admin/extensions.controller.d.ts +47 -16
  9. package/dist/admin/extensions.controller.js +94 -23
  10. package/dist/admin/extensions.schemas.d.ts +7 -0
  11. package/dist/admin/extensions.schemas.js +10 -0
  12. package/dist/admin/limit-defaults.d.ts +20 -0
  13. package/dist/admin/limit-defaults.js +10 -0
  14. package/dist/admin/setup-lock.d.ts +16 -0
  15. package/dist/admin/setup-lock.js +47 -0
  16. package/dist/admin/setup.controller.d.ts +9 -9
  17. package/dist/admin/setup.controller.js +28 -26
  18. package/dist/admin/setup.service.d.ts +20 -28
  19. package/dist/admin/setup.service.js +65 -65
  20. package/dist/agents/agent-lookup.d.ts +72 -0
  21. package/dist/agents/agent-lookup.js +208 -0
  22. package/dist/agents/agent-profile.service.d.ts +31 -0
  23. package/dist/agents/agent-profile.service.js +122 -0
  24. package/dist/agents/agents.controller.d.ts +54 -169
  25. package/dist/agents/agents.controller.js +172 -37
  26. package/dist/agents/agents.module.d.ts +10 -0
  27. package/dist/agents/agents.module.js +71 -0
  28. package/dist/agents/agents.schemas.d.ts +389 -0
  29. package/dist/agents/agents.schemas.js +126 -0
  30. package/dist/agents/agents.service.d.ts +104 -76
  31. package/dist/agents/agents.service.js +509 -383
  32. package/dist/agents/definition.d.ts +133 -21
  33. package/dist/agents/definition.js +361 -41
  34. package/dist/agents/from-template.d.ts +106 -0
  35. package/dist/agents/from-template.js +680 -0
  36. package/dist/agents/from-template.service.d.ts +72 -0
  37. package/dist/agents/from-template.service.js +178 -0
  38. package/dist/agents/instruction-files.d.ts +60 -0
  39. package/dist/agents/instruction-files.js +111 -0
  40. package/dist/agents/models.controller.d.ts +44 -6
  41. package/dist/agents/models.controller.js +84 -8
  42. package/dist/agents/org-templates.d.ts +186 -0
  43. package/dist/agents/org-templates.js +868 -0
  44. package/dist/agents/pending-connector-requests.d.ts +79 -0
  45. package/dist/agents/pending-connector-requests.js +215 -0
  46. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  47. package/dist/agents/pending-connectors.controller.js +91 -0
  48. package/dist/agents/pending-connectors.service.d.ts +62 -0
  49. package/dist/agents/pending-connectors.service.js +282 -0
  50. package/dist/agents/profile.d.ts +114 -0
  51. package/dist/agents/profile.js +55 -0
  52. package/dist/agents/readiness.controller.d.ts +26 -0
  53. package/dist/agents/readiness.controller.js +56 -0
  54. package/dist/agents/templates.controller.d.ts +78 -6
  55. package/dist/agents/templates.controller.js +154 -8
  56. package/dist/agents/templates.d.ts +132 -30
  57. package/dist/agents/templates.js +500 -46
  58. package/dist/agents/templates.schemas.d.ts +20 -0
  59. package/dist/agents/templates.schemas.js +45 -0
  60. package/dist/app.d.ts +93 -0
  61. package/dist/app.js +150 -0
  62. package/dist/background/background.controller.d.ts +38 -0
  63. package/dist/background/background.controller.js +88 -0
  64. package/dist/background/background.module.d.ts +10 -0
  65. package/dist/background/background.module.js +39 -0
  66. package/dist/background/background.schemas.d.ts +10 -0
  67. package/dist/background/background.schemas.js +16 -0
  68. package/dist/background/finish.d.ts +44 -0
  69. package/dist/background/finish.js +95 -0
  70. package/dist/background/launch-lock.d.ts +15 -0
  71. package/dist/background/launch-lock.js +40 -0
  72. package/dist/background/launch.d.ts +42 -0
  73. package/dist/background/launch.js +77 -0
  74. package/dist/background/poll.job.d.ts +56 -0
  75. package/dist/background/poll.job.js +195 -0
  76. package/dist/background/render.d.ts +23 -0
  77. package/dist/background/render.js +48 -0
  78. package/dist/background/session.d.ts +48 -0
  79. package/dist/background/session.js +80 -0
  80. package/dist/background/status.d.ts +35 -0
  81. package/dist/background/status.js +57 -0
  82. package/dist/background/stop.d.ts +68 -0
  83. package/dist/background/stop.js +244 -0
  84. package/dist/background/store.d.ts +167 -0
  85. package/dist/background/store.js +361 -0
  86. package/dist/background/store.module.d.ts +6 -0
  87. package/dist/background/store.module.js +22 -0
  88. package/dist/background/tasks.service.d.ts +77 -0
  89. package/dist/background/tasks.service.js +216 -0
  90. package/dist/background/wake-rules.d.ts +66 -0
  91. package/dist/background/wake-rules.js +113 -0
  92. package/dist/background/wake.d.ts +30 -0
  93. package/dist/background/wake.js +63 -0
  94. package/dist/catalog/admin-catalog.controller.d.ts +102 -52
  95. package/dist/catalog/admin-catalog.controller.js +222 -67
  96. package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
  97. package/dist/catalog/admin-catalog.schemas.js +92 -0
  98. package/dist/catalog/catalog-content.d.ts +264 -0
  99. package/dist/catalog/catalog-content.js +430 -0
  100. package/dist/catalog/catalog-files.d.ts +41 -0
  101. package/dist/catalog/catalog-files.js +86 -0
  102. package/dist/catalog/catalog-import.module.d.ts +7 -0
  103. package/dist/catalog/catalog-import.module.js +60 -0
  104. package/dist/catalog/catalog-items.d.ts +290 -0
  105. package/dist/catalog/catalog-items.js +677 -0
  106. package/dist/catalog/catalog-scope.service.d.ts +286 -0
  107. package/dist/catalog/catalog-scope.service.js +1196 -0
  108. package/dist/catalog/catalog.module.d.ts +12 -0
  109. package/dist/catalog/catalog.module.js +81 -0
  110. package/dist/catalog/catalog.service.d.ts +144 -207
  111. package/dist/catalog/catalog.service.js +258 -528
  112. package/dist/catalog/claude/agents.js +15 -10
  113. package/dist/catalog/claude/translate.js +3 -0
  114. package/dist/catalog/cli.d.ts +14 -3
  115. package/dist/catalog/cli.js +39 -32
  116. package/dist/catalog/component-promotion.d.ts +96 -0
  117. package/dist/catalog/component-promotion.js +395 -0
  118. package/dist/catalog/component-scope.controller.d.ts +90 -0
  119. package/dist/catalog/component-scope.controller.js +234 -0
  120. package/dist/catalog/component-scope.schemas.d.ts +118 -0
  121. package/dist/catalog/component-scope.schemas.js +97 -0
  122. package/dist/catalog/component-scope.service.d.ts +366 -0
  123. package/dist/catalog/component-scope.service.js +1115 -0
  124. package/dist/catalog/component-state.d.ts +197 -0
  125. package/dist/catalog/component-state.js +473 -0
  126. package/dist/catalog/git-source.d.ts +9 -1
  127. package/dist/catalog/git-source.js +29 -2
  128. package/dist/catalog/job-ids.d.ts +45 -0
  129. package/dist/catalog/job-ids.js +40 -0
  130. package/dist/catalog/jobs.d.ts +27 -0
  131. package/dist/catalog/jobs.js +70 -0
  132. package/dist/catalog/locks.d.ts +24 -0
  133. package/dist/catalog/locks.js +63 -0
  134. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  135. package/dist/catalog/marketplace-icons.d.ts +64 -0
  136. package/dist/catalog/marketplace-icons.js +131 -0
  137. package/dist/catalog/marketplaces.controller.d.ts +53 -44
  138. package/dist/catalog/marketplaces.controller.js +146 -51
  139. package/dist/catalog/marketplaces.schemas.d.ts +48 -0
  140. package/dist/catalog/marketplaces.schemas.js +53 -0
  141. package/dist/catalog/marketplaces.service.d.ts +136 -26
  142. package/dist/catalog/marketplaces.service.js +663 -281
  143. package/dist/catalog/org-catalog.controller.d.ts +115 -63
  144. package/dist/catalog/org-catalog.controller.js +207 -100
  145. package/dist/catalog/org-catalog.schemas.d.ts +88 -0
  146. package/dist/catalog/org-catalog.schemas.js +93 -0
  147. package/dist/catalog/org-catalog.service.d.ts +89 -216
  148. package/dist/catalog/org-catalog.service.js +434 -472
  149. package/dist/catalog/org-extension-switch.d.ts +41 -0
  150. package/dist/catalog/org-extension-switch.js +115 -0
  151. package/dist/catalog/org-extension.controller.d.ts +113 -0
  152. package/dist/catalog/org-extension.controller.js +271 -0
  153. package/dist/catalog/org-extension.schemas.d.ts +15 -0
  154. package/dist/catalog/org-extension.schemas.js +22 -0
  155. package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
  156. package/dist/catalog/org-plugin-uploads.controller.js +200 -0
  157. package/dist/catalog/org-plugin-uploads.d.ts +71 -0
  158. package/dist/catalog/org-plugin-uploads.js +122 -0
  159. package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
  160. package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
  161. package/dist/catalog/owned-items.d.ts +188 -0
  162. package/dist/catalog/owned-items.js +808 -0
  163. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  164. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  165. package/dist/catalog/ownership.d.ts +172 -0
  166. package/dist/catalog/ownership.js +326 -0
  167. package/dist/catalog/platform-components.d.ts +243 -0
  168. package/dist/catalog/platform-components.js +872 -0
  169. package/dist/catalog/platform-migration.d.ts +115 -0
  170. package/dist/catalog/platform-migration.js +583 -0
  171. package/dist/catalog/plugin-import.d.ts +293 -71
  172. package/dist/catalog/plugin-import.js +1039 -281
  173. package/dist/catalog/plugin-install.d.ts +271 -66
  174. package/dist/catalog/plugin-install.js +1198 -344
  175. package/dist/catalog/plugin-package.d.ts +41 -4
  176. package/dist/catalog/plugin-package.js +140 -7
  177. package/dist/catalog/plugin-upgrade.d.ts +312 -188
  178. package/dist/catalog/plugin-upgrade.js +1371 -1065
  179. package/dist/catalog/request-rules.d.ts +65 -0
  180. package/dist/catalog/request-rules.js +217 -0
  181. package/dist/catalog/requests.service.d.ts +205 -117
  182. package/dist/catalog/requests.service.js +612 -369
  183. package/dist/catalog/reserved-names.d.ts +8 -0
  184. package/dist/catalog/reserved-names.js +42 -0
  185. package/dist/catalog/scope-orgs.d.ts +21 -0
  186. package/dist/catalog/scope-orgs.js +67 -0
  187. package/dist/catalog/scope-state.d.ts +35 -0
  188. package/dist/catalog/scope-state.js +87 -0
  189. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  190. package/dist/catalog/scope-sync-workers.js +29 -0
  191. package/dist/catalog/scope-sync.d.ts +176 -0
  192. package/dist/catalog/scope-sync.js +576 -0
  193. package/dist/catalog/scope.d.ts +42 -0
  194. package/dist/catalog/scope.js +42 -0
  195. package/dist/catalog/unshare.d.ts +22 -0
  196. package/dist/catalog/unshare.js +119 -0
  197. package/dist/channels/actions.d.ts +6 -4
  198. package/dist/channels/actions.js +11 -4
  199. package/dist/channels/cards.d.ts +33 -11
  200. package/dist/channels/cards.js +96 -24
  201. package/dist/channels/channels.module.d.ts +40 -0
  202. package/dist/channels/channels.module.js +130 -0
  203. package/dist/channels/channels.schemas.d.ts +37 -0
  204. package/dist/channels/channels.schemas.js +38 -0
  205. package/dist/channels/connections.controller.d.ts +44 -37
  206. package/dist/channels/connections.controller.js +83 -38
  207. package/dist/channels/connections.service.d.ts +101 -30
  208. package/dist/channels/connections.service.js +380 -147
  209. package/dist/channels/inbound.d.ts +44 -38
  210. package/dist/channels/inbound.js +190 -44
  211. package/dist/channels/job-ids.d.ts +10 -0
  212. package/dist/channels/job-ids.js +10 -0
  213. package/dist/channels/jobs.d.ts +85 -0
  214. package/dist/channels/jobs.js +157 -0
  215. package/dist/channels/outbound.d.ts +71 -80
  216. package/dist/channels/outbound.js +219 -202
  217. package/dist/channels/phrases.d.ts +33 -2
  218. package/dist/channels/phrases.js +29 -1
  219. package/dist/channels/supervisor.d.ts +88 -46
  220. package/dist/channels/supervisor.js +230 -132
  221. package/dist/channels/threads.d.ts +34 -8
  222. package/dist/channels/threads.js +79 -13
  223. package/dist/channels/webhook.d.ts +20 -14
  224. package/dist/channels/webhook.js +51 -20
  225. package/dist/config/docs.js +5 -1
  226. package/dist/config/load.d.ts +3 -2
  227. package/dist/config/load.js +3 -2
  228. package/dist/config/nacos-source.js +11 -2
  229. package/dist/config/schema.d.ts +36 -2
  230. package/dist/config/schema.js +226 -25
  231. package/dist/conversations/access.d.ts +31 -0
  232. package/dist/conversations/access.js +110 -0
  233. package/dist/conversations/agent-tree.d.ts +46 -0
  234. package/dist/conversations/agent-tree.js +92 -0
  235. package/dist/conversations/artifacts.d.ts +11 -11
  236. package/dist/conversations/artifacts.js +36 -10
  237. package/dist/conversations/attachments.controller.d.ts +1 -1
  238. package/dist/conversations/attachments.controller.js +8 -6
  239. package/dist/conversations/attachments.module.d.ts +7 -0
  240. package/dist/conversations/attachments.module.js +25 -0
  241. package/dist/conversations/attachments.service.d.ts +60 -22
  242. package/dist/conversations/attachments.service.js +249 -51
  243. package/dist/conversations/conversations.controller.d.ts +86 -50
  244. package/dist/conversations/conversations.controller.js +184 -103
  245. package/dist/conversations/conversations.module.d.ts +8 -0
  246. package/dist/conversations/conversations.module.js +72 -0
  247. package/dist/conversations/conversations.schemas.d.ts +52 -0
  248. package/dist/conversations/conversations.schemas.js +79 -0
  249. package/dist/conversations/conversations.service.d.ts +166 -49
  250. package/dist/conversations/conversations.service.js +383 -179
  251. package/dist/conversations/environment-status.d.ts +24 -0
  252. package/dist/conversations/environment-status.js +71 -0
  253. package/dist/conversations/event-log.d.ts +64 -27
  254. package/dist/conversations/event-log.js +167 -31
  255. package/dist/conversations/events.d.ts +252 -9
  256. package/dist/conversations/events.js +243 -32
  257. package/dist/conversations/files.d.ts +10 -10
  258. package/dist/conversations/files.js +37 -11
  259. package/dist/conversations/idem-keys.d.ts +5 -0
  260. package/dist/conversations/idem-keys.js +5 -0
  261. package/dist/conversations/job-ids.d.ts +6 -0
  262. package/dist/conversations/job-ids.js +6 -0
  263. package/dist/conversations/message-context.d.ts +79 -0
  264. package/dist/conversations/message-context.js +145 -0
  265. package/dist/conversations/outputs-read.d.ts +11 -11
  266. package/dist/conversations/outputs-read.js +31 -7
  267. package/dist/conversations/queue.d.ts +53 -58
  268. package/dist/conversations/queue.js +37 -293
  269. package/dist/conversations/queue.service.d.ts +60 -0
  270. package/dist/conversations/queue.service.js +350 -0
  271. package/dist/conversations/titles.d.ts +83 -27
  272. package/dist/conversations/titles.js +195 -71
  273. package/dist/conversations/tree.d.ts +17 -0
  274. package/dist/conversations/tree.js +42 -0
  275. package/dist/ctx/bus.js +9 -3
  276. package/dist/ctx/create-ctx.d.ts +26 -1
  277. package/dist/ctx/create-ctx.js +45 -16
  278. package/dist/ctx/lock.d.ts +7 -3
  279. package/dist/ctx/lock.js +9 -20
  280. package/dist/ctx/secrets.d.ts +10 -2
  281. package/dist/ctx/secrets.js +7 -3
  282. package/dist/db/kernel-schema.d.ts +589 -27
  283. package/dist/db/pool.d.ts +10 -0
  284. package/dist/db/pool.js +4 -0
  285. package/dist/devices/device-auth.controller.d.ts +42 -0
  286. package/dist/devices/device-auth.controller.js +116 -0
  287. package/dist/devices/device-auth.d.ts +119 -0
  288. package/dist/devices/device-auth.js +403 -0
  289. package/dist/devices/device-auth.module.d.ts +7 -0
  290. package/dist/devices/device-auth.module.js +25 -0
  291. package/dist/devices/device-gateway.d.ts +128 -0
  292. package/dist/devices/device-gateway.js +530 -0
  293. package/dist/devices/device-provider.d.ts +89 -0
  294. package/dist/devices/device-provider.js +151 -0
  295. package/dist/devices/device-routes.d.ts +36 -0
  296. package/dist/devices/device-routes.js +90 -0
  297. package/dist/devices/devices.module.d.ts +16 -0
  298. package/dist/devices/devices.module.js +44 -0
  299. package/dist/devices/dto.d.ts +66 -0
  300. package/dist/devices/dto.js +44 -0
  301. package/dist/devices/keys.d.ts +25 -0
  302. package/dist/devices/keys.js +25 -0
  303. package/dist/devices/machines.d.ts +118 -0
  304. package/dist/devices/machines.js +366 -0
  305. package/dist/devices/relay.d.ts +100 -0
  306. package/dist/devices/relay.js +373 -0
  307. package/dist/devices/targets.d.ts +28 -0
  308. package/dist/devices/targets.js +73 -0
  309. package/dist/environments/access.d.ts +66 -0
  310. package/dist/environments/access.js +113 -0
  311. package/dist/environments/conversation-environments.d.ts +75 -0
  312. package/dist/environments/conversation-environments.js +231 -0
  313. package/dist/environments/dto.d.ts +25 -0
  314. package/dist/environments/dto.js +12 -0
  315. package/dist/environments/environments.controller.d.ts +36 -0
  316. package/dist/environments/environments.controller.js +124 -0
  317. package/dist/environments/environments.module.d.ts +8 -0
  318. package/dist/environments/environments.module.js +31 -0
  319. package/dist/environments/environments.schemas.d.ts +3 -0
  320. package/dist/environments/environments.schemas.js +14 -0
  321. package/dist/environments/environments.service.d.ts +251 -0
  322. package/dist/environments/environments.service.js +791 -0
  323. package/dist/environments/label.d.ts +11 -0
  324. package/dist/environments/label.js +25 -0
  325. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  326. package/dist/environments/legacy-cleanup.job.js +141 -0
  327. package/dist/errors.d.ts +160 -2
  328. package/dist/errors.js +160 -2
  329. package/dist/evals/budget.d.ts +42 -21
  330. package/dist/evals/budget.js +114 -62
  331. package/dist/evals/evals.module.d.ts +31 -0
  332. package/dist/evals/evals.module.js +114 -0
  333. package/dist/evals/evals.schemas.d.ts +110 -0
  334. package/dist/evals/evals.schemas.js +107 -0
  335. package/dist/evals/jobs.d.ts +20 -0
  336. package/dist/evals/jobs.js +45 -0
  337. package/dist/evals/reconstruct.d.ts +18 -9
  338. package/dist/evals/reconstruct.js +36 -10
  339. package/dist/evals/recorded-tools.d.ts +37 -1
  340. package/dist/evals/recorded-tools.js +120 -10
  341. package/dist/evals/run-replay.d.ts +75 -10
  342. package/dist/evals/run-replay.js +218 -94
  343. package/dist/evals/runs.controller.d.ts +3 -58
  344. package/dist/evals/runs.controller.js +18 -50
  345. package/dist/evals/runs.service.d.ts +31 -52
  346. package/dist/evals/runs.service.js +281 -255
  347. package/dist/evals/sets.controller.d.ts +3 -29
  348. package/dist/evals/sets.controller.js +18 -39
  349. package/dist/evals/sets.service.d.ts +29 -13
  350. package/dist/evals/sets.service.js +262 -202
  351. package/dist/evals/snapshot.d.ts +5 -4
  352. package/dist/evals/snapshot.js +17 -4
  353. package/dist/evals/step-replay.d.ts +6 -8
  354. package/dist/evals/step-replay.js +17 -10
  355. package/dist/evals/trajectory.controller.d.ts +1 -1
  356. package/dist/evals/trajectory.controller.js +11 -7
  357. package/dist/evals/trajectory.d.ts +2 -2
  358. package/dist/evals/trajectory.js +1 -1
  359. package/dist/evals/trajectory.service.d.ts +13 -7
  360. package/dist/evals/trajectory.service.js +56 -21
  361. package/dist/evals/worker.d.ts +48 -31
  362. package/dist/evals/worker.js +229 -124
  363. package/dist/extensions/admin-ops.d.ts +133 -41
  364. package/dist/extensions/admin-ops.js +378 -172
  365. package/dist/extensions/admin-view.d.ts +82 -32
  366. package/dist/extensions/admin-view.js +284 -71
  367. package/dist/extensions/approvals.d.ts +24 -10
  368. package/dist/extensions/approvals.js +73 -46
  369. package/dist/extensions/blobs.d.ts +27 -10
  370. package/dist/extensions/blobs.js +112 -45
  371. package/dist/extensions/bootstrap.d.ts +99 -36
  372. package/dist/extensions/bootstrap.js +290 -134
  373. package/dist/extensions/cli.d.ts +32 -10
  374. package/dist/extensions/cli.js +52 -98
  375. package/dist/extensions/config-hash.d.ts +10 -0
  376. package/dist/extensions/config-hash.js +38 -0
  377. package/dist/extensions/config-issues.d.ts +19 -0
  378. package/dist/extensions/config-issues.js +48 -0
  379. package/dist/extensions/config-json-schema.d.ts +43 -7
  380. package/dist/extensions/config-json-schema.js +124 -58
  381. package/dist/extensions/deployment-config-store.d.ts +55 -0
  382. package/dist/extensions/deployment-config-store.js +133 -0
  383. package/dist/extensions/deployment-config.d.ts +146 -70
  384. package/dist/extensions/deployment-config.js +439 -246
  385. package/dist/extensions/display-name.d.ts +22 -0
  386. package/dist/extensions/display-name.js +77 -0
  387. package/dist/extensions/effective-config.d.ts +127 -0
  388. package/dist/extensions/effective-config.js +368 -0
  389. package/dist/extensions/enabled.d.ts +5 -5
  390. package/dist/extensions/extensions.module.d.ts +8 -0
  391. package/dist/extensions/extensions.module.js +96 -0
  392. package/dist/extensions/hooks.d.ts +40 -6
  393. package/dist/extensions/hooks.js +83 -17
  394. package/dist/extensions/host.d.ts +161 -80
  395. package/dist/extensions/host.js +505 -213
  396. package/dist/extensions/installs.d.ts +73 -19
  397. package/dist/extensions/installs.js +174 -37
  398. package/dist/extensions/job-ids.d.ts +6 -0
  399. package/dist/extensions/job-ids.js +6 -0
  400. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  401. package/dist/extensions/lifecycle-topics.js +18 -0
  402. package/dist/extensions/lifecycle.d.ts +35 -47
  403. package/dist/extensions/lifecycle.js +103 -39
  404. package/dist/extensions/locks.d.ts +45 -0
  405. package/dist/extensions/locks.js +112 -0
  406. package/dist/extensions/migrate-lock.d.ts +3 -4
  407. package/dist/extensions/org-config.d.ts +141 -49
  408. package/dist/extensions/org-config.js +471 -243
  409. package/dist/extensions/org-levels.d.ts +37 -0
  410. package/dist/extensions/org-levels.js +71 -0
  411. package/dist/extensions/org-overrides.d.ts +151 -0
  412. package/dist/extensions/org-overrides.js +524 -0
  413. package/dist/extensions/package.d.ts +14 -1
  414. package/dist/extensions/package.js +51 -2
  415. package/dist/extensions/permission-view.d.ts +59 -6
  416. package/dist/extensions/permission-view.js +7 -5
  417. package/dist/extensions/plugin-guides.d.ts +129 -0
  418. package/dist/extensions/plugin-guides.js +283 -0
  419. package/dist/extensions/plugin-icons.d.ts +54 -0
  420. package/dist/extensions/plugin-icons.js +125 -0
  421. package/dist/extensions/plugin-items.d.ts +21 -0
  422. package/dist/extensions/plugin-items.js +42 -0
  423. package/dist/extensions/point-defaults.controller.d.ts +28 -0
  424. package/dist/extensions/point-defaults.controller.js +69 -0
  425. package/dist/extensions/point-defaults.d.ts +73 -0
  426. package/dist/extensions/point-defaults.js +236 -0
  427. package/dist/extensions/point-defaults.schemas.d.ts +9 -0
  428. package/dist/extensions/point-defaults.schemas.js +14 -0
  429. package/dist/extensions/registry.d.ts +50 -2
  430. package/dist/extensions/registry.js +91 -4
  431. package/dist/extensions/resolve.d.ts +51 -1
  432. package/dist/extensions/resolve.js +85 -3
  433. package/dist/extensions/single-provider.d.ts +92 -0
  434. package/dist/extensions/single-provider.js +180 -0
  435. package/dist/extensions/sources.d.ts +19 -10
  436. package/dist/extensions/sources.js +34 -13
  437. package/dist/extensions/state.module.d.ts +9 -0
  438. package/dist/extensions/state.module.js +38 -0
  439. package/dist/extensions/unavailable.d.ts +50 -0
  440. package/dist/extensions/unavailable.js +115 -0
  441. package/dist/files/files.module.d.ts +3 -0
  442. package/dist/files/files.module.js +22 -0
  443. package/dist/files/previewers.controller.d.ts +7 -2
  444. package/dist/files/previewers.controller.js +19 -12
  445. package/dist/files/previewers.d.ts +21 -19
  446. package/dist/files/previewers.js +114 -38
  447. package/dist/files/previewers.schemas.d.ts +10 -0
  448. package/dist/files/previewers.schemas.js +9 -0
  449. package/dist/http/adapter.d.ts +3 -0
  450. package/dist/http/adapter.js +25 -0
  451. package/dist/http/api.module.d.ts +3 -110
  452. package/dist/http/api.module.js +93 -358
  453. package/dist/http/app.d.ts +22 -17
  454. package/dist/http/app.js +46 -65
  455. package/dist/http/error-filter.module.d.ts +5 -0
  456. package/dist/http/error-filter.module.js +18 -0
  457. package/dist/http/error.filter.js +2 -2
  458. package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +7 -3
  459. package/dist/http/gateway-routes.js +16 -0
  460. package/dist/http/nest-logger.d.ts +6 -5
  461. package/dist/http/nest-logger.js +24 -10
  462. package/dist/http/plugin-dispatch.d.ts +4 -1
  463. package/dist/http/plugin-dispatch.js +14 -2
  464. package/dist/identity/accounts.d.ts +137 -38
  465. package/dist/identity/accounts.js +386 -186
  466. package/dist/identity/api-tokens.d.ts +11 -7
  467. package/dist/identity/api-tokens.js +71 -44
  468. package/dist/identity/audit.d.ts +9 -5
  469. package/dist/identity/audit.js +5 -1
  470. package/dist/identity/auth.controller.d.ts +11 -10
  471. package/dist/identity/auth.controller.js +40 -30
  472. package/dist/identity/auth.guard.d.ts +16 -8
  473. package/dist/identity/auth.guard.js +41 -13
  474. package/dist/identity/binding.d.ts +9 -11
  475. package/dist/identity/binding.js +41 -13
  476. package/dist/identity/cookies.d.ts +26 -5
  477. package/dist/identity/cookies.js +58 -6
  478. package/dist/identity/external-identity-lock.d.ts +17 -0
  479. package/dist/identity/external-identity-lock.js +39 -0
  480. package/dist/identity/external.d.ts +19 -15
  481. package/dist/identity/external.js +163 -125
  482. package/dist/identity/identity.module.d.ts +6 -0
  483. package/dist/identity/identity.module.js +59 -0
  484. package/dist/identity/initial-passwords.controller.d.ts +22 -0
  485. package/dist/identity/initial-passwords.controller.js +49 -0
  486. package/dist/identity/initial-passwords.d.ts +61 -0
  487. package/dist/identity/initial-passwords.job.d.ts +16 -0
  488. package/dist/identity/initial-passwords.job.js +46 -0
  489. package/dist/identity/initial-passwords.js +159 -0
  490. package/dist/identity/me.controller.d.ts +32 -15
  491. package/dist/identity/me.controller.js +80 -33
  492. package/dist/identity/me.schemas.d.ts +24 -0
  493. package/dist/identity/me.schemas.js +25 -0
  494. package/dist/identity/principal.d.ts +11 -3
  495. package/dist/identity/principal.js +11 -3
  496. package/dist/identity/sessions.d.ts +24 -10
  497. package/dist/identity/sessions.js +119 -42
  498. package/dist/identity/settings.d.ts +69 -23
  499. package/dist/identity/settings.js +201 -72
  500. package/dist/identity/sso.controller.d.ts +7 -7
  501. package/dist/identity/sso.controller.js +13 -9
  502. package/dist/identity/sso.d.ts +9 -12
  503. package/dist/identity/sso.js +54 -24
  504. package/dist/identity/super-admin.d.ts +20 -0
  505. package/dist/identity/super-admin.js +81 -0
  506. package/dist/inbox/inbox.module.d.ts +6 -0
  507. package/dist/inbox/inbox.module.js +26 -0
  508. package/dist/inbox/inbox.schemas.d.ts +8 -0
  509. package/dist/inbox/inbox.schemas.js +11 -0
  510. package/dist/inbox/inbox.service.d.ts +68 -11
  511. package/dist/inbox/inbox.service.js +104 -13
  512. package/dist/inbox/org-notices.d.ts +63 -0
  513. package/dist/inbox/org-notices.js +91 -0
  514. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  515. package/dist/inbox/platform-inbox.controller.js +58 -0
  516. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  517. package/dist/inbox/platform-inbox.service.js +263 -0
  518. package/dist/inbox/platform-notices.d.ts +19 -0
  519. package/dist/inbox/platform-notices.js +9 -0
  520. package/dist/index.d.ts +22 -13
  521. package/dist/index.js +16 -7
  522. package/dist/infra/cache/cache.module.d.ts +3 -0
  523. package/dist/infra/cache/cache.module.js +16 -0
  524. package/dist/infra/cache/cache.service.d.ts +21 -0
  525. package/dist/infra/cache/cache.service.js +80 -0
  526. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  527. package/dist/infra/cache/cacheable.decorator.js +83 -0
  528. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  529. package/dist/infra/cli/kernel-cli.module.js +173 -0
  530. package/dist/infra/close-within.d.ts +15 -0
  531. package/dist/infra/close-within.js +36 -0
  532. package/dist/infra/config/config.module.d.ts +13 -0
  533. package/dist/infra/config/config.module.js +39 -0
  534. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  535. package/dist/infra/config/kernel-config.service.js +157 -0
  536. package/dist/infra/database/after-commit.d.ts +6 -0
  537. package/dist/infra/database/after-commit.js +9 -0
  538. package/dist/infra/database/database.module.d.ts +25 -0
  539. package/dist/infra/database/database.module.js +91 -0
  540. package/dist/infra/database/kernel-db.d.ts +22 -0
  541. package/dist/infra/database/kernel-db.js +65 -0
  542. package/dist/infra/database/transaction-host.d.ts +50 -0
  543. package/dist/infra/database/transaction-host.js +125 -0
  544. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  545. package/dist/infra/database/transactional.decorator.js +27 -0
  546. package/dist/infra/database/xact-lock.d.ts +17 -0
  547. package/dist/infra/database/xact-lock.js +43 -0
  548. package/dist/infra/events/kernel-events.d.ts +121 -0
  549. package/dist/infra/events/kernel-events.js +65 -0
  550. package/dist/infra/health/health.controller.d.ts +26 -0
  551. package/dist/infra/health/health.controller.js +104 -0
  552. package/dist/infra/health/health.module.d.ts +9 -0
  553. package/dist/infra/health/health.module.js +24 -0
  554. package/dist/infra/health/health.options.d.ts +10 -0
  555. package/dist/infra/health/health.options.js +15 -0
  556. package/dist/infra/health/shutdown-state.d.ts +6 -0
  557. package/dist/infra/health/shutdown-state.js +2 -0
  558. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  559. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  560. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  561. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  562. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  563. package/dist/infra/lifecycle/process-guards.js +90 -0
  564. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  565. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  566. package/dist/infra/lock/key-template.d.ts +13 -0
  567. package/dist/infra/lock/key-template.js +46 -0
  568. package/dist/infra/lock/lock.module.d.ts +3 -0
  569. package/dist/infra/lock/lock.module.js +16 -0
  570. package/dist/infra/lock/lock.service.d.ts +120 -0
  571. package/dist/infra/lock/lock.service.js +343 -0
  572. package/dist/infra/lock/shared-lease.d.ts +44 -0
  573. package/dist/infra/lock/shared-lease.js +121 -0
  574. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  575. package/dist/infra/lock/with-lock.decorator.js +49 -0
  576. package/dist/infra/logging/logging.module.d.ts +18 -0
  577. package/dist/infra/logging/logging.module.js +52 -0
  578. package/dist/infra/queue/add-job-once.d.ts +14 -0
  579. package/dist/infra/queue/add-job-once.js +16 -0
  580. package/dist/infra/queue/configured-processor.d.ts +18 -0
  581. package/dist/infra/queue/configured-processor.js +23 -0
  582. package/dist/infra/queue/job-failure.d.ts +18 -0
  583. package/dist/infra/queue/job-failure.js +26 -0
  584. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  585. package/dist/infra/queue/queue-shutdown.js +81 -0
  586. package/dist/infra/queue/queue.module.d.ts +16 -0
  587. package/dist/infra/queue/queue.module.js +61 -0
  588. package/dist/infra/queue/redis-connection.d.ts +13 -0
  589. package/dist/infra/queue/redis-connection.js +25 -0
  590. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  591. package/dist/infra/queue/retired-schedulers.js +9 -0
  592. package/dist/infra/queue/run-job.d.ts +16 -0
  593. package/dist/infra/queue/run-job.js +19 -0
  594. package/dist/infra/redis/redis.module.d.ts +24 -0
  595. package/dist/infra/redis/redis.module.js +91 -0
  596. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  597. package/dist/infra/schedule/cron-tick.js +25 -0
  598. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  599. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  600. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  601. package/dist/infra/schedule/locked-interval.js +190 -0
  602. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  603. package/dist/infra/schedule/locked-tick.js +137 -0
  604. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  605. package/dist/infra/schedule/schedule.module.js +27 -0
  606. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  607. package/dist/infra/schedule/scheduled-runs.js +163 -0
  608. package/dist/infra/swagger/swagger.d.ts +16 -0
  609. package/dist/infra/swagger/swagger.js +31 -0
  610. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  611. package/dist/infra/throttler/credential-throttler.js +77 -0
  612. package/dist/infra/throttler/named-throttlers.d.ts +36 -0
  613. package/dist/infra/throttler/named-throttlers.js +157 -0
  614. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  615. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  616. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  617. package/dist/infra/throttler/throttler.guard.js +68 -0
  618. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  619. package/dist/infra/throttler/throttler.module.js +53 -0
  620. package/dist/infra/tokens.d.ts +20 -0
  621. package/dist/infra/tokens.js +20 -0
  622. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  623. package/dist/infra/validation/create-zod-dto.js +35 -0
  624. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  625. package/dist/infra/validation/parse-with-zod.js +12 -0
  626. package/dist/infra/validation/validation.module.d.ts +3 -0
  627. package/dist/infra/validation/validation.module.js +16 -0
  628. package/dist/infra/validation/zod-params.d.ts +7 -0
  629. package/dist/infra/validation/zod-params.js +42 -0
  630. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  631. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  632. package/dist/kernel.d.ts +9 -244
  633. package/dist/kernel.js +8 -1305
  634. package/dist/kernel.module.d.ts +17 -0
  635. package/dist/kernel.module.js +145 -0
  636. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  637. package/dist/lifecycle/kernel-lifecycle.js +465 -0
  638. package/dist/lifecycle/tokens.d.ts +3 -0
  639. package/dist/lifecycle/tokens.js +3 -0
  640. package/dist/log-context.d.ts +2 -0
  641. package/dist/log-context.js +4 -0
  642. package/dist/log.d.ts +13 -1
  643. package/dist/log.js +93 -17
  644. package/dist/models/embeddings.d.ts +82 -0
  645. package/dist/models/embeddings.js +326 -0
  646. package/dist/models/enablement.controller.d.ts +40 -0
  647. package/dist/models/enablement.controller.js +74 -0
  648. package/dist/models/enablement.d.ts +101 -0
  649. package/dist/models/enablement.js +264 -0
  650. package/dist/models/models.module.d.ts +7 -0
  651. package/dist/models/models.module.js +36 -0
  652. package/dist/models/org-models.schemas.d.ts +8 -0
  653. package/dist/models/org-models.schemas.js +22 -0
  654. package/dist/models/prices.d.ts +13 -5
  655. package/dist/models/prices.js +69 -39
  656. package/dist/models/purposes.controller.d.ts +6 -4
  657. package/dist/models/purposes.controller.js +16 -11
  658. package/dist/models/purposes.d.ts +103 -23
  659. package/dist/models/purposes.js +208 -77
  660. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  661. package/dist/orgs/directory-sync.controller.js +2 -2
  662. package/dist/orgs/directory-sync.d.ts +74 -35
  663. package/dist/orgs/directory-sync.js +243 -132
  664. package/dist/orgs/invitations.controller.d.ts +8 -8
  665. package/dist/orgs/invitations.controller.js +27 -26
  666. package/dist/orgs/invitations.service.d.ts +12 -9
  667. package/dist/orgs/invitations.service.js +130 -92
  668. package/dist/orgs/job-ids.d.ts +8 -0
  669. package/dist/orgs/job-ids.js +8 -0
  670. package/dist/orgs/members.service.d.ts +19 -12
  671. package/dist/orgs/members.service.js +161 -117
  672. package/dist/orgs/offboarding.d.ts +61 -60
  673. package/dist/orgs/offboarding.js +206 -95
  674. package/dist/orgs/org-lock.d.ts +33 -19
  675. package/dist/orgs/org-lock.js +94 -35
  676. package/dist/orgs/org.guard.d.ts +11 -1
  677. package/dist/orgs/org.guard.js +45 -34
  678. package/dist/orgs/orgs.controller.d.ts +13 -16
  679. package/dist/orgs/orgs.controller.js +29 -20
  680. package/dist/orgs/orgs.module.d.ts +6 -0
  681. package/dist/orgs/orgs.module.js +71 -0
  682. package/dist/orgs/orgs.schemas.d.ts +8 -0
  683. package/dist/orgs/orgs.schemas.js +16 -0
  684. package/dist/orgs/orgs.service.d.ts +47 -21
  685. package/dist/orgs/orgs.service.js +166 -91
  686. package/dist/orgs/roles.d.ts +1 -1
  687. package/dist/orgs/roles.js +5 -1
  688. package/dist/orgs/settings.controller.d.ts +2 -2
  689. package/dist/orgs/settings.controller.js +8 -6
  690. package/dist/orgs/settings.service.d.ts +76 -14
  691. package/dist/orgs/settings.service.js +140 -51
  692. package/dist/overrides.d.ts +63 -0
  693. package/dist/overrides.js +34 -0
  694. package/dist/platform/actor.d.ts +48 -0
  695. package/dist/platform/actor.js +100 -0
  696. package/dist/platform/agent-docs.d.ts +18 -0
  697. package/dist/platform/agent-docs.js +59 -0
  698. package/dist/platform/availability.d.ts +14 -0
  699. package/dist/platform/availability.js +43 -0
  700. package/dist/platform/errors.d.ts +28 -0
  701. package/dist/platform/errors.js +65 -0
  702. package/dist/platform/exclusions.d.ts +11 -0
  703. package/dist/platform/exclusions.js +683 -0
  704. package/dist/platform/method.d.ts +6 -0
  705. package/dist/platform/method.js +15 -0
  706. package/dist/platform/operation.d.ts +169 -0
  707. package/dist/platform/operation.js +94 -0
  708. package/dist/platform/ops/accounts.ops.d.ts +32 -0
  709. package/dist/platform/ops/accounts.ops.js +291 -0
  710. package/dist/platform/ops/admin.ops.d.ts +38 -0
  711. package/dist/platform/ops/admin.ops.js +407 -0
  712. package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
  713. package/dist/platform/ops/agent-skills.ops.js +226 -0
  714. package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
  715. package/dist/platform/ops/agent-templates.ops.js +272 -0
  716. package/dist/platform/ops/agents.ops.d.ts +37 -0
  717. package/dist/platform/ops/agents.ops.js +717 -0
  718. package/dist/platform/ops/approvals.ops.d.ts +30 -0
  719. package/dist/platform/ops/approvals.ops.js +116 -0
  720. package/dist/platform/ops/background.ops.d.ts +14 -0
  721. package/dist/platform/ops/background.ops.js +134 -0
  722. package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
  723. package/dist/platform/ops/catalog-admin.ops.js +599 -0
  724. package/dist/platform/ops/channels.ops.d.ts +16 -0
  725. package/dist/platform/ops/channels.ops.js +195 -0
  726. package/dist/platform/ops/components.ops.d.ts +46 -0
  727. package/dist/platform/ops/components.ops.js +854 -0
  728. package/dist/platform/ops/connectors.ops.d.ts +17 -0
  729. package/dist/platform/ops/connectors.ops.js +188 -0
  730. package/dist/platform/ops/conversations.ops.d.ts +30 -0
  731. package/dist/platform/ops/conversations.ops.js +470 -0
  732. package/dist/platform/ops/environments.ops.d.ts +26 -0
  733. package/dist/platform/ops/environments.ops.js +311 -0
  734. package/dist/platform/ops/errors.d.ts +16 -0
  735. package/dist/platform/ops/errors.js +30 -0
  736. package/dist/platform/ops/evals.ops.d.ts +28 -0
  737. package/dist/platform/ops/evals.ops.js +783 -0
  738. package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
  739. package/dist/platform/ops/extensions-admin.ops.js +372 -0
  740. package/dist/platform/ops/extensions.ops.d.ts +25 -0
  741. package/dist/platform/ops/extensions.ops.js +347 -0
  742. package/dist/platform/ops/inbox.ops.d.ts +25 -0
  743. package/dist/platform/ops/inbox.ops.js +378 -0
  744. package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
  745. package/dist/platform/ops/marketplaces.ops.js +466 -0
  746. package/dist/platform/ops/models.ops.d.ts +25 -0
  747. package/dist/platform/ops/models.ops.js +232 -0
  748. package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
  749. package/dist/platform/ops/org-plugins.ops.js +329 -0
  750. package/dist/platform/ops/org-settings.ops.d.ts +18 -0
  751. package/dist/platform/ops/org-settings.ops.js +127 -0
  752. package/dist/platform/ops/orgs.ops.d.ts +28 -0
  753. package/dist/platform/ops/orgs.ops.js +296 -0
  754. package/dist/platform/ops/other-orgs.d.ts +20 -0
  755. package/dist/platform/ops/other-orgs.js +72 -0
  756. package/dist/platform/ops/paging.d.ts +14 -0
  757. package/dist/platform/ops/paging.js +20 -0
  758. package/dist/platform/ops/platform.ops.d.ts +30 -0
  759. package/dist/platform/ops/platform.ops.js +231 -0
  760. package/dist/platform/ops/plugins.ops.d.ts +35 -0
  761. package/dist/platform/ops/plugins.ops.js +476 -0
  762. package/dist/platform/ops/previewers.ops.d.ts +14 -0
  763. package/dist/platform/ops/previewers.ops.js +109 -0
  764. package/dist/platform/ops/requests.ops.d.ts +14 -0
  765. package/dist/platform/ops/requests.ops.js +191 -0
  766. package/dist/platform/ops/role.d.ts +4 -0
  767. package/dist/platform/ops/role.js +10 -0
  768. package/dist/platform/ops/skills.ops.d.ts +17 -0
  769. package/dist/platform/ops/skills.ops.js +216 -0
  770. package/dist/platform/ops/summary.d.ts +10 -0
  771. package/dist/platform/ops/summary.js +18 -0
  772. package/dist/platform/ops/themes.ops.d.ts +14 -0
  773. package/dist/platform/ops/themes.ops.js +47 -0
  774. package/dist/platform/ops/unavailable.d.ts +23 -0
  775. package/dist/platform/ops/unavailable.js +118 -0
  776. package/dist/platform/parity.d.ts +33 -0
  777. package/dist/platform/parity.js +272 -0
  778. package/dist/platform/platform-ops.module.d.ts +40 -0
  779. package/dist/platform/platform-ops.module.js +127 -0
  780. package/dist/platform/platform.module.d.ts +8 -0
  781. package/dist/platform/platform.module.js +25 -0
  782. package/dist/platform/registry.d.ts +30 -0
  783. package/dist/platform/registry.js +111 -0
  784. package/dist/platform/route-schemas.d.ts +18 -0
  785. package/dist/platform/route-schemas.js +66 -0
  786. package/dist/roles/gateway-role.d.ts +54 -0
  787. package/dist/roles/gateway-role.js +118 -0
  788. package/dist/roles/gateway.module.d.ts +9 -0
  789. package/dist/roles/gateway.module.js +31 -0
  790. package/dist/roles/worker-role.d.ts +65 -0
  791. package/dist/roles/worker-role.js +151 -0
  792. package/dist/roles/worker.module.d.ts +14 -0
  793. package/dist/roles/worker.module.js +106 -0
  794. package/dist/runtime/abort.js +19 -2
  795. package/dist/runtime/checkpointer.d.ts +8 -3
  796. package/dist/runtime/checkpointer.js +87 -55
  797. package/dist/runtime/context/build.d.ts +21 -13
  798. package/dist/runtime/context/build.js +106 -29
  799. package/dist/runtime/context/claude-tools.d.ts +4 -1
  800. package/dist/runtime/context/claude-tools.js +13 -12
  801. package/dist/runtime/context/compaction.js +24 -1
  802. package/dist/runtime/context/environment-paths.d.ts +40 -0
  803. package/dist/runtime/context/environment-paths.js +48 -0
  804. package/dist/runtime/context/legacy-text.d.ts +22 -0
  805. package/dist/runtime/context/legacy-text.js +37 -0
  806. package/dist/runtime/context/reminders.d.ts +2 -0
  807. package/dist/runtime/context/reminders.js +2 -0
  808. package/dist/runtime/context/run-context.d.ts +65 -0
  809. package/dist/runtime/context/run-context.js +215 -0
  810. package/dist/runtime/context/skills.d.ts +29 -11
  811. package/dist/runtime/context/skills.js +46 -32
  812. package/dist/runtime/context/tool-changes.d.ts +27 -0
  813. package/dist/runtime/context/tool-changes.js +60 -0
  814. package/dist/runtime/conversation-lock.d.ts +20 -11
  815. package/dist/runtime/conversation-lock.js +62 -72
  816. package/dist/runtime/hook-calls.d.ts +11 -4
  817. package/dist/runtime/hook-calls.js +41 -13
  818. package/dist/runtime/job-ids.d.ts +10 -0
  819. package/dist/runtime/job-ids.js +10 -0
  820. package/dist/runtime/langgraph-loop.d.ts +3 -1
  821. package/dist/runtime/langgraph-loop.js +37 -18
  822. package/dist/runtime/loop.d.ts +42 -6
  823. package/dist/runtime/loop.js +14 -0
  824. package/dist/runtime/maintenance-queue.d.ts +10 -0
  825. package/dist/runtime/maintenance-queue.js +10 -0
  826. package/dist/runtime/maintenance.d.ts +50 -74
  827. package/dist/runtime/maintenance.js +166 -137
  828. package/dist/runtime/model-call.d.ts +61 -15
  829. package/dist/runtime/model-call.js +128 -84
  830. package/dist/runtime/providers.d.ts +158 -27
  831. package/dist/runtime/providers.js +373 -63
  832. package/dist/runtime/quota.d.ts +17 -3
  833. package/dist/runtime/quota.js +27 -2
  834. package/dist/runtime/retired-schedulers.d.ts +7 -0
  835. package/dist/runtime/retired-schedulers.js +31 -0
  836. package/dist/runtime/run-context.service.d.ts +65 -0
  837. package/dist/runtime/run-context.service.js +236 -0
  838. package/dist/runtime/run-control.d.ts +43 -0
  839. package/dist/runtime/run-control.js +89 -0
  840. package/dist/runtime/run-drafts.d.ts +85 -0
  841. package/dist/runtime/run-drafts.js +230 -0
  842. package/dist/runtime/run-finish.d.ts +27 -18
  843. package/dist/runtime/run-finish.js +98 -51
  844. package/dist/runtime/run-jobs.d.ts +46 -0
  845. package/dist/runtime/run-jobs.js +91 -0
  846. package/dist/runtime/run-processors.d.ts +60 -0
  847. package/dist/runtime/run-processors.js +185 -0
  848. package/dist/runtime/run-queue.d.ts +90 -58
  849. package/dist/runtime/run-queue.js +566 -297
  850. package/dist/runtime/run-steps.d.ts +39 -0
  851. package/dist/runtime/run-steps.js +96 -0
  852. package/dist/runtime/run-worker.d.ts +134 -77
  853. package/dist/runtime/run-worker.js +412 -237
  854. package/dist/runtime/runtime.module.d.ts +10 -0
  855. package/dist/runtime/runtime.module.js +122 -0
  856. package/dist/runtime/step-log.d.ts +51 -0
  857. package/dist/runtime/step-log.js +111 -0
  858. package/dist/runtime/stream.controller.d.ts +28 -9
  859. package/dist/runtime/stream.controller.js +72 -13
  860. package/dist/runtime/stream.d.ts +27 -6
  861. package/dist/runtime/stream.js +102 -7
  862. package/dist/runtime/subagents/child.d.ts +58 -51
  863. package/dist/runtime/subagents/child.js +105 -86
  864. package/dist/runtime/subagents/definition.d.ts +32 -28
  865. package/dist/runtime/subagents/definition.js +89 -143
  866. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  867. package/dist/runtime/subagents/deliveries.js +228 -0
  868. package/dist/runtime/subagents/dispatch.d.ts +197 -27
  869. package/dist/runtime/subagents/dispatch.js +336 -270
  870. package/dist/runtime/subagents/limits.d.ts +32 -8
  871. package/dist/runtime/subagents/limits.js +44 -8
  872. package/dist/runtime/subagents/messages.d.ts +95 -0
  873. package/dist/runtime/subagents/messages.js +328 -0
  874. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  875. package/dist/runtime/subagents/org-agents.js +3 -2
  876. package/dist/runtime/subagents/preamble.d.ts +4 -4
  877. package/dist/runtime/subagents/preamble.js +9 -7
  878. package/dist/runtime/subagents/progress.d.ts +10 -8
  879. package/dist/runtime/subagents/progress.js +11 -6
  880. package/dist/runtime/subagents/render.d.ts +30 -0
  881. package/dist/runtime/subagents/render.js +53 -0
  882. package/dist/runtime/subagents/roster.d.ts +27 -10
  883. package/dist/runtime/subagents/roster.js +49 -13
  884. package/dist/runtime/subagents/skill-fork.d.ts +10 -10
  885. package/dist/runtime/subagents/skill-fork.js +23 -8
  886. package/dist/runtime/subagents/status.d.ts +14 -0
  887. package/dist/runtime/subagents/status.js +23 -0
  888. package/dist/runtime/subagents/subagents.service.d.ts +43 -0
  889. package/dist/runtime/subagents/subagents.service.js +106 -0
  890. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  891. package/dist/runtime/usage-report-jobs.js +158 -0
  892. package/dist/runtime/usage-report.d.ts +121 -83
  893. package/dist/runtime/usage-report.js +355 -181
  894. package/dist/runtime/waits.d.ts +258 -81
  895. package/dist/runtime/waits.js +800 -263
  896. package/dist/sandbox/job-ids.d.ts +10 -0
  897. package/dist/sandbox/job-ids.js +10 -0
  898. package/dist/sandbox/jobs.d.ts +68 -0
  899. package/dist/sandbox/jobs.js +150 -0
  900. package/dist/sandbox/leases.d.ts +73 -82
  901. package/dist/sandbox/leases.js +162 -346
  902. package/dist/sandbox/providers.d.ts +46 -0
  903. package/dist/sandbox/providers.js +83 -0
  904. package/dist/sandbox/sandbox.module.d.ts +9 -0
  905. package/dist/sandbox/sandbox.module.js +36 -0
  906. package/dist/sandbox/sandbox.service.d.ts +359 -151
  907. package/dist/sandbox/sandbox.service.js +950 -435
  908. package/dist/sandbox/unreachable.d.ts +30 -0
  909. package/dist/sandbox/unreachable.js +108 -0
  910. package/dist/skills/catalog.d.ts +40 -26
  911. package/dist/skills/catalog.js +120 -99
  912. package/dist/skills/changes.controller.d.ts +11 -4
  913. package/dist/skills/changes.controller.js +34 -9
  914. package/dist/skills/changes.service.d.ts +31 -21
  915. package/dist/skills/changes.service.js +426 -368
  916. package/dist/skills/invocable.controller.d.ts +2 -2
  917. package/dist/skills/invocable.controller.js +10 -7
  918. package/dist/skills/invocation-keys.d.ts +1 -1
  919. package/dist/skills/invocation-keys.js +1 -1
  920. package/dist/skills/invoke.d.ts +19 -18
  921. package/dist/skills/invoke.js +68 -24
  922. package/dist/skills/package.d.ts +20 -1
  923. package/dist/skills/package.js +28 -1
  924. package/dist/skills/skills.controller.d.ts +33 -7
  925. package/dist/skills/skills.controller.js +79 -12
  926. package/dist/skills/skills.module.d.ts +6 -0
  927. package/dist/skills/skills.module.js +39 -0
  928. package/dist/skills/skills.schemas.d.ts +48 -0
  929. package/dist/skills/skills.schemas.js +61 -0
  930. package/dist/skills/skills.service.d.ts +151 -44
  931. package/dist/skills/skills.service.js +636 -204
  932. package/dist/skills/usable.d.ts +81 -0
  933. package/dist/skills/usable.js +379 -0
  934. package/dist/storage/job-ids.d.ts +6 -0
  935. package/dist/storage/job-ids.js +6 -0
  936. package/dist/storage/purge.d.ts +22 -7
  937. package/dist/storage/purge.js +55 -3
  938. package/dist/storage/storage.module.d.ts +6 -0
  939. package/dist/storage/storage.module.js +23 -0
  940. package/dist/storage/storage.service.d.ts +18 -4
  941. package/dist/storage/storage.service.js +44 -3
  942. package/dist/themes/render-css.d.ts +12 -0
  943. package/dist/themes/render-css.js +132 -0
  944. package/dist/themes/theme-delivery.service.d.ts +34 -0
  945. package/dist/themes/theme-delivery.service.js +111 -0
  946. package/dist/themes/theme-state.d.ts +95 -0
  947. package/dist/themes/theme-state.js +203 -0
  948. package/dist/themes/theme-usage.d.ts +61 -0
  949. package/dist/themes/theme-usage.js +98 -0
  950. package/dist/themes/themes-public.controller.d.ts +28 -0
  951. package/dist/themes/themes-public.controller.js +92 -0
  952. package/dist/themes/themes.controller.d.ts +13 -0
  953. package/dist/themes/themes.controller.js +38 -0
  954. package/dist/themes/themes.module.d.ts +3 -0
  955. package/dist/themes/themes.module.js +21 -0
  956. package/dist/themes/themes.schemas.d.ts +3 -0
  957. package/dist/themes/themes.schemas.js +2 -0
  958. package/dist/themes/themes.service.d.ts +50 -0
  959. package/dist/themes/themes.service.js +99 -0
  960. package/dist/time-zone.d.ts +5 -0
  961. package/dist/time-zone.js +19 -0
  962. package/dist/tools/approvals.controller.d.ts +1 -1
  963. package/dist/tools/approvals.controller.js +14 -11
  964. package/dist/tools/approvals.schemas.d.ts +21 -0
  965. package/dist/tools/approvals.schemas.js +15 -0
  966. package/dist/tools/approvals.service.d.ts +53 -27
  967. package/dist/tools/approvals.service.js +365 -260
  968. package/dist/tools/breaker.d.ts +2 -2
  969. package/dist/tools/breaker.js +21 -3
  970. package/dist/tools/builtin-names.d.ts +109 -0
  971. package/dist/tools/builtin-names.js +173 -0
  972. package/dist/tools/builtins/agent.d.ts +27 -25
  973. package/dist/tools/builtins/agent.js +66 -63
  974. package/dist/tools/builtins/ask-user.d.ts +3 -3
  975. package/dist/tools/builtins/ask-user.js +3 -3
  976. package/dist/tools/builtins/builtin-tools.d.ts +41 -0
  977. package/dist/tools/builtins/builtin-tools.js +151 -0
  978. package/dist/tools/builtins/current-time.d.ts +26 -0
  979. package/dist/tools/builtins/current-time.js +99 -0
  980. package/dist/tools/builtins/handback.d.ts +28 -0
  981. package/dist/tools/builtins/handback.js +53 -0
  982. package/dist/tools/builtins/platform.d.ts +51 -0
  983. package/dist/tools/builtins/platform.js +451 -0
  984. package/dist/tools/builtins/read-tool-output.d.ts +3 -3
  985. package/dist/tools/builtins/read-tool-output.js +3 -3
  986. package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
  987. package/dist/tools/builtins/sandbox/bash.js +293 -41
  988. package/dist/tools/builtins/sandbox/common.d.ts +137 -37
  989. package/dist/tools/builtins/sandbox/common.js +222 -62
  990. package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
  991. package/dist/tools/builtins/sandbox/deliver.js +21 -18
  992. package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
  993. package/dist/tools/builtins/sandbox/edit.js +65 -51
  994. package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
  995. package/dist/tools/builtins/sandbox/file-state.js +34 -0
  996. package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
  997. package/dist/tools/builtins/sandbox/glob-match.js +1 -1
  998. package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
  999. package/dist/tools/builtins/sandbox/glob.js +19 -14
  1000. package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
  1001. package/dist/tools/builtins/sandbox/grep.js +155 -36
  1002. package/dist/tools/builtins/sandbox/index.d.ts +9 -5
  1003. package/dist/tools/builtins/sandbox/index.js +13 -5
  1004. package/dist/tools/builtins/sandbox/read.d.ts +2 -2
  1005. package/dist/tools/builtins/sandbox/read.js +30 -20
  1006. package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
  1007. package/dist/tools/builtins/sandbox/task-output.js +334 -0
  1008. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  1009. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  1010. package/dist/tools/builtins/sandbox/write.d.ts +1 -1
  1011. package/dist/tools/builtins/sandbox/write.js +52 -45
  1012. package/dist/tools/builtins/send-message.d.ts +56 -0
  1013. package/dist/tools/builtins/send-message.js +100 -0
  1014. package/dist/tools/builtins/skill-load.d.ts +32 -21
  1015. package/dist/tools/builtins/skill-load.js +125 -74
  1016. package/dist/tools/builtins/skill-write.d.ts +4 -4
  1017. package/dist/tools/builtins/skill-write.js +12 -12
  1018. package/dist/tools/builtins/tool-search.d.ts +13 -9
  1019. package/dist/tools/builtins/tool-search.js +25 -14
  1020. package/dist/tools/builtins/web/errors.d.ts +8 -0
  1021. package/dist/tools/builtins/web/errors.js +53 -0
  1022. package/dist/tools/builtins/web/extract.d.ts +62 -0
  1023. package/dist/tools/builtins/web/extract.js +271 -0
  1024. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  1025. package/dist/tools/builtins/web/fetch.js +175 -0
  1026. package/dist/tools/builtins/web/index.d.ts +13 -0
  1027. package/dist/tools/builtins/web/index.js +12 -0
  1028. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  1029. package/dist/tools/builtins/web/page-cache.js +77 -0
  1030. package/dist/tools/builtins/web/search.d.ts +25 -0
  1031. package/dist/tools/builtins/web/search.js +210 -0
  1032. package/dist/tools/builtins/web/url.d.ts +17 -0
  1033. package/dist/tools/builtins/web/url.js +43 -0
  1034. package/dist/tools/canonical-json.d.ts +6 -0
  1035. package/dist/tools/canonical-json.js +16 -0
  1036. package/dist/tools/connector-content.controller.d.ts +1 -1
  1037. package/dist/tools/connector-content.controller.js +11 -6
  1038. package/dist/tools/connector-content.d.ts +12 -15
  1039. package/dist/tools/connector-content.js +53 -18
  1040. package/dist/tools/connectors.controller.d.ts +16 -3
  1041. package/dist/tools/connectors.controller.js +34 -14
  1042. package/dist/tools/connectors.schemas.d.ts +12 -0
  1043. package/dist/tools/connectors.schemas.js +19 -0
  1044. package/dist/tools/connectors.service.d.ts +80 -18
  1045. package/dist/tools/connectors.service.js +529 -358
  1046. package/dist/tools/credentials.d.ts +20 -20
  1047. package/dist/tools/credentials.js +55 -34
  1048. package/dist/tools/display-names.d.ts +9 -0
  1049. package/dist/tools/display-names.js +24 -0
  1050. package/dist/tools/drift.d.ts +29 -41
  1051. package/dist/tools/drift.js +116 -84
  1052. package/dist/tools/elicitation.js +1 -1
  1053. package/dist/tools/extension-tools.controller.d.ts +14 -0
  1054. package/dist/tools/extension-tools.controller.js +37 -0
  1055. package/dist/tools/info.d.ts +73 -13
  1056. package/dist/tools/info.js +151 -39
  1057. package/dist/tools/job-ids.d.ts +13 -0
  1058. package/dist/tools/job-ids.js +15 -0
  1059. package/dist/tools/jobs.d.ts +24 -0
  1060. package/dist/tools/jobs.js +69 -0
  1061. package/dist/tools/legacy-data.d.ts +34 -0
  1062. package/dist/tools/legacy-data.js +76 -0
  1063. package/dist/tools/legacy-keys.d.ts +51 -0
  1064. package/dist/tools/legacy-keys.js +115 -0
  1065. package/dist/tools/naming.d.ts +1 -5
  1066. package/dist/tools/naming.js +1 -7
  1067. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  1068. package/dist/tools/oauth/flow-paths.js +38 -0
  1069. package/dist/tools/oauth/flow.d.ts +30 -30
  1070. package/dist/tools/oauth/flow.js +109 -81
  1071. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  1072. package/dist/tools/oauth/oauth.controller.js +12 -9
  1073. package/dist/tools/oauth/tokens.d.ts +45 -10
  1074. package/dist/tools/oauth/tokens.js +70 -24
  1075. package/dist/tools/org-tool-switches.d.ts +88 -0
  1076. package/dist/tools/org-tool-switches.js +201 -0
  1077. package/dist/tools/outputs.d.ts +13 -4
  1078. package/dist/tools/outputs.js +48 -4
  1079. package/dist/tools/pipeline.d.ts +108 -80
  1080. package/dist/tools/pipeline.js +396 -409
  1081. package/dist/tools/policy.d.ts +4 -17
  1082. package/dist/tools/policy.js +49 -35
  1083. package/dist/tools/questions.controller.d.ts +2 -2
  1084. package/dist/tools/questions.controller.js +9 -6
  1085. package/dist/tools/questions.service.d.ts +26 -25
  1086. package/dist/tools/questions.service.js +201 -142
  1087. package/dist/tools/registry.d.ts +215 -84
  1088. package/dist/tools/registry.js +382 -264
  1089. package/dist/tools/resources.d.ts +1 -1
  1090. package/dist/tools/resources.js +1 -1
  1091. package/dist/tools/specs.d.ts +5 -4
  1092. package/dist/tools/specs.js +3 -1
  1093. package/dist/tools/tools.module.d.ts +10 -0
  1094. package/dist/tools/tools.module.js +113 -0
  1095. package/dist/tools/validate.js +1 -1
  1096. package/dist/ui/call-extension.d.ts +16 -0
  1097. package/dist/ui/call-extension.js +38 -0
  1098. package/dist/ui/embed-token.d.ts +9 -5
  1099. package/dist/ui/embed-token.js +34 -6
  1100. package/dist/ui/ui-stream.d.ts +22 -17
  1101. package/dist/ui/ui-stream.js +72 -12
  1102. package/dist/ui/ui.module.d.ts +7 -0
  1103. package/dist/ui/ui.module.js +28 -0
  1104. package/dist/ui/views.controller.d.ts +14 -12
  1105. package/dist/ui/views.controller.js +32 -25
  1106. package/dist/ui/views.d.ts +10 -57
  1107. package/dist/ui/views.js +58 -46
  1108. package/package.json +13 -3
  1109. package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
  1110. package/src/migrations/0064_account_last_org.sql +7 -0
  1111. package/src/migrations/0065_conversation_archive.sql +8 -0
  1112. package/src/migrations/0066_extension_display_name.sql +4 -0
  1113. package/src/migrations/0067_agent_profiles.sql +20 -0
  1114. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  1115. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  1116. package/src/migrations/0070_background_tasks.sql +37 -0
  1117. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  1118. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  1119. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  1120. package/src/migrations/0074_subagent_tree.sql +50 -0
  1121. package/src/migrations/0075_plugin_scope.sql +61 -0
  1122. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  1123. package/src/migrations/0077_scope_requests.sql +52 -0
  1124. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  1125. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  1126. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  1127. package/src/migrations/0081_platform_components.sql +129 -0
  1128. package/src/migrations/0082_platform_migration.sql +33 -0
  1129. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  1130. package/src/migrations/0084_org_owned_items.sql +85 -0
  1131. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  1132. package/src/migrations/0086_org_layering.sql +30 -0
  1133. package/src/migrations/0087_approval_summary.sql +6 -0
  1134. package/src/migrations/0088_environments.sql +80 -0
  1135. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  1136. package/src/migrations/0090_initial_passwords.sql +27 -0
  1137. package/src/migrations/0091_account_time_zone.sql +4 -0
  1138. package/src/migrations/0092_tools_default_on.sql +27 -0
  1139. package/src/migrations/0093_connected_environments.sql +37 -0
  1140. package/src/migrations/0094_environment_paths_idx.sql +7 -0
  1141. package/src/migrations/0095_environment_files_resets.sql +5 -0
  1142. package/src/migrations/0096_environment_demoted_default.sql +18 -0
  1143. package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
  1144. package/src/migrations/0098_single_provider_running_first.sql +41 -0
  1145. package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
  1146. package/src/migrations/0100_catalog_files.sql +13 -0
  1147. package/src/migrations/0101_marketplace_icons.sql +32 -0
  1148. package/src/migrations/0102_themes.sql +64 -0
  1149. package/src/migrations/0103_ui_theme_setting.sql +7 -0
  1150. package/dist/catalog/upgrade-targets.d.ts +0 -59
  1151. package/dist/catalog/upgrade-targets.js +0 -90
  1152. package/dist/conversations/sandbox-status.d.ts +0 -21
  1153. package/dist/conversations/sandbox-status.js +0 -24
  1154. package/dist/extensions/org-config.controller.d.ts +0 -24
  1155. package/dist/extensions/org-config.controller.js +0 -59
  1156. package/dist/http/gateway.module.js +0 -13
  1157. package/dist/http/health.controller.d.ts +0 -26
  1158. package/dist/http/health.controller.js +0 -79
  1159. package/dist/http/tokens.d.ts +0 -131
  1160. package/dist/http/tokens.js +0 -131
  1161. package/dist/http/zod.pipe.d.ts +0 -8
  1162. package/dist/http/zod.pipe.js +0 -14
  1163. package/dist/identity/enterprise-admin.d.ts +0 -14
  1164. package/dist/identity/enterprise-admin.js +0 -27
  1165. package/dist/identity/rate-limit.d.ts +0 -55
  1166. package/dist/identity/rate-limit.js +0 -121
  1167. package/dist/sandbox/lifecycle.d.ts +0 -21
  1168. package/dist/sandbox/lifecycle.js +0 -68
  1169. package/dist/tools/builtins/sandbox/names.d.ts +0 -7
  1170. package/dist/tools/builtins/sandbox/names.js +0 -20
@@ -1,18 +1,77 @@
1
- import { randomUUID } from "node:crypto";
2
- import { EXTENSION_POINTS, parseExtensionPoint, parseSkillMd, SKILL_ENTRY_FILE, } from "@capybara-hq/plugin-sdk";
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { createHash, randomUUID } from "node:crypto";
11
+ import { EXTENSION_POINTS, marketplaceEntryDeprecation, parseExtensionPoint, parseSkillMd, SKILL_ENTRY_FILE, } from "@capybara-hq/plugin-sdk";
12
+ import { Inject, Injectable } from "@nestjs/common";
3
13
  import { sql } from "kysely";
4
- import { normalizeToolRef } from "../agents/definition.js";
5
- import { putTemplateVersionIn, revertTemplateVersionIn, softDeleteTemplateIn, } from "../agents/templates.js";
14
+ import semver from "semver";
15
+ import { revertTemplateVersionIn, softDeleteTemplateIn } from "../agents/templates.js";
6
16
  import { ApiError } from "../errors.js";
7
17
  import { isExtensionEnabled } from "../extensions/enabled.js";
18
+ import { OrgExtensionConfigs, } from "../extensions/org-config.js";
19
+ import { ExtensionRegistry } from "../extensions/registry.js";
8
20
  import { audit } from "../identity/audit.js";
9
- import { lockOrg } from "../orgs/org-lock.js";
21
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
22
+ import { afterCommit } from "../infra/database/after-commit.js";
23
+ import { KernelDb } from "../infra/database/kernel-db.js";
24
+ import { TransactionHost } from "../infra/database/transaction-host.js";
25
+ import { Transactional } from "../infra/database/transactional.decorator.js";
26
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
27
+ import { OrgLock } from "../orgs/org-lock.js";
10
28
  import { packagePath } from "../packages/tgz.js";
11
- import { skillConflictError, skillConflicts, } from "../skills/skills.service.js";
12
- import { lockOrgForActions, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, skillOf, templateConnectorInput, templatePluginProblem, } from "./org-catalog.service.js";
13
- import { assertItemInstallable, disabledPluginItems, pluginItemDisabled, } from "./requests.service.js";
14
- import { upgradeInfo } from "./upgrade-targets.js";
29
+ import { SkillsService, skillConflictError, skillConflicts, } from "../skills/skills.service.js";
30
+ import { StorageService } from "../storage/storage.service.js";
31
+ import { assertNotPlatformDefault, themesPreview, } from "../themes/theme-usage.js";
32
+ import { ConnectorsService } from "../tools/connectors.service.js";
33
+ import { findConnectorIn, lockOrgForActions, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, templateConnectorInput, templatePluginProblem, } from "./catalog-content.js";
34
+ import { versionUsable } from "./catalog-items.js";
35
+ import { agentDefinitionRefs, componentOn, connectorTemplateState, connectorTemplatesOn, listedIn, loadComponents, loadScopeState, pluginFactsOf, referenceIds, switchOf, themeIdClashes, } from "./component-state.js";
36
+ import { assertItemInstallable, disabledPluginItems, pluginItemDisabled, resolveRequestsByInstall, } from "./request-rules.js";
37
+ import { visibleTo } from "./scope.js";
38
+ import { ScopeNoLongerWanted, ScopeStillWanted, wantedByScope } from "./scope-state.js";
15
39
  import { maxSatisfying, satisfiesRange } from "./versions.js";
40
+ /** The confirm hash of an uninstall preview: sha256 over its sorted JSON (the scheme of `diffHash`). */
41
+ export function uninstallPreviewHash(p) {
42
+ const by = (xs) => [...xs].sort((a, b) => `${a.kind}:${a.ref}`.localeCompare(`${b.kind}:${b.ref}`));
43
+ return createHash("sha256")
44
+ .update(JSON.stringify({
45
+ ...p,
46
+ components: by(p.components),
47
+ kept: by(p.kept),
48
+ agents: [...p.agents]
49
+ .sort((a, b) => a.id.localeCompare(b.id))
50
+ .map((a) => ({ ...a, uses: by(a.uses) })),
51
+ }))
52
+ .digest("hex");
53
+ }
54
+ /** Upserts the org's switch row of an item in the caller's transaction (the org lock is held). */
55
+ export async function upsertOrgSwitch(db, orgId, itemId, enabled, actor) {
56
+ await db
57
+ .insertInto("catalog_item_org_switches")
58
+ .values({ item_id: itemId, org_id: orgId, enabled, updated_by: actor })
59
+ .onConflict((oc) => oc.columns(["item_id", "org_id"]).doUpdateSet({
60
+ enabled,
61
+ updated_by: actor,
62
+ updated_at: sql `now()`,
63
+ }))
64
+ .execute();
65
+ }
66
+ /** The kernel (actor null, the scope sync) never installs what needs the org's input. */
67
+ export class NeedsOrgInput extends ApiError {
68
+ plugin;
69
+ constructor(plugin) {
70
+ super("internal", `Plugin ${plugin} needs the organization's input (connector templates); only a person can install it`);
71
+ this.plugin = plugin;
72
+ }
73
+ }
74
+ const systemNeedsInput = (name) => new NeedsOrgInput(name);
16
75
  /** How deep plugin dependencies may nest (the root plugin's dependencies are level 1). */
17
76
  export const DEPENDENCY_DEPTH_LIMIT = 10;
18
77
  /** A failed install step, carried up through the dependency installs to the root install. */
@@ -45,33 +104,66 @@ const installNotFound = () => new ApiError("plugin.install_not_found", "Plugin i
45
104
  const fail = (path, message) => new ApiError("validation_failed", "Request validation failed", [{ path, message }]);
46
105
  const isUniqueViolation = (e) => typeof e === "object" && e !== null && e.code === "23505";
47
106
  const unresolved = (name, range, why) => new ApiError("catalog.dependency_unresolved", `Dependency ${name}@${range} cannot be resolved: ${why}`, [{ dependency: name, range }]);
48
- const dependencyDisabled = (name) => new ApiError("catalog.dependency_disabled", `Dependency ${name} is disabled by the enterprise admin, so this plugin cannot be installed`, [{ dependency: name }]);
107
+ const dependencyDisabled = (name) => new ApiError("catalog.dependency_disabled", `Dependency ${name} is disabled by the super admin, so this plugin cannot be installed`, [{ dependency: name }]);
49
108
  /**
50
- * The dependency `d` resolved against the catalog: the highest imported version (of the live item
51
- * with that name) satisfying its range. No such item or version -> `catalog.dependency_unresolved`;
52
- * the item disabled -> `catalog.dependency_disabled` (the enterprise admin's ban is not bypassed,
53
- * spec §10).
109
+ * The dependency `d` resolved against the catalog (ruling P2-17, one version per deployment): the
110
+ * dependency's platform version (`platform_synced_version`), which must satisfy its range; only
111
+ * while it has none yet (its first sync failed), the highest imported version satisfying the range
112
+ * that its marketplace does not deprecate, a stable one before a prerelease (the marketplace
113
+ * folding rule). No such item or version -> `catalog.dependency_unresolved`; the item disabled ->
114
+ * `catalog.dependency_disabled` (the super admin's ban is not bypassed, spec §10).
54
115
  */
55
116
  async function resolveOne(db, d) {
56
117
  const item = await db
57
118
  .selectFrom("catalog_items")
58
- .select(["id", "policy"])
119
+ .select([
120
+ "id",
121
+ "disabled",
122
+ "platform_synced_version",
123
+ "marketplace_id",
124
+ "awaiting_confirmation",
125
+ "owner_org_id",
126
+ "latest_version",
127
+ ])
59
128
  .where("name", "=", d.name)
60
129
  .where("deleted_at", "is", null)
61
130
  .executeTakeFirst();
62
131
  if (!item) {
63
- throw unresolved(d.name, d.version, "it is not in the enterprise catalog; ask the enterprise admin to import it");
132
+ throw unresolved(d.name, d.version, "it is not in the platform catalog; ask the super admin to import it");
64
133
  }
65
- if (item.policy === "disabled")
134
+ if (item.disabled)
66
135
  throw dependencyDisabled(d.name);
136
+ // An org upload waiting for the super admin is no dependency target (ruling P3-9)
137
+ if (item.awaiting_confirmation) {
138
+ throw unresolved(d.name, d.version, "it waits for a super admin to confirm its extension");
139
+ }
67
140
  const versions = await db
68
141
  .selectFrom("catalog_item_versions")
69
- .select(["version", "manifest", "imported_at"])
142
+ .select(["version", "manifest", "imported_at", "applied_at", "rejected_at"])
70
143
  .where("item_id", "=", item.id)
71
144
  .execute();
72
- const v = maxSatisfying(versions.map((x) => ({ ...x, importedAt: x.imported_at })), d.version);
145
+ let v;
146
+ if (item.platform_synced_version !== null) {
147
+ v = versions.find((x) => x.version === item.platform_synced_version);
148
+ if (!v || !satisfiesRange(v.version, d.version)) {
149
+ throw unresolved(d.name, d.version, `its platform version ${item.platform_synced_version} does not satisfy the range; ask ` +
150
+ "the super admin to update it");
151
+ }
152
+ }
153
+ else {
154
+ const deprecated = await deprecatedVersions(db, d.name, item.marketplace_id);
155
+ // An org's plugin offers only its applied version: never one pending or rejected (P3-34),
156
+ // also once transferred to the platform (P3-52)
157
+ const candidates = versions
158
+ .filter((x) => versionUsable(x))
159
+ .filter((x) => item.owner_org_id === null || x.version === item.latest_version)
160
+ .filter((x) => !deprecated.has(x.version))
161
+ .map((x) => ({ ...x, importedAt: x.imported_at }));
162
+ v =
163
+ maxSatisfying(candidates.filter((x) => semver.prerelease(x.version) === null), d.version) ?? maxSatisfying(candidates, d.version);
164
+ }
73
165
  if (!v) {
74
- throw unresolved(d.name, d.version, "no imported version satisfies the range; ask the enterprise admin to import one");
166
+ throw unresolved(d.name, d.version, "no imported version satisfies the range; ask the super admin to import one");
75
167
  }
76
168
  return {
77
169
  name: d.name,
@@ -81,10 +173,24 @@ async function resolveOne(db, d) {
81
173
  manifest: v.manifest,
82
174
  };
83
175
  }
176
+ /** The versions of plugin `name` its marketplace (`marketplaceId`) marks deprecated. */
177
+ async function deprecatedVersions(db, name, marketplaceId) {
178
+ if (marketplaceId === null)
179
+ return new Set();
180
+ const rows = await db
181
+ .selectFrom("marketplace_entries")
182
+ .select(["version", "entry"])
183
+ .where("source_id", "=", marketplaceId)
184
+ .where("name", "=", name)
185
+ .execute();
186
+ return new Set(rows
187
+ .filter((r) => marketplaceEntryDeprecation(r.entry) !== null)
188
+ .map((r) => r.version));
189
+ }
84
190
  /**
85
- * Resolves a plugin's dependencies against the catalog: for each one the highest imported version
86
- * of the live item with that name satisfying its range. The whole dependency tree is checked: a
87
- * dependency nothing satisfies -> `catalog.dependency_unresolved`; a disabled one ->
191
+ * Resolves a plugin's dependencies against the catalog: for each one the platform version of the
192
+ * live item with that name, which must satisfy its range (see `resolveOne`). The whole dependency
193
+ * tree is checked: a dependency nothing satisfies -> `catalog.dependency_unresolved`; a disabled one ->
88
194
  * `catalog.dependency_disabled`; a cycle (`a` -> `b` -> `a`, by name) or nesting deeper than
89
195
  * {@link DEPENDENCY_DEPTH_LIMIT} -> `catalog.dependency_cycle`. Returns the direct dependencies.
90
196
  */
@@ -169,9 +275,11 @@ export function under(e, at) {
169
275
  * not run it; already enabled is recorded created=false);
170
276
  * 3. connectors from the templates (credentials / clients go to secrets, default policies are
171
277
  * recorded `policy_source 'template'`);
172
- * 4. the skills (an org skill of the same name from the same catalog item gets a new version,
173
- * recorded created=false with skill_version; one of other provenance, the org's own or another
174
- * item's, refuses the install while planning with `plugin.skill_conflict`, spec §9.2).
278
+ * The plugin's skills and agent templates are platform components (plugin scope phase 2): stored
279
+ * once for the deployment and on in the org while the plugin is, so an install writes no org rows
280
+ * for them; a skill name the org already uses (its own skill, another plugin's) refuses the install
281
+ * while planning with `plugin.skill_conflict` (spec §9.2, rule 10). Uninstall leaves the org copies
282
+ * earlier installs wrote (linked to the platform components by the migration).
175
283
  * Approval follows the installed plugin's policy only (spec §10): dependency components are
176
284
  * re-checked against the root item's policy and their own item's disabled state. Each component is
177
285
  * recorded in `plugin_install_components` as soon as it exists; if any step fails, the components
@@ -179,18 +287,47 @@ export function under(e, at) {
179
287
  * install is marked failed (error holds only the step and the error code) and 502
180
288
  * `plugin.install_failed` is thrown. Uninstall removes only components with created=true that
181
289
  * nothing else uses, and reports what it kept and why. No in-process state; the org row lock
182
- * serializes writes within one org. In-place upgrades are run by `PluginUpgrader`
183
- * (plugin-upgrade.ts), which reuses the planning, install and ledger methods here (the ones without
184
- * `private` are internal to the catalog, not an API).
290
+ * serializes writes within one org. There is no per-org upgrade: a platform plugin is updated
291
+ * once for the deployment (`PlatformPluginUpdater`, plugin-upgrade.ts, ruling F2); an install left
292
+ * `upgrading` by an earlier per-org upgrade is undone from its journal by the next uninstall. The
293
+ * methods without `private` are internal to the catalog, not an API.
185
294
  */
186
- export class PluginInstaller {
187
- d;
188
- constructor(d) {
189
- this.d = d;
295
+ let PluginInstaller = class PluginInstaller {
296
+ kdb;
297
+ orgLock;
298
+ storage;
299
+ registry;
300
+ skills;
301
+ orgConfigs;
302
+ config;
303
+ connectors;
304
+ log;
305
+ txHost;
306
+ constructor(kdb,
307
+ /** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
308
+ orgLock, storage,
309
+ /** The loaded extensions and connectors of this replica (the extension registry). */
310
+ registry, skills, orgConfigs, config,
311
+ /** Org connectors: installs create, upgrade and remove them. */
312
+ connectors, log, txHost) {
313
+ this.kdb = kdb;
314
+ this.orgLock = orgLock;
315
+ this.storage = storage;
316
+ this.registry = registry;
317
+ this.skills = skills;
318
+ this.orgConfigs = orgConfigs;
319
+ this.config = config;
320
+ this.connectors = connectors;
321
+ this.log = log;
322
+ this.txHost = txHost;
323
+ }
324
+ /** The kernel-schema handle of the current context (the transaction, else the pool). */
325
+ get db() {
326
+ return this.kdb.db;
190
327
  }
191
- /** The installer's dependencies (shared with `PluginUpgrader`). */
192
- get deps() {
193
- return this.d;
328
+ /** `catalog.staleInstallMinutes`: an install `installing` for longer can be cleaned up by uninstalling it. */
329
+ staleInstallMinutes() {
330
+ return this.config.get().catalog.staleInstallMinutes;
194
331
  }
195
332
  /**
196
333
  * The checks an install runs before it creates anything, without the org's input (for the org
@@ -200,15 +337,20 @@ export class PluginInstaller {
200
337
  async preflight(orgId, actor, itemId, version) {
201
338
  const plan = await this.plan(orgId, actor, itemId, version, null, "", undefined);
202
339
  await this.assertNoSkillConflicts(orgId, plan);
340
+ await this.assertNoThemeClashes(orgId, itemId);
203
341
  return { actions: planActions(plan) };
204
342
  }
205
343
  async install(orgId, actor, itemId, version, input, opts = {}) {
344
+ const { switchOn, via, ...actorOpts } = opts;
206
345
  const plan = await this.plan(orgId, actor, itemId, version, input, "", undefined);
207
346
  await this.assertNoSkillConflicts(orgId, plan);
347
+ await this.assertNoThemeClashes(orgId, itemId);
208
348
  let installId;
209
349
  try {
210
- installId = await this.execute(orgId, actor, plan, opts, {
350
+ installId = await this.execute(orgId, actor, plan, actorOpts, {
211
351
  actions: planActions(plan),
352
+ ...(switchOn === true && { switchOn }),
353
+ ...(via !== undefined && { via }),
212
354
  });
213
355
  }
214
356
  catch (e) {
@@ -243,14 +385,50 @@ export class PluginInstaller {
243
385
  * and a name two plugins of the same plan both bring (the one installed first is the source).
244
386
  */
245
387
  async assertNoSkillConflicts(orgId, plan) {
246
- const conflicts = await planSkillConflicts(this.d.db, orgId, plan);
388
+ const conflicts = await planSkillConflicts(this.db, orgId, plan);
247
389
  if (conflicts.length > 0)
248
390
  throw skillConflictError(conflicts);
249
391
  }
392
+ /**
393
+ * Refuses installing a plugin whose themes would come on in the org (they follow it) while
394
+ * another theme with the same id is on there (themes spec §6, rule 10): 409 `theme.id_taken`,
395
+ * details `[{ theme, orgId, themes, plugins }]`, before anything is written.
396
+ */
397
+ async assertNoThemeClashes(orgId, itemId) {
398
+ const themes = await loadComponents(this.db, "theme", { itemId });
399
+ if (themes.length === 0)
400
+ return;
401
+ const st = await loadScopeState(this.db, "theme", themes);
402
+ const conflicts = [];
403
+ for (const c of themes) {
404
+ const p = pluginFactsOf(st, c.itemId, orgId);
405
+ const listed = listedIn(st, c.id, orgId);
406
+ const sw = switchOf(st, c.id, orgId);
407
+ if (componentOn(c, p, listed, sw) ||
408
+ !componentOn(c, p && { ...p, installed: true }, listed, sw)) {
409
+ continue;
410
+ }
411
+ const clash = await themeIdClashes(this.db, orgId, c, c.name);
412
+ if (clash.length > 0) {
413
+ conflicts.push({
414
+ theme: c.name,
415
+ orgId,
416
+ themes: clash.map((x) => x.id),
417
+ plugins: clash.map((x) => x.plugin ?? "platform"),
418
+ });
419
+ }
420
+ }
421
+ if (conflicts.length > 0) {
422
+ throw new ApiError("theme.id_taken", `The plugin's themes would come on next to themes with the same id already on in this organization (${conflicts.map((c) => c.theme).join(", ")}); switch those themes off first`, conflicts);
423
+ }
424
+ }
250
425
  /** The connector checks of templates against what this replica loads right now. */
251
426
  templateDeps() {
252
- const versions = new Map(this.d.host.manifests().map((m) => [m.name, m.version]));
253
- return { findConnector: this.d.findConnector, pluginVersion: (n) => versions.get(n) };
427
+ const versions = new Map(this.registry.manifests().map((m) => [m.name, m.version]));
428
+ return {
429
+ findConnector: (plugin, kind) => findConnectorIn(this.registry, plugin, kind),
430
+ pluginVersion: (n) => versions.get(n),
431
+ };
254
432
  }
255
433
  /**
256
434
  * Plans the install of one plugin version and, depth first, of its dependencies not yet
@@ -261,7 +439,7 @@ export class PluginInstaller {
261
439
  async plan(orgId, actor, itemId, version, input, at, approvedBy) {
262
440
  if (!UUID_RE.test(itemId))
263
441
  throw new ApiError("catalog.item_not_found", "Plugin not found");
264
- const v = await this.d.db
442
+ const v = await this.db
265
443
  .selectFrom("catalog_item_versions as v")
266
444
  .innerJoin("catalog_items as i", "i.id", "v.item_id")
267
445
  .select([
@@ -279,11 +457,19 @@ export class PluginInstaller {
279
457
  if (!v)
280
458
  throw new ApiError("catalog.item_not_found", "Plugin version not found");
281
459
  const manifest = v.manifest;
282
- const deps = await resolveDependencies(this.d.db, manifest);
460
+ const declared = await resolveDependencies(this.db, manifest);
283
461
  const extension = await this.planExtension(orgId, manifest);
284
- const templates = await readCatalogTemplates(this.d.storage, v);
285
- const skillNames = await catalogSkillNames(this.d.storage, v, manifest);
286
- const agentTemplates = await readCatalogAgentTemplates(this.d.storage, v);
462
+ const allTemplates = await readCatalogTemplates(this.storage, v);
463
+ // Only the connector templates on in the org make connectors (ruling P2-6): one switched off
464
+ // there, outside its own scope or disabled is skipped (input given for it is ignored)
465
+ const on = await connectorTemplatesOn(this.db, orgId, itemId, allTemplates.map((t) => t.id));
466
+ const templates = allTemplates.filter((t) => on.has(t.id));
467
+ const deps = [
468
+ ...declared,
469
+ ...(await this.impliedProviders(orgId, manifest, templates, declared)),
470
+ ];
471
+ const skillNames = await catalogSkillNames(this.storage, v, manifest);
472
+ const agentTemplates = await readCatalogAgentTemplates(this.storage, v);
287
473
  const connectors = new Map();
288
474
  if (input === null) {
289
475
  for (const ct of templates) {
@@ -293,14 +479,17 @@ export class PluginInstaller {
293
479
  }
294
480
  }
295
481
  else {
296
- this.checkInput(manifest, templates, input, at);
482
+ this.checkInput(manifest, allTemplates, input, at);
297
483
  for (const ct of templates) {
484
+ // The kernel installs only what needs no org input (the scope sync's `needs_config` rule)
485
+ if (actor === null)
486
+ throw systemNeedsInput(manifest.name);
298
487
  connectors.set(ct.id, this.planConnector(actor, { itemId, version, name: manifest.name }, ct, input, at, approvedBy));
299
488
  }
300
489
  }
301
490
  const dependencies = [];
302
491
  for (const dep of deps) {
303
- if (await this.liveDependency(this.d.db, orgId, dep)) {
492
+ if (await this.liveDependency(this.db, orgId, dep)) {
304
493
  dependencies.push({ dep, plan: null });
305
494
  continue;
306
495
  }
@@ -325,6 +514,64 @@ export class PluginInstaller {
325
514
  dependencies,
326
515
  };
327
516
  }
517
+ /**
518
+ * The providers of the templates' connector kinds as implied dependencies: a template whose
519
+ * `plugin` is neither this plugin, a declared dependency nor already enabled in the org makes that
520
+ * plugin a dependency (installed first, recorded like a declared one, so an uninstall hands it
521
+ * back). No such plugin offered by the catalog -> `connector.kind_unavailable` naming it, before
522
+ * anything is written.
523
+ */
524
+ async impliedProviders(orgId, manifest, templates, declared) {
525
+ const out = [];
526
+ const seen = new Set([manifest.name, ...declared.map((d) => d.name)]);
527
+ for (const ct of templates) {
528
+ const provider = ct.file.template.plugin;
529
+ if (seen.has(provider))
530
+ continue;
531
+ seen.add(provider);
532
+ // Not deployed: the not_deployed refusal of the plan's own checks says it
533
+ if (templatePluginProblem(this.templateDeps(), ct.file.template) !== undefined)
534
+ continue;
535
+ if (await isExtensionEnabled(this.db, orgId, provider))
536
+ continue;
537
+ const refuse = (why) => new ApiError("connector.kind_unavailable", `Connector template ${ct.id} needs the plugin ${provider}, which is not enabled in this organization: ${why}`);
538
+ let dep;
539
+ try {
540
+ const { manifest: _m, ...resolved } = await resolveOne(this.db, {
541
+ name: provider,
542
+ version: ct.file.template.pluginVersion ?? "*",
543
+ });
544
+ dep = resolved;
545
+ }
546
+ catch (e) {
547
+ if (!(e instanceof ApiError))
548
+ throw e;
549
+ throw refuse(e.code === "catalog.dependency_unresolved"
550
+ ? `${provider} is deployed but switched off here and the catalog has no entry to switch it on; ask the super admin to enable it`
551
+ : `${provider} is not offered to this organization`);
552
+ }
553
+ // Scope: only a plugin offered to this org may be switched on for it (nothing more is said)
554
+ const item = await this.db
555
+ .selectFrom("catalog_items")
556
+ .select(["scope", "builtin"])
557
+ .where("id", "=", dep.itemId)
558
+ .executeTakeFirstOrThrow();
559
+ const listed = await this.db
560
+ .selectFrom("catalog_item_scope_orgs")
561
+ .select("item_id")
562
+ .where("item_id", "=", dep.itemId)
563
+ .where("org_id", "=", orgId)
564
+ .executeTakeFirst();
565
+ if (!visibleTo({ scope: item.builtin ? "all" : item.scope }, listed !== undefined)) {
566
+ throw refuse(`${provider} is not offered to this organization`);
567
+ }
568
+ if (await this.findLiveDependency(this.db, orgId, dep, false)) {
569
+ throw refuse(`${provider} is installed but switched off in this organization`);
570
+ }
571
+ out.push(dep);
572
+ }
573
+ return out;
574
+ }
328
575
  /**
329
576
  * The connector input of one template from the org's input (C30), checked without a connection:
330
577
  * the template's connector extension deployed, the input valid, the credential / OAuth client it
@@ -355,7 +602,7 @@ export class PluginInstaller {
355
602
  : `This connector template needs ${needs}`);
356
603
  }
357
604
  try {
358
- this.d.connectors.checkCreateInput(actor, ci);
605
+ this.connectors.checkCreateInput(actor, ci);
359
606
  }
360
607
  catch (e) {
361
608
  throw under(e, path);
@@ -397,30 +644,30 @@ export class PluginInstaller {
397
644
  * cannot leave the component pointing at a removed install. `created` false: the org's existing
398
645
  * install, if any (returns its id, undefined when there is none); it must be `installed`
399
646
  * (`installing` -> 409 `plugin.install_in_progress`, retry later) and in range. `created` true:
400
- * `child`, the dependency install this install just created, must still exist.
647
+ * `child`, the dependency install this install just created, must still exist. A step of an
648
+ * install or upgrade: it commits on its own (`requires_new`), the undo on failure relies on it.
401
649
  */
402
650
  async recordDependency(orgId, dep, record, child) {
403
- return this.d.db.transaction().execute(async (t) => {
404
- await lockOrg(t, orgId);
405
- const live = await this.findLiveDependency(t, orgId, dep, true);
406
- if (child !== undefined) {
407
- if (live?.id !== child || live.status !== "installed") {
408
- throw unresolved(dep.name, dep.range, "its install in this organization was removed meanwhile; try again");
409
- }
410
- await record({ kind: "plugin", ref: child, created: true, skillVersion: null }, t);
411
- return child;
412
- }
413
- if (!live)
414
- return undefined;
415
- if (!satisfiesRange(live.version, dep.range)) {
416
- throw unresolved(dep.name, dep.range, `this organization has version ${live.version} installed; uninstall it to install a matching version`);
651
+ const t = this.db;
652
+ await this.orgLock.lock(orgId);
653
+ const live = await this.findLiveDependency(t, orgId, dep, true);
654
+ if (child !== undefined) {
655
+ if (live?.id !== child || live.status !== "installed") {
656
+ throw unresolved(dep.name, dep.range, "its install in this organization was removed meanwhile; try again");
417
657
  }
418
- if (live.status !== "installed") {
419
- throw new ApiError("plugin.install_in_progress", `Dependency ${dep.name} is being installed by another install in this organization; try again when it finishes. An install stuck for longer than catalog.staleInstallMinutes can be removed by uninstalling it`);
420
- }
421
- await record({ kind: "plugin", ref: live.id, created: false, skillVersion: null }, t);
422
- return live.id;
423
- });
658
+ await record({ kind: "plugin", ref: child, created: true, skillVersion: null });
659
+ return child;
660
+ }
661
+ if (!live)
662
+ return undefined;
663
+ if (!satisfiesRange(live.version, dep.range)) {
664
+ throw unresolved(dep.name, dep.range, `this organization has version ${live.version} installed; uninstall it to install a matching version`);
665
+ }
666
+ if (live.status !== "installed") {
667
+ throw new ApiError("plugin.install_in_progress", `Dependency ${dep.name} is being installed by another install in this organization; try again when it finishes. An install stuck for longer than catalog.staleInstallMinutes can be removed by uninstalling it`);
668
+ }
669
+ await record({ kind: "plugin", ref: live.id, created: false, skillVersion: null });
670
+ return live.id;
424
671
  }
425
672
  /**
426
673
  * Runs a plan: the install row, then the steps (see the class comment). Throws
@@ -428,63 +675,19 @@ export class PluginInstaller {
428
675
  * as they are. Returns the install id.
429
676
  */
430
677
  async execute(orgId, actor, plan, opts, ctx) {
431
- const { itemId, version, manifest } = plan;
678
+ const { itemId, manifest } = plan;
432
679
  // The install row (role and item policy re-checked under the lock; one live install per org
433
680
  // and item)
434
681
  const installId = randomUUID();
435
- await this.d.db.transaction().execute(async (t) => {
436
- await lockOrgForActions(t, orgId, actor, ctx.actions);
437
- if (ctx.approvedBy !== undefined) {
438
- // A dependency disabled (or removed) since it was planned
439
- const own = await t
440
- .selectFrom("catalog_items")
441
- .select(["policy", "deleted_at"])
442
- .where("id", "=", itemId)
443
- .forShare()
444
- .executeTakeFirst();
445
- if (!own || own.deleted_at !== null) {
446
- throw unresolved(plan.name, plan.version, "it was removed from the enterprise catalog");
447
- }
448
- if (own.policy === "disabled")
449
- throw dependencyDisabled(plan.name);
450
- }
451
- await assertItemInstallable(t, orgId, itemId, ctx.approvedBy ?? itemId);
452
- const live = await t
453
- .selectFrom("plugin_installs")
454
- .select("id")
455
- .where("org_id", "=", orgId)
456
- .where("item_id", "=", itemId)
457
- .where("status", "<>", "failed")
458
- .executeTakeFirst();
459
- if (live)
460
- throw alreadyInstalled();
461
- try {
462
- await t
463
- .insertInto("plugin_installs")
464
- .values({
465
- id: installId,
466
- org_id: orgId,
467
- item_id: itemId,
468
- version,
469
- status: "installing",
470
- installed_by: actor,
471
- })
472
- .execute();
473
- }
474
- catch (e) {
475
- if (isUniqueViolation(e))
476
- throw alreadyInstalled();
477
- throw e;
478
- }
479
- });
682
+ await this.createInstallRow(orgId, actor, plan, ctx, installId);
480
683
  const done = [];
481
- // Records a component in the given transaction (the install row already cleaned up -> the FK
482
- // fails, the install aborts and rolls back)
483
- const record = async (c, t) => {
684
+ // Records a component in the transaction of the context (none: on its own; the install row
685
+ // already cleaned up -> the FK fails, the install aborts and rolls back)
686
+ const record = async (c) => {
484
687
  // Into `done` first: a component that exists is rolled back even when recording it fails
485
688
  // (enabling an extension and recording it share one transaction and fail together)
486
689
  done.push(c);
487
- await (t ?? this.d.db)
690
+ await this.db
488
691
  .insertInto("plugin_install_components")
489
692
  .values({
490
693
  install_id: installId,
@@ -514,6 +717,7 @@ export class PluginInstaller {
514
717
  actions: requiredActions(depPlan.manifest),
515
718
  approvedBy,
516
719
  parent: installId,
720
+ ...(ctx.via !== undefined && { via: ctx.via }),
517
721
  });
518
722
  }
519
723
  catch (e) {
@@ -532,25 +736,19 @@ export class PluginInstaller {
532
736
  }
533
737
  step = "extension";
534
738
  if (plan.extension !== null) {
535
- const p = plan.extension;
536
- // "Enabled before" is decided under the org row lock (already enabled: put writes nothing,
537
- // the config is untouched); the component is recorded in the same transaction
538
- await this.d.orgConfigs.put(orgId, p, {
739
+ await this.enableExtension(orgId, plan.extension, {
539
740
  enabled: true,
540
741
  ...(plan.extensionConfig !== undefined && { config: plan.extensionConfig }),
541
- }, actor, opts.actorTokenId, {
542
- viaItem: itemId,
543
- ...(nested && { approvedBy }),
544
- ifDisabled: { skipped: false },
545
- inTransaction: (t, skipped) => record({ kind: "extension", ref: p, created: !skipped, skillVersion: null }, t),
546
- });
742
+ }, actor, opts.actorTokenId, { viaItem: itemId, ...(nested && { approvedBy }) }, record);
547
743
  }
548
744
  step = "connectors";
549
745
  for (const ct of plan.templates) {
550
746
  const ci = plan.connectors.get(ct.id);
551
747
  if (!ci)
552
748
  throw new ApiError("internal", `Connector template ${ct.id} was not planned`);
553
- const r = await this.d.connectors.create(orgId, actor, ci, opts.actorTokenId);
749
+ if (actor === null)
750
+ throw systemNeedsInput(manifest.name);
751
+ const r = await this.connectors.create(orgId, actor, ci, opts.actorTokenId);
554
752
  await record({
555
753
  kind: "connector",
556
754
  ref: r.connector.id,
@@ -559,109 +757,170 @@ export class PluginInstaller {
559
757
  templateId: ct.id,
560
758
  });
561
759
  }
562
- step = "agent_templates";
563
- for (const a of plan.agentTemplates) {
564
- // Created (or a new version of the org's live template of this plugin and name) and
565
- // recorded in one transaction, under the org row lock
566
- await this.d.db.transaction().execute(async (t) => {
567
- await lockOrg(t, orgId);
568
- const r = await putTemplateVersionIn(t, {
569
- orgId,
570
- plugin: plan.name,
571
- catalogItemId: itemId,
572
- catalogVersion: version,
573
- sourceFormat: plan.sourceFormat,
574
- }, a.template);
575
- await record({
576
- kind: "agent_template",
577
- ref: r.id,
578
- created: r.created,
579
- skillVersion: !r.created && r.changed ? r.version : null,
580
- }, t);
581
- });
582
- }
583
- step = "skills";
584
- for (const s of manifest.skills ?? []) {
585
- const files = await readCatalogFiles(this.d.storage, plan.row.object_prefix, plan.row.files, packagePath(s.path));
586
- const r = await this.d.skills.createVersionFromFiles(orgId, actor, { ...skillOf(files), files }, {
587
- catalog: {
588
- itemId,
589
- version,
590
- ...(nested && { approvedBy }),
591
- format: plan.sourceFormat,
592
- suggestPinned: s.pinned === true,
593
- },
594
- ...opts,
595
- });
596
- await record({
597
- kind: "skill",
598
- ref: r.skill.id,
599
- created: r.created,
600
- skillVersion: r.created ? null : r.version,
601
- });
602
- }
603
- await this.d.db.transaction().execute(async (t) => {
604
- await lockOrg(t, orgId);
605
- const updated = await t
606
- .updateTable("plugin_installs")
607
- .set({ status: "installed" })
608
- .where("id", "=", installId)
609
- .where("status", "=", "installing")
610
- .executeTakeFirst();
611
- // The install row was already cleaned up as stale: do not audit plugin.org_installed, roll
612
- // back
613
- if (updated.numUpdatedRows === 0n) {
614
- throw new ApiError("plugin.install_not_found", "The install record was cleaned up as stale while the install was running");
615
- }
616
- await this.d.requests.resolveByInstall(t, orgId, itemId, actor, opts);
617
- await audit(t, {
618
- actorAccountId: actor,
619
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
620
- orgId,
621
- action: "plugin.org_installed",
622
- target: installId,
623
- detail: {
624
- itemId,
625
- name: plan.name,
626
- version,
627
- components: done,
628
- ...(ctx.parent !== undefined && { dependencyOf: ctx.parent }),
629
- },
630
- });
631
- });
760
+ // Skills and agent templates are platform components (plugin scope phase 2): stored once for
761
+ // the deployment and on in the org while the plugin is, so the install writes no org rows
762
+ await this.markInstalled(orgId, actor, installId, plan, done, ctx, opts);
632
763
  return installId;
633
764
  }
634
765
  catch (e) {
635
766
  const failure = e instanceof InstallFailure ? e : undefined;
636
767
  const code = failure ? failure.code : e instanceof ApiError ? e.code : "internal";
637
768
  const rollbackErrors = await this.rollback(orgId, actor, installId, done, opts);
638
- await this.d.db.transaction().execute(async (t) => {
639
- await t
640
- .updateTable("plugin_installs")
641
- .set({ status: "failed", error: JSON.stringify({ step, code }) })
642
- .where("id", "=", installId)
643
- .execute();
644
- await audit(t, {
645
- actorAccountId: actor,
646
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
647
- orgId,
648
- action: "plugin.org_install_failed",
649
- target: installId,
650
- detail: {
651
- itemId,
652
- name: plan.name,
653
- version,
654
- step,
655
- code,
656
- rolledBack: done,
657
- rollbackErrors,
658
- ...(ctx.parent !== undefined && { dependencyOf: ctx.parent }),
659
- },
660
- });
661
- });
769
+ await this.markFailed(orgId, actor, installId, plan, ctx, { step, code, done, rollbackErrors }, opts);
662
770
  throw new InstallFailure(failure ? failure.step : step, failure ? failure.cause : e, failure ? failure.dependency : [], rollbackErrors.length === 0 && (failure?.rolledBack ?? true));
663
771
  }
664
772
  }
773
+ /**
774
+ * The install row (role and item policy re-checked under the lock; one live install per org and
775
+ * item). A step of the install: committed on its own.
776
+ */
777
+ /**
778
+ * Enables a plugin's extension for the org and records it as a component of the install, in one
779
+ * transaction (`put` joins it): "enabled before" is decided under the org row lock (already
780
+ * enabled: `put` writes nothing, the config is untouched, the component is recorded as not
781
+ * created), and the ledger row is written before the COMMIT, so no concurrent uninstall fits
782
+ * between enabling and recording. Used by the install and the upgrade.
783
+ */
784
+ async enableExtension(orgId, name, input, actor, actorTokenId, opts, record) {
785
+ const ifDisabled = { skipped: false };
786
+ await this.orgConfigs.put(orgId, name, input, actor, actorTokenId, { ...opts, ifDisabled });
787
+ await record({
788
+ kind: "extension",
789
+ ref: name,
790
+ created: !ifDisabled.skipped,
791
+ skillVersion: null,
792
+ });
793
+ }
794
+ async createInstallRow(orgId, actor, plan, ctx, installId) {
795
+ const { itemId, version } = plan;
796
+ const t = this.db;
797
+ await lockOrgForActions(this.orgLock, orgId, actor, ctx.actions);
798
+ // The scope sync decided outside this lock: a person's switch-off or a scope change committed
799
+ // since then wins (nothing written, converged)
800
+ if (ctx.via === "scope" &&
801
+ ctx.approvedBy === undefined &&
802
+ !(await wantedByScope(t, orgId, itemId))) {
803
+ throw new ScopeNoLongerWanted(orgId, itemId);
804
+ }
805
+ if (ctx.approvedBy !== undefined) {
806
+ // A dependency disabled (or removed) since it was planned
807
+ const own = await t
808
+ .selectFrom("catalog_items")
809
+ .select(["disabled", "deleted_at"])
810
+ .where("id", "=", itemId)
811
+ .forShare()
812
+ .executeTakeFirst();
813
+ if (!own || own.deleted_at !== null) {
814
+ throw unresolved(plan.name, plan.version, "it was removed from the platform catalog");
815
+ }
816
+ if (own.disabled)
817
+ throw dependencyDisabled(plan.name);
818
+ }
819
+ await assertItemInstallable(t, orgId, itemId, ctx.approvedBy ?? itemId);
820
+ const live = await t
821
+ .selectFrom("plugin_installs")
822
+ .select("id")
823
+ .where("org_id", "=", orgId)
824
+ .where("item_id", "=", itemId)
825
+ .where("status", "<>", "failed")
826
+ .executeTakeFirst();
827
+ if (live)
828
+ throw alreadyInstalled();
829
+ try {
830
+ await t
831
+ .insertInto("plugin_installs")
832
+ .values({
833
+ id: installId,
834
+ org_id: orgId,
835
+ item_id: itemId,
836
+ version,
837
+ status: "installing",
838
+ installed_by: actor,
839
+ })
840
+ .execute();
841
+ }
842
+ catch (e) {
843
+ if (isUniqueViolation(e))
844
+ throw alreadyInstalled();
845
+ throw e;
846
+ }
847
+ }
848
+ /** The install `installed` and its `plugin.org_installed` audit, under the org row lock (its own transaction). */
849
+ async markInstalled(orgId, actor, installId, plan, done, ctx, opts) {
850
+ const { itemId, version } = plan;
851
+ const t = this.db;
852
+ await this.orgLock.lock(orgId);
853
+ // The platform version current at commit (one per deployment): a platform update that
854
+ // committed while this install ran moved the row already, or did not see it yet
855
+ const updated = await t
856
+ .updateTable("plugin_installs")
857
+ .set((eb) => ({
858
+ status: "installed",
859
+ version: eb.fn.coalesce(eb
860
+ .selectFrom("catalog_items as i")
861
+ .select("i.platform_synced_version")
862
+ .where("i.id", "=", itemId), eb.ref("plugin_installs.version")),
863
+ }))
864
+ .where("id", "=", installId)
865
+ .where("status", "=", "installing")
866
+ .executeTakeFirst();
867
+ // The install row was already cleaned up as stale: do not audit plugin.org_installed, roll
868
+ // back
869
+ if (updated.numUpdatedRows === 0n) {
870
+ throw new ApiError("plugin.install_not_found", "The install record was cleaned up as stale while the install was running");
871
+ }
872
+ await resolveRequestsByInstall(t, orgId, itemId, actor, opts);
873
+ // The org switch is written with the install, in one transaction under the org lock
874
+ if (ctx.switchOn === true && ctx.parent === undefined) {
875
+ await upsertOrgSwitch(t, orgId, itemId, true, actor);
876
+ }
877
+ await audit(t, {
878
+ actorAccountId: actor,
879
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
880
+ orgId,
881
+ action: "plugin.org_installed",
882
+ target: installId,
883
+ detail: {
884
+ itemId,
885
+ name: plan.name,
886
+ version,
887
+ components: done,
888
+ ...(ctx.parent !== undefined && { dependencyOf: ctx.parent }),
889
+ ...(ctx.via !== undefined && { via: ctx.via }),
890
+ ...opts.auditDetail,
891
+ },
892
+ });
893
+ }
894
+ /** The install `failed` with `{ step, code }` and its `plugin.org_install_failed` audit (its own transaction). */
895
+ async markFailed(orgId, actor, installId, plan, ctx, f, opts) {
896
+ const { itemId, version } = plan;
897
+ const { step, code, done, rollbackErrors } = f;
898
+ const t = this.db;
899
+ await t
900
+ .updateTable("plugin_installs")
901
+ .set({ status: "failed", error: JSON.stringify({ step, code }) })
902
+ .where("id", "=", installId)
903
+ .execute();
904
+ await audit(t, {
905
+ actorAccountId: actor,
906
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
907
+ orgId,
908
+ action: "plugin.org_install_failed",
909
+ target: installId,
910
+ detail: {
911
+ itemId,
912
+ name: plan.name,
913
+ version,
914
+ step,
915
+ code,
916
+ rolledBack: done,
917
+ rollbackErrors,
918
+ ...(ctx.parent !== undefined && { dependencyOf: ctx.parent }),
919
+ ...(ctx.via !== undefined && { via: ctx.via }),
920
+ ...opts.auditDetail,
921
+ },
922
+ });
923
+ }
665
924
  /**
666
925
  * The extension to enable: the plugin's own, when it has one. Not loaded on this replica ->
667
926
  * `catalog.not_deployed`; not yet enabled in this org while its own catalog item is disabled ->
@@ -672,11 +931,11 @@ export class PluginInstaller {
672
931
  if (!manifest.extension)
673
932
  return null;
674
933
  const name = manifest.name;
675
- if (!this.d.host.manifests().some((m) => m.name === name)) {
676
- throw new ApiError("catalog.not_deployed", `The extension of plugin ${name} is not deployed; ask the enterprise admin to install and enable it`);
934
+ if (!this.registry.manifests().some((m) => m.name === name)) {
935
+ throw new ApiError("catalog.not_deployed", `The extension of plugin ${name} is not running on the platform (not installed, waiting for its deployment config or permission approval, disabled, or failed to load); the org cannot switch it on until it runs`);
677
936
  }
678
- const enabled = await isExtensionEnabled(this.d.db, orgId, name);
679
- if (!enabled && (await disabledPluginItems(this.d.db, [name])).length > 0) {
937
+ const enabled = await isExtensionEnabled(this.db, orgId, name);
938
+ if (!enabled && (await disabledPluginItems(this.db, [name])).length > 0) {
680
939
  throw pluginItemDisabled([name]);
681
940
  }
682
941
  return name;
@@ -705,46 +964,13 @@ export class PluginInstaller {
705
964
  if (!c.created && c.skillVersion === null)
706
965
  continue;
707
966
  try {
708
- const disabled = [];
709
- await this.d.db.transaction().execute(async (t) => {
710
- await lockOrg(t, orgId);
711
- if (c.kind === "plugin") {
712
- // A dependency install this install created: uninstalled by the usual rules
713
- const sub = { removed: [], kept: [] };
714
- await this.uninstallIn(t, orgId, actor, c.ref, {
715
- report: sub,
716
- removing: new Set([installId]),
717
- from: installId,
718
- authorize: false,
719
- reason: "plugin_install_rollback",
720
- opts,
721
- });
722
- disabled.push(...sub.removed.filter((r) => r.kind === "extension").map((r) => r.ref));
723
- }
724
- else {
725
- // Another enabled extension depends on it (only it provides what that one needs in this
726
- // org): kept (its component row too), so the other does not lose its dependency
727
- if (c.kind === "extension" &&
728
- (await this.d.orgConfigs.enabledDependents(t, orgId, c.ref)).length > 0) {
729
- return;
730
- }
731
- const removed = await this.removeComponent(t, orgId, actor, c, "plugin_install_rollback");
732
- if (removed && c.kind === "extension")
733
- disabled.push(c.ref);
734
- }
735
- await t
736
- .deleteFrom("plugin_install_components")
737
- .where("install_id", "=", installId)
738
- .where("kind", "=", c.kind)
739
- .where("ref", "=", c.ref)
740
- .execute();
741
- });
967
+ const disabled = await this.rollbackOne(orgId, actor, installId, c, opts);
742
968
  for (const p of disabled)
743
- await this.d.orgConfigs.afterDisable(orgId, p);
969
+ await this.orgConfigs.afterDisable(orgId, p);
744
970
  }
745
971
  catch (e) {
746
972
  errors.push({ kind: c.kind, ref: c.ref });
747
- this.d.log?.warn("plugin install rollback step failed", {
973
+ this.log.warn("plugin install rollback step failed", {
748
974
  orgId,
749
975
  kind: c.kind,
750
976
  ref: c.ref,
@@ -754,11 +980,53 @@ export class PluginInstaller {
754
980
  }
755
981
  return errors;
756
982
  }
983
+ /**
984
+ * Undoes one component of a failed install and deletes its component row, under the org row lock,
985
+ * in a transaction of its own (committed when it returns); returns the extensions it disabled
986
+ * (the caller notifies them).
987
+ */
988
+ async rollbackOne(orgId, actor, installId, c, opts) {
989
+ const disabled = [];
990
+ const t = this.db;
991
+ await this.orgLock.lock(orgId);
992
+ if (c.kind === "plugin") {
993
+ // A dependency install this install created: uninstalled by the usual rules
994
+ const sub = { removed: [], kept: [] };
995
+ await this.uninstallIn(orgId, actor, c.ref, {
996
+ report: sub,
997
+ removing: new Set([installId]),
998
+ from: installId,
999
+ authorize: false,
1000
+ reason: "plugin_install_rollback",
1001
+ opts,
1002
+ });
1003
+ disabled.push(...sub.removed.filter((r) => r.kind === "extension").map((r) => r.ref));
1004
+ }
1005
+ else {
1006
+ // Another enabled extension depends on it (only it provides what that one needs in this
1007
+ // org): kept (its component row too), so the other does not lose its dependency
1008
+ if (c.kind === "extension" &&
1009
+ (await this.orgConfigs.enabledDependents(orgId, c.ref)).length > 0) {
1010
+ return [];
1011
+ }
1012
+ const removed = await this.removeComponent(orgId, actor, c, "plugin_install_rollback");
1013
+ if (removed && c.kind === "extension")
1014
+ disabled.push(c.ref);
1015
+ }
1016
+ await t
1017
+ .deleteFrom("plugin_install_components")
1018
+ .where("install_id", "=", installId)
1019
+ .where("kind", "=", c.kind)
1020
+ .where("ref", "=", c.ref)
1021
+ .execute();
1022
+ return disabled;
1023
+ }
757
1024
  /** Removes one component (one already gone is no error); returns whether anything changed. */
758
- async removeComponent(t, orgId, actor, c, reason) {
1025
+ async removeComponent(orgId, actor, c, reason) {
759
1026
  if (c.kind === "extension") {
760
- return this.d.orgConfigs.disableIn(t, orgId, c.ref, actor, reason);
1027
+ return this.orgConfigs.disableIn(orgId, c.ref, actor, reason);
761
1028
  }
1029
+ const t = this.db;
762
1030
  if (c.kind === "connector") {
763
1031
  const live = await t
764
1032
  .selectFrom("connectors")
@@ -769,11 +1037,18 @@ export class PluginInstaller {
769
1037
  .executeTakeFirst();
770
1038
  if (!live)
771
1039
  return false;
772
- await this.d.connectors.removeIn(t, orgId, c.ref, actor, undefined, reason);
1040
+ await this.connectors.removeIn(orgId, c.ref, actor, undefined, reason);
773
1041
  return true;
774
1042
  }
775
1043
  if (c.kind === "plugin")
776
1044
  return false;
1045
+ // A row the org promoted is the org's own shared item (ruling P3-47): an install never
1046
+ // removes or reverts it (P3-46 keeps plugin content from being promoted; this guards rows
1047
+ // recorded before that or by a legacy install)
1048
+ if ((c.kind === "agent_template" || c.kind === "skill") &&
1049
+ (await promotedOrgRow(t, orgId, c.kind, c.ref))) {
1050
+ return false;
1051
+ }
777
1052
  if (c.kind === "agent_template") {
778
1053
  if (c.created)
779
1054
  return softDeleteTemplateIn(t, orgId, c.ref);
@@ -783,9 +1058,9 @@ export class PluginInstaller {
783
1058
  return false;
784
1059
  }
785
1060
  if (c.created)
786
- return this.d.skills.softDeleteIn(t, orgId, c.ref, actor, reason);
1061
+ return this.skills.softDeleteIn(orgId, c.ref, actor, reason);
787
1062
  if (c.skillVersion !== null) {
788
- return this.d.skills.revertVersionIn(t, orgId, c.ref, c.skillVersion, actor, reason);
1063
+ return this.skills.revertVersionIn(orgId, c.ref, c.skillVersion, actor, reason);
789
1064
  }
790
1065
  return false;
791
1066
  }
@@ -811,35 +1086,115 @@ export class PluginInstaller {
811
1086
  * (a replica crashed midway) - the last two are cleaned up as a rollback (versions added to
812
1087
  * existing skills are reverted too). Still installing -> `plugin.install_in_progress`.
813
1088
  */
814
- async uninstall(orgId, actor, installId, opts = {}) {
1089
+ async uninstall(orgId, actor, installId, opts = {}, sw) {
815
1090
  if (!UUID_RE.test(installId))
816
1091
  throw installNotFound();
1092
+ return this.writeUninstall(orgId, actor, installId, opts, sw);
1093
+ }
1094
+ /**
1095
+ * The uninstall's one transaction; the extensions it disabled are notified once it commits. A
1096
+ * scope sync uninstall (`via: "scope"`) re-checks under the org row lock that the item is still
1097
+ * not wanted in the org and that no other live install depends on it ({@link ScopeStillWanted},
1098
+ * nothing written), and keeps the connectors it created as the org's own (`org_owned`).
1099
+ */
1100
+ async writeUninstall(orgId, actor, installId, opts, sw) {
1101
+ const { via, ...actorOpts } = opts;
817
1102
  const report = { removed: [], kept: [] };
818
- await this.d.db.transaction().execute(async (t) => {
819
- const outcome = await this.uninstallIn(t, orgId, actor, installId, {
820
- report,
821
- removing: new Set(),
822
- authorize: true,
823
- opts,
824
- });
825
- if (outcome === "missing")
826
- throw installNotFound();
827
- if (outcome === "kept") {
828
- report.kept.push({ kind: "plugin", ref: installId, reason: "used_by_other_install" });
1103
+ let itemId;
1104
+ if (via === "scope") {
1105
+ // A person's switch-on (or a scope change) committed after the sync's decision wins
1106
+ await this.orgLock.lock(orgId);
1107
+ const row = await this.db
1108
+ .selectFrom("plugin_installs")
1109
+ .select("item_id")
1110
+ .where("id", "=", installId)
1111
+ .where("org_id", "=", orgId)
1112
+ .executeTakeFirst();
1113
+ if (row !== undefined &&
1114
+ ((await wantedByScope(this.db, orgId, row.item_id)) ||
1115
+ (await this.heir(orgId, new Set([installId]), "plugin", installId)) !== undefined)) {
1116
+ throw new ScopeStillWanted(orgId, row.item_id);
1117
+ }
1118
+ }
1119
+ if (sw !== undefined) {
1120
+ // Switching off: the org lock first, then the preview is re-checked and the switch row is
1121
+ // written in this same transaction
1122
+ await this.orgLock.lock(orgId);
1123
+ const row = await this.db
1124
+ .selectFrom("plugin_installs")
1125
+ .select("item_id")
1126
+ .where("id", "=", installId)
1127
+ .where("org_id", "=", orgId)
1128
+ .executeTakeFirst();
1129
+ itemId = row?.item_id;
1130
+ // The item row FOR SHARE, as a switch without an uninstall takes it: an owner's delete or
1131
+ // transfer (FOR UPDATE) decides on who uses it
1132
+ if (itemId !== undefined) {
1133
+ await this.db
1134
+ .selectFrom("catalog_items")
1135
+ .select("id")
1136
+ .where("id", "=", itemId)
1137
+ .forShare()
1138
+ .executeTakeFirst();
1139
+ }
1140
+ if (sw.expectHash !== undefined && row !== undefined) {
1141
+ const now = uninstallPreviewHash(await this.previewUninstall(orgId, installId));
1142
+ if (now !== sw.expectHash) {
1143
+ throw new ApiError("plugin.switch_stale", "The uninstall preview changed; review it and confirm again");
1144
+ }
829
1145
  }
1146
+ }
1147
+ // An org's own uninstall never takes the platform default theme away from it (themes spec §7;
1148
+ // a scope sync uninstall follows a scope change or disable that was guarded already)
1149
+ if (via !== "scope")
1150
+ await this.assertKeepsPlatformDefault(orgId, installId);
1151
+ const outcome = await this.uninstallIn(orgId, actor, installId, {
1152
+ report,
1153
+ removing: new Set(),
1154
+ authorize: true,
1155
+ opts: actorOpts,
1156
+ ...(via !== undefined && { via }),
830
1157
  });
831
- for (const r of report.removed) {
832
- if (r.kind === "extension")
833
- await this.d.orgConfigs.afterDisable(orgId, r.ref);
1158
+ if (outcome === "missing")
1159
+ throw installNotFound();
1160
+ if (outcome === "kept") {
1161
+ report.kept.push({ kind: "plugin", ref: installId, reason: "used_by_other_install" });
834
1162
  }
1163
+ if (itemId !== undefined && outcome === "removed") {
1164
+ await upsertOrgSwitch(this.db, orgId, itemId, false, actor);
1165
+ }
1166
+ afterCommit(async () => {
1167
+ for (const r of report.removed) {
1168
+ if (r.kind === "extension")
1169
+ await this.orgConfigs.afterDisable(orgId, r.ref);
1170
+ }
1171
+ });
835
1172
  return report;
836
1173
  }
1174
+ /**
1175
+ * 409 `theme.platform_default` when uninstalling `installId` would switch the platform default
1176
+ * theme off in the org (one of the plugin's `follow` themes on there through it, themes spec §7),
1177
+ * in the caller's transaction before anything is written. A missing install passes (the
1178
+ * uninstall reports it).
1179
+ */
1180
+ async assertKeepsPlatformDefault(orgId, installId) {
1181
+ const found = await this.db
1182
+ .selectFrom("plugin_installs")
1183
+ .select("id")
1184
+ .where("id", "=", installId)
1185
+ .where("org_id", "=", orgId)
1186
+ .executeTakeFirst();
1187
+ if (!found)
1188
+ return;
1189
+ const p = await this.previewUninstall(orgId, installId);
1190
+ await assertNotPlatformDefault(this.db, (p.themes ?? []).map((t) => t.id), () => "narrower");
1191
+ }
837
1192
  /**
838
1193
  * The oldest other live install (not in `removing`) that has component `kind` / `ref`, or
839
1194
  * undefined.
840
1195
  */
841
- async heir(t, orgId, removing, kind, ref) {
842
- let q = t
1196
+ async heir(orgId, removing, kind, ref) {
1197
+ let q = this.db
843
1198
  .selectFrom("plugin_install_components as c")
844
1199
  .innerJoin("plugin_installs as a", "a.id", "c.install_id")
845
1200
  .select("a.id")
@@ -853,8 +1208,8 @@ export class PluginInstaller {
853
1208
  return row?.id;
854
1209
  }
855
1210
  /** Passes ownership of a component to `heir` (its component row becomes created=true). */
856
- async handOver(t, heir, kind, ref) {
857
- await t
1211
+ async handOver(heir, kind, ref) {
1212
+ await this.db
858
1213
  .updateTable("plugin_install_components")
859
1214
  .set({ created: true })
860
1215
  .where("install_id", "=", heir)
@@ -868,7 +1223,8 @@ export class PluginInstaller {
868
1223
  * outcome of the install itself is returned for the caller to report: `missing`, `kept` (another
869
1224
  * install outside this uninstall depends on it) or `removed`.
870
1225
  */
871
- async uninstallIn(t, orgId, actor, installId, ctx) {
1226
+ async uninstallIn(orgId, actor, installId, ctx) {
1227
+ const t = this.db;
872
1228
  const { removing } = ctx;
873
1229
  if (removing.has(installId))
874
1230
  return "removed";
@@ -882,7 +1238,7 @@ export class PluginInstaller {
882
1238
  mine.kept.push(x);
883
1239
  ctx.report.kept.push(x);
884
1240
  };
885
- const staleMinutes = this.d.staleInstallMinutes();
1241
+ const staleMinutes = this.staleInstallMinutes();
886
1242
  if (ctx.authorize) {
887
1243
  const target = await t
888
1244
  .selectFrom("plugin_installs as a")
@@ -891,7 +1247,7 @@ export class PluginInstaller {
891
1247
  .where("a.id", "=", installId)
892
1248
  .where("a.org_id", "=", orgId)
893
1249
  .executeTakeFirst();
894
- await lockOrgForActions(t, orgId, actor, target ? requiredActions(target.manifest) : ALL_ACTIONS);
1250
+ await lockOrgForActions(this.orgLock, orgId, actor, target ? requiredActions(target.manifest) : ALL_ACTIONS);
895
1251
  }
896
1252
  const row = await t
897
1253
  .selectFrom("plugin_installs as a")
@@ -912,12 +1268,17 @@ export class PluginInstaller {
912
1268
  .executeTakeFirst();
913
1269
  if (!row)
914
1270
  return "missing";
1271
+ // A dependency its own scope still wants on in the org stays as a standalone install (the
1272
+ // dependent's component row goes with the dependent's install row)
1273
+ if (ctx.from !== undefined && (await wantedByScope(t, orgId, row.item_id))) {
1274
+ return "wanted_by_scope";
1275
+ }
915
1276
  // Another install outside this uninstall depends on it: kept (a dependency uninstall hands
916
1277
  // ownership over)
917
- const user = await this.heir(t, orgId, new Set([...removing, installId]), "plugin", installId);
1278
+ const user = await this.heir(orgId, new Set([...removing, installId]), "plugin", installId);
918
1279
  if (user !== undefined) {
919
1280
  if (ctx.from !== undefined)
920
- await this.handOver(t, user, "plugin", installId);
1281
+ await this.handOver(user, "plugin", installId);
921
1282
  return "kept";
922
1283
  }
923
1284
  if (row.status === "uninstalling" ||
@@ -927,7 +1288,7 @@ export class PluginInstaller {
927
1288
  }
928
1289
  if (row.status === "upgrading") {
929
1290
  // An upgrade interrupted midway (a replica crashed): undone first, back at the old version
930
- const undone = await this.undoUpgradeIn(t, orgId, actor, installId, journalEntries(row.upgrade), "plugin_upgrade_cleanup");
1291
+ const undone = await this.undoUpgradeIn(orgId, actor, installId, journalEntries(row.upgrade), "plugin_upgrade_cleanup");
931
1292
  for (const x of undone)
932
1293
  addRemoved(x);
933
1294
  }
@@ -953,7 +1314,7 @@ export class PluginInstaller {
953
1314
  ? 2 + extensionOrder.indexOf(c.ref)
954
1315
  : 1000 + (c.created ? 0 : 1);
955
1316
  comps.sort((a, b) => rank(a) - rank(b));
956
- const agentRefs = await this.agentRefs(t, orgId);
1317
+ const agentRefs = await this.agentRefs(orgId);
957
1318
  for (const c of comps) {
958
1319
  const keep = (reason) => addKept({ kind: c.kind, ref: c.ref, reason });
959
1320
  let created = c.created;
@@ -977,13 +1338,17 @@ export class PluginInstaller {
977
1338
  created = now.created;
978
1339
  }
979
1340
  const comp = { kind: c.kind, ref: c.ref, created, skillVersion: c.skill_version };
1341
+ // Skills and agent templates of earlier installs (org copies, now linked to the platform
1342
+ // components, phase 2) stay: the plugin's components go off in the org with the install
1343
+ if ((c.kind === "skill" || c.kind === "agent_template") && !rollbackMode)
1344
+ continue;
980
1345
  if (!created) {
981
1346
  // Rollback cleanup: a version this install added to an existing skill is reverted; other
982
1347
  // pre-existing components are kept
983
1348
  if (rollbackMode &&
984
1349
  (c.kind === "skill" || c.kind === "agent_template") &&
985
1350
  c.skill_version !== null &&
986
- (await this.removeComponent(t, orgId, actor, comp, "plugin_install_cleanup"))) {
1351
+ (await this.removeComponent(orgId, actor, comp, "plugin_install_cleanup"))) {
987
1352
  addRemoved({ kind: c.kind, ref: c.ref });
988
1353
  continue;
989
1354
  }
@@ -991,15 +1356,23 @@ export class PluginInstaller {
991
1356
  continue;
992
1357
  }
993
1358
  if (c.kind === "plugin") {
994
- const outcome = await this.uninstallIn(t, orgId, actor, c.ref, { ...ctx, from: installId });
1359
+ const outcome = await this.uninstallIn(orgId, actor, c.ref, { ...ctx, from: installId });
995
1360
  if (outcome === "removed")
996
1361
  addRemoved({ kind: "plugin", ref: c.ref });
997
1362
  else if (outcome === "kept")
998
1363
  keep("used_by_other_install");
1364
+ else if (outcome === "wanted_by_scope")
1365
+ keep("wanted_by_scope");
1366
+ continue;
1367
+ }
1368
+ // A scope sync uninstall leaves the connectors to the org (spec §5 rule 8): the component row
1369
+ // goes with the install row, so nothing removes them later
1370
+ if (c.kind === "connector" && ctx.via === "scope" && !rollbackMode) {
1371
+ keep("org_owned");
999
1372
  continue;
1000
1373
  }
1001
1374
  const reason = rollbackMode ? "plugin_install_cleanup" : (ctx.reason ?? "plugin_uninstall");
1002
- const outcome = await this.decideRemovalIn(t, orgId, actor, comp, removing, agentRefs, reason);
1375
+ const outcome = await this.decideRemovalIn(orgId, actor, comp, removing, agentRefs, reason);
1003
1376
  if (outcome === "removed")
1004
1377
  addRemoved({ kind: c.kind, ref: c.ref });
1005
1378
  else if (outcome !== "gone")
@@ -1020,6 +1393,8 @@ export class PluginInstaller {
1020
1393
  removed: mine.removed,
1021
1394
  kept: mine.kept,
1022
1395
  ...(ctx.from !== undefined && { dependencyOf: ctx.from }),
1396
+ ...(ctx.via !== undefined && { via: ctx.via }),
1397
+ ...ctx.opts.auditDetail,
1023
1398
  },
1024
1399
  });
1025
1400
  return "removed";
@@ -1034,7 +1409,7 @@ export class PluginInstaller {
1034
1409
  * (`used_by_plugins`); otherwise removed (`removed`, or `gone` when it no longer existed). Used
1035
1410
  * by uninstall and by an upgrade's removals.
1036
1411
  */
1037
- async decideRemovalIn(t, orgId, actor, c, removing, agentRefs, reason) {
1412
+ async decideRemovalIn(orgId, actor, c, removing, agentRefs, reason) {
1038
1413
  if (c.kind === "skill" && agentRefs.skills.has(c.ref))
1039
1414
  return "used_by_agents";
1040
1415
  if (c.kind === "agent_template" && agentRefs.templates.has(c.ref))
@@ -1042,16 +1417,16 @@ export class PluginInstaller {
1042
1417
  if (c.kind === "connector" && agentRefs.connectors.has(c.ref))
1043
1418
  return "used_by_agents";
1044
1419
  if (c.kind !== "connector") {
1045
- const heir = await this.heir(t, orgId, removing, c.kind, c.ref);
1420
+ const heir = await this.heir(orgId, removing, c.kind, c.ref);
1046
1421
  if (heir !== undefined) {
1047
- await this.handOver(t, heir, c.kind, c.ref);
1422
+ await this.handOver(heir, c.kind, c.ref);
1048
1423
  return "used_by_other_install";
1049
1424
  }
1050
1425
  }
1051
1426
  if (c.kind === "extension") {
1052
1427
  const kinds = this.connectorKindsOf(c.ref);
1053
1428
  if (kinds.length > 0) {
1054
- const used = await t
1429
+ const used = await this.db
1055
1430
  .selectFrom("connectors")
1056
1431
  .select("id")
1057
1432
  .where("org_id", "=", orgId)
@@ -1061,21 +1436,21 @@ export class PluginInstaller {
1061
1436
  if (used)
1062
1437
  return "used_by_connectors";
1063
1438
  }
1064
- if ((await this.d.orgConfigs.enabledDependents(t, orgId, c.ref)).length > 0) {
1439
+ if ((await this.orgConfigs.enabledDependents(orgId, c.ref)).length > 0) {
1065
1440
  return "used_by_plugins";
1066
1441
  }
1067
1442
  }
1068
- return (await this.removeComponent(t, orgId, actor, c, reason)) ? "removed" : "gone";
1443
+ return (await this.removeComponent(orgId, actor, c, reason)) ? "removed" : "gone";
1069
1444
  }
1070
1445
  /** The order extensions are uninstalled in: the reverse of the install (requires) order; extensions not loaded on this replica last. */
1071
1446
  uninstallExtensionOrder(refs) {
1072
- const loaded = new Map(this.d.host.manifests().map((m) => [m.name, m]));
1447
+ const loaded = new Map(this.registry.manifests().map((m) => [m.name, m]));
1073
1448
  const known = refs.filter((r) => loaded.has(r)).map((r) => loaded.get(r));
1074
1449
  return [...orderByRequires(known).reverse(), ...refs.filter((r) => !loaded.has(r))];
1075
1450
  }
1076
1451
  /** The org's plugin installs (failed ones included), newest first; `installId` picks one. */
1077
1452
  async list(orgId, installId) {
1078
- let q = this.d.db
1453
+ let q = this.db
1079
1454
  .selectFrom("plugin_installs as a")
1080
1455
  .innerJoin("catalog_items as i", "i.id", "a.item_id")
1081
1456
  .select([
@@ -1094,8 +1469,7 @@ export class PluginInstaller {
1094
1469
  const rows = await q.orderBy("a.installed_at", "desc").orderBy("a.id").execute();
1095
1470
  if (rows.length === 0)
1096
1471
  return [];
1097
- const info = await upgradeInfo(this.d.db, this.d.host, rows.map((r) => ({ itemId: r.item_id, name: r.name, version: r.version })));
1098
- const comps = await this.d.db
1472
+ const comps = await this.db
1099
1473
  .selectFrom("plugin_install_components")
1100
1474
  .select(["install_id", "kind", "ref", "created", "skill_version", "dropped"])
1101
1475
  .where("install_id", "in", rows.map((r) => r.id))
@@ -1118,8 +1492,8 @@ export class PluginInstaller {
1118
1492
  skillVersion: c.skill_version,
1119
1493
  dropped: c.dropped,
1120
1494
  })),
1121
- upgradeAvailable: info.get(`${r.item_id}@${r.version}`)?.upgradeAvailable ?? null,
1122
- deploymentPending: info.get(`${r.item_id}@${r.version}`)?.deploymentPending ?? false,
1495
+ upgradeAvailable: null,
1496
+ deploymentPending: false,
1123
1497
  }));
1124
1498
  }
1125
1499
  /**
@@ -1131,9 +1505,9 @@ export class PluginInstaller {
1131
1505
  * extension among them needs `afterDisable` once committed). Used when an upgrade fails and when
1132
1506
  * an interrupted one is cleaned up.
1133
1507
  */
1134
- async undoUpgradeIn(t, orgId, actor, installId, steps, reason) {
1508
+ async undoUpgradeIn(orgId, actor, installId, steps, reason) {
1135
1509
  const removed = [];
1136
- const dropRow = (kind, ref) => t
1510
+ const dropRow = (kind, ref) => this.db
1137
1511
  .deleteFrom("plugin_install_components")
1138
1512
  .where("install_id", "=", installId)
1139
1513
  .where("kind", "=", kind)
@@ -1141,11 +1515,11 @@ export class PluginInstaller {
1141
1515
  .execute();
1142
1516
  for (const s of [...steps].reverse()) {
1143
1517
  if (s.op === "skill_version") {
1144
- await this.d.skills.revertVersionIn(t, orgId, s.ref, s.version, actor, reason);
1518
+ await this.skills.revertVersionIn(orgId, s.ref, s.version, actor, reason);
1145
1519
  continue;
1146
1520
  }
1147
1521
  if (s.op === "template_version") {
1148
- await revertTemplateVersionIn(t, orgId, s.ref, s.version);
1522
+ await revertTemplateVersionIn(this.db, orgId, s.ref, s.version);
1149
1523
  continue;
1150
1524
  }
1151
1525
  if (s.op === "recorded") {
@@ -1155,7 +1529,7 @@ export class PluginInstaller {
1155
1529
  if (s.kind === "plugin") {
1156
1530
  const sub = { removed: [], kept: [] };
1157
1531
  await dropRow(s.kind, s.ref);
1158
- const outcome = await this.uninstallIn(t, orgId, actor, s.ref, {
1532
+ const outcome = await this.uninstallIn(orgId, actor, s.ref, {
1159
1533
  report: sub,
1160
1534
  removing: new Set([installId]),
1161
1535
  from: installId,
@@ -1169,59 +1543,506 @@ export class PluginInstaller {
1169
1543
  continue;
1170
1544
  }
1171
1545
  if (s.kind === "extension" &&
1172
- (await this.d.orgConfigs.enabledDependents(t, orgId, s.ref)).length > 0) {
1546
+ (await this.orgConfigs.enabledDependents(orgId, s.ref)).length > 0) {
1173
1547
  // Another enabled extension needs it: kept, and stays this install's component
1174
1548
  continue;
1175
1549
  }
1176
1550
  const c = { kind: s.kind, ref: s.ref, created: true, skillVersion: null };
1177
- if (await this.removeComponent(t, orgId, actor, c, reason)) {
1551
+ if (await this.removeComponent(orgId, actor, c, reason)) {
1178
1552
  removed.push({ kind: s.kind, ref: s.ref });
1179
1553
  }
1180
1554
  await dropRow(s.kind, s.ref);
1181
1555
  }
1182
1556
  return removed;
1183
1557
  }
1558
+ /**
1559
+ * Installs the dependencies an installed plugin's version declares and the org lacks (rule 9),
1560
+ * as the kernel (actor null): a platform update can add one. Each is recorded on the install
1561
+ * as a `plugin` component (created when this installed it, so an uninstall takes it along). One
1562
+ * that needs the org's input (connector templates) is left out and its name returned. A
1563
+ * dependency already installed in the org is recorded as it is (created false).
1564
+ */
1565
+ async addMissingDependencies(orgId, installId) {
1566
+ const row = await this.db
1567
+ .selectFrom("plugin_installs as a")
1568
+ .innerJoin("catalog_item_versions as v", (j) => j.onRef("v.item_id", "=", "a.item_id").onRef("v.version", "=", "a.version"))
1569
+ .select(["a.item_id", "a.status", "v.manifest"])
1570
+ .where("a.id", "=", installId)
1571
+ .where("a.org_id", "=", orgId)
1572
+ .executeTakeFirst();
1573
+ if (row?.status !== "installed")
1574
+ return [];
1575
+ const record = async (c) => {
1576
+ await this.db
1577
+ .insertInto("plugin_install_components")
1578
+ .values({
1579
+ install_id: installId,
1580
+ kind: c.kind,
1581
+ ref: c.ref,
1582
+ created: c.created,
1583
+ skill_version: null,
1584
+ })
1585
+ .onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
1586
+ .execute();
1587
+ };
1588
+ const needsInput = [];
1589
+ for (const dep of await resolveDependencies(this.db, row.manifest)) {
1590
+ if ((await this.recordDependency(orgId, dep, record)) !== undefined)
1591
+ continue;
1592
+ let plan;
1593
+ try {
1594
+ plan = await this.plan(orgId, null, dep.itemId, dep.version, {}, "", row.item_id);
1595
+ }
1596
+ catch (e) {
1597
+ if (e instanceof NeedsOrgInput) {
1598
+ needsInput.push(dep.name);
1599
+ continue;
1600
+ }
1601
+ throw e;
1602
+ }
1603
+ const child = await this.execute(orgId, null, plan, {}, {
1604
+ actions: requiredActions(plan.manifest),
1605
+ approvedBy: row.item_id,
1606
+ parent: installId,
1607
+ via: "scope",
1608
+ });
1609
+ await this.recordDependency(orgId, dep, record, child);
1610
+ }
1611
+ return needsInput;
1612
+ }
1613
+ /**
1614
+ * The connector templates of an installed plugin that are on in the org (ruling P2-6) and have
1615
+ * no live connector there: made from the platform template (`platform_template_id`) or recorded
1616
+ * on the install (`template_id`). The org's plugin is `needs_config` while any is missing (ruling
1617
+ * P2-10). Empty for a plugin not installed.
1618
+ */
1619
+ async missingConnectors(orgId, itemId) {
1620
+ const a = await this.db
1621
+ .selectFrom("plugin_installs as a")
1622
+ .innerJoin("catalog_item_versions as v", (j) => j.onRef("v.item_id", "=", "a.item_id").onRef("v.version", "=", "a.version"))
1623
+ .select(["a.id", "a.version", "v.manifest", "v.object_prefix", "v.files"])
1624
+ .where("a.org_id", "=", orgId)
1625
+ .where("a.item_id", "=", itemId)
1626
+ .where("a.status", "=", "installed")
1627
+ .executeTakeFirst();
1628
+ if (!a)
1629
+ return undefined;
1630
+ if ((a.manifest.connectorTemplates ?? []).length === 0) {
1631
+ return { installId: a.id, version: a.version, templates: [] };
1632
+ }
1633
+ const all = await readCatalogTemplates(this.storage, a);
1634
+ const on = await connectorTemplatesOn(this.db, orgId, itemId, all.map((t) => t.id));
1635
+ const made = new Set((await this.db
1636
+ .selectFrom("connectors as c")
1637
+ .innerJoin("platform_connector_templates as p", "p.id", "c.platform_template_id")
1638
+ .select("p.template_id")
1639
+ .where("c.org_id", "=", orgId)
1640
+ .where("c.deleted_at", "is", null)
1641
+ .where("p.catalog_item_id", "=", itemId)
1642
+ .execute()).map((r) => r.template_id));
1643
+ const recorded = await this.db
1644
+ .selectFrom("plugin_install_components as l")
1645
+ .innerJoin("connectors as c", (j) => j.on(sql `c.id::text`, "=", sql `l.ref`))
1646
+ .select("l.template_id")
1647
+ .where("l.install_id", "=", a.id)
1648
+ .where("l.kind", "=", "connector")
1649
+ .where("c.deleted_at", "is", null)
1650
+ .execute();
1651
+ for (const r of recorded)
1652
+ if (r.template_id !== null)
1653
+ made.add(r.template_id);
1654
+ return {
1655
+ installId: a.id,
1656
+ version: a.version,
1657
+ templates: all.filter((t) => on.has(t.id) && !made.has(t.id)),
1658
+ };
1659
+ }
1660
+ /**
1661
+ * Creates the connectors an installed plugin is missing (ruling P2-10, `POST …/catalog/:itemId/
1662
+ * connectors`): `input.connectors` names some of {@link missingConnectors}' templates with the
1663
+ * same input as an install (endpoint, credential or OAuth client); each is created as at install
1664
+ * and recorded on the install. Returns the created connectors by template.
1665
+ */
1666
+ async configureConnectors(orgId, actor, itemId, input, opts = {}) {
1667
+ if (!UUID_RE.test(itemId))
1668
+ throw installNotFound();
1669
+ const missing = await this.missingConnectors(orgId, itemId);
1670
+ if (!missing)
1671
+ throw installNotFound();
1672
+ const keys = Object.keys(input.connectors ?? {});
1673
+ if (keys.length === 0) {
1674
+ throw new ApiError("validation_failed", "Request validation failed", [
1675
+ { path: "connectors", message: "Give the input of at least one missing connector" },
1676
+ ]);
1677
+ }
1678
+ for (const k of keys) {
1679
+ if (!missing.templates.some((t) => t.id === k)) {
1680
+ throw new ApiError("validation_failed", "Request validation failed", [
1681
+ {
1682
+ path: `connectors.${k}`,
1683
+ message: "No connector of this template is missing in this organization",
1684
+ },
1685
+ ]);
1686
+ }
1687
+ }
1688
+ const item = await this.db
1689
+ .selectFrom("catalog_items")
1690
+ .select("name")
1691
+ .where("id", "=", itemId)
1692
+ .executeTakeFirstOrThrow();
1693
+ const plans = missing.templates
1694
+ .filter((t) => keys.includes(t.id))
1695
+ .map((t) => ({
1696
+ id: t.id,
1697
+ ci: this.planConnector(actor, { itemId, version: missing.version, name: item.name }, t, input, "", undefined),
1698
+ }));
1699
+ const out = [];
1700
+ for (const p of plans) {
1701
+ const r = await this.connectors.create(orgId, actor, p.ci, opts.actorTokenId);
1702
+ await this.recordConnector(missing.installId, r.connector.id, p.id);
1703
+ out.push({ templateId: p.id, connectorId: r.connector.id });
1704
+ }
1705
+ return out;
1706
+ }
1707
+ /** A configured connector's ledger row (its own transaction). */
1708
+ async recordConnector(installId, ref, templateId) {
1709
+ await this.db
1710
+ .insertInto("plugin_install_components")
1711
+ .values({
1712
+ install_id: installId,
1713
+ kind: "connector",
1714
+ ref,
1715
+ created: true,
1716
+ skill_version: null,
1717
+ template_id: templateId,
1718
+ })
1719
+ .onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
1720
+ .execute();
1721
+ }
1722
+ /**
1723
+ * One more connector from a platform connector template on in the org (rulings P4-7, P4-T6-8;
1724
+ * `POST …/connector-templates/:templateId/connectors`): `templateId` is the platform connector
1725
+ * template's id; `config` is an install's connector input (endpoint, credential or OAuth client,
1726
+ * slug) and `name` its name. Without a slug the name and slug default to the first free ones,
1727
+ * chosen by the create under the org lock after its outbound calls
1728
+ * (`CreateConnectorInput.slugDefault`); only a given slug answers 409 `connector.slug_taken`. Created as at install ({@link planConnector}, then
1729
+ * `ConnectorsService.create`, which checks the slug before any outbound call and re-checks it,
1730
+ * `connectors.manage`, the item and the template being on under the org lock), linked to the
1731
+ * template, and recorded on the plugin's live install in the org when there is one. A template
1732
+ * that is missing, deleted or not offered to the org -> 404 `component.not_found`; offered but
1733
+ * off there (its plugin not installed, or switched off) -> 409 `component.off`; input errors ->
1734
+ * 400 `validation_failed` at `config.<field>`.
1735
+ */
1736
+ async addTemplateConnector(orgId, actor, templateId, input, opts = {}) {
1737
+ const notFound = () => new ApiError("component.not_found", "The connector template does not exist or is not available in this organization");
1738
+ if (!UUID_RE.test(templateId))
1739
+ throw notFound();
1740
+ // read here to fail early, and again under the org lock by the create (`mustBeOn`)
1741
+ const state = await connectorTemplateState(this.db, orgId, templateId);
1742
+ if (state === "absent")
1743
+ throw notFound();
1744
+ if (state === "off") {
1745
+ throw new ApiError("component.off", "This connector template is off in this organization; switch it (or its plugin) on first");
1746
+ }
1747
+ const row = await this.db
1748
+ .selectFrom("platform_connector_templates as t")
1749
+ .innerJoin("catalog_items as i", "i.id", "t.catalog_item_id")
1750
+ .leftJoin("plugin_installs as a", (j) => j
1751
+ .onRef("a.item_id", "=", "t.catalog_item_id")
1752
+ .on("a.org_id", "=", orgId)
1753
+ .on("a.status", "=", "installed"))
1754
+ .select([
1755
+ "t.template_id",
1756
+ "t.catalog_item_id",
1757
+ "t.file",
1758
+ "i.name",
1759
+ "i.latest_version",
1760
+ "a.version",
1761
+ ])
1762
+ .where("t.id", "=", templateId)
1763
+ .executeTakeFirstOrThrow();
1764
+ const ct = { id: row.template_id, file: row.file };
1765
+ const at = `connectors.${ct.id}`;
1766
+ // the paths of an install's input and of the create, under `config` here (`name` stays)
1767
+ const rebase = (e) => {
1768
+ if (!(e instanceof ApiError) || e.code !== "validation_failed" || !e.details)
1769
+ return e;
1770
+ return new ApiError(e.code, e.message, e.details.map((d) => {
1771
+ const path = d.path;
1772
+ if (typeof path !== "string")
1773
+ return d;
1774
+ const rest = path === at || path.startsWith(`${at}.`) ? path.slice(at.length + 1) : path;
1775
+ if (!/^(slug|credential|endpoint|client)(\.|$)/.test(rest)) {
1776
+ return rest === path ? d : { ...d, path: rest };
1777
+ }
1778
+ return { ...d, path: `config.${rest}` };
1779
+ }));
1780
+ };
1781
+ const display = ct.file.displayName?.en ?? ct.id;
1782
+ // a slug given by the caller is theirs (409 when taken); otherwise the create picks the first
1783
+ // free default under the org lock, after its outbound calls (no retry repeats them)
1784
+ const defaulted = input.config.slug === undefined;
1785
+ let ci;
1786
+ try {
1787
+ ci = this.planConnector(actor, { itemId: row.catalog_item_id, version: row.version ?? row.latest_version, name: row.name }, ct, {
1788
+ connectors: {
1789
+ [ct.id]: { ...input.config, ...(input.name !== undefined && { name: input.name }) },
1790
+ },
1791
+ }, "", undefined);
1792
+ }
1793
+ catch (e) {
1794
+ throw rebase(e);
1795
+ }
1796
+ ci = {
1797
+ ...ci,
1798
+ template: ci.template && { ...ci.template, mustBeOn: true },
1799
+ ...(defaulted && {
1800
+ slugDefault: { display, ...(input.name !== undefined && { name: input.name }) },
1801
+ }),
1802
+ };
1803
+ try {
1804
+ const r = await this.connectors.create(orgId, actor, ci, opts.actorTokenId);
1805
+ await this.recordOnLiveInstall(orgId, row.catalog_item_id, r.connector.id, ct.id);
1806
+ return r;
1807
+ }
1808
+ catch (e) {
1809
+ throw rebase(e);
1810
+ }
1811
+ }
1812
+ /**
1813
+ * Records a connector made from a plugin's template on the org's live install of that plugin,
1814
+ * when there is one, under the org lock (so an uninstall in between is seen).
1815
+ */
1816
+ async recordOnLiveInstall(orgId, itemId, connectorId, templateId) {
1817
+ await this.orgLock.lock(orgId);
1818
+ const install = await this.db
1819
+ .selectFrom("plugin_installs")
1820
+ .select("id")
1821
+ .where("org_id", "=", orgId)
1822
+ .where("item_id", "=", itemId)
1823
+ .where("status", "=", "installed")
1824
+ .executeTakeFirst();
1825
+ if (!install)
1826
+ return;
1827
+ await this.db
1828
+ .insertInto("plugin_install_components")
1829
+ .values({
1830
+ install_id: install.id,
1831
+ kind: "connector",
1832
+ ref: connectorId,
1833
+ created: true,
1834
+ skill_version: null,
1835
+ template_id: templateId,
1836
+ })
1837
+ .onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
1838
+ .execute();
1839
+ }
1184
1840
  /** The connector kinds an extension provides (the `connector@1` implementations loaded on this replica). */
1185
1841
  connectorKindsOf(plugin) {
1186
- return this.d.host
1842
+ return this.registry
1187
1843
  .list("connector")
1188
1844
  .filter((e) => e.plugin === plugin)
1189
1845
  .map((e) => e.impl?.kind)
1190
1846
  .filter((k) => typeof k === "string");
1191
1847
  }
1192
1848
  /**
1193
- * The connectors, org skills and agent templates (`subagents.templates`) referenced by the
1194
- * current definitions of the org's live agents.
1849
+ * The uninstall preview of an install (see {@link UninstallPreview}); the real uninstall may keep
1850
+ * more (another install using a component, a connector still using an extension). The plugin's
1851
+ * skills and agent templates are platform components (phase 2): the ones on in the org through
1852
+ * the plugin (`follow`) go off with it, so the agents using them (by the platform id or an
1853
+ * unpinned org copy linked to it) are listed, also for the dependency installs it created that
1854
+ * go with it; ledger rows of earlier installs' org copies are not removed and not listed (an
1855
+ * uninstall keeps legacy copies, like the platform update keeps copies of removed components).
1195
1856
  */
1196
- async agentRefs(t, orgId) {
1197
- const rows = await t
1198
- .selectFrom("agents as a")
1199
- .innerJoin("agent_versions as v", (j) => j.onRef("v.agent_id", "=", "a.id").onRef("v.version", "=", "a.current_version"))
1200
- .select("v.definition")
1857
+ async previewUninstall(orgId, installId) {
1858
+ if (!UUID_RE.test(installId))
1859
+ throw installNotFound();
1860
+ const t = this.db;
1861
+ const row = await t
1862
+ .selectFrom("plugin_installs as a")
1863
+ .innerJoin("catalog_items as i", "i.id", "a.item_id")
1864
+ .select(["a.id", "a.item_id", "a.version", "i.name"])
1865
+ .where("a.id", "=", installId)
1201
1866
  .where("a.org_id", "=", orgId)
1202
- .where("a.deleted_at", "is", null)
1867
+ .executeTakeFirst();
1868
+ if (!row)
1869
+ throw installNotFound();
1870
+ const ledger = (id) => t
1871
+ .selectFrom("plugin_install_components")
1872
+ .select(["kind", "ref", "created"])
1873
+ .where("install_id", "=", id)
1874
+ .orderBy("kind")
1875
+ .orderBy("ref")
1203
1876
  .execute();
1204
- const connectors = new Set();
1205
- const skills = new Set();
1206
- const templates = new Set();
1207
- for (const r of rows) {
1208
- const def = r.definition;
1209
- for (const ref of def?.tools ?? []) {
1210
- const n = normalizeToolRef(ref);
1211
- if (n?.kind === "connector" && typeof n.connectorId === "string") {
1212
- connectors.add(n.connectorId);
1877
+ const comps = (await ledger(installId)).filter((c) => c.kind !== "skill" && c.kind !== "agent_template");
1878
+ const agents = await agentDefinitionRefs(t, orgId);
1879
+ const used = new Map();
1880
+ const use = (a, kind, ref) => {
1881
+ const e = used.get(a.id) ?? { id: a.id, name: a.name, uses: [] };
1882
+ if (!e.uses.some((u) => u.kind === kind && u.ref === ref))
1883
+ e.uses.push({ kind, ref });
1884
+ used.set(a.id, e);
1885
+ };
1886
+ const kept = [];
1887
+ /**
1888
+ * The agents using what goes with an install: connectors it created (they stay, kept for the
1889
+ * agents) and the plugin's platform skills and agent templates on in the org through it
1890
+ * (`follow`; by the platform id or an unpinned org copy linked to it). Dependency installs it
1891
+ * created go with it unless their own scope wants them (Task 7: their components count too).
1892
+ */
1893
+ const visit = async (itemId, rows, top, seen) => {
1894
+ for (const c of rows) {
1895
+ if (!c.created) {
1896
+ if (top)
1897
+ kept.push({ kind: c.kind, ref: c.ref, reason: "pre_existing" });
1898
+ continue;
1899
+ }
1900
+ if (c.kind === "plugin") {
1901
+ const dep = await t
1902
+ .selectFrom("plugin_installs")
1903
+ .select("item_id")
1904
+ .where("id", "=", c.ref)
1905
+ .where("org_id", "=", orgId)
1906
+ .executeTakeFirst();
1907
+ if (!dep)
1908
+ continue;
1909
+ if (await wantedByScope(t, orgId, dep.item_id)) {
1910
+ if (top)
1911
+ kept.push({ kind: c.kind, ref: c.ref, reason: "wanted_by_scope" });
1912
+ continue;
1913
+ }
1914
+ if (seen.has(c.ref))
1915
+ continue;
1916
+ seen.add(c.ref);
1917
+ const sub = (await ledger(c.ref)).filter((x) => x.kind !== "skill" && x.kind !== "agent_template");
1918
+ await visit(dep.item_id, sub, false, seen);
1919
+ continue;
1920
+ }
1921
+ if (c.kind !== "connector")
1922
+ continue;
1923
+ const users = agents.filter((a) => a.connectors.has(c.ref));
1924
+ if (users.length === 0)
1925
+ continue;
1926
+ if (top)
1927
+ kept.push({ kind: c.kind, ref: c.ref, reason: "used_by_agents" });
1928
+ for (const a of users)
1929
+ use(a, c.kind, c.ref);
1930
+ }
1931
+ for (const kind of ["skill", "agent_template"]) {
1932
+ const platform = await loadComponents(t, kind, { itemId });
1933
+ const st = await loadScopeState(t, kind, platform);
1934
+ const off = platform.filter((c) => c.scopeMode === "follow" &&
1935
+ componentOn(c, pluginFactsOf(st, c.itemId, orgId), listedIn(st, c.id, orgId), switchOf(st, c.id, orgId)));
1936
+ const refs = await referenceIds(t, orgId, kind, off.map((c) => c.id));
1937
+ for (const a of agents) {
1938
+ for (const ref of kind === "skill" ? a.skills : a.templates) {
1939
+ if (refs.has(ref))
1940
+ use(a, kind, ref);
1941
+ }
1942
+ }
1943
+ }
1944
+ const themes = await loadComponents(t, "theme", { itemId });
1945
+ const tst = await loadScopeState(t, "theme", themes);
1946
+ for (const c of themes) {
1947
+ if (c.scopeMode === "follow" &&
1948
+ componentOn(c, pluginFactsOf(tst, c.itemId, orgId), listedIn(tst, c.id, orgId), switchOf(tst, c.id, orgId))) {
1949
+ lostThemes.set(c.id, new Set([orgId]));
1213
1950
  }
1214
1951
  }
1215
- for (const s of def?.skills?.orgSkills ?? [])
1216
- if (typeof s === "string")
1217
- skills.add(s);
1218
- for (const x of def?.subagents?.templates ?? [])
1219
- if (typeof x === "string")
1220
- templates.add(x);
1221
- }
1222
- return { connectors, skills, templates };
1952
+ };
1953
+ /** The themes that go off in the org with the install (and the dependencies it removes). */
1954
+ const lostThemes = new Map();
1955
+ await visit(row.item_id, comps, true, new Set([installId]));
1956
+ const themes = await themesPreview(t, lostThemes);
1957
+ return {
1958
+ installId,
1959
+ name: row.name,
1960
+ version: row.version,
1961
+ components: comps.map((c) => ({ kind: c.kind, ref: c.ref, created: c.created })),
1962
+ kept,
1963
+ agents: [...used.values()]
1964
+ .map((a) => ({ ...a, uses: a.uses.sort((x, y) => x.ref.localeCompare(y.ref)) }))
1965
+ .sort((x, y) => x.id.localeCompare(y.id)),
1966
+ ...(themes !== undefined && { themes }),
1967
+ };
1223
1968
  }
1224
- }
1969
+ /**
1970
+ * The connectors, skills (selected, pinned, or in an inline sub-agent template) and agent
1971
+ * templates (`subagents.templates`) referenced by the current definitions of the org's live
1972
+ * agents.
1973
+ */
1974
+ async agentRefs(orgId) {
1975
+ const out = { connectors: new Set(), skills: new Set(), templates: new Set() };
1976
+ for (const a of await agentDefinitionRefs(this.db, orgId)) {
1977
+ for (const x of a.connectors)
1978
+ out.connectors.add(x);
1979
+ for (const x of a.skills)
1980
+ out.skills.add(x);
1981
+ for (const x of a.templates)
1982
+ out.templates.add(x);
1983
+ }
1984
+ return out;
1985
+ }
1986
+ };
1987
+ __decorate([
1988
+ Transactional({ propagation: "requires_new" })
1989
+ ], PluginInstaller.prototype, "recordDependency", null);
1990
+ __decorate([
1991
+ Transactional()
1992
+ ], PluginInstaller.prototype, "enableExtension", null);
1993
+ __decorate([
1994
+ Transactional({ propagation: "requires_new" })
1995
+ ], PluginInstaller.prototype, "createInstallRow", null);
1996
+ __decorate([
1997
+ Transactional({ propagation: "requires_new" })
1998
+ ], PluginInstaller.prototype, "markInstalled", null);
1999
+ __decorate([
2000
+ Transactional({ propagation: "requires_new" })
2001
+ ], PluginInstaller.prototype, "markFailed", null);
2002
+ __decorate([
2003
+ Transactional({ propagation: "requires_new" })
2004
+ ], PluginInstaller.prototype, "rollbackOne", null);
2005
+ __decorate([
2006
+ Transactional({ propagation: "mandatory" })
2007
+ ], PluginInstaller.prototype, "removeComponent", null);
2008
+ __decorate([
2009
+ Transactional()
2010
+ ], PluginInstaller.prototype, "writeUninstall", null);
2011
+ __decorate([
2012
+ Transactional({ propagation: "mandatory" })
2013
+ ], PluginInstaller.prototype, "heir", null);
2014
+ __decorate([
2015
+ Transactional({ propagation: "mandatory" })
2016
+ ], PluginInstaller.prototype, "handOver", null);
2017
+ __decorate([
2018
+ Transactional({ propagation: "mandatory" })
2019
+ ], PluginInstaller.prototype, "uninstallIn", null);
2020
+ __decorate([
2021
+ Transactional({ propagation: "mandatory" })
2022
+ ], PluginInstaller.prototype, "decideRemovalIn", null);
2023
+ __decorate([
2024
+ Transactional({ propagation: "mandatory" })
2025
+ ], PluginInstaller.prototype, "undoUpgradeIn", null);
2026
+ __decorate([
2027
+ Transactional({ propagation: "requires_new" })
2028
+ ], PluginInstaller.prototype, "recordConnector", null);
2029
+ __decorate([
2030
+ Transactional()
2031
+ ], PluginInstaller.prototype, "recordOnLiveInstall", null);
2032
+ PluginInstaller = __decorate([
2033
+ Injectable(),
2034
+ __param(0, Inject(KernelDb)),
2035
+ __param(1, Inject(OrgLock)),
2036
+ __param(2, Inject(StorageService)),
2037
+ __param(3, Inject(ExtensionRegistry)),
2038
+ __param(4, Inject(SkillsService)),
2039
+ __param(5, Inject(OrgExtensionConfigs)),
2040
+ __param(6, Inject(KernelConfigService)),
2041
+ __param(7, Inject(ConnectorsService)),
2042
+ __param(8, Inject(KERNEL_LOGGER)),
2043
+ __param(9, Inject(TransactionHost))
2044
+ ], PluginInstaller);
2045
+ export { PluginInstaller };
1225
2046
  /**
1226
2047
  * The skill names of a catalog version, read from each skill's SKILL.md in storage (the names are
1227
2048
  * not in plugin.json). Used by install planning and the upgrade preview.
@@ -1331,3 +2152,36 @@ function orderByRequires(set) {
1331
2152
  }
1332
2153
  return placed;
1333
2154
  }
2155
+ /**
2156
+ * Whether org row `id` (a skill or an agent template of the org) is linked without a pin to a live
2157
+ * platform row the org promoted when sharing it (ruling P3-3): owned by the org and from no plugin
2158
+ * (`catalog_item_id` null). A component of the org's own uploaded plugin is a plugin's, so its
2159
+ * install copies are removed and reverted as any plugin's.
2160
+ */
2161
+ async function promotedOrgRow(db, orgId, kind, id) {
2162
+ const row = kind === "skill"
2163
+ ? await db
2164
+ .selectFrom("skills as s")
2165
+ .innerJoin("platform_skills as p", "p.id", "s.platform_skill_id")
2166
+ .select("s.id")
2167
+ .where("s.id", "=", id)
2168
+ .where("s.org_id", "=", orgId)
2169
+ .where("s.pinned_version", "is", null)
2170
+ .where("p.owner_org_id", "=", orgId)
2171
+ // promoted, not an org plugin's component (which has its plugin, P3-2)
2172
+ .where("p.catalog_item_id", "is", null)
2173
+ .where("p.deleted_at", "is", null)
2174
+ .executeTakeFirst()
2175
+ : await db
2176
+ .selectFrom("agent_templates as a")
2177
+ .innerJoin("platform_agent_templates as p", "p.id", "a.platform_template_id")
2178
+ .select("a.id")
2179
+ .where("a.id", "=", id)
2180
+ .where("a.org_id", "=", orgId)
2181
+ .where("a.pinned_version", "is", null)
2182
+ .where("p.owner_org_id", "=", orgId)
2183
+ .where("p.catalog_item_id", "is", null)
2184
+ .where("p.deleted_at", "is", null)
2185
+ .executeTakeFirst();
2186
+ return row !== undefined;
2187
+ }