@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
@@ -0,0 +1,186 @@
1
+ import type { Connector, ConnectorTemplateSpec, LocalizedName, PluginManifest } from "@capybara-hq/plugin-sdk";
2
+ import type { KernelConfig } from "../config/schema.js";
3
+ import type { KernelSchemaDb, SourceFormat } from "../db/kernel-schema.js";
4
+ import type { StorageService } from "../storage/storage.service.js";
5
+ import type { CatalogItemView, CatalogPolicy, CatalogVersionSource, PermissionsMismatch, SourceDetail } from "./catalog.service.js";
6
+ import type { TranslationReport } from "./claude/report.js";
7
+ import { type ImportedAs } from "./marketplaces.service.js";
8
+ /**
9
+ * The object storage prefix of one import (relative to `deployment/`):
10
+ * `directory/<itemId>/<version>/<importId>/`. Each import gets a new `importId`, so the losing one of
11
+ * two concurrent imports of the same version never overwrites the committed version's files; reads
12
+ * always go through the `object_prefix` stored on the version row. Build metadata's `+` is written
13
+ * as `_` (a `+` in a key can turn into a space through URL query encoding).
14
+ */
15
+ export declare const catalogObjectPrefix: (itemId: string, version: string, importId: string) => string;
16
+ /**
17
+ * Checks a connector template against the loaded connector `c` (problem paths start with `at`): the
18
+ * endpoint matches its `endpointSchema` and carries no credential-like headers / query / URL user
19
+ * info (the same rule as connector installs); every `editableEndpoint` path exists in the endpoint
20
+ * schema.
21
+ */
22
+ export declare function templateProblems(c: Connector, t: ConnectorTemplateSpec, at: string): string[];
23
+ /** Writes the files to `deployment/<prefix><path>` ({@link PUT_CONCURRENCY} at a time). */
24
+ export declare function putCatalogFiles(storage: StorageService, prefix: string, files: {
25
+ path: string;
26
+ size: number;
27
+ data: Uint8Array;
28
+ }[]): Promise<void>;
29
+ /** Compares the marketplace's permission summary with the computed keys ({@link PermissionsMismatch}). */
30
+ export declare function permissionsMismatch(declared: string[] | undefined, actual: string[] | undefined): PermissionsMismatch;
31
+ /** The fields the list shows (the item's publisher / description / displayName). */
32
+ export interface CatalogListing {
33
+ publisher: string;
34
+ description: string;
35
+ displayName: LocalizedName | null;
36
+ }
37
+ /** Input of {@link writeCatalogVersion}. */
38
+ export interface CatalogVersionWrite {
39
+ /** null: the CLI (no account). */
40
+ actor: string | null;
41
+ actorTokenId?: string;
42
+ name: string;
43
+ /** null: a git plugin without package.json. */
44
+ packageName: string | null;
45
+ /**
46
+ * The version recorded (from {@link precheckCatalogImport}: the plugin's own, or with build
47
+ * metadata when that release was imported with other content).
48
+ */
49
+ version: string;
50
+ /** The content digest of the plugin's files. */
51
+ contentDigest: string;
52
+ /** The normalized plugin.json. */
53
+ manifest: PluginManifest;
54
+ listing: CatalogListing;
55
+ /** The id of the item to create when there is none yet (the one the storage prefix used). */
56
+ newItemId: string;
57
+ source: {
58
+ source: CatalogVersionSource;
59
+ ref: string;
60
+ integrity?: string;
61
+ detail?: SourceDetail;
62
+ };
63
+ /** Imported from a marketplace: the item records it. */
64
+ marketplaceId?: string;
65
+ objectPrefix: string | null;
66
+ extensionSha256: string | null;
67
+ files: {
68
+ path: string;
69
+ size: number;
70
+ sha256: string;
71
+ }[];
72
+ size: number;
73
+ /** The format the plugin was read from (default `capybara`). */
74
+ sourceFormat?: SourceFormat;
75
+ /** The translation report of a Claude Code plugin. */
76
+ translation?: TranslationReport | null;
77
+ /** The root LICENSE text. */
78
+ licenseText?: string | null;
79
+ /** The root LICENSE was too long (or not UTF-8) to store. */
80
+ licenseTruncated?: boolean;
81
+ /** Merged into the detail of the `catalog.imported` audit. */
82
+ auditDetail?: Record<string, unknown>;
83
+ }
84
+ /**
85
+ * The identity of a git source, `<host>/<repo>:<path>` (host lower case, no `.git`), or null when
86
+ * the source is not git. An item without package.json is identified by it instead of a package name.
87
+ */
88
+ export declare function gitIdentity(detail: SourceDetail | undefined): string | null;
89
+ /** What is being imported, as far as the version conflict rules need it. */
90
+ export interface ImportIdentity {
91
+ packageName: string | null;
92
+ /** The plugin's own version (plugin.json, else the fallback of spec §5.3). */
93
+ version: string;
94
+ contentDigest: string;
95
+ integrity?: string;
96
+ detail?: SourceDetail;
97
+ marketplaceId?: string;
98
+ }
99
+ type ExistingVersion = {
100
+ version: string;
101
+ content_digest: string | null;
102
+ integrity: string | null;
103
+ };
104
+ /**
105
+ * The version a new import records (Decision 6, spec §5.3): the plugin's own version, unless that
106
+ * release is already imported. A version of the same release (equal but for build metadata) with
107
+ * the same content (digest; for versions without one, the same integrity) -> `catalog.version_exists`
108
+ * "already imported"; other content -> `<version>+git.<sha12>` (git) or `+sha256.<12>` (any other
109
+ * source, the digest's first 12 hex), never overwriting the imported version. A git commit already
110
+ * recorded with other content (a Claude Code plugin whose marketplace entry changed while its own
111
+ * commit did not, see `claudeContentDigest`) falls back to `+sha256.<12>`.
112
+ */
113
+ export declare function recordedVersion(existing: ExistingVersion[], p: ImportIdentity): string;
114
+ /**
115
+ * Conflict precheck before writing (no lock; {@link writeCatalogVersion}'s re-check inside the
116
+ * transaction is final): an item with the same name from another npm package (or, without one,
117
+ * another git source) -> `catalog.name_conflict`; the release already imported with the same
118
+ * content -> `catalog.version_exists`. Returns the existing item (undefined when there is none) and
119
+ * the version to record ({@link recordedVersion}).
120
+ */
121
+ export declare function precheckCatalogImport(db: KernelSchemaDb, name: string, p: ImportIdentity): Promise<{
122
+ existing: {
123
+ id: string;
124
+ } | undefined;
125
+ version: string;
126
+ }>;
127
+ /**
128
+ * Writes a catalog version in the caller's transaction (`db` is its handle; the caller has
129
+ * re-checked the enterprise admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
130
+ * the release with the same content; `version` not taken meanwhile), creates the item when there is
131
+ * none or adds the version (latest and display fields change only for a newer version, a version
132
+ * equal but for build metadata being newer as the later import), and writes the version row (with
133
+ * its content digest) and the `catalog.imported` audit. Returns the item id.
134
+ */
135
+ export declare function writeCatalogVersion(db: KernelSchemaDb, w: CatalogVersionWrite): Promise<string>;
136
+ /**
137
+ * An extension name belongs to the npm package that first installed it (`extension_name_owners`,
138
+ * Ruling P3): when another package owns it, the import is refused right away with
139
+ * `extension.name_conflict` (the same code as at install), instead of failing only at deploy time.
140
+ */
141
+ export declare function assertPluginNameOwner(db: KernelSchemaDb, name: string, packageName: string | null): Promise<void>;
142
+ /** A catalog version as {@link marketplaceLatest} compares it with its marketplace entries. */
143
+ type RecordedVersion = ImportedAs & {
144
+ imported_at?: Date;
145
+ };
146
+ /** What the marketplace says about a marketplace-imported item. */
147
+ export interface MarketplaceStatus {
148
+ /** See {@link CatalogItemView.latestMarketplaceVersion}. */
149
+ latest: string | null;
150
+ /** See {@link CatalogItemView.contentChanged}. */
151
+ contentChanged: boolean;
152
+ }
153
+ /**
154
+ * For each marketplace-imported item, its marketplace (when enabled): the highest compatible
155
+ * version listed, and whether a compatible entry's content changed at an imported version.
156
+ */
157
+ export declare function marketplaceLatest(db: KernelSchemaDb, config: KernelConfig, items: {
158
+ id: string;
159
+ name: string;
160
+ marketplace_id?: string | null;
161
+ }[], versions: ReadonlyMap<string, readonly RecordedVersion[]>): Promise<Map<string, MarketplaceStatus>>;
162
+ /** Org install counts per item (see {@link CatalogItemView.installs}). */
163
+ export declare function countInstalls(db: KernelSchemaDb, items: {
164
+ id: string;
165
+ name: string;
166
+ latest_version: string;
167
+ }[], versions: ReadonlyMap<string, {
168
+ version: string;
169
+ extension_sha256: string | null;
170
+ }[]>): Promise<Map<string, number>>;
171
+ export declare function itemView(i: {
172
+ id: string;
173
+ name: string;
174
+ publisher: string;
175
+ display_name: LocalizedName | null;
176
+ description: string;
177
+ policy: CatalogPolicy;
178
+ latest_version: string;
179
+ marketplace_id?: string | null;
180
+ updated_at: Date;
181
+ }, versions: {
182
+ version: string;
183
+ source: string;
184
+ imported_at?: Date;
185
+ }[], installs?: number, marketplace?: MarketplaceStatus): CatalogItemView;
186
+ export {};
@@ -0,0 +1,410 @@
1
+ import { sql } from "kysely";
2
+ import { ApiError } from "../errors.js";
3
+ import { enabledExtensionsByOrg } from "../extensions/enabled.js";
4
+ import { audit } from "../identity/audit.js";
5
+ import { endpointCredentialIssues } from "../tools/endpoint.js";
6
+ import { gitLocationIdentity } from "./git-source.js";
7
+ import { entryCompatible, entryContentChanged, sourceEffective, } from "./marketplaces.service.js";
8
+ import { schemaHasPath } from "./schema-path.js";
9
+ import { compareVersions, newestFirst, sameRelease, withBuild } from "./versions.js";
10
+ /**
11
+ * The object storage prefix of one import (relative to `deployment/`):
12
+ * `directory/<itemId>/<version>/<importId>/`. Each import gets a new `importId`, so the losing one of
13
+ * two concurrent imports of the same version never overwrites the committed version's files; reads
14
+ * always go through the `object_prefix` stored on the version row. Build metadata's `+` is written
15
+ * as `_` (a `+` in a key can turn into a space through URL query encoding).
16
+ */
17
+ export const catalogObjectPrefix = (itemId, version, importId) => `directory/${itemId}/${version.replace(/\+/g, "_")}/${importId}/`;
18
+ const PUT_CONCURRENCY = 8;
19
+ /**
20
+ * Checks a connector template against the loaded connector `c` (problem paths start with `at`): the
21
+ * endpoint matches its `endpointSchema` and carries no credential-like headers / query / URL user
22
+ * info (the same rule as connector installs); every `editableEndpoint` path exists in the endpoint
23
+ * schema.
24
+ */
25
+ export function templateProblems(c, t, at) {
26
+ const problems = [];
27
+ const r = c.endpointSchema.safeParse(t.endpoint);
28
+ if (!r.success) {
29
+ for (const i of r.error.issues) {
30
+ problems.push(`${[`${at}.endpoint`, ...i.path.map(String)].join(".")}: ${i.message}`);
31
+ }
32
+ }
33
+ else {
34
+ for (const leak of endpointCredentialIssues(r.data)) {
35
+ problems.push(`${at}.${leak.path}: ${leak.message}`);
36
+ }
37
+ }
38
+ for (const p of t.editableEndpoint ?? []) {
39
+ if (!schemaHasPath(c.endpointSchema, p.split("."))) {
40
+ problems.push(`${at}.editableEndpoint "${p}" is not a field of the ${t.connector} connector's endpoint`);
41
+ }
42
+ }
43
+ return problems;
44
+ }
45
+ /** Writes the files to `deployment/<prefix><path>` ({@link PUT_CONCURRENCY} at a time). */
46
+ export async function putCatalogFiles(storage, prefix, files) {
47
+ const store = storage.deployment();
48
+ const queue = [...files];
49
+ await Promise.all(Array.from({ length: Math.min(PUT_CONCURRENCY, queue.length) }, async () => {
50
+ for (let f = queue.shift(); f; f = queue.shift()) {
51
+ await store.put(`${prefix}${f.path}`, f.data, {
52
+ contentType: "application/octet-stream",
53
+ size: f.size,
54
+ });
55
+ }
56
+ }));
57
+ }
58
+ /** Compares the marketplace's permission summary with the computed keys ({@link PermissionsMismatch}). */
59
+ export function permissionsMismatch(declared, actual) {
60
+ if (declared === undefined || actual === undefined)
61
+ return null;
62
+ const want = new Set(declared);
63
+ const have = new Set(actual);
64
+ const missing = [...have].filter((k) => !want.has(k)).sort();
65
+ const extra = [...want].filter((k) => !have.has(k)).sort();
66
+ return missing.length > 0 || extra.length > 0 ? { missing, extra } : null;
67
+ }
68
+ /**
69
+ * The live item of a name, with the source identity of its latest version
70
+ * ({@link sourceIdentity}; null when there is none).
71
+ */
72
+ async function liveItem(db, name) {
73
+ const item = await db
74
+ .selectFrom("catalog_items")
75
+ .select(["id", "package_name", "latest_version", "marketplace_id"])
76
+ .where("name", "=", name)
77
+ .where("deleted_at", "is", null)
78
+ .executeTakeFirst();
79
+ if (!item)
80
+ return undefined;
81
+ const latest = await db
82
+ .selectFrom("catalog_item_versions")
83
+ .select("source_detail")
84
+ .where("item_id", "=", item.id)
85
+ .where("version", "=", item.latest_version)
86
+ .executeTakeFirst();
87
+ return {
88
+ ...item,
89
+ source: sourceIdentity(latest?.source_detail ?? undefined, item.marketplace_id ?? undefined),
90
+ };
91
+ }
92
+ /**
93
+ * The identity of a git source, `<host>/<repo>:<path>` (host lower case, no `.git`), or null when
94
+ * the source is not git. An item without package.json is identified by it instead of a package name.
95
+ */
96
+ export function gitIdentity(detail) {
97
+ if (detail === undefined || !("commit" in detail))
98
+ return null;
99
+ return gitLocationIdentity(detail);
100
+ }
101
+ /**
102
+ * What identifies the source of a plugin without package.json: `git <host>/<repo>:<path>`, or, for
103
+ * a marketplace archive (a skills-only tgz without plugin.json), `marketplace <id>` (the
104
+ * marketplace vouches for its entries; archive URLs change from version to version). null for
105
+ * anything else.
106
+ */
107
+ function sourceIdentity(detail, marketplaceId) {
108
+ const git = gitIdentity(detail);
109
+ if (git !== null)
110
+ return `git ${git}`;
111
+ if (detail !== undefined && "url" in detail && marketplaceId !== undefined) {
112
+ return `marketplace ${marketplaceId}`;
113
+ }
114
+ return null;
115
+ }
116
+ /** The versions of an item, with what tells their content apart. */
117
+ async function itemVersions(db, itemId) {
118
+ return db
119
+ .selectFrom("catalog_item_versions")
120
+ .select(["version", "content_digest", "integrity"])
121
+ .where("item_id", "=", itemId)
122
+ .execute();
123
+ }
124
+ /** `atConfirm`: found under the lock at confirm (another import committed after the review). */
125
+ const versionExists = (version, sameContent, atConfirm = false) => new ApiError("catalog.version_exists", (sameContent
126
+ ? `Version ${version} of this catalog item is already imported with the same content`
127
+ : `Version ${version} of this catalog item has already been imported`) +
128
+ (atConfirm
129
+ ? " (by another import since this one was prepared); prepare the import again"
130
+ : ""));
131
+ /**
132
+ * No version of the release of `p.version` (equal but for build metadata) holds the same content
133
+ * (digest; for a version without one, the same integrity), else `catalog.version_exists`.
134
+ */
135
+ function assertNewContent(existing, p, atConfirm = false) {
136
+ const same = existing.find((v) => sameRelease(v.version, p.version) &&
137
+ (v.content_digest !== null
138
+ ? v.content_digest === p.contentDigest
139
+ : v.integrity !== null && v.integrity === p.integrity));
140
+ if (same)
141
+ throw versionExists(same.version, true, atConfirm);
142
+ }
143
+ /**
144
+ * The version a new import records (Decision 6, spec §5.3): the plugin's own version, unless that
145
+ * release is already imported. A version of the same release (equal but for build metadata) with
146
+ * the same content (digest; for versions without one, the same integrity) -> `catalog.version_exists`
147
+ * "already imported"; other content -> `<version>+git.<sha12>` (git) or `+sha256.<12>` (any other
148
+ * source, the digest's first 12 hex), never overwriting the imported version. A git commit already
149
+ * recorded with other content (a Claude Code plugin whose marketplace entry changed while its own
150
+ * commit did not, see `claudeContentDigest`) falls back to `+sha256.<12>`.
151
+ */
152
+ export function recordedVersion(existing, p) {
153
+ assertNewContent(existing, p);
154
+ if (!existing.some((v) => v.version === p.version))
155
+ return p.version;
156
+ const d = p.detail;
157
+ const byDigest = withBuild(p.version, `sha256.${p.contentDigest.slice(0, 12)}`);
158
+ let next = d !== undefined && "commit" in d
159
+ ? withBuild(p.version, `git.${d.commit.slice(0, 12)}`)
160
+ : byDigest;
161
+ if (existing.some((v) => v.version === next))
162
+ next = byDigest;
163
+ if (existing.some((v) => v.version === next))
164
+ throw versionExists(next, false);
165
+ return next;
166
+ }
167
+ /**
168
+ * Conflict precheck before writing (no lock; {@link writeCatalogVersion}'s re-check inside the
169
+ * transaction is final): an item with the same name from another npm package (or, without one,
170
+ * another git source) -> `catalog.name_conflict`; the release already imported with the same
171
+ * content -> `catalog.version_exists`. Returns the existing item (undefined when there is none) and
172
+ * the version to record ({@link recordedVersion}).
173
+ */
174
+ export async function precheckCatalogImport(db, name, p) {
175
+ const existing = await liveItem(db, name);
176
+ if (!existing)
177
+ return { existing, version: p.version };
178
+ assertSameSource(existing, p.packageName, sourceIdentity(p.detail, p.marketplaceId));
179
+ return { existing, version: recordedVersion(await itemVersions(db, existing.id), p) };
180
+ }
181
+ /**
182
+ * Writes a catalog version in the caller's transaction (`db` is its handle; the caller has
183
+ * re-checked the enterprise admin and holds the name's {@link CatalogItemLock}): checks conflicts again (the same source; no version of
184
+ * the release with the same content; `version` not taken meanwhile), creates the item when there is
185
+ * none or adds the version (latest and display fields change only for a newer version, a version
186
+ * equal but for build metadata being newer as the later import), and writes the version row (with
187
+ * its content digest) and the `catalog.imported` audit. Returns the item id.
188
+ */
189
+ export async function writeCatalogVersion(db, w) {
190
+ const t = db;
191
+ const { name, version, listing } = w;
192
+ const live = await liveItem(t, name);
193
+ let id;
194
+ if (live) {
195
+ id = live.id;
196
+ assertSameSource(live, w.packageName, sourceIdentity(w.source.detail, w.marketplaceId));
197
+ const existing = await itemVersions(t, id);
198
+ // the same content under any version of the release, then the recorded version itself
199
+ assertNewContent(existing, {
200
+ version,
201
+ contentDigest: w.contentDigest,
202
+ ...(w.source.integrity !== undefined && { integrity: w.source.integrity }),
203
+ }, true);
204
+ if (existing.some((v) => v.version === version))
205
+ throw versionExists(version, false, true);
206
+ const newer = compareVersions(version, live.latest_version) >= 0;
207
+ await t
208
+ .updateTable("catalog_items")
209
+ .set({
210
+ updated_at: sql `now()`,
211
+ ...(w.marketplaceId !== undefined && { marketplace_id: w.marketplaceId }),
212
+ ...(newer && {
213
+ latest_version: version,
214
+ publisher: listing.publisher,
215
+ description: listing.description,
216
+ display_name: listing.displayName ? JSON.stringify(listing.displayName) : null,
217
+ }),
218
+ })
219
+ .where("id", "=", id)
220
+ .execute();
221
+ }
222
+ else {
223
+ id = w.newItemId;
224
+ await t
225
+ .insertInto("catalog_items")
226
+ .values({
227
+ id,
228
+ name,
229
+ package_name: w.packageName,
230
+ publisher: listing.publisher,
231
+ description: listing.description,
232
+ display_name: listing.displayName ? JSON.stringify(listing.displayName) : null,
233
+ latest_version: version,
234
+ created_by: w.actor,
235
+ marketplace_id: w.marketplaceId ?? null,
236
+ })
237
+ .execute();
238
+ }
239
+ await t
240
+ .insertInto("catalog_item_versions")
241
+ .values({
242
+ item_id: id,
243
+ version,
244
+ manifest: JSON.stringify(w.manifest),
245
+ source: w.source.source,
246
+ source_ref: w.source.ref,
247
+ integrity: w.source.integrity ?? null,
248
+ source_detail: w.source.detail !== undefined ? JSON.stringify(w.source.detail) : null,
249
+ content_digest: w.contentDigest,
250
+ object_prefix: w.objectPrefix,
251
+ extension_sha256: w.extensionSha256,
252
+ files: JSON.stringify(w.files.map(({ path, size, sha256 }) => ({ path, size, sha256 }))),
253
+ size: w.size,
254
+ imported_by: w.actor,
255
+ source_format: w.sourceFormat ?? "capybara",
256
+ translation: w.translation != null ? JSON.stringify(w.translation) : null,
257
+ license_text: w.licenseText ?? null,
258
+ license_truncated: w.licenseTruncated === true,
259
+ })
260
+ .execute();
261
+ await audit(t, {
262
+ ...(w.actor !== null && { actorAccountId: w.actor }),
263
+ ...(w.actorTokenId !== undefined && { actorTokenId: w.actorTokenId }),
264
+ action: "catalog.imported",
265
+ target: id,
266
+ detail: {
267
+ name,
268
+ version,
269
+ source: w.source.source,
270
+ sourceRef: w.source.ref,
271
+ contentDigest: w.contentDigest,
272
+ ...(w.extensionSha256 !== null && { sha256: w.extensionSha256 }),
273
+ ...(w.source.integrity !== undefined && { integrity: w.source.integrity }),
274
+ ...(w.marketplaceId !== undefined && { marketplaceId: w.marketplaceId }),
275
+ ...w.auditDetail,
276
+ },
277
+ });
278
+ return id;
279
+ }
280
+ /**
281
+ * An extension name belongs to the npm package that first installed it (`extension_name_owners`,
282
+ * Ruling P3): when another package owns it, the import is refused right away with
283
+ * `extension.name_conflict` (the same code as at install), instead of failing only at deploy time.
284
+ */
285
+ export async function assertPluginNameOwner(db, name, packageName) {
286
+ const owner = await db
287
+ .selectFrom("extension_name_owners")
288
+ .select("package_name")
289
+ .where("name", "=", name)
290
+ .executeTakeFirst();
291
+ if (owner && owner.package_name !== packageName) {
292
+ throw new ApiError("extension.name_conflict", `Extension name ${name} belongs to package ${owner.package_name}; ${packageLabel(packageName)} cannot use it`);
293
+ }
294
+ }
295
+ /** "package <name>", or what a plugin without package.json is called in messages. */
296
+ const packageLabel = (p) => p === null ? "a plugin without package.json" : `package ${p}`;
297
+ /**
298
+ * Whether a plugin may add a version to an existing item: the same npm package, or, for an item
299
+ * without package.json, the same source ({@link sourceIdentity}: git host, repo and path, so
300
+ * unrelated repos that resolve to the same name never merge; or the same marketplace for an
301
+ * archive); never a mix of the two.
302
+ */
303
+ function assertSameSource(item, packageName, source) {
304
+ const from = (p, src) => p !== null ? `package ${p}` : (src ?? "a plugin without package.json");
305
+ const same = item.package_name !== null
306
+ ? item.package_name === packageName
307
+ : packageName === null && item.source !== null && item.source === source;
308
+ if (!same) {
309
+ 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`);
310
+ }
311
+ }
312
+ /**
313
+ * For each marketplace-imported item, its marketplace (when enabled): the highest compatible
314
+ * version listed, and whether a compatible entry's content changed at an imported version.
315
+ */
316
+ export async function marketplaceLatest(db, config, items, versions) {
317
+ const out = new Map();
318
+ const sourced = items.filter((i) => typeof i.marketplace_id === "string");
319
+ if (sourced.length === 0)
320
+ return out;
321
+ const rows = await db
322
+ .selectFrom("marketplace_entries as e")
323
+ .innerJoin("marketplaces as s", "s.id", "e.source_id")
324
+ .select([
325
+ "e.source_id",
326
+ "e.name",
327
+ "e.version",
328
+ "e.entry",
329
+ "e.head_commit",
330
+ "e.tree_oid",
331
+ "s.builtin",
332
+ "s.enabled",
333
+ "s.url",
334
+ "s.last_commit",
335
+ ])
336
+ .where("e.source_id", "in", [...new Set(sourced.map((i) => i.marketplace_id))])
337
+ .where("e.name", "in", [...new Set(sourced.map((i) => i.name))])
338
+ .execute();
339
+ for (const i of sourced) {
340
+ const listed = rows.filter((r) => r.source_id === i.marketplace_id &&
341
+ r.name === i.name &&
342
+ sourceEffective(r, config) &&
343
+ entryCompatible(r.entry));
344
+ const [best] = listed
345
+ .filter((r) => r.version !== "")
346
+ .map((r) => r.version)
347
+ .sort(newestFirst);
348
+ const recorded = versions.get(i.id) ?? [];
349
+ out.set(i.id, {
350
+ latest: best ?? null,
351
+ contentChanged: listed.some((r) => entryContentChanged(r.entry, {
352
+ marketplaceId: r.source_id,
353
+ headCommit: r.head_commit,
354
+ treeOid: r.tree_oid,
355
+ url: r.url,
356
+ lastCommit: r.last_commit,
357
+ }, recorded)),
358
+ });
359
+ }
360
+ return out;
361
+ }
362
+ /** Org install counts per item (see {@link CatalogItemView.installs}). */
363
+ export async function countInstalls(db, items, versions) {
364
+ const orgs = new Map(items.map((i) => [i.id, new Set()]));
365
+ const installed = await db
366
+ .selectFrom("plugin_installs")
367
+ .select(["item_id", "org_id"])
368
+ .where("item_id", "in", items.map((i) => i.id))
369
+ .where("status", "in", ["installed", "upgrading"])
370
+ .execute();
371
+ for (const r of installed)
372
+ orgs.get(r.item_id)?.add(r.org_id);
373
+ const withExtension = items.filter((i) => (versions.get(i.id) ?? []).find((v) => v.version === i.latest_version)?.extension_sha256 !=
374
+ null);
375
+ if (withExtension.length > 0) {
376
+ const enabled = await db
377
+ .selectFrom(enabledExtensionsByOrg(db).as("en"))
378
+ .select(["en.plugin", "en.org_id"])
379
+ .where("en.plugin", "in", withExtension.map((p) => p.name))
380
+ .execute();
381
+ for (const i of withExtension) {
382
+ for (const r of enabled)
383
+ if (r.plugin === i.name)
384
+ orgs.get(i.id)?.add(r.org_id);
385
+ }
386
+ }
387
+ return new Map([...orgs].map(([id, set]) => [id, set.size]));
388
+ }
389
+ export function itemView(i, versions, installs = 0, marketplace = { latest: null, contentChanged: false }) {
390
+ const sorted = [...versions].sort((a, b) => newestFirst({ version: a.version, importedAt: a.imported_at ?? null }, { version: b.version, importedAt: b.imported_at ?? null }));
391
+ const top = sorted[0]?.version ?? i.latest_version;
392
+ const latestMarketplaceVersion = marketplace.latest;
393
+ return {
394
+ id: i.id,
395
+ name: i.name,
396
+ publisher: i.publisher,
397
+ displayName: i.display_name,
398
+ description: i.description,
399
+ policy: i.policy,
400
+ latestVersion: i.latest_version,
401
+ versions: sorted.map((v) => v.version),
402
+ installs,
403
+ source: versions.find((v) => v.version === i.latest_version)?.source ?? "file",
404
+ marketplaceId: i.marketplace_id ?? null,
405
+ latestMarketplaceVersion,
406
+ newerInMarketplace: latestMarketplaceVersion !== null && compareVersions(latestMarketplaceVersion, top) > 0,
407
+ contentChanged: marketplace.contentChanged,
408
+ updatedAt: i.updated_at.toISOString(),
409
+ };
410
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The enterprise side of the catalog: marketplaces, the one import review (prepare -> confirm) and
3
+ * the items with their policy. The CLI's `capybara plugins *` and `capybara bootstrap` run on this
4
+ * part alone.
5
+ */
6
+ export declare class CatalogImportModule {
7
+ }
8
+ /**
9
+ * The plugin catalog (spec §4, §10): {@link CatalogImportModule}, catalog requests, and org installs,
10
+ * upgrades and rollbacks with their dependencies. The catalog's periodic jobs (`CatalogJobs`) are
11
+ * the worker role's (`WorkerModule`).
12
+ */
13
+ export declare class CatalogModule {
14
+ }
@@ -0,0 +1,71 @@
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
+ import { Module } from "@nestjs/common";
8
+ import { ExtensionsModule } from "../extensions/extensions.module.js";
9
+ import { EnterpriseAdminLockModule } from "../identity/enterprise-admin.js";
10
+ import { OrgLockModule } from "../orgs/org-lock.js";
11
+ import { SkillsModule } from "../skills/skills.module.js";
12
+ import { StorageModule } from "../storage/storage.module.js";
13
+ import { ToolsModule } from "../tools/tools.module.js";
14
+ import { CatalogService } from "./catalog.service.js";
15
+ import { CatalogItemLock, CatalogSourceLock } from "./locks.js";
16
+ import { MarketplacesService } from "./marketplaces.service.js";
17
+ import { OrgCatalogService } from "./org-catalog.service.js";
18
+ import { PluginImport } from "./plugin-import.js";
19
+ import { PluginInstaller } from "./plugin-install.js";
20
+ import { PluginUpgrader } from "./plugin-upgrade.js";
21
+ import { CatalogRequestsService } from "./requests.service.js";
22
+ /**
23
+ * The enterprise side of the catalog: marketplaces, the one import review (prepare -> confirm) and
24
+ * the items with their policy. The CLI's `capybara plugins *` and `capybara bootstrap` run on this
25
+ * part alone.
26
+ */
27
+ let CatalogImportModule = class CatalogImportModule {
28
+ };
29
+ CatalogImportModule = __decorate([
30
+ Module({
31
+ imports: [ExtensionsModule, EnterpriseAdminLockModule, StorageModule],
32
+ providers: [
33
+ CatalogSourceLock,
34
+ CatalogItemLock,
35
+ MarketplacesService,
36
+ PluginImport,
37
+ CatalogService,
38
+ ],
39
+ exports: [MarketplacesService, PluginImport, CatalogService],
40
+ })
41
+ ], CatalogImportModule);
42
+ export { CatalogImportModule };
43
+ /**
44
+ * The plugin catalog (spec §4, §10): {@link CatalogImportModule}, catalog requests, and org installs,
45
+ * upgrades and rollbacks with their dependencies. The catalog's periodic jobs (`CatalogJobs`) are
46
+ * the worker role's (`WorkerModule`).
47
+ */
48
+ let CatalogModule = class CatalogModule {
49
+ };
50
+ CatalogModule = __decorate([
51
+ Module({
52
+ imports: [
53
+ CatalogImportModule,
54
+ ExtensionsModule,
55
+ EnterpriseAdminLockModule,
56
+ OrgLockModule,
57
+ StorageModule,
58
+ SkillsModule,
59
+ ToolsModule,
60
+ ],
61
+ providers: [CatalogRequestsService, PluginInstaller, PluginUpgrader, OrgCatalogService],
62
+ exports: [
63
+ CatalogImportModule,
64
+ CatalogRequestsService,
65
+ PluginInstaller,
66
+ PluginUpgrader,
67
+ OrgCatalogService,
68
+ ],
69
+ })
70
+ ], CatalogModule);
71
+ export { CatalogModule };