@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
@@ -10,37 +10,42 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
10
10
  import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post, Req, Res, } from "@nestjs/common";
11
11
  import { z } from "zod";
12
12
  import { ApiError } from "../errors.js";
13
- import { INVITATIONS, KERNEL_CONFIG, RATE_LIMITER, SESSIONS } from "../http/tokens.js";
14
- import { ZodPipe } from "../http/zod.pipe.js";
15
13
  import { clientMeta } from "../identity/auth.controller.js";
16
14
  import { setSessionCookies } from "../identity/cookies.js";
17
15
  import { CurrentPrincipal, Public, patTokenId, requireUser, } from "../identity/principal.js";
18
- import { INVITABLE_ROLES, MAX_INVITATION_HOURS, } from "./invitations.service.js";
16
+ import { SessionService } from "../identity/sessions.js";
17
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
18
+ import { CredentialThrottler } from "../infra/throttler/credential-throttler.js";
19
+ import { createZodDto } from "../infra/validation/create-zod-dto.js";
20
+ import { parseWithZod } from "../infra/validation/parse-with-zod.js";
21
+ import { ZBody } from "../infra/validation/zod-params.js";
22
+ import { INVITABLE_ROLES, InvitationsService, MAX_INVITATION_HOURS, } from "./invitations.service.js";
19
23
  import { CurrentOrg, OrgAction } from "./org.guard.js";
20
- const CreateBody = z.object({
24
+ const CreateSchema = z.object({
21
25
  role: z.enum(INVITABLE_ROLES),
22
26
  expiresInHours: z.number().int().min(1).max(MAX_INVITATION_HOURS).optional(),
23
27
  });
28
+ class InvitationCreateBody extends createZodDto(CreateSchema, "InvitationCreateBody") {
29
+ }
30
+ /** Validated inside the handler, after the attempt is reserved (a signed-in principal sends none). */
24
31
  const SignupBody = z.object({
25
32
  login: z.string(),
26
33
  password: z.string(),
27
34
  displayName: z.string().min(1).max(100),
28
35
  });
29
- const signupPipe = new ZodPipe(SignupBody);
30
- /** 接受邀请的限流(scope `inv`):同一令牌 10 次、同一客户端 IP 20 次 / 900s。 */
31
- const ACCEPT_LIMIT_PER_TOKEN = 10;
32
- const ACCEPT_LIMIT_PER_IP = 20;
36
+ /** Accepting an invitation is throttled per token (10) and per client IP (20) every 900 s. */
37
+ const ACCEPT_THROTTLERS = ["invitation", "invitation-ip"];
33
38
  /** 组织邀请:组织内管理(`/api/v1/orgs/:orgId/invitations`)与凭令牌预览 / 接受(`/api/v1/invitations/:token`,公开)。 */
34
39
  let InvitationsController = class InvitationsController {
35
40
  invitations;
36
41
  sessions;
37
42
  config;
38
- limiter;
39
- constructor(invitations, sessions, config, limiter) {
43
+ throttler;
44
+ constructor(invitations, sessions, config, throttler) {
40
45
  this.invitations = invitations;
41
46
  this.sessions = sessions;
42
47
  this.config = config;
43
- this.limiter = limiter;
48
+ this.throttler = throttler;
44
49
  }
45
50
  /** 令牌只在此返回一次。 */
46
51
  async create(principal, org, body) {
@@ -69,25 +74,21 @@ let InvitationsController = class InvitationsController {
69
74
  throw new ApiError("forbidden", "Service tokens cannot accept invitations");
70
75
  }
71
76
  const meta = clientMeta(req);
72
- const rl = await this.limiter.reserveScoped("inv", token, meta.ip, ACCEPT_LIMIT_PER_TOKEN, ACCEPT_LIMIT_PER_IP);
73
- if (!rl.allowed) {
74
- reply.header("retry-after", String(rl.retryAfterSeconds));
75
- throw new ApiError("auth.rate_limited", "Too many invitation attempts; try again later");
76
- }
77
+ await this.throttler.reserve(ACCEPT_THROTTLERS, req, reply);
77
78
  let result;
78
79
  if (principal) {
79
80
  result = await this.invitations.accept(token, { accountId: principal.account.id });
80
- await this.limiter.succeededScoped("inv", token, meta.ip);
81
+ await this.throttler.succeeded(ACCEPT_THROTTLERS, req);
81
82
  }
82
83
  else {
83
- const signup = signupPipe.transform(body);
84
+ const signup = parseWithZod(SignupBody, body);
84
85
  // 新账号、成员关系与会话行在同一事务里写入;Cookie 在提交之后才设置
85
- const { extra: session, ...rest } = await this.invitations.accept(token, { signup }, (t, account) => this.sessions.create(account.id, meta, t));
86
+ const { extra: session, ...rest } = await this.invitations.accept(token, { signup }, (account) => this.sessions.create(account.id, meta));
86
87
  if (!session)
87
88
  throw new Error("signup completed without a session");
88
89
  result = rest;
89
- await this.limiter.succeededScoped("inv", token, meta.ip);
90
- setSessionCookies(reply, session, this.config());
90
+ await this.throttler.succeeded(ACCEPT_THROTTLERS, req);
91
+ setSessionCookies(reply, session, this.config.get());
91
92
  }
92
93
  return result;
93
94
  }
@@ -97,7 +98,7 @@ __decorate([
97
98
  OrgAction("org.invitations.manage"),
98
99
  __param(0, CurrentPrincipal()),
99
100
  __param(1, CurrentOrg()),
100
- __param(2, Body(new ZodPipe(CreateBody)))
101
+ __param(2, ZBody(InvitationCreateBody))
101
102
  ], InvitationsController.prototype, "create", null);
102
103
  __decorate([
103
104
  Get("orgs/:orgId/invitations"),
@@ -129,9 +130,9 @@ __decorate([
129
130
  ], InvitationsController.prototype, "accept", null);
130
131
  InvitationsController = __decorate([
131
132
  Controller("api/v1"),
132
- __param(0, Inject(INVITATIONS)),
133
- __param(1, Inject(SESSIONS)),
134
- __param(2, Inject(KERNEL_CONFIG)),
135
- __param(3, Inject(RATE_LIMITER))
133
+ __param(0, Inject(InvitationsService)),
134
+ __param(1, Inject(SessionService)),
135
+ __param(2, Inject(KernelConfigService)),
136
+ __param(3, Inject(CredentialThrottler))
136
137
  ], InvitationsController);
137
138
  export { InvitationsController };
@@ -1,9 +1,9 @@
1
- import { type Transaction } from "kysely";
2
- import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
3
- import type { Account, AccountsService } from "../identity/accounts.js";
4
- import type { MembersService } from "./members.service.js";
1
+ import { type Account, AccountsService } from "../identity/accounts.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { TransactionHost } from "../infra/database/transaction-host.js";
4
+ import { MembersService } from "./members.service.js";
5
+ import { OrgLock } from "./org-lock.js";
5
6
  import { type OrgRole } from "./roles.js";
6
- type Trx = Transaction<KernelDatabase>;
7
7
  /** 可邀请的角色(owner 只能经转让获得)。 */
8
8
  export declare const INVITABLE_ROLES: readonly ["admin", "member", "guest"];
9
9
  export type InvitableRole = (typeof INVITABLE_ROLES)[number];
@@ -32,13 +32,15 @@ export type AcceptAs = {
32
32
  /**
33
33
  * 组织邀请。令牌 `cap_inv_` + 32 字节 base64url,库里只存 SHA-256(按 hash 在 SQL 里查找)。
34
34
  * 写操作(create / revoke)与成员服务一样先锁组织行,并在锁内实时重读发起人角色(只接收账号 id,不接收角色)。
35
- * 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke 死锁。框架无关,由调用方注入依赖。
35
+ * 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke 死锁。
36
36
  */
37
37
  export declare class InvitationsService {
38
38
  private readonly db;
39
+ readonly txHost: TransactionHost;
39
40
  private readonly accounts;
40
41
  private readonly members;
41
- constructor(db: KernelDb, accounts: AccountsService, members: MembersService);
42
+ private readonly orgLock;
43
+ constructor(db: KernelDb, txHost: TransactionHost, accounts: AccountsService, members: MembersService, orgLock: OrgLock);
42
44
  create(orgId: string, input: {
43
45
  role: InvitableRole;
44
46
  expiresInHours?: number | undefined;
@@ -46,6 +48,7 @@ export declare class InvitationsService {
46
48
  invitation: Invitation;
47
49
  token: string;
48
50
  }>;
51
+ private createIn;
49
52
  list(orgId: string): Promise<(Invitation & {
50
53
  status: InvitationStatus;
51
54
  })[]>;
@@ -65,16 +68,16 @@ export declare class InvitationsService {
65
68
  * signup 时先在事务外分类一次(无效令牌不白跑 scrypt),再在 BEGIN 之前算好密码哈希,
66
69
  * 事务内只有读写,连接不会在 scrypt 期间处于 idle in transaction。
67
70
  */
68
- accept<T = undefined>(token: string, who: AcceptAs, inTx?: (t: Trx, account: Account) => Promise<T>): Promise<{
71
+ accept<T = undefined>(token: string, who: AcceptAs, inTx?: (account: Account) => Promise<T>): Promise<{
69
72
  account: Account;
70
73
  orgId: string;
71
74
  role: OrgRole;
72
75
  extra: T | undefined;
73
76
  }>;
77
+ private acceptIn;
74
78
  /**
75
79
  * 按令牌 hash 读邀请并分类:不存在、已撤销或组织已软删除 → `invitation.invalid`;
76
80
  * 已接受 → `invitation.used`;已过期 → `invitation.expired`。过期按数据库时间判定。
77
81
  */
78
82
  private classify;
79
83
  }
80
- export {};
@@ -1,9 +1,24 @@
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 { randomBytes, 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 { AccountsService } from "../identity/accounts.js";
4
15
  import { audit } from "../identity/audit.js";
5
16
  import { sha256Hex } from "../identity/hash.js";
6
- import { lockOrgAndAuthorize, tryLockOrg } from "./org-lock.js";
17
+ import { KernelDb } from "../infra/database/kernel-db.js";
18
+ import { TransactionHost } from "../infra/database/transaction-host.js";
19
+ import { Transactional } from "../infra/database/transactional.decorator.js";
20
+ import { MembersService } from "./members.service.js";
21
+ import { OrgLock } from "./org-lock.js";
7
22
  import { roleAtLeast } from "./roles.js";
8
23
  /** 可邀请的角色(owner 只能经转让获得)。 */
9
24
  export const INVITABLE_ROLES = ["admin", "member", "guest"];
@@ -27,16 +42,20 @@ const forbidden = () => new ApiError("forbidden", "Insufficient organization rol
27
42
  /**
28
43
  * 组织邀请。令牌 `cap_inv_` + 32 字节 base64url,库里只存 SHA-256(按 hash 在 SQL 里查找)。
29
44
  * 写操作(create / revoke)与成员服务一样先锁组织行,并在锁内实时重读发起人角色(只接收账号 id,不接收角色)。
30
- * 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke 死锁。框架无关,由调用方注入依赖。
45
+ * 加锁顺序统一为「组织行 → 邀请行」,accept 也先锁组织行,避免与 revoke 死锁。
31
46
  */
32
- export class InvitationsService {
47
+ let InvitationsService = class InvitationsService {
33
48
  db;
49
+ txHost;
34
50
  accounts;
35
51
  members;
36
- constructor(db, accounts, members) {
52
+ orgLock;
53
+ constructor(db, txHost, accounts, members, orgLock) {
37
54
  this.db = db;
55
+ this.txHost = txHost;
38
56
  this.accounts = accounts;
39
57
  this.members = members;
58
+ this.orgLock = orgLock;
40
59
  }
41
60
  async create(orgId, input, actorAccountId, actorTokenId) {
42
61
  if (!INVITABLE_ROLES.includes(input.role)) {
@@ -47,32 +66,34 @@ export class InvitationsService {
47
66
  throw new ApiError("validation_failed", `expiresInHours must be an integer between 1 and ${MAX_INVITATION_HOURS}`);
48
67
  }
49
68
  const token = TOKEN_PREFIX + randomBytes(32).toString("base64url");
50
- return this.db.transaction().execute(async (t) => {
51
- const { role: actorRole } = await lockOrgAndAuthorize(t, orgId, actorAccountId, "org.invitations.manage");
52
- if (!roleAtLeast(actorRole, input.role))
53
- throw forbidden();
54
- const row = await t
55
- .insertInto("invitations")
56
- .values({
57
- id: randomUUID(),
58
- org_id: orgId,
59
- role: input.role,
60
- token_hash: sha256Hex(token),
61
- created_by: actorAccountId,
62
- expires_at: sql `now() + make_interval(hours => ${hours})`,
63
- })
64
- .returningAll()
65
- .executeTakeFirstOrThrow();
66
- await audit(t, {
67
- actorAccountId,
68
- ...(actorTokenId !== undefined && { actorTokenId }),
69
- orgId,
70
- action: "org.invitation.created",
71
- target: row.id,
72
- detail: { role: input.role, expiresAt: row.expires_at.toISOString() },
73
- });
74
- return { invitation: toInvitation(row), token };
69
+ return this.createIn(orgId, input.role, hours, token, actorAccountId, actorTokenId);
70
+ }
71
+ async createIn(orgId, role, hours, token, actorAccountId, actorTokenId) {
72
+ const input = { role };
73
+ const { role: actorRole } = await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.invitations.manage");
74
+ if (!roleAtLeast(actorRole, input.role))
75
+ throw forbidden();
76
+ const row = await this.db
77
+ .insertInto("invitations")
78
+ .values({
79
+ id: randomUUID(),
80
+ org_id: orgId,
81
+ role: input.role,
82
+ token_hash: sha256Hex(token),
83
+ created_by: actorAccountId,
84
+ expires_at: sql `now() + make_interval(hours => ${hours})`,
85
+ })
86
+ .returningAll()
87
+ .executeTakeFirstOrThrow();
88
+ await audit(this.db.db, {
89
+ actorAccountId,
90
+ ...(actorTokenId !== undefined && { actorTokenId }),
91
+ orgId,
92
+ action: "org.invitation.created",
93
+ target: row.id,
94
+ detail: { role: input.role, expiresAt: row.expires_at.toISOString() },
75
95
  });
96
+ return { invitation: toInvitation(row), token };
76
97
  }
77
98
  async list(orgId) {
78
99
  const rows = await this.db
@@ -96,38 +117,36 @@ export class InvitationsService {
96
117
  }
97
118
  /** 撤销;不属于该组织 → `invitation.invalid`;已接受 → `invitation.used`;已撤销则无操作。 */
98
119
  async revoke(orgId, id, actorAccountId, actorTokenId) {
99
- await this.db.transaction().execute(async (t) => {
100
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "org.invitations.manage");
101
- const row = await t
102
- .selectFrom("invitations")
103
- .selectAll()
104
- .where("id", "=", id)
105
- .where("org_id", "=", orgId)
106
- .forUpdate()
107
- .executeTakeFirst();
108
- if (!row)
109
- throw invalid();
110
- if (row.accepted_at)
111
- throw new ApiError("invitation.used", "Invitation was already used");
112
- if (row.revoked_at)
113
- return;
114
- await t
115
- .updateTable("invitations")
116
- .set({ revoked_at: sql `now()` })
117
- .where("id", "=", id)
118
- .execute();
119
- await audit(t, {
120
- actorAccountId,
121
- ...(actorTokenId !== undefined && { actorTokenId }),
122
- orgId,
123
- action: "org.invitation.revoked",
124
- target: id,
125
- detail: { role: row.role },
126
- });
120
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "org.invitations.manage");
121
+ const row = await this.db
122
+ .selectFrom("invitations")
123
+ .selectAll()
124
+ .where("id", "=", id)
125
+ .where("org_id", "=", orgId)
126
+ .forUpdate()
127
+ .executeTakeFirst();
128
+ if (!row)
129
+ throw invalid();
130
+ if (row.accepted_at)
131
+ throw new ApiError("invitation.used", "Invitation was already used");
132
+ if (row.revoked_at)
133
+ return;
134
+ await this.db
135
+ .updateTable("invitations")
136
+ .set({ revoked_at: sql `now()` })
137
+ .where("id", "=", id)
138
+ .execute();
139
+ await audit(this.db.db, {
140
+ actorAccountId,
141
+ ...(actorTokenId !== undefined && { actorTokenId }),
142
+ orgId,
143
+ action: "org.invitation.revoked",
144
+ target: id,
145
+ detail: { role: row.role },
127
146
  });
128
147
  }
129
148
  async preview(token) {
130
- const r = await this.classify(this.db, token);
149
+ const r = await this.classify(token);
131
150
  return { org: { id: r.org_id, name: r.org_name }, role: r.role, expiresAt: r.expires_at };
132
151
  }
133
152
  /**
@@ -145,47 +164,48 @@ export class InvitationsService {
145
164
  throw new ApiError("account.not_found", "Account not found");
146
165
  }
147
166
  else {
148
- await this.classify(this.db, token);
167
+ await this.classify(token);
149
168
  passwordHash = await this.accounts.hashNewPassword(who.signup.password);
150
169
  }
151
- return this.db.transaction().execute(async (t) => {
152
- const inv = await this.classify(t, token);
153
- // 先建账号再锁组织行,缩短持锁时间;失败时随事务回滚,不残留账号
154
- const account = existing ?? (await this.accounts.createLocal(signupOf(who), t, passwordHash));
155
- if (!(await tryLockOrg(t, inv.org_id)))
156
- throw invalid();
157
- const taken = await t
158
- .updateTable("invitations")
159
- .set({ accepted_at: sql `now()`, accepted_by: account.id })
160
- .where("id", "=", inv.id)
161
- .where("accepted_at", "is", null)
162
- .where("revoked_at", "is", null)
163
- .where(sql `expires_at > now()`)
164
- .returning("id")
165
- .executeTakeFirst();
166
- if (!taken) {
167
- await this.classify(t, token);
168
- throw new ApiError("invitation.used", "Invitation was already used");
169
- }
170
- await this.members.add(inv.org_id, account.id, inv.role, account.id, t);
171
- await audit(t, {
172
- actorAccountId: account.id,
173
- orgId: inv.org_id,
174
- action: "org.invitation.accepted",
175
- target: inv.id,
176
- detail: { role: inv.role, signup: "signup" in who },
177
- });
178
- // 凭邀请注册时在同一事务里建会话:失败整体回滚,不残留没有会话的新账号
179
- const extra = inTx ? await inTx(t, account) : undefined;
180
- return { account, orgId: inv.org_id, role: inv.role, extra };
170
+ return this.acceptIn(token, who, existing, passwordHash, inTx);
171
+ }
172
+ async acceptIn(token, who, existing, passwordHash, inTx) {
173
+ const inv = await this.classify(token);
174
+ // 先建账号再锁组织行,缩短持锁时间;失败时随事务回滚,不残留账号
175
+ const account = existing ?? (await this.accounts.createLocal(signupOf(who), passwordHash));
176
+ if (!(await this.orgLock.tryLock(inv.org_id)))
177
+ throw invalid();
178
+ const taken = await this.db
179
+ .updateTable("invitations")
180
+ .set({ accepted_at: sql `now()`, accepted_by: account.id })
181
+ .where("id", "=", inv.id)
182
+ .where("accepted_at", "is", null)
183
+ .where("revoked_at", "is", null)
184
+ .where(sql `expires_at > now()`)
185
+ .returning("id")
186
+ .executeTakeFirst();
187
+ if (!taken) {
188
+ await this.classify(token);
189
+ throw new ApiError("invitation.used", "Invitation was already used");
190
+ }
191
+ await this.members.add(inv.org_id, account.id, inv.role, account.id);
192
+ await audit(this.db.db, {
193
+ actorAccountId: account.id,
194
+ orgId: inv.org_id,
195
+ action: "org.invitation.accepted",
196
+ target: inv.id,
197
+ detail: { role: inv.role, signup: "signup" in who },
181
198
  });
199
+ // 凭邀请注册时在同一事务里建会话:失败整体回滚,不残留没有会话的新账号
200
+ const extra = inTx ? await inTx(account) : undefined;
201
+ return { account, orgId: inv.org_id, role: inv.role, extra };
182
202
  }
183
203
  /**
184
204
  * 按令牌 hash 读邀请并分类:不存在、已撤销或组织已软删除 → `invitation.invalid`;
185
205
  * 已接受 → `invitation.used`;已过期 → `invitation.expired`。过期按数据库时间判定。
186
206
  */
187
- async classify(db, token) {
188
- const r = await db
207
+ async classify(token) {
208
+ const r = await this.db
189
209
  .selectFrom("invitations")
190
210
  .innerJoin("orgs", "orgs.id", "invitations.org_id")
191
211
  .select([
@@ -209,7 +229,25 @@ export class InvitationsService {
209
229
  throw new ApiError("invitation.expired", "Invitation has expired");
210
230
  return r;
211
231
  }
212
- }
232
+ };
233
+ __decorate([
234
+ Transactional()
235
+ ], InvitationsService.prototype, "createIn", null);
236
+ __decorate([
237
+ Transactional()
238
+ ], InvitationsService.prototype, "revoke", null);
239
+ __decorate([
240
+ Transactional()
241
+ ], InvitationsService.prototype, "acceptIn", null);
242
+ InvitationsService = __decorate([
243
+ Injectable(),
244
+ __param(0, Inject(KernelDb)),
245
+ __param(1, Inject(TransactionHost)),
246
+ __param(2, Inject(AccountsService)),
247
+ __param(3, Inject(MembersService)),
248
+ __param(4, Inject(OrgLock))
249
+ ], InvitationsService);
250
+ export { InvitationsService };
213
251
  function signupOf(who) {
214
252
  if (!("signup" in who))
215
253
  throw new Error("unreachable");
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The maintenance job scheduler ids the offboarding sweep and the directory scan had before
3
+ * becoming `@LockedCron` jobs (retired at worker start, `RETIRED_SCHEDULER_IDS`). A leaf module.
4
+ */
5
+ /** The offboarding sweep's old scheduler (every 10 minutes). */
6
+ export declare const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
7
+ /** The directory scan's old scheduler (hourly). */
8
+ export declare const DIRECTORY_SCAN_SCHEDULER_ID = "directory-scan-hourly";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The maintenance job scheduler ids the offboarding sweep and the directory scan had before
3
+ * becoming `@LockedCron` jobs (retired at worker start, `RETIRED_SCHEDULER_IDS`). A leaf module.
4
+ */
5
+ /** The offboarding sweep's old scheduler (every 10 minutes). */
6
+ export const OFFBOARD_SWEEP_SCHEDULER_ID = "offboard-sweep-every-10m";
7
+ /** The directory scan's old scheduler (hourly). */
8
+ export const DIRECTORY_SCAN_SCHEDULER_ID = "directory-scan-hourly";
@@ -1,9 +1,10 @@
1
- import type { Transaction } from "kysely";
2
- import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
1
+ import type { KernelSchemaDb } from "../db/kernel-schema.js";
3
2
  import type { Account } from "../identity/accounts.js";
4
- import type { Offboarding } from "./offboarding.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
4
+ import { TransactionHost } from "../infra/database/transaction-host.js";
5
+ import { Offboarding } from "./offboarding.js";
6
+ import { OrgLock } from "./org-lock.js";
5
7
  import type { OrgRole } from "./roles.js";
6
- type Trx = Transaction<KernelDatabase>;
7
8
  export interface Member {
8
9
  account: Pick<Account, "id" | "displayName" | "email">;
9
10
  role: OrgRole;
@@ -15,26 +16,29 @@ export interface Member {
15
16
  * 账号是不是某个组织的匿名访客(`org_anonymous_accounts`)。匿名访客没有登录方式,只能以 guest 身份
16
17
  * 代表 IM 里未绑定的人:不能被授予别的角色、成为 owner、指派为 agent 负责人、加入别的组织或被移出。
17
18
  */
18
- export declare function isAnonymousGuest(db: KernelDb | Trx, accountId: string): Promise<boolean>;
19
+ export declare function isAnonymousGuest(db: KernelSchemaDb, accountId: string): Promise<boolean>;
19
20
  /** 目标是匿名访客 → `409 member.anonymous_guest`。 */
20
- export declare function rejectAnonymousGuest(db: KernelDb | Trx, accountId: string): Promise<void>;
21
+ export declare function rejectAnonymousGuest(db: KernelSchemaDb, accountId: string): Promise<void>;
21
22
  /**
22
23
  * 成员服务。发起人只传账号 id,角色由服务在组织行锁内实时读取,调用方无法传入过期角色。所有写操作在事务内先 `SELECT … FROM orgs WHERE id = $1 FOR NO KEY UPDATE`,
23
24
  * 把同一组织的成员变更串行化(多副本下两个 owner 并发互相降级也恰好剩一个 owner)。
24
- * 框架无关,由调用方注入 db。
25
25
  */
26
26
  export declare class MembersService {
27
27
  private readonly db;
28
+ readonly txHost: TransactionHost;
29
+ private readonly orgLock;
30
+ /** Removing and leaving go through offboarding. */
28
31
  private readonly offboarding;
29
- /** `offboarding`:移出与离开走的离职处理(内核用 `Kernel.identity.offboarding`)。 */
30
- constructor(db: KernelDb, offboarding: Offboarding);
32
+ constructor(db: KernelDb, txHost: TransactionHost, orgLock: OrgLock,
33
+ /** Removing and leaving go through offboarding. */
34
+ offboarding: Offboarding);
31
35
  list(orgId: string): Promise<Member[]>;
32
36
  /**
33
37
  * 加入成员(邀请接受等,手动加入的唯一入口);已是成员 → `member.already_exists`;匿名访客 → `member.anonymous_guest`。
34
38
  * 同一事务删除此人在该组织的通讯录排除(Ruling A20:手动重新加入后,通讯录同步恢复照常管理此人)。
35
- * `actorAccountId` 仅用于审计。
39
+ * `actorAccountId` 仅用于审计。In the caller's transaction when there is one.
36
40
  */
37
- add(orgId: string, accountId: string, role: OrgRole, actorAccountId: string, trx?: Trx): Promise<void>;
41
+ add(orgId: string, accountId: string, role: OrgRole, actorAccountId: string): Promise<void>;
38
42
  /**
39
43
  * 改角色:授予或撤销 owner、或改动一个 owner,只有 owner 能做(`org.owner_required`);
40
44
  * admin 只能在 guest / member / admin 之间调整非 owner。操作后 owner 数为 0 → `org.last_owner`。
@@ -42,22 +46,25 @@ export declare class MembersService {
42
46
  * 目标是匿名访客 → `member.anonymous_guest`。
43
47
  */
44
48
  changeRole(orgId: string, targetId: string, role: OrgRole, actorAccountId: string, actorTokenId?: string): Promise<void>;
49
+ private changeRoleIn;
45
50
  /**
46
51
  * 移出成员:权限规则同 changeRole(移除 owner 须发起人是 owner);移除最后一个 owner → `org.last_owner`。
47
52
  * 走离职处理({@link Offboarding.offboard},原因 `removed`),与之同一事务;提交后写吊销标记、发布事件。
48
53
  * 匿名访客不能移出(`member.anonymous_guest`;不再需要匿名访问时把渠道连接改回绑定策略)。
49
54
  */
50
55
  remove(orgId: string, targetId: string, actorAccountId: string, actorTokenId?: string): Promise<void>;
56
+ private removeIn;
51
57
  /** 主动离开:走离职处理(原因 `left`);最后一个 owner → `org.last_owner`。 */
52
58
  leave(orgId: string, accountId: string, actorTokenId?: string): Promise<void>;
59
+ private leaveIn;
53
60
  /**
54
61
  * 转让所有权:from 必须是 owner(`org.owner_required`);to 必须是成员(`member.not_found`)且不是匿名访客
55
62
  * (`member.anonymous_guest`);to → owner、from → admin。
56
63
  */
57
64
  transferOwnership(orgId: string, fromAccountId: string, toAccountId: string, actorTokenId?: string): Promise<void>;
65
+ private transferIn;
58
66
  private roleIn;
59
67
  private requireMember;
60
68
  private setRole;
61
69
  private assertHasOwner;
62
70
  }
63
- export {};