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

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 (604) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +47 -16
  3. package/dist/admin/admin.controller.js +44 -19
  4. package/dist/admin/extensions.controller.d.ts +24 -3
  5. package/dist/admin/extensions.controller.js +48 -8
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +19 -0
  13. package/dist/agents/agent-lookup.js +21 -0
  14. package/dist/agents/agent-profile.service.d.ts +29 -0
  15. package/dist/agents/agent-profile.service.js +117 -0
  16. package/dist/agents/agents.controller.d.ts +168 -3
  17. package/dist/agents/agents.controller.js +201 -12
  18. package/dist/agents/agents.module.d.ts +4 -1
  19. package/dist/agents/agents.module.js +36 -6
  20. package/dist/agents/agents.service.d.ts +64 -27
  21. package/dist/agents/agents.service.js +199 -74
  22. package/dist/agents/definition.d.ts +53 -0
  23. package/dist/agents/definition.js +55 -0
  24. package/dist/agents/from-template.d.ts +106 -0
  25. package/dist/agents/from-template.js +649 -0
  26. package/dist/agents/from-template.service.d.ts +60 -0
  27. package/dist/agents/from-template.service.js +161 -0
  28. package/dist/agents/instruction-files.d.ts +60 -0
  29. package/dist/agents/instruction-files.js +111 -0
  30. package/dist/agents/models.controller.d.ts +9 -3
  31. package/dist/agents/models.controller.js +19 -4
  32. package/dist/agents/org-templates.d.ts +176 -0
  33. package/dist/agents/org-templates.js +827 -0
  34. package/dist/agents/pending-connector-requests.d.ts +77 -0
  35. package/dist/agents/pending-connector-requests.js +215 -0
  36. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  37. package/dist/agents/pending-connectors.controller.js +91 -0
  38. package/dist/agents/pending-connectors.service.d.ts +62 -0
  39. package/dist/agents/pending-connectors.service.js +282 -0
  40. package/dist/agents/profile.d.ts +96 -0
  41. package/dist/agents/profile.js +51 -0
  42. package/dist/agents/readiness.controller.d.ts +26 -0
  43. package/dist/agents/readiness.controller.js +56 -0
  44. package/dist/agents/templates.controller.d.ts +86 -5
  45. package/dist/agents/templates.controller.js +171 -7
  46. package/dist/agents/templates.d.ts +127 -23
  47. package/dist/agents/templates.js +476 -53
  48. package/dist/background/background.controller.d.ts +38 -0
  49. package/dist/background/background.controller.js +87 -0
  50. package/dist/background/background.module.d.ts +10 -0
  51. package/dist/background/background.module.js +39 -0
  52. package/dist/background/finish.d.ts +44 -0
  53. package/dist/background/finish.js +94 -0
  54. package/dist/background/launch-lock.d.ts +15 -0
  55. package/dist/background/launch-lock.js +40 -0
  56. package/dist/background/launch.d.ts +36 -0
  57. package/dist/background/launch.js +70 -0
  58. package/dist/background/poll.job.d.ts +56 -0
  59. package/dist/background/poll.job.js +190 -0
  60. package/dist/background/render.d.ts +23 -0
  61. package/dist/background/render.js +48 -0
  62. package/dist/background/session.d.ts +48 -0
  63. package/dist/background/session.js +79 -0
  64. package/dist/background/status.d.ts +35 -0
  65. package/dist/background/status.js +57 -0
  66. package/dist/background/stop.d.ts +68 -0
  67. package/dist/background/stop.js +243 -0
  68. package/dist/background/store.d.ts +162 -0
  69. package/dist/background/store.js +357 -0
  70. package/dist/background/store.module.d.ts +6 -0
  71. package/dist/background/store.module.js +22 -0
  72. package/dist/background/tasks.service.d.ts +77 -0
  73. package/dist/background/tasks.service.js +211 -0
  74. package/dist/background/wake-rules.d.ts +66 -0
  75. package/dist/background/wake-rules.js +113 -0
  76. package/dist/background/wake.d.ts +30 -0
  77. package/dist/background/wake.js +63 -0
  78. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  79. package/dist/catalog/admin-catalog.controller.js +213 -42
  80. package/dist/catalog/catalog-content.d.ts +58 -32
  81. package/dist/catalog/catalog-content.js +34 -8
  82. package/dist/catalog/catalog-import.module.d.ts +7 -0
  83. package/dist/catalog/catalog-import.module.js +60 -0
  84. package/dist/catalog/catalog-items.d.ts +111 -7
  85. package/dist/catalog/catalog-items.js +279 -13
  86. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  87. package/dist/catalog/catalog-scope.service.js +1116 -0
  88. package/dist/catalog/catalog.module.d.ts +7 -9
  89. package/dist/catalog/catalog.module.js +41 -31
  90. package/dist/catalog/catalog.service.d.ts +101 -29
  91. package/dist/catalog/catalog.service.js +104 -106
  92. package/dist/catalog/claude/agents.js +2 -0
  93. package/dist/catalog/cli.d.ts +11 -1
  94. package/dist/catalog/cli.js +26 -1
  95. package/dist/catalog/component-promotion.d.ts +96 -0
  96. package/dist/catalog/component-promotion.js +395 -0
  97. package/dist/catalog/component-scope.controller.d.ts +152 -0
  98. package/dist/catalog/component-scope.controller.js +287 -0
  99. package/dist/catalog/component-scope.service.d.ts +303 -0
  100. package/dist/catalog/component-scope.service.js +936 -0
  101. package/dist/catalog/component-state.d.ts +174 -0
  102. package/dist/catalog/component-state.js +437 -0
  103. package/dist/catalog/job-ids.d.ts +30 -0
  104. package/dist/catalog/job-ids.js +25 -0
  105. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  106. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  107. package/dist/catalog/marketplaces.controller.js +56 -7
  108. package/dist/catalog/marketplaces.service.d.ts +54 -14
  109. package/dist/catalog/marketplaces.service.js +71 -22
  110. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  111. package/dist/catalog/org-catalog.controller.js +181 -65
  112. package/dist/catalog/org-catalog.service.d.ts +65 -33
  113. package/dist/catalog/org-catalog.service.js +324 -157
  114. package/dist/catalog/org-extension-switch.d.ts +41 -0
  115. package/dist/catalog/org-extension-switch.js +115 -0
  116. package/dist/catalog/org-extension.controller.d.ts +119 -0
  117. package/dist/catalog/org-extension.controller.js +266 -0
  118. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  119. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  120. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  121. package/dist/catalog/org-plugin-uploads.js +116 -0
  122. package/dist/catalog/owned-items.d.ts +184 -0
  123. package/dist/catalog/owned-items.js +789 -0
  124. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  125. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  126. package/dist/catalog/ownership.d.ts +172 -0
  127. package/dist/catalog/ownership.js +326 -0
  128. package/dist/catalog/platform-components.d.ts +221 -0
  129. package/dist/catalog/platform-components.js +761 -0
  130. package/dist/catalog/platform-migration.d.ts +115 -0
  131. package/dist/catalog/platform-migration.js +582 -0
  132. package/dist/catalog/plugin-import.d.ts +178 -34
  133. package/dist/catalog/plugin-import.js +623 -83
  134. package/dist/catalog/plugin-install.d.ts +185 -41
  135. package/dist/catalog/plugin-install.js +758 -126
  136. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  137. package/dist/catalog/plugin-upgrade.js +1148 -1137
  138. package/dist/catalog/request-rules.d.ts +65 -0
  139. package/dist/catalog/request-rules.js +217 -0
  140. package/dist/catalog/requests.service.d.ts +193 -118
  141. package/dist/catalog/requests.service.js +526 -343
  142. package/dist/catalog/reserved-names.d.ts +8 -0
  143. package/dist/catalog/reserved-names.js +42 -0
  144. package/dist/catalog/scope-orgs.d.ts +21 -0
  145. package/dist/catalog/scope-orgs.js +67 -0
  146. package/dist/catalog/scope-state.d.ts +35 -0
  147. package/dist/catalog/scope-state.js +87 -0
  148. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  149. package/dist/catalog/scope-sync-workers.js +29 -0
  150. package/dist/catalog/scope-sync.d.ts +176 -0
  151. package/dist/catalog/scope-sync.js +576 -0
  152. package/dist/catalog/scope.d.ts +42 -0
  153. package/dist/catalog/scope.js +42 -0
  154. package/dist/catalog/unshare.d.ts +22 -0
  155. package/dist/catalog/unshare.js +118 -0
  156. package/dist/channels/actions.js +1 -0
  157. package/dist/channels/cards.js +21 -3
  158. package/dist/channels/channels.module.js +2 -0
  159. package/dist/channels/connections.service.d.ts +16 -1
  160. package/dist/channels/connections.service.js +38 -4
  161. package/dist/channels/inbound.d.ts +9 -1
  162. package/dist/channels/inbound.js +67 -5
  163. package/dist/channels/phrases.d.ts +35 -0
  164. package/dist/channels/phrases.js +29 -0
  165. package/dist/channels/threads.d.ts +5 -0
  166. package/dist/channels/threads.js +8 -0
  167. package/dist/config/docs.js +3 -1
  168. package/dist/config/schema.d.ts +24 -2
  169. package/dist/config/schema.js +145 -19
  170. package/dist/conversations/access.d.ts +6 -4
  171. package/dist/conversations/access.js +29 -5
  172. package/dist/conversations/agent-tree.d.ts +46 -0
  173. package/dist/conversations/agent-tree.js +92 -0
  174. package/dist/conversations/attachments.service.d.ts +30 -0
  175. package/dist/conversations/attachments.service.js +130 -5
  176. package/dist/conversations/conversations.controller.d.ts +79 -23
  177. package/dist/conversations/conversations.controller.js +141 -50
  178. package/dist/conversations/conversations.module.d.ts +1 -1
  179. package/dist/conversations/conversations.module.js +10 -7
  180. package/dist/conversations/conversations.service.d.ts +108 -9
  181. package/dist/conversations/conversations.service.js +237 -30
  182. package/dist/conversations/environment-status.d.ts +24 -0
  183. package/dist/conversations/environment-status.js +71 -0
  184. package/dist/conversations/event-log.d.ts +21 -6
  185. package/dist/conversations/event-log.js +70 -1
  186. package/dist/conversations/events.d.ts +140 -0
  187. package/dist/conversations/events.js +142 -13
  188. package/dist/conversations/queue.d.ts +3 -1
  189. package/dist/conversations/queue.js +13 -2
  190. package/dist/conversations/queue.service.d.ts +1 -1
  191. package/dist/conversations/queue.service.js +8 -1
  192. package/dist/conversations/titles.d.ts +12 -3
  193. package/dist/conversations/titles.js +36 -8
  194. package/dist/conversations/tree.d.ts +17 -0
  195. package/dist/conversations/tree.js +42 -0
  196. package/dist/ctx/create-ctx.d.ts +5 -0
  197. package/dist/ctx/create-ctx.js +15 -5
  198. package/dist/db/kernel-schema.d.ts +420 -20
  199. package/dist/db/pool.d.ts +5 -0
  200. package/dist/db/pool.js +3 -0
  201. package/dist/environments/access.d.ts +41 -0
  202. package/dist/environments/access.js +77 -0
  203. package/dist/environments/conversation-environments.d.ts +61 -0
  204. package/dist/environments/conversation-environments.js +170 -0
  205. package/dist/environments/dto.d.ts +25 -0
  206. package/dist/environments/dto.js +12 -0
  207. package/dist/environments/environments.controller.d.ts +33 -0
  208. package/dist/environments/environments.controller.js +110 -0
  209. package/dist/environments/environments.module.d.ts +8 -0
  210. package/dist/environments/environments.module.js +27 -0
  211. package/dist/environments/environments.service.d.ts +153 -0
  212. package/dist/environments/environments.service.js +541 -0
  213. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  214. package/dist/environments/legacy-cleanup.job.js +141 -0
  215. package/dist/errors.d.ts +90 -2
  216. package/dist/errors.js +90 -2
  217. package/dist/evals/reconstruct.d.ts +18 -9
  218. package/dist/evals/reconstruct.js +26 -7
  219. package/dist/evals/run-replay.d.ts +7 -2
  220. package/dist/evals/run-replay.js +42 -7
  221. package/dist/evals/step-replay.d.ts +2 -5
  222. package/dist/evals/step-replay.js +13 -7
  223. package/dist/evals/trajectory.js +1 -1
  224. package/dist/evals/trajectory.service.d.ts +8 -3
  225. package/dist/evals/trajectory.service.js +26 -14
  226. package/dist/evals/worker.d.ts +5 -5
  227. package/dist/evals/worker.js +9 -3
  228. package/dist/extensions/admin-ops.d.ts +36 -10
  229. package/dist/extensions/admin-ops.js +67 -42
  230. package/dist/extensions/admin-view.d.ts +39 -10
  231. package/dist/extensions/admin-view.js +111 -20
  232. package/dist/extensions/blobs.js +1 -0
  233. package/dist/extensions/bootstrap.d.ts +17 -4
  234. package/dist/extensions/bootstrap.js +70 -9
  235. package/dist/extensions/cli.d.ts +12 -0
  236. package/dist/extensions/cli.js +11 -2
  237. package/dist/extensions/config-issues.d.ts +13 -1
  238. package/dist/extensions/config-issues.js +22 -5
  239. package/dist/extensions/config-json-schema.d.ts +43 -7
  240. package/dist/extensions/config-json-schema.js +124 -58
  241. package/dist/extensions/deployment-config-store.d.ts +6 -0
  242. package/dist/extensions/deployment-config.d.ts +78 -8
  243. package/dist/extensions/deployment-config.js +172 -34
  244. package/dist/extensions/display-name.d.ts +22 -0
  245. package/dist/extensions/display-name.js +77 -0
  246. package/dist/extensions/effective-config.d.ts +127 -0
  247. package/dist/extensions/effective-config.js +368 -0
  248. package/dist/extensions/extensions.module.js +14 -2
  249. package/dist/extensions/hooks.d.ts +37 -4
  250. package/dist/extensions/hooks.js +82 -16
  251. package/dist/extensions/host.d.ts +45 -2
  252. package/dist/extensions/host.js +112 -16
  253. package/dist/extensions/installs.d.ts +20 -8
  254. package/dist/extensions/installs.js +37 -15
  255. package/dist/extensions/org-config.d.ts +81 -6
  256. package/dist/extensions/org-config.js +195 -44
  257. package/dist/extensions/org-levels.d.ts +37 -0
  258. package/dist/extensions/org-levels.js +71 -0
  259. package/dist/extensions/org-overrides.d.ts +151 -0
  260. package/dist/extensions/org-overrides.js +524 -0
  261. package/dist/extensions/package.d.ts +14 -1
  262. package/dist/extensions/package.js +51 -2
  263. package/dist/extensions/permission-view.d.ts +19 -4
  264. package/dist/extensions/permission-view.js +4 -4
  265. package/dist/extensions/plugin-items.d.ts +21 -0
  266. package/dist/extensions/plugin-items.js +42 -0
  267. package/dist/extensions/point-defaults.controller.d.ts +34 -0
  268. package/dist/extensions/point-defaults.controller.js +71 -0
  269. package/dist/extensions/point-defaults.d.ts +71 -0
  270. package/dist/extensions/point-defaults.js +234 -0
  271. package/dist/extensions/registry.d.ts +1 -1
  272. package/dist/extensions/registry.js +2 -0
  273. package/dist/extensions/resolve.d.ts +5 -1
  274. package/dist/extensions/resolve.js +15 -2
  275. package/dist/files/previewers.d.ts +8 -1
  276. package/dist/files/previewers.js +35 -6
  277. package/dist/http/api.module.js +31 -3
  278. package/dist/http/app.d.ts +11 -2
  279. package/dist/http/app.js +31 -5
  280. package/dist/http/nest-logger.d.ts +6 -5
  281. package/dist/http/nest-logger.js +24 -10
  282. package/dist/identity/accounts.d.ts +29 -29
  283. package/dist/identity/accounts.js +47 -47
  284. package/dist/identity/audit.d.ts +2 -1
  285. package/dist/identity/auth.controller.js +9 -5
  286. package/dist/identity/auth.guard.d.ts +13 -5
  287. package/dist/identity/auth.guard.js +26 -9
  288. package/dist/identity/cookies.d.ts +20 -5
  289. package/dist/identity/cookies.js +44 -6
  290. package/dist/identity/identity.module.d.ts +1 -1
  291. package/dist/identity/identity.module.js +4 -4
  292. package/dist/identity/me.controller.d.ts +5 -1
  293. package/dist/identity/me.controller.js +12 -3
  294. package/dist/identity/principal.d.ts +3 -3
  295. package/dist/identity/principal.js +3 -3
  296. package/dist/identity/sessions.d.ts +12 -0
  297. package/dist/identity/sessions.js +45 -0
  298. package/dist/identity/settings.d.ts +22 -11
  299. package/dist/identity/settings.js +53 -18
  300. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  301. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  302. package/dist/inbox/inbox.module.d.ts +4 -1
  303. package/dist/inbox/inbox.module.js +7 -3
  304. package/dist/inbox/inbox.service.d.ts +62 -3
  305. package/dist/inbox/inbox.service.js +74 -4
  306. package/dist/inbox/org-notices.d.ts +63 -0
  307. package/dist/inbox/org-notices.js +91 -0
  308. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  309. package/dist/inbox/platform-inbox.controller.js +58 -0
  310. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  311. package/dist/inbox/platform-inbox.service.js +263 -0
  312. package/dist/inbox/platform-notices.d.ts +19 -0
  313. package/dist/inbox/platform-notices.js +9 -0
  314. package/dist/index.d.ts +2 -2
  315. package/dist/index.js +1 -1
  316. package/dist/infra/cli/kernel-cli.module.js +9 -1
  317. package/dist/infra/config/kernel-config.service.js +27 -1
  318. package/dist/infra/database/database.module.js +1 -0
  319. package/dist/infra/database/xact-lock.d.ts +1 -1
  320. package/dist/infra/database/xact-lock.js +1 -1
  321. package/dist/infra/events/kernel-events.d.ts +19 -2
  322. package/dist/infra/lifecycle/process-guards.js +4 -0
  323. package/dist/infra/logging/logging.module.d.ts +4 -2
  324. package/dist/infra/logging/logging.module.js +24 -6
  325. package/dist/infra/queue/add-job-once.d.ts +14 -0
  326. package/dist/infra/queue/add-job-once.js +16 -0
  327. package/dist/infra/queue/redis-connection.d.ts +6 -0
  328. package/dist/infra/queue/redis-connection.js +7 -0
  329. package/dist/infra/redis/redis.module.js +6 -2
  330. package/dist/infra/tokens.d.ts +6 -1
  331. package/dist/infra/tokens.js +6 -1
  332. package/dist/kernel.module.js +6 -0
  333. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  334. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  335. package/dist/log.d.ts +13 -1
  336. package/dist/log.js +93 -17
  337. package/dist/models/prices.d.ts +5 -5
  338. package/dist/models/prices.js +4 -4
  339. package/dist/models/purposes.controller.d.ts +6 -4
  340. package/dist/models/purposes.controller.js +13 -7
  341. package/dist/models/purposes.d.ts +43 -9
  342. package/dist/models/purposes.js +48 -18
  343. package/dist/orgs/directory-sync.d.ts +14 -5
  344. package/dist/orgs/directory-sync.js +41 -17
  345. package/dist/orgs/offboarding.d.ts +12 -8
  346. package/dist/orgs/offboarding.js +54 -33
  347. package/dist/orgs/org-lock.d.ts +5 -0
  348. package/dist/orgs/org-lock.js +13 -0
  349. package/dist/orgs/org.guard.d.ts +10 -0
  350. package/dist/orgs/org.guard.js +43 -32
  351. package/dist/orgs/orgs.module.js +3 -0
  352. package/dist/orgs/orgs.service.d.ts +20 -7
  353. package/dist/orgs/orgs.service.js +32 -12
  354. package/dist/orgs/roles.d.ts +1 -1
  355. package/dist/orgs/roles.js +5 -1
  356. package/dist/orgs/settings.controller.d.ts +1 -1
  357. package/dist/orgs/settings.service.d.ts +20 -3
  358. package/dist/orgs/settings.service.js +19 -4
  359. package/dist/overrides.d.ts +3 -0
  360. package/dist/overrides.js +2 -0
  361. package/dist/platform/actor.d.ts +48 -0
  362. package/dist/platform/actor.js +100 -0
  363. package/dist/platform/agent-docs.d.ts +18 -0
  364. package/dist/platform/agent-docs.js +59 -0
  365. package/dist/platform/availability.d.ts +14 -0
  366. package/dist/platform/availability.js +43 -0
  367. package/dist/platform/errors.d.ts +11 -0
  368. package/dist/platform/errors.js +26 -0
  369. package/dist/platform/exclusions.d.ts +12 -0
  370. package/dist/platform/exclusions.js +1387 -0
  371. package/dist/platform/method.d.ts +6 -0
  372. package/dist/platform/method.js +15 -0
  373. package/dist/platform/operation.d.ts +92 -0
  374. package/dist/platform/operation.js +35 -0
  375. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  376. package/dist/platform/ops/agent-templates.ops.js +92 -0
  377. package/dist/platform/ops/agents.ops.d.ts +19 -0
  378. package/dist/platform/ops/agents.ops.js +294 -0
  379. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  380. package/dist/platform/ops/connectors.ops.js +126 -0
  381. package/dist/platform/ops/errors.d.ts +11 -0
  382. package/dist/platform/ops/errors.js +22 -0
  383. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  384. package/dist/platform/ops/extensions.ops.js +116 -0
  385. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  386. package/dist/platform/ops/marketplaces.ops.js +157 -0
  387. package/dist/platform/ops/paging.d.ts +14 -0
  388. package/dist/platform/ops/paging.js +20 -0
  389. package/dist/platform/ops/platform.ops.d.ts +23 -0
  390. package/dist/platform/ops/platform.ops.js +158 -0
  391. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  392. package/dist/platform/ops/plugins.ops.js +377 -0
  393. package/dist/platform/ops/requests.ops.d.ts +14 -0
  394. package/dist/platform/ops/requests.ops.js +153 -0
  395. package/dist/platform/ops/role.d.ts +4 -0
  396. package/dist/platform/ops/role.js +10 -0
  397. package/dist/platform/ops/skills.ops.d.ts +13 -0
  398. package/dist/platform/ops/skills.ops.js +98 -0
  399. package/dist/platform/ops/summary.d.ts +10 -0
  400. package/dist/platform/ops/summary.js +18 -0
  401. package/dist/platform/platform-ops.module.d.ts +7 -0
  402. package/dist/platform/platform-ops.module.js +55 -0
  403. package/dist/platform/platform.module.d.ts +8 -0
  404. package/dist/platform/platform.module.js +25 -0
  405. package/dist/platform/redact-orgs.d.ts +7 -0
  406. package/dist/platform/redact-orgs.js +52 -0
  407. package/dist/platform/registry.d.ts +30 -0
  408. package/dist/platform/registry.js +111 -0
  409. package/dist/roles/worker-role.d.ts +6 -4
  410. package/dist/roles/worker-role.js +14 -7
  411. package/dist/roles/worker.module.d.ts +1 -1
  412. package/dist/roles/worker.module.js +15 -1
  413. package/dist/runtime/context/build.d.ts +11 -7
  414. package/dist/runtime/context/build.js +46 -19
  415. package/dist/runtime/context/claude-tools.d.ts +3 -1
  416. package/dist/runtime/context/claude-tools.js +8 -6
  417. package/dist/runtime/context/compaction.js +13 -0
  418. package/dist/runtime/context/reminders.d.ts +2 -0
  419. package/dist/runtime/context/reminders.js +2 -0
  420. package/dist/runtime/context/skills.js +9 -2
  421. package/dist/runtime/context/tool-changes.d.ts +27 -0
  422. package/dist/runtime/context/tool-changes.js +60 -0
  423. package/dist/runtime/hook-calls.js +2 -0
  424. package/dist/runtime/langgraph-loop.d.ts +3 -1
  425. package/dist/runtime/langgraph-loop.js +36 -17
  426. package/dist/runtime/loop.d.ts +34 -5
  427. package/dist/runtime/maintenance.d.ts +9 -4
  428. package/dist/runtime/maintenance.js +35 -8
  429. package/dist/runtime/model-call.d.ts +46 -8
  430. package/dist/runtime/model-call.js +72 -21
  431. package/dist/runtime/providers.d.ts +6 -0
  432. package/dist/runtime/providers.js +8 -0
  433. package/dist/runtime/run-control.d.ts +11 -1
  434. package/dist/runtime/run-control.js +12 -0
  435. package/dist/runtime/run-drafts.d.ts +85 -0
  436. package/dist/runtime/run-drafts.js +230 -0
  437. package/dist/runtime/run-jobs.d.ts +3 -5
  438. package/dist/runtime/run-jobs.js +3 -7
  439. package/dist/runtime/run-queue.d.ts +59 -2
  440. package/dist/runtime/run-queue.js +311 -38
  441. package/dist/runtime/run-worker.d.ts +11 -5
  442. package/dist/runtime/run-worker.js +69 -33
  443. package/dist/runtime/runtime.module.js +11 -3
  444. package/dist/runtime/step-log.d.ts +15 -4
  445. package/dist/runtime/step-log.js +24 -7
  446. package/dist/runtime/stream.controller.d.ts +23 -1
  447. package/dist/runtime/stream.controller.js +60 -3
  448. package/dist/runtime/stream.d.ts +4 -1
  449. package/dist/runtime/stream.js +27 -3
  450. package/dist/runtime/subagents/child.d.ts +55 -7
  451. package/dist/runtime/subagents/child.js +105 -7
  452. package/dist/runtime/subagents/definition.d.ts +12 -3
  453. package/dist/runtime/subagents/definition.js +44 -28
  454. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  455. package/dist/runtime/subagents/deliveries.js +228 -0
  456. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  457. package/dist/runtime/subagents/dispatch.js +212 -141
  458. package/dist/runtime/subagents/limits.d.ts +24 -5
  459. package/dist/runtime/subagents/limits.js +40 -6
  460. package/dist/runtime/subagents/messages.d.ts +95 -0
  461. package/dist/runtime/subagents/messages.js +328 -0
  462. package/dist/runtime/subagents/preamble.d.ts +4 -4
  463. package/dist/runtime/subagents/preamble.js +9 -7
  464. package/dist/runtime/subagents/progress.d.ts +8 -6
  465. package/dist/runtime/subagents/progress.js +11 -6
  466. package/dist/runtime/subagents/render.d.ts +30 -0
  467. package/dist/runtime/subagents/render.js +53 -0
  468. package/dist/runtime/subagents/roster.d.ts +24 -7
  469. package/dist/runtime/subagents/roster.js +47 -11
  470. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  471. package/dist/runtime/subagents/skill-fork.js +8 -4
  472. package/dist/runtime/subagents/status.d.ts +14 -0
  473. package/dist/runtime/subagents/status.js +23 -0
  474. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  475. package/dist/runtime/subagents/subagents.service.js +11 -6
  476. package/dist/runtime/usage-report.d.ts +2 -1
  477. package/dist/runtime/usage-report.js +19 -13
  478. package/dist/runtime/waits.d.ts +145 -36
  479. package/dist/runtime/waits.js +423 -109
  480. package/dist/sandbox/jobs.d.ts +40 -13
  481. package/dist/sandbox/jobs.js +57 -20
  482. package/dist/sandbox/leases.d.ts +37 -54
  483. package/dist/sandbox/leases.js +71 -115
  484. package/dist/sandbox/providers.d.ts +2 -2
  485. package/dist/sandbox/providers.js +1 -1
  486. package/dist/sandbox/sandbox.module.d.ts +3 -2
  487. package/dist/sandbox/sandbox.module.js +10 -4
  488. package/dist/sandbox/sandbox.service.d.ts +282 -129
  489. package/dist/sandbox/sandbox.service.js +736 -381
  490. package/dist/skills/catalog.d.ts +3 -2
  491. package/dist/skills/catalog.js +21 -43
  492. package/dist/skills/changes.controller.d.ts +7 -0
  493. package/dist/skills/changes.controller.js +19 -1
  494. package/dist/skills/invoke.js +8 -3
  495. package/dist/skills/package.d.ts +20 -1
  496. package/dist/skills/package.js +28 -1
  497. package/dist/skills/skills.controller.d.ts +39 -4
  498. package/dist/skills/skills.controller.js +88 -10
  499. package/dist/skills/skills.module.js +10 -1
  500. package/dist/skills/skills.service.d.ts +106 -26
  501. package/dist/skills/skills.service.js +421 -75
  502. package/dist/skills/usable.d.ts +81 -0
  503. package/dist/skills/usable.js +379 -0
  504. package/dist/tools/approvals.service.d.ts +20 -2
  505. package/dist/tools/approvals.service.js +25 -4
  506. package/dist/tools/builtin-names.d.ts +41 -7
  507. package/dist/tools/builtin-names.js +59 -7
  508. package/dist/tools/builtins/agent.d.ts +23 -21
  509. package/dist/tools/builtins/agent.js +62 -55
  510. package/dist/tools/builtins/builtin-tools.d.ts +19 -1
  511. package/dist/tools/builtins/builtin-tools.js +59 -2
  512. package/dist/tools/builtins/handback.d.ts +28 -0
  513. package/dist/tools/builtins/handback.js +53 -0
  514. package/dist/tools/builtins/platform.d.ts +34 -0
  515. package/dist/tools/builtins/platform.js +362 -0
  516. package/dist/tools/builtins/sandbox/bash.d.ts +1 -1
  517. package/dist/tools/builtins/sandbox/bash.js +241 -4
  518. package/dist/tools/builtins/sandbox/common.d.ts +69 -27
  519. package/dist/tools/builtins/sandbox/common.js +87 -48
  520. package/dist/tools/builtins/sandbox/deliver.js +1 -1
  521. package/dist/tools/builtins/sandbox/edit.js +2 -2
  522. package/dist/tools/builtins/sandbox/glob.js +2 -2
  523. package/dist/tools/builtins/sandbox/grep.js +2 -4
  524. package/dist/tools/builtins/sandbox/index.d.ts +3 -1
  525. package/dist/tools/builtins/sandbox/index.js +7 -1
  526. package/dist/tools/builtins/sandbox/read.js +1 -1
  527. package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
  528. package/dist/tools/builtins/sandbox/task-output.js +329 -0
  529. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  530. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  531. package/dist/tools/builtins/sandbox/write.js +2 -2
  532. package/dist/tools/builtins/send-message.d.ts +56 -0
  533. package/dist/tools/builtins/send-message.js +100 -0
  534. package/dist/tools/builtins/skill-load.d.ts +22 -14
  535. package/dist/tools/builtins/skill-load.js +86 -57
  536. package/dist/tools/builtins/skill-write.js +1 -1
  537. package/dist/tools/builtins/web/errors.d.ts +8 -0
  538. package/dist/tools/builtins/web/errors.js +53 -0
  539. package/dist/tools/builtins/web/extract.d.ts +62 -0
  540. package/dist/tools/builtins/web/extract.js +271 -0
  541. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  542. package/dist/tools/builtins/web/fetch.js +175 -0
  543. package/dist/tools/builtins/web/index.d.ts +13 -0
  544. package/dist/tools/builtins/web/index.js +12 -0
  545. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  546. package/dist/tools/builtins/web/page-cache.js +77 -0
  547. package/dist/tools/builtins/web/search.d.ts +25 -0
  548. package/dist/tools/builtins/web/search.js +210 -0
  549. package/dist/tools/builtins/web/url.d.ts +17 -0
  550. package/dist/tools/builtins/web/url.js +43 -0
  551. package/dist/tools/connectors.controller.d.ts +10 -0
  552. package/dist/tools/connectors.controller.js +12 -0
  553. package/dist/tools/connectors.service.d.ts +46 -5
  554. package/dist/tools/connectors.service.js +94 -15
  555. package/dist/tools/extension-tools.controller.d.ts +14 -0
  556. package/dist/tools/extension-tools.controller.js +37 -0
  557. package/dist/tools/info.d.ts +42 -1
  558. package/dist/tools/info.js +64 -1
  559. package/dist/tools/oauth/flow-paths.d.ts +1 -1
  560. package/dist/tools/oauth/flow-paths.js +1 -1
  561. package/dist/tools/org-tool-switches.d.ts +74 -0
  562. package/dist/tools/org-tool-switches.js +184 -0
  563. package/dist/tools/pipeline.d.ts +46 -40
  564. package/dist/tools/pipeline.js +202 -364
  565. package/dist/tools/policy.d.ts +1 -1
  566. package/dist/tools/policy.js +36 -16
  567. package/dist/tools/registry.d.ts +120 -8
  568. package/dist/tools/registry.js +112 -19
  569. package/dist/tools/tools.module.js +24 -2
  570. package/dist/tools/validate.js +1 -1
  571. package/dist/ui/views.d.ts +2 -1
  572. package/dist/ui/views.js +17 -3
  573. package/package.json +3 -3
  574. package/src/migrations/0064_account_last_org.sql +7 -0
  575. package/src/migrations/0065_conversation_archive.sql +8 -0
  576. package/src/migrations/0066_extension_display_name.sql +4 -0
  577. package/src/migrations/0067_agent_profiles.sql +20 -0
  578. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  579. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  580. package/src/migrations/0070_background_tasks.sql +37 -0
  581. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  582. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  583. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  584. package/src/migrations/0074_subagent_tree.sql +50 -0
  585. package/src/migrations/0075_plugin_scope.sql +61 -0
  586. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  587. package/src/migrations/0077_scope_requests.sql +52 -0
  588. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  589. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  590. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  591. package/src/migrations/0081_platform_components.sql +129 -0
  592. package/src/migrations/0082_platform_migration.sql +33 -0
  593. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  594. package/src/migrations/0084_org_owned_items.sql +85 -0
  595. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  596. package/src/migrations/0086_org_layering.sql +30 -0
  597. package/src/migrations/0087_approval_summary.sql +6 -0
  598. package/src/migrations/0088_environments.sql +80 -0
  599. package/dist/catalog/upgrade-targets.d.ts +0 -56
  600. package/dist/catalog/upgrade-targets.js +0 -90
  601. package/dist/conversations/sandbox-status.d.ts +0 -24
  602. package/dist/conversations/sandbox-status.js +0 -52
  603. package/dist/extensions/org-config.controller.d.ts +0 -24
  604. package/dist/extensions/org-config.controller.js +0 -62
@@ -1,3 +1,4 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { isModelError, isRetryableKind, ModelError, sanitizeParams, } from "@capybara-hq/plugin-sdk";
2
3
  import { MEDIA_EXCLUDED_MAX_IDS } from "../conversations/events.js";
3
4
  import { ApiError } from "../errors.js";
@@ -6,16 +7,23 @@ import { hasInvocation, skillLoadOffered } from "../skills/catalog.js";
6
7
  import { buildModelRequest, latestSummary, mediaRefs, planMedia, } from "./context/build.js";
7
8
  import { acceptSummary, buildCompactionRequest, compactionBackoff, compactionPlan, shouldCompact, } from "./context/compaction.js";
8
9
  import { guardToolPairs } from "./context/pairing.js";
9
- import { turnLimitReminder } from "./context/reminders.js";
10
+ import { TOOLS_UNSUPPORTED_REMINDER, turnLimitReminder } from "./context/reminders.js";
10
11
  import { calibrate, estimateTokens } from "./context/tokens.js";
12
+ import { toolSetChange } from "./context/tool-changes.js";
11
13
  import { fireObserve, hookDeniedAudit, hookDeniedEvent, hookRequestOf, hookScope, recordHookDenial, } from "./hook-calls.js";
12
14
  import { MediaCache } from "./media-cache.js";
13
15
  import { ProviderListError } from "./providers.js";
14
- import { subagentBudgetUsedUp } from "./subagents/limits.js";
16
+ import { budgetRunOf, subagentBudgetUsedUp } from "./subagents/limits.js";
15
17
  /** 单轮收尾的尾部提醒(模型可见,英文;spec 6 轮次额度收尾)。 */
16
18
  export const WRAP_UP_REMINDER = "Step limit reached. Do not call tools. Summarize what you found and what remains for the user.";
17
- /** 所用模型不支持工具(`capabilities.tools` 为 false)时的提醒(模型可见,英文)。 */
18
- export const TOOLS_UNSUPPORTED_REMINDER = "Tools are unavailable for this model. Answer without calling tools.";
19
+ /**
20
+ * The tail reminder of a sub-agent's final call once its tree used its token budget (model-visible,
21
+ * English; sub-agents spec §8.3): the child hands back what it found instead of ending with nothing.
22
+ */
23
+ export const BUDGET_WRAP_UP_REMINDER = "The sub-agents' token budget is used up, so this is your last reply. Do not call tools. " +
24
+ "Report what you found so far, with the sources and details that matter, and what remains " +
25
+ "unfinished.";
26
+ export { TOOLS_UNSUPPORTED_REMINDER } from "./context/reminders.js";
19
27
  /** 不可用工具提醒的前缀(模型可见,英文)。 */
20
28
  export const TOOLS_UNAVAILABLE_PREFIX = "The following tools are unavailable in this run: ";
21
29
  /** 本 run 中此前有工具不可用、现在全部恢复时的提醒(模型可见,英文)。 */
@@ -70,6 +78,10 @@ const idem = {
70
78
  reminder: (runId, step) => `reminder:${runId}:${step}`,
71
79
  toolsUnavailable: (runId, step) => `tools_unavailable:${runId}:${step}`,
72
80
  toolsUnsupported: (runId, step) => `tools_unsupported:${runId}:${step}`,
81
+ toolsChanged: (runId, step, keys) => `tools_changed:${runId}:${step}:${createHash("sha256")
82
+ .update(JSON.stringify([...keys].sort()))
83
+ .digest("hex")
84
+ .slice(0, 16)}`,
73
85
  modelCall: modelCallIdemKey,
74
86
  hookDenied: (runId, step, attempt) => `hook_denied:${runId}:${step}:${attempt}`,
75
87
  /** Usage of a compaction call: `n` is the compaction attempt (consecutive failures + 1). */
@@ -88,18 +100,24 @@ class StepAborted extends Error {
88
100
  * 模型看到的一切先写进日志(`model_call` / `reminder` / `compaction_summary`),请求可由日志还原。
89
101
  */
90
102
  export function runModelStep(deps, input) {
91
- return runStep(deps, input, false);
103
+ return runStep(deps, input, null);
92
104
  }
93
105
  /**
94
106
  * 单轮收尾:到达步数上限时调用一次。写入收尾 `reminder`(位于请求末尾);照常带工具(历史里有工具调用时
95
107
  * 部分供应商要求请求声明工具,也保持缓存前缀稳定),但 `toolChoice: "none"`——模型只能回复文本。
96
108
  * 其余与 `runModelStep` 相同(幂等、降级、中止)。
109
+ *
110
+ * `reason: "budget"`: a sub-agent whose tree used its token budget makes this one call to hand back
111
+ * what it found (sub-agents spec §8.3); it is not stopped by the budget again (one call over).
97
112
  */
98
- export function runFinalWrapUp(deps, input) {
99
- return runStep(deps, input, true);
113
+ export function runFinalWrapUp(deps, input, reason = "max_steps") {
114
+ return runStep(deps, input, reason);
100
115
  }
101
- async function runStep(deps, input, wrapUp) {
102
- const { conversationId, runId, step, signal } = input;
116
+ async function runStep(deps, input,
117
+ /** The final call's reason, or null for an ordinary step. */
118
+ wrapUpReason) {
119
+ const wrapUp = wrapUpReason !== null;
120
+ const { conversationId, runId, step, signal, sink } = input;
103
121
  const existing = await findExisting(deps.eventLog, conversationId, runId, step);
104
122
  if (existing) {
105
123
  // resumed after a crash between writing usage and enqueueing it: enqueue again (job id dedupes)
@@ -108,6 +126,8 @@ async function runStep(deps, input, wrapUp) {
108
126
  if (u)
109
127
  void deps.usageReport.enqueue(conversationId, u.seq);
110
128
  }
129
+ // a crash between the assistant_message and clearing its draft leaves one behind
130
+ sink({ kind: "step_end", runId, step });
111
131
  return existing;
112
132
  }
113
133
  const runtime = deps.config.get().runtime;
@@ -117,6 +137,11 @@ async function runStep(deps, input, wrapUp) {
117
137
  if (signal.aborted)
118
138
  throw new StepAborted();
119
139
  let events = await readAll(deps.eventLog, conversationId);
140
+ // an earlier execution of this run already sent this step (it streamed, then crashed or was
141
+ // handed over): this one starts at offset 0, so viewers drop that attempt's draft first
142
+ if (events.some((e) => e.type === "model_call" && e.runId === runId && e.payload.step === step)) {
143
+ sink({ kind: "step_reset", runId, step });
144
+ }
120
145
  // sticky (M-4): a model.request denial already logged for this step (any attempt, e.g. a crash
121
146
  // after recording it) is final: fail the same way, before compaction or any model call. Read from
122
147
  // the events just loaded, so it costs no query (M-2).
@@ -132,6 +157,8 @@ async function runStep(deps, input, wrapUp) {
132
157
  const resolved = await deps.tools.forAgent(input.orgId, {
133
158
  tools: input.agent.tools ?? [],
134
159
  subagents: input.agent.subagents,
160
+ child: input.parent !== undefined || input.parentRunId !== undefined || input.subagent === true,
161
+ forkChild: input.parent?.forSkill === true,
135
162
  skillLoad: skillLoadOffered(events.findLast((e) => e.type === "skills_catalog"), hasInvocation(events)),
136
163
  });
137
164
  const tools = {
@@ -147,10 +174,12 @@ async function runStep(deps, input, wrapUp) {
147
174
  const beforeCompaction = events.length;
148
175
  events = await maybeCompact(deps, input, events, runtime, tools);
149
176
  // a sub-agent checks its budget again after a compaction call, so the step's own request is
150
- // not a second call over the cap (review M5; the loop checks before each step)
151
- if (input.parentRunId !== undefined &&
177
+ // not a second call over the cap (review M5; the loop checks before each step); the budget
178
+ // wrap-up is the one call allowed over it
179
+ if (wrapUpReason !== "budget" &&
180
+ input.parentRunId !== undefined &&
152
181
  events.length !== beforeCompaction &&
153
- (await subagentBudgetUsedUp(deps.db, deps.config, input.orgId, input.parentRunId))) {
182
+ (await subagentBudgetUsedUp(deps.db, deps.config, input.orgId, input.parent?.budgetRunId ?? (await budgetRunOf(deps.db, input.parentRunId))))) {
154
183
  return {
155
184
  content: [],
156
185
  stopReason: "end_turn",
@@ -160,6 +189,19 @@ async function runStep(deps, input, wrapUp) {
160
189
  budget: true,
161
190
  };
162
191
  }
192
+ // the tool set changed since the previous request (an extension switched on, a sub-agent
193
+ // roster added): tell the model before this request (tool naming spec §9.1). Keyed by the new
194
+ // set, so a retried step finds it in the log (previousToolSet applies it) and writes nothing
195
+ const toolKeys = resolved.tools.map((t) => t.key);
196
+ const change = toolSetChange(events, toolKeys);
197
+ if (change !== null) {
198
+ events = await appendLocal(deps.eventLog, conversationId, events, {
199
+ type: "tools_changed",
200
+ runId,
201
+ idemKey: idem.toolsChanged(runId, step, toolKeys),
202
+ payload: { step, ...change },
203
+ });
204
+ }
163
205
  const last = lastToolsReminder(events, runId);
164
206
  // 有不可用工具 → 列出;此前列过、现在全部恢复 → 说明已恢复,避免过时的「不可用」成为最后一句
165
207
  // (收尾调用不得调用工具,可用性变化不写)。
@@ -181,7 +223,7 @@ async function runStep(deps, input, wrapUp) {
181
223
  });
182
224
  }
183
225
  }
184
- const { outcome, ref } = await ladder(deps, input, events, runtime, tools, wrapUp, streamed);
226
+ const { outcome, ref } = await ladder(deps, input, events, runtime, tools, wrapUpReason, streamed);
185
227
  // assistant_message 与 usage 同一次 append = 同一事务。
186
228
  const appended = await appendCounted(deps, input, [
187
229
  {
@@ -201,6 +243,7 @@ async function runStep(deps, input, wrapUp) {
201
243
  const usageEvent = appended.find((e) => e.type === "usage");
202
244
  if (deps.usageReport && usageEvent)
203
245
  void deps.usageReport.enqueue(conversationId, usageEvent.seq);
246
+ sink({ kind: "step_end", runId, step });
204
247
  return {
205
248
  content: outcome.content,
206
249
  stopReason: outcome.stopReason,
@@ -222,21 +265,24 @@ async function runStep(deps, input, wrapUp) {
222
265
  payload: { step, content, stopReason: "aborted" },
223
266
  },
224
267
  ]);
268
+ sink({ kind: "step_end", runId, step });
225
269
  return { content, stopReason: "aborted", reused: false, aborted: true, usage: null };
226
270
  }
227
271
  }
228
272
  /**
229
- * Appends a model call's events (its reply or compaction outcome with its `usage`). For a
273
+ * Appends a model call's events (its reply or compaction outcome with its `usage`; also the usage
274
+ * of a `WebFetch` extraction call, `tools/builtins/web/extract.ts`). For a
230
275
  * sub-agent's run (`input.parentRunId`) in one transaction that also adds the tokens of the usage
231
- * events it newly wrote to the parent run's `subagent_tokens_used` (sub-agents spec §8.3): a usage
276
+ * events it newly wrote to the budget run's `subagent_tokens_used` (sub-agents spec §8.3): a usage
232
277
  * event already in the log (an idempotent hit after a crash) adds nothing, so each call counts
233
278
  * exactly once.
234
279
  */
235
- async function appendCounted(deps, input, events) {
280
+ export async function appendCounted(deps, input, events) {
236
281
  const { conversationId, parentRunId } = input;
237
282
  if (parentRunId === undefined)
238
283
  return deps.eventLog.append(conversationId, events);
239
- const out = await deps.stepLog.appendCounted(conversationId, parentRunId, events);
284
+ const budgetRunId = input.budgetRunId ?? input.parent?.budgetRunId;
285
+ const out = await deps.stepLog.appendCounted(conversationId, { parentRunId, ...(budgetRunId !== undefined && { budgetRunId }) }, events);
240
286
  if (out.toSeq !== null)
241
287
  await deps.eventLog.notify(conversationId, out.toSeq);
242
288
  return out.written;
@@ -657,11 +703,14 @@ function mergeLocal(events, written) {
657
703
  * 每次实际尝试写自己的 `model_call`(attempt 从 1 连续递增,跳过的不计);重试前经 sink 发 `step_reset`。
658
704
  * 不可重试的失败或梯子用尽 → `RunError`。
659
705
  */
660
- async function ladder(deps, input, events, runtime, tools, wrapUp, streamed) {
706
+ async function ladder(deps, input, events, runtime, tools, wrapUpReason, streamed) {
661
707
  const { conversationId, runId, step, signal, sink, agent } = input;
662
- const turnReminder = wrapUp
663
- ? WRAP_UP_REMINDER
664
- : turnLimitReminder(step, input.maxSteps ?? runtime.maxSteps);
708
+ const wrapUp = wrapUpReason !== null;
709
+ const turnReminder = wrapUpReason === "budget"
710
+ ? BUDGET_WRAP_UP_REMINDER
711
+ : wrapUp
712
+ ? WRAP_UP_REMINDER
713
+ : turnLimitReminder(step, input.maxSteps ?? runtime.maxSteps);
665
714
  let evs = events;
666
715
  const rungs = [
667
716
  { ref: agent.model, fallback: false },
@@ -784,6 +833,8 @@ async function ladder(deps, input, events, runtime, tools, wrapUp, streamed) {
784
833
  sink({ kind: "thinking", runId, step, text: ev.text });
785
834
  }
786
835
  });
836
+ // the draft's last write, before the assistant_message is logged
837
+ sink({ kind: "stream_end", runId, step });
787
838
  if (scope && deps.hooks) {
788
839
  fireObserve(deps.hooks, "model.response", {
789
840
  ...scope,
@@ -67,6 +67,12 @@ export declare class ProviderRegistry {
67
67
  listTimeoutMs?: number);
68
68
  /** `listModels()` 加时限(到时按失败处理,供应商的调用留在后台、结果丢弃)。 */
69
69
  private listModelsWithTimeout;
70
+ /**
71
+ * Whether at least one model-provider extension is loaded on this replica (enabled, configured,
72
+ * set up). Read from the extension host only: never calls a vendor, so a provider whose vendor
73
+ * is down still counts (org readiness, web-order spec §3.8).
74
+ */
75
+ hasProvider(): boolean;
70
76
  /** 每个插件取一个实现(`@2` 优先),按插件首次出现的顺序;不支持的主版本记 warn 后忽略。 */
71
77
  private providers;
72
78
  private models;
@@ -132,6 +132,14 @@ let ProviderRegistry = class ProviderRegistry {
132
132
  clearTimeout(timer);
133
133
  }
134
134
  }
135
+ /**
136
+ * Whether at least one model-provider extension is loaded on this replica (enabled, configured,
137
+ * set up). Read from the extension host only: never calls a vendor, so a provider whose vendor
138
+ * is down still counts (org readiness, web-order spec §3.8).
139
+ */
140
+ hasProvider() {
141
+ return this.providers().length > 0;
142
+ }
135
143
  /** 每个插件取一个实现(`@2` 优先),按插件首次出现的顺序;不支持的主版本记 warn 后忽略。 */
136
144
  providers() {
137
145
  const chosen = new Map();
@@ -13,9 +13,11 @@ export declare class RunControl {
13
13
  private readonly abort;
14
14
  private readonly events;
15
15
  private readonly log;
16
- constructor(queue: Pick<RunQueue, "ensureRun" | "abortIfOrphaned">, waits: Pick<Waits, "abortWaiting" | "childFinished" | "stopChildren">, abort: Pick<RunAbort, "request">, events: KernelEvents, log: Pick<KernelLogger, "error">);
16
+ constructor(queue: Pick<RunQueue, "ensureRun" | "abortIfOrphaned" | "wakeHeldTree">, waits: Pick<Waits, "abortWaiting" | "childFinished" | "stopChildren" | "stopTree">, abort: Pick<RunAbort, "request">, events: KernelEvents, log: Pick<KernelLogger, "error">);
17
17
  /** 有未消费的消息且没有进行中的运行时投递一轮运行;返回 runId 或 null。 */
18
18
  ensureRun(conversationId: string): Promise<string | null>;
19
+ /** After a root's queue was unpaused: the wakes it held for its tree ({@link RunQueue.wakeHeldTree}). */
20
+ wakeHeldTree(rootId: string): Promise<void>;
19
21
  /**
20
22
  * 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
21
23
  * 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
@@ -28,6 +30,14 @@ export declare class RunControl {
28
30
  * changed: `run.wait-stopped` lets the channel outbound update them.
29
31
  */
30
32
  abortWaiting(conversationId: string, runId: string, byAccountId: string | null): Promise<boolean>;
33
+ /**
34
+ * Stops a sub-agent with its descendants, or with `includeSelf: false` only the sub-agent
35
+ * conversations below `conversationId` (agent map spec §6; {@link Waits.stopTree}). Returns
36
+ * the number of runs asked to stop.
37
+ */
38
+ stopTree(conversationId: string, byAccountId: string | null, opts?: {
39
+ includeSelf?: boolean;
40
+ }): Promise<number>;
31
41
  /** 请求中止运行(广播到所有副本)。 */
32
42
  requestAbort(runId: string, byAccountId: string | null): Promise<void>;
33
43
  }
@@ -34,6 +34,10 @@ let RunControl = class RunControl {
34
34
  ensureRun(conversationId) {
35
35
  return this.queue.ensureRun(conversationId);
36
36
  }
37
+ /** After a root's queue was unpaused: the wakes it held for its tree ({@link RunQueue.wakeHeldTree}). */
38
+ wakeHeldTree(rootId) {
39
+ return this.queue.wakeHeldTree(rootId);
40
+ }
37
41
  /**
38
42
  * 运行是孤儿(会话锁空闲、任务已不存在,没有 worker 会收到中止广播)时直接把它写成 aborted,返回 true;
39
43
  * 否则返回 false。A stopped sub-agent then reports to its parent at once, and a stopped parent
@@ -61,6 +65,14 @@ let RunControl = class RunControl {
61
65
  await this.events.emit("run.wait-stopped", { conversationId, runId });
62
66
  return r;
63
67
  }
68
+ /**
69
+ * Stops a sub-agent with its descendants, or with `includeSelf: false` only the sub-agent
70
+ * conversations below `conversationId` (agent map spec §6; {@link Waits.stopTree}). Returns
71
+ * the number of runs asked to stop.
72
+ */
73
+ stopTree(conversationId, byAccountId, opts = {}) {
74
+ return this.waits.stopTree(conversationId, byAccountId, opts);
75
+ }
64
76
  /** 请求中止运行(广播到所有副本)。 */
65
77
  requestAbort(runId, byAccountId) {
66
78
  return this.abort.request(runId, byAccountId);
@@ -0,0 +1,85 @@
1
+ import type { ExtensionContext, Logger } from "@capybara-hq/plugin-sdk";
2
+ import type { Redis } from "ioredis";
3
+ import { EventLog } from "../conversations/event-log.js";
4
+ import { KernelDb } from "../infra/database/kernel-db.js";
5
+ import { type StreamSink } from "./model-call.js";
6
+ /** How long a draft lives without a write (a step that keeps streaming keeps refreshing it). */
7
+ export declare const DRAFT_TTL_SECONDS = 600;
8
+ /** At most one write per step per window, plus the one at the end of the model stream. */
9
+ export declare const DRAFT_FLUSH_MS = 200;
10
+ /** One step's draft: `{ text, thinking }` as JSON (spec 2026-11-07 §3.2). */
11
+ export declare const draftKey: (runId: string, step: number) => string;
12
+ /** What one step of a run has streamed so far. */
13
+ export interface RunDraft {
14
+ step: number;
15
+ text: string;
16
+ thinking: string;
17
+ }
18
+ /** A draft of a conversation's active run (the `event: draft` frame's data). */
19
+ export interface LiveDraft extends RunDraft {
20
+ runId: string;
21
+ }
22
+ /**
23
+ * Live drafts (spec 2026-11-07-run-input-and-live-drafts §3.2): what each step of a running run
24
+ * has streamed so far, kept in Redis so a viewer that (re)connects on any replica gets the text
25
+ * already shown, then the deltas from there on.
26
+ *
27
+ * The writer is the process executing the run: it holds the step's draft in memory (only for the
28
+ * runs it executes; {@link release} drops them when the execution ends) and writes it at most once
29
+ * per {@link DRAFT_FLUSH_MS}: on the first delta past the window, or, when deltas stop inside it,
30
+ * by one trailing one-shot timer per held step (process-local, unref'd, cancelled by a write,
31
+ * {@link clear} and {@link release}), plus once when the model stream ends ({@link flush}). Writes are issued before the delta is published, on the same
32
+ * connection as the bus publish, so a viewer that sees a delta past its snapshot and asks again
33
+ * gets a draft at least that far whenever that delta was written. Every write refreshes the
34
+ * {@link DRAFT_TTL_SECONDS} TTL; {@link clear} deletes the step's draft once its
35
+ * `assistant_message` is logged or the step is reset. Redis failures are logged, never thrown to
36
+ * the run: a draft is a convenience, the log stays the truth.
37
+ */
38
+ export declare class RunDrafts {
39
+ private readonly redis;
40
+ private readonly kdb;
41
+ private readonly eventLog;
42
+ private readonly log;
43
+ private readonly held;
44
+ constructor(redis: Redis, kdb: KernelDb, eventLog: Pick<EventLog, "findByIdem">, log: Pick<Logger, "warn">);
45
+ private get db();
46
+ /** Adds a delta to the step's draft; writes it when the last write is a window old. */
47
+ append(runId: string, step: number, channel: "text" | "thinking", text: string): void;
48
+ /** The end of the step's model stream: writes what the window still holds. */
49
+ flush(runId: string, step: number): void;
50
+ /** Deletes the step's draft (its `assistant_message` is logged, or the step starts over). */
51
+ clear(runId: string, step: number): void;
52
+ /**
53
+ * Drops what this process holds for the run (its execution here ended: finished, suspended,
54
+ * handed over). Redis keeps what was written: another worker may continue the run, and a step
55
+ * that never ended is not shown once the run is no longer running (TTL removes it).
56
+ */
57
+ release(runId: string): void;
58
+ /** The run's steps with a draft, by step. */
59
+ read(runId: string): Promise<RunDraft[]>;
60
+ /**
61
+ * The drafts a viewer of the conversation is shown: steps of its running run (or only `runId`)
62
+ * whose `assistant_message` is not logged. Redis is read before the log, so a step finalized
63
+ * meanwhile is either skipped here or its `assistant_message` reaches the viewer after the draft.
64
+ */
65
+ live(conversationId: string, runId?: string): Promise<LiveDraft[]>;
66
+ /** Whether the run belongs to the conversation (the draft route's 404). */
67
+ runOf(conversationId: string, runId: string): Promise<boolean>;
68
+ private drop;
69
+ private write;
70
+ }
71
+ /** What {@link streamSink} uses. */
72
+ export interface StreamSinkDeps {
73
+ bus: Pick<ExtensionContext["bus"], "publish">;
74
+ drafts: Pick<RunDrafts, "append" | "flush" | "clear">;
75
+ log: Pick<Logger, "warn">;
76
+ }
77
+ /**
78
+ * The run's stream sink (one per execution of a run): publishes deltas on the conversation's topic
79
+ * (`conv.<id>`, shared with `{ kind: "events" }`, so a subscriber on any replica gets them) with
80
+ * `offset`, the characters of that channel (text or thinking) this attempt of the step streamed
81
+ * before the delta, and keeps the step's live draft. `step_reset` clears the draft and both
82
+ * offsets; `stream_end` / `step_end` only flush / clear the draft and are not published. A failed
83
+ * publish is only logged: deltas are drafts, the `assistant_message` in the log is the truth.
84
+ */
85
+ export declare function streamSink(conversationId: string, deps: StreamSinkDeps): StreamSink;
@@ -0,0 +1,230 @@
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
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { conversationTopic, EventLog, } from "../conversations/event-log.js";
12
+ import { KernelDb } from "../infra/database/kernel-db.js";
13
+ import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
14
+ import { assistantIdemKey } from "./model-call.js";
15
+ /** How long a draft lives without a write (a step that keeps streaming keeps refreshing it). */
16
+ export const DRAFT_TTL_SECONDS = 600;
17
+ /** At most one write per step per window, plus the one at the end of the model stream. */
18
+ export const DRAFT_FLUSH_MS = 200;
19
+ /** One step's draft: `{ text, thinking }` as JSON (spec 2026-11-07 §3.2). */
20
+ export const draftKey = (runId, step) => `capk:run-draft:${runId}:${step}`;
21
+ /** The steps of a run that have a draft (a set, so a reader finds them without a key scan). */
22
+ const stepsKey = (runId) => `capk:run-draft-steps:${runId}`;
23
+ const parse = (step, v) => {
24
+ if (v === null)
25
+ return null;
26
+ try {
27
+ const d = JSON.parse(v);
28
+ return {
29
+ step,
30
+ text: typeof d.text === "string" ? d.text : "",
31
+ thinking: typeof d.thinking === "string" ? d.thinking : "",
32
+ };
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ };
38
+ /**
39
+ * Live drafts (spec 2026-11-07-run-input-and-live-drafts §3.2): what each step of a running run
40
+ * has streamed so far, kept in Redis so a viewer that (re)connects on any replica gets the text
41
+ * already shown, then the deltas from there on.
42
+ *
43
+ * The writer is the process executing the run: it holds the step's draft in memory (only for the
44
+ * runs it executes; {@link release} drops them when the execution ends) and writes it at most once
45
+ * per {@link DRAFT_FLUSH_MS}: on the first delta past the window, or, when deltas stop inside it,
46
+ * by one trailing one-shot timer per held step (process-local, unref'd, cancelled by a write,
47
+ * {@link clear} and {@link release}), plus once when the model stream ends ({@link flush}). Writes are issued before the delta is published, on the same
48
+ * connection as the bus publish, so a viewer that sees a delta past its snapshot and asks again
49
+ * gets a draft at least that far whenever that delta was written. Every write refreshes the
50
+ * {@link DRAFT_TTL_SECONDS} TTL; {@link clear} deletes the step's draft once its
51
+ * `assistant_message` is logged or the step is reset. Redis failures are logged, never thrown to
52
+ * the run: a draft is a convenience, the log stays the truth.
53
+ */
54
+ let RunDrafts = class RunDrafts {
55
+ redis;
56
+ kdb;
57
+ eventLog;
58
+ log;
59
+ held = new Map();
60
+ constructor(redis, kdb, eventLog, log) {
61
+ this.redis = redis;
62
+ this.kdb = kdb;
63
+ this.eventLog = eventLog;
64
+ this.log = log;
65
+ }
66
+ get db() {
67
+ return this.kdb.db;
68
+ }
69
+ /** Adds a delta to the step's draft; writes it when the last write is a window old. */
70
+ append(runId, step, channel, text) {
71
+ let h = this.held.get(runId);
72
+ if (h?.step !== step) {
73
+ if (h)
74
+ this.drop(runId, h);
75
+ h = {
76
+ step,
77
+ text: "",
78
+ thinking: "",
79
+ writtenAt: Number.NEGATIVE_INFINITY,
80
+ dirty: false,
81
+ timer: undefined,
82
+ };
83
+ this.held.set(runId, h);
84
+ }
85
+ h[channel] += text;
86
+ h.dirty = true;
87
+ const elapsed = Date.now() - h.writtenAt;
88
+ if (elapsed >= DRAFT_FLUSH_MS)
89
+ this.write(runId, h);
90
+ else if (h.timer === undefined) {
91
+ // held: written when the window ends even if no delta follows (a tool input, a pause)
92
+ h.timer = setTimeout(() => {
93
+ h.timer = undefined;
94
+ this.flush(runId, step);
95
+ }, DRAFT_FLUSH_MS - elapsed).unref();
96
+ }
97
+ }
98
+ /** The end of the step's model stream: writes what the window still holds. */
99
+ flush(runId, step) {
100
+ const h = this.held.get(runId);
101
+ if (h?.step === step && h.dirty)
102
+ this.write(runId, h);
103
+ }
104
+ /** Deletes the step's draft (its `assistant_message` is logged, or the step starts over). */
105
+ clear(runId, step) {
106
+ const h = this.held.get(runId);
107
+ if (h?.step === step)
108
+ this.drop(runId, h);
109
+ this.redis
110
+ .multi()
111
+ .del(draftKey(runId, step))
112
+ .srem(stepsKey(runId), String(step))
113
+ .exec()
114
+ .catch((err) => this.log.warn("run draft clear failed", { runId, step, err }));
115
+ }
116
+ /**
117
+ * Drops what this process holds for the run (its execution here ended: finished, suspended,
118
+ * handed over). Redis keeps what was written: another worker may continue the run, and a step
119
+ * that never ended is not shown once the run is no longer running (TTL removes it).
120
+ */
121
+ release(runId) {
122
+ const h = this.held.get(runId);
123
+ if (h)
124
+ this.drop(runId, h);
125
+ }
126
+ /** The run's steps with a draft, by step. */
127
+ async read(runId) {
128
+ const steps = (await this.redis.smembers(stepsKey(runId)))
129
+ .map(Number)
130
+ .filter((n) => Number.isSafeInteger(n))
131
+ .sort((a, b) => a - b);
132
+ if (steps.length === 0)
133
+ return [];
134
+ const values = await this.redis.mget(steps.map((s) => draftKey(runId, s)));
135
+ return steps.flatMap((s, i) => parse(s, values[i] ?? null) ?? []);
136
+ }
137
+ /**
138
+ * The drafts a viewer of the conversation is shown: steps of its running run (or only `runId`)
139
+ * whose `assistant_message` is not logged. Redis is read before the log, so a step finalized
140
+ * meanwhile is either skipped here or its `assistant_message` reaches the viewer after the draft.
141
+ */
142
+ async live(conversationId, runId) {
143
+ let q = this.db
144
+ .selectFrom("runs")
145
+ .select("id")
146
+ .where("conversation_id", "=", conversationId)
147
+ .where("status", "=", "running");
148
+ if (runId !== undefined)
149
+ q = q.where("id", "=", runId);
150
+ const out = [];
151
+ for (const run of await q.execute()) {
152
+ for (const d of await this.read(run.id)) {
153
+ const final = await this.eventLog.findByIdem(conversationId, assistantIdemKey(run.id, d.step));
154
+ if (final === undefined)
155
+ out.push({ runId: run.id, ...d });
156
+ }
157
+ }
158
+ return out;
159
+ }
160
+ /** Whether the run belongs to the conversation (the draft route's 404). */
161
+ async runOf(conversationId, runId) {
162
+ const row = await this.db
163
+ .selectFrom("runs")
164
+ .select("id")
165
+ .where("id", "=", runId)
166
+ .where("conversation_id", "=", conversationId)
167
+ .executeTakeFirst();
168
+ return row !== undefined;
169
+ }
170
+ drop(runId, h) {
171
+ clearTimeout(h.timer);
172
+ h.timer = undefined;
173
+ this.held.delete(runId);
174
+ }
175
+ write(runId, h) {
176
+ clearTimeout(h.timer);
177
+ h.timer = undefined;
178
+ h.writtenAt = Date.now();
179
+ h.dirty = false;
180
+ const { step } = h;
181
+ this.redis
182
+ .multi()
183
+ .set(draftKey(runId, step), JSON.stringify({ text: h.text, thinking: h.thinking }), "EX", DRAFT_TTL_SECONDS)
184
+ .sadd(stepsKey(runId), String(step))
185
+ .expire(stepsKey(runId), DRAFT_TTL_SECONDS)
186
+ .exec()
187
+ .catch((err) => this.log.warn("run draft write failed", { runId, step, err }));
188
+ }
189
+ };
190
+ RunDrafts = __decorate([
191
+ Injectable(),
192
+ __param(0, Inject(REDIS)),
193
+ __param(1, Inject(KernelDb)),
194
+ __param(2, Inject(EventLog)),
195
+ __param(3, Inject(KERNEL_LOGGER))
196
+ ], RunDrafts);
197
+ export { RunDrafts };
198
+ /**
199
+ * The run's stream sink (one per execution of a run): publishes deltas on the conversation's topic
200
+ * (`conv.<id>`, shared with `{ kind: "events" }`, so a subscriber on any replica gets them) with
201
+ * `offset`, the characters of that channel (text or thinking) this attempt of the step streamed
202
+ * before the delta, and keeps the step's live draft. `step_reset` clears the draft and both
203
+ * offsets; `stream_end` / `step_end` only flush / clear the draft and are not published. A failed
204
+ * publish is only logged: deltas are drafts, the `assistant_message` in the log is the truth.
205
+ */
206
+ export function streamSink(conversationId, deps) {
207
+ let at = { runId: "", step: -1, text: 0, thinking: 0 };
208
+ const publish = (msg) => deps.bus
209
+ .publish(conversationTopic(conversationId), msg)
210
+ .catch((err) => deps.log.warn("stream delta publish failed", { conversationId, err }));
211
+ return (d) => {
212
+ if (d.kind === "stream_end")
213
+ return deps.drafts.flush(d.runId, d.step);
214
+ if (d.kind === "step_end")
215
+ return deps.drafts.clear(d.runId, d.step);
216
+ if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
217
+ at = { runId: d.runId, step: d.step, text: 0, thinking: 0 };
218
+ }
219
+ if (d.kind === "step_reset") {
220
+ deps.drafts.clear(d.runId, d.step);
221
+ void publish({ kind: "delta", runId: d.runId, step: d.step, delta: "step_reset" });
222
+ return;
223
+ }
224
+ const text = d.text ?? "";
225
+ const offset = at[d.kind];
226
+ at[d.kind] += text.length;
227
+ deps.drafts.append(d.runId, d.step, d.kind, text);
228
+ void publish({ kind: "delta", runId: d.runId, step: d.step, delta: d.kind, text, offset });
229
+ };
230
+ }
@@ -34,12 +34,10 @@ export declare class RunJobs {
34
34
  queue(name?: string): Queue<RunJobData>;
35
35
  /** A run job by id on the queue `name`, or undefined. */
36
36
  getJob(jobId: string, name?: string): Promise<Job<RunJobData> | undefined>;
37
- /** Adds a conversation run job (`ensureRun`'s own enqueue). */
38
- add(data: RunJobData, jobId: string): Promise<void>;
39
37
  /**
40
- * Enqueues a run job under the caller's job id (resumes, dispatches, repairs). The queue follows
41
- * the conversation's kind (a sub-agent's runs go to {@link SUBAGENT_RUN_QUEUE_NAME}); pass
42
- * `kind` when the caller knows it, else it is read.
38
+ * Enqueues a run job under the caller's job id (`ensureRun`, resumes, dispatches, repairs). The
39
+ * queue follows the conversation's kind (a sub-agent's runs go to
40
+ * {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
43
41
  */
44
42
  enqueue(data: RunJobData, jobId: string, kind?: ConversationKind): Promise<void>;
45
43
  }
@@ -54,14 +54,10 @@ let RunJobs = class RunJobs {
54
54
  getJob(jobId, name = RUN_QUEUE_NAME) {
55
55
  return this.queue(name).getJob(jobId);
56
56
  }
57
- /** Adds a conversation run job (`ensureRun`'s own enqueue). */
58
- async add(data, jobId) {
59
- await this.queue().add("run", data, { jobId, ...RUN_JOB_OPTIONS });
60
- }
61
57
  /**
62
- * Enqueues a run job under the caller's job id (resumes, dispatches, repairs). The queue follows
63
- * the conversation's kind (a sub-agent's runs go to {@link SUBAGENT_RUN_QUEUE_NAME}); pass
64
- * `kind` when the caller knows it, else it is read.
58
+ * Enqueues a run job under the caller's job id (`ensureRun`, resumes, dispatches, repairs). The
59
+ * queue follows the conversation's kind (a sub-agent's runs go to
60
+ * {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
65
61
  */
66
62
  async enqueue(data, jobId, kind) {
67
63
  const k = kind ??