@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,13 +1,33 @@
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 { SDK_VERSION } from "@capybara-hq/plugin-sdk";
11
+ import { Inject, Injectable } from "@nestjs/common";
2
12
  import { sql } from "kysely";
3
13
  import semver from "semver";
4
14
  import { pluginSchemaName } from "../ctx/create-ctx.js";
5
15
  import { ApiError } from "../errors.js";
6
16
  import { audit } from "../identity/audit.js";
7
- import { lockEnterpriseAdminsAndAuthorize } from "../identity/enterprise-admin.js";
8
- import { PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
17
+ import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
18
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
19
+ import { afterCommit } from "../infra/database/after-commit.js";
20
+ import { KernelDb } from "../infra/database/kernel-db.js";
21
+ import { TransactionHost } from "../infra/database/transaction-host.js";
22
+ import { Transactional } from "../infra/database/transactional.decorator.js";
23
+ import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
24
+ import { ExtensionAdmin } from "./admin-view.js";
25
+ import { ExtensionBlobs } from "./blobs.js";
26
+ import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
27
+ import { PluginInstallLock } from "./locks.js";
9
28
  import { unrunMigrations } from "./migrate-lock.js";
10
29
  import { ExtensionPackageError, extensionPackageApiError, readExtensionPackage, } from "./package.js";
30
+ import { ExtensionRegistry } from "./registry.js";
11
31
  /**
12
32
  * Deployment-level extension install / enable / disable / uninstall (C16 / D15): writes only the PG
13
33
  * desired state (`extension_installs`) and the audit, then publishes `kernel.plugins.changed` after
@@ -17,10 +37,53 @@ import { ExtensionPackageError, extensionPackageApiError, readExtensionPackage,
17
37
  * Every write runs in a transaction: first `lockEnterpriseAdminsAndAuthorize` (skipped by the CLI),
18
38
  * then an advisory lock by extension name and a lock on the install record row.
19
39
  */
20
- export class ExtensionAdminOps {
21
- d;
22
- constructor(d) {
23
- this.d = d;
40
+ let ExtensionAdminOps = class ExtensionAdminOps {
41
+ kdb;
42
+ txHost;
43
+ adminLock;
44
+ installLock;
45
+ admin;
46
+ registry;
47
+ blobs;
48
+ config;
49
+ bus;
50
+ lifecycle;
51
+ log;
52
+ constructor(kdb, txHost,
53
+ /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
54
+ adminLock, installLock,
55
+ /**
56
+ * The admin view after the operation, degraded when the package cannot be read
57
+ * (`get(name, { allowUnreadable: true })`). If it throws, the operation has already committed:
58
+ * ops logs an error and returns {@link fallbackView}, so an operation that took effect is not
59
+ * reported as failed.
60
+ */
61
+ admin,
62
+ /** The config-declared extension names (they cannot be installed / disabled / uninstalled, C15). */
63
+ registry,
64
+ /** Reads packages (a downgrade checks the target version's migration files). */
65
+ blobs, config,
66
+ /** Publishes `kernel.plugins.changed`. */
67
+ bus,
68
+ /**
69
+ * When the publish fails this replica reconciles itself (not awaited; other replicas catch up
70
+ * periodically). A no-op where the lifecycle never started (the CLI).
71
+ */
72
+ lifecycle, log) {
73
+ this.kdb = kdb;
74
+ this.txHost = txHost;
75
+ this.adminLock = adminLock;
76
+ this.installLock = installLock;
77
+ this.admin = admin;
78
+ this.registry = registry;
79
+ this.blobs = blobs;
80
+ this.config = config;
81
+ this.bus = bus;
82
+ this.lifecycle = lifecycle;
83
+ this.log = log;
84
+ }
85
+ get db() {
86
+ return this.kdb.db;
24
87
  }
25
88
  /**
26
89
  * New install or version change (upgrade / downgrade): the install record points at package
@@ -52,7 +115,7 @@ export class ExtensionAdminOps {
52
115
  */
53
116
  async install(name, sha256, actor, actorTokenId, opts = {}) {
54
117
  this.assertInstallable(name);
55
- const pkg = await this.d.db
118
+ const pkg = await this.db
56
119
  .selectFrom("extension_packages")
57
120
  .select(["sha256", "name", "package_name", "version", "source"])
58
121
  .where("sha256", "=", sha256)
@@ -66,100 +129,101 @@ export class ExtensionAdminOps {
66
129
  // The downgrade check needs the target package's migration files: read and parse the package
67
130
  // outside the transaction (inside it only _migrations is compared). A stored package in the
68
131
  // pre-0.1.0 format -> extension.legacy_format.
69
- const target = await readExtensionPackage(await this.d.blobs.get(sha256), {
70
- maxBytes: this.d.config().packages.maxBytes,
132
+ const target = await readExtensionPackage(await this.blobs.get(sha256), {
133
+ maxBytes: this.config.get().packages.maxBytes,
71
134
  hostSdkVersion: SDK_VERSION,
72
135
  }).catch((e) => {
73
136
  throw e instanceof ExtensionPackageError ? extensionPackageApiError(e) : e;
74
137
  });
75
- const changed = await this.d.db.transaction().execute(async (trx) => {
76
- if (actor !== null)
77
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
78
- const row = await this.lockRow(trx, name);
79
- // 不经目录重装时保留原来的来源条目(不清空,C22)
80
- const catalogItemId = opts.catalogItemId ?? row?.catalog_item_id ?? null;
81
- if (opts.catalogItemId !== undefined) {
82
- await trx
83
- .insertInto("extension_catalog_sources")
84
- .values({ plugin: name, item_id: opts.catalogItemId })
85
- .onConflict((oc) => oc.columns(["plugin", "item_id"]).doNothing())
86
- .execute();
87
- }
88
- if (row && row.package_name !== pkg.package_name) {
89
- throw new ApiError("extension.name_conflict", `Extension ${name} is already installed from package ${row.package_name}; package ${pkg.package_name} uses the same extension name`);
90
- }
91
- // Ruling P3:插件名归第一次安装它的 npm 包(卸载不删),别的包不能接手(数据、密钥与批准都还在)。
92
- // 还没有归属、却已有这个名字留下的快照 / 部署配置 / 组织配置(I4:如归属表之前就有的配置声明插件):
93
- // 不知道它们属于哪个包,同样拒绝
94
- const owned = await trx
95
- .selectFrom("extension_name_owners")
96
- .select("package_name")
97
- .where("name", "=", name)
98
- .executeTakeFirst();
99
- if (!owned && (await hasRetainedData(trx, name))) {
100
- throw new ApiError("extension.name_conflict", `Extension name ${name} already has retained data (permission approval, deployment config or organization settings) from an extension that is not installed here, and no package owns the name; package ${pkg.package_name} cannot take it over. Remove that data or use a different extension name`);
101
- }
102
- await trx
103
- .insertInto("extension_name_owners")
104
- .values({ name, package_name: pkg.package_name })
105
- .onConflict((oc) => oc.column("name").doNothing())
138
+ const changed = await this.writeInstall(name, sha256, pkg, target, actor, actorTokenId, opts);
139
+ return this.viewAfterCommit(name, { version: pkg.version, sha256, state: changed.state });
140
+ }
141
+ async writeInstall(name, sha256, pkg, target, actor, actorTokenId, opts) {
142
+ const db = this.db;
143
+ if (actor !== null)
144
+ await this.adminLock.lockAndAuthorize(actor);
145
+ const row = await this.lockRow(name);
146
+ // 不经目录重装时保留原来的来源条目(不清空,C22)
147
+ const catalogItemId = opts.catalogItemId ?? row?.catalog_item_id ?? null;
148
+ if (opts.catalogItemId !== undefined) {
149
+ await db
150
+ .insertInto("extension_catalog_sources")
151
+ .values({ plugin: name, item_id: opts.catalogItemId })
152
+ .onConflict((oc) => oc.columns(["plugin", "item_id"]).doNothing())
106
153
  .execute();
107
- const owner = await trx
108
- .selectFrom("extension_name_owners")
109
- .select("package_name")
110
- .where("name", "=", name)
111
- .executeTakeFirstOrThrow();
112
- if (owner.package_name !== pkg.package_name) {
113
- throw new ApiError("extension.name_conflict", `Extension name ${name} was previously used by package ${owner.package_name}; its data, secrets and permission approval are retained for that package, so package ${pkg.package_name} cannot take over the name`);
114
- }
115
- // 已指向同一个包:什么都不改,降级视图仍给出真实的期望状态
116
- if (row?.sha256 === sha256) {
117
- if (row.catalog_item_id !== catalogItemId) {
118
- // 包没变、只有来源条目变了:照样留审计(来源变化影响 T26 的目录策略约束)
119
- await trx
120
- .updateTable("extension_installs")
121
- .set({ catalog_item_id: catalogItemId })
122
- .where("name", "=", name)
123
- .execute();
124
- await this.audit(trx, actor, actorTokenId, "extension.install_source_changed", name, pkg.version, sha256, { catalogItemId, previousCatalogItemId: row.catalog_item_id });
125
- }
126
- return { changed: false, state: row.desired_state };
154
+ }
155
+ if (row && row.package_name !== pkg.package_name) {
156
+ throw new ApiError("extension.name_conflict", `Extension ${name} is already installed from package ${row.package_name}; package ${pkg.package_name} uses the same extension name`);
157
+ }
158
+ // Ruling P3:插件名归第一次安装它的 npm 包(卸载不删),别的包不能接手(数据、密钥与批准都还在)。
159
+ // 还没有归属、却已有这个名字留下的快照 / 部署配置 / 组织配置(I4:如归属表之前就有的配置声明插件):
160
+ // 不知道它们属于哪个包,同样拒绝
161
+ const owned = await db
162
+ .selectFrom("extension_name_owners")
163
+ .select("package_name")
164
+ .where("name", "=", name)
165
+ .executeTakeFirst();
166
+ if (!owned && (await hasRetainedData(db, name))) {
167
+ throw new ApiError("extension.name_conflict", `Extension name ${name} already has retained data (permission approval, deployment config or organization settings) from an extension that is not installed here, and no package owns the name; package ${pkg.package_name} cannot take it over. Remove that data or use a different extension name`);
168
+ }
169
+ await db
170
+ .insertInto("extension_name_owners")
171
+ .values({ name, package_name: pkg.package_name })
172
+ .onConflict((oc) => oc.column("name").doNothing())
173
+ .execute();
174
+ const owner = await db
175
+ .selectFrom("extension_name_owners")
176
+ .select("package_name")
177
+ .where("name", "=", name)
178
+ .executeTakeFirstOrThrow();
179
+ if (owner.package_name !== pkg.package_name) {
180
+ throw new ApiError("extension.name_conflict", `Extension name ${name} was previously used by package ${owner.package_name}; its data, secrets and permission approval are retained for that package, so package ${pkg.package_name} cannot take over the name`);
181
+ }
182
+ // 已指向同一个包:什么都不改,降级视图仍给出真实的期望状态
183
+ if (row?.sha256 === sha256) {
184
+ if (row.catalog_item_id !== catalogItemId) {
185
+ // 包没变、只有来源条目变了:照样留审计(来源变化影响 T26 的目录策略约束)
186
+ await db
187
+ .updateTable("extension_installs")
188
+ .set({ catalog_item_id: catalogItemId })
189
+ .where("name", "=", name)
190
+ .execute();
191
+ await this.audit(actor, actorTokenId, "extension.install_source_changed", name, pkg.version, sha256, { catalogItemId, previousCatalogItemId: row.catalog_item_id });
127
192
  }
128
- if (row && isDowngrade(pkg.version, row.version)) {
129
- const unrun = await unrunMigrations(trx, name, target.migrationSql);
130
- if (unrun.length > 0) {
131
- throw new ApiError("extension.downgrade_unsupported", `Extension ${name} ${pkg.version} has migrations that were never run here (${unrun.join(", ")}); extension migrations only expand, so downgrade only to a version whose migrations have all been applied`, unrun.map((file) => ({ file })));
132
- }
193
+ return { changed: false, state: row.desired_state };
194
+ }
195
+ if (row && isDowngrade(pkg.version, row.version)) {
196
+ const unrun = await unrunMigrations(db, name, target.migrationSql);
197
+ if (unrun.length > 0) {
198
+ throw new ApiError("extension.downgrade_unsupported", `Extension ${name} ${pkg.version} has migrations that were never run here (${unrun.join(", ")}); extension migrations only expand, so downgrade only to a version whose migrations have all been applied`, unrun.map((file) => ({ file })));
133
199
  }
134
- await trx
135
- .insertInto("extension_installs")
136
- .values({
137
- name,
138
- sha256,
139
- version: pkg.version,
140
- source: pkg.source,
141
- desired_state: "disabled",
142
- installed_by: actor,
143
- updated_by: actor,
144
- catalog_item_id: catalogItemId,
145
- })
146
- .onConflict((oc) => oc.column("name").doUpdateSet({
147
- sha256,
148
- version: pkg.version,
149
- source: pkg.source,
150
- updated_by: actor,
151
- catalog_item_id: catalogItemId,
152
- updated_at: sql `now()`,
153
- }))
154
- .execute();
155
- await this.audit(trx, actor, actorTokenId, "extension.installed", name, pkg.version, sha256, {
156
- catalogItemId,
157
- });
158
- return { changed: true, state: row?.desired_state ?? "disabled" };
200
+ }
201
+ await db
202
+ .insertInto("extension_installs")
203
+ .values({
204
+ name,
205
+ sha256,
206
+ version: pkg.version,
207
+ source: pkg.source,
208
+ desired_state: "disabled",
209
+ installed_by: actor,
210
+ updated_by: actor,
211
+ catalog_item_id: catalogItemId,
212
+ })
213
+ .onConflict((oc) => oc.column("name").doUpdateSet({
214
+ sha256,
215
+ version: pkg.version,
216
+ source: pkg.source,
217
+ updated_by: actor,
218
+ catalog_item_id: catalogItemId,
219
+ updated_at: sql `now()`,
220
+ }))
221
+ .execute();
222
+ await this.audit(actor, actorTokenId, "extension.installed", name, pkg.version, sha256, {
223
+ catalogItemId,
159
224
  });
160
- if (changed.changed)
161
- await this.notify(name);
162
- return this.viewAfterCommit(name, { version: pkg.version, sha256, state: changed.state });
225
+ afterCommit(() => this.notify(name));
226
+ return { changed: true, state: row?.desired_state ?? "disabled" };
163
227
  }
164
228
  /** Enable on the deployment (audit `extension.enabled`); no change when already enabled. Org enablement is unchanged. */
165
229
  enable(name, actor, actorTokenId) {
@@ -184,65 +248,68 @@ export class ExtensionAdminOps {
184
248
  */
185
249
  async uninstall(name, actor, actorTokenId) {
186
250
  this.assertInstallable(name);
187
- await this.d.db.transaction().execute(async (trx) => {
188
- if (actor !== null)
189
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
190
- const row = await this.lockRow(trx, name);
191
- if (!row)
192
- throw notFound(name);
193
- if (row.required)
194
- throw required(name);
195
- if (row.desired_state !== "disabled") {
196
- throw new ApiError("extension.not_disabled", `Extension ${name} is enabled; disable it before uninstalling`);
197
- }
198
- await trx.deleteFrom("extension_installs").where("name", "=", name).execute();
199
- // 来源条目随安装记录一起删:之后不经目录重新安装时不再受旧条目的策略约束(T26 裁决)
200
- await trx.deleteFrom("extension_catalog_sources").where("plugin", "=", name).execute();
201
- await this.audit(trx, actor, actorTokenId, "extension.uninstalled", name, row.version, row.sha256);
202
- });
203
- await this.notify(name);
251
+ await this.writeUninstall(name, actor, actorTokenId);
252
+ }
253
+ async writeUninstall(name, actor, actorTokenId) {
254
+ const db = this.db;
255
+ if (actor !== null)
256
+ await this.adminLock.lockAndAuthorize(actor);
257
+ const row = await this.lockRow(name);
258
+ if (!row)
259
+ throw notFound(name);
260
+ if (row.required)
261
+ throw required(name);
262
+ if (row.desired_state !== "disabled") {
263
+ throw new ApiError("extension.not_disabled", `Extension ${name} is enabled; disable it before uninstalling`);
264
+ }
265
+ await db.deleteFrom("extension_installs").where("name", "=", name).execute();
266
+ // 来源条目随安装记录一起删:之后不经目录重新安装时不再受旧条目的策略约束(T26 裁决)
267
+ await db.deleteFrom("extension_catalog_sources").where("plugin", "=", name).execute();
268
+ await this.audit(actor, actorTokenId, "extension.uninstalled", name, row.version, row.sha256);
269
+ afterCommit(() => this.notify(name));
204
270
  }
205
271
  async setState(name, state, actor, actorTokenId) {
206
272
  this.assertInstallable(name);
207
- const result = await this.d.db.transaction().execute(async (trx) => {
208
- if (actor !== null)
209
- await lockEnterpriseAdminsAndAuthorize(trx, actor);
210
- const row = await this.lockRow(trx, name);
211
- if (!row)
212
- throw notFound(name);
213
- if (state === "disabled" && row.required)
214
- throw required(name);
215
- if (row.desired_state === state)
216
- return { row, changed: false };
217
- await trx
218
- .updateTable("extension_installs")
219
- .set({
220
- desired_state: state,
221
- updated_by: actor,
222
- updated_at: sql `now()`,
223
- })
224
- .where("name", "=", name)
225
- .execute();
226
- await this.audit(trx, actor, actorTokenId, state === "enabled" ? "extension.enabled" : "extension.disabled", name, row.version, row.sha256);
227
- return { row, changed: true };
228
- });
229
- if (result.changed)
230
- await this.notify(name);
273
+ const result = await this.writeState(name, state, actor, actorTokenId);
231
274
  return this.viewAfterCommit(name, {
232
275
  version: result.row.version,
233
276
  sha256: result.row.sha256,
234
277
  state,
235
278
  });
236
279
  }
280
+ async writeState(name, state, actor, actorTokenId) {
281
+ const db = this.db;
282
+ if (actor !== null)
283
+ await this.adminLock.lockAndAuthorize(actor);
284
+ const row = await this.lockRow(name);
285
+ if (!row)
286
+ throw notFound(name);
287
+ if (state === "disabled" && row.required)
288
+ throw required(name);
289
+ if (row.desired_state === state)
290
+ return { row, changed: false };
291
+ await db
292
+ .updateTable("extension_installs")
293
+ .set({
294
+ desired_state: state,
295
+ updated_by: actor,
296
+ updated_at: sql `now()`,
297
+ })
298
+ .where("name", "=", name)
299
+ .execute();
300
+ await this.audit(actor, actorTokenId, state === "enabled" ? "extension.enabled" : "extension.disabled", name, row.version, row.sha256);
301
+ afterCommit(() => this.notify(name));
302
+ return { row, changed: true };
303
+ }
237
304
  /**
238
305
  * 提交后的视图:拼视图失败(读包、查状态行出错)时操作已经生效,不能再报失败——记 error,返回降级视图。
239
306
  */
240
307
  async viewAfterCommit(name, known) {
241
308
  try {
242
- return await this.d.view(name);
309
+ return await this.admin.get(name, { allowUnreadable: true });
243
310
  }
244
311
  catch (err) {
245
- this.d.log.error("plugin change committed, but its admin view cannot be built", {
312
+ this.log.error("plugin change committed, but its admin view cannot be built", {
246
313
  plugin: name,
247
314
  err,
248
315
  });
@@ -251,15 +318,15 @@ export class ExtensionAdminOps {
251
318
  }
252
319
  /** 配置声明的插件不经安装记录管理。 */
253
320
  assertInstallable(name) {
254
- const declared = this.d.declared().get(name);
321
+ const declared = this.registry.declared().get(name);
255
322
  if (declared === "config") {
256
323
  throw new ApiError("extension.config_declared", `Extension ${name} is declared in the startup config (extensions); change that list and restart instead`);
257
324
  }
258
325
  }
259
- /** 按插件名串行(咨询锁,覆盖「还没有行」的新装),再锁住已有的安装记录行。 */
260
- async lockRow(trx, name) {
261
- await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.plugin-install:${name}`}))`.execute(trx);
262
- return trx
326
+ /** 按插件名串行(`PluginInstallLock`,覆盖「还没有行」的新装),再锁住已有的安装记录行。 */
327
+ async lockRow(name) {
328
+ await this.installLock.lock(name);
329
+ return this.db
263
330
  .selectFrom("extension_installs")
264
331
  .innerJoin("extension_packages", "extension_packages.sha256", "extension_installs.sha256")
265
332
  .select([
@@ -274,8 +341,8 @@ export class ExtensionAdminOps {
274
341
  .forUpdate("extension_installs")
275
342
  .executeTakeFirst();
276
343
  }
277
- async audit(trx, actor, actorTokenId, action, name, version, sha256, extra = {}) {
278
- await audit(trx, {
344
+ async audit(actor, actorTokenId, action, name, version, sha256, extra = {}) {
345
+ await audit(this.db, {
279
346
  ...(actor !== null && { actorAccountId: actor }),
280
347
  ...(actorTokenId !== undefined && { actorTokenId }),
281
348
  action,
@@ -286,16 +353,43 @@ export class ExtensionAdminOps {
286
353
  /** 提交后通知各副本;发布失败只告警(周期 reconcile 兜底),本副本自己先 reconcile。 */
287
354
  async notify(name) {
288
355
  try {
289
- await this.d.bus.publish(PLUGINS_CHANGED_TOPIC, { plugin: name });
356
+ await this.bus.publish(PLUGINS_CHANGED_TOPIC, { plugin: name });
290
357
  }
291
358
  catch (err) {
292
- this.d.log.warn("cannot publish plugins.changed; replicas converge on the next periodic reconcile", { plugin: name, err });
293
- this.d
294
- .reconcile?.(`changed:${name}`)
295
- .catch((e) => this.d.log.error("plugin reconcile failed", { plugin: name, err: e }));
359
+ this.log.warn("cannot publish plugins.changed; replicas converge on the next periodic reconcile", { plugin: name, err });
360
+ this.lifecycle
361
+ .reconcile(`changed:${name}`)
362
+ .catch((e) => this.log.error("plugin reconcile failed", { plugin: name, err: e }));
296
363
  }
297
364
  }
298
- }
365
+ };
366
+ __decorate([
367
+ Transactional()
368
+ ], ExtensionAdminOps.prototype, "writeInstall", null);
369
+ __decorate([
370
+ Transactional()
371
+ ], ExtensionAdminOps.prototype, "writeUninstall", null);
372
+ __decorate([
373
+ Transactional()
374
+ ], ExtensionAdminOps.prototype, "writeState", null);
375
+ __decorate([
376
+ Transactional({ propagation: "mandatory" })
377
+ ], ExtensionAdminOps.prototype, "lockRow", null);
378
+ ExtensionAdminOps = __decorate([
379
+ Injectable(),
380
+ __param(0, Inject(KernelDb)),
381
+ __param(1, Inject(TransactionHost)),
382
+ __param(2, Inject(EnterpriseAdminLock)),
383
+ __param(3, Inject(PluginInstallLock)),
384
+ __param(4, Inject(ExtensionAdmin)),
385
+ __param(5, Inject(ExtensionRegistry)),
386
+ __param(6, Inject(ExtensionBlobs)),
387
+ __param(7, Inject(KernelConfigService)),
388
+ __param(8, Inject(KERNEL_BUS)),
389
+ __param(9, Inject(ExtensionLifecycle)),
390
+ __param(10, Inject(KERNEL_LOGGER))
391
+ ], ExtensionAdminOps);
392
+ export { ExtensionAdminOps };
299
393
  /**
300
394
  * 拼不出视图时的降级项(与后台列表里包读不到的项同形:status failed、权限为空、带 `error`)。
301
395
  */
@@ -327,19 +421,19 @@ function fallbackView(name, known, err) {
327
421
  };
328
422
  }
329
423
  /** 插件名已留下的数据:权限快照、部署配置、任一组织的配置,或插件 schema(`plugin_<name>`)。 */
330
- async function hasRetainedData(trx, name) {
331
- const schema = await sql `SELECT 1 AS x FROM pg_namespace WHERE nspname = ${pluginSchemaName(name)}`.execute(trx);
424
+ async function hasRetainedData(db, name) {
425
+ const schema = await sql `SELECT 1 AS x FROM pg_namespace WHERE nspname = ${pluginSchemaName(name)}`.execute(db);
332
426
  if (schema.rows.length > 0)
333
427
  return true;
334
- const hit = await trx
428
+ const hit = await db
335
429
  .selectFrom("extension_permission_snapshots")
336
430
  .select(sql `1`.as("x"))
337
431
  .where("plugin", "=", name)
338
- .union(trx
432
+ .union(db
339
433
  .selectFrom("extension_deployment_configs")
340
434
  .select(sql `1`.as("x"))
341
435
  .where("plugin", "=", name))
342
- .union(trx
436
+ .union(db
343
437
  .selectFrom("extension_org_configs")
344
438
  .select(sql `1`.as("x"))
345
439
  .where("plugin", "=", name))
@@ -1,9 +1,14 @@
1
- import type { KernelConfig } from "../config/schema.js";
2
- import type { KernelDb } from "../db/kernel-schema.js";
3
- import type { ExtensionBlobs } from "./blobs.js";
4
- import type { DeclaredExtensionInfo } from "./host.js";
5
- import type { ExtensionInstalls } from "./installs.js";
6
- import { PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
1
+ import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
2
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
+ import { TransactionHost } from "../infra/database/transaction-host.js";
5
+ import type { KernelLogger } from "../log.js";
6
+ import { ExtensionApprovals } from "./approvals.js";
7
+ import { ExtensionBlobs } from "./blobs.js";
8
+ import { ExtensionHost } from "./host.js";
9
+ import { ExtensionInstalls } from "./installs.js";
10
+ import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
11
+ import { PluginApproveLock } from "./locks.js";
7
12
  import { type AdminExtensionView } from "./permission-view.js";
8
13
  export { PLUGINS_CHANGED_TOPIC };
9
14
  /** The web approval request body (`POST /api/v1/admin/extensions/:name/approve`). */
@@ -12,34 +17,39 @@ export interface ApproveBody {
12
17
  sha256: string | null;
13
18
  reviewHash: string;
14
19
  }
15
- export interface ExtensionAdminDeps {
16
- db: KernelDb;
17
- blobs: Pick<ExtensionBlobs, "get">;
18
- installs: ExtensionInstalls;
19
- config: () => KernelConfig;
20
- host: {
21
- declaredPlugins(): DeclaredExtensionInfo[];
22
- };
23
- /**
24
- * 本副本 reconcile(批准后等它完成再返回视图;其他副本经 `kernel.plugins.changed` 收敛)。CLI 没有(只发布)。
25
- */
26
- reconcile?: (reason: string) => Promise<void>;
27
- bus: {
28
- publish(topic: string, payload: unknown): Promise<void>;
29
- };
30
- log: {
31
- warn(msg: string, fields?: Record<string, unknown>): void;
32
- error(msg: string, fields?: Record<string, unknown>): void;
33
- };
20
+ /** The kernel bus as the admin operations use it (publish only). */
21
+ export interface PublishBus {
22
+ publish(topic: string, payload: unknown): Promise<void>;
34
23
  }
35
24
  /**
36
25
  * 部署级插件后台(企业管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
37
26
  * 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
38
27
  */
39
28
  export declare class ExtensionAdmin {
40
- private readonly d;
29
+ private readonly kdb;
30
+ readonly txHost: TransactionHost;
31
+ /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
32
+ private readonly adminLock;
33
+ private readonly approveLock;
34
+ private readonly blobs;
35
+ private readonly installs;
36
+ private readonly approvals;
37
+ /** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
38
+ private readonly host;
39
+ /** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
40
+ private readonly lifecycle;
41
+ private readonly config;
42
+ private readonly bus;
43
+ private readonly log;
41
44
  private readonly packageSets;
42
- constructor(d: ExtensionAdminDeps);
45
+ constructor(kdb: KernelDb, txHost: TransactionHost,
46
+ /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
47
+ adminLock: EnterpriseAdminLock, approveLock: PluginApproveLock, blobs: ExtensionBlobs, installs: ExtensionInstalls, approvals: ExtensionApprovals,
48
+ /** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
49
+ host: ExtensionHost,
50
+ /** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
51
+ lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger);
52
+ private get db();
43
53
  /** 全部插件(配置声明 → 安装记录,各自按名字)。 */
44
54
  list(): Promise<AdminExtensionView[]>;
45
55
  /**
@@ -69,6 +79,7 @@ export declare class ExtensionAdmin {
69
79
  approve(actor: string, name: string, body: ApproveBody, opts?: {
70
80
  actorTokenId?: string;
71
81
  }): Promise<AdminExtensionView>;
82
+ private writeApproval;
72
83
  /** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
73
84
  private subjects;
74
85
  /**