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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/bootstrap.json +10 -6
  2. package/dist/admin/admin.controller.d.ts +17 -17
  3. package/dist/admin/admin.controller.js +43 -26
  4. package/dist/admin/admin.module.d.ts +3 -0
  5. package/dist/admin/admin.module.js +22 -0
  6. package/dist/admin/extensions.controller.d.ts +14 -14
  7. package/dist/admin/extensions.controller.js +30 -17
  8. package/dist/admin/setup-lock.d.ts +16 -0
  9. package/dist/admin/setup-lock.js +47 -0
  10. package/dist/admin/setup.controller.d.ts +8 -8
  11. package/dist/admin/setup.controller.js +27 -25
  12. package/dist/admin/setup.service.d.ts +19 -27
  13. package/dist/admin/setup.service.js +61 -61
  14. package/dist/agents/agent-lookup.d.ts +53 -0
  15. package/dist/agents/agent-lookup.js +179 -0
  16. package/dist/agents/agents.controller.d.ts +1 -1
  17. package/dist/agents/agents.controller.js +14 -8
  18. package/dist/agents/agents.module.d.ts +7 -0
  19. package/dist/agents/agents.module.js +41 -0
  20. package/dist/agents/agents.service.d.ts +39 -58
  21. package/dist/agents/agents.service.js +261 -329
  22. package/dist/agents/definition.d.ts +8 -0
  23. package/dist/agents/definition.js +8 -0
  24. package/dist/agents/models.controller.d.ts +1 -1
  25. package/dist/agents/models.controller.js +2 -2
  26. package/dist/agents/templates.controller.d.ts +1 -1
  27. package/dist/agents/templates.controller.js +2 -2
  28. package/dist/agents/templates.d.ts +6 -8
  29. package/dist/agents/templates.js +20 -4
  30. package/dist/app.d.ts +93 -0
  31. package/dist/app.js +150 -0
  32. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  33. package/dist/catalog/admin-catalog.controller.js +27 -13
  34. package/dist/catalog/catalog-content.d.ts +185 -0
  35. package/dist/catalog/catalog-content.js +323 -0
  36. package/dist/catalog/catalog-items.d.ts +186 -0
  37. package/dist/catalog/catalog-items.js +410 -0
  38. package/dist/catalog/catalog.module.d.ts +14 -0
  39. package/dist/catalog/catalog.module.js +71 -0
  40. package/dist/catalog/catalog.service.d.ts +34 -188
  41. package/dist/catalog/catalog.service.js +155 -489
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +30 -13
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +2 -2
  70. package/dist/channels/channels.module.d.ts +40 -0
  71. package/dist/channels/channels.module.js +128 -0
  72. package/dist/channels/connections.controller.d.ts +1 -1
  73. package/dist/channels/connections.controller.js +11 -6
  74. package/dist/channels/connections.service.d.ts +43 -21
  75. package/dist/channels/connections.service.js +236 -131
  76. package/dist/channels/inbound.d.ts +34 -38
  77. package/dist/channels/inbound.js +107 -41
  78. package/dist/channels/job-ids.d.ts +10 -0
  79. package/dist/channels/job-ids.js +10 -0
  80. package/dist/channels/jobs.d.ts +85 -0
  81. package/dist/channels/jobs.js +157 -0
  82. package/dist/channels/outbound.d.ts +60 -82
  83. package/dist/channels/outbound.js +165 -193
  84. package/dist/channels/supervisor.d.ts +88 -46
  85. package/dist/channels/supervisor.js +230 -132
  86. package/dist/channels/threads.d.ts +29 -8
  87. package/dist/channels/threads.js +71 -13
  88. package/dist/channels/webhook.d.ts +20 -14
  89. package/dist/channels/webhook.js +51 -20
  90. package/dist/config/load.d.ts +3 -2
  91. package/dist/config/load.js +3 -2
  92. package/dist/config/nacos-source.js +11 -2
  93. package/dist/config/schema.d.ts +16 -1
  94. package/dist/config/schema.js +54 -7
  95. package/dist/conversations/access.d.ts +29 -0
  96. package/dist/conversations/access.js +86 -0
  97. package/dist/conversations/artifacts.d.ts +10 -10
  98. package/dist/conversations/artifacts.js +35 -9
  99. package/dist/conversations/attachments.controller.d.ts +1 -1
  100. package/dist/conversations/attachments.controller.js +8 -6
  101. package/dist/conversations/attachments.module.d.ts +7 -0
  102. package/dist/conversations/attachments.module.js +25 -0
  103. package/dist/conversations/attachments.service.d.ts +30 -22
  104. package/dist/conversations/attachments.service.js +119 -46
  105. package/dist/conversations/conversations.controller.d.ts +8 -7
  106. package/dist/conversations/conversations.controller.js +59 -29
  107. package/dist/conversations/conversations.module.d.ts +8 -0
  108. package/dist/conversations/conversations.module.js +69 -0
  109. package/dist/conversations/conversations.service.d.ts +40 -38
  110. package/dist/conversations/conversations.service.js +130 -140
  111. package/dist/conversations/event-log.d.ts +28 -18
  112. package/dist/conversations/event-log.js +74 -27
  113. package/dist/conversations/files.d.ts +10 -10
  114. package/dist/conversations/files.js +37 -11
  115. package/dist/conversations/idem-keys.d.ts +5 -0
  116. package/dist/conversations/idem-keys.js +5 -0
  117. package/dist/conversations/job-ids.d.ts +6 -0
  118. package/dist/conversations/job-ids.js +6 -0
  119. package/dist/conversations/outputs-read.d.ts +11 -11
  120. package/dist/conversations/outputs-read.js +31 -7
  121. package/dist/conversations/queue.d.ts +48 -56
  122. package/dist/conversations/queue.js +13 -289
  123. package/dist/conversations/queue.service.d.ts +60 -0
  124. package/dist/conversations/queue.service.js +343 -0
  125. package/dist/conversations/sandbox-status.d.ts +13 -10
  126. package/dist/conversations/sandbox-status.js +36 -8
  127. package/dist/conversations/titles.d.ts +71 -24
  128. package/dist/conversations/titles.js +159 -62
  129. package/dist/ctx/bus.js +9 -3
  130. package/dist/ctx/create-ctx.d.ts +6 -0
  131. package/dist/ctx/create-ctx.js +7 -9
  132. package/dist/ctx/lock.d.ts +7 -3
  133. package/dist/ctx/lock.js +9 -20
  134. package/dist/ctx/queue.js +3 -2
  135. package/dist/ctx/secrets.d.ts +10 -2
  136. package/dist/ctx/secrets.js +7 -3
  137. package/dist/db/kernel-schema.d.ts +2 -2
  138. package/dist/db/pool.d.ts +5 -0
  139. package/dist/db/pool.js +1 -0
  140. package/dist/errors.d.ts +2 -0
  141. package/dist/errors.js +2 -0
  142. package/dist/evals/budget.d.ts +42 -21
  143. package/dist/evals/budget.js +114 -62
  144. package/dist/evals/evals.module.d.ts +31 -0
  145. package/dist/evals/evals.module.js +114 -0
  146. package/dist/evals/jobs.d.ts +20 -0
  147. package/dist/evals/jobs.js +45 -0
  148. package/dist/evals/run-replay.d.ts +56 -8
  149. package/dist/evals/run-replay.js +140 -80
  150. package/dist/evals/runs.controller.d.ts +1 -1
  151. package/dist/evals/runs.controller.js +17 -8
  152. package/dist/evals/runs.service.d.ts +23 -45
  153. package/dist/evals/runs.service.js +245 -234
  154. package/dist/evals/sets.controller.d.ts +1 -1
  155. package/dist/evals/sets.controller.js +17 -8
  156. package/dist/evals/sets.service.d.ts +22 -6
  157. package/dist/evals/sets.service.js +248 -194
  158. package/dist/evals/snapshot.d.ts +2 -2
  159. package/dist/evals/step-replay.d.ts +2 -2
  160. package/dist/evals/step-replay.js +1 -1
  161. package/dist/evals/trajectory.controller.d.ts +1 -1
  162. package/dist/evals/trajectory.controller.js +11 -7
  163. package/dist/evals/trajectory.service.d.ts +5 -4
  164. package/dist/evals/trajectory.service.js +30 -7
  165. package/dist/evals/worker.d.ts +44 -27
  166. package/dist/evals/worker.js +220 -120
  167. package/dist/extensions/admin-ops.d.ts +61 -33
  168. package/dist/extensions/admin-ops.js +248 -154
  169. package/dist/extensions/admin-view.d.ts +38 -27
  170. package/dist/extensions/admin-view.js +126 -55
  171. package/dist/extensions/approvals.d.ts +12 -8
  172. package/dist/extensions/approvals.js +73 -46
  173. package/dist/extensions/blobs.d.ts +27 -10
  174. package/dist/extensions/blobs.js +111 -45
  175. package/dist/extensions/bootstrap.d.ts +96 -42
  176. package/dist/extensions/bootstrap.js +303 -155
  177. package/dist/extensions/cli.d.ts +20 -10
  178. package/dist/extensions/cli.js +41 -96
  179. package/dist/extensions/config-issues.d.ts +7 -0
  180. package/dist/extensions/config-issues.js +31 -0
  181. package/dist/extensions/deployment-config-store.d.ts +49 -0
  182. package/dist/extensions/deployment-config-store.js +133 -0
  183. package/dist/extensions/deployment-config.d.ts +58 -67
  184. package/dist/extensions/deployment-config.js +202 -230
  185. package/dist/extensions/enabled.d.ts +5 -5
  186. package/dist/extensions/extensions.module.d.ts +8 -0
  187. package/dist/extensions/extensions.module.js +77 -0
  188. package/dist/extensions/hooks.d.ts +3 -2
  189. package/dist/extensions/hooks.js +1 -1
  190. package/dist/extensions/host.d.ts +72 -68
  191. package/dist/extensions/host.js +191 -152
  192. package/dist/extensions/installs.d.ts +49 -16
  193. package/dist/extensions/installs.js +128 -32
  194. package/dist/extensions/job-ids.d.ts +6 -0
  195. package/dist/extensions/job-ids.js +6 -0
  196. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  197. package/dist/extensions/lifecycle-topics.js +18 -0
  198. package/dist/extensions/lifecycle.d.ts +35 -47
  199. package/dist/extensions/lifecycle.js +103 -39
  200. package/dist/extensions/locks.d.ts +33 -0
  201. package/dist/extensions/locks.js +86 -0
  202. package/dist/extensions/migrate-lock.d.ts +3 -4
  203. package/dist/extensions/org-config.controller.d.ts +1 -1
  204. package/dist/extensions/org-config.controller.js +8 -5
  205. package/dist/extensions/org-config.d.ts +48 -46
  206. package/dist/extensions/org-config.js +284 -226
  207. package/dist/extensions/registry.d.ts +50 -2
  208. package/dist/extensions/registry.js +89 -4
  209. package/dist/extensions/sources.d.ts +12 -8
  210. package/dist/extensions/sources.js +34 -13
  211. package/dist/files/files.module.d.ts +3 -0
  212. package/dist/files/files.module.js +22 -0
  213. package/dist/files/previewers.controller.d.ts +7 -2
  214. package/dist/files/previewers.controller.js +17 -9
  215. package/dist/files/previewers.d.ts +13 -18
  216. package/dist/files/previewers.js +83 -36
  217. package/dist/http/adapter.d.ts +3 -0
  218. package/dist/http/adapter.js +25 -0
  219. package/dist/http/api.module.d.ts +3 -110
  220. package/dist/http/api.module.js +47 -355
  221. package/dist/http/app.d.ts +11 -15
  222. package/dist/http/app.js +52 -47
  223. package/dist/http/error-filter.module.d.ts +5 -0
  224. package/dist/http/error-filter.module.js +18 -0
  225. package/dist/http/error.filter.js +2 -2
  226. package/dist/identity/accounts.d.ts +82 -29
  227. package/dist/identity/accounts.js +294 -175
  228. package/dist/identity/api-tokens.d.ts +11 -7
  229. package/dist/identity/api-tokens.js +71 -44
  230. package/dist/identity/audit.d.ts +7 -4
  231. package/dist/identity/audit.js +5 -1
  232. package/dist/identity/auth.controller.d.ts +11 -10
  233. package/dist/identity/auth.controller.js +31 -25
  234. package/dist/identity/auth.guard.d.ts +3 -3
  235. package/dist/identity/auth.guard.js +6 -4
  236. package/dist/identity/binding.d.ts +9 -11
  237. package/dist/identity/binding.js +41 -13
  238. package/dist/identity/enterprise-admin.d.ts +18 -12
  239. package/dist/identity/enterprise-admin.js +67 -13
  240. package/dist/identity/external-identity-lock.d.ts +17 -0
  241. package/dist/identity/external-identity-lock.js +39 -0
  242. package/dist/identity/external.d.ts +19 -15
  243. package/dist/identity/external.js +163 -125
  244. package/dist/identity/identity.module.d.ts +6 -0
  245. package/dist/identity/identity.module.js +56 -0
  246. package/dist/identity/me.controller.d.ts +16 -15
  247. package/dist/identity/me.controller.js +37 -31
  248. package/dist/identity/sessions.d.ts +12 -10
  249. package/dist/identity/sessions.js +74 -42
  250. package/dist/identity/settings.d.ts +20 -14
  251. package/dist/identity/settings.js +85 -57
  252. package/dist/identity/sso.controller.d.ts +7 -7
  253. package/dist/identity/sso.controller.js +13 -9
  254. package/dist/identity/sso.d.ts +9 -12
  255. package/dist/identity/sso.js +54 -24
  256. package/dist/inbox/inbox.module.d.ts +3 -0
  257. package/dist/inbox/inbox.module.js +22 -0
  258. package/dist/inbox/inbox.service.d.ts +7 -9
  259. package/dist/inbox/inbox.service.js +32 -11
  260. package/dist/index.d.ts +19 -12
  261. package/dist/index.js +13 -8
  262. package/dist/infra/cache/cache.module.d.ts +3 -0
  263. package/dist/infra/cache/cache.module.js +16 -0
  264. package/dist/infra/cache/cache.service.d.ts +21 -0
  265. package/dist/infra/cache/cache.service.js +80 -0
  266. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  267. package/dist/infra/cache/cacheable.decorator.js +83 -0
  268. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  269. package/dist/infra/cli/kernel-cli.module.js +165 -0
  270. package/dist/infra/close-within.d.ts +15 -0
  271. package/dist/infra/close-within.js +36 -0
  272. package/dist/infra/config/config.module.d.ts +13 -0
  273. package/dist/infra/config/config.module.js +39 -0
  274. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  275. package/dist/infra/config/kernel-config.service.js +126 -0
  276. package/dist/infra/database/after-commit.d.ts +6 -0
  277. package/dist/infra/database/after-commit.js +9 -0
  278. package/dist/infra/database/database.module.d.ts +25 -0
  279. package/dist/infra/database/database.module.js +90 -0
  280. package/dist/infra/database/kernel-db.d.ts +22 -0
  281. package/dist/infra/database/kernel-db.js +65 -0
  282. package/dist/infra/database/transaction-host.d.ts +50 -0
  283. package/dist/infra/database/transaction-host.js +125 -0
  284. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  285. package/dist/infra/database/transactional.decorator.js +27 -0
  286. package/dist/infra/database/xact-lock.d.ts +17 -0
  287. package/dist/infra/database/xact-lock.js +43 -0
  288. package/dist/infra/events/kernel-events.d.ts +96 -0
  289. package/dist/infra/events/kernel-events.js +65 -0
  290. package/dist/infra/health/health.controller.d.ts +26 -0
  291. package/dist/infra/health/health.controller.js +104 -0
  292. package/dist/infra/health/health.module.d.ts +9 -0
  293. package/dist/infra/health/health.module.js +24 -0
  294. package/dist/infra/health/health.options.d.ts +10 -0
  295. package/dist/infra/health/health.options.js +15 -0
  296. package/dist/infra/health/shutdown-state.d.ts +6 -0
  297. package/dist/infra/health/shutdown-state.js +2 -0
  298. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  299. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  300. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  301. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  302. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  303. package/dist/infra/lifecycle/process-guards.js +86 -0
  304. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  305. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  306. package/dist/infra/lock/key-template.d.ts +13 -0
  307. package/dist/infra/lock/key-template.js +46 -0
  308. package/dist/infra/lock/lock.module.d.ts +3 -0
  309. package/dist/infra/lock/lock.module.js +16 -0
  310. package/dist/infra/lock/lock.service.d.ts +120 -0
  311. package/dist/infra/lock/lock.service.js +343 -0
  312. package/dist/infra/lock/shared-lease.d.ts +44 -0
  313. package/dist/infra/lock/shared-lease.js +121 -0
  314. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  315. package/dist/infra/lock/with-lock.decorator.js +49 -0
  316. package/dist/infra/logging/logging.module.d.ts +16 -0
  317. package/dist/infra/logging/logging.module.js +34 -0
  318. package/dist/infra/queue/configured-processor.d.ts +18 -0
  319. package/dist/infra/queue/configured-processor.js +23 -0
  320. package/dist/infra/queue/job-failure.d.ts +18 -0
  321. package/dist/infra/queue/job-failure.js +26 -0
  322. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  323. package/dist/infra/queue/queue-shutdown.js +81 -0
  324. package/dist/infra/queue/queue.module.d.ts +16 -0
  325. package/dist/infra/queue/queue.module.js +61 -0
  326. package/dist/infra/queue/redis-connection.d.ts +7 -0
  327. package/dist/infra/queue/redis-connection.js +18 -0
  328. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  329. package/dist/infra/queue/retired-schedulers.js +9 -0
  330. package/dist/infra/queue/run-job.d.ts +16 -0
  331. package/dist/infra/queue/run-job.js +19 -0
  332. package/dist/infra/redis/redis.module.d.ts +24 -0
  333. package/dist/infra/redis/redis.module.js +87 -0
  334. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  335. package/dist/infra/schedule/cron-tick.js +25 -0
  336. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  337. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  338. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  339. package/dist/infra/schedule/locked-interval.js +190 -0
  340. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  341. package/dist/infra/schedule/locked-tick.js +137 -0
  342. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  343. package/dist/infra/schedule/schedule.module.js +27 -0
  344. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  345. package/dist/infra/schedule/scheduled-runs.js +163 -0
  346. package/dist/infra/swagger/swagger.d.ts +16 -0
  347. package/dist/infra/swagger/swagger.js +31 -0
  348. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  349. package/dist/infra/throttler/credential-throttler.js +77 -0
  350. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  351. package/dist/infra/throttler/named-throttlers.js +119 -0
  352. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  353. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  354. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  355. package/dist/infra/throttler/throttler.guard.js +68 -0
  356. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  357. package/dist/infra/throttler/throttler.module.js +53 -0
  358. package/dist/infra/tokens.d.ts +15 -0
  359. package/dist/infra/tokens.js +15 -0
  360. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  361. package/dist/infra/validation/create-zod-dto.js +35 -0
  362. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  363. package/dist/infra/validation/parse-with-zod.js +12 -0
  364. package/dist/infra/validation/validation.module.d.ts +3 -0
  365. package/dist/infra/validation/validation.module.js +16 -0
  366. package/dist/infra/validation/zod-params.d.ts +7 -0
  367. package/dist/infra/validation/zod-params.js +42 -0
  368. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  369. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  370. package/dist/kernel.d.ts +9 -241
  371. package/dist/kernel.js +8 -1305
  372. package/dist/kernel.module.d.ts +17 -0
  373. package/dist/kernel.module.js +136 -0
  374. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  375. package/dist/lifecycle/kernel-lifecycle.js +451 -0
  376. package/dist/lifecycle/tokens.d.ts +3 -0
  377. package/dist/lifecycle/tokens.js +3 -0
  378. package/dist/log-config.d.ts +9 -0
  379. package/dist/log-config.js +27 -0
  380. package/dist/log-context.d.ts +34 -0
  381. package/dist/log-context.js +44 -0
  382. package/dist/log-loki.d.ts +34 -0
  383. package/dist/log-loki.js +145 -0
  384. package/dist/log.d.ts +41 -10
  385. package/dist/log.js +91 -17
  386. package/dist/models/models.module.d.ts +3 -0
  387. package/dist/models/models.module.js +24 -0
  388. package/dist/models/prices.d.ts +8 -2
  389. package/dist/models/prices.js +65 -37
  390. package/dist/models/purposes.controller.d.ts +1 -1
  391. package/dist/models/purposes.controller.js +5 -6
  392. package/dist/models/purposes.d.ts +35 -13
  393. package/dist/models/purposes.js +101 -51
  394. package/dist/net/public-address.js +3 -2
  395. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  396. package/dist/orgs/directory-sync.controller.js +2 -2
  397. package/dist/orgs/directory-sync.d.ts +61 -31
  398. package/dist/orgs/directory-sync.js +212 -125
  399. package/dist/orgs/invitations.controller.d.ts +8 -8
  400. package/dist/orgs/invitations.controller.js +27 -26
  401. package/dist/orgs/invitations.service.d.ts +12 -9
  402. package/dist/orgs/invitations.service.js +130 -92
  403. package/dist/orgs/job-ids.d.ts +8 -0
  404. package/dist/orgs/job-ids.js +8 -0
  405. package/dist/orgs/members.service.d.ts +19 -12
  406. package/dist/orgs/members.service.js +161 -117
  407. package/dist/orgs/offboarding.d.ts +54 -57
  408. package/dist/orgs/offboarding.js +161 -71
  409. package/dist/orgs/org-lock.d.ts +28 -19
  410. package/dist/orgs/org-lock.js +81 -35
  411. package/dist/orgs/org.guard.d.ts +1 -1
  412. package/dist/orgs/org.guard.js +2 -2
  413. package/dist/orgs/orgs.controller.d.ts +13 -13
  414. package/dist/orgs/orgs.controller.js +29 -17
  415. package/dist/orgs/orgs.module.d.ts +6 -0
  416. package/dist/orgs/orgs.module.js +68 -0
  417. package/dist/orgs/orgs.service.d.ts +30 -19
  418. package/dist/orgs/orgs.service.js +139 -86
  419. package/dist/orgs/settings.controller.d.ts +1 -1
  420. package/dist/orgs/settings.controller.js +8 -6
  421. package/dist/orgs/settings.service.d.ts +14 -8
  422. package/dist/orgs/settings.service.js +75 -46
  423. package/dist/overrides.d.ts +56 -0
  424. package/dist/overrides.js +30 -0
  425. package/dist/roles/gateway-role.d.ts +43 -0
  426. package/dist/roles/gateway-role.js +98 -0
  427. package/dist/roles/gateway.module.d.ts +8 -0
  428. package/dist/roles/gateway.module.js +28 -0
  429. package/dist/roles/worker-role.d.ts +63 -0
  430. package/dist/roles/worker-role.js +144 -0
  431. package/dist/roles/worker.module.d.ts +14 -0
  432. package/dist/roles/worker.module.js +90 -0
  433. package/dist/runtime/abort.js +19 -2
  434. package/dist/runtime/checkpointer.d.ts +8 -3
  435. package/dist/runtime/checkpointer.js +87 -55
  436. package/dist/runtime/conversation-lock.d.ts +20 -11
  437. package/dist/runtime/conversation-lock.js +62 -72
  438. package/dist/runtime/hook-calls.d.ts +3 -3
  439. package/dist/runtime/hook-calls.js +1 -6
  440. package/dist/runtime/job-ids.d.ts +10 -0
  441. package/dist/runtime/job-ids.js +10 -0
  442. package/dist/runtime/langgraph-loop.js +1 -1
  443. package/dist/runtime/loop.d.ts +7 -0
  444. package/dist/runtime/loop.js +14 -0
  445. package/dist/runtime/maintenance-queue.d.ts +10 -0
  446. package/dist/runtime/maintenance-queue.js +10 -0
  447. package/dist/runtime/maintenance.d.ts +45 -74
  448. package/dist/runtime/maintenance.js +139 -136
  449. package/dist/runtime/model-call.d.ts +7 -4
  450. package/dist/runtime/model-call.js +24 -57
  451. package/dist/runtime/providers.d.ts +17 -6
  452. package/dist/runtime/providers.js +66 -25
  453. package/dist/runtime/quota.d.ts +17 -3
  454. package/dist/runtime/quota.js +27 -2
  455. package/dist/runtime/retired-schedulers.d.ts +7 -0
  456. package/dist/runtime/retired-schedulers.js +31 -0
  457. package/dist/runtime/run-control.d.ts +33 -0
  458. package/dist/runtime/run-control.js +77 -0
  459. package/dist/runtime/run-finish.d.ts +26 -17
  460. package/dist/runtime/run-finish.js +98 -51
  461. package/dist/runtime/run-jobs.d.ts +48 -0
  462. package/dist/runtime/run-jobs.js +95 -0
  463. package/dist/runtime/run-processors.d.ts +60 -0
  464. package/dist/runtime/run-processors.js +185 -0
  465. package/dist/runtime/run-queue.d.ts +32 -57
  466. package/dist/runtime/run-queue.js +291 -295
  467. package/dist/runtime/run-steps.d.ts +39 -0
  468. package/dist/runtime/run-steps.js +96 -0
  469. package/dist/runtime/run-worker.d.ts +121 -75
  470. package/dist/runtime/run-worker.js +340 -225
  471. package/dist/runtime/runtime.module.d.ts +10 -0
  472. package/dist/runtime/runtime.module.js +112 -0
  473. package/dist/runtime/step-log.d.ts +40 -0
  474. package/dist/runtime/step-log.js +94 -0
  475. package/dist/runtime/stream.controller.d.ts +5 -8
  476. package/dist/runtime/stream.controller.js +14 -12
  477. package/dist/runtime/stream.d.ts +24 -6
  478. package/dist/runtime/stream.js +78 -7
  479. package/dist/runtime/subagents/child.d.ts +3 -44
  480. package/dist/runtime/subagents/child.js +0 -79
  481. package/dist/runtime/subagents/definition.d.ts +4 -4
  482. package/dist/runtime/subagents/definition.js +2 -2
  483. package/dist/runtime/subagents/dispatch.d.ts +87 -6
  484. package/dist/runtime/subagents/dispatch.js +135 -140
  485. package/dist/runtime/subagents/limits.d.ts +9 -4
  486. package/dist/runtime/subagents/limits.js +4 -2
  487. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  488. package/dist/runtime/subagents/org-agents.js +1 -1
  489. package/dist/runtime/subagents/progress.d.ts +2 -2
  490. package/dist/runtime/subagents/roster.d.ts +3 -3
  491. package/dist/runtime/subagents/roster.js +1 -1
  492. package/dist/runtime/subagents/skill-fork.d.ts +6 -7
  493. package/dist/runtime/subagents/skill-fork.js +16 -5
  494. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  495. package/dist/runtime/subagents/subagents.service.js +101 -0
  496. package/dist/runtime/usage-report.d.ts +94 -52
  497. package/dist/runtime/usage-report.js +200 -99
  498. package/dist/runtime/waits.d.ts +125 -57
  499. package/dist/runtime/waits.js +431 -208
  500. package/dist/sandbox/job-ids.d.ts +10 -0
  501. package/dist/sandbox/job-ids.js +10 -0
  502. package/dist/sandbox/jobs.d.ts +41 -0
  503. package/dist/sandbox/jobs.js +113 -0
  504. package/dist/sandbox/leases.d.ts +39 -31
  505. package/dist/sandbox/leases.js +117 -257
  506. package/dist/sandbox/providers.d.ts +19 -0
  507. package/dist/sandbox/providers.js +38 -0
  508. package/dist/sandbox/sandbox.module.d.ts +8 -0
  509. package/dist/sandbox/sandbox.module.js +30 -0
  510. package/dist/sandbox/sandbox.service.d.ts +24 -29
  511. package/dist/sandbox/sandbox.service.js +106 -75
  512. package/dist/skills/catalog.d.ts +33 -20
  513. package/dist/skills/catalog.js +96 -53
  514. package/dist/skills/changes.controller.d.ts +4 -4
  515. package/dist/skills/changes.controller.js +15 -9
  516. package/dist/skills/changes.service.d.ts +28 -18
  517. package/dist/skills/changes.service.js +421 -364
  518. package/dist/skills/invocable.controller.d.ts +1 -1
  519. package/dist/skills/invocable.controller.js +8 -5
  520. package/dist/skills/invoke.d.ts +16 -15
  521. package/dist/skills/invoke.js +48 -17
  522. package/dist/skills/skills.controller.d.ts +1 -1
  523. package/dist/skills/skills.controller.js +11 -6
  524. package/dist/skills/skills.module.d.ts +6 -0
  525. package/dist/skills/skills.module.js +30 -0
  526. package/dist/skills/skills.service.d.ts +47 -30
  527. package/dist/skills/skills.service.js +221 -158
  528. package/dist/storage/job-ids.d.ts +6 -0
  529. package/dist/storage/job-ids.js +6 -0
  530. package/dist/storage/purge.d.ts +22 -7
  531. package/dist/storage/purge.js +55 -3
  532. package/dist/storage/storage.module.d.ts +6 -0
  533. package/dist/storage/storage.module.js +23 -0
  534. package/dist/storage/storage.service.d.ts +18 -4
  535. package/dist/storage/storage.service.js +44 -3
  536. package/dist/tools/approvals.controller.d.ts +1 -1
  537. package/dist/tools/approvals.controller.js +12 -8
  538. package/dist/tools/approvals.service.d.ts +27 -25
  539. package/dist/tools/approvals.service.js +324 -258
  540. package/dist/tools/breaker.d.ts +2 -2
  541. package/dist/tools/breaker.js +21 -3
  542. package/dist/tools/builtins/ask-user.d.ts +2 -2
  543. package/dist/tools/builtins/ask-user.js +1 -1
  544. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  545. package/dist/tools/builtins/builtin-tools.js +80 -0
  546. package/dist/tools/builtins/read-tool-output.d.ts +2 -2
  547. package/dist/tools/builtins/read-tool-output.js +1 -1
  548. package/dist/tools/builtins/sandbox/bash.js +2 -2
  549. package/dist/tools/builtins/sandbox/common.d.ts +7 -4
  550. package/dist/tools/builtins/sandbox/common.js +5 -3
  551. package/dist/tools/builtins/sandbox/deliver.js +2 -2
  552. package/dist/tools/builtins/sandbox/edit.js +1 -1
  553. package/dist/tools/builtins/sandbox/glob.js +2 -2
  554. package/dist/tools/builtins/sandbox/grep.js +2 -2
  555. package/dist/tools/builtins/sandbox/read.js +1 -1
  556. package/dist/tools/builtins/sandbox/write.js +1 -1
  557. package/dist/tools/builtins/skill-load.d.ts +3 -3
  558. package/dist/tools/builtins/skill-load.js +1 -1
  559. package/dist/tools/canonical-json.d.ts +6 -0
  560. package/dist/tools/canonical-json.js +16 -0
  561. package/dist/tools/connector-content.controller.d.ts +1 -1
  562. package/dist/tools/connector-content.controller.js +11 -6
  563. package/dist/tools/connector-content.d.ts +12 -15
  564. package/dist/tools/connector-content.js +53 -18
  565. package/dist/tools/connectors.controller.d.ts +1 -1
  566. package/dist/tools/connectors.controller.js +21 -10
  567. package/dist/tools/connectors.service.d.ts +31 -13
  568. package/dist/tools/connectors.service.js +434 -344
  569. package/dist/tools/credentials.d.ts +17 -20
  570. package/dist/tools/credentials.js +55 -34
  571. package/dist/tools/drift.d.ts +29 -41
  572. package/dist/tools/drift.js +111 -79
  573. package/dist/tools/info.d.ts +12 -9
  574. package/dist/tools/info.js +33 -7
  575. package/dist/tools/job-ids.d.ts +13 -0
  576. package/dist/tools/job-ids.js +15 -0
  577. package/dist/tools/jobs.d.ts +24 -0
  578. package/dist/tools/jobs.js +69 -0
  579. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  580. package/dist/tools/oauth/flow-paths.js +38 -0
  581. package/dist/tools/oauth/flow.d.ts +30 -30
  582. package/dist/tools/oauth/flow.js +109 -81
  583. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  584. package/dist/tools/oauth/oauth.controller.js +12 -9
  585. package/dist/tools/oauth/tokens.d.ts +11 -3
  586. package/dist/tools/oauth/tokens.js +15 -14
  587. package/dist/tools/outputs.d.ts +13 -4
  588. package/dist/tools/outputs.js +47 -3
  589. package/dist/tools/pipeline.d.ts +62 -46
  590. package/dist/tools/pipeline.js +145 -64
  591. package/dist/tools/policy.d.ts +2 -2
  592. package/dist/tools/questions.controller.d.ts +1 -1
  593. package/dist/tools/questions.controller.js +8 -5
  594. package/dist/tools/questions.service.d.ts +25 -24
  595. package/dist/tools/questions.service.js +201 -142
  596. package/dist/tools/registry.d.ts +30 -20
  597. package/dist/tools/registry.js +73 -37
  598. package/dist/tools/specs.d.ts +5 -4
  599. package/dist/tools/specs.js +3 -1
  600. package/dist/tools/tools.module.d.ts +10 -0
  601. package/dist/tools/tools.module.js +91 -0
  602. package/dist/ui/call-extension.d.ts +16 -0
  603. package/dist/ui/call-extension.js +38 -0
  604. package/dist/ui/embed-token.d.ts +9 -5
  605. package/dist/ui/embed-token.js +34 -6
  606. package/dist/ui/ui-stream.d.ts +22 -17
  607. package/dist/ui/ui-stream.js +72 -12
  608. package/dist/ui/ui.module.d.ts +7 -0
  609. package/dist/ui/ui.module.js +28 -0
  610. package/dist/ui/views.controller.d.ts +14 -12
  611. package/dist/ui/views.controller.js +32 -25
  612. package/dist/ui/views.d.ts +9 -57
  613. package/dist/ui/views.js +43 -45
  614. package/package.json +11 -2
  615. package/dist/http/health.controller.d.ts +0 -26
  616. package/dist/http/health.controller.js +0 -79
  617. package/dist/http/tokens.d.ts +0 -131
  618. package/dist/http/tokens.js +0 -131
  619. package/dist/http/zod.pipe.d.ts +0 -8
  620. package/dist/http/zod.pipe.js +0 -14
  621. package/dist/identity/rate-limit.d.ts +0 -55
  622. package/dist/identity/rate-limit.js +0 -121
  623. package/dist/sandbox/lifecycle.d.ts +0 -21
  624. package/dist/sandbox/lifecycle.js +0 -68
  625. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  626. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -1,18 +1,36 @@
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 { CHANNEL_EXTENSION_POINT, } from "@capybara-hq/plugin-sdk";
12
+ import { Inject, Injectable } from "@nestjs/common";
3
13
  import { sql } from "kysely";
4
14
  import { configFields, getPath, secretValues } from "../config/fields.js";
5
15
  import { queryEnabledPlugins } from "../ctx/create-ctx.js";
6
16
  import { createSecrets } from "../ctx/secrets.js";
7
17
  import { ApiError } from "../errors.js";
18
+ import { toIssues } from "../extensions/config-issues.js";
8
19
  import { configToJsonSchema } from "../extensions/config-json-schema.js";
9
20
  import { enabledExtensionsByOrg } from "../extensions/enabled.js";
10
- import { toIssues } from "../extensions/org-config.js";
21
+ import { ExtensionRegistry } from "../extensions/registry.js";
11
22
  import { audit } from "../identity/audit.js";
23
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
24
+ import { KernelDb } from "../infra/database/kernel-db.js";
25
+ import { TransactionHost } from "../infra/database/transaction-host.js";
26
+ import { Transactional } from "../infra/database/transactional.decorator.js";
27
+ import { KernelEvents } from "../infra/events/kernel-events.js";
28
+ import { KERNEL_BUS, KERNEL_LOGGER, KEYRING, REDIS } from "../infra/tokens.js";
12
29
  import { createRedactor } from "../log.js";
13
- import { lockOrgAndAuthorize } from "../orgs/org-lock.js";
30
+ import { OrgLock } from "../orgs/org-lock.js";
14
31
  import { readOrgSettings } from "../orgs/settings.service.js";
15
32
  import { adaptToFeatures } from "./features.js";
33
+ import { ChannelJobs } from "./jobs.js";
16
34
  import { webhookBase, webhookUrlOf } from "./webhook-url.js";
17
35
  /** 内核 secrets 命名空间(插件名不能取 `kernel`)。 */
18
36
  const SECRETS_NAMESPACE = "kernel";
@@ -91,17 +109,56 @@ const COLUMNS = [
91
109
  * (命名空间 `kernel`,键 `channels:<id>:config`)。写操作在组织行锁内实时复核 `channels.manage`,写审计;
92
110
  * 改动提交后经内核 bus 广播 `channel.changed`,持有该连接的副本据此断开(下一轮扫描按新配置重连)。
93
111
  */
94
- export class ChannelConnections {
95
- deps;
96
- constructor(deps) {
97
- this.deps = deps;
112
+ let ChannelConnections = class ChannelConnections {
113
+ db;
114
+ orgLock;
115
+ keyring;
116
+ registry;
117
+ bus;
118
+ redis;
119
+ jobs;
120
+ config;
121
+ log;
122
+ txHost;
123
+ unsubscribe;
124
+ constructor(db,
125
+ /** The org row lock (orgs/org-lock.ts): joins the transaction of the write. */
126
+ orgLock, keyring, registry, bus, redis,
127
+ /** A connection that can deliver again catches up its conversations (`resumeConnection`). */
128
+ jobs,
129
+ /** `channels.webhookBaseUrl`: without it webhook mode is unavailable. */
130
+ config, events,
131
+ /** Secret values handled here (written or decrypted) are redacted from the logs (`addOrgSecrets`). */
132
+ log, txHost) {
133
+ this.db = db;
134
+ this.orgLock = orgLock;
135
+ this.keyring = keyring;
136
+ this.registry = registry;
137
+ this.bus = bus;
138
+ this.redis = redis;
139
+ this.jobs = jobs;
140
+ this.config = config;
141
+ this.log = log;
142
+ this.txHost = txHost;
143
+ this.unsubscribe = [
144
+ // a deleted org's channel connections drop their long connections at once
145
+ events.on("org.deleted", ({ orgId }) => this.notifyOrgChanged(orgId)),
146
+ // an org disabling an extension drops that extension's channel connections at once (the
147
+ // supervisor's periodic re-check is the fallback)
148
+ events.on("extension.org-disabled", ({ orgId, plugin }) => this.notifyOrgChanged(orgId, plugin)),
149
+ ];
150
+ }
151
+ /** Unsubscribes after the stop phases: events emitted while they drain are still handled. */
152
+ onApplicationShutdown() {
153
+ for (const off of this.unsubscribe)
154
+ off();
98
155
  }
99
156
  /** The extension's `channel@1`; not loaded or not provided -> `extension.not_found`. */
100
157
  channel(plugin) {
101
158
  return this.channelEntry(plugin).impl;
102
159
  }
103
160
  channelEntry(plugin) {
104
- const e = this.deps.host
161
+ const e = this.registry
105
162
  .list("channel")
106
163
  .find((x) => x.plugin === plugin && x.capability === CHANNEL_EXTENSION_POINT);
107
164
  if (!e)
@@ -110,7 +167,7 @@ export class ChannelConnections {
110
167
  }
111
168
  /** The extension is not enabled in this organization -> `extension.not_enabled`. */
112
169
  async assertEnabled(orgId, plugin) {
113
- if (!(await queryEnabledPlugins(this.deps.db, orgId)).has(plugin)) {
170
+ if (!(await queryEnabledPlugins(this.db.db, orgId)).has(plugin)) {
114
171
  throw new ApiError("extension.not_enabled", `Extension ${plugin} is not enabled for this organization`);
115
172
  }
116
173
  }
@@ -141,10 +198,10 @@ export class ChannelConnections {
141
198
  reportSecrets(schema, config) {
142
199
  const values = secretValues(schema, config);
143
200
  if (values.length > 0)
144
- this.deps.onSecrets?.(values);
201
+ this.log.addOrgSecrets(values);
145
202
  }
146
- async assertAgent(t, orgId, agentId) {
147
- const a = await t
203
+ async assertAgent(orgId, agentId) {
204
+ const a = await this.db
148
205
  .selectFrom("agents")
149
206
  .select("id")
150
207
  .where("id", "=", agentId)
@@ -155,7 +212,7 @@ export class ChannelConnections {
155
212
  throw new ApiError("agent.not_found", "Agent not found");
156
213
  }
157
214
  async readSecrets(orgId, id) {
158
- const raw = await createSecrets(this.deps.db, this.deps.keyring, SECRETS_NAMESPACE).get(orgId, connectionSecretKey(id));
215
+ const raw = await createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE).get(orgId, connectionSecretKey(id));
159
216
  return raw === null ? {} : JSON.parse(raw);
160
217
  }
161
218
  view(r, setPaths) {
@@ -193,8 +250,7 @@ export class ChannelConnections {
193
250
  };
194
251
  }
195
252
  webhookBase() {
196
- const config = this.deps.config?.();
197
- return config === undefined ? undefined : webhookBase(config);
253
+ return webhookBase(this.config.get());
198
254
  }
199
255
  /**
200
256
  * Switching to webhook mode needs a plugin that implements `Channel.webhook` and a configured
@@ -212,7 +268,7 @@ export class ChannelConnections {
212
268
  return this.view(row, new Set(Object.keys(await this.readSecrets(row.org_id, row.id))));
213
269
  }
214
270
  live(orgId) {
215
- return this.deps.db
271
+ return this.db
216
272
  .selectFrom("channel_connections")
217
273
  .select(COLUMNS)
218
274
  .where("org_id", "=", orgId)
@@ -234,46 +290,58 @@ export class ChannelConnections {
234
290
  await this.assertEnabled(orgId, input.plugin);
235
291
  const schema = channel.connectionSchema;
236
292
  const full = this.parse(input.plugin, schema, input.config);
237
- await this.assertAgent(this.deps.db, orgId, input.agentId);
293
+ await this.assertAgent(orgId, input.agentId);
238
294
  const verified = await this.verify(channel, full);
239
295
  const id = randomUUID();
240
296
  const { plain, secrets } = split(schema, full);
241
- const row = await this.deps.db.transaction().execute(async (t) => {
242
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "channels.manage");
243
- await this.assertAgent(t, orgId, input.agentId);
244
- if (Object.keys(secrets).length > 0) {
245
- await createSecrets(t, this.deps.keyring, SECRETS_NAMESPACE).set(orgId, connectionSecretKey(id), JSON.stringify(secrets));
246
- }
247
- const inserted = await t
248
- .insertInto("channel_connections")
249
- .values({
250
- id,
251
- org_id: orgId,
252
- plugin: input.plugin,
253
- name: input.name,
254
- agent_id: input.agentId,
255
- config: JSON.stringify(plain),
256
- unbound_policy: input.unboundPolicy ?? "bind",
257
- bot_user_id: verified.botUserId,
258
- tenant_id: verified.tenantId,
259
- created_by: actorAccountId,
260
- })
261
- .returning(COLUMNS)
262
- .executeTakeFirstOrThrow();
263
- await audit(t, {
264
- actorAccountId,
265
- ...(actorTokenId !== undefined && { actorTokenId }),
266
- orgId,
267
- action: "channel.created",
268
- target: id,
269
- detail: { plugin: input.plugin, agentId: input.agentId },
270
- });
271
- return inserted;
297
+ const row = await this.insertIn({
298
+ orgId,
299
+ id,
300
+ input,
301
+ plain,
302
+ secrets,
303
+ verified,
304
+ actorAccountId,
305
+ actorTokenId,
272
306
  });
273
307
  this.reportSecrets(schema, full);
274
308
  await this.changed(id, false);
275
309
  return this.view(row, new Set(Object.keys(secrets)));
276
310
  }
311
+ /** The rows of {@link create}, in their own transaction (the caller publishes after the commit). */
312
+ async insertIn(a) {
313
+ const { orgId, id, input, actorAccountId, actorTokenId } = a;
314
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "channels.manage");
315
+ await this.assertAgent(orgId, input.agentId);
316
+ if (Object.keys(a.secrets).length > 0) {
317
+ await createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE).set(orgId, connectionSecretKey(id), JSON.stringify(a.secrets));
318
+ }
319
+ const inserted = await this.db
320
+ .insertInto("channel_connections")
321
+ .values({
322
+ id,
323
+ org_id: orgId,
324
+ plugin: input.plugin,
325
+ name: input.name,
326
+ agent_id: input.agentId,
327
+ config: JSON.stringify(a.plain),
328
+ unbound_policy: input.unboundPolicy ?? "bind",
329
+ bot_user_id: a.verified.botUserId,
330
+ tenant_id: a.verified.tenantId,
331
+ created_by: actorAccountId,
332
+ })
333
+ .returning(COLUMNS)
334
+ .executeTakeFirstOrThrow();
335
+ await audit(this.db.db, {
336
+ actorAccountId,
337
+ ...(actorTokenId !== undefined && { actorTokenId }),
338
+ orgId,
339
+ action: "channel.created",
340
+ target: id,
341
+ detail: { plugin: input.plugin, agentId: input.agentId },
342
+ });
343
+ return inserted;
344
+ }
277
345
  /**
278
346
  * 修改名称、agent、未绑定策略、启停,或轮换凭据(新配置同样先 `verify`,失败什么都不改)。
279
347
  * 插件在该组织停用时仍可轮换凭据,此时不 verify,返回 `verifySkipped: true`。
@@ -288,7 +356,7 @@ export class ChannelConnections {
288
356
  if (patch.config !== undefined) {
289
357
  const channel = this.channel(current.plugin);
290
358
  // 插件在该组织停用时也允许轮换(泄露的密钥要能立刻换掉),但不调用插件 verify:重新启用后长连接按新凭据连接
291
- const enabled = (await queryEnabledPlugins(this.deps.db, orgId)).has(current.plugin);
359
+ const enabled = (await queryEnabledPlugins(this.db.db, orgId)).has(current.plugin);
292
360
  const schema = channel.connectionSchema;
293
361
  const before = await this.readSecrets(orgId, id);
294
362
  const next = structuredClone(patch.config);
@@ -310,55 +378,15 @@ export class ChannelConnections {
310
378
  if (modeChanged && patch.inboundMode === "webhook")
311
379
  this.assertWebhookAvailable(current.plugin);
312
380
  if (patch.agentId !== undefined)
313
- await this.assertAgent(this.deps.db, orgId, patch.agentId);
314
- const row = await this.deps.db.transaction().execute(async (t) => {
315
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "channels.manage");
316
- if (patch.agentId !== undefined)
317
- await this.assertAgent(t, orgId, patch.agentId);
318
- if (rotated) {
319
- const secrets = createSecrets(t, this.deps.keyring, SECRETS_NAMESPACE);
320
- if (Object.keys(rotated.secrets).length > 0) {
321
- await secrets.set(orgId, connectionSecretKey(id), JSON.stringify(rotated.secrets));
322
- }
323
- else {
324
- await secrets.delete(orgId, connectionSecretKey(id));
325
- }
326
- }
327
- const updated = await t
328
- .updateTable("channel_connections")
329
- .set({
330
- ...(patch.name !== undefined && { name: patch.name }),
331
- ...(patch.agentId !== undefined && { agent_id: patch.agentId }),
332
- ...(patch.unboundPolicy !== undefined && { unbound_policy: patch.unboundPolicy }),
333
- ...(patch.status !== undefined && { status: patch.status }),
334
- ...(patch.inboundMode !== undefined && { inbound_mode: patch.inboundMode }),
335
- ...(rotated && { config: JSON.stringify(rotated.plain) }),
336
- // 跳过了 verify:机器人 id 与租户保留原值(重新启用后插件按新凭据连接,入站以连接行的租户判断外部人员)
337
- ...(verified && { bot_user_id: verified.botUserId, tenant_id: verified.tenantId }),
338
- ...((rotated || patch.status === "active") && { last_error: null }),
339
- updated_at: sql `now()`,
340
- })
341
- .where("id", "=", id)
342
- .where("org_id", "=", orgId)
343
- .where("deleted_at", "is", null)
344
- .returning(COLUMNS)
345
- .executeTakeFirst();
346
- if (!updated)
347
- throw notFound();
348
- await audit(t, {
349
- actorAccountId,
350
- ...(actorTokenId !== undefined && { actorTokenId }),
351
- orgId,
352
- action: "channel.updated",
353
- target: id,
354
- detail: {
355
- changed: [
356
- ...Object.keys(patch).filter((k) => k !== "config" && patch[k] !== undefined),
357
- ...(rotated ? ["config"] : []),
358
- ],
359
- },
360
- });
361
- return updated;
381
+ await this.assertAgent(orgId, patch.agentId);
382
+ const row = await this.updateIn({
383
+ orgId,
384
+ id,
385
+ patch,
386
+ rotated,
387
+ verified,
388
+ actorAccountId,
389
+ actorTokenId,
362
390
  });
363
391
  if (rotated)
364
392
  this.reportSecrets(rotated.schema, rotated.full);
@@ -366,50 +394,103 @@ export class ChannelConnections {
366
394
  if (rotated ||
367
395
  patch.status === "active" ||
368
396
  (modeChanged && patch.inboundMode === "long_connection")) {
369
- await this.deps.redis
397
+ await this.redis
370
398
  .del(channelBackoffKey(id), channelFailsKey(id))
371
- .catch((err) => this.deps.log.warn("cannot clear channel backoff", { err }));
399
+ .catch((err) => this.log.warn("cannot clear channel backoff", { err }));
372
400
  }
373
401
  // A mode switch also reconnects: the holder drops the long connection when going to webhook (F9)
374
402
  await this.changed(id, rotated !== undefined || patch.status !== undefined || modeChanged);
375
403
  if ((rotated || patch.status === "active") && row.status === "active") {
376
- await this.deps
377
- .onResume?.(id)
378
- .catch((err) => this.deps.log.warn("cannot resume channel deliveries", { err }));
404
+ await this.jobs
405
+ .resumeConnection(id)
406
+ .catch((err) => this.log.warn("cannot resume channel deliveries", { err }));
379
407
  }
380
408
  return { channel: await this.viewOf(row), verifySkipped };
381
409
  }
410
+ /** The rows of {@link update}, in their own transaction (the caller publishes after the commit). */
411
+ async updateIn(a) {
412
+ const { orgId, id, patch, rotated, verified, actorAccountId, actorTokenId } = a;
413
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "channels.manage");
414
+ if (patch.agentId !== undefined)
415
+ await this.assertAgent(orgId, patch.agentId);
416
+ if (rotated) {
417
+ const secrets = createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE);
418
+ if (Object.keys(rotated.secrets).length > 0) {
419
+ await secrets.set(orgId, connectionSecretKey(id), JSON.stringify(rotated.secrets));
420
+ }
421
+ else {
422
+ await secrets.delete(orgId, connectionSecretKey(id));
423
+ }
424
+ }
425
+ const updated = await this.db
426
+ .updateTable("channel_connections")
427
+ .set({
428
+ ...(patch.name !== undefined && { name: patch.name }),
429
+ ...(patch.agentId !== undefined && { agent_id: patch.agentId }),
430
+ ...(patch.unboundPolicy !== undefined && { unbound_policy: patch.unboundPolicy }),
431
+ ...(patch.status !== undefined && { status: patch.status }),
432
+ ...(patch.inboundMode !== undefined && { inbound_mode: patch.inboundMode }),
433
+ ...(rotated && { config: JSON.stringify(rotated.plain) }),
434
+ // 跳过了 verify:机器人 id 与租户保留原值(重新启用后插件按新凭据连接,入站以连接行的租户判断外部人员)
435
+ ...(verified && { bot_user_id: verified.botUserId, tenant_id: verified.tenantId }),
436
+ ...((rotated || patch.status === "active") && { last_error: null }),
437
+ updated_at: sql `now()`,
438
+ })
439
+ .where("id", "=", id)
440
+ .where("org_id", "=", orgId)
441
+ .where("deleted_at", "is", null)
442
+ .returning(COLUMNS)
443
+ .executeTakeFirst();
444
+ if (!updated)
445
+ throw notFound();
446
+ await audit(this.db.db, {
447
+ actorAccountId,
448
+ ...(actorTokenId !== undefined && { actorTokenId }),
449
+ orgId,
450
+ action: "channel.updated",
451
+ target: id,
452
+ detail: {
453
+ changed: [
454
+ ...Object.keys(patch).filter((k) => k !== "config" && patch[k] !== undefined),
455
+ ...(rotated ? ["config"] : []),
456
+ ],
457
+ },
458
+ });
459
+ return updated;
460
+ }
382
461
  /** 删除(软删除,同一事务删掉密钥);持有长连接的副本收到广播后断开。 */
383
462
  async remove(orgId, id, actorAccountId, actorTokenId) {
384
- await this.deps.db.transaction().execute(async (t) => {
385
- await lockOrgAndAuthorize(t, orgId, actorAccountId, "channels.manage");
386
- const r = await t
387
- .updateTable("channel_connections")
388
- .set({ deleted_at: sql `now()`, updated_at: sql `now()` })
389
- .where("id", "=", id)
390
- .where("org_id", "=", orgId)
391
- .where("deleted_at", "is", null)
392
- .executeTakeFirst();
393
- if (r.numUpdatedRows === 0n)
394
- throw notFound();
395
- await createSecrets(t, this.deps.keyring, SECRETS_NAMESPACE).delete(orgId, connectionSecretKey(id));
396
- await audit(t, {
397
- actorAccountId,
398
- ...(actorTokenId !== undefined && { actorTokenId }),
399
- orgId,
400
- action: "channel.deleted",
401
- target: id,
402
- });
403
- });
463
+ await this.removeIn(orgId, id, actorAccountId, actorTokenId);
404
464
  await this.changed(id, true);
405
465
  }
466
+ /** The rows of {@link remove}, in their own transaction (the caller publishes after the commit). */
467
+ async removeIn(orgId, id, actorAccountId, actorTokenId) {
468
+ await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "channels.manage");
469
+ const r = await this.db
470
+ .updateTable("channel_connections")
471
+ .set({ deleted_at: sql `now()`, updated_at: sql `now()` })
472
+ .where("id", "=", id)
473
+ .where("org_id", "=", orgId)
474
+ .where("deleted_at", "is", null)
475
+ .executeTakeFirst();
476
+ if (r.numUpdatedRows === 0n)
477
+ throw notFound();
478
+ await createSecrets(this.db.db, this.keyring, SECRETS_NAMESPACE).delete(orgId, connectionSecretKey(id));
479
+ await audit(this.db.db, {
480
+ actorAccountId,
481
+ ...(actorTokenId !== undefined && { actorTokenId }),
482
+ orgId,
483
+ action: "channel.deleted",
484
+ target: id,
485
+ });
486
+ }
406
487
  /** 提交后广播;失败只记日志(持有方每轮续租时也会复核连接状态)。 */
407
488
  async changed(connectionId, reconnect) {
408
489
  try {
409
- await this.deps.bus.publish(CHANNEL_CHANGED_TOPIC, { connectionId, reconnect });
490
+ await this.bus.publish(CHANNEL_CHANGED_TOPIC, { connectionId, reconnect });
410
491
  }
411
492
  catch (err) {
412
- this.deps.log.warn("channel.changed publish failed", { connectionId, err });
493
+ this.log.warn("channel.changed publish failed", { connectionId, err });
413
494
  }
414
495
  }
415
496
  /**
@@ -417,10 +498,10 @@ export class ChannelConnections {
417
498
  * `pluginEnabled` 为插件此刻是否在该组织启用(入站与卡片操作每次都实时复核)。
418
499
  */
419
500
  async row(id) {
420
- const r = await this.deps.db
501
+ const r = await this.db
421
502
  .selectFrom("channel_connections as c")
422
503
  .innerJoin("orgs", "orgs.id", "c.org_id")
423
- .leftJoin(enabledExtensionsByOrg(this.deps.db).as("p"), (j) => j.onRef("p.plugin", "=", "c.plugin").onRef("p.org_id", "=", "c.org_id"))
504
+ .leftJoin(enabledExtensionsByOrg(this.db.db).as("p"), (j) => j.onRef("p.plugin", "=", "c.plugin").onRef("p.org_id", "=", "c.org_id"))
424
505
  .select([
425
506
  "c.id",
426
507
  "c.org_id",
@@ -453,7 +534,7 @@ export class ChannelConnections {
453
534
  * 持有长连接的副本立即断开(扫描复核只是兜底)。只广播,失败只记日志。
454
535
  */
455
536
  async notifyOrgChanged(orgId, plugin) {
456
- let q = this.deps.db
537
+ let q = this.db.db
457
538
  .selectFrom("channel_connections")
458
539
  .select("id")
459
540
  .where("org_id", "=", orgId)
@@ -465,7 +546,7 @@ export class ChannelConnections {
465
546
  rows = await q.execute();
466
547
  }
467
548
  catch (err) {
468
- this.deps.log.warn("cannot list channel connections to notify", { orgId, err });
549
+ this.log.warn("cannot list channel connections to notify", { orgId, err });
469
550
  return;
470
551
  }
471
552
  for (const r of rows)
@@ -485,7 +566,7 @@ export class ChannelConnections {
485
566
  const entry = this.channelEntry(row.plugin);
486
567
  const channel = entry.impl;
487
568
  await this.assertEnabled(row.orgId, row.plugin);
488
- const stored = await this.deps.db
569
+ const stored = await this.db
489
570
  .selectFrom("channel_connections")
490
571
  .select("config")
491
572
  .where("id", "=", id)
@@ -505,7 +586,7 @@ export class ChannelConnections {
505
586
  async outbound(connectionId) {
506
587
  const { row, channel, config } = await this.runtime(connectionId);
507
588
  // 组织语言随每次发送 / 更新交给插件(Ruling A22);本次会话内不变
508
- const { locale } = await readOrgSettings(this.deps.db, row.orgId);
589
+ const { locale } = await readOrgSettings(this.db.db, row.orgId);
509
590
  return {
510
591
  row,
511
592
  features: channel.features,
@@ -531,4 +612,28 @@ export class ChannelConnections {
531
612
  async send(connectionId, target, message, idempotencyKey) {
532
613
  return (await this.outbound(connectionId)).send(target, message, idempotencyKey);
533
614
  }
534
- }
615
+ };
616
+ __decorate([
617
+ Transactional({ propagation: "requires_new" })
618
+ ], ChannelConnections.prototype, "insertIn", null);
619
+ __decorate([
620
+ Transactional({ propagation: "requires_new" })
621
+ ], ChannelConnections.prototype, "updateIn", null);
622
+ __decorate([
623
+ Transactional({ propagation: "requires_new" })
624
+ ], ChannelConnections.prototype, "removeIn", null);
625
+ ChannelConnections = __decorate([
626
+ Injectable(),
627
+ __param(0, Inject(KernelDb)),
628
+ __param(1, Inject(OrgLock)),
629
+ __param(2, Inject(KEYRING)),
630
+ __param(3, Inject(ExtensionRegistry)),
631
+ __param(4, Inject(KERNEL_BUS)),
632
+ __param(5, Inject(REDIS)),
633
+ __param(6, Inject(ChannelJobs)),
634
+ __param(7, Inject(KernelConfigService)),
635
+ __param(8, Inject(KernelEvents)),
636
+ __param(9, Inject(KERNEL_LOGGER)),
637
+ __param(10, Inject(TransactionHost))
638
+ ], ChannelConnections);
639
+ export { ChannelConnections };
@@ -1,13 +1,17 @@
1
1
  import type { ChannelCard, InboundEvent, InboundSender, Logger } from "@capybara-hq/plugin-sdk";
2
2
  import type { Redis } from "ioredis";
3
- import type { ConversationsService } from "../conversations/conversations.service.js";
4
- import type { KernelDb } from "../db/kernel-schema.js";
5
- import type { IdentityBinding } from "../identity/binding.js";
6
- import type { ExternalIdentities } from "../identity/external.js";
7
- import type { ApprovalsService } from "../tools/approvals.service.js";
8
- import type { QuestionsService } from "../tools/questions.service.js";
9
- import type { ChannelConnectionRow, ChannelConnections } from "./connections.service.js";
3
+ import { ConversationsService } from "../conversations/conversations.service.js";
4
+ import { IdentityBinding } from "../identity/binding.js";
5
+ import { ExternalIdentities } from "../identity/external.js";
6
+ import { KernelDb } from "../infra/database/kernel-db.js";
7
+ import { LockService } from "../infra/lock/lock.service.js";
8
+ import { DirectorySync } from "../orgs/directory-sync.js";
9
+ import { ApprovalsService } from "../tools/approvals.service.js";
10
+ import { QuestionsService } from "../tools/questions.service.js";
11
+ import { type ChannelConnectionRow, ChannelConnections } from "./connections.service.js";
12
+ import { ChannelJobs } from "./jobs.js";
10
13
  import { type ChannelLocale, type ChannelPhrase } from "./phrases.js";
14
+ import { AnonymousGuests } from "./threads.js";
11
15
  /** 入站消息去重键的保留时长(秒):平台在这段时间内重投同一条消息只处理一次。 */
12
16
  export declare const MESSAGE_DEDUPE_TTL_SECONDS = 86400;
13
17
  /** Dedupe key states: the enqueue is running (`pending`) or has succeeded (`done`). */
@@ -19,35 +23,6 @@ export declare const DEDUPE_PENDING_TTL_SECONDS = 60;
19
23
  export declare const messageDedupeKey: (connectionId: string, messageId: string) => string;
20
24
  /** 带平台事件 id 的卡片点击的去重键(Ruling A26,Redis 键,可以含 `:`)。 */
21
25
  export declare const actionDedupeKey: (connectionId: string, eventId: string) => string;
22
- /** 通讯录同步的投递接口(实现见 orgs/directory-sync.ts:按 (组织, 插件) 每分钟去重的维护队列任务)。 */
23
- export interface DirectorySyncScheduler {
24
- /** 返回值(如 job id)不使用。 */
25
- enqueue(orgId: string, plugin: string): Promise<unknown>;
26
- }
27
- /** 出站投递的投递接口(实现见 outbound.ts:把会话的新事件按 `channel_deliveries.last_seq` 续投到 IM)。 */
28
- export interface ChannelOutboundScheduler {
29
- enqueue(conversationId: string): Promise<void>;
30
- }
31
- /** 入站任务的投递接口(实现见 outbound.ts:同一队列 `cap-kernel-channels` 的 `inbound` 任务)。 */
32
- export interface ChannelInboundQueue {
33
- enqueueInbound(connectionId: string, event: InboundEvent, jobId: string): Promise<void>;
34
- }
35
- export interface ChannelInboundDeps {
36
- db: KernelDb;
37
- redis: Redis;
38
- connections: Pick<ChannelConnections, "row" | "send">;
39
- conversations: Pick<ConversationsService, "create" | "postUserMessage">;
40
- external: Pick<ExternalIdentities, "findAccount">;
41
- binding: Pick<IdentityBinding, "createBindToken">;
42
- directorySync: DirectorySyncScheduler;
43
- outbound: ChannelOutboundScheduler;
44
- /** 入站任务队列(`onEvent` 只去重并入队,处理在 worker 上执行 {@link ChannelInbound.handle})。 */
45
- queue: ChannelInboundQueue;
46
- /** 卡片操作:审批决定与提问回答(授权由这两个服务按点击者映射到的账号判定)。 */
47
- approvals: Pick<ApprovalsService, "decide">;
48
- questions: Pick<QuestionsService, "answer">;
49
- log: Pick<Logger, "warn" | "info">;
50
- }
51
26
  /**
52
27
  * 渠道入站(Ruling A21:持久化处理)。
53
28
  * - `onEvent`(插件 `connect` 的回调,必须快):消息按 `capk:channel-msg:<连接>:<消息>` `SET NX` 24 小时去重,
@@ -74,9 +49,30 @@ export interface ChannelInboundDeps {
74
49
  * 处理在写入用户消息之后失败而重试时,固定话术 / 卡片回复可能再发一次。
75
50
  */
76
51
  export declare class ChannelInbound {
77
- private readonly deps;
52
+ private readonly kdb;
53
+ private readonly redis;
54
+ /** The two-state dedupe markers (`lease` / `holderOf` / `releaseIf`; keys unchanged). */
55
+ private readonly locks;
56
+ private readonly connections;
57
+ private readonly conversations;
58
+ private readonly external;
59
+ private readonly binding;
60
+ /** 通讯录同步的投递(按 (组织, 插件) 每分钟去重的维护队列任务)。 */
61
+ private readonly directorySync;
62
+ /** The channel queue: inbound jobs (`onEvent` only dedupes and enqueues) and deliveries. */
63
+ private readonly jobs;
64
+ private readonly guests;
65
+ private readonly log;
78
66
  private readonly actions;
79
- constructor(deps: ChannelInboundDeps);
67
+ constructor(kdb: KernelDb, redis: Pick<Redis, "set">,
68
+ /** The two-state dedupe markers (`lease` / `holderOf` / `releaseIf`; keys unchanged). */
69
+ locks: Pick<LockService, "lease" | "holderOf" | "releaseIf">, connections: Pick<ChannelConnections, "row" | "send">, conversations: Pick<ConversationsService, "create" | "postUserMessage">, external: Pick<ExternalIdentities, "findAccount">, binding: Pick<IdentityBinding, "createBindToken">,
70
+ /** 通讯录同步的投递(按 (组织, 插件) 每分钟去重的维护队列任务)。 */
71
+ directorySync: Pick<DirectorySync, "enqueue">,
72
+ /** The channel queue: inbound jobs (`onEvent` only dedupes and enqueues) and deliveries. */
73
+ jobs: Pick<ChannelJobs, "enqueue" | "enqueueInbound">,
74
+ /** 卡片操作:审批决定与提问回答(授权由这两个服务按点击者映射到的账号判定)。 */
75
+ approvals: Pick<ApprovalsService, "decide">, questions: Pick<QuestionsService, "answer">, guests: Pick<AnonymousGuests, "ensure">, log: Pick<Logger, "warn" | "info">);
80
76
  /**
81
77
  * 插件 `onEvent`:去重并入队后返回(见类注释)。返回后插件才向平台确认;抛错时插件不确认。
82
78
  */