@capybara-hq/kernel 0.1.0-rc.0 → 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 (626) hide show
  1. package/bootstrap.json +10 -6
  2. package/dist/admin/admin.controller.d.ts +17 -17
  3. package/dist/admin/admin.controller.js +43 -26
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/extensions.controller.d.ts +14 -14
  7. package/dist/admin/extensions.controller.js +30 -17
  8. package/dist/admin/setup-lock.d.ts +16 -0
  9. package/dist/admin/setup-lock.js +47 -0
  10. package/dist/admin/setup.controller.d.ts +8 -8
  11. package/dist/admin/setup.controller.js +27 -25
  12. package/dist/admin/setup.service.d.ts +19 -27
  13. package/dist/admin/setup.service.js +61 -61
  14. package/dist/agents/agent-lookup.d.ts +53 -0
  15. package/dist/agents/agent-lookup.js +179 -0
  16. package/dist/agents/agents.controller.d.ts +1 -1
  17. package/dist/agents/agents.controller.js +14 -8
  18. package/dist/agents/agents.module.d.ts +7 -0
  19. package/dist/agents/agents.module.js +41 -0
  20. package/dist/agents/agents.service.d.ts +39 -58
  21. package/dist/agents/agents.service.js +261 -329
  22. package/dist/agents/definition.d.ts +8 -0
  23. package/dist/agents/definition.js +8 -0
  24. package/dist/agents/models.controller.d.ts +1 -1
  25. package/dist/agents/models.controller.js +2 -2
  26. package/dist/agents/templates.controller.d.ts +1 -1
  27. package/dist/agents/templates.controller.js +2 -2
  28. package/dist/agents/templates.d.ts +6 -8
  29. package/dist/agents/templates.js +20 -4
  30. package/dist/app.d.ts +93 -0
  31. package/dist/app.js +150 -0
  32. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  33. package/dist/catalog/admin-catalog.controller.js +27 -13
  34. package/dist/catalog/catalog-content.d.ts +185 -0
  35. package/dist/catalog/catalog-content.js +323 -0
  36. package/dist/catalog/catalog-items.d.ts +186 -0
  37. package/dist/catalog/catalog-items.js +410 -0
  38. package/dist/catalog/catalog.module.d.ts +14 -0
  39. package/dist/catalog/catalog.module.js +71 -0
  40. package/dist/catalog/catalog.service.d.ts +34 -188
  41. package/dist/catalog/catalog.service.js +155 -489
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +30 -13
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +2 -2
  70. package/dist/channels/channels.module.d.ts +40 -0
  71. package/dist/channels/channels.module.js +128 -0
  72. package/dist/channels/connections.controller.d.ts +1 -1
  73. package/dist/channels/connections.controller.js +11 -6
  74. package/dist/channels/connections.service.d.ts +43 -21
  75. package/dist/channels/connections.service.js +236 -131
  76. package/dist/channels/inbound.d.ts +34 -38
  77. package/dist/channels/inbound.js +107 -41
  78. package/dist/channels/job-ids.d.ts +10 -0
  79. package/dist/channels/job-ids.js +10 -0
  80. package/dist/channels/jobs.d.ts +85 -0
  81. package/dist/channels/jobs.js +157 -0
  82. package/dist/channels/outbound.d.ts +60 -82
  83. package/dist/channels/outbound.js +165 -193
  84. package/dist/channels/supervisor.d.ts +88 -46
  85. package/dist/channels/supervisor.js +230 -132
  86. package/dist/channels/threads.d.ts +29 -8
  87. package/dist/channels/threads.js +71 -13
  88. package/dist/channels/webhook.d.ts +20 -14
  89. package/dist/channels/webhook.js +51 -20
  90. package/dist/config/load.d.ts +3 -2
  91. package/dist/config/load.js +3 -2
  92. package/dist/config/nacos-source.js +11 -2
  93. package/dist/config/schema.d.ts +16 -1
  94. package/dist/config/schema.js +54 -7
  95. package/dist/conversations/access.d.ts +29 -0
  96. package/dist/conversations/access.js +86 -0
  97. package/dist/conversations/artifacts.d.ts +10 -10
  98. package/dist/conversations/artifacts.js +35 -9
  99. package/dist/conversations/attachments.controller.d.ts +1 -1
  100. package/dist/conversations/attachments.controller.js +8 -6
  101. package/dist/conversations/attachments.module.d.ts +7 -0
  102. package/dist/conversations/attachments.module.js +25 -0
  103. package/dist/conversations/attachments.service.d.ts +30 -22
  104. package/dist/conversations/attachments.service.js +119 -46
  105. package/dist/conversations/conversations.controller.d.ts +8 -7
  106. package/dist/conversations/conversations.controller.js +59 -29
  107. package/dist/conversations/conversations.module.d.ts +8 -0
  108. package/dist/conversations/conversations.module.js +69 -0
  109. package/dist/conversations/conversations.service.d.ts +40 -38
  110. package/dist/conversations/conversations.service.js +130 -140
  111. package/dist/conversations/event-log.d.ts +28 -18
  112. package/dist/conversations/event-log.js +74 -27
  113. package/dist/conversations/files.d.ts +10 -10
  114. package/dist/conversations/files.js +37 -11
  115. package/dist/conversations/idem-keys.d.ts +5 -0
  116. package/dist/conversations/idem-keys.js +5 -0
  117. package/dist/conversations/job-ids.d.ts +6 -0
  118. package/dist/conversations/job-ids.js +6 -0
  119. package/dist/conversations/outputs-read.d.ts +11 -11
  120. package/dist/conversations/outputs-read.js +31 -7
  121. package/dist/conversations/queue.d.ts +48 -56
  122. package/dist/conversations/queue.js +13 -289
  123. package/dist/conversations/queue.service.d.ts +60 -0
  124. package/dist/conversations/queue.service.js +343 -0
  125. package/dist/conversations/sandbox-status.d.ts +13 -10
  126. package/dist/conversations/sandbox-status.js +36 -8
  127. package/dist/conversations/titles.d.ts +71 -24
  128. package/dist/conversations/titles.js +159 -62
  129. package/dist/ctx/bus.js +9 -3
  130. package/dist/ctx/create-ctx.d.ts +6 -0
  131. package/dist/ctx/create-ctx.js +7 -9
  132. package/dist/ctx/lock.d.ts +7 -3
  133. package/dist/ctx/lock.js +9 -20
  134. package/dist/ctx/queue.js +3 -2
  135. package/dist/ctx/secrets.d.ts +10 -2
  136. package/dist/ctx/secrets.js +7 -3
  137. package/dist/db/kernel-schema.d.ts +2 -2
  138. package/dist/db/pool.d.ts +5 -0
  139. package/dist/db/pool.js +1 -0
  140. package/dist/errors.d.ts +2 -0
  141. package/dist/errors.js +2 -0
  142. package/dist/evals/budget.d.ts +42 -21
  143. package/dist/evals/budget.js +114 -62
  144. package/dist/evals/evals.module.d.ts +31 -0
  145. package/dist/evals/evals.module.js +114 -0
  146. package/dist/evals/jobs.d.ts +20 -0
  147. package/dist/evals/jobs.js +45 -0
  148. package/dist/evals/run-replay.d.ts +56 -8
  149. package/dist/evals/run-replay.js +140 -80
  150. package/dist/evals/runs.controller.d.ts +1 -1
  151. package/dist/evals/runs.controller.js +17 -8
  152. package/dist/evals/runs.service.d.ts +23 -45
  153. package/dist/evals/runs.service.js +245 -234
  154. package/dist/evals/sets.controller.d.ts +1 -1
  155. package/dist/evals/sets.controller.js +17 -8
  156. package/dist/evals/sets.service.d.ts +22 -6
  157. package/dist/evals/sets.service.js +248 -194
  158. package/dist/evals/snapshot.d.ts +2 -2
  159. package/dist/evals/step-replay.d.ts +2 -2
  160. package/dist/evals/step-replay.js +1 -1
  161. package/dist/evals/trajectory.controller.d.ts +1 -1
  162. package/dist/evals/trajectory.controller.js +11 -7
  163. package/dist/evals/trajectory.service.d.ts +5 -4
  164. package/dist/evals/trajectory.service.js +30 -7
  165. package/dist/evals/worker.d.ts +44 -27
  166. package/dist/evals/worker.js +220 -120
  167. package/dist/extensions/admin-ops.d.ts +61 -33
  168. package/dist/extensions/admin-ops.js +248 -154
  169. package/dist/extensions/admin-view.d.ts +38 -27
  170. package/dist/extensions/admin-view.js +126 -55
  171. package/dist/extensions/approvals.d.ts +12 -8
  172. package/dist/extensions/approvals.js +73 -46
  173. package/dist/extensions/blobs.d.ts +27 -10
  174. package/dist/extensions/blobs.js +111 -45
  175. package/dist/extensions/bootstrap.d.ts +96 -42
  176. package/dist/extensions/bootstrap.js +303 -155
  177. package/dist/extensions/cli.d.ts +20 -10
  178. package/dist/extensions/cli.js +41 -96
  179. package/dist/extensions/config-issues.d.ts +7 -0
  180. package/dist/extensions/config-issues.js +31 -0
  181. package/dist/extensions/deployment-config-store.d.ts +49 -0
  182. package/dist/extensions/deployment-config-store.js +133 -0
  183. package/dist/extensions/deployment-config.d.ts +58 -67
  184. package/dist/extensions/deployment-config.js +202 -230
  185. package/dist/extensions/enabled.d.ts +5 -5
  186. package/dist/extensions/extensions.module.d.ts +8 -0
  187. package/dist/extensions/extensions.module.js +77 -0
  188. package/dist/extensions/hooks.d.ts +3 -2
  189. package/dist/extensions/hooks.js +1 -1
  190. package/dist/extensions/host.d.ts +72 -68
  191. package/dist/extensions/host.js +191 -152
  192. package/dist/extensions/installs.d.ts +49 -16
  193. package/dist/extensions/installs.js +128 -32
  194. package/dist/extensions/job-ids.d.ts +6 -0
  195. package/dist/extensions/job-ids.js +6 -0
  196. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  197. package/dist/extensions/lifecycle-topics.js +18 -0
  198. package/dist/extensions/lifecycle.d.ts +35 -47
  199. package/dist/extensions/lifecycle.js +103 -39
  200. package/dist/extensions/locks.d.ts +33 -0
  201. package/dist/extensions/locks.js +86 -0
  202. package/dist/extensions/migrate-lock.d.ts +3 -4
  203. package/dist/extensions/org-config.controller.d.ts +1 -1
  204. package/dist/extensions/org-config.controller.js +8 -5
  205. package/dist/extensions/org-config.d.ts +48 -46
  206. package/dist/extensions/org-config.js +284 -226
  207. package/dist/extensions/registry.d.ts +50 -2
  208. package/dist/extensions/registry.js +89 -4
  209. package/dist/extensions/sources.d.ts +12 -8
  210. package/dist/extensions/sources.js +34 -13
  211. package/dist/files/files.module.d.ts +3 -0
  212. package/dist/files/files.module.js +22 -0
  213. package/dist/files/previewers.controller.d.ts +7 -2
  214. package/dist/files/previewers.controller.js +17 -9
  215. package/dist/files/previewers.d.ts +13 -18
  216. package/dist/files/previewers.js +83 -36
  217. package/dist/http/adapter.d.ts +3 -0
  218. package/dist/http/adapter.js +25 -0
  219. package/dist/http/api.module.d.ts +3 -110
  220. package/dist/http/api.module.js +47 -355
  221. package/dist/http/app.d.ts +11 -15
  222. package/dist/http/app.js +52 -47
  223. package/dist/http/error-filter.module.d.ts +5 -0
  224. package/dist/http/error-filter.module.js +18 -0
  225. package/dist/http/error.filter.js +2 -2
  226. package/dist/identity/accounts.d.ts +82 -29
  227. package/dist/identity/accounts.js +294 -175
  228. package/dist/identity/api-tokens.d.ts +11 -7
  229. package/dist/identity/api-tokens.js +71 -44
  230. package/dist/identity/audit.d.ts +7 -4
  231. package/dist/identity/audit.js +5 -1
  232. package/dist/identity/auth.controller.d.ts +11 -10
  233. package/dist/identity/auth.controller.js +31 -25
  234. package/dist/identity/auth.guard.d.ts +3 -3
  235. package/dist/identity/auth.guard.js +6 -4
  236. package/dist/identity/binding.d.ts +9 -11
  237. package/dist/identity/binding.js +41 -13
  238. package/dist/identity/enterprise-admin.d.ts +18 -12
  239. package/dist/identity/enterprise-admin.js +67 -13
  240. package/dist/identity/external-identity-lock.d.ts +17 -0
  241. package/dist/identity/external-identity-lock.js +39 -0
  242. package/dist/identity/external.d.ts +19 -15
  243. package/dist/identity/external.js +163 -125
  244. package/dist/identity/identity.module.d.ts +6 -0
  245. package/dist/identity/identity.module.js +56 -0
  246. package/dist/identity/me.controller.d.ts +16 -15
  247. package/dist/identity/me.controller.js +37 -31
  248. package/dist/identity/sessions.d.ts +12 -10
  249. package/dist/identity/sessions.js +74 -42
  250. package/dist/identity/settings.d.ts +20 -14
  251. package/dist/identity/settings.js +85 -57
  252. package/dist/identity/sso.controller.d.ts +7 -7
  253. package/dist/identity/sso.controller.js +13 -9
  254. package/dist/identity/sso.d.ts +9 -12
  255. package/dist/identity/sso.js +54 -24
  256. package/dist/inbox/inbox.module.d.ts +3 -0
  257. package/dist/inbox/inbox.module.js +22 -0
  258. package/dist/inbox/inbox.service.d.ts +7 -9
  259. package/dist/inbox/inbox.service.js +32 -11
  260. package/dist/index.d.ts +19 -12
  261. package/dist/index.js +13 -8
  262. package/dist/infra/cache/cache.module.d.ts +3 -0
  263. package/dist/infra/cache/cache.module.js +16 -0
  264. package/dist/infra/cache/cache.service.d.ts +21 -0
  265. package/dist/infra/cache/cache.service.js +80 -0
  266. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  267. package/dist/infra/cache/cacheable.decorator.js +83 -0
  268. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  269. package/dist/infra/cli/kernel-cli.module.js +165 -0
  270. package/dist/infra/close-within.d.ts +15 -0
  271. package/dist/infra/close-within.js +36 -0
  272. package/dist/infra/config/config.module.d.ts +13 -0
  273. package/dist/infra/config/config.module.js +39 -0
  274. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  275. package/dist/infra/config/kernel-config.service.js +126 -0
  276. package/dist/infra/database/after-commit.d.ts +6 -0
  277. package/dist/infra/database/after-commit.js +9 -0
  278. package/dist/infra/database/database.module.d.ts +25 -0
  279. package/dist/infra/database/database.module.js +90 -0
  280. package/dist/infra/database/kernel-db.d.ts +22 -0
  281. package/dist/infra/database/kernel-db.js +65 -0
  282. package/dist/infra/database/transaction-host.d.ts +50 -0
  283. package/dist/infra/database/transaction-host.js +125 -0
  284. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  285. package/dist/infra/database/transactional.decorator.js +27 -0
  286. package/dist/infra/database/xact-lock.d.ts +17 -0
  287. package/dist/infra/database/xact-lock.js +43 -0
  288. package/dist/infra/events/kernel-events.d.ts +96 -0
  289. package/dist/infra/events/kernel-events.js +65 -0
  290. package/dist/infra/health/health.controller.d.ts +26 -0
  291. package/dist/infra/health/health.controller.js +104 -0
  292. package/dist/infra/health/health.module.d.ts +9 -0
  293. package/dist/infra/health/health.module.js +24 -0
  294. package/dist/infra/health/health.options.d.ts +10 -0
  295. package/dist/infra/health/health.options.js +15 -0
  296. package/dist/infra/health/shutdown-state.d.ts +6 -0
  297. package/dist/infra/health/shutdown-state.js +2 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  300. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  301. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  302. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  303. package/dist/infra/lifecycle/process-guards.js +86 -0
  304. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  305. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  306. package/dist/infra/lock/key-template.d.ts +13 -0
  307. package/dist/infra/lock/key-template.js +46 -0
  308. package/dist/infra/lock/lock.module.d.ts +3 -0
  309. package/dist/infra/lock/lock.module.js +16 -0
  310. package/dist/infra/lock/lock.service.d.ts +120 -0
  311. package/dist/infra/lock/lock.service.js +343 -0
  312. package/dist/infra/lock/shared-lease.d.ts +44 -0
  313. package/dist/infra/lock/shared-lease.js +121 -0
  314. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  315. package/dist/infra/lock/with-lock.decorator.js +49 -0
  316. package/dist/infra/logging/logging.module.d.ts +16 -0
  317. package/dist/infra/logging/logging.module.js +34 -0
  318. package/dist/infra/queue/configured-processor.d.ts +18 -0
  319. package/dist/infra/queue/configured-processor.js +23 -0
  320. package/dist/infra/queue/job-failure.d.ts +18 -0
  321. package/dist/infra/queue/job-failure.js +26 -0
  322. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  323. package/dist/infra/queue/queue-shutdown.js +81 -0
  324. package/dist/infra/queue/queue.module.d.ts +16 -0
  325. package/dist/infra/queue/queue.module.js +61 -0
  326. package/dist/infra/queue/redis-connection.d.ts +7 -0
  327. package/dist/infra/queue/redis-connection.js +18 -0
  328. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  329. package/dist/infra/queue/retired-schedulers.js +9 -0
  330. package/dist/infra/queue/run-job.d.ts +16 -0
  331. package/dist/infra/queue/run-job.js +19 -0
  332. package/dist/infra/redis/redis.module.d.ts +24 -0
  333. package/dist/infra/redis/redis.module.js +87 -0
  334. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  335. package/dist/infra/schedule/cron-tick.js +25 -0
  336. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  337. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  338. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  339. package/dist/infra/schedule/locked-interval.js +190 -0
  340. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  341. package/dist/infra/schedule/locked-tick.js +137 -0
  342. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  343. package/dist/infra/schedule/schedule.module.js +27 -0
  344. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  345. package/dist/infra/schedule/scheduled-runs.js +163 -0
  346. package/dist/infra/swagger/swagger.d.ts +16 -0
  347. package/dist/infra/swagger/swagger.js +31 -0
  348. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  349. package/dist/infra/throttler/credential-throttler.js +77 -0
  350. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  351. package/dist/infra/throttler/named-throttlers.js +119 -0
  352. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  353. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  354. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  355. package/dist/infra/throttler/throttler.guard.js +68 -0
  356. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  357. package/dist/infra/throttler/throttler.module.js +53 -0
  358. package/dist/infra/tokens.d.ts +15 -0
  359. package/dist/infra/tokens.js +15 -0
  360. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  361. package/dist/infra/validation/create-zod-dto.js +35 -0
  362. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  363. package/dist/infra/validation/parse-with-zod.js +12 -0
  364. package/dist/infra/validation/validation.module.d.ts +3 -0
  365. package/dist/infra/validation/validation.module.js +16 -0
  366. package/dist/infra/validation/zod-params.d.ts +7 -0
  367. package/dist/infra/validation/zod-params.js +42 -0
  368. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  369. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  370. package/dist/kernel.d.ts +9 -241
  371. package/dist/kernel.js +8 -1305
  372. package/dist/kernel.module.d.ts +17 -0
  373. package/dist/kernel.module.js +136 -0
  374. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  375. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  376. package/dist/lifecycle/tokens.d.ts +3 -0
  377. package/dist/lifecycle/tokens.js +3 -0
  378. package/dist/log-config.d.ts +9 -0
  379. package/dist/log-config.js +27 -0
  380. package/dist/log-context.d.ts +34 -0
  381. package/dist/log-context.js +44 -0
  382. package/dist/log-loki.d.ts +34 -0
  383. package/dist/log-loki.js +145 -0
  384. package/dist/log.d.ts +41 -10
  385. package/dist/log.js +91 -17
  386. package/dist/models/models.module.d.ts +3 -0
  387. package/dist/models/models.module.js +24 -0
  388. package/dist/models/prices.d.ts +8 -2
  389. package/dist/models/prices.js +65 -37
  390. package/dist/models/purposes.controller.d.ts +1 -1
  391. package/dist/models/purposes.controller.js +5 -6
  392. package/dist/models/purposes.d.ts +35 -13
  393. package/dist/models/purposes.js +101 -51
  394. package/dist/net/public-address.js +3 -2
  395. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  396. package/dist/orgs/directory-sync.controller.js +2 -2
  397. package/dist/orgs/directory-sync.d.ts +61 -31
  398. package/dist/orgs/directory-sync.js +212 -125
  399. package/dist/orgs/invitations.controller.d.ts +8 -8
  400. package/dist/orgs/invitations.controller.js +27 -26
  401. package/dist/orgs/invitations.service.d.ts +12 -9
  402. package/dist/orgs/invitations.service.js +130 -92
  403. package/dist/orgs/job-ids.d.ts +8 -0
  404. package/dist/orgs/job-ids.js +8 -0
  405. package/dist/orgs/members.service.d.ts +19 -12
  406. package/dist/orgs/members.service.js +161 -117
  407. package/dist/orgs/offboarding.d.ts +54 -57
  408. package/dist/orgs/offboarding.js +161 -71
  409. package/dist/orgs/org-lock.d.ts +28 -19
  410. package/dist/orgs/org-lock.js +81 -35
  411. package/dist/orgs/org.guard.d.ts +1 -1
  412. package/dist/orgs/org.guard.js +2 -2
  413. package/dist/orgs/orgs.controller.d.ts +13 -13
  414. package/dist/orgs/orgs.controller.js +29 -17
  415. package/dist/orgs/orgs.module.d.ts +6 -0
  416. package/dist/orgs/orgs.module.js +68 -0
  417. package/dist/orgs/orgs.service.d.ts +30 -19
  418. package/dist/orgs/orgs.service.js +139 -86
  419. package/dist/orgs/settings.controller.d.ts +1 -1
  420. package/dist/orgs/settings.controller.js +8 -6
  421. package/dist/orgs/settings.service.d.ts +14 -8
  422. package/dist/orgs/settings.service.js +75 -46
  423. package/dist/overrides.d.ts +56 -0
  424. package/dist/overrides.js +30 -0
  425. package/dist/roles/gateway-role.d.ts +43 -0
  426. package/dist/roles/gateway-role.js +98 -0
  427. package/dist/roles/gateway.module.d.ts +8 -0
  428. package/dist/roles/gateway.module.js +28 -0
  429. package/dist/roles/worker-role.d.ts +63 -0
  430. package/dist/roles/worker-role.js +144 -0
  431. package/dist/roles/worker.module.d.ts +14 -0
  432. package/dist/roles/worker.module.js +90 -0
  433. package/dist/runtime/abort.js +19 -2
  434. package/dist/runtime/checkpointer.d.ts +8 -3
  435. package/dist/runtime/checkpointer.js +87 -55
  436. package/dist/runtime/conversation-lock.d.ts +20 -11
  437. package/dist/runtime/conversation-lock.js +62 -72
  438. package/dist/runtime/hook-calls.d.ts +3 -3
  439. package/dist/runtime/hook-calls.js +1 -6
  440. package/dist/runtime/job-ids.d.ts +10 -0
  441. package/dist/runtime/job-ids.js +10 -0
  442. package/dist/runtime/langgraph-loop.js +1 -1
  443. package/dist/runtime/loop.d.ts +7 -0
  444. package/dist/runtime/loop.js +14 -0
  445. package/dist/runtime/maintenance-queue.d.ts +10 -0
  446. package/dist/runtime/maintenance-queue.js +10 -0
  447. package/dist/runtime/maintenance.d.ts +45 -74
  448. package/dist/runtime/maintenance.js +139 -136
  449. package/dist/runtime/model-call.d.ts +7 -4
  450. package/dist/runtime/model-call.js +24 -57
  451. package/dist/runtime/providers.d.ts +17 -6
  452. package/dist/runtime/providers.js +66 -25
  453. package/dist/runtime/quota.d.ts +17 -3
  454. package/dist/runtime/quota.js +27 -2
  455. package/dist/runtime/retired-schedulers.d.ts +7 -0
  456. package/dist/runtime/retired-schedulers.js +31 -0
  457. package/dist/runtime/run-control.d.ts +33 -0
  458. package/dist/runtime/run-control.js +77 -0
  459. package/dist/runtime/run-finish.d.ts +26 -17
  460. package/dist/runtime/run-finish.js +98 -51
  461. package/dist/runtime/run-jobs.d.ts +48 -0
  462. package/dist/runtime/run-jobs.js +95 -0
  463. package/dist/runtime/run-processors.d.ts +60 -0
  464. package/dist/runtime/run-processors.js +185 -0
  465. package/dist/runtime/run-queue.d.ts +32 -57
  466. package/dist/runtime/run-queue.js +291 -295
  467. package/dist/runtime/run-steps.d.ts +39 -0
  468. package/dist/runtime/run-steps.js +96 -0
  469. package/dist/runtime/run-worker.d.ts +121 -75
  470. package/dist/runtime/run-worker.js +340 -225
  471. package/dist/runtime/runtime.module.d.ts +10 -0
  472. package/dist/runtime/runtime.module.js +112 -0
  473. package/dist/runtime/step-log.d.ts +40 -0
  474. package/dist/runtime/step-log.js +94 -0
  475. package/dist/runtime/stream.controller.d.ts +5 -8
  476. package/dist/runtime/stream.controller.js +14 -12
  477. package/dist/runtime/stream.d.ts +24 -6
  478. package/dist/runtime/stream.js +78 -7
  479. package/dist/runtime/subagents/child.d.ts +3 -44
  480. package/dist/runtime/subagents/child.js +0 -79
  481. package/dist/runtime/subagents/definition.d.ts +4 -4
  482. package/dist/runtime/subagents/definition.js +2 -2
  483. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  484. package/dist/runtime/subagents/dispatch.js +135 -140
  485. package/dist/runtime/subagents/limits.d.ts +9 -4
  486. package/dist/runtime/subagents/limits.js +4 -2
  487. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  488. package/dist/runtime/subagents/org-agents.js +1 -1
  489. package/dist/runtime/subagents/progress.d.ts +2 -2
  490. package/dist/runtime/subagents/roster.d.ts +3 -3
  491. package/dist/runtime/subagents/roster.js +1 -1
  492. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  493. package/dist/runtime/subagents/skill-fork.js +16 -5
  494. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  495. package/dist/runtime/subagents/subagents.service.js +101 -0
  496. package/dist/runtime/usage-report.d.ts +94 -52
  497. package/dist/runtime/usage-report.js +200 -99
  498. package/dist/runtime/waits.d.ts +125 -57
  499. package/dist/runtime/waits.js +431 -208
  500. package/dist/sandbox/job-ids.d.ts +10 -0
  501. package/dist/sandbox/job-ids.js +10 -0
  502. package/dist/sandbox/jobs.d.ts +41 -0
  503. package/dist/sandbox/jobs.js +113 -0
  504. package/dist/sandbox/leases.d.ts +39 -31
  505. package/dist/sandbox/leases.js +117 -257
  506. package/dist/sandbox/providers.d.ts +19 -0
  507. package/dist/sandbox/providers.js +38 -0
  508. package/dist/sandbox/sandbox.module.d.ts +8 -0
  509. package/dist/sandbox/sandbox.module.js +30 -0
  510. package/dist/sandbox/sandbox.service.d.ts +24 -29
  511. package/dist/sandbox/sandbox.service.js +106 -75
  512. package/dist/skills/catalog.d.ts +33 -20
  513. package/dist/skills/catalog.js +96 -53
  514. package/dist/skills/changes.controller.d.ts +4 -4
  515. package/dist/skills/changes.controller.js +15 -9
  516. package/dist/skills/changes.service.d.ts +28 -18
  517. package/dist/skills/changes.service.js +421 -364
  518. package/dist/skills/invocable.controller.d.ts +1 -1
  519. package/dist/skills/invocable.controller.js +8 -5
  520. package/dist/skills/invoke.d.ts +16 -15
  521. package/dist/skills/invoke.js +48 -17
  522. package/dist/skills/skills.controller.d.ts +1 -1
  523. package/dist/skills/skills.controller.js +11 -6
  524. package/dist/skills/skills.module.d.ts +6 -0
  525. package/dist/skills/skills.module.js +30 -0
  526. package/dist/skills/skills.service.d.ts +47 -30
  527. package/dist/skills/skills.service.js +221 -158
  528. package/dist/storage/job-ids.d.ts +6 -0
  529. package/dist/storage/job-ids.js +6 -0
  530. package/dist/storage/purge.d.ts +22 -7
  531. package/dist/storage/purge.js +55 -3
  532. package/dist/storage/storage.module.d.ts +6 -0
  533. package/dist/storage/storage.module.js +23 -0
  534. package/dist/storage/storage.service.d.ts +18 -4
  535. package/dist/storage/storage.service.js +44 -3
  536. package/dist/tools/approvals.controller.d.ts +1 -1
  537. package/dist/tools/approvals.controller.js +12 -8
  538. package/dist/tools/approvals.service.d.ts +27 -25
  539. package/dist/tools/approvals.service.js +324 -258
  540. package/dist/tools/breaker.d.ts +2 -2
  541. package/dist/tools/breaker.js +21 -3
  542. package/dist/tools/builtins/ask-user.d.ts +2 -2
  543. package/dist/tools/builtins/ask-user.js +1 -1
  544. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  545. package/dist/tools/builtins/builtin-tools.js +80 -0
  546. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  547. package/dist/tools/builtins/read-tool-output.js +1 -1
  548. package/dist/tools/builtins/sandbox/bash.js +2 -2
  549. package/dist/tools/builtins/sandbox/common.d.ts +7 -4
  550. package/dist/tools/builtins/sandbox/common.js +5 -3
  551. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  552. package/dist/tools/builtins/sandbox/edit.js +1 -1
  553. package/dist/tools/builtins/sandbox/glob.js +2 -2
  554. package/dist/tools/builtins/sandbox/grep.js +2 -2
  555. package/dist/tools/builtins/sandbox/read.js +1 -1
  556. package/dist/tools/builtins/sandbox/write.js +1 -1
  557. package/dist/tools/builtins/skill-load.d.ts +3 -3
  558. package/dist/tools/builtins/skill-load.js +1 -1
  559. package/dist/tools/canonical-json.d.ts +6 -0
  560. package/dist/tools/canonical-json.js +16 -0
  561. package/dist/tools/connector-content.controller.d.ts +1 -1
  562. package/dist/tools/connector-content.controller.js +11 -6
  563. package/dist/tools/connector-content.d.ts +12 -15
  564. package/dist/tools/connector-content.js +53 -18
  565. package/dist/tools/connectors.controller.d.ts +1 -1
  566. package/dist/tools/connectors.controller.js +21 -10
  567. package/dist/tools/connectors.service.d.ts +31 -13
  568. package/dist/tools/connectors.service.js +434 -344
  569. package/dist/tools/credentials.d.ts +17 -20
  570. package/dist/tools/credentials.js +55 -34
  571. package/dist/tools/drift.d.ts +29 -41
  572. package/dist/tools/drift.js +111 -79
  573. package/dist/tools/info.d.ts +12 -9
  574. package/dist/tools/info.js +33 -7
  575. package/dist/tools/job-ids.d.ts +13 -0
  576. package/dist/tools/job-ids.js +15 -0
  577. package/dist/tools/jobs.d.ts +24 -0
  578. package/dist/tools/jobs.js +69 -0
  579. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  580. package/dist/tools/oauth/flow-paths.js +38 -0
  581. package/dist/tools/oauth/flow.d.ts +30 -30
  582. package/dist/tools/oauth/flow.js +109 -81
  583. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  584. package/dist/tools/oauth/oauth.controller.js +12 -9
  585. package/dist/tools/oauth/tokens.d.ts +11 -3
  586. package/dist/tools/oauth/tokens.js +15 -14
  587. package/dist/tools/outputs.d.ts +13 -4
  588. package/dist/tools/outputs.js +47 -3
  589. package/dist/tools/pipeline.d.ts +62 -46
  590. package/dist/tools/pipeline.js +145 -64
  591. package/dist/tools/policy.d.ts +2 -2
  592. package/dist/tools/questions.controller.d.ts +1 -1
  593. package/dist/tools/questions.controller.js +8 -5
  594. package/dist/tools/questions.service.d.ts +25 -24
  595. package/dist/tools/questions.service.js +201 -142
  596. package/dist/tools/registry.d.ts +30 -20
  597. package/dist/tools/registry.js +73 -37
  598. package/dist/tools/specs.d.ts +5 -4
  599. package/dist/tools/specs.js +3 -1
  600. package/dist/tools/tools.module.d.ts +10 -0
  601. package/dist/tools/tools.module.js +91 -0
  602. package/dist/ui/call-extension.d.ts +16 -0
  603. package/dist/ui/call-extension.js +38 -0
  604. package/dist/ui/embed-token.d.ts +9 -5
  605. package/dist/ui/embed-token.js +34 -6
  606. package/dist/ui/ui-stream.d.ts +22 -17
  607. package/dist/ui/ui-stream.js +72 -12
  608. package/dist/ui/ui.module.d.ts +7 -0
  609. package/dist/ui/ui.module.js +28 -0
  610. package/dist/ui/views.controller.d.ts +14 -12
  611. package/dist/ui/views.controller.js +32 -25
  612. package/dist/ui/views.d.ts +9 -57
  613. package/dist/ui/views.js +43 -45
  614. package/package.json +11 -2
  615. package/dist/http/health.controller.d.ts +0 -26
  616. package/dist/http/health.controller.js +0 -79
  617. package/dist/http/tokens.d.ts +0 -131
  618. package/dist/http/tokens.js +0 -131
  619. package/dist/http/zod.pipe.d.ts +0 -8
  620. package/dist/http/zod.pipe.js +0 -14
  621. package/dist/identity/rate-limit.d.ts +0 -55
  622. package/dist/identity/rate-limit.js +0 -121
  623. package/dist/sandbox/lifecycle.d.ts +0 -21
  624. package/dist/sandbox/lifecycle.js +0 -68
  625. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  626. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,18 +1,40 @@
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 { randomUUID } from "node:crypto";
2
11
  import { DIRECTORY_EXTENSION_POINT, } from "@capybara-hq/plugin-sdk";
12
+ import { getQueueToken } from "@nestjs/bullmq";
13
+ import { Inject, Injectable } from "@nestjs/common";
3
14
  import { ApiError } from "../errors.js";
4
15
  import { enabledExtensionsByOrg } from "../extensions/enabled.js";
16
+ import { OrgExtensionConfigs } from "../extensions/org-config.js";
17
+ import { ExtensionRegistry } from "../extensions/registry.js";
5
18
  import { audit } from "../identity/audit.js";
6
- import { ConversationLock } from "../runtime/conversation-lock.js";
7
- import { lockOrgAndAuthorize, tryLockOrg } from "./org-lock.js";
8
- /** 每小时扫描:维护队列任务名、job scheduler id(不含 `:`)与周期。 */
19
+ import { ExternalIdentities } from "../identity/external.js";
20
+ import { afterCommit } from "../infra/database/after-commit.js";
21
+ import { KernelDb } from "../infra/database/kernel-db.js";
22
+ import { TransactionHost } from "../infra/database/transaction-host.js";
23
+ import { Transactional } from "../infra/database/transactional.decorator.js";
24
+ import { LockService } from "../infra/lock/lock.service.js";
25
+ import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
26
+ import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
27
+ import { MAINTENANCE_QUEUE_NAME } from "../runtime/maintenance-queue.js";
28
+ import { Offboarding } from "./offboarding.js";
29
+ import { OrgLock } from "./org-lock.js";
30
+ /** The hourly scan: cron job name (no `:`). */
9
31
  export const DIRECTORY_SCAN_JOB = "directory-scan";
10
- export const DIRECTORY_SCAN_SCHEDULER_ID = "directory-scan-hourly";
11
- export const DIRECTORY_SCAN_EVERY_MS = 3_600_000;
12
- /** 一次 (组织, 插件) 同步的维护任务名。 */
32
+ /** The job name of one (org, extension) sync on the maintenance queue. */
13
33
  export const DIRECTORY_SYNC_JOB = "directory-sync";
14
- /** 同步锁的 Redis 键前缀(键为 `<前缀><orgId>:<plugin>`,带 TTL、持有期间续租)。 */
15
- export const DIRECTORY_SYNC_LOCK_PREFIX = "capk:directory-sync:";
34
+ /** The run lock's TTL (renewed while held); a crashed holder's lock expires within it. */
35
+ export const DIRECTORY_SYNC_LOCK_TTL_MS = 30_000;
36
+ /** The `LockService` key of one (org, extension) sync: one sync at a time. */
37
+ export const directorySyncLockKey = (orgId, plugin) => `directory-sync:${orgId}:${plugin}`;
16
38
  /** 脏标记的保留时长(秒):锁被占时记下,持有者跑完后取走并补一轮。 */
17
39
  export const DIRECTORY_SYNC_DIRTY_TTL_SECONDS = 3_600;
18
40
  /** 脏标记(Redis 键):同步进行中又有同步请求被锁挡掉。 */
@@ -66,10 +88,14 @@ class OrgGone extends Error {
66
88
  *
67
89
  * - 维护队列每小时 `directory-scan`:给每个「插件提供 `directory@1`、在该组织启用、组织级配置满足 schema」的
68
90
  * (组织, 插件) 投递一次同步(job id 按小时桶去重,多副本重复扫描只跑一次);手动与 `directory_changed` 也投递同步。
69
- * - 同一 (组织, 插件) 同时只跑一个同步(Redis 锁 `capk:directory-sync:<org>:<plugin>`,持有期间续租);
70
- * 锁被占时本任务记下脏标记 `capk:directory-sync-dirty:<org>:<plugin>`(1 小时)后结束;持有者释放锁后 GETDEL
71
- * 取走标记,有就投递一次 changed 同步(在跑的那一轮可能已经读过变化之前的页)。Ruling A32:移除阶段前 GET
72
- * (不取走)脏标记,有就本轮按不完整处理、不移除任何人(审计 `partialReason = changed_during_sync`),移除留给补跑。
91
+ * - One sync at a time per (org, extension): the `LockService` lock
92
+ * `lock:directory-sync:<org>:<plugin>`, renewed while held. A sync that finds the lock taken sets
93
+ * the dirty flag `capk:directory-sync-dirty:<org>:<plugin>` (1 hour) and ends; after releasing
94
+ * the lock the holder takes the flag with GETDEL and, if it was set, enqueues one `changed` sync
95
+ * (the running round may have read pages from before the change). Ruling A32: before the removal
96
+ * phase the holder GETs the flag (without taking it); if it is set, the round counts as
97
+ * incomplete and removes nobody (audit `partialReason = changed_during_sync`), leaving removals
98
+ * to the follow-up sync.
73
99
  * After writing the flag, a blocked sync tries the lock once more: when the holder finished in
74
100
  * between (and its GETDEL found no flag), this sync clears the flag and runs itself.
75
101
  * - Ruling A17:非手动触发的一轮,计划移除数超过 `max(5, 20% × 现有通讯录成员数)`,或列表里没有在职成员而已有
@@ -86,42 +112,50 @@ class OrgGone extends Error {
86
112
  * 能力)时,扫描、`directory_changed` 与执行时的复核都静默跳过(不投递、不审计、不记警告),手动触发 409
87
113
  * `directory.not_configured`。
88
114
  * - 审计 `org.directory.synced`(计数、是否不完整)。任务执行时再核对插件与配置:已停用的插件的陈旧任务什么都不做。
115
+ *
116
+ * The hourly scan is {@link DirectoryScanJob} (a `@LockedCron`); one-off syncs are jobs on the maintenance queue (same name and
117
+ * job ids as before), consumed by `MaintenanceProcessor`.
89
118
  */
90
- export class DirectorySync {
91
- d;
92
- lock;
93
- constructor(d) {
94
- this.d = d;
95
- this.lock = new ConversationLock(d.redis, d.log, DIRECTORY_SYNC_LOCK_PREFIX);
96
- const m = d.maintenance;
97
- if (m) {
98
- m.schedule({
99
- id: DIRECTORY_SCAN_SCHEDULER_ID,
100
- name: DIRECTORY_SCAN_JOB,
101
- everyMs: () => DIRECTORY_SCAN_EVERY_MS,
102
- });
103
- m.handle(DIRECTORY_SCAN_JOB, async () => {
104
- const targets = await this.scan();
105
- if (targets.length > 0)
106
- d.log.info("directory syncs enqueued", { count: targets.length });
107
- });
108
- m.handle(DIRECTORY_SYNC_JOB, async (job) => {
109
- const data = job.data;
110
- const r = await this.sync(data.orgId, data.plugin, data);
111
- // 通讯录未配置(Ruling A28)静默跳过
112
- if (r.status === "skipped" && r.reason !== "not_configured") {
113
- d.log.info("directory sync skipped", {
114
- orgId: data.orgId,
115
- plugin: data.plugin,
116
- reason: r.reason,
117
- });
118
- }
119
+ let DirectorySync = class DirectorySync {
120
+ db;
121
+ txHost;
122
+ redis;
123
+ registry;
124
+ orgConfigs;
125
+ external;
126
+ offboarding;
127
+ orgLock;
128
+ queue;
129
+ lockService;
130
+ log;
131
+ constructor(db, txHost, redis, registry, orgConfigs, external, offboarding, orgLock, queue, lockService, log) {
132
+ this.db = db;
133
+ this.txHost = txHost;
134
+ this.redis = redis;
135
+ this.registry = registry;
136
+ this.orgConfigs = orgConfigs;
137
+ this.external = external;
138
+ this.offboarding = offboarding;
139
+ this.orgLock = orgLock;
140
+ this.queue = queue;
141
+ this.lockService = lockService;
142
+ this.log = log;
143
+ }
144
+ /** A `directory-sync` job (dispatched by `MaintenanceProcessor`). */
145
+ async runSyncJob(data) {
146
+ const r = await this.sync(data.orgId, data.plugin, data);
147
+ // 通讯录未配置(Ruling A28)静默跳过
148
+ if (r.status === "skipped" && r.reason !== "not_configured") {
149
+ this.log.info("directory sync skipped", {
150
+ orgId: data.orgId,
151
+ plugin: data.plugin,
152
+ reason: r.reason,
119
153
  });
120
154
  }
121
155
  }
122
156
  /** 插件提供的 `directory@1`;未加载或不提供时 undefined。 */
123
157
  provider(plugin) {
124
- return this.d.host
158
+ return this.registry
125
159
  .list("directory")
126
160
  .find((e) => e.plugin === plugin && e.capability === DIRECTORY_EXTENSION_POINT)?.impl;
127
161
  }
@@ -130,7 +164,7 @@ export class DirectorySync {
130
164
  const directory = this.provider(plugin);
131
165
  if (!directory)
132
166
  return { ok: false, reason: "plugin_unavailable" };
133
- const org = await this.d.db
167
+ const org = await this.db
134
168
  .selectFrom("orgs")
135
169
  .select("id")
136
170
  .where("id", "=", orgId)
@@ -140,10 +174,10 @@ export class DirectorySync {
140
174
  return { ok: false, reason: "org_not_found" };
141
175
  let cfg;
142
176
  try {
143
- cfg = await this.d.orgExtensionConfigs.get(orgId, plugin);
177
+ cfg = await this.orgConfigs.get(orgId, plugin);
144
178
  }
145
179
  catch (err) {
146
- this.d.log.warn("directory sync: stored organization config is invalid", {
180
+ this.log.warn("directory sync: stored organization config is invalid", {
147
181
  orgId,
148
182
  plugin,
149
183
  err,
@@ -168,7 +202,7 @@ export class DirectorySync {
168
202
  }
169
203
  /**
170
204
  * 投递一次 `directory_changed` 同步(按分钟桶去重);返回 job id。入站 `directory_changed` 经
171
- * {@link DirectorySyncScheduler} 调用这里。通讯录未配置(`Directory.configured` 返回 false,Ruling A28)时
205
+ * `ChannelInbound`(`directory_changed`)调用这里。通讯录未配置(`Directory.configured` 返回 false,Ruling A28)时
172
206
  * 静默不投递,返回 undefined;其他不可同步的情况照常投递,由任务执行时跳过。
173
207
  */
174
208
  async enqueue(orgId, plugin, now = new Date()) {
@@ -178,9 +212,6 @@ export class DirectorySync {
178
212
  return this.addJob(orgId, plugin, "changed", directorySyncJobId(orgId, plugin, "changed", now));
179
213
  }
180
214
  async addJob(orgId, plugin, trigger, jobId, requestedBy) {
181
- const m = this.d.maintenance;
182
- if (!m)
183
- throw new Error("directory sync: maintenance queue is not available");
184
215
  if (jobId.includes(":"))
185
216
  throw new Error("directory sync: job id must not contain ':'");
186
217
  const data = {
@@ -190,8 +221,10 @@ export class DirectorySync {
190
221
  ...(requestedBy !== undefined && { requestedBy: requestedBy.accountId }),
191
222
  ...(requestedBy?.tokenId !== undefined && { requestedByToken: requestedBy.tokenId }),
192
223
  };
193
- await m.add(DIRECTORY_SYNC_JOB, data, {
224
+ await this.queue.add(DIRECTORY_SYNC_JOB, data, {
194
225
  jobId,
226
+ // the maintenance queue's jobs run once (no retry), as before
227
+ attempts: 1,
195
228
  removeOnComplete: { age: KEEP_COMPLETED_SECONDS[trigger] },
196
229
  removeOnFail: KEEP_FAILED,
197
230
  });
@@ -205,9 +238,7 @@ export class DirectorySync {
205
238
  * job with a unique id.
206
239
  */
207
240
  async request(orgId, plugin, actorAccountId, actorTokenId) {
208
- await this.d.db
209
- .transaction()
210
- .execute((t) => lockOrgAndAuthorize(t, orgId, actorAccountId, "org.members.manage"));
241
+ await this.authorize(orgId, actorAccountId);
211
242
  const e = await this.eligible(orgId, plugin);
212
243
  if (!e.ok) {
213
244
  switch (e.reason) {
@@ -226,19 +257,22 @@ export class DirectorySync {
226
257
  const jobId = await this.addJob(orgId, plugin, "manual", directorySyncJobId(orgId, plugin, "manual"), { accountId: actorAccountId, tokenId: actorTokenId });
227
258
  return { jobId };
228
259
  }
260
+ async authorize(orgId, actorAccountId) {
261
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.members.manage");
262
+ }
229
263
  /**
230
264
  * 每小时扫描:给每个可同步的 (组织, 插件) 投递一次同步(job id 按小时桶),返回投递的目标。
231
265
  * 已存配置不再满足 schema 的跳过(记 warn);单个投递失败记 warn、继续其他目标。
232
266
  */
233
267
  async scan(now = new Date()) {
234
- const plugins = this.d.host
268
+ const plugins = this.registry
235
269
  .list("directory")
236
270
  .filter((e) => e.capability === DIRECTORY_EXTENSION_POINT)
237
271
  .map((e) => e.plugin);
238
272
  if (plugins.length === 0)
239
273
  return [];
240
- const rows = await this.d.db
241
- .selectFrom(enabledExtensionsByOrg(this.d.db).as("en"))
274
+ const rows = await this.db
275
+ .selectFrom(enabledExtensionsByOrg(this.db.db).as("en"))
242
276
  .innerJoin("orgs", "orgs.id", "en.org_id")
243
277
  .select(["en.org_id", "en.plugin"])
244
278
  .where("orgs.deleted_at", "is", null)
@@ -256,7 +290,7 @@ export class DirectorySync {
256
290
  out.push({ orgId: r.org_id, plugin: r.plugin, jobId });
257
291
  }
258
292
  catch (err) {
259
- this.d.log.warn("cannot enqueue directory sync", {
293
+ this.log.warn("cannot enqueue directory sync", {
260
294
  orgId: r.org_id,
261
295
  plugin: r.plugin,
262
296
  err,
@@ -271,26 +305,26 @@ export class DirectorySync {
271
305
  if (!e.ok)
272
306
  return { status: "skipped", reason: e.reason };
273
307
  const dirtyKey = directorySyncDirtyKey(orgId, plugin);
274
- const lockKey = `${orgId}:${plugin}`;
275
- let lease = await this.lock.acquire(lockKey, randomUUID());
308
+ const lockKey = directorySyncLockKey(orgId, plugin);
309
+ const lockOpts = { ttlMs: DIRECTORY_SYNC_LOCK_TTL_MS };
310
+ let lease = await this.lockService.acquire(lockKey, lockOpts);
276
311
  if (!lease) {
277
312
  // 在跑的那一轮可能已经读过变化之前的页:记下脏标记,由持有者跑完后补一轮
278
- await this.d.redis.set(dirtyKey, "1", "EX", DIRECTORY_SYNC_DIRTY_TTL_SECONDS);
313
+ await this.redis.set(dirtyKey, "1", "EX", DIRECTORY_SYNC_DIRTY_TTL_SECONDS);
279
314
  // The holder may have released the lock and taken the flag (GETDEL) between the failed
280
315
  // attempt and the write above: the flag would then wait an hour with nobody to rerun, and
281
316
  // the next sync would skip its removals. Try the lock once more after the write: if it is
282
317
  // still held, its holder takes the flag after releasing; if not, run this sync now.
283
- lease = await this.lock.acquire(lockKey, randomUUID());
318
+ lease = await this.lockService.acquire(lockKey, lockOpts);
284
319
  if (!lease)
285
320
  return { status: "skipped", reason: "locked" };
286
321
  // No page has been read yet, so this run covers every change flagged so far.
287
- await this.d.redis.del(dirtyKey);
322
+ await this.redis.del(dirtyKey);
288
323
  }
289
- const abort = new AbortController();
290
324
  // 锁丢了(续租失败、过期后被他人取得):停止本轮,不再移除任何人
291
- lease.onLost(() => abort.abort(new Error("directory sync lock lost")));
325
+ const signal = lease.lost;
292
326
  try {
293
- return await this.run(orgId, plugin, e.directory, e.orgConfig, abort.signal, opts);
327
+ return await this.run(orgId, plugin, e.directory, e.orgConfig, signal, opts);
294
328
  }
295
329
  finally {
296
330
  await lease.release().catch(() => { });
@@ -303,13 +337,13 @@ export class DirectorySync {
303
337
  */
304
338
  async rerunIfDirty(orgId, plugin, dirtyKey) {
305
339
  try {
306
- if ((await this.d.redis.getdel(dirtyKey)) === null)
340
+ if ((await this.redis.getdel(dirtyKey)) === null)
307
341
  return;
308
342
  const jobId = `directory-sync-${orgId}-${plugin}-rerun-${randomUUID()}`;
309
343
  await this.addJob(orgId, plugin, "changed", jobId);
310
344
  }
311
345
  catch (err) {
312
- this.d.log.warn("directory sync: cannot enqueue follow-up sync", { orgId, plugin, err });
346
+ this.log.warn("directory sync: cannot enqueue follow-up sync", { orgId, plugin, err });
313
347
  }
314
348
  }
315
349
  async run(orgId, plugin, directory, orgConfig, signal, opts) {
@@ -351,7 +385,7 @@ export class DirectorySync {
351
385
  if (err instanceof OrgGone)
352
386
  throw err;
353
387
  counts.failed++;
354
- this.d.log.warn("directory sync: cannot add member", { orgId, plugin, err });
388
+ this.log.warn("directory sync: cannot add member", { orgId, plugin, err });
355
389
  }
356
390
  }
357
391
  const next = r.next;
@@ -364,7 +398,7 @@ export class DirectorySync {
364
398
  listed = true;
365
399
  }
366
400
  catch (err) {
367
- this.d.log.warn("directory sync stopped before listing all members", { orgId, plugin, err });
401
+ this.log.warn("directory sync stopped before listing all members", { orgId, plugin, err });
368
402
  }
369
403
  const trigger = opts.trigger ?? "manual";
370
404
  let partial = !listed || counts.failed > 0;
@@ -376,7 +410,7 @@ export class DirectorySync {
376
410
  partial = true;
377
411
  // 途中通讯录配置被清空(Ruling A28):照样不移除,但不记警告
378
412
  if (still.reason !== "not_configured") {
379
- this.d.log.warn("directory sync: plugin no longer eligible before removals", {
413
+ this.log.warn("directory sync: plugin no longer eligible before removals", {
380
414
  orgId,
381
415
  plugin,
382
416
  reason: still.reason,
@@ -390,10 +424,10 @@ export class DirectorySync {
390
424
  if (!partial) {
391
425
  let dirty;
392
426
  try {
393
- dirty = await this.d.redis.get(directorySyncDirtyKey(orgId, plugin));
427
+ dirty = await this.redis.get(directorySyncDirtyKey(orgId, plugin));
394
428
  }
395
429
  catch (err) {
396
- this.d.log.warn("directory sync: cannot read the dirty flag; skipping removals", {
430
+ this.log.warn("directory sync: cannot read the dirty flag; skipping removals", {
397
431
  orgId,
398
432
  plugin,
399
433
  err,
@@ -406,7 +440,7 @@ export class DirectorySync {
406
440
  }
407
441
  }
408
442
  if (!partial) {
409
- const existing = await this.d.db
443
+ const existing = await this.db
410
444
  .selectFrom("memberships")
411
445
  .select("account_id")
412
446
  .where("org_id", "=", orgId)
@@ -420,13 +454,13 @@ export class DirectorySync {
420
454
  (planned.length > threshold || (active === 0 && existing.length > 0))) {
421
455
  partial = true;
422
456
  removalBlocked = true;
423
- this.d.log.warn("directory sync: mass removal blocked", {
457
+ this.log.warn("directory sync: mass removal blocked", {
424
458
  orgId,
425
459
  plugin,
426
460
  planned: planned.length,
427
461
  existing: existing.length,
428
462
  });
429
- await audit(this.d.db, {
463
+ await audit(this.db.db, {
430
464
  orgId,
431
465
  action: "org.directory.removal_blocked",
432
466
  target: plugin,
@@ -454,7 +488,7 @@ export class DirectorySync {
454
488
  counts.failed++;
455
489
  }
456
490
  }
457
- await audit(this.d.db, {
491
+ await audit(this.db.db, {
458
492
  ...(opts.requestedBy !== undefined && { actorAccountId: opts.requestedBy }),
459
493
  ...(opts.requestedByToken !== undefined && { actorTokenId: opts.requestedByToken }),
460
494
  orgId,
@@ -492,35 +526,37 @@ export class DirectorySync {
492
526
  emailVerified: m.emailVerified === true,
493
527
  displayName: m.displayName,
494
528
  };
495
- return this.d.db.transaction().execute(async (t) => {
496
- if (!(await tryLockOrg(t, orgId)))
497
- throw new OrgGone("organization deleted during sync");
498
- const { accountId } = await this.d.external.resolve(identity, t, { linkedVia: "directory" });
499
- const excluded = await t
500
- .selectFrom("directory_exclusions")
501
- .select("account_id")
502
- .where("org_id", "=", orgId)
503
- .where("account_id", "=", accountId)
504
- .where("plugin", "=", plugin)
505
- .executeTakeFirst();
506
- if (excluded)
507
- return { accountId, added: false };
508
- const inserted = await t
509
- .insertInto("memberships")
510
- .values({ org_id: orgId, account_id: accountId, role: "member", source })
511
- .onConflict((oc) => oc.columns(["org_id", "account_id"]).doNothing())
512
- .returning("account_id")
513
- .executeTakeFirst();
514
- if (inserted) {
515
- await audit(t, {
516
- orgId,
517
- action: "org.member.added",
518
- target: accountId,
519
- detail: { role: "member", source },
520
- });
521
- }
522
- return { accountId, added: inserted !== undefined };
523
- });
529
+ return this.addMemberIn(orgId, plugin, source, identity);
530
+ }
531
+ /** One short transaction per member, under the org row lock. */
532
+ async addMemberIn(orgId, plugin, source, identity) {
533
+ if (!(await this.orgLock.tryLock(orgId)))
534
+ throw new OrgGone("organization deleted during sync");
535
+ const { accountId } = await this.external.resolve(identity, { linkedVia: "directory" });
536
+ const excluded = await this.db
537
+ .selectFrom("directory_exclusions")
538
+ .select("account_id")
539
+ .where("org_id", "=", orgId)
540
+ .where("account_id", "=", accountId)
541
+ .where("plugin", "=", plugin)
542
+ .executeTakeFirst();
543
+ if (excluded)
544
+ return { accountId, added: false };
545
+ const inserted = await this.db
546
+ .insertInto("memberships")
547
+ .values({ org_id: orgId, account_id: accountId, role: "member", source })
548
+ .onConflict((oc) => oc.columns(["org_id", "account_id"]).doNothing())
549
+ .returning("account_id")
550
+ .executeTakeFirst();
551
+ if (inserted) {
552
+ await audit(this.db.db, {
553
+ orgId,
554
+ action: "org.member.added",
555
+ target: accountId,
556
+ detail: { role: "member", source },
557
+ });
558
+ }
559
+ return { accountId, added: inserted !== undefined };
524
560
  }
525
561
  /**
526
562
  * 一个离职者:独立事务内先锁组织行、再锁其成员关系行(与 `switchCurrentOrg` / 移出成员同一顺序),
@@ -529,30 +565,81 @@ export class DirectorySync {
529
565
  */
530
566
  async offboardOne(orgId, plugin, source, accountId) {
531
567
  try {
532
- const result = await this.d.db.transaction().execute(async (t) => {
533
- if (!(await tryLockOrg(t, orgId)))
534
- return undefined;
535
- const row = await t
536
- .selectFrom("memberships")
537
- .select("source")
538
- .where("org_id", "=", orgId)
539
- .where("account_id", "=", accountId)
540
- .forUpdate()
541
- .executeTakeFirst();
542
- if (row?.source !== source)
543
- return undefined;
544
- return this.d.offboarding.offboard(t, orgId, accountId, "directory");
545
- });
546
- if (!result)
547
- return "gone";
548
- await this.d.offboarding.afterCommit(result);
549
- return "removed";
568
+ const result = await this.offboardIn(orgId, source, accountId);
569
+ return result ? "removed" : "gone";
550
570
  }
551
571
  catch (err) {
552
572
  if (err instanceof ApiError && err.code === "org.last_owner")
553
573
  return "last_owner";
554
- this.d.log.warn("directory sync: cannot offboard member", { orgId, plugin, accountId, err });
574
+ this.log.warn("directory sync: cannot offboard member", { orgId, plugin, accountId, err });
555
575
  return "failed";
556
576
  }
557
577
  }
558
- }
578
+ async offboardIn(orgId, source, accountId) {
579
+ if (!(await this.orgLock.tryLock(orgId)))
580
+ return undefined;
581
+ const row = await this.db
582
+ .selectFrom("memberships")
583
+ .select("source")
584
+ .where("org_id", "=", orgId)
585
+ .where("account_id", "=", accountId)
586
+ .forUpdate()
587
+ .executeTakeFirst();
588
+ if (row?.source !== source)
589
+ return undefined;
590
+ const result = await this.offboarding.offboard(orgId, accountId, "directory");
591
+ // the markers, events and run stops follow the root commit (none after a rollback)
592
+ afterCommit(() => this.offboarding.afterOffboard(result));
593
+ return result;
594
+ }
595
+ };
596
+ __decorate([
597
+ Transactional()
598
+ ], DirectorySync.prototype, "authorize", null);
599
+ __decorate([
600
+ Transactional()
601
+ ], DirectorySync.prototype, "addMemberIn", null);
602
+ __decorate([
603
+ Transactional()
604
+ ], DirectorySync.prototype, "offboardIn", null);
605
+ DirectorySync = __decorate([
606
+ Injectable(),
607
+ __param(0, Inject(KernelDb)),
608
+ __param(1, Inject(TransactionHost)),
609
+ __param(2, Inject(REDIS)),
610
+ __param(3, Inject(ExtensionRegistry)),
611
+ __param(4, Inject(OrgExtensionConfigs)),
612
+ __param(5, Inject(ExternalIdentities)),
613
+ __param(6, Inject(Offboarding)),
614
+ __param(7, Inject(OrgLock)),
615
+ __param(8, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME))),
616
+ __param(9, Inject(LockService)),
617
+ __param(10, Inject(KERNEL_LOGGER))
618
+ ], DirectorySync);
619
+ export { DirectorySync };
620
+ /** The hourly directory scan ({@link DirectorySync.scan}), once per tick across replicas; a worker-role job (`WorkerModule`). */
621
+ let DirectoryScanJob = class DirectoryScanJob {
622
+ directory;
623
+ lockService;
624
+ log;
625
+ constructor(directory, lockService, log) {
626
+ this.directory = directory;
627
+ this.lockService = lockService;
628
+ this.log = log;
629
+ }
630
+ async run() {
631
+ const targets = await this.directory.scan();
632
+ if (targets.length > 0)
633
+ this.log.info("directory syncs enqueued", { count: targets.length });
634
+ }
635
+ };
636
+ __decorate([
637
+ LockedCron("0 * * * *", { name: DIRECTORY_SCAN_JOB })
638
+ ], DirectoryScanJob.prototype, "run", null);
639
+ DirectoryScanJob = __decorate([
640
+ Injectable(),
641
+ __param(0, Inject(DirectorySync)),
642
+ __param(1, Inject(LockService)),
643
+ __param(2, Inject(KERNEL_LOGGER))
644
+ ], DirectoryScanJob);
645
+ export { DirectoryScanJob };
@@ -1,14 +1,14 @@
1
1
  import type { FastifyReply, FastifyRequest } from "fastify";
2
2
  import { z } from "zod";
3
- import type { KernelConfig } from "../config/schema.js";
4
3
  import type { Account } from "../identity/accounts.js";
5
4
  import { type Principal } from "../identity/principal.js";
6
- import type { LoginRateLimiter } from "../identity/rate-limit.js";
7
- import type { SessionService } from "../identity/sessions.js";
8
- import { type InvitableRole, type Invitation, type InvitationStatus, type InvitationsService } from "./invitations.service.js";
5
+ import { SessionService } from "../identity/sessions.js";
6
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
7
+ import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
8
+ import { type InvitableRole, type Invitation, type InvitationStatus, InvitationsService } from "./invitations.service.js";
9
9
  import { type OrgContext } from "./org.guard.js";
10
10
  import type { OrgRole } from "./roles.js";
11
- declare const CreateBody: z.ZodObject<{
11
+ declare const CreateSchema: z.ZodObject<{
12
12
  role: z.ZodEnum<{
13
13
  admin: "admin";
14
14
  guest: "guest";
@@ -21,10 +21,10 @@ export declare class InvitationsController {
21
21
  private readonly invitations;
22
22
  private readonly sessions;
23
23
  private readonly config;
24
- private readonly limiter;
25
- constructor(invitations: InvitationsService, sessions: SessionService, config: () => KernelConfig, limiter: LoginRateLimiter);
24
+ private readonly throttler;
25
+ constructor(invitations: InvitationsService, sessions: SessionService, config: KernelConfigService, throttler: CredentialThrottler);
26
26
  /** 令牌只在此返回一次。 */
27
- create(principal: Principal, org: OrgContext, body: z.infer<typeof CreateBody>): Promise<{
27
+ create(principal: Principal, org: OrgContext, body: z.infer<typeof CreateSchema>): Promise<{
28
28
  invitation: Invitation;
29
29
  token: string;
30
30
  }>;