@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
@@ -0,0 +1,230 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { conversationTopic, EventLog, } from "../conversations/event-log.js";
12
+ import { KernelDb } from "../infra/database/kernel-db.js";
13
+ import { KERNEL_LOGGER, REDIS } from "../infra/tokens.js";
14
+ import { assistantIdemKey } from "./model-call.js";
15
+ /** How long a draft lives without a write (a step that keeps streaming keeps refreshing it). */
16
+ export const DRAFT_TTL_SECONDS = 600;
17
+ /** At most one write per step per window, plus the one at the end of the model stream. */
18
+ export const DRAFT_FLUSH_MS = 200;
19
+ /** One step's draft: `{ text, thinking }` as JSON (spec 2026-11-07 §3.2). */
20
+ export const draftKey = (runId, step) => `capk:run-draft:${runId}:${step}`;
21
+ /** The steps of a run that have a draft (a set, so a reader finds them without a key scan). */
22
+ const stepsKey = (runId) => `capk:run-draft-steps:${runId}`;
23
+ const parse = (step, v) => {
24
+ if (v === null)
25
+ return null;
26
+ try {
27
+ const d = JSON.parse(v);
28
+ return {
29
+ step,
30
+ text: typeof d.text === "string" ? d.text : "",
31
+ thinking: typeof d.thinking === "string" ? d.thinking : "",
32
+ };
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ };
38
+ /**
39
+ * Live drafts (spec 2026-11-07-run-input-and-live-drafts §3.2): what each step of a running run
40
+ * has streamed so far, kept in Redis so a viewer that (re)connects on any replica gets the text
41
+ * already shown, then the deltas from there on.
42
+ *
43
+ * The writer is the process executing the run: it holds the step's draft in memory (only for the
44
+ * runs it executes; {@link release} drops them when the execution ends) and writes it at most once
45
+ * per {@link DRAFT_FLUSH_MS}: on the first delta past the window, or, when deltas stop inside it,
46
+ * by one trailing one-shot timer per held step (process-local, unref'd, cancelled by a write,
47
+ * {@link clear} and {@link release}), plus once when the model stream ends ({@link flush}). Writes are issued before the delta is published, on the same
48
+ * connection as the bus publish, so a viewer that sees a delta past its snapshot and asks again
49
+ * gets a draft at least that far whenever that delta was written. Every write refreshes the
50
+ * {@link DRAFT_TTL_SECONDS} TTL; {@link clear} deletes the step's draft once its
51
+ * `assistant_message` is logged or the step is reset. Redis failures are logged, never thrown to
52
+ * the run: a draft is a convenience, the log stays the truth.
53
+ */
54
+ let RunDrafts = class RunDrafts {
55
+ redis;
56
+ kdb;
57
+ eventLog;
58
+ log;
59
+ held = new Map();
60
+ constructor(redis, kdb, eventLog, log) {
61
+ this.redis = redis;
62
+ this.kdb = kdb;
63
+ this.eventLog = eventLog;
64
+ this.log = log;
65
+ }
66
+ get db() {
67
+ return this.kdb.db;
68
+ }
69
+ /** Adds a delta to the step's draft; writes it when the last write is a window old. */
70
+ append(runId, step, channel, text) {
71
+ let h = this.held.get(runId);
72
+ if (h?.step !== step) {
73
+ if (h)
74
+ this.drop(runId, h);
75
+ h = {
76
+ step,
77
+ text: "",
78
+ thinking: "",
79
+ writtenAt: Number.NEGATIVE_INFINITY,
80
+ dirty: false,
81
+ timer: undefined,
82
+ };
83
+ this.held.set(runId, h);
84
+ }
85
+ h[channel] += text;
86
+ h.dirty = true;
87
+ const elapsed = Date.now() - h.writtenAt;
88
+ if (elapsed >= DRAFT_FLUSH_MS)
89
+ this.write(runId, h);
90
+ else if (h.timer === undefined) {
91
+ // held: written when the window ends even if no delta follows (a tool input, a pause)
92
+ h.timer = setTimeout(() => {
93
+ h.timer = undefined;
94
+ this.flush(runId, step);
95
+ }, DRAFT_FLUSH_MS - elapsed).unref();
96
+ }
97
+ }
98
+ /** The end of the step's model stream: writes what the window still holds. */
99
+ flush(runId, step) {
100
+ const h = this.held.get(runId);
101
+ if (h?.step === step && h.dirty)
102
+ this.write(runId, h);
103
+ }
104
+ /** Deletes the step's draft (its `assistant_message` is logged, or the step starts over). */
105
+ clear(runId, step) {
106
+ const h = this.held.get(runId);
107
+ if (h?.step === step)
108
+ this.drop(runId, h);
109
+ this.redis
110
+ .multi()
111
+ .del(draftKey(runId, step))
112
+ .srem(stepsKey(runId), String(step))
113
+ .exec()
114
+ .catch((err) => this.log.warn("run draft clear failed", { runId, step, err }));
115
+ }
116
+ /**
117
+ * Drops what this process holds for the run (its execution here ended: finished, suspended,
118
+ * handed over). Redis keeps what was written: another worker may continue the run, and a step
119
+ * that never ended is not shown once the run is no longer running (TTL removes it).
120
+ */
121
+ release(runId) {
122
+ const h = this.held.get(runId);
123
+ if (h)
124
+ this.drop(runId, h);
125
+ }
126
+ /** The run's steps with a draft, by step. */
127
+ async read(runId) {
128
+ const steps = (await this.redis.smembers(stepsKey(runId)))
129
+ .map(Number)
130
+ .filter((n) => Number.isSafeInteger(n))
131
+ .sort((a, b) => a - b);
132
+ if (steps.length === 0)
133
+ return [];
134
+ const values = await this.redis.mget(steps.map((s) => draftKey(runId, s)));
135
+ return steps.flatMap((s, i) => parse(s, values[i] ?? null) ?? []);
136
+ }
137
+ /**
138
+ * The drafts a viewer of the conversation is shown: steps of its running run (or only `runId`)
139
+ * whose `assistant_message` is not logged. Redis is read before the log, so a step finalized
140
+ * meanwhile is either skipped here or its `assistant_message` reaches the viewer after the draft.
141
+ */
142
+ async live(conversationId, runId) {
143
+ let q = this.db
144
+ .selectFrom("runs")
145
+ .select("id")
146
+ .where("conversation_id", "=", conversationId)
147
+ .where("status", "=", "running");
148
+ if (runId !== undefined)
149
+ q = q.where("id", "=", runId);
150
+ const out = [];
151
+ for (const run of await q.execute()) {
152
+ for (const d of await this.read(run.id)) {
153
+ const final = await this.eventLog.findByIdem(conversationId, assistantIdemKey(run.id, d.step));
154
+ if (final === undefined)
155
+ out.push({ runId: run.id, ...d });
156
+ }
157
+ }
158
+ return out;
159
+ }
160
+ /** Whether the run belongs to the conversation (the draft route's 404). */
161
+ async runOf(conversationId, runId) {
162
+ const row = await this.db
163
+ .selectFrom("runs")
164
+ .select("id")
165
+ .where("id", "=", runId)
166
+ .where("conversation_id", "=", conversationId)
167
+ .executeTakeFirst();
168
+ return row !== undefined;
169
+ }
170
+ drop(runId, h) {
171
+ clearTimeout(h.timer);
172
+ h.timer = undefined;
173
+ this.held.delete(runId);
174
+ }
175
+ write(runId, h) {
176
+ clearTimeout(h.timer);
177
+ h.timer = undefined;
178
+ h.writtenAt = Date.now();
179
+ h.dirty = false;
180
+ const { step } = h;
181
+ this.redis
182
+ .multi()
183
+ .set(draftKey(runId, step), JSON.stringify({ text: h.text, thinking: h.thinking }), "EX", DRAFT_TTL_SECONDS)
184
+ .sadd(stepsKey(runId), String(step))
185
+ .expire(stepsKey(runId), DRAFT_TTL_SECONDS)
186
+ .exec()
187
+ .catch((err) => this.log.warn("run draft write failed", { runId, step, err }));
188
+ }
189
+ };
190
+ RunDrafts = __decorate([
191
+ Injectable(),
192
+ __param(0, Inject(REDIS)),
193
+ __param(1, Inject(KernelDb)),
194
+ __param(2, Inject(EventLog)),
195
+ __param(3, Inject(KERNEL_LOGGER))
196
+ ], RunDrafts);
197
+ export { RunDrafts };
198
+ /**
199
+ * The run's stream sink (one per execution of a run): publishes deltas on the conversation's topic
200
+ * (`conv.<id>`, shared with `{ kind: "events" }`, so a subscriber on any replica gets them) with
201
+ * `offset`, the characters of that channel (text or thinking) this attempt of the step streamed
202
+ * before the delta, and keeps the step's live draft. `step_reset` clears the draft and both
203
+ * offsets; `stream_end` / `step_end` only flush / clear the draft and are not published. A failed
204
+ * publish is only logged: deltas are drafts, the `assistant_message` in the log is the truth.
205
+ */
206
+ export function streamSink(conversationId, deps) {
207
+ let at = { runId: "", step: -1, text: 0, thinking: 0 };
208
+ const publish = (msg) => deps.bus
209
+ .publish(conversationTopic(conversationId), msg)
210
+ .catch((err) => deps.log.warn("stream delta publish failed", { conversationId, err }));
211
+ return (d) => {
212
+ if (d.kind === "stream_end")
213
+ return deps.drafts.flush(d.runId, d.step);
214
+ if (d.kind === "step_end")
215
+ return deps.drafts.clear(d.runId, d.step);
216
+ if (at.runId !== d.runId || at.step !== d.step || d.kind === "step_reset") {
217
+ at = { runId: d.runId, step: d.step, text: 0, thinking: 0 };
218
+ }
219
+ if (d.kind === "step_reset") {
220
+ deps.drafts.clear(d.runId, d.step);
221
+ void publish({ kind: "delta", runId: d.runId, step: d.step, delta: "step_reset" });
222
+ return;
223
+ }
224
+ const text = d.text ?? "";
225
+ const offset = at[d.kind];
226
+ at[d.kind] += text.length;
227
+ deps.drafts.append(d.runId, d.step, d.kind, text);
228
+ void publish({ kind: "delta", runId: d.runId, step: d.step, delta: d.kind, text, offset });
229
+ };
230
+ }
@@ -34,12 +34,10 @@ export declare class RunJobs {
34
34
  queue(name?: string): Queue<RunJobData>;
35
35
  /** A run job by id on the queue `name`, or undefined. */
36
36
  getJob(jobId: string, name?: string): Promise<Job<RunJobData> | undefined>;
37
- /** Adds a conversation run job (`ensureRun`'s own enqueue). */
38
- add(data: RunJobData, jobId: string): Promise<void>;
39
37
  /**
40
- * Enqueues a run job under the caller's job id (resumes, dispatches, repairs). The queue follows
41
- * the conversation's kind (a sub-agent's runs go to {@link SUBAGENT_RUN_QUEUE_NAME}); pass
42
- * `kind` when the caller knows it, else it is read.
38
+ * Enqueues a run job under the caller's job id (`ensureRun`, resumes, dispatches, repairs). The
39
+ * queue follows the conversation's kind (a sub-agent's runs go to
40
+ * {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
43
41
  */
44
42
  enqueue(data: RunJobData, jobId: string, kind?: ConversationKind): Promise<void>;
45
43
  }
@@ -54,14 +54,10 @@ let RunJobs = class RunJobs {
54
54
  getJob(jobId, name = RUN_QUEUE_NAME) {
55
55
  return this.queue(name).getJob(jobId);
56
56
  }
57
- /** Adds a conversation run job (`ensureRun`'s own enqueue). */
58
- async add(data, jobId) {
59
- await this.queue().add("run", data, { jobId, ...RUN_JOB_OPTIONS });
60
- }
61
57
  /**
62
- * Enqueues a run job under the caller's job id (resumes, dispatches, repairs). The queue follows
63
- * the conversation's kind (a sub-agent's runs go to {@link SUBAGENT_RUN_QUEUE_NAME}); pass
64
- * `kind` when the caller knows it, else it is read.
58
+ * Enqueues a run job under the caller's job id (`ensureRun`, resumes, dispatches, repairs). The
59
+ * queue follows the conversation's kind (a sub-agent's runs go to
60
+ * {@link SUBAGENT_RUN_QUEUE_NAME}); pass `kind` when the caller knows it, else it is read.
65
61
  */
66
62
  async enqueue(data, jobId, kind) {
67
63
  const k = kind ??
@@ -52,9 +52,11 @@ export declare class RunQueue {
52
52
  * 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
53
53
  *
54
54
  * The boundary (`trigger_seq`) is that newest message; with none unconsumed, the queue's head
55
- * once it is sent; with no head either, a wake-eligible finished background task (background
56
- * Bash spec §3, {@link wakeDecisionIn}): the run is then attributed to the task's trigger
57
- * account, and a finish inside the wake window schedules the delayed `bg-wake` job instead.
55
+ * once it is sent; with no head either, a wake-eligible finished background task or sub-agent
56
+ * delivery (background Bash spec §3, agent map spec §5.3, {@link wakeDecisionIn}): the run is
57
+ * then attributed to the event's trigger account and joins the tree's budget window, and an
58
+ * event inside the wake window schedules the delayed `bg-wake` job instead. A sub-agent's
59
+ * conversation is only woken this way ({@link childWakeIn}).
58
60
  *
59
61
  * 孤儿清理(R29,按需进行,没有定时器):已有的 queued / running 运行若 BullMQ 任务已不存在、
60
62
  * 会话锁也无人持有(queued 的还要超过宽限期),说明没有任何 worker 会再执行它——写
@@ -71,6 +73,38 @@ export declare class RunQueue {
71
73
  }): Promise<string | null>;
72
74
  /** {@link ensureRun}'s transaction: what it decided goes back through `st`. */
73
75
  private ensureRunIn;
76
+ /**
77
+ * {@link ensureRunIn} for a sub-agent's conversation (agent map spec §5.3), under its row lock.
78
+ * Its runs from a task, or from a message to an idle sub-agent, are started by the dispatch
79
+ * (`Agent`, `SendMessage`), which also records the dispatch. Here it is started from a parent's
80
+ * message that reached its run after that run's last model call (agent map spec §10: a message
81
+ * racing the run's end starts a new run, never lost); and it is woken by its own background
82
+ * task's finish or a delivery from its own sub-agent, under the same rules as a chat
83
+ * conversation. Neither happens once its last run was stopped (`aborted`): a stopped sub-agent is
84
+ * started again only by its parent. Both read the queue and the trigger account's access on the root
85
+ * of its tree; a message needs no wake setting and has no wake window. The run counts against
86
+ * the root's budget window and runs on the sub-agent queue under `runJobId(child, boundary
87
+ * seq)`. An active run is left to the orphan repair after the commit (`repairRunId`), never
88
+ * started past.
89
+ */
90
+ private childWakeIn;
91
+ /**
92
+ * The newest unconsumed message of an idle sub-agent (a `SendMessage` its last run did not absorb)
93
+ * as a run boundary, or null: none; the root's queue is paused or the root deleted (the
94
+ * message waits for the unpause, {@link wakeHeldTree}); or its author can no longer send to the
95
+ * root (it waits for a later run). The caller already refused a stopped sub-agent (last run
96
+ * `aborted`): a message that reached it while running and then stopped is parked, and the next
97
+ * run its parent starts absorbs it. Called under the sub-agent's row lock.
98
+ */
99
+ private pendingMessageIn;
100
+ /**
101
+ * Re-derives the wakes a paused root held for its tree (agent map spec §5.3: a paused root queue
102
+ * holds the wakes of the whole tree): after the root's queue is unpaused, {@link ensureRun} on
103
+ * every sub-agent conversation below it that has an unconsumed wake event or message and no
104
+ * active run (the root itself is the caller's own `ensureRun`). Errors are logged; the next
105
+ * event, run end or page opening of that conversation re-derives its wake.
106
+ */
107
+ wakeHeldTree(rootId: string): Promise<void>;
74
108
  /**
75
109
  * Schedules the delayed `bg-wake` job at the end of the conversation's wake window (after the
76
110
  * commit): one job per conversation and window end, so finishes inside one window share it. It
@@ -15,6 +15,7 @@ import { visibleTo } from "../agents/agent-lookup.js";
15
15
  import { BG_WAKE_JOB, bgWakeJobId, wakeDecisionIn, } from "../background/wake-rules.js";
16
16
  import { EventLog } from "../conversations/event-log.js";
17
17
  import { dispatchQueuedIn, pauseQueueWith } from "../conversations/queue.js";
18
+ import { conversationTree } from "../conversations/tree.js";
18
19
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
19
20
  import { KernelDb } from "../infra/database/kernel-db.js";
20
21
  import { TransactionHost } from "../infra/database/transaction-host.js";
@@ -27,6 +28,8 @@ import { ConversationLock } from "./conversation-lock.js";
27
28
  import { MAINTENANCE_QUEUE_NAME } from "./maintenance-queue.js";
28
29
  import { notifyFinished, RunFinish } from "./run-finish.js";
29
30
  import { ACTIVE_RUN_STATUSES, RunJobs, runJobId, runQueueNameFor, } from "./run-jobs.js";
31
+ import { rootConversationOf } from "./subagents/child.js";
32
+ import { budgetWindowOf } from "./subagents/limits.js";
30
33
  export { ACTIVE_RUN_STATUSES, RUN_QUEUE_NAME, runJobId, runQueueNameFor, SUBAGENT_RUN_QUEUE_NAME, } from "./run-jobs.js";
31
34
  /**
32
35
  * queued 运行的宽限期(秒):`ensureRun` / 续跑先提交 runs 行、再投递任务,两步之间任务暂时不存在;
@@ -98,9 +101,11 @@ let RunQueue = class RunQueue {
98
101
  * 且没有 queued / running / waiting 的运行时:插入 `runs`(queued)并投递任务,返回 runId;否则返回 null。
99
102
  *
100
103
  * The boundary (`trigger_seq`) is that newest message; with none unconsumed, the queue's head
101
- * once it is sent; with no head either, a wake-eligible finished background task (background
102
- * Bash spec §3, {@link wakeDecisionIn}): the run is then attributed to the task's trigger
103
- * account, and a finish inside the wake window schedules the delayed `bg-wake` job instead.
104
+ * once it is sent; with no head either, a wake-eligible finished background task or sub-agent
105
+ * delivery (background Bash spec §3, agent map spec §5.3, {@link wakeDecisionIn}): the run is
106
+ * then attributed to the event's trigger account and joins the tree's budget window, and an
107
+ * event inside the wake window schedules the delayed `bg-wake` job instead. A sub-agent's
108
+ * conversation is only woken this way ({@link childWakeIn}).
104
109
  *
105
110
  * 孤儿清理(R29,按需进行,没有定时器):已有的 queued / running 运行若 BullMQ 任务已不存在、
106
111
  * 会话锁也无人持有(queued 的还要超过宽限期),说明没有任何 worker 会再执行它——写
@@ -124,8 +129,14 @@ let RunQueue = class RunQueue {
124
129
  pausedNow: false,
125
130
  orphanStop: undefined,
126
131
  wakeLater: null,
132
+ repairRunId: null,
127
133
  };
128
134
  const created = await this.ensureRunIn(conversationId, st);
135
+ if (st.repairRunId !== null) {
136
+ // a sub-agent's run nobody runs any more: requeued when queued, failed when running (its
137
+ // finish then reaches the parent through the wait sweep's undelivered repair)
138
+ await this.repairOrphan(conversationId, st.repairRunId);
139
+ }
129
140
  if (st.wakeLater !== null) {
130
141
  await this.scheduleWake(conversationId, st.wakeLater, opts.wakeRetry ?? 0);
131
142
  }
@@ -155,10 +166,10 @@ let RunQueue = class RunQueue {
155
166
  }
156
167
  if (!created)
157
168
  return null;
158
- const { runId, jobId } = created;
169
+ const { runId, jobId, kind } = created;
159
170
  try {
160
- const queue = this.jobs.queue();
161
- await this.jobs.add({ runId, conversationId }, jobId);
171
+ const queue = this.jobs.queue(runQueueNameFor(kind));
172
+ await this.jobs.enqueue({ runId, conversationId }, jobId, kind);
162
173
  // 从 Redis 读回核对:检查与 add 之间出现了同 jobId 的任务时 add 被静默忽略,撤销本次插入,
163
174
  // 不留下没有任务的 queued 行。读不到说明任务已被领取并移除(只可能是本次投递的),不撤销。
164
175
  const stored = await queue.getJob(jobId);
@@ -197,11 +208,13 @@ let RunQueue = class RunQueue {
197
208
  .forUpdate()
198
209
  .executeTakeFirst();
199
210
  // 评测回放的隐藏对话:运行由评测 worker 在里面直接驱动(工具只回放记录),绝不为它起真实运行
200
- if (conv?.kind !== "chat")
211
+ if (conv?.kind !== "chat" && conv?.kind !== "subagent")
201
212
  return null;
202
213
  // A deleted conversation starts no run, whatever is still unconsumed or queued
203
214
  if (conv.deleted_at !== null)
204
215
  return null;
216
+ if (conv.kind === "subagent")
217
+ return this.childWakeIn(conversationId, conv, st);
205
218
  const newest = await t
206
219
  .selectFrom("conversation_events")
207
220
  .select(["seq", "payload"])
@@ -210,6 +223,8 @@ let RunQueue = class RunQueue {
210
223
  .orderBy("seq", "desc")
211
224
  .limit(1)
212
225
  .executeTakeFirst();
226
+ /** The boundary is a wake event: the run joins the tree's budget window (agent map §6). */
227
+ let isWake = false;
213
228
  /** The run's boundary: its `trigger_seq` and the account it runs as. */
214
229
  let last = newest && {
215
230
  seq: newest.seq,
@@ -220,8 +235,8 @@ let RunQueue = class RunQueue {
220
235
  : undefined;
221
236
  if (idleActive && Number(idleActive.trigger_seq) > Number(conv.consumed_seq)) {
222
237
  // No unconsumed message, but a run whose boundary is not consumed yet (a wake run, whose
223
- // boundary is a finished background task): it goes through the orphan check below with
224
- // that boundary, as a message's run does
238
+ // boundary is a finished background task or a sub-agent's delivery): it goes through the
239
+ // orphan check below with that boundary, as a message's run does
225
240
  last = { seq: idleActive.trigger_seq, accountId: idleActive.trigger_account_id };
226
241
  }
227
242
  else if (!last || Number(last.seq) <= Number(conv.consumed_seq)) {
@@ -276,12 +291,13 @@ let RunQueue = class RunQueue {
276
291
  else {
277
292
  // Nothing queued either: a finished background task may wake the idle conversation
278
293
  // (background Bash spec §3; a person's message or the queue always goes first)
279
- const wake = await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, conversationId, accountId));
294
+ const wake = await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id, rootId: conversationId }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, conversationId, accountId));
280
295
  if (wake?.kind === "later")
281
296
  st.wakeLater = wake;
282
297
  if (wake?.kind !== "wake")
283
298
  return null;
284
299
  last = { seq: String(wake.seq), accountId: wake.triggerAccountId };
300
+ isWake = true;
285
301
  }
286
302
  }
287
303
  const active = await this.activeRun(t, conversationId);
@@ -357,9 +373,170 @@ let RunQueue = class RunQueue {
357
373
  agent_version: agent.current_version,
358
374
  trigger_account_id: trigger.accountId,
359
375
  trigger_seq: Number(trigger.seq),
376
+ // a chat conversation always has its person-triggered run before any wake (a wake event
377
+ // comes from a run of it or of its tree); null would only make the wake run its own window
378
+ budget_run_id: isWake ? await budgetWindowOf(t, conversationId) : null,
360
379
  })
361
380
  .execute();
362
- return { runId, jobId };
381
+ return { runId, jobId, kind: "chat" };
382
+ }
383
+ /**
384
+ * {@link ensureRunIn} for a sub-agent's conversation (agent map spec §5.3), under its row lock.
385
+ * Its runs from a task, or from a message to an idle sub-agent, are started by the dispatch
386
+ * (`Agent`, `SendMessage`), which also records the dispatch. Here it is started from a parent's
387
+ * message that reached its run after that run's last model call (agent map spec §10: a message
388
+ * racing the run's end starts a new run, never lost); and it is woken by its own background
389
+ * task's finish or a delivery from its own sub-agent, under the same rules as a chat
390
+ * conversation. Neither happens once its last run was stopped (`aborted`): a stopped sub-agent is
391
+ * started again only by its parent. Both read the queue and the trigger account's access on the root
392
+ * of its tree; a message needs no wake setting and has no wake window. The run counts against
393
+ * the root's budget window and runs on the sub-agent queue under `runJobId(child, boundary
394
+ * seq)`. An active run is left to the orphan repair after the commit (`repairRunId`), never
395
+ * started past.
396
+ */
397
+ async childWakeIn(conversationId, conv, st) {
398
+ const t = this.db;
399
+ const active = await this.activeRun(t, conversationId);
400
+ if (active) {
401
+ if (active.status !== "waiting")
402
+ st.repairRunId = active.id;
403
+ return null;
404
+ }
405
+ // a stopped sub-agent (its last run `aborted`: a person's or a tree stop) stays stopped: no
406
+ // message, task finish or delivery that reached it before or during the stop wakes it (a
407
+ // descendant's report that landed just before the stop would otherwise restart the stopped
408
+ // branch); they are parked for its next run, which only its parent starts (`Agent`,
409
+ // `SendMessage`)
410
+ const last = await t
411
+ .selectFrom("runs")
412
+ .select("status")
413
+ .where("conversation_id", "=", conversationId)
414
+ .orderBy("created_at", "desc")
415
+ .orderBy("id", "desc")
416
+ .limit(1)
417
+ .executeTakeFirst();
418
+ if (last?.status === "aborted")
419
+ return null;
420
+ const rootId = await rootConversationOf(t, conversationId);
421
+ const wake = (await this.pendingMessageIn(conversationId, Number(conv.consumed_seq), rootId)) ??
422
+ (await wakeDecisionIn(t, { id: conversationId, orgId: conv.org_id, rootId }, Number(conv.consumed_seq), this.config.get().runtime.wakeOnBackgroundTask, (accountId) => authorCanSend(t, rootId, accountId)));
423
+ if (wake?.kind === "later")
424
+ st.wakeLater = wake;
425
+ if (wake?.kind !== "wake")
426
+ return null;
427
+ const jobId = runJobId(conversationId, wake.seq);
428
+ const existing = await this.jobs.getJob(jobId, runQueueNameFor("subagent"));
429
+ if (existing) {
430
+ this.log.warn("run job for this trigger already exists; not enqueuing", {
431
+ conversationId,
432
+ jobId,
433
+ existingRunId: existing.data?.runId,
434
+ });
435
+ return null;
436
+ }
437
+ const agent = await t
438
+ .selectFrom("agents")
439
+ .select(["current_version", "deleted_at"])
440
+ .where("id", "=", conv.agent_id)
441
+ .executeTakeFirstOrThrow();
442
+ if (agent.deleted_at !== null)
443
+ return null;
444
+ // a sub-agent runs its definition frozen at dispatch: its runs keep the version recorded then
445
+ const previous = await t
446
+ .selectFrom("runs")
447
+ .select("agent_version")
448
+ .where("conversation_id", "=", conversationId)
449
+ .orderBy("created_at", "desc")
450
+ .limit(1)
451
+ .executeTakeFirst();
452
+ const runId = randomUUID();
453
+ await t
454
+ .insertInto("runs")
455
+ .values({
456
+ id: runId,
457
+ conversation_id: conversationId,
458
+ status: "queued",
459
+ agent_version: previous?.agent_version ?? agent.current_version,
460
+ trigger_account_id: wake.triggerAccountId,
461
+ trigger_seq: wake.seq,
462
+ budget_run_id: await budgetWindowOf(t, rootId),
463
+ })
464
+ .execute();
465
+ return { runId, jobId, kind: "subagent" };
466
+ }
467
+ /**
468
+ * The newest unconsumed message of an idle sub-agent (a `SendMessage` its last run did not absorb)
469
+ * as a run boundary, or null: none; the root's queue is paused or the root deleted (the
470
+ * message waits for the unpause, {@link wakeHeldTree}); or its author can no longer send to the
471
+ * root (it waits for a later run). The caller already refused a stopped sub-agent (last run
472
+ * `aborted`): a message that reached it while running and then stopped is parked, and the next
473
+ * run its parent starts absorbs it. Called under the sub-agent's row lock.
474
+ */
475
+ async pendingMessageIn(conversationId, consumed, rootId) {
476
+ const t = this.db;
477
+ const message = await t
478
+ .selectFrom("conversation_events")
479
+ .select(["seq", "payload"])
480
+ .where("conversation_id", "=", conversationId)
481
+ .where("type", "=", "user_message")
482
+ .where("seq", ">", String(consumed))
483
+ .orderBy("seq", "desc")
484
+ .limit(1)
485
+ .executeTakeFirst();
486
+ if (!message)
487
+ return null;
488
+ const root = await t
489
+ .selectFrom("conversations")
490
+ .select(["queue_paused", "deleted_at"])
491
+ .where("id", "=", rootId)
492
+ .executeTakeFirst();
493
+ if (!root || root.queue_paused || root.deleted_at !== null)
494
+ return null;
495
+ const accountId = message.payload.authorAccountId;
496
+ if (!(await authorCanSend(t, rootId, accountId)))
497
+ return null;
498
+ return { kind: "wake", seq: Number(message.seq), triggerAccountId: accountId };
499
+ }
500
+ /**
501
+ * Re-derives the wakes a paused root held for its tree (agent map spec §5.3: a paused root queue
502
+ * holds the wakes of the whole tree): after the root's queue is unpaused, {@link ensureRun} on
503
+ * every sub-agent conversation below it that has an unconsumed wake event or message and no
504
+ * active run (the root itself is the caller's own `ensureRun`). Errors are logged; the next
505
+ * event, run end or page opening of that conversation re-derives its wake.
506
+ */
507
+ async wakeHeldTree(rootId) {
508
+ const ids = (await conversationTree(this.db, rootId))
509
+ .filter((c) => c.level > 0)
510
+ .map((c) => c.id);
511
+ if (ids.length === 0)
512
+ return;
513
+ const held = await this.db
514
+ .selectFrom("conversations as c")
515
+ .select("c.id")
516
+ .where("c.id", "in", ids)
517
+ .where("c.deleted_at", "is", null)
518
+ .where(({ exists, selectFrom }) => exists(selectFrom("conversation_events as e")
519
+ .select(sql `1`.as("one"))
520
+ .whereRef("e.conversation_id", "=", "c.id")
521
+ .where("e.type", "in", [
522
+ "background_task_finished",
523
+ "subagent_delivery",
524
+ "user_message",
525
+ ])
526
+ .whereRef("e.seq", ">", "c.consumed_seq")))
527
+ .where(({ not, exists, selectFrom }) => not(exists(selectFrom("runs as r")
528
+ .select(sql `1`.as("one"))
529
+ .whereRef("r.conversation_id", "=", "c.id")
530
+ .where("r.status", "in", ACTIVE_RUN_STATUSES))))
531
+ .execute();
532
+ for (const c of held) {
533
+ try {
534
+ await this.ensureRun(c.id);
535
+ }
536
+ catch (err) {
537
+ this.log.warn("cannot wake a held sub-agent", { conversationId: c.id, err });
538
+ }
539
+ }
363
540
  }
364
541
  /**
365
542
  * Schedules the delayed `bg-wake` job at the end of the conversation's wake window (after the
@@ -14,6 +14,7 @@ import { KyselyCheckpointSaver } from "./checkpointer.js";
14
14
  import { ConversationLock } from "./conversation-lock.js";
15
15
  import { ProviderRegistry } from "./providers.js";
16
16
  import { type OrgQuota } from "./quota.js";
17
+ import { RunDrafts } from "./run-drafts.js";
17
18
  import { RunFinish } from "./run-finish.js";
18
19
  import type { RunJobData } from "./run-jobs.js";
19
20
  import { RunQueue } from "./run-queue.js";
@@ -70,6 +71,8 @@ export declare class RunWorker {
70
71
  private readonly pipeline;
71
72
  private readonly finisher;
72
73
  readonly txHost: TransactionHost;
74
+ /** The steps' live drafts this process writes for the runs it executes. */
75
+ private readonly drafts;
73
76
  private readonly hooks?;
74
77
  /** The two run queues' BullMQ workers (spec §7.4), once {@link start}ed on the worker role. */
75
78
  private workers;
@@ -84,7 +87,7 @@ export declare class RunWorker {
84
87
  /** 运行到达终态后删除该运行(thread_id = runId)的 checkpoint thread(只用于续跑,结束后无用)。 */
85
88
  checkpoints: Pick<KyselyCheckpointSaver, "deleteThread">,
86
89
  /** loop 返回 `suspended` 后把运行置为 waiting(释放会话锁与配额之后); the child lifecycle. */
87
- waits: Pick<Waits, "suspend" | "childFinished" | "stopChildren">,
90
+ waits: Pick<Waits, "suspend" | "childFinished" | "stopChildren" | "stopDescendantsOfStopped">,
88
91
  /** `run.started` (the channel outbound enqueues the conversation's IM delivery). */
89
92
  events: KernelEvents,
90
93
  /** A completed run enqueues the conversation's title job. */
@@ -98,7 +101,9 @@ export declare class RunWorker {
98
101
  * (`stopOpenAgentCalls`; a no-op without dispatches); `fire` runs their observe hooks after the
99
102
  * commit (sub-agents spec §12, review m1: a failed or stalled parent too).
100
103
  */
101
- pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, finisher: Pick<RunFinish, "finish">, txHost: TransactionHost, hooks?: RunHooks | undefined);
104
+ pipeline: Pick<ToolPipeline, "stopOpenAgentCalls">, finisher: Pick<RunFinish, "finish">, txHost: TransactionHost,
105
+ /** The steps' live drafts this process writes for the runs it executes. */
106
+ drafts: RunDrafts, hooks?: RunHooks | undefined);
102
107
  private get db();
103
108
  /**
104
109
  * Starts consuming (worker role only): `workers` are the `@Processor` workers of both run queues
@@ -119,13 +124,14 @@ export declare class RunWorker {
119
124
  /** A job failed (the worker's `failed` event). */
120
125
  onFailed(job: Job<RunJobData> | undefined, err: Error): void;
121
126
  /**
122
- * 流式增量发布到会话频道(与 `{ kind: "events" }` 共用 `conv.<id>`),任意副本上的订阅方都能收到。
123
- * 发布失败只记日志:增量只是草稿,最终内容以日志中的 assistant_message 为准。
127
+ * The run's stream sink: deltas on the conversation's topic (any replica's subscribers get them)
128
+ * and the steps' live drafts in Redis ({@link streamSink}, spec 2026-11-07 §3.2).
124
129
  */
125
130
  private sinkFor;
126
131
  /**
127
132
  * After any terminal commit of a run that is not a sub-agent's (sub-agents spec §12): stops its
128
- * active children on its behalf (no account). The wait sweep is the backstop.
133
+ * active fork invocation child on its behalf (no account); background `Agent` children keep
134
+ * running (agent map spec §5.4). The wait sweep is the backstop.
129
135
  */
130
136
  private stopChildren;
131
137
  /**