@capybara-hq/kernel 0.1.0-rc.4 → 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 (507) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +39 -13
  3. package/dist/admin/admin.controller.js +33 -17
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  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 +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +51 -22
  19. package/dist/agents/agents.service.js +172 -70
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/org-templates.d.ts +176 -0
  27. package/dist/agents/org-templates.js +827 -0
  28. package/dist/agents/pending-connector-requests.d.ts +77 -0
  29. package/dist/agents/pending-connector-requests.js +215 -0
  30. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  31. package/dist/agents/pending-connectors.controller.js +91 -0
  32. package/dist/agents/pending-connectors.service.d.ts +62 -0
  33. package/dist/agents/pending-connectors.service.js +282 -0
  34. package/dist/agents/templates.controller.d.ts +86 -5
  35. package/dist/agents/templates.controller.js +171 -7
  36. package/dist/agents/templates.d.ts +127 -23
  37. package/dist/agents/templates.js +475 -52
  38. package/dist/background/background.module.js +8 -1
  39. package/dist/background/finish.d.ts +3 -2
  40. package/dist/background/launch-lock.d.ts +4 -3
  41. package/dist/background/launch-lock.js +4 -3
  42. package/dist/background/poll.job.d.ts +9 -6
  43. package/dist/background/poll.job.js +30 -22
  44. package/dist/background/session.d.ts +13 -2
  45. package/dist/background/session.js +13 -0
  46. package/dist/background/stop.d.ts +12 -6
  47. package/dist/background/stop.js +57 -39
  48. package/dist/background/store.d.ts +18 -6
  49. package/dist/background/store.js +12 -6
  50. package/dist/background/tasks.service.d.ts +15 -5
  51. package/dist/background/tasks.service.js +42 -17
  52. package/dist/background/wake-rules.d.ts +27 -18
  53. package/dist/background/wake-rules.js +52 -22
  54. package/dist/background/wake.d.ts +13 -11
  55. package/dist/background/wake.js +20 -14
  56. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  57. package/dist/catalog/admin-catalog.controller.js +213 -42
  58. package/dist/catalog/catalog-content.d.ts +58 -32
  59. package/dist/catalog/catalog-content.js +34 -8
  60. package/dist/catalog/catalog-import.module.d.ts +7 -0
  61. package/dist/catalog/catalog-import.module.js +60 -0
  62. package/dist/catalog/catalog-items.d.ts +111 -7
  63. package/dist/catalog/catalog-items.js +279 -13
  64. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  65. package/dist/catalog/catalog-scope.service.js +1116 -0
  66. package/dist/catalog/catalog.module.d.ts +7 -9
  67. package/dist/catalog/catalog.module.js +41 -31
  68. package/dist/catalog/catalog.service.d.ts +101 -29
  69. package/dist/catalog/catalog.service.js +104 -106
  70. package/dist/catalog/cli.d.ts +11 -1
  71. package/dist/catalog/cli.js +26 -1
  72. package/dist/catalog/component-promotion.d.ts +96 -0
  73. package/dist/catalog/component-promotion.js +395 -0
  74. package/dist/catalog/component-scope.controller.d.ts +152 -0
  75. package/dist/catalog/component-scope.controller.js +287 -0
  76. package/dist/catalog/component-scope.service.d.ts +303 -0
  77. package/dist/catalog/component-scope.service.js +936 -0
  78. package/dist/catalog/component-state.d.ts +174 -0
  79. package/dist/catalog/component-state.js +437 -0
  80. package/dist/catalog/job-ids.d.ts +30 -0
  81. package/dist/catalog/job-ids.js +25 -0
  82. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  83. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  84. package/dist/catalog/marketplaces.controller.js +56 -7
  85. package/dist/catalog/marketplaces.service.d.ts +54 -14
  86. package/dist/catalog/marketplaces.service.js +71 -22
  87. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  88. package/dist/catalog/org-catalog.controller.js +181 -65
  89. package/dist/catalog/org-catalog.service.d.ts +65 -33
  90. package/dist/catalog/org-catalog.service.js +324 -157
  91. package/dist/catalog/org-extension-switch.d.ts +41 -0
  92. package/dist/catalog/org-extension-switch.js +115 -0
  93. package/dist/catalog/org-extension.controller.d.ts +119 -0
  94. package/dist/catalog/org-extension.controller.js +266 -0
  95. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  96. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  97. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  98. package/dist/catalog/org-plugin-uploads.js +116 -0
  99. package/dist/catalog/owned-items.d.ts +184 -0
  100. package/dist/catalog/owned-items.js +789 -0
  101. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  102. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  103. package/dist/catalog/ownership.d.ts +172 -0
  104. package/dist/catalog/ownership.js +326 -0
  105. package/dist/catalog/platform-components.d.ts +221 -0
  106. package/dist/catalog/platform-components.js +761 -0
  107. package/dist/catalog/platform-migration.d.ts +115 -0
  108. package/dist/catalog/platform-migration.js +582 -0
  109. package/dist/catalog/plugin-import.d.ts +178 -34
  110. package/dist/catalog/plugin-import.js +622 -82
  111. package/dist/catalog/plugin-install.d.ts +185 -41
  112. package/dist/catalog/plugin-install.js +758 -126
  113. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  114. package/dist/catalog/plugin-upgrade.js +1147 -1136
  115. package/dist/catalog/request-rules.d.ts +65 -0
  116. package/dist/catalog/request-rules.js +217 -0
  117. package/dist/catalog/requests.service.d.ts +193 -118
  118. package/dist/catalog/requests.service.js +526 -343
  119. package/dist/catalog/reserved-names.d.ts +8 -0
  120. package/dist/catalog/reserved-names.js +42 -0
  121. package/dist/catalog/scope-orgs.d.ts +21 -0
  122. package/dist/catalog/scope-orgs.js +67 -0
  123. package/dist/catalog/scope-state.d.ts +35 -0
  124. package/dist/catalog/scope-state.js +87 -0
  125. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  126. package/dist/catalog/scope-sync-workers.js +29 -0
  127. package/dist/catalog/scope-sync.d.ts +176 -0
  128. package/dist/catalog/scope-sync.js +576 -0
  129. package/dist/catalog/scope.d.ts +42 -0
  130. package/dist/catalog/scope.js +42 -0
  131. package/dist/catalog/unshare.d.ts +22 -0
  132. package/dist/catalog/unshare.js +118 -0
  133. package/dist/channels/actions.js +1 -0
  134. package/dist/channels/cards.js +20 -2
  135. package/dist/channels/channels.module.js +2 -0
  136. package/dist/channels/inbound.d.ts +9 -1
  137. package/dist/channels/inbound.js +67 -5
  138. package/dist/channels/phrases.d.ts +35 -0
  139. package/dist/channels/phrases.js +29 -0
  140. package/dist/config/docs.js +3 -1
  141. package/dist/config/schema.d.ts +6 -2
  142. package/dist/config/schema.js +46 -22
  143. package/dist/conversations/access.d.ts +6 -4
  144. package/dist/conversations/access.js +27 -5
  145. package/dist/conversations/agent-tree.d.ts +46 -0
  146. package/dist/conversations/agent-tree.js +92 -0
  147. package/dist/conversations/conversations.controller.d.ts +43 -18
  148. package/dist/conversations/conversations.controller.js +79 -38
  149. package/dist/conversations/conversations.module.d.ts +1 -1
  150. package/dist/conversations/conversations.module.js +7 -7
  151. package/dist/conversations/conversations.service.d.ts +69 -12
  152. package/dist/conversations/conversations.service.js +106 -27
  153. package/dist/conversations/environment-status.d.ts +24 -0
  154. package/dist/conversations/environment-status.js +71 -0
  155. package/dist/conversations/event-log.d.ts +20 -5
  156. package/dist/conversations/event-log.js +60 -0
  157. package/dist/conversations/events.d.ts +84 -2
  158. package/dist/conversations/events.js +91 -17
  159. package/dist/conversations/queue.service.d.ts +1 -1
  160. package/dist/conversations/queue.service.js +5 -0
  161. package/dist/conversations/titles.d.ts +5 -3
  162. package/dist/conversations/titles.js +21 -8
  163. package/dist/conversations/tree.d.ts +17 -0
  164. package/dist/conversations/tree.js +42 -0
  165. package/dist/ctx/create-ctx.d.ts +5 -0
  166. package/dist/ctx/create-ctx.js +15 -5
  167. package/dist/db/kernel-schema.d.ts +362 -18
  168. package/dist/environments/access.d.ts +41 -0
  169. package/dist/environments/access.js +77 -0
  170. package/dist/environments/conversation-environments.d.ts +61 -0
  171. package/dist/environments/conversation-environments.js +170 -0
  172. package/dist/environments/dto.d.ts +25 -0
  173. package/dist/environments/dto.js +12 -0
  174. package/dist/environments/environments.controller.d.ts +33 -0
  175. package/dist/environments/environments.controller.js +110 -0
  176. package/dist/environments/environments.module.d.ts +8 -0
  177. package/dist/environments/environments.module.js +27 -0
  178. package/dist/environments/environments.service.d.ts +153 -0
  179. package/dist/environments/environments.service.js +541 -0
  180. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  181. package/dist/environments/legacy-cleanup.job.js +141 -0
  182. package/dist/errors.d.ts +82 -2
  183. package/dist/errors.js +82 -2
  184. package/dist/evals/reconstruct.d.ts +18 -9
  185. package/dist/evals/reconstruct.js +26 -7
  186. package/dist/evals/run-replay.d.ts +4 -2
  187. package/dist/evals/run-replay.js +16 -4
  188. package/dist/evals/step-replay.d.ts +2 -5
  189. package/dist/evals/step-replay.js +1 -1
  190. package/dist/evals/trajectory.service.d.ts +8 -3
  191. package/dist/evals/trajectory.service.js +26 -14
  192. package/dist/evals/worker.d.ts +5 -5
  193. package/dist/evals/worker.js +9 -3
  194. package/dist/extensions/admin-ops.d.ts +36 -10
  195. package/dist/extensions/admin-ops.js +65 -42
  196. package/dist/extensions/admin-view.d.ts +37 -10
  197. package/dist/extensions/admin-view.js +103 -20
  198. package/dist/extensions/bootstrap.d.ts +17 -4
  199. package/dist/extensions/bootstrap.js +70 -9
  200. package/dist/extensions/cli.d.ts +12 -0
  201. package/dist/extensions/cli.js +11 -2
  202. package/dist/extensions/deployment-config.d.ts +28 -5
  203. package/dist/extensions/deployment-config.js +48 -7
  204. package/dist/extensions/effective-config.d.ts +127 -0
  205. package/dist/extensions/effective-config.js +368 -0
  206. package/dist/extensions/extensions.module.js +8 -2
  207. package/dist/extensions/hooks.d.ts +37 -4
  208. package/dist/extensions/hooks.js +82 -16
  209. package/dist/extensions/host.d.ts +19 -1
  210. package/dist/extensions/host.js +30 -7
  211. package/dist/extensions/installs.d.ts +20 -8
  212. package/dist/extensions/installs.js +37 -15
  213. package/dist/extensions/org-config.d.ts +75 -6
  214. package/dist/extensions/org-config.js +184 -32
  215. package/dist/extensions/org-levels.d.ts +37 -0
  216. package/dist/extensions/org-levels.js +71 -0
  217. package/dist/extensions/org-overrides.d.ts +151 -0
  218. package/dist/extensions/org-overrides.js +524 -0
  219. package/dist/extensions/permission-view.d.ts +16 -4
  220. package/dist/extensions/permission-view.js +4 -4
  221. package/dist/extensions/plugin-items.d.ts +21 -0
  222. package/dist/extensions/plugin-items.js +42 -0
  223. package/dist/extensions/point-defaults.d.ts +12 -5
  224. package/dist/extensions/point-defaults.js +37 -9
  225. package/dist/extensions/resolve.d.ts +5 -1
  226. package/dist/extensions/resolve.js +15 -2
  227. package/dist/files/previewers.d.ts +8 -1
  228. package/dist/files/previewers.js +35 -6
  229. package/dist/http/api.module.js +23 -3
  230. package/dist/http/app.d.ts +11 -2
  231. package/dist/http/app.js +31 -5
  232. package/dist/identity/accounts.d.ts +29 -29
  233. package/dist/identity/accounts.js +47 -47
  234. package/dist/identity/audit.d.ts +2 -1
  235. package/dist/identity/auth.guard.d.ts +13 -5
  236. package/dist/identity/auth.guard.js +26 -9
  237. package/dist/identity/identity.module.d.ts +1 -1
  238. package/dist/identity/identity.module.js +4 -4
  239. package/dist/identity/me.controller.js +1 -1
  240. package/dist/identity/principal.d.ts +3 -3
  241. package/dist/identity/principal.js +3 -3
  242. package/dist/identity/settings.d.ts +22 -11
  243. package/dist/identity/settings.js +53 -18
  244. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  245. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  246. package/dist/inbox/inbox.module.d.ts +4 -1
  247. package/dist/inbox/inbox.module.js +7 -3
  248. package/dist/inbox/inbox.service.d.ts +62 -3
  249. package/dist/inbox/inbox.service.js +74 -4
  250. package/dist/inbox/org-notices.d.ts +63 -0
  251. package/dist/inbox/org-notices.js +91 -0
  252. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  253. package/dist/inbox/platform-inbox.controller.js +58 -0
  254. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  255. package/dist/inbox/platform-inbox.service.js +263 -0
  256. package/dist/inbox/platform-notices.d.ts +19 -0
  257. package/dist/inbox/platform-notices.js +9 -0
  258. package/dist/index.d.ts +1 -1
  259. package/dist/index.js +1 -1
  260. package/dist/infra/cli/kernel-cli.module.js +9 -1
  261. package/dist/infra/config/kernel-config.service.js +21 -1
  262. package/dist/infra/database/xact-lock.d.ts +1 -1
  263. package/dist/infra/database/xact-lock.js +1 -1
  264. package/dist/infra/events/kernel-events.d.ts +11 -2
  265. package/dist/infra/queue/add-job-once.d.ts +14 -0
  266. package/dist/infra/queue/add-job-once.js +16 -0
  267. package/dist/kernel.module.js +6 -0
  268. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  269. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  270. package/dist/models/prices.d.ts +5 -5
  271. package/dist/models/prices.js +4 -4
  272. package/dist/models/purposes.controller.d.ts +6 -4
  273. package/dist/models/purposes.controller.js +13 -7
  274. package/dist/models/purposes.d.ts +20 -9
  275. package/dist/models/purposes.js +17 -8
  276. package/dist/orgs/directory-sync.d.ts +14 -5
  277. package/dist/orgs/directory-sync.js +41 -17
  278. package/dist/orgs/offboarding.d.ts +9 -7
  279. package/dist/orgs/offboarding.js +28 -17
  280. package/dist/orgs/org-lock.d.ts +5 -0
  281. package/dist/orgs/org-lock.js +13 -0
  282. package/dist/orgs/org.guard.d.ts +10 -0
  283. package/dist/orgs/org.guard.js +43 -32
  284. package/dist/orgs/orgs.module.js +3 -0
  285. package/dist/orgs/orgs.service.d.ts +20 -7
  286. package/dist/orgs/orgs.service.js +32 -12
  287. package/dist/orgs/roles.d.ts +1 -1
  288. package/dist/orgs/roles.js +5 -1
  289. package/dist/orgs/settings.controller.d.ts +1 -1
  290. package/dist/orgs/settings.service.d.ts +15 -3
  291. package/dist/orgs/settings.service.js +6 -2
  292. package/dist/overrides.d.ts +3 -0
  293. package/dist/overrides.js +2 -0
  294. package/dist/platform/actor.d.ts +48 -0
  295. package/dist/platform/actor.js +100 -0
  296. package/dist/platform/agent-docs.d.ts +18 -0
  297. package/dist/platform/agent-docs.js +59 -0
  298. package/dist/platform/availability.d.ts +14 -0
  299. package/dist/platform/availability.js +43 -0
  300. package/dist/platform/errors.d.ts +11 -0
  301. package/dist/platform/errors.js +26 -0
  302. package/dist/platform/exclusions.d.ts +12 -0
  303. package/dist/platform/exclusions.js +1387 -0
  304. package/dist/platform/method.d.ts +6 -0
  305. package/dist/platform/method.js +15 -0
  306. package/dist/platform/operation.d.ts +92 -0
  307. package/dist/platform/operation.js +35 -0
  308. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  309. package/dist/platform/ops/agent-templates.ops.js +92 -0
  310. package/dist/platform/ops/agents.ops.d.ts +19 -0
  311. package/dist/platform/ops/agents.ops.js +294 -0
  312. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  313. package/dist/platform/ops/connectors.ops.js +126 -0
  314. package/dist/platform/ops/errors.d.ts +11 -0
  315. package/dist/platform/ops/errors.js +22 -0
  316. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  317. package/dist/platform/ops/extensions.ops.js +116 -0
  318. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  319. package/dist/platform/ops/marketplaces.ops.js +157 -0
  320. package/dist/platform/ops/paging.d.ts +14 -0
  321. package/dist/platform/ops/paging.js +20 -0
  322. package/dist/platform/ops/platform.ops.d.ts +23 -0
  323. package/dist/platform/ops/platform.ops.js +158 -0
  324. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  325. package/dist/platform/ops/plugins.ops.js +377 -0
  326. package/dist/platform/ops/requests.ops.d.ts +14 -0
  327. package/dist/platform/ops/requests.ops.js +153 -0
  328. package/dist/platform/ops/role.d.ts +4 -0
  329. package/dist/platform/ops/role.js +10 -0
  330. package/dist/platform/ops/skills.ops.d.ts +13 -0
  331. package/dist/platform/ops/skills.ops.js +98 -0
  332. package/dist/platform/ops/summary.d.ts +10 -0
  333. package/dist/platform/ops/summary.js +18 -0
  334. package/dist/platform/platform-ops.module.d.ts +7 -0
  335. package/dist/platform/platform-ops.module.js +55 -0
  336. package/dist/platform/platform.module.d.ts +8 -0
  337. package/dist/platform/platform.module.js +25 -0
  338. package/dist/platform/redact-orgs.d.ts +7 -0
  339. package/dist/platform/redact-orgs.js +52 -0
  340. package/dist/platform/registry.d.ts +30 -0
  341. package/dist/platform/registry.js +111 -0
  342. package/dist/roles/worker-role.d.ts +6 -4
  343. package/dist/roles/worker-role.js +14 -7
  344. package/dist/roles/worker.module.d.ts +1 -1
  345. package/dist/roles/worker.module.js +9 -1
  346. package/dist/runtime/context/build.d.ts +6 -4
  347. package/dist/runtime/context/build.js +26 -7
  348. package/dist/runtime/context/claude-tools.d.ts +2 -1
  349. package/dist/runtime/context/claude-tools.js +5 -4
  350. package/dist/runtime/context/compaction.js +9 -0
  351. package/dist/runtime/context/reminders.d.ts +2 -0
  352. package/dist/runtime/context/reminders.js +2 -0
  353. package/dist/runtime/context/skills.js +9 -2
  354. package/dist/runtime/context/tool-changes.d.ts +27 -0
  355. package/dist/runtime/context/tool-changes.js +60 -0
  356. package/dist/runtime/hook-calls.js +2 -0
  357. package/dist/runtime/langgraph-loop.d.ts +3 -1
  358. package/dist/runtime/langgraph-loop.js +35 -17
  359. package/dist/runtime/loop.d.ts +32 -4
  360. package/dist/runtime/maintenance.d.ts +7 -4
  361. package/dist/runtime/maintenance.js +23 -8
  362. package/dist/runtime/model-call.d.ts +30 -8
  363. package/dist/runtime/model-call.js +69 -19
  364. package/dist/runtime/run-control.d.ts +11 -1
  365. package/dist/runtime/run-control.js +12 -0
  366. package/dist/runtime/run-drafts.d.ts +85 -0
  367. package/dist/runtime/run-drafts.js +230 -0
  368. package/dist/runtime/run-jobs.d.ts +3 -5
  369. package/dist/runtime/run-jobs.js +3 -7
  370. package/dist/runtime/run-queue.d.ts +37 -3
  371. package/dist/runtime/run-queue.js +188 -11
  372. package/dist/runtime/run-worker.d.ts +11 -5
  373. package/dist/runtime/run-worker.js +54 -31
  374. package/dist/runtime/runtime.module.js +3 -0
  375. package/dist/runtime/step-log.d.ts +9 -4
  376. package/dist/runtime/step-log.js +8 -5
  377. package/dist/runtime/stream.controller.d.ts +23 -1
  378. package/dist/runtime/stream.controller.js +60 -3
  379. package/dist/runtime/stream.d.ts +4 -1
  380. package/dist/runtime/stream.js +27 -3
  381. package/dist/runtime/subagents/child.d.ts +55 -7
  382. package/dist/runtime/subagents/child.js +105 -7
  383. package/dist/runtime/subagents/definition.d.ts +12 -3
  384. package/dist/runtime/subagents/definition.js +43 -29
  385. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  386. package/dist/runtime/subagents/deliveries.js +228 -0
  387. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  388. package/dist/runtime/subagents/dispatch.js +212 -141
  389. package/dist/runtime/subagents/limits.d.ts +24 -5
  390. package/dist/runtime/subagents/limits.js +40 -6
  391. package/dist/runtime/subagents/messages.d.ts +95 -0
  392. package/dist/runtime/subagents/messages.js +328 -0
  393. package/dist/runtime/subagents/preamble.d.ts +4 -4
  394. package/dist/runtime/subagents/preamble.js +9 -7
  395. package/dist/runtime/subagents/progress.d.ts +8 -6
  396. package/dist/runtime/subagents/progress.js +11 -6
  397. package/dist/runtime/subagents/render.d.ts +30 -0
  398. package/dist/runtime/subagents/render.js +53 -0
  399. package/dist/runtime/subagents/roster.d.ts +24 -7
  400. package/dist/runtime/subagents/roster.js +47 -11
  401. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  402. package/dist/runtime/subagents/skill-fork.js +8 -4
  403. package/dist/runtime/subagents/status.d.ts +14 -0
  404. package/dist/runtime/subagents/status.js +23 -0
  405. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  406. package/dist/runtime/subagents/subagents.service.js +11 -6
  407. package/dist/runtime/usage-report.js +17 -12
  408. package/dist/runtime/waits.d.ts +140 -37
  409. package/dist/runtime/waits.js +394 -106
  410. package/dist/sandbox/jobs.d.ts +40 -13
  411. package/dist/sandbox/jobs.js +57 -20
  412. package/dist/sandbox/leases.d.ts +37 -54
  413. package/dist/sandbox/leases.js +71 -115
  414. package/dist/sandbox/providers.d.ts +2 -2
  415. package/dist/sandbox/providers.js +1 -1
  416. package/dist/sandbox/sandbox.module.d.ts +3 -2
  417. package/dist/sandbox/sandbox.module.js +4 -3
  418. package/dist/sandbox/sandbox.service.d.ts +229 -134
  419. package/dist/sandbox/sandbox.service.js +630 -409
  420. package/dist/skills/catalog.d.ts +3 -2
  421. package/dist/skills/catalog.js +21 -43
  422. package/dist/skills/changes.controller.d.ts +7 -0
  423. package/dist/skills/changes.controller.js +19 -1
  424. package/dist/skills/invoke.js +8 -3
  425. package/dist/skills/package.d.ts +20 -1
  426. package/dist/skills/package.js +28 -1
  427. package/dist/skills/skills.controller.d.ts +39 -4
  428. package/dist/skills/skills.controller.js +88 -10
  429. package/dist/skills/skills.module.js +10 -1
  430. package/dist/skills/skills.service.d.ts +106 -26
  431. package/dist/skills/skills.service.js +421 -75
  432. package/dist/skills/usable.d.ts +81 -0
  433. package/dist/skills/usable.js +379 -0
  434. package/dist/tools/approvals.service.d.ts +20 -2
  435. package/dist/tools/approvals.service.js +23 -4
  436. package/dist/tools/builtin-names.d.ts +21 -5
  437. package/dist/tools/builtin-names.js +30 -5
  438. package/dist/tools/builtins/agent.d.ts +23 -21
  439. package/dist/tools/builtins/agent.js +62 -55
  440. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  441. package/dist/tools/builtins/builtin-tools.js +37 -12
  442. package/dist/tools/builtins/handback.d.ts +28 -0
  443. package/dist/tools/builtins/handback.js +53 -0
  444. package/dist/tools/builtins/platform.d.ts +34 -0
  445. package/dist/tools/builtins/platform.js +362 -0
  446. package/dist/tools/builtins/sandbox/bash.js +13 -3
  447. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  448. package/dist/tools/builtins/sandbox/common.js +80 -45
  449. package/dist/tools/builtins/sandbox/edit.js +2 -2
  450. package/dist/tools/builtins/sandbox/glob.js +2 -2
  451. package/dist/tools/builtins/sandbox/grep.js +2 -4
  452. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  453. package/dist/tools/builtins/sandbox/index.js +1 -1
  454. package/dist/tools/builtins/sandbox/read.js +1 -1
  455. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  456. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  457. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  458. package/dist/tools/builtins/sandbox/write.js +2 -2
  459. package/dist/tools/builtins/send-message.d.ts +56 -0
  460. package/dist/tools/builtins/send-message.js +100 -0
  461. package/dist/tools/builtins/skill-load.d.ts +22 -14
  462. package/dist/tools/builtins/skill-load.js +86 -57
  463. package/dist/tools/builtins/skill-write.js +1 -1
  464. package/dist/tools/builtins/web/extract.js +5 -1
  465. package/dist/tools/builtins/web/fetch.js +1 -0
  466. package/dist/tools/builtins/web/search.js +1 -0
  467. package/dist/tools/connectors.controller.d.ts +10 -0
  468. package/dist/tools/connectors.controller.js +12 -0
  469. package/dist/tools/connectors.service.d.ts +46 -5
  470. package/dist/tools/connectors.service.js +94 -15
  471. package/dist/tools/extension-tools.controller.d.ts +14 -0
  472. package/dist/tools/extension-tools.controller.js +37 -0
  473. package/dist/tools/info.d.ts +42 -1
  474. package/dist/tools/info.js +64 -1
  475. package/dist/tools/org-tool-switches.d.ts +74 -0
  476. package/dist/tools/org-tool-switches.js +184 -0
  477. package/dist/tools/pipeline.d.ts +46 -40
  478. package/dist/tools/pipeline.js +187 -364
  479. package/dist/tools/policy.d.ts +1 -1
  480. package/dist/tools/policy.js +36 -16
  481. package/dist/tools/registry.d.ts +98 -5
  482. package/dist/tools/registry.js +87 -9
  483. package/dist/tools/tools.module.js +12 -2
  484. package/dist/ui/views.d.ts +2 -1
  485. package/dist/ui/views.js +17 -3
  486. package/package.json +3 -3
  487. package/src/migrations/0074_subagent_tree.sql +50 -0
  488. package/src/migrations/0075_plugin_scope.sql +61 -0
  489. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  490. package/src/migrations/0077_scope_requests.sql +52 -0
  491. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  492. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  493. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  494. package/src/migrations/0081_platform_components.sql +129 -0
  495. package/src/migrations/0082_platform_migration.sql +33 -0
  496. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  497. package/src/migrations/0084_org_owned_items.sql +85 -0
  498. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  499. package/src/migrations/0086_org_layering.sql +30 -0
  500. package/src/migrations/0087_approval_summary.sql +6 -0
  501. package/src/migrations/0088_environments.sql +80 -0
  502. package/dist/catalog/upgrade-targets.d.ts +0 -56
  503. package/dist/catalog/upgrade-targets.js +0 -90
  504. package/dist/conversations/sandbox-status.d.ts +0 -24
  505. package/dist/conversations/sandbox-status.js +0 -52
  506. package/dist/extensions/org-config.controller.d.ts +0 -32
  507. package/dist/extensions/org-config.controller.js +0 -70
@@ -22,8 +22,8 @@ export interface LoopContext {
22
22
  shutdown: AbortSignal;
23
23
  sink: StreamSink;
24
24
  /**
25
- * 下一个步骤间隙要吸收的事件:返回 seq > afterSeq 的可吸收事件(`user_message` 与
26
- * `background_task_finished`, `isAbsorbable`;且只含本轮开始时尚未被消费的,
25
+ * 下一个步骤间隙要吸收的事件:返回 seq > afterSeq 的可吸收事件(`user_message`、
26
+ * `background_task_finished` 与 `subagent_delivery`, `isAbsorbable`;且只含本轮开始时尚未被消费的,
27
27
  * 即 seq 也大于会话的 `consumed_seq`),按 seq 升序。loop 记录吸收到的最大 seq 作为 `consumedUpToSeq`。
28
28
  */
29
29
  pendingAbsorbable(afterSeq: number): Promise<AbsorbableEvent[]>;
@@ -37,21 +37,49 @@ export interface LoopContext {
37
37
  */
38
38
  conversationKind?: "chat" | "eval" | "subagent";
39
39
  /**
40
- * Set for a sub-agent's run (phase C): the dispatch this run serves. Its tools use the parent
41
- * conversation's sandbox (spec §10.1), and it never dispatches sub-agents itself (depth 1).
40
+ * Set for a sub-agent's run (phase C): the dispatch this run serves. Its tools use the root
41
+ * conversation's sandbox (spec §10.1), and it dispatches sub-agents only while its depth is
42
+ * below `subagents.maxDepth` (agent map spec §4.1).
42
43
  */
43
44
  parent?: SubagentParent;
45
+ /**
46
+ * The run is a sub-agent's without a live `parent`: a child case's eval replay. Its requests
47
+ * offer the message tools a sub-agent has (`SendMessage`, `SubagentHandback`), as the recorded
48
+ * run's did; not for a fork invocation's child (`SubagentParent.forSkill`). Implied by `parent`.
49
+ */
50
+ subagent?: boolean;
44
51
  }
45
52
  /** Where a sub-agent's run was dispatched from (its `subagent_dispatches` row). */
46
53
  export interface SubagentParent {
47
54
  conversationId: string;
48
55
  runId: string;
49
56
  callId: string;
57
+ /**
58
+ * The parent conversation's depth below the root (0: the parent is the root); this run's own
59
+ * depth is one more (agent map spec §6, `conversations.subagent_depth`).
60
+ */
61
+ depth: number;
62
+ /** The root conversation of the tree: its sandbox is the one every sub-agent works in. */
63
+ rootConversationId: string;
50
64
  /**
51
65
  * The child runs another org agent than its parent conversation's (§5.5, `template.source`
52
66
  * `agent`): only then the parent agent's current policies are read on top of its own.
53
67
  */
54
68
  otherAgent?: boolean;
69
+ /**
70
+ * The tree's budget run of this child run (agent map spec §6): the run's own `budget_run_id`
71
+ * (a dispatched run's, or a wake run's current window of the root), else its dispatch row's, read
72
+ * once when the run starts. The loop's budget check and the token counter (`appendCounted`) use
73
+ * it; absent only when unknown, then read with `budgetRunOf(runId)` (the parent run's window,
74
+ * stale for a wake run, whose `runId` is the first dispatch's).
75
+ */
76
+ budgetRunId?: string;
77
+ /**
78
+ * The run is a person's fork invocation's child (phase D, its dispatch's `for_skill`): its parent
79
+ * run waits for its final reply as the skill's report, so it gets neither `SubagentHandback` nor
80
+ * `SendMessage` to its parent (agent map spec §5.4: the fork's behaviour does not change).
81
+ */
82
+ forSkill?: boolean;
55
83
  }
56
84
  /**
57
85
  * 运行在等什么人处理:审批(`approvals` 行)或输入请求(`questions` 行,统一承载 `AskUserQuestion`、
@@ -1,5 +1,6 @@
1
1
  import { WorkerHost } from "@nestjs/bullmq";
2
2
  import type { Job, Queue, Worker } from "bullmq";
3
+ import { OwnedPluginCleanup } from "../catalog/owned-plugin-cleanup.js";
3
4
  import { ScheduledRuns } from "../infra/schedule/scheduled-runs.js";
4
5
  import type { KernelLogger } from "../log.js";
5
6
  import { DirectorySync } from "../orgs/directory-sync.js";
@@ -12,9 +13,10 @@ export { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
12
13
  export declare const MAINTENANCE_CONCURRENCY = 5;
13
14
  /**
14
15
  * The one consumer of `cap-kernel-maintenance` (decision R11 of the Nest kernel spec): dispatches
15
- * each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for` →
16
- * {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
17
- * {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}). The name of a periodic job (a `@LockedCron` / `@LockedInterval` job,
16
+ * each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for` and
17
+ * `sandbox-reset-files` → {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
18
+ * {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}, `owned-plugin-cleanup` →
19
+ * {@link OwnedPluginCleanup}). The name of a periodic job (a `@LockedCron` / `@LockedInterval` job,
18
20
  * such as `sandbox-suspend-idle`) runs that job's body once ({@link ScheduledRuns.runNow}), as the
19
21
  * maintenance handlers did when those jobs were schedulers on this queue: an operator's or a
20
22
  * test's one-off run, not a second schedule (decision R23 of the Nest kernel spec). Any other
@@ -26,10 +28,11 @@ export declare class MaintenanceProcessor extends WorkerHost<Worker> {
26
28
  private readonly drift;
27
29
  private readonly directory;
28
30
  private readonly runs;
31
+ private readonly ownedCleanup;
29
32
  private readonly scheduled;
30
33
  private readonly log;
31
34
  private readonly queue;
32
- constructor(waits: Pick<Waits, "processTimeout">, sandbox: Pick<SandboxService, "destroyFor">, drift: Pick<ToolDrift, "check">, directory: Pick<DirectorySync, "runSyncJob">, runs: Pick<RunQueue, "ensureRun">, scheduled: Pick<ScheduledRuns, "runNow">, log: Pick<KernelLogger, "error" | "warn">, queue: Pick<Queue, "removeJobScheduler">);
35
+ constructor(waits: Pick<Waits, "processTimeout">, sandbox: Pick<SandboxService, "destroyEnvironment" | "resetFileSystem">, drift: Pick<ToolDrift, "check">, directory: Pick<DirectorySync, "runSyncJob">, runs: Pick<RunQueue, "ensureRun">, ownedCleanup: Pick<OwnedPluginCleanup, "run">, scheduled: Pick<ScheduledRuns, "runNow">, log: Pick<KernelLogger, "error" | "warn">, queue: Pick<Queue, "removeJobScheduler">);
33
36
  /**
34
37
  * Removes the retired job schedulers (`RETIRED_SCHEDULER_IDS`, runtime/retired-schedulers.ts): every fixed-period
35
38
  * maintenance job is a `@LockedCron` / `@LockedInterval` now. Idempotent; called once when a
@@ -10,6 +10,8 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
10
10
  import { getQueueToken, OnWorkerEvent, WorkerHost } from "@nestjs/bullmq";
11
11
  import { Inject, Injectable, Module } from "@nestjs/common";
12
12
  import { BG_WAKE_JOB } from "../background/wake-rules.js";
13
+ import { OWNED_PLUGIN_CLEANUP_JOB } from "../catalog/job-ids.js";
14
+ import { OwnedPluginCleanup, OwnedPluginCleanupModule } from "../catalog/owned-plugin-cleanup.js";
13
15
  import { configuredProcessor } from "../infra/queue/configured-processor.js";
14
16
  import { QueueModule } from "../infra/queue/queue.module.js";
15
17
  import { removeRetiredSchedulers } from "../infra/queue/retired-schedulers.js";
@@ -19,7 +21,7 @@ import { ScheduledRuns } from "../infra/schedule/scheduled-runs.js";
19
21
  import { KERNEL_LOGGER } from "../infra/tokens.js";
20
22
  import { DIRECTORY_SYNC_JOB, DirectorySync } from "../orgs/directory-sync.js";
21
23
  import { OrgsModule } from "../orgs/orgs.module.js";
22
- import { runSandboxDestroyFor, SANDBOX_DESTROY_FOR_JOB } from "../sandbox/jobs.js";
24
+ import { runSandboxDestroyFor, runSandboxResetFiles, SANDBOX_DESTROY_FOR_JOB, SANDBOX_RESET_FILES_JOB, } from "../sandbox/jobs.js";
23
25
  import { SandboxModule } from "../sandbox/sandbox.module.js";
24
26
  import { SandboxService } from "../sandbox/sandbox.service.js";
25
27
  import { ToolDrift } from "../tools/drift.js";
@@ -35,9 +37,10 @@ export { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
35
37
  export const MAINTENANCE_CONCURRENCY = 5;
36
38
  /**
37
39
  * The one consumer of `cap-kernel-maintenance` (decision R11 of the Nest kernel spec): dispatches
38
- * each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for` →
39
- * {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
40
- * {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}). The name of a periodic job (a `@LockedCron` / `@LockedInterval` job,
40
+ * each one-off job by name to its domain (`wait-timeout` → {@link Waits}, `sandbox-destroy-for` and
41
+ * `sandbox-reset-files` → {@link SandboxService}, `drift-connector` → {@link ToolDrift}, `directory-sync` →
42
+ * {@link DirectorySync}, `bg-wake` → {@link RunQueue.ensureRun}, `owned-plugin-cleanup` →
43
+ * {@link OwnedPluginCleanup}). The name of a periodic job (a `@LockedCron` / `@LockedInterval` job,
41
44
  * such as `sandbox-suspend-idle`) runs that job's body once ({@link ScheduledRuns.runNow}), as the
42
45
  * maintenance handlers did when those jobs were schedulers on this queue: an operator's or a
43
46
  * test's one-off run, not a second schedule (decision R23 of the Nest kernel spec). Any other
@@ -49,16 +52,18 @@ let MaintenanceProcessor = class MaintenanceProcessor extends WorkerHost {
49
52
  drift;
50
53
  directory;
51
54
  runs;
55
+ ownedCleanup;
52
56
  scheduled;
53
57
  log;
54
58
  queue;
55
- constructor(waits, sandbox, drift, directory, runs, scheduled, log, queue) {
59
+ constructor(waits, sandbox, drift, directory, runs, ownedCleanup, scheduled, log, queue) {
56
60
  super();
57
61
  this.waits = waits;
58
62
  this.sandbox = sandbox;
59
63
  this.drift = drift;
60
64
  this.directory = directory;
61
65
  this.runs = runs;
66
+ this.ownedCleanup = ownedCleanup;
62
67
  this.scheduled = scheduled;
63
68
  this.log = log;
64
69
  this.queue = queue;
@@ -86,6 +91,9 @@ let MaintenanceProcessor = class MaintenanceProcessor extends WorkerHost {
86
91
  case SANDBOX_DESTROY_FOR_JOB:
87
92
  await runSandboxDestroyFor(this.sandbox, this.log, job);
88
93
  return;
94
+ case SANDBOX_RESET_FILES_JOB:
95
+ await runSandboxResetFiles(this.sandbox, job);
96
+ return;
89
97
  case DRIFT_CONNECTOR_JOB: {
90
98
  const { orgId, connectorId, trigger } = job.data;
91
99
  await this.drift.check(orgId, connectorId, trigger);
@@ -101,6 +109,10 @@ let MaintenanceProcessor = class MaintenanceProcessor extends WorkerHost {
101
109
  await this.runs.ensureRun(conversationId, { wakeRetry: (retry ?? 0) + 1 });
102
110
  return;
103
111
  }
112
+ // a removed org-owned plugin's extension (plugin scope phase 3, P3-20)
113
+ case OWNED_PLUGIN_CLEANUP_JOB:
114
+ await this.ownedCleanup.run(job.data.itemId);
115
+ return;
104
116
  default:
105
117
  if (await this.scheduled.runNow(job.name))
106
118
  return;
@@ -127,9 +139,10 @@ MaintenanceProcessor = __decorate([
127
139
  __param(2, Inject(ToolDrift)),
128
140
  __param(3, Inject(DirectorySync)),
129
141
  __param(4, Inject(RunQueue)),
130
- __param(5, Inject(ScheduledRuns)),
131
- __param(6, Inject(KERNEL_LOGGER)),
132
- __param(7, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME)))
142
+ __param(5, Inject(OwnedPluginCleanup)),
143
+ __param(6, Inject(ScheduledRuns)),
144
+ __param(7, Inject(KERNEL_LOGGER)),
145
+ __param(8, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME)))
133
146
  ], MaintenanceProcessor);
134
147
  export { MaintenanceProcessor };
135
148
  /**
@@ -149,6 +162,8 @@ MaintenanceModule = __decorate([
149
162
  SandboxModule,
150
163
  ToolsModule,
151
164
  OrgsModule,
165
+ // the removed org plugins' cleanup and its daily sweep (worker-only through this module)
166
+ OwnedPluginCleanupModule,
152
167
  QueueModule.registerQueue(MAINTENANCE_QUEUE_NAME),
153
168
  ],
154
169
  providers: [
@@ -14,17 +14,28 @@ import type { StepLog } from "./step-log.js";
14
14
  import type { UsageReporter } from "./usage-report.js";
15
15
  /** 单轮收尾的尾部提醒(模型可见,英文;spec 6 轮次额度收尾)。 */
16
16
  export declare 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 declare const TOOLS_UNSUPPORTED_REMINDER = "Tools are unavailable for this model. Answer without calling tools.";
17
+ /**
18
+ * The tail reminder of a sub-agent's final call once its tree used its token budget (model-visible,
19
+ * English; sub-agents spec §8.3): the child hands back what it found instead of ending with nothing.
20
+ */
21
+ export declare const BUDGET_WRAP_UP_REMINDER: string;
22
+ /** Why a run makes its final, tool-less call: its step limit, or its tree's token budget. */
23
+ export type WrapUpReason = "max_steps" | "budget";
24
+ export { TOOLS_UNSUPPORTED_REMINDER } from "./context/reminders.js";
19
25
  /** 不可用工具提醒的前缀(模型可见,英文)。 */
20
26
  export declare const TOOLS_UNAVAILABLE_PREFIX = "The following tools are unavailable in this run: ";
21
27
  /** 本 run 中此前有工具不可用、现在全部恢复时的提醒(模型可见,英文)。 */
22
28
  export declare const TOOLS_AVAILABLE_AGAIN = "All previously unavailable tools are available again.";
23
29
  /** 不可用工具提醒:`The following tools are unavailable in this run: <ref> (<reason>), ...`。 */
24
30
  export declare function toolsUnavailableReminder(unavailable: readonly UnavailableTool[]): string;
25
- /** 流式增量的出口(推给前端等订阅方);`step_reset` 表示丢弃本步已推出的增量、重新开始。 */
31
+ /**
32
+ * 流式增量的出口(推给前端等订阅方);`step_reset` 表示丢弃本步已推出的增量、重新开始。
33
+ * `stream_end` (the step's model stream completed) and `step_end` (the step's `assistant_message`
34
+ * is logged) carry no delta: the run worker's sink writes and then clears the step's live draft on
35
+ * them (spec 2026-11-07 §3.2) and publishes neither.
36
+ */
26
37
  export type StreamSink = (delta: {
27
- kind: "text" | "thinking" | "step_reset";
38
+ kind: "text" | "thinking" | "step_reset" | "stream_end" | "step_end";
28
39
  runId: string;
29
40
  step: number;
30
41
  text?: string;
@@ -95,9 +106,12 @@ export interface ModelStepInput {
95
106
  conversationKind?: ConversationKindForHooks;
96
107
  /** A sub-agent's run: where it was dispatched from (hook payloads carry it as `parent`). */
97
108
  parent?: SubagentParent;
109
+ /** A sub-agent's run without a live parent (a child case's eval replay, `LoopContext`). */
110
+ subagent?: boolean;
98
111
  /**
99
- * A sub-agent's run (phase C): the parent run whose `subagent_tokens_used` counts every usage
100
- * event this step writes (step, wrap-up and compaction calls; spec §8.3).
112
+ * A sub-agent's run (phase C): the parent run whose budget run's `subagent_tokens_used` counts
113
+ * every usage event this step writes (step, wrap-up and compaction calls; spec §8.3, agent map
114
+ * spec §6).
101
115
  */
102
116
  parentRunId?: string;
103
117
  /**
@@ -150,13 +164,16 @@ export declare function runModelStep(deps: ModelStepDeps, input: ModelStepInput)
150
164
  * 单轮收尾:到达步数上限时调用一次。写入收尾 `reminder`(位于请求末尾);照常带工具(历史里有工具调用时
151
165
  * 部分供应商要求请求声明工具,也保持缓存前缀稳定),但 `toolChoice: "none"`——模型只能回复文本。
152
166
  * 其余与 `runModelStep` 相同(幂等、降级、中止)。
167
+ *
168
+ * `reason: "budget"`: a sub-agent whose tree used its token budget makes this one call to hand back
169
+ * what it found (sub-agents spec §8.3); it is not stopped by the budget again (one call over).
153
170
  */
154
- export declare function runFinalWrapUp(deps: ModelStepDeps, input: ModelStepInput): Promise<ModelStepResult>;
171
+ export declare function runFinalWrapUp(deps: ModelStepDeps, input: ModelStepInput, reason?: WrapUpReason): Promise<ModelStepResult>;
155
172
  /**
156
173
  * Appends a model call's events (its reply or compaction outcome with its `usage`; also the usage
157
174
  * of a `WebFetch` extraction call, `tools/builtins/web/extract.ts`). For a
158
175
  * sub-agent's run (`input.parentRunId`) in one transaction that also adds the tokens of the usage
159
- * events it newly wrote to the parent run's `subagent_tokens_used` (sub-agents spec §8.3): a usage
176
+ * events it newly wrote to the budget run's `subagent_tokens_used` (sub-agents spec §8.3): a usage
160
177
  * event already in the log (an idempotent hit after a crash) adds nothing, so each call counts
161
178
  * exactly once.
162
179
  */
@@ -166,6 +183,11 @@ export declare function appendCounted(deps: {
166
183
  }, input: {
167
184
  conversationId: string;
168
185
  parentRunId?: string | undefined;
186
+ /** The run's budget window (agent map spec §6), when known; else the parent run's. */
187
+ budgetRunId?: string | undefined;
188
+ parent?: {
189
+ budgetRunId?: string | undefined;
190
+ } | undefined;
169
191
  }, events: AppendEvent[]): Promise<ConversationEvent[]>;
170
192
  /** {@link assembleModelRequest} 的输入。 */
171
193
  export interface AssembleModelRequestInput extends Omit<BuildModelRequestInput, "tools"> {
@@ -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,6 +265,7 @@ 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
  }
@@ -229,7 +273,7 @@ async function runStep(deps, input, wrapUp) {
229
273
  * Appends a model call's events (its reply or compaction outcome with its `usage`; also the usage
230
274
  * of a `WebFetch` extraction call, `tools/builtins/web/extract.ts`). For a
231
275
  * sub-agent's run (`input.parentRunId`) in one transaction that also adds the tokens of the usage
232
- * 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
233
277
  * event already in the log (an idempotent hit after a crash) adds nothing, so each call counts
234
278
  * exactly once.
235
279
  */
@@ -237,7 +281,8 @@ export async function appendCounted(deps, input, events) {
237
281
  const { conversationId, parentRunId } = input;
238
282
  if (parentRunId === undefined)
239
283
  return deps.eventLog.append(conversationId, events);
240
- 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);
241
286
  if (out.toSeq !== null)
242
287
  await deps.eventLog.notify(conversationId, out.toSeq);
243
288
  return out.written;
@@ -658,11 +703,14 @@ function mergeLocal(events, written) {
658
703
  * 每次实际尝试写自己的 `model_call`(attempt 从 1 连续递增,跳过的不计);重试前经 sink 发 `step_reset`。
659
704
  * 不可重试的失败或梯子用尽 → `RunError`。
660
705
  */
661
- async function ladder(deps, input, events, runtime, tools, wrapUp, streamed) {
706
+ async function ladder(deps, input, events, runtime, tools, wrapUpReason, streamed) {
662
707
  const { conversationId, runId, step, signal, sink, agent } = input;
663
- const turnReminder = wrapUp
664
- ? WRAP_UP_REMINDER
665
- : 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);
666
714
  let evs = events;
667
715
  const rungs = [
668
716
  { ref: agent.model, fallback: false },
@@ -785,6 +833,8 @@ async function ladder(deps, input, events, runtime, tools, wrapUp, streamed) {
785
833
  sink({ kind: "thinking", runId, step, text: ev.text });
786
834
  }
787
835
  });
836
+ // the draft's last write, before the assistant_message is logged
837
+ sink({ kind: "stream_end", runId, step });
788
838
  if (scope && deps.hooks) {
789
839
  fireObserve(deps.hooks, "model.response", {
790
840
  ...scope,
@@ -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;