@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,20 +1,38 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
1
10
  import { createHash } from "node:crypto";
2
11
  import { readdir, readFile, stat } from "node:fs/promises";
3
12
  import { join } from "node:path";
4
13
  import { fileURLToPath } from "node:url";
5
14
  import { parseBootstrapManifest, SDK_VERSION, } from "@capybara-hq/plugin-sdk";
15
+ import { Inject, Injectable, Optional } from "@nestjs/common";
6
16
  import { sql } from "kysely";
7
- import pg from "pg";
8
17
  import semver from "semver";
9
18
  import { catalogPackageError } from "../catalog/plugin-import.js";
10
19
  import { PluginPackageError, readPluginPackage } from "../catalog/plugin-package.js";
11
- import { pgConnectOptions } from "../db/pool.js";
12
20
  import { ApiError } from "../errors.js";
13
21
  import { audit } from "../identity/audit.js";
22
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
23
+ import { KernelDb } from "../infra/database/kernel-db.js";
24
+ import { TransactionHost } from "../infra/database/transaction-host.js";
25
+ import { Transactional } from "../infra/database/transactional.decorator.js";
26
+ import { LockService } from "../infra/lock/lock.service.js";
27
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
14
28
  import { fetchNpmPackage, IntegrityMismatchError, NpmFetchError, PackageTooLargeError, } from "../packages/npm.js";
29
+ import { ExtensionAdminOps } from "./admin-ops.js";
15
30
  import { writeSnapshot } from "./approvals.js";
31
+ import { ExtensionInstalls } from "./installs.js";
32
+ import { PluginApproveLock } from "./locks.js";
16
33
  import { ExtensionPackageError, permissionSetOfPackage, readExtensionPackage } from "./package.js";
17
34
  import { diffPermissions } from "./permission-set.js";
35
+ import { ExtensionRegistry } from "./registry.js";
18
36
  /**
19
37
  * The bootstrap step (package ecosystem spec §7, startup bootstrap spec): installs the plugins
20
38
  * pinned by the bootstrap manifest (`packages/kernel/bootstrap.json`). It replaced the builtin
@@ -30,15 +48,14 @@ import { diffPermissions } from "./permission-set.js";
30
48
  * download `bootstrap.download_failed`, a download that differs from the pin
31
49
  * `bootstrap.integrity_mismatch` (all name the plugin), and then nothing is written. Downloading
32
50
  * inside the lock means a fleet starting together downloads once.
33
- * - The whole run holds the session advisory lock `capybara.bootstrap` on a connection of its own
34
- * (taken with `pg_try_advisory_lock` in a backoff loop that observes the signal, and closed
35
- * afterwards, so the lock never outlives the run): when several replicas start together only one
36
- * runs it; the others wait, then find it done. "Done" is a `bootstrap_runs` row for the
51
+ * - The whole run holds the Redis lock `lock:bootstrap` (`LockService`, decision R5 of the Nest
52
+ * kernel spec: TTL {@link BOOTSTRAP_LOCK_TTL_MS}, renewed every third of it, so a run longer than the TTL keeps
53
+ * it and a crashed holder's lock expires within it), taken by an unbounded wait that observes
54
+ * the signal: when several replicas (or `capybara bootstrap` and a starting kernel) run it
55
+ * together only one runs it; the others wait, then find it done. A lost lock (renewal failed
56
+ * until expiry) aborts the run at its next step. "Done" is a `bootstrap_runs` row for the
37
57
  * manifest's sha256 (written with the audit `bootstrap.completed` only when every entry
38
- * succeeded; otherwise the next start runs it again, which is idempotent). A lock connection
39
- * that drops mid-run is not detected (its errors are swallowed) and the run goes on without the
40
- * lock, so a second replica could run concurrently: accepted, since a concurrent import or
41
- * install degrades to `catalog.version_exists` and a deploy from the package store.
58
+ * succeeded; otherwise the next start runs it again, which is idempotent).
42
59
  * - Only entries new to the manifest are installed (Ruling 5): an optional entry that the last
43
60
  * completed run already handled and that is not installed now (an enterprise admin uninstalled
44
61
  * it) stays uninstalled -> `kept`. A required entry is always installed.
@@ -197,16 +214,54 @@ async function scanOfflineDir(dir, maxBytes, log) {
197
214
  }
198
215
  return out;
199
216
  }
200
- /** The advisory lock around a whole run. */
201
- const LOCK_KEY = "capybara.bootstrap";
202
- export class BootstrapService {
203
- d;
204
- constructor(d) {
205
- this.d = d;
217
+ /** The lock around a whole run (`lock:bootstrap`). */
218
+ export const BOOTSTRAP_LOCK_KEY = "bootstrap";
219
+ /** Its lifetime without renewal; a run keeps it by renewal, a crashed holder's expires. */
220
+ export const BOOTSTRAP_LOCK_TTL_MS = 120_000;
221
+ /** Optional provider: the lock's lifetime (ms) instead of {@link BOOTSTRAP_LOCK_TTL_MS} (tests shorten it). */
222
+ export const BOOTSTRAP_LOCK_TTL = Symbol("BOOTSTRAP_LOCK_TTL");
223
+ /** The pause between attempts while another holder runs the step. */
224
+ const LOCK_RETRY_MS = 500;
225
+ let BootstrapService = class BootstrapService {
226
+ kdb;
227
+ txHost;
228
+ locks;
229
+ approveLock;
230
+ installs;
231
+ ops;
232
+ registry;
233
+ configService;
234
+ log;
235
+ lockTtlMs;
236
+ constructor(kdb, txHost, locks, approveLock, installs, ops,
237
+ /**
238
+ * Config-declared extension names (an entry of the same name is kept, config wins, and no
239
+ * install record is created): the start sequence records them before the bootstrap step, the
240
+ * CLI from its inspection.
241
+ */
242
+ registry, configService, log,
243
+ /** The lock's lifetime without renewal. */
244
+ lockTtlMs = BOOTSTRAP_LOCK_TTL_MS) {
245
+ this.kdb = kdb;
246
+ this.txHost = txHost;
247
+ this.locks = locks;
248
+ this.approveLock = approveLock;
249
+ this.installs = installs;
250
+ this.ops = ops;
251
+ this.registry = registry;
252
+ this.configService = configService;
253
+ this.log = log;
254
+ this.lockTtlMs = lockTtlMs;
255
+ }
256
+ get db() {
257
+ return this.kdb.db;
258
+ }
259
+ config() {
260
+ return this.configService.get();
206
261
  }
207
262
  /** Whether the bootstrap step completed for the manifest with this sha256. */
208
263
  async isDone(manifestSha256) {
209
- const row = await this.d.db
264
+ const row = await this.db
210
265
  .selectFrom("bootstrap_runs")
211
266
  .select("manifest_sha256")
212
267
  .where("manifest_sha256", "=", manifestSha256)
@@ -223,7 +278,7 @@ export class BootstrapService {
223
278
  async run(o) {
224
279
  const manifestSha256 = bootstrapManifestSha256(o.manifest);
225
280
  const recorded = async () => {
226
- const done = await this.d.db
281
+ const done = await this.db
227
282
  .selectFrom("bootstrap_runs")
228
283
  .select("results")
229
284
  .where("manifest_sha256", "=", manifestSha256)
@@ -234,7 +289,7 @@ export class BootstrapService {
234
289
  const before = await recorded();
235
290
  if (before)
236
291
  return before;
237
- return this.locked(o.signal, async () => {
292
+ return this.locked(o.signal, async (signal) => {
238
293
  // Another replica may have finished it while this one waited for the lock
239
294
  const done = await recorded();
240
295
  if (done)
@@ -242,21 +297,21 @@ export class BootstrapService {
242
297
  // Every package is obtained and checked before the first write
243
298
  const files = await resolveBootstrapPackages(o.manifest, {
244
299
  ...(o.dir !== undefined && { dir: o.dir }),
245
- config: this.d.config(),
246
- ...(o.signal !== undefined && { signal: o.signal }),
247
- log: this.d.log,
300
+ config: this.config(),
301
+ signal,
302
+ log: this.log,
248
303
  });
249
304
  const handled = await this.lastRunNames();
250
305
  const results = [];
251
306
  const failures = [];
252
307
  for (const e of o.manifest.plugins) {
253
- o.signal?.throwIfAborted();
308
+ signal.throwIfAborted();
254
309
  try {
255
- const r = await this.entry(e, files.get(e.name), handled);
310
+ const r = await this.entry(e, files.get(e.name), handled, o.imports);
256
311
  results.push(carried(r, o.carry));
257
312
  }
258
313
  catch (err) {
259
- this.d.log.error("bootstrap: a plugin could not be installed", {
314
+ this.log.error("bootstrap: a plugin could not be installed", {
260
315
  plugin: e.name,
261
316
  version: e.version,
262
317
  required: e.required,
@@ -273,63 +328,53 @@ export class BootstrapService {
273
328
  results.push(...(await this.clearRemoved(o.manifest)));
274
329
  if (failures.length > 0)
275
330
  throw new BootstrapFailedError(failures, results);
276
- await this.d.db.transaction().execute(async (trx) => {
277
- await trx
278
- .insertInto("bootstrap_runs")
279
- .values({
280
- manifest_sha256: manifestSha256,
281
- completed_at: sql `now()`,
282
- results: JSON.stringify(results),
283
- })
284
- .execute();
285
- await audit(trx, {
286
- action: "bootstrap.completed",
287
- target: manifestSha256,
288
- detail: { manifestSha256, results },
289
- });
290
- });
291
- this.d.log.info("bootstrap completed", { manifestSha256, results });
331
+ signal.throwIfAborted();
332
+ await this.recordDone(manifestSha256, results);
333
+ this.log.info("bootstrap completed", { manifestSha256, results });
292
334
  return { manifestSha256, results };
293
335
  });
294
336
  }
337
+ /** The `bootstrap_runs` row and the `bootstrap.completed` audit, in one transaction. */
338
+ async recordDone(manifestSha256, results) {
339
+ await this.db
340
+ .insertInto("bootstrap_runs")
341
+ .values({
342
+ manifest_sha256: manifestSha256,
343
+ completed_at: sql `now()`,
344
+ results: JSON.stringify(results),
345
+ })
346
+ .execute();
347
+ await audit(this.db, {
348
+ action: "bootstrap.completed",
349
+ target: manifestSha256,
350
+ detail: { manifestSha256, results },
351
+ });
352
+ }
295
353
  /**
296
- * Runs `fn` holding the session advisory lock on a connection of its own: `pg_try_advisory_lock`
297
- * retried with a backoff (100 ms doubling to 1 s) that stops when `signal` aborts. The connection
298
- * is closed afterwards in every case, which releases the lock even when the unlock failed.
354
+ * Runs `fn` holding `lock:bootstrap`: waits without bound while another replica holds it
355
+ * (until `signal` aborts), renews it while `fn` runs and releases it afterwards. `fn` gets a
356
+ * signal that also aborts when the lock is lost.
299
357
  */
300
358
  async locked(signal, fn) {
301
- const client = new pg.Client({
302
- connectionString: this.d.dbUrl,
303
- ...pgConnectOptions({ connectTimeoutMs: this.d.connectTimeoutMs }),
359
+ const handle = await this.locks.acquire(BOOTSTRAP_LOCK_KEY, {
360
+ ttlMs: this.lockTtlMs,
361
+ waitMs: Number.POSITIVE_INFINITY,
362
+ retryMs: LOCK_RETRY_MS,
363
+ ...(signal !== undefined && { signal }),
304
364
  });
305
- client.on("error", () => { });
365
+ // An unbounded wait returns a handle or throws the abort reason
366
+ if (!handle)
367
+ throw new Error("bootstrap: the lock could not be taken");
306
368
  try {
307
- await client.connect();
308
- for (let wait = 100;; wait = Math.min(wait * 2, 1_000)) {
309
- signal?.throwIfAborted();
310
- const r = await client.query("SELECT pg_try_advisory_lock(hashtext($1)) AS ok", [LOCK_KEY]);
311
- if (r.rows[0]?.ok === true)
312
- break;
313
- await sleep(wait, signal);
314
- }
315
- try {
316
- return await fn();
317
- }
318
- finally {
319
- await client
320
- .query("SELECT pg_advisory_unlock(hashtext($1))", [LOCK_KEY])
321
- .catch((err) => this.d.log.warn("bootstrap: cannot release the advisory lock; closing its connection", {
322
- err,
323
- }));
324
- }
369
+ return await fn(signal ? AbortSignal.any([signal, handle.lost]) : handle.lost);
325
370
  }
326
371
  finally {
327
- await client.end().catch(() => { });
372
+ await handle.release();
328
373
  }
329
374
  }
330
375
  /** The entry names the last completed run handled (undefined before any run completed). */
331
376
  async lastRunNames() {
332
- const row = await this.d.db
377
+ const row = await this.db
333
378
  .selectFrom("bootstrap_runs")
334
379
  .select("results")
335
380
  .orderBy("completed_at", "desc")
@@ -341,9 +386,9 @@ export class BootstrapService {
341
386
  .filter((r) => r.action !== "required_cleared")
342
387
  .map((r) => r.name));
343
388
  }
344
- async entry(e, bytes, handled) {
389
+ async entry(e, bytes, handled, imports) {
345
390
  const pkg = await readPluginPackage(bytes, {
346
- maxBytes: this.d.config().packages.maxBytes,
391
+ maxBytes: this.config().packages.maxBytes,
347
392
  hostSdkVersion: SDK_VERSION,
348
393
  }).catch((err) => {
349
394
  throw err instanceof PluginPackageError ? catalogPackageError(err) : err;
@@ -357,32 +402,32 @@ export class BootstrapService {
357
402
  if (!pkg.manifest.extension) {
358
403
  if (!isNew)
359
404
  return { name: e.name, action: "kept", version: e.version };
360
- const imported = await this.importOnly(e, bytes, ref);
405
+ const imported = await this.importOnly(e, bytes, ref, imports);
361
406
  return { name: e.name, action: imported ? "imported" : "kept", version: e.version };
362
407
  }
363
- if (this.d.declared?.().has(e.name)) {
364
- this.d.log.warn("bootstrap: the plugin is declared in the extensions config list; the config plugin is used", { plugin: e.name });
408
+ if (this.registry.declared().has(e.name)) {
409
+ this.log.warn("bootstrap: the plugin is declared in the extensions config list; the config plugin is used", { plugin: e.name });
365
410
  return { name: e.name, action: "kept", version: e.version };
366
411
  }
367
- const row = await this.d.db
412
+ const row = await this.db
368
413
  .selectFrom("extension_installs")
369
414
  .select(["version", "source", "required", "desired_state", "sha256"])
370
415
  .where("name", "=", e.name)
371
416
  .executeTakeFirst();
372
417
  if (!row && !isNew && !e.required) {
373
- this.d.log.info("bootstrap: an optional plugin that is not installed stays uninstalled", {
418
+ this.log.info("bootstrap: an optional plugin that is not installed stays uninstalled", {
374
419
  plugin: e.name,
375
420
  });
376
421
  return { name: e.name, action: "kept", version: e.version };
377
422
  }
378
423
  let result;
379
424
  if (!row) {
380
- await this.deploy(e, bytes, ref, true);
425
+ await this.deploy(e, bytes, ref, true, imports);
381
426
  result = { name: e.name, action: "installed", version: e.version };
382
427
  }
383
428
  else if (row.source === "bootstrap" && isLower(row.version, e.version)) {
384
429
  // The desired state the admin chose is kept; a required plugin is enabled below anyway
385
- await this.deploy(e, bytes, ref, row.desired_state === "enabled");
430
+ await this.deploy(e, bytes, ref, row.desired_state === "enabled", imports);
386
431
  result = { name: e.name, action: "upgraded", version: e.version };
387
432
  }
388
433
  else {
@@ -391,12 +436,12 @@ export class BootstrapService {
391
436
  row.sha256 !== createHash("sha256").update(bytes).digest("hex")) {
392
437
  // The pin changed bytes without a version bump (an image built from main between
393
438
  // releases): the installed package stays, so say so instead of keeping it silently
394
- this.d.log.warn("bootstrap: the image's package differs from the installed one at the same version; the installed package is kept (bump the version to roll it out)", { plugin: e.name, version: e.version });
439
+ this.log.warn("bootstrap: the image's package differs from the installed one at the same version; the installed package is kept (bump the version to roll it out)", { plugin: e.name, version: e.version });
395
440
  }
396
441
  result = { name: e.name, action: "kept", version: row.version };
397
442
  }
398
443
  if (row?.required !== e.required) {
399
- await this.d.db
444
+ await this.db
400
445
  .updateTable("extension_installs")
401
446
  .set({ required: e.required })
402
447
  .where("name", "=", e.name)
@@ -404,19 +449,19 @@ export class BootstrapService {
404
449
  }
405
450
  // A required install must run on the deployment (an org cannot use it otherwise)
406
451
  if (e.required && row?.desired_state === "disabled") {
407
- await this.d.ops.enable(e.name, null);
452
+ await this.ops.enable(e.name, null);
408
453
  }
409
454
  return result;
410
455
  }
411
456
  /** A declarative plugin: catalog only. Returns false when that version is already imported. */
412
- async importOnly(e, bytes, ref) {
457
+ async importOnly(e, bytes, ref, imports) {
413
458
  try {
414
- const { stagingId, review } = await this.d.imports.prepare(null, bytes, {
459
+ const { stagingId, review } = await imports.prepare(null, bytes, {
415
460
  kind: "bootstrap",
416
461
  ref,
417
462
  integrity: e.integrity,
418
463
  });
419
- await this.d.imports.confirm(null, stagingId, {
464
+ await imports.confirm(null, stagingId, {
420
465
  reviewHash: review.reviewHash,
421
466
  deployExtension: false,
422
467
  });
@@ -433,10 +478,10 @@ export class BootstrapService {
433
478
  * the catalog already has this version (an earlier run stopped after importing, or the same
434
479
  * package came from a marketplace), the extension is deployed from the package store instead.
435
480
  */
436
- async deploy(e, bytes, ref, enable) {
481
+ async deploy(e, bytes, ref, enable, imports) {
437
482
  let staged;
438
483
  try {
439
- staged = await this.d.imports.prepare(null, bytes, {
484
+ staged = await imports.prepare(null, bytes, {
440
485
  kind: "bootstrap",
441
486
  ref,
442
487
  integrity: e.integrity,
@@ -449,7 +494,7 @@ export class BootstrapService {
449
494
  }
450
495
  throw err;
451
496
  }
452
- const r = await this.d.imports.confirm(null, staged.stagingId, {
497
+ const r = await imports.confirm(null, staged.stagingId, {
453
498
  reviewHash: staged.review.reviewHash,
454
499
  deployExtension: true,
455
500
  enable,
@@ -460,45 +505,47 @@ export class BootstrapService {
460
505
  }
461
506
  /** The extension of a catalog version already imported: ingest, approve, install (, enable). */
462
507
  async deployFromStore(e, bytes, ref, enable) {
463
- const review = await this.d.installs.ingest(null, bytes, { source: "bootstrap", ref }, { store: "pg" });
508
+ const review = await this.installs.ingest(null, bytes, { source: "bootstrap", ref }, { store: "pg" });
464
509
  let set;
465
510
  try {
466
511
  set = permissionSetOfPackage(await readExtensionPackage(bytes, {
467
- maxBytes: this.d.config().packages.maxBytes,
512
+ maxBytes: this.config().packages.maxBytes,
468
513
  hostSdkVersion: SDK_VERSION,
469
514
  }));
470
515
  }
471
516
  catch (err) {
472
517
  throw err instanceof ExtensionPackageError ? catalogPackageError(err) : err;
473
518
  }
474
- await this.d.db.transaction().execute(async (trx) => {
475
- await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.plugin-approve:${e.name}`}))`.execute(trx);
476
- const snap = await trx
477
- .selectFrom("extension_permission_snapshots")
478
- .select("permissions")
479
- .where("plugin", "=", e.name)
480
- .forUpdate()
481
- .executeTakeFirst();
482
- const { added, removed } = diffPermissions(snap?.permissions, set);
483
- await writeSnapshot(trx, e.name, e.version, set, {
484
- source: "bootstrap",
485
- audit: { added, removed, sha256: review.sha256 },
486
- });
487
- });
488
- const item = await this.d.db
519
+ await this.approveStored(e, set, review.sha256);
520
+ const item = await this.db
489
521
  .selectFrom("catalog_items")
490
522
  .select("id")
491
523
  .where("name", "=", e.name)
492
524
  .where("deleted_at", "is", null)
493
525
  .executeTakeFirst();
494
- await this.d.ops.install(e.name, review.sha256, null, undefined, item ? { catalogItemId: item.id } : {});
526
+ await this.ops.install(e.name, review.sha256, null, undefined, item ? { catalogItemId: item.id } : {});
495
527
  if (enable)
496
- await this.d.ops.enable(e.name, null);
528
+ await this.ops.enable(e.name, null);
529
+ }
530
+ /** The permission snapshot of a stored package (source `bootstrap`), under the approve lock. */
531
+ async approveStored(e, set, sha256) {
532
+ await this.approveLock.lock(e.name);
533
+ const snap = await this.db
534
+ .selectFrom("extension_permission_snapshots")
535
+ .select("permissions")
536
+ .where("plugin", "=", e.name)
537
+ .forUpdate()
538
+ .executeTakeFirst();
539
+ const { added, removed } = diffPermissions(snap?.permissions, set);
540
+ await writeSnapshot(this.db, e.name, e.version, set, {
541
+ source: "bootstrap",
542
+ audit: { added, removed, sha256 },
543
+ });
497
544
  }
498
545
  /** Install records still `required` whose entry left the manifest lose `required`. */
499
546
  async clearRemoved(manifest) {
500
547
  const names = manifest.plugins.map((p) => p.name);
501
- let q = this.d.db
548
+ let q = this.db
502
549
  .updateTable("extension_installs")
503
550
  .set({ required: false })
504
551
  .where("required", "=", true);
@@ -507,7 +554,28 @@ export class BootstrapService {
507
554
  const rows = await q.returning(["name", "version"]).execute();
508
555
  return rows.map((r) => ({ name: r.name, action: "required_cleared", version: r.version }));
509
556
  }
510
- }
557
+ };
558
+ __decorate([
559
+ Transactional()
560
+ ], BootstrapService.prototype, "recordDone", null);
561
+ __decorate([
562
+ Transactional()
563
+ ], BootstrapService.prototype, "approveStored", null);
564
+ BootstrapService = __decorate([
565
+ Injectable(),
566
+ __param(0, Inject(KernelDb)),
567
+ __param(1, Inject(TransactionHost)),
568
+ __param(2, Inject(LockService)),
569
+ __param(3, Inject(PluginApproveLock)),
570
+ __param(4, Inject(ExtensionInstalls)),
571
+ __param(5, Inject(ExtensionAdminOps)),
572
+ __param(6, Inject(ExtensionRegistry)),
573
+ __param(7, Inject(KernelConfigService)),
574
+ __param(8, Inject(KERNEL_LOGGER)),
575
+ __param(9, Optional()),
576
+ __param(9, Inject(BOOTSTRAP_LOCK_TTL))
577
+ ], BootstrapService);
578
+ export { BootstrapService };
511
579
  /** A `kept` result whose entry an earlier pass of the same start installed / upgraded / imported. */
512
580
  function carried(r, carry) {
513
581
  if (r.action !== "kept")
@@ -517,19 +585,5 @@ function carried(r, carry) {
517
585
  ? before
518
586
  : r;
519
587
  }
520
- /** Resolves after `ms`; rejects with the abort reason when `signal` aborts first. */
521
- function sleep(ms, signal) {
522
- return new Promise((resolve, reject) => {
523
- const onAbort = () => {
524
- clearTimeout(timer);
525
- reject(signal?.reason);
526
- };
527
- const timer = setTimeout(() => {
528
- signal?.removeEventListener("abort", onAbort);
529
- resolve();
530
- }, ms);
531
- signal?.addEventListener("abort", onAbort, { once: true });
532
- });
533
- }
534
588
  /** `installed` is below `pinned` (a version that is not semver is never upgraded). */
535
589
  const isLower = (installed, pinned) => semver.valid(installed) !== null && semver.valid(pinned) !== null && semver.lt(installed, pinned);
@@ -1,18 +1,23 @@
1
+ import type { DynamicModule, INestApplicationContext, Type } from "@nestjs/common";
1
2
  import type { z } from "zod";
2
3
  import type { KernelConfig } from "../config/schema.js";
3
- import { type KernelDb } from "../db/kernel-schema.js";
4
4
  import type { KernelLogger } from "../log.js";
5
5
  import { ExtensionAdminOps } from "./admin-ops.js";
6
6
  import { ExtensionAdmin } from "./admin-view.js";
7
7
  import { ExtensionApprovals } from "./approvals.js";
8
- import { type ConfigIssue } from "./deployment-config.js";
8
+ import { BootstrapService } from "./bootstrap.js";
9
+ import { type ConfigIssue } from "./config-issues.js";
9
10
  import { type InspectedExtension } from "./host.js";
10
11
  import { ExtensionInstalls } from "./installs.js";
11
12
  import type { PermissionSet } from "./permission-set.js";
12
13
  /** {@link openExtensionCli} 的结果:CLI 的 `capybara extensions *` 共用。 */
13
14
  export interface ExtensionCli {
14
15
  config: KernelConfig;
15
- db: KernelDb;
16
+ /**
17
+ * The command's Nest application context: the extension providers, the database
18
+ * and the CLI's Redis. Closed by {@link close}.
19
+ */
20
+ app: INestApplicationContext;
16
21
  /** 配置声明的插件(导入、按依赖排序,不 setup)。 */
17
22
  inspected: InspectedExtension[];
18
23
  /**
@@ -37,6 +42,8 @@ export interface ExtensionCli {
37
42
  admin: ExtensionAdmin;
38
43
  ops: ExtensionAdminOps;
39
44
  approvals: ExtensionApprovals;
45
+ /** The bootstrap step (`capybara bootstrap`), under the same `lock:bootstrap` as the kernel. */
46
+ bootstrap: BootstrapService;
40
47
  /** CLI 本次刚导入的包字节(降级判断等读包时优先用它:包可能存在 CLI 读不到的对象存储里)。 */
41
48
  remember(sha256: string, bytes: Uint8Array): void;
42
49
  /** 安装记录包的权限集合(与后台审阅相同);包在对象存储里时 CLI 读不到,抛错。 */
@@ -48,14 +55,17 @@ export interface ExtensionCli {
48
55
  close(): Promise<void>;
49
56
  }
50
57
  /**
51
- * The CLI's extension management context (C18, F-Q): connects only to PG (and Redis for publishing),
52
- * starts no extension host and runs no extension's `setup` (a catalog import sets up the declared
53
- * object-store extension itself, see `openCatalogCli`). Packages the CLI imports are always
54
- * stored in PG (`blob_store = 'pg'`); replicas read by `blob_store`. Install / enable / disable /
55
- * uninstall share {@link ExtensionAdminOps} with the admin console (actor null, audits without an
56
- * actor); after writing PG it publishes `kernel.plugins.changed` and running replicas reconcile; a
57
- * failed publish only warns (the periodic reconcile catches up).
58
+ * The CLI's extension management context (C18, F-Q): a Nest application context with
59
+ * the extensions module over the database and a lazy Redis connection used only for publishing
60
+ * and the bootstrap lock. It loads no extension and runs no extension's `setup` (a catalog import
61
+ * sets up the declared object-store extension itself, see `openCatalogCli`). Packages the CLI
62
+ * imports are always stored in PG (`blob_store = 'pg'`); replicas read by `blob_store`. Install /
63
+ * enable / disable / uninstall share {@link ExtensionAdminOps} with the admin console (actor null,
64
+ * audits without an actor); after writing PG it publishes `kernel.plugins.changed` and running
65
+ * replicas reconcile; a failed publish only warns (the periodic reconcile catches up).
58
66
  */
59
67
  export declare function openExtensionCli(config: KernelConfig, log: KernelLogger, opts?: {
60
68
  resolveFrom?: string;
69
+ /** More domain modules for the context (the catalog CLI adds its import module). */
70
+ modules?: (Type | DynamicModule)[];
61
71
  }): Promise<ExtensionCli>;