@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6

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 (534) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +51 -14
  3. package/dist/admin/admin.controller.js +60 -19
  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 +54 -23
  19. package/dist/agents/agents.service.js +180 -76
  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/models.controller.d.ts +34 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +176 -0
  29. package/dist/agents/org-templates.js +827 -0
  30. package/dist/agents/pending-connector-requests.d.ts +77 -0
  31. package/dist/agents/pending-connector-requests.js +215 -0
  32. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  33. package/dist/agents/pending-connectors.controller.js +91 -0
  34. package/dist/agents/pending-connectors.service.d.ts +62 -0
  35. package/dist/agents/pending-connectors.service.js +282 -0
  36. package/dist/agents/readiness.controller.d.ts +5 -5
  37. package/dist/agents/readiness.controller.js +6 -6
  38. package/dist/agents/templates.controller.d.ts +86 -5
  39. package/dist/agents/templates.controller.js +171 -7
  40. package/dist/agents/templates.d.ts +127 -23
  41. package/dist/agents/templates.js +475 -52
  42. package/dist/background/background.module.js +8 -1
  43. package/dist/background/finish.d.ts +3 -2
  44. package/dist/background/launch-lock.d.ts +4 -3
  45. package/dist/background/launch-lock.js +4 -3
  46. package/dist/background/poll.job.d.ts +9 -6
  47. package/dist/background/poll.job.js +30 -22
  48. package/dist/background/session.d.ts +13 -2
  49. package/dist/background/session.js +13 -0
  50. package/dist/background/stop.d.ts +12 -6
  51. package/dist/background/stop.js +57 -39
  52. package/dist/background/store.d.ts +18 -6
  53. package/dist/background/store.js +12 -6
  54. package/dist/background/tasks.service.d.ts +15 -5
  55. package/dist/background/tasks.service.js +42 -17
  56. package/dist/background/wake-rules.d.ts +27 -18
  57. package/dist/background/wake-rules.js +52 -22
  58. package/dist/background/wake.d.ts +13 -11
  59. package/dist/background/wake.js +20 -14
  60. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  61. package/dist/catalog/admin-catalog.controller.js +213 -42
  62. package/dist/catalog/catalog-content.d.ts +58 -32
  63. package/dist/catalog/catalog-content.js +34 -8
  64. package/dist/catalog/catalog-import.module.d.ts +7 -0
  65. package/dist/catalog/catalog-import.module.js +60 -0
  66. package/dist/catalog/catalog-items.d.ts +111 -7
  67. package/dist/catalog/catalog-items.js +279 -13
  68. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  69. package/dist/catalog/catalog-scope.service.js +1116 -0
  70. package/dist/catalog/catalog.module.d.ts +7 -9
  71. package/dist/catalog/catalog.module.js +41 -31
  72. package/dist/catalog/catalog.service.d.ts +101 -29
  73. package/dist/catalog/catalog.service.js +104 -106
  74. package/dist/catalog/cli.d.ts +11 -1
  75. package/dist/catalog/cli.js +26 -1
  76. package/dist/catalog/component-promotion.d.ts +96 -0
  77. package/dist/catalog/component-promotion.js +395 -0
  78. package/dist/catalog/component-scope.controller.d.ts +152 -0
  79. package/dist/catalog/component-scope.controller.js +287 -0
  80. package/dist/catalog/component-scope.service.d.ts +303 -0
  81. package/dist/catalog/component-scope.service.js +936 -0
  82. package/dist/catalog/component-state.d.ts +174 -0
  83. package/dist/catalog/component-state.js +437 -0
  84. package/dist/catalog/job-ids.d.ts +30 -0
  85. package/dist/catalog/job-ids.js +25 -0
  86. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  87. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  88. package/dist/catalog/marketplaces.controller.js +56 -7
  89. package/dist/catalog/marketplaces.service.d.ts +54 -14
  90. package/dist/catalog/marketplaces.service.js +71 -22
  91. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  92. package/dist/catalog/org-catalog.controller.js +181 -65
  93. package/dist/catalog/org-catalog.service.d.ts +65 -33
  94. package/dist/catalog/org-catalog.service.js +324 -157
  95. package/dist/catalog/org-extension-switch.d.ts +41 -0
  96. package/dist/catalog/org-extension-switch.js +115 -0
  97. package/dist/catalog/org-extension.controller.d.ts +119 -0
  98. package/dist/catalog/org-extension.controller.js +266 -0
  99. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  100. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  101. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  102. package/dist/catalog/org-plugin-uploads.js +116 -0
  103. package/dist/catalog/owned-items.d.ts +184 -0
  104. package/dist/catalog/owned-items.js +789 -0
  105. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  106. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  107. package/dist/catalog/ownership.d.ts +172 -0
  108. package/dist/catalog/ownership.js +326 -0
  109. package/dist/catalog/platform-components.d.ts +221 -0
  110. package/dist/catalog/platform-components.js +761 -0
  111. package/dist/catalog/platform-migration.d.ts +115 -0
  112. package/dist/catalog/platform-migration.js +582 -0
  113. package/dist/catalog/plugin-import.d.ts +178 -34
  114. package/dist/catalog/plugin-import.js +622 -82
  115. package/dist/catalog/plugin-install.d.ts +185 -41
  116. package/dist/catalog/plugin-install.js +758 -126
  117. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  118. package/dist/catalog/plugin-upgrade.js +1147 -1136
  119. package/dist/catalog/request-rules.d.ts +65 -0
  120. package/dist/catalog/request-rules.js +217 -0
  121. package/dist/catalog/requests.service.d.ts +193 -118
  122. package/dist/catalog/requests.service.js +526 -343
  123. package/dist/catalog/reserved-names.d.ts +8 -0
  124. package/dist/catalog/reserved-names.js +42 -0
  125. package/dist/catalog/scope-orgs.d.ts +21 -0
  126. package/dist/catalog/scope-orgs.js +67 -0
  127. package/dist/catalog/scope-state.d.ts +35 -0
  128. package/dist/catalog/scope-state.js +87 -0
  129. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  130. package/dist/catalog/scope-sync-workers.js +29 -0
  131. package/dist/catalog/scope-sync.d.ts +176 -0
  132. package/dist/catalog/scope-sync.js +576 -0
  133. package/dist/catalog/scope.d.ts +42 -0
  134. package/dist/catalog/scope.js +42 -0
  135. package/dist/catalog/unshare.d.ts +22 -0
  136. package/dist/catalog/unshare.js +118 -0
  137. package/dist/channels/actions.js +1 -0
  138. package/dist/channels/cards.js +20 -2
  139. package/dist/channels/channels.module.js +2 -0
  140. package/dist/channels/inbound.d.ts +9 -1
  141. package/dist/channels/inbound.js +67 -5
  142. package/dist/channels/phrases.d.ts +35 -0
  143. package/dist/channels/phrases.js +29 -0
  144. package/dist/config/docs.js +3 -1
  145. package/dist/config/schema.d.ts +10 -2
  146. package/dist/config/schema.js +70 -22
  147. package/dist/conversations/access.d.ts +6 -4
  148. package/dist/conversations/access.js +27 -5
  149. package/dist/conversations/agent-tree.d.ts +46 -0
  150. package/dist/conversations/agent-tree.js +92 -0
  151. package/dist/conversations/conversations.controller.d.ts +43 -18
  152. package/dist/conversations/conversations.controller.js +79 -38
  153. package/dist/conversations/conversations.module.d.ts +1 -1
  154. package/dist/conversations/conversations.module.js +7 -7
  155. package/dist/conversations/conversations.service.d.ts +73 -15
  156. package/dist/conversations/conversations.service.js +115 -35
  157. package/dist/conversations/environment-status.d.ts +24 -0
  158. package/dist/conversations/environment-status.js +71 -0
  159. package/dist/conversations/event-log.d.ts +20 -5
  160. package/dist/conversations/event-log.js +60 -0
  161. package/dist/conversations/events.d.ts +84 -2
  162. package/dist/conversations/events.js +91 -17
  163. package/dist/conversations/queue.service.d.ts +1 -1
  164. package/dist/conversations/queue.service.js +5 -0
  165. package/dist/conversations/titles.d.ts +5 -3
  166. package/dist/conversations/titles.js +21 -8
  167. package/dist/conversations/tree.d.ts +17 -0
  168. package/dist/conversations/tree.js +42 -0
  169. package/dist/ctx/create-ctx.d.ts +20 -1
  170. package/dist/ctx/create-ctx.js +38 -7
  171. package/dist/db/kernel-schema.d.ts +386 -18
  172. package/dist/environments/access.d.ts +41 -0
  173. package/dist/environments/access.js +77 -0
  174. package/dist/environments/conversation-environments.d.ts +61 -0
  175. package/dist/environments/conversation-environments.js +170 -0
  176. package/dist/environments/dto.d.ts +25 -0
  177. package/dist/environments/dto.js +12 -0
  178. package/dist/environments/environments.controller.d.ts +33 -0
  179. package/dist/environments/environments.controller.js +110 -0
  180. package/dist/environments/environments.module.d.ts +8 -0
  181. package/dist/environments/environments.module.js +27 -0
  182. package/dist/environments/environments.service.d.ts +153 -0
  183. package/dist/environments/environments.service.js +541 -0
  184. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  185. package/dist/environments/legacy-cleanup.job.js +141 -0
  186. package/dist/errors.d.ts +85 -2
  187. package/dist/errors.js +85 -2
  188. package/dist/evals/reconstruct.d.ts +18 -9
  189. package/dist/evals/reconstruct.js +26 -7
  190. package/dist/evals/run-replay.d.ts +4 -2
  191. package/dist/evals/run-replay.js +20 -6
  192. package/dist/evals/runs.service.d.ts +2 -1
  193. package/dist/evals/runs.service.js +13 -12
  194. package/dist/evals/step-replay.d.ts +4 -6
  195. package/dist/evals/step-replay.js +4 -3
  196. package/dist/evals/trajectory.service.d.ts +8 -3
  197. package/dist/evals/trajectory.service.js +26 -14
  198. package/dist/evals/worker.d.ts +5 -5
  199. package/dist/evals/worker.js +9 -3
  200. package/dist/extensions/admin-ops.d.ts +36 -10
  201. package/dist/extensions/admin-ops.js +65 -42
  202. package/dist/extensions/admin-view.d.ts +37 -10
  203. package/dist/extensions/admin-view.js +103 -20
  204. package/dist/extensions/bootstrap.d.ts +17 -4
  205. package/dist/extensions/bootstrap.js +70 -9
  206. package/dist/extensions/cli.d.ts +12 -0
  207. package/dist/extensions/cli.js +11 -2
  208. package/dist/extensions/config-hash.d.ts +10 -0
  209. package/dist/extensions/config-hash.js +38 -0
  210. package/dist/extensions/deployment-config.d.ts +28 -5
  211. package/dist/extensions/deployment-config.js +48 -7
  212. package/dist/extensions/effective-config.d.ts +127 -0
  213. package/dist/extensions/effective-config.js +368 -0
  214. package/dist/extensions/extensions.module.js +11 -11
  215. package/dist/extensions/hooks.d.ts +37 -4
  216. package/dist/extensions/hooks.js +82 -16
  217. package/dist/extensions/host.d.ts +24 -10
  218. package/dist/extensions/host.js +49 -54
  219. package/dist/extensions/installs.d.ts +20 -8
  220. package/dist/extensions/installs.js +37 -15
  221. package/dist/extensions/org-config.d.ts +75 -6
  222. package/dist/extensions/org-config.js +184 -32
  223. package/dist/extensions/org-levels.d.ts +37 -0
  224. package/dist/extensions/org-levels.js +71 -0
  225. package/dist/extensions/org-overrides.d.ts +151 -0
  226. package/dist/extensions/org-overrides.js +524 -0
  227. package/dist/extensions/permission-view.d.ts +16 -4
  228. package/dist/extensions/permission-view.js +4 -4
  229. package/dist/extensions/plugin-items.d.ts +21 -0
  230. package/dist/extensions/plugin-items.js +42 -0
  231. package/dist/extensions/point-defaults.d.ts +12 -5
  232. package/dist/extensions/point-defaults.js +37 -9
  233. package/dist/extensions/resolve.d.ts +5 -1
  234. package/dist/extensions/resolve.js +15 -2
  235. package/dist/extensions/state.module.d.ts +9 -0
  236. package/dist/extensions/state.module.js +38 -0
  237. package/dist/files/previewers.d.ts +8 -1
  238. package/dist/files/previewers.js +35 -6
  239. package/dist/http/api.module.js +25 -3
  240. package/dist/http/app.d.ts +11 -2
  241. package/dist/http/app.js +31 -5
  242. package/dist/http/plugin-dispatch.d.ts +4 -1
  243. package/dist/http/plugin-dispatch.js +14 -2
  244. package/dist/identity/accounts.d.ts +29 -29
  245. package/dist/identity/accounts.js +47 -47
  246. package/dist/identity/audit.d.ts +2 -1
  247. package/dist/identity/auth.guard.d.ts +13 -5
  248. package/dist/identity/auth.guard.js +26 -9
  249. package/dist/identity/identity.module.d.ts +1 -1
  250. package/dist/identity/identity.module.js +4 -4
  251. package/dist/identity/me.controller.js +1 -1
  252. package/dist/identity/principal.d.ts +3 -3
  253. package/dist/identity/principal.js +3 -3
  254. package/dist/identity/settings.d.ts +22 -11
  255. package/dist/identity/settings.js +53 -18
  256. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  257. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  258. package/dist/inbox/inbox.module.d.ts +4 -1
  259. package/dist/inbox/inbox.module.js +7 -3
  260. package/dist/inbox/inbox.service.d.ts +62 -3
  261. package/dist/inbox/inbox.service.js +74 -4
  262. package/dist/inbox/org-notices.d.ts +63 -0
  263. package/dist/inbox/org-notices.js +91 -0
  264. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  265. package/dist/inbox/platform-inbox.controller.js +58 -0
  266. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  267. package/dist/inbox/platform-inbox.service.js +263 -0
  268. package/dist/inbox/platform-notices.d.ts +19 -0
  269. package/dist/inbox/platform-notices.js +9 -0
  270. package/dist/index.d.ts +1 -1
  271. package/dist/index.js +1 -1
  272. package/dist/infra/cli/kernel-cli.module.js +9 -1
  273. package/dist/infra/config/kernel-config.service.js +24 -1
  274. package/dist/infra/database/xact-lock.d.ts +1 -1
  275. package/dist/infra/database/xact-lock.js +1 -1
  276. package/dist/infra/events/kernel-events.d.ts +19 -2
  277. package/dist/infra/queue/add-job-once.d.ts +14 -0
  278. package/dist/infra/queue/add-job-once.js +16 -0
  279. package/dist/kernel.module.js +6 -0
  280. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  281. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  282. package/dist/models/embeddings.d.ts +82 -0
  283. package/dist/models/embeddings.js +326 -0
  284. package/dist/models/enablement.controller.d.ts +40 -0
  285. package/dist/models/enablement.controller.js +74 -0
  286. package/dist/models/enablement.d.ts +99 -0
  287. package/dist/models/enablement.js +263 -0
  288. package/dist/models/models.module.d.ts +5 -1
  289. package/dist/models/models.module.js +16 -4
  290. package/dist/models/prices.d.ts +5 -5
  291. package/dist/models/prices.js +4 -4
  292. package/dist/models/purposes.controller.d.ts +6 -4
  293. package/dist/models/purposes.controller.js +13 -7
  294. package/dist/models/purposes.d.ts +37 -12
  295. package/dist/models/purposes.js +63 -17
  296. package/dist/orgs/directory-sync.d.ts +14 -5
  297. package/dist/orgs/directory-sync.js +41 -17
  298. package/dist/orgs/offboarding.d.ts +9 -7
  299. package/dist/orgs/offboarding.js +28 -17
  300. package/dist/orgs/org-lock.d.ts +5 -0
  301. package/dist/orgs/org-lock.js +13 -0
  302. package/dist/orgs/org.guard.d.ts +10 -0
  303. package/dist/orgs/org.guard.js +43 -32
  304. package/dist/orgs/orgs.module.js +3 -0
  305. package/dist/orgs/orgs.service.d.ts +20 -7
  306. package/dist/orgs/orgs.service.js +32 -12
  307. package/dist/orgs/roles.d.ts +1 -1
  308. package/dist/orgs/roles.js +5 -1
  309. package/dist/orgs/settings.controller.d.ts +1 -1
  310. package/dist/orgs/settings.service.d.ts +15 -3
  311. package/dist/orgs/settings.service.js +6 -2
  312. package/dist/overrides.d.ts +3 -0
  313. package/dist/overrides.js +2 -0
  314. package/dist/platform/actor.d.ts +48 -0
  315. package/dist/platform/actor.js +100 -0
  316. package/dist/platform/agent-docs.d.ts +18 -0
  317. package/dist/platform/agent-docs.js +59 -0
  318. package/dist/platform/availability.d.ts +14 -0
  319. package/dist/platform/availability.js +43 -0
  320. package/dist/platform/errors.d.ts +11 -0
  321. package/dist/platform/errors.js +26 -0
  322. package/dist/platform/exclusions.d.ts +12 -0
  323. package/dist/platform/exclusions.js +1405 -0
  324. package/dist/platform/method.d.ts +6 -0
  325. package/dist/platform/method.js +15 -0
  326. package/dist/platform/operation.d.ts +92 -0
  327. package/dist/platform/operation.js +35 -0
  328. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  329. package/dist/platform/ops/agent-templates.ops.js +92 -0
  330. package/dist/platform/ops/agents.ops.d.ts +19 -0
  331. package/dist/platform/ops/agents.ops.js +294 -0
  332. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  333. package/dist/platform/ops/connectors.ops.js +126 -0
  334. package/dist/platform/ops/errors.d.ts +11 -0
  335. package/dist/platform/ops/errors.js +22 -0
  336. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  337. package/dist/platform/ops/extensions.ops.js +116 -0
  338. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  339. package/dist/platform/ops/marketplaces.ops.js +157 -0
  340. package/dist/platform/ops/paging.d.ts +14 -0
  341. package/dist/platform/ops/paging.js +20 -0
  342. package/dist/platform/ops/platform.ops.d.ts +23 -0
  343. package/dist/platform/ops/platform.ops.js +158 -0
  344. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  345. package/dist/platform/ops/plugins.ops.js +377 -0
  346. package/dist/platform/ops/requests.ops.d.ts +14 -0
  347. package/dist/platform/ops/requests.ops.js +153 -0
  348. package/dist/platform/ops/role.d.ts +4 -0
  349. package/dist/platform/ops/role.js +10 -0
  350. package/dist/platform/ops/skills.ops.d.ts +13 -0
  351. package/dist/platform/ops/skills.ops.js +98 -0
  352. package/dist/platform/ops/summary.d.ts +10 -0
  353. package/dist/platform/ops/summary.js +18 -0
  354. package/dist/platform/platform-ops.module.d.ts +7 -0
  355. package/dist/platform/platform-ops.module.js +55 -0
  356. package/dist/platform/platform.module.d.ts +8 -0
  357. package/dist/platform/platform.module.js +25 -0
  358. package/dist/platform/redact-orgs.d.ts +7 -0
  359. package/dist/platform/redact-orgs.js +52 -0
  360. package/dist/platform/registry.d.ts +30 -0
  361. package/dist/platform/registry.js +111 -0
  362. package/dist/roles/worker-role.d.ts +6 -4
  363. package/dist/roles/worker-role.js +14 -7
  364. package/dist/roles/worker.module.d.ts +1 -1
  365. package/dist/roles/worker.module.js +9 -1
  366. package/dist/runtime/context/build.d.ts +6 -4
  367. package/dist/runtime/context/build.js +26 -7
  368. package/dist/runtime/context/claude-tools.d.ts +2 -1
  369. package/dist/runtime/context/claude-tools.js +5 -4
  370. package/dist/runtime/context/compaction.js +9 -0
  371. package/dist/runtime/context/reminders.d.ts +2 -0
  372. package/dist/runtime/context/reminders.js +2 -0
  373. package/dist/runtime/context/skills.js +9 -2
  374. package/dist/runtime/context/tool-changes.d.ts +27 -0
  375. package/dist/runtime/context/tool-changes.js +60 -0
  376. package/dist/runtime/hook-calls.d.ts +8 -1
  377. package/dist/runtime/hook-calls.js +40 -7
  378. package/dist/runtime/langgraph-loop.d.ts +3 -1
  379. package/dist/runtime/langgraph-loop.js +35 -17
  380. package/dist/runtime/loop.d.ts +32 -4
  381. package/dist/runtime/maintenance.d.ts +7 -4
  382. package/dist/runtime/maintenance.js +23 -8
  383. package/dist/runtime/model-call.d.ts +38 -11
  384. package/dist/runtime/model-call.js +97 -24
  385. package/dist/runtime/providers.d.ts +146 -32
  386. package/dist/runtime/providers.js +321 -67
  387. package/dist/runtime/run-control.d.ts +11 -1
  388. package/dist/runtime/run-control.js +12 -0
  389. package/dist/runtime/run-drafts.d.ts +85 -0
  390. package/dist/runtime/run-drafts.js +230 -0
  391. package/dist/runtime/run-jobs.d.ts +3 -5
  392. package/dist/runtime/run-jobs.js +3 -7
  393. package/dist/runtime/run-queue.d.ts +37 -3
  394. package/dist/runtime/run-queue.js +188 -11
  395. package/dist/runtime/run-worker.d.ts +12 -6
  396. package/dist/runtime/run-worker.js +58 -35
  397. package/dist/runtime/runtime.module.js +3 -0
  398. package/dist/runtime/step-log.d.ts +9 -4
  399. package/dist/runtime/step-log.js +8 -5
  400. package/dist/runtime/stream.controller.d.ts +23 -1
  401. package/dist/runtime/stream.controller.js +60 -3
  402. package/dist/runtime/stream.d.ts +4 -1
  403. package/dist/runtime/stream.js +27 -3
  404. package/dist/runtime/subagents/child.d.ts +55 -7
  405. package/dist/runtime/subagents/child.js +105 -7
  406. package/dist/runtime/subagents/definition.d.ts +12 -3
  407. package/dist/runtime/subagents/definition.js +46 -32
  408. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  409. package/dist/runtime/subagents/deliveries.js +228 -0
  410. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  411. package/dist/runtime/subagents/dispatch.js +212 -141
  412. package/dist/runtime/subagents/limits.d.ts +24 -5
  413. package/dist/runtime/subagents/limits.js +40 -6
  414. package/dist/runtime/subagents/messages.d.ts +95 -0
  415. package/dist/runtime/subagents/messages.js +328 -0
  416. package/dist/runtime/subagents/preamble.d.ts +4 -4
  417. package/dist/runtime/subagents/preamble.js +9 -7
  418. package/dist/runtime/subagents/progress.d.ts +8 -6
  419. package/dist/runtime/subagents/progress.js +11 -6
  420. package/dist/runtime/subagents/render.d.ts +30 -0
  421. package/dist/runtime/subagents/render.js +53 -0
  422. package/dist/runtime/subagents/roster.d.ts +24 -7
  423. package/dist/runtime/subagents/roster.js +47 -11
  424. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  425. package/dist/runtime/subagents/skill-fork.js +8 -4
  426. package/dist/runtime/subagents/status.d.ts +14 -0
  427. package/dist/runtime/subagents/status.js +23 -0
  428. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  429. package/dist/runtime/subagents/subagents.service.js +11 -6
  430. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  431. package/dist/runtime/usage-report-jobs.js +158 -0
  432. package/dist/runtime/usage-report.d.ts +33 -38
  433. package/dist/runtime/usage-report.js +169 -96
  434. package/dist/runtime/waits.d.ts +140 -37
  435. package/dist/runtime/waits.js +394 -106
  436. package/dist/sandbox/jobs.d.ts +40 -13
  437. package/dist/sandbox/jobs.js +57 -20
  438. package/dist/sandbox/leases.d.ts +37 -54
  439. package/dist/sandbox/leases.js +71 -115
  440. package/dist/sandbox/providers.d.ts +2 -2
  441. package/dist/sandbox/providers.js +1 -1
  442. package/dist/sandbox/sandbox.module.d.ts +3 -2
  443. package/dist/sandbox/sandbox.module.js +4 -3
  444. package/dist/sandbox/sandbox.service.d.ts +229 -134
  445. package/dist/sandbox/sandbox.service.js +630 -409
  446. package/dist/skills/catalog.d.ts +3 -2
  447. package/dist/skills/catalog.js +21 -43
  448. package/dist/skills/changes.controller.d.ts +7 -0
  449. package/dist/skills/changes.controller.js +19 -1
  450. package/dist/skills/invoke.js +8 -3
  451. package/dist/skills/package.d.ts +20 -1
  452. package/dist/skills/package.js +28 -1
  453. package/dist/skills/skills.controller.d.ts +39 -4
  454. package/dist/skills/skills.controller.js +88 -10
  455. package/dist/skills/skills.module.js +10 -1
  456. package/dist/skills/skills.service.d.ts +106 -26
  457. package/dist/skills/skills.service.js +421 -75
  458. package/dist/skills/usable.d.ts +81 -0
  459. package/dist/skills/usable.js +379 -0
  460. package/dist/tools/approvals.service.d.ts +20 -2
  461. package/dist/tools/approvals.service.js +23 -4
  462. package/dist/tools/builtin-names.d.ts +21 -5
  463. package/dist/tools/builtin-names.js +30 -5
  464. package/dist/tools/builtins/agent.d.ts +23 -21
  465. package/dist/tools/builtins/agent.js +62 -55
  466. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  467. package/dist/tools/builtins/builtin-tools.js +37 -12
  468. package/dist/tools/builtins/handback.d.ts +28 -0
  469. package/dist/tools/builtins/handback.js +53 -0
  470. package/dist/tools/builtins/platform.d.ts +34 -0
  471. package/dist/tools/builtins/platform.js +362 -0
  472. package/dist/tools/builtins/sandbox/bash.js +13 -3
  473. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  474. package/dist/tools/builtins/sandbox/common.js +80 -45
  475. package/dist/tools/builtins/sandbox/edit.js +2 -2
  476. package/dist/tools/builtins/sandbox/glob.js +2 -2
  477. package/dist/tools/builtins/sandbox/grep.js +2 -4
  478. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  479. package/dist/tools/builtins/sandbox/index.js +1 -1
  480. package/dist/tools/builtins/sandbox/read.js +1 -1
  481. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  482. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  483. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  484. package/dist/tools/builtins/sandbox/write.js +2 -2
  485. package/dist/tools/builtins/send-message.d.ts +56 -0
  486. package/dist/tools/builtins/send-message.js +100 -0
  487. package/dist/tools/builtins/skill-load.d.ts +22 -14
  488. package/dist/tools/builtins/skill-load.js +86 -57
  489. package/dist/tools/builtins/skill-write.js +1 -1
  490. package/dist/tools/builtins/web/extract.js +5 -1
  491. package/dist/tools/builtins/web/fetch.js +1 -0
  492. package/dist/tools/builtins/web/search.js +1 -0
  493. package/dist/tools/connectors.controller.d.ts +10 -0
  494. package/dist/tools/connectors.controller.js +12 -0
  495. package/dist/tools/connectors.service.d.ts +46 -5
  496. package/dist/tools/connectors.service.js +94 -15
  497. package/dist/tools/extension-tools.controller.d.ts +14 -0
  498. package/dist/tools/extension-tools.controller.js +37 -0
  499. package/dist/tools/info.d.ts +42 -1
  500. package/dist/tools/info.js +64 -1
  501. package/dist/tools/org-tool-switches.d.ts +74 -0
  502. package/dist/tools/org-tool-switches.js +184 -0
  503. package/dist/tools/pipeline.d.ts +46 -40
  504. package/dist/tools/pipeline.js +193 -364
  505. package/dist/tools/policy.d.ts +1 -1
  506. package/dist/tools/policy.js +36 -16
  507. package/dist/tools/registry.d.ts +98 -5
  508. package/dist/tools/registry.js +87 -9
  509. package/dist/tools/tools.module.js +12 -2
  510. package/dist/ui/views.d.ts +2 -1
  511. package/dist/ui/views.js +17 -3
  512. package/package.json +3 -3
  513. package/src/migrations/0074_subagent_tree.sql +50 -0
  514. package/src/migrations/0075_plugin_scope.sql +61 -0
  515. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  516. package/src/migrations/0077_scope_requests.sql +52 -0
  517. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  518. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  519. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  520. package/src/migrations/0081_platform_components.sql +129 -0
  521. package/src/migrations/0082_platform_migration.sql +33 -0
  522. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  523. package/src/migrations/0084_org_owned_items.sql +85 -0
  524. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  525. package/src/migrations/0086_org_layering.sql +30 -0
  526. package/src/migrations/0087_approval_summary.sql +6 -0
  527. package/src/migrations/0088_environments.sql +80 -0
  528. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  529. package/dist/catalog/upgrade-targets.d.ts +0 -56
  530. package/dist/catalog/upgrade-targets.js +0 -90
  531. package/dist/conversations/sandbox-status.d.ts +0 -24
  532. package/dist/conversations/sandbox-status.js +0 -52
  533. package/dist/extensions/org-config.controller.d.ts +0 -32
  534. package/dist/extensions/org-config.controller.js +0 -70
@@ -12,9 +12,10 @@ import { TransactionHost } from "../infra/database/transaction-host.js";
12
12
  import { Transactional } from "../infra/database/transactional.decorator.js";
13
13
  import { XactLock } from "../infra/database/xact-lock.js";
14
14
  /**
15
- * The launch lock of one sandbox (decision R9: one provider per transaction-scoped lock):
16
- * serializes background task reservations in a sandbox, so the count of running tasks checked
17
- * against `sandbox.background.maxTasks` and the insert of the new row are one step. Joins the
15
+ * The launch lock of one root conversation (decision R9: one provider per transaction-scoped
16
+ * lock): serializes background task reservations in its tree, so the count of running tasks
17
+ * checked against `sandbox.background.maxTasks` (per root conversation, whatever environment it
18
+ * works in) and the insert of the new row are one step. Joins the
18
19
  * caller's transaction (`mandatory`), which holds it until it ends.
19
20
  */
20
21
  let BackgroundLaunchLock = class BackgroundLaunchLock {
@@ -21,11 +21,12 @@ export declare const launchAbandonedAfterMs: (cfg: KernelConfig) => number;
21
21
  /**
22
22
  * The worker's background task jobs (spec 2026-11-05-background-bash-design §4.3), each once per
23
23
  * tick across replicas:
24
- * - `background-task-poll` (every `sandbox.background.pollSeconds`): for every sandbox with
25
- * running tasks, one exec through `SandboxService.ifRunning` (which never creates or resumes a
26
- * sandbox) reports each task's exit file and liveness; ended tasks finish through
27
- * {@link BackgroundTaskFinisher}. Each poll takes and releases a lease, so `last_used_at` stays
28
- * fresh and a sandbox with running tasks is never idle-suspended;
24
+ * - `background-task-poll` (every `sandbox.background.pollSeconds`): for every environment
25
+ * instance with running tasks (of any conversation using it), one exec through
26
+ * `SandboxService.ifRunning` (which never creates or resumes an instance) reports each task's
27
+ * exit file and liveness; ended tasks finish through {@link BackgroundTaskFinisher}. Each poll
28
+ * takes and releases a lease, so `last_used_at` stays fresh and an instance with running tasks
29
+ * is never idle-suspended;
29
30
  * - `background-task-prune` (daily): deletes finished tasks older than `tools.outputRetentionDays`.
30
31
  */
31
32
  export declare class BackgroundTaskPollJob {
@@ -46,8 +47,10 @@ export declare class BackgroundTaskPollJob {
46
47
  * result: they never started), with a `changed: "background"` frame to their conversations.
47
48
  */
48
49
  pollOnce(signal?: AbortSignal): Promise<number>;
49
- /** Polls the tasks of one sandbox instance; returns how many finished. */
50
+ /** Polls the tasks of one environment instance; returns how many finished. */
50
51
  private pollSandbox;
52
+ /** The poll exec of one instance: each task's report by id. */
53
+ private pollExec;
51
54
  /** Deletes the finished tasks older than `tools.outputRetentionDays` (their rows only). */
52
55
  prune(): Promise<void>;
53
56
  }
@@ -14,10 +14,11 @@ import { LockService } from "../infra/lock/lock.service.js";
14
14
  import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
15
15
  import { LockedInterval } from "../infra/schedule/locked-interval.js";
16
16
  import { KERNEL_LOGGER } from "../infra/tokens.js";
17
- import { SandboxService } from "../sandbox/sandbox.service.js";
17
+ import { SandboxService, } from "../sandbox/sandbox.service.js";
18
18
  import { sandboxBaseTimeoutMs } from "../tools/builtins/sandbox/common.js";
19
19
  import { BackgroundTaskFinisher } from "./finish.js";
20
20
  import { LAUNCH_EXEC_TIMEOUT_MS } from "./launch.js";
21
+ import { actingAs, taskActor } from "./session.js";
21
22
  import { parsePollOutput, polledAs, pollScript } from "./status.js";
22
23
  import { notRunningAs, RECREATED } from "./stop.js";
23
24
  import { BackgroundTaskStore } from "./store.js";
@@ -42,11 +43,12 @@ const POLL_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
42
43
  /**
43
44
  * The worker's background task jobs (spec 2026-11-05-background-bash-design §4.3), each once per
44
45
  * tick across replicas:
45
- * - `background-task-poll` (every `sandbox.background.pollSeconds`): for every sandbox with
46
- * running tasks, one exec through `SandboxService.ifRunning` (which never creates or resumes a
47
- * sandbox) reports each task's exit file and liveness; ended tasks finish through
48
- * {@link BackgroundTaskFinisher}. Each poll takes and releases a lease, so `last_used_at` stays
49
- * fresh and a sandbox with running tasks is never idle-suspended;
46
+ * - `background-task-poll` (every `sandbox.background.pollSeconds`): for every environment
47
+ * instance with running tasks (of any conversation using it), one exec through
48
+ * `SandboxService.ifRunning` (which never creates or resumes an instance) reports each task's
49
+ * exit file and liveness; ended tasks finish through {@link BackgroundTaskFinisher}. Each poll
50
+ * takes and releases a lease, so `last_used_at` stays fresh and an instance with running tasks
51
+ * is never idle-suspended;
50
52
  * - `background-task-prune` (daily): deletes finished tasks older than `tools.outputRetentionDays`.
51
53
  */
52
54
  let BackgroundTaskPollJob = class BackgroundTaskPollJob {
@@ -92,7 +94,8 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
92
94
  for (const t of await this.store.runningStarted()) {
93
95
  if (t.sid === null || t.sandboxCreatedAt === null)
94
96
  continue;
95
- const key = `${t.sandboxConversationId} ${t.sandboxCreatedAt.getTime()}`;
97
+ // one exec per instance: the tasks of every conversation sharing the environment
98
+ const key = `${t.environmentId} ${t.sandboxCreatedAt.getTime()}`;
96
99
  groups.set(key, [...(groups.get(key) ?? []), t]);
97
100
  }
98
101
  let finished = 0;
@@ -106,7 +109,7 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
106
109
  if (signal.aborted)
107
110
  break;
108
111
  this.log.warn("cannot poll background tasks; retrying next tick", {
109
- conversationId: tasks[0]?.sandboxConversationId,
112
+ environmentId: tasks[0]?.environmentId,
110
113
  err,
111
114
  });
112
115
  }
@@ -115,22 +118,13 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
115
118
  this.log.info("background tasks finished", { count: finished });
116
119
  return finished;
117
120
  }
118
- /** Polls the tasks of one sandbox instance; returns how many finished. */
121
+ /** Polls the tasks of one environment instance; returns how many finished. */
119
122
  async pollSandbox(tasks, signal) {
120
123
  const [first] = tasks;
121
- const r = await this.sandbox.ifRunning(first.sandboxConversationId, { createdAt: first.sandboxCreatedAt }, async (p, h, sig) => {
122
- const res = await p.exec(h, {
123
- command: pollScript(tasks.map((t) => ({ id: t.id, sid: t.sid }))),
124
- cwd: "/workspace",
125
- timeoutMs: POLL_EXEC_TIMEOUT_MS,
126
- maxOutputBytes: POLL_MAX_OUTPUT_BYTES,
127
- signal: sig,
128
- });
129
- if (res.exitCode !== 0 || res.truncated) {
130
- throw new Error(`the poll exec failed (exit ${res.exitCode}${res.truncated ? ", truncated" : ""}): ${res.stderr.slice(0, 500)}`);
131
- }
132
- return parsePollOutput(res.stdout);
133
- }, signal);
124
+ // a task from before environments has no instance any more
125
+ const r = first.environmentId === null
126
+ ? { kind: "not_running", status: "gone" }
127
+ : await this.sandbox.ifRunning(first.environmentId, { createdAt: first.sandboxCreatedAt }, (p, h, sig) => this.pollExec(actingAs(p, taskActor(first)), h, tasks, sig), signal);
134
128
  const now = new Date();
135
129
  let n = 0;
136
130
  for (const t of tasks) {
@@ -155,6 +149,20 @@ let BackgroundTaskPollJob = class BackgroundTaskPollJob {
155
149
  }
156
150
  return n;
157
151
  }
152
+ /** The poll exec of one instance: each task's report by id. */
153
+ async pollExec(p, h, tasks, signal) {
154
+ const res = await p.exec(h, {
155
+ command: pollScript(tasks.map((t) => ({ id: t.id, sid: t.sid }))),
156
+ cwd: "/workspace",
157
+ timeoutMs: POLL_EXEC_TIMEOUT_MS,
158
+ maxOutputBytes: POLL_MAX_OUTPUT_BYTES,
159
+ signal,
160
+ });
161
+ if (res.exitCode !== 0 || res.truncated) {
162
+ throw new Error(`the poll exec failed (exit ${res.exitCode}${res.truncated ? ", truncated" : ""}): ${res.stderr.slice(0, 500)}`);
163
+ }
164
+ return parsePollOutput(res.stdout);
165
+ }
158
166
  /** Deletes the finished tasks older than `tools.outputRetentionDays` (their rows only). */
159
167
  async prune() {
160
168
  const days = this.config.get().tools.outputRetentionDays;
@@ -1,10 +1,21 @@
1
- import type { SandboxHandle, SandboxProvider } from "@capybara-hq/plugin-sdk";
1
+ import type { SandboxActor, SandboxHandle } from "@capybara-hq/plugin-sdk";
2
+ import type { HeldProvider, TaggedProvider } from "../sandbox/sandbox.service.js";
2
3
  /**
3
4
  * A background task's session inside the sandbox (spec 2026-11-05-background-bash-design §4.2):
4
5
  * every process of a task is in the session `setsid` started, so liveness is `pgrep -s <sid>` and
5
6
  * stopping is `pkill -s <sid>` (never `kill -0` or `/proc`, which disagree between sandbox-fake and
6
7
  * Linux).
7
8
  */
9
+ /**
10
+ * `p` with every `exec` carrying `actor` (`SandboxService.ifRunning` tags execs but leaves the
11
+ * actor to the caller): the provider then reads like a `withSandbox` holder's.
12
+ */
13
+ export declare function actingAs(p: TaggedProvider, actor: SandboxActor): HeldProvider;
14
+ /** Who a background task's own execs (poll, stop, reads) act for: its trigger and its owner. */
15
+ export declare const taskActor: (task: {
16
+ triggerAccountId: string;
17
+ conversationId: string;
18
+ }) => SandboxActor;
8
19
  /** A session id (the pid `setsid` started). */
9
20
  export declare const SID_RE: RegExp;
10
21
  /** The time limit of one kill of a session ({@link killSession}). */
@@ -25,7 +36,7 @@ export declare function killSessionScript(sid: string): string;
25
36
  * must be killed even when the caller was just aborted). True when the session was confirmed
26
37
  * empty; false when it could not be (an error is never thrown).
27
38
  */
28
- export declare function killSession(p: SandboxProvider, h: SandboxHandle, sid: string): Promise<boolean>;
39
+ export declare function killSession(p: Pick<HeldProvider, "exec">, h: SandboxHandle, sid: string): Promise<boolean>;
29
40
  /** The longest `lastLines` of a finished task (spec §2.4). */
30
41
  export declare const LAST_LINES_MAX_CHARS = 4000;
31
42
  /**
@@ -5,6 +5,19 @@ import { TASK_ID_RE, TASKS_DIR } from "./launch.js";
5
5
  * stopping is `pkill -s <sid>` (never `kill -0` or `/proc`, which disagree between sandbox-fake and
6
6
  * Linux).
7
7
  */
8
+ /**
9
+ * `p` with every `exec` carrying `actor` (`SandboxService.ifRunning` tags execs but leaves the
10
+ * actor to the caller): the provider then reads like a `withSandbox` holder's.
11
+ */
12
+ export function actingAs(p, actor) {
13
+ const wrapped = Object.create(p);
14
+ Object.defineProperty(wrapped, "exec", {
15
+ value: (h, args) => p.exec(h, { ...args, actor }),
16
+ });
17
+ return wrapped;
18
+ }
19
+ /** Who a background task's own execs (poll, stop, reads) act for: its trigger and its owner. */
20
+ export const taskActor = (task) => ({ accountId: task.triggerAccountId, conversationId: task.conversationId });
8
21
  /** A session id (the pid `setsid` started). */
9
22
  export const SID_RE = /^[1-9][0-9]*$/;
10
23
  /** The time limit of one kill of a session ({@link killSession}). */
@@ -42,13 +42,19 @@ export declare class BackgroundTaskStopper {
42
42
  */
43
43
  stop(task: BackgroundTaskRow, why: StopReason, signal?: AbortSignal): Promise<BackgroundTaskRow>;
44
44
  /**
45
- * After the sub-agent run `runId` ended (spec §4.3): stops the running tasks that run started in
46
- * `conversationId` when it is a sub-agent's conversation (nobody can read or stop them through
47
- * that run's model after that); any other conversation is left alone. Only that run's tasks: a
48
- * follow-up run of the same child keeps its own when an older run's end is handled late. Never
49
- * throws (see {@link stopAll}).
45
+ * SIGTERM, the grace period, SIGKILL until the session is empty, then the last lines: in the
46
+ * task's own instance only (`ifRunning`); a task from before environments has none.
50
47
  */
51
- stopSubagentTasks(conversationId: string, runId: string): Promise<void>;
48
+ private signalTask;
49
+ /**
50
+ * After a sub-agent run ended (spec §4.3): stops the running tasks of `conversationId` when it
51
+ * is a sub-agent's conversation; any other conversation is left alone. With `runId`, only the
52
+ * tasks that run started (a fork child's run: a later run of the same child keeps its own when
53
+ * an older run's end is handled late); without, all of them (a stopped background child, agent
54
+ * map spec §6). Their finish is marked `stoppedBy: "subagent_end"`, so it never wakes the child.
55
+ * Never throws (see {@link stopAll}).
56
+ */
57
+ stopSubagentTasks(conversationId: string, runId?: string): Promise<void>;
52
58
  /**
53
59
  * Before a conversation is deleted: stops every running task in its sandbox (its own and its
54
60
  * sub-agents'). Never throws (see {@link stopAll}).
@@ -13,7 +13,7 @@ import { KERNEL_LOGGER } from "../infra/tokens.js";
13
13
  import { SandboxService } from "../sandbox/sandbox.service.js";
14
14
  import { BackgroundTaskFinisher, } from "./finish.js";
15
15
  import { TASKS_DIR } from "./launch.js";
16
- import { assertTaskRef, decodeTail, killSession, tailCommand } from "./session.js";
16
+ import { actingAs, assertTaskRef, decodeTail, killSession, tailCommand, taskActor, } from "./session.js";
17
17
  import { BackgroundTaskStore } from "./store.js";
18
18
  /** How long a stop waits after SIGTERM before SIGKILL (spec §2.3). */
19
19
  export const STOP_GRACE_MS = 5000;
@@ -100,45 +100,23 @@ let BackgroundTaskStopper = class BackgroundTaskStopper {
100
100
  const cur = (await this.store.get(task.id)) ?? task;
101
101
  if (cur.status !== "running" || cur.sid === null || cur.sandboxCreatedAt === null)
102
102
  return cur;
103
+ const started = { ...cur, sandboxCreatedAt: cur.sandboxCreatedAt };
103
104
  const sid = cur.sid;
104
105
  assertTaskRef(cur.id, sid);
105
106
  const reported = why === "tool";
106
107
  // a person's stop never wakes the conversation (background Bash §3, fix round 1), nor does
107
- // the stop of a conversation being deleted
108
- const stoppedBy = why === "person" ? "person" : why === "conversation_deleted" ? "deletion" : undefined;
108
+ // the stop of a conversation being deleted or of a sub-agent that ended (agent map spec §5.3)
109
+ const stoppedBy = why === "person"
110
+ ? "person"
111
+ : why === "conversation_deleted"
112
+ ? "deletion"
113
+ : why === "subagent_end"
114
+ ? "subagent_end"
115
+ : undefined;
109
116
  const opts = stoppedBy === undefined ? {} : { stoppedBy };
110
117
  let r;
111
118
  try {
112
- r = await this.sandbox.ifRunning(cur.sandboxConversationId, { createdAt: cur.sandboxCreatedAt }, async (p, h, sig) => {
113
- const term = await p.exec(h, {
114
- command: termScript(cur.id, sid),
115
- cwd: "/workspace",
116
- timeoutMs: TERM_EXEC_TIMEOUT_MS,
117
- maxOutputBytes: 4096,
118
- signal: sig,
119
- });
120
- const exited = /^exited (-?[0-9]+)$/.exec(term.stdout.trim());
121
- if (term.exitCode !== 0 || (!exited && term.stdout.trim() !== "term")) {
122
- throw new Error(`the stop of background task ${cur.id} failed (${term.exitCode})`);
123
- }
124
- // also after an exit: processes the command left running are stopped with the task
125
- if (!(await killSession(p, h, sid))) {
126
- throw new Error(`background task ${cur.id} could not be confirmed stopped`);
127
- }
128
- const tail = await p.exec(h, {
129
- command: tailCommand(cur.id),
130
- cwd: "/workspace",
131
- timeoutMs: TAIL_EXEC_TIMEOUT_MS,
132
- maxOutputBytes: 64 * 1024,
133
- signal: sig,
134
- });
135
- const lastLines = tail.exitCode === 0 ? decodeTail(tail.stdout) : "";
136
- // a task that had exited before the signal ends as its exit says
137
- const to = exited
138
- ? exitedAs(cur, Number(exited[1]), new Date())
139
- : { status: "stopped" };
140
- return { to, lastLines };
141
- }, signal);
119
+ r = await this.signalTask(started, sid, signal);
142
120
  }
143
121
  catch (err) {
144
122
  await this.store
@@ -158,11 +136,51 @@ let BackgroundTaskStopper = class BackgroundTaskStopper {
158
136
  return (await this.store.get(cur.id)) ?? cur;
159
137
  }
160
138
  /**
161
- * After the sub-agent run `runId` ended (spec §4.3): stops the running tasks that run started in
162
- * `conversationId` when it is a sub-agent's conversation (nobody can read or stop them through
163
- * that run's model after that); any other conversation is left alone. Only that run's tasks: a
164
- * follow-up run of the same child keeps its own when an older run's end is handled late. Never
165
- * throws (see {@link stopAll}).
139
+ * SIGTERM, the grace period, SIGKILL until the session is empty, then the last lines: in the
140
+ * task's own instance only (`ifRunning`); a task from before environments has none.
141
+ */
142
+ async signalTask(cur, sid, signal) {
143
+ if (cur.environmentId === null)
144
+ return { kind: "not_running", status: "gone" };
145
+ return this.sandbox.ifRunning(cur.environmentId, { createdAt: cur.sandboxCreatedAt }, async (tp, h, sig) => {
146
+ const p = actingAs(tp, taskActor(cur));
147
+ const term = await p.exec(h, {
148
+ command: termScript(cur.id, sid),
149
+ cwd: "/workspace",
150
+ timeoutMs: TERM_EXEC_TIMEOUT_MS,
151
+ maxOutputBytes: 4096,
152
+ signal: sig,
153
+ });
154
+ const exited = /^exited (-?[0-9]+)$/.exec(term.stdout.trim());
155
+ if (term.exitCode !== 0 || (!exited && term.stdout.trim() !== "term")) {
156
+ throw new Error(`the stop of background task ${cur.id} failed (${term.exitCode})`);
157
+ }
158
+ // also after an exit: processes the command left running are stopped with the task
159
+ if (!(await killSession(p, h, sid))) {
160
+ throw new Error(`background task ${cur.id} could not be confirmed stopped`);
161
+ }
162
+ const tail = await p.exec(h, {
163
+ command: tailCommand(cur.id),
164
+ cwd: "/workspace",
165
+ timeoutMs: TAIL_EXEC_TIMEOUT_MS,
166
+ maxOutputBytes: 64 * 1024,
167
+ signal: sig,
168
+ });
169
+ const lastLines = tail.exitCode === 0 ? decodeTail(tail.stdout) : "";
170
+ // a task that had exited before the signal ends as its exit says
171
+ const to = exited
172
+ ? exitedAs(cur, Number(exited[1]), new Date())
173
+ : { status: "stopped" };
174
+ return { to, lastLines };
175
+ }, signal);
176
+ }
177
+ /**
178
+ * After a sub-agent run ended (spec §4.3): stops the running tasks of `conversationId` when it
179
+ * is a sub-agent's conversation; any other conversation is left alone. With `runId`, only the
180
+ * tasks that run started (a fork child's run: a later run of the same child keeps its own when
181
+ * an older run's end is handled late); without, all of them (a stopped background child, agent
182
+ * map spec §6). Their finish is marked `stoppedBy: "subagent_end"`, so it never wakes the child.
183
+ * Never throws (see {@link stopAll}).
166
184
  */
167
185
  async stopSubagentTasks(conversationId, runId) {
168
186
  try {
@@ -173,7 +191,7 @@ let BackgroundTaskStopper = class BackgroundTaskStopper {
173
191
  .executeTakeFirst();
174
192
  if (conv?.kind !== "subagent")
175
193
  return;
176
- const tasks = (await this.store.runningOwnedBy(conversationId)).filter((t) => t.runId === runId);
194
+ const tasks = (await this.store.runningOwnedBy(conversationId)).filter((t) => runId === undefined || t.runId === runId);
177
195
  await this.stopAll(tasks, "subagent_end");
178
196
  }
179
197
  catch (err) {
@@ -8,8 +8,16 @@ export interface BackgroundTaskRow {
8
8
  orgId: string;
9
9
  /** The owner: the child conversation for a sub-agent. */
10
10
  conversationId: string;
11
- /** The root conversation that owns the sandbox. */
11
+ /**
12
+ * The root conversation of the owner's tree: `sandbox.background.maxTasks` counts per root
13
+ * conversation.
14
+ */
12
15
  sandboxConversationId: string;
16
+ /**
17
+ * The environment the task runs in (the root conversation's when it was launched): its instance
18
+ * is where the task's processes are. Null only for tasks from before environments (all finished).
19
+ */
20
+ environmentId: string | null;
13
21
  runId: string;
14
22
  callId: string;
15
23
  triggerAccountId: string;
@@ -64,9 +72,9 @@ export declare class BackgroundTaskStore {
64
72
  private readonly launchLock;
65
73
  constructor(db: KernelDb, txHost: TransactionHost, launchLock: BackgroundLaunchLock);
66
74
  /**
67
- * Reserves a launch: under the sandbox's launch lock, counts the running tasks of
75
+ * Reserves a launch: under the root conversation's launch lock, counts the running tasks of
68
76
  * `row.sandboxConversationId` and inserts `row` as `running` (no `sid`) when fewer than
69
- * `maxTasks` run. False (nothing written) when the sandbox already runs `maxTasks`.
77
+ * `maxTasks` run. False (nothing written) when that conversation tree already runs `maxTasks`.
70
78
  */
71
79
  reserve(row: BackgroundTaskReservation, maxTasks: number): Promise<boolean>;
72
80
  /**
@@ -114,7 +122,7 @@ export declare class BackgroundTaskStore {
114
122
  }[]>;
115
123
  insert(row: BackgroundTaskInsert): Promise<void>;
116
124
  get(id: string): Promise<BackgroundTaskRow | undefined>;
117
- /** The running tasks of one sandbox, oldest first. */
125
+ /** The running tasks of one root conversation's tree, oldest first. */
118
126
  runningIn(sandboxConversationId: string): Promise<BackgroundTaskRow[]>;
119
127
  /**
120
128
  * Every running task that has started (its `sid` is set) and no live stop claimed, across
@@ -124,6 +132,7 @@ export declare class BackgroundTaskStore {
124
132
  runningStarted(): Promise<BackgroundTaskRow[]>;
125
133
  /** The running tasks one conversation owns (not those of its sub-agents), oldest first. */
126
134
  runningOwnedBy(conversationId: string): Promise<BackgroundTaskRow[]>;
135
+ /** The running tasks of one root conversation's tree (what `maxTasks` limits). */
127
136
  countRunning(sandboxConversationId: string): Promise<number>;
128
137
  /** The tasks owned by any of the conversations, newest first. */
129
138
  listFor(conversationIds: string[]): Promise<BackgroundTaskRow[]>;
@@ -142,8 +151,11 @@ export declare class BackgroundTaskStore {
142
151
  }): Promise<boolean>;
143
152
  /** Moves the read offset forward only (a concurrent reader never moves it back). */
144
153
  advanceOffset(id: string, to: number): Promise<void>;
145
- /** Finished tasks of a sandbox whose process may still exist. */
146
- pendingKills(sandboxConversationId: string): Promise<BackgroundTaskRow[]>;
154
+ /**
155
+ * Finished tasks of an environment whose process may still exist (any conversation's: they
156
+ * share the instance).
157
+ */
158
+ pendingKills(environmentId: string): Promise<BackgroundTaskRow[]>;
147
159
  clearKill(ids: string[]): Promise<void>;
148
160
  /** Deletes finished tasks that ended before `before`; a running one is never deleted. */
149
161
  pruneFinished(before: Date): Promise<number>;
@@ -18,6 +18,7 @@ const toRow = (r) => ({
18
18
  orgId: r.org_id,
19
19
  conversationId: r.conversation_id,
20
20
  sandboxConversationId: r.sandbox_conversation_id,
21
+ environmentId: r.environment_id,
21
22
  runId: r.run_id,
22
23
  callId: r.call_id,
23
24
  triggerAccountId: r.trigger_account_id,
@@ -66,9 +67,9 @@ let BackgroundTaskStore = class BackgroundTaskStore {
66
67
  this.launchLock = launchLock;
67
68
  }
68
69
  /**
69
- * Reserves a launch: under the sandbox's launch lock, counts the running tasks of
70
+ * Reserves a launch: under the root conversation's launch lock, counts the running tasks of
70
71
  * `row.sandboxConversationId` and inserts `row` as `running` (no `sid`) when fewer than
71
- * `maxTasks` run. False (nothing written) when the sandbox already runs `maxTasks`.
72
+ * `maxTasks` run. False (nothing written) when that conversation tree already runs `maxTasks`.
72
73
  */
73
74
  async reserve(row, maxTasks) {
74
75
  await this.launchLock.lock(row.sandboxConversationId);
@@ -190,6 +191,7 @@ let BackgroundTaskStore = class BackgroundTaskStore {
190
191
  org_id: row.orgId,
191
192
  conversation_id: row.conversationId,
192
193
  sandbox_conversation_id: row.sandboxConversationId,
194
+ environment_id: row.environmentId,
193
195
  run_id: row.runId,
194
196
  call_id: row.callId,
195
197
  trigger_account_id: row.triggerAccountId,
@@ -211,7 +213,7 @@ let BackgroundTaskStore = class BackgroundTaskStore {
211
213
  .executeTakeFirst();
212
214
  return r === undefined ? undefined : toRow(r);
213
215
  }
214
- /** The running tasks of one sandbox, oldest first. */
216
+ /** The running tasks of one root conversation's tree, oldest first. */
215
217
  async runningIn(sandboxConversationId) {
216
218
  const rows = await this.db
217
219
  .selectFrom("background_tasks")
@@ -252,6 +254,7 @@ let BackgroundTaskStore = class BackgroundTaskStore {
252
254
  .execute();
253
255
  return rows.map(toRow);
254
256
  }
257
+ /** The running tasks of one root conversation's tree (what `maxTasks` limits). */
255
258
  async countRunning(sandboxConversationId) {
256
259
  const r = await this.db
257
260
  .selectFrom("background_tasks")
@@ -306,12 +309,15 @@ let BackgroundTaskStore = class BackgroundTaskStore {
306
309
  .where(sql `read_offset < ${to}`)
307
310
  .execute();
308
311
  }
309
- /** Finished tasks of a sandbox whose process may still exist. */
310
- async pendingKills(sandboxConversationId) {
312
+ /**
313
+ * Finished tasks of an environment whose process may still exist (any conversation's: they
314
+ * share the instance).
315
+ */
316
+ async pendingKills(environmentId) {
311
317
  const rows = await this.db
312
318
  .selectFrom("background_tasks")
313
319
  .selectAll()
314
- .where("sandbox_conversation_id", "=", sandboxConversationId)
320
+ .where("environment_id", "=", environmentId)
315
321
  .where("kill_pending", "=", true)
316
322
  .orderBy("started_at", "asc")
317
323
  .execute();
@@ -1,5 +1,6 @@
1
1
  import { ConversationAccess } from "../conversations/access.js";
2
2
  import { EventLog } from "../conversations/event-log.js";
3
+ import { ConversationEnvironments } from "../environments/conversation-environments.js";
3
4
  import { KernelDb } from "../infra/database/kernel-db.js";
4
5
  import { SandboxService } from "../sandbox/sandbox.service.js";
5
6
  import { BackgroundTaskStopper } from "./stop.js";
@@ -33,7 +34,7 @@ export interface BackgroundTaskOutput {
33
34
  /**
34
35
  * The HTTP side of background tasks (spec 2026-11-05-background-bash-design §5): the tasks of a
35
36
  * conversation and of its sub-agents, stopping one, reading its output. A task is reachable
36
- * through the conversation that owns it or through that conversation's parent, and only by a
37
+ * through the conversation that owns it or through any conversation above it, and only by a
37
38
  * person who may see the conversation (`ConversationAccess`, the rule of `GET :id`, which is also
38
39
  * what `POST :id/abort` checks: the owner).
39
40
  */
@@ -44,8 +45,12 @@ export declare class BackgroundTasks {
44
45
  private readonly sandbox;
45
46
  private readonly eventLog;
46
47
  private readonly db;
47
- constructor(access: Pick<ConversationAccess, "isAccessible">, store: Pick<BackgroundTaskStore, "listFor" | "get">, stopper: Pick<BackgroundTaskStopper, "stop">, sandbox: Pick<SandboxService, "available" | "ifRunning">, eventLog: Pick<EventLog, "findByIdem">, db: KernelDb);
48
- /** The conversation and its sub-agents' conversations; `conversation.not_found` when not visible. */
48
+ private readonly environments;
49
+ constructor(access: Pick<ConversationAccess, "isAccessible">, store: Pick<BackgroundTaskStore, "listFor" | "get">, stopper: Pick<BackgroundTaskStopper, "stop">, sandbox: Pick<SandboxService, "available" | "ifRunning">, eventLog: Pick<EventLog, "findByIdem">, db: KernelDb, environments: Pick<ConversationEnvironments, "forTool">);
50
+ /**
51
+ * The conversation and every sub-agent conversation below it (grandchildren too: their tasks run
52
+ * in the root's sandbox, agent map spec §6); `conversation.not_found` when not visible.
53
+ */
49
54
  private scope;
50
55
  private view;
51
56
  private owned;
@@ -58,8 +63,13 @@ export declare class BackgroundTasks {
58
63
  */
59
64
  stop(orgId: string, conversationId: string, accountId: string, taskId: string, actorTokenId?: string): Promise<BackgroundTaskView>;
60
65
  /**
61
- * The end of the task's output, at most `tail` bytes. Read live when the task's sandbox instance
62
- * runs (never resuming a suspended sandbox); a finished task whose sandbox does not run answers
66
+ * Whether the task's environment may still be used by its conversation's owner (the access
67
+ * re-check every sandbox tool call makes); when it may not, the live read is skipped.
68
+ */
69
+ private environmentUsable;
70
+ /**
71
+ * The end of the task's output, at most `tail` bytes. Read live when the task's environment
72
+ * instance runs (never resuming a suspended one); a finished task whose sandbox does not run answers
63
73
  * with the last lines its finished event kept. Anything else is
64
74
  * `background_task.output_unavailable` (409).
65
75
  */