@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,25 +1,49 @@
1
- import { hostname } from "node:os";
2
- import { DelayedError, Worker } from "bullmq";
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, Optional } from "@nestjs/common";
11
+ import { DelayedError } from "bullmq";
3
12
  import { sql } from "kysely";
4
- import { normalizeStoredDefinition } from "../agents/definition.js";
13
+ import { conversationTopic, EventLog, } from "../conversations/event-log.js";
5
14
  import { effectiveDefinition, NO_SELECTION, readSelection, sameModel, sameSelection, } from "../conversations/selection.js";
15
+ import { TitleQueue } from "../conversations/titles.js";
6
16
  import { ApiError } from "../errors.js";
7
- import { withJobContext } from "../log-context.js";
8
- import { pinnedFailureText, recordSkillsCatalog } from "../skills/catalog.js";
17
+ import { SettingsService } from "../identity/settings.js";
18
+ import { waitWithin } from "../infra/close-within.js";
19
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
20
+ import { KernelDb } from "../infra/database/kernel-db.js";
21
+ import { TransactionHost } from "../infra/database/transaction-host.js";
22
+ import { Transactional } from "../infra/database/transactional.decorator.js";
23
+ import { KernelEvents } from "../infra/events/kernel-events.js";
24
+ import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
25
+ import { pinnedFailureText, SkillsCatalogService } from "../skills/catalog.js";
26
+ import { normalizeStoredDefinitionIn } from "../tools/legacy-data.js";
27
+ import { ToolPipeline } from "../tools/pipeline.js";
28
+ import { RunAbort } from "./abort.js";
29
+ import { KyselyCheckpointSaver } from "./checkpointer.js";
30
+ import { ConversationLock } from "./conversation-lock.js";
9
31
  import { RunError } from "./model-call.js";
10
- import { ProviderListError } from "./providers.js";
11
- import { ORG_QUOTA_LEASE_MS, orgRunLimit } from "./quota.js";
12
- import { finishRun, TERMINAL_STATUSES } from "./run-finish.js";
13
- import { bullConnection, RUN_QUEUE_NAME, SUBAGENT_RUN_QUEUE_NAME, } from "./run-queue.js";
32
+ import { ProviderListError, ProviderRegistry } from "./providers.js";
33
+ import { ORG_QUOTA_LEASE_MS, orgRunLimit, RUN_QUOTA } from "./quota.js";
34
+ import { RunFinish, TERMINAL_STATUSES } from "./run-finish.js";
35
+ import { RunQueue } from "./run-queue.js";
36
+ import { AgentLoops, RunSteps } from "./run-steps.js";
14
37
  import { dispatchOfChildRun } from "./subagents/child.js";
15
38
  import { childRunDefinition } from "./subagents/definition.js";
16
39
  import { forkBoundary } from "./subagents/skill-fork.js";
40
+ import { Waits } from "./waits.js";
17
41
  /** 会话锁被占用时任务延后的时间。 */
18
42
  const LOCK_BUSY_DELAY_MS = 1000;
19
43
  /** 组织配额已满时任务延后的时间。 */
20
44
  const QUOTA_FULL_DELAY_MS = 2000;
21
45
  /** BullMQ stalled 检测允许的最大次数(超过则任务失败)。 */
22
- const MAX_STALLED_COUNT = 3;
46
+ export const MAX_STALLED_COUNT = 3;
23
47
  /** 停机时等待任务结束后处理(ensureRun 等)的最短时间。 */
24
48
  const FOLLOW_UP_MIN_WAIT_MS = 250;
25
49
  /** 读插话的分页大小。 */
@@ -29,88 +53,179 @@ const READ_PAGE = 500;
29
53
  * 后续处理,由 close() 跟踪并限时;全部失败也不会让会话永远卡住——打开 SSE / 读事件时会再次 ensureRun。
30
54
  */
31
55
  const ENSURE_RETRY_DELAYS_MS = [200, 1000, 3000];
32
- const noopSink = () => { };
56
+ /** Optional provider: the run worker's {@link RunHooks} (tests). */
57
+ export const RUN_HOOKS = Symbol("RUN_HOOKS");
33
58
  /** 任务回到队列:延后 delayMs 再处理(不计入 attempts)。 */
34
59
  async function requeue(job, token, delayMs) {
35
60
  await job.moveToDelayed(Date.now() + delayMs, token);
36
61
  throw new DelayedError();
37
62
  }
38
63
  /**
39
- * 运行 worker(只在含 `worker` 角色的进程启动):领取 `cap-kernel-runs` 的任务,取会话锁与组织配额,
40
- * 调用 AgentLoop,按结果写终态事件并推进 `consumed_seq`;结束后再调用一次 `ensureRun` 处理
41
- * 运行期间到达但没被吸收的消息(Review Focus 2)。
64
+ * 运行 worker(只在含 `worker` 角色的进程消费):领取 `cap-kernel-runs` 与 `cap-kernel-subagent-runs` 的任务
65
+ * (两个 `@Processor`,见 run-processors.ts),取会话锁与组织配额,调用 AgentLoop,按结果写终态事件并推进
66
+ * `consumed_seq`;结束后再调用一次 `ensureRun` 处理运行期间到达但没被吸收的消息(Review Focus 2)。
42
67
  */
43
- export class RunWorker {
44
- d;
45
- /** One BullMQ worker per run queue: conversation runs and sub-agent runs (spec §7.4). */
68
+ let RunWorker = class RunWorker {
69
+ kdb;
70
+ eventLog;
71
+ lock;
72
+ quota;
73
+ abort;
74
+ queue;
75
+ settings;
76
+ config;
77
+ log;
78
+ bus;
79
+ checkpoints;
80
+ waits;
81
+ events;
82
+ titles;
83
+ models;
84
+ skillsCatalog;
85
+ pipeline;
86
+ finisher;
87
+ txHost;
88
+ hooks;
89
+ /** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
46
90
  workers = [];
47
- /** 传给 Worker 的连接:BullMQ 不关闭调用方传入的连接,close() 时自己关。 */
48
- conn;
49
91
  active = new Map();
50
92
  /** 进行中的「任务结束后」处理(完成后的 ensureRun、失败标记):停机时等它们做完再关闭队列。 */
51
93
  followUps = new Set();
52
94
  closing = false;
53
95
  /** close() 开始时触发:ensureRun 重试不再等待退避间隔。 */
54
96
  closingSignal = new AbortController();
55
- constructor(d) {
56
- this.d = d;
97
+ loop;
98
+ constructor(kdb, eventLog, lock, quota, abort, queue, settings, loops, steps, config, log, bus,
99
+ /** 运行到达终态后删除该运行(thread_id = runId)的 checkpoint thread(只用于续跑,结束后无用)。 */
100
+ checkpoints,
101
+ /** loop 返回 `suspended` 后把运行置为 waiting(释放会话锁与配额之后); the child lifecycle. */
102
+ waits,
103
+ /** `run.started` (the channel outbound enqueues the conversation's IM delivery). */
104
+ events,
105
+ /** A completed run enqueues the conversation's title job. */
106
+ titles,
107
+ /** Resolves a switched-to model at run start (fallback when it is gone; UI refresh B). */
108
+ models,
109
+ /** Run start's skills catalog snapshot (reads the pinned skills' bodies, phase B). */
110
+ skillsCatalog,
111
+ /**
112
+ * In the terminal transaction of every run: writes its open `Agent` call results
113
+ * (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
114
+ * commit (sub-agents spec §12, review m1: a failed or stalled parent too).
115
+ */
116
+ pipeline, finisher, txHost, hooks) {
117
+ this.kdb = kdb;
118
+ this.eventLog = eventLog;
119
+ this.lock = lock;
120
+ this.quota = quota;
121
+ this.abort = abort;
122
+ this.queue = queue;
123
+ this.settings = settings;
124
+ this.config = config;
125
+ this.log = log;
126
+ this.bus = bus;
127
+ this.checkpoints = checkpoints;
128
+ this.waits = waits;
129
+ this.events = events;
130
+ this.titles = titles;
131
+ this.models = models;
132
+ this.skillsCatalog = skillsCatalog;
133
+ this.pipeline = pipeline;
134
+ this.finisher = finisher;
135
+ this.txHost = txHost;
136
+ this.hooks = hooks;
137
+ this.loop = loops.create(steps.deps);
138
+ }
139
+ get db() {
140
+ return this.kdb.db;
57
141
  }
58
- start() {
59
- if (this.workers.length > 0)
142
+ /**
143
+ * Starts consuming (worker role only): `workers` are the `@Processor` workers of both run queues
144
+ * (built with `runtime.workerConcurrency`, `jobLockMs`, `stalledIntervalMs`; never autorun).
145
+ */
146
+ start(workers) {
147
+ if (this.workers.length > 0 || this.closing)
60
148
  return;
61
- const runtime = this.d.config().runtime;
62
- this.conn = bullConnection(this.d.redisUrl, this.d.log);
63
- for (const queue of [RUN_QUEUE_NAME, SUBAGENT_RUN_QUEUE_NAME]) {
64
- const worker = new Worker(queue, (job, token) => withJobContext(queue, job, () => this.process(job, token)), {
65
- // the worker name is recorded on the job (BullMQ processedBy): which replica ran it
66
- name: `${hostname()}-${process.pid}`,
67
- connection: this.conn,
68
- concurrency: runtime.workerConcurrency,
69
- lockDuration: runtime.jobLockMs,
70
- stalledInterval: runtime.stalledIntervalMs,
71
- maxStalledCount: MAX_STALLED_COUNT,
72
- });
73
- // ensureRun after a run goes after its job completed and left the queue: when the latest
74
- // unconsumed message is this run's own trigger (e.g. a run ended by its deadline without
75
- // absorbing it, R34), the new job has this job's id and would be dropped as a duplicate
76
- // while this one is still active. Relies on BullMQ moving the job to completed (deleted by
77
- // removeOnComplete) before emitting "completed" (pinned by the R34 test).
78
- worker.on("completed", (job, result) => {
79
- if (result !== "ensure")
80
- return;
81
- const { conversationId, runId } = job.data;
82
- this.track(this.ensureAfterRun(conversationId, runId));
83
- });
84
- worker.on("error", (err) => this.d.log.error("run worker error", { err, queue }));
85
- worker.on("failed", (job, err) => {
86
- this.d.log.error("run job failed", { jobId: job?.id, runId: job?.data.runId, err });
87
- if (job) {
88
- this.track(this.onJobFailed(job.data, err).catch((e) => this.d.log.error("cannot mark failed run job", { runId: job.data.runId, err: e })));
89
- }
90
- });
91
- this.workers.push(worker);
149
+ this.workers = workers;
150
+ for (const w of workers) {
151
+ void w.run().catch((err) => this.onError(err, w.name));
92
152
  }
93
153
  }
94
- /** Stops the active children of a finished run (see {@link RunWorkerDeps.stopChildren}). */
95
- async stopChildren(runId) {
96
- if (!this.d.stopChildren)
154
+ /** A worker's `error` event. */
155
+ onError(err, queue) {
156
+ this.log.error("run worker error", { err, queue });
157
+ }
158
+ /**
159
+ * A job completed (the worker's `completed` event). ensureRun after a run goes after its job
160
+ * completed and left the queue: when the latest unconsumed message is this run's own trigger
161
+ * (e.g. a run ended by its deadline without absorbing it, R34), the new job has this job's id
162
+ * and would be dropped as a duplicate while this one is still active. Relies on BullMQ moving
163
+ * the job to completed (deleted by removeOnComplete) before emitting "completed" (pinned by the
164
+ * R34 test).
165
+ */
166
+ onCompleted(job, result) {
167
+ if (result !== "ensure")
97
168
  return;
169
+ const { conversationId, runId } = job.data;
170
+ this.track(this.ensureAfterRun(conversationId, runId));
171
+ }
172
+ /** A job failed (the worker's `failed` event). */
173
+ onFailed(job, err) {
174
+ this.log.error("run job failed", { jobId: job?.id, runId: job?.data.runId, err });
175
+ if (job) {
176
+ this.track(this.onJobFailed(job.data, err).catch((e) => this.log.error("cannot mark failed run job", { runId: job.data.runId, err: e })));
177
+ }
178
+ }
179
+ /**
180
+ * 流式增量发布到会话频道(与 `{ kind: "events" }` 共用 `conv.<id>`),任意副本上的订阅方都能收到。
181
+ * 发布失败只记日志:增量只是草稿,最终内容以日志中的 assistant_message 为准。
182
+ */
183
+ sinkFor(conversationId) {
184
+ // 本次运行执行中推出的文本字符数(按步,step_reset 清零):本进程正在执行的这次运行自己的计数
185
+ let at = { runId: "", step: -1, chars: 0 };
186
+ return (d) => {
187
+ if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
188
+ at = { runId: d.runId, step: d.step, chars: 0 };
189
+ }
190
+ const offset = at.chars;
191
+ if (d.kind === "text")
192
+ at.chars += d.text?.length ?? 0;
193
+ const msg = {
194
+ kind: "delta",
195
+ runId: d.runId,
196
+ step: d.step,
197
+ delta: d.kind,
198
+ ...(d.text !== undefined && { text: d.text }),
199
+ ...(d.kind === "text" && { offset }),
200
+ };
201
+ this.bus
202
+ .publish(conversationTopic(conversationId), msg)
203
+ .catch((err) => this.log.warn("stream delta publish failed", { conversationId, err }));
204
+ };
205
+ }
206
+ /**
207
+ * After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
208
+ * active children on its behalf (no account). The wait sweep is the backstop.
209
+ */
210
+ async stopChildren(runId) {
98
211
  try {
99
- await this.d.stopChildren(runId);
212
+ await this.waits.stopChildren(runId, null);
100
213
  }
101
214
  catch (err) {
102
- this.d.log.error("cannot stop the sub-agents of a finished run", { runId, err });
215
+ this.log.error("cannot stop the sub-agents of a finished run", { runId, err });
103
216
  }
104
217
  }
105
- /** Reports a finished sub-agent run to its parent (see {@link RunWorkerDeps.onChildFinished}). */
218
+ /**
219
+ * After a sub-agent run's terminal state committed (sub-agents spec §7.3): reports it to the
220
+ * parent. Called with any run id whose conversation may be a child; runs that were not
221
+ * dispatched are ignored. Errors are logged (the wait sweep repairs a missed call).
222
+ */
106
223
  async childFinished(runId) {
107
- if (!this.d.onChildFinished)
108
- return;
109
224
  try {
110
- await this.d.onChildFinished(runId);
225
+ await this.waits.childFinished(runId);
111
226
  }
112
227
  catch (err) {
113
- this.d.log.error("cannot report finished sub-agent run to its parent", { runId, err });
228
+ this.log.error("cannot report finished sub-agent run to its parent", { runId, err });
114
229
  }
115
230
  }
116
231
  /**
@@ -120,14 +235,14 @@ export class RunWorker {
120
235
  async ensureAfterRun(conversationId, runId) {
121
236
  for (let attempt = 0;; attempt++) {
122
237
  try {
123
- await this.d.hooks?.beforeEnsureRun?.(conversationId, attempt);
124
- await this.d.queue.ensureRun(conversationId);
238
+ await this.hooks?.beforeEnsureRun?.(conversationId, attempt);
239
+ await this.queue.ensureRun(conversationId);
125
240
  return;
126
241
  }
127
242
  catch (err) {
128
243
  const delay = ENSURE_RETRY_DELAYS_MS[attempt];
129
244
  if (delay === undefined) {
130
- this.d.log.error("ensureRun after run failed; giving up", {
245
+ this.log.error("ensureRun after run failed; giving up", {
131
246
  conversationId,
132
247
  runId,
133
248
  attempts: attempt + 1,
@@ -135,7 +250,7 @@ export class RunWorker {
135
250
  });
136
251
  return;
137
252
  }
138
- this.d.log.warn("ensureRun after run failed; retrying", {
253
+ this.log.warn("ensureRun after run failed; retrying", {
139
254
  conversationId,
140
255
  runId,
141
256
  attempt,
@@ -174,15 +289,15 @@ export class RunWorker {
174
289
  async onJobFailed(data, err) {
175
290
  const { runId, conversationId } = data;
176
291
  const stalled = /stalled/i.test(err.message);
177
- await this.d.lock.releaseFor(conversationId, runId);
292
+ await this.lock.releaseFor(conversationId, runId);
178
293
  // 运行已进入 waiting(暂停后任务才失败):它有自己的续跑路径(人工决定 / 超时任务),不标记失败。
179
- const cur = await this.d.db
294
+ const cur = await this.db
180
295
  .selectFrom("runs")
181
296
  .select("status")
182
297
  .where("id", "=", runId)
183
298
  .executeTakeFirst();
184
299
  if (cur?.status === "waiting") {
185
- this.d.log.warn("run job failed after the run was suspended; leaving it waiting", { runId });
300
+ this.log.warn("run job failed after the run was suspended; leaving it waiting", { runId });
186
301
  return;
187
302
  }
188
303
  await this.finish(conversationId, runId, "failed", null, {
@@ -215,25 +330,18 @@ export class RunWorker {
215
330
  this.workers = [];
216
331
  this.closing = true;
217
332
  this.closingSignal.abort();
218
- await Promise.all(workers.map((w) => w.pause(true).catch((err) => this.d.log.warn("run worker pause failed", { err }))));
333
+ await Promise.all(workers.map((w) => w.pause(true).catch((err) => this.log.warn("run worker pause failed", { err }))));
219
334
  for (const a of this.active.values())
220
335
  a.shutdown.abort();
221
336
  const all = Promise.all([...this.active.values()].map((a) => a.done));
222
- let timer;
223
- const finished = await Promise.race([
224
- all.then(() => true),
225
- new Promise((resolve) => {
226
- timer = setTimeout(() => resolve(false), Math.max(0, budgetMs));
227
- timer.unref();
228
- }),
229
- ]);
230
- clearTimeout(timer);
337
+ const finished = await waitWithin(all, budgetMs);
231
338
  if (!finished) {
232
339
  for (const [runId, a] of this.active) {
233
340
  a.abandoned = true;
234
341
  a.lease.abandon();
342
+ a.quota?.abandon();
235
343
  a.stopTimers();
236
- this.d.log.warn("run did not reach a step boundary before shutdown; leaving it to another worker", {
344
+ this.log.warn("run did not reach a step boundary before shutdown; leaving it to another worker", {
237
345
  runId,
238
346
  });
239
347
  }
@@ -242,26 +350,15 @@ export class RunWorker {
242
350
  // 关闭期间完成 / 失败的任务登记的后续处理(ensureRun 等)要在调用方关闭运行队列之前做完,
243
351
  // 否则投递半途被打断,待处理的消息无人处理。以剩余预算为限(至少留一点时间)。
244
352
  if (this.followUps.size > 0) {
245
- let t;
246
- await Promise.race([
247
- Promise.allSettled([...this.followUps]),
248
- new Promise((resolve) => {
249
- t = setTimeout(resolve, Math.max(FOLLOW_UP_MIN_WAIT_MS, deadline - Date.now()));
250
- t.unref();
251
- }),
252
- ]);
253
- clearTimeout(t);
353
+ await waitWithin(Promise.allSettled([...this.followUps]), Math.max(FOLLOW_UP_MIN_WAIT_MS, deadline - Date.now()));
254
354
  }
255
- const conn = this.conn;
256
- this.conn = undefined;
257
- if (conn)
258
- await conn.quit().catch(() => conn.disconnect());
259
355
  }
356
+ /** One run job (the `@Processor`s of both run queues call it). */
260
357
  async process(job, token) {
261
358
  const { runId, conversationId } = job.data;
262
359
  if (this.closing)
263
360
  return requeue(job, token, 0);
264
- const run = await this.d.db
361
+ const run = await this.db
265
362
  .selectFrom("runs")
266
363
  .select([
267
364
  "id",
@@ -286,7 +383,7 @@ export class RunWorker {
286
383
  // 运行在等人处理(例如暂停后本任务被 stalled 机制重新投递):不执行,续跑由处理 / 超时发起的新任务负责。
287
384
  if (run.status === "waiting")
288
385
  return;
289
- const conv = await this.d.db
386
+ const conv = await this.db
290
387
  .selectFrom("conversations")
291
388
  .select(["org_id", "agent_id", "kind"])
292
389
  .where("id", "=", conversationId)
@@ -294,14 +391,14 @@ export class RunWorker {
294
391
  if (!conv)
295
392
  return;
296
393
  // 会话锁 TTL 与任务锁一致:持有者崩溃后,任务被判定 stalled 时会话锁也差不多同时过期。
297
- const lease = await this.d.lock.acquire(conversationId, runId, this.d.hooks?.lockTtlMs ?? this.d.config().runtime.jobLockMs);
394
+ const lease = await this.lock.acquire(conversationId, runId, this.hooks?.lockTtlMs ?? this.config.get().runtime.jobLockMs);
298
395
  if (!lease)
299
396
  return requeue(job, token, LOCK_BUSY_DELAY_MS);
300
397
  // A sub-agent stopped while still queued (its parent's stop or wait timeout) ends here, before
301
398
  // taking an org run slot: under a full quota it would otherwise wait for a slot only to be
302
399
  // aborted, and its parent would stay waiting meanwhile (final review m7)
303
400
  if (conv.kind === "subagent" && run.status === "queued") {
304
- const stop = await this.d.abort.requested(runId);
401
+ const stop = await this.abort.requested(runId);
305
402
  if (stop !== null) {
306
403
  try {
307
404
  await this.finish(conversationId, runId, "aborted", null, {
@@ -316,7 +413,7 @@ export class RunWorker {
316
413
  finally {
317
414
  await lease
318
415
  .release()
319
- .catch((err) => this.d.log.warn("conversation lock release failed", { runId, err }));
416
+ .catch((err) => this.log.warn("conversation lock release failed", { runId, err }));
320
417
  }
321
418
  await this.dropCheckpoints(runId);
322
419
  await this.childFinished(runId);
@@ -346,30 +443,28 @@ export class RunWorker {
346
443
  let entered = false;
347
444
  let delayMs = null;
348
445
  try {
349
- const limit = await orgRunLimit(this.d.settings, this.d.config, conv.org_id);
350
- entered = await this.d.quota.tryEnter(conv.org_id, runId, limit, ORG_QUOTA_LEASE_MS);
446
+ const limit = await orgRunLimit(this.settings, this.config, conv.org_id);
447
+ const slot = await this.quota.enter(conv.org_id, runId, limit, ORG_QUOTA_LEASE_MS);
448
+ if (slot !== undefined)
449
+ state.quota = slot;
450
+ entered = slot !== undefined;
351
451
  if (!entered) {
352
452
  delayMs = QUOTA_FULL_DELAY_MS;
353
453
  }
354
454
  else {
355
455
  // 运行开始执行(含续跑、stalled 后接手):通知旁路(渠道出站投递据此把输出投到 IM),失败不影响运行
356
- try {
357
- this.d.onRunStart?.(conversationId);
358
- }
359
- catch (err) {
360
- this.d.log.warn("onRunStart hook failed", { conversationId, err });
361
- }
456
+ void this.events.emit("run.started", { conversationId, runId });
362
457
  const r = await this.execute(run, { id: conversationId, ...conv }, state).catch(async (err) => {
363
458
  if (state.abandoned)
364
459
  return "abandoned";
365
460
  if (state.leaseLost)
366
461
  return "interrupted";
367
462
  // 编排自身出错(如写事件失败):尽力把运行标记为失败,避免会话卡在 running。
368
- this.d.log.error("run orchestration failed", { conversationId, runId, err });
463
+ this.log.error("run orchestration failed", { conversationId, runId, err });
369
464
  await this.finish(conversationId, runId, "failed", null, {
370
465
  type: "run_failed",
371
466
  payload: { error: { code: "run.internal", message: "The run failed unexpectedly" } },
372
- }).catch((e) => this.d.log.error("cannot mark run as failed", { runId, err: e }));
467
+ }).catch((e) => this.log.error("cannot mark run as failed", { runId, err: e }));
373
468
  return "broken";
374
469
  });
375
470
  if (r === "interrupted")
@@ -379,16 +474,14 @@ export class RunWorker {
379
474
  finally {
380
475
  state.stopTimers();
381
476
  if (!state.abandoned) {
382
- if (entered) {
383
- await this.d.quota
384
- .leave(conv.org_id, runId)
385
- .catch((err) => this.d.log.warn("org quota leave failed", { runId, err }));
386
- }
477
+ // releasing the slot stops its renewal and leaves (a failure is logged by the lock service)
478
+ if (entered)
479
+ await state.quota?.release();
387
480
  // 锁已丢失时不释放(已不属于本运行;RELEASE 虽比对 runId,这里也不再触碰)。
388
481
  if (!state.leaseLost) {
389
482
  await lease
390
483
  .release()
391
- .catch((err) => this.d.log.warn("conversation lock release failed", { runId, err }));
484
+ .catch((err) => this.log.warn("conversation lock release failed", { runId, err }));
392
485
  }
393
486
  }
394
487
  this.active.delete(runId);
@@ -401,7 +494,7 @@ export class RunWorker {
401
494
  // 暂停:会话锁与配额已释放,checkpoint 保留;置 waiting 并投递超时任务。任务就此完成,不 ensureRun
402
495
  // (等待期间的新消息在续跑后作为插话吸收)。
403
496
  if (state.suspended) {
404
- await this.d.waits.suspend(runId, conversationId, state.suspended.waitingFor, state.suspended.abort);
497
+ await this.waits.suspend(runId, conversationId, state.suspended.waitingFor, state.suspended.abort);
405
498
  return;
406
499
  }
407
500
  // 运行已到达终态(broken 时已尽力标记失败):checkpoint 只用于续跑,删除。
@@ -415,7 +508,7 @@ export class RunWorker {
415
508
  async execute(run, conv, state) {
416
509
  const runId = run.id;
417
510
  const conversationId = conv.id;
418
- const runtime = this.d.config().runtime;
511
+ const runtime = this.config.get().runtime;
419
512
  let agent;
420
513
  // a chat run's saved agent version, under the conversation's model switch (UI refresh B); a
421
514
  // sub-agent has none: it never takes a selection
@@ -425,18 +518,18 @@ export class RunWorker {
425
518
  if (conv.kind === "subagent") {
426
519
  // a sub-agent runs its effective definition frozen at dispatch, never agent_versions
427
520
  // (spec §6.3), and works for the parent call that dispatched this run
428
- const started = await this.d.eventLog.findByIdem(conversationId, "subagent_started");
521
+ const started = await this.eventLog.findByIdem(conversationId, "subagent_started");
429
522
  if (started?.type !== "subagent_started") {
430
523
  throw new Error(`sub-agent conversation ${conversationId} has no subagent_started`);
431
524
  }
432
525
  // a follow-up runs with its task message's narrowing (final review I1): the frozen tools
433
526
  // and org skills the current version still allows, recorded at its dispatch
434
- const trigger = (await this.d.eventLog.readAfter(conversationId, Number(run.trigger_seq) - 1, 1))[0];
435
- agent = childRunDefinition(normalizeStoredDefinition(started.payload.definition), trigger?.type === "user_message" && trigger.seq === Number(run.trigger_seq)
527
+ const trigger = (await this.eventLog.readAfter(conversationId, Number(run.trigger_seq) - 1, 1))[0];
528
+ agent = childRunDefinition(await normalizeStoredDefinitionIn(this.db, conv.org_id, started.payload.definition), trigger?.type === "user_message" && trigger.seq === Number(run.trigger_seq)
436
529
  ? trigger.payload.dispatch?.narrowed
437
530
  : undefined);
438
531
  maxSteps = Math.min(started.payload.maxSteps, runtime.maxSteps);
439
- const row = await dispatchOfChildRun(this.d.db, runId);
532
+ const row = await dispatchOfChildRun(this.db, runId);
440
533
  const otherAgent = started.payload.template.source === "agent";
441
534
  parent = row
442
535
  ? {
@@ -453,13 +546,13 @@ export class RunWorker {
453
546
  };
454
547
  }
455
548
  else {
456
- const version = await this.d.db
549
+ const version = await this.db
457
550
  .selectFrom("agent_versions")
458
551
  .select("definition")
459
552
  .where("agent_id", "=", conv.agent_id)
460
553
  .where("version", "=", run.agent_version)
461
554
  .executeTakeFirstOrThrow();
462
- saved = normalizeStoredDefinition(version.definition);
555
+ saved = await normalizeStoredDefinitionIn(this.db, conv.org_id, version.definition);
463
556
  agent = saved;
464
557
  }
465
558
  let startedAt = run.started_at;
@@ -467,66 +560,40 @@ export class RunWorker {
467
560
  // run's `run_started`, read under the conversation lock when the run starts, so a replay
468
561
  // (`selectionAt`) sees exactly what the run used.
469
562
  // A sub-agent (no `saved`) runs its frozen definition as is.
470
- const existingStart = await this.d.eventLog.findByIdem(conversationId, `run_started:${runId}`);
563
+ const existingStart = await this.eventLog.findByIdem(conversationId, `run_started:${runId}`);
471
564
  if (existingStart && saved !== undefined) {
472
- agent = effectiveDefinition(saved, await readSelection(this.d.db, conversationId, existingStart.seq));
565
+ agent = effectiveDefinition(saved, await readSelection(this.db, conversationId, existingStart.seq));
473
566
  }
474
567
  if (run.status === "queued" || startedAt === null) {
475
568
  if (!existingStart) {
476
569
  if (saved !== undefined)
477
570
  await this.fallBackIfUnavailable(conversationId, runId, saved);
478
- const toSeq = await this.d.db.transaction().execute(async (t) => {
479
- await t
480
- .selectFrom("conversations")
481
- .select("id")
482
- .where("id", "=", conversationId)
483
- .forUpdate()
484
- .execute();
485
- if (saved !== undefined) {
486
- agent = effectiveDefinition(saved, await readSelection(t, conversationId));
487
- }
488
- const [ev] = await this.d.eventLog.append(conversationId, [
489
- {
490
- type: "run_started",
491
- runId,
492
- idemKey: `run_started:${runId}`,
493
- payload: {
494
- agentVersion: run.agent_version,
495
- model: agent.model,
496
- triggerAccountId: run.trigger_account_id,
497
- },
498
- },
499
- ], t);
500
- return ev?.seq;
501
- });
571
+ const started = await this.appendRunStarted(conversationId, run, agent, saved);
572
+ agent = started.agent;
573
+ const toSeq = started.toSeq;
502
574
  if (toSeq !== undefined)
503
- await this.d.eventLog.notify(conversationId, toSeq);
575
+ await this.eventLog.notify(conversationId, toSeq);
504
576
  }
505
577
  // 技能目录快照(Ruling M17):在置为 running 之前写,崩溃重试时仍走这里(幂等键去重)
506
578
  try {
507
- await recordSkillsCatalog({
508
- db: this.d.db,
509
- eventLog: this.d.eventLog,
510
- log: this.d.log,
511
- ...(this.d.storage !== undefined && { storage: this.d.storage }),
512
- }, {
579
+ await this.skillsCatalog.record({
513
580
  orgId: conv.org_id,
514
581
  agentId: conv.agent_id,
515
582
  conversationId,
516
583
  runId,
517
584
  agent,
518
- });
585
+ }, { log: this.log });
519
586
  }
520
587
  catch (e) {
521
588
  // Pinned skill bodies could not be read (Decision 9), or the pinned skills kept changing
522
589
  // while they were read (`conflict`): fail before any model request. A transient failure
523
590
  // or a conflict is fixed by sending again; a permanent one names the skill for the owner
524
- // (`recordSkillsCatalog` already logged it at error). Other errors take the generic path.
591
+ // (`SkillsCatalogService.record` already logged it at error). Other errors take the generic path.
525
592
  if (!(e instanceof ApiError) ||
526
593
  (e.code !== "storage.unavailable" && e.code !== "conflict")) {
527
594
  throw e;
528
595
  }
529
- this.d.log.warn("skills catalog not recorded at run start", {
596
+ this.log.warn("skills catalog not recorded at run start", {
530
597
  conversationId,
531
598
  runId,
532
599
  code: e.code,
@@ -539,7 +606,7 @@ export class RunWorker {
539
606
  });
540
607
  return "finished";
541
608
  }
542
- const updated = await this.d.db
609
+ const updated = await this.db
543
610
  .updateTable("runs")
544
611
  .set({ status: "running", started_at: sql `COALESCE(started_at, now())` })
545
612
  .where("id", "=", runId)
@@ -557,29 +624,18 @@ export class RunWorker {
557
624
  deadlineHit = true;
558
625
  ac.abort();
559
626
  }, Math.max(0, deadline - Date.now()));
560
- const quotaTimer = setInterval(() => {
561
- this.d.quota
562
- .renew(conv.org_id, runId, ORG_QUOTA_LEASE_MS)
563
- .then((ok) => {
564
- if (!ok)
565
- this.d.log.warn("org quota lease lost", { runId, orgId: conv.org_id });
566
- })
567
- .catch((err) => this.d.log.warn("org quota renew failed", { runId, err }));
568
- }, ORG_QUOTA_LEASE_MS / 3);
569
- quotaTimer.unref();
570
627
  state.stopTimers = () => {
571
628
  clearTimeout(deadlineTimer);
572
- clearInterval(quotaTimer);
573
629
  };
574
630
  let unwatch;
575
631
  try {
576
- unwatch = await this.d.abort.watch(runId, (by, detail) => {
632
+ unwatch = await this.abort.watch(runId, (by, detail) => {
577
633
  abortedBy = by;
578
634
  abortDetail = detail;
579
635
  ac.abort();
580
636
  });
581
637
  // 取得会话锁之后再读 consumed_seq(锁内不会有别的运行推进它)。
582
- const { consumed_seq } = await this.d.db
638
+ const { consumed_seq } = await this.db
583
639
  .selectFrom("conversations")
584
640
  .select("consumed_seq")
585
641
  .where("id", "=", conversationId)
@@ -592,7 +648,7 @@ export class RunWorker {
592
648
  const out = [];
593
649
  let after = Math.max(afterSeq, startConsumed);
594
650
  for (;;) {
595
- const page = await this.d.eventLog.readAfter(conversationId, after, READ_PAGE);
651
+ const page = await this.eventLog.readAfter(conversationId, after, READ_PAGE);
596
652
  for (const e of page)
597
653
  if (e.type === "user_message")
598
654
  out.push(e);
@@ -610,7 +666,7 @@ export class RunWorker {
610
666
  };
611
667
  let outcome;
612
668
  try {
613
- outcome = await this.d.loop.run({
669
+ outcome = await this.loop.run({
614
670
  orgId: conv.org_id,
615
671
  conversationId,
616
672
  runId,
@@ -620,7 +676,7 @@ export class RunWorker {
620
676
  agentVersion: run.agent_version,
621
677
  signal: ac.signal,
622
678
  shutdown: state.shutdown.signal,
623
- sink: this.d.sinkFor?.(conversationId) ?? noopSink,
679
+ sink: this.sinkFor(conversationId),
624
680
  pendingUserMessages,
625
681
  limits: { maxSteps, deadline },
626
682
  // a sub-agent's conversation fires hooks like a chat, with `parent` set (spec §11)
@@ -635,7 +691,7 @@ export class RunWorker {
635
691
  return "interrupted";
636
692
  const err = e instanceof RunError ? e : new RunError("run.internal", "The run failed unexpectedly");
637
693
  if (!(e instanceof RunError)) {
638
- this.d.log.error("agent loop threw", { conversationId, runId, err: e });
694
+ this.log.error("agent loop threw", { conversationId, runId, err: e });
639
695
  }
640
696
  // 失败也推进 consumed_seq 到已吸收的位置:否则结束时的 ensureRun 会对同一条消息无限重试;
641
697
  // 用户看到 run_failed 后可以重发。
@@ -702,16 +758,12 @@ export class RunWorker {
702
758
  }
703
759
  finally {
704
760
  state.stopTimers();
705
- await unwatch?.().catch((err) => this.d.log.warn("abort unwatch failed", { runId, err }));
761
+ await unwatch?.().catch((err) => this.log.warn("abort unwatch failed", { runId, err }));
706
762
  }
707
763
  }
708
764
  completed(conversationId) {
709
- try {
710
- this.d.onRunCompleted?.(conversationId);
711
- }
712
- catch (err) {
713
- this.d.log.warn("onRunCompleted hook failed", { conversationId, err });
714
- }
765
+ // a completed run enqueues the conversation's title job (never throws)
766
+ void this.titles.maybeEnqueue(conversationId);
715
767
  }
716
768
  /**
717
769
  * When the conversation was switched to a model that no longer resolves (provider disabled,
@@ -721,13 +773,11 @@ export class RunWorker {
721
773
  * handles it).
722
774
  */
723
775
  async fallBackIfUnavailable(conversationId, runId, agent) {
724
- if (!this.d.models)
725
- return;
726
- const sel = await readSelection(this.d.db, conversationId);
776
+ const sel = await readSelection(this.db, conversationId);
727
777
  if (sel.model === null || sameModel(sel.model, agent.model))
728
778
  return;
729
779
  try {
730
- await this.d.models.resolve(sel.model);
780
+ await this.models.resolve(sel.model);
731
781
  return;
732
782
  }
733
783
  catch (e) {
@@ -736,71 +786,135 @@ export class RunWorker {
736
786
  if (!(e instanceof ApiError && e.code === "agent.model_unavailable"))
737
787
  throw e;
738
788
  }
739
- this.d.log.warn("switched-to model unavailable; falling back to the agent's model", {
789
+ this.log.warn("switched-to model unavailable; falling back to the agent's model", {
740
790
  conversationId,
741
791
  runId,
742
792
  model: sel.model,
743
793
  });
744
- const ev = await this.d.db.transaction().execute(async (t) => {
745
- // re-check under the row lock: a person who switched again since the read above wins
746
- await t
747
- .selectFrom("conversations")
748
- .select("id")
749
- .where("id", "=", conversationId)
750
- .forUpdate()
751
- .executeTakeFirst();
752
- if (!sameSelection(await readSelection(t, conversationId), sel))
753
- return null;
754
- const [written] = await this.d.eventLog.append(conversationId, [
755
- {
756
- type: "model_switched",
757
- runId,
758
- idemKey: `model_fallback:${runId}`,
759
- payload: { model: null, effort: null, byAccountId: null, reason: "unavailable" },
760
- },
761
- ], t);
762
- await t
763
- .updateTable("conversations")
764
- .set({ selection: JSON.stringify(NO_SELECTION) })
765
- .where("id", "=", conversationId)
766
- .execute();
767
- return written ?? null;
768
- });
794
+ const ev = await this.fallBackIn(conversationId, runId, sel);
769
795
  if (ev === null)
770
796
  return;
771
- await this.d.eventLog.notify(conversationId, ev.seq);
772
- await this.d.eventLog.publishChanged(conversationId, "selection");
797
+ await this.eventLog.notify(conversationId, ev.seq);
798
+ await this.eventLog.publishChanged(conversationId, "selection");
799
+ }
800
+ /**
801
+ * `run_started` under the conversation row lock, with the model / effort switch in effect then
802
+ * (a chat run's `saved` version under the conversation's selection): what the run uses.
803
+ */
804
+ async appendRunStarted(conversationId, run,
805
+ /** The definition so far (a sub-agent's frozen one is final). */
806
+ current, saved) {
807
+ const t = this.db;
808
+ await t
809
+ .selectFrom("conversations")
810
+ .select("id")
811
+ .where("id", "=", conversationId)
812
+ .forUpdate()
813
+ .execute();
814
+ const agent = saved !== undefined
815
+ ? effectiveDefinition(saved, await readSelection(t, conversationId))
816
+ : current;
817
+ const [ev] = await this.eventLog.appendIn(conversationId, [
818
+ {
819
+ type: "run_started",
820
+ runId: run.id,
821
+ idemKey: `run_started:${run.id}`,
822
+ payload: {
823
+ agentVersion: run.agent_version,
824
+ model: agent.model,
825
+ triggerAccountId: run.trigger_account_id,
826
+ },
827
+ },
828
+ ]);
829
+ return { toSeq: ev?.seq, agent };
830
+ }
831
+ /** {@link fallBackIfUnavailable}'s write: null when the person switched again meanwhile. */
832
+ async fallBackIn(conversationId, runId, sel) {
833
+ const t = this.db;
834
+ // re-check under the row lock: a person who switched again since the read above wins
835
+ await t
836
+ .selectFrom("conversations")
837
+ .select("id")
838
+ .where("id", "=", conversationId)
839
+ .forUpdate()
840
+ .executeTakeFirst();
841
+ if (!sameSelection(await readSelection(t, conversationId), sel))
842
+ return null;
843
+ const [written] = await this.eventLog.appendIn(conversationId, [
844
+ {
845
+ type: "model_switched",
846
+ runId,
847
+ idemKey: `model_fallback:${runId}`,
848
+ payload: { model: null, effort: null, byAccountId: null, reason: "unavailable" },
849
+ },
850
+ ]);
851
+ await t
852
+ .updateTable("conversations")
853
+ .set({ selection: JSON.stringify(NO_SELECTION) })
854
+ .where("id", "=", conversationId)
855
+ .execute();
856
+ return written ?? null;
773
857
  }
774
858
  /** 删除已结束运行的 checkpoint thread(失败只记日志)。 */
775
859
  async dropCheckpoints(runId) {
776
- await this.d.checkpoints
777
- ?.deleteThread(runId)
778
- .catch((err) => this.d.log.warn("checkpoint delete failed", { runId, err }));
860
+ await this.checkpoints
861
+ .deleteThread(runId)
862
+ .catch((err) => this.log.warn("checkpoint delete failed", { runId, err }));
779
863
  }
780
864
  /**
781
865
  * 写终态(见 `finishRun`:运行仍未结束才写,同一事务内推进 `consumed_seq` 并更新 `runs.status`),
782
866
  * 提交后发布会话通知,然后调用测试钩子。返回终态事件 seq;运行已是终态 → null。
783
867
  */
784
868
  async finish(conversationId, runId, status, consumed, event, hook = true, floorToTrigger = true) {
785
- const stopOpen = this.d.stopOpenCalls;
786
869
  let fire = () => { };
787
- const toSeq = await finishRun(this.d.db, this.d.eventLog, {
870
+ const toSeq = await this.finisher.finish({
788
871
  conversationId,
789
872
  runId,
790
873
  status,
791
874
  consumed,
792
875
  event,
793
876
  floorToTrigger,
794
- ...(stopOpen !== undefined && {
795
- beforeTerminal: async (t) => {
796
- fire = (await stopOpen(t, runId)).fire;
797
- },
798
- }),
877
+ beforeTerminal: async () => {
878
+ fire = (await this.pipeline.stopOpenAgentCalls(runId)).fire;
879
+ },
799
880
  });
800
881
  if (toSeq !== null)
801
882
  fire();
802
883
  if (hook)
803
- await this.d.hooks?.beforeRelease?.(runId, conversationId);
884
+ await this.hooks?.beforeRelease?.(runId, conversationId);
804
885
  return toSeq;
805
886
  }
806
- }
887
+ };
888
+ __decorate([
889
+ Transactional({ propagation: "requires_new" })
890
+ ], RunWorker.prototype, "appendRunStarted", null);
891
+ __decorate([
892
+ Transactional({ propagation: "requires_new" })
893
+ ], RunWorker.prototype, "fallBackIn", null);
894
+ RunWorker = __decorate([
895
+ Injectable(),
896
+ __param(0, Inject(KernelDb)),
897
+ __param(1, Inject(EventLog)),
898
+ __param(2, Inject(ConversationLock)),
899
+ __param(3, Inject(RUN_QUOTA)),
900
+ __param(4, Inject(RunAbort)),
901
+ __param(5, Inject(RunQueue)),
902
+ __param(6, Inject(SettingsService)),
903
+ __param(7, Inject(AgentLoops)),
904
+ __param(8, Inject(RunSteps)),
905
+ __param(9, Inject(KernelConfigService)),
906
+ __param(10, Inject(KERNEL_LOGGER)),
907
+ __param(11, Inject(KERNEL_BUS)),
908
+ __param(12, Inject(KyselyCheckpointSaver)),
909
+ __param(13, Inject(Waits)),
910
+ __param(14, Inject(KernelEvents)),
911
+ __param(15, Inject(TitleQueue)),
912
+ __param(16, Inject(ProviderRegistry)),
913
+ __param(17, Inject(SkillsCatalogService)),
914
+ __param(18, Inject(ToolPipeline)),
915
+ __param(19, Inject(RunFinish)),
916
+ __param(20, Inject(TransactionHost)),
917
+ __param(21, Optional()),
918
+ __param(21, Inject(RUN_HOOKS))
919
+ ], RunWorker);
920
+ export { RunWorker };