@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
@@ -0,0 +1,23 @@
1
+ import { Processor } from "@nestjs/bullmq";
2
+ /**
3
+ * A `@Processor(queue)` provider whose worker options come from the application's startup config
4
+ * (`@Processor` reads them from class metadata when the worker is built, at module init, so they
5
+ * cannot be read from an injected service). Returns `{ provide: base, useClass }` with a subclass
6
+ * of `base` decorated for this application only, so two applications in one process (tests, the
7
+ * dual-replica harness) each get their own options. `base` is an `@Injectable` `WorkerHost` without
8
+ * `@Processor` of its own; inject it by `base`.
9
+ *
10
+ * The worker never starts by itself (`autorun: false`): the role that consumes calls
11
+ * `worker.run()` once the start sequence reached it (the kernel's worker role, after the extension
12
+ * load), and pauses it on stop.
13
+ */
14
+ export function configuredProcessor(base, queue, options) {
15
+ if (queue.includes(":"))
16
+ throw new Error(`queue name "${queue}" must not contain ":"`);
17
+ // `base` implements `process`; the cast only lets an anonymous subclass extend the abstract type
18
+ const Configured = class extends base {
19
+ };
20
+ Object.defineProperty(Configured, "name", { value: base.name });
21
+ Processor(queue, { ...options, autorun: false })(Configured);
22
+ return { provide: base, useClass: Configured };
23
+ }
@@ -0,0 +1,18 @@
1
+ import type { Job } from "bullmq";
2
+ import type { KernelLogger } from "../../log.js";
3
+ export interface LogJobFailureOptions {
4
+ /** Extra fields added to the record. */
5
+ tags?: Record<string, string>;
6
+ /**
7
+ * Overrides the "final failure" decision. By default a failure is final when
8
+ * `attemptsMade >= opts.attempts`; an `UnrecoverableError` fails the job at once with attempts
9
+ * left, so a caller holding the error instance passes `final: true`.
10
+ */
11
+ final?: boolean;
12
+ }
13
+ /**
14
+ * One log line for a failed BullMQ job, by retry progress: `error` when final, `warn` while
15
+ * retries remain. Business errors (`ApiError`) are skipped: they are already recorded in the
16
+ * job's own status or database rows. Use it from `@OnWorkerEvent("failed")`.
17
+ */
18
+ export declare function logJobFailure(log: KernelLogger, job: Job, error: Error, options?: LogJobFailureOptions): void;
@@ -0,0 +1,26 @@
1
+ import { ApiError } from "../../errors.js";
2
+ /**
3
+ * One log line for a failed BullMQ job, by retry progress: `error` when final, `warn` while
4
+ * retries remain. Business errors (`ApiError`) are skipped: they are already recorded in the
5
+ * job's own status or database rows. Use it from `@OnWorkerEvent("failed")`.
6
+ */
7
+ export function logJobFailure(log, job, error, options) {
8
+ if (error instanceof ApiError)
9
+ return;
10
+ const maxAttempts = job.opts?.attempts ?? 1;
11
+ const final = options?.final ?? job.attemptsMade >= maxAttempts;
12
+ const fields = {
13
+ queue: job.queueName,
14
+ jobId: String(job.id ?? ""),
15
+ attempt: job.attemptsMade,
16
+ maxAttempts,
17
+ final,
18
+ err: error,
19
+ ...options?.tags,
20
+ };
21
+ const msg = `queue job failed [${job.queueName}#${job.id}] attempt=${job.attemptsMade}/${maxAttempts}`;
22
+ if (final)
23
+ log.error(msg, fields);
24
+ else
25
+ log.warn(msg, fields);
26
+ }
@@ -0,0 +1,27 @@
1
+ import { type BeforeApplicationShutdown } from "@nestjs/common";
2
+ import { DiscoveryService } from "@nestjs/core";
3
+ import type { KernelLogger } from "../../log.js";
4
+ import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
5
+ /** The least time a queue or worker gets to close when the stop budget is used up. */
6
+ export declare const MIN_CLOSE_MS = 1000;
7
+ /** What is kept of the stop budget for the infra closes that follow (bus, Redis, the pool). */
8
+ export declare const INFRA_RESERVE_MS = 2000;
9
+ /**
10
+ * Closes every BullMQ queue (`registerQueue`) and `@Processor` worker of the application within
11
+ * what is left of the stop budget (less {@link INFRA_RESERVE_MS}), before `@nestjs/bullmq` closes
12
+ * them again in `onApplicationShutdown` without a limit. A close waits for Redis, which never
13
+ * answers while Redis is down:
14
+ * - a queue is registered with `forceDisconnectOnShutdown` (`QueueModule.registerQueue`), and one
15
+ * that does not close in time is disconnected here;
16
+ * - a worker has no such option, and its close also waits for its main loop, which retries its
17
+ * blocked command until Redis answers again: one that does not close in time is disconnected
18
+ * and abandoned like the infra closes (`closeWithin`), its later close returning at once (the
19
+ * one monkeypatch: otherwise `@nestjs/bullmq`'s own close would hold the application's close).
20
+ */
21
+ export declare class QueueShutdown implements BeforeApplicationShutdown {
22
+ private readonly discovery;
23
+ private readonly log;
24
+ private readonly shutdown?;
25
+ constructor(discovery: Pick<DiscoveryService, "getProviders">, log: Pick<KernelLogger, "warn">, shutdown?: Pick<GracefulShutdown, "remainingMs"> | undefined);
26
+ beforeApplicationShutdown(): Promise<void>;
27
+ }
@@ -0,0 +1,81 @@
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 { WorkerHost } from "@nestjs/bullmq";
11
+ import { Inject, Injectable, Optional } from "@nestjs/common";
12
+ import { DiscoveryService } from "@nestjs/core";
13
+ import { Queue } from "bullmq";
14
+ import { closeWithin } from "../close-within.js";
15
+ import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
16
+ import { KERNEL_LOGGER } from "../tokens.js";
17
+ /** The least time a queue or worker gets to close when the stop budget is used up. */
18
+ export const MIN_CLOSE_MS = 1_000;
19
+ /** What is kept of the stop budget for the infra closes that follow (bus, Redis, the pool). */
20
+ export const INFRA_RESERVE_MS = 2_000;
21
+ /**
22
+ * Closes every BullMQ queue (`registerQueue`) and `@Processor` worker of the application within
23
+ * what is left of the stop budget (less {@link INFRA_RESERVE_MS}), before `@nestjs/bullmq` closes
24
+ * them again in `onApplicationShutdown` without a limit. A close waits for Redis, which never
25
+ * answers while Redis is down:
26
+ * - a queue is registered with `forceDisconnectOnShutdown` (`QueueModule.registerQueue`), and one
27
+ * that does not close in time is disconnected here;
28
+ * - a worker has no such option, and its close also waits for its main loop, which retries its
29
+ * blocked command until Redis answers again: one that does not close in time is disconnected
30
+ * and abandoned like the infra closes (`closeWithin`), its later close returning at once (the
31
+ * one monkeypatch: otherwise `@nestjs/bullmq`'s own close would hold the application's close).
32
+ */
33
+ let QueueShutdown = class QueueShutdown {
34
+ discovery;
35
+ log;
36
+ shutdown;
37
+ constructor(discovery, log, shutdown) {
38
+ this.discovery = discovery;
39
+ this.log = log;
40
+ this.shutdown = shutdown;
41
+ }
42
+ async beforeApplicationShutdown() {
43
+ const targets = [];
44
+ for (const wrapper of this.discovery.getProviders()) {
45
+ const instance = wrapper.instance;
46
+ if (instance instanceof Queue) {
47
+ targets.push({ label: `queue ${instance.name}`, target: instance, worker: false });
48
+ }
49
+ else if (instance instanceof WorkerHost) {
50
+ // a processor whose worker was never built (no registration) has nothing to close
51
+ let worker;
52
+ try {
53
+ worker = instance.worker;
54
+ }
55
+ catch {
56
+ worker = undefined;
57
+ }
58
+ if (worker)
59
+ targets.push({ label: `worker ${worker.name}`, target: worker, worker: true });
60
+ }
61
+ }
62
+ const left = this.shutdown?.remainingMs() ?? MIN_CLOSE_MS + INFRA_RESERVE_MS;
63
+ const budget = Math.max(MIN_CLOSE_MS, left - INFRA_RESERVE_MS);
64
+ await Promise.all(targets.map(async ({ label, target, worker }) => {
65
+ if (await closeWithin(label, target.close(), budget, this.log))
66
+ return;
67
+ // not awaited: the disconnect itself waits for the connection
68
+ void target.disconnect().catch(() => { });
69
+ if (worker)
70
+ Object.defineProperty(target, "close", { value: () => Promise.resolve() });
71
+ }));
72
+ }
73
+ };
74
+ QueueShutdown = __decorate([
75
+ Injectable(),
76
+ __param(0, Inject(DiscoveryService)),
77
+ __param(1, Inject(KERNEL_LOGGER)),
78
+ __param(2, Optional()),
79
+ __param(2, Inject(GracefulShutdown))
80
+ ], QueueShutdown);
81
+ export { QueueShutdown };
@@ -0,0 +1,16 @@
1
+ import { type DynamicModule } from "@nestjs/common";
2
+ import type { DefaultJobOptions } from "bullmq";
3
+ /** Defaults of every job a kernel queue adds (the values `ctx.queue` uses today). */
4
+ export declare const QUEUE_JOB_DEFAULTS: DefaultJobOptions;
5
+ /**
6
+ * Global: the BullMQ root configuration (the kernel's Redis URL, BullMQ's default key prefix, which
7
+ * the hand-made queues also use, and {@link QUEUE_JOB_DEFAULTS}). A feature module that owns a
8
+ * queue imports `QueueModule.registerQueue(...names)` and declares a `@Processor(name)` provider;
9
+ * without the registration the processor has no queue and never consumes. Queue names and job
10
+ * ids must not contain `:`.
11
+ */
12
+ export declare class QueueModule {
13
+ static forRoot(): DynamicModule;
14
+ /** Registers queues in the importing feature module (names without `:`). */
15
+ static registerQueue(...names: string[]): DynamicModule;
16
+ }
@@ -0,0 +1,61 @@
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 QueueModule_1;
8
+ import { BullModule } from "@nestjs/bullmq";
9
+ import { Module } from "@nestjs/common";
10
+ import { DiscoveryModule } from "@nestjs/core";
11
+ import { KernelConfigService } from "../config/kernel-config.service.js";
12
+ import { QueueShutdown } from "./queue-shutdown.js";
13
+ import { bullConnectionOptions } from "./redis-connection.js";
14
+ /** Defaults of every job a kernel queue adds (the values `ctx.queue` uses today). */
15
+ export const QUEUE_JOB_DEFAULTS = {
16
+ attempts: 3,
17
+ backoff: { type: "exponential", delay: 1000 },
18
+ removeOnComplete: 1000,
19
+ removeOnFail: 5000,
20
+ };
21
+ /**
22
+ * Global: the BullMQ root configuration (the kernel's Redis URL, BullMQ's default key prefix, which
23
+ * the hand-made queues also use, and {@link QUEUE_JOB_DEFAULTS}). A feature module that owns a
24
+ * queue imports `QueueModule.registerQueue(...names)` and declares a `@Processor(name)` provider;
25
+ * without the registration the processor has no queue and never consumes. Queue names and job
26
+ * ids must not contain `:`.
27
+ */
28
+ let QueueModule = QueueModule_1 = class QueueModule {
29
+ static forRoot() {
30
+ return {
31
+ module: QueueModule_1,
32
+ global: true,
33
+ imports: [
34
+ DiscoveryModule,
35
+ BullModule.forRootAsync({
36
+ inject: [KernelConfigService],
37
+ useFactory: (config) => ({
38
+ connection: bullConnectionOptions(config.get().redis.url),
39
+ defaultJobOptions: QUEUE_JOB_DEFAULTS,
40
+ }),
41
+ }),
42
+ ],
43
+ // every queue and worker closes within the stop budget (before @nestjs/bullmq's own close)
44
+ providers: [QueueShutdown],
45
+ };
46
+ }
47
+ /** Registers queues in the importing feature module (names without `:`). */
48
+ static registerQueue(...names) {
49
+ for (const name of names) {
50
+ if (name.includes(":"))
51
+ throw new Error(`queue name "${name}" must not contain ":"`);
52
+ }
53
+ // forceDisconnectOnShutdown: a queue's connection is dropped after its close at shutdown
54
+ return BullModule.registerQueue(...names.map((name) => ({ name, forceDisconnectOnShutdown: true })));
55
+ }
56
+ };
57
+ QueueModule = QueueModule_1 = __decorate([
58
+ Module({})
59
+ // biome-ignore lint/complexity/noStaticOnlyClass: a Nest dynamic module
60
+ ], QueueModule);
61
+ export { QueueModule };
@@ -0,0 +1,7 @@
1
+ import type { RedisOptions } from "bullmq";
2
+ /**
3
+ * BullMQ connection options from the kernel's Redis URL, the same connection the hand-made
4
+ * `new Redis(url, { maxRetriesPerRequest: null })` workers use: BullMQ requires
5
+ * `maxRetriesPerRequest: null` on the blocking connection.
6
+ */
7
+ export declare function bullConnectionOptions(url: string): RedisOptions;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * BullMQ connection options from the kernel's Redis URL, the same connection the hand-made
3
+ * `new Redis(url, { maxRetriesPerRequest: null })` workers use: BullMQ requires
4
+ * `maxRetriesPerRequest: null` on the blocking connection.
5
+ */
6
+ export function bullConnectionOptions(url) {
7
+ const u = new URL(url);
8
+ const db = u.pathname.length > 1 ? Number(u.pathname.slice(1)) : undefined;
9
+ return {
10
+ host: u.hostname,
11
+ port: u.port ? Number(u.port) : 6379,
12
+ ...(u.username && { username: decodeURIComponent(u.username) }),
13
+ ...(u.password && { password: decodeURIComponent(u.password) }),
14
+ ...(db !== undefined && Number.isInteger(db) && { db }),
15
+ ...(u.protocol === "rediss:" && { tls: {} }),
16
+ maxRetriesPerRequest: null,
17
+ };
18
+ }
@@ -0,0 +1,7 @@
1
+ import type { Queue } from "bullmq";
2
+ /**
3
+ * Removes job schedulers that no job uses any more (fixed-period jobs that became `@LockedCron` /
4
+ * `@LockedInterval` jobs leave their old BullMQ schedulers in Redis on an upgraded deployment).
5
+ * Idempotent; replicas may race.
6
+ */
7
+ export declare function removeRetiredSchedulers(queue: Pick<Queue, "removeJobScheduler">, ids: readonly string[]): Promise<void>;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Removes job schedulers that no job uses any more (fixed-period jobs that became `@LockedCron` /
3
+ * `@LockedInterval` jobs leave their old BullMQ schedulers in Redis on an upgraded deployment).
4
+ * Idempotent; replicas may race.
5
+ */
6
+ export async function removeRetiredSchedulers(queue, ids) {
7
+ for (const id of ids)
8
+ await queue.removeJobScheduler(id);
9
+ }
@@ -0,0 +1,16 @@
1
+ import { type ContextJob } from "../../log-context.js";
2
+ /**
3
+ * The wrapper every queue processor runs its job in: a fresh async context (no transaction of
4
+ * whoever enqueued the job or started the worker is visible), `queue` / `jobId` / `runId` in the
5
+ * log context, and the tracing span when tracing is on (`withJobContext`).
6
+ *
7
+ * ```ts
8
+ * @Processor("cap-kernel-titles")
9
+ * class TitleProcessor extends WorkerHost {
10
+ * process(job: Job) {
11
+ * return runJob("cap-kernel-titles", job, () => this.titles.generate(job.data));
12
+ * }
13
+ * }
14
+ * ```
15
+ */
16
+ export declare function runJob<T>(queue: string, job: ContextJob, fn: () => Promise<T>): Promise<T>;
@@ -0,0 +1,19 @@
1
+ import { withJobContext } from "../../log-context.js";
2
+ import { runOutsideTransaction } from "../database/transaction-host.js";
3
+ /**
4
+ * The wrapper every queue processor runs its job in: a fresh async context (no transaction of
5
+ * whoever enqueued the job or started the worker is visible), `queue` / `jobId` / `runId` in the
6
+ * log context, and the tracing span when tracing is on (`withJobContext`).
7
+ *
8
+ * ```ts
9
+ * @Processor("cap-kernel-titles")
10
+ * class TitleProcessor extends WorkerHost {
11
+ * process(job: Job) {
12
+ * return runJob("cap-kernel-titles", job, () => this.titles.generate(job.data));
13
+ * }
14
+ * }
15
+ * ```
16
+ */
17
+ export function runJob(queue, job, fn) {
18
+ return runOutsideTransaction(() => withJobContext(queue, job, fn));
19
+ }
@@ -0,0 +1,24 @@
1
+ import { Redis } from "ioredis";
2
+ import { type BusSubscriber } from "../../ctx/bus.js";
3
+ import type { KernelLogger } from "../../log.js";
4
+ import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
5
+ /**
6
+ * Closes the bus subscriber, then the main connection, at the end of the shutdown
7
+ * (`GracefulShutdown.closeLast`: together with the pool), within what is left of the total stop
8
+ * budget. A ready main connection is closed with QUIT, so commands still in flight (a lock
9
+ * release, an after-commit publish) complete; it is dropped when QUIT does not finish in time or
10
+ * the connection is not ready.
11
+ */
12
+ export declare class RedisLifecycle {
13
+ private readonly redis;
14
+ private readonly subscriber;
15
+ private readonly log;
16
+ private readonly shutdown;
17
+ constructor(redis: Redis, subscriber: BusSubscriber & {
18
+ close(): Promise<void>;
19
+ }, log: KernelLogger, shutdown: GracefulShutdown);
20
+ close(): Promise<void>;
21
+ }
22
+ /** Global: the main Redis connection, the bus subscriber connection and the kernel bus. */
23
+ export declare class RedisModule {
24
+ }
@@ -0,0 +1,87 @@
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 { Global, Inject, Injectable, Module } from "@nestjs/common";
11
+ import { Redis } from "ioredis";
12
+ import { createBus, createBusSubscriber } from "../../ctx/bus.js";
13
+ import { closeWithin } from "../close-within.js";
14
+ import { KernelConfigService } from "../config/kernel-config.service.js";
15
+ import { GracefulShutdownModule } from "../lifecycle/graceful-shutdown.module.js";
16
+ import { GracefulShutdown } from "../lifecycle/graceful-shutdown.service.js";
17
+ import { KERNEL_BUS, KERNEL_LOGGER, REDIS, REDIS_SUBSCRIBER } from "../tokens.js";
18
+ /**
19
+ * Closes the bus subscriber, then the main connection, at the end of the shutdown
20
+ * (`GracefulShutdown.closeLast`: together with the pool), within what is left of the total stop
21
+ * budget. A ready main connection is closed with QUIT, so commands still in flight (a lock
22
+ * release, an after-commit publish) complete; it is dropped when QUIT does not finish in time or
23
+ * the connection is not ready.
24
+ */
25
+ let RedisLifecycle = class RedisLifecycle {
26
+ redis;
27
+ subscriber;
28
+ log;
29
+ shutdown;
30
+ constructor(redis, subscriber, log, shutdown) {
31
+ this.redis = redis;
32
+ this.subscriber = subscriber;
33
+ this.log = log;
34
+ this.shutdown = shutdown;
35
+ shutdown.closeLast(() => this.close());
36
+ }
37
+ async close() {
38
+ const { shutdown, log } = this;
39
+ await closeWithin("bus", this.subscriber.close(), shutdown.remainingMs(), log);
40
+ if (this.redis.status === "ready" &&
41
+ (await closeWithin("redis", this.redis.quit(), shutdown.remainingMs(), log))) {
42
+ return;
43
+ }
44
+ this.redis.disconnect();
45
+ }
46
+ };
47
+ RedisLifecycle = __decorate([
48
+ Injectable(),
49
+ __param(0, Inject(REDIS)),
50
+ __param(1, Inject(REDIS_SUBSCRIBER)),
51
+ __param(2, Inject(KERNEL_LOGGER)),
52
+ __param(3, Inject(GracefulShutdown))
53
+ ], RedisLifecycle);
54
+ export { RedisLifecycle };
55
+ /** Global: the main Redis connection, the bus subscriber connection and the kernel bus. */
56
+ let RedisModule = class RedisModule {
57
+ };
58
+ RedisModule = __decorate([
59
+ Global(),
60
+ Module({
61
+ imports: [GracefulShutdownModule],
62
+ providers: [
63
+ {
64
+ provide: REDIS,
65
+ inject: [KernelConfigService, KERNEL_LOGGER],
66
+ useFactory: (config, log) => {
67
+ const redis = new Redis(config.get().redis.url, { lazyConnect: true });
68
+ redis.on("error", (err) => log.error("redis connection error", { err }));
69
+ return redis;
70
+ },
71
+ },
72
+ {
73
+ provide: REDIS_SUBSCRIBER,
74
+ inject: [KernelConfigService, KERNEL_LOGGER],
75
+ useFactory: (config, log) => createBusSubscriber(() => new Redis(config.get().redis.url), log),
76
+ },
77
+ {
78
+ provide: KERNEL_BUS,
79
+ inject: [REDIS, REDIS_SUBSCRIBER, KERNEL_LOGGER],
80
+ useFactory: (redis, sub, log) => createBus(redis, sub, "kernel", log),
81
+ },
82
+ RedisLifecycle,
83
+ ],
84
+ exports: [REDIS, REDIS_SUBSCRIBER, KERNEL_BUS],
85
+ })
86
+ ], RedisModule);
87
+ export { RedisModule };
@@ -0,0 +1,12 @@
1
+ export interface CronTick {
2
+ /** The scheduled fire time (epoch ms) of the tick a call at `now` belongs to. */
3
+ tick: number;
4
+ /** The gap between that tick and the next scheduled one, ms. */
5
+ periodMs: number;
6
+ }
7
+ /**
8
+ * The scheduled tick a cron callback invoked at `now` belongs to: the latest scheduled time at or
9
+ * before `now` (plus a small early-fire tolerance). It comes from the expression, not from the
10
+ * clock, so replicas whose callbacks run a few ms apart agree on it.
11
+ */
12
+ export declare function scheduledTick(expression: string, now: number, timeZone?: string): CronTick;
@@ -0,0 +1,25 @@
1
+ import { CronTime } from "cron";
2
+ /** Timers may fire a little early; a call this close before a tick still belongs to it. */
3
+ const EARLY_TOLERANCE_MS = 50;
4
+ /**
5
+ * The scheduled tick a cron callback invoked at `now` belongs to: the latest scheduled time at or
6
+ * before `now` (plus a small early-fire tolerance). It comes from the expression, not from the
7
+ * clock, so replicas whose callbacks run a few ms apart agree on it.
8
+ */
9
+ export function scheduledTick(expression, now, timeZone) {
10
+ const time = new CronTime(expression, timeZone);
11
+ const ref = now + EARLY_TOLERANCE_MS;
12
+ let window = 1000;
13
+ for (;;) {
14
+ let t = time.getNextDateFrom(new Date(ref - window), timeZone).toMillis();
15
+ if (t <= ref) {
16
+ for (;;) {
17
+ const next = time.getNextDateFrom(new Date(t), timeZone).toMillis();
18
+ if (next > ref)
19
+ return { tick: t, periodMs: next - t };
20
+ t = next;
21
+ }
22
+ }
23
+ window *= 2;
24
+ }
25
+ }
@@ -0,0 +1,27 @@
1
+ import { type CronOptions } from "@nestjs/schedule";
2
+ export interface LockedCronOptions extends Pick<CronOptions, "timeZone"> {
3
+ /** Unique job name (the scheduler registry key and the log field). */
4
+ name: string;
5
+ /** Redis lock key (default `cron:<name>`); `lock:` is prepended unless present. */
6
+ lockKey?: string;
7
+ /** Lock lifetime without renewal, ms (default 30000); a longer run keeps it by renewal. */
8
+ ttl?: number;
9
+ }
10
+ /**
11
+ * `@Cron` with exactly-once-per-tick across replicas: every replica's scheduler fires, the one that
12
+ * sets the per-tick marker (`cron:<name>:<scheduled tick ms>`, never released) takes a try-once
13
+ * renewed run lock and runs the job; the others log INFO and skip, as does a tick whose
14
+ * predecessor is still running. An error in the job is logged (never thrown into the scheduler)
15
+ * and the lock is released afterwards. The job starts in a fresh async context (no transaction).
16
+ * The method gets a signal as its only argument: it aborts when the application stops
17
+ * (`ScheduledRuns`, which waits for the run, bounded) or when the run lock is lost. The class must inject `lockService`
18
+ * and `log`:
19
+ *
20
+ * ```ts
21
+ * constructor(
22
+ * @Inject(LockService) readonly lockService: LockService,
23
+ * @Inject(KERNEL_LOGGER) readonly log: KernelLogger,
24
+ * ) {}
25
+ * ```
26
+ */
27
+ export declare function LockedCron(expression: string, options: LockedCronOptions): (target: object, key: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor;
@@ -0,0 +1,53 @@
1
+ // Packages octok-platform's two-layer cron pattern (@Cron plus a try-once Redis lock in the job,
2
+ // e.g. libs/app/src/billing/service/subscription-reconcile.job.ts; owner-approved, 2026-10-28).
3
+ import { Cron } from "@nestjs/schedule";
4
+ import { scheduledTick } from "./cron-tick.js";
5
+ import { assertLockedJobHost, LOCKED_JOB, LOCKED_JOB_BODY, runLockedTick, } from "./locked-tick.js";
6
+ /**
7
+ * `@Cron` with exactly-once-per-tick across replicas: every replica's scheduler fires, the one that
8
+ * sets the per-tick marker (`cron:<name>:<scheduled tick ms>`, never released) takes a try-once
9
+ * renewed run lock and runs the job; the others log INFO and skip, as does a tick whose
10
+ * predecessor is still running. An error in the job is logged (never thrown into the scheduler)
11
+ * and the lock is released afterwards. The job starts in a fresh async context (no transaction).
12
+ * The method gets a signal as its only argument: it aborts when the application stops
13
+ * (`ScheduledRuns`, which waits for the run, bounded) or when the run lock is lost. The class must inject `lockService`
14
+ * and `log`:
15
+ *
16
+ * ```ts
17
+ * constructor(
18
+ * @Inject(LockService) readonly lockService: LockService,
19
+ * @Inject(KERNEL_LOGGER) readonly log: KernelLogger,
20
+ * ) {}
21
+ * ```
22
+ */
23
+ export function LockedCron(expression, options) {
24
+ return (target, key, descriptor) => {
25
+ const original = descriptor.value;
26
+ const lockKey = options.lockKey ?? `cron:${options.name}`;
27
+ // The scheduler's arguments (the cron library passes its onComplete) are not the job's
28
+ const wrapped = async function () {
29
+ // Not caught on purpose: a class without `lockService` / `log` is a programming error with
30
+ // no logger to report through; the call rejects (Nest's scheduler wrapper logs it, and the
31
+ // schedule tests rely on the rejection). Everything after it is caught below.
32
+ assertLockedJobHost(this, "cron");
33
+ // runLockedTick logs instead of throwing; this catch keeps the scheduler free of rejections
34
+ await runLockedTick(this, {
35
+ kind: "cron",
36
+ name: options.name,
37
+ lockKey,
38
+ ttl: options.ttl ?? 30_000,
39
+ tick: () => scheduledTick(expression, Date.now(), options.timeZone),
40
+ run: (signal) => Promise.resolve(original.call(this, signal)),
41
+ }).catch((err) => this.log?.error("cron job failed", { cron: options.name, err }));
42
+ };
43
+ Reflect.defineMetadata(LOCKED_JOB, true, wrapped);
44
+ Reflect.defineMetadata(LOCKED_JOB_BODY, { name: options.name, body: original }, wrapped);
45
+ descriptor.value = wrapped;
46
+ // The scheduler reads the metadata from the final method, so register after wrapping.
47
+ Cron(expression, {
48
+ name: options.name,
49
+ ...(options.timeZone !== undefined && { timeZone: options.timeZone }),
50
+ })(target, key, descriptor);
51
+ return descriptor;
52
+ };
53
+ }
@@ -0,0 +1,69 @@
1
+ import { type OnApplicationBootstrap, type OnModuleDestroy } from "@nestjs/common";
2
+ import { DiscoveryService, MetadataScanner } from "@nestjs/core";
3
+ import type { KernelConfig } from "../../config/schema.js";
4
+ import type { KernelLogger } from "../../log.js";
5
+ import { KernelConfigService } from "../config/kernel-config.service.js";
6
+ /** The period of a `@LockedInterval` job, read from the config (once, when it is scheduled). */
7
+ export type IntervalPeriod = (config: KernelConfig) => number;
8
+ export interface LockedIntervalOptions {
9
+ /** Redis lock key (default `cron:<name>`); `lock:` is prepended unless present. */
10
+ lockKey?: string;
11
+ /** Lock lifetime without renewal, ms (default 30000); a longer run keeps it by renewal. */
12
+ ttl?: number;
13
+ /**
14
+ * Also run once when the application has started (after the start sequence, without blocking
15
+ * it), once across replicas starting together (see `startMarkerTtl`), as a new repeatable
16
+ * scheduler's first run did.
17
+ */
18
+ runOnStart?: boolean;
19
+ }
20
+ /** The tick a call at `now` belongs to: the latest multiple of the period at or before it. */
21
+ export declare function intervalTick(periodMs: number, now: number): {
22
+ tick: number;
23
+ periodMs: number;
24
+ };
25
+ /**
26
+ * Like `@LockedCron`, for a job whose period comes from the config (a number of milliseconds that
27
+ * a cron expression cannot express, such as `extensionHost.reconcileIntervalSeconds`): every
28
+ * replica fires at the multiples of the period (epoch-aligned, so replicas agree on the tick), and
29
+ * the same two layers run the job exactly once per tick across replicas. The period is read when
30
+ * the application starts (like the old repeatable schedulers, not hot). The method gets
31
+ * the same signal as a `@LockedCron` job (the stop, or the loss of the run lock). The class must inject
32
+ * `lockService`, `log` and `config` (`KernelConfigService`); {@link LockedIntervalScheduler}
33
+ * schedules every decorated method of the application's providers.
34
+ */
35
+ export declare function LockedInterval(name: string, period: IntervalPeriod, options?: LockedIntervalOptions): (_target: object, _key: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor;
36
+ /**
37
+ * Schedules the `@LockedInterval` jobs of every provider at `onApplicationBootstrap` (each timer
38
+ * fires at the next multiple of the job's period, then re-arms) and stops them when the
39
+ * application stops (`ScheduledRuns` calls {@link stopAll} and waits for the runs in progress).
40
+ * One instance, in `KernelScheduleModule`.
41
+ */
42
+ export declare class LockedIntervalScheduler implements OnApplicationBootstrap, OnModuleDestroy {
43
+ private readonly discovery;
44
+ private readonly scanner;
45
+ private readonly config;
46
+ private readonly log;
47
+ private readonly timers;
48
+ private readonly periods;
49
+ private readonly startRuns;
50
+ private stopped;
51
+ constructor(discovery: DiscoveryService, scanner: MetadataScanner, config: KernelConfigService, log: KernelLogger);
52
+ onApplicationBootstrap(): void;
53
+ /** The scheduled job names. */
54
+ names(): string[];
55
+ /** A scheduled job's period in ms (read from the config at bootstrap), undefined when unknown. */
56
+ periodOf(name: string): number | undefined;
57
+ /**
58
+ * Starts the start runs of the `runOnStart` jobs in the background (each once across replicas
59
+ * starting together) and returns their promises. The kernel's worker role calls it right after it
60
+ * opened the start gate (`ScheduledRuns.open()`); later calls start nothing.
61
+ */
62
+ runStartJobs(): Promise<void>[];
63
+ /** Stops one job's timer (a run in progress finishes). */
64
+ stop(name: string): void;
65
+ /** Stops every timer and drops the start runs not started yet (idempotent). */
66
+ stopAll(): void;
67
+ onModuleDestroy(): void;
68
+ private arm;
69
+ }