@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
@@ -7,14 +7,17 @@ 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 } from "@nestjs/common";
10
+ import { Controller, Get, HttpCode, Inject, Param, Post } from "@nestjs/common";
11
11
  import { z } from "zod";
12
- import { QUESTIONS } from "../http/tokens.js";
13
- import { ZodPipe } from "../http/zod.pipe.js";
14
12
  import { CurrentPrincipal, requireUser } from "../identity/principal.js";
13
+ import { createZodDto } from "../infra/validation/create-zod-dto.js";
14
+ import { ZBody } from "../infra/validation/zod-params.js";
15
15
  import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
16
+ import { QuestionsService } from "./questions.service.js";
16
17
  /** 回答体:`answer` 的形状由服务按表单校验(`validateAnswer`,不符 → `validation_failed`)。 */
17
18
  const AnswerBody = z.object({ answer: z.record(z.string().max(200), z.unknown()) }).strict();
19
+ class QuestionAnswerBody extends createZodDto(AnswerBody, "QuestionAnswerBody") {
20
+ }
18
21
  /**
19
22
  * 输入请求(`ask_user`、插件工具的 `input_required`):`/api/v1/orgs/:orgId/questions`。
20
23
  * 动作用 `approvals.decide`(访客起、仅限用户主体):回答必须由人做出,agent / 服务令牌不能代答;
@@ -49,10 +52,10 @@ __decorate([
49
52
  __param(0, CurrentPrincipal()),
50
53
  __param(1, CurrentOrg()),
51
54
  __param(2, Param("id")),
52
- __param(3, Body(new ZodPipe(AnswerBody)))
55
+ __param(3, ZBody(QuestionAnswerBody))
53
56
  ], QuestionsController.prototype, "answer", null);
54
57
  QuestionsController = __decorate([
55
58
  Controller("api/v1/orgs/:orgId/questions"),
56
- __param(0, Inject(QUESTIONS))
59
+ __param(0, Inject(QuestionsService))
57
60
  ], QuestionsController);
58
61
  export { QuestionsController };
@@ -1,9 +1,9 @@
1
- import { type FormAnswer, type InputForm, type Logger } from "@capybara-hq/plugin-sdk";
2
- import { type Transaction } from "kysely";
3
- import type { KernelConfig } from "../config/schema.js";
4
- import type { EventLog } from "../conversations/event-log.js";
5
- import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
6
- type Trx = Transaction<KernelDatabase>;
1
+ import { type FormAnswer, type InputForm } from "@capybara-hq/plugin-sdk";
2
+ import { EventLog } from "../conversations/event-log.js";
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 { KernelEvents } from "../infra/events/kernel-events.js";
7
7
  export type QuestionStatus = "pending" | "answered" | "expired" | "cancelled";
8
8
  /** 一条输入请求(`ask_user`、插件工具的 `input_required`、MCP elicitation 共用)。 */
9
9
  export interface QuestionRecord {
@@ -37,31 +37,30 @@ export interface QuestionAskInput {
37
37
  form: InputForm;
38
38
  state: unknown;
39
39
  }
40
- export interface QuestionsServiceDeps {
41
- db: KernelDb;
42
- eventLog: EventLog;
43
- config: () => KernelConfig;
44
- log: Pick<Logger, "warn">;
45
- /**
46
- * 回答提交之后调用(恰好一次:只有把 pending 改掉的那次回答会调用),用于续跑。失败只记日志(回答已生效)。
47
- */
48
- onAnswered?: (question: QuestionRecord) => Promise<void>;
49
- }
50
40
  /** 网页读取输入请求的视图(不含插件 state:那是工具内部的续跑数据)。 */
51
41
  export type QuestionView = Omit<QuestionRecord, "state">;
52
42
  /**
53
43
  * 输入请求:新建(tools 节点)、回答(只有对话发起人)、超时与取消(等待机制)。
54
44
  * 状态全部在 PG:回答 / 超时 / 取消都在事务里 `SELECT … FOR UPDATE` 该行,多副本并发时恰好一个生效,
55
45
  * 只有生效的那次写 `question_answered`。HTTP 接口见 questions.controller.ts。
46
+ *
47
+ * An answer is announced after the commit as the domain event `question.answered` (exactly once),
48
+ * which the run's waits follow to resume it (spec §3b; the wait sweep resumes a run whose resume was
49
+ * lost). Events are appended in the context's transaction (`EventLog.appendIn`).
56
50
  */
57
51
  export declare class QuestionsService {
58
- private readonly deps;
59
- constructor(deps: QuestionsServiceDeps);
52
+ private readonly db;
53
+ private readonly config;
54
+ private readonly eventLog;
55
+ private readonly events;
56
+ readonly txHost: TransactionHost;
57
+ constructor(db: KernelDb, config: Pick<KernelConfigService, "get">, eventLog: Pick<EventLog, "appendIn" | "notify">, events: Pick<KernelEvents, "emit">, txHost: TransactionHost);
60
58
  /**
61
59
  * 新建 pending 输入请求(`expires_at` = 现在 + `tools.approvalTimeoutHours`)并写 `question_asked`,同一事务。
62
60
  * 按 (run_id, call_id, attempt) 幂等:已存在则返回已有记录,事件按 `question_asked:<id>` 幂等。
63
61
  */
64
62
  ask(input: QuestionAskInput): Promise<QuestionRecord>;
63
+ private askIn;
65
64
  /**
66
65
  * 读一条输入请求(网页展示表单用):只有该运行的发起人(其他人 → 403 `forbidden`);
67
66
  * 不属于该组织 / 不存在 → `question.not_found`。
@@ -76,6 +75,7 @@ export declare class QuestionsService {
76
75
  * 传 `orgId` 时还要求输入请求属于该组织(HTTP 接口用)。
77
76
  */
78
77
  answer(questionId: string, accountId: string, answer: unknown, orgId?: string): Promise<QuestionRecord>;
78
+ private answerIn;
79
79
  /**
80
80
  * 超时(等待机制的超时任务调用):仍 pending 且已到期 → 置 expired、写 `question_answered{expired}`。
81
81
  * 返回 `expired`(本次生效)/ `not_due`(尚未到期)/ `settled`(已回答、已取消或不存在)。
@@ -84,20 +84,21 @@ export declare class QuestionsService {
84
84
  outcome: "expired" | "not_due" | "settled";
85
85
  record?: QuestionRecord;
86
86
  }>;
87
+ private expireIn;
87
88
  /**
88
- * 在事务 `t` 内取消运行的全部 pending 输入请求(运行在等待中被中止),各写 `question_answered{cancelled}`。
89
- * 返回被取消的记录;调用方提交后发布事件。
89
+ * 在调用方的事务内(`mandatory`)取消运行的全部 pending 输入请求(运行在等待中被中止),各写
90
+ * `question_answered{cancelled}`。返回被取消的记录;调用方提交后发布事件。
90
91
  */
91
- cancelPendingIn(t: Trx, runId: string): Promise<QuestionRecord[]>;
92
+ cancelPendingIn(runId: string): Promise<QuestionRecord[]>;
92
93
  /**
93
- * 在事务 `t` 内取消某组织里由 `accountId` 发起的运行上的全部 pending 输入请求(只有运行发起人能回答,
94
+ * 在调用方的事务内(`mandatory`)取消某组织里由 `accountId` 发起的运行上的全部 pending 输入请求(只有运行发起人能回答,
94
95
  * 即「其作为处理人」的提问;成员离职时调用),走与 {@link cancelPendingIn} 相同的取消路径:置 cancelled、
95
96
  * 写 `question_answered{cancelled}`。返回被取消的记录与各会话写到的最大 seq;调用方提交后发布事件。
96
97
  */
97
- cancelPendingFor(t: Trx, orgId: string, accountId: string): Promise<{
98
+ cancelPendingFor(orgId: string, accountId: string): Promise<{
98
99
  records: QuestionRecord[];
99
100
  seqs: Map<string, number>;
100
101
  }>;
102
+ /** `question_answered` in the current transaction; returns its seq. */
101
103
  private answeredEvent;
102
104
  }
103
- export {};
@@ -1,7 +1,23 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
1
10
  import { randomUUID } from "node:crypto";
2
- import { validateAnswer, } from "@capybara-hq/plugin-sdk";
11
+ import { validateAnswer } from "@capybara-hq/plugin-sdk";
12
+ import { Inject, Injectable } from "@nestjs/common";
3
13
  import { sql } from "kysely";
14
+ import { EventLog } from "../conversations/event-log.js";
4
15
  import { ApiError } from "../errors.js";
16
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
17
+ import { KernelDb } from "../infra/database/kernel-db.js";
18
+ import { TransactionHost } from "../infra/database/transaction-host.js";
19
+ import { Transactional } from "../infra/database/transactional.decorator.js";
20
+ import { KernelEvents } from "../infra/events/kernel-events.js";
5
21
  const notFound = () => new ApiError("question.not_found", "Question not found");
6
22
  const notInitiator = () => new ApiError("forbidden", "Only the user who started the run can answer this question");
7
23
  const toView = ({ state: _state, ...rest }) => rest;
@@ -32,75 +48,88 @@ const isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArr
32
48
  * 输入请求:新建(tools 节点)、回答(只有对话发起人)、超时与取消(等待机制)。
33
49
  * 状态全部在 PG:回答 / 超时 / 取消都在事务里 `SELECT … FOR UPDATE` 该行,多副本并发时恰好一个生效,
34
50
  * 只有生效的那次写 `question_answered`。HTTP 接口见 questions.controller.ts。
51
+ *
52
+ * An answer is announced after the commit as the domain event `question.answered` (exactly once),
53
+ * which the run's waits follow to resume it (spec §3b; the wait sweep resumes a run whose resume was
54
+ * lost). Events are appended in the context's transaction (`EventLog.appendIn`).
35
55
  */
36
- export class QuestionsService {
37
- deps;
38
- constructor(deps) {
39
- this.deps = deps;
56
+ let QuestionsService = class QuestionsService {
57
+ db;
58
+ config;
59
+ eventLog;
60
+ events;
61
+ txHost;
62
+ constructor(db, config, eventLog, events, txHost) {
63
+ this.db = db;
64
+ this.config = config;
65
+ this.eventLog = eventLog;
66
+ this.events = events;
67
+ this.txHost = txHost;
40
68
  }
41
69
  /**
42
70
  * 新建 pending 输入请求(`expires_at` = 现在 + `tools.approvalTimeoutHours`)并写 `question_asked`,同一事务。
43
71
  * 按 (run_id, call_id, attempt) 幂等:已存在则返回已有记录,事件按 `question_asked:<id>` 幂等。
44
72
  */
45
73
  async ask(input) {
46
- const { db, eventLog, config } = this.deps;
47
- const hours = config().tools.approvalTimeoutHours;
74
+ const { record, toSeq } = await this.askIn(input);
75
+ await this.eventLog.notify(record.conversationId, toSeq);
76
+ return record;
77
+ }
78
+ async askIn(input) {
79
+ const hours = this.config.get().tools.approvalTimeoutHours;
48
80
  const spec = {
49
81
  form: input.form,
50
82
  state: input.state ?? null,
51
83
  toolKey: input.toolKey,
52
84
  step: input.step,
53
85
  };
54
- const { record, toSeq } = await db.transaction().execute(async (t) => {
55
- await t
56
- .insertInto("questions")
57
- .values({
58
- id: randomUUID(),
59
- org_id: input.orgId,
60
- conversation_id: input.conversationId,
61
- run_id: input.runId,
62
- call_id: input.callId,
63
- attempt: input.attempt,
64
- spec: JSON.stringify(spec),
65
- answer: null,
66
- answered_by: null,
67
- expires_at: sql `now() + ${hours}::integer * interval '1 hour'`,
68
- })
69
- .onConflict((oc) => oc.columns(["run_id", "call_id", "attempt"]).doNothing())
70
- .execute();
71
- const row = await t
72
- .selectFrom("questions")
73
- .selectAll()
74
- .where("run_id", "=", input.runId)
75
- .where("call_id", "=", input.callId)
76
- .where("attempt", "=", input.attempt)
77
- .executeTakeFirstOrThrow();
78
- const rec = toRecord(row);
79
- const written = await eventLog.append(rec.conversationId, [
80
- {
81
- type: "question_asked",
82
- runId: rec.runId,
83
- idemKey: `question_asked:${rec.id}`,
84
- payload: {
85
- step: rec.step,
86
- callId: rec.callId,
87
- questionId: rec.id,
88
- form: rec.form,
89
- expiresAt: rec.expiresAt,
90
- },
86
+ const t = this.db.db;
87
+ await t
88
+ .insertInto("questions")
89
+ .values({
90
+ id: randomUUID(),
91
+ org_id: input.orgId,
92
+ conversation_id: input.conversationId,
93
+ run_id: input.runId,
94
+ call_id: input.callId,
95
+ attempt: input.attempt,
96
+ spec: JSON.stringify(spec),
97
+ answer: null,
98
+ answered_by: null,
99
+ expires_at: sql `now() + ${hours}::integer * interval '1 hour'`,
100
+ })
101
+ .onConflict((oc) => oc.columns(["run_id", "call_id", "attempt"]).doNothing())
102
+ .execute();
103
+ const row = await t
104
+ .selectFrom("questions")
105
+ .selectAll()
106
+ .where("run_id", "=", input.runId)
107
+ .where("call_id", "=", input.callId)
108
+ .where("attempt", "=", input.attempt)
109
+ .executeTakeFirstOrThrow();
110
+ const rec = toRecord(row);
111
+ const written = await this.eventLog.appendIn(rec.conversationId, [
112
+ {
113
+ type: "question_asked",
114
+ runId: rec.runId,
115
+ idemKey: `question_asked:${rec.id}`,
116
+ payload: {
117
+ step: rec.step,
118
+ callId: rec.callId,
119
+ questionId: rec.id,
120
+ form: rec.form,
121
+ expiresAt: rec.expiresAt,
91
122
  },
92
- ], t);
93
- return { record: rec, toSeq: Math.max(...written.map((e) => e.seq)) };
94
- });
95
- await eventLog.notify(record.conversationId, toSeq);
96
- return record;
123
+ },
124
+ ]);
125
+ return { record: rec, toSeq: Math.max(...written.map((e) => e.seq)) };
97
126
  }
98
127
  /**
99
128
  * 读一条输入请求(网页展示表单用):只有该运行的发起人(其他人 → 403 `forbidden`);
100
129
  * 不属于该组织 / 不存在 → `question.not_found`。
101
130
  */
102
131
  async get(orgId, questionId, accountId) {
103
- const row = await this.deps.db
132
+ const row = await this.db
104
133
  .selectFrom("questions")
105
134
  .innerJoin("runs", "runs.id", "questions.run_id")
106
135
  .selectAll("questions")
@@ -116,7 +145,7 @@ export class QuestionsService {
116
145
  }
117
146
  /** 某个调用的全部输入请求(按轮次升序)。 */
118
147
  async forCall(runId, callId) {
119
- const rows = await this.deps.db
148
+ const rows = await this.db
120
149
  .selectFrom("questions")
121
150
  .selectAll()
122
151
  .where("run_id", "=", runId)
@@ -132,103 +161,107 @@ export class QuestionsService {
132
161
  * 传 `orgId` 时还要求输入请求属于该组织(HTTP 接口用)。
133
162
  */
134
163
  async answer(questionId, accountId, answer, orgId) {
135
- const { db, eventLog } = this.deps;
136
- const { record, toSeq } = await db.transaction().execute(async (t) => {
137
- let q = t
138
- .selectFrom("questions")
139
- .selectAll()
140
- .select(sql `expires_at <= now()`.as("expired"))
141
- .where("id", "=", questionId);
142
- if (orgId !== undefined)
143
- q = q.where("org_id", "=", orgId);
144
- const locked = await q.forUpdate().executeTakeFirst();
145
- if (!locked)
146
- throw notFound();
147
- const run = await t
148
- .selectFrom("runs")
149
- .select("trigger_account_id")
150
- .where("id", "=", locked.run_id)
151
- .executeTakeFirst();
152
- if (run?.trigger_account_id !== accountId)
153
- throw notInitiator();
154
- const before = toRecord(locked);
155
- if (before.status !== "pending") {
156
- throw new ApiError("question.already_answered", "Question has already been answered");
157
- }
158
- if (locked.expired) {
159
- throw new ApiError("question.already_answered", "Question has expired");
160
- }
161
- const problems = isPlainObject(answer)
162
- ? validateAnswer(before.form, answer)
163
- : ["answer must be an object"];
164
- if (problems.length > 0) {
165
- throw new ApiError("validation_failed", "Answer does not match the form", problems.map((message) => ({ path: "answer", message })));
166
- }
167
- const updated = await t
168
- .updateTable("questions")
169
- .set({
170
- status: "answered",
171
- answer: JSON.stringify(answer),
172
- answered_by: accountId,
173
- answered_at: sql `now()`,
174
- })
175
- .where("id", "=", questionId)
176
- .returningAll()
177
- .executeTakeFirstOrThrow();
178
- const toSeq = await this.answeredEvent(t, before, answer, accountId, "answered");
179
- return { record: toRecord(updated), toSeq };
164
+ const { record, toSeq } = await this.answerIn(questionId, accountId, answer, orgId);
165
+ await this.eventLog.notify(record.conversationId, toSeq);
166
+ // waits resume the run and its IM delivery is enqueued (handler failures are logged)
167
+ await this.events.emit("question.answered", {
168
+ id: record.id,
169
+ orgId: record.orgId,
170
+ conversationId: record.conversationId,
171
+ runId: record.runId,
180
172
  });
181
- await eventLog.notify(record.conversationId, toSeq);
182
- if (this.deps.onAnswered) {
183
- try {
184
- await this.deps.onAnswered(record);
185
- }
186
- catch (err) {
187
- this.deps.log.warn("question onAnswered hook failed", { questionId: record.id, err });
188
- }
189
- }
190
173
  return record;
191
174
  }
175
+ // its own transaction (as the legacy one was): `question.answered` is emitted only after the
176
+ // answer committed, even when a caller has a transaction open
177
+ async answerIn(questionId, accountId, answer, orgId) {
178
+ const t = this.db.db;
179
+ let q = t
180
+ .selectFrom("questions")
181
+ .selectAll()
182
+ .select(sql `expires_at <= now()`.as("expired"))
183
+ .where("id", "=", questionId);
184
+ if (orgId !== undefined)
185
+ q = q.where("org_id", "=", orgId);
186
+ const locked = await q.forUpdate().executeTakeFirst();
187
+ if (!locked)
188
+ throw notFound();
189
+ const run = await t
190
+ .selectFrom("runs")
191
+ .select("trigger_account_id")
192
+ .where("id", "=", locked.run_id)
193
+ .executeTakeFirst();
194
+ if (run?.trigger_account_id !== accountId)
195
+ throw notInitiator();
196
+ const before = toRecord(locked);
197
+ if (before.status !== "pending") {
198
+ throw new ApiError("question.already_answered", "Question has already been answered");
199
+ }
200
+ if (locked.expired) {
201
+ throw new ApiError("question.already_answered", "Question has expired");
202
+ }
203
+ const problems = isPlainObject(answer)
204
+ ? validateAnswer(before.form, answer)
205
+ : ["answer must be an object"];
206
+ if (problems.length > 0) {
207
+ throw new ApiError("validation_failed", "Answer does not match the form", problems.map((message) => ({ path: "answer", message })));
208
+ }
209
+ const updated = await t
210
+ .updateTable("questions")
211
+ .set({
212
+ status: "answered",
213
+ answer: JSON.stringify(answer),
214
+ answered_by: accountId,
215
+ answered_at: sql `now()`,
216
+ })
217
+ .where("id", "=", questionId)
218
+ .returningAll()
219
+ .executeTakeFirstOrThrow();
220
+ const toSeq = await this.answeredEvent(before, answer, accountId, "answered");
221
+ return { record: toRecord(updated), toSeq };
222
+ }
192
223
  /**
193
224
  * 超时(等待机制的超时任务调用):仍 pending 且已到期 → 置 expired、写 `question_answered{expired}`。
194
225
  * 返回 `expired`(本次生效)/ `not_due`(尚未到期)/ `settled`(已回答、已取消或不存在)。
195
226
  */
196
227
  async expire(questionId) {
197
- const { db, eventLog } = this.deps;
198
- const r = await db.transaction().execute(async (t) => {
199
- const locked = await t
200
- .selectFrom("questions")
201
- .selectAll()
202
- .select(sql `expires_at <= now()`.as("expired"))
203
- .where("id", "=", questionId)
204
- .forUpdate()
205
- .executeTakeFirst();
206
- if (!locked)
207
- return { outcome: "settled" };
208
- const before = toRecord(locked);
209
- if (before.status !== "pending")
210
- return { outcome: "settled", record: before };
211
- if (!locked.expired)
212
- return { outcome: "not_due", record: before };
213
- const updated = await t
214
- .updateTable("questions")
215
- .set({ status: "expired", answered_at: sql `now()` })
216
- .where("id", "=", questionId)
217
- .returningAll()
218
- .executeTakeFirstOrThrow();
219
- const toSeq = await this.answeredEvent(t, before, null, null, "expired");
220
- return { outcome: "expired", record: toRecord(updated), toSeq };
221
- });
228
+ const r = await this.expireIn(questionId);
222
229
  if ("toSeq" in r && r.toSeq !== undefined && r.record) {
223
- await eventLog.notify(r.record.conversationId, r.toSeq);
230
+ await this.eventLog.notify(r.record.conversationId, r.toSeq);
224
231
  }
225
232
  return r.record ? { outcome: r.outcome, record: r.record } : { outcome: r.outcome };
226
233
  }
234
+ async expireIn(questionId) {
235
+ const t = this.db.db;
236
+ const locked = await t
237
+ .selectFrom("questions")
238
+ .selectAll()
239
+ .select(sql `expires_at <= now()`.as("expired"))
240
+ .where("id", "=", questionId)
241
+ .forUpdate()
242
+ .executeTakeFirst();
243
+ if (!locked)
244
+ return { outcome: "settled" };
245
+ const before = toRecord(locked);
246
+ if (before.status !== "pending")
247
+ return { outcome: "settled", record: before };
248
+ if (!locked.expired)
249
+ return { outcome: "not_due", record: before };
250
+ const updated = await t
251
+ .updateTable("questions")
252
+ .set({ status: "expired", answered_at: sql `now()` })
253
+ .where("id", "=", questionId)
254
+ .returningAll()
255
+ .executeTakeFirstOrThrow();
256
+ const toSeq = await this.answeredEvent(before, null, null, "expired");
257
+ return { outcome: "expired", record: toRecord(updated), toSeq };
258
+ }
227
259
  /**
228
- * 在事务 `t` 内取消运行的全部 pending 输入请求(运行在等待中被中止),各写 `question_answered{cancelled}`。
229
- * 返回被取消的记录;调用方提交后发布事件。
260
+ * 在调用方的事务内(`mandatory`)取消运行的全部 pending 输入请求(运行在等待中被中止),各写
261
+ * `question_answered{cancelled}`。返回被取消的记录;调用方提交后发布事件。
230
262
  */
231
- async cancelPendingIn(t, runId) {
263
+ async cancelPendingIn(runId) {
264
+ const t = this.db.db;
232
265
  const rows = await t
233
266
  .selectFrom("questions")
234
267
  .selectAll()
@@ -246,17 +279,18 @@ export class QuestionsService {
246
279
  .returningAll()
247
280
  .executeTakeFirstOrThrow();
248
281
  const rec = toRecord(row);
249
- await this.answeredEvent(t, rec, null, null, "cancelled");
282
+ await this.answeredEvent(rec, null, null, "cancelled");
250
283
  out.push(toRecord(updated));
251
284
  }
252
285
  return out;
253
286
  }
254
287
  /**
255
- * 在事务 `t` 内取消某组织里由 `accountId` 发起的运行上的全部 pending 输入请求(只有运行发起人能回答,
288
+ * 在调用方的事务内(`mandatory`)取消某组织里由 `accountId` 发起的运行上的全部 pending 输入请求(只有运行发起人能回答,
256
289
  * 即「其作为处理人」的提问;成员离职时调用),走与 {@link cancelPendingIn} 相同的取消路径:置 cancelled、
257
290
  * 写 `question_answered{cancelled}`。返回被取消的记录与各会话写到的最大 seq;调用方提交后发布事件。
258
291
  */
259
- async cancelPendingFor(t, orgId, accountId) {
292
+ async cancelPendingFor(orgId, accountId) {
293
+ const t = this.db.db;
260
294
  const rows = await t
261
295
  .selectFrom("questions")
262
296
  .selectAll()
@@ -275,21 +309,46 @@ export class QuestionsService {
275
309
  .where("id", "=", row.id)
276
310
  .returningAll()
277
311
  .executeTakeFirstOrThrow();
278
- const seq = await this.answeredEvent(t, toRecord(row), null, null, "cancelled");
312
+ const seq = await this.answeredEvent(toRecord(row), null, null, "cancelled");
279
313
  seqs.set(row.conversation_id, Math.max(seqs.get(row.conversation_id) ?? 0, seq));
280
314
  records.push(toRecord(updated));
281
315
  }
282
316
  return { records, seqs };
283
317
  }
284
- async answeredEvent(t, q, answer, byAccountId, outcome) {
285
- const written = await this.deps.eventLog.append(q.conversationId, [
318
+ /** `question_answered` in the current transaction; returns its seq. */
319
+ async answeredEvent(q, answer, byAccountId, outcome) {
320
+ const written = await this.eventLog.appendIn(q.conversationId, [
286
321
  {
287
322
  type: "question_answered",
288
323
  runId: q.runId,
289
324
  idemKey: `question_answered:${q.id}`,
290
325
  payload: { questionId: q.id, callId: q.callId, answer, byAccountId, outcome },
291
326
  },
292
- ], t);
327
+ ]);
293
328
  return Math.max(...written.map((e) => e.seq));
294
329
  }
295
- }
330
+ };
331
+ __decorate([
332
+ Transactional()
333
+ ], QuestionsService.prototype, "askIn", null);
334
+ __decorate([
335
+ Transactional({ propagation: "requires_new" })
336
+ ], QuestionsService.prototype, "answerIn", null);
337
+ __decorate([
338
+ Transactional()
339
+ ], QuestionsService.prototype, "expireIn", null);
340
+ __decorate([
341
+ Transactional({ propagation: "mandatory" })
342
+ ], QuestionsService.prototype, "cancelPendingIn", null);
343
+ __decorate([
344
+ Transactional({ propagation: "mandatory" })
345
+ ], QuestionsService.prototype, "cancelPendingFor", null);
346
+ QuestionsService = __decorate([
347
+ Injectable(),
348
+ __param(0, Inject(KernelDb)),
349
+ __param(1, Inject(KernelConfigService)),
350
+ __param(2, Inject(EventLog)),
351
+ __param(3, Inject(KernelEvents)),
352
+ __param(4, Inject(TransactionHost))
353
+ ], QuestionsService);
354
+ export { QuestionsService };
@@ -1,11 +1,13 @@
1
- import type { Connector, InputRequired, Logger, ToolAnnotations, ToolCallContext, ToolResult, ToolSpec } from "@capybara-hq/plugin-sdk";
1
+ import type { Connector, InputRequired, ToolAnnotations, ToolCallContext, ToolResult, ToolSpec } from "@capybara-hq/plugin-sdk";
2
2
  import type { AgentDefinition } from "../agents/definition.js";
3
- import type { KernelConfig } from "../config/schema.js";
4
3
  import type { ToolView } from "../conversations/events.js";
5
- import type { KernelDb } from "../db/kernel-schema.js";
6
- import type { ExtensionHost } from "../extensions/host.js";
4
+ import { ExtensionHost } from "../extensions/host.js";
5
+ import { ExtensionRegistry } from "../extensions/registry.js";
6
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
7
+ import { KernelDb } from "../infra/database/kernel-db.js";
7
8
  import type { OrgRole } from "../orgs/roles.js";
8
- import type { Credentials } from "./credentials.js";
9
+ import { BuiltinTools } from "./builtins/builtin-tools.js";
10
+ export { canonicalJson } from "./canonical-json.js";
9
11
  /**
10
12
  * 内核内置工具的名字(Task 10 / Task 19 实现;M5 T8 加沙箱工具)。保存 agent 时内置工具引用按这份清单校验,
11
13
  * 不依赖当前是否已注册,避免实现落地顺序影响已保存的定义;运行时未注册的照常报不可用。
@@ -119,8 +121,6 @@ export interface UnavailableTool {
119
121
  ref: string;
120
122
  reason: string;
121
123
  }
122
- /** 键排序、去掉 undefined 的 JSON(jsonb 不保留键顺序,指纹必须与顺序无关)。 */
123
- export declare function canonicalJson(v: unknown): string;
124
124
  /** The first 16 hex digits of sha256(canonicalJson(v)): a fingerprint independent of key order. */
125
125
  export declare function contentHash(v: unknown): string;
126
126
  /**
@@ -138,17 +138,6 @@ export declare function withoutDisplayFields<T>(spec: T): T;
138
138
  export declare function specHash(spec: unknown): string;
139
139
  /** 由注解推导默认策略:只读 → allow;其余(破坏性 / 无注解)→ ask。 */
140
140
  export declare function policyFromAnnotations(a: ToolAnnotations | undefined): "allow" | "ask";
141
- export interface ToolRegistryDeps {
142
- db: KernelDb;
143
- host: ExtensionHost;
144
- credentials: Credentials;
145
- log: Logger;
146
- builtins: BuiltinTool[];
147
- /**
148
- * 当前配置(`tools.searchThreshold*`)。不提供时从不启用 `tool_search`(只用于不关心它的测试 / 调用方)。
149
- */
150
- config?: () => KernelConfig;
151
- }
152
141
  /** `forAgent` 的结果。 */
153
142
  export interface AgentTools {
154
143
  tools: ResolvedTool[];
@@ -182,8 +171,29 @@ export interface AgentTools {
182
171
  * different sources with the same key report a duplicate.
183
172
  */
184
173
  export declare class ToolRegistry {
185
- private readonly deps;
186
- constructor(deps: ToolRegistryDeps);
174
+ private readonly db;
175
+ /** Extension tools and the organization's enabled extensions. */
176
+ private readonly host;
177
+ /** The installed connectors (`connector@1`, from the extension registry). */
178
+ private readonly extensions;
179
+ private readonly builtinTools;
180
+ /**
181
+ * `tools.searchThreshold*` and the sub-agent limits. Absent (some tests): `tool_search` is never
182
+ * offered and the sub-agent limits are the schema defaults.
183
+ */
184
+ private readonly config?;
185
+ constructor(db: KernelDb,
186
+ /** Extension tools and the organization's enabled extensions. */
187
+ host: Pick<ExtensionHost, "tools" | "enabledPlugins">,
188
+ /** The installed connectors (`connector@1`, from the extension registry). */
189
+ extensions: Pick<ExtensionRegistry, "list">, builtinTools: Pick<BuiltinTools, "list">,
190
+ /**
191
+ * `tools.searchThreshold*` and the sub-agent limits. Absent (some tests): `tool_search` is never
192
+ * offered and the sub-agent limits are the schema defaults.
193
+ */
194
+ config?: Pick<KernelConfigService, "get"> | undefined);
195
+ /** The kernel's builtin tools (`tool_search` is added by {@link forAgent}, not by definitions). */
196
+ private get builtins();
187
197
  /** `host.list("connector")` 中 `kind` 匹配的第一个实现;未安装返回 undefined。 */
188
198
  findConnector(kind: string): Connector | undefined;
189
199
  /** 同 {@link findConnector},未安装时抛错。 */