@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
@@ -11,6 +11,9 @@ import { randomUUID } from "node:crypto";
11
11
  import { Inject, Injectable } from "@nestjs/common";
12
12
  import { sql } from "kysely";
13
13
  import { AgentLookup, visibleTo } from "../agents/agent-lookup.js";
14
+ import { BackgroundTaskStopper } from "../background/stop.js";
15
+ import { unbindConversation } from "../channels/threads.js";
16
+ import { ConversationEnvironments, } from "../environments/conversation-environments.js";
14
17
  import { ApiError } from "../errors.js";
15
18
  import { KernelDb } from "../infra/database/kernel-db.js";
16
19
  import { TransactionHost } from "../infra/database/transaction-host.js";
@@ -18,13 +21,37 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
18
21
  import { KERNEL_LOGGER } from "../infra/tokens.js";
19
22
  import { ProviderRegistry } from "../runtime/providers.js";
20
23
  import { RunControl as RunControlService } from "../runtime/run-control.js";
24
+ import { rootConversationOf } from "../runtime/subagents/child.js";
21
25
  import { SkillInvoker } from "../skills/invoke.js";
22
26
  import { ConnectorContent } from "../tools/connector-content.js";
23
27
  import { ConversationAccess, parentReachable } from "./access.js";
28
+ import { readAgentTree } from "./agent-tree.js";
24
29
  import { AttachmentsService } from "./attachments.service.js";
25
30
  import { EventLog } from "./event-log.js";
26
31
  import { userMessageIdemKey } from "./idem-keys.js";
27
32
  import { NO_SELECTION, planSelection, readSelection } from "./selection.js";
33
+ import { conversationTree } from "./tree.js";
34
+ /** Escapes `\`, `%` and `_` so user text is matched literally by `LIKE … ESCAPE '\'`. */
35
+ export function escapeLike(s) {
36
+ return s.replace(/[\\%_]/g, (ch) => `\\${ch}`);
37
+ }
38
+ /**
39
+ * SQL for the activity of the conversation row aliased/named `ref` (a correlated subquery).
40
+ * A run waiting on its sub-agents (status waiting with `wait_expires_at`, set only for a
41
+ * `subagents` wait) is still working, so it reports `running`; only a wait for a person
42
+ * (approval, input) reports `waiting`.
43
+ */
44
+ function activitySql(ref) {
45
+ const id = sql.ref(`${ref}.id`);
46
+ return sql `(
47
+ SELECT CASE
48
+ WHEN lr.status IN ('queued', 'running') THEN 'running'
49
+ WHEN lr.status = 'waiting' AND lr.wait_expires_at IS NOT NULL THEN 'running'
50
+ WHEN lr.status = 'waiting' THEN 'waiting' END
51
+ FROM capybara.runs lr WHERE lr.conversation_id = ${id}
52
+ ORDER BY lr.created_at DESC, lr.id DESC LIMIT 1
53
+ )`;
54
+ }
28
55
  const notFound = () => new ApiError("conversation.not_found", "Conversation not found");
29
56
  export { userMessageIdemKey } from "./idem-keys.js";
30
57
  const COLUMNS = [
@@ -40,6 +67,8 @@ const COLUMNS = [
40
67
  "updated_at",
41
68
  "parent_conversation_id",
42
69
  "subagent_type",
70
+ "archived_at",
71
+ "environment_id",
43
72
  ];
44
73
  function toView(r) {
45
74
  return {
@@ -55,10 +84,18 @@ function toView(r) {
55
84
  updatedAt: r.updated_at,
56
85
  parentConversationId: r.parent_conversation_id,
57
86
  subagentType: r.subagent_type,
87
+ archivedAt: r.archived_at,
88
+ environmentId: r.environment_id,
89
+ activity: r.activity ?? null,
58
90
  };
59
91
  }
60
92
  /** The longest conversation title (characters, after trimming). */
61
93
  export const CONVERSATION_TITLE_MAX_CHARS = 120;
94
+ /**
95
+ * How far back a `before` page of events reaches past its `limit` for the start of a turn (history
96
+ * paging spec §2); a longer run starts mid-run.
97
+ */
98
+ export const EVENTS_TURN_EXTEND = 2000;
62
99
  /** The sums of the `usage` events matching `where` (over `conversation_events e`), one row. */
63
100
  const usageSums = (where) => sql `
64
101
  SELECT
@@ -90,6 +127,8 @@ let ConversationsService = class ConversationsService {
90
127
  content;
91
128
  attachments;
92
129
  invoker;
130
+ background;
131
+ environments;
93
132
  txHost;
94
133
  constructor(db, eventLog, agents, access,
95
134
  /** Starts and stops the conversation's runs. */
@@ -101,7 +140,11 @@ let ConversationsService = class ConversationsService {
101
140
  /** Binds uploaded files to the conversation in the message's transaction. */
102
141
  attachments,
103
142
  /** Renders a person's skill invocation (phase D). */
104
- invoker, txHost) {
143
+ invoker,
144
+ /** Stops a deleted conversation's background tasks. */
145
+ background,
146
+ /** The environment a new conversation is bound to (environments spec §4.1 item 1). */
147
+ environments, txHost) {
105
148
  this.db = db;
106
149
  this.eventLog = eventLog;
107
150
  this.agents = agents;
@@ -112,6 +155,8 @@ let ConversationsService = class ConversationsService {
112
155
  this.content = content;
113
156
  this.attachments = attachments;
114
157
  this.invoker = invoker;
158
+ this.background = background;
159
+ this.environments = environments;
115
160
  this.txHost = txHost;
116
161
  }
117
162
  /**
@@ -123,12 +168,24 @@ let ConversationsService = class ConversationsService {
123
168
  .ensureRun(conversationId)
124
169
  .catch((err) => this.log.warn("ensureRun on conversation open failed", { conversationId, err }));
125
170
  }
126
- /** 新建会话;agent 对该账号不可用 → `agent.not_found`。 */
127
- async create(orgId, accountId, agentId) {
171
+ /**
172
+ * Creates an empty conversation bound to its environment (`pick`, see
173
+ * {@link ConversationEnvironments.forNew}); an agent the account cannot use →
174
+ * `agent.not_found`, an environment it may not use → `environment.not_found` /
175
+ * `environment.unavailable`, and nothing is created.
176
+ */
177
+ async create(orgId, accountId, agentId, pick = {}) {
128
178
  await this.agents.get(orgId, agentId, accountId);
179
+ const environmentId = await this.environments.forNew(orgId, accountId, pick);
129
180
  const row = await this.db
130
181
  .insertInto("conversations")
131
- .values({ id: randomUUID(), org_id: orgId, agent_id: agentId, account_id: accountId })
182
+ .values({
183
+ id: randomUUID(),
184
+ org_id: orgId,
185
+ agent_id: agentId,
186
+ account_id: accountId,
187
+ environment_id: environmentId,
188
+ })
132
189
  .returning(COLUMNS)
133
190
  .executeTakeFirstOrThrow();
134
191
  return toView(row);
@@ -139,18 +196,22 @@ let ConversationsService = class ConversationsService {
139
196
  * message's `clientMessageId` (`create_request_id`), so a retried send returns the same
140
197
  * conversation and event with `created: false`. An agent the caller cannot use →
141
198
  * `agent.not_found` and nothing is written. Queues a run afterwards, like `postUserMessage`.
199
+ * `events` are every event the create wrote, in seq order from seq 1 (a `model_switched` before
200
+ * the message when the send switched), so a client can seed the new conversation's log whole.
142
201
  */
143
- async createWithMessage(orgId, accountId, agentId, input) {
202
+ async createWithMessage(orgId, accountId, agentId, input, pick = {}) {
144
203
  const agent = await this.agents.get(orgId, agentId, accountId);
145
204
  const prior = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
146
205
  if (prior)
147
206
  return prior;
207
+ const environmentId = await this.environments.forNew(orgId, accountId, pick);
148
208
  const next = await this.planSwitch(agent.definition, NO_SELECTION, input);
149
209
  const extra = await this.resolveExtra(orgId, accountId, input);
150
210
  const invoked = await this.prepareSkill(orgId, agentId, undefined, agent.definition, input);
151
211
  const id = randomUUID();
152
- const written = await this.createIn(id, orgId, accountId, agentId, input, next, extra, invoked);
153
- if (!written) {
212
+ const all = await this.createIn({ id, orgId, accountId, agentId, environmentId }, input, next, extra, invoked);
213
+ const written = all?.at(-1);
214
+ if (!all || !written) {
154
215
  const raced = await this.findCreated(orgId, accountId, agentId, input.clientMessageId);
155
216
  if (!raced)
156
217
  throw new ApiError("conflict", "The conversation is being created; retry");
@@ -158,18 +219,20 @@ let ConversationsService = class ConversationsService {
158
219
  }
159
220
  await this.eventLog.notify(id, written.seq);
160
221
  await this.runs.ensureRun(id);
161
- return { conversation: await this.rowView(id), event: written, created: true };
222
+ return { conversation: await this.rowView(id), event: written, events: all, created: true };
162
223
  }
163
224
  /** The conversation row and its first message (undefined: a concurrent retry committed first). */
164
225
  // its own transaction: the caller notifies and publishes after the commit
165
- async createIn(id, orgId, accountId, agentId, input, next, extra, invoked) {
226
+ async createIn(conv, input, next, extra, invoked) {
227
+ const { id, orgId, accountId } = conv;
166
228
  const row = await this.db
167
229
  .insertInto("conversations")
168
230
  .values({
169
231
  id,
170
232
  org_id: orgId,
171
- agent_id: agentId,
233
+ agent_id: conv.agentId,
172
234
  account_id: accountId,
235
+ environment_id: conv.environmentId,
173
236
  create_request_id: input.clientMessageId,
174
237
  })
175
238
  .onConflict((oc) => oc
@@ -206,8 +269,10 @@ let ConversationsService = class ConversationsService {
206
269
  const event = await this.eventLog.findByIdem(row.id, userMessageIdemKey(clientMessageId));
207
270
  if (!event)
208
271
  return null;
272
+ // what the first send wrote: the log from its start up to the message
273
+ const events = (await this.eventLog.readAfter(row.id, 0, event.seq)).filter((e) => e.seq <= event.seq);
209
274
  await this.runs.ensureRun(row.id);
210
- return { conversation: toView(row), event, created: false };
275
+ return { conversation: toView(row), event, events, created: false };
211
276
  }
212
277
  async rowView(id) {
213
278
  return toView(await this.db
@@ -231,6 +296,65 @@ let ConversationsService = class ConversationsService {
231
296
  await this.eventLog.publishChanged(conversationId, "title");
232
297
  return toView(row);
233
298
  }
299
+ /**
300
+ * Archives or unarchives a conversation (owner only, as {@link rename}). An archived
301
+ * conversation leaves the default lists but stays readable. Publishes `changed: archived`.
302
+ */
303
+ async setArchived(orgId, conversationId, accountId, archived) {
304
+ await this.writable(orgId, conversationId, accountId);
305
+ const row = await this.db
306
+ .updateTable("conversations")
307
+ .set({ archived_at: archived ? sql `now()` : null })
308
+ .where("id", "=", conversationId)
309
+ .returning(COLUMNS)
310
+ .executeTakeFirstOrThrow();
311
+ await this.eventLog.publishChanged(conversationId, "archived");
312
+ return toView(row);
313
+ }
314
+ /**
315
+ * Soft-deletes a conversation (owner only; a sub-agent's conversation is `conversation.read_only`):
316
+ * stops an active run, hides the conversation everywhere for its owner and drops its channel
317
+ * bindings, stops every running background task in its sandbox (its sub-agents' too; outside
318
+ * the delete's transaction, a task whose sandbox cannot be reached ends `lost` with
319
+ * `kill_pending`), then every active run of its sub-agent tree (agent map spec §10). The tasks
320
+ * are stopped after the conversation is marked deleted, so no finish
321
+ * (the stops' own, or one the poller writes meanwhile) can wake a run on it: `ensureRun` refuses a
322
+ * deleted conversation (the stops' finishes carry `stoppedBy: "deletion"` as well). The event
323
+ * log, runs and trajectory stay (super admins still see them).
324
+ */
325
+ async remove(orgId, conversationId, accountId) {
326
+ await this.writable(orgId, conversationId, accountId);
327
+ try {
328
+ await this.abort(orgId, conversationId, accountId);
329
+ }
330
+ catch (e) {
331
+ if (!(e instanceof ApiError && e.code === "run.not_active"))
332
+ throw e;
333
+ }
334
+ await this.markDeleted(conversationId);
335
+ // after the mark, so no finish or delivery of the stops below can start a run on the deleted
336
+ // root (`ensureRun` refuses it). The sandbox's tasks stop first, so the sub-agents' tasks end
337
+ // as a deletion; the tree stop then only stops a task a sub-agent started in between
338
+ // (`stoppedBy: "subagent_end"`, which never wakes either)
339
+ await this.background.stopForDeletedConversation(conversationId);
340
+ // the whole tree stops (agent map spec §10)
341
+ await this.runs.stopTree(conversationId, accountId, { includeSelf: false });
342
+ await this.eventLog.publishChanged(conversationId, "deleted");
343
+ }
344
+ // the publish happens after the commit, in the caller
345
+ async markDeleted(conversationId) {
346
+ await this.db
347
+ .updateTable("conversations")
348
+ .set({ deleted_at: sql `now()` })
349
+ .where("id", "=", conversationId)
350
+ .execute();
351
+ // Queued messages must not start a run on a deleted conversation
352
+ await this.db
353
+ .deleteFrom("conversation_queue")
354
+ .where("conversation_id", "=", conversationId)
355
+ .execute();
356
+ await unbindConversation(this.db.db, conversationId);
357
+ }
234
358
  /** 读会话:非所有者、或 agent 已对所有者不可用 → `conversation.not_found`。 */
235
359
  async get(orgId, conversationId, viewerAccountId) {
236
360
  const { kind: _kind, ...row } = await this.readable(orgId, conversationId, viewerAccountId);
@@ -255,6 +379,7 @@ let ConversationsService = class ConversationsService {
255
379
  .where("id", "=", conversationId)
256
380
  .where("org_id", "=", orgId)
257
381
  .where("account_id", "=", viewerAccountId)
382
+ .where("deleted_at", "is", null)
258
383
  // Hidden eval replay conversations (kind 'eval') are not reachable here (only the trajectory
259
384
  // viewer shows them); a sub-agent's conversation is, for its owner (sub-agents spec §6.1)
260
385
  .where("kind", "in", ["chat", "subagent"])
@@ -284,10 +409,13 @@ let ConversationsService = class ConversationsService {
284
409
  let q = this.db
285
410
  .selectFrom("conversations")
286
411
  .select(COLUMNS)
412
+ .select(activitySql("conversations").as("activity"))
287
413
  .where("org_id", "=", orgId)
288
414
  .where("account_id", "=", accountId)
289
415
  // 评测回放的隐藏对话(kind = 'eval')不在「我的对话」里
290
416
  .where("kind", "=", "chat")
417
+ .where("deleted_at", "is", null)
418
+ .where("archived_at", opts.archived === true ? "is not" : "is", null)
291
419
  .where((eb) => eb.exists(eb
292
420
  .selectFrom("agents")
293
421
  .select(sql `1`.as("one"))
@@ -299,6 +427,12 @@ let ConversationsService = class ConversationsService {
299
427
  .limit(opts.limit);
300
428
  if (opts.agentId !== undefined)
301
429
  q = q.where("agent_id", "=", opts.agentId);
430
+ if (opts.q !== undefined) {
431
+ q = q.where(sql `conversations.title ILIKE ${`%${escapeLike(opts.q)}%`} ESCAPE '\\'`);
432
+ }
433
+ if (opts.state !== undefined) {
434
+ q = q.where(sql `${activitySql("conversations")} = ${opts.state}`);
435
+ }
302
436
  if (opts.after !== undefined) {
303
437
  const after = opts.after;
304
438
  q = q.where((eb) => sql `(${eb.ref("updated_at")}, ${eb.ref("id")}) < (
@@ -322,6 +456,11 @@ let ConversationsService = class ConversationsService {
322
456
  .where("agents.org_id", "=", orgId)
323
457
  .where("agents.deleted_at", "is", null)
324
458
  .where(visibleTo(accountId));
459
+ const archivedFilter = opts.archived === true ? sql `c.archived_at IS NOT NULL` : sql `c.archived_at IS NULL`;
460
+ const searchFilter = opts.q === undefined
461
+ ? sql ``
462
+ : sql `AND c.title ILIKE ${`%${escapeLike(opts.q)}%`} ESCAPE '\\'`;
463
+ const stateFilter = opts.state === undefined ? sql `` : sql `AND ${activitySql("c")} = ${opts.state}`;
325
464
  const cursor = opts.after === undefined
326
465
  ? sql ``
327
466
  : sql `WHERE (g.latest_at, g.agent_id) < (
@@ -332,6 +471,7 @@ let ConversationsService = class ConversationsService {
332
471
  SELECT c.agent_id, max(c.updated_at) AS latest_at
333
472
  FROM capybara.conversations c
334
473
  WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
474
+ AND c.deleted_at IS NULL AND ${archivedFilter} ${searchFilter} ${stateFilter}
335
475
  AND c.agent_id IN ${visibleAgents}
336
476
  GROUP BY c.agent_id
337
477
  ), page AS (
@@ -342,15 +482,18 @@ let ConversationsService = class ConversationsService {
342
482
  )
343
483
  SELECT page.agent_id, page.latest_at, v.definition ->> 'name' AS agent_name,
344
484
  cs.id, cs.org_id, cs.account_id, cs.title, cs.title_source, cs.selection, cs.last_seq,
345
- cs.created_at, cs.updated_at, cs.parent_conversation_id, cs.subagent_type
485
+ cs.created_at, cs.updated_at, cs.parent_conversation_id, cs.subagent_type,
486
+ cs.archived_at, cs.environment_id, cs.activity
346
487
  FROM page
347
488
  JOIN capybara.agents a ON a.id = page.agent_id
348
489
  JOIN capybara.agent_versions v ON v.agent_id = a.id AND v.version = a.current_version
349
490
  CROSS JOIN LATERAL (
350
491
  SELECT c.id, c.org_id, c.account_id, c.title, c.title_source, c.selection, c.last_seq,
351
- c.created_at, c.updated_at, c.parent_conversation_id, c.subagent_type
492
+ c.created_at, c.updated_at, c.parent_conversation_id, c.subagent_type,
493
+ c.archived_at, c.environment_id, ${activitySql("c")} AS activity
352
494
  FROM capybara.conversations c
353
495
  WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
496
+ AND c.deleted_at IS NULL AND ${archivedFilter} ${searchFilter} ${stateFilter}
354
497
  AND c.agent_id = page.agent_id
355
498
  ORDER BY c.updated_at DESC, c.id DESC
356
499
  LIMIT ${opts.perGroup + 1}
@@ -377,7 +520,14 @@ let ConversationsService = class ConversationsService {
377
520
  }
378
521
  const page = groups.slice(0, opts.limit);
379
522
  const next = groups.length > opts.limit ? (page.at(-1)?.agent.id ?? null) : null;
380
- return { groups: page, next };
523
+ // The archived entry's count ignores `q` and `state`
524
+ const counted = await sql `
525
+ SELECT count(*) AS n FROM capybara.conversations c
526
+ WHERE c.org_id = ${orgId} AND c.account_id = ${accountId} AND c.kind = 'chat'
527
+ AND c.deleted_at IS NULL AND c.archived_at IS NOT NULL
528
+ AND c.agent_id IN ${visibleAgents}
529
+ `.execute(this.db.db);
530
+ return { groups: page, next, archivedCount: Number(counted.rows[0]?.n ?? 0) };
381
531
  }
382
532
  /**
383
533
  * The sub-agents of a conversation, newest first (sub-agents spec §14.3); owner only, as
@@ -459,26 +609,38 @@ let ConversationsService = class ConversationsService {
459
609
  return { subagents, next };
460
610
  }
461
611
  /**
462
- * A conversation's token usage: its own `usage` events (compaction included) plus those of its
463
- * sub-agents (sub-agents spec §8.3), whose logs keep their own. Owner only, as {@link get}.
612
+ * The agent tree of a root conversation (agent map spec §8, §9.2): the root and every sub-agent
613
+ * below it with status, model, time, tokens and tool calls. Owner only, as {@link isAccessible};
614
+ * a sub-agent's id (not a root) is `conversation.not_found` too.
615
+ */
616
+ async agentTree(orgId, conversationId, viewerAccountId) {
617
+ if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
618
+ throw notFound();
619
+ const root = await readAgentTree(this.db.db, orgId, conversationId);
620
+ if (!root)
621
+ throw notFound();
622
+ return { root };
623
+ }
624
+ /**
625
+ * A conversation's token usage: its own `usage` events (compaction included) plus those of every
626
+ * sub-agent below it, at any depth (sub-agents spec §8.3, agent map spec §6: every descendant
627
+ * counts toward the root; `conversationTree`), whose logs keep their own. Owner only, as
628
+ * {@link get}.
464
629
  */
465
630
  async usage(orgId, conversationId, viewerAccountId) {
466
631
  if (!(await this.isAccessible(orgId, conversationId, viewerAccountId)))
467
632
  throw notFound();
468
- const { rows } = await sql `${usageSums(sql `e.conversation_id IN (
469
- SELECT ${conversationId}::text
470
- UNION ALL
471
- SELECT c.id FROM capybara.conversations c
472
- WHERE c.parent_conversation_id = ${conversationId} AND c.kind = 'subagent'
473
- )`)}`.execute(this.db.db);
633
+ const ids = (await conversationTree(this.db.db, conversationId)).map((c) => c.id);
634
+ const { rows } = await sql `${usageSums(sql `e.conversation_id IN (${sql.join(ids.length > 0 ? ids : [conversationId])})`)}`.execute(this.db.db);
474
635
  const row = rows[0];
475
636
  return row
476
637
  ? toUsage(row)
477
638
  : { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };
478
639
  }
479
640
  /**
480
- * The conversation whose sandbox `conversationId` works in: a sub-agent's is its parent's
481
- * (sub-agents spec §10.1), any other its own. Call only after an access check.
641
+ * The conversation whose sandbox `conversationId` works in: a sub-agent's is its root
642
+ * conversation's at any depth (sub-agents spec §10.1, agent map spec §6), any other its own. Call
643
+ * only after an access check.
482
644
  */
483
645
  async sandboxConversationOf(orgId, conversationId) {
484
646
  const row = await this.db
@@ -487,7 +649,9 @@ let ConversationsService = class ConversationsService {
487
649
  .where("id", "=", conversationId)
488
650
  .where("org_id", "=", orgId)
489
651
  .executeTakeFirst();
490
- return row?.parent_conversation_id ?? conversationId;
652
+ if (!row?.parent_conversation_id)
653
+ return conversationId;
654
+ return rootConversationOf(this.db.db, row.parent_conversation_id);
491
655
  }
492
656
  /** 读事件(先做 `get` 的可见性判定);顺带不阻塞地 {@link kickRun}。 */
493
657
  async listEvents(orgId, conversationId, viewerAccountId, afterSeq, limit) {
@@ -495,6 +659,16 @@ let ConversationsService = class ConversationsService {
495
659
  this.kickRun(conversationId);
496
660
  return this.eventLog.readAfter(conversationId, afterSeq, limit);
497
661
  }
662
+ /**
663
+ * The turn-aligned page of events before `beforeSeq` (`null`: the log's last page), with how
664
+ * many runs started before it ({@link EventLog.readTurnPageBefore}; history paging spec §2).
665
+ * Visibility as {@link get}; kicks a stalled run as {@link listEvents} does.
666
+ */
667
+ async listEventsBefore(orgId, conversationId, viewerAccountId, beforeSeq, limit) {
668
+ await this.get(orgId, conversationId, viewerAccountId);
669
+ this.kickRun(conversationId);
670
+ return this.eventLog.readTurnPageBefore(conversationId, beforeSeq, limit, EVENTS_TURN_EXTEND);
671
+ }
498
672
  /**
499
673
  * 追加一条用户消息;带 `clientMessageId` 时重复提交返回同一事件。写入后调用 `ensureRun`:
500
674
  * 没有进行中的运行时投递一轮;运行中则由当前运行在步骤间隙吸收,或在它结束时再次 `ensureRun`。
@@ -544,6 +718,15 @@ let ConversationsService = class ConversationsService {
544
718
  this.userMessage(accountId, input, extra, [], invoked),
545
719
  ]);
546
720
  }
721
+ // The message is written: it brings an archived conversation back into the default lists
722
+ if (conv.archivedAt !== null) {
723
+ await this.db
724
+ .updateTable("conversations")
725
+ .set({ archived_at: null })
726
+ .where("id", "=", conversationId)
727
+ .execute();
728
+ await this.eventLog.publishChanged(conversationId, "archived");
729
+ }
547
730
  await this.runs.ensureRun(conversationId);
548
731
  return event;
549
732
  }
@@ -551,7 +734,8 @@ let ConversationsService = class ConversationsService {
551
734
  // its own transaction: the caller notifies and publishes after the commit
552
735
  async postIn(orgId, conversationId, accountId, input, next, extra, invoked) {
553
736
  const blocks = await this.bindIn(orgId, conversationId, accountId, input.files ?? []);
554
- return this.writeMessage(conversationId, accountId, input, next, extra, blocks, invoked);
737
+ const written = await this.writeMessage(conversationId, accountId, input, next, extra, blocks, invoked);
738
+ return written.at(-1);
555
739
  }
556
740
  /**
557
741
  * The selection a message switches to, or null when it changes nothing. A model equal to the
@@ -591,7 +775,8 @@ let ConversationsService = class ConversationsService {
591
775
  }
592
776
  /**
593
777
  * Writes the message (preceded by its `model_switched` when it switches) inside `t` and updates
594
- * `conversations.selection`; returns the `user_message` event. The caller notifies after commit.
778
+ * `conversations.selection`; returns the events written, in seq order (the `user_message`
779
+ * last). The caller notifies after commit.
595
780
  */
596
781
  async writeMessage(conversationId, accountId, input, next, extra, blocks, invoked) {
597
782
  const events = [];
@@ -616,7 +801,7 @@ let ConversationsService = class ConversationsService {
616
801
  .where("id", "=", conversationId)
617
802
  .execute();
618
803
  }
619
- return written.at(-1);
804
+ return written;
620
805
  }
621
806
  /**
622
807
  * Renders the message's skill invocation (phase D), or undefined when it has none. Resolved
@@ -688,9 +873,26 @@ let ConversationsService = class ConversationsService {
688
873
  * 中止会话当前的运行(queued / running / waiting):返回 runId;没有 → `run.not_active`。
689
874
  * 等人处理的运行没有 worker:直接取消等待并写终态。其余经 Redis 广播,运行所在的任意副本都会收到;
690
875
  * 运行已是孤儿(没有任何 worker 在执行)时直接写终态。
876
+ *
877
+ * A root conversation's stop stops only its own run: its background sub-agents keep working
878
+ * (agent map spec §6). A sub-agent's conversation (its owner, from the agent map) stops that
879
+ * sub-agent with every descendant (`RunControl.stopTree`); `run.not_active` when nothing in that
880
+ * subtree runs, else the sub-agent's latest run id.
691
881
  */
692
882
  async abort(orgId, conversationId, accountId) {
693
- await this.get(orgId, conversationId, accountId);
883
+ const conv = await this.get(orgId, conversationId, accountId);
884
+ if (conv.parentConversationId !== null) {
885
+ const latest = await this.db
886
+ .selectFrom("runs")
887
+ .select("id")
888
+ .where("conversation_id", "=", conversationId)
889
+ .orderBy("created_at", "desc")
890
+ .executeTakeFirst();
891
+ const n = await this.runs.stopTree(conversationId, accountId);
892
+ if (n === 0 || !latest)
893
+ throw new ApiError("run.not_active", "No active run to abort");
894
+ return latest.id;
895
+ }
694
896
  const run = await this.db
695
897
  .selectFrom("runs")
696
898
  .select(["id", "status"])
@@ -718,6 +920,9 @@ let ConversationsService = class ConversationsService {
718
920
  __decorate([
719
921
  Transactional({ propagation: "requires_new" })
720
922
  ], ConversationsService.prototype, "createIn", null);
923
+ __decorate([
924
+ Transactional()
925
+ ], ConversationsService.prototype, "markDeleted", null);
721
926
  __decorate([
722
927
  Transactional({ propagation: "requires_new" })
723
928
  ], ConversationsService.prototype, "postIn", null);
@@ -739,6 +944,8 @@ ConversationsService = __decorate([
739
944
  __param(7, Inject(ConnectorContent)),
740
945
  __param(8, Inject(AttachmentsService)),
741
946
  __param(9, Inject(SkillInvoker)),
742
- __param(10, Inject(TransactionHost))
947
+ __param(10, Inject(BackgroundTaskStopper)),
948
+ __param(11, Inject(ConversationEnvironments)),
949
+ __param(12, Inject(TransactionHost))
743
950
  ], ConversationsService);
744
951
  export { ConversationsService };
@@ -0,0 +1,24 @@
1
+ import { EnvironmentsService, type EnvironmentView } from "../environments/environments.service.js";
2
+ import { KernelDb } from "../infra/database/kernel-db.js";
3
+ import { ConversationAccess } from "./access.js";
4
+ import { ConversationsService } from "./conversations.service.js";
5
+ /**
6
+ * The environment a conversation works in, for its page (environments spec §9: shown read only):
7
+ * a conversation the viewer may not see → `conversation.not_found`. A sub-agent shows its root
8
+ * conversation's environment. Null while the conversation is unbound, or when its environment is
9
+ * deleted or no longer its owner's (its sandbox tools then fail).
10
+ */
11
+ export declare class ConversationEnvironmentStatus {
12
+ /** Who may see the conversation (the rule of its event stream). */
13
+ private readonly access;
14
+ /** The conversation whose environment it works in: a sub-agent's root, else itself. */
15
+ private readonly conversations;
16
+ private readonly environments;
17
+ private readonly db;
18
+ constructor(
19
+ /** Who may see the conversation (the rule of its event stream). */
20
+ access: Pick<ConversationAccess, "isAccessible">,
21
+ /** The conversation whose environment it works in: a sub-agent's root, else itself. */
22
+ conversations: Pick<ConversationsService, "sandboxConversationOf">, environments: Pick<EnvironmentsService, "get">, db: KernelDb);
23
+ get(orgId: string, conversationId: string, viewerAccountId: string): Promise<EnvironmentView | null>;
24
+ }
@@ -0,0 +1,71 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { EnvironmentsService } from "../environments/environments.service.js";
12
+ import { ApiError } from "../errors.js";
13
+ import { KernelDb } from "../infra/database/kernel-db.js";
14
+ import { UUID_RE } from "../ui/registry.js";
15
+ import { ConversationAccess } from "./access.js";
16
+ import { ConversationsService } from "./conversations.service.js";
17
+ /**
18
+ * The environment a conversation works in, for its page (environments spec §9: shown read only):
19
+ * a conversation the viewer may not see → `conversation.not_found`. A sub-agent shows its root
20
+ * conversation's environment. Null while the conversation is unbound, or when its environment is
21
+ * deleted or no longer its owner's (its sandbox tools then fail).
22
+ */
23
+ let ConversationEnvironmentStatus = class ConversationEnvironmentStatus {
24
+ access;
25
+ conversations;
26
+ environments;
27
+ db;
28
+ constructor(
29
+ /** Who may see the conversation (the rule of its event stream). */
30
+ access,
31
+ /** The conversation whose environment it works in: a sub-agent's root, else itself. */
32
+ conversations, environments, db) {
33
+ this.access = access;
34
+ this.conversations = conversations;
35
+ this.environments = environments;
36
+ this.db = db;
37
+ }
38
+ async get(orgId, conversationId, viewerAccountId) {
39
+ if (!UUID_RE.test(conversationId) ||
40
+ !(await this.access.isAccessible(orgId, conversationId, viewerAccountId))) {
41
+ throw new ApiError("conversation.not_found", "Conversation not found");
42
+ }
43
+ // a sub-agent works in its root conversation's environment (at every depth)
44
+ const root = await this.conversations.sandboxConversationOf(orgId, conversationId);
45
+ const conv = await this.db
46
+ .selectFrom("conversations")
47
+ .select(["account_id", "environment_id"])
48
+ .where("id", "=", root)
49
+ .where("org_id", "=", orgId)
50
+ .executeTakeFirst();
51
+ if (!conv?.environment_id)
52
+ return null;
53
+ try {
54
+ // the environment as its owner sees it (only the owner may use a personal environment)
55
+ return await this.environments.get(orgId, conv.account_id, conv.environment_id);
56
+ }
57
+ catch (e) {
58
+ if (e instanceof ApiError && e.code === "environment.not_found")
59
+ return null;
60
+ throw e;
61
+ }
62
+ }
63
+ };
64
+ ConversationEnvironmentStatus = __decorate([
65
+ Injectable(),
66
+ __param(0, Inject(ConversationAccess)),
67
+ __param(1, Inject(ConversationsService)),
68
+ __param(2, Inject(EnvironmentsService)),
69
+ __param(3, Inject(KernelDb))
70
+ ], ConversationEnvironmentStatus);
71
+ export { ConversationEnvironmentStatus };