@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.2

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 (626) hide show
  1. package/bootstrap.json +10 -6
  2. package/dist/admin/admin.controller.d.ts +17 -17
  3. package/dist/admin/admin.controller.js +43 -26
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/extensions.controller.d.ts +14 -14
  7. package/dist/admin/extensions.controller.js +30 -17
  8. package/dist/admin/setup-lock.d.ts +16 -0
  9. package/dist/admin/setup-lock.js +47 -0
  10. package/dist/admin/setup.controller.d.ts +8 -8
  11. package/dist/admin/setup.controller.js +27 -25
  12. package/dist/admin/setup.service.d.ts +19 -27
  13. package/dist/admin/setup.service.js +61 -61
  14. package/dist/agents/agent-lookup.d.ts +53 -0
  15. package/dist/agents/agent-lookup.js +179 -0
  16. package/dist/agents/agents.controller.d.ts +1 -1
  17. package/dist/agents/agents.controller.js +14 -8
  18. package/dist/agents/agents.module.d.ts +7 -0
  19. package/dist/agents/agents.module.js +41 -0
  20. package/dist/agents/agents.service.d.ts +39 -58
  21. package/dist/agents/agents.service.js +261 -329
  22. package/dist/agents/definition.d.ts +8 -0
  23. package/dist/agents/definition.js +8 -0
  24. package/dist/agents/models.controller.d.ts +1 -1
  25. package/dist/agents/models.controller.js +2 -2
  26. package/dist/agents/templates.controller.d.ts +1 -1
  27. package/dist/agents/templates.controller.js +2 -2
  28. package/dist/agents/templates.d.ts +6 -8
  29. package/dist/agents/templates.js +20 -4
  30. package/dist/app.d.ts +93 -0
  31. package/dist/app.js +150 -0
  32. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  33. package/dist/catalog/admin-catalog.controller.js +27 -13
  34. package/dist/catalog/catalog-content.d.ts +185 -0
  35. package/dist/catalog/catalog-content.js +323 -0
  36. package/dist/catalog/catalog-items.d.ts +186 -0
  37. package/dist/catalog/catalog-items.js +410 -0
  38. package/dist/catalog/catalog.module.d.ts +14 -0
  39. package/dist/catalog/catalog.module.js +71 -0
  40. package/dist/catalog/catalog.service.d.ts +34 -188
  41. package/dist/catalog/catalog.service.js +155 -489
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +30 -13
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +2 -2
  70. package/dist/channels/channels.module.d.ts +40 -0
  71. package/dist/channels/channels.module.js +128 -0
  72. package/dist/channels/connections.controller.d.ts +1 -1
  73. package/dist/channels/connections.controller.js +11 -6
  74. package/dist/channels/connections.service.d.ts +43 -21
  75. package/dist/channels/connections.service.js +236 -131
  76. package/dist/channels/inbound.d.ts +34 -38
  77. package/dist/channels/inbound.js +107 -41
  78. package/dist/channels/job-ids.d.ts +10 -0
  79. package/dist/channels/job-ids.js +10 -0
  80. package/dist/channels/jobs.d.ts +85 -0
  81. package/dist/channels/jobs.js +157 -0
  82. package/dist/channels/outbound.d.ts +60 -82
  83. package/dist/channels/outbound.js +165 -193
  84. package/dist/channels/supervisor.d.ts +88 -46
  85. package/dist/channels/supervisor.js +230 -132
  86. package/dist/channels/threads.d.ts +29 -8
  87. package/dist/channels/threads.js +71 -13
  88. package/dist/channels/webhook.d.ts +20 -14
  89. package/dist/channels/webhook.js +51 -20
  90. package/dist/config/load.d.ts +3 -2
  91. package/dist/config/load.js +3 -2
  92. package/dist/config/nacos-source.js +11 -2
  93. package/dist/config/schema.d.ts +16 -1
  94. package/dist/config/schema.js +54 -7
  95. package/dist/conversations/access.d.ts +29 -0
  96. package/dist/conversations/access.js +86 -0
  97. package/dist/conversations/artifacts.d.ts +10 -10
  98. package/dist/conversations/artifacts.js +35 -9
  99. package/dist/conversations/attachments.controller.d.ts +1 -1
  100. package/dist/conversations/attachments.controller.js +8 -6
  101. package/dist/conversations/attachments.module.d.ts +7 -0
  102. package/dist/conversations/attachments.module.js +25 -0
  103. package/dist/conversations/attachments.service.d.ts +30 -22
  104. package/dist/conversations/attachments.service.js +119 -46
  105. package/dist/conversations/conversations.controller.d.ts +8 -7
  106. package/dist/conversations/conversations.controller.js +59 -29
  107. package/dist/conversations/conversations.module.d.ts +8 -0
  108. package/dist/conversations/conversations.module.js +69 -0
  109. package/dist/conversations/conversations.service.d.ts +40 -38
  110. package/dist/conversations/conversations.service.js +130 -140
  111. package/dist/conversations/event-log.d.ts +28 -18
  112. package/dist/conversations/event-log.js +74 -27
  113. package/dist/conversations/files.d.ts +10 -10
  114. package/dist/conversations/files.js +37 -11
  115. package/dist/conversations/idem-keys.d.ts +5 -0
  116. package/dist/conversations/idem-keys.js +5 -0
  117. package/dist/conversations/job-ids.d.ts +6 -0
  118. package/dist/conversations/job-ids.js +6 -0
  119. package/dist/conversations/outputs-read.d.ts +11 -11
  120. package/dist/conversations/outputs-read.js +31 -7
  121. package/dist/conversations/queue.d.ts +48 -56
  122. package/dist/conversations/queue.js +13 -289
  123. package/dist/conversations/queue.service.d.ts +60 -0
  124. package/dist/conversations/queue.service.js +343 -0
  125. package/dist/conversations/sandbox-status.d.ts +13 -10
  126. package/dist/conversations/sandbox-status.js +36 -8
  127. package/dist/conversations/titles.d.ts +71 -24
  128. package/dist/conversations/titles.js +159 -62
  129. package/dist/ctx/bus.js +9 -3
  130. package/dist/ctx/create-ctx.d.ts +6 -0
  131. package/dist/ctx/create-ctx.js +7 -9
  132. package/dist/ctx/lock.d.ts +7 -3
  133. package/dist/ctx/lock.js +9 -20
  134. package/dist/ctx/queue.js +3 -2
  135. package/dist/ctx/secrets.d.ts +10 -2
  136. package/dist/ctx/secrets.js +7 -3
  137. package/dist/db/kernel-schema.d.ts +2 -2
  138. package/dist/db/pool.d.ts +5 -0
  139. package/dist/db/pool.js +1 -0
  140. package/dist/errors.d.ts +2 -0
  141. package/dist/errors.js +2 -0
  142. package/dist/evals/budget.d.ts +42 -21
  143. package/dist/evals/budget.js +114 -62
  144. package/dist/evals/evals.module.d.ts +31 -0
  145. package/dist/evals/evals.module.js +114 -0
  146. package/dist/evals/jobs.d.ts +20 -0
  147. package/dist/evals/jobs.js +45 -0
  148. package/dist/evals/run-replay.d.ts +56 -8
  149. package/dist/evals/run-replay.js +140 -80
  150. package/dist/evals/runs.controller.d.ts +1 -1
  151. package/dist/evals/runs.controller.js +17 -8
  152. package/dist/evals/runs.service.d.ts +23 -45
  153. package/dist/evals/runs.service.js +245 -234
  154. package/dist/evals/sets.controller.d.ts +1 -1
  155. package/dist/evals/sets.controller.js +17 -8
  156. package/dist/evals/sets.service.d.ts +22 -6
  157. package/dist/evals/sets.service.js +248 -194
  158. package/dist/evals/snapshot.d.ts +2 -2
  159. package/dist/evals/step-replay.d.ts +2 -2
  160. package/dist/evals/step-replay.js +1 -1
  161. package/dist/evals/trajectory.controller.d.ts +1 -1
  162. package/dist/evals/trajectory.controller.js +11 -7
  163. package/dist/evals/trajectory.service.d.ts +5 -4
  164. package/dist/evals/trajectory.service.js +30 -7
  165. package/dist/evals/worker.d.ts +44 -27
  166. package/dist/evals/worker.js +220 -120
  167. package/dist/extensions/admin-ops.d.ts +61 -33
  168. package/dist/extensions/admin-ops.js +248 -154
  169. package/dist/extensions/admin-view.d.ts +38 -27
  170. package/dist/extensions/admin-view.js +126 -55
  171. package/dist/extensions/approvals.d.ts +12 -8
  172. package/dist/extensions/approvals.js +73 -46
  173. package/dist/extensions/blobs.d.ts +27 -10
  174. package/dist/extensions/blobs.js +111 -45
  175. package/dist/extensions/bootstrap.d.ts +96 -42
  176. package/dist/extensions/bootstrap.js +303 -155
  177. package/dist/extensions/cli.d.ts +20 -10
  178. package/dist/extensions/cli.js +41 -96
  179. package/dist/extensions/config-issues.d.ts +7 -0
  180. package/dist/extensions/config-issues.js +31 -0
  181. package/dist/extensions/deployment-config-store.d.ts +49 -0
  182. package/dist/extensions/deployment-config-store.js +133 -0
  183. package/dist/extensions/deployment-config.d.ts +58 -67
  184. package/dist/extensions/deployment-config.js +202 -230
  185. package/dist/extensions/enabled.d.ts +5 -5
  186. package/dist/extensions/extensions.module.d.ts +8 -0
  187. package/dist/extensions/extensions.module.js +77 -0
  188. package/dist/extensions/hooks.d.ts +3 -2
  189. package/dist/extensions/hooks.js +1 -1
  190. package/dist/extensions/host.d.ts +72 -68
  191. package/dist/extensions/host.js +191 -152
  192. package/dist/extensions/installs.d.ts +49 -16
  193. package/dist/extensions/installs.js +128 -32
  194. package/dist/extensions/job-ids.d.ts +6 -0
  195. package/dist/extensions/job-ids.js +6 -0
  196. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  197. package/dist/extensions/lifecycle-topics.js +18 -0
  198. package/dist/extensions/lifecycle.d.ts +35 -47
  199. package/dist/extensions/lifecycle.js +103 -39
  200. package/dist/extensions/locks.d.ts +33 -0
  201. package/dist/extensions/locks.js +86 -0
  202. package/dist/extensions/migrate-lock.d.ts +3 -4
  203. package/dist/extensions/org-config.controller.d.ts +1 -1
  204. package/dist/extensions/org-config.controller.js +8 -5
  205. package/dist/extensions/org-config.d.ts +48 -46
  206. package/dist/extensions/org-config.js +284 -226
  207. package/dist/extensions/registry.d.ts +50 -2
  208. package/dist/extensions/registry.js +89 -4
  209. package/dist/extensions/sources.d.ts +12 -8
  210. package/dist/extensions/sources.js +34 -13
  211. package/dist/files/files.module.d.ts +3 -0
  212. package/dist/files/files.module.js +22 -0
  213. package/dist/files/previewers.controller.d.ts +7 -2
  214. package/dist/files/previewers.controller.js +17 -9
  215. package/dist/files/previewers.d.ts +13 -18
  216. package/dist/files/previewers.js +83 -36
  217. package/dist/http/adapter.d.ts +3 -0
  218. package/dist/http/adapter.js +25 -0
  219. package/dist/http/api.module.d.ts +3 -110
  220. package/dist/http/api.module.js +47 -355
  221. package/dist/http/app.d.ts +11 -15
  222. package/dist/http/app.js +52 -47
  223. package/dist/http/error-filter.module.d.ts +5 -0
  224. package/dist/http/error-filter.module.js +18 -0
  225. package/dist/http/error.filter.js +2 -2
  226. package/dist/identity/accounts.d.ts +82 -29
  227. package/dist/identity/accounts.js +294 -175
  228. package/dist/identity/api-tokens.d.ts +11 -7
  229. package/dist/identity/api-tokens.js +71 -44
  230. package/dist/identity/audit.d.ts +7 -4
  231. package/dist/identity/audit.js +5 -1
  232. package/dist/identity/auth.controller.d.ts +11 -10
  233. package/dist/identity/auth.controller.js +31 -25
  234. package/dist/identity/auth.guard.d.ts +3 -3
  235. package/dist/identity/auth.guard.js +6 -4
  236. package/dist/identity/binding.d.ts +9 -11
  237. package/dist/identity/binding.js +41 -13
  238. package/dist/identity/enterprise-admin.d.ts +18 -12
  239. package/dist/identity/enterprise-admin.js +67 -13
  240. package/dist/identity/external-identity-lock.d.ts +17 -0
  241. package/dist/identity/external-identity-lock.js +39 -0
  242. package/dist/identity/external.d.ts +19 -15
  243. package/dist/identity/external.js +163 -125
  244. package/dist/identity/identity.module.d.ts +6 -0
  245. package/dist/identity/identity.module.js +56 -0
  246. package/dist/identity/me.controller.d.ts +16 -15
  247. package/dist/identity/me.controller.js +37 -31
  248. package/dist/identity/sessions.d.ts +12 -10
  249. package/dist/identity/sessions.js +74 -42
  250. package/dist/identity/settings.d.ts +20 -14
  251. package/dist/identity/settings.js +85 -57
  252. package/dist/identity/sso.controller.d.ts +7 -7
  253. package/dist/identity/sso.controller.js +13 -9
  254. package/dist/identity/sso.d.ts +9 -12
  255. package/dist/identity/sso.js +54 -24
  256. package/dist/inbox/inbox.module.d.ts +3 -0
  257. package/dist/inbox/inbox.module.js +22 -0
  258. package/dist/inbox/inbox.service.d.ts +7 -9
  259. package/dist/inbox/inbox.service.js +32 -11
  260. package/dist/index.d.ts +19 -12
  261. package/dist/index.js +13 -8
  262. package/dist/infra/cache/cache.module.d.ts +3 -0
  263. package/dist/infra/cache/cache.module.js +16 -0
  264. package/dist/infra/cache/cache.service.d.ts +21 -0
  265. package/dist/infra/cache/cache.service.js +80 -0
  266. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  267. package/dist/infra/cache/cacheable.decorator.js +83 -0
  268. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  269. package/dist/infra/cli/kernel-cli.module.js +165 -0
  270. package/dist/infra/close-within.d.ts +15 -0
  271. package/dist/infra/close-within.js +36 -0
  272. package/dist/infra/config/config.module.d.ts +13 -0
  273. package/dist/infra/config/config.module.js +39 -0
  274. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  275. package/dist/infra/config/kernel-config.service.js +126 -0
  276. package/dist/infra/database/after-commit.d.ts +6 -0
  277. package/dist/infra/database/after-commit.js +9 -0
  278. package/dist/infra/database/database.module.d.ts +25 -0
  279. package/dist/infra/database/database.module.js +90 -0
  280. package/dist/infra/database/kernel-db.d.ts +22 -0
  281. package/dist/infra/database/kernel-db.js +65 -0
  282. package/dist/infra/database/transaction-host.d.ts +50 -0
  283. package/dist/infra/database/transaction-host.js +125 -0
  284. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  285. package/dist/infra/database/transactional.decorator.js +27 -0
  286. package/dist/infra/database/xact-lock.d.ts +17 -0
  287. package/dist/infra/database/xact-lock.js +43 -0
  288. package/dist/infra/events/kernel-events.d.ts +96 -0
  289. package/dist/infra/events/kernel-events.js +65 -0
  290. package/dist/infra/health/health.controller.d.ts +26 -0
  291. package/dist/infra/health/health.controller.js +104 -0
  292. package/dist/infra/health/health.module.d.ts +9 -0
  293. package/dist/infra/health/health.module.js +24 -0
  294. package/dist/infra/health/health.options.d.ts +10 -0
  295. package/dist/infra/health/health.options.js +15 -0
  296. package/dist/infra/health/shutdown-state.d.ts +6 -0
  297. package/dist/infra/health/shutdown-state.js +2 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  300. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  301. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  302. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  303. package/dist/infra/lifecycle/process-guards.js +86 -0
  304. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  305. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  306. package/dist/infra/lock/key-template.d.ts +13 -0
  307. package/dist/infra/lock/key-template.js +46 -0
  308. package/dist/infra/lock/lock.module.d.ts +3 -0
  309. package/dist/infra/lock/lock.module.js +16 -0
  310. package/dist/infra/lock/lock.service.d.ts +120 -0
  311. package/dist/infra/lock/lock.service.js +343 -0
  312. package/dist/infra/lock/shared-lease.d.ts +44 -0
  313. package/dist/infra/lock/shared-lease.js +121 -0
  314. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  315. package/dist/infra/lock/with-lock.decorator.js +49 -0
  316. package/dist/infra/logging/logging.module.d.ts +16 -0
  317. package/dist/infra/logging/logging.module.js +34 -0
  318. package/dist/infra/queue/configured-processor.d.ts +18 -0
  319. package/dist/infra/queue/configured-processor.js +23 -0
  320. package/dist/infra/queue/job-failure.d.ts +18 -0
  321. package/dist/infra/queue/job-failure.js +26 -0
  322. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  323. package/dist/infra/queue/queue-shutdown.js +81 -0
  324. package/dist/infra/queue/queue.module.d.ts +16 -0
  325. package/dist/infra/queue/queue.module.js +61 -0
  326. package/dist/infra/queue/redis-connection.d.ts +7 -0
  327. package/dist/infra/queue/redis-connection.js +18 -0
  328. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  329. package/dist/infra/queue/retired-schedulers.js +9 -0
  330. package/dist/infra/queue/run-job.d.ts +16 -0
  331. package/dist/infra/queue/run-job.js +19 -0
  332. package/dist/infra/redis/redis.module.d.ts +24 -0
  333. package/dist/infra/redis/redis.module.js +87 -0
  334. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  335. package/dist/infra/schedule/cron-tick.js +25 -0
  336. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  337. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  338. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  339. package/dist/infra/schedule/locked-interval.js +190 -0
  340. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  341. package/dist/infra/schedule/locked-tick.js +137 -0
  342. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  343. package/dist/infra/schedule/schedule.module.js +27 -0
  344. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  345. package/dist/infra/schedule/scheduled-runs.js +163 -0
  346. package/dist/infra/swagger/swagger.d.ts +16 -0
  347. package/dist/infra/swagger/swagger.js +31 -0
  348. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  349. package/dist/infra/throttler/credential-throttler.js +77 -0
  350. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  351. package/dist/infra/throttler/named-throttlers.js +119 -0
  352. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  353. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  354. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  355. package/dist/infra/throttler/throttler.guard.js +68 -0
  356. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  357. package/dist/infra/throttler/throttler.module.js +53 -0
  358. package/dist/infra/tokens.d.ts +15 -0
  359. package/dist/infra/tokens.js +15 -0
  360. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  361. package/dist/infra/validation/create-zod-dto.js +35 -0
  362. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  363. package/dist/infra/validation/parse-with-zod.js +12 -0
  364. package/dist/infra/validation/validation.module.d.ts +3 -0
  365. package/dist/infra/validation/validation.module.js +16 -0
  366. package/dist/infra/validation/zod-params.d.ts +7 -0
  367. package/dist/infra/validation/zod-params.js +42 -0
  368. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  369. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  370. package/dist/kernel.d.ts +9 -241
  371. package/dist/kernel.js +8 -1305
  372. package/dist/kernel.module.d.ts +17 -0
  373. package/dist/kernel.module.js +136 -0
  374. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  375. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  376. package/dist/lifecycle/tokens.d.ts +3 -0
  377. package/dist/lifecycle/tokens.js +3 -0
  378. package/dist/log-config.d.ts +9 -0
  379. package/dist/log-config.js +27 -0
  380. package/dist/log-context.d.ts +34 -0
  381. package/dist/log-context.js +44 -0
  382. package/dist/log-loki.d.ts +34 -0
  383. package/dist/log-loki.js +145 -0
  384. package/dist/log.d.ts +41 -10
  385. package/dist/log.js +91 -17
  386. package/dist/models/models.module.d.ts +3 -0
  387. package/dist/models/models.module.js +24 -0
  388. package/dist/models/prices.d.ts +8 -2
  389. package/dist/models/prices.js +65 -37
  390. package/dist/models/purposes.controller.d.ts +1 -1
  391. package/dist/models/purposes.controller.js +5 -6
  392. package/dist/models/purposes.d.ts +35 -13
  393. package/dist/models/purposes.js +101 -51
  394. package/dist/net/public-address.js +3 -2
  395. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  396. package/dist/orgs/directory-sync.controller.js +2 -2
  397. package/dist/orgs/directory-sync.d.ts +61 -31
  398. package/dist/orgs/directory-sync.js +212 -125
  399. package/dist/orgs/invitations.controller.d.ts +8 -8
  400. package/dist/orgs/invitations.controller.js +27 -26
  401. package/dist/orgs/invitations.service.d.ts +12 -9
  402. package/dist/orgs/invitations.service.js +130 -92
  403. package/dist/orgs/job-ids.d.ts +8 -0
  404. package/dist/orgs/job-ids.js +8 -0
  405. package/dist/orgs/members.service.d.ts +19 -12
  406. package/dist/orgs/members.service.js +161 -117
  407. package/dist/orgs/offboarding.d.ts +54 -57
  408. package/dist/orgs/offboarding.js +161 -71
  409. package/dist/orgs/org-lock.d.ts +28 -19
  410. package/dist/orgs/org-lock.js +81 -35
  411. package/dist/orgs/org.guard.d.ts +1 -1
  412. package/dist/orgs/org.guard.js +2 -2
  413. package/dist/orgs/orgs.controller.d.ts +13 -13
  414. package/dist/orgs/orgs.controller.js +29 -17
  415. package/dist/orgs/orgs.module.d.ts +6 -0
  416. package/dist/orgs/orgs.module.js +68 -0
  417. package/dist/orgs/orgs.service.d.ts +30 -19
  418. package/dist/orgs/orgs.service.js +139 -86
  419. package/dist/orgs/settings.controller.d.ts +1 -1
  420. package/dist/orgs/settings.controller.js +8 -6
  421. package/dist/orgs/settings.service.d.ts +14 -8
  422. package/dist/orgs/settings.service.js +75 -46
  423. package/dist/overrides.d.ts +56 -0
  424. package/dist/overrides.js +30 -0
  425. package/dist/roles/gateway-role.d.ts +43 -0
  426. package/dist/roles/gateway-role.js +98 -0
  427. package/dist/roles/gateway.module.d.ts +8 -0
  428. package/dist/roles/gateway.module.js +28 -0
  429. package/dist/roles/worker-role.d.ts +63 -0
  430. package/dist/roles/worker-role.js +144 -0
  431. package/dist/roles/worker.module.d.ts +14 -0
  432. package/dist/roles/worker.module.js +90 -0
  433. package/dist/runtime/abort.js +19 -2
  434. package/dist/runtime/checkpointer.d.ts +8 -3
  435. package/dist/runtime/checkpointer.js +87 -55
  436. package/dist/runtime/conversation-lock.d.ts +20 -11
  437. package/dist/runtime/conversation-lock.js +62 -72
  438. package/dist/runtime/hook-calls.d.ts +3 -3
  439. package/dist/runtime/hook-calls.js +1 -6
  440. package/dist/runtime/job-ids.d.ts +10 -0
  441. package/dist/runtime/job-ids.js +10 -0
  442. package/dist/runtime/langgraph-loop.js +1 -1
  443. package/dist/runtime/loop.d.ts +7 -0
  444. package/dist/runtime/loop.js +14 -0
  445. package/dist/runtime/maintenance-queue.d.ts +10 -0
  446. package/dist/runtime/maintenance-queue.js +10 -0
  447. package/dist/runtime/maintenance.d.ts +45 -74
  448. package/dist/runtime/maintenance.js +139 -136
  449. package/dist/runtime/model-call.d.ts +7 -4
  450. package/dist/runtime/model-call.js +24 -57
  451. package/dist/runtime/providers.d.ts +17 -6
  452. package/dist/runtime/providers.js +66 -25
  453. package/dist/runtime/quota.d.ts +17 -3
  454. package/dist/runtime/quota.js +27 -2
  455. package/dist/runtime/retired-schedulers.d.ts +7 -0
  456. package/dist/runtime/retired-schedulers.js +31 -0
  457. package/dist/runtime/run-control.d.ts +33 -0
  458. package/dist/runtime/run-control.js +77 -0
  459. package/dist/runtime/run-finish.d.ts +26 -17
  460. package/dist/runtime/run-finish.js +98 -51
  461. package/dist/runtime/run-jobs.d.ts +48 -0
  462. package/dist/runtime/run-jobs.js +95 -0
  463. package/dist/runtime/run-processors.d.ts +60 -0
  464. package/dist/runtime/run-processors.js +185 -0
  465. package/dist/runtime/run-queue.d.ts +32 -57
  466. package/dist/runtime/run-queue.js +291 -295
  467. package/dist/runtime/run-steps.d.ts +39 -0
  468. package/dist/runtime/run-steps.js +96 -0
  469. package/dist/runtime/run-worker.d.ts +121 -75
  470. package/dist/runtime/run-worker.js +340 -225
  471. package/dist/runtime/runtime.module.d.ts +10 -0
  472. package/dist/runtime/runtime.module.js +112 -0
  473. package/dist/runtime/step-log.d.ts +40 -0
  474. package/dist/runtime/step-log.js +94 -0
  475. package/dist/runtime/stream.controller.d.ts +5 -8
  476. package/dist/runtime/stream.controller.js +14 -12
  477. package/dist/runtime/stream.d.ts +24 -6
  478. package/dist/runtime/stream.js +78 -7
  479. package/dist/runtime/subagents/child.d.ts +3 -44
  480. package/dist/runtime/subagents/child.js +0 -79
  481. package/dist/runtime/subagents/definition.d.ts +4 -4
  482. package/dist/runtime/subagents/definition.js +2 -2
  483. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  484. package/dist/runtime/subagents/dispatch.js +135 -140
  485. package/dist/runtime/subagents/limits.d.ts +9 -4
  486. package/dist/runtime/subagents/limits.js +4 -2
  487. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  488. package/dist/runtime/subagents/org-agents.js +1 -1
  489. package/dist/runtime/subagents/progress.d.ts +2 -2
  490. package/dist/runtime/subagents/roster.d.ts +3 -3
  491. package/dist/runtime/subagents/roster.js +1 -1
  492. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  493. package/dist/runtime/subagents/skill-fork.js +16 -5
  494. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  495. package/dist/runtime/subagents/subagents.service.js +101 -0
  496. package/dist/runtime/usage-report.d.ts +94 -52
  497. package/dist/runtime/usage-report.js +200 -99
  498. package/dist/runtime/waits.d.ts +125 -57
  499. package/dist/runtime/waits.js +431 -208
  500. package/dist/sandbox/job-ids.d.ts +10 -0
  501. package/dist/sandbox/job-ids.js +10 -0
  502. package/dist/sandbox/jobs.d.ts +41 -0
  503. package/dist/sandbox/jobs.js +113 -0
  504. package/dist/sandbox/leases.d.ts +39 -31
  505. package/dist/sandbox/leases.js +117 -257
  506. package/dist/sandbox/providers.d.ts +19 -0
  507. package/dist/sandbox/providers.js +38 -0
  508. package/dist/sandbox/sandbox.module.d.ts +8 -0
  509. package/dist/sandbox/sandbox.module.js +30 -0
  510. package/dist/sandbox/sandbox.service.d.ts +24 -29
  511. package/dist/sandbox/sandbox.service.js +106 -75
  512. package/dist/skills/catalog.d.ts +33 -20
  513. package/dist/skills/catalog.js +96 -53
  514. package/dist/skills/changes.controller.d.ts +4 -4
  515. package/dist/skills/changes.controller.js +15 -9
  516. package/dist/skills/changes.service.d.ts +28 -18
  517. package/dist/skills/changes.service.js +421 -364
  518. package/dist/skills/invocable.controller.d.ts +1 -1
  519. package/dist/skills/invocable.controller.js +8 -5
  520. package/dist/skills/invoke.d.ts +16 -15
  521. package/dist/skills/invoke.js +48 -17
  522. package/dist/skills/skills.controller.d.ts +1 -1
  523. package/dist/skills/skills.controller.js +11 -6
  524. package/dist/skills/skills.module.d.ts +6 -0
  525. package/dist/skills/skills.module.js +30 -0
  526. package/dist/skills/skills.service.d.ts +47 -30
  527. package/dist/skills/skills.service.js +221 -158
  528. package/dist/storage/job-ids.d.ts +6 -0
  529. package/dist/storage/job-ids.js +6 -0
  530. package/dist/storage/purge.d.ts +22 -7
  531. package/dist/storage/purge.js +55 -3
  532. package/dist/storage/storage.module.d.ts +6 -0
  533. package/dist/storage/storage.module.js +23 -0
  534. package/dist/storage/storage.service.d.ts +18 -4
  535. package/dist/storage/storage.service.js +44 -3
  536. package/dist/tools/approvals.controller.d.ts +1 -1
  537. package/dist/tools/approvals.controller.js +12 -8
  538. package/dist/tools/approvals.service.d.ts +27 -25
  539. package/dist/tools/approvals.service.js +324 -258
  540. package/dist/tools/breaker.d.ts +2 -2
  541. package/dist/tools/breaker.js +21 -3
  542. package/dist/tools/builtins/ask-user.d.ts +2 -2
  543. package/dist/tools/builtins/ask-user.js +1 -1
  544. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  545. package/dist/tools/builtins/builtin-tools.js +80 -0
  546. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  547. package/dist/tools/builtins/read-tool-output.js +1 -1
  548. package/dist/tools/builtins/sandbox/bash.js +2 -2
  549. package/dist/tools/builtins/sandbox/common.d.ts +7 -4
  550. package/dist/tools/builtins/sandbox/common.js +5 -3
  551. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  552. package/dist/tools/builtins/sandbox/edit.js +1 -1
  553. package/dist/tools/builtins/sandbox/glob.js +2 -2
  554. package/dist/tools/builtins/sandbox/grep.js +2 -2
  555. package/dist/tools/builtins/sandbox/read.js +1 -1
  556. package/dist/tools/builtins/sandbox/write.js +1 -1
  557. package/dist/tools/builtins/skill-load.d.ts +3 -3
  558. package/dist/tools/builtins/skill-load.js +1 -1
  559. package/dist/tools/canonical-json.d.ts +6 -0
  560. package/dist/tools/canonical-json.js +16 -0
  561. package/dist/tools/connector-content.controller.d.ts +1 -1
  562. package/dist/tools/connector-content.controller.js +11 -6
  563. package/dist/tools/connector-content.d.ts +12 -15
  564. package/dist/tools/connector-content.js +53 -18
  565. package/dist/tools/connectors.controller.d.ts +1 -1
  566. package/dist/tools/connectors.controller.js +21 -10
  567. package/dist/tools/connectors.service.d.ts +31 -13
  568. package/dist/tools/connectors.service.js +434 -344
  569. package/dist/tools/credentials.d.ts +17 -20
  570. package/dist/tools/credentials.js +55 -34
  571. package/dist/tools/drift.d.ts +29 -41
  572. package/dist/tools/drift.js +111 -79
  573. package/dist/tools/info.d.ts +12 -9
  574. package/dist/tools/info.js +33 -7
  575. package/dist/tools/job-ids.d.ts +13 -0
  576. package/dist/tools/job-ids.js +15 -0
  577. package/dist/tools/jobs.d.ts +24 -0
  578. package/dist/tools/jobs.js +69 -0
  579. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  580. package/dist/tools/oauth/flow-paths.js +38 -0
  581. package/dist/tools/oauth/flow.d.ts +30 -30
  582. package/dist/tools/oauth/flow.js +109 -81
  583. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  584. package/dist/tools/oauth/oauth.controller.js +12 -9
  585. package/dist/tools/oauth/tokens.d.ts +11 -3
  586. package/dist/tools/oauth/tokens.js +15 -14
  587. package/dist/tools/outputs.d.ts +13 -4
  588. package/dist/tools/outputs.js +47 -3
  589. package/dist/tools/pipeline.d.ts +62 -46
  590. package/dist/tools/pipeline.js +145 -64
  591. package/dist/tools/policy.d.ts +2 -2
  592. package/dist/tools/questions.controller.d.ts +1 -1
  593. package/dist/tools/questions.controller.js +8 -5
  594. package/dist/tools/questions.service.d.ts +25 -24
  595. package/dist/tools/questions.service.js +201 -142
  596. package/dist/tools/registry.d.ts +30 -20
  597. package/dist/tools/registry.js +73 -37
  598. package/dist/tools/specs.d.ts +5 -4
  599. package/dist/tools/specs.js +3 -1
  600. package/dist/tools/tools.module.d.ts +10 -0
  601. package/dist/tools/tools.module.js +91 -0
  602. package/dist/ui/call-extension.d.ts +16 -0
  603. package/dist/ui/call-extension.js +38 -0
  604. package/dist/ui/embed-token.d.ts +9 -5
  605. package/dist/ui/embed-token.js +34 -6
  606. package/dist/ui/ui-stream.d.ts +22 -17
  607. package/dist/ui/ui-stream.js +72 -12
  608. package/dist/ui/ui.module.d.ts +7 -0
  609. package/dist/ui/ui.module.js +28 -0
  610. package/dist/ui/views.controller.d.ts +14 -12
  611. package/dist/ui/views.controller.js +32 -25
  612. package/dist/ui/views.d.ts +9 -57
  613. package/dist/ui/views.js +43 -45
  614. package/package.json +11 -2
  615. package/dist/http/health.controller.d.ts +0 -26
  616. package/dist/http/health.controller.js +0 -79
  617. package/dist/http/tokens.d.ts +0 -131
  618. package/dist/http/tokens.js +0 -131
  619. package/dist/http/zod.pipe.d.ts +0 -8
  620. package/dist/http/zod.pipe.js +0 -14
  621. package/dist/identity/rate-limit.d.ts +0 -55
  622. package/dist/identity/rate-limit.js +0 -121
  623. package/dist/sandbox/lifecycle.d.ts +0 -21
  624. package/dist/sandbox/lifecycle.js +0 -68
  625. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  626. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,16 +1,34 @@
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
+ };
1
10
  import { createHash, randomUUID } from "node:crypto";
11
+ import { Inject, Injectable } from "@nestjs/common";
2
12
  import { sql } from "kysely";
3
13
  import { putTemplateVersionIn } from "../agents/templates.js";
4
14
  import { ApiError } from "../errors.js";
5
15
  import { isExtensionEnabled } from "../extensions/enabled.js";
16
+ import { OrgExtensionConfigs } from "../extensions/org-config.js";
17
+ import { ExtensionRegistry } from "../extensions/registry.js";
6
18
  import { audit } from "../identity/audit.js";
7
- import { lockOrg } from "../orgs/org-lock.js";
19
+ import { KernelDb } from "../infra/database/kernel-db.js";
20
+ import { TransactionHost } from "../infra/database/transaction-host.js";
21
+ import { Transactional } from "../infra/database/transactional.decorator.js";
22
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
23
+ import { OrgLock } from "../orgs/org-lock.js";
8
24
  import { packagePath } from "../packages/tgz.js";
9
- import { skillConflictError } from "../skills/skills.service.js";
25
+ import { SkillsService, skillConflictError } from "../skills/skills.service.js";
26
+ import { StorageService } from "../storage/storage.service.js";
27
+ import { ConnectorsService } from "../tools/connectors.service.js";
10
28
  import { canonicalJson } from "../tools/registry.js";
11
- import { getPath, lockOrgForActions, orgTemplateView, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, setPath, skillOf, templatePluginProblem, } from "./org-catalog.service.js";
12
- import { catalogSkillNames, InstallFailure, journalEntries, missingTemplateInput, planActions, planSkillConflicts, resolveDependencies, under, } from "./plugin-install.js";
13
- import { assertItemInstallable } from "./requests.service.js";
29
+ import { getPath, lockOrgForActions, orgTemplateView, readCatalogAgentTemplates, readCatalogFiles, readCatalogTemplates, requiredActions, setPath, skillOf, templatePluginProblem, } from "./catalog-content.js";
30
+ import { catalogSkillNames, InstallFailure, journalEntries, missingTemplateInput, PluginInstaller, planActions, planSkillConflicts, resolveDependencies, under, } from "./plugin-install.js";
31
+ import { assertItemInstallable, CatalogRequestsService } from "./requests.service.js";
14
32
  import { deployedExtension, deploymentTarget } from "./upgrade-targets.js";
15
33
  import { satisfiesRange } from "./versions.js";
16
34
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -78,18 +96,46 @@ function dirDigest(row, dir) {
78
96
  * Approval follows the item's policy (the org catalog service creates the request). No in-process
79
97
  * state.
80
98
  */
81
- export class PluginUpgrader {
99
+ let PluginUpgrader = class PluginUpgrader {
82
100
  installer;
83
- d;
84
- constructor(installer) {
101
+ kdb;
102
+ orgLock;
103
+ storage;
104
+ registry;
105
+ skills;
106
+ orgConfigs;
107
+ requests;
108
+ connectors;
109
+ log;
110
+ txHost;
111
+ constructor(
112
+ /** Planning, installs, the ledger and the uninstall rules are the installer's. */
113
+ installer, kdb,
114
+ /** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
115
+ orgLock, storage, registry, skills, orgConfigs, requests,
116
+ /** Org connectors: installs create, upgrade and remove them. */
117
+ connectors, log, txHost) {
85
118
  this.installer = installer;
86
- this.d = installer.deps;
119
+ this.kdb = kdb;
120
+ this.orgLock = orgLock;
121
+ this.storage = storage;
122
+ this.registry = registry;
123
+ this.skills = skills;
124
+ this.orgConfigs = orgConfigs;
125
+ this.requests = requests;
126
+ this.connectors = connectors;
127
+ this.log = log;
128
+ this.txHost = txHost;
129
+ }
130
+ /** The kernel-schema handle of the current context (the transaction, else the pool). */
131
+ get db() {
132
+ return this.kdb.db;
87
133
  }
88
134
  /** The upgrade preview (see the class comment). */
89
135
  async preview(orgId, actor, installId, version) {
90
136
  await this.recoverInterrupted(orgId, actor, installId);
91
137
  const diff = await this.diff(orgId, actor, installId, version, null);
92
- await this.d.db.transaction().execute((t) => lockOrgForActions(t, orgId, actor, diff.actions));
138
+ await this.authorizeActions(orgId, actor, diff.actions);
93
139
  return {
94
140
  from: diff.from.version,
95
141
  to: diff.to.version,
@@ -102,6 +148,10 @@ export class PluginUpgrader {
102
148
  : []),
103
149
  };
104
150
  }
151
+ /** Re-checks the actor's org actions under the org row lock (a transaction of its own). */
152
+ async authorizeActions(orgId, actor, actions) {
153
+ await lockOrgForActions(this.orgLock, orgId, actor, actions);
154
+ }
105
155
  /**
106
156
  * The checks of {@link upgrade} before an approval request (the org catalog service creates one
107
157
  * for a needs_approval item without a grant): the diff with the input, the `diffHash`. Returns
@@ -136,41 +186,16 @@ export class PluginUpgrader {
136
186
  const { itemId } = diff;
137
187
  const upgradeId = randomUUID();
138
188
  // Start: the install `upgrading`, under the org lock (one upgrade or uninstall at a time)
139
- await this.d.db.transaction().execute(async (t) => {
140
- await lockOrgForActions(t, orgId, actor, diff.actions);
141
- const row = await t
142
- .selectFrom("plugin_installs")
143
- .select(["status", "version"])
144
- .where("id", "=", installId)
145
- .where("org_id", "=", orgId)
146
- .forUpdate()
147
- .executeTakeFirst();
148
- if (!row || row.status === "failed")
149
- throw installNotFound();
150
- if (row.status !== "installed")
151
- throw inProgress();
152
- if (row.version !== diff.from.version ||
153
- ledgerHash(await ledgerOf(t, installId)) !== diff.ledgerHash) {
154
- throw stale();
155
- }
156
- await assertItemInstallable(t, orgId, itemId);
157
- await t
158
- .updateTable("plugin_installs")
159
- .set({
160
- status: "upgrading",
161
- upgrade: sql `jsonb_build_object('id', ${upgradeId}::text, 'from', ${diff.from.version}::text, 'to', ${diff.to.version}::text, 'startedAt', now(), 'done', '[]'::jsonb)`,
162
- })
163
- .where("id", "=", installId)
164
- .execute();
165
- });
189
+ await this.start(orgId, actor, installId, diff, upgradeId);
166
190
  const done = [];
167
191
  /** The step whose journal write found the journal gone (cleaned up as interrupted meanwhile). */
168
192
  let unjournaled;
169
- // Appends a step to the journal (the journal gone: the upgrade was cleaned up as interrupted)
170
- const journal = async (s, t) => {
193
+ // Appends a step to the journal in the transaction of the context (the journal gone: the
194
+ // upgrade was cleaned up as interrupted)
195
+ const journal = async (s) => {
171
196
  done.push(s);
172
197
  unjournaled = s;
173
- const r = await t
198
+ const r = await this.db
174
199
  .updateTable("plugin_installs")
175
200
  .set({
176
201
  upgrade: sql `jsonb_set(upgrade, '{done}', (upgrade->'done') || ${JSON.stringify([s])}::jsonb)`,
@@ -182,32 +207,14 @@ export class PluginUpgrader {
182
207
  throw cleanedUp();
183
208
  unjournaled = undefined;
184
209
  };
185
- // Records a component in the ledger and the journal, in the given transaction
186
- const record = async (c, t) => {
187
- const inserted = await t
188
- .insertInto("plugin_install_components")
189
- .values({
190
- install_id: installId,
191
- kind: c.kind,
192
- ref: c.ref,
193
- created: c.created,
194
- skill_version: c.skillVersion,
195
- template_id: c.templateId ?? null,
196
- })
197
- .onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
198
- .returning("ref")
199
- .executeTakeFirst();
200
- if (c.created)
201
- await journal({ op: "created", kind: c.kind, ref: c.ref }, t);
202
- else if (inserted)
203
- await journal({ op: "recorded", kind: c.kind, ref: c.ref }, t);
204
- };
210
+ // Records a component in the ledger and the journal, in the transaction of the context
211
+ const record = (c) => this.recordIn(installId, journal, c);
205
212
  let step = "dependencies";
206
213
  const disabled = [];
207
214
  try {
208
215
  for (const dep of diff.dependencies.filter((x) => x.change === "added")) {
209
216
  const resolved = dep.resolved;
210
- const rec = (c, t) => record(c, t);
217
+ const rec = (c) => record(c);
211
218
  if ((await this.installer.recordDependency(orgId, resolved, rec)) !== undefined)
212
219
  continue;
213
220
  if (!dep.plan) {
@@ -236,22 +243,17 @@ export class PluginUpgrader {
236
243
  }
237
244
  step = "extension";
238
245
  if (diff.extension?.change === "added") {
239
- const name = diff.extension.name;
240
- await this.d.orgConfigs.put(orgId, name, {
246
+ await this.installer.enableExtension(orgId, diff.extension.name, {
241
247
  enabled: true,
242
248
  ...(input.extensionConfig !== undefined && { config: input.extensionConfig }),
243
- }, actor, opts.actorTokenId, {
244
- viaItem: itemId,
245
- ifDisabled: { skipped: false },
246
- inTransaction: (t, skipped) => record({ kind: "extension", ref: name, created: !skipped, skillVersion: null }, t),
247
- });
249
+ }, actor, opts.actorTokenId, { viaItem: itemId }, record);
248
250
  }
249
251
  step = "skills";
250
252
  for (const s of diff.skills) {
251
253
  if (s.change !== "added" && s.change !== "changed")
252
254
  continue;
253
- const files = await readCatalogFiles(this.d.storage, diff.to.object_prefix, diff.to.files, s.dir);
254
- const r = await this.d.skills.createVersionFromFiles(orgId, actor, { ...skillOf(files), files }, {
255
+ const files = await readCatalogFiles(this.storage, diff.to.object_prefix, diff.to.files, s.dir);
256
+ const r = await this.skills.createVersionFromFiles(orgId, actor, { ...skillOf(files), files }, {
255
257
  catalog: {
256
258
  itemId,
257
259
  version: diff.to.version,
@@ -260,52 +262,24 @@ export class PluginUpgrader {
260
262
  },
261
263
  ...opts,
262
264
  });
263
- await this.d.db.transaction().execute(async (t) => {
264
- if (r.created) {
265
- await record({ kind: "skill", ref: r.skill.id, created: true, skillVersion: null }, t);
266
- return;
267
- }
268
- await journal({ op: "skill_version", ref: r.skill.id, version: r.version }, t);
269
- await record({ kind: "skill", ref: r.skill.id, created: false, skillVersion: r.version }, t);
270
- });
265
+ await this.journalSkill(r, record, journal);
271
266
  }
272
267
  step = "agent_templates";
273
268
  for (const a of diff.agentTemplates) {
274
269
  if (a.change !== "added" && a.change !== "changed")
275
270
  continue;
276
- await this.d.db.transaction().execute(async (t) => {
277
- await lockOrg(t, orgId);
278
- const r = await putTemplateVersionIn(t, {
279
- orgId,
280
- plugin: diff.name,
281
- catalogItemId: itemId,
282
- catalogVersion: diff.to.version,
283
- sourceFormat: diff.to.source_format,
284
- }, a.template);
285
- if (r.created) {
286
- await record({ kind: "agent_template", ref: r.id, created: true, skillVersion: null }, t);
287
- return;
288
- }
289
- if (r.changed)
290
- await journal({ op: "template_version", ref: r.id, version: r.version }, t);
291
- await record({
292
- kind: "agent_template",
293
- ref: r.id,
294
- created: false,
295
- skillVersion: r.changed ? r.version : null,
296
- }, t);
297
- });
271
+ await this.upgradeAgentTemplate(orgId, diff, a.template, record, journal);
298
272
  }
299
273
  step = "connectors";
300
274
  for (const [templateId, ci] of diff.creates) {
301
- const r = await this.d.connectors.create(orgId, actor, ci, opts.actorTokenId);
302
- await this.d.db.transaction().execute((t) => record({
275
+ const r = await this.connectors.create(orgId, actor, ci, opts.actorTokenId);
276
+ await this.recordStep(installId, journal, {
303
277
  kind: "connector",
304
278
  ref: r.connector.id,
305
279
  created: true,
306
280
  skillVersion: null,
307
281
  templateId,
308
- }, t));
282
+ });
309
283
  }
310
284
  const prepared = [];
311
285
  for (const tpl of diff.templates) {
@@ -315,7 +289,7 @@ export class PluginUpgrader {
315
289
  try {
316
290
  prepared.push({
317
291
  connectorId: tpl.connector.id,
318
- p: await this.d.connectors.prepareTemplateUpdate(actor, tpl.connector.connector, update),
292
+ p: await this.connectors.prepareTemplateUpdate(actor, tpl.connector.connector, update),
319
293
  });
320
294
  }
321
295
  catch (e) {
@@ -323,81 +297,15 @@ export class PluginUpgrader {
323
297
  }
324
298
  }
325
299
  // Finish, in one transaction: changed connectors, removals, the version switch
326
- await this.d.db.transaction().execute(async (t) => {
327
- await lockOrgForActions(t, orgId, actor, diff.actions);
328
- const row = await t
329
- .selectFrom("plugin_installs")
330
- .select(["status", sql `upgrade->>'id'`.as("upgradeId")])
331
- .where("id", "=", installId)
332
- .forUpdate()
333
- .executeTakeFirst();
334
- if (row?.status !== "upgrading" || row.upgradeId !== upgradeId)
335
- throw cleanedUp();
336
- await assertItemInstallable(t, orgId, itemId);
337
- for (const c of prepared) {
338
- await this.d.connectors.applyTemplateIn(t, orgId, c.connectorId, actor, c.p, opts.actorTokenId);
339
- }
300
+ await this.finish(orgId, actor, installId, upgradeId, diff, prepared, disabled, opts, () => {
340
301
  step = "finish";
341
- for (const dep of diff.dependencies) {
342
- if (dep.change !== "changed" || !dep.child)
343
- continue;
344
- const live = await t
345
- .selectFrom("plugin_installs")
346
- .select("version")
347
- .where("id", "=", dep.child.installId)
348
- .forShare()
349
- .executeTakeFirst();
350
- if (!live || !satisfiesRange(live.version, dep.range)) {
351
- throw new ApiError("catalog.dependency_unresolved", `Dependency ${dep.name}@${dep.range} cannot be resolved: its install in this organization changed meanwhile; preview the upgrade again`, [{ dependency: dep.name, range: dep.range }]);
352
- }
353
- }
354
- const report = await this.removeIn(t, orgId, actor, diff, disabled);
355
- // An unchanged skill gets no new version, so the target's pinned suggestion goes onto its
356
- // current version (when that version is this plugin's) here, with the version switch.
357
- for (const sk of diff.skills) {
358
- if (sk.change !== "unchanged" || !sk.ledger)
359
- continue;
360
- await t
361
- .updateTable("skill_versions as v")
362
- .set({ suggest_pinned: sk.suggestPinned === true })
363
- .from("skills as s")
364
- .whereRef("s.id", "=", "v.skill_id")
365
- .whereRef("s.current_version", "=", "v.version")
366
- .where("s.id", "=", sk.ledger.ref)
367
- .where("s.org_id", "=", orgId)
368
- .where("v.catalog_item_id", "=", itemId)
369
- .where("v.suggest_pinned", "<>", sk.suggestPinned === true)
370
- .execute();
371
- }
372
- await t
373
- .updateTable("plugin_installs")
374
- .set({ version: diff.to.version, status: "installed", upgrade: null, error: null })
375
- .where("id", "=", installId)
376
- .execute();
377
- await this.d.requests.resolveByInstall(t, orgId, itemId, actor, opts);
378
- await audit(t, {
379
- actorAccountId: actor,
380
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
381
- orgId,
382
- action: "plugin.org_upgraded",
383
- target: installId,
384
- detail: {
385
- itemId,
386
- name: diff.name,
387
- from: diff.from.version,
388
- to: diff.to.version,
389
- components: diff.components,
390
- removed: report.removed,
391
- kept: report.kept,
392
- },
393
- });
394
302
  });
395
303
  }
396
304
  catch (e) {
397
305
  throw await this.failed(orgId, actor, installId, upgradeId, diff, { done, unjournaled }, step, e, opts);
398
306
  }
399
307
  for (const p of disabled)
400
- await this.d.orgConfigs.afterDisable(orgId, p);
308
+ await this.orgConfigs.afterDisable(orgId, p);
401
309
  const [view] = await this.installer.list(orgId, installId);
402
310
  if (!view)
403
311
  throw installNotFound();
@@ -418,55 +326,16 @@ export class PluginUpgrader {
418
326
  const at = failure ? failure.step : step;
419
327
  let rolledBack = failure?.rolledBack ?? true;
420
328
  try {
421
- const removed = await this.d.db.transaction().execute(async (t) => {
422
- await lockOrg(t, orgId);
423
- const row = await t
424
- .selectFrom("plugin_installs")
425
- .select(sql `upgrade->>'id'`.as("upgradeId"))
426
- .where("id", "=", installId)
427
- .forUpdate()
428
- .executeTakeFirst();
429
- const ours = row?.upgradeId === upgradeId;
430
- // Cleaned up meanwhile: only the step whose journal write found the journal gone is ours to
431
- // undo. When that step ran in the same transaction as its journal write (the extension
432
- // enable, the ledger rows), the transaction rolled back with the failed write, so undoing
433
- // it is a no-op (a never-enabled extension, a never-inserted row); undoing is still safe.
434
- const undo = ours ? steps.done : steps.unjournaled ? [steps.unjournaled] : [];
435
- const out = await this.installer.undoUpgradeIn(t, orgId, actor, installId, undo, "plugin_upgrade_rollback");
436
- await t
437
- .updateTable("plugin_installs")
438
- .set({ status: "installed", upgrade: null, error: JSON.stringify({ step: at, code }) })
439
- .where("id", "=", installId)
440
- .where(sql `upgrade->>'id'`, "=", upgradeId)
441
- .execute();
442
- await audit(t, {
443
- actorAccountId: actor,
444
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
445
- orgId,
446
- action: "plugin.org_upgrade_failed",
447
- target: installId,
448
- detail: {
449
- itemId: diff.itemId,
450
- name: diff.name,
451
- from: diff.from.version,
452
- to: diff.to.version,
453
- step: at,
454
- code,
455
- rolledBack: undo,
456
- ...(!ours && { cleanedUpMeanwhile: true }),
457
- },
458
- });
459
- return out;
460
- });
329
+ const removed = await this.undoFailed(orgId, actor, installId, upgradeId, diff, steps, { at, code }, opts);
461
330
  for (const r of removed) {
462
331
  if (r.kind === "extension")
463
- await this.d.orgConfigs.afterDisable(orgId, r.ref);
332
+ await this.orgConfigs.afterDisable(orgId, r.ref);
464
333
  }
465
334
  }
466
335
  catch (u) {
467
336
  // Left `upgrading` with its journal: undone once it is older than catalog.staleInstallMinutes
468
337
  rolledBack = false;
469
- this.d.log?.warn("plugin upgrade rollback failed", {
338
+ this.log.warn("plugin upgrade rollback failed", {
470
339
  orgId,
471
340
  installId,
472
341
  error: u instanceof Error ? u.message : String(u),
@@ -499,66 +368,279 @@ export class PluginUpgrader {
499
368
  async recoverInterrupted(orgId, actor, installId) {
500
369
  if (!UUID_RE.test(installId))
501
370
  throw installNotFound();
502
- const staleMinutes = this.d.staleInstallMinutes();
503
- const removed = await this.d.db.transaction().execute(async (t) => {
504
- const peek = await t
371
+ const removed = await this.undoInterrupted(orgId, actor, installId);
372
+ for (const r of removed) {
373
+ if (r.kind === "extension")
374
+ await this.orgConfigs.afterDisable(orgId, r.ref);
375
+ }
376
+ }
377
+ /** The upgrade's start: the install `upgrading` with an empty journal (a transaction of its own). */
378
+ async start(orgId, actor, installId, diff, upgradeId) {
379
+ const { itemId } = diff;
380
+ const t = this.db;
381
+ await lockOrgForActions(this.orgLock, orgId, actor, diff.actions);
382
+ const row = await t
383
+ .selectFrom("plugin_installs")
384
+ .select(["status", "version"])
385
+ .where("id", "=", installId)
386
+ .where("org_id", "=", orgId)
387
+ .forUpdate()
388
+ .executeTakeFirst();
389
+ if (!row || row.status === "failed")
390
+ throw installNotFound();
391
+ if (row.status !== "installed")
392
+ throw inProgress();
393
+ if (row.version !== diff.from.version ||
394
+ ledgerHash(await ledgerOf(t, installId)) !== diff.ledgerHash) {
395
+ throw stale();
396
+ }
397
+ await assertItemInstallable(t, orgId, itemId);
398
+ await t
399
+ .updateTable("plugin_installs")
400
+ .set({
401
+ status: "upgrading",
402
+ upgrade: sql `jsonb_build_object('id', ${upgradeId}::text, 'from', ${diff.from.version}::text, 'to', ${diff.to.version}::text, 'startedAt', now(), 'done', '[]'::jsonb)`,
403
+ })
404
+ .where("id", "=", installId)
405
+ .execute();
406
+ }
407
+ /** A skill step's ledger and journal rows, in a transaction of their own. */
408
+ async journalSkill(r, record, journal) {
409
+ if (r.created) {
410
+ await record({ kind: "skill", ref: r.skill.id, created: true, skillVersion: null });
411
+ return;
412
+ }
413
+ await journal({ op: "skill_version", ref: r.skill.id, version: r.version });
414
+ await record({ kind: "skill", ref: r.skill.id, created: false, skillVersion: r.version });
415
+ }
416
+ /**
417
+ * An agent template step: the new version (or template) and its ledger and journal rows, under
418
+ * the org row lock, in a transaction of their own.
419
+ */
420
+ async upgradeAgentTemplate(orgId, diff, template, record, journal) {
421
+ const { itemId } = diff;
422
+ const t = this.db;
423
+ await this.orgLock.lock(orgId);
424
+ const r = await putTemplateVersionIn(t, {
425
+ orgId,
426
+ plugin: diff.name,
427
+ catalogItemId: itemId,
428
+ catalogVersion: diff.to.version,
429
+ sourceFormat: diff.to.source_format,
430
+ }, template);
431
+ if (r.created) {
432
+ await record({ kind: "agent_template", ref: r.id, created: true, skillVersion: null });
433
+ return;
434
+ }
435
+ if (r.changed)
436
+ await journal({ op: "template_version", ref: r.id, version: r.version });
437
+ await record({
438
+ kind: "agent_template",
439
+ ref: r.id,
440
+ created: false,
441
+ skillVersion: r.changed ? r.version : null,
442
+ });
443
+ }
444
+ /** One ledger record (and its journal row) in a transaction of its own. */
445
+ async recordStep(installId, journal, c) {
446
+ await this.recordIn(installId, journal, c);
447
+ }
448
+ /** A component's ledger row and its journal step, in the transaction of the context. */
449
+ async recordIn(installId, journal, c) {
450
+ const inserted = await this.db
451
+ .insertInto("plugin_install_components")
452
+ .values({
453
+ install_id: installId,
454
+ kind: c.kind,
455
+ ref: c.ref,
456
+ created: c.created,
457
+ skill_version: c.skillVersion,
458
+ template_id: c.templateId ?? null,
459
+ })
460
+ .onConflict((oc) => oc.columns(["install_id", "kind", "ref"]).doNothing())
461
+ .returning("ref")
462
+ .executeTakeFirst();
463
+ if (c.created)
464
+ await journal({ op: "created", kind: c.kind, ref: c.ref });
465
+ else if (inserted)
466
+ await journal({ op: "recorded", kind: c.kind, ref: c.ref });
467
+ }
468
+ /**
469
+ * The upgrade's last transaction (under the org row lock): the changed connectors, the removals,
470
+ * the pinned suggestions and the version switch, `plugin.org_upgraded`. `onFinish` marks the step
471
+ * once the connectors are applied.
472
+ */
473
+ async finish(orgId, actor, installId, upgradeId, diff, prepared, disabled, opts, onFinish) {
474
+ const { itemId } = diff;
475
+ const t = this.db;
476
+ await lockOrgForActions(this.orgLock, orgId, actor, diff.actions);
477
+ const row = await t
478
+ .selectFrom("plugin_installs")
479
+ .select(["status", sql `upgrade->>'id'`.as("upgradeId")])
480
+ .where("id", "=", installId)
481
+ .forUpdate()
482
+ .executeTakeFirst();
483
+ if (row?.status !== "upgrading" || row.upgradeId !== upgradeId)
484
+ throw cleanedUp();
485
+ await assertItemInstallable(t, orgId, itemId);
486
+ for (const c of prepared) {
487
+ await this.connectors.applyTemplateIn(orgId, c.connectorId, actor, c.p, opts.actorTokenId);
488
+ }
489
+ onFinish();
490
+ for (const dep of diff.dependencies) {
491
+ if (dep.change !== "changed" || !dep.child)
492
+ continue;
493
+ const live = await t
505
494
  .selectFrom("plugin_installs")
506
- .select("status")
507
- .where("id", "=", installId)
508
- .where("org_id", "=", orgId)
495
+ .select("version")
496
+ .where("id", "=", dep.child.installId)
497
+ .forShare()
509
498
  .executeTakeFirst();
510
- if (peek?.status !== "upgrading")
511
- return [];
512
- await lockOrg(t, orgId);
513
- const row = await t
514
- .selectFrom("plugin_installs as a")
515
- .innerJoin("catalog_items as i", "i.id", "a.item_id")
516
- .select([
517
- "a.status",
518
- "a.upgrade",
519
- "a.item_id",
520
- "i.name",
521
- sql `coalesce((a.upgrade->>'startedAt')::timestamptz < now() - make_interval(mins => ${staleMinutes}), false)`.as("stale"),
522
- ])
523
- .where("a.id", "=", installId)
524
- .where("a.org_id", "=", orgId)
525
- .forUpdate("a")
526
- .executeTakeFirst();
527
- if (row?.status !== "upgrading" || !row.stale)
528
- return [];
529
- const steps = journalEntries(row.upgrade);
530
- const out = await this.installer.undoUpgradeIn(t, orgId, actor, installId, steps, "plugin_upgrade_cleanup");
499
+ if (!live || !satisfiesRange(live.version, dep.range)) {
500
+ throw new ApiError("catalog.dependency_unresolved", `Dependency ${dep.name}@${dep.range} cannot be resolved: its install in this organization changed meanwhile; preview the upgrade again`, [{ dependency: dep.name, range: dep.range }]);
501
+ }
502
+ }
503
+ const report = await this.removeIn(orgId, actor, diff, disabled);
504
+ // An unchanged skill gets no new version, so the target's pinned suggestion goes onto its
505
+ // current version (when that version is this plugin's) here, with the version switch.
506
+ for (const sk of diff.skills) {
507
+ if (sk.change !== "unchanged" || !sk.ledger)
508
+ continue;
531
509
  await t
532
- .updateTable("plugin_installs")
533
- .set({
534
- status: "installed",
535
- upgrade: null,
536
- error: JSON.stringify({ step: "interrupted", code: "internal" }),
537
- })
538
- .where("id", "=", installId)
510
+ .updateTable("skill_versions as v")
511
+ .set({ suggest_pinned: sk.suggestPinned === true })
512
+ .from("skills as s")
513
+ .whereRef("s.id", "=", "v.skill_id")
514
+ .whereRef("s.current_version", "=", "v.version")
515
+ .where("s.id", "=", sk.ledger.ref)
516
+ .where("s.org_id", "=", orgId)
517
+ .where("v.catalog_item_id", "=", itemId)
518
+ .where("v.suggest_pinned", "<>", sk.suggestPinned === true)
539
519
  .execute();
540
- const j = row.upgrade;
541
- await audit(t, {
542
- actorAccountId: actor,
543
- orgId,
544
- action: "plugin.org_upgrade_failed",
545
- target: installId,
546
- detail: {
547
- itemId: row.item_id,
548
- name: row.name,
549
- from: j?.from ?? null,
550
- to: j?.to ?? null,
551
- step: "interrupted",
552
- code: "internal",
553
- rolledBack: steps,
554
- },
555
- });
556
- return out;
557
- });
558
- for (const r of removed) {
559
- if (r.kind === "extension")
560
- await this.d.orgConfigs.afterDisable(orgId, r.ref);
561
520
  }
521
+ await t
522
+ .updateTable("plugin_installs")
523
+ .set({ version: diff.to.version, status: "installed", upgrade: null, error: null })
524
+ .where("id", "=", installId)
525
+ .execute();
526
+ await this.requests.resolveByInstall(orgId, itemId, actor, opts);
527
+ await audit(t, {
528
+ actorAccountId: actor,
529
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
530
+ orgId,
531
+ action: "plugin.org_upgraded",
532
+ target: installId,
533
+ detail: {
534
+ itemId,
535
+ name: diff.name,
536
+ from: diff.from.version,
537
+ to: diff.to.version,
538
+ components: diff.components,
539
+ removed: report.removed,
540
+ kept: report.kept,
541
+ },
542
+ });
543
+ }
544
+ /** Undoes a failed upgrade's journal (see {@link failed}) in a transaction of its own. */
545
+ async undoFailed(orgId, actor, installId, upgradeId, diff, steps, f, opts) {
546
+ const { at, code } = f;
547
+ const t = this.db;
548
+ await this.orgLock.lock(orgId);
549
+ const row = await t
550
+ .selectFrom("plugin_installs")
551
+ .select(sql `upgrade->>'id'`.as("upgradeId"))
552
+ .where("id", "=", installId)
553
+ .forUpdate()
554
+ .executeTakeFirst();
555
+ const ours = row?.upgradeId === upgradeId;
556
+ // Cleaned up meanwhile: only the step whose journal write found the journal gone is ours to
557
+ // undo. When that step ran in the same transaction as its journal write (the extension
558
+ // enable, the ledger rows), the transaction rolled back with the failed write, so undoing
559
+ // it is a no-op (a never-enabled extension, a never-inserted row); undoing is still safe.
560
+ const undo = ours ? steps.done : steps.unjournaled ? [steps.unjournaled] : [];
561
+ const out = await this.installer.undoUpgradeIn(orgId, actor, installId, undo, "plugin_upgrade_rollback");
562
+ await t
563
+ .updateTable("plugin_installs")
564
+ .set({ status: "installed", upgrade: null, error: JSON.stringify({ step: at, code }) })
565
+ .where("id", "=", installId)
566
+ .where(sql `upgrade->>'id'`, "=", upgradeId)
567
+ .execute();
568
+ await audit(t, {
569
+ actorAccountId: actor,
570
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
571
+ orgId,
572
+ action: "plugin.org_upgrade_failed",
573
+ target: installId,
574
+ detail: {
575
+ itemId: diff.itemId,
576
+ name: diff.name,
577
+ from: diff.from.version,
578
+ to: diff.to.version,
579
+ step: at,
580
+ code,
581
+ rolledBack: undo,
582
+ ...(!ours && { cleanedUpMeanwhile: true }),
583
+ },
584
+ });
585
+ return out;
586
+ }
587
+ /** Undoes an interrupted upgrade (see {@link recoverInterrupted}) in a transaction of its own. */
588
+ async undoInterrupted(orgId, actor, installId) {
589
+ const staleMinutes = this.installer.staleInstallMinutes();
590
+ const t = this.db;
591
+ const peek = await t
592
+ .selectFrom("plugin_installs")
593
+ .select("status")
594
+ .where("id", "=", installId)
595
+ .where("org_id", "=", orgId)
596
+ .executeTakeFirst();
597
+ if (peek?.status !== "upgrading")
598
+ return [];
599
+ await this.orgLock.lock(orgId);
600
+ const row = await t
601
+ .selectFrom("plugin_installs as a")
602
+ .innerJoin("catalog_items as i", "i.id", "a.item_id")
603
+ .select([
604
+ "a.status",
605
+ "a.upgrade",
606
+ "a.item_id",
607
+ "i.name",
608
+ sql `coalesce((a.upgrade->>'startedAt')::timestamptz < now() - make_interval(mins => ${staleMinutes}), false)`.as("stale"),
609
+ ])
610
+ .where("a.id", "=", installId)
611
+ .where("a.org_id", "=", orgId)
612
+ .forUpdate("a")
613
+ .executeTakeFirst();
614
+ if (row?.status !== "upgrading" || !row.stale)
615
+ return [];
616
+ const steps = journalEntries(row.upgrade);
617
+ const out = await this.installer.undoUpgradeIn(orgId, actor, installId, steps, "plugin_upgrade_cleanup");
618
+ await t
619
+ .updateTable("plugin_installs")
620
+ .set({
621
+ status: "installed",
622
+ upgrade: null,
623
+ error: JSON.stringify({ step: "interrupted", code: "internal" }),
624
+ })
625
+ .where("id", "=", installId)
626
+ .execute();
627
+ const j = row.upgrade;
628
+ await audit(t, {
629
+ actorAccountId: actor,
630
+ orgId,
631
+ action: "plugin.org_upgrade_failed",
632
+ target: installId,
633
+ detail: {
634
+ itemId: row.item_id,
635
+ name: row.name,
636
+ from: j?.from ?? null,
637
+ to: j?.to ?? null,
638
+ step: "interrupted",
639
+ code: "internal",
640
+ rolledBack: steps,
641
+ },
642
+ });
643
+ return out;
562
644
  }
563
645
  /**
564
646
  * The removals of an upgrade, in the final transaction, by the uninstall rules
@@ -569,9 +651,10 @@ export class PluginUpgrader {
569
651
  * install is uninstalled by the same rules (another install using it takes it over). Skills ->
570
652
  * connectors -> extension -> dependencies.
571
653
  */
572
- async removeIn(t, orgId, actor, diff, disabled) {
654
+ async removeIn(orgId, actor, diff, disabled) {
573
655
  const report = { removed: [], kept: [] };
574
656
  const reason = "plugin_upgrade";
657
+ const t = this.db;
575
658
  const keep = (kind, ref, why) => report.kept.push({ kind, ref, reason: why });
576
659
  const row = (kind, ref) => t
577
660
  .updateTable("plugin_install_components")
@@ -592,7 +675,7 @@ export class PluginUpgrader {
592
675
  ? diff.ledger.filter((l) => l.kind === "extension" && l.ref === diff.extension?.name)
593
676
  : []),
594
677
  ];
595
- const agentRefs = await this.installer.agentRefs(t, orgId);
678
+ const agentRefs = await this.installer.agentRefs(orgId);
596
679
  const self = new Set([diff.installId]);
597
680
  for (const l of removed) {
598
681
  if (!l.created) {
@@ -600,7 +683,7 @@ export class PluginUpgrader {
600
683
  keep(l.kind, l.ref, "pre_existing");
601
684
  continue;
602
685
  }
603
- const outcome = await this.installer.decideRemovalIn(t, orgId, actor, { kind: l.kind, ref: l.ref, created: true, skillVersion: null }, self, agentRefs, reason);
686
+ const outcome = await this.installer.decideRemovalIn(orgId, actor, { kind: l.kind, ref: l.ref, created: true, skillVersion: null }, self, agentRefs, reason);
604
687
  if (outcome === "used_by_agents" ||
605
688
  outcome === "used_by_connectors" ||
606
689
  outcome === "used_by_plugins") {
@@ -648,7 +731,7 @@ export class PluginUpgrader {
648
731
  continue;
649
732
  }
650
733
  const sub = { removed: [], kept: [] };
651
- const outcome = await this.installer.uninstallIn(t, orgId, actor, ref, {
734
+ const outcome = await this.installer.uninstallIn(orgId, actor, ref, {
652
735
  report: sub,
653
736
  removing: new Set(),
654
737
  from: diff.installId,
@@ -671,7 +754,7 @@ export class PluginUpgrader {
671
754
  * otherwise the connector inputs are built and checked as at install.
672
755
  */
673
756
  async diff(orgId, actor, installId, version, input) {
674
- const db = this.d.db;
757
+ const db = this.db;
675
758
  if (!UUID_RE.test(installId))
676
759
  throw installNotFound();
677
760
  const install = await db
@@ -725,7 +808,7 @@ export class PluginUpgrader {
725
808
  }
726
809
  // Target rules (Decision 10)
727
810
  if (to.manifest.extension) {
728
- const deployed = await deployedExtension(db, this.d.host, name);
811
+ const deployed = await deployedExtension(db, this.registry, name);
729
812
  const allowed = deploymentTarget(versions, deployed);
730
813
  if (allowed?.version !== to.version) {
731
814
  throw targetInvalid(deployed === undefined
@@ -856,8 +939,8 @@ export class PluginUpgrader {
856
939
  });
857
940
  }
858
941
  // Skills (by name)
859
- const fromNames = await catalogSkillNames(this.d.storage, from, from.manifest);
860
- const toNames = await catalogSkillNames(this.d.storage, to, to.manifest);
942
+ const fromNames = await catalogSkillNames(this.storage, from, from.manifest);
943
+ const toNames = await catalogSkillNames(this.storage, to, to.manifest);
861
944
  const dirOf = (m, i) => packagePath((m.skills ?? [])[i]?.path);
862
945
  const fromSkills = new Map(fromNames.map((n, i) => [n, dirOf(from.manifest, i)]));
863
946
  const toSkills = new Map(toNames.map((n, i) => [n, dirOf(to.manifest, i)]));
@@ -914,8 +997,8 @@ export class PluginUpgrader {
914
997
  if (conflicts.length > 0)
915
998
  throw skillConflictError(conflicts);
916
999
  // Agent templates (by name; phase C)
917
- const fromAgents = await readCatalogAgentTemplates(this.d.storage, from);
918
- const toAgents = await readCatalogAgentTemplates(this.d.storage, to);
1000
+ const fromAgents = await readCatalogAgentTemplates(this.storage, from);
1001
+ const toAgents = await readCatalogAgentTemplates(this.storage, to);
919
1002
  const templateRefs = ledger.filter((l) => l.kind === "agent_template").map((l) => l.ref);
920
1003
  const liveTemplates = templateRefs.length === 0
921
1004
  ? []
@@ -953,8 +1036,8 @@ export class PluginUpgrader {
953
1036
  components.push({ kind: "agent_template", ref: a.name, change: a.change });
954
1037
  }
955
1038
  // Connector templates (by id)
956
- const fromTemplates = await readCatalogTemplates(this.d.storage, from);
957
- const toTemplates = await readCatalogTemplates(this.d.storage, to);
1039
+ const fromTemplates = await readCatalogTemplates(this.storage, from);
1040
+ const toTemplates = await readCatalogTemplates(this.storage, to);
958
1041
  // The install's connectors by template; a dropped one (kept only for the agents using it) counts
959
1042
  // only while its connector is live, so a template the target brings back maps onto it
960
1043
  const connectorRows = ledger.filter((l) => l.kind === "connector" && l.template_id !== null);
@@ -1198,7 +1281,49 @@ export class PluginUpgrader {
1198
1281
  ...(c.credentialsChanged && credential !== undefined && { credential }),
1199
1282
  };
1200
1283
  }
1201
- }
1284
+ };
1285
+ __decorate([
1286
+ Transactional()
1287
+ ], PluginUpgrader.prototype, "authorizeActions", null);
1288
+ __decorate([
1289
+ Transactional({ propagation: "requires_new" })
1290
+ ], PluginUpgrader.prototype, "start", null);
1291
+ __decorate([
1292
+ Transactional({ propagation: "requires_new" })
1293
+ ], PluginUpgrader.prototype, "journalSkill", null);
1294
+ __decorate([
1295
+ Transactional({ propagation: "requires_new" })
1296
+ ], PluginUpgrader.prototype, "upgradeAgentTemplate", null);
1297
+ __decorate([
1298
+ Transactional({ propagation: "requires_new" })
1299
+ ], PluginUpgrader.prototype, "recordStep", null);
1300
+ __decorate([
1301
+ Transactional({ propagation: "requires_new" })
1302
+ ], PluginUpgrader.prototype, "finish", null);
1303
+ __decorate([
1304
+ Transactional({ propagation: "requires_new" })
1305
+ ], PluginUpgrader.prototype, "undoFailed", null);
1306
+ __decorate([
1307
+ Transactional({ propagation: "requires_new" })
1308
+ ], PluginUpgrader.prototype, "undoInterrupted", null);
1309
+ __decorate([
1310
+ Transactional({ propagation: "mandatory" })
1311
+ ], PluginUpgrader.prototype, "removeIn", null);
1312
+ PluginUpgrader = __decorate([
1313
+ Injectable(),
1314
+ __param(0, Inject(PluginInstaller)),
1315
+ __param(1, Inject(KernelDb)),
1316
+ __param(2, Inject(OrgLock)),
1317
+ __param(3, Inject(StorageService)),
1318
+ __param(4, Inject(ExtensionRegistry)),
1319
+ __param(5, Inject(SkillsService)),
1320
+ __param(6, Inject(OrgExtensionConfigs)),
1321
+ __param(7, Inject(CatalogRequestsService)),
1322
+ __param(8, Inject(ConnectorsService)),
1323
+ __param(9, Inject(KERNEL_LOGGER)),
1324
+ __param(10, Inject(TransactionHost))
1325
+ ], PluginUpgrader);
1326
+ export { PluginUpgrader };
1202
1327
  const cleanedUp = () => new ApiError("plugin.install_not_found", "The upgrade was cleaned up as interrupted while it was running");
1203
1328
  /** The install's ledger rows. */
1204
1329
  function ledgerOf(db, installId) {