@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,21 +1,32 @@
1
- import { sql } from "kysely";
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";
2
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";
15
+ import { XactLock } from "../infra/database/xact-lock.js";
3
16
  /**
4
- * 在调用方事务内取 `capybara.enterprise_admins` 咨询锁(事务结束释放),串行化所有企业管理员写操作
5
- * (撤销 / 停用 / 新建管理员 / 改部署设置 / CLI 的 `capybara admin grant|revoke`)。只加锁、不鉴权:
6
- * 没有发起账号的调用方(CLI)用它;有发起账号的用 {@link lockEnterpriseAdminsAndAuthorize}。
17
+ * The transaction-scoped lock (`XactLock`, `pg_advisory_xact_lock`) that serializes every
18
+ * enterprise admin write: revoke / disable / create an admin, deployment settings, prices,
19
+ * purposes, the catalog and extension admin writes, the CLI's `capybara admin grant|revoke`.
7
20
  */
8
- export async function lockEnterpriseAdmins(trx) {
9
- await sql `SELECT pg_advisory_xact_lock(hashtext('capybara.enterprise_admins'))`.execute(trx);
10
- }
21
+ const ENTERPRISE_ADMINS_LOCK = "capybara.enterprise_admins";
11
22
  /**
12
- * 企业管理员写操作的执行期复核(spec 3.6 R5):{@link lockEnterpriseAdmins} 后在锁内实时确认发起人仍是
13
- * 活跃企业管理员,否则 `forbidden`。鉴权守卫在请求开头读到的身份可能已过期(另一个管理员刚撤销了他),
14
- * 必须在锁内重读。
23
+ * The run-time re-check of an enterprise admin write (spec 3.6 R5), under
24
+ * {@link ENTERPRISE_ADMINS_LOCK}: the actor must still be an active enterprise admin, else
25
+ * `forbidden`. The identity the auth guard read at the start of the request may be stale (another
26
+ * admin just revoked it), so it is re-read under the lock.
15
27
  */
16
- export async function lockEnterpriseAdminsAndAuthorize(trx, actorAccountId) {
17
- await lockEnterpriseAdmins(trx);
18
- const actor = await trx
28
+ async function assertActiveEnterpriseAdmin(db, actorAccountId) {
29
+ const actor = await db
19
30
  .selectFrom("accounts")
20
31
  .select("id")
21
32
  .where("id", "=", actorAccountId)
@@ -25,3 +36,46 @@ export async function lockEnterpriseAdminsAndAuthorize(trx, actorAccountId) {
25
36
  if (!actor)
26
37
  throw new ApiError("forbidden", "Enterprise admin required");
27
38
  }
39
+ /**
40
+ * The enterprise admin lock, the one implementation of "lock, then re-check the actor":
41
+ * both methods join the caller's transaction (`mandatory`), which holds the lock until it ends.
42
+ */
43
+ let EnterpriseAdminLock = class EnterpriseAdminLock {
44
+ db;
45
+ xactLock;
46
+ txHost;
47
+ constructor(db, xactLock, txHost) {
48
+ this.db = db;
49
+ this.xactLock = xactLock;
50
+ this.txHost = txHost;
51
+ }
52
+ /** Only the lock (callers without an actor: the CLI, bootstrap). */
53
+ async lock() {
54
+ await this.xactLock.lock(ENTERPRISE_ADMINS_LOCK);
55
+ }
56
+ /** The lock, then {@link assertActiveEnterpriseAdmin} under it. */
57
+ async lockAndAuthorize(actorAccountId) {
58
+ await this.xactLock.lock(ENTERPRISE_ADMINS_LOCK);
59
+ await assertActiveEnterpriseAdmin(this.db.db, actorAccountId);
60
+ }
61
+ };
62
+ __decorate([
63
+ Transactional({ propagation: "mandatory" })
64
+ ], EnterpriseAdminLock.prototype, "lock", null);
65
+ __decorate([
66
+ Transactional({ propagation: "mandatory" })
67
+ ], EnterpriseAdminLock.prototype, "lockAndAuthorize", null);
68
+ EnterpriseAdminLock = __decorate([
69
+ Injectable(),
70
+ __param(0, Inject(KernelDb)),
71
+ __param(1, Inject(XactLock)),
72
+ __param(2, Inject(TransactionHost))
73
+ ], EnterpriseAdminLock);
74
+ export { EnterpriseAdminLock };
75
+ /** The one {@link EnterpriseAdminLock}: identity, models, the extensions and the catalog import it. */
76
+ let EnterpriseAdminLockModule = class EnterpriseAdminLockModule {
77
+ };
78
+ EnterpriseAdminLockModule = __decorate([
79
+ Module({ providers: [EnterpriseAdminLock], exports: [EnterpriseAdminLock] })
80
+ ], EnterpriseAdminLockModule);
81
+ export { EnterpriseAdminLockModule };
@@ -0,0 +1,17 @@
1
+ import { TransactionHost } from "../infra/database/transaction-host.js";
2
+ import { XactLock } from "../infra/database/xact-lock.js";
3
+ /**
4
+ * The lock of one external identity (one provider per transaction-scoped lock): serializes resolve
5
+ * / link of the same `(source, externalId)`, whose row may not exist yet, so concurrent first
6
+ * resolves create one account. Joins the caller's transaction (`mandatory`), which holds it until
7
+ * it ends.
8
+ */
9
+ export declare class ExternalIdentityLock {
10
+ private readonly xactLock;
11
+ readonly txHost: TransactionHost;
12
+ constructor(xactLock: XactLock, txHost: TransactionHost);
13
+ lock(id: {
14
+ source: string;
15
+ externalId: string;
16
+ }): Promise<void>;
17
+ }
@@ -0,0 +1,39 @@
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 } from "@nestjs/common";
11
+ import { TransactionHost } from "../infra/database/transaction-host.js";
12
+ import { Transactional } from "../infra/database/transactional.decorator.js";
13
+ import { XactLock } from "../infra/database/xact-lock.js";
14
+ /**
15
+ * The lock of one external identity (one provider per transaction-scoped lock): serializes resolve
16
+ * / link of the same `(source, externalId)`, whose row may not exist yet, so concurrent first
17
+ * resolves create one account. Joins the caller's transaction (`mandatory`), which holds it until
18
+ * it ends.
19
+ */
20
+ let ExternalIdentityLock = class ExternalIdentityLock {
21
+ xactLock;
22
+ txHost;
23
+ constructor(xactLock, txHost) {
24
+ this.xactLock = xactLock;
25
+ this.txHost = txHost;
26
+ }
27
+ async lock(id) {
28
+ await this.xactLock.lock(`capybara.identity:${id.source}:${id.externalId}`);
29
+ }
30
+ };
31
+ __decorate([
32
+ Transactional({ propagation: "mandatory" })
33
+ ], ExternalIdentityLock.prototype, "lock", null);
34
+ ExternalIdentityLock = __decorate([
35
+ Injectable(),
36
+ __param(0, Inject(XactLock)),
37
+ __param(1, Inject(TransactionHost))
38
+ ], ExternalIdentityLock);
39
+ export { ExternalIdentityLock };
@@ -1,8 +1,9 @@
1
1
  import type { ExternalIdentity } from "@capybara-hq/plugin-sdk";
2
- import { type Transaction } from "kysely";
3
- import type { KernelConfig } from "../config/schema.js";
4
- import type { KernelDatabase, KernelDb, LinkedVia } from "../db/kernel-schema.js";
5
- type Trx = Transaction<KernelDatabase>;
2
+ import type { LinkedVia } from "../db/kernel-schema.js";
3
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
4
+ import { KernelDb } from "../infra/database/kernel-db.js";
5
+ import { TransactionHost } from "../infra/database/transaction-host.js";
6
+ import { ExternalIdentityLock } from "./external-identity-lock.js";
6
7
  export type { LinkedVia };
7
8
  /**
8
9
  * 第三方登录拒绝了这个身份(Ruling A18):身份行经 IM 绑定链接建立,而请求没有带着同一账号的会话。
@@ -45,16 +46,17 @@ export declare function identityPlugin(source: string): string;
45
46
  /**
46
47
  * 外部身份:按 `(source, externalId)` 映射到账号(登录、渠道入站、通讯录共用同一个键)。
47
48
  * 首次出现时按「受信任的身份源 + 两侧邮箱均已验证」合并到既有账号,否则新建账号(不建组织)。
48
- * 同一身份的并发首次解析用事务级咨询锁串行化,只建一个账号。框架无关,由调用方注入依赖。
49
+ * Concurrent first resolves of one identity are serialized by {@link ExternalIdentityLock},
50
+ * so only one account is created.
49
51
  */
50
52
  export declare class ExternalIdentities {
51
53
  private readonly db;
54
+ readonly txHost: TransactionHost;
55
+ private readonly identityLock;
52
56
  private readonly config;
53
- constructor(db: KernelDb, config: () => {
54
- auth: Pick<KernelConfig["auth"], "trustedIdentitySources">;
55
- });
56
- /** 该外部身份绑定的账号 id;未绑定返回 undefined。 */
57
- findAccount(source: string, externalId: string, trx?: Trx): Promise<string | undefined>;
57
+ constructor(db: KernelDb, txHost: TransactionHost, identityLock: ExternalIdentityLock, config: Pick<KernelConfigService, "get">);
58
+ /** The account the external identity is linked to (in the context's transaction when there is one); undefined when unlinked. */
59
+ findAccount(source: string, externalId: string): Promise<string | undefined>;
58
60
  /**
59
61
  * 解析外部身份到账号。已绑定 → 该账号(顺带刷新身份行上的邮箱与资料);未绑定 → 合并或新建(见类说明),
60
62
  * 新身份行记 `linked_via = opts.linkedVia`(合并也是 `sso`)。
@@ -67,14 +69,15 @@ export declare class ExternalIdentities {
67
69
  * 新建账号的 `email_verified` 只在身份源受信任且身份邮箱已验证时为 true——不受信任的身份源可以声称任意邮箱
68
70
  * 「已验证」,不能让它建出的账号成为日后受信任登录的合并目标。
69
71
  * 合并写审计 `identity.linked`,新建写 `account.created`。不判断账号状态,由调用方决定(如登录拒绝停用账号)。
70
- * 传 `trx` 时在调用方事务内执行;与 `link` 取同一把咨询锁,兜底用 `ON CONFLICT DO NOTHING` 后回读,
71
- * 不抛唯一约束冲突、不中止调用方事务。
72
+ * Joins the caller's transaction when there is one; takes the same lock as `link`, and falls back
73
+ * to `ON CONFLICT DO NOTHING` plus a re-read, so it never throws a unique violation or aborts the
74
+ * caller's transaction.
72
75
  */
73
- resolve(identity: ExternalIdentity, trx: Trx | undefined, opts: ResolveOptions): Promise<{
76
+ resolve(identity: ExternalIdentity, opts: ResolveOptions): Promise<{
74
77
  accountId: string;
75
78
  created: boolean;
76
79
  }>;
77
- /** 同一身份的 resolve / link 串行化(事务级咨询锁)。 */
80
+ /** Serializes resolve / link of one identity ({@link ExternalIdentityLock}). */
78
81
  private lockIdentity;
79
82
  /** 身份源键(`<插件名>:<租户 id>`)是否在 `auth.trustedIdentitySources` 中:按完整键比较,信任按租户(Ruling A19)。 */
80
83
  private trusted;
@@ -95,12 +98,13 @@ export declare class ExternalIdentities {
95
98
  * 已绑定他人 → `409 identity.taken`。新行记 `linked_via = bind`:这样绑定的身份只能在 IM 里代表此人,
96
99
  * 不能直接用于第三方登录(Ruling A18)。与 `resolve` 取同一把咨询锁。新绑定写审计 `identity.linked`。
97
100
  */
98
- link(accountId: string, identity: ExternalIdentity, trx?: Trx): Promise<void>;
101
+ link(accountId: string, identity: ExternalIdentity): Promise<void>;
99
102
  /**
100
103
  * 解除本人的一个外部身份(本地登录名不可解除);不存在或不属于本人 → `identity.not_found`;
101
104
  * 账号没有本地密码且这是最后一个外部身份 → `409 identity.last_login_method`。审计 `identity.unlinked`。
102
105
  */
103
106
  unlink(accountId: string, source: string, externalId: string): Promise<void>;
107
+ private unlinkIn;
104
108
  /** 账号绑定的外部身份(不含本地登录名),按绑定时间升序。 */
105
109
  listForAccount(accountId: string): Promise<LinkedIdentity[]>;
106
110
  }
@@ -1,7 +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
+ };
1
10
  import { randomUUID } from "node:crypto";
11
+ import { Inject, Injectable } from "@nestjs/common";
2
12
  import { sql } from "kysely";
3
13
  import { ApiError } from "../errors.js";
14
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
15
+ import { KernelDb } from "../infra/database/kernel-db.js";
16
+ import { TransactionHost } from "../infra/database/transaction-host.js";
17
+ import { Transactional } from "../infra/database/transactional.decorator.js";
4
18
  import { audit } from "./audit.js";
19
+ import { ExternalIdentityLock } from "./external-identity-lock.js";
5
20
  /** `<插件名>:<租户 id>`;插件名同清单规则,租户 id 为非空、不含空白的串。 */
6
21
  const SOURCE_RE = /^([a-z0-9][a-z0-9._-]{0,213}):(\S{1,256})$/;
7
22
  const MAX_EXTERNAL_ID = 256;
@@ -60,18 +75,23 @@ const profileOf = (i) => JSON.stringify({
60
75
  /**
61
76
  * 外部身份:按 `(source, externalId)` 映射到账号(登录、渠道入站、通讯录共用同一个键)。
62
77
  * 首次出现时按「受信任的身份源 + 两侧邮箱均已验证」合并到既有账号,否则新建账号(不建组织)。
63
- * 同一身份的并发首次解析用事务级咨询锁串行化,只建一个账号。框架无关,由调用方注入依赖。
78
+ * Concurrent first resolves of one identity are serialized by {@link ExternalIdentityLock},
79
+ * so only one account is created.
64
80
  */
65
- export class ExternalIdentities {
81
+ let ExternalIdentities = class ExternalIdentities {
66
82
  db;
83
+ txHost;
84
+ identityLock;
67
85
  config;
68
- constructor(db, config) {
86
+ constructor(db, txHost, identityLock, config) {
69
87
  this.db = db;
88
+ this.txHost = txHost;
89
+ this.identityLock = identityLock;
70
90
  this.config = config;
71
91
  }
72
- /** 该外部身份绑定的账号 id;未绑定返回 undefined。 */
73
- async findAccount(source, externalId, trx) {
74
- const row = await (trx ?? this.db)
92
+ /** The account the external identity is linked to (in the context's transaction when there is one); undefined when unlinked. */
93
+ async findAccount(source, externalId) {
94
+ const row = await this.db
75
95
  .selectFrom("identities")
76
96
  .select("account_id")
77
97
  .where("source", "=", source)
@@ -91,68 +111,66 @@ export class ExternalIdentities {
91
111
  * 新建账号的 `email_verified` 只在身份源受信任且身份邮箱已验证时为 true——不受信任的身份源可以声称任意邮箱
92
112
  * 「已验证」,不能让它建出的账号成为日后受信任登录的合并目标。
93
113
  * 合并写审计 `identity.linked`,新建写 `account.created`。不判断账号状态,由调用方决定(如登录拒绝停用账号)。
94
- * 传 `trx` 时在调用方事务内执行;与 `link` 取同一把咨询锁,兜底用 `ON CONFLICT DO NOTHING` 后回读,
95
- * 不抛唯一约束冲突、不中止调用方事务。
114
+ * Joins the caller's transaction when there is one; takes the same lock as `link`, and falls back
115
+ * to `ON CONFLICT DO NOTHING` plus a re-read, so it never throws a unique violation or aborts the
116
+ * caller's transaction.
96
117
  */
97
- async resolve(identity, trx, opts) {
118
+ async resolve(identity, opts) {
98
119
  const id = normalize(identity);
99
- const run = async (t) => {
100
- await this.lockIdentity(t, id);
101
- const existing = await this.findRow(t, id);
102
- if (existing !== undefined) {
103
- if (opts.login !== undefined)
104
- await this.allowLogin(t, id, existing, opts.login);
105
- await this.refreshIdentity(t, id);
106
- return { accountId: existing.accountId, created: false };
120
+ await this.lockIdentity(id);
121
+ const existing = await this.findRow(id);
122
+ if (existing !== undefined) {
123
+ if (opts.login !== undefined)
124
+ await this.allowLogin(id, existing, opts.login);
125
+ await this.refreshIdentity(id);
126
+ return { accountId: existing.accountId, created: false };
127
+ }
128
+ const merged = opts.allowMerge === true ? await this.mergeTarget(id) : undefined;
129
+ if (merged !== undefined) {
130
+ if (!(await this.insertIdentity(merged, id, "sso"))) {
131
+ return { accountId: await this.mustFind(id), created: false };
107
132
  }
108
- const merged = opts.allowMerge === true ? await this.mergeTarget(t, id) : undefined;
109
- if (merged !== undefined) {
110
- if (!(await this.insertIdentity(t, merged, id, "sso"))) {
111
- return { accountId: await this.mustFind(t, id), created: false };
112
- }
113
- await audit(t, {
114
- actorAccountId: merged,
115
- action: "identity.linked",
116
- target: merged,
117
- detail: { source: id.source, externalId: id.externalId, via: "verified_email" },
118
- });
119
- return { accountId: merged, created: false };
120
- }
121
- const accountId = randomUUID();
122
- await t
123
- .insertInto("accounts")
124
- .values({
125
- id: accountId,
126
- display_name: id.displayName,
127
- email: id.email ?? null,
128
- email_verified: id.emailVerified && this.trusted(id.source),
129
- })
130
- .execute();
131
- if (!(await this.insertIdentity(t, accountId, id, opts.linkedVia))) {
132
- // 不走咨询锁的写入方抢先插入了同一身份:撤销刚建的账号,回读
133
- await t.deleteFrom("accounts").where("id", "=", accountId).execute();
134
- return { accountId: await this.mustFind(t, id), created: false };
135
- }
136
- await audit(t, {
137
- actorAccountId: accountId,
138
- action: "account.created",
139
- target: accountId,
140
- detail: { source: id.source, externalId: id.externalId },
133
+ await audit(this.db.db, {
134
+ actorAccountId: merged,
135
+ action: "identity.linked",
136
+ target: merged,
137
+ detail: { source: id.source, externalId: id.externalId, via: "verified_email" },
141
138
  });
142
- return { accountId, created: true };
143
- };
144
- return trx ? run(trx) : this.db.transaction().execute(run);
139
+ return { accountId: merged, created: false };
140
+ }
141
+ const accountId = randomUUID();
142
+ await this.db
143
+ .insertInto("accounts")
144
+ .values({
145
+ id: accountId,
146
+ display_name: id.displayName,
147
+ email: id.email ?? null,
148
+ email_verified: id.emailVerified && this.trusted(id.source),
149
+ })
150
+ .execute();
151
+ if (!(await this.insertIdentity(accountId, id, opts.linkedVia))) {
152
+ // 不走咨询锁的写入方抢先插入了同一身份:撤销刚建的账号,回读
153
+ await this.db.deleteFrom("accounts").where("id", "=", accountId).execute();
154
+ return { accountId: await this.mustFind(id), created: false };
155
+ }
156
+ await audit(this.db.db, {
157
+ actorAccountId: accountId,
158
+ action: "account.created",
159
+ target: accountId,
160
+ detail: { source: id.source, externalId: id.externalId },
161
+ });
162
+ return { accountId, created: true };
145
163
  }
146
- /** 同一身份的 resolve / link 串行化(事务级咨询锁)。 */
147
- async lockIdentity(t, id) {
148
- await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.identity:${id.source}:${id.externalId}`}))`.execute(t);
164
+ /** Serializes resolve / link of one identity ({@link ExternalIdentityLock}). */
165
+ async lockIdentity(id) {
166
+ await this.identityLock.lock(id);
149
167
  }
150
168
  /** 身份源键(`<插件名>:<租户 id>`)是否在 `auth.trustedIdentitySources` 中:按完整键比较,信任按租户(Ruling A19)。 */
151
169
  trusted(source) {
152
- return this.config().auth.trustedIdentitySources.includes(source);
170
+ return this.config.get().auth.trustedIdentitySources.includes(source);
153
171
  }
154
- async findRow(t, id) {
155
- const row = await t
172
+ async findRow(id) {
173
+ const row = await this.db
156
174
  .selectFrom("identities")
157
175
  .select(["account_id", "linked_via"])
158
176
  .where("source", "=", id.source)
@@ -161,33 +179,33 @@ export class ExternalIdentities {
161
179
  return row && { accountId: row.account_id, linkedVia: row.linked_via };
162
180
  }
163
181
  /** 第三方登录能否用这一行(见 {@link resolve}):只有 `bind` 行需要同一账号的会话,放行时把行改为 `sso`。 */
164
- async allowLogin(t, id, row, login) {
182
+ async allowLogin(id, row, login) {
165
183
  const via = row.linkedVia ?? "sso";
166
184
  if (via !== "bind")
167
185
  return;
168
186
  if (login.sessionAccountId !== row.accountId)
169
187
  throw new IdentityNotVerified();
170
- await t
188
+ await this.db
171
189
  .updateTable("identities")
172
190
  .set({ linked_via: "sso" })
173
191
  .where("source", "=", id.source)
174
192
  .where("external_id", "=", id.externalId)
175
193
  .execute();
176
- await audit(t, {
194
+ await audit(this.db.db, {
177
195
  actorAccountId: row.accountId,
178
196
  action: "identity.verified",
179
197
  target: row.accountId,
180
198
  detail: { source: id.source, externalId: id.externalId, from: via },
181
199
  });
182
200
  }
183
- async mustFind(t, id) {
184
- const owner = await this.findAccount(id.source, id.externalId, t);
201
+ async mustFind(id) {
202
+ const owner = await this.findAccount(id.source, id.externalId);
185
203
  if (owner === undefined)
186
204
  throw new Error("identity vanished after a conflicting insert");
187
205
  return owner;
188
206
  }
189
- async refreshIdentity(t, id) {
190
- await t
207
+ async refreshIdentity(id) {
208
+ await this.db
191
209
  .updateTable("identities")
192
210
  .set({ email: id.email ?? null, email_verified: id.emailVerified, profile: profileOf(id) })
193
211
  .where("source", "=", id.source)
@@ -198,10 +216,10 @@ export class ExternalIdentities {
198
216
  * 可合并的既有账号:身份源键在 `auth.trustedIdentitySources` 中、身份邮箱已验证,
199
217
  * 且恰好有一个邮箱已验证、邮箱相同(不区分大小写)的账号;否则 undefined(多个候选时不猜,新建)。
200
218
  */
201
- async mergeTarget(t, id) {
219
+ async mergeTarget(id) {
202
220
  if (!id.emailVerified || id.email === undefined || !this.trusted(id.source))
203
221
  return undefined;
204
- const rows = await t
222
+ const rows = await this.db
205
223
  .selectFrom("accounts")
206
224
  .select("id")
207
225
  .where("email_verified", "=", true)
@@ -211,8 +229,8 @@ export class ExternalIdentities {
211
229
  return rows.length === 1 ? rows[0]?.id : undefined;
212
230
  }
213
231
  /** 插入身份行;已存在(主键冲突)时什么都不做并返回 false。 */
214
- async insertIdentity(t, accountId, id, linkedVia) {
215
- const row = await t
232
+ async insertIdentity(accountId, id, linkedVia) {
233
+ const row = await this.db
216
234
  .insertInto("identities")
217
235
  .values({
218
236
  source: id.source,
@@ -233,30 +251,27 @@ export class ExternalIdentities {
233
251
  * 已绑定他人 → `409 identity.taken`。新行记 `linked_via = bind`:这样绑定的身份只能在 IM 里代表此人,
234
252
  * 不能直接用于第三方登录(Ruling A18)。与 `resolve` 取同一把咨询锁。新绑定写审计 `identity.linked`。
235
253
  */
236
- async link(accountId, identity, trx) {
254
+ async link(accountId, identity) {
237
255
  const id = normalize(identity);
238
- const run = async (t) => {
239
- await this.lockIdentity(t, id);
240
- const owner = await this.findAccount(id.source, id.externalId, t);
241
- if (owner !== undefined && owner !== accountId)
256
+ await this.lockIdentity(id);
257
+ const owner = await this.findAccount(id.source, id.externalId);
258
+ if (owner !== undefined && owner !== accountId)
259
+ throw taken();
260
+ if (owner === accountId) {
261
+ await this.refreshIdentity(id);
262
+ return;
263
+ }
264
+ if (!(await this.insertIdentity(accountId, id, "bind"))) {
265
+ if ((await this.mustFind(id)) !== accountId)
242
266
  throw taken();
243
- if (owner === accountId) {
244
- await this.refreshIdentity(t, id);
245
- return;
246
- }
247
- if (!(await this.insertIdentity(t, accountId, id, "bind"))) {
248
- if ((await this.mustFind(t, id)) !== accountId)
249
- throw taken();
250
- return;
251
- }
252
- await audit(t, {
253
- actorAccountId: accountId,
254
- action: "identity.linked",
255
- target: accountId,
256
- detail: { source: id.source, externalId: id.externalId, via: "bind" },
257
- });
258
- };
259
- return trx ? run(trx) : this.db.transaction().execute(run);
267
+ return;
268
+ }
269
+ await audit(this.db.db, {
270
+ actorAccountId: accountId,
271
+ action: "identity.linked",
272
+ target: accountId,
273
+ detail: { source: id.source, externalId: id.externalId, via: "bind" },
274
+ });
260
275
  }
261
276
  /**
262
277
  * 解除本人的一个外部身份(本地登录名不可解除);不存在或不属于本人 → `identity.not_found`;
@@ -265,38 +280,44 @@ export class ExternalIdentities {
265
280
  async unlink(accountId, source, externalId) {
266
281
  if (source === "local")
267
282
  throw notFound();
268
- await this.db.transaction().execute(async (t) => {
269
- const r = await t
270
- .deleteFrom("identities")
271
- .where("source", "=", source)
272
- .where("external_id", "=", externalId)
273
- .where("account_id", "=", accountId)
274
- .executeTakeFirst();
275
- if (r.numDeletedRows === 0n)
276
- throw notFound();
277
- // 没有本地密码时至少还要剩一个外部身份,否则此人再也登录不了(锁账号行,串行化并发解除)
278
- await t.selectFrom("accounts").select("id").where("id", "=", accountId).forUpdate().execute();
279
- const password = await t
280
- .selectFrom("local_passwords")
281
- .select("account_id")
282
- .where("account_id", "=", accountId)
283
- .executeTakeFirst();
284
- const others = await t
285
- .selectFrom("identities")
286
- .select("source")
287
- .where("account_id", "=", accountId)
288
- .where("source", "!=", "local")
289
- .limit(1)
290
- .execute();
291
- if (!password && others.length === 0) {
292
- throw new ApiError("identity.last_login_method", "Cannot unlink the last sign-in method of an account without a password");
293
- }
294
- await audit(t, {
295
- actorAccountId: accountId,
296
- action: "identity.unlinked",
297
- target: accountId,
298
- detail: { source, externalId },
299
- });
283
+ await this.unlinkIn(accountId, source, externalId);
284
+ }
285
+ async unlinkIn(accountId, source, externalId) {
286
+ const r = await this.db
287
+ .deleteFrom("identities")
288
+ .where("source", "=", source)
289
+ .where("external_id", "=", externalId)
290
+ .where("account_id", "=", accountId)
291
+ .executeTakeFirst();
292
+ if (r.numDeletedRows === 0n)
293
+ throw notFound();
294
+ // 没有本地密码时至少还要剩一个外部身份,否则此人再也登录不了(锁账号行,串行化并发解除)
295
+ await this.db
296
+ .selectFrom("accounts")
297
+ .select("id")
298
+ .where("id", "=", accountId)
299
+ .forUpdate()
300
+ .execute();
301
+ const password = await this.db
302
+ .selectFrom("local_passwords")
303
+ .select("account_id")
304
+ .where("account_id", "=", accountId)
305
+ .executeTakeFirst();
306
+ const others = await this.db
307
+ .selectFrom("identities")
308
+ .select("source")
309
+ .where("account_id", "=", accountId)
310
+ .where("source", "!=", "local")
311
+ .limit(1)
312
+ .execute();
313
+ if (!password && others.length === 0) {
314
+ throw new ApiError("identity.last_login_method", "Cannot unlink the last sign-in method of an account without a password");
315
+ }
316
+ await audit(this.db.db, {
317
+ actorAccountId: accountId,
318
+ action: "identity.unlinked",
319
+ target: accountId,
320
+ detail: { source, externalId },
300
321
  });
301
322
  }
302
323
  /** 账号绑定的外部身份(不含本地登录名),按绑定时间升序。 */
@@ -332,6 +353,23 @@ export class ExternalIdentities {
332
353
  };
333
354
  });
334
355
  }
335
- }
356
+ };
357
+ __decorate([
358
+ Transactional()
359
+ ], ExternalIdentities.prototype, "resolve", null);
360
+ __decorate([
361
+ Transactional()
362
+ ], ExternalIdentities.prototype, "link", null);
363
+ __decorate([
364
+ Transactional()
365
+ ], ExternalIdentities.prototype, "unlinkIn", null);
366
+ ExternalIdentities = __decorate([
367
+ Injectable(),
368
+ __param(0, Inject(KernelDb)),
369
+ __param(1, Inject(TransactionHost)),
370
+ __param(2, Inject(ExternalIdentityLock)),
371
+ __param(3, Inject(KernelConfigService))
372
+ ], ExternalIdentities);
373
+ export { ExternalIdentities };
336
374
  const taken = () => new ApiError("identity.taken", "This external identity is already linked to another account");
337
375
  const notFound = () => new ApiError("identity.not_found", "External identity not found");
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Identity: accounts, sessions, API tokens, deployment settings and the enterprise admin lock,
3
+ * external identities with IM binding and third-party sign-in.
4
+ */
5
+ export declare class IdentityModule {
6
+ }