@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,20 +1,39 @@
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 { assertValidDeclarations, EFFORT_VALUES, parseExtensionPoint, } from "@capybara-hq/plugin-sdk";
11
+ import { Inject, Injectable, Module, Optional } from "@nestjs/common";
2
12
  import { ApiError } from "../errors.js";
13
+ import { ExtensionRegistry, ExtensionRegistryModule } from "../extensions/registry.js";
14
+ import { CacheService } from "../infra/cache/cache.service.js";
15
+ import { Cacheable } from "../infra/cache/cacheable.decorator.js";
16
+ import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
3
17
  /** 供应商模型列表在 Redis 中的缓存时长(秒)。 */
4
18
  const MODELS_TTL_SECONDS = 600;
5
19
  /** 单个供应商 `listModels()` 的时限(毫秒):一个卡住的供应商不拖住整个列表与解析。 */
6
20
  export const LIST_MODELS_TIMEOUT_MS = 10_000;
21
+ /** Optional provider: the `listModels()` time limit (ms) instead of {@link LIST_MODELS_TIMEOUT_MS} (tests). */
22
+ export const LIST_MODELS_TIMEOUT = Symbol("LIST_MODELS_TIMEOUT");
7
23
  /**
8
24
  * 列表视图(后台模型页、组织模型页)里列模型失败的供应商在这么多秒内直接标 error、不再请求(Redis,多副本共享)。
9
25
  * 只用于列表;`resolve`(运行时)照常每次请求,失败由降级梯子重试。
10
26
  */
11
27
  export const LIST_FAILURE_TTL_SECONDS = 15;
12
28
  /**
13
- * 键带供应商的契约主版本:插件从 `@1` 升级到 `@2` 后不会读到 `@1`(经适配)时写入的列表
14
- * (两者都是 `@2` 形状,按形状分辨不出来)。
15
- * 键还带插件版本与部署配置摘要:插件升级(参数声明可能变了)或改部署配置(如增删模型)后,
16
- * 各副本立即按新声明校验,不必等旧缓存 TTL 到期。摘要只是哈希,不含配置明文(secret 不进键)。
17
- * 旧键按 TTL 自然过期。没有版本 / 摘要的条目(测试替身)用 `-` 占位。
29
+ * The model list's cache key (`@Cacheable` stores it as `cache:<key>`). It carries the provider's
30
+ * contract major: after a plugin moves from `@1` to `@2` it never reads the list written through
31
+ * the `@1` adapter (both are `@2`-shaped, the shape cannot tell them apart). It also carries the
32
+ * plugin version and the deployment config digest: after an upgrade (the parameter declarations may
33
+ * have changed) or a deployment config change (models added or removed) every replica validates
34
+ * the new declarations at once instead of waiting for the old entry's TTL. The digest is only a
35
+ * hash, never config text (no secret in the key). Old keys expire by TTL. Entries without a
36
+ * version / digest (test doubles) use `-`.
18
37
  */
19
38
  const modelsKey = (p) => `capk:models:${p.plugin}:v${p.major}:${p.version ?? "-"}:${p.configHash ?? "-"}`;
20
39
  /** 列表视图的失败标记({@link LIST_FAILURE_TTL_SECONDS}),与模型列表同样按版本与配置摘要区分。 */
@@ -71,31 +90,33 @@ export function adaptModelProviderV1(impl) {
71
90
  },
72
91
  };
73
92
  }
74
- /** 缓存里的条目必须是 `@2` 形状(旧版本内核写入的 `@1` 原始结果没有 `parameters`,视为未命中)。 */
75
- const isCurrentShape = (models) => Array.isArray(models) &&
76
- models.every((m) => typeof m === "object" && m !== null && Array.isArray(m.parameters));
77
93
  /**
78
94
  * 模型供应商注册表:供应商即提供 `model-provider` 能力的插件(以插件名为供应商名)。
79
95
  * 同时支持 `model-provider@1`(经 {@link adaptModelProviderV1} 适配)与 `@2`;
80
96
  * 同一插件两者都提供时用 `@2`。`@2` 的 `listModels()` 结果先过 `assertValidDeclarations`,
81
97
  * 不合规的供应商不可用(不可重试)。
82
- * 每个供应商的模型列表(`@2` 形状)缓存在 Redis `capk:models:<provider>:v<主版本>:<插件版本>:<部署配置摘要>`(EX 600),不放进程内存,
83
- * 多副本共享同一份缓存。
98
+ * Each provider's model list (`@2`-shaped) is cached in Redis (`@Cacheable`, key
99
+ * `cache:capk:models:<provider>:v<major>:<plugin version>:<config digest>`, 600 s), never in
100
+ * process memory: every replica shares it.
84
101
  */
85
- export class ProviderRegistry {
102
+ let ProviderRegistry = class ProviderRegistry {
86
103
  host;
104
+ cacheService;
87
105
  kv;
88
106
  log;
89
- opts;
90
- constructor(host, kv, log, opts = {}) {
107
+ listTimeoutMs;
108
+ constructor(host, cacheService, kv, log,
109
+ /** The `listModels()` time limit. */
110
+ listTimeoutMs = LIST_MODELS_TIMEOUT_MS) {
91
111
  this.host = host;
112
+ this.cacheService = cacheService;
92
113
  this.kv = kv;
93
114
  this.log = log;
94
- this.opts = opts;
115
+ this.listTimeoutMs = listTimeoutMs;
95
116
  }
96
117
  /** `listModels()` 加时限(到时按失败处理,供应商的调用留在后台、结果丢弃)。 */
97
118
  async listModelsWithTimeout(impl) {
98
- const ms = this.opts.listTimeoutMs ?? LIST_MODELS_TIMEOUT_MS;
119
+ const ms = this.listTimeoutMs;
99
120
  let timer;
100
121
  const call = Promise.resolve().then(() => impl.listModels());
101
122
  call.catch(() => { });
@@ -141,15 +162,12 @@ export class ProviderRegistry {
141
162
  impl: major === 2 ? impl : adaptModelProviderV1(impl),
142
163
  }));
143
164
  }
144
- async models(p) {
165
+ models(p) {
166
+ return this.validatedModels(modelsKey(p), p);
167
+ }
168
+ /** The provider's validated model list, cached under `key` (see {@link modelsKey}). */
169
+ async validatedModels(_key, p) {
145
170
  const { plugin: provider, major, impl } = p;
146
- const key = modelsKey(p);
147
- const cached = await this.kv.get(key);
148
- if (cached !== null) {
149
- const parsed = JSON.parse(cached);
150
- if (isCurrentShape(parsed))
151
- return parsed;
152
- }
153
171
  let models;
154
172
  try {
155
173
  models = await this.listModelsWithTimeout(impl);
@@ -168,7 +186,6 @@ export class ProviderRegistry {
168
186
  throw e;
169
187
  }
170
188
  }
171
- await this.kv.set(key, JSON.stringify(models), "EX", MODELS_TTL_SECONDS);
172
189
  return models;
173
190
  }
174
191
  /** 每个已安装供应商及其模型(按插件加载顺序);列模型失败或声明不合规的供应商跳过并记 warn。 */
@@ -221,4 +238,28 @@ export class ProviderRegistry {
221
238
  }
222
239
  return { provider: p.impl, info };
223
240
  }
224
- }
241
+ };
242
+ __decorate([
243
+ Cacheable({ key: "#{0}", ttl: MODELS_TTL_SECONDS })
244
+ ], ProviderRegistry.prototype, "validatedModels", null);
245
+ ProviderRegistry = __decorate([
246
+ Injectable(),
247
+ __param(0, Inject(ExtensionRegistry)),
248
+ __param(1, Inject(CacheService)),
249
+ __param(2, Inject(REDIS)),
250
+ __param(3, Inject(KERNEL_LOGGER)),
251
+ __param(4, Optional()),
252
+ __param(4, Inject(LIST_MODELS_TIMEOUT))
253
+ ], ProviderRegistry);
254
+ export { ProviderRegistry };
255
+ /** The model provider registry (one instance; the models and agents domains read it). */
256
+ let ProvidersModule = class ProvidersModule {
257
+ };
258
+ ProvidersModule = __decorate([
259
+ Module({
260
+ imports: [ExtensionRegistryModule],
261
+ providers: [ProviderRegistry],
262
+ exports: [ProviderRegistry],
263
+ })
264
+ ], ProvidersModule);
265
+ export { ProvidersModule };
@@ -1,6 +1,7 @@
1
1
  import type { Redis } from "ioredis";
2
- import type { KernelConfig } from "../config/schema.js";
3
2
  import type { SettingsService } from "../identity/settings.js";
3
+ import type { KernelConfigService } from "../infra/config/kernel-config.service.js";
4
+ import type { LeaseHandle, LockService } from "../infra/lock/lock.service.js";
4
5
  /** 组织配额租约的默认时长(毫秒):持有方每 `leaseMs / 3` 续租一次。 */
5
6
  export declare const ORG_QUOTA_LEASE_MS = 60000;
6
7
  /** 运行配额的键前缀(`capk:org-runs:<orgId>`);评测运行用 {@link EVAL_QUOTA_PREFIX}。 */
@@ -11,19 +12,32 @@ export declare const EVAL_QUOTA_PREFIX = "capk:org-evals:";
11
12
  * 组织级运行并发配额(spec 4.3):Redis ZSET `<keyPrefix><orgId>`(默认 `capk:org-runs:<orgId>`),
12
13
  * 成员 runId(评测为 jobId)、分数为租约到期时间。
13
14
  * 持有方崩溃时不 `leave`,成员在租约到期后被下一次 `tryEnter` 清理,名额不泄漏。
15
+ * One instance per key prefix, provided under {@link RUN_QUOTA} / {@link EVAL_QUOTA}.
14
16
  */
15
17
  export declare class OrgQuota {
16
18
  private readonly redis;
17
19
  private readonly keyPrefix;
18
- constructor(redis: Redis, keyPrefix?: string);
20
+ private readonly locks?;
21
+ constructor(redis: Redis, keyPrefix?: string, locks?: LockService | undefined);
19
22
  private key;
20
23
  tryEnter(orgId: string, runId: string, limit: number, leaseMs?: number): Promise<boolean>;
21
24
  /** 续期;成员已过期被清理 → false。 */
22
25
  renew(orgId: string, runId: string, leaseMs?: number): Promise<boolean>;
23
26
  leave(orgId: string, runId: string): Promise<void>;
27
+ /**
28
+ * Takes a slot ({@link tryEnter}) and keeps it while held: renewed every `leaseMs / 3` by the
29
+ * lock service's watchdog; `release()` leaves. Undefined when the organization is at its limit.
30
+ * A slot that could not be renewed (it expired meanwhile) aborts `lost` with one WARN; the
31
+ * holder may go on (the slot is a fair-share limit, not mutual exclusion).
32
+ */
33
+ enter(orgId: string, runId: string, limit: number, leaseMs?: number): Promise<LeaseHandle | undefined>;
24
34
  }
35
+ /** The organization run quota (`capk:org-runs:<orgId>`). */
36
+ export declare const RUN_QUOTA: unique symbol;
37
+ /** The organization eval quota (`capk:org-evals:<orgId>`). */
38
+ export declare const EVAL_QUOTA: unique symbol;
25
39
  /**
26
40
  * 组织的运行并发上限:部署设置 `runConcurrencyOverrides[orgId]`,没有则用 `runtime.orgConcurrency`
27
41
  * (热更新字段,每次经 `config()` 读当前值)。
28
42
  */
29
- export declare function orgRunLimit(settings: Pick<SettingsService, "get">, config: () => KernelConfig, orgId: string): Promise<number>;
43
+ export declare function orgRunLimit(settings: Pick<SettingsService, "get">, config: Pick<KernelConfigService, "get">, orgId: string): Promise<number>;
@@ -38,13 +38,16 @@ return 0
38
38
  * 组织级运行并发配额(spec 4.3):Redis ZSET `<keyPrefix><orgId>`(默认 `capk:org-runs:<orgId>`),
39
39
  * 成员 runId(评测为 jobId)、分数为租约到期时间。
40
40
  * 持有方崩溃时不 `leave`,成员在租约到期后被下一次 `tryEnter` 清理,名额不泄漏。
41
+ * One instance per key prefix, provided under {@link RUN_QUOTA} / {@link EVAL_QUOTA}.
41
42
  */
42
43
  export class OrgQuota {
43
44
  redis;
44
45
  keyPrefix;
45
- constructor(redis, keyPrefix = RUN_QUOTA_PREFIX) {
46
+ locks;
47
+ constructor(redis, keyPrefix = RUN_QUOTA_PREFIX, locks) {
46
48
  this.redis = redis;
47
49
  this.keyPrefix = keyPrefix;
50
+ this.locks = locks;
48
51
  }
49
52
  key(orgId) {
50
53
  return `${this.keyPrefix}${orgId}`;
@@ -59,12 +62,34 @@ export class OrgQuota {
59
62
  async leave(orgId, runId) {
60
63
  await this.redis.zrem(this.key(orgId), runId);
61
64
  }
65
+ /**
66
+ * Takes a slot ({@link tryEnter}) and keeps it while held: renewed every `leaseMs / 3` by the
67
+ * lock service's watchdog; `release()` leaves. Undefined when the organization is at its limit.
68
+ * A slot that could not be renewed (it expired meanwhile) aborts `lost` with one WARN; the
69
+ * holder may go on (the slot is a fair-share limit, not mutual exclusion).
70
+ */
71
+ async enter(orgId, runId, limit, leaseMs = ORG_QUOTA_LEASE_MS) {
72
+ const locks = this.locks;
73
+ if (!locks)
74
+ throw new Error("OrgQuota.enter needs the lock service");
75
+ const sentAt = Date.now();
76
+ if (!(await this.tryEnter(orgId, runId, limit, leaseMs)))
77
+ return undefined;
78
+ return locks.keepAlive(`${this.key(orgId)}/${runId}`, leaseMs, {
79
+ renew: () => this.renew(orgId, runId, leaseMs),
80
+ release: () => this.leave(orgId, runId),
81
+ }, sentAt);
82
+ }
62
83
  }
84
+ /** The organization run quota (`capk:org-runs:<orgId>`). */
85
+ export const RUN_QUOTA = Symbol("RUN_QUOTA");
86
+ /** The organization eval quota (`capk:org-evals:<orgId>`). */
87
+ export const EVAL_QUOTA = Symbol("EVAL_QUOTA");
63
88
  /**
64
89
  * 组织的运行并发上限:部署设置 `runConcurrencyOverrides[orgId]`,没有则用 `runtime.orgConcurrency`
65
90
  * (热更新字段,每次经 `config()` 读当前值)。
66
91
  */
67
92
  export async function orgRunLimit(settings, config, orgId) {
68
93
  const { runConcurrencyOverrides } = await settings.get();
69
- return runConcurrencyOverrides[orgId] ?? config().runtime.orgConcurrency;
94
+ return runConcurrencyOverrides[orgId] ?? config.get().runtime.orgConcurrency;
70
95
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Job scheduler ids of the maintenance queue's fixed-period jobs before they became `@LockedCron` /
3
+ * `@LockedInterval` jobs: an upgraded deployment still has them in Redis, so a starting worker
4
+ * role removes them (else BullMQ keeps firing a job no handler knows). Each id
5
+ * comes from its domain's leaf `job-ids.ts`, so this module imports no domain code.
6
+ */
7
+ export declare const RETIRED_SCHEDULER_IDS: readonly string[];
@@ -0,0 +1,31 @@
1
+ import { MARKETPLACES_REFRESH_SCHEDULER_ID, PLUGIN_STAGING_CLEANUP_SCHEDULER_ID, } from "../catalog/job-ids.js";
2
+ import { GATEWAY_CHECK_SCHEDULER_ID } from "../channels/job-ids.js";
3
+ import { ATTACHMENT_CLEANUP_SCHEDULER_ID } from "../conversations/job-ids.js";
4
+ import { PLUGINS_RECONCILE_SCHEDULER_ID } from "../extensions/job-ids.js";
5
+ import { DIRECTORY_SCAN_SCHEDULER_ID, OFFBOARD_SWEEP_SCHEDULER_ID } from "../orgs/job-ids.js";
6
+ import { SANDBOX_DESTROY_SCHEDULER_ID, SANDBOX_SUSPEND_SCHEDULER_ID } from "../sandbox/job-ids.js";
7
+ import { STORAGE_PURGE_SCHEDULER_ID } from "../storage/job-ids.js";
8
+ import { DRIFT_SCHEDULER_ID, OUTPUT_CLEANUP_SCHEDULER_ID } from "../tools/job-ids.js";
9
+ import { USAGE_SWEEP_SCHEDULER_ID, WAIT_SWEEP_SCHEDULER_ID } from "./job-ids.js";
10
+ /**
11
+ * Job scheduler ids of the maintenance queue's fixed-period jobs before they became `@LockedCron` /
12
+ * `@LockedInterval` jobs: an upgraded deployment still has them in Redis, so a starting worker
13
+ * role removes them (else BullMQ keeps firing a job no handler knows). Each id
14
+ * comes from its domain's leaf `job-ids.ts`, so this module imports no domain code.
15
+ */
16
+ export const RETIRED_SCHEDULER_IDS = [
17
+ STORAGE_PURGE_SCHEDULER_ID,
18
+ DIRECTORY_SCAN_SCHEDULER_ID,
19
+ OFFBOARD_SWEEP_SCHEDULER_ID,
20
+ PLUGINS_RECONCILE_SCHEDULER_ID,
21
+ MARKETPLACES_REFRESH_SCHEDULER_ID,
22
+ PLUGIN_STAGING_CLEANUP_SCHEDULER_ID,
23
+ DRIFT_SCHEDULER_ID,
24
+ OUTPUT_CLEANUP_SCHEDULER_ID,
25
+ ATTACHMENT_CLEANUP_SCHEDULER_ID,
26
+ WAIT_SWEEP_SCHEDULER_ID,
27
+ USAGE_SWEEP_SCHEDULER_ID,
28
+ GATEWAY_CHECK_SCHEDULER_ID,
29
+ SANDBOX_SUSPEND_SCHEDULER_ID,
30
+ SANDBOX_DESTROY_SCHEDULER_ID,
31
+ ];
@@ -0,0 +1,33 @@
1
+ import { KernelEvents } from "../infra/events/kernel-events.js";
2
+ import type { KernelLogger } from "../log.js";
3
+ import { RunAbort } from "./abort.js";
4
+ import { RunQueue } from "./run-queue.js";
5
+ import { Waits } from "./waits.js";
6
+ /**
7
+ * Starting and stopping runs from outside the run worker: the conversations API (a message, a
8
+ * stop), the conversation queue and offboarding (a departed member's runs, `by: null`).
9
+ */
10
+ export declare class RunControl {
11
+ private readonly queue;
12
+ private readonly waits;
13
+ private readonly abort;
14
+ private readonly events;
15
+ private readonly log;
16
+ constructor(queue: Pick<RunQueue, "ensureRun" | "abortIfOrphaned">, waits: Pick<Waits, "abortWaiting" | "childFinished" | "stopChildren">, abort: Pick<RunAbort, "request">, events: KernelEvents, log: Pick<KernelLogger, "error">);
17
+ /** 有未消费的消息且没有进行中的运行时投递一轮运行;返回 runId 或 null。 */
18
+ ensureRun(conversationId: string): Promise<string | null>;
19
+ /**
20
+ * 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
21
+ * 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
22
+ * stops its children (sub-agents spec §12).
23
+ */
24
+ abortIfOrphaned(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
25
+ /**
26
+ * 运行在等人处理(waiting)时直接中止:取消等待、写 `run_aborted`、删除 checkpoint,返回 true;
27
+ * 运行已不是 waiting(例如刚被续跑)→ false. Either way its approval / question cards may have
28
+ * changed: `run.wait-stopped` lets the channel outbound update them.
29
+ */
30
+ abortWaiting(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
31
+ /** 请求中止运行(广播到所有副本)。 */
32
+ requestAbort(runId: string, byAccountId: string | null): Promise<void>;
33
+ }
@@ -0,0 +1,77 @@
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
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { KernelEvents } from "../infra/events/kernel-events.js";
12
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
13
+ import { RunAbort } from "./abort.js";
14
+ import { RunQueue } from "./run-queue.js";
15
+ import { Waits } from "./waits.js";
16
+ /**
17
+ * Starting and stopping runs from outside the run worker: the conversations API (a message, a
18
+ * stop), the conversation queue and offboarding (a departed member's runs, `by: null`).
19
+ */
20
+ let RunControl = class RunControl {
21
+ queue;
22
+ waits;
23
+ abort;
24
+ events;
25
+ log;
26
+ constructor(queue, waits, abort, events, log) {
27
+ this.queue = queue;
28
+ this.waits = waits;
29
+ this.abort = abort;
30
+ this.events = events;
31
+ this.log = log;
32
+ }
33
+ /** 有未消费的消息且没有进行中的运行时投递一轮运行;返回 runId 或 null。 */
34
+ ensureRun(conversationId) {
35
+ return this.queue.ensureRun(conversationId);
36
+ }
37
+ /**
38
+ * 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
39
+ * 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
40
+ * stops its children (sub-agents spec §12).
41
+ */
42
+ async abortIfOrphaned(conversationId, runId, byAccountId) {
43
+ const r = await this.queue.abortIfOrphaned(conversationId, runId, byAccountId);
44
+ if (r) {
45
+ await this.waits
46
+ .childFinished(runId)
47
+ .catch((err) => this.log.error("cannot report finished sub-agent run to its parent", { runId, err }));
48
+ await this.waits
49
+ .stopChildren(runId, null)
50
+ .catch((err) => this.log.error("cannot stop the sub-agents of a run", { runId, err }));
51
+ }
52
+ return r;
53
+ }
54
+ /**
55
+ * 运行在等人处理(waiting)时直接中止:取消等待、写 `run_aborted`、删除 checkpoint,返回 true;
56
+ * 运行已不是 waiting(例如刚被续跑)→ false. Either way its approval / question cards may have
57
+ * changed: `run.wait-stopped` lets the channel outbound update them.
58
+ */
59
+ async abortWaiting(conversationId, runId, byAccountId) {
60
+ const r = await this.waits.abortWaiting(conversationId, runId, byAccountId);
61
+ await this.events.emit("run.wait-stopped", { conversationId, runId });
62
+ return r;
63
+ }
64
+ /** 请求中止运行(广播到所有副本)。 */
65
+ requestAbort(runId, byAccountId) {
66
+ return this.abort.request(runId, byAccountId);
67
+ }
68
+ };
69
+ RunControl = __decorate([
70
+ Injectable(),
71
+ __param(0, Inject(RunQueue)),
72
+ __param(1, Inject(Waits)),
73
+ __param(2, Inject(RunAbort)),
74
+ __param(3, Inject(KernelEvents)),
75
+ __param(4, Inject(KERNEL_LOGGER))
76
+ ], RunControl);
77
+ export { RunControl };
@@ -1,7 +1,6 @@
1
- import { type Transaction } from "kysely";
2
- import type { AppendEvent, EventLog } from "../conversations/event-log.js";
3
- import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
4
- type KernelTrx = Transaction<KernelDatabase>;
1
+ import { type AppendEvent, EventLog } from "../conversations/event-log.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { TransactionHost } from "../infra/database/transaction-host.js";
5
4
  /** 运行的终态。 */
6
5
  export type TerminalStatus = "completed" | "failed" | "aborted";
7
6
  export declare const TERMINAL_STATUSES: ReadonlySet<string>;
@@ -22,24 +21,34 @@ export interface FinishRunArgs {
22
21
  * Runs in the transaction once the run is known not to be terminal, before the terminal event:
23
22
  * a parent's open `agent` calls get their results here (sub-agents spec §12, review m1).
24
23
  */
25
- beforeTerminal?: (t: KernelTrx) => Promise<void>;
24
+ beforeTerminal?: () => Promise<void>;
26
25
  }
27
26
  /**
28
- * 在事务 `t` 内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
29
- * 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
30
- *
31
- * `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
32
- * 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
33
- * 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
34
- * 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
35
- * 调用方在提交后对非 null 的返回值调用 `eventLog.notify`。
27
+ * Writes runs' terminal states (one instance; the run worker, the run queue's orphan repairs, the
28
+ * waits and the eval replays finish runs through it).
36
29
  */
37
- export declare function finishRunIn(t: KernelTrx, eventLog: EventLog, a: FinishRunArgs): Promise<number | null>;
30
+ export declare class RunFinish {
31
+ private readonly kdb;
32
+ private readonly eventLog;
33
+ readonly txHost: TransactionHost;
34
+ constructor(kdb: KernelDb, eventLog: EventLog, txHost: TransactionHost);
35
+ /**
36
+ * 在调用方的事务内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
37
+ * 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
38
+ *
39
+ * `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
40
+ * 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
41
+ * 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
42
+ * 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
43
+ * 调用方在提交后对非 null 的返回值调用 {@link notifyFinished}。
44
+ */
45
+ finishIn(a: FinishRunArgs): Promise<number | null>;
46
+ /** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishIn}。 */
47
+ finish(a: FinishRunArgs): Promise<number | null>;
48
+ private finishOwn;
49
+ }
38
50
  /**
39
51
  * After a terminal event committed: notify the log, and for a failed or stopped run also send
40
52
  * `changed: queue` (the queue may have paused).
41
53
  */
42
54
  export declare function notifyFinished(eventLog: Pick<EventLog, "notify" | "publishChanged">, conversationId: string, toSeq: number, status: TerminalStatus): Promise<void>;
43
- /** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishRunIn}。 */
44
- export declare function finishRun(db: KernelDb, eventLog: EventLog, a: FinishRunArgs): Promise<number | null>;
45
- export {};
@@ -1,56 +1,110 @@
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
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
1
11
  import { sql } from "kysely";
12
+ import { EventLog } from "../conversations/event-log.js";
2
13
  import { pauseQueueIn } from "../conversations/queue.js";
14
+ import { KernelDb } from "../infra/database/kernel-db.js";
15
+ import { TransactionHost } from "../infra/database/transaction-host.js";
16
+ import { Transactional } from "../infra/database/transactional.decorator.js";
3
17
  export const TERMINAL_STATUSES = new Set([
4
18
  "completed",
5
19
  "failed",
6
20
  "aborted",
7
21
  ]);
8
22
  /**
9
- * 在事务 `t` 内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
10
- * 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
11
- *
12
- * `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
13
- * 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
14
- * 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
15
- * 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
16
- * 调用方在提交后对非 null 的返回值调用 `eventLog.notify`。
23
+ * Writes runs' terminal states (one instance; the run worker, the run queue's orphan repairs, the
24
+ * waits and the eval replays finish runs through it).
17
25
  */
18
- export async function finishRunIn(t, eventLog, a) {
19
- await t
20
- .selectFrom("conversations")
21
- .select("id")
22
- .where("id", "=", a.conversationId)
23
- .forUpdate()
24
- .executeTakeFirst();
25
- const run = await t
26
- .selectFrom("runs")
27
- .select("status")
28
- .where("id", "=", a.runId)
29
- .forUpdate()
30
- .executeTakeFirst();
31
- if (!run || TERMINAL_STATUSES.has(run.status))
32
- return null;
33
- await a.beforeTerminal?.(t);
34
- const [ev] = await eventLog.append(a.conversationId, [{ ...a.event, runId: a.runId, idemKey: `${a.event.type}:${a.runId}` }], t);
35
- await t
36
- .updateTable("conversations")
37
- .set({
38
- consumed_seq: a.floorToTrigger === false
39
- ? sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint)`
40
- : sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint, (SELECT r.trigger_seq FROM capybara.runs r WHERE r.id = ${a.runId}))`,
41
- })
42
- .where("id", "=", a.conversationId)
43
- .execute();
44
- await t
45
- .updateTable("runs")
46
- .set({ status: a.status, finished_at: sql `now()` })
47
- .where("id", "=", a.runId)
48
- .execute();
49
- // a failed or stopped run pauses the queued messages until the person resumes (spec §5.7)
50
- if (a.status !== "completed")
51
- await pauseQueueIn(t, a.conversationId);
52
- return ev.seq;
53
- }
26
+ let RunFinish = class RunFinish {
27
+ kdb;
28
+ eventLog;
29
+ txHost;
30
+ constructor(kdb, eventLog, txHost) {
31
+ this.kdb = kdb;
32
+ this.eventLog = eventLog;
33
+ this.txHost = txHost;
34
+ }
35
+ /**
36
+ * 在调用方的事务内写运行的终态:会话行锁 → 运行仍未结束才写终态事件、推进 `consumed_seq`、更新 `runs.status`。
37
+ * 返回终态事件的 seq;运行已是终态(例如已被其他副本标记失败)→ 返回 null,什么都不写。
38
+ *
39
+ * `consumed_seq = GREATEST(consumed_seq, consumed, runs.trigger_seq)`:不回退,且失败 / 中止 / 完成都至少
40
+ * 消费到触发该运行的消息——否则结束时的 ensureRun 会对同一条消息无限重试(失败)或卡住会话。
41
+ * 超时(`floorToTrigger: false`)只取 `GREATEST(consumed_seq, consumed)`:没吸收的消息留给下一轮(R34)。
42
+ * 加锁顺序与 `RunQueue.ensureRun` 一致(先会话行、后 runs 行),不会互相死锁。
43
+ * 调用方在提交后对非 null 的返回值调用 {@link notifyFinished}。
44
+ */
45
+ async finishIn(a) {
46
+ const t = this.kdb.db;
47
+ await t
48
+ .selectFrom("conversations")
49
+ .select("id")
50
+ .where("id", "=", a.conversationId)
51
+ .forUpdate()
52
+ .executeTakeFirst();
53
+ const run = await t
54
+ .selectFrom("runs")
55
+ .select("status")
56
+ .where("id", "=", a.runId)
57
+ .forUpdate()
58
+ .executeTakeFirst();
59
+ if (!run || TERMINAL_STATUSES.has(run.status))
60
+ return null;
61
+ await a.beforeTerminal?.();
62
+ const [ev] = await this.eventLog.appendIn(a.conversationId, [
63
+ { ...a.event, runId: a.runId, idemKey: `${a.event.type}:${a.runId}` },
64
+ ]);
65
+ await t
66
+ .updateTable("conversations")
67
+ .set({
68
+ consumed_seq: a.floorToTrigger === false
69
+ ? sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint)`
70
+ : sql `GREATEST(consumed_seq, ${a.consumed ?? 0}::bigint, (SELECT r.trigger_seq FROM capybara.runs r WHERE r.id = ${a.runId}))`,
71
+ })
72
+ .where("id", "=", a.conversationId)
73
+ .execute();
74
+ await t
75
+ .updateTable("runs")
76
+ .set({ status: a.status, finished_at: sql `now()` })
77
+ .where("id", "=", a.runId)
78
+ .execute();
79
+ // a failed or stopped run pauses the queued messages until the person resumes (spec §5.7)
80
+ if (a.status !== "completed")
81
+ await pauseQueueIn(t, a.conversationId);
82
+ return ev.seq;
83
+ }
84
+ /** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishIn}。 */
85
+ async finish(a) {
86
+ const toSeq = await this.finishOwn(a);
87
+ if (toSeq !== null)
88
+ await notifyFinished(this.eventLog, a.conversationId, toSeq, a.status);
89
+ return toSeq;
90
+ }
91
+ finishOwn(a) {
92
+ return this.finishIn(a);
93
+ }
94
+ };
95
+ __decorate([
96
+ Transactional({ propagation: "mandatory" })
97
+ ], RunFinish.prototype, "finishIn", null);
98
+ __decorate([
99
+ Transactional({ propagation: "requires_new" })
100
+ ], RunFinish.prototype, "finishOwn", null);
101
+ RunFinish = __decorate([
102
+ Injectable(),
103
+ __param(0, Inject(KernelDb)),
104
+ __param(1, Inject(EventLog)),
105
+ __param(2, Inject(TransactionHost))
106
+ ], RunFinish);
107
+ export { RunFinish };
54
108
  /**
55
109
  * After a terminal event committed: notify the log, and for a failed or stopped run also send
56
110
  * `changed: queue` (the queue may have paused).
@@ -60,10 +114,3 @@ export async function notifyFinished(eventLog, conversationId, toSeq, status) {
60
114
  if (status !== "completed")
61
115
  await eventLog.publishChanged(conversationId, "queue");
62
116
  }
63
- /** 自开事务写终态并在提交后发布会话通知;返回值同 {@link finishRunIn}。 */
64
- export async function finishRun(db, eventLog, a) {
65
- const toSeq = await db.transaction().execute((t) => finishRunIn(t, eventLog, a));
66
- if (toSeq !== null)
67
- await notifyFinished(eventLog, a.conversationId, toSeq, a.status);
68
- return toSeq;
69
- }