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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/dist/admin/admin.controller.d.ts +17 -17
  2. package/dist/admin/admin.controller.js +43 -26
  3. package/dist/admin/admin.module.d.ts +3 -0
  4. package/dist/admin/admin.module.js +22 -0
  5. package/dist/admin/extensions.controller.d.ts +14 -14
  6. package/dist/admin/extensions.controller.js +30 -17
  7. package/dist/admin/setup-lock.d.ts +16 -0
  8. package/dist/admin/setup-lock.js +47 -0
  9. package/dist/admin/setup.controller.d.ts +8 -8
  10. package/dist/admin/setup.controller.js +27 -25
  11. package/dist/admin/setup.service.d.ts +19 -27
  12. package/dist/admin/setup.service.js +61 -61
  13. package/dist/agents/agent-lookup.d.ts +53 -0
  14. package/dist/agents/agent-lookup.js +179 -0
  15. package/dist/agents/agents.controller.d.ts +1 -1
  16. package/dist/agents/agents.controller.js +14 -8
  17. package/dist/agents/agents.module.d.ts +7 -0
  18. package/dist/agents/agents.module.js +41 -0
  19. package/dist/agents/agents.service.d.ts +39 -58
  20. package/dist/agents/agents.service.js +261 -329
  21. package/dist/agents/definition.d.ts +8 -0
  22. package/dist/agents/definition.js +8 -0
  23. package/dist/agents/models.controller.d.ts +1 -1
  24. package/dist/agents/models.controller.js +2 -2
  25. package/dist/agents/templates.controller.d.ts +1 -1
  26. package/dist/agents/templates.controller.js +2 -2
  27. package/dist/agents/templates.d.ts +6 -8
  28. package/dist/agents/templates.js +20 -4
  29. package/dist/app.d.ts +93 -0
  30. package/dist/app.js +150 -0
  31. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  32. package/dist/catalog/admin-catalog.controller.js +27 -13
  33. package/dist/catalog/catalog-content.d.ts +185 -0
  34. package/dist/catalog/catalog-content.js +323 -0
  35. package/dist/catalog/catalog-items.d.ts +186 -0
  36. package/dist/catalog/catalog-items.js +410 -0
  37. package/dist/catalog/catalog.module.d.ts +14 -0
  38. package/dist/catalog/catalog.module.js +71 -0
  39. package/dist/catalog/catalog.service.d.ts +34 -188
  40. package/dist/catalog/catalog.service.js +155 -489
  41. package/dist/catalog/cli.d.ts +3 -2
  42. package/dist/catalog/cli.js +13 -31
  43. package/dist/catalog/job-ids.d.ts +15 -0
  44. package/dist/catalog/job-ids.js +15 -0
  45. package/dist/catalog/jobs.d.ts +27 -0
  46. package/dist/catalog/jobs.js +70 -0
  47. package/dist/catalog/locks.d.ts +24 -0
  48. package/dist/catalog/locks.js +63 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  50. package/dist/catalog/marketplaces.controller.js +22 -11
  51. package/dist/catalog/marketplaces.service.d.ts +30 -13
  52. package/dist/catalog/marketplaces.service.js +330 -256
  53. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  54. package/dist/catalog/org-catalog.controller.js +29 -14
  55. package/dist/catalog/org-catalog.service.d.ts +32 -198
  56. package/dist/catalog/org-catalog.service.js +159 -400
  57. package/dist/catalog/plugin-import.d.ts +73 -34
  58. package/dist/catalog/plugin-import.js +356 -217
  59. package/dist/catalog/plugin-install.d.ts +83 -41
  60. package/dist/catalog/plugin-install.js +421 -269
  61. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  62. package/dist/catalog/plugin-upgrade.js +407 -282
  63. package/dist/catalog/requests.service.d.ts +27 -15
  64. package/dist/catalog/requests.service.js +201 -145
  65. package/dist/catalog/upgrade-targets.d.ts +4 -7
  66. package/dist/channels/actions.d.ts +6 -4
  67. package/dist/channels/actions.js +1 -1
  68. package/dist/channels/cards.d.ts +2 -2
  69. package/dist/channels/channels.module.d.ts +40 -0
  70. package/dist/channels/channels.module.js +128 -0
  71. package/dist/channels/connections.controller.d.ts +1 -1
  72. package/dist/channels/connections.controller.js +11 -6
  73. package/dist/channels/connections.service.d.ts +43 -21
  74. package/dist/channels/connections.service.js +236 -131
  75. package/dist/channels/inbound.d.ts +34 -38
  76. package/dist/channels/inbound.js +107 -41
  77. package/dist/channels/job-ids.d.ts +10 -0
  78. package/dist/channels/job-ids.js +10 -0
  79. package/dist/channels/jobs.d.ts +85 -0
  80. package/dist/channels/jobs.js +157 -0
  81. package/dist/channels/outbound.d.ts +60 -82
  82. package/dist/channels/outbound.js +165 -194
  83. package/dist/channels/supervisor.d.ts +88 -46
  84. package/dist/channels/supervisor.js +230 -132
  85. package/dist/channels/threads.d.ts +29 -8
  86. package/dist/channels/threads.js +71 -13
  87. package/dist/channels/webhook.d.ts +20 -14
  88. package/dist/channels/webhook.js +51 -20
  89. package/dist/config/load.d.ts +3 -2
  90. package/dist/config/load.js +3 -2
  91. package/dist/config/nacos-source.js +11 -2
  92. package/dist/config/schema.d.ts +1 -0
  93. package/dist/config/schema.js +10 -4
  94. package/dist/conversations/access.d.ts +29 -0
  95. package/dist/conversations/access.js +86 -0
  96. package/dist/conversations/artifacts.d.ts +10 -10
  97. package/dist/conversations/artifacts.js +35 -9
  98. package/dist/conversations/attachments.controller.d.ts +1 -1
  99. package/dist/conversations/attachments.controller.js +8 -6
  100. package/dist/conversations/attachments.module.d.ts +7 -0
  101. package/dist/conversations/attachments.module.js +25 -0
  102. package/dist/conversations/attachments.service.d.ts +30 -22
  103. package/dist/conversations/attachments.service.js +119 -46
  104. package/dist/conversations/conversations.controller.d.ts +8 -7
  105. package/dist/conversations/conversations.controller.js +59 -29
  106. package/dist/conversations/conversations.module.d.ts +8 -0
  107. package/dist/conversations/conversations.module.js +69 -0
  108. package/dist/conversations/conversations.service.d.ts +40 -38
  109. package/dist/conversations/conversations.service.js +130 -140
  110. package/dist/conversations/event-log.d.ts +28 -18
  111. package/dist/conversations/event-log.js +74 -27
  112. package/dist/conversations/files.d.ts +10 -10
  113. package/dist/conversations/files.js +37 -11
  114. package/dist/conversations/idem-keys.d.ts +5 -0
  115. package/dist/conversations/idem-keys.js +5 -0
  116. package/dist/conversations/job-ids.d.ts +6 -0
  117. package/dist/conversations/job-ids.js +6 -0
  118. package/dist/conversations/outputs-read.d.ts +11 -11
  119. package/dist/conversations/outputs-read.js +31 -7
  120. package/dist/conversations/queue.d.ts +48 -56
  121. package/dist/conversations/queue.js +13 -289
  122. package/dist/conversations/queue.service.d.ts +60 -0
  123. package/dist/conversations/queue.service.js +343 -0
  124. package/dist/conversations/sandbox-status.d.ts +13 -10
  125. package/dist/conversations/sandbox-status.js +36 -8
  126. package/dist/conversations/titles.d.ts +71 -24
  127. package/dist/conversations/titles.js +159 -63
  128. package/dist/ctx/bus.js +9 -3
  129. package/dist/ctx/create-ctx.d.ts +6 -0
  130. package/dist/ctx/create-ctx.js +7 -9
  131. package/dist/ctx/lock.d.ts +7 -3
  132. package/dist/ctx/lock.js +9 -20
  133. package/dist/ctx/secrets.d.ts +10 -2
  134. package/dist/ctx/secrets.js +7 -3
  135. package/dist/db/kernel-schema.d.ts +2 -2
  136. package/dist/db/pool.d.ts +5 -0
  137. package/dist/db/pool.js +1 -0
  138. package/dist/errors.d.ts +1 -0
  139. package/dist/errors.js +1 -0
  140. package/dist/evals/budget.d.ts +42 -21
  141. package/dist/evals/budget.js +114 -62
  142. package/dist/evals/evals.module.d.ts +31 -0
  143. package/dist/evals/evals.module.js +114 -0
  144. package/dist/evals/jobs.d.ts +20 -0
  145. package/dist/evals/jobs.js +45 -0
  146. package/dist/evals/run-replay.d.ts +56 -8
  147. package/dist/evals/run-replay.js +140 -80
  148. package/dist/evals/runs.controller.d.ts +1 -1
  149. package/dist/evals/runs.controller.js +17 -8
  150. package/dist/evals/runs.service.d.ts +23 -45
  151. package/dist/evals/runs.service.js +245 -234
  152. package/dist/evals/sets.controller.d.ts +1 -1
  153. package/dist/evals/sets.controller.js +17 -8
  154. package/dist/evals/sets.service.d.ts +22 -6
  155. package/dist/evals/sets.service.js +248 -194
  156. package/dist/evals/snapshot.d.ts +2 -2
  157. package/dist/evals/step-replay.d.ts +2 -2
  158. package/dist/evals/step-replay.js +1 -1
  159. package/dist/evals/trajectory.controller.d.ts +1 -1
  160. package/dist/evals/trajectory.controller.js +11 -7
  161. package/dist/evals/trajectory.service.d.ts +5 -4
  162. package/dist/evals/trajectory.service.js +30 -7
  163. package/dist/evals/worker.d.ts +44 -27
  164. package/dist/evals/worker.js +220 -121
  165. package/dist/extensions/admin-ops.d.ts +61 -33
  166. package/dist/extensions/admin-ops.js +248 -154
  167. package/dist/extensions/admin-view.d.ts +38 -27
  168. package/dist/extensions/admin-view.js +126 -55
  169. package/dist/extensions/approvals.d.ts +12 -8
  170. package/dist/extensions/approvals.js +73 -46
  171. package/dist/extensions/blobs.d.ts +27 -10
  172. package/dist/extensions/blobs.js +111 -45
  173. package/dist/extensions/bootstrap.d.ts +58 -31
  174. package/dist/extensions/bootstrap.js +175 -121
  175. package/dist/extensions/cli.d.ts +20 -10
  176. package/dist/extensions/cli.js +41 -96
  177. package/dist/extensions/config-issues.d.ts +7 -0
  178. package/dist/extensions/config-issues.js +31 -0
  179. package/dist/extensions/deployment-config-store.d.ts +49 -0
  180. package/dist/extensions/deployment-config-store.js +133 -0
  181. package/dist/extensions/deployment-config.d.ts +58 -67
  182. package/dist/extensions/deployment-config.js +202 -230
  183. package/dist/extensions/enabled.d.ts +5 -5
  184. package/dist/extensions/extensions.module.d.ts +8 -0
  185. package/dist/extensions/extensions.module.js +77 -0
  186. package/dist/extensions/hooks.d.ts +3 -2
  187. package/dist/extensions/hooks.js +1 -1
  188. package/dist/extensions/host.d.ts +72 -68
  189. package/dist/extensions/host.js +191 -152
  190. package/dist/extensions/installs.d.ts +49 -16
  191. package/dist/extensions/installs.js +128 -32
  192. package/dist/extensions/job-ids.d.ts +6 -0
  193. package/dist/extensions/job-ids.js +6 -0
  194. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  195. package/dist/extensions/lifecycle-topics.js +18 -0
  196. package/dist/extensions/lifecycle.d.ts +35 -47
  197. package/dist/extensions/lifecycle.js +103 -39
  198. package/dist/extensions/locks.d.ts +33 -0
  199. package/dist/extensions/locks.js +86 -0
  200. package/dist/extensions/migrate-lock.d.ts +3 -4
  201. package/dist/extensions/org-config.controller.d.ts +1 -1
  202. package/dist/extensions/org-config.controller.js +8 -5
  203. package/dist/extensions/org-config.d.ts +48 -46
  204. package/dist/extensions/org-config.js +284 -226
  205. package/dist/extensions/registry.d.ts +50 -2
  206. package/dist/extensions/registry.js +89 -4
  207. package/dist/extensions/sources.d.ts +12 -8
  208. package/dist/extensions/sources.js +34 -13
  209. package/dist/files/files.module.d.ts +3 -0
  210. package/dist/files/files.module.js +22 -0
  211. package/dist/files/previewers.controller.d.ts +7 -2
  212. package/dist/files/previewers.controller.js +17 -9
  213. package/dist/files/previewers.d.ts +13 -18
  214. package/dist/files/previewers.js +83 -36
  215. package/dist/http/adapter.d.ts +3 -0
  216. package/dist/http/adapter.js +25 -0
  217. package/dist/http/api.module.d.ts +3 -110
  218. package/dist/http/api.module.js +47 -355
  219. package/dist/http/app.d.ts +11 -15
  220. package/dist/http/app.js +17 -62
  221. package/dist/http/error-filter.module.d.ts +5 -0
  222. package/dist/http/error-filter.module.js +18 -0
  223. package/dist/http/error.filter.js +2 -2
  224. package/dist/identity/accounts.d.ts +82 -29
  225. package/dist/identity/accounts.js +294 -175
  226. package/dist/identity/api-tokens.d.ts +11 -7
  227. package/dist/identity/api-tokens.js +71 -44
  228. package/dist/identity/audit.d.ts +7 -4
  229. package/dist/identity/audit.js +5 -1
  230. package/dist/identity/auth.controller.d.ts +11 -10
  231. package/dist/identity/auth.controller.js +31 -25
  232. package/dist/identity/auth.guard.d.ts +3 -3
  233. package/dist/identity/auth.guard.js +6 -4
  234. package/dist/identity/binding.d.ts +9 -11
  235. package/dist/identity/binding.js +41 -13
  236. package/dist/identity/enterprise-admin.d.ts +18 -12
  237. package/dist/identity/enterprise-admin.js +67 -13
  238. package/dist/identity/external-identity-lock.d.ts +17 -0
  239. package/dist/identity/external-identity-lock.js +39 -0
  240. package/dist/identity/external.d.ts +19 -15
  241. package/dist/identity/external.js +163 -125
  242. package/dist/identity/identity.module.d.ts +6 -0
  243. package/dist/identity/identity.module.js +56 -0
  244. package/dist/identity/me.controller.d.ts +16 -15
  245. package/dist/identity/me.controller.js +37 -31
  246. package/dist/identity/sessions.d.ts +12 -10
  247. package/dist/identity/sessions.js +74 -42
  248. package/dist/identity/settings.d.ts +20 -14
  249. package/dist/identity/settings.js +85 -57
  250. package/dist/identity/sso.controller.d.ts +7 -7
  251. package/dist/identity/sso.controller.js +13 -9
  252. package/dist/identity/sso.d.ts +9 -12
  253. package/dist/identity/sso.js +54 -24
  254. package/dist/inbox/inbox.module.d.ts +3 -0
  255. package/dist/inbox/inbox.module.js +22 -0
  256. package/dist/inbox/inbox.service.d.ts +7 -9
  257. package/dist/inbox/inbox.service.js +32 -11
  258. package/dist/index.d.ts +16 -11
  259. package/dist/index.js +9 -6
  260. package/dist/infra/cache/cache.module.d.ts +3 -0
  261. package/dist/infra/cache/cache.module.js +16 -0
  262. package/dist/infra/cache/cache.service.d.ts +21 -0
  263. package/dist/infra/cache/cache.service.js +80 -0
  264. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  265. package/dist/infra/cache/cacheable.decorator.js +83 -0
  266. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  267. package/dist/infra/cli/kernel-cli.module.js +165 -0
  268. package/dist/infra/close-within.d.ts +15 -0
  269. package/dist/infra/close-within.js +36 -0
  270. package/dist/infra/config/config.module.d.ts +13 -0
  271. package/dist/infra/config/config.module.js +39 -0
  272. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  273. package/dist/infra/config/kernel-config.service.js +126 -0
  274. package/dist/infra/database/after-commit.d.ts +6 -0
  275. package/dist/infra/database/after-commit.js +9 -0
  276. package/dist/infra/database/database.module.d.ts +25 -0
  277. package/dist/infra/database/database.module.js +90 -0
  278. package/dist/infra/database/kernel-db.d.ts +22 -0
  279. package/dist/infra/database/kernel-db.js +65 -0
  280. package/dist/infra/database/transaction-host.d.ts +50 -0
  281. package/dist/infra/database/transaction-host.js +125 -0
  282. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  283. package/dist/infra/database/transactional.decorator.js +27 -0
  284. package/dist/infra/database/xact-lock.d.ts +17 -0
  285. package/dist/infra/database/xact-lock.js +43 -0
  286. package/dist/infra/events/kernel-events.d.ts +96 -0
  287. package/dist/infra/events/kernel-events.js +65 -0
  288. package/dist/infra/health/health.controller.d.ts +26 -0
  289. package/dist/infra/health/health.controller.js +104 -0
  290. package/dist/infra/health/health.module.d.ts +9 -0
  291. package/dist/infra/health/health.module.js +24 -0
  292. package/dist/infra/health/health.options.d.ts +10 -0
  293. package/dist/infra/health/health.options.js +15 -0
  294. package/dist/infra/health/shutdown-state.d.ts +6 -0
  295. package/dist/infra/health/shutdown-state.js +2 -0
  296. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  297. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  300. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  301. package/dist/infra/lifecycle/process-guards.js +86 -0
  302. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  303. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  304. package/dist/infra/lock/key-template.d.ts +13 -0
  305. package/dist/infra/lock/key-template.js +46 -0
  306. package/dist/infra/lock/lock.module.d.ts +3 -0
  307. package/dist/infra/lock/lock.module.js +16 -0
  308. package/dist/infra/lock/lock.service.d.ts +120 -0
  309. package/dist/infra/lock/lock.service.js +343 -0
  310. package/dist/infra/lock/shared-lease.d.ts +44 -0
  311. package/dist/infra/lock/shared-lease.js +121 -0
  312. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  313. package/dist/infra/lock/with-lock.decorator.js +49 -0
  314. package/dist/infra/logging/logging.module.d.ts +16 -0
  315. package/dist/infra/logging/logging.module.js +34 -0
  316. package/dist/infra/queue/configured-processor.d.ts +18 -0
  317. package/dist/infra/queue/configured-processor.js +23 -0
  318. package/dist/infra/queue/job-failure.d.ts +18 -0
  319. package/dist/infra/queue/job-failure.js +26 -0
  320. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  321. package/dist/infra/queue/queue-shutdown.js +81 -0
  322. package/dist/infra/queue/queue.module.d.ts +16 -0
  323. package/dist/infra/queue/queue.module.js +61 -0
  324. package/dist/infra/queue/redis-connection.d.ts +7 -0
  325. package/dist/infra/queue/redis-connection.js +18 -0
  326. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  327. package/dist/infra/queue/retired-schedulers.js +9 -0
  328. package/dist/infra/queue/run-job.d.ts +16 -0
  329. package/dist/infra/queue/run-job.js +19 -0
  330. package/dist/infra/redis/redis.module.d.ts +24 -0
  331. package/dist/infra/redis/redis.module.js +87 -0
  332. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  333. package/dist/infra/schedule/cron-tick.js +25 -0
  334. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  335. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  336. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  337. package/dist/infra/schedule/locked-interval.js +190 -0
  338. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  339. package/dist/infra/schedule/locked-tick.js +137 -0
  340. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  341. package/dist/infra/schedule/schedule.module.js +27 -0
  342. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  343. package/dist/infra/schedule/scheduled-runs.js +163 -0
  344. package/dist/infra/swagger/swagger.d.ts +16 -0
  345. package/dist/infra/swagger/swagger.js +31 -0
  346. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  347. package/dist/infra/throttler/credential-throttler.js +77 -0
  348. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  349. package/dist/infra/throttler/named-throttlers.js +119 -0
  350. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  351. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  352. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  353. package/dist/infra/throttler/throttler.guard.js +68 -0
  354. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  355. package/dist/infra/throttler/throttler.module.js +53 -0
  356. package/dist/infra/tokens.d.ts +15 -0
  357. package/dist/infra/tokens.js +15 -0
  358. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  359. package/dist/infra/validation/create-zod-dto.js +35 -0
  360. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  361. package/dist/infra/validation/parse-with-zod.js +12 -0
  362. package/dist/infra/validation/validation.module.d.ts +3 -0
  363. package/dist/infra/validation/validation.module.js +16 -0
  364. package/dist/infra/validation/zod-params.d.ts +7 -0
  365. package/dist/infra/validation/zod-params.js +42 -0
  366. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  367. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  368. package/dist/kernel.d.ts +9 -244
  369. package/dist/kernel.js +8 -1305
  370. package/dist/kernel.module.d.ts +17 -0
  371. package/dist/kernel.module.js +136 -0
  372. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  373. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  374. package/dist/lifecycle/tokens.d.ts +3 -0
  375. package/dist/lifecycle/tokens.js +3 -0
  376. package/dist/log-context.d.ts +2 -0
  377. package/dist/log-context.js +4 -0
  378. package/dist/models/models.module.d.ts +3 -0
  379. package/dist/models/models.module.js +24 -0
  380. package/dist/models/prices.d.ts +8 -2
  381. package/dist/models/prices.js +65 -37
  382. package/dist/models/purposes.controller.d.ts +1 -1
  383. package/dist/models/purposes.controller.js +5 -6
  384. package/dist/models/purposes.d.ts +35 -13
  385. package/dist/models/purposes.js +101 -51
  386. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  387. package/dist/orgs/directory-sync.controller.js +2 -2
  388. package/dist/orgs/directory-sync.d.ts +61 -31
  389. package/dist/orgs/directory-sync.js +212 -125
  390. package/dist/orgs/invitations.controller.d.ts +8 -8
  391. package/dist/orgs/invitations.controller.js +27 -26
  392. package/dist/orgs/invitations.service.d.ts +12 -9
  393. package/dist/orgs/invitations.service.js +130 -92
  394. package/dist/orgs/job-ids.d.ts +8 -0
  395. package/dist/orgs/job-ids.js +8 -0
  396. package/dist/orgs/members.service.d.ts +19 -12
  397. package/dist/orgs/members.service.js +161 -117
  398. package/dist/orgs/offboarding.d.ts +54 -57
  399. package/dist/orgs/offboarding.js +161 -71
  400. package/dist/orgs/org-lock.d.ts +28 -19
  401. package/dist/orgs/org-lock.js +81 -35
  402. package/dist/orgs/org.guard.d.ts +1 -1
  403. package/dist/orgs/org.guard.js +2 -2
  404. package/dist/orgs/orgs.controller.d.ts +13 -13
  405. package/dist/orgs/orgs.controller.js +29 -17
  406. package/dist/orgs/orgs.module.d.ts +6 -0
  407. package/dist/orgs/orgs.module.js +68 -0
  408. package/dist/orgs/orgs.service.d.ts +30 -19
  409. package/dist/orgs/orgs.service.js +139 -86
  410. package/dist/orgs/settings.controller.d.ts +1 -1
  411. package/dist/orgs/settings.controller.js +8 -6
  412. package/dist/orgs/settings.service.d.ts +14 -8
  413. package/dist/orgs/settings.service.js +75 -46
  414. package/dist/overrides.d.ts +56 -0
  415. package/dist/overrides.js +30 -0
  416. package/dist/roles/gateway-role.d.ts +43 -0
  417. package/dist/roles/gateway-role.js +98 -0
  418. package/dist/roles/gateway.module.d.ts +8 -0
  419. package/dist/roles/gateway.module.js +28 -0
  420. package/dist/roles/worker-role.d.ts +63 -0
  421. package/dist/roles/worker-role.js +144 -0
  422. package/dist/roles/worker.module.d.ts +14 -0
  423. package/dist/roles/worker.module.js +90 -0
  424. package/dist/runtime/abort.js +19 -2
  425. package/dist/runtime/checkpointer.d.ts +8 -3
  426. package/dist/runtime/checkpointer.js +87 -55
  427. package/dist/runtime/conversation-lock.d.ts +20 -11
  428. package/dist/runtime/conversation-lock.js +62 -72
  429. package/dist/runtime/hook-calls.d.ts +3 -3
  430. package/dist/runtime/hook-calls.js +1 -6
  431. package/dist/runtime/job-ids.d.ts +10 -0
  432. package/dist/runtime/job-ids.js +10 -0
  433. package/dist/runtime/langgraph-loop.js +1 -1
  434. package/dist/runtime/loop.d.ts +7 -0
  435. package/dist/runtime/loop.js +14 -0
  436. package/dist/runtime/maintenance-queue.d.ts +10 -0
  437. package/dist/runtime/maintenance-queue.js +10 -0
  438. package/dist/runtime/maintenance.d.ts +45 -74
  439. package/dist/runtime/maintenance.js +139 -137
  440. package/dist/runtime/model-call.d.ts +7 -4
  441. package/dist/runtime/model-call.js +24 -57
  442. package/dist/runtime/providers.d.ts +17 -6
  443. package/dist/runtime/providers.js +66 -25
  444. package/dist/runtime/quota.d.ts +17 -3
  445. package/dist/runtime/quota.js +27 -2
  446. package/dist/runtime/retired-schedulers.d.ts +7 -0
  447. package/dist/runtime/retired-schedulers.js +31 -0
  448. package/dist/runtime/run-control.d.ts +33 -0
  449. package/dist/runtime/run-control.js +77 -0
  450. package/dist/runtime/run-finish.d.ts +26 -17
  451. package/dist/runtime/run-finish.js +98 -51
  452. package/dist/runtime/run-jobs.d.ts +48 -0
  453. package/dist/runtime/run-jobs.js +95 -0
  454. package/dist/runtime/run-processors.d.ts +60 -0
  455. package/dist/runtime/run-processors.js +185 -0
  456. package/dist/runtime/run-queue.d.ts +32 -57
  457. package/dist/runtime/run-queue.js +291 -295
  458. package/dist/runtime/run-steps.d.ts +39 -0
  459. package/dist/runtime/run-steps.js +96 -0
  460. package/dist/runtime/run-worker.d.ts +121 -75
  461. package/dist/runtime/run-worker.js +340 -226
  462. package/dist/runtime/runtime.module.d.ts +10 -0
  463. package/dist/runtime/runtime.module.js +112 -0
  464. package/dist/runtime/step-log.d.ts +40 -0
  465. package/dist/runtime/step-log.js +94 -0
  466. package/dist/runtime/stream.controller.d.ts +5 -8
  467. package/dist/runtime/stream.controller.js +14 -12
  468. package/dist/runtime/stream.d.ts +24 -6
  469. package/dist/runtime/stream.js +78 -7
  470. package/dist/runtime/subagents/child.d.ts +3 -44
  471. package/dist/runtime/subagents/child.js +0 -79
  472. package/dist/runtime/subagents/definition.d.ts +4 -4
  473. package/dist/runtime/subagents/definition.js +2 -2
  474. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  475. package/dist/runtime/subagents/dispatch.js +135 -140
  476. package/dist/runtime/subagents/limits.d.ts +9 -4
  477. package/dist/runtime/subagents/limits.js +4 -2
  478. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  479. package/dist/runtime/subagents/org-agents.js +1 -1
  480. package/dist/runtime/subagents/progress.d.ts +2 -2
  481. package/dist/runtime/subagents/roster.d.ts +3 -3
  482. package/dist/runtime/subagents/roster.js +1 -1
  483. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  484. package/dist/runtime/subagents/skill-fork.js +16 -5
  485. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  486. package/dist/runtime/subagents/subagents.service.js +101 -0
  487. package/dist/runtime/usage-report.d.ts +94 -52
  488. package/dist/runtime/usage-report.js +200 -100
  489. package/dist/runtime/waits.d.ts +125 -57
  490. package/dist/runtime/waits.js +431 -208
  491. package/dist/sandbox/job-ids.d.ts +10 -0
  492. package/dist/sandbox/job-ids.js +10 -0
  493. package/dist/sandbox/jobs.d.ts +41 -0
  494. package/dist/sandbox/jobs.js +113 -0
  495. package/dist/sandbox/leases.d.ts +39 -31
  496. package/dist/sandbox/leases.js +117 -257
  497. package/dist/sandbox/providers.d.ts +19 -0
  498. package/dist/sandbox/providers.js +38 -0
  499. package/dist/sandbox/sandbox.module.d.ts +8 -0
  500. package/dist/sandbox/sandbox.module.js +30 -0
  501. package/dist/sandbox/sandbox.service.d.ts +24 -29
  502. package/dist/sandbox/sandbox.service.js +106 -75
  503. package/dist/skills/catalog.d.ts +33 -20
  504. package/dist/skills/catalog.js +96 -53
  505. package/dist/skills/changes.controller.d.ts +4 -4
  506. package/dist/skills/changes.controller.js +15 -9
  507. package/dist/skills/changes.service.d.ts +28 -18
  508. package/dist/skills/changes.service.js +421 -364
  509. package/dist/skills/invocable.controller.d.ts +1 -1
  510. package/dist/skills/invocable.controller.js +8 -5
  511. package/dist/skills/invoke.d.ts +16 -15
  512. package/dist/skills/invoke.js +48 -17
  513. package/dist/skills/skills.controller.d.ts +1 -1
  514. package/dist/skills/skills.controller.js +11 -6
  515. package/dist/skills/skills.module.d.ts +6 -0
  516. package/dist/skills/skills.module.js +30 -0
  517. package/dist/skills/skills.service.d.ts +47 -30
  518. package/dist/skills/skills.service.js +221 -158
  519. package/dist/storage/job-ids.d.ts +6 -0
  520. package/dist/storage/job-ids.js +6 -0
  521. package/dist/storage/purge.d.ts +22 -7
  522. package/dist/storage/purge.js +55 -3
  523. package/dist/storage/storage.module.d.ts +6 -0
  524. package/dist/storage/storage.module.js +23 -0
  525. package/dist/storage/storage.service.d.ts +18 -4
  526. package/dist/storage/storage.service.js +44 -3
  527. package/dist/tools/approvals.controller.d.ts +1 -1
  528. package/dist/tools/approvals.controller.js +12 -8
  529. package/dist/tools/approvals.service.d.ts +27 -25
  530. package/dist/tools/approvals.service.js +324 -258
  531. package/dist/tools/breaker.d.ts +2 -2
  532. package/dist/tools/breaker.js +21 -3
  533. package/dist/tools/builtins/ask-user.d.ts +2 -2
  534. package/dist/tools/builtins/ask-user.js +1 -1
  535. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  536. package/dist/tools/builtins/builtin-tools.js +80 -0
  537. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  538. package/dist/tools/builtins/read-tool-output.js +1 -1
  539. package/dist/tools/builtins/sandbox/bash.js +2 -2
  540. package/dist/tools/builtins/sandbox/common.d.ts +2 -1
  541. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  542. package/dist/tools/builtins/sandbox/edit.js +1 -1
  543. package/dist/tools/builtins/sandbox/glob.js +2 -2
  544. package/dist/tools/builtins/sandbox/grep.js +2 -2
  545. package/dist/tools/builtins/sandbox/read.js +1 -1
  546. package/dist/tools/builtins/sandbox/write.js +1 -1
  547. package/dist/tools/builtins/skill-load.d.ts +3 -3
  548. package/dist/tools/builtins/skill-load.js +1 -1
  549. package/dist/tools/canonical-json.d.ts +6 -0
  550. package/dist/tools/canonical-json.js +16 -0
  551. package/dist/tools/connector-content.controller.d.ts +1 -1
  552. package/dist/tools/connector-content.controller.js +11 -6
  553. package/dist/tools/connector-content.d.ts +12 -15
  554. package/dist/tools/connector-content.js +53 -18
  555. package/dist/tools/connectors.controller.d.ts +1 -1
  556. package/dist/tools/connectors.controller.js +21 -10
  557. package/dist/tools/connectors.service.d.ts +31 -13
  558. package/dist/tools/connectors.service.js +434 -344
  559. package/dist/tools/credentials.d.ts +17 -20
  560. package/dist/tools/credentials.js +55 -34
  561. package/dist/tools/drift.d.ts +29 -41
  562. package/dist/tools/drift.js +111 -79
  563. package/dist/tools/info.d.ts +12 -9
  564. package/dist/tools/info.js +33 -7
  565. package/dist/tools/job-ids.d.ts +13 -0
  566. package/dist/tools/job-ids.js +15 -0
  567. package/dist/tools/jobs.d.ts +24 -0
  568. package/dist/tools/jobs.js +69 -0
  569. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  570. package/dist/tools/oauth/flow-paths.js +38 -0
  571. package/dist/tools/oauth/flow.d.ts +30 -30
  572. package/dist/tools/oauth/flow.js +109 -81
  573. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  574. package/dist/tools/oauth/oauth.controller.js +12 -9
  575. package/dist/tools/oauth/tokens.d.ts +11 -3
  576. package/dist/tools/oauth/tokens.js +15 -14
  577. package/dist/tools/outputs.d.ts +13 -4
  578. package/dist/tools/outputs.js +47 -3
  579. package/dist/tools/pipeline.d.ts +62 -46
  580. package/dist/tools/pipeline.js +145 -64
  581. package/dist/tools/policy.d.ts +2 -2
  582. package/dist/tools/questions.controller.d.ts +1 -1
  583. package/dist/tools/questions.controller.js +8 -5
  584. package/dist/tools/questions.service.d.ts +25 -24
  585. package/dist/tools/questions.service.js +201 -142
  586. package/dist/tools/registry.d.ts +30 -20
  587. package/dist/tools/registry.js +73 -37
  588. package/dist/tools/specs.d.ts +5 -4
  589. package/dist/tools/specs.js +3 -1
  590. package/dist/tools/tools.module.d.ts +10 -0
  591. package/dist/tools/tools.module.js +91 -0
  592. package/dist/ui/call-extension.d.ts +16 -0
  593. package/dist/ui/call-extension.js +38 -0
  594. package/dist/ui/embed-token.d.ts +9 -5
  595. package/dist/ui/embed-token.js +34 -6
  596. package/dist/ui/ui-stream.d.ts +22 -17
  597. package/dist/ui/ui-stream.js +72 -12
  598. package/dist/ui/ui.module.d.ts +7 -0
  599. package/dist/ui/ui.module.js +28 -0
  600. package/dist/ui/views.controller.d.ts +14 -12
  601. package/dist/ui/views.controller.js +32 -25
  602. package/dist/ui/views.d.ts +9 -57
  603. package/dist/ui/views.js +43 -45
  604. package/package.json +9 -2
  605. package/dist/http/health.controller.d.ts +0 -26
  606. package/dist/http/health.controller.js +0 -79
  607. package/dist/http/tokens.d.ts +0 -131
  608. package/dist/http/tokens.js +0 -131
  609. package/dist/http/zod.pipe.d.ts +0 -8
  610. package/dist/http/zod.pipe.js +0 -14
  611. package/dist/identity/rate-limit.d.ts +0 -55
  612. package/dist/identity/rate-limit.js +0 -121
  613. package/dist/sandbox/lifecycle.d.ts +0 -21
  614. package/dist/sandbox/lifecycle.js +0 -68
  615. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  616. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,20 +1,35 @@
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";
2
11
  import { ToolError, } from "@capybara-hq/plugin-sdk";
12
+ import { Inject, Injectable } from "@nestjs/common";
3
13
  import { sql } from "kysely";
4
14
  import { z } from "zod";
5
15
  import { assertItemInstallable } from "../catalog/requests.service.js";
6
16
  import { ApiError } from "../errors.js";
17
+ import { ExtensionRegistry } from "../extensions/registry.js";
7
18
  import { audit } from "../identity/audit.js";
8
19
  import { assertCustomAllowed } from "../identity/settings.js";
9
- import { lockOrgAndAuthorize } from "../orgs/org-lock.js";
10
- import { CredentialMissing, isOAuth, } from "./credentials.js";
11
- import { snapshot, toolIssue, } from "./drift.js";
20
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
21
+ import { KernelDb } from "../infra/database/kernel-db.js";
22
+ import { TransactionHost } from "../infra/database/transaction-host.js";
23
+ import { Transactional } from "../infra/database/transactional.decorator.js";
24
+ import { OrgLock } from "../orgs/org-lock.js";
25
+ import { CredentialMissing, Credentials, isOAuth, } from "./credentials.js";
26
+ import { snapshot, ToolDrift, toolIssue, } from "./drift.js";
12
27
  import { endpointCredentialIssues, endpointView } from "./endpoint.js";
13
28
  import { deriveSlug, isValidSlug, SLUG_RULE, toolKey } from "./naming.js";
14
29
  import { checkOAuthUrl, discoverMcp, OAuthSetupError, oauthHttpOptions, pickAuthMethod, registerClient, } from "./oauth/discovery.js";
15
- import { callbackUrl, publicUrlRequired } from "./oauth/flow.js";
30
+ import { callbackUrl, publicUrlRequired } from "./oauth/flow-paths.js";
16
31
  import { OAuthGrantError, OAuthUnavailable, tokenRequest, } from "./oauth/tokens.js";
17
- import { policyFromAnnotations } from "./registry.js";
32
+ import { policyFromAnnotations, ToolRegistry } from "./registry.js";
18
33
  import { recordToolSpecs } from "./specs.js";
19
34
  /** 预览时没给 slug、也推导不出时,拼 key 用的占位 slug。 */
20
35
  const PREVIEW_SLUG = "app";
@@ -68,20 +83,32 @@ const unannotated = (a) => a?.readOnlyHint === undefined && a?.destructiveHint =
68
83
  * 连接器(远端服务实例)与其工具快照、凭据。写操作都在组织行锁内复核发起人权限并写审计
69
84
  * (detail 只有凭据类型与归属,没有值)。连接器会话按操作打开、用完即关,不在进程内缓存。
70
85
  */
71
- export class ConnectorsService {
72
- db;
86
+ let ConnectorsService = class ConnectorsService {
87
+ kdb;
73
88
  registry;
74
- host;
89
+ extensions;
75
90
  credentials;
76
91
  config;
77
92
  drift;
78
- constructor(db, registry, host, credentials, config, drift) {
79
- this.db = db;
93
+ orgLock;
94
+ txHost;
95
+ constructor(kdb, registry,
96
+ /** Extension manifests (a slug may not take an extension's name). */
97
+ extensions, credentials, config, drift,
98
+ /** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
99
+ orgLock, txHost) {
100
+ this.kdb = kdb;
80
101
  this.registry = registry;
81
- this.host = host;
102
+ this.extensions = extensions;
82
103
  this.credentials = credentials;
83
104
  this.config = config;
84
105
  this.drift = drift;
106
+ this.orgLock = orgLock;
107
+ this.txHost = txHost;
108
+ }
109
+ /** The kernel-schema handle of the current context (its transaction, else the pool). */
110
+ get db() {
111
+ return this.kdb.db;
85
112
  }
86
113
  /**
87
114
  * 校验连接器存在、端点按其 schema 合法、不含凭据样式的头 / query 参数 / URL 用户信息(端点对成员可见,
@@ -133,7 +160,7 @@ export class ConnectorsService {
133
160
  * 外连失败一律 502 `connector.connect_failed`(details 带原因码),什么都不写。
134
161
  */
135
162
  async prepareOAuth(auth, endpoint, credential, publicUrl) {
136
- const http = oauthHttpOptions(this.config());
163
+ const http = oauthHttpOptions(this.config.get());
137
164
  const parseClient = (requireSecret) => parseOAuthClient(credential, requireSecret);
138
165
  const checked = (path, url) => {
139
166
  try {
@@ -226,7 +253,7 @@ export class ConnectorsService {
226
253
  checkCreateInput(actorAccountId, input) {
227
254
  const slug = this.resolveSlug(input);
228
255
  const endpoint = this.parseEndpoint(input.connector, input.endpoint);
229
- if (this.host.manifests().some((m) => m.name === slug)) {
256
+ if (this.extensions.manifests().some((m) => m.name === slug)) {
230
257
  throw fail("slug", `Slug "${slug}" is the name of an installed plugin; choose another`);
231
258
  }
232
259
  const auth = input.auth;
@@ -240,9 +267,9 @@ export class ConnectorsService {
240
267
  this.credentials.validate(auth, owner, credential);
241
268
  return { slug, endpoint, owner, secret: credential };
242
269
  }
243
- if (!this.config().http.publicUrl)
270
+ if (!this.config.get().http.publicUrl)
244
271
  throw publicUrlRequired();
245
- const http = oauthHttpOptions(this.config());
272
+ const http = oauthHttpOptions(this.config.get());
246
273
  const checked = (path, url) => {
247
274
  try {
248
275
  checkOAuthUrl(url, http);
@@ -287,7 +314,7 @@ export class ConnectorsService {
287
314
  const { slug, endpoint, owner, secret } = this.checkCreateInput(actorAccountId, input);
288
315
  const id = randomUUID();
289
316
  const auth = input.auth;
290
- const publicUrl = this.config().http.publicUrl;
317
+ const publicUrl = this.config.get().http.publicUrl;
291
318
  // 先做不需要连接的检查:冲突的 slug 不该触发一次外连
292
319
  if (await this.slugTaken(this.db, orgId, slug)) {
293
320
  throw new ApiError("connector.slug_taken", "Connector slug is already taken");
@@ -310,71 +337,85 @@ export class ConnectorsService {
310
337
  }, { orgId, slug });
311
338
  ({ rows, issues } = snapshot(slug, listed.specs, listed.resources));
312
339
  }
313
- return this.db.transaction().execute(async (t) => {
314
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "connectors.manage");
315
- if (input.template) {
316
- await assertItemInstallable(t, orgId, input.template.itemId, input.template.approvedBy ?? input.template.itemId);
317
- }
318
- else
319
- await assertCustomAllowed(t, "customConnectors");
320
- if (await this.slugTaken(t, orgId, slug)) {
321
- throw new ApiError("connector.slug_taken", "Connector slug is already taken");
340
+ return this.createIn(orgId, actorAccountId, input, actorTokenId, {
341
+ id,
342
+ slug,
343
+ endpoint,
344
+ owner,
345
+ secret,
346
+ oauth,
347
+ rows,
348
+ issues,
349
+ });
350
+ }
351
+ /** The org-locked, re-checked insert of {@link create} (the outbound checks ran before). */
352
+ async createIn(orgId, actorAccountId, input, actorTokenId, c) {
353
+ const { id, slug, endpoint, owner, secret, oauth, rows, issues } = c;
354
+ const auth = input.auth;
355
+ const t = this.db;
356
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
357
+ if (input.template) {
358
+ await assertItemInstallable(t, orgId, input.template.itemId, input.template.approvedBy ?? input.template.itemId);
359
+ }
360
+ else
361
+ await assertCustomAllowed(t, "customConnectors");
362
+ if (await this.slugTaken(t, orgId, slug)) {
363
+ throw new ApiError("connector.slug_taken", "Connector slug is already taken");
364
+ }
365
+ await t
366
+ .insertInto("connectors")
367
+ .values({
368
+ id,
369
+ org_id: orgId,
370
+ slug,
371
+ name: input.name,
372
+ connector: input.connector,
373
+ endpoint: JSON.stringify(endpoint),
374
+ auth: JSON.stringify(auth),
375
+ created_by: actorAccountId,
376
+ catalog_item_id: input.template?.itemId ?? null,
377
+ catalog_version: input.template?.version ?? null,
378
+ // 授权码连接器安装时没有快照:模板的默认策略留到首个快照时应用
379
+ template_tool_policies: input.template?.defaultToolPolicies
380
+ ? JSON.stringify(input.template.defaultToolPolicies)
381
+ : null,
382
+ // 授权码连接器安装时不拍快照(A16):留空,首个快照按安装处理
383
+ ...(auth.type !== "oauth_code" && { tools_synced_at: sql `now()` }),
384
+ })
385
+ .execute();
386
+ await this.insertTools(id, rows, input.template?.defaultToolPolicies);
387
+ if (secret && owner)
388
+ await this.credentials.setStatic(orgId, id, auth, owner, secret);
389
+ if (oauth) {
390
+ await this.credentials.setOAuthClient(orgId, id, oauth.client);
391
+ if (oauth.tokens) {
392
+ await this.credentials.setOAuthTokens(orgId, id, { kind: "org" }, oauth.tokens);
322
393
  }
323
- await t
324
- .insertInto("connectors")
325
- .values({
326
- id,
327
- org_id: orgId,
394
+ }
395
+ await audit(t, {
396
+ actorAccountId,
397
+ ...(actorTokenId !== undefined && { actorTokenId }),
398
+ orgId,
399
+ action: "connector.created",
400
+ target: id,
401
+ detail: {
328
402
  slug,
329
- name: input.name,
330
403
  connector: input.connector,
331
- endpoint: JSON.stringify(endpoint),
332
- auth: JSON.stringify(auth),
333
- created_by: actorAccountId,
334
- catalog_item_id: input.template?.itemId ?? null,
335
- catalog_version: input.template?.version ?? null,
336
- // 授权码连接器安装时没有快照:模板的默认策略留到首个快照时应用
337
- template_tool_policies: input.template?.defaultToolPolicies
338
- ? JSON.stringify(input.template.defaultToolPolicies)
339
- : null,
340
- // 授权码连接器安装时不拍快照(A16):留空,首个快照按安装处理
341
- ...(auth.type !== "oauth_code" && { tools_synced_at: sql `now()` }),
342
- })
343
- .execute();
344
- await this.insertTools(t, id, rows, input.template?.defaultToolPolicies);
345
- if (secret && owner)
346
- await this.credentials.setStatic(orgId, id, auth, owner, secret, t);
347
- if (oauth) {
348
- await this.credentials.setOAuthClient(orgId, id, oauth.client, t);
349
- if (oauth.tokens) {
350
- await this.credentials.setOAuthTokens(orgId, id, { kind: "org" }, oauth.tokens, t);
351
- }
352
- }
353
- await audit(t, {
354
- actorAccountId,
355
- ...(actorTokenId !== undefined && { actorTokenId }),
356
- orgId,
357
- action: "connector.created",
358
- target: id,
359
- detail: {
360
- slug,
361
- connector: input.connector,
362
- auth: { type: auth.type, ...(auth.type !== "none" && { ownership: auth.ownership }) },
363
- tools: rows.length,
364
- credentialProvided: secret !== undefined || oauth !== undefined,
365
- ...(input.template && {
366
- catalog: {
367
- itemId: input.template.itemId,
368
- version: input.template.version,
369
- ...(input.template.templateId !== undefined && {
370
- templateId: input.template.templateId,
371
- }),
372
- },
373
- }),
374
- },
375
- });
376
- return { connector: await this.detail(t, orgId, id, actorAccountId), issues };
404
+ auth: { type: auth.type, ...(auth.type !== "none" && { ownership: auth.ownership }) },
405
+ tools: rows.length,
406
+ credentialProvided: secret !== undefined || oauth !== undefined,
407
+ ...(input.template && {
408
+ catalog: {
409
+ itemId: input.template.itemId,
410
+ version: input.template.version,
411
+ ...(input.template.templateId !== undefined && {
412
+ templateId: input.template.templateId,
413
+ }),
414
+ },
415
+ }),
416
+ },
377
417
  });
418
+ return { connector: await this.detail(t, orgId, id, actorAccountId), issues };
378
419
  }
379
420
  /**
380
421
  * Checks a template update before anything is written (an org plugin upgrade): the endpoint
@@ -398,7 +439,7 @@ export class ConnectorsService {
398
439
  this.credentials.validate(auth, owner, credential);
399
440
  return { ...out, owner, secret: credential };
400
441
  }
401
- const publicUrl = this.config().http.publicUrl;
442
+ const publicUrl = this.config.get().http.publicUrl;
402
443
  if (!publicUrl)
403
444
  throw publicUrlRequired();
404
445
  return { ...out, oauth: await this.prepareOAuth(auth, endpoint, credential, publicUrl) };
@@ -412,7 +453,8 @@ export class ConnectorsService {
412
453
  * unnamed `derived` tools and the org's own (`admin`) stay (spec §10). Tool definitions are untouched (the next refresh takes the new endpoint through drift review). With `resetCredentials` the credentials are replaced.
413
454
  * Audits `connector.template_applied`. Deleted / missing -> `connector.not_found`.
414
455
  */
415
- async applyTemplateIn(t, orgId, connectorId, actorAccountId, p, actorTokenId) {
456
+ async applyTemplateIn(orgId, connectorId, actorAccountId, p, actorTokenId) {
457
+ const t = this.db;
416
458
  await this.row(t, orgId, connectorId, true);
417
459
  const { input } = p;
418
460
  const policies = input.template.defaultToolPolicies;
@@ -457,14 +499,14 @@ export class ConnectorsService {
457
499
  }
458
500
  }
459
501
  if (input.resetCredentials) {
460
- await this.credentials.clearConnector(orgId, connectorId, t);
502
+ await this.credentials.clearConnector(orgId, connectorId);
461
503
  if (p.secret && p.owner) {
462
- await this.credentials.setStatic(orgId, connectorId, input.auth, p.owner, p.secret, t);
504
+ await this.credentials.setStatic(orgId, connectorId, input.auth, p.owner, p.secret);
463
505
  }
464
506
  if (p.oauth) {
465
- await this.credentials.setOAuthClient(orgId, connectorId, p.oauth.client, t);
507
+ await this.credentials.setOAuthClient(orgId, connectorId, p.oauth.client);
466
508
  if (p.oauth.tokens) {
467
- await this.credentials.setOAuthTokens(orgId, connectorId, { kind: "org" }, p.oauth.tokens, t);
509
+ await this.credentials.setOAuthTokens(orgId, connectorId, { kind: "org" }, p.oauth.tokens);
468
510
  }
469
511
  }
470
512
  }
@@ -547,7 +589,7 @@ export class ConnectorsService {
547
589
  else if (auth.type === "oauth_client" && credential !== undefined && credential !== null) {
548
590
  oauthClient = true;
549
591
  }
550
- const timeoutMs = this.config().tools.timeoutMs;
592
+ const timeoutMs = this.config.get().tools.timeoutMs;
551
593
  let inspection;
552
594
  if (connector.inspect) {
553
595
  try {
@@ -561,7 +603,7 @@ export class ConnectorsService {
561
603
  }
562
604
  }
563
605
  if (oauthClient && auth?.type === "oauth_client") {
564
- const oauth = await this.prepareOAuth(auth, endpoint, credential, this.config().http.publicUrl ?? "");
606
+ const oauth = await this.prepareOAuth(auth, endpoint, credential, this.config.get().http.publicUrl ?? "");
565
607
  const token = oauth.tokens?.access_token;
566
608
  if (token)
567
609
  inject = async () => this.credentials.injectionFor("preview", auth, { token });
@@ -593,9 +635,10 @@ export class ConnectorsService {
593
635
  ...(inspection?.operations !== undefined && { operations: inspection.operations }),
594
636
  };
595
637
  }
596
- async insertTools(t, connectorId, rows, templatePolicies) {
638
+ async insertTools(connectorId, rows, templatePolicies) {
597
639
  if (rows.length === 0)
598
640
  return;
641
+ const t = this.db;
599
642
  await recordToolSpecs(t, rows);
600
643
  const fromTemplate = (name) => templatePolicies && Object.hasOwn(templatePolicies, name)
601
644
  ? templatePolicies[name]
@@ -669,7 +712,7 @@ export class ConnectorsService {
669
712
  .execute();
670
713
  const s = this.summary(r);
671
714
  const auth = s.auth;
672
- const status = await this.credentials.status(orgId, connectorId, auth, viewerAccountId, db === this.db ? undefined : db);
715
+ const status = await this.credentials.status(orgId, connectorId, auth, viewerAccountId);
673
716
  return {
674
717
  ...s,
675
718
  tools: tools.map((t) => {
@@ -722,143 +765,141 @@ export class ConnectorsService {
722
765
  }
723
766
  /** 改名、启停连接器、工具启停与默认策略、批量把无注解工具改为 allow(`connectors.manage`)。 */
724
767
  async update(orgId, connectorId, actorAccountId, patch, actorTokenId) {
725
- return this.db.transaction().execute(async (t) => {
726
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "connectors.manage");
727
- const app = await this.row(t, orgId, connectorId, true);
728
- const current = await t
729
- .selectFrom("connector_tools")
730
- .select([
731
- "name",
732
- "spec",
733
- "status",
734
- "default_policy",
735
- "missing_since",
736
- "pending_spec_hash",
737
- "reviewed_at",
738
- ])
739
- .where("connector_id", "=", connectorId)
740
- .forUpdate()
741
- .execute();
742
- const byName = new Map(current.map((c) => [c.name, c]));
743
- const toolChanges = Object.entries(patch.tools ?? {});
744
- const problems = [];
745
- for (const [name, change] of toolChanges) {
746
- const c = byName.get(name);
747
- if (!c) {
748
- problems.push({ path: `tools.${name}`, message: "No such tool in this connector" });
768
+ const t = this.db;
769
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
770
+ const app = await this.row(t, orgId, connectorId, true);
771
+ const current = await t
772
+ .selectFrom("connector_tools")
773
+ .select([
774
+ "name",
775
+ "spec",
776
+ "status",
777
+ "default_policy",
778
+ "missing_since",
779
+ "pending_spec_hash",
780
+ "reviewed_at",
781
+ ])
782
+ .where("connector_id", "=", connectorId)
783
+ .forUpdate()
784
+ .execute();
785
+ const byName = new Map(current.map((c) => [c.name, c]));
786
+ const toolChanges = Object.entries(patch.tools ?? {});
787
+ const problems = [];
788
+ for (const [name, change] of toolChanges) {
789
+ const c = byName.get(name);
790
+ if (!c) {
791
+ problems.push({ path: `tools.${name}`, message: "No such tool in this connector" });
792
+ continue;
793
+ }
794
+ if (change.status === "enabled") {
795
+ const path = `tools.${name}.status`;
796
+ // 待复核(新增或定义变了)的工具只能经复核接口启用:这里启用会绕过复核、或把旧定义暴露给模型
797
+ if (c.status === "pending_review" || c.pending_spec_hash !== null) {
798
+ problems.push({
799
+ path,
800
+ message: `Tool is pending review; approve it with POST /connectors/${connectorId}/tools/${name}/review`,
801
+ });
749
802
  continue;
750
803
  }
751
- if (change.status === "enabled") {
752
- const path = `tools.${name}.status`;
753
- // 待复核(新增或定义变了)的工具只能经复核接口启用:这里启用会绕过复核、或把旧定义暴露给模型
754
- if (c.status === "pending_review" || c.pending_spec_hash !== null) {
755
- problems.push({
756
- path,
757
- message: `Tool is pending review; approve it with POST /connectors/${connectorId}/tools/${name}/review`,
758
- });
759
- continue;
760
- }
761
- if (c.missing_since !== null) {
762
- problems.push({ path, message: "The connector no longer provides this tool" });
763
- continue;
764
- }
765
- // 从未复核过的工具(如被拒绝的新工具):启用等于跳过复核,只能经复核接口批准
766
- if (c.reviewed_at === null) {
767
- problems.push({
768
- path,
769
- message: `Tool has never been reviewed; approve it with POST /connectors/${connectorId}/tools/${name}/review`,
770
- });
771
- continue;
772
- }
773
- const issue = toolIssue(app.slug, c.spec);
774
- if (issue)
775
- problems.push({ path, message: issue });
804
+ if (c.missing_since !== null) {
805
+ problems.push({ path, message: "The connector no longer provides this tool" });
806
+ continue;
776
807
  }
777
- }
778
- if (problems.length > 0) {
779
- throw new ApiError("validation_failed", "Request validation failed", problems);
780
- }
781
- if (patch.name !== undefined || patch.status !== undefined) {
782
- await t
783
- .updateTable("connectors")
784
- .set({
785
- ...(patch.name !== undefined && { name: patch.name }),
786
- ...(patch.status !== undefined && { status: patch.status }),
787
- updated_at: sql `now()`,
788
- })
789
- .where("id", "=", connectorId)
790
- .execute();
791
- }
792
- const allowed = [];
793
- if (patch.allowUnannotated) {
794
- for (const c of current) {
795
- const explicit = patch.tools?.[c.name]?.defaultPolicy !== undefined;
796
- if (!explicit &&
797
- c.default_policy === "ask" &&
798
- unannotated(c.spec.annotations)) {
799
- allowed.push(c.name);
800
- }
808
+ // 从未复核过的工具(如被拒绝的新工具):启用等于跳过复核,只能经复核接口批准
809
+ if (c.reviewed_at === null) {
810
+ problems.push({
811
+ path,
812
+ message: `Tool has never been reviewed; approve it with POST /connectors/${connectorId}/tools/${name}/review`,
813
+ });
814
+ continue;
801
815
  }
802
- if (allowed.length > 0) {
803
- await t
804
- .updateTable("connector_tools")
805
- .set({ default_policy: "allow", policy_source: "admin" })
806
- .where("connector_id", "=", connectorId)
807
- .where("name", "in", allowed)
808
- .execute();
816
+ const issue = toolIssue(app.slug, c.spec);
817
+ if (issue)
818
+ problems.push({ path, message: issue });
819
+ }
820
+ }
821
+ if (problems.length > 0) {
822
+ throw new ApiError("validation_failed", "Request validation failed", problems);
823
+ }
824
+ if (patch.name !== undefined || patch.status !== undefined) {
825
+ await t
826
+ .updateTable("connectors")
827
+ .set({
828
+ ...(patch.name !== undefined && { name: patch.name }),
829
+ ...(patch.status !== undefined && { status: patch.status }),
830
+ updated_at: sql `now()`,
831
+ })
832
+ .where("id", "=", connectorId)
833
+ .execute();
834
+ }
835
+ const allowed = [];
836
+ if (patch.allowUnannotated) {
837
+ for (const c of current) {
838
+ const explicit = patch.tools?.[c.name]?.defaultPolicy !== undefined;
839
+ if (!explicit &&
840
+ c.default_policy === "ask" &&
841
+ unannotated(c.spec.annotations)) {
842
+ allowed.push(c.name);
809
843
  }
810
844
  }
811
- for (const [name, change] of toolChanges) {
812
- if (change.status === undefined && change.defaultPolicy === undefined)
813
- continue;
845
+ if (allowed.length > 0) {
814
846
  await t
815
847
  .updateTable("connector_tools")
816
- .set({
817
- ...(change.status !== undefined && { status: change.status }),
818
- ...(change.defaultPolicy !== undefined && {
819
- default_policy: change.defaultPolicy,
820
- policy_source: "admin",
821
- }),
822
- })
848
+ .set({ default_policy: "allow", policy_source: "admin" })
823
849
  .where("connector_id", "=", connectorId)
824
- .where("name", "=", name)
850
+ .where("name", "in", allowed)
825
851
  .execute();
826
852
  }
827
- await audit(t, {
828
- actorAccountId,
829
- ...(actorTokenId !== undefined && { actorTokenId }),
830
- orgId,
831
- action: "connector.updated",
832
- target: connectorId,
833
- detail: {
834
- ...(patch.name !== undefined && { name: { from: app.name, to: patch.name } }),
835
- ...(patch.status !== undefined && { status: { from: app.status, to: patch.status } }),
836
- ...(toolChanges.length > 0 && { tools: Object.fromEntries(toolChanges) }),
837
- ...(allowed.length > 0 && { allowedUnannotated: allowed }),
838
- },
839
- });
840
- return this.detail(t, orgId, connectorId, actorAccountId);
853
+ }
854
+ for (const [name, change] of toolChanges) {
855
+ if (change.status === undefined && change.defaultPolicy === undefined)
856
+ continue;
857
+ await t
858
+ .updateTable("connector_tools")
859
+ .set({
860
+ ...(change.status !== undefined && { status: change.status }),
861
+ ...(change.defaultPolicy !== undefined && {
862
+ default_policy: change.defaultPolicy,
863
+ policy_source: "admin",
864
+ }),
865
+ })
866
+ .where("connector_id", "=", connectorId)
867
+ .where("name", "=", name)
868
+ .execute();
869
+ }
870
+ await audit(t, {
871
+ actorAccountId,
872
+ ...(actorTokenId !== undefined && { actorTokenId }),
873
+ orgId,
874
+ action: "connector.updated",
875
+ target: connectorId,
876
+ detail: {
877
+ ...(patch.name !== undefined && { name: { from: app.name, to: patch.name } }),
878
+ ...(patch.status !== undefined && { status: { from: app.status, to: patch.status } }),
879
+ ...(toolChanges.length > 0 && { tools: Object.fromEntries(toolChanges) }),
880
+ ...(allowed.length > 0 && { allowedUnannotated: allowed }),
881
+ },
841
882
  });
883
+ return this.detail(t, orgId, connectorId, actorAccountId);
842
884
  }
843
885
  /** 软删除,并删除该连接器的全部凭据(`connectors.manage`)。 */
844
886
  async remove(orgId, connectorId, actorAccountId, actorTokenId) {
845
- await this.db.transaction().execute(async (t) => {
846
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "connectors.manage");
847
- await this.removeIn(t, orgId, connectorId, actorAccountId, actorTokenId);
848
- });
887
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
888
+ await this.removeIn(orgId, connectorId, actorAccountId, actorTokenId);
849
889
  }
850
890
  /**
851
891
  * 在调用方事务里软删除连接器(调用方已锁组织行并按需复核角色;应用安装的回滚与卸载用):删全部凭据与授权,
852
892
  * 审计 `connector.deleted`(`reason` 并进 detail)。已删除 / 不存在 → `connector.not_found`。
853
893
  */
854
- async removeIn(t, orgId, connectorId, actorAccountId, actorTokenId, reason) {
894
+ async removeIn(orgId, connectorId, actorAccountId, actorTokenId, reason) {
895
+ const t = this.db;
855
896
  const app = await this.row(t, orgId, connectorId, true);
856
897
  await t
857
898
  .updateTable("connectors")
858
899
  .set({ deleted_at: sql `now()`, updated_at: sql `now()` })
859
900
  .where("id", "=", connectorId)
860
901
  .execute();
861
- await this.credentials.clearConnector(orgId, connectorId, t);
902
+ await this.credentials.clearConnector(orgId, connectorId);
862
903
  // 授权绑定连接器 id(软删除不触发外键级联):一并删掉,不留给任何后来的连接器
863
904
  await t.deleteFrom("tool_grants").where("connector_id", "=", connectorId).execute();
864
905
  await t
@@ -886,37 +927,40 @@ export class ConnectorsService {
886
927
  const auth = app.auth;
887
928
  const { specs, resources } = await this.drift.listTools(app.connector, app.endpoint, () => this.credentials.injection(orgId, connectorId, auth, actorAccountId), { orgId, connectorId }, (last) => this.credentials.onUnauthorized(orgId, connectorId, auth, actorAccountId, last));
888
929
  const { rows, issues } = snapshot(app.slug, specs, resources);
889
- return this.db.transaction().execute(async (t) => {
890
- await lockOrgAndAuthorize(t, orgId, actorAccountId, opts.trigger === "first_connect" ? "connectors.use" : "connectors.manage");
891
- const locked = await this.row(t, orgId, connectorId, true);
892
- const changes = await this.drift.apply(t, locked, rows);
893
- // 首个快照(授权码连接器首个成员连接后):按目录模板的 defaultToolPolicies 设默认策略(policy_source 'template')
894
- const templatePolicies = locked.template_tool_policies;
895
- if (locked.tools_synced_at === null && templatePolicies) {
896
- for (const [name, policy] of Object.entries(templatePolicies)) {
897
- await t
898
- .updateTable("connector_tools")
899
- .set({ default_policy: policy, policy_source: "template" })
900
- .where("connector_id", "=", connectorId)
901
- .where("name", "=", name)
902
- .where("policy_source", "=", "derived")
903
- .execute();
904
- }
930
+ return this.refreshIn(orgId, connectorId, actorAccountId, actorTokenId, opts, rows, issues);
931
+ }
932
+ /** The org-locked compare-and-write of {@link refresh} (the tool list was fetched before). */
933
+ async refreshIn(orgId, connectorId, actorAccountId, actorTokenId, opts, rows, issues) {
934
+ const t = this.db;
935
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, opts.trigger === "first_connect" ? "connectors.use" : "connectors.manage");
936
+ const locked = await this.row(t, orgId, connectorId, true);
937
+ const changes = await this.drift.apply(locked, rows);
938
+ // 首个快照(授权码连接器首个成员连接后):按目录模板的 defaultToolPolicies 设默认策略(policy_source 'template')
939
+ const templatePolicies = locked.template_tool_policies;
940
+ if (locked.tools_synced_at === null && templatePolicies) {
941
+ for (const [name, policy] of Object.entries(templatePolicies)) {
942
+ await t
943
+ .updateTable("connector_tools")
944
+ .set({ default_policy: policy, policy_source: "template" })
945
+ .where("connector_id", "=", connectorId)
946
+ .where("name", "=", name)
947
+ .where("policy_source", "=", "derived")
948
+ .execute();
905
949
  }
906
- await audit(t, {
907
- actorAccountId,
908
- ...(actorTokenId !== undefined && { actorTokenId }),
909
- orgId,
910
- action: "connector.tools_refreshed",
911
- target: connectorId,
912
- detail: { ...changes, ...(opts.trigger && { trigger: opts.trigger }) },
913
- });
914
- return {
915
- connector: await this.detail(t, orgId, connectorId, actorAccountId),
916
- issues,
917
- changes,
918
- };
950
+ }
951
+ await audit(t, {
952
+ actorAccountId,
953
+ ...(actorTokenId !== undefined && { actorTokenId }),
954
+ orgId,
955
+ action: "connector.tools_refreshed",
956
+ target: connectorId,
957
+ detail: { ...changes, ...(opts.trigger && { trigger: opts.trigger }) },
919
958
  });
959
+ return {
960
+ connector: await this.detail(t, orgId, connectorId, actorAccountId),
961
+ issues,
962
+ changes,
963
+ };
920
964
  }
921
965
  /**
922
966
  * 复核一个待复核的工具(`connectors.manage`,spec 7.3)。`approve`:采用待复核的新定义(若有)并启用,
@@ -926,81 +970,80 @@ export class ConnectorsService {
926
970
  * 采用新定义即换了指纹:旧的「以后都允许」/「本会话都允许」授权按指纹比对自然失效(D8)。审计 `connector.tool_reviewed`。
927
971
  */
928
972
  async reviewTool(orgId, connectorId, name, action, actorAccountId, actorTokenId) {
929
- return this.db.transaction().execute(async (t) => {
930
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "connectors.manage");
931
- const app = await this.row(t, orgId, connectorId, true);
932
- const tool = await t
933
- .selectFrom("connector_tools")
934
- .select([
935
- "status",
936
- "source",
937
- "spec",
938
- "policy_source",
939
- "pending_spec",
940
- "pending_spec_hash",
941
- "pending_source",
942
- "reviewed_at",
943
- "missing_since",
944
- ])
945
- .where("connector_id", "=", connectorId)
946
- .where("name", "=", name)
947
- .forUpdate()
948
- .executeTakeFirst();
949
- if (!tool)
950
- throw new ApiError("connector.tool_not_found", "Tool not found in this connector");
951
- // 可复核:待复核、有待复核的新定义,或从未复核过(如被拒绝的新工具,仍可再批准);已消失的不可复核
952
- const reviewable = tool.status === "pending_review" ||
953
- tool.pending_spec_hash !== null ||
954
- tool.reviewed_at === null;
955
- if (!reviewable || tool.missing_since !== null) {
956
- throw new ApiError("connector.tool_not_pending", "Tool is not pending review");
957
- }
958
- const next = (tool.pending_spec ?? tool.spec);
959
- const nextSource = tool.pending_source ?? tool.source;
960
- if (action === "approve") {
961
- const issue = toolIssue(app.slug, next);
962
- if (issue)
963
- throw fail("action", issue);
964
- }
965
- const rederive = tool.policy_source === "derived" || nextSource !== tool.source;
966
- await t
967
- .updateTable("connector_tools")
968
- .set({
969
- ...(action === "approve"
970
- ? {
971
- status: "enabled",
972
- ...(tool.pending_spec_hash !== null && {
973
- spec: JSON.stringify(next),
974
- spec_hash: tool.pending_spec_hash,
975
- source: nextSource,
976
- }),
977
- ...(rederive && {
978
- default_policy: policyFromAnnotations(next.annotations),
979
- policy_source: "derived",
980
- }),
981
- }
982
- : { status: "disabled" }),
983
- pending_spec: null,
984
- pending_spec_hash: null,
985
- pending_source: null,
986
- // 拒绝从未复核过的工具不算「复核通过过」:reviewed_at 保持为空(之后不能经 PATCH 启用)
987
- ...((action === "approve" || tool.reviewed_at !== null) && {
988
- reviewed_at: sql `now()`,
989
- }),
990
- })
991
- .where("connector_id", "=", connectorId)
992
- .where("name", "=", name)
993
- .execute();
994
- await audit(t, {
995
- actorAccountId,
996
- ...(actorTokenId !== undefined && { actorTokenId }),
997
- orgId,
998
- action: "connector.tool_reviewed",
999
- target: connectorId,
1000
- detail: { tool: name, action },
1001
- });
1002
- return this.detail(t, orgId, connectorId, actorAccountId);
973
+ const t = this.db;
974
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
975
+ const app = await this.row(t, orgId, connectorId, true);
976
+ const tool = await t
977
+ .selectFrom("connector_tools")
978
+ .select([
979
+ "status",
980
+ "source",
981
+ "spec",
982
+ "policy_source",
983
+ "pending_spec",
984
+ "pending_spec_hash",
985
+ "pending_source",
986
+ "reviewed_at",
987
+ "missing_since",
988
+ ])
989
+ .where("connector_id", "=", connectorId)
990
+ .where("name", "=", name)
991
+ .forUpdate()
992
+ .executeTakeFirst();
993
+ if (!tool)
994
+ throw new ApiError("connector.tool_not_found", "Tool not found in this connector");
995
+ // 可复核:待复核、有待复核的新定义,或从未复核过(如被拒绝的新工具,仍可再批准);已消失的不可复核
996
+ const reviewable = tool.status === "pending_review" ||
997
+ tool.pending_spec_hash !== null ||
998
+ tool.reviewed_at === null;
999
+ if (!reviewable || tool.missing_since !== null) {
1000
+ throw new ApiError("connector.tool_not_pending", "Tool is not pending review");
1001
+ }
1002
+ const next = (tool.pending_spec ?? tool.spec);
1003
+ const nextSource = tool.pending_source ?? tool.source;
1004
+ if (action === "approve") {
1005
+ const issue = toolIssue(app.slug, next);
1006
+ if (issue)
1007
+ throw fail("action", issue);
1008
+ }
1009
+ const rederive = tool.policy_source === "derived" || nextSource !== tool.source;
1010
+ await t
1011
+ .updateTable("connector_tools")
1012
+ .set({
1013
+ ...(action === "approve"
1014
+ ? {
1015
+ status: "enabled",
1016
+ ...(tool.pending_spec_hash !== null && {
1017
+ spec: JSON.stringify(next),
1018
+ spec_hash: tool.pending_spec_hash,
1019
+ source: nextSource,
1020
+ }),
1021
+ ...(rederive && {
1022
+ default_policy: policyFromAnnotations(next.annotations),
1023
+ policy_source: "derived",
1024
+ }),
1025
+ }
1026
+ : { status: "disabled" }),
1027
+ pending_spec: null,
1028
+ pending_spec_hash: null,
1029
+ pending_source: null,
1030
+ // 拒绝从未复核过的工具不算「复核通过过」:reviewed_at 保持为空(之后不能经 PATCH 启用)
1031
+ ...((action === "approve" || tool.reviewed_at !== null) && {
1032
+ reviewed_at: sql `now()`,
1033
+ }),
1034
+ })
1035
+ .where("connector_id", "=", connectorId)
1036
+ .where("name", "=", name)
1037
+ .execute();
1038
+ await audit(t, {
1039
+ actorAccountId,
1040
+ ...(actorTokenId !== undefined && { actorTokenId }),
1041
+ orgId,
1042
+ action: "connector.tool_reviewed",
1043
+ target: connectorId,
1044
+ detail: { tool: name, action },
1003
1045
  });
1046
+ return this.detail(t, orgId, connectorId, actorAccountId);
1004
1047
  }
1005
1048
  /**
1006
1049
  * 写凭据(组织凭据:`connectors.manage`;个人凭据:`connectors.use`,只写发起人自己的那一条)。
@@ -1015,21 +1058,24 @@ export class ConnectorsService {
1015
1058
  return;
1016
1059
  }
1017
1060
  }
1018
- await this.db.transaction().execute(async (t) => {
1019
- await lockOrgAndAuthorize(t, orgId, actorAccountId, ownership === "org" ? "connectors.manage" : "connectors.use");
1020
- const app = await this.row(t, orgId, connectorId);
1021
- const auth = app.auth;
1022
- const owner = ownership === "org" ? { kind: "org" } : { kind: "user", accountId: actorAccountId };
1023
- this.credentials.validate(auth, owner, value);
1024
- await this.credentials.setStatic(orgId, connectorId, auth, owner, value, t);
1025
- await audit(t, {
1026
- actorAccountId,
1027
- ...(actorTokenId !== undefined && { actorTokenId }),
1028
- orgId,
1029
- action: "connector.credential.set",
1030
- target: connectorId,
1031
- detail: { type: auth.type, ownership },
1032
- });
1061
+ await this.setCredentialIn(orgId, connectorId, actorAccountId, ownership, value, actorTokenId);
1062
+ }
1063
+ /** The org-locked static credential write of {@link setCredential}. */
1064
+ async setCredentialIn(orgId, connectorId, actorAccountId, ownership, value, actorTokenId) {
1065
+ const t = this.db;
1066
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, ownership === "org" ? "connectors.manage" : "connectors.use");
1067
+ const app = await this.row(t, orgId, connectorId);
1068
+ const auth = app.auth;
1069
+ const owner = ownership === "org" ? { kind: "org" } : { kind: "user", accountId: actorAccountId };
1070
+ this.credentials.validate(auth, owner, value);
1071
+ await this.credentials.setStatic(orgId, connectorId, auth, owner, value);
1072
+ await audit(t, {
1073
+ actorAccountId,
1074
+ ...(actorTokenId !== undefined && { actorTokenId }),
1075
+ orgId,
1076
+ action: "connector.credential.set",
1077
+ target: connectorId,
1078
+ detail: { type: auth.type, ownership },
1033
1079
  });
1034
1080
  }
1035
1081
  /**
@@ -1061,42 +1107,86 @@ export class ConnectorsService {
1061
1107
  let tokens;
1062
1108
  if (auth.type === "oauth_client") {
1063
1109
  try {
1064
- tokens = await tokenRequest(client, { grant_type: "client_credentials", scope: (auth.scopes ?? client.scopes)?.join(" ") }, oauthHttpOptions(this.config()));
1110
+ tokens = await tokenRequest(client, { grant_type: "client_credentials", scope: (auth.scopes ?? client.scopes)?.join(" ") }, oauthHttpOptions(this.config.get()));
1065
1111
  }
1066
1112
  catch (e) {
1067
1113
  throw connectFailed(e);
1068
1114
  }
1069
1115
  }
1070
- await this.db.transaction().execute(async (t) => {
1071
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "connectors.manage");
1072
- await this.row(t, orgId, connectorId, true);
1073
- await this.credentials.setOAuthClient(orgId, connectorId, client, t);
1074
- if (tokens)
1075
- await this.credentials.setOAuthTokens(orgId, connectorId, { kind: "org" }, tokens, t);
1076
- await audit(t, {
1077
- actorAccountId,
1078
- ...(actorTokenId !== undefined && { actorTokenId }),
1079
- orgId,
1080
- action: "connector.credential.set",
1081
- target: connectorId,
1082
- detail: { type: auth.type, ownership: "org" },
1083
- });
1116
+ await this.storeOAuthClient(orgId, connectorId, actorAccountId, auth, client, tokens, actorTokenId);
1117
+ }
1118
+ /** The org-locked client (and token) write of {@link rotateOAuthClient}. */
1119
+ async storeOAuthClient(orgId, connectorId, actorAccountId, auth, client, tokens, actorTokenId) {
1120
+ const t = this.db;
1121
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
1122
+ await this.row(t, orgId, connectorId, true);
1123
+ await this.credentials.setOAuthClient(orgId, connectorId, client);
1124
+ if (tokens)
1125
+ await this.credentials.setOAuthTokens(orgId, connectorId, { kind: "org" }, tokens);
1126
+ await audit(t, {
1127
+ actorAccountId,
1128
+ ...(actorTokenId !== undefined && { actorTokenId }),
1129
+ orgId,
1130
+ action: "connector.credential.set",
1131
+ target: connectorId,
1132
+ detail: { type: auth.type, ownership: "org" },
1084
1133
  });
1085
1134
  }
1086
1135
  /** 删除发起人自己的个人凭据(`connectors.use`);本来就没有也成功。 */
1087
1136
  async clearMyCredential(orgId, connectorId, actorAccountId, actorTokenId) {
1088
- await this.db.transaction().execute(async (t) => {
1089
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "connectors.use");
1090
- const app = await this.row(t, orgId, connectorId);
1091
- await this.credentials.clear(orgId, connectorId, { kind: "user", accountId: actorAccountId }, t);
1092
- await audit(t, {
1093
- actorAccountId,
1094
- ...(actorTokenId !== undefined && { actorTokenId }),
1095
- orgId,
1096
- action: "connector.credential.cleared",
1097
- target: connectorId,
1098
- detail: { type: app.auth.type, ownership: "personal" },
1099
- });
1137
+ const t = this.db;
1138
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.use");
1139
+ const app = await this.row(t, orgId, connectorId);
1140
+ await this.credentials.clear(orgId, connectorId, { kind: "user", accountId: actorAccountId });
1141
+ await audit(t, {
1142
+ actorAccountId,
1143
+ ...(actorTokenId !== undefined && { actorTokenId }),
1144
+ orgId,
1145
+ action: "connector.credential.cleared",
1146
+ target: connectorId,
1147
+ detail: { type: app.auth.type, ownership: "personal" },
1100
1148
  });
1101
1149
  }
1102
- }
1150
+ };
1151
+ __decorate([
1152
+ Transactional()
1153
+ ], ConnectorsService.prototype, "createIn", null);
1154
+ __decorate([
1155
+ Transactional({ propagation: "mandatory" })
1156
+ ], ConnectorsService.prototype, "applyTemplateIn", null);
1157
+ __decorate([
1158
+ Transactional()
1159
+ ], ConnectorsService.prototype, "update", null);
1160
+ __decorate([
1161
+ Transactional()
1162
+ ], ConnectorsService.prototype, "remove", null);
1163
+ __decorate([
1164
+ Transactional({ propagation: "mandatory" })
1165
+ ], ConnectorsService.prototype, "removeIn", null);
1166
+ __decorate([
1167
+ Transactional()
1168
+ ], ConnectorsService.prototype, "refreshIn", null);
1169
+ __decorate([
1170
+ Transactional()
1171
+ ], ConnectorsService.prototype, "reviewTool", null);
1172
+ __decorate([
1173
+ Transactional()
1174
+ ], ConnectorsService.prototype, "setCredentialIn", null);
1175
+ __decorate([
1176
+ Transactional()
1177
+ ], ConnectorsService.prototype, "storeOAuthClient", null);
1178
+ __decorate([
1179
+ Transactional()
1180
+ ], ConnectorsService.prototype, "clearMyCredential", null);
1181
+ ConnectorsService = __decorate([
1182
+ Injectable(),
1183
+ __param(0, Inject(KernelDb)),
1184
+ __param(1, Inject(ToolRegistry)),
1185
+ __param(2, Inject(ExtensionRegistry)),
1186
+ __param(3, Inject(Credentials)),
1187
+ __param(4, Inject(KernelConfigService)),
1188
+ __param(5, Inject(ToolDrift)),
1189
+ __param(6, Inject(OrgLock)),
1190
+ __param(7, Inject(TransactionHost))
1191
+ ], ConnectorsService);
1192
+ export { ConnectorsService };