@capybara-hq/kernel 0.1.0-rc.0 → 0.1.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/bootstrap.json +10 -6
  2. package/dist/admin/admin.controller.d.ts +17 -17
  3. package/dist/admin/admin.controller.js +43 -26
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/extensions.controller.d.ts +14 -14
  7. package/dist/admin/extensions.controller.js +30 -17
  8. package/dist/admin/setup-lock.d.ts +16 -0
  9. package/dist/admin/setup-lock.js +47 -0
  10. package/dist/admin/setup.controller.d.ts +8 -8
  11. package/dist/admin/setup.controller.js +27 -25
  12. package/dist/admin/setup.service.d.ts +19 -27
  13. package/dist/admin/setup.service.js +61 -61
  14. package/dist/agents/agent-lookup.d.ts +53 -0
  15. package/dist/agents/agent-lookup.js +179 -0
  16. package/dist/agents/agents.controller.d.ts +1 -1
  17. package/dist/agents/agents.controller.js +14 -8
  18. package/dist/agents/agents.module.d.ts +7 -0
  19. package/dist/agents/agents.module.js +41 -0
  20. package/dist/agents/agents.service.d.ts +39 -58
  21. package/dist/agents/agents.service.js +261 -329
  22. package/dist/agents/definition.d.ts +8 -0
  23. package/dist/agents/definition.js +8 -0
  24. package/dist/agents/models.controller.d.ts +1 -1
  25. package/dist/agents/models.controller.js +2 -2
  26. package/dist/agents/templates.controller.d.ts +1 -1
  27. package/dist/agents/templates.controller.js +2 -2
  28. package/dist/agents/templates.d.ts +6 -8
  29. package/dist/agents/templates.js +20 -4
  30. package/dist/app.d.ts +93 -0
  31. package/dist/app.js +150 -0
  32. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  33. package/dist/catalog/admin-catalog.controller.js +27 -13
  34. package/dist/catalog/catalog-content.d.ts +185 -0
  35. package/dist/catalog/catalog-content.js +323 -0
  36. package/dist/catalog/catalog-items.d.ts +186 -0
  37. package/dist/catalog/catalog-items.js +410 -0
  38. package/dist/catalog/catalog.module.d.ts +14 -0
  39. package/dist/catalog/catalog.module.js +71 -0
  40. package/dist/catalog/catalog.service.d.ts +34 -188
  41. package/dist/catalog/catalog.service.js +155 -489
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +30 -13
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +2 -2
  70. package/dist/channels/channels.module.d.ts +40 -0
  71. package/dist/channels/channels.module.js +128 -0
  72. package/dist/channels/connections.controller.d.ts +1 -1
  73. package/dist/channels/connections.controller.js +11 -6
  74. package/dist/channels/connections.service.d.ts +43 -21
  75. package/dist/channels/connections.service.js +236 -131
  76. package/dist/channels/inbound.d.ts +34 -38
  77. package/dist/channels/inbound.js +107 -41
  78. package/dist/channels/job-ids.d.ts +10 -0
  79. package/dist/channels/job-ids.js +10 -0
  80. package/dist/channels/jobs.d.ts +85 -0
  81. package/dist/channels/jobs.js +157 -0
  82. package/dist/channels/outbound.d.ts +60 -82
  83. package/dist/channels/outbound.js +165 -193
  84. package/dist/channels/supervisor.d.ts +88 -46
  85. package/dist/channels/supervisor.js +230 -132
  86. package/dist/channels/threads.d.ts +29 -8
  87. package/dist/channels/threads.js +71 -13
  88. package/dist/channels/webhook.d.ts +20 -14
  89. package/dist/channels/webhook.js +51 -20
  90. package/dist/config/load.d.ts +3 -2
  91. package/dist/config/load.js +3 -2
  92. package/dist/config/nacos-source.js +11 -2
  93. package/dist/config/schema.d.ts +16 -1
  94. package/dist/config/schema.js +54 -7
  95. package/dist/conversations/access.d.ts +29 -0
  96. package/dist/conversations/access.js +86 -0
  97. package/dist/conversations/artifacts.d.ts +10 -10
  98. package/dist/conversations/artifacts.js +35 -9
  99. package/dist/conversations/attachments.controller.d.ts +1 -1
  100. package/dist/conversations/attachments.controller.js +8 -6
  101. package/dist/conversations/attachments.module.d.ts +7 -0
  102. package/dist/conversations/attachments.module.js +25 -0
  103. package/dist/conversations/attachments.service.d.ts +30 -22
  104. package/dist/conversations/attachments.service.js +119 -46
  105. package/dist/conversations/conversations.controller.d.ts +8 -7
  106. package/dist/conversations/conversations.controller.js +59 -29
  107. package/dist/conversations/conversations.module.d.ts +8 -0
  108. package/dist/conversations/conversations.module.js +69 -0
  109. package/dist/conversations/conversations.service.d.ts +40 -38
  110. package/dist/conversations/conversations.service.js +130 -140
  111. package/dist/conversations/event-log.d.ts +28 -18
  112. package/dist/conversations/event-log.js +74 -27
  113. package/dist/conversations/files.d.ts +10 -10
  114. package/dist/conversations/files.js +37 -11
  115. package/dist/conversations/idem-keys.d.ts +5 -0
  116. package/dist/conversations/idem-keys.js +5 -0
  117. package/dist/conversations/job-ids.d.ts +6 -0
  118. package/dist/conversations/job-ids.js +6 -0
  119. package/dist/conversations/outputs-read.d.ts +11 -11
  120. package/dist/conversations/outputs-read.js +31 -7
  121. package/dist/conversations/queue.d.ts +48 -56
  122. package/dist/conversations/queue.js +13 -289
  123. package/dist/conversations/queue.service.d.ts +60 -0
  124. package/dist/conversations/queue.service.js +343 -0
  125. package/dist/conversations/sandbox-status.d.ts +13 -10
  126. package/dist/conversations/sandbox-status.js +36 -8
  127. package/dist/conversations/titles.d.ts +71 -24
  128. package/dist/conversations/titles.js +159 -62
  129. package/dist/ctx/bus.js +9 -3
  130. package/dist/ctx/create-ctx.d.ts +6 -0
  131. package/dist/ctx/create-ctx.js +7 -9
  132. package/dist/ctx/lock.d.ts +7 -3
  133. package/dist/ctx/lock.js +9 -20
  134. package/dist/ctx/queue.js +3 -2
  135. package/dist/ctx/secrets.d.ts +10 -2
  136. package/dist/ctx/secrets.js +7 -3
  137. package/dist/db/kernel-schema.d.ts +2 -2
  138. package/dist/db/pool.d.ts +5 -0
  139. package/dist/db/pool.js +1 -0
  140. package/dist/errors.d.ts +2 -0
  141. package/dist/errors.js +2 -0
  142. package/dist/evals/budget.d.ts +42 -21
  143. package/dist/evals/budget.js +114 -62
  144. package/dist/evals/evals.module.d.ts +31 -0
  145. package/dist/evals/evals.module.js +114 -0
  146. package/dist/evals/jobs.d.ts +20 -0
  147. package/dist/evals/jobs.js +45 -0
  148. package/dist/evals/run-replay.d.ts +56 -8
  149. package/dist/evals/run-replay.js +140 -80
  150. package/dist/evals/runs.controller.d.ts +1 -1
  151. package/dist/evals/runs.controller.js +17 -8
  152. package/dist/evals/runs.service.d.ts +23 -45
  153. package/dist/evals/runs.service.js +245 -234
  154. package/dist/evals/sets.controller.d.ts +1 -1
  155. package/dist/evals/sets.controller.js +17 -8
  156. package/dist/evals/sets.service.d.ts +22 -6
  157. package/dist/evals/sets.service.js +248 -194
  158. package/dist/evals/snapshot.d.ts +2 -2
  159. package/dist/evals/step-replay.d.ts +2 -2
  160. package/dist/evals/step-replay.js +1 -1
  161. package/dist/evals/trajectory.controller.d.ts +1 -1
  162. package/dist/evals/trajectory.controller.js +11 -7
  163. package/dist/evals/trajectory.service.d.ts +5 -4
  164. package/dist/evals/trajectory.service.js +30 -7
  165. package/dist/evals/worker.d.ts +44 -27
  166. package/dist/evals/worker.js +220 -120
  167. package/dist/extensions/admin-ops.d.ts +61 -33
  168. package/dist/extensions/admin-ops.js +248 -154
  169. package/dist/extensions/admin-view.d.ts +38 -27
  170. package/dist/extensions/admin-view.js +126 -55
  171. package/dist/extensions/approvals.d.ts +12 -8
  172. package/dist/extensions/approvals.js +73 -46
  173. package/dist/extensions/blobs.d.ts +27 -10
  174. package/dist/extensions/blobs.js +111 -45
  175. package/dist/extensions/bootstrap.d.ts +96 -42
  176. package/dist/extensions/bootstrap.js +303 -155
  177. package/dist/extensions/cli.d.ts +20 -10
  178. package/dist/extensions/cli.js +41 -96
  179. package/dist/extensions/config-issues.d.ts +7 -0
  180. package/dist/extensions/config-issues.js +31 -0
  181. package/dist/extensions/deployment-config-store.d.ts +49 -0
  182. package/dist/extensions/deployment-config-store.js +133 -0
  183. package/dist/extensions/deployment-config.d.ts +58 -67
  184. package/dist/extensions/deployment-config.js +202 -230
  185. package/dist/extensions/enabled.d.ts +5 -5
  186. package/dist/extensions/extensions.module.d.ts +8 -0
  187. package/dist/extensions/extensions.module.js +77 -0
  188. package/dist/extensions/hooks.d.ts +3 -2
  189. package/dist/extensions/hooks.js +1 -1
  190. package/dist/extensions/host.d.ts +72 -68
  191. package/dist/extensions/host.js +191 -152
  192. package/dist/extensions/installs.d.ts +49 -16
  193. package/dist/extensions/installs.js +128 -32
  194. package/dist/extensions/job-ids.d.ts +6 -0
  195. package/dist/extensions/job-ids.js +6 -0
  196. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  197. package/dist/extensions/lifecycle-topics.js +18 -0
  198. package/dist/extensions/lifecycle.d.ts +35 -47
  199. package/dist/extensions/lifecycle.js +103 -39
  200. package/dist/extensions/locks.d.ts +33 -0
  201. package/dist/extensions/locks.js +86 -0
  202. package/dist/extensions/migrate-lock.d.ts +3 -4
  203. package/dist/extensions/org-config.controller.d.ts +1 -1
  204. package/dist/extensions/org-config.controller.js +8 -5
  205. package/dist/extensions/org-config.d.ts +48 -46
  206. package/dist/extensions/org-config.js +284 -226
  207. package/dist/extensions/registry.d.ts +50 -2
  208. package/dist/extensions/registry.js +89 -4
  209. package/dist/extensions/sources.d.ts +12 -8
  210. package/dist/extensions/sources.js +34 -13
  211. package/dist/files/files.module.d.ts +3 -0
  212. package/dist/files/files.module.js +22 -0
  213. package/dist/files/previewers.controller.d.ts +7 -2
  214. package/dist/files/previewers.controller.js +17 -9
  215. package/dist/files/previewers.d.ts +13 -18
  216. package/dist/files/previewers.js +83 -36
  217. package/dist/http/adapter.d.ts +3 -0
  218. package/dist/http/adapter.js +25 -0
  219. package/dist/http/api.module.d.ts +3 -110
  220. package/dist/http/api.module.js +47 -355
  221. package/dist/http/app.d.ts +11 -15
  222. package/dist/http/app.js +52 -47
  223. package/dist/http/error-filter.module.d.ts +5 -0
  224. package/dist/http/error-filter.module.js +18 -0
  225. package/dist/http/error.filter.js +2 -2
  226. package/dist/identity/accounts.d.ts +82 -29
  227. package/dist/identity/accounts.js +294 -175
  228. package/dist/identity/api-tokens.d.ts +11 -7
  229. package/dist/identity/api-tokens.js +71 -44
  230. package/dist/identity/audit.d.ts +7 -4
  231. package/dist/identity/audit.js +5 -1
  232. package/dist/identity/auth.controller.d.ts +11 -10
  233. package/dist/identity/auth.controller.js +31 -25
  234. package/dist/identity/auth.guard.d.ts +3 -3
  235. package/dist/identity/auth.guard.js +6 -4
  236. package/dist/identity/binding.d.ts +9 -11
  237. package/dist/identity/binding.js +41 -13
  238. package/dist/identity/enterprise-admin.d.ts +18 -12
  239. package/dist/identity/enterprise-admin.js +67 -13
  240. package/dist/identity/external-identity-lock.d.ts +17 -0
  241. package/dist/identity/external-identity-lock.js +39 -0
  242. package/dist/identity/external.d.ts +19 -15
  243. package/dist/identity/external.js +163 -125
  244. package/dist/identity/identity.module.d.ts +6 -0
  245. package/dist/identity/identity.module.js +56 -0
  246. package/dist/identity/me.controller.d.ts +16 -15
  247. package/dist/identity/me.controller.js +37 -31
  248. package/dist/identity/sessions.d.ts +12 -10
  249. package/dist/identity/sessions.js +74 -42
  250. package/dist/identity/settings.d.ts +20 -14
  251. package/dist/identity/settings.js +85 -57
  252. package/dist/identity/sso.controller.d.ts +7 -7
  253. package/dist/identity/sso.controller.js +13 -9
  254. package/dist/identity/sso.d.ts +9 -12
  255. package/dist/identity/sso.js +54 -24
  256. package/dist/inbox/inbox.module.d.ts +3 -0
  257. package/dist/inbox/inbox.module.js +22 -0
  258. package/dist/inbox/inbox.service.d.ts +7 -9
  259. package/dist/inbox/inbox.service.js +32 -11
  260. package/dist/index.d.ts +19 -12
  261. package/dist/index.js +13 -8
  262. package/dist/infra/cache/cache.module.d.ts +3 -0
  263. package/dist/infra/cache/cache.module.js +16 -0
  264. package/dist/infra/cache/cache.service.d.ts +21 -0
  265. package/dist/infra/cache/cache.service.js +80 -0
  266. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  267. package/dist/infra/cache/cacheable.decorator.js +83 -0
  268. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  269. package/dist/infra/cli/kernel-cli.module.js +165 -0
  270. package/dist/infra/close-within.d.ts +15 -0
  271. package/dist/infra/close-within.js +36 -0
  272. package/dist/infra/config/config.module.d.ts +13 -0
  273. package/dist/infra/config/config.module.js +39 -0
  274. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  275. package/dist/infra/config/kernel-config.service.js +126 -0
  276. package/dist/infra/database/after-commit.d.ts +6 -0
  277. package/dist/infra/database/after-commit.js +9 -0
  278. package/dist/infra/database/database.module.d.ts +25 -0
  279. package/dist/infra/database/database.module.js +90 -0
  280. package/dist/infra/database/kernel-db.d.ts +22 -0
  281. package/dist/infra/database/kernel-db.js +65 -0
  282. package/dist/infra/database/transaction-host.d.ts +50 -0
  283. package/dist/infra/database/transaction-host.js +125 -0
  284. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  285. package/dist/infra/database/transactional.decorator.js +27 -0
  286. package/dist/infra/database/xact-lock.d.ts +17 -0
  287. package/dist/infra/database/xact-lock.js +43 -0
  288. package/dist/infra/events/kernel-events.d.ts +96 -0
  289. package/dist/infra/events/kernel-events.js +65 -0
  290. package/dist/infra/health/health.controller.d.ts +26 -0
  291. package/dist/infra/health/health.controller.js +104 -0
  292. package/dist/infra/health/health.module.d.ts +9 -0
  293. package/dist/infra/health/health.module.js +24 -0
  294. package/dist/infra/health/health.options.d.ts +10 -0
  295. package/dist/infra/health/health.options.js +15 -0
  296. package/dist/infra/health/shutdown-state.d.ts +6 -0
  297. package/dist/infra/health/shutdown-state.js +2 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  300. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  301. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  302. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  303. package/dist/infra/lifecycle/process-guards.js +86 -0
  304. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  305. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  306. package/dist/infra/lock/key-template.d.ts +13 -0
  307. package/dist/infra/lock/key-template.js +46 -0
  308. package/dist/infra/lock/lock.module.d.ts +3 -0
  309. package/dist/infra/lock/lock.module.js +16 -0
  310. package/dist/infra/lock/lock.service.d.ts +120 -0
  311. package/dist/infra/lock/lock.service.js +343 -0
  312. package/dist/infra/lock/shared-lease.d.ts +44 -0
  313. package/dist/infra/lock/shared-lease.js +121 -0
  314. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  315. package/dist/infra/lock/with-lock.decorator.js +49 -0
  316. package/dist/infra/logging/logging.module.d.ts +16 -0
  317. package/dist/infra/logging/logging.module.js +34 -0
  318. package/dist/infra/queue/configured-processor.d.ts +18 -0
  319. package/dist/infra/queue/configured-processor.js +23 -0
  320. package/dist/infra/queue/job-failure.d.ts +18 -0
  321. package/dist/infra/queue/job-failure.js +26 -0
  322. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  323. package/dist/infra/queue/queue-shutdown.js +81 -0
  324. package/dist/infra/queue/queue.module.d.ts +16 -0
  325. package/dist/infra/queue/queue.module.js +61 -0
  326. package/dist/infra/queue/redis-connection.d.ts +7 -0
  327. package/dist/infra/queue/redis-connection.js +18 -0
  328. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  329. package/dist/infra/queue/retired-schedulers.js +9 -0
  330. package/dist/infra/queue/run-job.d.ts +16 -0
  331. package/dist/infra/queue/run-job.js +19 -0
  332. package/dist/infra/redis/redis.module.d.ts +24 -0
  333. package/dist/infra/redis/redis.module.js +87 -0
  334. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  335. package/dist/infra/schedule/cron-tick.js +25 -0
  336. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  337. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  338. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  339. package/dist/infra/schedule/locked-interval.js +190 -0
  340. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  341. package/dist/infra/schedule/locked-tick.js +137 -0
  342. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  343. package/dist/infra/schedule/schedule.module.js +27 -0
  344. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  345. package/dist/infra/schedule/scheduled-runs.js +163 -0
  346. package/dist/infra/swagger/swagger.d.ts +16 -0
  347. package/dist/infra/swagger/swagger.js +31 -0
  348. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  349. package/dist/infra/throttler/credential-throttler.js +77 -0
  350. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  351. package/dist/infra/throttler/named-throttlers.js +119 -0
  352. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  353. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  354. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  355. package/dist/infra/throttler/throttler.guard.js +68 -0
  356. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  357. package/dist/infra/throttler/throttler.module.js +53 -0
  358. package/dist/infra/tokens.d.ts +15 -0
  359. package/dist/infra/tokens.js +15 -0
  360. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  361. package/dist/infra/validation/create-zod-dto.js +35 -0
  362. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  363. package/dist/infra/validation/parse-with-zod.js +12 -0
  364. package/dist/infra/validation/validation.module.d.ts +3 -0
  365. package/dist/infra/validation/validation.module.js +16 -0
  366. package/dist/infra/validation/zod-params.d.ts +7 -0
  367. package/dist/infra/validation/zod-params.js +42 -0
  368. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  369. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  370. package/dist/kernel.d.ts +9 -241
  371. package/dist/kernel.js +8 -1305
  372. package/dist/kernel.module.d.ts +17 -0
  373. package/dist/kernel.module.js +136 -0
  374. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  375. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  376. package/dist/lifecycle/tokens.d.ts +3 -0
  377. package/dist/lifecycle/tokens.js +3 -0
  378. package/dist/log-config.d.ts +9 -0
  379. package/dist/log-config.js +27 -0
  380. package/dist/log-context.d.ts +34 -0
  381. package/dist/log-context.js +44 -0
  382. package/dist/log-loki.d.ts +34 -0
  383. package/dist/log-loki.js +145 -0
  384. package/dist/log.d.ts +41 -10
  385. package/dist/log.js +91 -17
  386. package/dist/models/models.module.d.ts +3 -0
  387. package/dist/models/models.module.js +24 -0
  388. package/dist/models/prices.d.ts +8 -2
  389. package/dist/models/prices.js +65 -37
  390. package/dist/models/purposes.controller.d.ts +1 -1
  391. package/dist/models/purposes.controller.js +5 -6
  392. package/dist/models/purposes.d.ts +35 -13
  393. package/dist/models/purposes.js +101 -51
  394. package/dist/net/public-address.js +3 -2
  395. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  396. package/dist/orgs/directory-sync.controller.js +2 -2
  397. package/dist/orgs/directory-sync.d.ts +61 -31
  398. package/dist/orgs/directory-sync.js +212 -125
  399. package/dist/orgs/invitations.controller.d.ts +8 -8
  400. package/dist/orgs/invitations.controller.js +27 -26
  401. package/dist/orgs/invitations.service.d.ts +12 -9
  402. package/dist/orgs/invitations.service.js +130 -92
  403. package/dist/orgs/job-ids.d.ts +8 -0
  404. package/dist/orgs/job-ids.js +8 -0
  405. package/dist/orgs/members.service.d.ts +19 -12
  406. package/dist/orgs/members.service.js +161 -117
  407. package/dist/orgs/offboarding.d.ts +54 -57
  408. package/dist/orgs/offboarding.js +161 -71
  409. package/dist/orgs/org-lock.d.ts +28 -19
  410. package/dist/orgs/org-lock.js +81 -35
  411. package/dist/orgs/org.guard.d.ts +1 -1
  412. package/dist/orgs/org.guard.js +2 -2
  413. package/dist/orgs/orgs.controller.d.ts +13 -13
  414. package/dist/orgs/orgs.controller.js +29 -17
  415. package/dist/orgs/orgs.module.d.ts +6 -0
  416. package/dist/orgs/orgs.module.js +68 -0
  417. package/dist/orgs/orgs.service.d.ts +30 -19
  418. package/dist/orgs/orgs.service.js +139 -86
  419. package/dist/orgs/settings.controller.d.ts +1 -1
  420. package/dist/orgs/settings.controller.js +8 -6
  421. package/dist/orgs/settings.service.d.ts +14 -8
  422. package/dist/orgs/settings.service.js +75 -46
  423. package/dist/overrides.d.ts +56 -0
  424. package/dist/overrides.js +30 -0
  425. package/dist/roles/gateway-role.d.ts +43 -0
  426. package/dist/roles/gateway-role.js +98 -0
  427. package/dist/roles/gateway.module.d.ts +8 -0
  428. package/dist/roles/gateway.module.js +28 -0
  429. package/dist/roles/worker-role.d.ts +63 -0
  430. package/dist/roles/worker-role.js +144 -0
  431. package/dist/roles/worker.module.d.ts +14 -0
  432. package/dist/roles/worker.module.js +90 -0
  433. package/dist/runtime/abort.js +19 -2
  434. package/dist/runtime/checkpointer.d.ts +8 -3
  435. package/dist/runtime/checkpointer.js +87 -55
  436. package/dist/runtime/conversation-lock.d.ts +20 -11
  437. package/dist/runtime/conversation-lock.js +62 -72
  438. package/dist/runtime/hook-calls.d.ts +3 -3
  439. package/dist/runtime/hook-calls.js +1 -6
  440. package/dist/runtime/job-ids.d.ts +10 -0
  441. package/dist/runtime/job-ids.js +10 -0
  442. package/dist/runtime/langgraph-loop.js +1 -1
  443. package/dist/runtime/loop.d.ts +7 -0
  444. package/dist/runtime/loop.js +14 -0
  445. package/dist/runtime/maintenance-queue.d.ts +10 -0
  446. package/dist/runtime/maintenance-queue.js +10 -0
  447. package/dist/runtime/maintenance.d.ts +45 -74
  448. package/dist/runtime/maintenance.js +139 -136
  449. package/dist/runtime/model-call.d.ts +7 -4
  450. package/dist/runtime/model-call.js +24 -57
  451. package/dist/runtime/providers.d.ts +17 -6
  452. package/dist/runtime/providers.js +66 -25
  453. package/dist/runtime/quota.d.ts +17 -3
  454. package/dist/runtime/quota.js +27 -2
  455. package/dist/runtime/retired-schedulers.d.ts +7 -0
  456. package/dist/runtime/retired-schedulers.js +31 -0
  457. package/dist/runtime/run-control.d.ts +33 -0
  458. package/dist/runtime/run-control.js +77 -0
  459. package/dist/runtime/run-finish.d.ts +26 -17
  460. package/dist/runtime/run-finish.js +98 -51
  461. package/dist/runtime/run-jobs.d.ts +48 -0
  462. package/dist/runtime/run-jobs.js +95 -0
  463. package/dist/runtime/run-processors.d.ts +60 -0
  464. package/dist/runtime/run-processors.js +185 -0
  465. package/dist/runtime/run-queue.d.ts +32 -57
  466. package/dist/runtime/run-queue.js +291 -295
  467. package/dist/runtime/run-steps.d.ts +39 -0
  468. package/dist/runtime/run-steps.js +96 -0
  469. package/dist/runtime/run-worker.d.ts +121 -75
  470. package/dist/runtime/run-worker.js +340 -225
  471. package/dist/runtime/runtime.module.d.ts +10 -0
  472. package/dist/runtime/runtime.module.js +112 -0
  473. package/dist/runtime/step-log.d.ts +40 -0
  474. package/dist/runtime/step-log.js +94 -0
  475. package/dist/runtime/stream.controller.d.ts +5 -8
  476. package/dist/runtime/stream.controller.js +14 -12
  477. package/dist/runtime/stream.d.ts +24 -6
  478. package/dist/runtime/stream.js +78 -7
  479. package/dist/runtime/subagents/child.d.ts +3 -44
  480. package/dist/runtime/subagents/child.js +0 -79
  481. package/dist/runtime/subagents/definition.d.ts +4 -4
  482. package/dist/runtime/subagents/definition.js +2 -2
  483. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  484. package/dist/runtime/subagents/dispatch.js +135 -140
  485. package/dist/runtime/subagents/limits.d.ts +9 -4
  486. package/dist/runtime/subagents/limits.js +4 -2
  487. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  488. package/dist/runtime/subagents/org-agents.js +1 -1
  489. package/dist/runtime/subagents/progress.d.ts +2 -2
  490. package/dist/runtime/subagents/roster.d.ts +3 -3
  491. package/dist/runtime/subagents/roster.js +1 -1
  492. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  493. package/dist/runtime/subagents/skill-fork.js +16 -5
  494. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  495. package/dist/runtime/subagents/subagents.service.js +101 -0
  496. package/dist/runtime/usage-report.d.ts +94 -52
  497. package/dist/runtime/usage-report.js +200 -99
  498. package/dist/runtime/waits.d.ts +125 -57
  499. package/dist/runtime/waits.js +431 -208
  500. package/dist/sandbox/job-ids.d.ts +10 -0
  501. package/dist/sandbox/job-ids.js +10 -0
  502. package/dist/sandbox/jobs.d.ts +41 -0
  503. package/dist/sandbox/jobs.js +113 -0
  504. package/dist/sandbox/leases.d.ts +39 -31
  505. package/dist/sandbox/leases.js +117 -257
  506. package/dist/sandbox/providers.d.ts +19 -0
  507. package/dist/sandbox/providers.js +38 -0
  508. package/dist/sandbox/sandbox.module.d.ts +8 -0
  509. package/dist/sandbox/sandbox.module.js +30 -0
  510. package/dist/sandbox/sandbox.service.d.ts +24 -29
  511. package/dist/sandbox/sandbox.service.js +106 -75
  512. package/dist/skills/catalog.d.ts +33 -20
  513. package/dist/skills/catalog.js +96 -53
  514. package/dist/skills/changes.controller.d.ts +4 -4
  515. package/dist/skills/changes.controller.js +15 -9
  516. package/dist/skills/changes.service.d.ts +28 -18
  517. package/dist/skills/changes.service.js +421 -364
  518. package/dist/skills/invocable.controller.d.ts +1 -1
  519. package/dist/skills/invocable.controller.js +8 -5
  520. package/dist/skills/invoke.d.ts +16 -15
  521. package/dist/skills/invoke.js +48 -17
  522. package/dist/skills/skills.controller.d.ts +1 -1
  523. package/dist/skills/skills.controller.js +11 -6
  524. package/dist/skills/skills.module.d.ts +6 -0
  525. package/dist/skills/skills.module.js +30 -0
  526. package/dist/skills/skills.service.d.ts +47 -30
  527. package/dist/skills/skills.service.js +221 -158
  528. package/dist/storage/job-ids.d.ts +6 -0
  529. package/dist/storage/job-ids.js +6 -0
  530. package/dist/storage/purge.d.ts +22 -7
  531. package/dist/storage/purge.js +55 -3
  532. package/dist/storage/storage.module.d.ts +6 -0
  533. package/dist/storage/storage.module.js +23 -0
  534. package/dist/storage/storage.service.d.ts +18 -4
  535. package/dist/storage/storage.service.js +44 -3
  536. package/dist/tools/approvals.controller.d.ts +1 -1
  537. package/dist/tools/approvals.controller.js +12 -8
  538. package/dist/tools/approvals.service.d.ts +27 -25
  539. package/dist/tools/approvals.service.js +324 -258
  540. package/dist/tools/breaker.d.ts +2 -2
  541. package/dist/tools/breaker.js +21 -3
  542. package/dist/tools/builtins/ask-user.d.ts +2 -2
  543. package/dist/tools/builtins/ask-user.js +1 -1
  544. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  545. package/dist/tools/builtins/builtin-tools.js +80 -0
  546. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  547. package/dist/tools/builtins/read-tool-output.js +1 -1
  548. package/dist/tools/builtins/sandbox/bash.js +2 -2
  549. package/dist/tools/builtins/sandbox/common.d.ts +7 -4
  550. package/dist/tools/builtins/sandbox/common.js +5 -3
  551. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  552. package/dist/tools/builtins/sandbox/edit.js +1 -1
  553. package/dist/tools/builtins/sandbox/glob.js +2 -2
  554. package/dist/tools/builtins/sandbox/grep.js +2 -2
  555. package/dist/tools/builtins/sandbox/read.js +1 -1
  556. package/dist/tools/builtins/sandbox/write.js +1 -1
  557. package/dist/tools/builtins/skill-load.d.ts +3 -3
  558. package/dist/tools/builtins/skill-load.js +1 -1
  559. package/dist/tools/canonical-json.d.ts +6 -0
  560. package/dist/tools/canonical-json.js +16 -0
  561. package/dist/tools/connector-content.controller.d.ts +1 -1
  562. package/dist/tools/connector-content.controller.js +11 -6
  563. package/dist/tools/connector-content.d.ts +12 -15
  564. package/dist/tools/connector-content.js +53 -18
  565. package/dist/tools/connectors.controller.d.ts +1 -1
  566. package/dist/tools/connectors.controller.js +21 -10
  567. package/dist/tools/connectors.service.d.ts +31 -13
  568. package/dist/tools/connectors.service.js +434 -344
  569. package/dist/tools/credentials.d.ts +17 -20
  570. package/dist/tools/credentials.js +55 -34
  571. package/dist/tools/drift.d.ts +29 -41
  572. package/dist/tools/drift.js +111 -79
  573. package/dist/tools/info.d.ts +12 -9
  574. package/dist/tools/info.js +33 -7
  575. package/dist/tools/job-ids.d.ts +13 -0
  576. package/dist/tools/job-ids.js +15 -0
  577. package/dist/tools/jobs.d.ts +24 -0
  578. package/dist/tools/jobs.js +69 -0
  579. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  580. package/dist/tools/oauth/flow-paths.js +38 -0
  581. package/dist/tools/oauth/flow.d.ts +30 -30
  582. package/dist/tools/oauth/flow.js +109 -81
  583. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  584. package/dist/tools/oauth/oauth.controller.js +12 -9
  585. package/dist/tools/oauth/tokens.d.ts +11 -3
  586. package/dist/tools/oauth/tokens.js +15 -14
  587. package/dist/tools/outputs.d.ts +13 -4
  588. package/dist/tools/outputs.js +47 -3
  589. package/dist/tools/pipeline.d.ts +62 -46
  590. package/dist/tools/pipeline.js +145 -64
  591. package/dist/tools/policy.d.ts +2 -2
  592. package/dist/tools/questions.controller.d.ts +1 -1
  593. package/dist/tools/questions.controller.js +8 -5
  594. package/dist/tools/questions.service.d.ts +25 -24
  595. package/dist/tools/questions.service.js +201 -142
  596. package/dist/tools/registry.d.ts +30 -20
  597. package/dist/tools/registry.js +73 -37
  598. package/dist/tools/specs.d.ts +5 -4
  599. package/dist/tools/specs.js +3 -1
  600. package/dist/tools/tools.module.d.ts +10 -0
  601. package/dist/tools/tools.module.js +91 -0
  602. package/dist/ui/call-extension.d.ts +16 -0
  603. package/dist/ui/call-extension.js +38 -0
  604. package/dist/ui/embed-token.d.ts +9 -5
  605. package/dist/ui/embed-token.js +34 -6
  606. package/dist/ui/ui-stream.d.ts +22 -17
  607. package/dist/ui/ui-stream.js +72 -12
  608. package/dist/ui/ui.module.d.ts +7 -0
  609. package/dist/ui/ui.module.js +28 -0
  610. package/dist/ui/views.controller.d.ts +14 -12
  611. package/dist/ui/views.controller.js +32 -25
  612. package/dist/ui/views.d.ts +9 -57
  613. package/dist/ui/views.js +43 -45
  614. package/package.json +11 -2
  615. package/dist/http/health.controller.d.ts +0 -26
  616. package/dist/http/health.controller.js +0 -79
  617. package/dist/http/tokens.d.ts +0 -131
  618. package/dist/http/tokens.js +0 -131
  619. package/dist/http/zod.pipe.d.ts +0 -8
  620. package/dist/http/zod.pipe.js +0 -14
  621. package/dist/identity/rate-limit.d.ts +0 -55
  622. package/dist/identity/rate-limit.js +0 -121
  623. package/dist/sandbox/lifecycle.d.ts +0 -21
  624. package/dist/sandbox/lifecycle.js +0 -68
  625. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  626. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,7 +1,23 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
1
10
  import { randomUUID } from "node:crypto";
11
+ import { Inject, Injectable } from "@nestjs/common";
2
12
  import { sql } from "kysely";
13
+ import { EventLog } from "../conversations/event-log.js";
3
14
  import { ApiError } from "../errors.js";
4
15
  import { audit } from "../identity/audit.js";
16
+ import { KernelConfigService } from "../infra/config/kernel-config.service.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 { KernelEvents } from "../infra/events/kernel-events.js";
5
21
  import { ORG_ROLES, roleAtLeast } from "../orgs/roles.js";
6
22
  export { APPROVAL_DENY_REASON_MAX_CHARS } from "../conversations/events.js";
7
23
  /** `list` 一次最多返回的审批数(收件箱据此判断这个来源是否取满)。 */
@@ -49,11 +65,24 @@ function canHandle(a, initiator, accountId, role) {
49
65
  /**
50
66
  * 工具调用审批:新建(loop 调用)、列出 / 查看 / 处理(HTTP),以及「以后都允许」授权的查看与撤销。
51
67
  * 状态全部在 PG:处理决定在事务里 `SELECT … FOR UPDATE` 审批行,多副本并发处理同一审批时恰好一个生效。
68
+ *
69
+ * A decision is announced after the commit as the domain event `approval.decided` (exactly once:
70
+ * only the decision that changed the row from pending), which the run's waits follow to resume it
71
+ * (spec §3b; the wait sweep resumes a run whose resume was lost). Events are appended in the
72
+ * context's transaction (`EventLog.appendIn`) and published after the commit.
52
73
  */
53
- export class ApprovalsService {
54
- deps;
55
- constructor(deps) {
56
- this.deps = deps;
74
+ let ApprovalsService = class ApprovalsService {
75
+ db;
76
+ config;
77
+ eventLog;
78
+ events;
79
+ txHost;
80
+ constructor(db, config, eventLog, events, txHost) {
81
+ this.db = db;
82
+ this.config = config;
83
+ this.eventLog = eventLog;
84
+ this.events = events;
85
+ this.txHost = txHost;
57
86
  }
58
87
  /**
59
88
  * 新建 pending 审批(`expires_at` = 现在 + `tools.approvalTimeoutHours`)并写 `approval_requested`,同一事务。
@@ -63,72 +92,73 @@ export class ApprovalsService {
63
92
  if (input.requestedFor === null && input.approverRole === null) {
64
93
  throw new Error("approval requires requestedFor or approverRole");
65
94
  }
66
- const { db, eventLog, config } = this.deps;
67
- const hours = config().tools.approvalTimeoutHours;
68
- const { record, toSeq } = await db.transaction().execute(async (t) => {
69
- // Lock the conversation row (the append's lock) before inserting the approval: the insert's
70
- // foreign key check takes FOR KEY SHARE on that row, and two requests that each held it and
71
- // then asked for the append's FOR UPDATE waited for each other (40P01)
72
- await t
73
- .selectFrom("conversations")
74
- .select("id")
75
- .where("id", "=", input.conversationId)
76
- .forUpdate()
77
- .execute();
78
- await t
79
- .insertInto("approvals")
80
- .values({
81
- id: randomUUID(),
82
- org_id: input.orgId,
83
- conversation_id: input.conversationId,
84
- run_id: input.runId,
85
- call_id: input.callId,
86
- attempt: input.attempt ?? 1,
87
- tool_key: input.toolKey,
88
- spec_hash: input.specHash,
89
- connector_id: input.connectorId,
90
- input: JSON.stringify(input.input ?? {}),
91
- requested_for: input.requestedFor,
92
- approver_role: input.approverRole,
93
- scope: null,
94
- decided_by: null,
95
- expires_at: sql `now() + ${hours}::integer * interval '1 hour'`,
96
- })
97
- .onConflict((oc) => oc.columns(["run_id", "call_id", "attempt"]).doNothing())
98
- .execute();
99
- const row = await t
100
- .selectFrom("approvals")
101
- .selectAll()
102
- .where("run_id", "=", input.runId)
103
- .where("call_id", "=", input.callId)
104
- .where("attempt", "=", input.attempt ?? 1)
105
- .executeTakeFirstOrThrow();
106
- const rec = toRecord(row);
107
- const written = await eventLog.append(rec.conversationId, [
108
- {
109
- type: "approval_requested",
110
- runId: rec.runId,
111
- idemKey: `approval_requested:${rec.id}`,
112
- payload: {
113
- step: input.step,
114
- callId: rec.callId,
115
- approvalId: rec.id,
116
- toolKey: rec.toolKey,
117
- expiresAt: rec.expiresAt,
118
- ...(input.policy !== undefined && { policy: input.policy }),
119
- },
120
- },
121
- ], t);
122
- return { record: rec, toSeq: Math.max(...written.map((e) => e.seq)) };
123
- });
124
- await eventLog.notify(record.conversationId, toSeq);
95
+ const { record, toSeq } = await this.requestIn(input);
96
+ await this.eventLog.notify(record.conversationId, toSeq);
125
97
  return record;
126
98
  }
99
+ async requestIn(input) {
100
+ const hours = this.config.get().tools.approvalTimeoutHours;
101
+ const t = this.db.db;
102
+ // Lock the conversation row (the append's lock) before inserting the approval: the insert's
103
+ // foreign key check takes FOR KEY SHARE on that row, and two requests that each held it and
104
+ // then asked for the append's FOR UPDATE waited for each other (40P01)
105
+ await t
106
+ .selectFrom("conversations")
107
+ .select("id")
108
+ .where("id", "=", input.conversationId)
109
+ .forUpdate()
110
+ .execute();
111
+ await t
112
+ .insertInto("approvals")
113
+ .values({
114
+ id: randomUUID(),
115
+ org_id: input.orgId,
116
+ conversation_id: input.conversationId,
117
+ run_id: input.runId,
118
+ call_id: input.callId,
119
+ attempt: input.attempt ?? 1,
120
+ tool_key: input.toolKey,
121
+ spec_hash: input.specHash,
122
+ connector_id: input.connectorId,
123
+ input: JSON.stringify(input.input ?? {}),
124
+ requested_for: input.requestedFor,
125
+ approver_role: input.approverRole,
126
+ scope: null,
127
+ decided_by: null,
128
+ expires_at: sql `now() + ${hours}::integer * interval '1 hour'`,
129
+ })
130
+ .onConflict((oc) => oc.columns(["run_id", "call_id", "attempt"]).doNothing())
131
+ .execute();
132
+ const row = await t
133
+ .selectFrom("approvals")
134
+ .selectAll()
135
+ .where("run_id", "=", input.runId)
136
+ .where("call_id", "=", input.callId)
137
+ .where("attempt", "=", input.attempt ?? 1)
138
+ .executeTakeFirstOrThrow();
139
+ const rec = toRecord(row);
140
+ const written = await this.eventLog.appendIn(rec.conversationId, [
141
+ {
142
+ type: "approval_requested",
143
+ runId: rec.runId,
144
+ idemKey: `approval_requested:${rec.id}`,
145
+ payload: {
146
+ step: input.step,
147
+ callId: rec.callId,
148
+ approvalId: rec.id,
149
+ toolKey: rec.toolKey,
150
+ expiresAt: rec.expiresAt,
151
+ ...(input.policy !== undefined && { policy: input.policy }),
152
+ },
153
+ },
154
+ ]);
155
+ return { record: rec, toSeq: Math.max(...written.map((e) => e.seq)) };
156
+ }
127
157
  /** 当前用户能处理的审批(新的在前,最多 {@link APPROVALS_LIST_MAX} 条);`status` 缺省为全部。 */
128
158
  async list(orgId, accountId, status) {
129
- const role = await this.roleOf(this.deps.db, orgId, accountId);
159
+ const role = await this.roleOf(orgId, accountId);
130
160
  const roles = role === null ? [] : ORG_ROLES.filter((r) => roleAtLeast(role, r));
131
- let q = this.deps.db
161
+ let q = this.db
132
162
  .selectFrom("approvals")
133
163
  .innerJoin("runs", "runs.id", "approvals.run_id")
134
164
  .selectAll("approvals")
@@ -154,7 +184,7 @@ export class ApprovalsService {
154
184
  }
155
185
  /** 详情;当前用户不能处理的一律 `approval.not_found`(不泄露存在)。 */
156
186
  async get(orgId, id, accountId) {
157
- const row = await this.deps.db
187
+ const row = await this.db
158
188
  .selectFrom("approvals")
159
189
  .innerJoin("runs", "runs.id", "approvals.run_id")
160
190
  .selectAll("approvals")
@@ -164,7 +194,7 @@ export class ApprovalsService {
164
194
  .executeTakeFirst();
165
195
  if (!row)
166
196
  throw notFound();
167
- const role = await this.roleOf(this.deps.db, orgId, accountId);
197
+ const role = await this.roleOf(orgId, accountId);
168
198
  const rec = toRecord(row);
169
199
  if (!canHandle(rec, row.trigger_account_id, accountId, role))
170
200
  throw notFound();
@@ -180,146 +210,149 @@ export class ApprovalsService {
180
210
  * 提交后发布事件并调用 `onDecided`。
181
211
  */
182
212
  async decide(orgId, id, accountId, body, actorTokenId) {
183
- const { db, eventLog } = this.deps;
184
- const { record, toSeq } = await db.transaction().execute(async (t) => {
185
- const locked = await t
186
- .selectFrom("approvals")
187
- .selectAll()
188
- .select(sql `expires_at <= now()`.as("expired"))
189
- .where("id", "=", id)
190
- .where("org_id", "=", orgId)
191
- .forUpdate()
192
- .executeTakeFirst();
193
- if (!locked)
194
- throw notFound();
195
- const ctx = await t
196
- .selectFrom("runs")
197
- .innerJoin("conversations", "conversations.id", "runs.conversation_id")
198
- .select([
199
- "runs.trigger_account_id",
200
- "conversations.agent_id",
201
- "conversations.parent_conversation_id",
202
- ])
203
- .where("runs.id", "=", locked.run_id)
204
- .executeTakeFirstOrThrow();
205
- const before = toRecord(locked);
206
- const role = await this.roleOf(t, orgId, accountId);
207
- if (!canHandle(before, ctx.trigger_account_id, accountId, role))
208
- throw notFound();
209
- if (before.status !== "pending") {
210
- throw new ApiError("approval.already_decided", "Approval has already been decided");
211
- }
212
- if (locked.expired) {
213
- throw new ApiError("approval.already_decided", "Approval has expired");
214
- }
215
- const approved = body.decision === "approve";
216
- const reason = approved ? undefined : body.reason?.trim() || undefined;
217
- const scope = approved ? (body.scope ?? "once") : null;
218
- // 按角色升级的批准只对这一次有效:授权记在发起人名下会让其以后绕过角色要求
219
- if (scope !== null && scope !== "once" && before.requestedFor === null) {
220
- throw new ApiError("validation_failed", 'Only scope "once" is allowed for role-escalated approvals', [{ path: "scope", message: 'Only "once" is allowed for role-escalated approvals' }]);
221
- }
222
- const updated = await t
223
- .updateTable("approvals")
224
- .set({
225
- status: approved ? "approved" : "denied",
226
- scope,
227
- decided_by: accountId,
228
- decided_at: sql `now()`,
229
- deny_reason: reason ?? null,
213
+ const { record, toSeq } = await this.decideIn(orgId, id, accountId, body, actorTokenId);
214
+ await this.eventLog.notify(record.conversationId, toSeq);
215
+ // waits resume the run and its IM delivery is enqueued (handler failures are logged)
216
+ await this.events.emit("approval.decided", {
217
+ id: record.id,
218
+ orgId: record.orgId,
219
+ conversationId: record.conversationId,
220
+ runId: record.runId,
221
+ status: record.status === "approved" ? "approved" : "denied",
222
+ });
223
+ return record;
224
+ }
225
+ // its own transaction (as the legacy one was): `approval.decided` is emitted only after the
226
+ // decision committed, even when a caller has a transaction open
227
+ async decideIn(orgId, id, accountId, body, actorTokenId) {
228
+ const t = this.db.db;
229
+ const locked = await t
230
+ .selectFrom("approvals")
231
+ .selectAll()
232
+ .select(sql `expires_at <= now()`.as("expired"))
233
+ .where("id", "=", id)
234
+ .where("org_id", "=", orgId)
235
+ .forUpdate()
236
+ .executeTakeFirst();
237
+ if (!locked)
238
+ throw notFound();
239
+ const ctx = await t
240
+ .selectFrom("runs")
241
+ .innerJoin("conversations", "conversations.id", "runs.conversation_id")
242
+ .select([
243
+ "runs.trigger_account_id",
244
+ "conversations.agent_id",
245
+ "conversations.parent_conversation_id",
246
+ ])
247
+ .where("runs.id", "=", locked.run_id)
248
+ .executeTakeFirstOrThrow();
249
+ const before = toRecord(locked);
250
+ const role = await this.roleOf(orgId, accountId);
251
+ if (!canHandle(before, ctx.trigger_account_id, accountId, role))
252
+ throw notFound();
253
+ if (before.status !== "pending") {
254
+ throw new ApiError("approval.already_decided", "Approval has already been decided");
255
+ }
256
+ if (locked.expired) {
257
+ throw new ApiError("approval.already_decided", "Approval has expired");
258
+ }
259
+ const approved = body.decision === "approve";
260
+ const reason = approved ? undefined : body.reason?.trim() || undefined;
261
+ const scope = approved ? (body.scope ?? "once") : null;
262
+ // 按角色升级的批准只对这一次有效:授权记在发起人名下会让其以后绕过角色要求
263
+ if (scope !== null && scope !== "once" && before.requestedFor === null) {
264
+ throw new ApiError("validation_failed", 'Only scope "once" is allowed for role-escalated approvals', [{ path: "scope", message: 'Only "once" is allowed for role-escalated approvals' }]);
265
+ }
266
+ const updated = await t
267
+ .updateTable("approvals")
268
+ .set({
269
+ status: approved ? "approved" : "denied",
270
+ scope,
271
+ decided_by: accountId,
272
+ decided_at: sql `now()`,
273
+ deny_reason: reason ?? null,
274
+ })
275
+ .where("id", "=", id)
276
+ .returningAll()
277
+ .executeTakeFirstOrThrow();
278
+ // 授权绑定所批准的定义指纹与来源连接器(同 slug 重新安装的连接器 id 不同,不继承)
279
+ const hash = before.specHash;
280
+ const connectorId = before.connectorId;
281
+ if (scope === "session") {
282
+ // a sub-agent's grant is its parent conversation's (sub-agents spec §9): its siblings and
283
+ // the parent itself are not asked again for the same call
284
+ await t
285
+ .insertInto("conversation_tool_grants")
286
+ .values({
287
+ conversation_id: ctx.parent_conversation_id ?? before.conversationId,
288
+ tool_key: before.toolKey,
289
+ spec_hash: hash,
290
+ connector_id: connectorId,
230
291
  })
231
- .where("id", "=", id)
232
- .returningAll()
233
- .executeTakeFirstOrThrow();
234
- // 授权绑定所批准的定义指纹与来源连接器(同 slug 重新安装的连接器 id 不同,不继承)
235
- const hash = before.specHash;
236
- const connectorId = before.connectorId;
237
- if (scope === "session") {
238
- // a sub-agent's grant is its parent conversation's (sub-agents spec §9): its siblings and
239
- // the parent itself are not asked again for the same call
240
- await t
241
- .insertInto("conversation_tool_grants")
242
- .values({
243
- conversation_id: ctx.parent_conversation_id ?? before.conversationId,
244
- tool_key: before.toolKey,
245
- spec_hash: hash,
246
- connector_id: connectorId,
247
- })
248
- .onConflict((oc) => oc
249
- .columns(["conversation_id", "tool_key"])
250
- .doUpdateSet({ spec_hash: hash, connector_id: connectorId }))
251
- .execute();
252
- }
253
- else if (scope === "always" && before.requestedFor !== null) {
254
- await t
255
- .insertInto("tool_grants")
256
- .values({
257
- org_id: orgId,
258
- account_id: before.requestedFor,
259
- agent_id: ctx.agent_id,
260
- tool_key: before.toolKey,
261
- spec_hash: hash,
262
- connector_id: connectorId,
263
- })
264
- .onConflict((oc) => oc.columns(["org_id", "account_id", "agent_id", "tool_key"]).doUpdateSet({
265
- spec_hash: hash,
266
- connector_id: connectorId,
267
- created_at: sql `now()`,
268
- }))
269
- .execute();
270
- }
271
- const written = await eventLog.append(before.conversationId, [
272
- {
273
- type: "approval_decided",
274
- runId: before.runId,
275
- idemKey: `approval_decided:${id}`,
276
- payload: {
277
- approvalId: id,
278
- callId: before.callId,
279
- decision: approved ? "approved" : "denied",
280
- ...(scope !== null && { scope }),
281
- byAccountId: accountId,
282
- ...(reason !== undefined && { reason }),
283
- },
284
- },
285
- ], t);
286
- await audit(t, {
287
- actorAccountId: accountId,
288
- ...(actorTokenId !== undefined && { actorTokenId }),
289
- orgId,
290
- action: "approval.decided",
291
- target: id,
292
- detail: {
293
- toolKey: before.toolKey,
294
- conversationId: before.conversationId,
295
- runId: before.runId,
296
- agentId: ctx.agent_id,
297
- initiatorAccountId: ctx.trigger_account_id,
292
+ .onConflict((oc) => oc
293
+ .columns(["conversation_id", "tool_key"])
294
+ .doUpdateSet({ spec_hash: hash, connector_id: connectorId }))
295
+ .execute();
296
+ }
297
+ else if (scope === "always" && before.requestedFor !== null) {
298
+ await t
299
+ .insertInto("tool_grants")
300
+ .values({
301
+ org_id: orgId,
302
+ account_id: before.requestedFor,
303
+ agent_id: ctx.agent_id,
304
+ tool_key: before.toolKey,
305
+ spec_hash: hash,
306
+ connector_id: connectorId,
307
+ })
308
+ .onConflict((oc) => oc.columns(["org_id", "account_id", "agent_id", "tool_key"]).doUpdateSet({
309
+ spec_hash: hash,
310
+ connector_id: connectorId,
311
+ created_at: sql `now()`,
312
+ }))
313
+ .execute();
314
+ }
315
+ const written = await this.eventLog.appendIn(before.conversationId, [
316
+ {
317
+ type: "approval_decided",
318
+ runId: before.runId,
319
+ idemKey: `approval_decided:${id}`,
320
+ payload: {
321
+ approvalId: id,
322
+ callId: before.callId,
298
323
  decision: approved ? "approved" : "denied",
299
- scope,
300
- ...(body.note !== undefined && { note: body.note }),
324
+ ...(scope !== null && { scope }),
325
+ byAccountId: accountId,
301
326
  ...(reason !== undefined && { reason }),
302
327
  },
303
- });
304
- return { record: toRecord(updated), toSeq: Math.max(...written.map((e) => e.seq)) };
328
+ },
329
+ ]);
330
+ await audit(t, {
331
+ actorAccountId: accountId,
332
+ ...(actorTokenId !== undefined && { actorTokenId }),
333
+ orgId,
334
+ action: "approval.decided",
335
+ target: id,
336
+ detail: {
337
+ toolKey: before.toolKey,
338
+ conversationId: before.conversationId,
339
+ runId: before.runId,
340
+ agentId: ctx.agent_id,
341
+ initiatorAccountId: ctx.trigger_account_id,
342
+ decision: approved ? "approved" : "denied",
343
+ scope,
344
+ ...(body.note !== undefined && { note: body.note }),
345
+ ...(reason !== undefined && { reason }),
346
+ },
305
347
  });
306
- await eventLog.notify(record.conversationId, toSeq);
307
- if (this.deps.onDecided) {
308
- try {
309
- await this.deps.onDecided(record);
310
- }
311
- catch (err) {
312
- this.deps.log.warn("approval onDecided hook failed", { approvalId: record.id, err });
313
- }
314
- }
315
- return record;
348
+ return { record: toRecord(updated), toSeq: Math.max(...written.map((e) => e.seq)) };
316
349
  }
317
350
  /**
318
351
  * 详情,不做处理人校验(内核内部用:渠道出站投递组装 IM 审批卡片);不存在返回 null。
319
352
  * 不得直接回给请求方——HTTP 接口用 {@link get}。
320
353
  */
321
354
  async describe(id) {
322
- const row = await this.deps.db
355
+ const row = await this.db
323
356
  .selectFrom("approvals")
324
357
  .selectAll()
325
358
  .where("id", "=", id)
@@ -331,7 +364,7 @@ export class ApprovalsService {
331
364
  }
332
365
  /** 某个工具调用最近一次的审批(attempt 最大者);没有则返回 null。 */
333
366
  async forCall(runId, callId) {
334
- const row = await this.deps.db
367
+ const row = await this.db
335
368
  .selectFrom("approvals")
336
369
  .selectAll()
337
370
  .where("run_id", "=", runId)
@@ -347,41 +380,43 @@ export class ApprovalsService {
347
380
  * `settled`(已处理、已取消或不存在)。
348
381
  */
349
382
  async expire(id) {
350
- const { db, eventLog } = this.deps;
351
- const r = await db.transaction().execute(async (t) => {
352
- const locked = await t
353
- .selectFrom("approvals")
354
- .selectAll()
355
- .select(sql `expires_at <= now()`.as("expired"))
356
- .where("id", "=", id)
357
- .forUpdate()
358
- .executeTakeFirst();
359
- if (!locked)
360
- return { outcome: "settled" };
361
- const before = toRecord(locked);
362
- if (before.status !== "pending")
363
- return { outcome: "settled", record: before };
364
- if (!locked.expired)
365
- return { outcome: "not_due", record: before };
366
- const updated = await t
367
- .updateTable("approvals")
368
- .set({ status: "expired", decided_at: sql `now()` })
369
- .where("id", "=", id)
370
- .returningAll()
371
- .executeTakeFirstOrThrow();
372
- const toSeq = await this.decidedEvent(t, before, "expired");
373
- return { outcome: "expired", record: toRecord(updated), toSeq };
374
- });
383
+ const r = await this.expireIn(id);
375
384
  if ("toSeq" in r && r.toSeq !== undefined && r.record) {
376
- await eventLog.notify(r.record.conversationId, r.toSeq);
385
+ await this.eventLog.notify(r.record.conversationId, r.toSeq);
377
386
  }
378
387
  return r.record ? { outcome: r.outcome, record: r.record } : { outcome: r.outcome };
379
388
  }
389
+ async expireIn(id) {
390
+ const t = this.db.db;
391
+ const locked = await t
392
+ .selectFrom("approvals")
393
+ .selectAll()
394
+ .select(sql `expires_at <= now()`.as("expired"))
395
+ .where("id", "=", id)
396
+ .forUpdate()
397
+ .executeTakeFirst();
398
+ if (!locked)
399
+ return { outcome: "settled" };
400
+ const before = toRecord(locked);
401
+ if (before.status !== "pending")
402
+ return { outcome: "settled", record: before };
403
+ if (!locked.expired)
404
+ return { outcome: "not_due", record: before };
405
+ const updated = await t
406
+ .updateTable("approvals")
407
+ .set({ status: "expired", decided_at: sql `now()` })
408
+ .where("id", "=", id)
409
+ .returningAll()
410
+ .executeTakeFirstOrThrow();
411
+ const toSeq = await this.decidedEvent(before, "expired");
412
+ return { outcome: "expired", record: toRecord(updated), toSeq };
413
+ }
380
414
  /**
381
- * 在事务 `t` 内取消运行的全部 pending 审批(运行在等待中被中止),各写 `approval_decided{cancelled}`
382
- * (处理人为 null)。返回被取消的记录;调用方提交后发布事件。
415
+ * 在调用方的事务内(`mandatory`)取消运行的全部 pending 审批(运行在等待中被中止),各写
416
+ * `approval_decided{cancelled}`(处理人为 null)。返回被取消的记录;调用方提交后发布事件。
383
417
  */
384
- async cancelPendingIn(t, runId) {
418
+ async cancelPendingIn(runId) {
419
+ const t = this.db.db;
385
420
  const rows = await t
386
421
  .selectFrom("approvals")
387
422
  .selectAll()
@@ -398,17 +433,18 @@ export class ApprovalsService {
398
433
  .where("id", "=", row.id)
399
434
  .returningAll()
400
435
  .executeTakeFirstOrThrow();
401
- await this.decidedEvent(t, toRecord(row), "cancelled");
436
+ await this.decidedEvent(toRecord(row), "cancelled");
402
437
  out.push(toRecord(updated));
403
438
  }
404
439
  return out;
405
440
  }
406
441
  /**
407
- * 在事务 `t` 内取消某组织里指定由 `accountId` 处理(`requested_for`)的全部 pending 审批(成员离职),
442
+ * 在调用方的事务内(`mandatory`)取消某组织里指定由 `accountId` 处理(`requested_for`)的全部 pending 审批(成员离职),
408
443
  * 走与 {@link cancelPendingIn} 相同的取消路径:置 cancelled、写 `approval_decided{cancelled}`(处理人为 null)。
409
444
  * 返回被取消的记录与各会话写到的最大 seq;调用方提交后发布事件(并可续跑对应运行)。
410
445
  */
411
- async cancelPendingFor(t, orgId, accountId) {
446
+ async cancelPendingFor(orgId, accountId) {
447
+ const t = this.db.db;
412
448
  const rows = await t
413
449
  .selectFrom("approvals")
414
450
  .selectAll()
@@ -427,27 +463,27 @@ export class ApprovalsService {
427
463
  .where("id", "=", row.id)
428
464
  .returningAll()
429
465
  .executeTakeFirstOrThrow();
430
- const seq = await this.decidedEvent(t, toRecord(row), "cancelled");
466
+ const seq = await this.decidedEvent(toRecord(row), "cancelled");
431
467
  seqs.set(row.conversation_id, Math.max(seqs.get(row.conversation_id) ?? 0, seq));
432
468
  records.push(toRecord(updated));
433
469
  }
434
470
  return { records, seqs };
435
471
  }
436
- /** 系统写的 `approval_decided`(超时 / 取消,处理人为 null),返回事件 seq。 */
437
- async decidedEvent(t, a, decision) {
438
- const written = await this.deps.eventLog.append(a.conversationId, [
472
+ /** 系统写的 `approval_decided`(超时 / 取消,处理人为 null),在当前事务内;返回事件 seq。 */
473
+ async decidedEvent(a, decision) {
474
+ const written = await this.eventLog.appendIn(a.conversationId, [
439
475
  {
440
476
  type: "approval_decided",
441
477
  runId: a.runId,
442
478
  idemKey: `approval_decided:${a.id}`,
443
479
  payload: { approvalId: a.id, callId: a.callId, decision, byAccountId: null },
444
480
  },
445
- ], t);
481
+ ]);
446
482
  return Math.max(...written.map((e) => e.seq));
447
483
  }
448
484
  /** 本人在该组织的「以后都允许」授权。 */
449
485
  async listGrants(orgId, accountId) {
450
- const rows = await this.deps.db
486
+ const rows = await this.db
451
487
  .selectFrom("tool_grants")
452
488
  .select(["agent_id", "tool_key", "spec_hash", "created_at"])
453
489
  .where("org_id", "=", orgId)
@@ -465,28 +501,31 @@ export class ApprovalsService {
465
501
  }
466
502
  /** 撤销本人的一条授权;不存在时什么也不做(幂等)。 */
467
503
  async revokeGrant(orgId, accountId, agentId, toolKey, actorTokenId) {
468
- await this.deps.db.transaction().execute(async (t) => {
469
- const res = await t
470
- .deleteFrom("tool_grants")
471
- .where("org_id", "=", orgId)
472
- .where("account_id", "=", accountId)
473
- .where("agent_id", "=", agentId)
474
- .where("tool_key", "=", toolKey)
475
- .executeTakeFirst();
476
- if (Number(res.numDeletedRows) === 0)
477
- return;
478
- await audit(t, {
479
- actorAccountId: accountId,
480
- ...(actorTokenId !== undefined && { actorTokenId }),
481
- orgId,
482
- action: "tool_grant.revoked",
483
- target: agentId,
484
- detail: { toolKey },
485
- });
504
+ await this.revokeGrantIn(orgId, accountId, agentId, toolKey, actorTokenId);
505
+ }
506
+ async revokeGrantIn(orgId, accountId, agentId, toolKey, actorTokenId) {
507
+ const t = this.db.db;
508
+ const res = await t
509
+ .deleteFrom("tool_grants")
510
+ .where("org_id", "=", orgId)
511
+ .where("account_id", "=", accountId)
512
+ .where("agent_id", "=", agentId)
513
+ .where("tool_key", "=", toolKey)
514
+ .executeTakeFirst();
515
+ if (Number(res.numDeletedRows) === 0)
516
+ return;
517
+ await audit(t, {
518
+ actorAccountId: accountId,
519
+ ...(actorTokenId !== undefined && { actorTokenId }),
520
+ orgId,
521
+ action: "tool_grant.revoked",
522
+ target: agentId,
523
+ detail: { toolKey },
486
524
  });
487
525
  }
488
- async roleOf(db, orgId, accountId) {
489
- const m = await db
526
+ /** The member's current role, read in the context's transaction when there is one. */
527
+ async roleOf(orgId, accountId) {
528
+ const m = await this.db
490
529
  .selectFrom("memberships")
491
530
  .select("role")
492
531
  .where("org_id", "=", orgId)
@@ -498,7 +537,7 @@ export class ApprovalsService {
498
537
  async agentNames(ids) {
499
538
  if (ids.length === 0)
500
539
  return new Map();
501
- const rows = await this.deps.db
540
+ const rows = await this.db
502
541
  .selectFrom("agents")
503
542
  .innerJoin("agent_versions", (j) => j
504
543
  .onRef("agent_versions.agent_id", "=", "agents.id")
@@ -515,7 +554,7 @@ export class ApprovalsService {
515
554
  async views(recs) {
516
555
  if (recs.length === 0)
517
556
  return [];
518
- const { db } = this.deps;
557
+ const db = this.db;
519
558
  const ctxRows = await db
520
559
  .selectFrom("runs")
521
560
  .innerJoin("conversations", "conversations.id", "runs.conversation_id")
@@ -565,4 +604,31 @@ export class ApprovalsService {
565
604
  ];
566
605
  });
567
606
  }
568
- }
607
+ };
608
+ __decorate([
609
+ Transactional()
610
+ ], ApprovalsService.prototype, "requestIn", null);
611
+ __decorate([
612
+ Transactional({ propagation: "requires_new" })
613
+ ], ApprovalsService.prototype, "decideIn", null);
614
+ __decorate([
615
+ Transactional()
616
+ ], ApprovalsService.prototype, "expireIn", null);
617
+ __decorate([
618
+ Transactional({ propagation: "mandatory" })
619
+ ], ApprovalsService.prototype, "cancelPendingIn", null);
620
+ __decorate([
621
+ Transactional({ propagation: "mandatory" })
622
+ ], ApprovalsService.prototype, "cancelPendingFor", null);
623
+ __decorate([
624
+ Transactional()
625
+ ], ApprovalsService.prototype, "revokeGrantIn", null);
626
+ ApprovalsService = __decorate([
627
+ Injectable(),
628
+ __param(0, Inject(KernelDb)),
629
+ __param(1, Inject(KernelConfigService)),
630
+ __param(2, Inject(EventLog)),
631
+ __param(3, Inject(KernelEvents)),
632
+ __param(4, Inject(TransactionHost))
633
+ ], ApprovalsService);
634
+ export { ApprovalsService };