@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
@@ -1,5 +1,18 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
1
10
  import { createHash, randomUUID } from "node:crypto";
11
+ import { Inject, Injectable, Optional } from "@nestjs/common";
2
12
  import { ApiError } from "../errors.js";
13
+ import { LockService, } from "../infra/lock/lock.service.js";
14
+ import { redisClockScript, sharedLeaseReadScript, } from "../infra/lock/shared-lease.js";
15
+ import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
3
16
  /**
4
17
  * Shared and exclusive sandbox leases (sub-agents spec §10.3): the Redis protocol that lets several
5
18
  * holders use one conversation's running sandbox concurrently (shared leases: commands, file reads
@@ -18,9 +31,11 @@ import { ApiError } from "../errors.js";
18
31
  * - `capk:sandbox-path:<conv>:<sha256hex(path)>`: a short per-path lease around the kernel's own
19
32
  * read-modify-write of one file.
20
33
  *
21
- * Every script purges expired shared leases first, and every key carries a TTL. A holder renews
22
- * every TTL / 3 (a timer for a lease this process holds) and treats "no successful renewal for
23
- * 2/3 TTL" as lost: its `signal` aborts with {@link SandboxLockLostError}.
34
+ * The first three keys are a {@link LockService} shared lease (`tryShared` / `tryExclusive`,
35
+ * infra/lock/shared-lease.ts); the holder records and the path leases are this file's. Every key
36
+ * carries a TTL. A holder renews every TTL / 3 (LockService's watchdog) and loses the lease at
37
+ * the renewal deadline (send time of the last successful renewal + 2/3 TTL): its `signal` aborts
38
+ * with {@link SandboxLockLostError}.
24
39
  */
25
40
  /** Prefix of the lock key `capk:sandbox:<conversationId>`. */
26
41
  export const SANDBOX_LOCK_PREFIX = "capk:sandbox:";
@@ -68,104 +83,18 @@ export class SandboxPathBusyError extends Error {
68
83
  this.name = "SandboxPathBusyError";
69
84
  }
70
85
  }
71
- const NOW = `local t = redis.call('TIME'); local now = tonumber(t[1]) * 1000 + math.floor(tonumber(t[2]) / 1000)`;
72
- /** Drops expired shared leases; drops a `shared` lock value no live shared lease backs. */
73
- const PURGE = `
74
- redis.call('ZREMRANGEBYSCORE', KEYS[2], '-inf', now)
75
- local cur = redis.call('GET', KEYS[1])
76
- if cur == 'shared' and redis.call('ZCARD', KEYS[2]) == 0 then
77
- redis.call('DEL', KEYS[1])
78
- cur = false
79
- end`;
80
- /**
81
- * Keeps the users set and the `shared` lock value alive for at least `ttl` without shortening a
82
- * longer TTL another holder set (holders may use different TTLs).
83
- */
84
- const KEEP_SHARED = `
85
- if redis.call('PTTL', KEYS[2]) < ttl then redis.call('PEXPIRE', KEYS[2], ttl) end
86
- local lt = redis.call('PTTL', KEYS[1])
87
- if redis.call('GET', KEYS[1]) ~= 'shared' or lt < ttl then
88
- redis.call('SET', KEYS[1], 'shared', 'PX', math.max(ttl, lt))
89
- end`;
90
- /** KEYS lock, users, intent; ARGV token, cap, ttl. */
91
- const ACQUIRE_SHARED = `${NOW}
92
- ${PURGE}
93
- if cur and cur ~= 'shared' then return 0 end
94
- local it = redis.call('GET', KEYS[3])
95
- if it and it ~= ARGV[1] then return 0 end
96
- if redis.call('ZCARD', KEYS[2]) >= tonumber(ARGV[2]) then return 0 end
97
- local ttl = tonumber(ARGV[3])
98
- redis.call('ZADD', KEYS[2], now + ttl, ARGV[1])
99
- ${KEEP_SHARED}
100
- return 1`;
101
- /** KEYS lock, users, intent; ARGV token, ttl, setIntent (0/1), intentTtl. */
102
- const ACQUIRE_EXCLUSIVE = `${NOW}
103
- ${PURGE}
104
- if cur or redis.call('ZCARD', KEYS[2]) > 0 then
105
- if ARGV[3] == '1' then
106
- local it = redis.call('GET', KEYS[3])
107
- if (not it) or it == ARGV[1] then
108
- redis.call('SET', KEYS[3], ARGV[1], 'PX', tonumber(ARGV[4]))
109
- end
110
- end
111
- return 0
112
- end
113
- redis.call('SET', KEYS[1], ARGV[1], 'PX', tonumber(ARGV[2]))
114
- if redis.call('GET', KEYS[3]) == ARGV[1] then redis.call('DEL', KEYS[3]) end
115
- return 1`;
116
- /** KEYS lock, users; ARGV token, ttl, kind. Shared: lost when the member is gone or the lock holds a token. */
117
- const RENEW = `${NOW}
118
- local ttl = tonumber(ARGV[2])
119
- if ARGV[3] == 'exclusive' then
120
- if redis.call('GET', KEYS[1]) == ARGV[1] then
121
- redis.call('PEXPIRE', KEYS[1], ttl)
122
- return 1
123
- end
124
- return 0
125
- end
126
- redis.call('ZREMRANGEBYSCORE', KEYS[2], '-inf', now)
127
- if not redis.call('ZSCORE', KEYS[2], ARGV[1]) then return 0 end
128
- local cur = redis.call('GET', KEYS[1])
129
- if cur and cur ~= 'shared' then
130
- redis.call('ZREM', KEYS[2], ARGV[1])
131
- return 0
132
- end
133
- redis.call('ZADD', KEYS[2], 'XX', now + ttl, ARGV[1])
134
- ${KEEP_SHARED}
135
- return 1`;
136
- /** KEYS lock, users; ARGV token, kind. */
137
- const RELEASE = `${NOW}
138
- if ARGV[2] == 'exclusive' then
139
- if redis.call('GET', KEYS[1]) == ARGV[1] then redis.call('DEL', KEYS[1]) end
140
- return 1
141
- end
142
- redis.call('ZREM', KEYS[2], ARGV[1])
143
- ${PURGE}
144
- return 1`;
145
- /** KEYS lock, users; ARGV token, ttl. */
146
- const DOWNGRADE = `${NOW}
147
- if redis.call('GET', KEYS[1]) ~= ARGV[1] then return 0 end
148
- local ttl = tonumber(ARGV[2])
149
- redis.call('ZADD', KEYS[2], now + ttl, ARGV[1])
150
- ${KEEP_SHARED}
151
- return 1`;
152
- /** KEYS lock, users; returns the live shared count. */
153
- const COUNT = `${NOW}
154
- ${PURGE}
155
- return redis.call('ZCARD', KEYS[2])`;
156
86
  /**
157
87
  * KEYS holders, busy; ARGV token, ttl. Also writes the busy marker as v2 (kept for at least `ttl`)
158
88
  * unless an older kernel's holder owns it.
159
89
  */
160
- const REGISTER = `${NOW}
161
- local ttl = tonumber(ARGV[2])
90
+ const REGISTER = redisClockScript(`local ttl = tonumber(ARGV[2])
162
91
  redis.call('HSET', KEYS[1], ARGV[1], now + ttl)
163
92
  if redis.call('PTTL', KEYS[1]) < ttl then redis.call('PEXPIRE', KEYS[1], ttl) end
164
93
  local b = redis.call('GET', KEYS[2])
165
94
  if (not b) or (b == '${BUSY_V2}' and redis.call('PTTL', KEYS[2]) < ttl) then
166
95
  redis.call('SET', KEYS[2], '${BUSY_V2}', 'PX', ttl)
167
96
  end
168
- return 1`;
97
+ return 1`);
169
98
  /** Deletes the v2 busy marker (key `busy`) once no holder record (hash `holders`) is left. */
170
99
  const dropV2 = (holders, busy) => `
171
100
  if redis.call('HLEN', ${holders}) == 0 and redis.call('GET', ${busy}) == '${BUSY_V2}' then
@@ -184,9 +113,7 @@ return 1`;
184
113
  * everything cannot hit a live sibling). The v2 marker is never claimed; it goes with the last
185
114
  * record. Returns { legacy, tag… }.
186
115
  */
187
- const CLAIM = `${NOW}
188
- ${PURGE}
189
- local out = {0}
116
+ const CLAIM = sharedLeaseReadScript(`local out = {0}
190
117
  local f = redis.call('HGETALL', KEYS[3])
191
118
  for i = 1, #f, 2 do
192
119
  local tok = f[i]
@@ -203,10 +130,7 @@ if ARGV[1] ~= '' and cur == ARGV[1] and b and b ~= '${BUSY_V2}' then
203
130
  redis.call('DEL', KEYS[4])
204
131
  out[1] = 1
205
132
  end
206
- return out`;
207
- /** Compare-and-delete / compare-and-expire of a single-valued key. */
208
- const DEL_IF = `if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) end return 0`;
209
- const EXPIRE_IF = `if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('PEXPIRE', KEYS[1], ARGV[2]) end return 0`;
133
+ return out`);
210
134
  const abortReason = (signal) => signal.reason ?? new DOMException("This operation was aborted", "AbortError");
211
135
  function sleep(ms, signal) {
212
136
  return new Promise((resolve, reject) => {
@@ -225,19 +149,41 @@ function sleep(ms, signal) {
225
149
  signal.addEventListener("abort", onAbort, { once: true });
226
150
  });
227
151
  }
228
- /** The lease protocol; no state in process beyond the leases this process holds. */
229
- export class SandboxLeases {
152
+ /** A signal that aborts with {@link SandboxLockLostError} when `lost` aborts. */
153
+ function lostSignal(lost, conv) {
154
+ const ctl = new AbortController();
155
+ const abort = () => ctl.abort(new SandboxLockLostError(conv));
156
+ if (lost.aborted)
157
+ abort();
158
+ else
159
+ lost.addEventListener("abort", abort, { once: true });
160
+ return ctl.signal;
161
+ }
162
+ /** Optional provider: {@link SandboxLeaseTimings} that replace some defaults (tests make them shorter). */
163
+ export const SANDBOX_LEASE_TIMINGS = Symbol("SANDBOX_LEASE_TIMINGS");
164
+ /**
165
+ * The lease protocol over {@link LockService}'s shared leases; no state in process beyond the
166
+ * leases this process holds.
167
+ */
168
+ let SandboxLeases = class SandboxLeases {
169
+ locks;
230
170
  redis;
231
171
  log;
172
+ /** Lease TTL (ms). */
232
173
  ttlMs;
174
+ /** Poll interval while waiting (ms, jittered up to 2×). */
233
175
  pollMs;
176
+ /** Path lease TTL (ms). */
234
177
  pathTtlMs;
235
- constructor(d) {
236
- this.redis = d.redis;
237
- this.log = d.log;
238
- this.ttlMs = d.ttlMs ?? SANDBOX_LOCK_TTL_MS;
239
- this.pollMs = d.pollMs ?? 100;
240
- this.pathTtlMs = d.pathTtlMs ?? PATH_LEASE_TTL_MS;
178
+ constructor(locks,
179
+ /** The holder records and the legacy busy marker (scripts of this file). */
180
+ redis, log, timings = {}) {
181
+ this.locks = locks;
182
+ this.redis = redis;
183
+ this.log = log;
184
+ this.ttlMs = timings.ttlMs ?? SANDBOX_LOCK_TTL_MS;
185
+ this.pollMs = timings.pollMs ?? 100;
186
+ this.pathTtlMs = timings.pathTtlMs ?? PATH_LEASE_TTL_MS;
241
187
  }
242
188
  /**
243
189
  * TTL of an intent (ms): 4 × the poll interval (a jittered wait is up to 2 × the interval plus
@@ -247,7 +193,11 @@ export class SandboxLeases {
247
193
  return Math.max(this.pollMs * 4, INTENT_TTL_FLOOR_MS);
248
194
  }
249
195
  keys(conv) {
250
- return [`${SANDBOX_LOCK_PREFIX}${conv}`, `${USERS_PREFIX}${conv}`, `${INTENT_PREFIX}${conv}`];
196
+ return {
197
+ lock: `${SANDBOX_LOCK_PREFIX}${conv}`,
198
+ users: `${USERS_PREFIX}${conv}`,
199
+ intent: `${INTENT_PREFIX}${conv}`,
200
+ };
251
201
  }
252
202
  wait(signal) {
253
203
  return sleep(this.pollMs + Math.floor(Math.random() * this.pollMs), signal);
@@ -263,9 +213,9 @@ export class SandboxLeases {
263
213
  for (;;) {
264
214
  if (signal.aborted)
265
215
  throw abortReason(signal);
266
- const ok = await this.redis.eval(ACQUIRE_SHARED, 3, ...this.keys(conv), token, cap, this.ttlMs);
267
- if (Number(ok) === 1)
268
- return this.hold(conv, token, "shared");
216
+ const lease = await this.tryShared(conv, cap, token);
217
+ if (lease)
218
+ return lease;
269
219
  if (Date.now() + this.pollMs > deadline)
270
220
  throw sandboxBusy();
271
221
  await this.wait(signal);
@@ -280,14 +230,13 @@ export class SandboxLeases {
280
230
  async acquireExclusive(conv, signal, capMs, o = {}) {
281
231
  const token = randomUUID();
282
232
  const deadline = capMs === undefined ? Number.POSITIVE_INFINITY : Date.now() + capMs;
283
- const keys = this.keys(conv);
284
233
  try {
285
234
  for (;;) {
286
235
  if (signal.aborted)
287
236
  throw abortReason(signal);
288
- const ok = await this.redis.eval(ACQUIRE_EXCLUSIVE, 3, ...keys, token, this.ttlMs, o.intent ? 1 : 0, this.intentTtlMs);
289
- if (Number(ok) === 1)
290
- return this.hold(conv, token, "exclusive");
237
+ const lease = await this.tryExclusive(conv, { token, intent: o.intent === true });
238
+ if (lease)
239
+ return lease;
291
240
  if (Date.now() + this.pollMs > deadline)
292
241
  throw sandboxBusy();
293
242
  await this.wait(signal);
@@ -295,9 +244,7 @@ export class SandboxLeases {
295
244
  }
296
245
  catch (e) {
297
246
  if (o.intent) {
298
- await this.redis
299
- .eval(DEL_IF, 1, keys[2], token)
300
- .catch((err) => this.log.warn("cannot clear sandbox intent", { conversationId: conv, err }));
247
+ await this.clearIntent(conv, token).catch((err) => this.log.warn("cannot clear sandbox intent", { conversationId: conv, err }));
301
248
  }
302
249
  throw e;
303
250
  }
@@ -308,9 +255,8 @@ export class SandboxLeases {
308
255
  * token, so one waiter can alternate between this and {@link tryShared} with the same token.
309
256
  */
310
257
  async tryExclusive(conv, o = {}) {
311
- const token = o.token ?? randomUUID();
312
- const ok = await this.redis.eval(ACQUIRE_EXCLUSIVE, 3, ...this.keys(conv), token, this.ttlMs, o.intent ? 1 : 0, this.intentTtlMs);
313
- return Number(ok) === 1 ? this.hold(conv, token, "exclusive") : null;
258
+ const h = await this.locks.tryExclusive(this.keys(conv), o.token ?? randomUUID(), this.ttlMs, o.intent ? this.intentTtlMs : undefined);
259
+ return h ? this.held(conv, h) : null;
314
260
  }
315
261
  /**
316
262
  * One try at a shared lease (`cap` holders at most); null when it is not granted. `token` is the
@@ -318,12 +264,12 @@ export class SandboxLeases {
318
264
  * (it should then {@link clearIntent}).
319
265
  */
320
266
  async tryShared(conv, cap, token = randomUUID()) {
321
- const ok = await this.redis.eval(ACQUIRE_SHARED, 3, ...this.keys(conv), token, cap, this.ttlMs);
322
- return Number(ok) === 1 ? this.hold(conv, token, "shared") : null;
267
+ const h = await this.locks.tryShared(this.keys(conv), token, cap, this.ttlMs);
268
+ return h ? this.held(conv, h) : null;
323
269
  }
324
270
  /** Deletes the conversation's intent when it is `token`'s. */
325
271
  async clearIntent(conv, token) {
326
- await this.redis.eval(DEL_IF, 1, this.keys(conv)[2], token);
272
+ await this.locks.releaseIf(this.keys(conv).intent, token);
327
273
  }
328
274
  /** Whether the single busy marker of a kernel before phase C is present (v2 does not count). */
329
275
  async legacyMarker(conv) {
@@ -331,9 +277,8 @@ export class SandboxLeases {
331
277
  return v !== null && v !== BUSY_V2;
332
278
  }
333
279
  /** Live shared leases of the conversation. */
334
- async sharedCount(conv) {
335
- const [lock, users] = this.keys(conv);
336
- return Number(await this.redis.eval(COUNT, 2, lock, users));
280
+ sharedCount(conv) {
281
+ return this.locks.sharedCount(this.keys(conv));
337
282
  }
338
283
  /**
339
284
  * Records (or refreshes) a holder that may run commands (before its provider calls); `ttlMs`
@@ -352,164 +297,79 @@ export class SandboxLeases {
352
297
  * claimed only when `exclusiveToken` is the caller's exclusive lease (no shared lease live).
353
298
  */
354
299
  async claimDeadHolders(conv, exclusiveToken) {
355
- const [lock, users] = this.keys(conv);
300
+ const { lock, users } = this.keys(conv);
356
301
  const r = (await this.redis.eval(CLAIM, 4, lock, users, `${HOLDERS_PREFIX}${conv}`, `${SANDBOX_BUSY_PREFIX}${conv}`, exclusiveToken ?? ""));
357
302
  const [legacy, ...tags] = r;
358
303
  return { tags, legacyMarker: Number(legacy) === 1 };
359
304
  }
360
305
  /**
361
306
  * A short lease on one path of the sandbox (the kernel's own read-modify-write of a file); waits
362
- * up to `capMs`, then throws {@link SandboxPathBusyError}. Renewed while held; a renewal that
363
- * finds it gone warns and aborts its `signal`.
307
+ * up to `capMs`, then throws {@link SandboxPathBusyError}. A {@link LockService.hold} lease
308
+ * (renewed every TTL / 3): when it is lost its `signal` aborts.
364
309
  */
365
310
  async pathLease(conv, path, signal, capMs) {
366
311
  const key = `${PATH_PREFIX}${conv}:${createHash("sha256").update(path).digest("hex")}`;
367
312
  const token = randomUUID();
368
- const ttl = this.pathTtlMs;
369
313
  const deadline = Date.now() + capMs;
314
+ let h;
370
315
  for (;;) {
371
316
  if (signal.aborted)
372
317
  throw abortReason(signal);
373
- if ((await this.redis.set(key, token, "PX", ttl, "NX")) === "OK")
318
+ h = await this.locks.hold(key, token, this.pathTtlMs);
319
+ if (h)
374
320
  break;
375
321
  if (Date.now() + this.pollMs > deadline)
376
322
  throw new SandboxPathBusyError();
377
323
  await this.wait(signal);
378
324
  }
379
- const ctl = new AbortController();
380
- const timer = setInterval(() => {
381
- this.redis
382
- .eval(EXPIRE_IF, 1, key, token, ttl)
383
- .then((ok) => {
384
- if (Number(ok) === 1 || ctl.signal.aborted)
385
- return;
386
- this.log.warn("sandbox path lease lost", { conversationId: conv });
387
- ctl.abort(new SandboxLockLostError(conv));
388
- clearInterval(timer);
389
- })
390
- .catch((err) => this.log.warn("sandbox path lease renew failed", { conversationId: conv, err }));
391
- }, Math.max(1, Math.floor(ttl / 3)));
392
- timer.unref();
393
- return {
394
- signal: ctl.signal,
395
- release: async () => {
396
- clearInterval(timer);
397
- await this.redis.eval(DEL_IF, 1, key, token);
398
- },
399
- };
400
- }
401
- /**
402
- * Wraps a just-acquired lease: renews every TTL / 3 and remembers the last successful renewal;
403
- * the lease is lost when a renewal reports it gone or none succeeded for 2/3 TTL (leaving margin
404
- * so the abort takes effect before the key expires).
405
- */
406
- hold(conv, token, kind) {
407
- const ctl = new AbortController();
408
- const staleMs = Math.floor((this.ttlMs * 2) / 3);
409
- let inFlight = false;
410
- const s = {
411
- kind,
412
- token,
413
- conv,
414
- ctl,
415
- lastOk: Date.now(),
416
- released: false,
417
- stop: () => {
418
- clearInterval(timer);
419
- clearInterval(watchdog);
420
- },
421
- };
422
- const stale = () => Date.now() - s.lastOk > staleMs;
423
- const tick = () => {
424
- if (stale())
425
- this.lose(s);
426
- if (ctl.signal.aborted) {
427
- s.stop();
428
- return;
429
- }
430
- if (inFlight)
431
- return;
432
- inFlight = true;
433
- void this.renew(s).finally(() => {
434
- inFlight = false;
435
- });
436
- };
437
- const timer = setInterval(tick, Math.max(1, Math.floor(this.ttlMs / 3)));
438
- timer.unref();
439
- // a finer check (at most every 5 s): notices a renewal that hangs
440
- const watchdog = setInterval(() => {
441
- if (stale())
442
- this.lose(s);
443
- if (ctl.signal.aborted)
444
- s.stop();
445
- }, Math.min(5000, Math.max(1, Math.floor(this.ttlMs / 6))));
446
- watchdog.unref();
447
- return this.view(s, kind);
325
+ const held = h;
326
+ return { signal: lostSignal(held.lost, conv), release: () => held.release() };
448
327
  }
449
- lose(s) {
450
- if (s.ctl.signal.aborted)
451
- return;
452
- this.log.warn("sandbox lease lost", { conversationId: s.conv, kind: s.kind });
453
- s.ctl.abort(new SandboxLockLostError(s.conv));
454
- s.stop();
328
+ /** A sandbox lease over a held {@link SharedLeaseHandle}, as its current kind. */
329
+ held(conv, h) {
330
+ return this.view(conv, h, lostSignal(h.lost, conv), h.kind);
455
331
  }
456
- async renew(s) {
457
- if (s.ctl.signal.aborted)
458
- return false;
459
- const [lock, users] = this.keys(s.conv);
460
- // Redis computes the new expiry when it runs the script: freshness counts from the send
461
- const sent = Date.now();
462
- try {
463
- const ok = Number(await this.redis.eval(RENEW, 2, lock, users, s.token, this.ttlMs, s.kind));
464
- if (ok === 1)
465
- s.lastOk = Math.max(s.lastOk, sent);
466
- else
467
- this.lose(s);
468
- }
469
- catch (err) {
470
- this.log.warn("sandbox lease renew failed", { conversationId: s.conv, err });
471
- }
472
- if (Date.now() - s.lastOk > Math.floor((this.ttlMs * 2) / 3))
473
- this.lose(s);
474
- return !s.ctl.signal.aborted;
475
- }
476
- /** A lease view of `s` as `kind`; a view stops working once the lease changes kind. */
477
- view(s, kind) {
478
- const [lock, users] = this.keys(s.conv);
479
- const current = () => s.kind === kind;
332
+ /** A lease view of `h` as `kind`; a view stops working once the lease changes kind. */
333
+ view(conv, h, signal, kind) {
334
+ const current = () => h.kind === kind;
480
335
  return {
481
336
  kind,
482
- token: s.token,
483
- conversationId: s.conv,
484
- signal: s.ctl.signal,
485
- renew: () => (current() ? this.renew(s) : Promise.resolve(false)),
337
+ token: h.token,
338
+ conversationId: conv,
339
+ signal,
340
+ // a Redis error is warned, not thrown: the deadline decides whether the lease is lost
341
+ renew: async () => {
342
+ if (!current())
343
+ return false;
344
+ try {
345
+ return await h.renew();
346
+ }
347
+ catch (err) {
348
+ this.log.warn("sandbox lease renew failed", { conversationId: conv, err });
349
+ return !signal.aborted;
350
+ }
351
+ },
486
352
  // Any view releases the lease in its current kind (a caller that kept only the exclusive
487
353
  // view after a downgrade must not leak the shared lease, which would renew forever)
488
- release: async () => {
489
- if (s.released)
490
- return;
491
- s.released = true;
492
- s.stop();
493
- await this.redis
494
- .eval(RELEASE, 2, lock, users, s.token, s.kind)
495
- .catch((err) => this.log.warn("cannot release sandbox lease", { conversationId: s.conv, err }));
496
- },
354
+ release: () => h.release(),
497
355
  downgrade: async () => {
498
- if (!current() || s.kind !== "exclusive" || s.released) {
356
+ if (!current() || h.kind !== "exclusive")
499
357
  throw new Error("sandbox lease is not exclusive");
500
- }
501
- if (s.ctl.signal.aborted)
502
- throw abortReason(s.ctl.signal);
503
- const sent = Date.now();
504
- const ok = Number(await this.redis.eval(DOWNGRADE, 2, lock, users, s.token, this.ttlMs));
505
- if (ok !== 1) {
506
- this.lose(s);
507
- throw new SandboxLockLostError(s.conv);
508
- }
509
- s.kind = "shared";
510
- s.lastOk = Math.max(s.lastOk, sent);
511
- return this.view(s, "shared");
358
+ if (signal.aborted)
359
+ throw abortReason(signal);
360
+ if (!(await h.downgrade()))
361
+ throw new SandboxLockLostError(conv);
362
+ return this.view(conv, h, signal, "shared");
512
363
  },
513
364
  };
514
365
  }
515
- }
366
+ };
367
+ SandboxLeases = __decorate([
368
+ Injectable(),
369
+ __param(0, Inject(LockService)),
370
+ __param(1, Inject(REDIS)),
371
+ __param(2, Inject(KERNEL_LOGGER)),
372
+ __param(3, Optional()),
373
+ __param(3, Inject(SANDBOX_LEASE_TIMINGS))
374
+ ], SandboxLeases);
375
+ export { SandboxLeases };
@@ -0,0 +1,19 @@
1
+ import { type SandboxProvider } from "@capybara-hq/plugin-sdk";
2
+ import { ExtensionRegistry } from "../extensions/registry.js";
3
+ /** 当前的 `sandbox@1` 提供方:插件名与实现。 */
4
+ export interface SandboxProviderEntry {
5
+ plugin: string;
6
+ impl: SandboxProvider;
7
+ }
8
+ /**
9
+ * The `sandbox@1` providers of this process, read from the {@link ExtensionRegistry} at every
10
+ * call: providers are ready only after the extension load, and change with installs.
11
+ */
12
+ export declare class SandboxProviders {
13
+ private readonly registry;
14
+ constructor(registry: Pick<ExtensionRegistry, "list">);
15
+ /** The current provider; undefined without one. */
16
+ current(): SandboxProviderEntry | undefined;
17
+ /** A still-loaded provider by plugin name (to destroy an earlier provider's instance). */
18
+ lookup(plugin: string): SandboxProvider | undefined;
19
+ }
@@ -0,0 +1,38 @@
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 { SANDBOX_EXTENSION_POINT } from "@capybara-hq/plugin-sdk";
11
+ import { Inject, Injectable } from "@nestjs/common";
12
+ import { ExtensionRegistry } from "../extensions/registry.js";
13
+ /**
14
+ * The `sandbox@1` providers of this process, read from the {@link ExtensionRegistry} at every
15
+ * call: providers are ready only after the extension load, and change with installs.
16
+ */
17
+ let SandboxProviders = class SandboxProviders {
18
+ registry;
19
+ constructor(registry) {
20
+ this.registry = registry;
21
+ }
22
+ /** The current provider; undefined without one. */
23
+ current() {
24
+ const e = this.registry.list("sandbox").find((x) => x.capability === SANDBOX_EXTENSION_POINT);
25
+ return e ? { plugin: e.plugin, impl: e.impl } : undefined;
26
+ }
27
+ /** A still-loaded provider by plugin name (to destroy an earlier provider's instance). */
28
+ lookup(plugin) {
29
+ return this.registry
30
+ .list("sandbox")
31
+ .find((x) => x.capability === SANDBOX_EXTENSION_POINT && x.plugin === plugin)?.impl;
32
+ }
33
+ };
34
+ SandboxProviders = __decorate([
35
+ Injectable(),
36
+ __param(0, Inject(ExtensionRegistry))
37
+ ], SandboxProviders);
38
+ export { SandboxProviders };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Sandboxes: the one {@link SandboxService} (a conversation's sandbox over the `sandbox@1`
3
+ * provider, with the shared / exclusive leases of {@link SandboxLeases}) and the producer of the
4
+ * one-off `sandbox-destroy-for` jobs (`MaintenanceProcessor` consumes them). The sweeps
5
+ * (`SandboxSweepJobs`) are the worker role's (`WorkerModule`).
6
+ */
7
+ export declare class SandboxModule {
8
+ }
@@ -0,0 +1,30 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Module } from "@nestjs/common";
8
+ import { ExtensionRegistryModule } from "../extensions/registry.js";
9
+ import { QueueModule } from "../infra/queue/queue.module.js";
10
+ import { MAINTENANCE_QUEUE_NAME } from "../runtime/maintenance-queue.js";
11
+ import { SandboxJobs } from "./jobs.js";
12
+ import { SandboxLeases } from "./leases.js";
13
+ import { SandboxProviders } from "./providers.js";
14
+ import { SandboxService } from "./sandbox.service.js";
15
+ /**
16
+ * Sandboxes: the one {@link SandboxService} (a conversation's sandbox over the `sandbox@1`
17
+ * provider, with the shared / exclusive leases of {@link SandboxLeases}) and the producer of the
18
+ * one-off `sandbox-destroy-for` jobs (`MaintenanceProcessor` consumes them). The sweeps
19
+ * (`SandboxSweepJobs`) are the worker role's (`WorkerModule`).
20
+ */
21
+ let SandboxModule = class SandboxModule {
22
+ };
23
+ SandboxModule = __decorate([
24
+ Module({
25
+ imports: [ExtensionRegistryModule, QueueModule.registerQueue(MAINTENANCE_QUEUE_NAME)],
26
+ providers: [SandboxProviders, SandboxLeases, SandboxService, SandboxJobs],
27
+ exports: [SandboxService, SandboxJobs],
28
+ })
29
+ ], SandboxModule);
30
+ export { SandboxModule };