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

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 (670) hide show
  1. package/dist/admin/admin.controller.d.ts +17 -17
  2. package/dist/admin/admin.controller.js +43 -26
  3. package/dist/admin/admin.module.d.ts +3 -0
  4. package/dist/admin/admin.module.js +22 -0
  5. package/dist/admin/extensions.controller.d.ts +14 -14
  6. package/dist/admin/extensions.controller.js +30 -17
  7. package/dist/admin/setup-lock.d.ts +16 -0
  8. package/dist/admin/setup-lock.js +47 -0
  9. package/dist/admin/setup.controller.d.ts +8 -8
  10. package/dist/admin/setup.controller.js +27 -25
  11. package/dist/admin/setup.service.d.ts +19 -27
  12. package/dist/admin/setup.service.js +61 -61
  13. package/dist/agents/agent-lookup.d.ts +53 -0
  14. package/dist/agents/agent-lookup.js +187 -0
  15. package/dist/agents/agents.controller.d.ts +1 -1
  16. package/dist/agents/agents.controller.js +14 -8
  17. package/dist/agents/agents.module.d.ts +7 -0
  18. package/dist/agents/agents.module.js +41 -0
  19. package/dist/agents/agents.service.d.ts +39 -58
  20. package/dist/agents/agents.service.js +280 -335
  21. package/dist/agents/definition.d.ts +39 -8
  22. package/dist/agents/definition.js +201 -17
  23. package/dist/agents/models.controller.d.ts +1 -1
  24. package/dist/agents/models.controller.js +2 -2
  25. package/dist/agents/templates.controller.d.ts +1 -1
  26. package/dist/agents/templates.controller.js +2 -2
  27. package/dist/agents/templates.d.ts +6 -8
  28. package/dist/agents/templates.js +39 -8
  29. package/dist/app.d.ts +93 -0
  30. package/dist/app.js +150 -0
  31. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  32. package/dist/catalog/admin-catalog.controller.js +27 -13
  33. package/dist/catalog/catalog-content.d.ts +185 -0
  34. package/dist/catalog/catalog-content.js +326 -0
  35. package/dist/catalog/catalog-items.d.ts +186 -0
  36. package/dist/catalog/catalog-items.js +410 -0
  37. package/dist/catalog/catalog.module.d.ts +14 -0
  38. package/dist/catalog/catalog.module.js +71 -0
  39. package/dist/catalog/catalog.service.d.ts +34 -188
  40. package/dist/catalog/catalog.service.js +155 -489
  41. package/dist/catalog/claude/agents.js +13 -10
  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 +31 -14
  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 +10 -4
  70. package/dist/channels/cards.js +16 -8
  71. package/dist/channels/channels.module.d.ts +40 -0
  72. package/dist/channels/channels.module.js +128 -0
  73. package/dist/channels/connections.controller.d.ts +1 -1
  74. package/dist/channels/connections.controller.js +11 -6
  75. package/dist/channels/connections.service.d.ts +43 -21
  76. package/dist/channels/connections.service.js +236 -131
  77. package/dist/channels/inbound.d.ts +34 -38
  78. package/dist/channels/inbound.js +107 -41
  79. package/dist/channels/job-ids.d.ts +10 -0
  80. package/dist/channels/job-ids.js +10 -0
  81. package/dist/channels/jobs.d.ts +85 -0
  82. package/dist/channels/jobs.js +157 -0
  83. package/dist/channels/outbound.d.ts +60 -82
  84. package/dist/channels/outbound.js +165 -194
  85. package/dist/channels/supervisor.d.ts +88 -46
  86. package/dist/channels/supervisor.js +230 -132
  87. package/dist/channels/threads.d.ts +29 -8
  88. package/dist/channels/threads.js +71 -13
  89. package/dist/channels/webhook.d.ts +20 -14
  90. package/dist/channels/webhook.js +51 -20
  91. package/dist/config/load.d.ts +3 -2
  92. package/dist/config/load.js +3 -2
  93. package/dist/config/nacos-source.js +11 -2
  94. package/dist/config/schema.d.ts +1 -0
  95. package/dist/config/schema.js +12 -6
  96. package/dist/conversations/access.d.ts +29 -0
  97. package/dist/conversations/access.js +86 -0
  98. package/dist/conversations/artifacts.d.ts +11 -11
  99. package/dist/conversations/artifacts.js +36 -10
  100. package/dist/conversations/attachments.controller.d.ts +1 -1
  101. package/dist/conversations/attachments.controller.js +8 -6
  102. package/dist/conversations/attachments.module.d.ts +7 -0
  103. package/dist/conversations/attachments.module.js +25 -0
  104. package/dist/conversations/attachments.service.d.ts +30 -22
  105. package/dist/conversations/attachments.service.js +119 -46
  106. package/dist/conversations/conversations.controller.d.ts +8 -7
  107. package/dist/conversations/conversations.controller.js +59 -29
  108. package/dist/conversations/conversations.module.d.ts +8 -0
  109. package/dist/conversations/conversations.module.js +69 -0
  110. package/dist/conversations/conversations.service.d.ts +40 -38
  111. package/dist/conversations/conversations.service.js +130 -140
  112. package/dist/conversations/event-log.d.ts +39 -18
  113. package/dist/conversations/event-log.js +93 -27
  114. package/dist/conversations/events.d.ts +23 -3
  115. package/dist/conversations/events.js +26 -14
  116. package/dist/conversations/files.d.ts +10 -10
  117. package/dist/conversations/files.js +37 -11
  118. package/dist/conversations/idem-keys.d.ts +5 -0
  119. package/dist/conversations/idem-keys.js +5 -0
  120. package/dist/conversations/job-ids.d.ts +6 -0
  121. package/dist/conversations/job-ids.js +6 -0
  122. package/dist/conversations/outputs-read.d.ts +11 -11
  123. package/dist/conversations/outputs-read.js +31 -7
  124. package/dist/conversations/queue.d.ts +48 -56
  125. package/dist/conversations/queue.js +13 -289
  126. package/dist/conversations/queue.service.d.ts +60 -0
  127. package/dist/conversations/queue.service.js +343 -0
  128. package/dist/conversations/sandbox-status.d.ts +13 -10
  129. package/dist/conversations/sandbox-status.js +36 -8
  130. package/dist/conversations/titles.d.ts +71 -24
  131. package/dist/conversations/titles.js +159 -63
  132. package/dist/ctx/bus.js +9 -3
  133. package/dist/ctx/create-ctx.d.ts +6 -0
  134. package/dist/ctx/create-ctx.js +7 -9
  135. package/dist/ctx/lock.d.ts +7 -3
  136. package/dist/ctx/lock.js +9 -20
  137. package/dist/ctx/secrets.d.ts +10 -2
  138. package/dist/ctx/secrets.js +7 -3
  139. package/dist/db/kernel-schema.d.ts +4 -4
  140. package/dist/db/pool.d.ts +5 -0
  141. package/dist/db/pool.js +1 -0
  142. package/dist/errors.d.ts +1 -0
  143. package/dist/errors.js +1 -0
  144. package/dist/evals/budget.d.ts +42 -21
  145. package/dist/evals/budget.js +114 -62
  146. package/dist/evals/evals.module.d.ts +31 -0
  147. package/dist/evals/evals.module.js +114 -0
  148. package/dist/evals/jobs.d.ts +20 -0
  149. package/dist/evals/jobs.js +45 -0
  150. package/dist/evals/recorded-tools.d.ts +27 -1
  151. package/dist/evals/recorded-tools.js +85 -10
  152. package/dist/evals/run-replay.d.ts +61 -8
  153. package/dist/evals/run-replay.js +159 -85
  154. package/dist/evals/runs.controller.d.ts +1 -1
  155. package/dist/evals/runs.controller.js +17 -8
  156. package/dist/evals/runs.service.d.ts +23 -45
  157. package/dist/evals/runs.service.js +245 -234
  158. package/dist/evals/sets.controller.d.ts +1 -1
  159. package/dist/evals/sets.controller.js +17 -8
  160. package/dist/evals/sets.service.d.ts +22 -6
  161. package/dist/evals/sets.service.js +248 -194
  162. package/dist/evals/snapshot.d.ts +2 -2
  163. package/dist/evals/step-replay.d.ts +2 -2
  164. package/dist/evals/step-replay.js +1 -1
  165. package/dist/evals/trajectory.controller.d.ts +1 -1
  166. package/dist/evals/trajectory.controller.js +11 -7
  167. package/dist/evals/trajectory.d.ts +2 -2
  168. package/dist/evals/trajectory.service.d.ts +5 -4
  169. package/dist/evals/trajectory.service.js +30 -7
  170. package/dist/evals/worker.d.ts +44 -27
  171. package/dist/evals/worker.js +220 -121
  172. package/dist/extensions/admin-ops.d.ts +61 -33
  173. package/dist/extensions/admin-ops.js +248 -154
  174. package/dist/extensions/admin-view.d.ts +38 -27
  175. package/dist/extensions/admin-view.js +126 -55
  176. package/dist/extensions/approvals.d.ts +12 -8
  177. package/dist/extensions/approvals.js +73 -46
  178. package/dist/extensions/blobs.d.ts +27 -10
  179. package/dist/extensions/blobs.js +111 -45
  180. package/dist/extensions/bootstrap.d.ts +58 -31
  181. package/dist/extensions/bootstrap.js +175 -121
  182. package/dist/extensions/cli.d.ts +20 -10
  183. package/dist/extensions/cli.js +41 -96
  184. package/dist/extensions/config-issues.d.ts +7 -0
  185. package/dist/extensions/config-issues.js +31 -0
  186. package/dist/extensions/deployment-config-store.d.ts +49 -0
  187. package/dist/extensions/deployment-config-store.js +133 -0
  188. package/dist/extensions/deployment-config.d.ts +58 -67
  189. package/dist/extensions/deployment-config.js +202 -230
  190. package/dist/extensions/enabled.d.ts +5 -5
  191. package/dist/extensions/extensions.module.d.ts +8 -0
  192. package/dist/extensions/extensions.module.js +77 -0
  193. package/dist/extensions/hooks.d.ts +3 -2
  194. package/dist/extensions/hooks.js +1 -1
  195. package/dist/extensions/host.d.ts +72 -68
  196. package/dist/extensions/host.js +191 -152
  197. package/dist/extensions/installs.d.ts +49 -16
  198. package/dist/extensions/installs.js +128 -32
  199. package/dist/extensions/job-ids.d.ts +6 -0
  200. package/dist/extensions/job-ids.js +6 -0
  201. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  202. package/dist/extensions/lifecycle-topics.js +18 -0
  203. package/dist/extensions/lifecycle.d.ts +35 -47
  204. package/dist/extensions/lifecycle.js +103 -39
  205. package/dist/extensions/locks.d.ts +33 -0
  206. package/dist/extensions/locks.js +86 -0
  207. package/dist/extensions/migrate-lock.d.ts +3 -4
  208. package/dist/extensions/org-config.controller.d.ts +1 -1
  209. package/dist/extensions/org-config.controller.js +8 -5
  210. package/dist/extensions/org-config.d.ts +48 -46
  211. package/dist/extensions/org-config.js +284 -226
  212. package/dist/extensions/registry.d.ts +50 -2
  213. package/dist/extensions/registry.js +89 -4
  214. package/dist/extensions/sources.d.ts +12 -8
  215. package/dist/extensions/sources.js +34 -13
  216. package/dist/files/files.module.d.ts +3 -0
  217. package/dist/files/files.module.js +22 -0
  218. package/dist/files/previewers.controller.d.ts +7 -2
  219. package/dist/files/previewers.controller.js +17 -9
  220. package/dist/files/previewers.d.ts +13 -18
  221. package/dist/files/previewers.js +83 -36
  222. package/dist/http/adapter.d.ts +3 -0
  223. package/dist/http/adapter.js +25 -0
  224. package/dist/http/api.module.d.ts +3 -110
  225. package/dist/http/api.module.js +47 -355
  226. package/dist/http/app.d.ts +11 -15
  227. package/dist/http/app.js +17 -62
  228. package/dist/http/error-filter.module.d.ts +5 -0
  229. package/dist/http/error-filter.module.js +18 -0
  230. package/dist/http/error.filter.js +2 -2
  231. package/dist/identity/accounts.d.ts +82 -29
  232. package/dist/identity/accounts.js +294 -175
  233. package/dist/identity/api-tokens.d.ts +11 -7
  234. package/dist/identity/api-tokens.js +71 -44
  235. package/dist/identity/audit.d.ts +7 -4
  236. package/dist/identity/audit.js +5 -1
  237. package/dist/identity/auth.controller.d.ts +11 -10
  238. package/dist/identity/auth.controller.js +31 -25
  239. package/dist/identity/auth.guard.d.ts +3 -3
  240. package/dist/identity/auth.guard.js +6 -4
  241. package/dist/identity/binding.d.ts +9 -11
  242. package/dist/identity/binding.js +41 -13
  243. package/dist/identity/enterprise-admin.d.ts +18 -12
  244. package/dist/identity/enterprise-admin.js +67 -13
  245. package/dist/identity/external-identity-lock.d.ts +17 -0
  246. package/dist/identity/external-identity-lock.js +39 -0
  247. package/dist/identity/external.d.ts +19 -15
  248. package/dist/identity/external.js +163 -125
  249. package/dist/identity/identity.module.d.ts +6 -0
  250. package/dist/identity/identity.module.js +56 -0
  251. package/dist/identity/me.controller.d.ts +16 -15
  252. package/dist/identity/me.controller.js +37 -31
  253. package/dist/identity/sessions.d.ts +12 -10
  254. package/dist/identity/sessions.js +74 -42
  255. package/dist/identity/settings.d.ts +20 -14
  256. package/dist/identity/settings.js +86 -58
  257. package/dist/identity/sso.controller.d.ts +7 -7
  258. package/dist/identity/sso.controller.js +13 -9
  259. package/dist/identity/sso.d.ts +9 -12
  260. package/dist/identity/sso.js +54 -24
  261. package/dist/inbox/inbox.module.d.ts +3 -0
  262. package/dist/inbox/inbox.module.js +22 -0
  263. package/dist/inbox/inbox.service.d.ts +7 -9
  264. package/dist/inbox/inbox.service.js +32 -11
  265. package/dist/index.d.ts +16 -11
  266. package/dist/index.js +9 -6
  267. package/dist/infra/cache/cache.module.d.ts +3 -0
  268. package/dist/infra/cache/cache.module.js +16 -0
  269. package/dist/infra/cache/cache.service.d.ts +21 -0
  270. package/dist/infra/cache/cache.service.js +80 -0
  271. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  272. package/dist/infra/cache/cacheable.decorator.js +83 -0
  273. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  274. package/dist/infra/cli/kernel-cli.module.js +165 -0
  275. package/dist/infra/close-within.d.ts +15 -0
  276. package/dist/infra/close-within.js +36 -0
  277. package/dist/infra/config/config.module.d.ts +13 -0
  278. package/dist/infra/config/config.module.js +39 -0
  279. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  280. package/dist/infra/config/kernel-config.service.js +126 -0
  281. package/dist/infra/database/after-commit.d.ts +6 -0
  282. package/dist/infra/database/after-commit.js +9 -0
  283. package/dist/infra/database/database.module.d.ts +25 -0
  284. package/dist/infra/database/database.module.js +90 -0
  285. package/dist/infra/database/kernel-db.d.ts +22 -0
  286. package/dist/infra/database/kernel-db.js +65 -0
  287. package/dist/infra/database/transaction-host.d.ts +50 -0
  288. package/dist/infra/database/transaction-host.js +125 -0
  289. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  290. package/dist/infra/database/transactional.decorator.js +27 -0
  291. package/dist/infra/database/xact-lock.d.ts +17 -0
  292. package/dist/infra/database/xact-lock.js +43 -0
  293. package/dist/infra/events/kernel-events.d.ts +96 -0
  294. package/dist/infra/events/kernel-events.js +65 -0
  295. package/dist/infra/health/health.controller.d.ts +26 -0
  296. package/dist/infra/health/health.controller.js +104 -0
  297. package/dist/infra/health/health.module.d.ts +9 -0
  298. package/dist/infra/health/health.module.js +24 -0
  299. package/dist/infra/health/health.options.d.ts +10 -0
  300. package/dist/infra/health/health.options.js +15 -0
  301. package/dist/infra/health/shutdown-state.d.ts +6 -0
  302. package/dist/infra/health/shutdown-state.js +2 -0
  303. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  304. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  305. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  306. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  307. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  308. package/dist/infra/lifecycle/process-guards.js +86 -0
  309. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  310. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  311. package/dist/infra/lock/key-template.d.ts +13 -0
  312. package/dist/infra/lock/key-template.js +46 -0
  313. package/dist/infra/lock/lock.module.d.ts +3 -0
  314. package/dist/infra/lock/lock.module.js +16 -0
  315. package/dist/infra/lock/lock.service.d.ts +120 -0
  316. package/dist/infra/lock/lock.service.js +343 -0
  317. package/dist/infra/lock/shared-lease.d.ts +44 -0
  318. package/dist/infra/lock/shared-lease.js +121 -0
  319. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  320. package/dist/infra/lock/with-lock.decorator.js +49 -0
  321. package/dist/infra/logging/logging.module.d.ts +16 -0
  322. package/dist/infra/logging/logging.module.js +34 -0
  323. package/dist/infra/queue/configured-processor.d.ts +18 -0
  324. package/dist/infra/queue/configured-processor.js +23 -0
  325. package/dist/infra/queue/job-failure.d.ts +18 -0
  326. package/dist/infra/queue/job-failure.js +26 -0
  327. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  328. package/dist/infra/queue/queue-shutdown.js +81 -0
  329. package/dist/infra/queue/queue.module.d.ts +16 -0
  330. package/dist/infra/queue/queue.module.js +61 -0
  331. package/dist/infra/queue/redis-connection.d.ts +7 -0
  332. package/dist/infra/queue/redis-connection.js +18 -0
  333. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  334. package/dist/infra/queue/retired-schedulers.js +9 -0
  335. package/dist/infra/queue/run-job.d.ts +16 -0
  336. package/dist/infra/queue/run-job.js +19 -0
  337. package/dist/infra/redis/redis.module.d.ts +24 -0
  338. package/dist/infra/redis/redis.module.js +87 -0
  339. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  340. package/dist/infra/schedule/cron-tick.js +25 -0
  341. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  342. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  343. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  344. package/dist/infra/schedule/locked-interval.js +190 -0
  345. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  346. package/dist/infra/schedule/locked-tick.js +137 -0
  347. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  348. package/dist/infra/schedule/schedule.module.js +27 -0
  349. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  350. package/dist/infra/schedule/scheduled-runs.js +163 -0
  351. package/dist/infra/swagger/swagger.d.ts +16 -0
  352. package/dist/infra/swagger/swagger.js +31 -0
  353. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  354. package/dist/infra/throttler/credential-throttler.js +77 -0
  355. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  356. package/dist/infra/throttler/named-throttlers.js +119 -0
  357. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  358. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  359. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  360. package/dist/infra/throttler/throttler.guard.js +68 -0
  361. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  362. package/dist/infra/throttler/throttler.module.js +53 -0
  363. package/dist/infra/tokens.d.ts +15 -0
  364. package/dist/infra/tokens.js +15 -0
  365. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  366. package/dist/infra/validation/create-zod-dto.js +35 -0
  367. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  368. package/dist/infra/validation/parse-with-zod.js +12 -0
  369. package/dist/infra/validation/validation.module.d.ts +3 -0
  370. package/dist/infra/validation/validation.module.js +16 -0
  371. package/dist/infra/validation/zod-params.d.ts +7 -0
  372. package/dist/infra/validation/zod-params.js +42 -0
  373. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  374. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  375. package/dist/kernel.d.ts +9 -244
  376. package/dist/kernel.js +8 -1305
  377. package/dist/kernel.module.d.ts +17 -0
  378. package/dist/kernel.module.js +136 -0
  379. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  380. package/dist/lifecycle/kernel-lifecycle.js +456 -0
  381. package/dist/lifecycle/tokens.d.ts +3 -0
  382. package/dist/lifecycle/tokens.js +3 -0
  383. package/dist/log-context.d.ts +2 -0
  384. package/dist/log-context.js +4 -0
  385. package/dist/models/models.module.d.ts +3 -0
  386. package/dist/models/models.module.js +24 -0
  387. package/dist/models/prices.d.ts +8 -2
  388. package/dist/models/prices.js +65 -37
  389. package/dist/models/purposes.controller.d.ts +1 -1
  390. package/dist/models/purposes.controller.js +5 -6
  391. package/dist/models/purposes.d.ts +35 -13
  392. package/dist/models/purposes.js +101 -51
  393. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  394. package/dist/orgs/directory-sync.controller.js +2 -2
  395. package/dist/orgs/directory-sync.d.ts +61 -31
  396. package/dist/orgs/directory-sync.js +212 -125
  397. package/dist/orgs/invitations.controller.d.ts +8 -8
  398. package/dist/orgs/invitations.controller.js +27 -26
  399. package/dist/orgs/invitations.service.d.ts +12 -9
  400. package/dist/orgs/invitations.service.js +130 -92
  401. package/dist/orgs/job-ids.d.ts +8 -0
  402. package/dist/orgs/job-ids.js +8 -0
  403. package/dist/orgs/members.service.d.ts +19 -12
  404. package/dist/orgs/members.service.js +161 -117
  405. package/dist/orgs/offboarding.d.ts +54 -57
  406. package/dist/orgs/offboarding.js +161 -71
  407. package/dist/orgs/org-lock.d.ts +28 -19
  408. package/dist/orgs/org-lock.js +81 -35
  409. package/dist/orgs/org.guard.d.ts +1 -1
  410. package/dist/orgs/org.guard.js +2 -2
  411. package/dist/orgs/orgs.controller.d.ts +13 -13
  412. package/dist/orgs/orgs.controller.js +29 -17
  413. package/dist/orgs/orgs.module.d.ts +6 -0
  414. package/dist/orgs/orgs.module.js +68 -0
  415. package/dist/orgs/orgs.service.d.ts +30 -19
  416. package/dist/orgs/orgs.service.js +139 -86
  417. package/dist/orgs/settings.controller.d.ts +1 -1
  418. package/dist/orgs/settings.controller.js +8 -6
  419. package/dist/orgs/settings.service.d.ts +16 -10
  420. package/dist/orgs/settings.service.js +77 -48
  421. package/dist/overrides.d.ts +56 -0
  422. package/dist/overrides.js +30 -0
  423. package/dist/roles/gateway-role.d.ts +43 -0
  424. package/dist/roles/gateway-role.js +98 -0
  425. package/dist/roles/gateway.module.d.ts +8 -0
  426. package/dist/roles/gateway.module.js +28 -0
  427. package/dist/roles/worker-role.d.ts +63 -0
  428. package/dist/roles/worker-role.js +144 -0
  429. package/dist/roles/worker.module.d.ts +14 -0
  430. package/dist/roles/worker.module.js +90 -0
  431. package/dist/runtime/abort.js +19 -2
  432. package/dist/runtime/checkpointer.d.ts +8 -3
  433. package/dist/runtime/checkpointer.js +87 -55
  434. package/dist/runtime/context/build.d.ts +6 -6
  435. package/dist/runtime/context/build.js +18 -8
  436. package/dist/runtime/context/claude-tools.d.ts +2 -1
  437. package/dist/runtime/context/claude-tools.js +9 -10
  438. package/dist/runtime/context/legacy-text.d.ts +22 -0
  439. package/dist/runtime/context/legacy-text.js +37 -0
  440. package/dist/runtime/context/skills.d.ts +29 -11
  441. package/dist/runtime/context/skills.js +37 -30
  442. package/dist/runtime/conversation-lock.d.ts +20 -11
  443. package/dist/runtime/conversation-lock.js +62 -72
  444. package/dist/runtime/hook-calls.d.ts +3 -3
  445. package/dist/runtime/hook-calls.js +1 -6
  446. package/dist/runtime/job-ids.d.ts +10 -0
  447. package/dist/runtime/job-ids.js +10 -0
  448. package/dist/runtime/langgraph-loop.js +1 -1
  449. package/dist/runtime/loop.d.ts +8 -1
  450. package/dist/runtime/loop.js +14 -0
  451. package/dist/runtime/maintenance-queue.d.ts +10 -0
  452. package/dist/runtime/maintenance-queue.js +10 -0
  453. package/dist/runtime/maintenance.d.ts +45 -74
  454. package/dist/runtime/maintenance.js +139 -137
  455. package/dist/runtime/model-call.d.ts +7 -4
  456. package/dist/runtime/model-call.js +25 -58
  457. package/dist/runtime/providers.d.ts +17 -6
  458. package/dist/runtime/providers.js +66 -25
  459. package/dist/runtime/quota.d.ts +17 -3
  460. package/dist/runtime/quota.js +27 -2
  461. package/dist/runtime/retired-schedulers.d.ts +7 -0
  462. package/dist/runtime/retired-schedulers.js +31 -0
  463. package/dist/runtime/run-control.d.ts +33 -0
  464. package/dist/runtime/run-control.js +77 -0
  465. package/dist/runtime/run-finish.d.ts +27 -18
  466. package/dist/runtime/run-finish.js +98 -51
  467. package/dist/runtime/run-jobs.d.ts +48 -0
  468. package/dist/runtime/run-jobs.js +95 -0
  469. package/dist/runtime/run-processors.d.ts +60 -0
  470. package/dist/runtime/run-processors.js +185 -0
  471. package/dist/runtime/run-queue.d.ts +32 -57
  472. package/dist/runtime/run-queue.js +291 -295
  473. package/dist/runtime/run-steps.d.ts +39 -0
  474. package/dist/runtime/run-steps.js +96 -0
  475. package/dist/runtime/run-worker.d.ts +122 -76
  476. package/dist/runtime/run-worker.js +343 -229
  477. package/dist/runtime/runtime.module.d.ts +10 -0
  478. package/dist/runtime/runtime.module.js +112 -0
  479. package/dist/runtime/step-log.d.ts +40 -0
  480. package/dist/runtime/step-log.js +94 -0
  481. package/dist/runtime/stream.controller.d.ts +5 -8
  482. package/dist/runtime/stream.controller.js +14 -12
  483. package/dist/runtime/stream.d.ts +24 -6
  484. package/dist/runtime/stream.js +78 -7
  485. package/dist/runtime/subagents/child.d.ts +3 -44
  486. package/dist/runtime/subagents/child.js +0 -79
  487. package/dist/runtime/subagents/definition.d.ts +5 -10
  488. package/dist/runtime/subagents/definition.js +13 -14
  489. package/dist/runtime/subagents/dispatch.d.ts +89 -8
  490. package/dist/runtime/subagents/dispatch.js +137 -142
  491. package/dist/runtime/subagents/limits.d.ts +9 -4
  492. package/dist/runtime/subagents/limits.js +4 -2
  493. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  494. package/dist/runtime/subagents/org-agents.js +3 -2
  495. package/dist/runtime/subagents/progress.d.ts +2 -2
  496. package/dist/runtime/subagents/roster.d.ts +4 -4
  497. package/dist/runtime/subagents/roster.js +2 -2
  498. package/dist/runtime/subagents/skill-fork.d.ts +8 -9
  499. package/dist/runtime/subagents/skill-fork.js +17 -6
  500. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  501. package/dist/runtime/subagents/subagents.service.js +101 -0
  502. package/dist/runtime/usage-report.d.ts +94 -52
  503. package/dist/runtime/usage-report.js +200 -100
  504. package/dist/runtime/waits.d.ts +127 -59
  505. package/dist/runtime/waits.js +433 -210
  506. package/dist/sandbox/job-ids.d.ts +10 -0
  507. package/dist/sandbox/job-ids.js +10 -0
  508. package/dist/sandbox/jobs.d.ts +41 -0
  509. package/dist/sandbox/jobs.js +113 -0
  510. package/dist/sandbox/leases.d.ts +39 -31
  511. package/dist/sandbox/leases.js +117 -257
  512. package/dist/sandbox/providers.d.ts +19 -0
  513. package/dist/sandbox/providers.js +38 -0
  514. package/dist/sandbox/sandbox.module.d.ts +8 -0
  515. package/dist/sandbox/sandbox.module.js +30 -0
  516. package/dist/sandbox/sandbox.service.d.ts +24 -29
  517. package/dist/sandbox/sandbox.service.js +106 -75
  518. package/dist/skills/catalog.d.ts +37 -24
  519. package/dist/skills/catalog.js +100 -57
  520. package/dist/skills/changes.controller.d.ts +4 -4
  521. package/dist/skills/changes.controller.js +15 -9
  522. package/dist/skills/changes.service.d.ts +30 -20
  523. package/dist/skills/changes.service.js +425 -367
  524. package/dist/skills/invocable.controller.d.ts +1 -1
  525. package/dist/skills/invocable.controller.js +8 -5
  526. package/dist/skills/invocation-keys.d.ts +1 -1
  527. package/dist/skills/invocation-keys.js +1 -1
  528. package/dist/skills/invoke.d.ts +17 -16
  529. package/dist/skills/invoke.js +53 -21
  530. package/dist/skills/skills.controller.d.ts +1 -1
  531. package/dist/skills/skills.controller.js +11 -6
  532. package/dist/skills/skills.module.d.ts +6 -0
  533. package/dist/skills/skills.module.js +30 -0
  534. package/dist/skills/skills.service.d.ts +47 -30
  535. package/dist/skills/skills.service.js +221 -158
  536. package/dist/storage/job-ids.d.ts +6 -0
  537. package/dist/storage/job-ids.js +6 -0
  538. package/dist/storage/purge.d.ts +22 -7
  539. package/dist/storage/purge.js +55 -3
  540. package/dist/storage/storage.module.d.ts +6 -0
  541. package/dist/storage/storage.module.js +23 -0
  542. package/dist/storage/storage.service.d.ts +18 -4
  543. package/dist/storage/storage.service.js +44 -3
  544. package/dist/tools/approvals.controller.d.ts +1 -1
  545. package/dist/tools/approvals.controller.js +12 -8
  546. package/dist/tools/approvals.service.d.ts +33 -25
  547. package/dist/tools/approvals.service.js +343 -259
  548. package/dist/tools/breaker.d.ts +2 -2
  549. package/dist/tools/breaker.js +21 -3
  550. package/dist/tools/builtin-names.d.ts +73 -0
  551. package/dist/tools/builtin-names.js +116 -0
  552. package/dist/tools/builtins/agent.d.ts +7 -7
  553. package/dist/tools/builtins/agent.js +7 -11
  554. package/dist/tools/builtins/ask-user.d.ts +3 -3
  555. package/dist/tools/builtins/ask-user.js +3 -3
  556. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  557. package/dist/tools/builtins/builtin-tools.js +80 -0
  558. package/dist/tools/builtins/read-tool-output.d.ts +3 -3
  559. package/dist/tools/builtins/read-tool-output.js +3 -3
  560. package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
  561. package/dist/tools/builtins/sandbox/bash.js +33 -30
  562. package/dist/tools/builtins/sandbox/common.d.ts +5 -4
  563. package/dist/tools/builtins/sandbox/common.js +2 -2
  564. package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
  565. package/dist/tools/builtins/sandbox/deliver.js +13 -13
  566. package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
  567. package/dist/tools/builtins/sandbox/edit.js +42 -31
  568. package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
  569. package/dist/tools/builtins/sandbox/file-state.js +34 -0
  570. package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
  571. package/dist/tools/builtins/sandbox/glob-match.js +1 -1
  572. package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
  573. package/dist/tools/builtins/sandbox/glob.js +6 -6
  574. package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
  575. package/dist/tools/builtins/sandbox/grep.js +149 -32
  576. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  577. package/dist/tools/builtins/sandbox/index.js +1 -1
  578. package/dist/tools/builtins/sandbox/read.d.ts +2 -2
  579. package/dist/tools/builtins/sandbox/read.js +22 -15
  580. package/dist/tools/builtins/sandbox/write.d.ts +1 -1
  581. package/dist/tools/builtins/sandbox/write.js +38 -34
  582. package/dist/tools/builtins/skill-load.d.ts +6 -6
  583. package/dist/tools/builtins/skill-load.js +33 -17
  584. package/dist/tools/builtins/skill-write.d.ts +4 -4
  585. package/dist/tools/builtins/skill-write.js +10 -10
  586. package/dist/tools/builtins/tool-search.d.ts +13 -9
  587. package/dist/tools/builtins/tool-search.js +25 -14
  588. package/dist/tools/canonical-json.d.ts +6 -0
  589. package/dist/tools/canonical-json.js +16 -0
  590. package/dist/tools/connector-content.controller.d.ts +1 -1
  591. package/dist/tools/connector-content.controller.js +11 -6
  592. package/dist/tools/connector-content.d.ts +12 -15
  593. package/dist/tools/connector-content.js +53 -18
  594. package/dist/tools/connectors.controller.d.ts +1 -1
  595. package/dist/tools/connectors.controller.js +21 -10
  596. package/dist/tools/connectors.service.d.ts +31 -13
  597. package/dist/tools/connectors.service.js +438 -348
  598. package/dist/tools/credentials.d.ts +17 -20
  599. package/dist/tools/credentials.js +55 -34
  600. package/dist/tools/display-names.d.ts +9 -0
  601. package/dist/tools/display-names.js +24 -0
  602. package/dist/tools/drift.d.ts +29 -41
  603. package/dist/tools/drift.js +116 -84
  604. package/dist/tools/elicitation.js +1 -1
  605. package/dist/tools/info.d.ts +32 -13
  606. package/dist/tools/info.js +88 -39
  607. package/dist/tools/job-ids.d.ts +13 -0
  608. package/dist/tools/job-ids.js +15 -0
  609. package/dist/tools/jobs.d.ts +24 -0
  610. package/dist/tools/jobs.js +69 -0
  611. package/dist/tools/legacy-data.d.ts +34 -0
  612. package/dist/tools/legacy-data.js +76 -0
  613. package/dist/tools/legacy-keys.d.ts +51 -0
  614. package/dist/tools/legacy-keys.js +115 -0
  615. package/dist/tools/naming.d.ts +1 -5
  616. package/dist/tools/naming.js +1 -7
  617. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  618. package/dist/tools/oauth/flow-paths.js +38 -0
  619. package/dist/tools/oauth/flow.d.ts +30 -30
  620. package/dist/tools/oauth/flow.js +109 -81
  621. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  622. package/dist/tools/oauth/oauth.controller.js +12 -9
  623. package/dist/tools/oauth/tokens.d.ts +11 -3
  624. package/dist/tools/oauth/tokens.js +15 -14
  625. package/dist/tools/outputs.d.ts +13 -4
  626. package/dist/tools/outputs.js +48 -4
  627. package/dist/tools/pipeline.d.ts +72 -50
  628. package/dist/tools/pipeline.js +239 -100
  629. package/dist/tools/policy.d.ts +3 -16
  630. package/dist/tools/policy.js +13 -19
  631. package/dist/tools/questions.controller.d.ts +2 -2
  632. package/dist/tools/questions.controller.js +9 -6
  633. package/dist/tools/questions.service.d.ts +26 -25
  634. package/dist/tools/questions.service.js +201 -142
  635. package/dist/tools/registry.d.ts +43 -38
  636. package/dist/tools/registry.js +100 -72
  637. package/dist/tools/resources.d.ts +1 -1
  638. package/dist/tools/resources.js +1 -1
  639. package/dist/tools/specs.d.ts +5 -4
  640. package/dist/tools/specs.js +3 -1
  641. package/dist/tools/tools.module.d.ts +10 -0
  642. package/dist/tools/tools.module.js +91 -0
  643. package/dist/ui/call-extension.d.ts +16 -0
  644. package/dist/ui/call-extension.js +38 -0
  645. package/dist/ui/embed-token.d.ts +9 -5
  646. package/dist/ui/embed-token.js +34 -6
  647. package/dist/ui/ui-stream.d.ts +22 -17
  648. package/dist/ui/ui-stream.js +72 -12
  649. package/dist/ui/ui.module.d.ts +7 -0
  650. package/dist/ui/ui.module.js +28 -0
  651. package/dist/ui/views.controller.d.ts +14 -12
  652. package/dist/ui/views.controller.js +32 -25
  653. package/dist/ui/views.d.ts +9 -57
  654. package/dist/ui/views.js +43 -45
  655. package/package.json +10 -3
  656. package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
  657. package/dist/http/health.controller.d.ts +0 -26
  658. package/dist/http/health.controller.js +0 -79
  659. package/dist/http/tokens.d.ts +0 -131
  660. package/dist/http/tokens.js +0 -131
  661. package/dist/http/zod.pipe.d.ts +0 -8
  662. package/dist/http/zod.pipe.js +0 -14
  663. package/dist/identity/rate-limit.d.ts +0 -55
  664. package/dist/identity/rate-limit.js +0 -121
  665. package/dist/sandbox/lifecycle.d.ts +0 -21
  666. package/dist/sandbox/lifecycle.js +0 -68
  667. package/dist/tools/builtins/sandbox/names.d.ts +0 -7
  668. package/dist/tools/builtins/sandbox/names.js +0 -20
  669. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  670. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,17 +1,32 @@
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 { isSafePackagePath, marketplaceEntryVersion, } from "@capybara-hq/plugin-sdk";
11
+ import { Inject, Injectable } from "@nestjs/common";
2
12
  import { sql } from "kysely";
3
13
  import { ApiError } from "../errors.js";
4
- import { enabledExtensionsByOrg } from "../extensions/enabled.js";
14
+ import { ExtensionAdminOps } from "../extensions/admin-ops.js";
15
+ import { ExtensionInstalls } from "../extensions/installs.js";
5
16
  import { audit } from "../identity/audit.js";
6
- import { lockEnterpriseAdminsAndAuthorize } from "../identity/enterprise-admin.js";
17
+ import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
18
+ import { KernelConfigService } from "../infra/config/kernel-config.service.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";
7
22
  import { sameRepository } from "../packages/provenance.js";
8
- import { endpointCredentialIssues } from "../tools/endpoint.js";
9
- import { expandGitUrl, GitSourceError, gitErrorDetails, gitLocationIdentity, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
10
- import { marketplaceNetPolicy, marketplaceUrlProblem } from "./marketplace-fetch.js";
11
- import { entryCompatible, entryContentChanged, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, pluginNameFrom, sourceEffective, } from "./marketplaces.service.js";
23
+ import { countInstalls, itemView, marketplaceLatest } from "./catalog-items.js";
24
+ import { expandGitUrl, GitSourceError, gitErrorDetails, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
25
+ import { fetchMarketplaceArchive, marketplaceNetPolicy, marketplaceUrlProblem, } from "./marketplace-fetch.js";
26
+ import { entryCompatible, entrySourceHost, HOST_VERSIONS, hostAllowed, loadMarketplaceEntry, MarketplacesService, pluginNameFrom, } from "./marketplaces.service.js";
27
+ import { PluginImport } from "./plugin-import.js";
12
28
  import { cancelPendingRequests } from "./requests.service.js";
13
- import { schemaHasPath } from "./schema-path.js";
14
- import { compareVersions, newestFirst, sameRelease, withBuild } from "./versions.js";
29
+ import { newestFirst } from "./versions.js";
15
30
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
16
31
  const notFound = () => new ApiError("catalog.item_not_found", "Catalog item not found");
17
32
  /** An archive URL as recorded (origin + path): a query string or fragment may carry a token. */
@@ -58,28 +73,53 @@ function gitSource(loc, read, pinned) {
58
73
  ref: `${u.origin}${u.pathname}@${commit}${path === "." ? "" : `:${path}`}`,
59
74
  };
60
75
  }
61
- /**
62
- * The object storage prefix of one import (relative to `deployment/`):
63
- * `directory/<itemId>/<version>/<importId>/`. Each import gets a new `importId`, so the losing one of
64
- * two concurrent imports of the same version never overwrites the committed version's files; reads
65
- * always go through the `object_prefix` stored on the version row. Build metadata's `+` is written
66
- * as `_` (a `+` in a key can turn into a space through URL query encoding).
67
- */
68
- export const catalogObjectPrefix = (itemId, version, importId) => `directory/${itemId}/${version.replace(/\+/g, "_")}/${importId}/`;
69
76
  /** Default / largest page size of the list. */
70
77
  export const CATALOG_LIST_DEFAULT_LIMIT = 200;
71
78
  export const CATALOG_LIST_MAX_LIMIT = 1000;
72
- const PUT_CONCURRENCY = 8;
73
79
  /**
74
80
  * Enterprise catalog items (D9 / C21 / C22, `/api/v1/admin/catalog/*`, enterprise admins only). One
75
81
  * kind: every item is a plugin (spec §4), imported through {@link PluginImport} (prepare -> confirm,
76
82
  * one review); this service lists and shows items, changes policy, deletes, installs an item's
77
83
  * extension on the deployment, and prepares marketplace imports. Stateless, shared by every replica.
78
84
  */
79
- export class CatalogService {
80
- d;
81
- constructor(d) {
82
- this.d = d;
85
+ let CatalogService = class CatalogService {
86
+ kdb;
87
+ adminLock;
88
+ config;
89
+ installs;
90
+ ops;
91
+ pluginImport;
92
+ marketplaces;
93
+ txHost;
94
+ constructor(kdb,
95
+ /** The enterprise admin lock (identity/enterprise-admin.ts): joins the caller's transaction. */
96
+ adminLock, config, installs, ops,
97
+ /** Plugin import (a marketplace entry goes through its prepare). */
98
+ pluginImport,
99
+ /** The token of an enterprise marketplace (sent only to its URL's origin). */
100
+ marketplaces, txHost) {
101
+ this.kdb = kdb;
102
+ this.adminLock = adminLock;
103
+ this.config = config;
104
+ this.installs = installs;
105
+ this.ops = ops;
106
+ this.pluginImport = pluginImport;
107
+ this.marketplaces = marketplaces;
108
+ this.txHost = txHost;
109
+ }
110
+ /** The kernel-schema handle of the current context (the transaction, else the pool). */
111
+ get db() {
112
+ return this.kdb.db;
113
+ }
114
+ /** Downloads a marketplace archive source, verified against its integrity. */
115
+ fetchArchive(archive, signal) {
116
+ const config = this.config.get();
117
+ return fetchMarketplaceArchive(archive, {
118
+ maxBytes: config.packages.maxBytes,
119
+ timeoutMs: 120_000,
120
+ net: marketplaceNetPolicy(config),
121
+ ...(signal !== undefined && { signal }),
122
+ });
83
123
  }
84
124
  /**
85
125
  * Prepares the import of one marketplace entry (C25 / C26, spec §5.2): `version` defaults to the
@@ -100,8 +140,8 @@ export class CatalogService {
100
140
  * `marketplace.not_found`; disabled, or the entry / version missing -> `marketplace.entry_not_found`.
101
141
  */
102
142
  async importFromMarketplace(actor, input, opts = {}) {
103
- const config = this.d.config();
104
- const { entry, marketplace, claude } = await loadMarketplaceEntry(this.d.db, config, input.marketplaceId, input.name, input.version);
143
+ const config = this.config.get();
144
+ const { entry, marketplace, claude } = await loadMarketplaceEntry(this.db, config, input.marketplaceId, input.name, input.version);
105
145
  const version = marketplaceEntryVersion(entry);
106
146
  if (!entryCompatible(entry)) {
107
147
  throw new ApiError("marketplace.incompatible", `${entry.name}${version !== null ? `@${version}` : ""} needs kernel >= ${entry.minKernel}; this deployment runs kernel ${HOST_VERSIONS.kernel}`);
@@ -129,20 +169,20 @@ export class CatalogService {
129
169
  let detail;
130
170
  let provenance;
131
171
  if ("npm" in src) {
132
- got = await this.d.installs.fetchMarketplacePackage({ package: src.npm.package, version: src.npm.version, integrity: src.npm.integrity }, opts.signal);
172
+ got = await this.installs.fetchMarketplacePackage({ package: src.npm.package, version: src.npm.version, integrity: src.npm.integrity }, opts.signal);
133
173
  ref = `${input.marketplaceId}:${src.npm.package}@${src.npm.version}`;
134
174
  detail = { registry: new URL(config.packages.npmRegistry).origin };
135
- const p = await this.d.installs.fetchProvenance({ package: src.npm.package, version: src.npm.version, integrity: got.integrity }, opts.signal);
175
+ const p = await this.installs.fetchProvenance({ package: src.npm.package, version: src.npm.version, integrity: got.integrity }, opts.signal);
136
176
  // a git marketplace declares its repository: an attestation from another one is a warning
137
177
  const mismatch = p.checked && marketplace.form === "git" && !sameRepository(p.repository, marketplace.url);
138
178
  provenance = { provenance: p, ...(mismatch && { warning: "repository_mismatch" }) };
139
179
  }
140
180
  else {
141
- got = await this.d.fetchArchive(src.archive, opts.signal);
181
+ got = await this.fetchArchive(src.archive, opts.signal);
142
182
  ref = `${input.marketplaceId}:${archiveRef(src.archive.url)}`;
143
183
  detail = { url: archiveRef(src.archive.url) };
144
184
  }
145
- staged = await this.d.pluginImport.prepare(actor, got.bytes, {
185
+ staged = await this.pluginImport.prepare(actor, got.bytes, {
146
186
  kind: "marketplace",
147
187
  ref,
148
188
  integrity: got.integrity,
@@ -184,7 +224,7 @@ export class CatalogService {
184
224
  }
185
225
  const token = marketplace.builtin
186
226
  ? undefined
187
- : await this.d.marketplaceToken(input.marketplaceId);
227
+ : await this.marketplaces.token(input.marketplaceId);
188
228
  const read = await this.readGit(loc, {
189
229
  ...(token !== undefined && { token, tokenOrigin: new URL(marketplace.url).origin }),
190
230
  ...(opts.signal !== undefined && { signal: opts.signal }),
@@ -192,7 +232,7 @@ export class CatalogService {
192
232
  // path entries follow the marketplace's ref; git entries follow theirs unless a commit is pinned
193
233
  const pinned = "git" in src && src.git.commit !== undefined;
194
234
  const where = gitSource("path" in src && marketplace.ref !== null ? { ...loc, ref: marketplace.ref } : loc, read, pinned);
195
- staged = await this.d.pluginImport.prepareGit(actor, read.files, {
235
+ staged = await this.pluginImport.prepareGit(actor, read.files, {
196
236
  kind: "git",
197
237
  ref: `${input.marketplaceId}:${where.ref}`,
198
238
  marketplaceId: input.marketplaceId,
@@ -224,7 +264,7 @@ export class CatalogService {
224
264
  */
225
265
  async importFromGit(actor, input, opts = {}) {
226
266
  const url = expandGitUrl(input.url);
227
- const problem = marketplaceUrlProblem(url, this.d.config().marketplaces.allowInsecureLoopback);
267
+ const problem = marketplaceUrlProblem(url, this.config.get().marketplaces.allowInsecureLoopback);
228
268
  if (problem !== null)
229
269
  throw new ApiError("validation_failed", `url: ${problem}`);
230
270
  if (input.path !== undefined) {
@@ -247,7 +287,7 @@ export class CatalogService {
247
287
  .filter((s) => s !== "")
248
288
  .pop() ?? "plugin")
249
289
  : where.detail.path.split("/").pop();
250
- const r = await this.d.pluginImport.prepareGit(actor, read.files, { kind: "git", ref: where.ref, detail: where.detail }, {
290
+ const r = await this.pluginImport.prepareGit(actor, read.files, { kind: "git", ref: where.ref, detail: where.detail }, {
251
291
  ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
252
292
  fallback: {
253
293
  name: pluginNameFrom(segment),
@@ -259,7 +299,7 @@ export class CatalogService {
259
299
  }
260
300
  /** Resolves the commit and reads the plugin's files; git failures become API errors. */
261
301
  async readGit(loc, o) {
262
- const config = this.d.config();
302
+ const config = this.config.get();
263
303
  const options = {
264
304
  net: marketplaceNetPolicy(config),
265
305
  maxBytes: config.packages.maxBytes,
@@ -289,7 +329,7 @@ export class CatalogService {
289
329
  async page(q = {}) {
290
330
  const limit = Math.min(Math.max(1, q.limit ?? CATALOG_LIST_DEFAULT_LIMIT), CATALOG_LIST_MAX_LIMIT);
291
331
  const offset = Math.max(0, q.offset ?? 0);
292
- let query = this.d.db
332
+ let query = this.db
293
333
  .selectFrom("catalog_items")
294
334
  .selectAll()
295
335
  .orderBy("name")
@@ -303,7 +343,7 @@ export class CatalogService {
303
343
  const items = rows.slice(0, limit);
304
344
  if (items.length === 0)
305
345
  return { items: [], nextOffset: null };
306
- const versions = await this.d.db
346
+ const versions = await this.db
307
347
  .selectFrom("catalog_item_versions")
308
348
  .select([
309
349
  "item_id",
@@ -323,8 +363,8 @@ export class CatalogService {
323
363
  list.push(v);
324
364
  byItem.set(v.item_id, list);
325
365
  }
326
- const installs = await countInstalls(this.d.db, items, byItem);
327
- const latest = await marketplaceLatest(this.d.db, this.d.config(), items, byItem);
366
+ const installs = await countInstalls(this.db, items, byItem);
367
+ const latest = await marketplaceLatest(this.db, this.config.get(), items, byItem);
328
368
  return {
329
369
  items: items.map((i) => itemView(i, byItem.get(i.id) ?? [], installs.get(i.id) ?? 0, latest.get(i.id))),
330
370
  nextOffset,
@@ -334,22 +374,22 @@ export class CatalogService {
334
374
  async get(itemId) {
335
375
  if (!UUID_RE.test(itemId))
336
376
  throw notFound();
337
- const item = await this.d.db
377
+ const item = await this.db
338
378
  .selectFrom("catalog_items")
339
379
  .selectAll()
340
380
  .where("id", "=", itemId)
341
381
  .executeTakeFirst();
342
382
  if (!item)
343
383
  throw notFound();
344
- const rows = await this.d.db
384
+ const rows = await this.db
345
385
  .selectFrom("catalog_item_versions")
346
386
  .selectAll()
347
387
  .where("item_id", "=", itemId)
348
388
  .execute();
349
389
  rows.sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at }, { version: b.version, importedAt: b.imported_at }));
350
390
  const byItem = new Map([[item.id, rows]]);
351
- const installs = await countInstalls(this.d.db, [item], byItem);
352
- const latest = await marketplaceLatest(this.d.db, this.d.config(), [item], byItem);
391
+ const installs = await countInstalls(this.db, [item], byItem);
392
+ const latest = await marketplaceLatest(this.db, this.config.get(), [item], byItem);
353
393
  return {
354
394
  item: {
355
395
  ...itemView(item, rows, installs.get(item.id) ?? 0, latest.get(item.id)),
@@ -383,34 +423,36 @@ export class CatalogService {
383
423
  async setPolicy(actor, itemId, policy, opts = {}) {
384
424
  if (!UUID_RE.test(itemId))
385
425
  throw notFound();
386
- await this.d.db.transaction().execute(async (trx) => {
387
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
388
- const row = await trx
389
- .selectFrom("catalog_items")
390
- .select(["name", "policy"])
391
- .where("id", "=", itemId)
392
- .where("deleted_at", "is", null)
393
- .forUpdate()
394
- .executeTakeFirst();
395
- if (!row)
396
- throw notFound();
397
- if (row.policy === policy)
398
- return;
399
- await trx
400
- .updateTable("catalog_items")
401
- .set({ policy, updated_at: sql `now()` })
402
- .where("id", "=", itemId)
403
- .execute();
404
- await audit(trx, {
405
- actorAccountId: actor,
406
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
407
- action: "catalog.policy_changed",
408
- target: itemId,
409
- detail: { name: row.name, from: row.policy, to: policy },
410
- });
411
- });
426
+ await this.writePolicy(actor, itemId, policy, opts);
412
427
  return this.view(itemId);
413
428
  }
429
+ async writePolicy(actor, itemId, policy, opts) {
430
+ const t = this.db;
431
+ await this.adminLock.lockAndAuthorize(actor);
432
+ const row = await t
433
+ .selectFrom("catalog_items")
434
+ .select(["name", "policy"])
435
+ .where("id", "=", itemId)
436
+ .where("deleted_at", "is", null)
437
+ .forUpdate()
438
+ .executeTakeFirst();
439
+ if (!row)
440
+ throw notFound();
441
+ if (row.policy === policy)
442
+ return;
443
+ await t
444
+ .updateTable("catalog_items")
445
+ .set({ policy, updated_at: sql `now()` })
446
+ .where("id", "=", itemId)
447
+ .execute();
448
+ await audit(t, {
449
+ actorAccountId: actor,
450
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
451
+ action: "catalog.policy_changed",
452
+ target: itemId,
453
+ detail: { name: row.name, from: row.policy, to: policy },
454
+ });
455
+ }
414
456
  /**
415
457
  * Deletes the item (soft delete, audit `catalog.removed`; requests still pending are cancelled in
416
458
  * the same transaction): versions and stored files are kept (installed components still refer to
@@ -420,29 +462,31 @@ export class CatalogService {
420
462
  async remove(actor, itemId, opts = {}) {
421
463
  if (!UUID_RE.test(itemId))
422
464
  throw notFound();
423
- await this.d.db.transaction().execute(async (trx) => {
424
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
425
- const row = await trx
426
- .updateTable("catalog_items")
427
- .set({
428
- deleted_at: sql `now()`,
429
- updated_at: sql `now()`,
430
- })
431
- .where("id", "=", itemId)
432
- .where("deleted_at", "is", null)
433
- .returning(["name"])
434
- .executeTakeFirst();
435
- if (!row)
436
- throw notFound();
437
- // Pending requests for a deleted item are pointless: cancel them in the same transaction
438
- await cancelPendingRequests(trx, { itemId }, actor, "item_removed", opts);
439
- await audit(trx, {
440
- actorAccountId: actor,
441
- ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
442
- action: "catalog.removed",
443
- target: itemId,
444
- detail: { name: row.name },
445
- });
465
+ await this.writeRemove(actor, itemId, opts);
466
+ }
467
+ async writeRemove(actor, itemId, opts) {
468
+ const t = this.db;
469
+ await this.adminLock.lockAndAuthorize(actor);
470
+ const row = await t
471
+ .updateTable("catalog_items")
472
+ .set({
473
+ deleted_at: sql `now()`,
474
+ updated_at: sql `now()`,
475
+ })
476
+ .where("id", "=", itemId)
477
+ .where("deleted_at", "is", null)
478
+ .returning(["name"])
479
+ .executeTakeFirst();
480
+ if (!row)
481
+ throw notFound();
482
+ // Pending requests for a deleted item are pointless: cancel them in the same transaction
483
+ await cancelPendingRequests(t, { itemId }, actor, "item_removed", opts);
484
+ await audit(t, {
485
+ actorAccountId: actor,
486
+ ...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
487
+ action: "catalog.removed",
488
+ target: itemId,
489
+ detail: { name: row.name },
446
490
  });
447
491
  }
448
492
  /**
@@ -456,7 +500,7 @@ export class CatalogService {
456
500
  async installToDeployment(actor, itemId, version, opts = {}) {
457
501
  if (!UUID_RE.test(itemId))
458
502
  throw notFound();
459
- const item = await this.d.db
503
+ const item = await this.db
460
504
  .selectFrom("catalog_items")
461
505
  .select(["id", "name"])
462
506
  .where("id", "=", itemId)
@@ -464,7 +508,7 @@ export class CatalogService {
464
508
  .executeTakeFirst();
465
509
  if (!item)
466
510
  throw notFound();
467
- const v = await this.d.db
511
+ const v = await this.db
468
512
  .selectFrom("catalog_item_versions")
469
513
  .select("extension_sha256")
470
514
  .where("item_id", "=", itemId)
@@ -476,407 +520,29 @@ export class CatalogService {
476
520
  if (v.extension_sha256 === null) {
477
521
  throw new ApiError("catalog.no_extension", `Plugin ${item.name} ${version} has no extension; there is nothing to install on the deployment`);
478
522
  }
479
- return this.d.ops.install(item.name, v.extension_sha256, actor, opts.actorTokenId, {
523
+ return this.ops.install(item.name, v.extension_sha256, actor, opts.actorTokenId, {
480
524
  catalogItemId: itemId,
481
525
  });
482
526
  }
483
527
  async view(itemId) {
484
528
  return (await this.get(itemId)).item;
485
529
  }
486
- }
487
- /**
488
- * Checks a connector template against the loaded connector `c` (problem paths start with `at`): the
489
- * endpoint matches its `endpointSchema` and carries no credential-like headers / query / URL user
490
- * info (the same rule as connector installs); every `editableEndpoint` path exists in the endpoint
491
- * schema.
492
- */
493
- export function templateProblems(c, t, at) {
494
- const problems = [];
495
- const r = c.endpointSchema.safeParse(t.endpoint);
496
- if (!r.success) {
497
- for (const i of r.error.issues) {
498
- problems.push(`${[`${at}.endpoint`, ...i.path.map(String)].join(".")}: ${i.message}`);
499
- }
500
- }
501
- else {
502
- for (const leak of endpointCredentialIssues(r.data)) {
503
- problems.push(`${at}.${leak.path}: ${leak.message}`);
504
- }
505
- }
506
- for (const p of t.editableEndpoint ?? []) {
507
- if (!schemaHasPath(c.endpointSchema, p.split("."))) {
508
- problems.push(`${at}.editableEndpoint "${p}" is not a field of the ${t.connector} connector's endpoint`);
509
- }
510
- }
511
- return problems;
512
- }
513
- /** Writes the files to `deployment/<prefix><path>` ({@link PUT_CONCURRENCY} at a time). */
514
- export async function putCatalogFiles(storage, prefix, files) {
515
- const store = storage.deployment();
516
- const queue = [...files];
517
- await Promise.all(Array.from({ length: Math.min(PUT_CONCURRENCY, queue.length) }, async () => {
518
- for (let f = queue.shift(); f; f = queue.shift()) {
519
- await store.put(`${prefix}${f.path}`, f.data, {
520
- contentType: "application/octet-stream",
521
- size: f.size,
522
- });
523
- }
524
- }));
525
- }
526
- /** Compares the marketplace's permission summary with the computed keys ({@link PermissionsMismatch}). */
527
- export function permissionsMismatch(declared, actual) {
528
- if (declared === undefined || actual === undefined)
529
- return null;
530
- const want = new Set(declared);
531
- const have = new Set(actual);
532
- const missing = [...have].filter((k) => !want.has(k)).sort();
533
- const extra = [...want].filter((k) => !have.has(k)).sort();
534
- return missing.length > 0 || extra.length > 0 ? { missing, extra } : null;
535
- }
536
- /** Takes the transaction-level advisory lock of an item name (concurrent imports of it serialize). */
537
- export async function lockCatalogName(trx, name) {
538
- await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.directory-item:${name}`}))`.execute(trx);
539
- }
540
- /**
541
- * The live item of a name, with the source identity of its latest version
542
- * ({@link sourceIdentity}; null when there is none).
543
- */
544
- async function liveItem(db, name) {
545
- const item = await db
546
- .selectFrom("catalog_items")
547
- .select(["id", "package_name", "latest_version", "marketplace_id"])
548
- .where("name", "=", name)
549
- .where("deleted_at", "is", null)
550
- .executeTakeFirst();
551
- if (!item)
552
- return undefined;
553
- const latest = await db
554
- .selectFrom("catalog_item_versions")
555
- .select("source_detail")
556
- .where("item_id", "=", item.id)
557
- .where("version", "=", item.latest_version)
558
- .executeTakeFirst();
559
- return {
560
- ...item,
561
- source: sourceIdentity(latest?.source_detail ?? undefined, item.marketplace_id ?? undefined),
562
- };
563
- }
564
- /**
565
- * The identity of a git source, `<host>/<repo>:<path>` (host lower case, no `.git`), or null when
566
- * the source is not git. An item without package.json is identified by it instead of a package name.
567
- */
568
- export function gitIdentity(detail) {
569
- if (detail === undefined || !("commit" in detail))
570
- return null;
571
- return gitLocationIdentity(detail);
572
- }
573
- /**
574
- * What identifies the source of a plugin without package.json: `git <host>/<repo>:<path>`, or, for
575
- * a marketplace archive (a skills-only tgz without plugin.json), `marketplace <id>` (the
576
- * marketplace vouches for its entries; archive URLs change from version to version). null for
577
- * anything else.
578
- */
579
- function sourceIdentity(detail, marketplaceId) {
580
- const git = gitIdentity(detail);
581
- if (git !== null)
582
- return `git ${git}`;
583
- if (detail !== undefined && "url" in detail && marketplaceId !== undefined) {
584
- return `marketplace ${marketplaceId}`;
585
- }
586
- return null;
587
- }
588
- /** The versions of an item, with what tells their content apart. */
589
- async function itemVersions(db, itemId) {
590
- return db
591
- .selectFrom("catalog_item_versions")
592
- .select(["version", "content_digest", "integrity"])
593
- .where("item_id", "=", itemId)
594
- .execute();
595
- }
596
- /** `atConfirm`: found under the lock at confirm (another import committed after the review). */
597
- const versionExists = (version, sameContent, atConfirm = false) => new ApiError("catalog.version_exists", (sameContent
598
- ? `Version ${version} of this catalog item is already imported with the same content`
599
- : `Version ${version} of this catalog item has already been imported`) +
600
- (atConfirm
601
- ? " (by another import since this one was prepared); prepare the import again"
602
- : ""));
603
- /**
604
- * No version of the release of `p.version` (equal but for build metadata) holds the same content
605
- * (digest; for a version without one, the same integrity), else `catalog.version_exists`.
606
- */
607
- function assertNewContent(existing, p, atConfirm = false) {
608
- const same = existing.find((v) => sameRelease(v.version, p.version) &&
609
- (v.content_digest !== null
610
- ? v.content_digest === p.contentDigest
611
- : v.integrity !== null && v.integrity === p.integrity));
612
- if (same)
613
- throw versionExists(same.version, true, atConfirm);
614
- }
615
- /**
616
- * The version a new import records (Decision 6, spec §5.3): the plugin's own version, unless that
617
- * release is already imported. A version of the same release (equal but for build metadata) with
618
- * the same content (digest; for versions without one, the same integrity) -> `catalog.version_exists`
619
- * "already imported"; other content -> `<version>+git.<sha12>` (git) or `+sha256.<12>` (any other
620
- * source, the digest's first 12 hex), never overwriting the imported version. A git commit already
621
- * recorded with other content (a Claude Code plugin whose marketplace entry changed while its own
622
- * commit did not, see `claudeContentDigest`) falls back to `+sha256.<12>`.
623
- */
624
- export function recordedVersion(existing, p) {
625
- assertNewContent(existing, p);
626
- if (!existing.some((v) => v.version === p.version))
627
- return p.version;
628
- const d = p.detail;
629
- const byDigest = withBuild(p.version, `sha256.${p.contentDigest.slice(0, 12)}`);
630
- let next = d !== undefined && "commit" in d
631
- ? withBuild(p.version, `git.${d.commit.slice(0, 12)}`)
632
- : byDigest;
633
- if (existing.some((v) => v.version === next))
634
- next = byDigest;
635
- if (existing.some((v) => v.version === next))
636
- throw versionExists(next, false);
637
- return next;
638
- }
639
- /**
640
- * Conflict precheck before writing (no lock; {@link writeCatalogVersion}'s re-check inside the
641
- * transaction is final): an item with the same name from another npm package (or, without one,
642
- * another git source) -> `catalog.name_conflict`; the release already imported with the same
643
- * content -> `catalog.version_exists`. Returns the existing item (undefined when there is none) and
644
- * the version to record ({@link recordedVersion}).
645
- */
646
- export async function precheckCatalogImport(db, name, p) {
647
- const existing = await liveItem(db, name);
648
- if (!existing)
649
- return { existing, version: p.version };
650
- assertSameSource(existing, p.packageName, sourceIdentity(p.detail, p.marketplaceId));
651
- return { existing, version: recordedVersion(await itemVersions(db, existing.id), p) };
652
- }
653
- /**
654
- * Writes a catalog version in the caller's transaction (the caller has re-checked the enterprise
655
- * admin): takes the name's advisory lock, checks conflicts again (the same source; no version of
656
- * the release with the same content; `version` not taken meanwhile), creates the item when there is
657
- * none or adds the version (latest and display fields change only for a newer version, a version
658
- * equal but for build metadata being newer as the later import), and writes the version row (with
659
- * its content digest) and the `catalog.imported` audit. Returns the item id.
660
- */
661
- export async function writeCatalogVersion(trx, w) {
662
- const { name, version, listing } = w;
663
- await lockCatalogName(trx, name);
664
- const live = await liveItem(trx, name);
665
- let id;
666
- if (live) {
667
- id = live.id;
668
- assertSameSource(live, w.packageName, sourceIdentity(w.source.detail, w.marketplaceId));
669
- const existing = await itemVersions(trx, id);
670
- // the same content under any version of the release, then the recorded version itself
671
- assertNewContent(existing, {
672
- version,
673
- contentDigest: w.contentDigest,
674
- ...(w.source.integrity !== undefined && { integrity: w.source.integrity }),
675
- }, true);
676
- if (existing.some((v) => v.version === version))
677
- throw versionExists(version, false, true);
678
- const newer = compareVersions(version, live.latest_version) >= 0;
679
- await trx
680
- .updateTable("catalog_items")
681
- .set({
682
- updated_at: sql `now()`,
683
- ...(w.marketplaceId !== undefined && { marketplace_id: w.marketplaceId }),
684
- ...(newer && {
685
- latest_version: version,
686
- publisher: listing.publisher,
687
- description: listing.description,
688
- display_name: listing.displayName ? JSON.stringify(listing.displayName) : null,
689
- }),
690
- })
691
- .where("id", "=", id)
692
- .execute();
693
- }
694
- else {
695
- id = w.newItemId;
696
- await trx
697
- .insertInto("catalog_items")
698
- .values({
699
- id,
700
- name,
701
- package_name: w.packageName,
702
- publisher: listing.publisher,
703
- description: listing.description,
704
- display_name: listing.displayName ? JSON.stringify(listing.displayName) : null,
705
- latest_version: version,
706
- created_by: w.actor,
707
- marketplace_id: w.marketplaceId ?? null,
708
- })
709
- .execute();
710
- }
711
- await trx
712
- .insertInto("catalog_item_versions")
713
- .values({
714
- item_id: id,
715
- version,
716
- manifest: JSON.stringify(w.manifest),
717
- source: w.source.source,
718
- source_ref: w.source.ref,
719
- integrity: w.source.integrity ?? null,
720
- source_detail: w.source.detail !== undefined ? JSON.stringify(w.source.detail) : null,
721
- content_digest: w.contentDigest,
722
- object_prefix: w.objectPrefix,
723
- extension_sha256: w.extensionSha256,
724
- files: JSON.stringify(w.files.map(({ path, size, sha256 }) => ({ path, size, sha256 }))),
725
- size: w.size,
726
- imported_by: w.actor,
727
- source_format: w.sourceFormat ?? "capybara",
728
- translation: w.translation != null ? JSON.stringify(w.translation) : null,
729
- license_text: w.licenseText ?? null,
730
- license_truncated: w.licenseTruncated === true,
731
- })
732
- .execute();
733
- await audit(trx, {
734
- ...(w.actor !== null && { actorAccountId: w.actor }),
735
- ...(w.actorTokenId !== undefined && { actorTokenId: w.actorTokenId }),
736
- action: "catalog.imported",
737
- target: id,
738
- detail: {
739
- name,
740
- version,
741
- source: w.source.source,
742
- sourceRef: w.source.ref,
743
- contentDigest: w.contentDigest,
744
- ...(w.extensionSha256 !== null && { sha256: w.extensionSha256 }),
745
- ...(w.source.integrity !== undefined && { integrity: w.source.integrity }),
746
- ...(w.marketplaceId !== undefined && { marketplaceId: w.marketplaceId }),
747
- ...w.auditDetail,
748
- },
749
- });
750
- return id;
751
- }
752
- /**
753
- * An extension name belongs to the npm package that first installed it (`extension_name_owners`,
754
- * Ruling P3): when another package owns it, the import is refused right away with
755
- * `extension.name_conflict` (the same code as at install), instead of failing only at deploy time.
756
- */
757
- export async function assertPluginNameOwner(db, name, packageName) {
758
- const owner = await db
759
- .selectFrom("extension_name_owners")
760
- .select("package_name")
761
- .where("name", "=", name)
762
- .executeTakeFirst();
763
- if (owner && owner.package_name !== packageName) {
764
- throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it`);
765
- }
766
- }
767
- /** "package <name>", or what a plugin without package.json is called in messages. */
768
- const packageLabel = (p) => p === null ? "a plugin without package.json" : `package ${p}`;
769
- /**
770
- * Whether a plugin may add a version to an existing item: the same npm package, or, for an item
771
- * without package.json, the same source ({@link sourceIdentity}: git host, repo and path, so
772
- * unrelated repos that resolve to the same name never merge; or the same marketplace for an
773
- * archive); never a mix of the two.
774
- */
775
- function assertSameSource(item, packageName, source) {
776
- const from = (p, src) => p !== null ? `package ${p}` : (src ?? "a plugin without package.json");
777
- const same = item.package_name !== null
778
- ? item.package_name === packageName
779
- : packageName === null && item.source !== null && item.source === source;
780
- if (!same) {
781
- throw new ApiError("catalog.name_conflict", `A catalog item with this name comes from ${from(item.package_name, item.source)}; ${from(packageName, source)} cannot add versions to it`);
782
- }
783
- }
784
- /**
785
- * For each marketplace-imported item, its marketplace (when enabled): the highest compatible
786
- * version listed, and whether a compatible entry's content changed at an imported version.
787
- */
788
- async function marketplaceLatest(db, config, items, versions) {
789
- const out = new Map();
790
- const sourced = items.filter((i) => typeof i.marketplace_id === "string");
791
- if (sourced.length === 0)
792
- return out;
793
- const rows = await db
794
- .selectFrom("marketplace_entries as e")
795
- .innerJoin("marketplaces as s", "s.id", "e.source_id")
796
- .select([
797
- "e.source_id",
798
- "e.name",
799
- "e.version",
800
- "e.entry",
801
- "e.head_commit",
802
- "e.tree_oid",
803
- "s.builtin",
804
- "s.enabled",
805
- "s.url",
806
- "s.last_commit",
807
- ])
808
- .where("e.source_id", "in", [...new Set(sourced.map((i) => i.marketplace_id))])
809
- .where("e.name", "in", [...new Set(sourced.map((i) => i.name))])
810
- .execute();
811
- for (const i of sourced) {
812
- const listed = rows.filter((r) => r.source_id === i.marketplace_id &&
813
- r.name === i.name &&
814
- sourceEffective(r, config) &&
815
- entryCompatible(r.entry));
816
- const [best] = listed
817
- .filter((r) => r.version !== "")
818
- .map((r) => r.version)
819
- .sort(newestFirst);
820
- const recorded = versions.get(i.id) ?? [];
821
- out.set(i.id, {
822
- latest: best ?? null,
823
- contentChanged: listed.some((r) => entryContentChanged(r.entry, {
824
- marketplaceId: r.source_id,
825
- headCommit: r.head_commit,
826
- treeOid: r.tree_oid,
827
- url: r.url,
828
- lastCommit: r.last_commit,
829
- }, recorded)),
830
- });
831
- }
832
- return out;
833
- }
834
- /** Org install counts per item (see {@link CatalogItemView.installs}). */
835
- async function countInstalls(db, items, versions) {
836
- const orgs = new Map(items.map((i) => [i.id, new Set()]));
837
- const installed = await db
838
- .selectFrom("plugin_installs")
839
- .select(["item_id", "org_id"])
840
- .where("item_id", "in", items.map((i) => i.id))
841
- .where("status", "in", ["installed", "upgrading"])
842
- .execute();
843
- for (const r of installed)
844
- orgs.get(r.item_id)?.add(r.org_id);
845
- const withExtension = items.filter((i) => (versions.get(i.id) ?? []).find((v) => v.version === i.latest_version)?.extension_sha256 !=
846
- null);
847
- if (withExtension.length > 0) {
848
- const enabled = await db
849
- .selectFrom(enabledExtensionsByOrg(db).as("en"))
850
- .select(["en.plugin", "en.org_id"])
851
- .where("en.plugin", "in", withExtension.map((p) => p.name))
852
- .execute();
853
- for (const i of withExtension) {
854
- for (const r of enabled)
855
- if (r.plugin === i.name)
856
- orgs.get(i.id)?.add(r.org_id);
857
- }
858
- }
859
- return new Map([...orgs].map(([id, set]) => [id, set.size]));
860
- }
861
- export function itemView(i, versions, installs = 0, marketplace = { latest: null, contentChanged: false }) {
862
- const sorted = [...versions].sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at ?? null }, { version: b.version, importedAt: b.imported_at ?? null }));
863
- const top = sorted[0]?.version ?? i.latest_version;
864
- const latestMarketplaceVersion = marketplace.latest;
865
- return {
866
- id: i.id,
867
- name: i.name,
868
- publisher: i.publisher,
869
- displayName: i.display_name,
870
- description: i.description,
871
- policy: i.policy,
872
- latestVersion: i.latest_version,
873
- versions: sorted.map((v) => v.version),
874
- installs,
875
- source: versions.find((v) => v.version === i.latest_version)?.source ?? "file",
876
- marketplaceId: i.marketplace_id ?? null,
877
- latestMarketplaceVersion,
878
- newerInMarketplace: latestMarketplaceVersion !== null && compareVersions(latestMarketplaceVersion, top) > 0,
879
- contentChanged: marketplace.contentChanged,
880
- updatedAt: i.updated_at.toISOString(),
881
- };
882
- }
530
+ };
531
+ __decorate([
532
+ Transactional()
533
+ ], CatalogService.prototype, "writePolicy", null);
534
+ __decorate([
535
+ Transactional()
536
+ ], CatalogService.prototype, "writeRemove", null);
537
+ CatalogService = __decorate([
538
+ Injectable(),
539
+ __param(0, Inject(KernelDb)),
540
+ __param(1, Inject(EnterpriseAdminLock)),
541
+ __param(2, Inject(KernelConfigService)),
542
+ __param(3, Inject(ExtensionInstalls)),
543
+ __param(4, Inject(ExtensionAdminOps)),
544
+ __param(5, Inject(PluginImport)),
545
+ __param(6, Inject(MarketplacesService)),
546
+ __param(7, Inject(TransactionHost))
547
+ ], CatalogService);
548
+ export { CatalogService };