@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,8 +1,22 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
1
10
  import { randomUUID } from "node:crypto";
11
+ import { Inject, Injectable, Module } from "@nestjs/common";
2
12
  import { sql } from "kysely";
13
+ import { SetupLock, SetupLockModule } from "../admin/setup-lock.js";
3
14
  import { ApiError } from "../errors.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";
5
- import { lockEnterpriseAdmins, lockEnterpriseAdminsAndAuthorize } from "./enterprise-admin.js";
19
+ import { EnterpriseAdminLock, EnterpriseAdminLockModule } from "./enterprise-admin.js";
6
20
  import { MAX_PASSWORD_LENGTH, normalizeLogin, validatePassword } from "./login.js";
7
21
  import { DUMMY_PASSWORD_HASH, hashPassword, verifyPassword } from "./passwords.js";
8
22
  /** 构造 `Account` 所需的 accounts 列(供跨表查询 select 使用)。 */
@@ -38,97 +52,93 @@ async function prepareLocal(input, passwordHash) {
38
52
  validatePassword(input.password);
39
53
  return { input, login, passwordHash: passwordHash ?? (await hashPassword(input.password)) };
40
54
  }
41
- /** 在事务内插入账号、本地身份与密码;登录名已占用 → `account.login_taken`。 */
42
- async function insertLocal(t, p) {
43
- const { input, login, passwordHash } = p;
44
- const id = randomUUID();
45
- const row = await t
46
- .insertInto("accounts")
47
- .values({
48
- id,
49
- display_name: input.displayName,
50
- email: input.email ?? null,
51
- is_enterprise_admin: input.enterpriseAdmin ?? false,
52
- })
53
- .returningAll()
54
- .executeTakeFirstOrThrow();
55
- try {
56
- await t
57
- .insertInto("identities")
58
- .values({
59
- source: "local",
60
- external_id: login,
61
- account_id: id,
62
- email: input.email ?? null,
63
- linked_via: "local",
64
- })
65
- .execute();
66
- }
67
- catch (e) {
68
- if (isLoginTaken(e)) {
69
- throw new ApiError("account.login_taken", "Login is already taken");
70
- }
71
- throw e;
72
- }
73
- await t
74
- .insertInto("local_passwords")
75
- .values({ account_id: id, password_hash: passwordHash })
76
- .execute();
77
- return toAccount(row);
78
- }
79
- /** 在事务内写入(或覆盖)本地密码哈希;账号不存在 → `account.not_found`。 */
80
- async function writePassword(t, accountId, passwordHash) {
81
- const exists = await t
82
- .selectFrom("accounts")
83
- .select("id")
84
- .where("id", "=", accountId)
85
- .executeTakeFirst();
86
- if (!exists)
87
- throw new ApiError("account.not_found", "Account not found");
88
- await t
89
- .insertInto("local_passwords")
90
- .values({ account_id: accountId, password_hash: passwordHash })
91
- .onConflict((oc) => oc.column("account_id").doUpdateSet({ password_hash: passwordHash, updated_at: new Date() }))
92
- .execute();
93
- }
94
- /** 账号服务:本地账号的创建、认证与管理。框架无关,由调用方注入 db。 */
95
- export class AccountsService {
55
+ /**
56
+ * Accounts: local account creation, authentication and administration. Every write is
57
+ * `@Transactional` (joining the caller's transaction when there is one); scrypt runs before any
58
+ * transaction opens.
59
+ */
60
+ let AccountsService = class AccountsService {
96
61
  db;
97
- constructor(db) {
62
+ txHost;
63
+ adminLock;
64
+ setupLock;
65
+ constructor(db, txHost, adminLock, setupLock) {
98
66
  this.db = db;
67
+ this.txHost = txHost;
68
+ this.adminLock = adminLock;
69
+ this.setupLock = setupLock;
99
70
  }
100
- /** 校验密码长度并算出哈希(scrypt,较慢):供需要在事务之外先算好哈希的调用方使用。 */
71
+ /** Checks the password length and hashes it (scrypt, slow): for callers that hash before their transaction opens. */
101
72
  async hashNewPassword(password) {
102
73
  validatePassword(password);
103
74
  return hashPassword(password);
104
75
  }
105
76
  /**
106
- * 建本地账号。传 `trx` 时在调用方的事务内插入;在事务内调用时应先在事务**之外**用 `hashNewPassword`
107
- * 算好 `passwordHash` 传进来,避免 scrypt 期间连接处于 idle in transaction。
77
+ * Creates a local account, in the caller's transaction when there is one. A caller inside a
78
+ * transaction hashes first with {@link hashNewPassword} and passes `passwordHash`, so the
79
+ * connection is never idle in transaction during scrypt.
108
80
  */
109
- async createLocal(input, trx, passwordHash) {
110
- const prepared = await prepareLocal(input, passwordHash);
111
- const run = (t) => insertLocal(t, prepared);
112
- return trx ? run(trx) : this.db.transaction().execute(run);
81
+ async createLocal(input, passwordHash) {
82
+ return this.insertLocal(await prepareLocal(input, passwordHash));
113
83
  }
114
84
  /**
115
- * 企业管理员建本地账号(可同时设为企业管理员):事务内取企业管理员锁并复核发起人仍是活跃企业管理员
116
- * (否则 `forbidden`),建号并写审计 `account.created`。密码哈希在取锁之前算好,不在锁内跑 scrypt。
85
+ * An enterprise admin creates a local account (optionally an enterprise admin): under the
86
+ * enterprise admin lock, re-checks that the actor is still an active enterprise admin (else
87
+ * `forbidden`), creates the account and audits `account.created`. The hash is computed before
88
+ * the lock.
117
89
  */
118
90
  async createByAdmin(input, actorAccountId, actorTokenId) {
119
- const prepared = await prepareLocal(input);
120
- return this.db.transaction().execute(async (trx) => {
121
- await lockEnterpriseAdminsAndAuthorize(trx, actorAccountId);
122
- const a = await insertLocal(trx, prepared);
123
- await audit(trx, {
124
- actorAccountId,
125
- ...(actorTokenId !== undefined && { actorTokenId }),
126
- action: "account.created",
127
- target: a.id,
128
- detail: { enterpriseAdmin: a.isEnterpriseAdmin },
129
- });
130
- return a;
91
+ return this.createByAdminIn(await prepareLocal(input), actorAccountId, actorTokenId);
92
+ }
93
+ async createByAdminIn(prepared, actorAccountId, actorTokenId) {
94
+ await this.adminLock.lockAndAuthorize(actorAccountId);
95
+ const a = await this.insertLocal(prepared);
96
+ await audit(this.db.db, {
97
+ actorAccountId,
98
+ ...(actorTokenId !== undefined && { actorTokenId }),
99
+ action: "account.created",
100
+ target: a.id,
101
+ detail: { enterpriseAdmin: a.isEnterpriseAdmin },
131
102
  });
103
+ return a;
104
+ }
105
+ /**
106
+ * CLI: creates an enterprise admin without checking whether the deployment is set up; a taken
107
+ * login → `account.login_taken`.
108
+ */
109
+ async createEnterpriseAdmin(input) {
110
+ return this.insertEnterpriseAdmin(input, await this.hashNewPassword(input.password));
111
+ }
112
+ /**
113
+ * CLI `admin create --if-none`: creates an enterprise admin only when no active one exists. The
114
+ * check and the insert run in one transaction under {@link SetupLock}, the lock the web setup
115
+ * takes, so concurrent runs (and a concurrent web setup) create exactly one. Returns undefined
116
+ * when an active enterprise admin already exists; a taken login still throws
117
+ * `account.login_taken`.
118
+ */
119
+ async createEnterpriseAdminIfNone(input) {
120
+ return this.createEnterpriseAdminIfNoneIn(input, await this.hashNewPassword(input.password));
121
+ }
122
+ async createEnterpriseAdminIfNoneIn(input, passwordHash) {
123
+ await this.setupLock.lock();
124
+ if ((await this.countEnterpriseAdmins()) > 0)
125
+ return undefined;
126
+ return this.insertEnterpriseAdmin(input, passwordHash);
127
+ }
128
+ async insertEnterpriseAdmin(input, passwordHash) {
129
+ const account = await this.createLocal({
130
+ login: input.login,
131
+ password: input.password,
132
+ displayName: input.displayName,
133
+ enterpriseAdmin: true,
134
+ ...(input.email !== undefined && { email: input.email }),
135
+ }, passwordHash);
136
+ await audit(this.db.db, {
137
+ action: "account.created",
138
+ target: account.id,
139
+ detail: { enterpriseAdmin: true, via: "cli" },
140
+ });
141
+ return account;
132
142
  }
133
143
  async authenticateLocal(login, password) {
134
144
  // 超长密码不可能正确(validatePassword 上限 256),不跑 scrypt 也不查库,免得被超长输入拖慢;
@@ -200,70 +210,71 @@ export class AccountsService {
200
210
  }
201
211
  async setPassword(accountId, password) {
202
212
  validatePassword(password);
203
- const passwordHash = await hashPassword(password);
204
- await this.db.transaction().execute((trx) => writePassword(trx, accountId, passwordHash));
213
+ await this.writePassword(accountId, await hashPassword(password));
205
214
  }
206
215
  /**
207
- * 用户改密码(R24):同一个 PG 事务里写新密码、吊销该账号除 `exceptSessionId` 外的全部会话
208
- * (`sessions.revoked_at`)与全部个人访问令牌,要么全部生效要么都不生效。scrypt 在 BEGIN 之前算好。
209
- * 返回被吊销的会话 id,调用方随后写 Redis 吊销标记(快速路径;鉴权以 PG `revoked_at` 为准,
210
- * 标记写失败也不会让这些会话继续可用)。
216
+ * A person changes their password (R24): one PG transaction writes the new password and revokes
217
+ * the account's sessions except `exceptSessionId` (`sessions.revoked_at`) and all its personal
218
+ * access tokens; all or nothing. scrypt runs before BEGIN. Returns the revoked session ids; the
219
+ * caller then writes the Redis revocation markers (the fast path: auth reads PG `revoked_at`,
220
+ * so a failed marker never keeps a session usable).
211
221
  */
212
222
  async changePassword(accountId, password, exceptSessionId) {
213
- const passwordHash = await this.hashNewPassword(password);
214
- return this.db.transaction().execute(async (trx) => {
215
- await writePassword(trx, accountId, passwordHash);
216
- const sessions = await trx
217
- .updateTable("sessions")
218
- .set({ revoked_at: sql `now()` })
219
- .where("account_id", "=", accountId)
220
- .where("revoked_at", "is", null)
221
- .where("id", "!=", exceptSessionId)
222
- .returning("id")
223
- .execute();
224
- await trx
225
- .updateTable("api_tokens")
226
- .set({ revoked_at: sql `now()` })
227
- .where("kind", "=", "personal")
228
- .where("account_id", "=", accountId)
229
- .where("revoked_at", "is", null)
230
- .execute();
231
- return sessions.map((r) => r.id);
232
- });
223
+ return this.changePasswordIn(accountId, await this.hashNewPassword(password), exceptSessionId);
224
+ }
225
+ async changePasswordIn(accountId, passwordHash, exceptSessionId) {
226
+ await this.writePassword(accountId, passwordHash);
227
+ const sessions = await this.db
228
+ .updateTable("sessions")
229
+ .set({ revoked_at: sql `now()` })
230
+ .where("account_id", "=", accountId)
231
+ .where("revoked_at", "is", null)
232
+ .where("id", "!=", exceptSessionId)
233
+ .returning("id")
234
+ .execute();
235
+ await this.db
236
+ .updateTable("api_tokens")
237
+ .set({ revoked_at: sql `now()` })
238
+ .where("kind", "=", "personal")
239
+ .where("account_id", "=", accountId)
240
+ .where("revoked_at", "is", null)
241
+ .execute();
242
+ return sessions.map((r) => r.id);
233
243
  }
234
244
  async update(id, patch, actorAccountId, actorTokenId) {
235
245
  return (await this.updateAccount(id, patch, actorAccountId, actorTokenId)).account;
236
246
  }
237
247
  /**
238
- * 企业管理员改账号。停用(`status: "disabled"`)时在**同一个 PG 事务**里吊销该账号的全部会话
239
- * (`sessions.revoked_at`)与个人访问令牌,要么都生效要么都不生效;返回被吊销的会话 id,
240
- * 调用方在提交后写 Redis 吊销标记(快速路径,失败只记 warn:鉴权以 PG 为准)。
248
+ * An enterprise admin changes an account. Disabling (`status: "disabled"`) revokes the
249
+ * account's sessions (`sessions.revoked_at`) and personal tokens in **the same PG transaction**,
250
+ * all or nothing; returns the revoked session ids, whose Redis markers the caller writes after
251
+ * the commit (the fast path; a failure is only a warning: auth reads PG).
241
252
  */
242
253
  async updateAccount(id, patch, actorAccountId, actorTokenId) {
243
- return this.db.transaction().execute(async (trx) => {
244
- // 所有企业管理员写操作在同一把锁下串行,并在锁内复核发起人仍是活跃企业管理员:
245
- // 既避免两个管理员并发互相撤销后一个都不剩,也让刚被撤销的管理员的在途请求失效
246
- await lockEnterpriseAdminsAndAuthorize(trx, actorAccountId);
247
- const before = await trx
248
- .selectFrom("accounts")
249
- .selectAll()
250
- .where("id", "=", id)
251
- .executeTakeFirst();
252
- if (!before)
253
- throw new ApiError("account.not_found", "Account not found");
254
- return this.applyUpdate(trx, before, patch, {
255
- actorAccountId,
256
- ...(actorTokenId !== undefined && { actorTokenId }),
257
- detail: patch,
258
- });
254
+ // Every enterprise admin write is serialized by one lock and re-checks the actor under it: two
255
+ // admins revoking each other concurrently cannot leave none, and a just-revoked admin's
256
+ // request in flight fails
257
+ await this.adminLock.lockAndAuthorize(actorAccountId);
258
+ const before = await this.db
259
+ .selectFrom("accounts")
260
+ .selectAll()
261
+ .where("id", "=", id)
262
+ .executeTakeFirst();
263
+ if (!before)
264
+ throw new ApiError("account.not_found", "Account not found");
265
+ return this.applyUpdate(before, patch, {
266
+ actorAccountId,
267
+ ...(actorTokenId !== undefined && { actorTokenId }),
268
+ detail: patch,
259
269
  });
260
270
  }
261
271
  /**
262
- * CLI 的 `capybara admin grant|revoke <login>`(没有发起账号):按本地登录名在 {@link lockEnterpriseAdmins}
263
- * 的事务里改企业管理员标记;撤销沿用 {@link updateAccount} 的「最后一个活跃企业管理员」复核
264
- * (`account.last_enterprise_admin`),在锁内判定,与网页撤销并发也不会一个都不剩。审计 `account.updated`
265
- * 不带发起账号,`detail.via = "cli"`。已是目标状态时不改、不写审计(`changed: false`)。
266
- * 登录名不存在 → `account.not_found`。
272
+ * The CLI's `capybara admin grant|revoke <login>` (no actor account): changes the enterprise
273
+ * admin flag by local login under the enterprise admin lock; revoking keeps the
274
+ * {@link updateAccount} "last active enterprise admin" check (`account.last_enterprise_admin`),
275
+ * decided under the lock, so it cannot race a web revoke into none. Audit `account.updated`
276
+ * without an actor, `detail.via = "cli"`. Already in the target state → no change and no audit
277
+ * (`changed: false`). Unknown login → `account.not_found`.
267
278
  */
268
279
  async setEnterpriseAdminByLogin(login, isEnterpriseAdmin) {
269
280
  let external;
@@ -273,32 +284,107 @@ export class AccountsService {
273
284
  catch {
274
285
  throw new ApiError("account.not_found", "Account not found");
275
286
  }
276
- return this.db.transaction().execute(async (trx) => {
277
- await lockEnterpriseAdmins(trx);
278
- const before = await trx
279
- .selectFrom("identities")
280
- .innerJoin("accounts", "accounts.id", "identities.account_id")
281
- .selectAll("accounts")
282
- .where("identities.source", "=", "local")
283
- .where("identities.external_id", "=", external)
284
- .executeTakeFirst();
285
- if (!before)
286
- throw new ApiError("account.not_found", "Account not found");
287
- if (before.is_enterprise_admin === isEnterpriseAdmin) {
288
- return { account: toAccount(before), changed: false };
289
- }
290
- const patch = { isEnterpriseAdmin };
291
- const { account } = await this.applyUpdate(trx, before, patch, {
292
- detail: { ...patch, via: "cli" },
293
- });
294
- return { account, changed: true };
287
+ return this.setEnterpriseAdminIn(external, isEnterpriseAdmin);
288
+ }
289
+ async setEnterpriseAdminIn(external, isEnterpriseAdmin) {
290
+ await this.adminLock.lock();
291
+ const before = await this.db
292
+ .selectFrom("identities")
293
+ .innerJoin("accounts", "accounts.id", "identities.account_id")
294
+ .selectAll("accounts")
295
+ .where("identities.source", "=", "local")
296
+ .where("identities.external_id", "=", external)
297
+ .executeTakeFirst();
298
+ if (!before)
299
+ throw new ApiError("account.not_found", "Account not found");
300
+ if (before.is_enterprise_admin === isEnterpriseAdmin) {
301
+ return { account: toAccount(before), changed: false };
302
+ }
303
+ const patch = { isEnterpriseAdmin };
304
+ const { account } = await this.applyUpdate(before, patch, {
305
+ detail: { ...patch, via: "cli" },
295
306
  });
307
+ return { account, changed: true };
308
+ }
309
+ /** 全部账号数(含停用的;后台概览)。 */
310
+ async count() {
311
+ const r = await this.db
312
+ .selectFrom("accounts")
313
+ .select((eb) => eb.fn.countAll().as("n"))
314
+ .executeTakeFirstOrThrow();
315
+ return Number(r.n);
316
+ }
317
+ /** Active (status = active) enterprise admins, in the context's transaction when there is one. */
318
+ async countEnterpriseAdmins() {
319
+ const r = await this.db
320
+ .selectFrom("accounts")
321
+ .select((eb) => eb.fn.countAll().as("n"))
322
+ .where("is_enterprise_admin", "=", true)
323
+ .where("status", "=", "active")
324
+ .executeTakeFirstOrThrow();
325
+ return Number(r.n);
326
+ }
327
+ /** Inserts the account, its local identity and password; a taken login → `account.login_taken`. */
328
+ async insertLocal(p) {
329
+ const { input, login, passwordHash } = p;
330
+ const id = randomUUID();
331
+ const row = await this.db
332
+ .insertInto("accounts")
333
+ .values({
334
+ id,
335
+ display_name: input.displayName,
336
+ email: input.email ?? null,
337
+ is_enterprise_admin: input.enterpriseAdmin ?? false,
338
+ })
339
+ .returningAll()
340
+ .executeTakeFirstOrThrow();
341
+ try {
342
+ await this.db
343
+ .insertInto("identities")
344
+ .values({
345
+ source: "local",
346
+ external_id: login,
347
+ account_id: id,
348
+ email: input.email ?? null,
349
+ linked_via: "local",
350
+ })
351
+ .execute();
352
+ }
353
+ catch (e) {
354
+ if (isLoginTaken(e)) {
355
+ throw new ApiError("account.login_taken", "Login is already taken");
356
+ }
357
+ throw e;
358
+ }
359
+ await this.db
360
+ .insertInto("local_passwords")
361
+ .values({ account_id: id, password_hash: passwordHash })
362
+ .execute();
363
+ return toAccount(row);
364
+ }
365
+ /** Writes (or replaces) the local password hash; a missing account → `account.not_found`. */
366
+ async writePassword(accountId, passwordHash) {
367
+ const exists = await this.db
368
+ .selectFrom("accounts")
369
+ .select("id")
370
+ .where("id", "=", accountId)
371
+ .executeTakeFirst();
372
+ if (!exists)
373
+ throw new ApiError("account.not_found", "Account not found");
374
+ await this.db
375
+ .insertInto("local_passwords")
376
+ .values({ account_id: accountId, password_hash: passwordHash })
377
+ .onConflict((oc) => oc
378
+ .column("account_id")
379
+ .doUpdateSet({ password_hash: passwordHash, updated_at: new Date() }))
380
+ .execute();
296
381
  }
297
382
  /**
298
- * 已持企业管理员锁的事务内改账号:改行、复核「最后一个活跃企业管理员」、写审计 `account.updated`;
299
- * 停用时吊销该账号的全部会话与个人令牌。
383
+ * Changes the account under the enterprise admin lock the caller holds: updates the row,
384
+ * re-checks "the last active enterprise admin", audits `account.updated`; disabling revokes the
385
+ * account's sessions and personal tokens.
300
386
  */
301
- async applyUpdate(trx, before, patch, auditAs) {
387
+ async applyUpdate(before, patch, auditAs) {
302
388
  const id = before.id;
303
389
  const values = { updated_at: new Date() };
304
390
  if (patch.displayName !== undefined)
@@ -307,7 +393,7 @@ export class AccountsService {
307
393
  values.status = patch.status;
308
394
  if (patch.isEnterpriseAdmin !== undefined)
309
395
  values.is_enterprise_admin = patch.isEnterpriseAdmin;
310
- const row = await trx
396
+ const row = await this.db
311
397
  .updateTable("accounts")
312
398
  .set(values)
313
399
  .where("id", "=", id)
@@ -315,10 +401,10 @@ export class AccountsService {
315
401
  .executeTakeFirstOrThrow();
316
402
  const wasActiveAdmin = before.is_enterprise_admin && before.status === "active";
317
403
  const isActiveAdmin = row.is_enterprise_admin && row.status === "active";
318
- if (wasActiveAdmin && !isActiveAdmin && (await this.countEnterpriseAdmins(trx)) === 0) {
404
+ if (wasActiveAdmin && !isActiveAdmin && (await this.countEnterpriseAdmins()) === 0) {
319
405
  throw new ApiError("account.last_enterprise_admin", "Cannot remove the last active enterprise admin");
320
406
  }
321
- await audit(trx, {
407
+ await audit(this.db.db, {
322
408
  ...(auditAs.actorAccountId !== undefined && { actorAccountId: auditAs.actorAccountId }),
323
409
  ...(auditAs.actorTokenId !== undefined && { actorTokenId: auditAs.actorTokenId }),
324
410
  action: "account.updated",
@@ -327,15 +413,16 @@ export class AccountsService {
327
413
  });
328
414
  let revokedSessionIds = [];
329
415
  if (patch.status === "disabled") {
330
- // 鉴权每次请求实时读账号状态,停用已立即生效;这里再吊销凭据,重新启用后旧凭据也不复活
331
- const sessions = await trx
416
+ // Auth reads the account status on every request, so disabling is effective at once; the
417
+ // credentials are revoked too, so re-enabling does not bring old ones back
418
+ const sessions = await this.db
332
419
  .updateTable("sessions")
333
420
  .set({ revoked_at: sql `now()` })
334
421
  .where("account_id", "=", id)
335
422
  .where("revoked_at", "is", null)
336
423
  .returning("id")
337
424
  .execute();
338
- await trx
425
+ await this.db
339
426
  .updateTable("api_tokens")
340
427
  .set({ revoked_at: sql `now()` })
341
428
  .where("kind", "=", "personal")
@@ -346,22 +433,54 @@ export class AccountsService {
346
433
  }
347
434
  return { account: toAccount(row), revokedSessionIds };
348
435
  }
349
- /** 全部账号数(含停用的;后台概览)。 */
350
- async count() {
351
- const r = await this.db
352
- .selectFrom("accounts")
353
- .select((eb) => eb.fn.countAll().as("n"))
354
- .executeTakeFirstOrThrow();
355
- return Number(r.n);
356
- }
357
- /** 活跃(status = active)的企业管理员数量。 */
358
- async countEnterpriseAdmins(trx) {
359
- const r = await (trx ?? this.db)
360
- .selectFrom("accounts")
361
- .select((eb) => eb.fn.countAll().as("n"))
362
- .where("is_enterprise_admin", "=", true)
363
- .where("status", "=", "active")
364
- .executeTakeFirstOrThrow();
365
- return Number(r.n);
366
- }
367
- }
436
+ };
437
+ __decorate([
438
+ Transactional()
439
+ ], AccountsService.prototype, "createByAdminIn", null);
440
+ __decorate([
441
+ Transactional()
442
+ ], AccountsService.prototype, "createEnterpriseAdminIfNoneIn", null);
443
+ __decorate([
444
+ Transactional()
445
+ ], AccountsService.prototype, "insertEnterpriseAdmin", null);
446
+ __decorate([
447
+ Transactional()
448
+ ], AccountsService.prototype, "changePasswordIn", null);
449
+ __decorate([
450
+ Transactional()
451
+ ], AccountsService.prototype, "updateAccount", null);
452
+ __decorate([
453
+ Transactional()
454
+ ], AccountsService.prototype, "setEnterpriseAdminIn", null);
455
+ __decorate([
456
+ Transactional()
457
+ ], AccountsService.prototype, "insertLocal", null);
458
+ __decorate([
459
+ Transactional()
460
+ ], AccountsService.prototype, "writePassword", null);
461
+ __decorate([
462
+ Transactional({ propagation: "mandatory" })
463
+ ], AccountsService.prototype, "applyUpdate", null);
464
+ AccountsService = __decorate([
465
+ Injectable(),
466
+ __param(0, Inject(KernelDb)),
467
+ __param(1, Inject(TransactionHost)),
468
+ __param(2, Inject(EnterpriseAdminLock)),
469
+ __param(3, Inject(SetupLock))
470
+ ], AccountsService);
471
+ export { AccountsService };
472
+ /**
473
+ * {@link AccountsService} with the locks it takes; needs only the database. Part of
474
+ * `IdentityModule`; the CLI's `admin create` / `admin grant` contexts and `@capybara-hq/testing`'s
475
+ * `createLocalAccount` import it alone.
476
+ */
477
+ let AccountsModule = class AccountsModule {
478
+ };
479
+ AccountsModule = __decorate([
480
+ Module({
481
+ imports: [SetupLockModule, EnterpriseAdminLockModule],
482
+ providers: [AccountsService],
483
+ exports: [AccountsService],
484
+ })
485
+ ], AccountsModule);
486
+ export { AccountsModule };
@@ -1,6 +1,7 @@
1
- import { type Transaction } from "kysely";
2
1
  import { z } from "zod";
3
- import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { TransactionHost } from "../infra/database/transaction-host.js";
4
+ import { OrgLock } from "../orgs/org-lock.js";
4
5
  export interface ApiTokenRecord {
5
6
  id: string;
6
7
  kind: "personal" | "service";
@@ -21,11 +22,13 @@ type Scope = {
21
22
  };
22
23
  /**
23
24
  * API 令牌服务:个人令牌(`cap_pat_`,代表账号本人)与服务令牌(`cap_svc_`,属于组织、带角色)。
24
- * 库里只存 sha256;明文只在创建时返回一次。框架无关,由调用方注入 db。
25
+ * 库里只存 sha256;明文只在创建时返回一次。
25
26
  */
26
27
  export declare class ApiTokenService {
27
28
  private readonly db;
28
- constructor(db: KernelDb);
29
+ readonly txHost: TransactionHost;
30
+ private readonly orgLock;
31
+ constructor(db: KernelDb, txHost: TransactionHost, orgLock: OrgLock);
29
32
  createPersonal(accountId: string, input: {
30
33
  name: string;
31
34
  expiresAt?: Date | undefined;
@@ -63,9 +66,10 @@ export declare class ApiTokenService {
63
66
  authenticate(token: string): Promise<ApiTokenRecord | null>;
64
67
  /** 列出该 scope 下未吊销的令牌(含已过期),按创建时间升序。 */
65
68
  list(scope: Scope): Promise<ApiTokenRecord[]>;
66
- /** 吊销令牌;令牌不存在、已吊销或不在该 scope 内 → `token.not_found`。 */
67
- revoke(id: string, scope: Scope, trx?: Transaction<KernelDatabase>): Promise<void>;
68
- revokeAllForOrg(orgId: string, trx?: Transaction<KernelDatabase>): Promise<void>;
69
+ /** Revokes a token (in the context's transaction when there is one); missing, revoked or out of scope → `token.not_found`. */
70
+ revoke(id: string, scope: Scope): Promise<void>;
71
+ /** Revokes the org's service tokens (in the context's transaction when there is one). */
72
+ revokeAllForOrg(orgId: string): Promise<void>;
69
73
  revokeAllPersonal(accountId: string): Promise<void>;
70
74
  private scoped;
71
75
  private insertToken;