@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3

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