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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/bootstrap.json +10 -6
  2. package/dist/admin/admin.controller.d.ts +17 -17
  3. package/dist/admin/admin.controller.js +43 -26
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/extensions.controller.d.ts +14 -14
  7. package/dist/admin/extensions.controller.js +30 -17
  8. package/dist/admin/setup-lock.d.ts +16 -0
  9. package/dist/admin/setup-lock.js +47 -0
  10. package/dist/admin/setup.controller.d.ts +8 -8
  11. package/dist/admin/setup.controller.js +27 -25
  12. package/dist/admin/setup.service.d.ts +19 -27
  13. package/dist/admin/setup.service.js +61 -61
  14. package/dist/agents/agent-lookup.d.ts +53 -0
  15. package/dist/agents/agent-lookup.js +179 -0
  16. package/dist/agents/agents.controller.d.ts +1 -1
  17. package/dist/agents/agents.controller.js +14 -8
  18. package/dist/agents/agents.module.d.ts +7 -0
  19. package/dist/agents/agents.module.js +41 -0
  20. package/dist/agents/agents.service.d.ts +39 -58
  21. package/dist/agents/agents.service.js +261 -329
  22. package/dist/agents/definition.d.ts +8 -0
  23. package/dist/agents/definition.js +8 -0
  24. package/dist/agents/models.controller.d.ts +1 -1
  25. package/dist/agents/models.controller.js +2 -2
  26. package/dist/agents/templates.controller.d.ts +1 -1
  27. package/dist/agents/templates.controller.js +2 -2
  28. package/dist/agents/templates.d.ts +6 -8
  29. package/dist/agents/templates.js +20 -4
  30. package/dist/app.d.ts +93 -0
  31. package/dist/app.js +150 -0
  32. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  33. package/dist/catalog/admin-catalog.controller.js +27 -13
  34. package/dist/catalog/catalog-content.d.ts +185 -0
  35. package/dist/catalog/catalog-content.js +323 -0
  36. package/dist/catalog/catalog-items.d.ts +186 -0
  37. package/dist/catalog/catalog-items.js +410 -0
  38. package/dist/catalog/catalog.module.d.ts +14 -0
  39. package/dist/catalog/catalog.module.js +71 -0
  40. package/dist/catalog/catalog.service.d.ts +34 -188
  41. package/dist/catalog/catalog.service.js +155 -489
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +30 -13
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +2 -2
  70. package/dist/channels/channels.module.d.ts +40 -0
  71. package/dist/channels/channels.module.js +128 -0
  72. package/dist/channels/connections.controller.d.ts +1 -1
  73. package/dist/channels/connections.controller.js +11 -6
  74. package/dist/channels/connections.service.d.ts +43 -21
  75. package/dist/channels/connections.service.js +236 -131
  76. package/dist/channels/inbound.d.ts +34 -38
  77. package/dist/channels/inbound.js +107 -41
  78. package/dist/channels/job-ids.d.ts +10 -0
  79. package/dist/channels/job-ids.js +10 -0
  80. package/dist/channels/jobs.d.ts +85 -0
  81. package/dist/channels/jobs.js +157 -0
  82. package/dist/channels/outbound.d.ts +60 -82
  83. package/dist/channels/outbound.js +165 -193
  84. package/dist/channels/supervisor.d.ts +88 -46
  85. package/dist/channels/supervisor.js +230 -132
  86. package/dist/channels/threads.d.ts +29 -8
  87. package/dist/channels/threads.js +71 -13
  88. package/dist/channels/webhook.d.ts +20 -14
  89. package/dist/channels/webhook.js +51 -20
  90. package/dist/config/load.d.ts +3 -2
  91. package/dist/config/load.js +3 -2
  92. package/dist/config/nacos-source.js +11 -2
  93. package/dist/config/schema.d.ts +16 -1
  94. package/dist/config/schema.js +54 -7
  95. package/dist/conversations/access.d.ts +29 -0
  96. package/dist/conversations/access.js +86 -0
  97. package/dist/conversations/artifacts.d.ts +10 -10
  98. package/dist/conversations/artifacts.js +35 -9
  99. package/dist/conversations/attachments.controller.d.ts +1 -1
  100. package/dist/conversations/attachments.controller.js +8 -6
  101. package/dist/conversations/attachments.module.d.ts +7 -0
  102. package/dist/conversations/attachments.module.js +25 -0
  103. package/dist/conversations/attachments.service.d.ts +30 -22
  104. package/dist/conversations/attachments.service.js +119 -46
  105. package/dist/conversations/conversations.controller.d.ts +8 -7
  106. package/dist/conversations/conversations.controller.js +59 -29
  107. package/dist/conversations/conversations.module.d.ts +8 -0
  108. package/dist/conversations/conversations.module.js +69 -0
  109. package/dist/conversations/conversations.service.d.ts +40 -38
  110. package/dist/conversations/conversations.service.js +130 -140
  111. package/dist/conversations/event-log.d.ts +28 -18
  112. package/dist/conversations/event-log.js +74 -27
  113. package/dist/conversations/files.d.ts +10 -10
  114. package/dist/conversations/files.js +37 -11
  115. package/dist/conversations/idem-keys.d.ts +5 -0
  116. package/dist/conversations/idem-keys.js +5 -0
  117. package/dist/conversations/job-ids.d.ts +6 -0
  118. package/dist/conversations/job-ids.js +6 -0
  119. package/dist/conversations/outputs-read.d.ts +11 -11
  120. package/dist/conversations/outputs-read.js +31 -7
  121. package/dist/conversations/queue.d.ts +48 -56
  122. package/dist/conversations/queue.js +13 -289
  123. package/dist/conversations/queue.service.d.ts +60 -0
  124. package/dist/conversations/queue.service.js +343 -0
  125. package/dist/conversations/sandbox-status.d.ts +13 -10
  126. package/dist/conversations/sandbox-status.js +36 -8
  127. package/dist/conversations/titles.d.ts +71 -24
  128. package/dist/conversations/titles.js +159 -62
  129. package/dist/ctx/bus.js +9 -3
  130. package/dist/ctx/create-ctx.d.ts +6 -0
  131. package/dist/ctx/create-ctx.js +7 -9
  132. package/dist/ctx/lock.d.ts +7 -3
  133. package/dist/ctx/lock.js +9 -20
  134. package/dist/ctx/queue.js +3 -2
  135. package/dist/ctx/secrets.d.ts +10 -2
  136. package/dist/ctx/secrets.js +7 -3
  137. package/dist/db/kernel-schema.d.ts +2 -2
  138. package/dist/db/pool.d.ts +5 -0
  139. package/dist/db/pool.js +1 -0
  140. package/dist/errors.d.ts +2 -0
  141. package/dist/errors.js +2 -0
  142. package/dist/evals/budget.d.ts +42 -21
  143. package/dist/evals/budget.js +114 -62
  144. package/dist/evals/evals.module.d.ts +31 -0
  145. package/dist/evals/evals.module.js +114 -0
  146. package/dist/evals/jobs.d.ts +20 -0
  147. package/dist/evals/jobs.js +45 -0
  148. package/dist/evals/run-replay.d.ts +56 -8
  149. package/dist/evals/run-replay.js +140 -80
  150. package/dist/evals/runs.controller.d.ts +1 -1
  151. package/dist/evals/runs.controller.js +17 -8
  152. package/dist/evals/runs.service.d.ts +23 -45
  153. package/dist/evals/runs.service.js +245 -234
  154. package/dist/evals/sets.controller.d.ts +1 -1
  155. package/dist/evals/sets.controller.js +17 -8
  156. package/dist/evals/sets.service.d.ts +22 -6
  157. package/dist/evals/sets.service.js +248 -194
  158. package/dist/evals/snapshot.d.ts +2 -2
  159. package/dist/evals/step-replay.d.ts +2 -2
  160. package/dist/evals/step-replay.js +1 -1
  161. package/dist/evals/trajectory.controller.d.ts +1 -1
  162. package/dist/evals/trajectory.controller.js +11 -7
  163. package/dist/evals/trajectory.service.d.ts +5 -4
  164. package/dist/evals/trajectory.service.js +30 -7
  165. package/dist/evals/worker.d.ts +44 -27
  166. package/dist/evals/worker.js +220 -120
  167. package/dist/extensions/admin-ops.d.ts +61 -33
  168. package/dist/extensions/admin-ops.js +248 -154
  169. package/dist/extensions/admin-view.d.ts +38 -27
  170. package/dist/extensions/admin-view.js +126 -55
  171. package/dist/extensions/approvals.d.ts +12 -8
  172. package/dist/extensions/approvals.js +73 -46
  173. package/dist/extensions/blobs.d.ts +27 -10
  174. package/dist/extensions/blobs.js +111 -45
  175. package/dist/extensions/bootstrap.d.ts +96 -42
  176. package/dist/extensions/bootstrap.js +303 -155
  177. package/dist/extensions/cli.d.ts +20 -10
  178. package/dist/extensions/cli.js +41 -96
  179. package/dist/extensions/config-issues.d.ts +7 -0
  180. package/dist/extensions/config-issues.js +31 -0
  181. package/dist/extensions/deployment-config-store.d.ts +49 -0
  182. package/dist/extensions/deployment-config-store.js +133 -0
  183. package/dist/extensions/deployment-config.d.ts +58 -67
  184. package/dist/extensions/deployment-config.js +202 -230
  185. package/dist/extensions/enabled.d.ts +5 -5
  186. package/dist/extensions/extensions.module.d.ts +8 -0
  187. package/dist/extensions/extensions.module.js +77 -0
  188. package/dist/extensions/hooks.d.ts +3 -2
  189. package/dist/extensions/hooks.js +1 -1
  190. package/dist/extensions/host.d.ts +72 -68
  191. package/dist/extensions/host.js +191 -152
  192. package/dist/extensions/installs.d.ts +49 -16
  193. package/dist/extensions/installs.js +128 -32
  194. package/dist/extensions/job-ids.d.ts +6 -0
  195. package/dist/extensions/job-ids.js +6 -0
  196. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  197. package/dist/extensions/lifecycle-topics.js +18 -0
  198. package/dist/extensions/lifecycle.d.ts +35 -47
  199. package/dist/extensions/lifecycle.js +103 -39
  200. package/dist/extensions/locks.d.ts +33 -0
  201. package/dist/extensions/locks.js +86 -0
  202. package/dist/extensions/migrate-lock.d.ts +3 -4
  203. package/dist/extensions/org-config.controller.d.ts +1 -1
  204. package/dist/extensions/org-config.controller.js +8 -5
  205. package/dist/extensions/org-config.d.ts +48 -46
  206. package/dist/extensions/org-config.js +284 -226
  207. package/dist/extensions/registry.d.ts +50 -2
  208. package/dist/extensions/registry.js +89 -4
  209. package/dist/extensions/sources.d.ts +12 -8
  210. package/dist/extensions/sources.js +34 -13
  211. package/dist/files/files.module.d.ts +3 -0
  212. package/dist/files/files.module.js +22 -0
  213. package/dist/files/previewers.controller.d.ts +7 -2
  214. package/dist/files/previewers.controller.js +17 -9
  215. package/dist/files/previewers.d.ts +13 -18
  216. package/dist/files/previewers.js +83 -36
  217. package/dist/http/adapter.d.ts +3 -0
  218. package/dist/http/adapter.js +25 -0
  219. package/dist/http/api.module.d.ts +3 -110
  220. package/dist/http/api.module.js +47 -355
  221. package/dist/http/app.d.ts +11 -15
  222. package/dist/http/app.js +52 -47
  223. package/dist/http/error-filter.module.d.ts +5 -0
  224. package/dist/http/error-filter.module.js +18 -0
  225. package/dist/http/error.filter.js +2 -2
  226. package/dist/identity/accounts.d.ts +82 -29
  227. package/dist/identity/accounts.js +294 -175
  228. package/dist/identity/api-tokens.d.ts +11 -7
  229. package/dist/identity/api-tokens.js +71 -44
  230. package/dist/identity/audit.d.ts +7 -4
  231. package/dist/identity/audit.js +5 -1
  232. package/dist/identity/auth.controller.d.ts +11 -10
  233. package/dist/identity/auth.controller.js +31 -25
  234. package/dist/identity/auth.guard.d.ts +3 -3
  235. package/dist/identity/auth.guard.js +6 -4
  236. package/dist/identity/binding.d.ts +9 -11
  237. package/dist/identity/binding.js +41 -13
  238. package/dist/identity/enterprise-admin.d.ts +18 -12
  239. package/dist/identity/enterprise-admin.js +67 -13
  240. package/dist/identity/external-identity-lock.d.ts +17 -0
  241. package/dist/identity/external-identity-lock.js +39 -0
  242. package/dist/identity/external.d.ts +19 -15
  243. package/dist/identity/external.js +163 -125
  244. package/dist/identity/identity.module.d.ts +6 -0
  245. package/dist/identity/identity.module.js +56 -0
  246. package/dist/identity/me.controller.d.ts +16 -15
  247. package/dist/identity/me.controller.js +37 -31
  248. package/dist/identity/sessions.d.ts +12 -10
  249. package/dist/identity/sessions.js +74 -42
  250. package/dist/identity/settings.d.ts +20 -14
  251. package/dist/identity/settings.js +85 -57
  252. package/dist/identity/sso.controller.d.ts +7 -7
  253. package/dist/identity/sso.controller.js +13 -9
  254. package/dist/identity/sso.d.ts +9 -12
  255. package/dist/identity/sso.js +54 -24
  256. package/dist/inbox/inbox.module.d.ts +3 -0
  257. package/dist/inbox/inbox.module.js +22 -0
  258. package/dist/inbox/inbox.service.d.ts +7 -9
  259. package/dist/inbox/inbox.service.js +32 -11
  260. package/dist/index.d.ts +19 -12
  261. package/dist/index.js +13 -8
  262. package/dist/infra/cache/cache.module.d.ts +3 -0
  263. package/dist/infra/cache/cache.module.js +16 -0
  264. package/dist/infra/cache/cache.service.d.ts +21 -0
  265. package/dist/infra/cache/cache.service.js +80 -0
  266. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  267. package/dist/infra/cache/cacheable.decorator.js +83 -0
  268. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  269. package/dist/infra/cli/kernel-cli.module.js +165 -0
  270. package/dist/infra/close-within.d.ts +15 -0
  271. package/dist/infra/close-within.js +36 -0
  272. package/dist/infra/config/config.module.d.ts +13 -0
  273. package/dist/infra/config/config.module.js +39 -0
  274. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  275. package/dist/infra/config/kernel-config.service.js +126 -0
  276. package/dist/infra/database/after-commit.d.ts +6 -0
  277. package/dist/infra/database/after-commit.js +9 -0
  278. package/dist/infra/database/database.module.d.ts +25 -0
  279. package/dist/infra/database/database.module.js +90 -0
  280. package/dist/infra/database/kernel-db.d.ts +22 -0
  281. package/dist/infra/database/kernel-db.js +65 -0
  282. package/dist/infra/database/transaction-host.d.ts +50 -0
  283. package/dist/infra/database/transaction-host.js +125 -0
  284. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  285. package/dist/infra/database/transactional.decorator.js +27 -0
  286. package/dist/infra/database/xact-lock.d.ts +17 -0
  287. package/dist/infra/database/xact-lock.js +43 -0
  288. package/dist/infra/events/kernel-events.d.ts +96 -0
  289. package/dist/infra/events/kernel-events.js +65 -0
  290. package/dist/infra/health/health.controller.d.ts +26 -0
  291. package/dist/infra/health/health.controller.js +104 -0
  292. package/dist/infra/health/health.module.d.ts +9 -0
  293. package/dist/infra/health/health.module.js +24 -0
  294. package/dist/infra/health/health.options.d.ts +10 -0
  295. package/dist/infra/health/health.options.js +15 -0
  296. package/dist/infra/health/shutdown-state.d.ts +6 -0
  297. package/dist/infra/health/shutdown-state.js +2 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  300. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  301. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  302. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  303. package/dist/infra/lifecycle/process-guards.js +86 -0
  304. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  305. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  306. package/dist/infra/lock/key-template.d.ts +13 -0
  307. package/dist/infra/lock/key-template.js +46 -0
  308. package/dist/infra/lock/lock.module.d.ts +3 -0
  309. package/dist/infra/lock/lock.module.js +16 -0
  310. package/dist/infra/lock/lock.service.d.ts +120 -0
  311. package/dist/infra/lock/lock.service.js +343 -0
  312. package/dist/infra/lock/shared-lease.d.ts +44 -0
  313. package/dist/infra/lock/shared-lease.js +121 -0
  314. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  315. package/dist/infra/lock/with-lock.decorator.js +49 -0
  316. package/dist/infra/logging/logging.module.d.ts +16 -0
  317. package/dist/infra/logging/logging.module.js +34 -0
  318. package/dist/infra/queue/configured-processor.d.ts +18 -0
  319. package/dist/infra/queue/configured-processor.js +23 -0
  320. package/dist/infra/queue/job-failure.d.ts +18 -0
  321. package/dist/infra/queue/job-failure.js +26 -0
  322. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  323. package/dist/infra/queue/queue-shutdown.js +81 -0
  324. package/dist/infra/queue/queue.module.d.ts +16 -0
  325. package/dist/infra/queue/queue.module.js +61 -0
  326. package/dist/infra/queue/redis-connection.d.ts +7 -0
  327. package/dist/infra/queue/redis-connection.js +18 -0
  328. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  329. package/dist/infra/queue/retired-schedulers.js +9 -0
  330. package/dist/infra/queue/run-job.d.ts +16 -0
  331. package/dist/infra/queue/run-job.js +19 -0
  332. package/dist/infra/redis/redis.module.d.ts +24 -0
  333. package/dist/infra/redis/redis.module.js +87 -0
  334. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  335. package/dist/infra/schedule/cron-tick.js +25 -0
  336. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  337. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  338. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  339. package/dist/infra/schedule/locked-interval.js +190 -0
  340. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  341. package/dist/infra/schedule/locked-tick.js +137 -0
  342. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  343. package/dist/infra/schedule/schedule.module.js +27 -0
  344. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  345. package/dist/infra/schedule/scheduled-runs.js +163 -0
  346. package/dist/infra/swagger/swagger.d.ts +16 -0
  347. package/dist/infra/swagger/swagger.js +31 -0
  348. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  349. package/dist/infra/throttler/credential-throttler.js +77 -0
  350. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  351. package/dist/infra/throttler/named-throttlers.js +119 -0
  352. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  353. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  354. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  355. package/dist/infra/throttler/throttler.guard.js +68 -0
  356. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  357. package/dist/infra/throttler/throttler.module.js +53 -0
  358. package/dist/infra/tokens.d.ts +15 -0
  359. package/dist/infra/tokens.js +15 -0
  360. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  361. package/dist/infra/validation/create-zod-dto.js +35 -0
  362. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  363. package/dist/infra/validation/parse-with-zod.js +12 -0
  364. package/dist/infra/validation/validation.module.d.ts +3 -0
  365. package/dist/infra/validation/validation.module.js +16 -0
  366. package/dist/infra/validation/zod-params.d.ts +7 -0
  367. package/dist/infra/validation/zod-params.js +42 -0
  368. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  369. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  370. package/dist/kernel.d.ts +9 -241
  371. package/dist/kernel.js +8 -1305
  372. package/dist/kernel.module.d.ts +17 -0
  373. package/dist/kernel.module.js +136 -0
  374. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  375. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  376. package/dist/lifecycle/tokens.d.ts +3 -0
  377. package/dist/lifecycle/tokens.js +3 -0
  378. package/dist/log-config.d.ts +9 -0
  379. package/dist/log-config.js +27 -0
  380. package/dist/log-context.d.ts +34 -0
  381. package/dist/log-context.js +44 -0
  382. package/dist/log-loki.d.ts +34 -0
  383. package/dist/log-loki.js +145 -0
  384. package/dist/log.d.ts +41 -10
  385. package/dist/log.js +91 -17
  386. package/dist/models/models.module.d.ts +3 -0
  387. package/dist/models/models.module.js +24 -0
  388. package/dist/models/prices.d.ts +8 -2
  389. package/dist/models/prices.js +65 -37
  390. package/dist/models/purposes.controller.d.ts +1 -1
  391. package/dist/models/purposes.controller.js +5 -6
  392. package/dist/models/purposes.d.ts +35 -13
  393. package/dist/models/purposes.js +101 -51
  394. package/dist/net/public-address.js +3 -2
  395. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  396. package/dist/orgs/directory-sync.controller.js +2 -2
  397. package/dist/orgs/directory-sync.d.ts +61 -31
  398. package/dist/orgs/directory-sync.js +212 -125
  399. package/dist/orgs/invitations.controller.d.ts +8 -8
  400. package/dist/orgs/invitations.controller.js +27 -26
  401. package/dist/orgs/invitations.service.d.ts +12 -9
  402. package/dist/orgs/invitations.service.js +130 -92
  403. package/dist/orgs/job-ids.d.ts +8 -0
  404. package/dist/orgs/job-ids.js +8 -0
  405. package/dist/orgs/members.service.d.ts +19 -12
  406. package/dist/orgs/members.service.js +161 -117
  407. package/dist/orgs/offboarding.d.ts +54 -57
  408. package/dist/orgs/offboarding.js +161 -71
  409. package/dist/orgs/org-lock.d.ts +28 -19
  410. package/dist/orgs/org-lock.js +81 -35
  411. package/dist/orgs/org.guard.d.ts +1 -1
  412. package/dist/orgs/org.guard.js +2 -2
  413. package/dist/orgs/orgs.controller.d.ts +13 -13
  414. package/dist/orgs/orgs.controller.js +29 -17
  415. package/dist/orgs/orgs.module.d.ts +6 -0
  416. package/dist/orgs/orgs.module.js +68 -0
  417. package/dist/orgs/orgs.service.d.ts +30 -19
  418. package/dist/orgs/orgs.service.js +139 -86
  419. package/dist/orgs/settings.controller.d.ts +1 -1
  420. package/dist/orgs/settings.controller.js +8 -6
  421. package/dist/orgs/settings.service.d.ts +14 -8
  422. package/dist/orgs/settings.service.js +75 -46
  423. package/dist/overrides.d.ts +56 -0
  424. package/dist/overrides.js +30 -0
  425. package/dist/roles/gateway-role.d.ts +43 -0
  426. package/dist/roles/gateway-role.js +98 -0
  427. package/dist/roles/gateway.module.d.ts +8 -0
  428. package/dist/roles/gateway.module.js +28 -0
  429. package/dist/roles/worker-role.d.ts +63 -0
  430. package/dist/roles/worker-role.js +144 -0
  431. package/dist/roles/worker.module.d.ts +14 -0
  432. package/dist/roles/worker.module.js +90 -0
  433. package/dist/runtime/abort.js +19 -2
  434. package/dist/runtime/checkpointer.d.ts +8 -3
  435. package/dist/runtime/checkpointer.js +87 -55
  436. package/dist/runtime/conversation-lock.d.ts +20 -11
  437. package/dist/runtime/conversation-lock.js +62 -72
  438. package/dist/runtime/hook-calls.d.ts +3 -3
  439. package/dist/runtime/hook-calls.js +1 -6
  440. package/dist/runtime/job-ids.d.ts +10 -0
  441. package/dist/runtime/job-ids.js +10 -0
  442. package/dist/runtime/langgraph-loop.js +1 -1
  443. package/dist/runtime/loop.d.ts +7 -0
  444. package/dist/runtime/loop.js +14 -0
  445. package/dist/runtime/maintenance-queue.d.ts +10 -0
  446. package/dist/runtime/maintenance-queue.js +10 -0
  447. package/dist/runtime/maintenance.d.ts +45 -74
  448. package/dist/runtime/maintenance.js +139 -136
  449. package/dist/runtime/model-call.d.ts +7 -4
  450. package/dist/runtime/model-call.js +24 -57
  451. package/dist/runtime/providers.d.ts +17 -6
  452. package/dist/runtime/providers.js +66 -25
  453. package/dist/runtime/quota.d.ts +17 -3
  454. package/dist/runtime/quota.js +27 -2
  455. package/dist/runtime/retired-schedulers.d.ts +7 -0
  456. package/dist/runtime/retired-schedulers.js +31 -0
  457. package/dist/runtime/run-control.d.ts +33 -0
  458. package/dist/runtime/run-control.js +77 -0
  459. package/dist/runtime/run-finish.d.ts +26 -17
  460. package/dist/runtime/run-finish.js +98 -51
  461. package/dist/runtime/run-jobs.d.ts +48 -0
  462. package/dist/runtime/run-jobs.js +95 -0
  463. package/dist/runtime/run-processors.d.ts +60 -0
  464. package/dist/runtime/run-processors.js +185 -0
  465. package/dist/runtime/run-queue.d.ts +32 -57
  466. package/dist/runtime/run-queue.js +291 -295
  467. package/dist/runtime/run-steps.d.ts +39 -0
  468. package/dist/runtime/run-steps.js +96 -0
  469. package/dist/runtime/run-worker.d.ts +121 -75
  470. package/dist/runtime/run-worker.js +340 -225
  471. package/dist/runtime/runtime.module.d.ts +10 -0
  472. package/dist/runtime/runtime.module.js +112 -0
  473. package/dist/runtime/step-log.d.ts +40 -0
  474. package/dist/runtime/step-log.js +94 -0
  475. package/dist/runtime/stream.controller.d.ts +5 -8
  476. package/dist/runtime/stream.controller.js +14 -12
  477. package/dist/runtime/stream.d.ts +24 -6
  478. package/dist/runtime/stream.js +78 -7
  479. package/dist/runtime/subagents/child.d.ts +3 -44
  480. package/dist/runtime/subagents/child.js +0 -79
  481. package/dist/runtime/subagents/definition.d.ts +4 -4
  482. package/dist/runtime/subagents/definition.js +2 -2
  483. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  484. package/dist/runtime/subagents/dispatch.js +135 -140
  485. package/dist/runtime/subagents/limits.d.ts +9 -4
  486. package/dist/runtime/subagents/limits.js +4 -2
  487. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  488. package/dist/runtime/subagents/org-agents.js +1 -1
  489. package/dist/runtime/subagents/progress.d.ts +2 -2
  490. package/dist/runtime/subagents/roster.d.ts +3 -3
  491. package/dist/runtime/subagents/roster.js +1 -1
  492. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  493. package/dist/runtime/subagents/skill-fork.js +16 -5
  494. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  495. package/dist/runtime/subagents/subagents.service.js +101 -0
  496. package/dist/runtime/usage-report.d.ts +94 -52
  497. package/dist/runtime/usage-report.js +200 -99
  498. package/dist/runtime/waits.d.ts +125 -57
  499. package/dist/runtime/waits.js +431 -208
  500. package/dist/sandbox/job-ids.d.ts +10 -0
  501. package/dist/sandbox/job-ids.js +10 -0
  502. package/dist/sandbox/jobs.d.ts +41 -0
  503. package/dist/sandbox/jobs.js +113 -0
  504. package/dist/sandbox/leases.d.ts +39 -31
  505. package/dist/sandbox/leases.js +117 -257
  506. package/dist/sandbox/providers.d.ts +19 -0
  507. package/dist/sandbox/providers.js +38 -0
  508. package/dist/sandbox/sandbox.module.d.ts +8 -0
  509. package/dist/sandbox/sandbox.module.js +30 -0
  510. package/dist/sandbox/sandbox.service.d.ts +24 -29
  511. package/dist/sandbox/sandbox.service.js +106 -75
  512. package/dist/skills/catalog.d.ts +33 -20
  513. package/dist/skills/catalog.js +96 -53
  514. package/dist/skills/changes.controller.d.ts +4 -4
  515. package/dist/skills/changes.controller.js +15 -9
  516. package/dist/skills/changes.service.d.ts +28 -18
  517. package/dist/skills/changes.service.js +421 -364
  518. package/dist/skills/invocable.controller.d.ts +1 -1
  519. package/dist/skills/invocable.controller.js +8 -5
  520. package/dist/skills/invoke.d.ts +16 -15
  521. package/dist/skills/invoke.js +48 -17
  522. package/dist/skills/skills.controller.d.ts +1 -1
  523. package/dist/skills/skills.controller.js +11 -6
  524. package/dist/skills/skills.module.d.ts +6 -0
  525. package/dist/skills/skills.module.js +30 -0
  526. package/dist/skills/skills.service.d.ts +47 -30
  527. package/dist/skills/skills.service.js +221 -158
  528. package/dist/storage/job-ids.d.ts +6 -0
  529. package/dist/storage/job-ids.js +6 -0
  530. package/dist/storage/purge.d.ts +22 -7
  531. package/dist/storage/purge.js +55 -3
  532. package/dist/storage/storage.module.d.ts +6 -0
  533. package/dist/storage/storage.module.js +23 -0
  534. package/dist/storage/storage.service.d.ts +18 -4
  535. package/dist/storage/storage.service.js +44 -3
  536. package/dist/tools/approvals.controller.d.ts +1 -1
  537. package/dist/tools/approvals.controller.js +12 -8
  538. package/dist/tools/approvals.service.d.ts +27 -25
  539. package/dist/tools/approvals.service.js +324 -258
  540. package/dist/tools/breaker.d.ts +2 -2
  541. package/dist/tools/breaker.js +21 -3
  542. package/dist/tools/builtins/ask-user.d.ts +2 -2
  543. package/dist/tools/builtins/ask-user.js +1 -1
  544. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  545. package/dist/tools/builtins/builtin-tools.js +80 -0
  546. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  547. package/dist/tools/builtins/read-tool-output.js +1 -1
  548. package/dist/tools/builtins/sandbox/bash.js +2 -2
  549. package/dist/tools/builtins/sandbox/common.d.ts +7 -4
  550. package/dist/tools/builtins/sandbox/common.js +5 -3
  551. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  552. package/dist/tools/builtins/sandbox/edit.js +1 -1
  553. package/dist/tools/builtins/sandbox/glob.js +2 -2
  554. package/dist/tools/builtins/sandbox/grep.js +2 -2
  555. package/dist/tools/builtins/sandbox/read.js +1 -1
  556. package/dist/tools/builtins/sandbox/write.js +1 -1
  557. package/dist/tools/builtins/skill-load.d.ts +3 -3
  558. package/dist/tools/builtins/skill-load.js +1 -1
  559. package/dist/tools/canonical-json.d.ts +6 -0
  560. package/dist/tools/canonical-json.js +16 -0
  561. package/dist/tools/connector-content.controller.d.ts +1 -1
  562. package/dist/tools/connector-content.controller.js +11 -6
  563. package/dist/tools/connector-content.d.ts +12 -15
  564. package/dist/tools/connector-content.js +53 -18
  565. package/dist/tools/connectors.controller.d.ts +1 -1
  566. package/dist/tools/connectors.controller.js +21 -10
  567. package/dist/tools/connectors.service.d.ts +31 -13
  568. package/dist/tools/connectors.service.js +434 -344
  569. package/dist/tools/credentials.d.ts +17 -20
  570. package/dist/tools/credentials.js +55 -34
  571. package/dist/tools/drift.d.ts +29 -41
  572. package/dist/tools/drift.js +111 -79
  573. package/dist/tools/info.d.ts +12 -9
  574. package/dist/tools/info.js +33 -7
  575. package/dist/tools/job-ids.d.ts +13 -0
  576. package/dist/tools/job-ids.js +15 -0
  577. package/dist/tools/jobs.d.ts +24 -0
  578. package/dist/tools/jobs.js +69 -0
  579. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  580. package/dist/tools/oauth/flow-paths.js +38 -0
  581. package/dist/tools/oauth/flow.d.ts +30 -30
  582. package/dist/tools/oauth/flow.js +109 -81
  583. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  584. package/dist/tools/oauth/oauth.controller.js +12 -9
  585. package/dist/tools/oauth/tokens.d.ts +11 -3
  586. package/dist/tools/oauth/tokens.js +15 -14
  587. package/dist/tools/outputs.d.ts +13 -4
  588. package/dist/tools/outputs.js +47 -3
  589. package/dist/tools/pipeline.d.ts +62 -46
  590. package/dist/tools/pipeline.js +145 -64
  591. package/dist/tools/policy.d.ts +2 -2
  592. package/dist/tools/questions.controller.d.ts +1 -1
  593. package/dist/tools/questions.controller.js +8 -5
  594. package/dist/tools/questions.service.d.ts +25 -24
  595. package/dist/tools/questions.service.js +201 -142
  596. package/dist/tools/registry.d.ts +30 -20
  597. package/dist/tools/registry.js +73 -37
  598. package/dist/tools/specs.d.ts +5 -4
  599. package/dist/tools/specs.js +3 -1
  600. package/dist/tools/tools.module.d.ts +10 -0
  601. package/dist/tools/tools.module.js +91 -0
  602. package/dist/ui/call-extension.d.ts +16 -0
  603. package/dist/ui/call-extension.js +38 -0
  604. package/dist/ui/embed-token.d.ts +9 -5
  605. package/dist/ui/embed-token.js +34 -6
  606. package/dist/ui/ui-stream.d.ts +22 -17
  607. package/dist/ui/ui-stream.js +72 -12
  608. package/dist/ui/ui.module.d.ts +7 -0
  609. package/dist/ui/ui.module.js +28 -0
  610. package/dist/ui/views.controller.d.ts +14 -12
  611. package/dist/ui/views.controller.js +32 -25
  612. package/dist/ui/views.d.ts +9 -57
  613. package/dist/ui/views.js +43 -45
  614. package/package.json +11 -2
  615. package/dist/http/health.controller.d.ts +0 -26
  616. package/dist/http/health.controller.js +0 -79
  617. package/dist/http/tokens.d.ts +0 -131
  618. package/dist/http/tokens.js +0 -131
  619. package/dist/http/zod.pipe.d.ts +0 -8
  620. package/dist/http/zod.pipe.js +0 -14
  621. package/dist/identity/rate-limit.d.ts +0 -55
  622. package/dist/identity/rate-limit.js +0 -121
  623. package/dist/sandbox/lifecycle.d.ts +0 -21
  624. package/dist/sandbox/lifecycle.js +0 -68
  625. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  626. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,11 +1,30 @@
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 { isModelError, } from "@capybara-hq/plugin-sdk";
2
- import { Queue, Worker } from "bullmq";
11
+ import { getQueueToken } from "@nestjs/bullmq";
12
+ import { Inject, Injectable, Module } from "@nestjs/common";
3
13
  import { sql } from "kysely";
14
+ import { ExtensionsModule } from "../extensions/extensions.module.js";
15
+ import { ExtensionHost } from "../extensions/host.js";
4
16
  import { audit } from "../identity/audit.js";
5
- import { PurposeAttemptError } from "../models/purposes.js";
17
+ import { KernelDb } from "../infra/database/kernel-db.js";
18
+ import { TransactionHost } from "../infra/database/transaction-host.js";
19
+ import { Transactional } from "../infra/database/transactional.decorator.js";
20
+ import { QueueModule } from "../infra/queue/queue.module.js";
21
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
22
+ import { ModelsModule } from "../models/models.module.js";
23
+ import { ModelPurposesService, PurposeAttemptError } from "../models/purposes.js";
6
24
  import { fireObserve, hookDeniedAudit, hookDeniedEvent, hookRequestOf, } from "../runtime/hook-calls.js";
7
- import { bullConnection } from "../runtime/run-queue.js";
25
+ import { UsageReporter, UsageReportModule } from "../runtime/usage-report.js";
8
26
  import { HIDDEN_FORMAT_RE } from "../text.js";
27
+ import { EventLog, EventLogModule } from "./event-log.js";
9
28
  import { typedInvocation } from "./events.js";
10
29
  /**
11
30
  * Model-generated conversation titles (UI refresh B, spec §5.1 "Titles").
@@ -227,23 +246,7 @@ export async function runTitleJob(d, conversationId, attempt) {
227
246
  if (sent && d.hooks)
228
247
  observeTitle(d, scope, sent, out, null, signal);
229
248
  const title = cleanTitle(textOf(out.content));
230
- const { written, usage } = await d.db.transaction().execute(async (t) => {
231
- // Append first: it locks the conversation row FOR UPDATE before this transaction touches it.
232
- // Updating the title first held the row FOR NO KEY UPDATE, which lets in another
233
- // transaction's foreign key check (FOR KEY SHARE, e.g. inserting an approval); the append's
234
- // FOR UPDATE then waited for that one while it waited for the title row: 40P01
235
- const [ev] = await d.eventLog.append(conversationId, [usageEvent(attempt, out)], t);
236
- const row = title === null
237
- ? undefined
238
- : await t
239
- .updateTable("conversations")
240
- .set({ title, title_source: "generated" })
241
- .where("id", "=", conversationId)
242
- .where("title_source", "is", null)
243
- .returning("id")
244
- .executeTakeFirst();
245
- return { written: row !== undefined, usage: ev };
246
- });
249
+ const { written, usage } = await d.writes.writeResult(conversationId, attempt, out, title);
247
250
  if (usage) {
248
251
  await d.eventLog.notify(conversationId, usage.seq);
249
252
  void d.usageReport?.enqueue(conversationId, usage.seq);
@@ -312,7 +315,7 @@ async function checkTitleHooks(d, scope, target, request, signal) {
312
315
  };
313
316
  const entry = hookDeniedAudit(site, hookDeniedEvent(site, "model.request", verdict, { step: 0, attempt: 1 }).payload, verdict);
314
317
  entry.detail = { ...entry.detail, purpose: "title" };
315
- await d.db.transaction().execute((t) => audit(t, entry));
318
+ await d.writes.auditDenied(entry);
316
319
  d.log.warn("conversation title blocked by a policy hook", {
317
320
  conversationId: scope.conversationId,
318
321
  plugin: verdict.plugin,
@@ -343,31 +346,118 @@ function observeTitle(d, scope, sent, out, err, signal) {
343
346
  ...(out === null && { errorCode: errorCodeOf(err) }),
344
347
  }, signal, d.log);
345
348
  }
349
+ /**
350
+ * One title attempt's work ({@link runTitleJob}) over the injected services, with its writes in
351
+ * transactions of their own: the title with the call's usage event, and a policy denial's audit row.
352
+ */
353
+ let TitleGenerator = class TitleGenerator {
354
+ kdb;
355
+ eventLog;
356
+ purposes;
357
+ host;
358
+ usageReport;
359
+ log;
360
+ txHost;
361
+ constructor(kdb, eventLog, purposes,
362
+ /** The title call fires the plugin hooks (`model.request`, `model.response`). */
363
+ host, usageReport, log, txHost) {
364
+ this.kdb = kdb;
365
+ this.eventLog = eventLog;
366
+ this.purposes = purposes;
367
+ this.host = host;
368
+ this.usageReport = usageReport;
369
+ this.log = log;
370
+ this.txHost = txHost;
371
+ }
372
+ /** One attempt ({@link runTitleJob}); `signal` aborts the call (the worker stopping). */
373
+ run(conversationId, attempt, signal) {
374
+ const kdb = this.kdb;
375
+ const hooks = this.host?.hooks;
376
+ return runTitleJob({
377
+ get db() {
378
+ return kdb.db;
379
+ },
380
+ eventLog: this.eventLog,
381
+ purposes: this.purposes,
382
+ log: this.log,
383
+ ...(hooks !== undefined && { hooks }),
384
+ ...(this.usageReport !== undefined && { usageReport: this.usageReport }),
385
+ ...(signal !== undefined && { signal }),
386
+ writes: this,
387
+ }, conversationId, attempt);
388
+ }
389
+ /**
390
+ * Appends the call's `usage` event and writes the title while `title_source IS NULL` (a rename
391
+ * wins), in one transaction.
392
+ */
393
+ async writeResult(conversationId, attempt, out, title) {
394
+ // Append first: it locks the conversation row FOR UPDATE before this transaction touches it.
395
+ // Updating the title first held the row FOR NO KEY UPDATE, which lets in another
396
+ // transaction's foreign key check (FOR KEY SHARE, e.g. inserting an approval); the append's
397
+ // FOR UPDATE then waited for that one while it waited for the title row: 40P01
398
+ const [ev] = await this.eventLog.appendIn(conversationId, [usageEvent(attempt, out)]);
399
+ const row = title === null
400
+ ? undefined
401
+ : await this.kdb.db
402
+ .updateTable("conversations")
403
+ .set({ title, title_source: "generated" })
404
+ .where("id", "=", conversationId)
405
+ .where("title_source", "is", null)
406
+ .returning("id")
407
+ .executeTakeFirst();
408
+ return { written: row !== undefined, usage: ev };
409
+ }
410
+ /** The `hook.denied` audit row of a denied title call. */
411
+ async auditDenied(entry) {
412
+ await audit(this.kdb.db, entry);
413
+ }
414
+ };
415
+ __decorate([
416
+ Transactional({ propagation: "requires_new" })
417
+ ], TitleGenerator.prototype, "writeResult", null);
418
+ __decorate([
419
+ Transactional({ propagation: "requires_new" })
420
+ ], TitleGenerator.prototype, "auditDenied", null);
421
+ TitleGenerator = __decorate([
422
+ Injectable(),
423
+ __param(0, Inject(KernelDb)),
424
+ __param(1, Inject(EventLog)),
425
+ __param(2, Inject(ModelPurposesService)),
426
+ __param(3, Inject(ExtensionHost)),
427
+ __param(4, Inject(UsageReporter)),
428
+ __param(5, Inject(KERNEL_LOGGER)),
429
+ __param(6, Inject(TransactionHost))
430
+ ], TitleGenerator);
431
+ export { TitleGenerator };
346
432
  /**
347
433
  * The title queue: `maybeEnqueue` on any role (called by the run worker after a completed run),
348
- * the worker on the `worker` role. One attempt per job, no BullMQ retries: the next completed run
349
- * enqueues the next attempt.
434
+ * consumed on the `worker` role by its `@Processor`. One attempt per job, no BullMQ retries: the
435
+ * next completed run enqueues the next attempt.
350
436
  */
351
- export class TitleQueue {
352
- d;
437
+ let TitleQueue = class TitleQueue {
438
+ kdb;
353
439
  queue;
354
- queueConn;
440
+ generator;
441
+ log;
355
442
  worker;
356
- workerConn;
357
443
  closed = false;
358
444
  stopping = new AbortController();
359
- constructor(d) {
360
- this.d = d;
445
+ constructor(kdb, queue, generator, log) {
446
+ this.kdb = kdb;
447
+ this.queue = queue;
448
+ this.generator = generator;
449
+ this.log = log;
450
+ queue.on("error", (err) => this.log.error("title queue error", { err }));
361
451
  }
362
452
  /** Enqueues the next title attempt when one is due. Never throws (logs instead). */
363
453
  async maybeEnqueue(conversationId) {
364
454
  if (this.closed)
365
455
  return;
366
456
  try {
367
- const attempt = await titleAttemptDue(this.d.db, conversationId);
457
+ const attempt = await titleAttemptDue(this.kdb.db, conversationId);
368
458
  if (attempt === null)
369
459
  return;
370
- await this.getQueue().add(JOB, { conversationId, attempt }, {
460
+ await this.queue.add(JOB, { conversationId, attempt }, {
371
461
  jobId: titleJobId(conversationId, attempt),
372
462
  attempts: 1,
373
463
  removeOnComplete: true,
@@ -375,48 +465,55 @@ export class TitleQueue {
375
465
  });
376
466
  }
377
467
  catch (err) {
378
- this.d.log.warn("cannot enqueue conversation title", { conversationId, err });
468
+ this.log.warn("cannot enqueue conversation title", { conversationId, err });
379
469
  }
380
470
  }
381
- startWorker() {
471
+ /** Starts consuming (worker role only): `worker` is the `@Processor` worker of {@link TITLE_QUEUE}. */
472
+ startWorker(worker) {
382
473
  if (this.worker || this.closed)
383
474
  return;
384
- const { jobLockMs, stalledIntervalMs } = this.d.config().runtime;
385
- this.workerConn = bullConnection(this.d.redisUrl, this.d.log);
386
- this.worker = new Worker(TITLE_QUEUE, (j) => this.process(j), {
387
- connection: this.workerConn,
388
- concurrency: 4,
389
- lockDuration: jobLockMs,
390
- stalledInterval: stalledIntervalMs,
391
- maxStalledCount: 1,
392
- });
393
- this.worker.on("error", (err) => this.d.log.error("title worker error", { err }));
475
+ this.worker = worker;
476
+ void worker.run().catch((err) => this.log.error("title worker error", { err }));
477
+ }
478
+ /** The worker's `error` event. */
479
+ onError(err) {
480
+ this.log.error("title worker error", { err });
394
481
  }
482
+ /** One title job (the `@Processor` calls it). */
395
483
  async process(j) {
396
- await runTitleJob({ ...this.d, signal: this.stopping.signal }, j.data.conversationId, j.data.attempt);
484
+ await this.generator.run(j.data.conversationId, j.data.attempt, this.stopping.signal);
397
485
  }
486
+ /** Stops: no more enqueues, the call in flight is aborted, the worker closes. */
398
487
  async stop() {
399
488
  this.closed = true;
400
489
  this.stopping.abort();
401
490
  const w = this.worker;
402
491
  this.worker = undefined;
403
492
  await w?.close().catch(() => { });
404
- const q = this.queue;
405
- this.queue = undefined;
406
- await q?.close().catch(() => { });
407
- for (const c of [this.workerConn, this.queueConn]) {
408
- if (c)
409
- await c.quit().catch(() => c.disconnect());
410
- }
411
- this.workerConn = undefined;
412
- this.queueConn = undefined;
413
493
  }
414
- getQueue() {
415
- if (!this.queue) {
416
- this.queueConn = bullConnection(this.d.redisUrl, this.d.log);
417
- this.queue = new Queue(TITLE_QUEUE, { connection: this.queueConn });
418
- this.queue.on("error", (err) => this.d.log.error("title queue error", { err }));
419
- }
420
- return this.queue;
421
- }
422
- }
494
+ };
495
+ TitleQueue = __decorate([
496
+ Injectable(),
497
+ __param(0, Inject(KernelDb)),
498
+ __param(1, Inject(getQueueToken(TITLE_QUEUE))),
499
+ __param(2, Inject(TitleGenerator)),
500
+ __param(3, Inject(KERNEL_LOGGER))
501
+ ], TitleQueue);
502
+ export { TitleQueue };
503
+ /** Conversation titles: the queue and the job (consumed on the worker role). */
504
+ let TitlesModule = class TitlesModule {
505
+ };
506
+ TitlesModule = __decorate([
507
+ Module({
508
+ imports: [
509
+ EventLogModule,
510
+ ModelsModule,
511
+ ExtensionsModule,
512
+ UsageReportModule,
513
+ QueueModule.registerQueue(TITLE_QUEUE),
514
+ ],
515
+ providers: [TitleGenerator, TitleQueue],
516
+ exports: [TitleQueue],
517
+ })
518
+ ], TitlesModule);
519
+ export { TitlesModule };
package/dist/ctx/bus.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { runOutsideTransaction } from "../infra/database/transaction-host.js";
2
+ import { withoutLogContext } from "../log-context.js";
1
3
  import { assertNamespace } from "./namespace.js";
2
4
  /** 未注入 logger 时的兜底:输出到 stderr。 */
3
5
  const consoleLog = {
@@ -19,9 +21,13 @@ export function createBusSubscriber(subFactory, log = consoleLog) {
19
21
  return conn;
20
22
  const c = subFactory();
21
23
  c.on("message", (channel, message) => {
22
- for (const h of [...(channels.get(channel)?.handlers ?? [])]) {
23
- invokeIsolated(log, channel, () => h(message));
24
- }
24
+ // the connection's callbacks carry the async context of the first subscribe (a request's
25
+ // log fields, possibly an open transaction): every handler starts from an empty one
26
+ runOutsideTransaction(() => withoutLogContext(() => {
27
+ for (const h of [...(channels.get(channel)?.handlers ?? [])]) {
28
+ invokeIsolated(log, channel, () => h(message));
29
+ }
30
+ }));
25
31
  });
26
32
  c.on("error", (err) => log.error("bus subscriber connection error", { err }));
27
33
  conn = c;
@@ -3,6 +3,8 @@ import type { Redis } from "ioredis";
3
3
  import { Kysely } from "kysely";
4
4
  import { type RegisteredHook } from "../extensions/hooks.js";
5
5
  import { RegistrationLedger } from "../extensions/ledger.js";
6
+ import type { LockService } from "../infra/lock/lock.service.js";
7
+ import type { EmbedTokens } from "../ui/embed-token.js";
6
8
  import { type UiActionHandler, type UiRender } from "../ui/registry.js";
7
9
  import { type BusSubscriber } from "./bus.js";
8
10
  import { type Keyring } from "./secrets.js";
@@ -13,9 +15,13 @@ export interface KernelDeps {
13
15
  /** PG 建立连接的超时(迁移器的独立连接使用)。 */
14
16
  connectTimeoutMs?: number;
15
17
  redis: Redis;
18
+ /** The kernel's lock primitives (`ctx.lock`, the dedupe markers). */
19
+ locks: Pick<LockService, "lease" | "renew" | "releaseIf">;
16
20
  busSubscriber: BusSubscriber;
17
21
  redisUrl: string;
18
22
  keyring: Keyring;
23
+ /** Verifies embed tokens (`ctx.ui` embed requests; the one `EmbedTokens` provider). */
24
+ embedTokens: Pick<EmbedTokens, "verify">;
19
25
  runWorkers: boolean;
20
26
  /** 内核 logger(`debug` 可选:插件 Logger 没有它,测试可不给)。 */
21
27
  log: Logger & {
@@ -6,8 +6,7 @@ import { enabledExtensionsQuery, isExtensionEnabled } from "../extensions/enable
6
6
  import { checkHookRegistration } from "../extensions/hooks.js";
7
7
  import { RegistrationLedger } from "../extensions/ledger.js";
8
8
  import { audit } from "../identity/audit.js";
9
- import { StorageService } from "../storage/storage.service.js";
10
- import { EmbedTokens } from "../ui/embed-token.js";
9
+ import { PrefixedStorage } from "../storage/storage.service.js";
11
10
  import { canUsePlace, orgUiTopic, PluginUiRegistration, } from "../ui/registry.js";
12
11
  import { createBus } from "./bus.js";
13
12
  import { createKv } from "./kv.js";
@@ -58,16 +57,15 @@ async function invalidateTargetOk(db, plugin, orgId, conversationId) {
58
57
  /** 越权审计去重键的 TTL:同一插件同一项在此期间只记一次。 */
59
58
  const DENIAL_DEDUPE_TTL_SECONDS = 30 * 24 * 3600;
60
59
  /**
61
- * Records one `extension.permission_denied` audit, deduplicated per (extension, item) through Redis
62
- * `SET NX EX` (once across replicas). When the audit write fails, the dedup key is removed (the next
60
+ * Records one `extension.permission_denied` audit, deduplicated per (extension, item) through a
61
+ * Redis marker set unless present (`LockService.lease`; once across replicas). When the audit write fails, the dedup key is removed (the next
63
62
  * violation tries again) and a warning is logged; nothing is thrown to the extension (it already got
64
63
  * an ExtensionPermissionError).
65
64
  */
66
65
  async function recordDenial(deps, plugin, item) {
67
66
  const key = `capk:plugin-permission-denied:${plugin}:${item}`;
68
67
  try {
69
- const first = await deps.redis.set(key, "1", "EX", DENIAL_DEDUPE_TTL_SECONDS, "NX");
70
- if (first !== "OK")
68
+ if (!(await deps.locks.lease(key, "1", DENIAL_DEDUPE_TTL_SECONDS * 1000)))
71
69
  return;
72
70
  try {
73
71
  await audit(kernelDb(deps.db), {
@@ -195,7 +193,7 @@ export function createExtensionContext(deps, manifest, deploymentConfig, extensi
195
193
  const lifecycle = new AbortController();
196
194
  /** 撤销时队列 worker 排空的截止时刻(epoch 毫秒);undefined = 一直等(停机路径)。 */
197
195
  let drainDeadline;
198
- const lock = createLock(deps.redis, name);
196
+ const lock = createLock(deps.locks, name);
199
197
  const tag = (fields) => ({ ...fields, plugin: name });
200
198
  let closing;
201
199
  const perms = manifest.permissions ?? {};
@@ -214,7 +212,7 @@ export function createExtensionContext(deps, manifest, deploymentConfig, extensi
214
212
  // 键加前缀 plugins/<name>/<orgId>/。没有提供方时各方法 reject storage.unavailable
215
213
  // (宿主不会加载这样的插件,见 approvals.ts;单独构造 ctx 的测试会走到这里)
216
214
  const storageApi = perms.storage
217
- ? new StorageService({
215
+ ? new PrefixedStorage({
218
216
  provider: () => extensionPointAccess.providers(OBJECT_STORE_EXTENSION_POINT)[0]?.impl,
219
217
  plugins: async () => [name],
220
218
  }).forPlugin(name)
@@ -229,7 +227,7 @@ export function createExtensionContext(deps, manifest, deploymentConfig, extensi
229
227
  ...(manifest.optional ?? []),
230
228
  ]);
231
229
  const uiReg = new PluginUiRegistration(manifest, deny);
232
- const embedTokens = new EmbedTokens(deps.keyring);
230
+ const embedTokens = deps.embedTokens;
233
231
  const uiPlaces = new Map((manifest.ui ?? []).map((c) => [c.id, c.place]));
234
232
  /** 校验能力可取用(非 brokered、已在清单声明),返回其登记信息。 */
235
233
  const checkExtensionPoint = (ref) => {
@@ -1,4 +1,8 @@
1
1
  import type { ExtensionContext } from "@capybara-hq/plugin-sdk";
2
- import type { Redis } from "ioredis";
3
- /** 创建带命名空间的 ctx.lock:键为 `cap:<namespace>:lock:<key>`,token 比对保证只操作自己持有的锁。 */
4
- export declare function createLock(redis: Redis, namespace: string): ExtensionContext["lock"];
2
+ import type { LockService } from "../infra/lock/lock.service.js";
3
+ /**
4
+ * Builds a namespaced `ctx.lock` on the kernel's lock primitives (`LockService.lease / renew /
5
+ * releaseIf`): key `cap:<namespace>:lock:<key>`, a random token per acquisition, so renew and
6
+ * release only touch a lock this holder still owns. The extension renews it itself (no timer).
7
+ */
8
+ export declare function createLock(locks: Pick<LockService, "lease" | "renew" | "releaseIf">, namespace: string): ExtensionContext["lock"];
package/dist/ctx/lock.js CHANGED
@@ -1,19 +1,11 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { assertNamespace } from "./namespace.js";
3
- const RENEW = `
4
- if redis.call('GET', KEYS[1]) == ARGV[1] then
5
- return redis.call('PEXPIRE', KEYS[1], ARGV[2])
6
- end
7
- return 0
8
- `;
9
- const RELEASE = `
10
- if redis.call('GET', KEYS[1]) == ARGV[1] then
11
- return redis.call('DEL', KEYS[1])
12
- end
13
- return 0
14
- `;
15
- /** 创建带命名空间的 ctx.lock:键为 `cap:<namespace>:lock:<key>`,token 比对保证只操作自己持有的锁。 */
16
- export function createLock(redis, namespace) {
3
+ /**
4
+ * Builds a namespaced `ctx.lock` on the kernel's lock primitives (`LockService.lease / renew /
5
+ * releaseIf`): key `cap:<namespace>:lock:<key>`, a random token per acquisition, so renew and
6
+ * release only touch a lock this holder still owns. The extension renews it itself (no timer).
7
+ */
8
+ export function createLock(locks, namespace) {
17
9
  assertNamespace(namespace);
18
10
  return {
19
11
  async acquire(key, opts) {
@@ -23,15 +15,12 @@ export function createLock(redis, namespace) {
23
15
  }
24
16
  const redisKey = `cap:${namespace}:lock:${key}`;
25
17
  const token = randomUUID();
26
- const ok = await redis.set(redisKey, token, "PX", ttlMs, "NX");
27
- if (ok !== "OK")
18
+ if (!(await locks.lease(redisKey, token, ttlMs)))
28
19
  return null;
29
20
  return {
30
- async renew() {
31
- return Number(await redis.eval(RENEW, 1, redisKey, token, ttlMs)) === 1;
32
- },
21
+ renew: () => locks.renew(redisKey, token, ttlMs),
33
22
  async release() {
34
- await redis.eval(RELEASE, 1, redisKey, token);
23
+ await locks.releaseIf(redisKey, token);
35
24
  },
36
25
  };
37
26
  },
package/dist/ctx/queue.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Queue, Worker } from "bullmq";
2
2
  import { Redis } from "ioredis";
3
+ import { withJobContext } from "../log-context.js";
3
4
  import { assertNamespace } from "./namespace.js";
4
5
  /** 未注入 logger 时的兜底:输出到 stderr。 */
5
6
  const consoleLog = {
@@ -60,7 +61,7 @@ export function createQueue(redisUrl, namespace, opts) {
60
61
  return;
61
62
  const st = { n: 0, idle: [] };
62
63
  active.set(name, st);
63
- const worker = new Worker(queueName(name), async (job) => {
64
+ const worker = new Worker(queueName(name), (job) => withJobContext(queueName(name), job, async () => {
64
65
  st.n += 1;
65
66
  try {
66
67
  await handler(job.data);
@@ -71,7 +72,7 @@ export function createQueue(redisUrl, namespace, opts) {
71
72
  for (const w of st.idle.splice(0))
72
73
  w();
73
74
  }
74
- },
75
+ }),
75
76
  // 撤销插件实例时到点仍未完成的任务被强制留在队列里(锁过期后按 stalled 交回),新实例再执行一次:
76
77
  // 任务是至少一次。stalled 次数放宽到 3,连续几次撤销 / 升级不至于把任务判为失败
77
78
  { connection: newConn(), concurrency: o?.concurrency ?? 1, maxStalledCount: 3 });
@@ -1,5 +1,7 @@
1
1
  import type { ExtensionContext } from "@capybara-hq/plugin-sdk";
2
2
  import type { Kysely } from "kysely";
3
+ import type { KernelDb } from "../infra/database/kernel-db.js";
4
+ import type { TransactionHost } from "../infra/database/transaction-host.js";
3
5
  /** 主密钥环:current 用于新包装,previous 仅用于解包。原始密钥只存在于闭包内。 */
4
6
  export interface Keyring {
5
7
  readonly currentId: string;
@@ -40,6 +42,12 @@ export type KernelSecrets = ExtensionContext["secrets"] & {
40
42
  * `db` 可以是 Kysely 事务:此时读写(含首次创建组织数据密钥)都在该事务内。
41
43
  */
42
44
  export declare function createSecrets(db: AnyDb, keyring: Keyring, namespace: string): KernelSecrets;
43
- /** 把非当前主密钥包装的数据密钥改用当前主密钥重新包装,返回处理条数。 */
44
- export declare function rewrapDataKeys(db: AnyDb, keyring: Keyring): Promise<number>;
45
+ /**
46
+ * 把非当前主密钥包装的数据密钥改用当前主密钥重新包装,返回处理条数。One transaction over the given
47
+ * handles (`KernelDb` + its `TransactionHost`, as `DatabaseModule` provides them).
48
+ */
49
+ export declare function rewrapDataKeys(handles: {
50
+ db: Pick<KernelDb, "db">;
51
+ txHost: Pick<TransactionHost, "run">;
52
+ }, keyring: Keyring): Promise<number>;
45
53
  export {};
@@ -142,9 +142,13 @@ export function createSecrets(db, keyring, namespace) {
142
142
  },
143
143
  };
144
144
  }
145
- /** 把非当前主密钥包装的数据密钥改用当前主密钥重新包装,返回处理条数。 */
146
- export async function rewrapDataKeys(db, keyring) {
147
- return db.transaction().execute(async (trx) => {
145
+ /**
146
+ * 把非当前主密钥包装的数据密钥改用当前主密钥重新包装,返回处理条数。One transaction over the given
147
+ * handles (`KernelDb` + its `TransactionHost`, as `DatabaseModule` provides them).
148
+ */
149
+ export async function rewrapDataKeys(handles, keyring) {
150
+ return handles.txHost.run(async () => {
151
+ const trx = handles.db.db;
148
152
  const rows = await trx
149
153
  .withSchema("capybara")
150
154
  .selectFrom("org_data_keys")
@@ -1116,7 +1116,7 @@ export interface PluginInstallComponentsTable {
1116
1116
  */
1117
1117
  dropped: ColumnType<boolean, boolean | undefined, boolean>;
1118
1118
  }
1119
- export type KernelDb = Kysely<KernelDatabase>;
1119
+ export type KernelSchemaDb = Kysely<KernelDatabase>;
1120
1120
  /** 把无类型的 Kysely 实例收窄成内核 schema 视图(`capybara`)。 */
1121
- export declare function kernelDb(db: Kysely<any>): KernelDb;
1121
+ export declare function kernelDb(db: Kysely<any>): KernelSchemaDb;
1122
1122
  export {};
package/dist/db/pool.d.ts CHANGED
@@ -18,4 +18,9 @@ export declare function pgConnectOptions(cfg: {
18
18
  */
19
19
  export declare function createDb(url: string, poolMax: number, onError?: (err: Error) => void, opts?: {
20
20
  connectTimeoutMs?: number | undefined;
21
+ /**
22
+ * Error of a client while it is checked out: pg-pool drops its own listener on checkout, so
23
+ * without this a backend killed between two statements is an uncaught exception.
24
+ */
25
+ onClientError?: ((err: Error) => void) | undefined;
21
26
  }): Kysely<any>;
package/dist/db/pool.js CHANGED
@@ -24,5 +24,6 @@ export function createDb(url, poolMax, onError = (err) => console.error("[db] id
24
24
  ...pgConnectOptions(opts),
25
25
  });
26
26
  pool.on("error", onError);
27
+ pool.on("connect", (client) => client.on("error", opts.onClientError ?? onError));
27
28
  return new Kysely({ dialect: new PostgresDialect({ pool }) });
28
29
  }
package/dist/errors.d.ts CHANGED
@@ -8,6 +8,7 @@ export declare const ERROR_CODES: {
8
8
  readonly validation_failed: 400;
9
9
  readonly forbidden: 403;
10
10
  readonly conflict: 409;
11
+ readonly "lock.acquire_failed": 409;
11
12
  readonly payload_too_large: 413;
12
13
  readonly unsupported_media_type: 415;
13
14
  readonly rate_limited: 429;
@@ -61,6 +62,7 @@ export declare const ERROR_CODES: {
61
62
  readonly "extension.not_disabled": 409;
62
63
  readonly "packages.npm_failed": 502;
63
64
  readonly "bootstrap.integrity_mismatch": 500;
65
+ readonly "bootstrap.download_failed": 502;
64
66
  readonly "bootstrap.missing_file": 500;
65
67
  readonly "catalog.invalid_manifest": 422;
66
68
  readonly "catalog.legacy_format": 422;
package/dist/errors.js CHANGED
@@ -8,6 +8,7 @@ export const ERROR_CODES = {
8
8
  validation_failed: 400,
9
9
  forbidden: 403,
10
10
  conflict: 409,
11
+ "lock.acquire_failed": 409,
11
12
  payload_too_large: 413,
12
13
  unsupported_media_type: 415,
13
14
  rate_limited: 429,
@@ -61,6 +62,7 @@ export const ERROR_CODES = {
61
62
  "extension.not_disabled": 409,
62
63
  "packages.npm_failed": 502,
63
64
  "bootstrap.integrity_mismatch": 500,
65
+ "bootstrap.download_failed": 502,
64
66
  "bootstrap.missing_file": 500,
65
67
  "catalog.invalid_manifest": 422,
66
68
  "catalog.legacy_format": 422,