@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
@@ -10,7 +10,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
10
10
  import { Inject, Injectable, Optional } from "@nestjs/common";
11
11
  import { DelayedError } from "bullmq";
12
12
  import { sql } from "kysely";
13
- import { conversationTopic, EventLog, } from "../conversations/event-log.js";
13
+ import { EventLog } from "../conversations/event-log.js";
14
14
  import { isAbsorbable, } from "../conversations/events.js";
15
15
  import { effectiveDefinition, NO_SELECTION, readSelection, sameModel, sameSelection, } from "../conversations/selection.js";
16
16
  import { TitleQueue } from "../conversations/titles.js";
@@ -32,10 +32,11 @@ import { ConversationLock } from "./conversation-lock.js";
32
32
  import { RunError } from "./model-call.js";
33
33
  import { ProviderListError, ProviderRegistry } from "./providers.js";
34
34
  import { ORG_QUOTA_LEASE_MS, orgRunLimit, RUN_QUOTA } from "./quota.js";
35
+ import { RunDrafts, streamSink } from "./run-drafts.js";
35
36
  import { RunFinish, TERMINAL_STATUSES } from "./run-finish.js";
36
37
  import { RunQueue } from "./run-queue.js";
37
38
  import { AgentLoops, RunSteps } from "./run-steps.js";
38
- import { dispatchOfChildRun } from "./subagents/child.js";
39
+ import { dispatchOfChildRun, rootConversationOf } from "./subagents/child.js";
39
40
  import { childRunDefinition } from "./subagents/definition.js";
40
41
  import { forkBoundary } from "./subagents/skill-fork.js";
41
42
  import { Waits } from "./waits.js";
@@ -86,6 +87,7 @@ let RunWorker = class RunWorker {
86
87
  pipeline;
87
88
  finisher;
88
89
  txHost;
90
+ drafts;
89
91
  hooks;
90
92
  /** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
91
93
  workers = [];
@@ -114,7 +116,9 @@ let RunWorker = class RunWorker {
114
116
  * (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
115
117
  * commit (sub-agents spec §12, review m1: a failed or stalled parent too).
116
118
  */
117
- pipeline, finisher, txHost, hooks) {
119
+ pipeline, finisher, txHost,
120
+ /** The steps' live drafts this process writes for the runs it executes. */
121
+ drafts, hooks) {
118
122
  this.kdb = kdb;
119
123
  this.eventLog = eventLog;
120
124
  this.lock = lock;
@@ -134,6 +138,7 @@ let RunWorker = class RunWorker {
134
138
  this.pipeline = pipeline;
135
139
  this.finisher = finisher;
136
140
  this.txHost = txHost;
141
+ this.drafts = drafts;
137
142
  this.hooks = hooks;
138
143
  this.loop = loops.create(steps.deps);
139
144
  }
@@ -178,35 +183,16 @@ let RunWorker = class RunWorker {
178
183
  }
179
184
  }
180
185
  /**
181
- * 流式增量发布到会话频道(与 `{ kind: "events" }` 共用 `conv.<id>`),任意副本上的订阅方都能收到。
182
- * 发布失败只记日志:增量只是草稿,最终内容以日志中的 assistant_message 为准。
186
+ * The run's stream sink: deltas on the conversation's topic (any replica's subscribers get them)
187
+ * and the steps' live drafts in Redis ({@link streamSink}, spec 2026-11-07 §3.2).
183
188
  */
184
189
  sinkFor(conversationId) {
185
- // 本次运行执行中推出的文本字符数(按步,step_reset 清零):本进程正在执行的这次运行自己的计数
186
- let at = { runId: "", step: -1, chars: 0 };
187
- return (d) => {
188
- if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
189
- at = { runId: d.runId, step: d.step, chars: 0 };
190
- }
191
- const offset = at.chars;
192
- if (d.kind === "text")
193
- at.chars += d.text?.length ?? 0;
194
- const msg = {
195
- kind: "delta",
196
- runId: d.runId,
197
- step: d.step,
198
- delta: d.kind,
199
- ...(d.text !== undefined && { text: d.text }),
200
- ...(d.kind === "text" && { offset }),
201
- };
202
- this.bus
203
- .publish(conversationTopic(conversationId), msg)
204
- .catch((err) => this.log.warn("stream delta publish failed", { conversationId, err }));
205
- };
190
+ return streamSink(conversationId, { bus: this.bus, drafts: this.drafts, log: this.log });
206
191
  }
207
192
  /**
208
193
  * After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
209
- * active children on its behalf (no account). The wait sweep is the backstop.
194
+ * active fork invocation child on its behalf (no account); background `Agent` children keep
195
+ * running (agent map spec §5.4). The wait sweep is the backstop.
210
196
  */
211
197
  async stopChildren(runId) {
212
198
  try {
@@ -228,6 +214,14 @@ let RunWorker = class RunWorker {
228
214
  catch (err) {
229
215
  this.log.error("cannot report finished sub-agent run to its parent", { runId, err });
230
216
  }
217
+ // a sub-agent a person stopped stops its descendants too, also one it dispatched after the
218
+ // tree stop read the tree (agent map spec §6); any other end leaves them running
219
+ try {
220
+ await this.waits.stopDescendantsOfStopped(runId);
221
+ }
222
+ catch (err) {
223
+ this.log.error("cannot stop the descendants of a stopped sub-agent", { runId, err });
224
+ }
231
225
  }
232
226
  /**
233
227
  * 任务结束后的 ensureRun,失败按 {@link ENSURE_RETRY_DELAYS_MS} 退避重试;停机开始后不再等待间隔
@@ -369,6 +363,7 @@ let RunWorker = class RunWorker {
369
363
  "trigger_seq",
370
364
  "started_at",
371
365
  "waited_ms",
366
+ "budget_run_id",
372
367
  ])
373
368
  .where("id", "=", runId)
374
369
  .executeTakeFirst();
@@ -386,7 +381,7 @@ let RunWorker = class RunWorker {
386
381
  return;
387
382
  const conv = await this.db
388
383
  .selectFrom("conversations")
389
- .select(["org_id", "agent_id", "kind"])
384
+ .select(["org_id", "agent_id", "kind", "subagent_depth"])
390
385
  .where("id", "=", conversationId)
391
386
  .executeTakeFirst();
392
387
  if (!conv)
@@ -532,18 +527,36 @@ let RunWorker = class RunWorker {
532
527
  maxSteps = Math.min(started.payload.maxSteps, runtime.maxSteps);
533
528
  const row = await dispatchOfChildRun(this.db, runId);
534
529
  const otherAgent = started.payload.template.source === "agent";
530
+ const parentConversationId = row?.parentConversationId ?? started.payload.parent.conversationId;
531
+ // a sub-agent conversation is at depth 1 at least: one written before depths were recorded
532
+ // (default 0) was a child of a root
533
+ const depth = Math.max(conv.subagent_depth, 1) - 1;
534
+ const rootConversationId = depth === 0
535
+ ? parentConversationId
536
+ : await rootConversationOf(this.db, parentConversationId);
537
+ // the tree's budget window of THIS run (agent map spec §6): its own `budget_run_id`, set when
538
+ // it was created (a dispatch, or a wake run from the root's current window), else its
539
+ // dispatch's; never derived from the parent run, which for a wake run is the first dispatch's
540
+ const budgetRunId = run.budget_run_id ?? row?.budgetRunId;
535
541
  parent = row
536
542
  ? {
537
543
  conversationId: row.parentConversationId,
538
544
  runId: row.parentRunId,
539
545
  callId: row.parentCallId,
546
+ depth,
547
+ rootConversationId,
540
548
  otherAgent,
549
+ ...(budgetRunId !== undefined && { budgetRunId }),
550
+ ...(row.forSkill === true && { forSkill: true }),
541
551
  }
542
552
  : {
543
553
  conversationId: started.payload.parent.conversationId,
544
554
  runId: started.payload.parent.runId,
545
555
  callId: started.payload.parent.callId,
556
+ depth,
557
+ rootConversationId,
546
558
  otherAgent,
559
+ ...(budgetRunId !== undefined && { budgetRunId }),
547
560
  };
548
561
  }
549
562
  else {
@@ -703,6 +716,10 @@ let RunWorker = class RunWorker {
703
716
  });
704
717
  return "finished";
705
718
  }
719
+ finally {
720
+ // the execution here ended: what this process held of the run's drafts goes
721
+ this.drafts.release(runId);
722
+ }
706
723
  if (state.abandoned)
707
724
  return "abandoned";
708
725
  // 锁在运行中丢失:无论 loop 返回什么都不写终态,任务回到队列由持锁者续跑。
@@ -816,7 +833,8 @@ let RunWorker = class RunWorker {
816
833
  const agent = saved !== undefined
817
834
  ? effectiveDefinition(saved, await readSelection(t, conversationId))
818
835
  : current;
819
- // a wake run's boundary is a finished background task, not a message (background Bash §3)
836
+ // a wake run's boundary is a finished background task (background Bash §3) or a sub-agent's
837
+ // delivery (agent map spec §5.3), not a message
820
838
  const boundary = await t
821
839
  .selectFrom("conversation_events")
822
840
  .select("type")
@@ -836,6 +854,10 @@ let RunWorker = class RunWorker {
836
854
  trigger: "background_task",
837
855
  triggerSeq: Number(run.trigger_seq),
838
856
  }),
857
+ ...(boundary?.type === "subagent_delivery" && {
858
+ trigger: "subagent",
859
+ triggerSeq: Number(run.trigger_seq),
860
+ }),
839
861
  },
840
862
  },
841
863
  ]);
@@ -927,7 +949,8 @@ RunWorker = __decorate([
927
949
  __param(18, Inject(ToolPipeline)),
928
950
  __param(19, Inject(RunFinish)),
929
951
  __param(20, Inject(TransactionHost)),
930
- __param(21, Optional()),
931
- __param(21, Inject(RUN_HOOKS))
952
+ __param(21, Inject(RunDrafts)),
953
+ __param(22, Optional()),
954
+ __param(22, Inject(RUN_HOOKS))
932
955
  ], RunWorker);
933
956
  export { RunWorker };
@@ -25,6 +25,7 @@ import { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
25
25
  import { ProvidersModule } from "./providers.js";
26
26
  import { EVAL_QUOTA, EVAL_QUOTA_PREFIX, OrgQuota, RUN_QUOTA, RUN_QUOTA_PREFIX } from "./quota.js";
27
27
  import { RunControl } from "./run-control.js";
28
+ import { RunDrafts } from "./run-drafts.js";
28
29
  import { RunFinish } from "./run-finish.js";
29
30
  import { RunJobsModule } from "./run-jobs.js";
30
31
  import { RunQueue } from "./run-queue.js";
@@ -75,6 +76,7 @@ RuntimeModule = __decorate([
75
76
  Waits,
76
77
  DecisionResumer,
77
78
  RunControl,
79
+ RunDrafts,
78
80
  AgentLoops,
79
81
  RunSteps,
80
82
  RunWorker,
@@ -102,6 +104,7 @@ RuntimeModule = __decorate([
102
104
  RunQueue,
103
105
  Waits,
104
106
  RunControl,
107
+ RunDrafts,
105
108
  AgentLoops,
106
109
  RunSteps,
107
110
  RunWorker,
@@ -19,11 +19,16 @@ export declare class StepLog {
19
19
  constructor(kdb: KernelDb, eventLog: EventLog, txHost: TransactionHost);
20
20
  /**
21
21
  * Appends events of a sub-agent's run and adds the tokens of the usage events it newly wrote to
22
- * the parent run's `subagent_tokens_used` (sub-agents spec §8.3): a usage event already in the
23
- * log (an idempotent hit after a crash) adds nothing, so each call counts exactly once. Returns
24
- * what was written (hits included) and the highest new seq (null: nothing new).
22
+ * the `subagent_tokens_used` of the tree's budget run (sub-agents spec §8.3, agent map spec §6:
23
+ * the whole tree counts on one run): `counter.budgetRunId`, the run's own window
24
+ * (`SubagentParent.budgetRunId`), else the parent run's ({@link budgetRunOf}). A usage event
25
+ * already in the log (an idempotent hit after a crash) adds nothing, so each call counts exactly
26
+ * once. Returns what was written (hits included) and the highest new seq (null: nothing new).
25
27
  */
26
- appendCounted(conversationId: string, parentRunId: string, events: AppendEvent[]): Promise<{
28
+ appendCounted(conversationId: string, counter: {
29
+ parentRunId: string;
30
+ budgetRunId?: string | undefined;
31
+ }, events: AppendEvent[]): Promise<{
27
32
  written: ConversationEvent[];
28
33
  toSeq: number | null;
29
34
  }>;
@@ -16,6 +16,7 @@ import { KernelDb } from "../infra/database/kernel-db.js";
16
16
  import { TransactionHost } from "../infra/database/transaction-host.js";
17
17
  import { Transactional } from "../infra/database/transactional.decorator.js";
18
18
  import { recordToolSpecs } from "../tools/specs.js";
19
+ import { budgetRunOf } from "./subagents/limits.js";
19
20
  /**
20
21
  * The writes of a run step that go to the event log together with another row, each in a
21
22
  * transaction of its own (the caller notifies the log after the commit): a model call with the
@@ -33,11 +34,13 @@ let StepLog = class StepLog {
33
34
  }
34
35
  /**
35
36
  * Appends events of a sub-agent's run and adds the tokens of the usage events it newly wrote to
36
- * the parent run's `subagent_tokens_used` (sub-agents spec §8.3): a usage event already in the
37
- * log (an idempotent hit after a crash) adds nothing, so each call counts exactly once. Returns
38
- * what was written (hits included) and the highest new seq (null: nothing new).
37
+ * the `subagent_tokens_used` of the tree's budget run (sub-agents spec §8.3, agent map spec §6:
38
+ * the whole tree counts on one run): `counter.budgetRunId`, the run's own window
39
+ * (`SubagentParent.budgetRunId`), else the parent run's ({@link budgetRunOf}). A usage event
40
+ * already in the log (an idempotent hit after a crash) adds nothing, so each call counts exactly
41
+ * once. Returns what was written (hits included) and the highest new seq (null: nothing new).
39
42
  */
40
- async appendCounted(conversationId, parentRunId, events) {
43
+ async appendCounted(conversationId, counter, events) {
41
44
  const t = this.kdb.db;
42
45
  // the conversation row lock the append takes anyway, taken first to read the seq before it
43
46
  const before = await t
@@ -56,7 +59,7 @@ let StepLog = class StepLog {
56
59
  await t
57
60
  .updateTable("runs")
58
61
  .set({ subagent_tokens_used: sql `subagent_tokens_used + ${tokens}` })
59
- .where("id", "=", parentRunId)
62
+ .where("id", "=", counter.budgetRunId ?? (await budgetRunOf(t, counter.parentRunId)))
60
63
  .execute();
61
64
  }
62
65
  return { written, toSeq: fresh.length > 0 ? Math.max(...fresh.map((e) => e.seq)) : null };
@@ -1,18 +1,27 @@
1
+ import type { Logger } from "@capybara-hq/plugin-sdk";
1
2
  import type { FastifyReply, FastifyRequest } from "fastify";
2
3
  import { z } from "zod";
4
+ import { ConversationAccess } from "../conversations/access.js";
3
5
  import { ConversationsService } from "../conversations/conversations.service.js";
4
6
  import { ApiTokenService } from "../identity/api-tokens.js";
5
7
  import { type Principal } from "../identity/principal.js";
6
8
  import { SessionService } from "../identity/sessions.js";
7
9
  import { type OrgContext } from "../orgs/org.guard.js";
10
+ import { type RunDraft, RunDrafts } from "./run-drafts.js";
8
11
  import { ConversationStreams } from "./stream.js";
9
12
  declare const StreamQuery: z.ZodObject<{
10
13
  after: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
11
14
  }, z.core.$strip>;
15
+ declare const DraftParams: z.ZodObject<{
16
+ id: z.ZodString;
17
+ runId: z.ZodString;
18
+ }, z.core.$strip>;
12
19
  /**
13
20
  * 会话事件流(SSE):`GET /api/v1/orgs/:orgId/conversations/:id/stream?after=<seq>`,`agents.use`,只有会话所有者可用。
14
21
  * - 打开时不阻塞地调用一次 ensureRun(`ConversationsService.kickRun`),停在「运行中」的孤儿运行由此被清理;
15
22
  * - 先订阅会话频道、再回放 `after`(或优先的 `Last-Event-ID`)之后的事件:`id: <seq>` / `event: event`;
23
+ * - after that catch-up, one `event: draft` (`data: {"runId","step","text","thinking"}`) per step of
24
+ * the running run whose `assistant_message` is not logged (live drafts, spec 2026-11-07 §3.2);
16
25
  * 之后收到 `events` 通知就补读新事件(按 seq 去重),收到增量就发 `event: delta`,收到界面刷新
17
26
  * (插件 `ctx.ui.invalidate`)就发 `event: ui`(`data: {"plugin","contribution"}`);
18
27
  * - 每 `runtime.sseHeartbeatMs` 发 `: ping` 注释;每 `runtime.sseRecheckMs` 复核凭据(会话未吊销 / 令牌仍有效,
@@ -25,7 +34,20 @@ export declare class ConversationStreamController {
25
34
  private readonly sessions;
26
35
  private readonly tokens;
27
36
  private readonly conversations;
28
- constructor(streams: ConversationStreams, sessions: SessionService, tokens: ApiTokenService, conversations: ConversationsService);
37
+ private readonly access;
38
+ private readonly drafts;
39
+ private readonly log;
40
+ constructor(streams: ConversationStreams, sessions: SessionService, tokens: ApiTokenService, conversations: ConversationsService, access: ConversationAccess, drafts: RunDrafts, log: Pick<Logger, "warn">);
41
+ /**
42
+ * The live drafts of one run (spec 2026-11-07 §3.2): `{ drafts: { step, text, thinking }[] }`,
43
+ * the steps still streaming whose `assistant_message` is not logged (none once the run is no
44
+ * longer running). What a stream client asks for when a delta's `offset` is past its draft.
45
+ * The stream's access rule (the conversation is visible to the viewer, else 404
46
+ * `conversation.not_found`); a run not of this conversation → 404 `run.not_found`.
47
+ */
48
+ draft(principal: Principal, org: OrgContext, params: z.infer<typeof DraftParams>): Promise<{
49
+ drafts: RunDraft[];
50
+ }>;
29
51
  stream(principal: Principal, org: OrgContext, id: string, q: z.infer<typeof StreamQuery>, lastEventId: string | undefined, req: FastifyRequest, reply: FastifyReply): Promise<void>;
30
52
  }
31
53
  export {};
@@ -9,15 +9,18 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
9
  };
10
10
  import { Controller, Get, Headers, Inject, Param, Req, Res } from "@nestjs/common";
11
11
  import { z } from "zod";
12
+ import { ConversationAccess } from "../conversations/access.js";
12
13
  import { ConversationsService } from "../conversations/conversations.service.js";
13
14
  import { ApiError } from "../errors.js";
14
15
  import { ApiTokenService } from "../identity/api-tokens.js";
15
16
  import { credentialCheck } from "../identity/credential-check.js";
16
17
  import { CurrentPrincipal, requireUser } from "../identity/principal.js";
17
18
  import { SessionService } from "../identity/sessions.js";
19
+ import { KERNEL_LOGGER } from "../infra/tokens.js";
18
20
  import { createZodDto } from "../infra/validation/create-zod-dto.js";
19
- import { ZQuery } from "../infra/validation/zod-params.js";
21
+ import { ZParam, ZQuery } from "../infra/validation/zod-params.js";
20
22
  import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
23
+ import { RunDrafts } from "./run-drafts.js";
21
24
  import { ConversationStreams } from "./stream.js";
22
25
  const BEARER_RE = /^Bearer\s+(\S+)$/i;
23
26
  const StreamQuery = z.object({
@@ -32,12 +35,20 @@ function parseLastEventId(v) {
32
35
  }
33
36
  return n;
34
37
  }
38
+ const DraftParams = z.object({
39
+ id: z.string().min(1).max(100),
40
+ runId: z.string().min(1).max(100),
41
+ });
35
42
  class ConversationStreamQueryDto extends createZodDto(StreamQuery, "ConversationStreamQuery") {
36
43
  }
44
+ class RunDraftParamsDto extends createZodDto(DraftParams, "RunDraftParams") {
45
+ }
37
46
  /**
38
47
  * 会话事件流(SSE):`GET /api/v1/orgs/:orgId/conversations/:id/stream?after=<seq>`,`agents.use`,只有会话所有者可用。
39
48
  * - 打开时不阻塞地调用一次 ensureRun(`ConversationsService.kickRun`),停在「运行中」的孤儿运行由此被清理;
40
49
  * - 先订阅会话频道、再回放 `after`(或优先的 `Last-Event-ID`)之后的事件:`id: <seq>` / `event: event`;
50
+ * - after that catch-up, one `event: draft` (`data: {"runId","step","text","thinking"}`) per step of
51
+ * the running run whose `assistant_message` is not logged (live drafts, spec 2026-11-07 §3.2);
41
52
  * 之后收到 `events` 通知就补读新事件(按 seq 去重),收到增量就发 `event: delta`,收到界面刷新
42
53
  * (插件 `ctx.ui.invalidate`)就发 `event: ui`(`data: {"plugin","contribution"}`);
43
54
  * - 每 `runtime.sseHeartbeatMs` 发 `: ping` 注释;每 `runtime.sseRecheckMs` 复核凭据(会话未吊销 / 令牌仍有效,
@@ -50,11 +61,47 @@ let ConversationStreamController = class ConversationStreamController {
50
61
  sessions;
51
62
  tokens;
52
63
  conversations;
53
- constructor(streams, sessions, tokens, conversations) {
64
+ access;
65
+ drafts;
66
+ log;
67
+ constructor(streams, sessions, tokens, conversations, access, drafts, log) {
54
68
  this.streams = streams;
55
69
  this.sessions = sessions;
56
70
  this.tokens = tokens;
57
71
  this.conversations = conversations;
72
+ this.access = access;
73
+ this.drafts = drafts;
74
+ this.log = log;
75
+ }
76
+ /**
77
+ * The live drafts of one run (spec 2026-11-07 §3.2): `{ drafts: { step, text, thinking }[] }`,
78
+ * the steps still streaming whose `assistant_message` is not logged (none once the run is no
79
+ * longer running). What a stream client asks for when a delta's `offset` is past its draft.
80
+ * The stream's access rule (the conversation is visible to the viewer, else 404
81
+ * `conversation.not_found`); a run not of this conversation → 404 `run.not_found`.
82
+ */
83
+ async draft(principal, org, params) {
84
+ const p = requireUser(principal);
85
+ if (!(await this.access.isAccessible(org.orgId, params.id, p.account.id))) {
86
+ throw new ApiError("conversation.not_found", "Conversation not found");
87
+ }
88
+ if (!(await this.drafts.runOf(params.id, params.runId))) {
89
+ throw new ApiError("run.not_found", "Run not found");
90
+ }
91
+ let live;
92
+ try {
93
+ live = await this.drafts.live(params.id, params.runId);
94
+ }
95
+ catch (err) {
96
+ // a convenience, like the stream's: no drafts rather than an error (the log stays the truth)
97
+ this.log.warn("cannot read live drafts", {
98
+ conversationId: params.id,
99
+ runId: params.runId,
100
+ err,
101
+ });
102
+ live = [];
103
+ }
104
+ return { drafts: live.map(({ step, text, thinking }) => ({ step, text, thinking })) };
58
105
  }
59
106
  async stream(principal, org, id, q, lastEventId, req, reply) {
60
107
  const p = requireUser(principal);
@@ -103,6 +150,13 @@ let ConversationStreamController = class ConversationStreamController {
103
150
  handle.begin();
104
151
  }
105
152
  };
153
+ __decorate([
154
+ Get(":id/runs/:runId/draft"),
155
+ OrgAction("agents.use"),
156
+ __param(0, CurrentPrincipal()),
157
+ __param(1, CurrentOrg()),
158
+ __param(2, ZParam(RunDraftParamsDto))
159
+ ], ConversationStreamController.prototype, "draft", null);
106
160
  __decorate([
107
161
  Get(":id/stream"),
108
162
  OrgAction("agents.use"),
@@ -119,6 +173,9 @@ ConversationStreamController = __decorate([
119
173
  __param(0, Inject(ConversationStreams)),
120
174
  __param(1, Inject(SessionService)),
121
175
  __param(2, Inject(ApiTokenService)),
122
- __param(3, Inject(ConversationsService))
176
+ __param(3, Inject(ConversationsService)),
177
+ __param(4, Inject(ConversationAccess)),
178
+ __param(5, Inject(RunDrafts)),
179
+ __param(6, Inject(KERNEL_LOGGER))
123
180
  ], ConversationStreamController);
124
181
  export { ConversationStreamController };
@@ -4,6 +4,7 @@ import { EventLog } from "../conversations/event-log.js";
4
4
  import type { CredentialCheck } from "../identity/credential-check.js";
5
5
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
6
6
  import { GracefulShutdown } from "../infra/lifecycle/graceful-shutdown.service.js";
7
+ import { type LiveDraft, RunDrafts } from "./run-drafts.js";
7
8
  /** 一次 SSE 连接的输出端(由 HTTP 层包装原始响应)。 */
8
9
  export interface SseOutput {
9
10
  write(chunk: string): void;
@@ -25,6 +26,8 @@ export interface ConversationStreamsDeps {
25
26
  access(orgId: string, conversationId: string, viewerAccountId: string): Promise<boolean>;
26
27
  config: Pick<KernelConfigService, "get">;
27
28
  log: Pick<Logger, "warn">;
29
+ /** The live drafts of the conversation's running run (sent once, after the open catch-up). */
30
+ drafts(conversationId: string): Promise<LiveDraft[]>;
28
31
  }
29
32
  export interface StreamParams {
30
33
  orgId: string;
@@ -60,7 +63,7 @@ export declare class ConversationStreams {
60
63
  * an event stream. Without `GracefulShutdown` (a standalone HTTP application, tests only) the
61
64
  * streams end with their connections.
62
65
  */
63
- constructor(eventLog: Pick<EventLog, "readAfter">, bus: StreamBus, access: Pick<ConversationAccess, "isAccessible">, config: Pick<KernelConfigService, "get">, log: Pick<Logger, "warn">, shutdown?: Pick<GracefulShutdown, "signal">);
66
+ constructor(eventLog: Pick<EventLog, "readAfter">, bus: StreamBus, access: Pick<ConversationAccess, "isAccessible">, config: Pick<KernelConfigService, "get">, log: Pick<Logger, "warn">, drafts: Pick<RunDrafts, "live">, shutdown?: Pick<GracefulShutdown, "signal">);
64
67
  /**
65
68
  * 复核凭据与可见性,并先订阅会话频道(之后再回放,避免遗漏两者之间提交的事件)。
66
69
  * 凭据失效 → 对应的 `auth.*`;不可见 → `conversation.not_found`;订阅失败照常抛出。此时尚未写任何响应,调用方可以按普通错误返回。
@@ -15,6 +15,7 @@ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
15
15
  import { GracefulShutdown } from "../infra/lifecycle/graceful-shutdown.service.js";
16
16
  import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
17
17
  import { isUiBusMessage, uiFrame } from "../ui/registry.js";
18
+ import { RunDrafts } from "./run-drafts.js";
18
19
  /** 补读事件的分页大小。 */
19
20
  const PAGE = 500;
20
21
  /** 慢客户端的积压上限:超过即关闭流,客户端带 Last-Event-ID 重连补读。 */
@@ -55,6 +56,7 @@ function isBusMessage(m) {
55
56
  return k === "delta" && typeof m.runId === "string";
56
57
  }
57
58
  const eventFrame = (e) => `id: ${e.seq}\nevent: event\ndata: ${JSON.stringify(e)}\n\n`;
59
+ const draftFrame = (d) => `event: draft\ndata: ${JSON.stringify({ runId: d.runId, step: d.step, text: d.text, thinking: d.thinking })}\n\n`;
58
60
  /**
59
61
  * 会话事件流(SSE):本进程持有的连接集合,停机时一并关闭。
60
62
  * 跨副本的数据只经 PG(事件日志)与内核 bus(`conv.<id>`)流动,进程内只保存连接本身的资源
@@ -71,13 +73,14 @@ let ConversationStreams = class ConversationStreams {
71
73
  * an event stream. Without `GracefulShutdown` (a standalone HTTP application, tests only) the
72
74
  * streams end with their connections.
73
75
  */
74
- constructor(eventLog, bus, access, config, log, shutdown) {
76
+ constructor(eventLog, bus, access, config, log, drafts, shutdown) {
75
77
  this.d = {
76
78
  eventLog,
77
79
  bus,
78
80
  access: (orgId, conversationId, viewer) => access.isAccessible(orgId, conversationId, viewer),
79
81
  config,
80
82
  log,
83
+ drafts: (conversationId) => drafts.live(conversationId),
81
84
  };
82
85
  if (shutdown?.signal.aborted)
83
86
  this.closeAll();
@@ -131,8 +134,9 @@ ConversationStreams = __decorate([
131
134
  __param(2, Inject(ConversationAccess)),
132
135
  __param(3, Inject(KernelConfigService)),
133
136
  __param(4, Inject(KERNEL_LOGGER)),
134
- __param(5, Optional()),
135
- __param(5, Inject(GracefulShutdown))
137
+ __param(5, Inject(RunDrafts)),
138
+ __param(6, Optional()),
139
+ __param(6, Inject(GracefulShutdown))
136
140
  ], ConversationStreams);
137
141
  export { ConversationStreams };
138
142
  /**
@@ -176,6 +180,9 @@ class Connection {
176
180
  this.openGate = resolve;
177
181
  });
178
182
  this.enqueue(() => this.catchUp());
183
+ // live drafts (spec 2026-11-07 §3.2): after the catch-up, before any delta (deltas are queued
184
+ // behind this); a delta also in the draft is dropped by the client by its offset
185
+ this.enqueue(() => this.sendDrafts());
179
186
  }
180
187
  async subscribe() {
181
188
  const un = await this.d.bus.subscribe(conversationTopic(this.p.conversationId), (m) => this.onMessage(m));
@@ -282,6 +289,23 @@ class Connection {
282
289
  return;
283
290
  }
284
291
  }
292
+ /** One `event: draft` per step of the running run whose `assistant_message` is not logged. */
293
+ async sendDrafts() {
294
+ let drafts;
295
+ try {
296
+ drafts = await this.d.drafts(this.p.conversationId);
297
+ }
298
+ catch (err) {
299
+ // a convenience: without it the client resumes from the next delta (and asks for the draft)
300
+ this.d.log.warn("conversation stream cannot read live drafts", {
301
+ conversationId: this.p.conversationId,
302
+ err,
303
+ });
304
+ return;
305
+ }
306
+ for (const d of drafts)
307
+ this.write(draftFrame(d));
308
+ }
285
309
  /** 发最后一帧错误并关闭(未发完的排队输出随关闭丢弃)。 */
286
310
  fail(code) {
287
311
  if (this.closed)
@@ -1,6 +1,7 @@
1
1
  import type { AppendEvent, EventLog } from "../../conversations/event-log.js";
2
2
  import type { EventPayload } from "../../conversations/events.js";
3
3
  import type { KernelSchemaDb } from "../../db/kernel-schema.js";
4
+ import type { SubagentAbortedBy } from "./status.js";
4
5
  /** Idempotency key of the parent's `subagent_finished` event. */
5
6
  export declare const finishedIdemKey: (childRunId: string) => string;
6
7
  /** A dispatch row, by its child run. */
@@ -10,29 +11,76 @@ export interface DispatchRow {
10
11
  parentConversationId: string;
11
12
  childConversationId: string;
12
13
  childRunId: string;
14
+ /** The budget run the dispatch counts against (agent map spec §6); set when read from the row. */
15
+ budgetRunId?: string;
16
+ /**
17
+ * A person's fork invocation (phase D, `subagent_dispatches.for_skill`): the parent run waits on
18
+ * it (`subagents` wait); every other dispatch runs in the background (agent map spec §5.4).
19
+ */
20
+ forSkill?: boolean;
13
21
  }
14
22
  /** The dispatch that started `childRunId`, or null (not a sub-agent run). */
15
23
  export declare function dispatchOfChildRun(db: KernelSchemaDb, childRunId: string): Promise<DispatchRow | null>;
24
+ /**
25
+ * The dispatch row a finished child run reports through (agent map spec §5.2: every run of a child
26
+ * conversation that ends appends one `finished` delivery to its parent): the run's own dispatch
27
+ * (`Agent`, `SendMessage`), else, for a run nobody dispatched (a wake run, §5.3), the newest dispatch
28
+ * of its conversation with `childRunId` set to this run, `forSkill` false (a wake run of a fork's
29
+ * child is delivered like any background run; no parent run waits on it) and the run's own budget
30
+ * run. Null when the run is unknown or its conversation was never dispatched.
31
+ */
32
+ export declare function deliveryRowOfChildRun(db: KernelSchemaDb, childRunId: string): Promise<DispatchRow | null>;
16
33
  /** The dispatch of the parent call `(runId, callId)`, or null (not dispatched yet). */
17
34
  export declare function dispatchOfCall(db: KernelSchemaDb, runId: string, callId: string): Promise<DispatchRow | null>;
18
35
  /**
19
- * The tool result of a finished child run (spec §4.4) and its `subagent_finished` payload, from
20
- * the child's log only: the status from its terminal event, the reply from its last
36
+ * The root conversation of `conversationId`'s tree (agent map spec §6): the first ancestor without
37
+ * a parent, or `conversationId` itself for a root (or an unknown id).
38
+ */
39
+ export declare function rootConversationOf(db: KernelSchemaDb, conversationId: string): Promise<string>;
40
+ /** Where a sub-agent's request for a person is shown: see {@link rootSurfaceOf}. */
41
+ export interface RootSurface {
42
+ /** The root conversation of the sub-agent's tree. */
43
+ conversationId: string;
44
+ /** The root run the event is logged under: the one that last dispatched the branch. */
45
+ runId: string;
46
+ /** Child conversation ids from the root's child down to the sub-agent itself. */
47
+ path: string[];
48
+ }
49
+ /**
50
+ * Where the sub-agent conversation `conversationId`, in its run `runId`, shows a request for a
51
+ * person (`subagent_waiting`: an approval, a question or a connect card; agent map spec §7): the
52
+ * **root** conversation of its tree, the only one a person looks at, with the path from the root's
53
+ * child down to it, under the root run that last dispatched (or messaged) the root's child on that
54
+ * path (for a child of the root, the run's own dispatch first). `parent`, when the caller knows the
55
+ * run's dispatch and it was made by the root (`depth` 0), answers without a read. Null for a root
56
+ * conversation, or a branch the root never dispatched.
57
+ */
58
+ export declare function rootSurfaceOf(db: KernelSchemaDb, conversationId: string, runId: string, parent?: {
59
+ conversationId: string;
60
+ runId: string;
61
+ depth: number;
62
+ }): Promise<RootSurface | null>;
63
+ /**
64
+ * The result of a finished child run (spec §4.4) and its `subagent_finished` payload, from the
65
+ * child's log only: the status from its terminal event, the reply from its last
21
66
  * `assistant_message` (text blocks), the tool call count from its `tool_result` events, the usage
22
67
  * from its `usage` events (compaction included) and the duration from `run_started` to the
23
- * terminal event. Null while the run has no terminal event.
68
+ * terminal event. Null while the run has no terminal event. `content` is the fork report's text
69
+ * (`agentResultText`); `reply`, `errorMessage` and `abortedBy` are what a background child's
70
+ * finished `subagent_delivery` carries.
24
71
  *
25
72
  * `modelGiven`: the parent's call named a `model`; for an org agent, which runs on its own model
26
73
  * (§5.4, §5.5), the status line then says `model: the agent's own`.
27
74
  */
28
- export declare function childResult(eventLog: EventLog, row: DispatchRow,
29
- /** `forSkill`: a fork invocation's report (no resume hint, see `agentResultText`). */
30
- opts?: {
75
+ export declare function childResult(eventLog: EventLog, row: DispatchRow, opts?: {
31
76
  modelGiven?: boolean;
32
- forSkill?: boolean;
33
77
  }): Promise<{
34
78
  content: string;
35
79
  isError: boolean;
80
+ /** The text of the child's last `assistant_message`. */
81
+ reply: string;
82
+ errorMessage?: string;
83
+ abortedBy?: SubagentAbortedBy;
36
84
  finished: EventPayload<"subagent_finished">;
37
85
  } | null>;
38
86
  /** The parent's `subagent_finished` event for a finished child (idempotent by its key). */