@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,46 +1,40 @@
1
1
  import type { Logger } from "@capybara-hq/plugin-sdk";
2
2
  import type { Redis } from "ioredis";
3
- import type { KernelConfig } from "../../config/schema.js";
4
- import type { KernelDb } from "../../db/kernel-schema.js";
5
- import { ApiError } from "../../errors.js";
6
- import type { Credentials } from "../credentials.js";
7
- /** 授权回调的路径(`http.publicUrl` + 它 = 注册给授权服务器的 redirect_uri)。 */
8
- export declare const OAUTH_CALLBACK_PATH = "/api/v1/oauth/callback";
9
- /** state 的有效期(秒)。 */
10
- export declare const OAUTH_STATE_TTL_SECONDS = 600;
11
- /** 浏览器绑定 Cookie:回调必须来自发起连接的同一个浏览器。 */
12
- export declare const OAUTH_BINDING_COOKIE = "cap_oauth";
13
- /** 回调失败、或连接时没给回跳页面时回到的网页(next-intl 会补语言前缀)。 */
14
- export declare const DEFAULT_RETURN_PATH = "/settings/connections";
15
- /** OAuth 连接器需要 `http.publicUrl`(回调地址);未配置 → 这条校验错误。 */
16
- export declare const publicUrlRequired: () => ApiError;
17
- export declare function callbackUrl(publicUrl: string): string;
18
- /**
19
- * 回跳页面只接受站内相对路径(防开放重定向):以单个 `/` 开头,不含 `\` 与控制字符,解析后仍在同一个源。
20
- */
21
- export declare function isSafeReturnPath(p: string): boolean;
3
+ import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
4
+ import { KernelDb } from "../../infra/database/kernel-db.js";
5
+ import { TransactionHost } from "../../infra/database/transaction-host.js";
6
+ import { OrgLock } from "../../orgs/org-lock.js";
7
+ import { ConnectorsService } from "../connectors.service.js";
8
+ import { Credentials } from "../credentials.js";
9
+ export { callbackUrl, DEFAULT_RETURN_PATH, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, publicUrlRequired, } from "./flow-paths.js";
22
10
  /** 一个有效的浏览器绑定值(复用请求里已有的,否则新生成)。 */
23
11
  export declare function browserBinding(existing: string | undefined): string;
24
12
  /** 回调失败的原因码(放进回跳 URL 的 `oauth_error`;不回显授权服务器的任何文本)。 */
25
13
  export type OAuthCallbackError = "state_invalid" | "session_mismatch" | "access_denied" | "provider_error" | "token_exchange_failed" | "issuer_mismatch" | "connector_unavailable";
26
14
  /** 首次连接后刷新工具清单最多等这么久再 302(超时则在后台继续,结果照常写入)。 */
27
15
  export declare const FIRST_CONNECT_REFRESH_WAIT_MS = 15000;
28
- export interface OAuthFlowDeps {
29
- db: KernelDb;
30
- redis: Redis;
31
- credentials: Credentials;
32
- config: () => KernelConfig;
33
- log: Logger;
34
- /** 某成员首次成功连接、而连接器还没有工具快照时调用(A16:用该成员的 token 刷新工具清单)。 */
35
- onFirstConnect: (orgId: string, connectorId: string, accountId: string) => Promise<void>;
36
- }
37
16
  /**
38
17
  * 授权码 + PKCE(S256)连接流程。state 是 32 字节随机串,存 Redis `capk:oauth-state:<state>` 10 分钟、单次有效
39
18
  * (GETDEL),内含组织、连接器、发起人、PKCE verifier、redirect_uri、回跳页面与浏览器绑定值的哈希。
40
19
  */
41
20
  export declare class OAuthFlow {
42
- private readonly deps;
43
- constructor(deps: OAuthFlowDeps);
21
+ private readonly db;
22
+ /** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
23
+ private readonly orgLock;
24
+ private readonly redis;
25
+ private readonly credentials;
26
+ private readonly config;
27
+ private readonly log;
28
+ /** A member's first connection without a tool snapshot refreshes the tools (A16). */
29
+ private readonly connectors;
30
+ readonly txHost: TransactionHost;
31
+ constructor(db: KernelDb,
32
+ /** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
33
+ orgLock: Pick<OrgLock, "lockAndAuthorize">, redis: Pick<Redis, "set" | "getdel">, credentials: Credentials, config: Pick<KernelConfigService, "get">, log: Logger,
34
+ /** A member's first connection without a tool snapshot refreshes the tools (A16). */
35
+ connectors: Pick<ConnectorsService, "refresh">, txHost: TransactionHost);
36
+ /** 某成员首次成功连接、而连接器还没有工具快照时(A16:用该成员的 token 刷新工具清单)。 */
37
+ private onFirstConnect;
44
38
  private app;
45
39
  /** 生成授权 URL。`binding` 为本浏览器的绑定值(由 controller 写入 Cookie)。 */
46
40
  start(orgId: string, connectorId: string, accountId: string, returnTo: string | undefined, binding: string): Promise<{
@@ -60,4 +54,10 @@ export declare class OAuthFlow {
60
54
  error?: string | undefined;
61
55
  iss?: string | undefined;
62
56
  }, binding: string | undefined): Promise<string>;
57
+ /**
58
+ * In the org row lock: re-checks that the member may still use connectors and the connector
59
+ * exists, stores the member's tokens with the audit row; true when the connector has no tool
60
+ * snapshot yet (the first connection).
61
+ */
62
+ private storeTokens;
63
63
  }
@@ -1,49 +1,33 @@
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 { createHash, randomBytes } from "node:crypto";
11
+ import { Inject, Injectable } from "@nestjs/common";
2
12
  import { ApiError } from "../../errors.js";
3
13
  import { audit } from "../../identity/audit.js";
4
- import { lockOrgAndAuthorize } from "../../orgs/org-lock.js";
14
+ import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
15
+ import { KernelDb } from "../../infra/database/kernel-db.js";
16
+ import { TransactionHost } from "../../infra/database/transaction-host.js";
17
+ import { Transactional } from "../../infra/database/transactional.decorator.js";
18
+ import { KERNEL_LOGGER, REDIS } from "../../infra/tokens.js";
19
+ import { OrgLock } from "../../orgs/org-lock.js";
20
+ import { ConnectorsService } from "../connectors.service.js";
21
+ import { Credentials } from "../credentials.js";
5
22
  import { oauthHttpOptions } from "./discovery.js";
23
+ import { callbackUrl, DEFAULT_RETURN_PATH, OAUTH_STATE_TTL_SECONDS, publicUrlRequired, } from "./flow-paths.js";
6
24
  import { tokenRequest } from "./tokens.js";
7
- /** 授权回调的路径(`http.publicUrl` + 它 = 注册给授权服务器的 redirect_uri)。 */
8
- export const OAUTH_CALLBACK_PATH = "/api/v1/oauth/callback";
9
- /** state 的有效期(秒)。 */
10
- export const OAUTH_STATE_TTL_SECONDS = 600;
11
- /** 浏览器绑定 Cookie:回调必须来自发起连接的同一个浏览器。 */
12
- export const OAUTH_BINDING_COOKIE = "cap_oauth";
13
- /** 回调失败、或连接时没给回跳页面时回到的网页(next-intl 会补语言前缀)。 */
14
- export const DEFAULT_RETURN_PATH = "/settings/connections";
25
+ export { callbackUrl, DEFAULT_RETURN_PATH, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, publicUrlRequired, } from "./flow-paths.js";
15
26
  const stateKey = (state) => `capk:oauth-state:${state}`;
16
27
  const STATE_RE = /^[A-Za-z0-9_-]{43}$/;
17
28
  const BINDING_RE = /^[A-Za-z0-9_-]{43}$/;
18
29
  const b64url = (n = 32) => randomBytes(n).toString("base64url");
19
30
  const sha256 = (s) => createHash("sha256").update(s).digest("base64url");
20
- /** OAuth 连接器需要 `http.publicUrl`(回调地址);未配置 → 这条校验错误。 */
21
- export const publicUrlRequired = () => new ApiError("validation_failed", "Request validation failed", [
22
- {
23
- path: "auth",
24
- message: "OAuth connectors require http.publicUrl to be configured (it is used to build the OAuth callback URL)",
25
- },
26
- ]);
27
- export function callbackUrl(publicUrl) {
28
- return `${publicUrl.replace(/\/+$/, "")}${OAUTH_CALLBACK_PATH}`;
29
- }
30
- /**
31
- * 回跳页面只接受站内相对路径(防开放重定向):以单个 `/` 开头,不含 `\` 与控制字符,解析后仍在同一个源。
32
- */
33
- export function isSafeReturnPath(p) {
34
- if (p.length > 500 || !p.startsWith("/") || p.startsWith("//"))
35
- return false;
36
- // biome-ignore lint/suspicious/noControlCharactersInRegex: 正是要拒绝控制字符
37
- if (/[\\\u0000-\u001f\u007f]/.test(p))
38
- return false;
39
- const base = "https://return.invalid";
40
- try {
41
- return new URL(p, base).origin === base;
42
- }
43
- catch {
44
- return false;
45
- }
46
- }
47
31
  /** 一个有效的浏览器绑定值(复用请求里已有的,否则新生成)。 */
48
32
  export function browserBinding(existing) {
49
33
  return existing !== undefined && BINDING_RE.test(existing) ? existing : b64url();
@@ -54,13 +38,37 @@ export const FIRST_CONNECT_REFRESH_WAIT_MS = 15_000;
54
38
  * 授权码 + PKCE(S256)连接流程。state 是 32 字节随机串,存 Redis `capk:oauth-state:<state>` 10 分钟、单次有效
55
39
  * (GETDEL),内含组织、连接器、发起人、PKCE verifier、redirect_uri、回跳页面与浏览器绑定值的哈希。
56
40
  */
57
- export class OAuthFlow {
58
- deps;
59
- constructor(deps) {
60
- this.deps = deps;
41
+ let OAuthFlow = class OAuthFlow {
42
+ db;
43
+ orgLock;
44
+ redis;
45
+ credentials;
46
+ config;
47
+ log;
48
+ connectors;
49
+ txHost;
50
+ constructor(db,
51
+ /** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
52
+ orgLock, redis, credentials, config, log,
53
+ /** A member's first connection without a tool snapshot refreshes the tools (A16). */
54
+ connectors, txHost) {
55
+ this.db = db;
56
+ this.orgLock = orgLock;
57
+ this.redis = redis;
58
+ this.credentials = credentials;
59
+ this.config = config;
60
+ this.log = log;
61
+ this.connectors = connectors;
62
+ this.txHost = txHost;
63
+ }
64
+ /** 某成员首次成功连接、而连接器还没有工具快照时(A16:用该成员的 token 刷新工具清单)。 */
65
+ async onFirstConnect(orgId, connectorId, accountId) {
66
+ await this.connectors.refresh(orgId, connectorId, accountId, undefined, {
67
+ trigger: "first_connect",
68
+ });
61
69
  }
62
70
  async app(orgId, connectorId) {
63
- return this.deps.db
71
+ return this.db
64
72
  .selectFrom("connectors")
65
73
  .select(["id", "auth", "status"])
66
74
  .where("id", "=", connectorId)
@@ -70,7 +78,7 @@ export class OAuthFlow {
70
78
  }
71
79
  /** 生成授权 URL。`binding` 为本浏览器的绑定值(由 controller 写入 Cookie)。 */
72
80
  async start(orgId, connectorId, accountId, returnTo, binding) {
73
- const publicUrl = this.deps.config().http.publicUrl;
81
+ const publicUrl = this.config.get().http.publicUrl;
74
82
  if (!publicUrl)
75
83
  throw publicUrlRequired();
76
84
  const app = await this.app(orgId, connectorId);
@@ -89,7 +97,7 @@ export class OAuthFlow {
89
97
  { path: "status", message: "The connector is disabled; ask an administrator to enable it" },
90
98
  ]);
91
99
  }
92
- const client = await this.deps.credentials.oauthClient(orgId, connectorId);
100
+ const client = await this.credentials.oauthClient(orgId, connectorId);
93
101
  if (!client?.authorizationEndpoint) {
94
102
  throw new ApiError("connector.connect_failed", "The connector has no registered OAuth client; ask an administrator to reinstall it");
95
103
  }
@@ -106,7 +114,7 @@ export class OAuthFlow {
106
114
  binding: sha256(binding),
107
115
  ...(client.issuer !== undefined && { issuer: client.issuer }),
108
116
  };
109
- await this.deps.redis.set(stateKey(state), JSON.stringify(rec), "EX", OAUTH_STATE_TTL_SECONDS);
117
+ await this.redis.set(stateKey(state), JSON.stringify(rec), "EX", OAUTH_STATE_TTL_SECONDS);
110
118
  const url = new URL(client.authorizationEndpoint);
111
119
  url.searchParams.set("response_type", "code");
112
120
  url.searchParams.set("client_id", client.clientId);
@@ -122,7 +130,7 @@ export class OAuthFlow {
122
130
  }
123
131
  /** 回跳地址:`http.publicUrl` + 站内路径 + 结果参数(未配置 publicUrl 时为相对地址)。 */
124
132
  redirect(path, param) {
125
- const base = (this.deps.config().http.publicUrl ?? "").replace(/\/+$/, "");
133
+ const base = (this.config.get().http.publicUrl ?? "").replace(/\/+$/, "");
126
134
  const u = new URL(path, "https://return.invalid");
127
135
  u.searchParams.set(param[0], param[1]);
128
136
  return `${base}${u.pathname}${u.search}${u.hash}`;
@@ -139,7 +147,7 @@ export class OAuthFlow {
139
147
  const state = query.state;
140
148
  if (state === undefined || !STATE_RE.test(state))
141
149
  return this.fail("state_invalid");
142
- const raw = await this.deps.redis.getdel(stateKey(state));
150
+ const raw = await this.redis.getdel(stateKey(state));
143
151
  if (raw === null)
144
152
  return this.fail("state_invalid");
145
153
  const rec = JSON.parse(raw);
@@ -158,7 +166,7 @@ export class OAuthFlow {
158
166
  return this.fail("provider_error", back);
159
167
  const { orgId, connectorId, accountId } = rec;
160
168
  const app = await this.app(orgId, connectorId);
161
- const client = app ? await this.deps.credentials.oauthClient(orgId, connectorId) : null;
169
+ const client = app ? await this.credentials.oauthClient(orgId, connectorId) : null;
162
170
  if (!app || !client || app.auth.type !== "oauth_code") {
163
171
  return this.fail("connector_unavailable", back);
164
172
  }
@@ -170,41 +178,15 @@ export class OAuthFlow {
170
178
  redirect_uri: rec.redirectUri,
171
179
  code_verifier: rec.verifier,
172
180
  resource: client.resource,
173
- }, oauthHttpOptions(this.deps.config()));
181
+ }, oauthHttpOptions(this.config.get()));
174
182
  }
175
183
  catch (e) {
176
- this.deps.log.warn("oauth code exchange failed", { orgId, connectorId, err: e });
184
+ this.log.warn("oauth code exchange failed", { orgId, connectorId, err: e });
177
185
  return this.fail("token_exchange_failed", back);
178
186
  }
179
187
  let first;
180
188
  try {
181
- first = await this.deps.db.transaction().execute(async (t) => {
182
- await lockOrgAndAuthorize(t, orgId, accountId, "connectors.use");
183
- const still = await t
184
- .selectFrom("connectors")
185
- .select("id")
186
- .where("id", "=", connectorId)
187
- .where("deleted_at", "is", null)
188
- .forUpdate()
189
- .executeTakeFirst();
190
- if (!still)
191
- throw new ApiError("connector.not_found", "Connector not found");
192
- await this.deps.credentials.setOAuthTokens(orgId, connectorId, { kind: "user", accountId }, tokens, t);
193
- await audit(t, {
194
- actorAccountId: accountId,
195
- orgId,
196
- action: "connector.credential.set",
197
- target: connectorId,
198
- detail: { type: "oauth_code", ownership: "personal" },
199
- });
200
- const tool = await t
201
- .selectFrom("connector_tools")
202
- .select("name")
203
- .where("connector_id", "=", connectorId)
204
- .limit(1)
205
- .executeTakeFirst();
206
- return tool === undefined;
207
- });
189
+ first = await this.storeTokens(orgId, connectorId, accountId, tokens);
208
190
  }
209
191
  catch (e) {
210
192
  if (e instanceof ApiError)
@@ -214,10 +196,8 @@ export class OAuthFlow {
214
196
  if (first) {
215
197
  // 首次连接(A16):刷新失败不影响连接本身,凭据已存好;管理员之后可手动刷新
216
198
  // 最多等 FIRST_CONNECT_REFRESH_WAIT_MS 再回跳(本请求自己的计时器,结束即清除);超时的刷新在后台继续
217
- const refresh = this.deps
218
- .onFirstConnect(orgId, connectorId, accountId)
219
- .catch((err) => {
220
- this.deps.log.warn("oauth first-connect tool refresh failed", {
199
+ const refresh = this.onFirstConnect(orgId, connectorId, accountId).catch((err) => {
200
+ this.log.warn("oauth first-connect tool refresh failed", {
221
201
  orgId,
222
202
  connectorId,
223
203
  err,
@@ -234,4 +214,52 @@ export class OAuthFlow {
234
214
  }
235
215
  return this.redirect(back, ["connected", connectorId]);
236
216
  }
237
- }
217
+ /**
218
+ * In the org row lock: re-checks that the member may still use connectors and the connector
219
+ * exists, stores the member's tokens with the audit row; true when the connector has no tool
220
+ * snapshot yet (the first connection).
221
+ */
222
+ async storeTokens(orgId, connectorId, accountId, tokens) {
223
+ const t = this.db.db;
224
+ await this.orgLock.lockAndAuthorize(orgId, accountId, "connectors.use");
225
+ const still = await t
226
+ .selectFrom("connectors")
227
+ .select("id")
228
+ .where("id", "=", connectorId)
229
+ .where("deleted_at", "is", null)
230
+ .forUpdate()
231
+ .executeTakeFirst();
232
+ if (!still)
233
+ throw new ApiError("connector.not_found", "Connector not found");
234
+ await this.credentials.setOAuthTokens(orgId, connectorId, { kind: "user", accountId }, tokens);
235
+ await audit(t, {
236
+ actorAccountId: accountId,
237
+ orgId,
238
+ action: "connector.credential.set",
239
+ target: connectorId,
240
+ detail: { type: "oauth_code", ownership: "personal" },
241
+ });
242
+ const tool = await t
243
+ .selectFrom("connector_tools")
244
+ .select("name")
245
+ .where("connector_id", "=", connectorId)
246
+ .limit(1)
247
+ .executeTakeFirst();
248
+ return tool === undefined;
249
+ }
250
+ };
251
+ __decorate([
252
+ Transactional()
253
+ ], OAuthFlow.prototype, "storeTokens", null);
254
+ OAuthFlow = __decorate([
255
+ Injectable(),
256
+ __param(0, Inject(KernelDb)),
257
+ __param(1, Inject(OrgLock)),
258
+ __param(2, Inject(REDIS)),
259
+ __param(3, Inject(Credentials)),
260
+ __param(4, Inject(KernelConfigService)),
261
+ __param(5, Inject(KERNEL_LOGGER)),
262
+ __param(6, Inject(ConnectorsService)),
263
+ __param(7, Inject(TransactionHost))
264
+ ], OAuthFlow);
265
+ export { OAuthFlow };
@@ -1,9 +1,9 @@
1
1
  import type { FastifyReply, FastifyRequest } from "fastify";
2
2
  import { z } from "zod";
3
- import type { KernelConfig } from "../../config/schema.js";
4
3
  import { type Principal } from "../../identity/principal.js";
4
+ import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
5
5
  import { type OrgContext } from "../../orgs/org.guard.js";
6
- import { type OAuthFlow } from "./flow.js";
6
+ import { OAuthFlow } from "./flow.js";
7
7
  declare const ConnectBody: z.ZodObject<{
8
8
  returnTo: z.ZodOptional<z.ZodString>;
9
9
  }, z.core.$strict>;
@@ -14,7 +14,7 @@ declare const ConnectBody: z.ZodObject<{
14
14
  export declare class OAuthConnectController {
15
15
  private readonly flow;
16
16
  private readonly config;
17
- constructor(flow: OAuthFlow, config: () => KernelConfig);
17
+ constructor(flow: OAuthFlow, config: KernelConfigService);
18
18
  connect(principal: Principal, org: OrgContext, connectorId: string, body: z.infer<typeof ConnectBody>, req: FastifyRequest, reply: FastifyReply): Promise<{
19
19
  authorizationUrl: string;
20
20
  }>;
@@ -7,13 +7,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
- import { Body, Controller, Get, HttpCode, Inject, Param, Post, Query, Req, Res, } from "@nestjs/common";
10
+ import { Controller, Get, HttpCode, Inject, Param, Post, Query, Req, Res } from "@nestjs/common";
11
11
  import { z } from "zod";
12
- import { KERNEL_CONFIG, OAUTH_FLOW } from "../../http/tokens.js";
13
- import { ZodPipe } from "../../http/zod.pipe.js";
14
12
  import { CurrentPrincipal, Public, requireUser } from "../../identity/principal.js";
13
+ import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
14
+ import { createZodDto } from "../../infra/validation/create-zod-dto.js";
15
+ import { ZBody } from "../../infra/validation/zod-params.js";
15
16
  import { CurrentOrg, OrgAction } from "../../orgs/org.guard.js";
16
- import { browserBinding, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, } from "./flow.js";
17
+ import { browserBinding, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, OAuthFlow, } from "./flow.js";
17
18
  const ConnectBody = z
18
19
  .object({
19
20
  returnTo: z
@@ -23,6 +24,8 @@ const ConnectBody = z
23
24
  .optional(),
24
25
  })
25
26
  .strict();
27
+ class OAuthConnectBody extends createZodDto(ConnectBody, "OAuthConnectBody") {
28
+ }
26
29
  /** 查询参数只取单值字符串(重复参数 / 数组按缺失处理)。 */
27
30
  const one = (v) => typeof v === "string" && v.length <= 4096 ? v : undefined;
28
31
  /**
@@ -44,7 +47,7 @@ let OAuthConnectController = class OAuthConnectController {
44
47
  path: OAUTH_CALLBACK_PATH,
45
48
  httpOnly: true,
46
49
  sameSite: "lax",
47
- secure: this.config().auth.cookieSecure,
50
+ secure: this.config.get().auth.cookieSecure,
48
51
  maxAge: OAUTH_STATE_TTL_SECONDS,
49
52
  });
50
53
  return out;
@@ -57,14 +60,14 @@ __decorate([
57
60
  __param(0, CurrentPrincipal()),
58
61
  __param(1, CurrentOrg()),
59
62
  __param(2, Param("connectorId")),
60
- __param(3, Body(new ZodPipe(ConnectBody))),
63
+ __param(3, ZBody(OAuthConnectBody)),
61
64
  __param(4, Req()),
62
65
  __param(5, Res({ passthrough: true }))
63
66
  ], OAuthConnectController.prototype, "connect", null);
64
67
  OAuthConnectController = __decorate([
65
68
  Controller("api/v1/orgs/:orgId/connectors"),
66
- __param(0, Inject(OAUTH_FLOW)),
67
- __param(1, Inject(KERNEL_CONFIG))
69
+ __param(0, Inject(OAuthFlow)),
70
+ __param(1, Inject(KernelConfigService))
68
71
  ], OAuthConnectController);
69
72
  export { OAuthConnectController };
70
73
  /**
@@ -90,6 +93,6 @@ __decorate([
90
93
  ], OAuthCallbackController.prototype, "callback", null);
91
94
  OAuthCallbackController = __decorate([
92
95
  Controller("api/v1/oauth"),
93
- __param(0, Inject(OAUTH_FLOW))
96
+ __param(0, Inject(OAuthFlow))
94
97
  ], OAuthCallbackController);
95
98
  export { OAuthCallbackController };
@@ -1,6 +1,7 @@
1
1
  import type { Logger } from "@capybara-hq/plugin-sdk";
2
2
  import { ToolError } from "@capybara-hq/plugin-sdk";
3
3
  import type { Redis } from "ioredis";
4
+ import type { LockService } from "../../infra/lock/lock.service.js";
4
5
  import { type OAuthHttpOptions } from "./discovery.js";
5
6
  export type TokenAuthMethod = "client_secret_basic" | "client_secret_post" | "none";
6
7
  /**
@@ -83,17 +84,24 @@ export type TokenAuth = {
83
84
  *
84
85
  * - 调用前:未过期(距过期 > 60 秒或未告知过期时间)直接用;否则刷新(授权码流用 refresh token,客户端凭据流重新取)。
85
86
  * - 收到 401:`forceRefresh(stale)`——只要库里的 token 仍是收到 401 的那个就刷新。
86
- * - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>` 内进行(SET NX PX,值为本次随机 id,
87
- * 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
87
+ * - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>` 内进行(`LockService.lease`,值为
88
+ * 本次随机 id,`releaseIf` 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
88
89
  * 轮换 refresh token 时,并发刷新的第二个必然失败)。
89
90
  * - 令牌端点明确拒绝 → 删除该凭据并抛 OAuthReconnectRequired(需要重新连接);暂时不可用 → OAuthUnavailable,凭据保留。
90
91
  */
91
92
  export declare class OAuthTokens {
92
93
  private readonly store;
94
+ /** The lease primitives of `LockService` (the key is used as is: no `lock:` prefix). */
95
+ private readonly locks;
96
+ /** Polls whether another holder still has the lock. */
93
97
  private readonly redis;
94
98
  private readonly http;
95
99
  private readonly log;
96
- constructor(store: OAuthStore, redis: Redis, http: () => OAuthHttpOptions, log: Logger);
100
+ constructor(store: OAuthStore,
101
+ /** The lease primitives of `LockService` (the key is used as is: no `lock:` prefix). */
102
+ locks: Pick<LockService, "lease" | "releaseIf" | "renew">,
103
+ /** Polls whether another holder still has the lock. */
104
+ redis: Pick<Redis, "exists">, http: () => OAuthHttpOptions, log: Logger);
97
105
  accessToken(orgId: string, connectorId: string, auth: TokenAuth, owner: OAuthOwner): Promise<string>;
98
106
  /** 收到 401 后调用:`stale` 为收到 401 的那个 access token。 */
99
107
  forceRefresh(orgId: string, connectorId: string, auth: TokenAuth, owner: OAuthOwner, stale: string | undefined): Promise<void>;
@@ -102,30 +102,30 @@ export async function tokenRequest(client, params, http) {
102
102
  ...(typeof scope === "string" && { scope }),
103
103
  };
104
104
  }
105
- const RELEASE = `
106
- if redis.call('GET', KEYS[1]) == ARGV[1] then
107
- return redis.call('DEL', KEYS[1])
108
- end
109
- return 0
110
- `;
111
105
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
112
106
  /**
113
107
  * access token 的获取与刷新。
114
108
  *
115
109
  * - 调用前:未过期(距过期 > 60 秒或未告知过期时间)直接用;否则刷新(授权码流用 refresh token,客户端凭据流重新取)。
116
110
  * - 收到 401:`forceRefresh(stale)`——只要库里的 token 仍是收到 401 的那个就刷新。
117
- * - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>` 内进行(SET NX PX,值为本次随机 id,
118
- * 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
111
+ * - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>` 内进行(`LockService.lease`,值为
112
+ * 本次随机 id,`releaseIf` 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
119
113
  * 轮换 refresh token 时,并发刷新的第二个必然失败)。
120
114
  * - 令牌端点明确拒绝 → 删除该凭据并抛 OAuthReconnectRequired(需要重新连接);暂时不可用 → OAuthUnavailable,凭据保留。
121
115
  */
122
116
  export class OAuthTokens {
123
117
  store;
118
+ locks;
124
119
  redis;
125
120
  http;
126
121
  log;
127
- constructor(store, redis, http, log) {
122
+ constructor(store,
123
+ /** The lease primitives of `LockService` (the key is used as is: no `lock:` prefix). */
124
+ locks,
125
+ /** Polls whether another holder still has the lock. */
126
+ redis, http, log) {
128
127
  this.store = store;
128
+ this.locks = locks;
129
129
  this.redis = redis;
130
130
  this.http = http;
131
131
  this.log = log;
@@ -165,7 +165,7 @@ export class OAuthTokens {
165
165
  const replaced = (rec) => rec !== null && rec.access_token !== stale ? rec.access_token : undefined;
166
166
  for (;;) {
167
167
  const id = randomUUID();
168
- if ((await this.redis.set(key, id, "PX", ttlMs, "NX")) === "OK") {
168
+ if (await this.locks.lease(key, id, ttlMs)) {
169
169
  try {
170
170
  const rec = await this.store.readTokens(orgId, connectorId, owner);
171
171
  const done = replaced(rec);
@@ -173,10 +173,10 @@ export class OAuthTokens {
173
173
  return done;
174
174
  if (rec === null && auth.type === "oauth_code")
175
175
  throw new OAuthReconnectRequired(owner);
176
- return await this.obtain(orgId, connectorId, auth, owner, rec, key, id);
176
+ return await this.obtain(orgId, connectorId, auth, owner, rec, key, id, ttlMs);
177
177
  }
178
178
  finally {
179
- await this.redis.eval(RELEASE, 1, key, id).catch((err) => {
179
+ await this.locks.releaseIf(key, id).catch((err) => {
180
180
  this.log.warn("oauth refresh lock release failed", { connectorId, err });
181
181
  });
182
182
  }
@@ -198,7 +198,7 @@ export class OAuthTokens {
198
198
  * 锁内:向令牌端点要新 token 并写回。作废前做围栏检查:锁仍归自己、库里的 token 仍是这次用掉的那组——
199
199
  * 锁过期后另一个刷新者若已写入新 token,就直接用它而不是删掉它。
200
200
  */
201
- async obtain(orgId, connectorId, auth, owner, rec, lockKey, lockId) {
201
+ async obtain(orgId, connectorId, auth, owner, rec, lockKey, lockId, lockTtlMs) {
202
202
  const client = await this.store.readClient(orgId, connectorId);
203
203
  if (!client)
204
204
  throw new OAuthReconnectRequired({ kind: "org" });
@@ -210,7 +210,8 @@ export class OAuthTokens {
210
210
  current.refresh_token === rec.refresh_token;
211
211
  if (current !== null && !unchanged)
212
212
  return current.access_token;
213
- if (current !== null && (await this.redis.get(lockKey)) !== lockId) {
213
+ // still ours (renewing a held lease is harmless right before the delete)
214
+ if (current !== null && !(await this.locks.renew(lockKey, lockId, lockTtlMs))) {
214
215
  // 锁已不归自己(过期):不删,交给持锁者;这次按暂时不可用处理
215
216
  throw new OAuthUnavailable();
216
217
  }
@@ -1,5 +1,6 @@
1
- import type { KernelConfig } from "../config/schema.js";
2
- import type { KernelDb } from "../db/kernel-schema.js";
1
+ import type { KernelSchemaDb } from "../db/kernel-schema.js";
2
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
3
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
4
  /** 文本行数(按 `\n` 切分;空串算 1 行,与按行分页读取一致)。 */
4
5
  export declare function countLines(s: string): number;
5
6
  export interface SavedOutput {
@@ -14,12 +15,13 @@ export interface OutputScope {
14
15
  }
15
16
  /**
16
17
  * 输出存档(spec 5.4):超大工具结果的全文存进 `capybara.tool_outputs`,保留 `tools.outputRetentionDays` 天。
17
- * 只能在产生它的会话里读取(同组织别的会话也不行:会话之间可见范围不同),过期即视为不存在(清理由维护任务负责)。
18
+ * 只能在产生它的会话里读取(同组织别的会话也不行:会话之间可见范围不同),过期即视为不存在(清理由
19
+ * `output-cleanup` 每小时一次,见 {@link deleteExpiredOutputs})。
18
20
  */
19
21
  export declare class ToolOutputs {
20
22
  private readonly db;
21
23
  private readonly config;
22
- constructor(db: KernelDb, config: () => KernelConfig);
24
+ constructor(db: KernelDb, config: Pick<KernelConfigService, "get">);
23
25
  save(a: {
24
26
  orgId: string;
25
27
  conversationId: string;
@@ -29,6 +31,13 @@ export declare class ToolOutputs {
29
31
  /** 读本会话未过期的存档全文;不存在 / 过期 / 属于别的会话或组织 → null。 */
30
32
  load(scope: OutputScope, id: string): Promise<string | null>;
31
33
  }
34
+ /** Rows deleted per statement by {@link deleteExpiredOutputs}. */
35
+ export declare const OUTPUT_CLEANUP_BATCH = 1000;
36
+ /**
37
+ * 删除已过期(`expires_at < now()`)的输出存档,每批 `batch` 行,直到删完;返回删除的总行数。
38
+ * 每批一条独立语句(不开长事务);多个 worker 同时清理时 `SKIP LOCKED` 互不等待。
39
+ */
40
+ export declare function deleteExpiredOutputs(db: KernelSchemaDb, batch?: number): Promise<number>;
32
41
  /** 存档不存在 / 过期 / 不属于本会话(模型可见,英文;不区分几种情况,不泄露别处的存档是否存在)。 */
33
42
  export declare const outputNotFoundText: (id: string) => string;
34
43
  /**