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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) 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 +179 -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 +261 -329
  21. package/dist/agents/definition.d.ts +8 -0
  22. package/dist/agents/definition.js +8 -0
  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 +20 -4
  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 +323 -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/cli.d.ts +3 -2
  42. package/dist/catalog/cli.js +13 -31
  43. package/dist/catalog/job-ids.d.ts +15 -0
  44. package/dist/catalog/job-ids.js +15 -0
  45. package/dist/catalog/jobs.d.ts +27 -0
  46. package/dist/catalog/jobs.js +70 -0
  47. package/dist/catalog/locks.d.ts +24 -0
  48. package/dist/catalog/locks.js +63 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  50. package/dist/catalog/marketplaces.controller.js +22 -11
  51. package/dist/catalog/marketplaces.service.d.ts +30 -13
  52. package/dist/catalog/marketplaces.service.js +330 -256
  53. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  54. package/dist/catalog/org-catalog.controller.js +29 -14
  55. package/dist/catalog/org-catalog.service.d.ts +32 -198
  56. package/dist/catalog/org-catalog.service.js +159 -400
  57. package/dist/catalog/plugin-import.d.ts +73 -34
  58. package/dist/catalog/plugin-import.js +356 -217
  59. package/dist/catalog/plugin-install.d.ts +83 -41
  60. package/dist/catalog/plugin-install.js +421 -269
  61. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  62. package/dist/catalog/plugin-upgrade.js +407 -282
  63. package/dist/catalog/requests.service.d.ts +27 -15
  64. package/dist/catalog/requests.service.js +201 -145
  65. package/dist/catalog/upgrade-targets.d.ts +4 -7
  66. package/dist/channels/actions.d.ts +6 -4
  67. package/dist/channels/actions.js +1 -1
  68. package/dist/channels/cards.d.ts +2 -2
  69. package/dist/channels/channels.module.d.ts +40 -0
  70. package/dist/channels/channels.module.js +128 -0
  71. package/dist/channels/connections.controller.d.ts +1 -1
  72. package/dist/channels/connections.controller.js +11 -6
  73. package/dist/channels/connections.service.d.ts +43 -21
  74. package/dist/channels/connections.service.js +236 -131
  75. package/dist/channels/inbound.d.ts +34 -38
  76. package/dist/channels/inbound.js +107 -41
  77. package/dist/channels/job-ids.d.ts +10 -0
  78. package/dist/channels/job-ids.js +10 -0
  79. package/dist/channels/jobs.d.ts +85 -0
  80. package/dist/channels/jobs.js +157 -0
  81. package/dist/channels/outbound.d.ts +60 -82
  82. package/dist/channels/outbound.js +165 -194
  83. package/dist/channels/supervisor.d.ts +88 -46
  84. package/dist/channels/supervisor.js +230 -132
  85. package/dist/channels/threads.d.ts +29 -8
  86. package/dist/channels/threads.js +71 -13
  87. package/dist/channels/webhook.d.ts +20 -14
  88. package/dist/channels/webhook.js +51 -20
  89. package/dist/config/load.d.ts +3 -2
  90. package/dist/config/load.js +3 -2
  91. package/dist/config/nacos-source.js +11 -2
  92. package/dist/config/schema.d.ts +1 -0
  93. package/dist/config/schema.js +10 -4
  94. package/dist/conversations/access.d.ts +29 -0
  95. package/dist/conversations/access.js +86 -0
  96. package/dist/conversations/artifacts.d.ts +10 -10
  97. package/dist/conversations/artifacts.js +35 -9
  98. package/dist/conversations/attachments.controller.d.ts +1 -1
  99. package/dist/conversations/attachments.controller.js +8 -6
  100. package/dist/conversations/attachments.module.d.ts +7 -0
  101. package/dist/conversations/attachments.module.js +25 -0
  102. package/dist/conversations/attachments.service.d.ts +30 -22
  103. package/dist/conversations/attachments.service.js +119 -46
  104. package/dist/conversations/conversations.controller.d.ts +8 -7
  105. package/dist/conversations/conversations.controller.js +59 -29
  106. package/dist/conversations/conversations.module.d.ts +8 -0
  107. package/dist/conversations/conversations.module.js +69 -0
  108. package/dist/conversations/conversations.service.d.ts +40 -38
  109. package/dist/conversations/conversations.service.js +130 -140
  110. package/dist/conversations/event-log.d.ts +28 -18
  111. package/dist/conversations/event-log.js +74 -27
  112. package/dist/conversations/files.d.ts +10 -10
  113. package/dist/conversations/files.js +37 -11
  114. package/dist/conversations/idem-keys.d.ts +5 -0
  115. package/dist/conversations/idem-keys.js +5 -0
  116. package/dist/conversations/job-ids.d.ts +6 -0
  117. package/dist/conversations/job-ids.js +6 -0
  118. package/dist/conversations/outputs-read.d.ts +11 -11
  119. package/dist/conversations/outputs-read.js +31 -7
  120. package/dist/conversations/queue.d.ts +48 -56
  121. package/dist/conversations/queue.js +13 -289
  122. package/dist/conversations/queue.service.d.ts +60 -0
  123. package/dist/conversations/queue.service.js +343 -0
  124. package/dist/conversations/sandbox-status.d.ts +13 -10
  125. package/dist/conversations/sandbox-status.js +36 -8
  126. package/dist/conversations/titles.d.ts +71 -24
  127. package/dist/conversations/titles.js +159 -63
  128. package/dist/ctx/bus.js +9 -3
  129. package/dist/ctx/create-ctx.d.ts +6 -0
  130. package/dist/ctx/create-ctx.js +7 -9
  131. package/dist/ctx/lock.d.ts +7 -3
  132. package/dist/ctx/lock.js +9 -20
  133. package/dist/ctx/secrets.d.ts +10 -2
  134. package/dist/ctx/secrets.js +7 -3
  135. package/dist/db/kernel-schema.d.ts +2 -2
  136. package/dist/db/pool.d.ts +5 -0
  137. package/dist/db/pool.js +1 -0
  138. package/dist/errors.d.ts +1 -0
  139. package/dist/errors.js +1 -0
  140. package/dist/evals/budget.d.ts +42 -21
  141. package/dist/evals/budget.js +114 -62
  142. package/dist/evals/evals.module.d.ts +31 -0
  143. package/dist/evals/evals.module.js +114 -0
  144. package/dist/evals/jobs.d.ts +20 -0
  145. package/dist/evals/jobs.js +45 -0
  146. package/dist/evals/run-replay.d.ts +56 -8
  147. package/dist/evals/run-replay.js +140 -80
  148. package/dist/evals/runs.controller.d.ts +1 -1
  149. package/dist/evals/runs.controller.js +17 -8
  150. package/dist/evals/runs.service.d.ts +23 -45
  151. package/dist/evals/runs.service.js +245 -234
  152. package/dist/evals/sets.controller.d.ts +1 -1
  153. package/dist/evals/sets.controller.js +17 -8
  154. package/dist/evals/sets.service.d.ts +22 -6
  155. package/dist/evals/sets.service.js +248 -194
  156. package/dist/evals/snapshot.d.ts +2 -2
  157. package/dist/evals/step-replay.d.ts +2 -2
  158. package/dist/evals/step-replay.js +1 -1
  159. package/dist/evals/trajectory.controller.d.ts +1 -1
  160. package/dist/evals/trajectory.controller.js +11 -7
  161. package/dist/evals/trajectory.service.d.ts +5 -4
  162. package/dist/evals/trajectory.service.js +30 -7
  163. package/dist/evals/worker.d.ts +44 -27
  164. package/dist/evals/worker.js +220 -121
  165. package/dist/extensions/admin-ops.d.ts +61 -33
  166. package/dist/extensions/admin-ops.js +248 -154
  167. package/dist/extensions/admin-view.d.ts +38 -27
  168. package/dist/extensions/admin-view.js +126 -55
  169. package/dist/extensions/approvals.d.ts +12 -8
  170. package/dist/extensions/approvals.js +73 -46
  171. package/dist/extensions/blobs.d.ts +27 -10
  172. package/dist/extensions/blobs.js +111 -45
  173. package/dist/extensions/bootstrap.d.ts +58 -31
  174. package/dist/extensions/bootstrap.js +175 -121
  175. package/dist/extensions/cli.d.ts +20 -10
  176. package/dist/extensions/cli.js +41 -96
  177. package/dist/extensions/config-issues.d.ts +7 -0
  178. package/dist/extensions/config-issues.js +31 -0
  179. package/dist/extensions/deployment-config-store.d.ts +49 -0
  180. package/dist/extensions/deployment-config-store.js +133 -0
  181. package/dist/extensions/deployment-config.d.ts +58 -67
  182. package/dist/extensions/deployment-config.js +202 -230
  183. package/dist/extensions/enabled.d.ts +5 -5
  184. package/dist/extensions/extensions.module.d.ts +8 -0
  185. package/dist/extensions/extensions.module.js +77 -0
  186. package/dist/extensions/hooks.d.ts +3 -2
  187. package/dist/extensions/hooks.js +1 -1
  188. package/dist/extensions/host.d.ts +72 -68
  189. package/dist/extensions/host.js +191 -152
  190. package/dist/extensions/installs.d.ts +49 -16
  191. package/dist/extensions/installs.js +128 -32
  192. package/dist/extensions/job-ids.d.ts +6 -0
  193. package/dist/extensions/job-ids.js +6 -0
  194. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  195. package/dist/extensions/lifecycle-topics.js +18 -0
  196. package/dist/extensions/lifecycle.d.ts +35 -47
  197. package/dist/extensions/lifecycle.js +103 -39
  198. package/dist/extensions/locks.d.ts +33 -0
  199. package/dist/extensions/locks.js +86 -0
  200. package/dist/extensions/migrate-lock.d.ts +3 -4
  201. package/dist/extensions/org-config.controller.d.ts +1 -1
  202. package/dist/extensions/org-config.controller.js +8 -5
  203. package/dist/extensions/org-config.d.ts +48 -46
  204. package/dist/extensions/org-config.js +284 -226
  205. package/dist/extensions/registry.d.ts +50 -2
  206. package/dist/extensions/registry.js +89 -4
  207. package/dist/extensions/sources.d.ts +12 -8
  208. package/dist/extensions/sources.js +34 -13
  209. package/dist/files/files.module.d.ts +3 -0
  210. package/dist/files/files.module.js +22 -0
  211. package/dist/files/previewers.controller.d.ts +7 -2
  212. package/dist/files/previewers.controller.js +17 -9
  213. package/dist/files/previewers.d.ts +13 -18
  214. package/dist/files/previewers.js +83 -36
  215. package/dist/http/adapter.d.ts +3 -0
  216. package/dist/http/adapter.js +25 -0
  217. package/dist/http/api.module.d.ts +3 -110
  218. package/dist/http/api.module.js +47 -355
  219. package/dist/http/app.d.ts +11 -15
  220. package/dist/http/app.js +17 -62
  221. package/dist/http/error-filter.module.d.ts +5 -0
  222. package/dist/http/error-filter.module.js +18 -0
  223. package/dist/http/error.filter.js +2 -2
  224. package/dist/identity/accounts.d.ts +82 -29
  225. package/dist/identity/accounts.js +294 -175
  226. package/dist/identity/api-tokens.d.ts +11 -7
  227. package/dist/identity/api-tokens.js +71 -44
  228. package/dist/identity/audit.d.ts +7 -4
  229. package/dist/identity/audit.js +5 -1
  230. package/dist/identity/auth.controller.d.ts +11 -10
  231. package/dist/identity/auth.controller.js +31 -25
  232. package/dist/identity/auth.guard.d.ts +3 -3
  233. package/dist/identity/auth.guard.js +6 -4
  234. package/dist/identity/binding.d.ts +9 -11
  235. package/dist/identity/binding.js +41 -13
  236. package/dist/identity/enterprise-admin.d.ts +18 -12
  237. package/dist/identity/enterprise-admin.js +67 -13
  238. package/dist/identity/external-identity-lock.d.ts +17 -0
  239. package/dist/identity/external-identity-lock.js +39 -0
  240. package/dist/identity/external.d.ts +19 -15
  241. package/dist/identity/external.js +163 -125
  242. package/dist/identity/identity.module.d.ts +6 -0
  243. package/dist/identity/identity.module.js +56 -0
  244. package/dist/identity/me.controller.d.ts +16 -15
  245. package/dist/identity/me.controller.js +37 -31
  246. package/dist/identity/sessions.d.ts +12 -10
  247. package/dist/identity/sessions.js +74 -42
  248. package/dist/identity/settings.d.ts +20 -14
  249. package/dist/identity/settings.js +85 -57
  250. package/dist/identity/sso.controller.d.ts +7 -7
  251. package/dist/identity/sso.controller.js +13 -9
  252. package/dist/identity/sso.d.ts +9 -12
  253. package/dist/identity/sso.js +54 -24
  254. package/dist/inbox/inbox.module.d.ts +3 -0
  255. package/dist/inbox/inbox.module.js +22 -0
  256. package/dist/inbox/inbox.service.d.ts +7 -9
  257. package/dist/inbox/inbox.service.js +32 -11
  258. package/dist/index.d.ts +16 -11
  259. package/dist/index.js +9 -6
  260. package/dist/infra/cache/cache.module.d.ts +3 -0
  261. package/dist/infra/cache/cache.module.js +16 -0
  262. package/dist/infra/cache/cache.service.d.ts +21 -0
  263. package/dist/infra/cache/cache.service.js +80 -0
  264. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  265. package/dist/infra/cache/cacheable.decorator.js +83 -0
  266. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  267. package/dist/infra/cli/kernel-cli.module.js +165 -0
  268. package/dist/infra/close-within.d.ts +15 -0
  269. package/dist/infra/close-within.js +36 -0
  270. package/dist/infra/config/config.module.d.ts +13 -0
  271. package/dist/infra/config/config.module.js +39 -0
  272. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  273. package/dist/infra/config/kernel-config.service.js +126 -0
  274. package/dist/infra/database/after-commit.d.ts +6 -0
  275. package/dist/infra/database/after-commit.js +9 -0
  276. package/dist/infra/database/database.module.d.ts +25 -0
  277. package/dist/infra/database/database.module.js +90 -0
  278. package/dist/infra/database/kernel-db.d.ts +22 -0
  279. package/dist/infra/database/kernel-db.js +65 -0
  280. package/dist/infra/database/transaction-host.d.ts +50 -0
  281. package/dist/infra/database/transaction-host.js +125 -0
  282. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  283. package/dist/infra/database/transactional.decorator.js +27 -0
  284. package/dist/infra/database/xact-lock.d.ts +17 -0
  285. package/dist/infra/database/xact-lock.js +43 -0
  286. package/dist/infra/events/kernel-events.d.ts +96 -0
  287. package/dist/infra/events/kernel-events.js +65 -0
  288. package/dist/infra/health/health.controller.d.ts +26 -0
  289. package/dist/infra/health/health.controller.js +104 -0
  290. package/dist/infra/health/health.module.d.ts +9 -0
  291. package/dist/infra/health/health.module.js +24 -0
  292. package/dist/infra/health/health.options.d.ts +10 -0
  293. package/dist/infra/health/health.options.js +15 -0
  294. package/dist/infra/health/shutdown-state.d.ts +6 -0
  295. package/dist/infra/health/shutdown-state.js +2 -0
  296. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  297. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  300. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  301. package/dist/infra/lifecycle/process-guards.js +86 -0
  302. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  303. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  304. package/dist/infra/lock/key-template.d.ts +13 -0
  305. package/dist/infra/lock/key-template.js +46 -0
  306. package/dist/infra/lock/lock.module.d.ts +3 -0
  307. package/dist/infra/lock/lock.module.js +16 -0
  308. package/dist/infra/lock/lock.service.d.ts +120 -0
  309. package/dist/infra/lock/lock.service.js +343 -0
  310. package/dist/infra/lock/shared-lease.d.ts +44 -0
  311. package/dist/infra/lock/shared-lease.js +121 -0
  312. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  313. package/dist/infra/lock/with-lock.decorator.js +49 -0
  314. package/dist/infra/logging/logging.module.d.ts +16 -0
  315. package/dist/infra/logging/logging.module.js +34 -0
  316. package/dist/infra/queue/configured-processor.d.ts +18 -0
  317. package/dist/infra/queue/configured-processor.js +23 -0
  318. package/dist/infra/queue/job-failure.d.ts +18 -0
  319. package/dist/infra/queue/job-failure.js +26 -0
  320. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  321. package/dist/infra/queue/queue-shutdown.js +81 -0
  322. package/dist/infra/queue/queue.module.d.ts +16 -0
  323. package/dist/infra/queue/queue.module.js +61 -0
  324. package/dist/infra/queue/redis-connection.d.ts +7 -0
  325. package/dist/infra/queue/redis-connection.js +18 -0
  326. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  327. package/dist/infra/queue/retired-schedulers.js +9 -0
  328. package/dist/infra/queue/run-job.d.ts +16 -0
  329. package/dist/infra/queue/run-job.js +19 -0
  330. package/dist/infra/redis/redis.module.d.ts +24 -0
  331. package/dist/infra/redis/redis.module.js +87 -0
  332. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  333. package/dist/infra/schedule/cron-tick.js +25 -0
  334. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  335. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  336. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  337. package/dist/infra/schedule/locked-interval.js +190 -0
  338. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  339. package/dist/infra/schedule/locked-tick.js +137 -0
  340. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  341. package/dist/infra/schedule/schedule.module.js +27 -0
  342. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  343. package/dist/infra/schedule/scheduled-runs.js +163 -0
  344. package/dist/infra/swagger/swagger.d.ts +16 -0
  345. package/dist/infra/swagger/swagger.js +31 -0
  346. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  347. package/dist/infra/throttler/credential-throttler.js +77 -0
  348. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  349. package/dist/infra/throttler/named-throttlers.js +119 -0
  350. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  351. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  352. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  353. package/dist/infra/throttler/throttler.guard.js +68 -0
  354. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  355. package/dist/infra/throttler/throttler.module.js +53 -0
  356. package/dist/infra/tokens.d.ts +15 -0
  357. package/dist/infra/tokens.js +15 -0
  358. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  359. package/dist/infra/validation/create-zod-dto.js +35 -0
  360. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  361. package/dist/infra/validation/parse-with-zod.js +12 -0
  362. package/dist/infra/validation/validation.module.d.ts +3 -0
  363. package/dist/infra/validation/validation.module.js +16 -0
  364. package/dist/infra/validation/zod-params.d.ts +7 -0
  365. package/dist/infra/validation/zod-params.js +42 -0
  366. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  367. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  368. package/dist/kernel.d.ts +9 -244
  369. package/dist/kernel.js +8 -1305
  370. package/dist/kernel.module.d.ts +17 -0
  371. package/dist/kernel.module.js +136 -0
  372. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  373. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  374. package/dist/lifecycle/tokens.d.ts +3 -0
  375. package/dist/lifecycle/tokens.js +3 -0
  376. package/dist/log-context.d.ts +2 -0
  377. package/dist/log-context.js +4 -0
  378. package/dist/models/models.module.d.ts +3 -0
  379. package/dist/models/models.module.js +24 -0
  380. package/dist/models/prices.d.ts +8 -2
  381. package/dist/models/prices.js +65 -37
  382. package/dist/models/purposes.controller.d.ts +1 -1
  383. package/dist/models/purposes.controller.js +5 -6
  384. package/dist/models/purposes.d.ts +35 -13
  385. package/dist/models/purposes.js +101 -51
  386. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  387. package/dist/orgs/directory-sync.controller.js +2 -2
  388. package/dist/orgs/directory-sync.d.ts +61 -31
  389. package/dist/orgs/directory-sync.js +212 -125
  390. package/dist/orgs/invitations.controller.d.ts +8 -8
  391. package/dist/orgs/invitations.controller.js +27 -26
  392. package/dist/orgs/invitations.service.d.ts +12 -9
  393. package/dist/orgs/invitations.service.js +130 -92
  394. package/dist/orgs/job-ids.d.ts +8 -0
  395. package/dist/orgs/job-ids.js +8 -0
  396. package/dist/orgs/members.service.d.ts +19 -12
  397. package/dist/orgs/members.service.js +161 -117
  398. package/dist/orgs/offboarding.d.ts +54 -57
  399. package/dist/orgs/offboarding.js +161 -71
  400. package/dist/orgs/org-lock.d.ts +28 -19
  401. package/dist/orgs/org-lock.js +81 -35
  402. package/dist/orgs/org.guard.d.ts +1 -1
  403. package/dist/orgs/org.guard.js +2 -2
  404. package/dist/orgs/orgs.controller.d.ts +13 -13
  405. package/dist/orgs/orgs.controller.js +29 -17
  406. package/dist/orgs/orgs.module.d.ts +6 -0
  407. package/dist/orgs/orgs.module.js +68 -0
  408. package/dist/orgs/orgs.service.d.ts +30 -19
  409. package/dist/orgs/orgs.service.js +139 -86
  410. package/dist/orgs/settings.controller.d.ts +1 -1
  411. package/dist/orgs/settings.controller.js +8 -6
  412. package/dist/orgs/settings.service.d.ts +14 -8
  413. package/dist/orgs/settings.service.js +75 -46
  414. package/dist/overrides.d.ts +56 -0
  415. package/dist/overrides.js +30 -0
  416. package/dist/roles/gateway-role.d.ts +43 -0
  417. package/dist/roles/gateway-role.js +98 -0
  418. package/dist/roles/gateway.module.d.ts +8 -0
  419. package/dist/roles/gateway.module.js +28 -0
  420. package/dist/roles/worker-role.d.ts +63 -0
  421. package/dist/roles/worker-role.js +144 -0
  422. package/dist/roles/worker.module.d.ts +14 -0
  423. package/dist/roles/worker.module.js +90 -0
  424. package/dist/runtime/abort.js +19 -2
  425. package/dist/runtime/checkpointer.d.ts +8 -3
  426. package/dist/runtime/checkpointer.js +87 -55
  427. package/dist/runtime/conversation-lock.d.ts +20 -11
  428. package/dist/runtime/conversation-lock.js +62 -72
  429. package/dist/runtime/hook-calls.d.ts +3 -3
  430. package/dist/runtime/hook-calls.js +1 -6
  431. package/dist/runtime/job-ids.d.ts +10 -0
  432. package/dist/runtime/job-ids.js +10 -0
  433. package/dist/runtime/langgraph-loop.js +1 -1
  434. package/dist/runtime/loop.d.ts +7 -0
  435. package/dist/runtime/loop.js +14 -0
  436. package/dist/runtime/maintenance-queue.d.ts +10 -0
  437. package/dist/runtime/maintenance-queue.js +10 -0
  438. package/dist/runtime/maintenance.d.ts +45 -74
  439. package/dist/runtime/maintenance.js +139 -137
  440. package/dist/runtime/model-call.d.ts +7 -4
  441. package/dist/runtime/model-call.js +24 -57
  442. package/dist/runtime/providers.d.ts +17 -6
  443. package/dist/runtime/providers.js +66 -25
  444. package/dist/runtime/quota.d.ts +17 -3
  445. package/dist/runtime/quota.js +27 -2
  446. package/dist/runtime/retired-schedulers.d.ts +7 -0
  447. package/dist/runtime/retired-schedulers.js +31 -0
  448. package/dist/runtime/run-control.d.ts +33 -0
  449. package/dist/runtime/run-control.js +77 -0
  450. package/dist/runtime/run-finish.d.ts +26 -17
  451. package/dist/runtime/run-finish.js +98 -51
  452. package/dist/runtime/run-jobs.d.ts +48 -0
  453. package/dist/runtime/run-jobs.js +95 -0
  454. package/dist/runtime/run-processors.d.ts +60 -0
  455. package/dist/runtime/run-processors.js +185 -0
  456. package/dist/runtime/run-queue.d.ts +32 -57
  457. package/dist/runtime/run-queue.js +291 -295
  458. package/dist/runtime/run-steps.d.ts +39 -0
  459. package/dist/runtime/run-steps.js +96 -0
  460. package/dist/runtime/run-worker.d.ts +121 -75
  461. package/dist/runtime/run-worker.js +340 -226
  462. package/dist/runtime/runtime.module.d.ts +10 -0
  463. package/dist/runtime/runtime.module.js +112 -0
  464. package/dist/runtime/step-log.d.ts +40 -0
  465. package/dist/runtime/step-log.js +94 -0
  466. package/dist/runtime/stream.controller.d.ts +5 -8
  467. package/dist/runtime/stream.controller.js +14 -12
  468. package/dist/runtime/stream.d.ts +24 -6
  469. package/dist/runtime/stream.js +78 -7
  470. package/dist/runtime/subagents/child.d.ts +3 -44
  471. package/dist/runtime/subagents/child.js +0 -79
  472. package/dist/runtime/subagents/definition.d.ts +4 -4
  473. package/dist/runtime/subagents/definition.js +2 -2
  474. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  475. package/dist/runtime/subagents/dispatch.js +135 -140
  476. package/dist/runtime/subagents/limits.d.ts +9 -4
  477. package/dist/runtime/subagents/limits.js +4 -2
  478. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  479. package/dist/runtime/subagents/org-agents.js +1 -1
  480. package/dist/runtime/subagents/progress.d.ts +2 -2
  481. package/dist/runtime/subagents/roster.d.ts +3 -3
  482. package/dist/runtime/subagents/roster.js +1 -1
  483. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  484. package/dist/runtime/subagents/skill-fork.js +16 -5
  485. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  486. package/dist/runtime/subagents/subagents.service.js +101 -0
  487. package/dist/runtime/usage-report.d.ts +94 -52
  488. package/dist/runtime/usage-report.js +200 -100
  489. package/dist/runtime/waits.d.ts +125 -57
  490. package/dist/runtime/waits.js +431 -208
  491. package/dist/sandbox/job-ids.d.ts +10 -0
  492. package/dist/sandbox/job-ids.js +10 -0
  493. package/dist/sandbox/jobs.d.ts +41 -0
  494. package/dist/sandbox/jobs.js +113 -0
  495. package/dist/sandbox/leases.d.ts +39 -31
  496. package/dist/sandbox/leases.js +117 -257
  497. package/dist/sandbox/providers.d.ts +19 -0
  498. package/dist/sandbox/providers.js +38 -0
  499. package/dist/sandbox/sandbox.module.d.ts +8 -0
  500. package/dist/sandbox/sandbox.module.js +30 -0
  501. package/dist/sandbox/sandbox.service.d.ts +24 -29
  502. package/dist/sandbox/sandbox.service.js +106 -75
  503. package/dist/skills/catalog.d.ts +33 -20
  504. package/dist/skills/catalog.js +96 -53
  505. package/dist/skills/changes.controller.d.ts +4 -4
  506. package/dist/skills/changes.controller.js +15 -9
  507. package/dist/skills/changes.service.d.ts +28 -18
  508. package/dist/skills/changes.service.js +421 -364
  509. package/dist/skills/invocable.controller.d.ts +1 -1
  510. package/dist/skills/invocable.controller.js +8 -5
  511. package/dist/skills/invoke.d.ts +16 -15
  512. package/dist/skills/invoke.js +48 -17
  513. package/dist/skills/skills.controller.d.ts +1 -1
  514. package/dist/skills/skills.controller.js +11 -6
  515. package/dist/skills/skills.module.d.ts +6 -0
  516. package/dist/skills/skills.module.js +30 -0
  517. package/dist/skills/skills.service.d.ts +47 -30
  518. package/dist/skills/skills.service.js +221 -158
  519. package/dist/storage/job-ids.d.ts +6 -0
  520. package/dist/storage/job-ids.js +6 -0
  521. package/dist/storage/purge.d.ts +22 -7
  522. package/dist/storage/purge.js +55 -3
  523. package/dist/storage/storage.module.d.ts +6 -0
  524. package/dist/storage/storage.module.js +23 -0
  525. package/dist/storage/storage.service.d.ts +18 -4
  526. package/dist/storage/storage.service.js +44 -3
  527. package/dist/tools/approvals.controller.d.ts +1 -1
  528. package/dist/tools/approvals.controller.js +12 -8
  529. package/dist/tools/approvals.service.d.ts +27 -25
  530. package/dist/tools/approvals.service.js +324 -258
  531. package/dist/tools/breaker.d.ts +2 -2
  532. package/dist/tools/breaker.js +21 -3
  533. package/dist/tools/builtins/ask-user.d.ts +2 -2
  534. package/dist/tools/builtins/ask-user.js +1 -1
  535. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  536. package/dist/tools/builtins/builtin-tools.js +80 -0
  537. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  538. package/dist/tools/builtins/read-tool-output.js +1 -1
  539. package/dist/tools/builtins/sandbox/bash.js +2 -2
  540. package/dist/tools/builtins/sandbox/common.d.ts +2 -1
  541. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  542. package/dist/tools/builtins/sandbox/edit.js +1 -1
  543. package/dist/tools/builtins/sandbox/glob.js +2 -2
  544. package/dist/tools/builtins/sandbox/grep.js +2 -2
  545. package/dist/tools/builtins/sandbox/read.js +1 -1
  546. package/dist/tools/builtins/sandbox/write.js +1 -1
  547. package/dist/tools/builtins/skill-load.d.ts +3 -3
  548. package/dist/tools/builtins/skill-load.js +1 -1
  549. package/dist/tools/canonical-json.d.ts +6 -0
  550. package/dist/tools/canonical-json.js +16 -0
  551. package/dist/tools/connector-content.controller.d.ts +1 -1
  552. package/dist/tools/connector-content.controller.js +11 -6
  553. package/dist/tools/connector-content.d.ts +12 -15
  554. package/dist/tools/connector-content.js +53 -18
  555. package/dist/tools/connectors.controller.d.ts +1 -1
  556. package/dist/tools/connectors.controller.js +21 -10
  557. package/dist/tools/connectors.service.d.ts +31 -13
  558. package/dist/tools/connectors.service.js +434 -344
  559. package/dist/tools/credentials.d.ts +17 -20
  560. package/dist/tools/credentials.js +55 -34
  561. package/dist/tools/drift.d.ts +29 -41
  562. package/dist/tools/drift.js +111 -79
  563. package/dist/tools/info.d.ts +12 -9
  564. package/dist/tools/info.js +33 -7
  565. package/dist/tools/job-ids.d.ts +13 -0
  566. package/dist/tools/job-ids.js +15 -0
  567. package/dist/tools/jobs.d.ts +24 -0
  568. package/dist/tools/jobs.js +69 -0
  569. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  570. package/dist/tools/oauth/flow-paths.js +38 -0
  571. package/dist/tools/oauth/flow.d.ts +30 -30
  572. package/dist/tools/oauth/flow.js +109 -81
  573. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  574. package/dist/tools/oauth/oauth.controller.js +12 -9
  575. package/dist/tools/oauth/tokens.d.ts +11 -3
  576. package/dist/tools/oauth/tokens.js +15 -14
  577. package/dist/tools/outputs.d.ts +13 -4
  578. package/dist/tools/outputs.js +47 -3
  579. package/dist/tools/pipeline.d.ts +62 -46
  580. package/dist/tools/pipeline.js +145 -64
  581. package/dist/tools/policy.d.ts +2 -2
  582. package/dist/tools/questions.controller.d.ts +1 -1
  583. package/dist/tools/questions.controller.js +8 -5
  584. package/dist/tools/questions.service.d.ts +25 -24
  585. package/dist/tools/questions.service.js +201 -142
  586. package/dist/tools/registry.d.ts +30 -20
  587. package/dist/tools/registry.js +73 -37
  588. package/dist/tools/specs.d.ts +5 -4
  589. package/dist/tools/specs.js +3 -1
  590. package/dist/tools/tools.module.d.ts +10 -0
  591. package/dist/tools/tools.module.js +91 -0
  592. package/dist/ui/call-extension.d.ts +16 -0
  593. package/dist/ui/call-extension.js +38 -0
  594. package/dist/ui/embed-token.d.ts +9 -5
  595. package/dist/ui/embed-token.js +34 -6
  596. package/dist/ui/ui-stream.d.ts +22 -17
  597. package/dist/ui/ui-stream.js +72 -12
  598. package/dist/ui/ui.module.d.ts +7 -0
  599. package/dist/ui/ui.module.js +28 -0
  600. package/dist/ui/views.controller.d.ts +14 -12
  601. package/dist/ui/views.controller.js +32 -25
  602. package/dist/ui/views.d.ts +9 -57
  603. package/dist/ui/views.js +43 -45
  604. package/package.json +9 -2
  605. package/dist/http/health.controller.d.ts +0 -26
  606. package/dist/http/health.controller.js +0 -79
  607. package/dist/http/tokens.d.ts +0 -131
  608. package/dist/http/tokens.js +0 -131
  609. package/dist/http/zod.pipe.d.ts +0 -8
  610. package/dist/http/zod.pipe.js +0 -14
  611. package/dist/identity/rate-limit.d.ts +0 -55
  612. package/dist/identity/rate-limit.js +0 -121
  613. package/dist/sandbox/lifecycle.d.ts +0 -21
  614. package/dist/sandbox/lifecycle.js +0 -68
  615. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  616. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -0,0 +1,135 @@
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
+ // Ported from octok-platform libs/service-rpc/src/shutdown/graceful-shutdown.service.ts (owner-approved, 2026-10-28).
11
+ import { Inject, Injectable, } from "@nestjs/common";
12
+ import { waitWithin } from "../close-within.js";
13
+ import { KERNEL_LOGGER } from "../tokens.js";
14
+ /**
15
+ * The total stop budget: from the moment the shutdown begins, the stop phases and the infra closes
16
+ * (bus, Redis, pool) share these 30 s; whatever is still open after it is abandoned.
17
+ */
18
+ export const STOP_TIMEOUT_MS = 30_000;
19
+ /**
20
+ * The process's shutdown state, the one source of "are we stopping" (nest kernel spec §4).
21
+ *
22
+ * {@link begin} (idempotent, synchronous) flips readiness to 503 ({@link isShuttingDown}, read by
23
+ * `/readyz`), aborts {@link signal} (the start sequence stops at its next checkpoint, an extension
24
+ * migration of the start is aborted, the SSE stream registries close and refuse new streams) and
25
+ * starts the {@link STOP_TIMEOUT_MS} deadline that every later stop step takes its share of
26
+ * ({@link remainingMs}).
27
+ *
28
+ * {@link trackInFlight} registers work the stop must let finish before it closes what that work
29
+ * uses; {@link drain} waits for the set to empty, re-reading it each round (work registered by
30
+ * tracked work while draining is waited for too), up to a budget, and reports a timeout instead of
31
+ * hanging. The kernel's stop phases (`KernelLifecycle`) call `begin()` first and drain at their
32
+ * start-work step; components with their own close (the run workers, the extension host, Fastify)
33
+ * keep draining themselves within their phase budgets.
34
+ *
35
+ * `beforeApplicationShutdown` runs `begin()` and a final drain bounded by the remaining budget, so
36
+ * a Nest application without `KernelLifecycle` (or whose stop phases already drained) behaves the
37
+ * same: the readiness flip happens while the port is still open, before `dispose()` closes it.
38
+ *
39
+ * {@link closeLast} registers the close of an infra connection (the bus and Redis, the pool);
40
+ * `onApplicationShutdown` runs them all at once. This is a global module's hook, so it runs after
41
+ * every other module's stop hooks: nothing uses those connections once they start closing, and a
42
+ * close that hangs (Redis down) does not hold back the others, which share what is left of the
43
+ * same budget.
44
+ */
45
+ let GracefulShutdown = class GracefulShutdown {
46
+ log;
47
+ shuttingDown = false;
48
+ deadline;
49
+ abort = new AbortController();
50
+ inFlight = new Set();
51
+ lastCloses = [];
52
+ constructor(log) {
53
+ this.log = log;
54
+ }
55
+ /** True from the moment the shutdown began; readiness answers 503 from then on. */
56
+ isShuttingDown() {
57
+ return this.shuttingDown;
58
+ }
59
+ /** Aborted when the shutdown begins. */
60
+ get signal() {
61
+ return this.abort.signal;
62
+ }
63
+ /** Begins the shutdown (idempotent): readiness 503, {@link signal} aborted, the deadline set. */
64
+ begin() {
65
+ if (this.shuttingDown)
66
+ return;
67
+ this.shuttingDown = true;
68
+ this.deadline = Date.now() + STOP_TIMEOUT_MS;
69
+ this.abort.abort();
70
+ }
71
+ /** What is left of the total stop budget (the whole budget before the shutdown began). */
72
+ remainingMs() {
73
+ return this.deadline === undefined ? STOP_TIMEOUT_MS : Math.max(0, this.deadline - Date.now());
74
+ }
75
+ /** Registers work the stop waits for (see {@link drain}); returns `p`. */
76
+ trackInFlight(p) {
77
+ this.inFlight.add(p);
78
+ const forget = () => {
79
+ this.inFlight.delete(p);
80
+ };
81
+ p.then(forget, forget);
82
+ return p;
83
+ }
84
+ /** The number of tracked promises not settled yet. */
85
+ get inFlightCount() {
86
+ return this.inFlight.size;
87
+ }
88
+ /**
89
+ * Waits until no tracked work is left, at most `budgetMs` (capped by {@link remainingMs} once the
90
+ * shutdown began). Resolves true when everything settled, false on timeout: what is left is
91
+ * logged and abandoned (no later drain waits for it again). Rejections of tracked work are not
92
+ * this wait's business: they only count as settled.
93
+ */
94
+ async drain(budgetMs) {
95
+ if (this.inFlight.size === 0)
96
+ return true;
97
+ const waitMs = Math.max(0, Math.min(budgetMs, this.remainingMs()));
98
+ const end = Date.now() + waitMs;
99
+ while (this.inFlight.size > 0) {
100
+ const left = Math.max(0, end - Date.now());
101
+ if (!(await waitWithin(Promise.allSettled([...this.inFlight]), left)))
102
+ break;
103
+ }
104
+ if (this.inFlight.size > 0) {
105
+ this.log.warn("shutdown: in-flight work did not finish in time; abandoned", {
106
+ inFlight: this.inFlight.size,
107
+ budgetMs: waitMs,
108
+ });
109
+ // Abandoned: a later drain (the final one of beforeApplicationShutdown) does not wait again
110
+ this.inFlight.clear();
111
+ return false;
112
+ }
113
+ return true;
114
+ }
115
+ async beforeApplicationShutdown() {
116
+ this.begin();
117
+ await this.drain(this.remainingMs());
118
+ }
119
+ /**
120
+ * Registers the close of an infra connection, run at the very end of the shutdown together with
121
+ * the others (see the class comment). `close` bounds itself by {@link remainingMs} and never
122
+ * throws.
123
+ */
124
+ closeLast(close) {
125
+ this.lastCloses.push(close);
126
+ }
127
+ async onApplicationShutdown() {
128
+ await Promise.all(this.lastCloses.splice(0).map((close) => close()));
129
+ }
130
+ };
131
+ GracefulShutdown = __decorate([
132
+ Injectable(),
133
+ __param(0, Inject(KERNEL_LOGGER))
134
+ ], GracefulShutdown);
135
+ export { GracefulShutdown };
@@ -0,0 +1,52 @@
1
+ import type { KernelLogger } from "../../log.js";
2
+ /**
3
+ * Process-level guards for `capybara start`: an unhandled rejection or an uncaught exception is
4
+ * logged and the process keeps running, unless they come in bursts.
5
+ *
6
+ * Node's default for an async failure nobody handles is to kill the process. That default assumes
7
+ * the program state is corrupt, which holds for errors thrown by business logic, but the ones seen
8
+ * in practice come from peripheral I/O (a telemetry export, an event emitter's `error` nobody
9
+ * listens to, an SDK of an extension). With several replicas the same peripheral failure takes
10
+ * every replica down at once. Both mechanisms are guarded: `unhandledRejection` alone does not
11
+ * catch an `error` event thrown synchronously by an EventEmitter (`uncaughtException`).
12
+ *
13
+ * Swallowing is not unconditional: peripheral noise is sporadic, real corruption repeats. More than
14
+ * {@link GUARD_CIRCUIT_LIMIT} fatal events within {@link GUARD_CIRCUIT_WINDOW_MS} open the circuit:
15
+ * the process exits with 1 and the orchestrator (Kubernetes, docker restart) starts a clean one.
16
+ *
17
+ * What this cannot save: a V8 heap exhaustion is a hard abort no listener sees; and a resource that
18
+ * first fails through an uncaught event and afterwards only through caught errors (500s) keeps the
19
+ * process alive but broken, which used to self-heal through a crash and a restart. Known trade-off.
20
+ *
21
+ * Every line of the recorder is wrapped: a handler that throws while the process handles a fatal
22
+ * event would defeat the guard. Records go through the kernel logger (pino, redacted) with
23
+ * `marker: "process-guard"`; only `kind: "circuit-open"` is worth alerting on.
24
+ *
25
+ * Installed only by `capybara start` (apps/capybara), never by `createKernelApp` / tests / library
26
+ * code paths: a library must not take over process-wide handlers.
27
+ */
28
+ /** The fatal events allowed within the window; one more opens the circuit (exit 1). */
29
+ export declare const GUARD_CIRCUIT_LIMIT = 5;
30
+ /** The circuit's observation window (ms). */
31
+ export declare const GUARD_CIRCUIT_WINDOW_MS = 60000;
32
+ /** The fixed marker on every guard record. */
33
+ export declare const GUARD_LOG_MARKER = "process-guard";
34
+ /** The guarded events (Node's two mechanisms) and the circuit opening. */
35
+ export type GuardKind = "unhandledRejection" | "uncaughtException" | "circuit-open";
36
+ export interface ProcessGuardDeps {
37
+ /** The logger to write to, read on every event (`capybara start` switches to the configured one). */
38
+ log: () => Pick<KernelLogger, "error">;
39
+ /** Ends the process when the circuit opens. */
40
+ exit: (code: number) => void;
41
+ /** The current time in ms; default `Date.now`. */
42
+ now?: () => number;
43
+ /** Where the events come from; default `process`. */
44
+ process?: Pick<NodeJS.EventEmitter, "on" | "off">;
45
+ }
46
+ /**
47
+ * A recorder for fatal events: logs one record and exits once more than
48
+ * {@link GUARD_CIRCUIT_LIMIT} events fell within {@link GUARD_CIRCUIT_WINDOW_MS}. Never throws.
49
+ */
50
+ export declare function createFatalRecorder(deps: Omit<ProcessGuardDeps, "process">): (kind: Exclude<GuardKind, "circuit-open">, err: unknown) => void;
51
+ /** Installs both guards; returns a function that removes them. */
52
+ export declare function installProcessGuards(deps: ProcessGuardDeps): () => void;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Process-level guards for `capybara start`: an unhandled rejection or an uncaught exception is
3
+ * logged and the process keeps running, unless they come in bursts.
4
+ *
5
+ * Node's default for an async failure nobody handles is to kill the process. That default assumes
6
+ * the program state is corrupt, which holds for errors thrown by business logic, but the ones seen
7
+ * in practice come from peripheral I/O (a telemetry export, an event emitter's `error` nobody
8
+ * listens to, an SDK of an extension). With several replicas the same peripheral failure takes
9
+ * every replica down at once. Both mechanisms are guarded: `unhandledRejection` alone does not
10
+ * catch an `error` event thrown synchronously by an EventEmitter (`uncaughtException`).
11
+ *
12
+ * Swallowing is not unconditional: peripheral noise is sporadic, real corruption repeats. More than
13
+ * {@link GUARD_CIRCUIT_LIMIT} fatal events within {@link GUARD_CIRCUIT_WINDOW_MS} open the circuit:
14
+ * the process exits with 1 and the orchestrator (Kubernetes, docker restart) starts a clean one.
15
+ *
16
+ * What this cannot save: a V8 heap exhaustion is a hard abort no listener sees; and a resource that
17
+ * first fails through an uncaught event and afterwards only through caught errors (500s) keeps the
18
+ * process alive but broken, which used to self-heal through a crash and a restart. Known trade-off.
19
+ *
20
+ * Every line of the recorder is wrapped: a handler that throws while the process handles a fatal
21
+ * event would defeat the guard. Records go through the kernel logger (pino, redacted) with
22
+ * `marker: "process-guard"`; only `kind: "circuit-open"` is worth alerting on.
23
+ *
24
+ * Installed only by `capybara start` (apps/capybara), never by `createKernelApp` / tests / library
25
+ * code paths: a library must not take over process-wide handlers.
26
+ */
27
+ /** The fatal events allowed within the window; one more opens the circuit (exit 1). */
28
+ export const GUARD_CIRCUIT_LIMIT = 5;
29
+ /** The circuit's observation window (ms). */
30
+ export const GUARD_CIRCUIT_WINDOW_MS = 60_000;
31
+ /** The fixed marker on every guard record. */
32
+ export const GUARD_LOG_MARKER = "process-guard";
33
+ /**
34
+ * A recorder for fatal events: logs one record and exits once more than
35
+ * {@link GUARD_CIRCUIT_LIMIT} events fell within {@link GUARD_CIRCUIT_WINDOW_MS}. Never throws.
36
+ */
37
+ export function createFatalRecorder(deps) {
38
+ const now = deps.now ?? Date.now;
39
+ let recent = [];
40
+ let open = false;
41
+ return (kind, err) => {
42
+ try {
43
+ const t = now();
44
+ recent = recent.filter((x) => t - x < GUARD_CIRCUIT_WINDOW_MS);
45
+ recent.push(t);
46
+ safely(() => deps
47
+ .log()
48
+ .error(kind === "unhandledRejection" ? "unhandled promise rejection" : "uncaught exception", { marker: GUARD_LOG_MARKER, kind, err }));
49
+ if (recent.length > GUARD_CIRCUIT_LIMIT && !open) {
50
+ open = true;
51
+ safely(() => deps.log().error("too many fatal events; exiting so the process is restarted clean", {
52
+ marker: GUARD_LOG_MARKER,
53
+ kind: "circuit-open",
54
+ events: recent.length,
55
+ windowMs: GUARD_CIRCUIT_WINDOW_MS,
56
+ }));
57
+ deps.exit(1);
58
+ }
59
+ }
60
+ catch {
61
+ // Recording must never take the process down: that is what this module prevents
62
+ }
63
+ };
64
+ }
65
+ /** Runs fn, swallowing what it throws (a logger failing must not skip the circuit). */
66
+ function safely(fn) {
67
+ try {
68
+ fn();
69
+ }
70
+ catch {
71
+ // ignored
72
+ }
73
+ }
74
+ /** Installs both guards; returns a function that removes them. */
75
+ export function installProcessGuards(deps) {
76
+ const target = deps.process ?? process;
77
+ const record = createFatalRecorder(deps);
78
+ const onRejection = (reason) => record("unhandledRejection", reason);
79
+ const onException = (err) => record("uncaughtException", err);
80
+ target.on("unhandledRejection", onRejection);
81
+ target.on("uncaughtException", onException);
82
+ return () => {
83
+ target.off("unhandledRejection", onRejection);
84
+ target.off("uncaughtException", onException);
85
+ };
86
+ }
@@ -0,0 +1,30 @@
1
+ import type { KernelLogger } from "../../log.js";
2
+ /** The signals that shut the kernel down. */
3
+ export declare const SHUTDOWN_SIGNALS: ["SIGTERM", "SIGINT"];
4
+ /** Where the signals come from and how the process ends (tests pass their own). */
5
+ export interface ShutdownSignalOptions {
6
+ /** Default `process`. */
7
+ signals?: Pick<NodeJS.EventEmitter, "on" | "off">;
8
+ /**
9
+ * Ends the process: 0 after a completed shutdown, 1 after a failed one or on a second signal.
10
+ * Default `process.exit`.
11
+ */
12
+ exit?: (code: number) => void;
13
+ }
14
+ export interface ShutdownSignalHandle {
15
+ /** The shutdown a signal started, settled once `exit` was called; undefined before any signal. */
16
+ exiting(): Promise<void> | undefined;
17
+ /** Removes the listeners. */
18
+ dispose(): void;
19
+ }
20
+ /**
21
+ * Installs SIGTERM / SIGINT handlers around a running (or starting) kernel application, in place
22
+ * of Nest's `enableShutdownHooks()`. The first signal runs `close` (`closeKernelApp`: the shutdown
23
+ * begins at once, so a start in progress stops at its next checkpoint, then the stop phases and
24
+ * the infra closes, all within the 30 s stop budget) and exits with 0, or 1 when it failed, after
25
+ * flushing the logs. A second signal while that runs exits with 1 at once, so an operator's second
26
+ * Ctrl-C (or an orchestrator's repeated SIGTERM) never waits on a stuck shutdown. Nest's handlers
27
+ * would begin the shutdown only after every module's `onModuleDestroy`, ignore a second signal,
28
+ * flush nothing and end the process by re-raising the signal.
29
+ */
30
+ export declare function handleShutdownSignals(close: () => Promise<void>, log: KernelLogger, opts?: ShutdownSignalOptions): ShutdownSignalHandle;
@@ -0,0 +1,48 @@
1
+ /** The signals that shut the kernel down. */
2
+ export const SHUTDOWN_SIGNALS = ["SIGTERM", "SIGINT"];
3
+ /**
4
+ * Installs SIGTERM / SIGINT handlers around a running (or starting) kernel application, in place
5
+ * of Nest's `enableShutdownHooks()`. The first signal runs `close` (`closeKernelApp`: the shutdown
6
+ * begins at once, so a start in progress stops at its next checkpoint, then the stop phases and
7
+ * the infra closes, all within the 30 s stop budget) and exits with 0, or 1 when it failed, after
8
+ * flushing the logs. A second signal while that runs exits with 1 at once, so an operator's second
9
+ * Ctrl-C (or an orchestrator's repeated SIGTERM) never waits on a stuck shutdown. Nest's handlers
10
+ * would begin the shutdown only after every module's `onModuleDestroy`, ignore a second signal,
11
+ * flush nothing and end the process by re-raising the signal.
12
+ */
13
+ export function handleShutdownSignals(close, log, opts = {}) {
14
+ const signals = opts.signals ?? process;
15
+ const exit = opts.exit ?? ((code) => process.exit(code));
16
+ let exiting;
17
+ // Set by a second signal: the forced exit(1) stays the process's code
18
+ let forced = false;
19
+ const dispose = () => {
20
+ for (const s of SHUTDOWN_SIGNALS)
21
+ signals.off(s, onSignal);
22
+ };
23
+ function onSignal(signal) {
24
+ if (exiting) {
25
+ log.warn("second signal received; exiting immediately", { signal });
26
+ dispose();
27
+ forced = true;
28
+ exit(1);
29
+ return;
30
+ }
31
+ log.info("signal received; shutting down", { signal });
32
+ const end = (code) => log
33
+ .flush()
34
+ .catch(() => { })
35
+ .then(() => {
36
+ dispose();
37
+ if (!forced)
38
+ exit(code);
39
+ });
40
+ exiting = close().then(() => end(0), (err) => {
41
+ log.error("shutdown failed", { err });
42
+ return end(1);
43
+ });
44
+ }
45
+ for (const s of SHUTDOWN_SIGNALS)
46
+ signals.on(s, onSignal);
47
+ return { exiting: () => exiting, dispose };
48
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Expands the placeholders of a key template from the method arguments:
3
+ * - `#{0}`: the argument at that index, as a string;
4
+ * - `#{1.book.title}`: a property path of the argument at that index;
5
+ * - `#{user.id}`: the same as `#{0.user.id}` (the index 0 may be omitted).
6
+ *
7
+ * With `opts.result` (cache eviction), `#{result}` and `#{result.id}` read the method's return value.
8
+ *
9
+ * A placeholder that cannot be resolved is left as written.
10
+ */
11
+ export declare function generateKey(pattern: string, args: readonly unknown[], opts?: {
12
+ result: unknown;
13
+ }): string;
@@ -0,0 +1,46 @@
1
+ // Ported from octok-platform libs/common/src/utils/common.utils.ts#generateKey (owner-approved, 2026-10-28).
2
+ /** Reads a dotted path (`a.b.c`) from a value; undefined when any step is missing. */
3
+ function get(value, path) {
4
+ let cur = value;
5
+ for (const part of path.split(".")) {
6
+ if (cur === null || cur === undefined)
7
+ return undefined;
8
+ cur = cur[part];
9
+ }
10
+ return cur;
11
+ }
12
+ const show = (v) => v !== undefined && v !== null ? String(v) : undefined;
13
+ /**
14
+ * Expands the placeholders of a key template from the method arguments:
15
+ * - `#{0}`: the argument at that index, as a string;
16
+ * - `#{1.book.title}`: a property path of the argument at that index;
17
+ * - `#{user.id}`: the same as `#{0.user.id}` (the index 0 may be omitted).
18
+ *
19
+ * With `opts.result` (cache eviction), `#{result}` and `#{result.id}` read the method's return value.
20
+ *
21
+ * A placeholder that cannot be resolved is left as written.
22
+ */
23
+ export function generateKey(pattern, args, opts) {
24
+ if (opts) {
25
+ pattern = pattern.replace(/#\{result(?:\.([^}]+))?\}/g, (match, path) => (path === undefined ? show(opts.result) : show(get(opts.result, path))) ?? match);
26
+ }
27
+ // `#{<index>.<path>}`
28
+ let key = pattern.replace(/#\{(\d+)\.([^}]+)\}/g, (match, indexStr, path) => {
29
+ const index = Number.parseInt(indexStr, 10);
30
+ if (index >= args.length)
31
+ return match;
32
+ return show(get(args[index], path)) ?? match;
33
+ });
34
+ // `#{<path>}` reads from the first argument
35
+ key = key.replace(/#\{([^}]+)\}/g, (match, content) => {
36
+ if (/^\d+$/.test(content) || args.length === 0)
37
+ return match;
38
+ return show(get(args[0], content)) ?? match;
39
+ });
40
+ // `#{<index>}`
41
+ key = key.replace(/#\{(\d+)\}/g, (match, indexStr) => {
42
+ const index = Number.parseInt(indexStr, 10);
43
+ return index < args.length ? String(args[index]) : match;
44
+ });
45
+ return key;
46
+ }
@@ -0,0 +1,3 @@
1
+ /** Global: `LockService` (and the `@WithLock` decorator, which reads it from `this.lockService`). */
2
+ export declare class LockModule {
3
+ }
@@ -0,0 +1,16 @@
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
+ import { Global, Module } from "@nestjs/common";
8
+ import { LockService } from "./lock.service.js";
9
+ /** Global: `LockService` (and the `@WithLock` decorator, which reads it from `this.lockService`). */
10
+ let LockModule = class LockModule {
11
+ };
12
+ LockModule = __decorate([
13
+ Global(),
14
+ Module({ providers: [LockService], exports: [LockService] })
15
+ ], LockModule);
16
+ export { LockModule };
@@ -0,0 +1,120 @@
1
+ import type { Redis } from "ioredis";
2
+ import { ApiError } from "../../errors.js";
3
+ import type { KernelLogger } from "../../log.js";
4
+ import { type SharedLeaseKeys, type SharedLeaseKind } from "./shared-lease.js";
5
+ export interface AcquireOptions {
6
+ /** Lock lifetime without renewal; a crashed holder's lock expires within it. */
7
+ ttlMs: number;
8
+ /** How long to keep trying; 0 (default) tries once, `Infinity` waits until it is taken. */
9
+ waitMs?: number;
10
+ /** Pause between attempts while waiting (default 100). */
11
+ retryMs?: number;
12
+ /** Ends the wait: the call throws the signal's reason (checked before the first attempt too). */
13
+ signal?: AbortSignal;
14
+ }
15
+ export interface LockHandle {
16
+ /** Stops renewing and deletes the key if it is still ours. Idempotent. */
17
+ release(): Promise<void>;
18
+ /**
19
+ * Aborts when the lock was lost: the key is gone or taken, or no renewal succeeded by the
20
+ * deadline (send time of the last successful renewal + TTL − TTL/3).
21
+ */
22
+ readonly lost: AbortSignal;
23
+ }
24
+ /**
25
+ * A renewed lease ({@link LockService.hold}): a {@link LockHandle} whose holder value is the
26
+ * caller's (other replicas read it), with an explicit renewal and an abandon for a holder that
27
+ * hands the key over to its TTL.
28
+ */
29
+ export interface LeaseHandle extends LockHandle {
30
+ /** Renews now; false (and `lost` aborts) when the key is no longer ours. */
31
+ renew(): Promise<boolean>;
32
+ /** Stops renewing without deleting: the key expires within its TTL. `release` still deletes it while ours. */
33
+ abandon(): void;
34
+ }
35
+ /**
36
+ * A held lease of a shared lease ({@link LockService.tryShared} / {@link LockService.tryExclusive}):
37
+ * renewed every TTL/3 like {@link LockService.hold} (lost at the same deadline), released in its
38
+ * current kind.
39
+ */
40
+ export interface SharedLeaseHandle extends LeaseHandle {
41
+ readonly token: string;
42
+ /** `exclusive` until a successful {@link downgrade}, then `shared`. */
43
+ readonly kind: SharedLeaseKind;
44
+ /**
45
+ * exclusive → shared in one step (same token, same `lost`; the deadline moves like a renewal).
46
+ * False (and `lost` aborts) when the exclusive lease was no longer ours. Throws when the lease is
47
+ * not exclusive (any more) or was released.
48
+ */
49
+ downgrade(): Promise<boolean>;
50
+ }
51
+ export declare const prefixed: (key: string) => string;
52
+ /**
53
+ * Redis distributed locks: `SET NX PX` with a Lua compare-and-delete release and a watchdog that
54
+ * renews every TTL/3 (short lock plus renewal: a long job keeps it, a crashed holder's lock
55
+ * expires within the TTL). Also the primitives for leases whose holder is a caller-chosen string
56
+ * (`lease` / `renew` / `releaseIf`, used by the sandbox leases).
57
+ */
58
+ export declare class LockService {
59
+ private readonly redis;
60
+ private readonly log;
61
+ constructor(redis: Redis, log: KernelLogger);
62
+ /**
63
+ * Tries to take `lock:<key>`; resolves `undefined` when it stays held by someone else until
64
+ * `waitMs` ran out. An aborted `signal` throws its reason instead.
65
+ */
66
+ acquire(key: string, opts: AcquireOptions): Promise<LockHandle | undefined>;
67
+ /** Runs `fn` under the lock; throws `lock.acquire_failed` when it cannot be taken. */
68
+ run<T>(key: string, opts: AcquireOptions, fn: (handle: LockHandle) => Promise<T>): Promise<T>;
69
+ /** Sets `key` to `holder` for `ttlMs` unless it exists (no `lock:` prefix, no renewal timer). */
70
+ lease(key: string, holder: string, ttlMs: number): Promise<boolean>;
71
+ /** Extends `key` to `ttlMs` when `holder` still owns it. */
72
+ renew(key: string, holder: string, ttlMs: number): Promise<boolean>;
73
+ /** The holder value of `key` (a lease's or a lock's token); null when nobody holds it. */
74
+ holderOf(key: string): Promise<string | null>;
75
+ /** Deletes `key` when `holder` still owns it. */
76
+ releaseIf(key: string, holder: string): Promise<boolean>;
77
+ /**
78
+ * Takes `key` (no `lock:` prefix) with the caller's `holder` value for `ttlMs`, unless it is
79
+ * held, and renews it every TTL/3 like {@link acquire} (a run longer than the TTL keeps it, a
80
+ * crashed holder's key expires within the TTL). Resolves `undefined` when the key is held; tries
81
+ * once. For leases whose holder other replicas read (the conversation run lock: the run id).
82
+ */
83
+ hold(key: string, holder: string, ttlMs: number): Promise<LeaseHandle | undefined>;
84
+ /**
85
+ * One try at a shared lease of `keys` for `token` (at most `cap` shared holders; not granted
86
+ * while an exclusive holder, another `SET NX` value of the lock key or another token's intent
87
+ * exists). Resolves `undefined` when not granted; a granted lease is renewed every TTL/3.
88
+ */
89
+ tryShared(keys: SharedLeaseKeys, token: string, cap: number, ttlMs: number): Promise<SharedLeaseHandle | undefined>;
90
+ /**
91
+ * One try at the exclusive lease of `keys` for `token` (granted only when no lease of either
92
+ * kind exists). With `intentTtlMs` a failed try sets (or refreshes) the intent to `token` unless
93
+ * another token's intent exists, so new shared leases wait; a successful try clears our intent.
94
+ */
95
+ tryExclusive(keys: SharedLeaseKeys, token: string, ttlMs: number, intentTtlMs?: number): Promise<SharedLeaseHandle | undefined>;
96
+ /** Live shared leases of `keys` (expired ones are purged first). */
97
+ sharedCount(keys: Pick<SharedLeaseKeys, "lock" | "users">): Promise<number>;
98
+ /** The watchdog of a shared lease we just took; its kind changes once, on a downgrade. */
99
+ private watchShared;
100
+ /** The renewal watchdog of a key we just took (the `SET NX` was sent at `sentAt`). */
101
+ private watch;
102
+ /**
103
+ * The renewal watchdog for a lease kept by other means than a `SET NX` key (e.g. an org quota
104
+ * slot, a member of a Redis sorted set): calls `ops.renew` every TTL/3 while held. A renewal
105
+ * answered `false` marks it lost at once (`lost` aborts, one WARN `lock lost` with `label`).
106
+ * Loss is a deadline (decision R19 of the Nest kernel spec), not a counter. The deadline is the
107
+ * send time of the last successful renewal (or of the acquire, `acquiredAt`, default now) + TTL −
108
+ * TTL/3; any successful renewal through the handle (the watchdog's or an explicit `renew()`)
109
+ * moves it; when it passes without one, `lost` aborts, even with a renewal still in flight. So a
110
+ * holder gives up one renewal period before the key can expire elsewhere. `release` stops
111
+ * renewing and calls `ops.release` once.
112
+ */
113
+ keepAlive(label: string, ttlMs: number, ops: {
114
+ renew(): Promise<boolean>;
115
+ release(): Promise<void>;
116
+ }, acquiredAt?: number): LeaseHandle;
117
+ /** {@link keepAlive}'s implementation, with {@link Watched.renewWith}. */
118
+ private watchdog;
119
+ }
120
+ export declare function lockAcquireFailed(lockKey: string): ApiError;