@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,11 +1,34 @@
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 { DIRECTORY_EXTENSION_POINT } from "@capybara-hq/plugin-sdk";
11
+ import { Inject, Injectable } from "@nestjs/common";
1
12
  import { sql } from "kysely";
13
+ import { EventLog } from "../conversations/event-log.js";
2
14
  import { ApiError } from "../errors.js";
3
15
  import { enabledExtensionsQuery } from "../extensions/enabled.js";
16
+ import { ExtensionRegistry } from "../extensions/registry.js";
4
17
  import { audit } from "../identity/audit.js";
5
- /** 兜底扫描:维护队列任务名、job scheduler id(不含 `:`)、周期与每次条数。 */
18
+ import { SessionService } from "../identity/sessions.js";
19
+ import { KernelDb } from "../infra/database/kernel-db.js";
20
+ import { TransactionHost } from "../infra/database/transaction-host.js";
21
+ import { Transactional } from "../infra/database/transactional.decorator.js";
22
+ import { LockService } from "../infra/lock/lock.service.js";
23
+ import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
24
+ import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
25
+ import { RunControl } from "../runtime/run-control.js";
26
+ import { SandboxJobs } from "../sandbox/jobs.js";
27
+ import { ApprovalsService } from "../tools/approvals.service.js";
28
+ import { Credentials } from "../tools/credentials.js";
29
+ import { QuestionsService } from "../tools/questions.service.js";
30
+ /** The safety-net sweep: cron job name (no `:`), every 10 minutes, and the rows per page. */
6
31
  export const OFFBOARD_SWEEP_JOB = "offboard-sweep";
7
- export const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
8
- export const OFFBOARD_SWEEP_EVERY_MS = 600_000;
9
32
  export const OFFBOARD_SWEEP_BATCH = 500;
10
33
  /** 一次兜底扫描最多翻的页数(每页 {@link OFFBOARD_SWEEP_BATCH} 条),防止单次任务无限长。 */
11
34
  export const OFFBOARD_SWEEP_MAX_PAGES = 20;
@@ -18,28 +41,47 @@ const ACTIVE = ["queued", "running", "waiting"];
18
41
  const DIRECTORY_SOURCE_PREFIX = "directory:";
19
42
  /**
20
43
  * 成员离职(spec 3.3):管理员移出、本人离开与通讯录同步共用这一条路径,全部写入在调用方的同一个事务内,
21
- * 要么都生效要么都不生效。Redis 吊销标记、事件发布与中止进行中的运行是提交后的尽力而为({@link afterCommit}),
44
+ * 要么都生效要么都不生效。Redis 吊销标记、事件发布与中止进行中的运行是提交后的尽力而为({@link afterOffboard}),
22
45
  * 漏掉的运行由兜底扫描({@link sweep}:发起人已不是该组织成员的进行中运行)中止。框架无关。
23
46
  *
24
47
  * 已接受的窄窗口:离职提交时正在进行的 OAuth token 刷新(`Credentials` 刷新锁内)可能在提交之后把此人的
25
48
  * 个人凭据重新写回(upsert)。凭据只在此人以成员身份调用工具时使用,而其运行已被中止、成员关系已删除,
26
49
  * 残留的凭据不会被使用;重新加入组织后会被新的连接覆盖。
27
50
  */
28
- export class Offboarding {
29
- deps;
30
- constructor(deps) {
31
- this.deps = deps;
32
- deps.maintenance?.schedule({
33
- id: OFFBOARD_SWEEP_SCHEDULER_ID,
34
- name: OFFBOARD_SWEEP_JOB,
35
- everyMs: () => OFFBOARD_SWEEP_EVERY_MS,
36
- });
37
- deps.maintenance?.handle(OFFBOARD_SWEEP_JOB, async () => {
38
- await this.sweep();
39
- });
51
+ let Offboarding = class Offboarding {
52
+ db;
53
+ txHost;
54
+ sessions;
55
+ redis;
56
+ registry;
57
+ eventLog;
58
+ sandboxJobs;
59
+ runs;
60
+ credentials;
61
+ approvals;
62
+ questions;
63
+ log;
64
+ constructor(db, txHost, sessions, redis, registry, eventLog,
65
+ /** The departed member's sandboxes: one-off maintenance jobs, destroyed one by one by a worker. */
66
+ sandboxJobs,
67
+ /** Stops the departed member's runs (`by: null`, a system action). */
68
+ runs, credentials, approvals, questions, log) {
69
+ this.db = db;
70
+ this.txHost = txHost;
71
+ this.sessions = sessions;
72
+ this.redis = redis;
73
+ this.registry = registry;
74
+ this.eventLog = eventLog;
75
+ this.sandboxJobs = sandboxJobs;
76
+ this.runs = runs;
77
+ this.credentials = credentials;
78
+ this.approvals = approvals;
79
+ this.questions = questions;
80
+ this.log = log;
40
81
  }
41
82
  /**
42
- * 在事务 `t` 内(调用方应已锁组织行——顺序:组织行 → 成员关系,并完成「最后一个 owner」等前置检查):
83
+ * In the caller's transaction (`mandatory`: the caller holds the org row lock, order org row →
84
+ * membership, and did the "last owner" checks):
43
85
  * 1. 删除成员关系(非成员 → `member.not_found`;删后组织没有 owner → `org.last_owner`),清空指向该组织的会话当前组织;
44
86
  * 2. 吊销该账号**全部**会话与个人令牌(令牌与会话是账号级的,无法只吊销「该组织下」的,按保守处理);
45
87
  * 3. 删除其在该组织所有连接器上的个人凭据;
@@ -53,8 +95,8 @@ export class Offboarding {
53
95
  * 8. 审计 `org.member.offboarded`;
54
96
  * 9. 记下此人在该组织对话里还没销毁的沙箱(提交后销毁,尽力而为)。
55
97
  */
56
- async offboard(t, orgId, accountId, reason, actor = {}) {
57
- const deleted = await t
98
+ async offboard(orgId, accountId, reason, actor = {}) {
99
+ const deleted = await this.db
58
100
  .deleteFrom("memberships")
59
101
  .where("org_id", "=", orgId)
60
102
  .where("account_id", "=", accountId)
@@ -70,7 +112,7 @@ export class Offboarding {
70
112
  // deleted or re-keyed, so NO KEY UPDATE: it still excludes FOR SHARE and other writers, but not
71
113
  // the foreign key checks (FOR KEY SHARE) of a transaction that writes rows referencing them,
72
114
  // which may already hold a conversation row this transaction waits for (40P01)
73
- await t
115
+ await this.db
74
116
  .selectFrom("agents")
75
117
  .select("id")
76
118
  .where("org_id", "=", orgId)
@@ -82,7 +124,7 @@ export class Offboarding {
82
124
  // then the member's conversations in id order, before any of their queue rows (final review
83
125
  // m2): queue dispatch, send-now and remove lock a conversation, then its queue rows; deleting
84
126
  // the rows first and updating the conversations after could deadlock with them (40P01)
85
- await t
127
+ await this.db
86
128
  .selectFrom("conversations")
87
129
  .select("id")
88
130
  .where("org_id", "=", orgId)
@@ -90,7 +132,7 @@ export class Offboarding {
90
132
  .orderBy("id")
91
133
  .forNoKeyUpdate()
92
134
  .execute();
93
- const owner = await t
135
+ const owner = await this.db
94
136
  .selectFrom("memberships")
95
137
  .select("account_id")
96
138
  .where("org_id", "=", orgId)
@@ -102,20 +144,20 @@ export class Offboarding {
102
144
  if (!owner) {
103
145
  throw new ApiError("org.last_owner", "An organization must keep at least one owner");
104
146
  }
105
- await t
147
+ await this.db
106
148
  .updateTable("sessions")
107
149
  .set({ current_org_id: null })
108
150
  .where("account_id", "=", accountId)
109
151
  .where("current_org_id", "=", orgId)
110
152
  .execute();
111
- const sessions = await t
153
+ const sessions = await this.db
112
154
  .updateTable("sessions")
113
155
  .set({ revoked_at: sql `now()` })
114
156
  .where("account_id", "=", accountId)
115
157
  .where("revoked_at", "is", null)
116
158
  .returning("id")
117
159
  .execute();
118
- const tokens = await t
160
+ const tokens = await this.db
119
161
  .updateTable("api_tokens")
120
162
  .set({ revoked_at: sql `now()` })
121
163
  .where("kind", "=", "personal")
@@ -123,20 +165,21 @@ export class Offboarding {
123
165
  .where("revoked_at", "is", null)
124
166
  .returning("id")
125
167
  .execute();
126
- const credentials = await this.deps.credentials.clearAccount(orgId, accountId, t);
127
- const approvals = await this.deps.approvals.cancelPendingFor(t, orgId, accountId);
128
- const questions = await this.deps.questions.cancelPendingFor(t, orgId, accountId);
168
+ // in this transaction (the approvals and questions services join it: `mandatory`)
169
+ const credentials = await this.credentials.clearAccount(orgId, accountId);
170
+ const approvals = await this.approvals.cancelPendingFor(orgId, accountId);
171
+ const questions = await this.questions.cancelPendingFor(orgId, accountId);
129
172
  const notify = new Map(approvals.seqs);
130
173
  for (const [c, seq] of questions.seqs)
131
174
  notify.set(c, Math.max(notify.get(c) ?? 0, seq));
132
- const runs = await t
175
+ const runs = await this.db
133
176
  .selectFrom("runs")
134
177
  .innerJoin("conversations", "conversations.id", "runs.conversation_id")
135
178
  .select(["runs.id", "runs.conversation_id", "runs.status"])
136
179
  .where("conversations.org_id", "=", orgId)
137
180
  // 评测回放的隐藏对话由评测 worker 驱动(不执行工具),随评测运行停下,不在这里中止。
138
181
  // 评测运行的创建者离开组织也不取消评测运行(Ruling S1-b):管理员发起的评测运行是组织的工作,
139
- // 只有取消、删除评测集、删除组织或 agent 才会停下(见 evals/budget.ts cancelEvalRuns)
182
+ // 只有取消、删除评测集、删除组织或 agent 才会停下(见 evals/budget.ts `EvalBudget.cancelRuns`)
140
183
  // a removed member's sub-agents run with their identity and credentials: stopped too
141
184
  .where("conversations.kind", "in", ["chat", "subagent"])
142
185
  .where("runs.status", "in", ACTIVE)
@@ -145,7 +188,7 @@ export class Offboarding {
145
188
  eb("conversations.account_id", "=", accountId),
146
189
  ]))
147
190
  .execute();
148
- const agents = await t
191
+ const agents = await this.db
149
192
  .updateTable("agents")
150
193
  .set({
151
194
  owner_account_id: owner.account_id,
@@ -157,21 +200,21 @@ export class Offboarding {
157
200
  .where("deleted_at", "is", null)
158
201
  .returning("id")
159
202
  .execute();
160
- const threads = await t
203
+ const threads = await this.db
161
204
  .updateTable("channel_threads")
162
205
  .set({ archived_at: sql `now()` })
163
206
  .where("account_id", "=", accountId)
164
207
  .where("archived_at", "is", null)
165
208
  .where("connection_id", "in", (eb) => eb.selectFrom("channel_connections").select("id").where("org_id", "=", orgId))
166
209
  .executeTakeFirst();
167
- const grants = await t
210
+ const grants = await this.db
168
211
  .deleteFrom("tool_grants")
169
212
  .where("org_id", "=", orgId)
170
213
  .where("account_id", "=", accountId)
171
214
  .executeTakeFirst();
172
- const excluded = reason === "directory" ? [] : await this.exclusionPlugins(t, orgId, deleted.source);
215
+ const excluded = reason === "directory" ? [] : await this.exclusionPlugins(orgId, deleted.source);
173
216
  if (excluded.length > 0) {
174
- await t
217
+ await this.db
175
218
  .insertInto("directory_exclusions")
176
219
  .values(excluded.map((plugin) => ({
177
220
  org_id: orgId,
@@ -184,7 +227,7 @@ export class Offboarding {
184
227
  }
185
228
  // Queued messages never go out after their author leaves (they also hold `@` resource bodies
186
229
  // read with the person's credentials): deleted here, so no dispatch can pick them up.
187
- const queued = await t
230
+ const queued = await this.db
188
231
  .deleteFrom("conversation_queue")
189
232
  .where("conversation_id", "in", (eb) => eb
190
233
  .selectFrom("conversations")
@@ -195,13 +238,13 @@ export class Offboarding {
195
238
  .execute();
196
239
  const queueConversations = [...new Set(queued.map((r) => r.conversation_id))];
197
240
  if (queueConversations.length > 0) {
198
- await t
241
+ await this.db
199
242
  .updateTable("conversations")
200
243
  .set({ queue_paused: false, queue_pause_reason: null })
201
244
  .where("id", "in", queueConversations)
202
245
  .execute();
203
246
  }
204
- const sandboxes = await t
247
+ const sandboxes = await this.db
205
248
  .selectFrom("sandboxes")
206
249
  .innerJoin("conversations", "conversations.id", "sandboxes.conversation_id")
207
250
  .select("sandboxes.conversation_id")
@@ -209,7 +252,7 @@ export class Offboarding {
209
252
  .where("conversations.account_id", "=", accountId)
210
253
  .where("sandboxes.status", "<>", "destroyed")
211
254
  .execute();
212
- await audit(t, {
255
+ await audit(this.db.db, {
213
256
  ...(actor.actorAccountId !== undefined && { actorAccountId: actor.actorAccountId }),
214
257
  ...(actor.actorTokenId !== undefined && { actorTokenId: actor.actorTokenId }),
215
258
  orgId,
@@ -248,15 +291,19 @@ export class Offboarding {
248
291
  };
249
292
  }
250
293
  /** 要写排除的通讯录插件:该组织启用的已加载通讯录插件 ∪ 成员关系自身的 `directory:<插件>` 来源,去重排序。 */
251
- async exclusionPlugins(t, orgId, source) {
294
+ async exclusionPlugins(orgId, source) {
252
295
  const out = new Set();
253
296
  if (source?.startsWith(DIRECTORY_SOURCE_PREFIX)) {
254
297
  out.add(source.slice(DIRECTORY_SOURCE_PREFIX.length));
255
298
  }
256
- const loaded = this.deps.directoryPlugins?.() ?? [];
299
+ // Ruling A24: every loaded directory extension enabled in the org
300
+ const loaded = this.registry
301
+ .list("directory")
302
+ .filter((e) => e.capability === DIRECTORY_EXTENSION_POINT)
303
+ .map((e) => e.plugin);
257
304
  if (loaded.length > 0) {
258
- const rows = await t
259
- .selectFrom(enabledExtensionsQuery(t, orgId).as("en"))
305
+ const rows = await this.db
306
+ .selectFrom(enabledExtensionsQuery(this.db.db, orgId).as("en"))
260
307
  .select("en.plugin")
261
308
  .where("en.plugin", "in", loaded)
262
309
  .execute();
@@ -266,41 +313,43 @@ export class Offboarding {
266
313
  return [...out].sort();
267
314
  }
268
315
  /**
269
- * 提交之后:写会话吊销标记、发布 cancelled 事件、中止此人在该组织进行中的运行、投递销毁其对话沙箱的任务。
270
- * 每步失败只记 warn。
316
+ * After the commit (callers register it with the infra `afterCommit` inside their transaction):
317
+ * writes the session revocation markers, publishes the cancelled events, stops the person's
318
+ * runs in the org and schedules destroying their conversations' sandboxes. A failing step only
319
+ * logs a warning.
271
320
  */
272
- async afterCommit(r) {
273
- const { sessions, eventLog, log } = this.deps;
321
+ async afterOffboard(r) {
322
+ const { sessions, log, eventLog } = this;
274
323
  try {
275
- await sessions?.markRevoked(r.revokedSessionIds);
324
+ await sessions.markRevoked(r.revokedSessionIds);
276
325
  }
277
326
  catch (err) {
278
- log?.warn("offboarding: cannot write session revocation markers", { err });
327
+ log.warn("offboarding: cannot write session revocation markers", { err });
279
328
  }
280
329
  for (const [conversationId, seq] of r.notify) {
281
330
  try {
282
- await eventLog?.notify(conversationId, seq);
331
+ await eventLog.notify(conversationId, seq);
283
332
  }
284
333
  catch (err) {
285
- log?.warn("offboarding: event notify failed", { conversationId, err });
334
+ log.warn("offboarding: event notify failed", { conversationId, err });
286
335
  }
287
336
  }
288
337
  for (const conversationId of r.queueConversations) {
289
338
  try {
290
- await eventLog?.publishChanged?.(conversationId, "queue");
339
+ await eventLog.publishChanged(conversationId, "queue");
291
340
  }
292
341
  catch (err) {
293
- log?.warn("offboarding: queue change notify failed", { conversationId, err });
342
+ log.warn("offboarding: queue change notify failed", { conversationId, err });
294
343
  }
295
344
  }
296
345
  for (const run of r.runs)
297
346
  await this.stopRun(run);
298
- if (r.sandboxConversations.length > 0 && this.deps.sandboxes) {
347
+ if (r.sandboxConversations.length > 0) {
299
348
  try {
300
- await this.deps.sandboxes.destroy(r.sandboxConversations);
349
+ await this.sandboxJobs.destroy(r.sandboxConversations);
301
350
  }
302
351
  catch (err) {
303
- log?.warn("offboarding: cannot schedule sandbox destruction", {
352
+ log.warn("offboarding: cannot schedule sandbox destruction", {
304
353
  count: r.sandboxConversations.length,
305
354
  err,
306
355
  });
@@ -313,9 +362,7 @@ export class Offboarding {
313
362
  * 不像会话中止那样随后起新一轮运行:离职者的待处理消息不再处理。
314
363
  */
315
364
  async stopRun(run) {
316
- const ctl = this.deps.runs;
317
- if (!ctl)
318
- return;
365
+ const ctl = this.runs;
319
366
  try {
320
367
  if (run.status === "waiting" &&
321
368
  (await ctl.abortWaiting(run.conversationId, run.runId, null))) {
@@ -326,12 +373,12 @@ export class Offboarding {
326
373
  await ctl.requestAbort(run.runId, null);
327
374
  // 广播中止的运行要等所在副本到达步骤边界才真正结束:广播成功后记标记,扫描在其有效期内不再重复广播
328
375
  // (广播失败不记,下一轮扫描重试)
329
- await this.deps.redis
330
- ?.set(offboardAbortKey(run.runId), "1", "EX", OFFBOARD_ABORT_MARK_TTL_SECONDS)
331
- .catch((err) => this.deps.log?.warn("offboarding: cannot mark abort", { err }));
376
+ await this.redis
377
+ .set(offboardAbortKey(run.runId), "1", "EX", OFFBOARD_ABORT_MARK_TTL_SECONDS)
378
+ .catch((err) => this.log.warn("offboarding: cannot mark abort", { err }));
332
379
  }
333
380
  catch (err) {
334
- this.deps.log?.warn("offboarding: cannot stop run", { runId: run.runId, err });
381
+ this.log.warn("offboarding: cannot stop run", { runId: run.runId, err });
335
382
  }
336
383
  }
337
384
  /**
@@ -342,11 +389,8 @@ export class Offboarding {
342
389
  * 不每轮重复广播;标记过期仍未结束的再处理一次。返回本次处理(未跳过)的运行数。
343
390
  * 现任成员(含匿名访客这样的 guest 成员)发起的运行不受影响。
344
391
  */
345
- async sweep() {
346
- const { db } = this.deps;
347
- if (!db || !this.deps.runs)
348
- return 0;
349
- const batch = this.deps.sweepBatch ?? OFFBOARD_SWEEP_BATCH;
392
+ async sweep(batch = OFFBOARD_SWEEP_BATCH) {
393
+ const db = this.db;
350
394
  // 游标的时间用文本保存完整的微秒精度(JS Date 只有毫秒,会让同一行再被取到)
351
395
  let after;
352
396
  let total = 0;
@@ -373,7 +417,7 @@ export class Offboarding {
373
417
  if (await this.recentlyAborted(r.id))
374
418
  continue;
375
419
  total++;
376
- this.deps.log?.warn("offboard sweep: stopping run of a former member", { runId: r.id });
420
+ this.log.warn("offboard sweep: stopping run of a former member", { runId: r.id });
377
421
  await this.stopRun({
378
422
  conversationId: r.conversation_id,
379
423
  runId: r.id,
@@ -389,10 +433,56 @@ export class Offboarding {
389
433
  }
390
434
  async recentlyAborted(runId) {
391
435
  try {
392
- return (await this.deps.redis?.exists(offboardAbortKey(runId))) === 1;
436
+ return (await this.redis.exists(offboardAbortKey(runId))) === 1;
393
437
  }
394
438
  catch {
395
439
  return false;
396
440
  }
397
441
  }
398
- }
442
+ };
443
+ __decorate([
444
+ Transactional({ propagation: "mandatory" })
445
+ ], Offboarding.prototype, "offboard", null);
446
+ Offboarding = __decorate([
447
+ Injectable(),
448
+ __param(0, Inject(KernelDb)),
449
+ __param(1, Inject(TransactionHost)),
450
+ __param(2, Inject(SessionService)),
451
+ __param(3, Inject(REDIS)),
452
+ __param(4, Inject(ExtensionRegistry)),
453
+ __param(5, Inject(EventLog)),
454
+ __param(6, Inject(SandboxJobs)),
455
+ __param(7, Inject(RunControl)),
456
+ __param(8, Inject(Credentials)),
457
+ __param(9, Inject(ApprovalsService)),
458
+ __param(10, Inject(QuestionsService)),
459
+ __param(11, Inject(KERNEL_LOGGER))
460
+ ], Offboarding);
461
+ export { Offboarding };
462
+ /**
463
+ * The offboarding safety-net sweep ({@link Offboarding.sweep}) every 10 minutes, once per tick
464
+ * across replicas; a worker-role job (`WorkerModule`).
465
+ */
466
+ let OffboardSweepJob = class OffboardSweepJob {
467
+ offboarding;
468
+ lockService;
469
+ log;
470
+ constructor(offboarding, lockService, log) {
471
+ this.offboarding = offboarding;
472
+ this.lockService = lockService;
473
+ this.log = log;
474
+ }
475
+ async run() {
476
+ await this.offboarding.sweep();
477
+ }
478
+ };
479
+ __decorate([
480
+ LockedCron("*/10 * * * *", { name: OFFBOARD_SWEEP_JOB })
481
+ ], OffboardSweepJob.prototype, "run", null);
482
+ OffboardSweepJob = __decorate([
483
+ Injectable(),
484
+ __param(0, Inject(Offboarding)),
485
+ __param(1, Inject(LockService)),
486
+ __param(2, Inject(KERNEL_LOGGER))
487
+ ], OffboardSweepJob);
488
+ export { OffboardSweepJob };
@@ -1,15 +1,15 @@
1
- import type { Transaction } from "kysely";
2
- import type { KernelDatabase } from "../db/kernel-schema.js";
1
+ import { KernelDb } from "../infra/database/kernel-db.js";
2
+ import { TransactionHost } from "../infra/database/transaction-host.js";
3
3
  import { type OrgAction, type OrgRole } from "./roles.js";
4
- type Trx = Transaction<KernelDatabase>;
5
- /** 被锁组织的元数据(审计记录改动前的值用)。 */
4
+ /** The locked org's metadata (audits record the values before a change). */
6
5
  export interface LockedOrg {
7
6
  slug: string;
8
7
  name: string;
9
8
  }
10
9
  /**
11
- * `SELECT … FROM capybara.orgs WHERE id = $1 AND deleted_at IS NULL FOR NO KEY UPDATE`:锁住组织行,
12
- * 串行化同一组织的成员 / 邀请 / 令牌 / 配置写操作。组织不存在或已软删除时返回 undefined。
10
+ * The org row lock that serializes an organization's member / invitation / token / config writes.
11
+ * Every method joins the caller's transaction (`mandatory`), which holds the row lock until it
12
+ * ends; called outside one it throws instead of locking nothing.
13
13
  *
14
14
  * NO KEY UPDATE, not UPDATE: the holders still exclude each other (and `FOR SHARE` readers), but a
15
15
  * foreign key check against the org row (`FOR KEY SHARE`, taken by every insert of a row that
@@ -17,16 +17,25 @@ export interface LockedOrg {
17
17
  * With FOR UPDATE, offboarding (org row, then the member's conversations) deadlocked with an event
18
18
  * log append (a conversation row, then the org foreign key check).
19
19
  */
20
- export declare function tryLockOrg(t: Trx, orgId: string): Promise<LockedOrg | undefined>;
21
- /** 同 `tryLockOrg`,组织不存在或已软删除 → `org.not_found`。 */
22
- export declare function lockOrg(t: Trx, orgId: string): Promise<LockedOrg>;
23
- /**
24
- * 依赖角色的组织写操作的执行期复核(spec 3.6 R5):锁组织行,并在锁内实时重读发起人的角色。
25
- * 组织不存在或已软删除 → `org.not_found`;发起人不是成员或角色不足以执行 `action` → `forbidden`。
26
- * 服务只接收发起人账号 id,不接收调用方传入的角色。
27
- */
28
- export declare function lockOrgAndAuthorize(t: Trx, orgId: string, actorAccountId: string, action: OrgAction): Promise<{
29
- org: LockedOrg;
30
- role: OrgRole;
31
- }>;
32
- export {};
20
+ export declare class OrgLock {
21
+ private readonly db;
22
+ readonly txHost: TransactionHost;
23
+ constructor(db: KernelDb, txHost: TransactionHost);
24
+ /** Locks the org row; undefined when the org does not exist or is soft-deleted. */
25
+ tryLock(orgId: string): Promise<LockedOrg | undefined>;
26
+ /** Like {@link tryLock}; a missing or soft-deleted org → `org.not_found`. */
27
+ lock(orgId: string): Promise<LockedOrg>;
28
+ /**
29
+ * The run-time re-check of a role-dependent org write (spec 3.6 R5): locks the org row and
30
+ * re-reads the actor's role under it. A missing or soft-deleted org → `org.not_found`; the actor
31
+ * is not a member or the role does not allow `action` → `forbidden`. Services take only the
32
+ * actor's account id, never a role from the caller.
33
+ */
34
+ lockAndAuthorize(orgId: string, actorAccountId: string, action: OrgAction): Promise<{
35
+ org: LockedOrg;
36
+ role: OrgRole;
37
+ }>;
38
+ }
39
+ /** The one {@link OrgLock}: identity (service tokens), orgs and the other domains import it. */
40
+ export declare class OrgLockModule {
41
+ }
@@ -1,8 +1,22 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable, Module } from "@nestjs/common";
1
11
  import { ApiError } from "../errors.js";
12
+ import { KernelDb } from "../infra/database/kernel-db.js";
13
+ import { TransactionHost } from "../infra/database/transaction-host.js";
14
+ import { Transactional } from "../infra/database/transactional.decorator.js";
2
15
  import { can } from "./roles.js";
3
16
  /**
4
- * `SELECT … FROM capybara.orgs WHERE id = $1 AND deleted_at IS NULL FOR NO KEY UPDATE`:锁住组织行,
5
- * 串行化同一组织的成员 / 邀请 / 令牌 / 配置写操作。组织不存在或已软删除时返回 undefined。
17
+ * The org row lock that serializes an organization's member / invitation / token / config writes.
18
+ * Every method joins the caller's transaction (`mandatory`), which holds the row lock until it
19
+ * ends; called outside one it throws instead of locking nothing.
6
20
  *
7
21
  * NO KEY UPDATE, not UPDATE: the holders still exclude each other (and `FOR SHARE` readers), but a
8
22
  * foreign key check against the org row (`FOR KEY SHARE`, taken by every insert of a row that
@@ -10,37 +24,69 @@ import { can } from "./roles.js";
10
24
  * With FOR UPDATE, offboarding (org row, then the member's conversations) deadlocked with an event
11
25
  * log append (a conversation row, then the org foreign key check).
12
26
  */
13
- export async function tryLockOrg(t, orgId) {
14
- return t
15
- .selectFrom("orgs")
16
- .select(["slug", "name"])
17
- .where("id", "=", orgId)
18
- .where("deleted_at", "is", null)
19
- .forNoKeyUpdate()
20
- .executeTakeFirst();
21
- }
22
- /** 同 `tryLockOrg`,组织不存在或已软删除 → `org.not_found`。 */
23
- export async function lockOrg(t, orgId) {
24
- const org = await tryLockOrg(t, orgId);
25
- if (!org)
26
- throw new ApiError("org.not_found", "Organization not found");
27
- return org;
28
- }
29
- /**
30
- * 依赖角色的组织写操作的执行期复核(spec 3.6 R5):锁组织行,并在锁内实时重读发起人的角色。
31
- * 组织不存在或已软删除 → `org.not_found`;发起人不是成员或角色不足以执行 `action` → `forbidden`。
32
- * 服务只接收发起人账号 id,不接收调用方传入的角色。
33
- */
34
- export async function lockOrgAndAuthorize(t, orgId, actorAccountId, action) {
35
- const org = await lockOrg(t, orgId);
36
- const m = await t
37
- .selectFrom("memberships")
38
- .select("role")
39
- .where("org_id", "=", orgId)
40
- .where("account_id", "=", actorAccountId)
41
- .executeTakeFirst();
42
- if (!m || !can(m.role, action)) {
43
- throw new ApiError("forbidden", "Insufficient organization role");
27
+ let OrgLock = class OrgLock {
28
+ db;
29
+ txHost;
30
+ constructor(db, txHost) {
31
+ this.db = db;
32
+ this.txHost = txHost;
33
+ }
34
+ /** Locks the org row; undefined when the org does not exist or is soft-deleted. */
35
+ async tryLock(orgId) {
36
+ return this.db
37
+ .selectFrom("orgs")
38
+ .select(["slug", "name"])
39
+ .where("id", "=", orgId)
40
+ .where("deleted_at", "is", null)
41
+ .forNoKeyUpdate()
42
+ .executeTakeFirst();
43
+ }
44
+ /** Like {@link tryLock}; a missing or soft-deleted org → `org.not_found`. */
45
+ async lock(orgId) {
46
+ const org = await this.tryLock(orgId);
47
+ if (!org)
48
+ throw new ApiError("org.not_found", "Organization not found");
49
+ return org;
50
+ }
51
+ /**
52
+ * The run-time re-check of a role-dependent org write (spec 3.6 R5): locks the org row and
53
+ * re-reads the actor's role under it. A missing or soft-deleted org → `org.not_found`; the actor
54
+ * is not a member or the role does not allow `action` → `forbidden`. Services take only the
55
+ * actor's account id, never a role from the caller.
56
+ */
57
+ async lockAndAuthorize(orgId, actorAccountId, action) {
58
+ const org = await this.lock(orgId);
59
+ const m = await this.db
60
+ .selectFrom("memberships")
61
+ .select("role")
62
+ .where("org_id", "=", orgId)
63
+ .where("account_id", "=", actorAccountId)
64
+ .executeTakeFirst();
65
+ if (!m || !can(m.role, action)) {
66
+ throw new ApiError("forbidden", "Insufficient organization role");
67
+ }
68
+ return { org, role: m.role };
44
69
  }
45
- return { org, role: m.role };
46
- }
70
+ };
71
+ __decorate([
72
+ Transactional({ propagation: "mandatory" })
73
+ ], OrgLock.prototype, "tryLock", null);
74
+ __decorate([
75
+ Transactional({ propagation: "mandatory" })
76
+ ], OrgLock.prototype, "lock", null);
77
+ __decorate([
78
+ Transactional({ propagation: "mandatory" })
79
+ ], OrgLock.prototype, "lockAndAuthorize", null);
80
+ OrgLock = __decorate([
81
+ Injectable(),
82
+ __param(0, Inject(KernelDb)),
83
+ __param(1, Inject(TransactionHost))
84
+ ], OrgLock);
85
+ export { OrgLock };
86
+ /** The one {@link OrgLock}: identity (service tokens), orgs and the other domains import it. */
87
+ let OrgLockModule = class OrgLockModule {
88
+ };
89
+ OrgLockModule = __decorate([
90
+ Module({ providers: [OrgLock], exports: [OrgLock] })
91
+ ], OrgLockModule);
92
+ export { OrgLockModule };
@@ -1,6 +1,6 @@
1
1
  import { type CanActivate, type ExecutionContext } from "@nestjs/common";
2
2
  import { Reflector } from "@nestjs/core";
3
- import type { KernelDb } from "../db/kernel-schema.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
4
  import { type OrgAction as Action, type OrgRole } from "./roles.js";
5
5
  /** OrgGuard 放在请求上的组织上下文。 */
6
6
  export interface OrgContext {