@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
@@ -13,6 +13,7 @@ import { sql } from "kysely";
13
13
  import { AgentLookup, visibleTo } from "../agents/agent-lookup.js";
14
14
  import { BackgroundTaskStopper } from "../background/stop.js";
15
15
  import { unbindConversation } from "../channels/threads.js";
16
+ import { ConversationEnvironments, } from "../environments/conversation-environments.js";
16
17
  import { ApiError } from "../errors.js";
17
18
  import { KernelDb } from "../infra/database/kernel-db.js";
18
19
  import { TransactionHost } from "../infra/database/transaction-host.js";
@@ -20,13 +21,16 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
20
21
  import { KERNEL_LOGGER } from "../infra/tokens.js";
21
22
  import { ProviderRegistry } from "../runtime/providers.js";
22
23
  import { RunControl as RunControlService } from "../runtime/run-control.js";
24
+ import { rootConversationOf } from "../runtime/subagents/child.js";
23
25
  import { SkillInvoker } from "../skills/invoke.js";
24
26
  import { ConnectorContent } from "../tools/connector-content.js";
25
27
  import { ConversationAccess, parentReachable } from "./access.js";
28
+ import { readAgentTree } from "./agent-tree.js";
26
29
  import { AttachmentsService } from "./attachments.service.js";
27
30
  import { EventLog } from "./event-log.js";
28
31
  import { userMessageIdemKey } from "./idem-keys.js";
29
32
  import { NO_SELECTION, planSelection, readSelection } from "./selection.js";
33
+ import { conversationTree } from "./tree.js";
30
34
  /** Escapes `\`, `%` and `_` so user text is matched literally by `LIKE … ESCAPE '\'`. */
31
35
  export function escapeLike(s) {
32
36
  return s.replace(/[\\%_]/g, (ch) => `\\${ch}`);
@@ -64,6 +68,7 @@ const COLUMNS = [
64
68
  "parent_conversation_id",
65
69
  "subagent_type",
66
70
  "archived_at",
71
+ "environment_id",
67
72
  ];
68
73
  function toView(r) {
69
74
  return {
@@ -80,11 +85,17 @@ function toView(r) {
80
85
  parentConversationId: r.parent_conversation_id,
81
86
  subagentType: r.subagent_type,
82
87
  archivedAt: r.archived_at,
88
+ environmentId: r.environment_id,
83
89
  activity: r.activity ?? null,
84
90
  };
85
91
  }
86
92
  /** The longest conversation title (characters, after trimming). */
87
93
  export const CONVERSATION_TITLE_MAX_CHARS = 120;
94
+ /**
95
+ * How far back a `before` page of events reaches past its `limit` for the start of a turn (history
96
+ * paging spec §2); a longer run starts mid-run.
97
+ */
98
+ export const EVENTS_TURN_EXTEND = 2000;
88
99
  /** The sums of the `usage` events matching `where` (over `conversation_events e`), one row. */
89
100
  const usageSums = (where) => sql `
90
101
  SELECT
@@ -117,6 +128,7 @@ let ConversationsService = class ConversationsService {
117
128
  attachments;
118
129
  invoker;
119
130
  background;
131
+ environments;
120
132
  txHost;
121
133
  constructor(db, eventLog, agents, access,
122
134
  /** Starts and stops the conversation's runs. */
@@ -130,7 +142,9 @@ let ConversationsService = class ConversationsService {
130
142
  /** Renders a person's skill invocation (phase D). */
131
143
  invoker,
132
144
  /** Stops a deleted conversation's background tasks. */
133
- background, txHost) {
145
+ background,
146
+ /** The environment a new conversation is bound to (environments spec §4.1 item 1). */
147
+ environments, txHost) {
134
148
  this.db = db;
135
149
  this.eventLog = eventLog;
136
150
  this.agents = agents;
@@ -142,6 +156,7 @@ let ConversationsService = class ConversationsService {
142
156
  this.attachments = attachments;
143
157
  this.invoker = invoker;
144
158
  this.background = background;
159
+ this.environments = environments;
145
160
  this.txHost = txHost;
146
161
  }
147
162
  /**
@@ -153,12 +168,24 @@ let ConversationsService = class ConversationsService {
153
168
  .ensureRun(conversationId)
154
169
  .catch((err) => this.log.warn("ensureRun on conversation open failed", { conversationId, err }));
155
170
  }
156
- /** 新建会话;agent 对该账号不可用 → `agent.not_found`。 */
157
- async create(orgId, accountId, agentId) {
171
+ /**
172
+ * Creates an empty conversation bound to its environment (`pick`, see
173
+ * {@link ConversationEnvironments.forNew}); an agent the account cannot use →
174
+ * `agent.not_found`, an environment it may not use → `environment.not_found` /
175
+ * `environment.unavailable`, and nothing is created.
176
+ */
177
+ async create(orgId, accountId, agentId, pick = {}) {
158
178
  await this.agents.get(orgId, agentId, accountId);
179
+ const environmentId = await this.environments.forNew(orgId, accountId, pick);
159
180
  const row = await this.db
160
181
  .insertInto("conversations")
161
- .values({ id: randomUUID(), org_id: orgId, agent_id: agentId, account_id: accountId })
182
+ .values({
183
+ id: randomUUID(),
184
+ org_id: orgId,
185
+ agent_id: agentId,
186
+ account_id: accountId,
187
+ environment_id: environmentId,
188
+ })
162
189
  .returning(COLUMNS)
163
190
  .executeTakeFirstOrThrow();
164
191
  return toView(row);
@@ -172,16 +199,17 @@ let ConversationsService = class ConversationsService {
172
199
  * `events` are every event the create wrote, in seq order from seq 1 (a `model_switched` before
173
200
  * the message when the send switched), so a client can seed the new conversation's log whole.
174
201
  */
175
- async createWithMessage(orgId, accountId, agentId, input) {
202
+ async createWithMessage(orgId, accountId, agentId, input, pick = {}) {
176
203
  const agent = await this.agents.get(orgId, agentId, accountId);
177
204
  const prior = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
178
205
  if (prior)
179
206
  return prior;
207
+ const environmentId = await this.environments.forNew(orgId, accountId, pick);
180
208
  const next = await this.planSwitch(agent.definition, NO_SELECTION, input);
181
209
  const extra = await this.resolveExtra(orgId, accountId, input);
182
210
  const invoked = await this.prepareSkill(orgId, agentId, undefined, agent.definition, input);
183
211
  const id = randomUUID();
184
- const all = await this.createIn(id, orgId, accountId, agentId, input, next, extra, invoked);
212
+ const all = await this.createIn({ id, orgId, accountId, agentId, environmentId }, input, next, extra, invoked);
185
213
  const written = all?.at(-1);
186
214
  if (!all || !written) {
187
215
  const raced = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
@@ -195,14 +223,16 @@ let ConversationsService = class ConversationsService {
195
223
  }
196
224
  /** The conversation row and its first message (undefined: a concurrent retry committed first). */
197
225
  // its own transaction: the caller notifies and publishes after the commit
198
- async createIn(id, orgId, accountId, agentId, input, next, extra, invoked) {
226
+ async createIn(conv, input, next, extra, invoked) {
227
+ const { id, orgId, accountId } = conv;
199
228
  const row = await this.db
200
229
  .insertInto("conversations")
201
230
  .values({
202
231
  id,
203
232
  org_id: orgId,
204
- agent_id: agentId,
233
+ agent_id: conv.agentId,
205
234
  account_id: accountId,
235
+ environment_id: conv.environmentId,
206
236
  create_request_id: input.clientMessageId,
207
237
  })
208
238
  .onConflict((oc) => oc
@@ -284,12 +314,13 @@ let ConversationsService = class ConversationsService {
284
314
  /**
285
315
  * Soft-deletes a conversation (owner only; a sub-agent's conversation is `conversation.read_only`):
286
316
  * stops an active run, hides the conversation everywhere for its owner and drops its channel
287
- * bindings, then stops every running background task in its sandbox (its sub-agents' too;
288
- * outside the delete's transaction, a task whose sandbox cannot be reached ends `lost` with
289
- * `kill_pending`). The tasks are stopped after the conversation is marked deleted, so no finish
317
+ * bindings, stops every running background task in its sandbox (its sub-agents' too; outside
318
+ * the delete's transaction, a task whose sandbox cannot be reached ends `lost` with
319
+ * `kill_pending`), then every active run of its sub-agent tree (agent map spec §10). The tasks
320
+ * are stopped after the conversation is marked deleted, so no finish
290
321
  * (the stops' own, or one the poller writes meanwhile) can wake a run on it: `ensureRun` refuses a
291
322
  * deleted conversation (the stops' finishes carry `stoppedBy: "deletion"` as well). The event
292
- * log, runs and trajectory stay (enterprise admins still see them).
323
+ * log, runs and trajectory stay (super admins still see them).
293
324
  */
294
325
  async remove(orgId, conversationId, accountId) {
295
326
  await this.writable(orgId, conversationId, accountId);
@@ -301,7 +332,13 @@ let ConversationsService = class ConversationsService {
301
332
  throw e;
302
333
  }
303
334
  await this.markDeleted(conversationId);
335
+ // after the mark, so no finish or delivery of the stops below can start a run on the deleted
336
+ // root (`ensureRun` refuses it). The sandbox's tasks stop first, so the sub-agents' tasks end
337
+ // as a deletion; the tree stop then only stops a task a sub-agent started in between
338
+ // (`stoppedBy: "subagent_end"`, which never wakes either)
304
339
  await this.background.stopForDeletedConversation(conversationId);
340
+ // the whole tree stops (agent map spec §10)
341
+ await this.runs.stopTree(conversationId, accountId, { includeSelf: false });
305
342
  await this.eventLog.publishChanged(conversationId, "deleted");
306
343
  }
307
344
  // the publish happens after the commit, in the caller
@@ -446,14 +483,14 @@ let ConversationsService = class ConversationsService {
446
483
  SELECT page.agent_id, page.latest_at, v.definition ->> 'name' AS agent_name,
447
484
  cs.id, cs.org_id, cs.account_id, cs.title, cs.title_source, cs.selection, cs.last_seq,
448
485
  cs.created_at, cs.updated_at, cs.parent_conversation_id, cs.subagent_type,
449
- cs.archived_at, cs.activity
486
+ cs.archived_at, cs.environment_id, cs.activity
450
487
  FROM page
451
488
  JOIN capybara.agents a ON a.id = page.agent_id
452
489
  JOIN capybara.agent_versions v ON v.agent_id = a.id AND v.version = a.current_version
453
490
  CROSS JOIN LATERAL (
454
491
  SELECT c.id, c.org_id, c.account_id, c.title, c.title_source, c.selection, c.last_seq,
455
492
  c.created_at, c.updated_at, c.parent_conversation_id, c.subagent_type,
456
- c.archived_at, ${activitySql("c")} AS activity
493
+ c.archived_at, c.environment_id, ${activitySql("c")} AS activity
457
494
  FROM capybara.conversations c
458
495
  WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
459
496
  AND c.deleted_at IS NULL AND ${archivedFilter} ${searchFilter} ${stateFilter}
@@ -572,26 +609,38 @@ let ConversationsService = class ConversationsService {
572
609
  return { subagents, next };
573
610
  }
574
611
  /**
575
- * A conversation's token usage: its own `usage` events (compaction included) plus those of its
576
- * sub-agents (sub-agents spec §8.3), whose logs keep their own. Owner only, as {@link get}.
612
+ * The agent tree of a root conversation (agent map spec §8, §9.2): the root and every sub-agent
613
+ * below it with status, model, time, tokens and tool calls. Owner only, as {@link isAccessible};
614
+ * a sub-agent's id (not a root) is `conversation.not_found` too.
615
+ */
616
+ async agentTree(orgId, conversationId, viewerAccountId) {
617
+ if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
618
+ throw notFound();
619
+ const root = await readAgentTree(this.db.db, orgId, conversationId);
620
+ if (!root)
621
+ throw notFound();
622
+ return { root };
623
+ }
624
+ /**
625
+ * A conversation's token usage: its own `usage` events (compaction included) plus those of every
626
+ * sub-agent below it, at any depth (sub-agents spec §8.3, agent map spec §6: every descendant
627
+ * counts toward the root; `conversationTree`), whose logs keep their own. Owner only, as
628
+ * {@link get}.
577
629
  */
578
630
  async usage(orgId, conversationId, viewerAccountId) {
579
631
  if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
580
632
  throw notFound();
581
- const { rows } = await sql `${usageSums(sql `e.conversation_id IN (
582
- SELECT ${conversationId}::text
583
- UNION ALL
584
- SELECT c.id FROM capybara.conversations c
585
- WHERE c.parent_conversation_id = ${conversationId} AND c.kind = 'subagent'
586
- )`)}`.execute(this.db.db);
633
+ const ids = (await conversationTree(this.db.db, conversationId)).map((c) => c.id);
634
+ const { rows } = await sql `${usageSums(sql `e.conversation_id IN (${sql.join(ids.length > 0 ? ids : [conversationId])})`)}`.execute(this.db.db);
587
635
  const row = rows[0];
588
636
  return row
589
637
  ? toUsage(row)
590
638
  : { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };
591
639
  }
592
640
  /**
593
- * The conversation whose sandbox `conversationId` works in: a sub-agent's is its parent's
594
- * (sub-agents spec §10.1), any other its own. Call only after an access check.
641
+ * The conversation whose sandbox `conversationId` works in: a sub-agent's is its root
642
+ * conversation's at any depth (sub-agents spec §10.1, agent map spec §6), any other its own. Call
643
+ * only after an access check.
595
644
  */
596
645
  async sandboxConversationOf(orgId, conversationId) {
597
646
  const row = await this.db
@@ -600,7 +649,9 @@ let ConversationsService = class ConversationsService {
600
649
  .where("id", "=", conversationId)
601
650
  .where("org_id", "=", orgId)
602
651
  .executeTakeFirst();
603
- return row?.parent_conversation_id ?? conversationId;
652
+ if (!row?.parent_conversation_id)
653
+ return conversationId;
654
+ return rootConversationOf(this.db.db, row.parent_conversation_id);
604
655
  }
605
656
  /** 读事件(先做 `get` 的可见性判定);顺带不阻塞地 {@link kickRun}。 */
606
657
  async listEvents(orgId, conversationId, viewerAccountId, afterSeq, limit) {
@@ -608,6 +659,16 @@ let ConversationsService = class ConversationsService {
608
659
  this.kickRun(conversationId);
609
660
  return this.eventLog.readAfter(conversationId, afterSeq, limit);
610
661
  }
662
+ /**
663
+ * The turn-aligned page of events before `beforeSeq` (`null`: the log's last page), with how
664
+ * many runs started before it ({@link EventLog.readTurnPageBefore}; history paging spec §2).
665
+ * Visibility as {@link get}; kicks a stalled run as {@link listEvents} does.
666
+ */
667
+ async listEventsBefore(orgId, conversationId, viewerAccountId, beforeSeq, limit) {
668
+ await this.get(orgId, conversationId, viewerAccountId);
669
+ this.kickRun(conversationId);
670
+ return this.eventLog.readTurnPageBefore(conversationId, beforeSeq, limit, EVENTS_TURN_EXTEND);
671
+ }
611
672
  /**
612
673
  * 追加一条用户消息;带 `clientMessageId` 时重复提交返回同一事件。写入后调用 `ensureRun`:
613
674
  * 没有进行中的运行时投递一轮;运行中则由当前运行在步骤间隙吸收,或在它结束时再次 `ensureRun`。
@@ -812,9 +873,26 @@ let ConversationsService = class ConversationsService {
812
873
  * 中止会话当前的运行(queued / running / waiting):返回 runId;没有 → `run.not_active`。
813
874
  * 等人处理的运行没有 worker:直接取消等待并写终态。其余经 Redis 广播,运行所在的任意副本都会收到;
814
875
  * 运行已是孤儿(没有任何 worker 在执行)时直接写终态。
876
+ *
877
+ * A root conversation's stop stops only its own run: its background sub-agents keep working
878
+ * (agent map spec §6). A sub-agent's conversation (its owner, from the agent map) stops that
879
+ * sub-agent with every descendant (`RunControl.stopTree`); `run.not_active` when nothing in that
880
+ * subtree runs, else the sub-agent's latest run id.
815
881
  */
816
882
  async abort(orgId, conversationId, accountId) {
817
- await this.get(orgId, conversationId, accountId);
883
+ const conv = await this.get(orgId, conversationId, accountId);
884
+ if (conv.parentConversationId !== null) {
885
+ const latest = await this.db
886
+ .selectFrom("runs")
887
+ .select("id")
888
+ .where("conversation_id", "=", conversationId)
889
+ .orderBy("created_at", "desc")
890
+ .executeTakeFirst();
891
+ const n = await this.runs.stopTree(conversationId, accountId);
892
+ if (n === 0 || !latest)
893
+ throw new ApiError("run.not_active", "No active run to abort");
894
+ return latest.id;
895
+ }
818
896
  const run = await this.db
819
897
  .selectFrom("runs")
820
898
  .select(["id", "status"])
@@ -867,6 +945,7 @@ ConversationsService = __decorate([
867
945
  __param(8, Inject(AttachmentsService)),
868
946
  __param(9, Inject(SkillInvoker)),
869
947
  __param(10, Inject(BackgroundTaskStopper)),
870
- __param(11, Inject(TransactionHost))
948
+ __param(11, Inject(ConversationEnvironments)),
949
+ __param(12, Inject(TransactionHost))
871
950
  ], ConversationsService);
872
951
  export { ConversationsService };
@@ -0,0 +1,24 @@
1
+ import { EnvironmentsService, type EnvironmentView } from "../environments/environments.service.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { ConversationAccess } from "./access.js";
4
+ import { ConversationsService } from "./conversations.service.js";
5
+ /**
6
+ * The environment a conversation works in, for its page (environments spec §9: shown read only):
7
+ * a conversation the viewer may not see → `conversation.not_found`. A sub-agent shows its root
8
+ * conversation's environment. Null while the conversation is unbound, or when its environment is
9
+ * deleted or no longer its owner's (its sandbox tools then fail).
10
+ */
11
+ export declare class ConversationEnvironmentStatus {
12
+ /** Who may see the conversation (the rule of its event stream). */
13
+ private readonly access;
14
+ /** The conversation whose environment it works in: a sub-agent's root, else itself. */
15
+ private readonly conversations;
16
+ private readonly environments;
17
+ private readonly db;
18
+ constructor(
19
+ /** Who may see the conversation (the rule of its event stream). */
20
+ access: Pick<ConversationAccess, "isAccessible">,
21
+ /** The conversation whose environment it works in: a sub-agent's root, else itself. */
22
+ conversations: Pick<ConversationsService, "sandboxConversationOf">, environments: Pick<EnvironmentsService, "get">, db: KernelDb);
23
+ get(orgId: string, conversationId: string, viewerAccountId: string): Promise<EnvironmentView | null>;
24
+ }
@@ -0,0 +1,71 @@
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 { EnvironmentsService } from "../environments/environments.service.js";
12
+ import { ApiError } from "../errors.js";
13
+ import { KernelDb } from "../infra/database/kernel-db.js";
14
+ import { UUID_RE } from "../ui/registry.js";
15
+ import { ConversationAccess } from "./access.js";
16
+ import { ConversationsService } from "./conversations.service.js";
17
+ /**
18
+ * The environment a conversation works in, for its page (environments spec §9: shown read only):
19
+ * a conversation the viewer may not see → `conversation.not_found`. A sub-agent shows its root
20
+ * conversation's environment. Null while the conversation is unbound, or when its environment is
21
+ * deleted or no longer its owner's (its sandbox tools then fail).
22
+ */
23
+ let ConversationEnvironmentStatus = class ConversationEnvironmentStatus {
24
+ access;
25
+ conversations;
26
+ environments;
27
+ db;
28
+ constructor(
29
+ /** Who may see the conversation (the rule of its event stream). */
30
+ access,
31
+ /** The conversation whose environment it works in: a sub-agent's root, else itself. */
32
+ conversations, environments, db) {
33
+ this.access = access;
34
+ this.conversations = conversations;
35
+ this.environments = environments;
36
+ this.db = db;
37
+ }
38
+ async get(orgId, conversationId, viewerAccountId) {
39
+ if (!UUID_RE.test(conversationId) ||
40
+ !(await this.access.isAccessible(orgId, conversationId, viewerAccountId))) {
41
+ throw new ApiError("conversation.not_found", "Conversation not found");
42
+ }
43
+ // a sub-agent works in its root conversation's environment (at every depth)
44
+ const root = await this.conversations.sandboxConversationOf(orgId, conversationId);
45
+ const conv = await this.db
46
+ .selectFrom("conversations")
47
+ .select(["account_id", "environment_id"])
48
+ .where("id", "=", root)
49
+ .where("org_id", "=", orgId)
50
+ .executeTakeFirst();
51
+ if (!conv?.environment_id)
52
+ return null;
53
+ try {
54
+ // the environment as its owner sees it (only the owner may use a personal environment)
55
+ return await this.environments.get(orgId, conv.account_id, conv.environment_id);
56
+ }
57
+ catch (e) {
58
+ if (e instanceof ApiError && e.code === "environment.not_found")
59
+ return null;
60
+ throw e;
61
+ }
62
+ }
63
+ };
64
+ ConversationEnvironmentStatus = __decorate([
65
+ Injectable(),
66
+ __param(0, Inject(ConversationAccess)),
67
+ __param(1, Inject(ConversationsService)),
68
+ __param(2, Inject(EnvironmentsService)),
69
+ __param(3, Inject(KernelDb))
70
+ ], ConversationEnvironmentStatus);
71
+ export { ConversationEnvironmentStatus };
@@ -28,13 +28,16 @@ export declare const conversationTopic: (conversationId: string) => string;
28
28
  * 会话频道上的总线消息:
29
29
  * - `events`:会话日志已推进到 `toSeq`(订阅方据此 `readAfter` 补读,消息本身不携带事件);
30
30
  * - `delta`:运行的流式增量(文本 / 思考 / `step_reset`:丢弃该步此前推出的增量),只是草稿,
31
- * 最终内容以日志中的 assistant_message 为准。`offset`(仅 text):本步本次尝试中此前已推出的文本字符数,
32
- * 中途才订阅的一方据此判断自己是否从头收到了该步的文本(渠道出站投递只在完整时发草稿);
31
+ * 最终内容以日志中的 assistant_message 为准。`offset` (text and thinking): the characters of
32
+ * that channel this attempt of the step streamed before the delta; a subscriber that joined midway
33
+ * tells by it whether it has the step's text from the start (the channel outbound only drafts
34
+ * complete text) and drops what a live draft already covers (spec 2026-11-07 §3.2);
33
35
  * - `ui`:插件经 `ctx.ui.invalidate` 告知这个会话的某个界面贡献变了(不进日志、不是模型可见内容),
34
36
  * SSE 转发为 `event: ui`,网页据此重新取视图。
35
- * - `subagent_progress`: after each step of a sub-agent run, on its **parent's** topic (sub-agents
36
- * spec §14.2): the child's step and tool call count so far, and its last tool's key. Not in any
37
- * log; the SSE forwards it as `event: subagent_progress` (data without `kind`).
37
+ * - `subagent_progress`: after each step of a sub-agent run, on the topic of **every ancestor**
38
+ * (sub-agents spec §14.2, agent map spec §8), `subagentId` the progressing agent: its step and
39
+ * tool call count so far, and its last tool's key. Not in any log; the SSE forwards it as
40
+ * `event: subagent_progress` (data without `kind`).
38
41
  */
39
42
  export type ConversationBusMessage = {
40
43
  kind: "events";
@@ -107,6 +110,18 @@ export declare class EventLog {
107
110
  publishChanged(conversationId: string, what: ConversationChange): Promise<void>;
108
111
  /** 读 `afterSeq` 之后的事件,按 seq 升序,最多 `limit` 条。 */
109
112
  readAfter(conversationId: string, afterSeq: number, limit?: number): Promise<ConversationEvent[]>;
113
+ /**
114
+ * The page of the log that ends right before `beforeSeq` (`null`: the log's end), in ascending
115
+ * seq: the last `limit` events before it, extended back so the first event is the log's first or
116
+ * the first one after a run's end (`run_finished` / `run_failed` / `run_aborted`), at most
117
+ * `extend` events further back (a longer run then starts mid-run). `turnsBefore`: how many runs
118
+ * started (distinct `run_id` of `run_started`) before the page's first event. History paging
119
+ * spec §2.
120
+ */
121
+ readTurnPageBefore(conversationId: string, beforeSeq: number | null, limit: number, extend: number): Promise<{
122
+ events: ConversationEvent[];
123
+ turnsBefore: number;
124
+ }>;
110
125
  /**
111
126
  * 读 `afterSeq` 之后、属于 `runIds` 中某次运行的事件,按 seq 升序,最多 `limit` 条(轨迹按运行分页用)。
112
127
  * `runIds` 为空时返回空数组。走部分索引 `conversation_events_run_idx (conversation_id, run_id, seq)`(0027):
@@ -155,6 +155,66 @@ let EventLog = class EventLog {
155
155
  .execute();
156
156
  return rows.map(toEvent);
157
157
  }
158
+ /**
159
+ * The page of the log that ends right before `beforeSeq` (`null`: the log's end), in ascending
160
+ * seq: the last `limit` events before it, extended back so the first event is the log's first or
161
+ * the first one after a run's end (`run_finished` / `run_failed` / `run_aborted`), at most
162
+ * `extend` events further back (a longer run then starts mid-run). `turnsBefore`: how many runs
163
+ * started (distinct `run_id` of `run_started`) before the page's first event. History paging
164
+ * spec §2.
165
+ */
166
+ async readTurnPageBefore(conversationId, beforeSeq, limit, extend) {
167
+ let q = this.db
168
+ .selectFrom("conversation_events")
169
+ .select(EVENT_COLUMNS)
170
+ .where("conversation_id", "=", conversationId);
171
+ if (beforeSeq !== null)
172
+ q = q.where("seq", "<", String(beforeSeq));
173
+ const rows = (await q.orderBy("seq", "desc").limit(limit).execute()).reverse();
174
+ const first = rows[0] === undefined ? null : Number(rows[0].seq);
175
+ if (first === null)
176
+ return { events: [], turnsBefore: 0 };
177
+ let start = first;
178
+ if (first > 1) {
179
+ // the latest run end at or before the event just above the page, within the extension
180
+ const end = await this.db
181
+ .selectFrom("conversation_events")
182
+ .select((eb) => eb.fn.max("seq").as("seq"))
183
+ .where("conversation_id", "=", conversationId)
184
+ .where("seq", "<", String(first))
185
+ .where("seq", ">=", String(Math.max(1, first - 1 - extend)))
186
+ .where("type", "in", ["run_finished", "run_failed", "run_aborted"])
187
+ .executeTakeFirst();
188
+ // none within reach: the page starts at the log's start when that is in reach, else mid-run
189
+ if (end?.seq != null)
190
+ start = Number(end.seq) + 1;
191
+ else if (first - 1 <= extend)
192
+ start = 1;
193
+ }
194
+ const head = start < first
195
+ ? await this.db
196
+ .selectFrom("conversation_events")
197
+ .select(EVENT_COLUMNS)
198
+ .where("conversation_id", "=", conversationId)
199
+ .where("seq", ">=", String(start))
200
+ .where("seq", "<", String(first))
201
+ .orderBy("seq")
202
+ .execute()
203
+ : [];
204
+ const turns = start > 1
205
+ ? await this.db
206
+ .selectFrom("conversation_events")
207
+ .select((eb) => eb.fn.count("run_id").distinct().as("n"))
208
+ .where("conversation_id", "=", conversationId)
209
+ .where("type", "=", "run_started")
210
+ .where("seq", "<", String(start))
211
+ .executeTakeFirst()
212
+ : undefined;
213
+ return {
214
+ events: [...head, ...rows].map(toEvent),
215
+ turnsBefore: Number(turns?.n ?? 0),
216
+ };
217
+ }
158
218
  /**
159
219
  * 读 `afterSeq` 之后、属于 `runIds` 中某次运行的事件,按 seq 升序,最多 `limit` 条(轨迹按运行分页用)。
160
220
  * `runIds` 为空时返回空数组。走部分索引 `conversation_events_run_idx (conversation_id, run_id, seq)`(0027):