@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,12 +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 { withJobContext } from "../log-context.js";
6
- 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";
7
24
  import { fireObserve, hookDeniedAudit, hookDeniedEvent, hookRequestOf, } from "../runtime/hook-calls.js";
8
- import { bullConnection } from "../runtime/run-queue.js";
25
+ import { UsageReporter, UsageReportModule } from "../runtime/usage-report.js";
9
26
  import { HIDDEN_FORMAT_RE } from "../text.js";
27
+ import { EventLog, EventLogModule } from "./event-log.js";
10
28
  import { typedInvocation } from "./events.js";
11
29
  /**
12
30
  * Model-generated conversation titles (UI refresh B, spec §5.1 "Titles").
@@ -228,23 +246,7 @@ export async function runTitleJob(d, conversationId, attempt) {
228
246
  if (sent && d.hooks)
229
247
  observeTitle(d, scope, sent, out, null, signal);
230
248
  const title = cleanTitle(textOf(out.content));
231
- const { written, usage } = await d.db.transaction().execute(async (t) => {
232
- // Append first: it locks the conversation row FOR UPDATE before this transaction touches it.
233
- // Updating the title first held the row FOR NO KEY UPDATE, which lets in another
234
- // transaction's foreign key check (FOR KEY SHARE, e.g. inserting an approval); the append's
235
- // FOR UPDATE then waited for that one while it waited for the title row: 40P01
236
- const [ev] = await d.eventLog.append(conversationId, [usageEvent(attempt, out)], t);
237
- const row = title === null
238
- ? undefined
239
- : await t
240
- .updateTable("conversations")
241
- .set({ title, title_source: "generated" })
242
- .where("id", "=", conversationId)
243
- .where("title_source", "is", null)
244
- .returning("id")
245
- .executeTakeFirst();
246
- return { written: row !== undefined, usage: ev };
247
- });
249
+ const { written, usage } = await d.writes.writeResult(conversationId, attempt, out, title);
248
250
  if (usage) {
249
251
  await d.eventLog.notify(conversationId, usage.seq);
250
252
  void d.usageReport?.enqueue(conversationId, usage.seq);
@@ -313,7 +315,7 @@ async function checkTitleHooks(d, scope, target, request, signal) {
313
315
  };
314
316
  const entry = hookDeniedAudit(site, hookDeniedEvent(site, "model.request", verdict, { step: 0, attempt: 1 }).payload, verdict);
315
317
  entry.detail = { ...entry.detail, purpose: "title" };
316
- await d.db.transaction().execute((t) => audit(t, entry));
318
+ await d.writes.auditDenied(entry);
317
319
  d.log.warn("conversation title blocked by a policy hook", {
318
320
  conversationId: scope.conversationId,
319
321
  plugin: verdict.plugin,
@@ -344,31 +346,118 @@ function observeTitle(d, scope, sent, out, err, signal) {
344
346
  ...(out === null && { errorCode: errorCodeOf(err) }),
345
347
  }, signal, d.log);
346
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 };
347
432
  /**
348
433
  * The title queue: `maybeEnqueue` on any role (called by the run worker after a completed run),
349
- * the worker on the `worker` role. One attempt per job, no BullMQ retries: the next completed run
350
- * 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.
351
436
  */
352
- export class TitleQueue {
353
- d;
437
+ let TitleQueue = class TitleQueue {
438
+ kdb;
354
439
  queue;
355
- queueConn;
440
+ generator;
441
+ log;
356
442
  worker;
357
- workerConn;
358
443
  closed = false;
359
444
  stopping = new AbortController();
360
- constructor(d) {
361
- 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 }));
362
451
  }
363
452
  /** Enqueues the next title attempt when one is due. Never throws (logs instead). */
364
453
  async maybeEnqueue(conversationId) {
365
454
  if (this.closed)
366
455
  return;
367
456
  try {
368
- const attempt = await titleAttemptDue(this.d.db, conversationId);
457
+ const attempt = await titleAttemptDue(this.kdb.db, conversationId);
369
458
  if (attempt === null)
370
459
  return;
371
- await this.getQueue().add(JOB, { conversationId, attempt }, {
460
+ await this.queue.add(JOB, { conversationId, attempt }, {
372
461
  jobId: titleJobId(conversationId, attempt),
373
462
  attempts: 1,
374
463
  removeOnComplete: true,
@@ -376,48 +465,55 @@ export class TitleQueue {
376
465
  });
377
466
  }
378
467
  catch (err) {
379
- this.d.log.warn("cannot enqueue conversation title", { conversationId, err });
468
+ this.log.warn("cannot enqueue conversation title", { conversationId, err });
380
469
  }
381
470
  }
382
- startWorker() {
471
+ /** Starts consuming (worker role only): `worker` is the `@Processor` worker of {@link TITLE_QUEUE}. */
472
+ startWorker(worker) {
383
473
  if (this.worker || this.closed)
384
474
  return;
385
- const { jobLockMs, stalledIntervalMs } = this.d.config().runtime;
386
- this.workerConn = bullConnection(this.d.redisUrl, this.d.log);
387
- this.worker = new Worker(TITLE_QUEUE, (j) => withJobContext(TITLE_QUEUE, j, () => this.process(j)), {
388
- connection: this.workerConn,
389
- concurrency: 4,
390
- lockDuration: jobLockMs,
391
- stalledInterval: stalledIntervalMs,
392
- maxStalledCount: 1,
393
- });
394
- 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 });
395
481
  }
482
+ /** One title job (the `@Processor` calls it). */
396
483
  async process(j) {
397
- 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);
398
485
  }
486
+ /** Stops: no more enqueues, the call in flight is aborted, the worker closes. */
399
487
  async stop() {
400
488
  this.closed = true;
401
489
  this.stopping.abort();
402
490
  const w = this.worker;
403
491
  this.worker = undefined;
404
492
  await w?.close().catch(() => { });
405
- const q = this.queue;
406
- this.queue = undefined;
407
- await q?.close().catch(() => { });
408
- for (const c of [this.workerConn, this.queueConn]) {
409
- if (c)
410
- await c.quit().catch(() => c.disconnect());
411
- }
412
- this.workerConn = undefined;
413
- this.queueConn = undefined;
414
493
  }
415
- getQueue() {
416
- if (!this.queue) {
417
- this.queueConn = bullConnection(this.d.redisUrl, this.d.log);
418
- this.queue = new Queue(TITLE_QUEUE, { connection: this.queueConn });
419
- this.queue.on("error", (err) => this.d.log.error("title queue error", { err }));
420
- }
421
- return this.queue;
422
- }
423
- }
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
  },
@@ -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")
@@ -269,7 +269,7 @@ export interface RunsTable {
269
269
  /** 0054: when this run's `subagents` wait expires (set while it waits on sub-agents). */
270
270
  wait_expires_at: TsNullable;
271
271
  }
272
- /** 0053: one row per sub-agent dispatch (an `agent` call of a parent run). */
272
+ /** 0053: one row per sub-agent dispatch (an `Agent` call of a parent run). */
273
273
  export interface SubagentDispatchesTable {
274
274
  parent_run_id: string;
275
275
  parent_call_id: string;
@@ -400,7 +400,7 @@ export interface ApprovalsTable {
400
400
  /** 0056: the reason given with a denial (null without one). */
401
401
  deny_reason: Generated<string | null>;
402
402
  }
403
- /** 0010_tools.sql:ask_user 提问。 */
403
+ /** 0010_tools.sql:AskUserQuestion 提问。 */
404
404
  export interface QuestionsTable {
405
405
  id: string;
406
406
  org_id: string;
@@ -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;
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,
@@ -1,5 +1,7 @@
1
1
  import type { ModelUsage } from "@capybara-hq/plugin-sdk";
2
- import type { KernelDb } from "../db/kernel-schema.js";
2
+ import type { KernelSchemaDb } from "../db/kernel-schema.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
+ import { TransactionHost } from "../infra/database/transaction-host.js";
3
5
  /**
4
6
  * 评测运行的 token 预算(C7):`eval_runs.tokens_used` 在 PG 里原子累加,达到 `token_cap` 的同一条语句把
5
7
  * 状态置为 `capped`;worker 每次请求前查 {@link runActive},不活跃就不再发新请求。在途请求可以越过上限,
@@ -13,7 +15,7 @@ export declare const usageTokens: (u: ModelUsage) => number;
13
15
  * 累加用量:`UPDATE … RETURNING`,累加后 ≥ 上限且运行仍在执行 → 同一语句置 `capped`、记 `finished_at`。
14
16
  * 运行已不在(被删)时返回 `{ used: 0, capped: true }`,调用方同样停下。
15
17
  */
16
- export declare function consumeTokens(db: KernelDb, runId: string, tokens: number): Promise<{
18
+ export declare function consumeTokens(db: KernelSchemaDb, runId: string, tokens: number): Promise<{
17
19
  used: number;
18
20
  capped: boolean;
19
21
  }>;
@@ -27,35 +29,54 @@ export declare const TOO_MANY_ERRORS: {
27
29
  * 同一语句置 `failed`、记原因与 `finished_at`;成功 → 清零。返回运行是否因此被熔断。
28
30
  * 多个任务并发时「连续」按写入顺序计(近似),足以挡住「每个请求都失败」的运行。
29
31
  */
30
- export declare function recordOutcome(db: KernelDb, runId: string, ok: boolean, maxConsecutive: number): Promise<{
32
+ export declare function recordOutcome(db: KernelSchemaDb, runId: string, ok: boolean, maxConsecutive: number): Promise<{
31
33
  tripped: boolean;
32
34
  }>;
33
35
  /**
34
36
  * 运行停下(取消 / 越限 / 熔断 / 删除评测集)时:还在等评委的结果(`judge_status = 'pending'`)记 `skipped`,
35
37
  * 否则这些用例永远算不上做完。给了 `caseId` 只处理该用例。在途的评委请求做完后写不进来(条件是 pending),用量照样计入。
36
38
  */
37
- export declare function skipPendingJudges(db: KernelDb, runId: string, caseId?: string): Promise<void>;
38
- /**
39
- * 重算 `cases_done` = 结果全部结束、且没有等评委的结果的用例数(幂等:任务重做不会重复计数),达到 `cases_total` 且运行仍在执行 →
40
- * `completed`。先锁运行行再数(READ COMMITTED 下新语句看得到其他任务已提交的结果),并发完成的任务不会互相覆盖。
41
- * worker 每做完一个用例、取消、入队失败时都调用。在事务里调用时锁随事务释放。
42
- */
43
- export declare function recountCases(db: KernelDb, runId: string): Promise<void>;
39
+ export declare function skipPendingJudges(db: KernelSchemaDb, runId: string, caseId?: string): Promise<void>;
44
40
  /**
45
41
  * 运行仍在执行(queued / running),且所属组织与评测集的 agent 都没有删除:取消、达到上限、已结束、运行行已删除、
46
42
  * 组织或 agent 已删除都为 false(删除组织 / agent 时会显式取消运行,这里再兜一次底,挡住删除与请求之间的竞争)。
47
43
  */
48
- export declare function runActive(db: KernelDb, runId: string): Promise<boolean>;
44
+ export declare function runActive(db: KernelSchemaDb, runId: string): Promise<boolean>;
49
45
  /**
50
- * 删除组织或 agent 时(调用方的事务内)取消其在执行的评测运行:运行置 `cancelled`,未开始的结果 `skipped`、
51
- * 等评委的记 `skipped`,重算进度,每个运行写审计 `eval.run_cancelled`(detail 带原因)。在途请求做完后写不进新的请求
52
- * (worker 每次请求前查 {@link runActive})。运行创建者离开组织不取消(Ruling S1-b:管理员的评测运行是组织的工作)。
46
+ * The eval run bookkeeping that needs a transaction: the progress recount (it locks the run row)
47
+ * and the cancellation of an org's or agent's runs when it is deleted. One provider, shared by the
48
+ * evals, the agents and the orgs.
53
49
  */
54
- export declare function cancelEvalRuns(trx: KernelDb, scope: {
55
- orgId: string;
56
- agentId?: string;
57
- }, actor: {
58
- accountId: string;
59
- tokenId?: string;
60
- }, reason: "org_deleted" | "agent_deleted"): Promise<string[]>;
50
+ export declare class EvalBudget {
51
+ private readonly db;
52
+ readonly txHost: TransactionHost;
53
+ constructor(db: KernelDb, txHost: TransactionHost);
54
+ /**
55
+ * 重算 `cases_done` = 结果全部结束、且没有等评委的结果的用例数(幂等:任务重做不会重复计数),达到 `cases_total` 且运行仍在执行 →
56
+ * `completed`。先锁运行行再数(READ COMMITTED 下新语句看得到其他任务已提交的结果),并发完成的任务不会互相覆盖。
57
+ * worker 每做完一个用例、取消、入队失败时都调用。Joins the caller's transaction (the lock is released with it),
58
+ * else runs in its own.
59
+ */
60
+ recountCases(runId: string): Promise<void>;
61
+ /**
62
+ * 删除组织或 agent 时(调用方的事务内)取消其在执行的评测运行:运行置 `cancelled`,未开始的结果 `skipped`、
63
+ * 等评委的记 `skipped`,重算进度,每个运行写审计 `eval.run_cancelled`(detail 带原因)。在途请求做完后写不进新的请求
64
+ * (worker 每次请求前查 {@link runActive})。运行创建者离开组织不取消(Ruling S1-b:管理员的评测运行是组织的工作)。
65
+ */
66
+ cancelRuns(scope: {
67
+ orgId: string;
68
+ agentId?: string;
69
+ }, actor: {
70
+ accountId: string;
71
+ tokenId?: string;
72
+ }, reason: "org_deleted" | "agent_deleted"): Promise<string[]>;
73
+ /**
74
+ * A run that stopped (cancelled, its set deleted): its results not started yet are `skipped`,
75
+ * the pending judges too, and the progress is recounted, in the caller's transaction.
76
+ */
77
+ skipRun(runId: string): Promise<void>;
78
+ }
79
+ /** {@link EvalBudget} on its own: the agents and the orgs import it without the evals. */
80
+ export declare class EvalBudgetModule {
81
+ }
61
82
  export declare const addUsage: (a: ModelUsage, b: ModelUsage) => ModelUsage;