@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,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
+ }