@capybara-hq/kernel 0.1.0-rc.3 → 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 (604) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +47 -16
  3. package/dist/admin/admin.controller.js +44 -19
  4. package/dist/admin/extensions.controller.d.ts +24 -3
  5. package/dist/admin/extensions.controller.js +48 -8
  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 +19 -0
  13. package/dist/agents/agent-lookup.js +21 -0
  14. package/dist/agents/agent-profile.service.d.ts +29 -0
  15. package/dist/agents/agent-profile.service.js +117 -0
  16. package/dist/agents/agents.controller.d.ts +168 -3
  17. package/dist/agents/agents.controller.js +201 -12
  18. package/dist/agents/agents.module.d.ts +4 -1
  19. package/dist/agents/agents.module.js +36 -6
  20. package/dist/agents/agents.service.d.ts +64 -27
  21. package/dist/agents/agents.service.js +199 -74
  22. package/dist/agents/definition.d.ts +53 -0
  23. package/dist/agents/definition.js +55 -0
  24. package/dist/agents/from-template.d.ts +106 -0
  25. package/dist/agents/from-template.js +649 -0
  26. package/dist/agents/from-template.service.d.ts +60 -0
  27. package/dist/agents/from-template.service.js +161 -0
  28. package/dist/agents/instruction-files.d.ts +60 -0
  29. package/dist/agents/instruction-files.js +111 -0
  30. package/dist/agents/models.controller.d.ts +9 -3
  31. package/dist/agents/models.controller.js +19 -4
  32. package/dist/agents/org-templates.d.ts +176 -0
  33. package/dist/agents/org-templates.js +827 -0
  34. package/dist/agents/pending-connector-requests.d.ts +77 -0
  35. package/dist/agents/pending-connector-requests.js +215 -0
  36. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  37. package/dist/agents/pending-connectors.controller.js +91 -0
  38. package/dist/agents/pending-connectors.service.d.ts +62 -0
  39. package/dist/agents/pending-connectors.service.js +282 -0
  40. package/dist/agents/profile.d.ts +96 -0
  41. package/dist/agents/profile.js +51 -0
  42. package/dist/agents/readiness.controller.d.ts +26 -0
  43. package/dist/agents/readiness.controller.js +56 -0
  44. package/dist/agents/templates.controller.d.ts +86 -5
  45. package/dist/agents/templates.controller.js +171 -7
  46. package/dist/agents/templates.d.ts +127 -23
  47. package/dist/agents/templates.js +476 -53
  48. package/dist/background/background.controller.d.ts +38 -0
  49. package/dist/background/background.controller.js +87 -0
  50. package/dist/background/background.module.d.ts +10 -0
  51. package/dist/background/background.module.js +39 -0
  52. package/dist/background/finish.d.ts +44 -0
  53. package/dist/background/finish.js +94 -0
  54. package/dist/background/launch-lock.d.ts +15 -0
  55. package/dist/background/launch-lock.js +40 -0
  56. package/dist/background/launch.d.ts +36 -0
  57. package/dist/background/launch.js +70 -0
  58. package/dist/background/poll.job.d.ts +56 -0
  59. package/dist/background/poll.job.js +190 -0
  60. package/dist/background/render.d.ts +23 -0
  61. package/dist/background/render.js +48 -0
  62. package/dist/background/session.d.ts +48 -0
  63. package/dist/background/session.js +79 -0
  64. package/dist/background/status.d.ts +35 -0
  65. package/dist/background/status.js +57 -0
  66. package/dist/background/stop.d.ts +68 -0
  67. package/dist/background/stop.js +243 -0
  68. package/dist/background/store.d.ts +162 -0
  69. package/dist/background/store.js +357 -0
  70. package/dist/background/store.module.d.ts +6 -0
  71. package/dist/background/store.module.js +22 -0
  72. package/dist/background/tasks.service.d.ts +77 -0
  73. package/dist/background/tasks.service.js +211 -0
  74. package/dist/background/wake-rules.d.ts +66 -0
  75. package/dist/background/wake-rules.js +113 -0
  76. package/dist/background/wake.d.ts +30 -0
  77. package/dist/background/wake.js +63 -0
  78. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  79. package/dist/catalog/admin-catalog.controller.js +213 -42
  80. package/dist/catalog/catalog-content.d.ts +58 -32
  81. package/dist/catalog/catalog-content.js +34 -8
  82. package/dist/catalog/catalog-import.module.d.ts +7 -0
  83. package/dist/catalog/catalog-import.module.js +60 -0
  84. package/dist/catalog/catalog-items.d.ts +111 -7
  85. package/dist/catalog/catalog-items.js +279 -13
  86. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  87. package/dist/catalog/catalog-scope.service.js +1116 -0
  88. package/dist/catalog/catalog.module.d.ts +7 -9
  89. package/dist/catalog/catalog.module.js +41 -31
  90. package/dist/catalog/catalog.service.d.ts +101 -29
  91. package/dist/catalog/catalog.service.js +104 -106
  92. package/dist/catalog/claude/agents.js +2 -0
  93. package/dist/catalog/cli.d.ts +11 -1
  94. package/dist/catalog/cli.js +26 -1
  95. package/dist/catalog/component-promotion.d.ts +96 -0
  96. package/dist/catalog/component-promotion.js +395 -0
  97. package/dist/catalog/component-scope.controller.d.ts +152 -0
  98. package/dist/catalog/component-scope.controller.js +287 -0
  99. package/dist/catalog/component-scope.service.d.ts +303 -0
  100. package/dist/catalog/component-scope.service.js +936 -0
  101. package/dist/catalog/component-state.d.ts +174 -0
  102. package/dist/catalog/component-state.js +437 -0
  103. package/dist/catalog/job-ids.d.ts +30 -0
  104. package/dist/catalog/job-ids.js +25 -0
  105. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  106. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  107. package/dist/catalog/marketplaces.controller.js +56 -7
  108. package/dist/catalog/marketplaces.service.d.ts +54 -14
  109. package/dist/catalog/marketplaces.service.js +71 -22
  110. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  111. package/dist/catalog/org-catalog.controller.js +181 -65
  112. package/dist/catalog/org-catalog.service.d.ts +65 -33
  113. package/dist/catalog/org-catalog.service.js +324 -157
  114. package/dist/catalog/org-extension-switch.d.ts +41 -0
  115. package/dist/catalog/org-extension-switch.js +115 -0
  116. package/dist/catalog/org-extension.controller.d.ts +119 -0
  117. package/dist/catalog/org-extension.controller.js +266 -0
  118. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  119. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  120. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  121. package/dist/catalog/org-plugin-uploads.js +116 -0
  122. package/dist/catalog/owned-items.d.ts +184 -0
  123. package/dist/catalog/owned-items.js +789 -0
  124. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  125. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  126. package/dist/catalog/ownership.d.ts +172 -0
  127. package/dist/catalog/ownership.js +326 -0
  128. package/dist/catalog/platform-components.d.ts +221 -0
  129. package/dist/catalog/platform-components.js +761 -0
  130. package/dist/catalog/platform-migration.d.ts +115 -0
  131. package/dist/catalog/platform-migration.js +582 -0
  132. package/dist/catalog/plugin-import.d.ts +178 -34
  133. package/dist/catalog/plugin-import.js +623 -83
  134. package/dist/catalog/plugin-install.d.ts +185 -41
  135. package/dist/catalog/plugin-install.js +758 -126
  136. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  137. package/dist/catalog/plugin-upgrade.js +1148 -1137
  138. package/dist/catalog/request-rules.d.ts +65 -0
  139. package/dist/catalog/request-rules.js +217 -0
  140. package/dist/catalog/requests.service.d.ts +193 -118
  141. package/dist/catalog/requests.service.js +526 -343
  142. package/dist/catalog/reserved-names.d.ts +8 -0
  143. package/dist/catalog/reserved-names.js +42 -0
  144. package/dist/catalog/scope-orgs.d.ts +21 -0
  145. package/dist/catalog/scope-orgs.js +67 -0
  146. package/dist/catalog/scope-state.d.ts +35 -0
  147. package/dist/catalog/scope-state.js +87 -0
  148. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  149. package/dist/catalog/scope-sync-workers.js +29 -0
  150. package/dist/catalog/scope-sync.d.ts +176 -0
  151. package/dist/catalog/scope-sync.js +576 -0
  152. package/dist/catalog/scope.d.ts +42 -0
  153. package/dist/catalog/scope.js +42 -0
  154. package/dist/catalog/unshare.d.ts +22 -0
  155. package/dist/catalog/unshare.js +118 -0
  156. package/dist/channels/actions.js +1 -0
  157. package/dist/channels/cards.js +21 -3
  158. package/dist/channels/channels.module.js +2 -0
  159. package/dist/channels/connections.service.d.ts +16 -1
  160. package/dist/channels/connections.service.js +38 -4
  161. package/dist/channels/inbound.d.ts +9 -1
  162. package/dist/channels/inbound.js +67 -5
  163. package/dist/channels/phrases.d.ts +35 -0
  164. package/dist/channels/phrases.js +29 -0
  165. package/dist/channels/threads.d.ts +5 -0
  166. package/dist/channels/threads.js +8 -0
  167. package/dist/config/docs.js +3 -1
  168. package/dist/config/schema.d.ts +24 -2
  169. package/dist/config/schema.js +145 -19
  170. package/dist/conversations/access.d.ts +6 -4
  171. package/dist/conversations/access.js +29 -5
  172. package/dist/conversations/agent-tree.d.ts +46 -0
  173. package/dist/conversations/agent-tree.js +92 -0
  174. package/dist/conversations/attachments.service.d.ts +30 -0
  175. package/dist/conversations/attachments.service.js +130 -5
  176. package/dist/conversations/conversations.controller.d.ts +79 -23
  177. package/dist/conversations/conversations.controller.js +141 -50
  178. package/dist/conversations/conversations.module.d.ts +1 -1
  179. package/dist/conversations/conversations.module.js +10 -7
  180. package/dist/conversations/conversations.service.d.ts +108 -9
  181. package/dist/conversations/conversations.service.js +237 -30
  182. package/dist/conversations/environment-status.d.ts +24 -0
  183. package/dist/conversations/environment-status.js +71 -0
  184. package/dist/conversations/event-log.d.ts +21 -6
  185. package/dist/conversations/event-log.js +70 -1
  186. package/dist/conversations/events.d.ts +140 -0
  187. package/dist/conversations/events.js +142 -13
  188. package/dist/conversations/queue.d.ts +3 -1
  189. package/dist/conversations/queue.js +13 -2
  190. package/dist/conversations/queue.service.d.ts +1 -1
  191. package/dist/conversations/queue.service.js +8 -1
  192. package/dist/conversations/titles.d.ts +12 -3
  193. package/dist/conversations/titles.js +36 -8
  194. package/dist/conversations/tree.d.ts +17 -0
  195. package/dist/conversations/tree.js +42 -0
  196. package/dist/ctx/create-ctx.d.ts +5 -0
  197. package/dist/ctx/create-ctx.js +15 -5
  198. package/dist/db/kernel-schema.d.ts +420 -20
  199. package/dist/db/pool.d.ts +5 -0
  200. package/dist/db/pool.js +3 -0
  201. package/dist/environments/access.d.ts +41 -0
  202. package/dist/environments/access.js +77 -0
  203. package/dist/environments/conversation-environments.d.ts +61 -0
  204. package/dist/environments/conversation-environments.js +170 -0
  205. package/dist/environments/dto.d.ts +25 -0
  206. package/dist/environments/dto.js +12 -0
  207. package/dist/environments/environments.controller.d.ts +33 -0
  208. package/dist/environments/environments.controller.js +110 -0
  209. package/dist/environments/environments.module.d.ts +8 -0
  210. package/dist/environments/environments.module.js +27 -0
  211. package/dist/environments/environments.service.d.ts +153 -0
  212. package/dist/environments/environments.service.js +541 -0
  213. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  214. package/dist/environments/legacy-cleanup.job.js +141 -0
  215. package/dist/errors.d.ts +90 -2
  216. package/dist/errors.js +90 -2
  217. package/dist/evals/reconstruct.d.ts +18 -9
  218. package/dist/evals/reconstruct.js +26 -7
  219. package/dist/evals/run-replay.d.ts +7 -2
  220. package/dist/evals/run-replay.js +42 -7
  221. package/dist/evals/step-replay.d.ts +2 -5
  222. package/dist/evals/step-replay.js +13 -7
  223. package/dist/evals/trajectory.js +1 -1
  224. package/dist/evals/trajectory.service.d.ts +8 -3
  225. package/dist/evals/trajectory.service.js +26 -14
  226. package/dist/evals/worker.d.ts +5 -5
  227. package/dist/evals/worker.js +9 -3
  228. package/dist/extensions/admin-ops.d.ts +36 -10
  229. package/dist/extensions/admin-ops.js +67 -42
  230. package/dist/extensions/admin-view.d.ts +39 -10
  231. package/dist/extensions/admin-view.js +111 -20
  232. package/dist/extensions/blobs.js +1 -0
  233. package/dist/extensions/bootstrap.d.ts +17 -4
  234. package/dist/extensions/bootstrap.js +70 -9
  235. package/dist/extensions/cli.d.ts +12 -0
  236. package/dist/extensions/cli.js +11 -2
  237. package/dist/extensions/config-issues.d.ts +13 -1
  238. package/dist/extensions/config-issues.js +22 -5
  239. package/dist/extensions/config-json-schema.d.ts +43 -7
  240. package/dist/extensions/config-json-schema.js +124 -58
  241. package/dist/extensions/deployment-config-store.d.ts +6 -0
  242. package/dist/extensions/deployment-config.d.ts +78 -8
  243. package/dist/extensions/deployment-config.js +172 -34
  244. package/dist/extensions/display-name.d.ts +22 -0
  245. package/dist/extensions/display-name.js +77 -0
  246. package/dist/extensions/effective-config.d.ts +127 -0
  247. package/dist/extensions/effective-config.js +368 -0
  248. package/dist/extensions/extensions.module.js +14 -2
  249. package/dist/extensions/hooks.d.ts +37 -4
  250. package/dist/extensions/hooks.js +82 -16
  251. package/dist/extensions/host.d.ts +45 -2
  252. package/dist/extensions/host.js +112 -16
  253. package/dist/extensions/installs.d.ts +20 -8
  254. package/dist/extensions/installs.js +37 -15
  255. package/dist/extensions/org-config.d.ts +81 -6
  256. package/dist/extensions/org-config.js +195 -44
  257. package/dist/extensions/org-levels.d.ts +37 -0
  258. package/dist/extensions/org-levels.js +71 -0
  259. package/dist/extensions/org-overrides.d.ts +151 -0
  260. package/dist/extensions/org-overrides.js +524 -0
  261. package/dist/extensions/package.d.ts +14 -1
  262. package/dist/extensions/package.js +51 -2
  263. package/dist/extensions/permission-view.d.ts +19 -4
  264. package/dist/extensions/permission-view.js +4 -4
  265. package/dist/extensions/plugin-items.d.ts +21 -0
  266. package/dist/extensions/plugin-items.js +42 -0
  267. package/dist/extensions/point-defaults.controller.d.ts +34 -0
  268. package/dist/extensions/point-defaults.controller.js +71 -0
  269. package/dist/extensions/point-defaults.d.ts +71 -0
  270. package/dist/extensions/point-defaults.js +234 -0
  271. package/dist/extensions/registry.d.ts +1 -1
  272. package/dist/extensions/registry.js +2 -0
  273. package/dist/extensions/resolve.d.ts +5 -1
  274. package/dist/extensions/resolve.js +15 -2
  275. package/dist/files/previewers.d.ts +8 -1
  276. package/dist/files/previewers.js +35 -6
  277. package/dist/http/api.module.js +31 -3
  278. package/dist/http/app.d.ts +11 -2
  279. package/dist/http/app.js +31 -5
  280. package/dist/http/nest-logger.d.ts +6 -5
  281. package/dist/http/nest-logger.js +24 -10
  282. package/dist/identity/accounts.d.ts +29 -29
  283. package/dist/identity/accounts.js +47 -47
  284. package/dist/identity/audit.d.ts +2 -1
  285. package/dist/identity/auth.controller.js +9 -5
  286. package/dist/identity/auth.guard.d.ts +13 -5
  287. package/dist/identity/auth.guard.js +26 -9
  288. package/dist/identity/cookies.d.ts +20 -5
  289. package/dist/identity/cookies.js +44 -6
  290. package/dist/identity/identity.module.d.ts +1 -1
  291. package/dist/identity/identity.module.js +4 -4
  292. package/dist/identity/me.controller.d.ts +5 -1
  293. package/dist/identity/me.controller.js +12 -3
  294. package/dist/identity/principal.d.ts +3 -3
  295. package/dist/identity/principal.js +3 -3
  296. package/dist/identity/sessions.d.ts +12 -0
  297. package/dist/identity/sessions.js +45 -0
  298. package/dist/identity/settings.d.ts +22 -11
  299. package/dist/identity/settings.js +53 -18
  300. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  301. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  302. package/dist/inbox/inbox.module.d.ts +4 -1
  303. package/dist/inbox/inbox.module.js +7 -3
  304. package/dist/inbox/inbox.service.d.ts +62 -3
  305. package/dist/inbox/inbox.service.js +74 -4
  306. package/dist/inbox/org-notices.d.ts +63 -0
  307. package/dist/inbox/org-notices.js +91 -0
  308. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  309. package/dist/inbox/platform-inbox.controller.js +58 -0
  310. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  311. package/dist/inbox/platform-inbox.service.js +263 -0
  312. package/dist/inbox/platform-notices.d.ts +19 -0
  313. package/dist/inbox/platform-notices.js +9 -0
  314. package/dist/index.d.ts +2 -2
  315. package/dist/index.js +1 -1
  316. package/dist/infra/cli/kernel-cli.module.js +9 -1
  317. package/dist/infra/config/kernel-config.service.js +27 -1
  318. package/dist/infra/database/database.module.js +1 -0
  319. package/dist/infra/database/xact-lock.d.ts +1 -1
  320. package/dist/infra/database/xact-lock.js +1 -1
  321. package/dist/infra/events/kernel-events.d.ts +19 -2
  322. package/dist/infra/lifecycle/process-guards.js +4 -0
  323. package/dist/infra/logging/logging.module.d.ts +4 -2
  324. package/dist/infra/logging/logging.module.js +24 -6
  325. package/dist/infra/queue/add-job-once.d.ts +14 -0
  326. package/dist/infra/queue/add-job-once.js +16 -0
  327. package/dist/infra/queue/redis-connection.d.ts +6 -0
  328. package/dist/infra/queue/redis-connection.js +7 -0
  329. package/dist/infra/redis/redis.module.js +6 -2
  330. package/dist/infra/tokens.d.ts +6 -1
  331. package/dist/infra/tokens.js +6 -1
  332. package/dist/kernel.module.js +6 -0
  333. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  334. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  335. package/dist/log.d.ts +13 -1
  336. package/dist/log.js +93 -17
  337. package/dist/models/prices.d.ts +5 -5
  338. package/dist/models/prices.js +4 -4
  339. package/dist/models/purposes.controller.d.ts +6 -4
  340. package/dist/models/purposes.controller.js +13 -7
  341. package/dist/models/purposes.d.ts +43 -9
  342. package/dist/models/purposes.js +48 -18
  343. package/dist/orgs/directory-sync.d.ts +14 -5
  344. package/dist/orgs/directory-sync.js +41 -17
  345. package/dist/orgs/offboarding.d.ts +12 -8
  346. package/dist/orgs/offboarding.js +54 -33
  347. package/dist/orgs/org-lock.d.ts +5 -0
  348. package/dist/orgs/org-lock.js +13 -0
  349. package/dist/orgs/org.guard.d.ts +10 -0
  350. package/dist/orgs/org.guard.js +43 -32
  351. package/dist/orgs/orgs.module.js +3 -0
  352. package/dist/orgs/orgs.service.d.ts +20 -7
  353. package/dist/orgs/orgs.service.js +32 -12
  354. package/dist/orgs/roles.d.ts +1 -1
  355. package/dist/orgs/roles.js +5 -1
  356. package/dist/orgs/settings.controller.d.ts +1 -1
  357. package/dist/orgs/settings.service.d.ts +20 -3
  358. package/dist/orgs/settings.service.js +19 -4
  359. package/dist/overrides.d.ts +3 -0
  360. package/dist/overrides.js +2 -0
  361. package/dist/platform/actor.d.ts +48 -0
  362. package/dist/platform/actor.js +100 -0
  363. package/dist/platform/agent-docs.d.ts +18 -0
  364. package/dist/platform/agent-docs.js +59 -0
  365. package/dist/platform/availability.d.ts +14 -0
  366. package/dist/platform/availability.js +43 -0
  367. package/dist/platform/errors.d.ts +11 -0
  368. package/dist/platform/errors.js +26 -0
  369. package/dist/platform/exclusions.d.ts +12 -0
  370. package/dist/platform/exclusions.js +1387 -0
  371. package/dist/platform/method.d.ts +6 -0
  372. package/dist/platform/method.js +15 -0
  373. package/dist/platform/operation.d.ts +92 -0
  374. package/dist/platform/operation.js +35 -0
  375. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  376. package/dist/platform/ops/agent-templates.ops.js +92 -0
  377. package/dist/platform/ops/agents.ops.d.ts +19 -0
  378. package/dist/platform/ops/agents.ops.js +294 -0
  379. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  380. package/dist/platform/ops/connectors.ops.js +126 -0
  381. package/dist/platform/ops/errors.d.ts +11 -0
  382. package/dist/platform/ops/errors.js +22 -0
  383. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  384. package/dist/platform/ops/extensions.ops.js +116 -0
  385. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  386. package/dist/platform/ops/marketplaces.ops.js +157 -0
  387. package/dist/platform/ops/paging.d.ts +14 -0
  388. package/dist/platform/ops/paging.js +20 -0
  389. package/dist/platform/ops/platform.ops.d.ts +23 -0
  390. package/dist/platform/ops/platform.ops.js +158 -0
  391. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  392. package/dist/platform/ops/plugins.ops.js +377 -0
  393. package/dist/platform/ops/requests.ops.d.ts +14 -0
  394. package/dist/platform/ops/requests.ops.js +153 -0
  395. package/dist/platform/ops/role.d.ts +4 -0
  396. package/dist/platform/ops/role.js +10 -0
  397. package/dist/platform/ops/skills.ops.d.ts +13 -0
  398. package/dist/platform/ops/skills.ops.js +98 -0
  399. package/dist/platform/ops/summary.d.ts +10 -0
  400. package/dist/platform/ops/summary.js +18 -0
  401. package/dist/platform/platform-ops.module.d.ts +7 -0
  402. package/dist/platform/platform-ops.module.js +55 -0
  403. package/dist/platform/platform.module.d.ts +8 -0
  404. package/dist/platform/platform.module.js +25 -0
  405. package/dist/platform/redact-orgs.d.ts +7 -0
  406. package/dist/platform/redact-orgs.js +52 -0
  407. package/dist/platform/registry.d.ts +30 -0
  408. package/dist/platform/registry.js +111 -0
  409. package/dist/roles/worker-role.d.ts +6 -4
  410. package/dist/roles/worker-role.js +14 -7
  411. package/dist/roles/worker.module.d.ts +1 -1
  412. package/dist/roles/worker.module.js +15 -1
  413. package/dist/runtime/context/build.d.ts +11 -7
  414. package/dist/runtime/context/build.js +46 -19
  415. package/dist/runtime/context/claude-tools.d.ts +3 -1
  416. package/dist/runtime/context/claude-tools.js +8 -6
  417. package/dist/runtime/context/compaction.js +13 -0
  418. package/dist/runtime/context/reminders.d.ts +2 -0
  419. package/dist/runtime/context/reminders.js +2 -0
  420. package/dist/runtime/context/skills.js +9 -2
  421. package/dist/runtime/context/tool-changes.d.ts +27 -0
  422. package/dist/runtime/context/tool-changes.js +60 -0
  423. package/dist/runtime/hook-calls.js +2 -0
  424. package/dist/runtime/langgraph-loop.d.ts +3 -1
  425. package/dist/runtime/langgraph-loop.js +36 -17
  426. package/dist/runtime/loop.d.ts +34 -5
  427. package/dist/runtime/maintenance.d.ts +9 -4
  428. package/dist/runtime/maintenance.js +35 -8
  429. package/dist/runtime/model-call.d.ts +46 -8
  430. package/dist/runtime/model-call.js +72 -21
  431. package/dist/runtime/providers.d.ts +6 -0
  432. package/dist/runtime/providers.js +8 -0
  433. package/dist/runtime/run-control.d.ts +11 -1
  434. package/dist/runtime/run-control.js +12 -0
  435. package/dist/runtime/run-drafts.d.ts +85 -0
  436. package/dist/runtime/run-drafts.js +230 -0
  437. package/dist/runtime/run-jobs.d.ts +3 -5
  438. package/dist/runtime/run-jobs.js +3 -7
  439. package/dist/runtime/run-queue.d.ts +59 -2
  440. package/dist/runtime/run-queue.js +311 -38
  441. package/dist/runtime/run-worker.d.ts +11 -5
  442. package/dist/runtime/run-worker.js +69 -33
  443. package/dist/runtime/runtime.module.js +11 -3
  444. package/dist/runtime/step-log.d.ts +15 -4
  445. package/dist/runtime/step-log.js +24 -7
  446. package/dist/runtime/stream.controller.d.ts +23 -1
  447. package/dist/runtime/stream.controller.js +60 -3
  448. package/dist/runtime/stream.d.ts +4 -1
  449. package/dist/runtime/stream.js +27 -3
  450. package/dist/runtime/subagents/child.d.ts +55 -7
  451. package/dist/runtime/subagents/child.js +105 -7
  452. package/dist/runtime/subagents/definition.d.ts +12 -3
  453. package/dist/runtime/subagents/definition.js +44 -28
  454. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  455. package/dist/runtime/subagents/deliveries.js +228 -0
  456. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  457. package/dist/runtime/subagents/dispatch.js +212 -141
  458. package/dist/runtime/subagents/limits.d.ts +24 -5
  459. package/dist/runtime/subagents/limits.js +40 -6
  460. package/dist/runtime/subagents/messages.d.ts +95 -0
  461. package/dist/runtime/subagents/messages.js +328 -0
  462. package/dist/runtime/subagents/preamble.d.ts +4 -4
  463. package/dist/runtime/subagents/preamble.js +9 -7
  464. package/dist/runtime/subagents/progress.d.ts +8 -6
  465. package/dist/runtime/subagents/progress.js +11 -6
  466. package/dist/runtime/subagents/render.d.ts +30 -0
  467. package/dist/runtime/subagents/render.js +53 -0
  468. package/dist/runtime/subagents/roster.d.ts +24 -7
  469. package/dist/runtime/subagents/roster.js +47 -11
  470. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  471. package/dist/runtime/subagents/skill-fork.js +8 -4
  472. package/dist/runtime/subagents/status.d.ts +14 -0
  473. package/dist/runtime/subagents/status.js +23 -0
  474. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  475. package/dist/runtime/subagents/subagents.service.js +11 -6
  476. package/dist/runtime/usage-report.d.ts +2 -1
  477. package/dist/runtime/usage-report.js +19 -13
  478. package/dist/runtime/waits.d.ts +145 -36
  479. package/dist/runtime/waits.js +423 -109
  480. package/dist/sandbox/jobs.d.ts +40 -13
  481. package/dist/sandbox/jobs.js +57 -20
  482. package/dist/sandbox/leases.d.ts +37 -54
  483. package/dist/sandbox/leases.js +71 -115
  484. package/dist/sandbox/providers.d.ts +2 -2
  485. package/dist/sandbox/providers.js +1 -1
  486. package/dist/sandbox/sandbox.module.d.ts +3 -2
  487. package/dist/sandbox/sandbox.module.js +10 -4
  488. package/dist/sandbox/sandbox.service.d.ts +282 -129
  489. package/dist/sandbox/sandbox.service.js +736 -381
  490. package/dist/skills/catalog.d.ts +3 -2
  491. package/dist/skills/catalog.js +21 -43
  492. package/dist/skills/changes.controller.d.ts +7 -0
  493. package/dist/skills/changes.controller.js +19 -1
  494. package/dist/skills/invoke.js +8 -3
  495. package/dist/skills/package.d.ts +20 -1
  496. package/dist/skills/package.js +28 -1
  497. package/dist/skills/skills.controller.d.ts +39 -4
  498. package/dist/skills/skills.controller.js +88 -10
  499. package/dist/skills/skills.module.js +10 -1
  500. package/dist/skills/skills.service.d.ts +106 -26
  501. package/dist/skills/skills.service.js +421 -75
  502. package/dist/skills/usable.d.ts +81 -0
  503. package/dist/skills/usable.js +379 -0
  504. package/dist/tools/approvals.service.d.ts +20 -2
  505. package/dist/tools/approvals.service.js +25 -4
  506. package/dist/tools/builtin-names.d.ts +41 -7
  507. package/dist/tools/builtin-names.js +59 -7
  508. package/dist/tools/builtins/agent.d.ts +23 -21
  509. package/dist/tools/builtins/agent.js +62 -55
  510. package/dist/tools/builtins/builtin-tools.d.ts +19 -1
  511. package/dist/tools/builtins/builtin-tools.js +59 -2
  512. package/dist/tools/builtins/handback.d.ts +28 -0
  513. package/dist/tools/builtins/handback.js +53 -0
  514. package/dist/tools/builtins/platform.d.ts +34 -0
  515. package/dist/tools/builtins/platform.js +362 -0
  516. package/dist/tools/builtins/sandbox/bash.d.ts +1 -1
  517. package/dist/tools/builtins/sandbox/bash.js +241 -4
  518. package/dist/tools/builtins/sandbox/common.d.ts +69 -27
  519. package/dist/tools/builtins/sandbox/common.js +87 -48
  520. package/dist/tools/builtins/sandbox/deliver.js +1 -1
  521. package/dist/tools/builtins/sandbox/edit.js +2 -2
  522. package/dist/tools/builtins/sandbox/glob.js +2 -2
  523. package/dist/tools/builtins/sandbox/grep.js +2 -4
  524. package/dist/tools/builtins/sandbox/index.d.ts +3 -1
  525. package/dist/tools/builtins/sandbox/index.js +7 -1
  526. package/dist/tools/builtins/sandbox/read.js +1 -1
  527. package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
  528. package/dist/tools/builtins/sandbox/task-output.js +329 -0
  529. package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
  530. package/dist/tools/builtins/sandbox/task-stop.js +113 -0
  531. package/dist/tools/builtins/sandbox/write.js +2 -2
  532. package/dist/tools/builtins/send-message.d.ts +56 -0
  533. package/dist/tools/builtins/send-message.js +100 -0
  534. package/dist/tools/builtins/skill-load.d.ts +22 -14
  535. package/dist/tools/builtins/skill-load.js +86 -57
  536. package/dist/tools/builtins/skill-write.js +1 -1
  537. package/dist/tools/builtins/web/errors.d.ts +8 -0
  538. package/dist/tools/builtins/web/errors.js +53 -0
  539. package/dist/tools/builtins/web/extract.d.ts +62 -0
  540. package/dist/tools/builtins/web/extract.js +271 -0
  541. package/dist/tools/builtins/web/fetch.d.ts +55 -0
  542. package/dist/tools/builtins/web/fetch.js +175 -0
  543. package/dist/tools/builtins/web/index.d.ts +13 -0
  544. package/dist/tools/builtins/web/index.js +12 -0
  545. package/dist/tools/builtins/web/page-cache.d.ts +25 -0
  546. package/dist/tools/builtins/web/page-cache.js +77 -0
  547. package/dist/tools/builtins/web/search.d.ts +25 -0
  548. package/dist/tools/builtins/web/search.js +210 -0
  549. package/dist/tools/builtins/web/url.d.ts +17 -0
  550. package/dist/tools/builtins/web/url.js +43 -0
  551. package/dist/tools/connectors.controller.d.ts +10 -0
  552. package/dist/tools/connectors.controller.js +12 -0
  553. package/dist/tools/connectors.service.d.ts +46 -5
  554. package/dist/tools/connectors.service.js +94 -15
  555. package/dist/tools/extension-tools.controller.d.ts +14 -0
  556. package/dist/tools/extension-tools.controller.js +37 -0
  557. package/dist/tools/info.d.ts +42 -1
  558. package/dist/tools/info.js +64 -1
  559. package/dist/tools/oauth/flow-paths.d.ts +1 -1
  560. package/dist/tools/oauth/flow-paths.js +1 -1
  561. package/dist/tools/org-tool-switches.d.ts +74 -0
  562. package/dist/tools/org-tool-switches.js +184 -0
  563. package/dist/tools/pipeline.d.ts +46 -40
  564. package/dist/tools/pipeline.js +202 -364
  565. package/dist/tools/policy.d.ts +1 -1
  566. package/dist/tools/policy.js +36 -16
  567. package/dist/tools/registry.d.ts +120 -8
  568. package/dist/tools/registry.js +112 -19
  569. package/dist/tools/tools.module.js +24 -2
  570. package/dist/tools/validate.js +1 -1
  571. package/dist/ui/views.d.ts +2 -1
  572. package/dist/ui/views.js +17 -3
  573. package/package.json +3 -3
  574. package/src/migrations/0064_account_last_org.sql +7 -0
  575. package/src/migrations/0065_conversation_archive.sql +8 -0
  576. package/src/migrations/0066_extension_display_name.sql +4 -0
  577. package/src/migrations/0067_agent_profiles.sql +20 -0
  578. package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
  579. package/src/migrations/0069_attachments_agent_idx.sql +3 -0
  580. package/src/migrations/0070_background_tasks.sql +37 -0
  581. package/src/migrations/0071_background_tasks_reserve.sql +6 -0
  582. package/src/migrations/0072_background_tasks_stopping.sql +5 -0
  583. package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
  584. package/src/migrations/0074_subagent_tree.sql +50 -0
  585. package/src/migrations/0075_plugin_scope.sql +61 -0
  586. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  587. package/src/migrations/0077_scope_requests.sql +52 -0
  588. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  589. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  590. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  591. package/src/migrations/0081_platform_components.sql +129 -0
  592. package/src/migrations/0082_platform_migration.sql +33 -0
  593. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  594. package/src/migrations/0084_org_owned_items.sql +85 -0
  595. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  596. package/src/migrations/0086_org_layering.sql +30 -0
  597. package/src/migrations/0087_approval_summary.sql +6 -0
  598. package/src/migrations/0088_environments.sql +80 -0
  599. package/dist/catalog/upgrade-targets.d.ts +0 -56
  600. package/dist/catalog/upgrade-targets.js +0 -90
  601. package/dist/conversations/sandbox-status.d.ts +0 -24
  602. package/dist/conversations/sandbox-status.js +0 -52
  603. package/dist/extensions/org-config.controller.d.ts +0 -24
  604. package/dist/extensions/org-config.controller.js +0 -62
@@ -0,0 +1,357 @@
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 { sql } from "kysely";
12
+ import { KernelDb } from "../infra/database/kernel-db.js";
13
+ import { TransactionHost } from "../infra/database/transaction-host.js";
14
+ import { Transactional } from "../infra/database/transactional.decorator.js";
15
+ import { BackgroundLaunchLock } from "./launch-lock.js";
16
+ const toRow = (r) => ({
17
+ id: r.id,
18
+ orgId: r.org_id,
19
+ conversationId: r.conversation_id,
20
+ sandboxConversationId: r.sandbox_conversation_id,
21
+ environmentId: r.environment_id,
22
+ runId: r.run_id,
23
+ callId: r.call_id,
24
+ triggerAccountId: r.trigger_account_id,
25
+ description: r.description,
26
+ command: r.command,
27
+ sid: r.sid,
28
+ outputPath: r.output_path,
29
+ status: r.status,
30
+ lostReason: r.lost_reason,
31
+ exitCode: r.exit_code,
32
+ startedAt: new Date(r.started_at),
33
+ finishedAt: r.finished_at === null ? null : new Date(r.finished_at),
34
+ deadlineAt: new Date(r.deadline_at),
35
+ sandboxCreatedAt: r.sandbox_created_at === null ? null : new Date(r.sandbox_created_at),
36
+ killPending: r.kill_pending,
37
+ readOffset: Number(r.read_offset),
38
+ stoppingAt: r.stopping_at === null ? null : new Date(r.stopping_at),
39
+ });
40
+ /**
41
+ * How long a stop's claim holds: a claim older than this is abandoned (its stopper died), so the
42
+ * poller checks the task again and another stop may claim it. Longer than any stop takes (the
43
+ * lease wait, the SIGTERM grace, the kill and the tail).
44
+ */
45
+ export const STOP_CLAIM_TTL_MS = 5 * 60_000;
46
+ /** A condition: the row is not claimed by a live stop. */
47
+ const unclaimed = sql `(stopping_at IS NULL OR stopping_at < now() - ${STOP_CLAIM_TTL_MS}::integer * interval '1 millisecond')`;
48
+ /**
49
+ * Background Bash tasks (spec §4.1): one `capybara.background_tasks` row per command started with
50
+ * `run_in_background`. The store only reads and writes rows; the launch, the poller and the tools
51
+ * that drive them are other providers.
52
+ *
53
+ * A launch first reserves its row ({@link BackgroundTaskStore.reserve}: `running`, `sid` null),
54
+ * then starts the command and sets `sid` ({@link BackgroundTaskStore.markStarted}), or finishes
55
+ * the row as `failed` ({@link BackgroundTaskStore.failLaunch}). A running row with a null `sid`
56
+ * counts against `maxTasks` but has no process to check or stop: the poller and stops must skip
57
+ * it (the launch that reserved it settles it; one left over by a launch that died is failed by the
58
+ * poller, {@link BackgroundTaskStore.failAbandonedLaunches}).
59
+ */
60
+ let BackgroundTaskStore = class BackgroundTaskStore {
61
+ db;
62
+ txHost;
63
+ launchLock;
64
+ constructor(db, txHost, launchLock) {
65
+ this.db = db;
66
+ this.txHost = txHost;
67
+ this.launchLock = launchLock;
68
+ }
69
+ /**
70
+ * Reserves a launch: under the root conversation's launch lock, counts the running tasks of
71
+ * `row.sandboxConversationId` and inserts `row` as `running` (no `sid`) when fewer than
72
+ * `maxTasks` run. False (nothing written) when that conversation tree already runs `maxTasks`.
73
+ */
74
+ async reserve(row, maxTasks) {
75
+ await this.launchLock.lock(row.sandboxConversationId);
76
+ if ((await this.countRunning(row.sandboxConversationId)) >= maxTasks)
77
+ return false;
78
+ await this.insert({ ...row, sid: null, sandboxCreatedAt: null });
79
+ return true;
80
+ }
81
+ /**
82
+ * Records the started command of a reserved row: `started`, or `stopping` when a stop claimed the
83
+ * reservation meanwhile (the launch then kills the command and finishes the row with
84
+ * {@link finishStoppedLaunch}); false when the row is no longer running.
85
+ */
86
+ async markStarted(id, to) {
87
+ const r = await this.db
88
+ .updateTable("background_tasks")
89
+ .set({ sid: to.sid, sandbox_created_at: to.sandboxCreatedAt })
90
+ .where("id", "=", id)
91
+ .where("status", "=", "running")
92
+ .where("sid", "is", null)
93
+ .returning("stopping_at")
94
+ .executeTakeFirst();
95
+ if (!r)
96
+ return false;
97
+ return r.stopping_at === null ? "started" : "stopping";
98
+ }
99
+ /**
100
+ * Finishes a launch whose reservation a stop claimed, once the launch killed what it started:
101
+ * `stopped`. No `background_task_finished` event: the launching call reports it itself.
102
+ */
103
+ async finishStoppedLaunch(id) {
104
+ await this.db
105
+ .updateTable("background_tasks")
106
+ .set({ status: "stopped", finished_at: sql `now()`, stopping_at: null })
107
+ .where("id", "=", id)
108
+ .where("status", "=", "running")
109
+ .execute();
110
+ }
111
+ /**
112
+ * Claims a running task for a stop (`stopping_at`): false when it is no longer running or another
113
+ * live stop claimed it ({@link STOP_CLAIM_TTL_MS}). While claimed the poller leaves it alone.
114
+ */
115
+ async claimStop(id) {
116
+ const r = await this.db
117
+ .updateTable("background_tasks")
118
+ .set({ stopping_at: sql `now()` })
119
+ .where("id", "=", id)
120
+ .where("status", "=", "running")
121
+ .where(unclaimed)
122
+ .executeTakeFirst();
123
+ return Number(r.numUpdatedRows) > 0;
124
+ }
125
+ /** Gives up a stop's claim (the stop failed while the sandbox runs: the task keeps running). */
126
+ async releaseStop(id) {
127
+ await this.db
128
+ .updateTable("background_tasks")
129
+ .set({ stopping_at: null })
130
+ .where("id", "=", id)
131
+ .where("status", "=", "running")
132
+ .execute();
133
+ }
134
+ /**
135
+ * Finishes a reserved row whose launch failed as `failed`, with `reason` in `lost_reason` (and a
136
+ * stop's claim cleared); a row that already has its sid (the command started and is tracked) is
137
+ * left as it is. No `background_task_finished` event: the launching call reports the failure
138
+ * itself.
139
+ */
140
+ async failLaunch(id, reason) {
141
+ await this.db
142
+ .updateTable("background_tasks")
143
+ .set({
144
+ status: "failed",
145
+ finished_at: sql `now()`,
146
+ lost_reason: reason,
147
+ stopping_at: null,
148
+ })
149
+ .where("id", "=", id)
150
+ .where("status", "=", "running")
151
+ // only a reservation that never started: a row with its sid is tracked by the poller
152
+ .where("sid", "is", null)
153
+ .execute();
154
+ }
155
+ /**
156
+ * Finishes as `failed` (`lost_reason` `launch_abandoned`) every reservation that started before
157
+ * `before`, never got its sid and is not claimed by a live stop: the launch that reserved it died
158
+ * (a crashed replica). A stop's claim older than {@link STOP_CLAIM_TTL_MS} does not hold it: a
159
+ * stop only claims a reservation and leaves the rest to the launch, so a dead launch would keep
160
+ * it (and its slot of `maxTasks`) forever. Conditional on `sid` still null, so a launch
161
+ * completing at that moment wins. No `background_task_finished` event: the command never
162
+ * started and the model never saw its id. Returns the rows it finished (their owner and sandbox
163
+ * conversations, for the caller's `changed: "background"` frames).
164
+ */
165
+ async failAbandonedLaunches(before) {
166
+ const r = await this.db
167
+ .updateTable("background_tasks")
168
+ .set({
169
+ status: "failed",
170
+ finished_at: sql `now()`,
171
+ lost_reason: "launch_abandoned",
172
+ stopping_at: null,
173
+ })
174
+ .where("status", "=", "running")
175
+ .where("sid", "is", null)
176
+ .where(unclaimed)
177
+ .where("started_at", "<", before)
178
+ .returning(["id", "conversation_id", "sandbox_conversation_id"])
179
+ .execute();
180
+ return r.map((x) => ({
181
+ id: x.id,
182
+ conversationId: x.conversation_id,
183
+ sandboxConversationId: x.sandbox_conversation_id,
184
+ }));
185
+ }
186
+ async insert(row) {
187
+ await this.db
188
+ .insertInto("background_tasks")
189
+ .values({
190
+ id: row.id,
191
+ org_id: row.orgId,
192
+ conversation_id: row.conversationId,
193
+ sandbox_conversation_id: row.sandboxConversationId,
194
+ environment_id: row.environmentId,
195
+ run_id: row.runId,
196
+ call_id: row.callId,
197
+ trigger_account_id: row.triggerAccountId,
198
+ description: row.description,
199
+ command: row.command,
200
+ sid: row.sid,
201
+ output_path: row.outputPath,
202
+ started_at: row.startedAt,
203
+ deadline_at: row.deadlineAt,
204
+ sandbox_created_at: row.sandboxCreatedAt,
205
+ })
206
+ .execute();
207
+ }
208
+ async get(id) {
209
+ const r = await this.db
210
+ .selectFrom("background_tasks")
211
+ .selectAll()
212
+ .where("id", "=", id)
213
+ .executeTakeFirst();
214
+ return r === undefined ? undefined : toRow(r);
215
+ }
216
+ /** The running tasks of one root conversation's tree, oldest first. */
217
+ async runningIn(sandboxConversationId) {
218
+ const rows = await this.db
219
+ .selectFrom("background_tasks")
220
+ .selectAll()
221
+ .where("sandbox_conversation_id", "=", sandboxConversationId)
222
+ .where("status", "=", "running")
223
+ .orderBy("started_at", "asc")
224
+ .orderBy("id", "asc")
225
+ .execute();
226
+ return rows.map(toRow);
227
+ }
228
+ /**
229
+ * Every running task that has started (its `sid` is set) and no live stop claimed, across
230
+ * sandboxes, oldest first: what the poller checks. A reservation still launching (`sid` null) is
231
+ * left to its launch, a claimed task to its stop.
232
+ */
233
+ async runningStarted() {
234
+ const rows = await this.db
235
+ .selectFrom("background_tasks")
236
+ .selectAll()
237
+ .where("status", "=", "running")
238
+ .where("sid", "is not", null)
239
+ .where(unclaimed)
240
+ .orderBy("started_at", "asc")
241
+ .orderBy("id", "asc")
242
+ .execute();
243
+ return rows.map(toRow);
244
+ }
245
+ /** The running tasks one conversation owns (not those of its sub-agents), oldest first. */
246
+ async runningOwnedBy(conversationId) {
247
+ const rows = await this.db
248
+ .selectFrom("background_tasks")
249
+ .selectAll()
250
+ .where("conversation_id", "=", conversationId)
251
+ .where("status", "=", "running")
252
+ .orderBy("started_at", "asc")
253
+ .orderBy("id", "asc")
254
+ .execute();
255
+ return rows.map(toRow);
256
+ }
257
+ /** The running tasks of one root conversation's tree (what `maxTasks` limits). */
258
+ async countRunning(sandboxConversationId) {
259
+ const r = await this.db
260
+ .selectFrom("background_tasks")
261
+ .select((eb) => eb.fn.countAll().as("n"))
262
+ .where("sandbox_conversation_id", "=", sandboxConversationId)
263
+ .where("status", "=", "running")
264
+ .executeTakeFirstOrThrow();
265
+ return Number(r.n);
266
+ }
267
+ /** The tasks owned by any of the conversations, newest first. */
268
+ async listFor(conversationIds) {
269
+ if (conversationIds.length === 0)
270
+ return [];
271
+ const rows = await this.db
272
+ .selectFrom("background_tasks")
273
+ .selectAll()
274
+ .where("conversation_id", "in", conversationIds)
275
+ .orderBy("started_at", "desc")
276
+ .orderBy("id", "desc")
277
+ .execute();
278
+ return rows.map(toRow);
279
+ }
280
+ /**
281
+ * Conditional `running` to a final status; false when the row was no longer running (another
282
+ * path finished it first), or, with `opts.unclaimed` (the poller), when a live stop claimed it.
283
+ * The caller's transaction also appends the finished event.
284
+ */
285
+ async finish(id, to, opts = {}) {
286
+ let q = this.db
287
+ .updateTable("background_tasks")
288
+ .set({
289
+ status: to.status,
290
+ finished_at: sql `now()`,
291
+ exit_code: to.exitCode ?? null,
292
+ lost_reason: to.lostReason ?? null,
293
+ stopping_at: null,
294
+ ...(to.killPending !== undefined && { kill_pending: to.killPending }),
295
+ })
296
+ .where("id", "=", id)
297
+ .where("status", "=", "running");
298
+ if (opts.unclaimed)
299
+ q = q.where(unclaimed);
300
+ const r = await q.executeTakeFirst();
301
+ return Number(r.numUpdatedRows) > 0;
302
+ }
303
+ /** Moves the read offset forward only (a concurrent reader never moves it back). */
304
+ async advanceOffset(id, to) {
305
+ await this.db
306
+ .updateTable("background_tasks")
307
+ .set({ read_offset: to })
308
+ .where("id", "=", id)
309
+ .where(sql `read_offset < ${to}`)
310
+ .execute();
311
+ }
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) {
317
+ const rows = await this.db
318
+ .selectFrom("background_tasks")
319
+ .selectAll()
320
+ .where("environment_id", "=", environmentId)
321
+ .where("kill_pending", "=", true)
322
+ .orderBy("started_at", "asc")
323
+ .execute();
324
+ return rows.map(toRow);
325
+ }
326
+ async clearKill(ids) {
327
+ if (ids.length === 0)
328
+ return;
329
+ await this.db
330
+ .updateTable("background_tasks")
331
+ .set({ kill_pending: false })
332
+ .where("id", "in", ids)
333
+ .execute();
334
+ }
335
+ /** Deletes finished tasks that ended before `before`; a running one is never deleted. */
336
+ async pruneFinished(before) {
337
+ const r = await this.db
338
+ .deleteFrom("background_tasks")
339
+ .where("status", "<>", "running")
340
+ .where("finished_at", "<", before)
341
+ .executeTakeFirst();
342
+ return Number(r.numDeletedRows);
343
+ }
344
+ };
345
+ __decorate([
346
+ Transactional()
347
+ ], BackgroundTaskStore.prototype, "reserve", null);
348
+ __decorate([
349
+ Transactional({ propagation: "mandatory" })
350
+ ], BackgroundTaskStore.prototype, "finish", null);
351
+ BackgroundTaskStore = __decorate([
352
+ Injectable(),
353
+ __param(0, Inject(KernelDb)),
354
+ __param(1, Inject(TransactionHost)),
355
+ __param(2, Inject(BackgroundLaunchLock))
356
+ ], BackgroundTaskStore);
357
+ export { BackgroundTaskStore };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The background task store alone, so `SandboxModule` (which kills lost tasks after a resume) can
3
+ * import it while `BackgroundModule`'s launch and poller import `SandboxModule`, without a cycle.
4
+ */
5
+ export declare class BackgroundStoreModule {
6
+ }
@@ -0,0 +1,22 @@
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
+ import { Module } from "@nestjs/common";
8
+ import { BackgroundLaunchLock } from "./launch-lock.js";
9
+ import { BackgroundTaskStore } from "./store.js";
10
+ /**
11
+ * The background task store alone, so `SandboxModule` (which kills lost tasks after a resume) can
12
+ * import it while `BackgroundModule`'s launch and poller import `SandboxModule`, without a cycle.
13
+ */
14
+ let BackgroundStoreModule = class BackgroundStoreModule {
15
+ };
16
+ BackgroundStoreModule = __decorate([
17
+ Module({
18
+ providers: [BackgroundTaskStore, BackgroundLaunchLock],
19
+ exports: [BackgroundTaskStore],
20
+ })
21
+ ], BackgroundStoreModule);
22
+ export { BackgroundStoreModule };
@@ -0,0 +1,77 @@
1
+ import { ConversationAccess } from "../conversations/access.js";
2
+ import { EventLog } from "../conversations/event-log.js";
3
+ import { ConversationEnvironments } from "../environments/conversation-environments.js";
4
+ import { KernelDb } from "../infra/database/kernel-db.js";
5
+ import { SandboxService } from "../sandbox/sandbox.service.js";
6
+ import { BackgroundTaskStopper } from "./stop.js";
7
+ import { type BackgroundTaskStatus, BackgroundTaskStore } from "./store.js";
8
+ /** The most bytes of output one read returns. */
9
+ export declare const OUTPUT_TAIL_MAX_BYTES = 65536;
10
+ /** A task as the API shows it. */
11
+ export interface BackgroundTaskView {
12
+ id: string;
13
+ /** The conversation the task was asked for. */
14
+ conversationId: string;
15
+ /** The child conversation of a sub-agent's task; null for the conversation's own task. */
16
+ subagentId: string | null;
17
+ description: string;
18
+ command: string;
19
+ status: BackgroundTaskStatus;
20
+ exitCode: number | null;
21
+ lostReason: string | null;
22
+ startedAt: string;
23
+ finishedAt: string | null;
24
+ /** True while a stop has claimed the task and it is still running. */
25
+ stopping: boolean;
26
+ }
27
+ export interface BackgroundTaskOutput {
28
+ text: string;
29
+ /** True when `text` is only the end of the output (or, for `event`, the last lines). */
30
+ truncated: boolean;
31
+ /** `live`: read from the running sandbox; `event`: the last lines the finished event kept. */
32
+ source: "live" | "event";
33
+ }
34
+ /**
35
+ * The HTTP side of background tasks (spec 2026-11-05-background-bash-design §5): the tasks of a
36
+ * conversation and of its sub-agents, stopping one, reading its output. A task is reachable
37
+ * through the conversation that owns it or through any conversation above it, and only by a
38
+ * person who may see the conversation (`ConversationAccess`, the rule of `GET :id`, which is also
39
+ * what `POST :id/abort` checks: the owner).
40
+ */
41
+ export declare class BackgroundTasks {
42
+ private readonly access;
43
+ private readonly store;
44
+ private readonly stopper;
45
+ private readonly sandbox;
46
+ private readonly eventLog;
47
+ private readonly db;
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
+ */
54
+ private scope;
55
+ private view;
56
+ private owned;
57
+ /** The tasks of the conversation and its sub-agents, newest first. */
58
+ list(orgId: string, conversationId: string, accountId: string): Promise<BackgroundTaskView[]>;
59
+ /**
60
+ * A person's stop. Returns the row after the stop: `running` with `stopping` true when another
61
+ * stop already claimed the task (or the task is a reservation still launching, which its launch
62
+ * then kills); a stop that fails throws. Writes the `background_task.stopped` audit event.
63
+ */
64
+ stop(orgId: string, conversationId: string, accountId: string, taskId: string, actorTokenId?: string): Promise<BackgroundTaskView>;
65
+ /**
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
73
+ * with the last lines its finished event kept. Anything else is
74
+ * `background_task.output_unavailable` (409).
75
+ */
76
+ output(orgId: string, conversationId: string, accountId: string, taskId: string, tail: number): Promise<BackgroundTaskOutput>;
77
+ }
@@ -0,0 +1,211 @@
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 { isSandboxGoneError } from "@capybara-hq/plugin-sdk";
11
+ import { Inject, Injectable } from "@nestjs/common";
12
+ import { ConversationAccess } from "../conversations/access.js";
13
+ import { EventLog } from "../conversations/event-log.js";
14
+ import { conversationTree } from "../conversations/tree.js";
15
+ import { ConversationEnvironments } from "../environments/conversation-environments.js";
16
+ import { ApiError } from "../errors.js";
17
+ import { audit } from "../identity/audit.js";
18
+ import { KernelDb } from "../infra/database/kernel-db.js";
19
+ import { rootConversationOf } from "../runtime/subagents/child.js";
20
+ import { SandboxService } from "../sandbox/sandbox.service.js";
21
+ import { UUID_RE } from "../ui/registry.js";
22
+ import { finishedEventKey } from "./finish.js";
23
+ import { TASK_ID_RE, TASKS_DIR } from "./launch.js";
24
+ import { actingAs } from "./session.js";
25
+ import { BackgroundTaskStopper } from "./stop.js";
26
+ import { BackgroundTaskStore } from "./store.js";
27
+ /** The most bytes of output one read returns. */
28
+ export const OUTPUT_TAIL_MAX_BYTES = 65_536;
29
+ /** The time limit of reading an output (the exec and the wait for the sandbox's lease). */
30
+ const OUTPUT_READ_TIMEOUT_MS = 30_000;
31
+ const conversationNotFound = () => new ApiError("conversation.not_found", "Conversation not found");
32
+ const taskNotFound = () => new ApiError("background_task.not_found", "Background task not found");
33
+ /**
34
+ * The HTTP side of background tasks (spec 2026-11-05-background-bash-design §5): the tasks of a
35
+ * conversation and of its sub-agents, stopping one, reading its output. A task is reachable
36
+ * through the conversation that owns it or through any conversation above it, and only by a
37
+ * person who may see the conversation (`ConversationAccess`, the rule of `GET :id`, which is also
38
+ * what `POST :id/abort` checks: the owner).
39
+ */
40
+ let BackgroundTasks = class BackgroundTasks {
41
+ access;
42
+ store;
43
+ stopper;
44
+ sandbox;
45
+ eventLog;
46
+ db;
47
+ environments;
48
+ constructor(access, store, stopper, sandbox, eventLog, db, environments) {
49
+ this.access = access;
50
+ this.store = store;
51
+ this.stopper = stopper;
52
+ this.sandbox = sandbox;
53
+ this.eventLog = eventLog;
54
+ this.db = db;
55
+ this.environments = environments;
56
+ }
57
+ /**
58
+ * The conversation and every sub-agent conversation below it (grandchildren too: their tasks run
59
+ * in the root's sandbox, agent map spec §6); `conversation.not_found` when not visible.
60
+ */
61
+ async scope(orgId, conversationId, accountId) {
62
+ if (!UUID_RE.test(conversationId) ||
63
+ !(await this.access.isAccessible(orgId, conversationId, accountId))) {
64
+ throw conversationNotFound();
65
+ }
66
+ // the conversation is the org's (isAccessible), and so is every sub-agent conversation below it
67
+ return (await conversationTree(this.db.db, conversationId)).map((c) => c.id);
68
+ }
69
+ view(task, conversationId) {
70
+ return {
71
+ id: task.id,
72
+ conversationId,
73
+ subagentId: task.conversationId === conversationId ? null : task.conversationId,
74
+ description: task.description,
75
+ command: task.command,
76
+ status: task.status,
77
+ exitCode: task.exitCode,
78
+ lostReason: task.lostReason,
79
+ startedAt: task.startedAt.toISOString(),
80
+ finishedAt: task.finishedAt === null ? null : task.finishedAt.toISOString(),
81
+ stopping: task.status === "running" && task.stoppingAt !== null,
82
+ };
83
+ }
84
+ async owned(orgId, conversationId, accountId, taskId) {
85
+ const ids = await this.scope(orgId, conversationId, accountId);
86
+ if (!TASK_ID_RE.test(taskId))
87
+ throw taskNotFound();
88
+ const task = await this.store.get(taskId);
89
+ if (!task || task.orgId !== orgId || !ids.includes(task.conversationId))
90
+ throw taskNotFound();
91
+ return task;
92
+ }
93
+ /** The tasks of the conversation and its sub-agents, newest first. */
94
+ async list(orgId, conversationId, accountId) {
95
+ const ids = await this.scope(orgId, conversationId, accountId);
96
+ return (await this.store.listFor(ids)).map((t) => this.view(t, conversationId));
97
+ }
98
+ /**
99
+ * A person's stop. Returns the row after the stop: `running` with `stopping` true when another
100
+ * stop already claimed the task (or the task is a reservation still launching, which its launch
101
+ * then kills); a stop that fails throws. Writes the `background_task.stopped` audit event.
102
+ */
103
+ async stop(orgId, conversationId, accountId, taskId, actorTokenId) {
104
+ const task = await this.owned(orgId, conversationId, accountId, taskId);
105
+ const after = await this.stopper.stop(task, "person");
106
+ await audit(this.db.db, {
107
+ actorAccountId: accountId,
108
+ ...(actorTokenId !== undefined && { actorTokenId }),
109
+ orgId,
110
+ action: "background_task.stopped",
111
+ target: task.id,
112
+ detail: { taskId: task.id, conversationId: task.conversationId, status: after.status },
113
+ });
114
+ return this.view(after, conversationId);
115
+ }
116
+ /**
117
+ * Whether the task's environment may still be used by its conversation's owner (the access
118
+ * re-check every sandbox tool call makes); when it may not, the live read is skipped.
119
+ */
120
+ async environmentUsable(orgId, taskConversationId) {
121
+ try {
122
+ await this.environments.forTool(orgId, await rootConversationOf(this.db.db, taskConversationId));
123
+ return true;
124
+ }
125
+ catch (e) {
126
+ if (e instanceof ApiError)
127
+ return false;
128
+ throw e;
129
+ }
130
+ }
131
+ /**
132
+ * The end of the task's output, at most `tail` bytes. Read live when the task's environment
133
+ * instance runs (never resuming a suspended one); a finished task whose sandbox does not run answers
134
+ * with the last lines its finished event kept. Anything else is
135
+ * `background_task.output_unavailable` (409).
136
+ */
137
+ async output(orgId, conversationId, accountId, taskId, tail) {
138
+ const task = await this.owned(orgId, conversationId, accountId, taskId);
139
+ if (task.sid !== null &&
140
+ task.sandboxCreatedAt !== null &&
141
+ task.environmentId !== null &&
142
+ this.sandbox.available &&
143
+ (await this.environmentUsable(orgId, task.conversationId))) {
144
+ const createdAt = task.sandboxCreatedAt;
145
+ // the person reading it acts in the task's conversation
146
+ const actor = { accountId, conversationId: task.conversationId };
147
+ try {
148
+ const r = await this.sandbox.ifRunning(task.environmentId, { createdAt }, async (p, h, signal) => {
149
+ const res = await actingAs(p, actor).exec(h, {
150
+ command: tailScript(task.id, tail),
151
+ cwd: "/workspace",
152
+ timeoutMs: OUTPUT_READ_TIMEOUT_MS,
153
+ maxOutputBytes: 2 * OUTPUT_TAIL_MAX_BYTES + 4096,
154
+ signal,
155
+ });
156
+ return res.exitCode === 0 ? parseTail(res.stdout, tail) : null;
157
+ }, AbortSignal.timeout(OUTPUT_READ_TIMEOUT_MS));
158
+ if (r.kind === "ran" && r.value !== null)
159
+ return { ...r.value, source: "live" };
160
+ }
161
+ catch (e) {
162
+ if (!isSandboxGoneError(e))
163
+ throw e;
164
+ }
165
+ }
166
+ if (task.status !== "running") {
167
+ const ev = await this.eventLog.findByIdem(task.conversationId, finishedEventKey(task.id));
168
+ if (ev?.type === "background_task_finished") {
169
+ return { text: ev.payload.lastLines, truncated: true, source: "event" };
170
+ }
171
+ }
172
+ throw new ApiError("background_task.output_unavailable", "The task's output cannot be read now: its sandbox is not running");
173
+ }
174
+ };
175
+ BackgroundTasks = __decorate([
176
+ Injectable(),
177
+ __param(0, Inject(ConversationAccess)),
178
+ __param(1, Inject(BackgroundTaskStore)),
179
+ __param(2, Inject(BackgroundTaskStopper)),
180
+ __param(3, Inject(SandboxService)),
181
+ __param(4, Inject(EventLog)),
182
+ __param(5, Inject(KernelDb)),
183
+ __param(6, Inject(ConversationEnvironments))
184
+ ], BackgroundTasks);
185
+ export { BackgroundTasks };
186
+ /** Prints `size <bytes>` and `out <base64 of the last `tail` bytes>`. Relative to `/workspace`. */
187
+ function tailScript(id, tail) {
188
+ if (!TASK_ID_RE.test(id))
189
+ throw new Error(`invalid background task id: ${id}`);
190
+ const f = `${TASKS_DIR}/${id}.out`;
191
+ return [
192
+ `s=$({ wc -c < ${f}; } 2>/dev/null | tr -d ' '); echo "size \${s:-0}"`,
193
+ `printf 'out '; { tail -c ${Math.floor(tail)} ${f} 2>/dev/null | base64 | tr -d '\\n'; }; echo`,
194
+ ].join("\n");
195
+ }
196
+ /** Decodes {@link tailScript}'s output; a cut that splits a UTF-8 character drops its tail bytes. */
197
+ function parseTail(stdout, tail) {
198
+ const size = /^size ([0-9]+)$/m.exec(stdout);
199
+ const out = /^out (\S*)$/m.exec(stdout);
200
+ if (!size || !out)
201
+ return null;
202
+ let bytes = Buffer.from(out[1], "base64");
203
+ const truncated = Number(size[1]) > tail;
204
+ if (truncated) {
205
+ let i = 0;
206
+ while (i < bytes.length && i < 3 && (bytes[i] & 0xc0) === 0x80)
207
+ i++;
208
+ bytes = bytes.subarray(i);
209
+ }
210
+ return { text: bytes.toString("utf8"), truncated };
211
+ }