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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +51 -14
  3. package/dist/admin/admin.controller.js +60 -19
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +54 -23
  19. package/dist/agents/agents.service.js +180 -76
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/models.controller.d.ts +34 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +176 -0
  29. package/dist/agents/org-templates.js +827 -0
  30. package/dist/agents/pending-connector-requests.d.ts +77 -0
  31. package/dist/agents/pending-connector-requests.js +215 -0
  32. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  33. package/dist/agents/pending-connectors.controller.js +91 -0
  34. package/dist/agents/pending-connectors.service.d.ts +62 -0
  35. package/dist/agents/pending-connectors.service.js +282 -0
  36. package/dist/agents/readiness.controller.d.ts +5 -5
  37. package/dist/agents/readiness.controller.js +6 -6
  38. package/dist/agents/templates.controller.d.ts +86 -5
  39. package/dist/agents/templates.controller.js +171 -7
  40. package/dist/agents/templates.d.ts +127 -23
  41. package/dist/agents/templates.js +475 -52
  42. package/dist/background/background.module.js +8 -1
  43. package/dist/background/finish.d.ts +3 -2
  44. package/dist/background/launch-lock.d.ts +4 -3
  45. package/dist/background/launch-lock.js +4 -3
  46. package/dist/background/poll.job.d.ts +9 -6
  47. package/dist/background/poll.job.js +30 -22
  48. package/dist/background/session.d.ts +13 -2
  49. package/dist/background/session.js +13 -0
  50. package/dist/background/stop.d.ts +12 -6
  51. package/dist/background/stop.js +57 -39
  52. package/dist/background/store.d.ts +18 -6
  53. package/dist/background/store.js +12 -6
  54. package/dist/background/tasks.service.d.ts +15 -5
  55. package/dist/background/tasks.service.js +42 -17
  56. package/dist/background/wake-rules.d.ts +27 -18
  57. package/dist/background/wake-rules.js +52 -22
  58. package/dist/background/wake.d.ts +13 -11
  59. package/dist/background/wake.js +20 -14
  60. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  61. package/dist/catalog/admin-catalog.controller.js +213 -42
  62. package/dist/catalog/catalog-content.d.ts +58 -32
  63. package/dist/catalog/catalog-content.js +34 -8
  64. package/dist/catalog/catalog-import.module.d.ts +7 -0
  65. package/dist/catalog/catalog-import.module.js +60 -0
  66. package/dist/catalog/catalog-items.d.ts +111 -7
  67. package/dist/catalog/catalog-items.js +279 -13
  68. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  69. package/dist/catalog/catalog-scope.service.js +1116 -0
  70. package/dist/catalog/catalog.module.d.ts +7 -9
  71. package/dist/catalog/catalog.module.js +41 -31
  72. package/dist/catalog/catalog.service.d.ts +101 -29
  73. package/dist/catalog/catalog.service.js +104 -106
  74. package/dist/catalog/cli.d.ts +11 -1
  75. package/dist/catalog/cli.js +26 -1
  76. package/dist/catalog/component-promotion.d.ts +96 -0
  77. package/dist/catalog/component-promotion.js +395 -0
  78. package/dist/catalog/component-scope.controller.d.ts +152 -0
  79. package/dist/catalog/component-scope.controller.js +287 -0
  80. package/dist/catalog/component-scope.service.d.ts +303 -0
  81. package/dist/catalog/component-scope.service.js +936 -0
  82. package/dist/catalog/component-state.d.ts +174 -0
  83. package/dist/catalog/component-state.js +437 -0
  84. package/dist/catalog/job-ids.d.ts +30 -0
  85. package/dist/catalog/job-ids.js +25 -0
  86. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  87. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  88. package/dist/catalog/marketplaces.controller.js +56 -7
  89. package/dist/catalog/marketplaces.service.d.ts +54 -14
  90. package/dist/catalog/marketplaces.service.js +71 -22
  91. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  92. package/dist/catalog/org-catalog.controller.js +181 -65
  93. package/dist/catalog/org-catalog.service.d.ts +65 -33
  94. package/dist/catalog/org-catalog.service.js +324 -157
  95. package/dist/catalog/org-extension-switch.d.ts +41 -0
  96. package/dist/catalog/org-extension-switch.js +115 -0
  97. package/dist/catalog/org-extension.controller.d.ts +119 -0
  98. package/dist/catalog/org-extension.controller.js +266 -0
  99. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  100. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  101. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  102. package/dist/catalog/org-plugin-uploads.js +116 -0
  103. package/dist/catalog/owned-items.d.ts +184 -0
  104. package/dist/catalog/owned-items.js +789 -0
  105. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  106. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  107. package/dist/catalog/ownership.d.ts +172 -0
  108. package/dist/catalog/ownership.js +326 -0
  109. package/dist/catalog/platform-components.d.ts +221 -0
  110. package/dist/catalog/platform-components.js +761 -0
  111. package/dist/catalog/platform-migration.d.ts +115 -0
  112. package/dist/catalog/platform-migration.js +582 -0
  113. package/dist/catalog/plugin-import.d.ts +178 -34
  114. package/dist/catalog/plugin-import.js +622 -82
  115. package/dist/catalog/plugin-install.d.ts +185 -41
  116. package/dist/catalog/plugin-install.js +758 -126
  117. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  118. package/dist/catalog/plugin-upgrade.js +1147 -1136
  119. package/dist/catalog/request-rules.d.ts +65 -0
  120. package/dist/catalog/request-rules.js +217 -0
  121. package/dist/catalog/requests.service.d.ts +193 -118
  122. package/dist/catalog/requests.service.js +526 -343
  123. package/dist/catalog/reserved-names.d.ts +8 -0
  124. package/dist/catalog/reserved-names.js +42 -0
  125. package/dist/catalog/scope-orgs.d.ts +21 -0
  126. package/dist/catalog/scope-orgs.js +67 -0
  127. package/dist/catalog/scope-state.d.ts +35 -0
  128. package/dist/catalog/scope-state.js +87 -0
  129. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  130. package/dist/catalog/scope-sync-workers.js +29 -0
  131. package/dist/catalog/scope-sync.d.ts +176 -0
  132. package/dist/catalog/scope-sync.js +576 -0
  133. package/dist/catalog/scope.d.ts +42 -0
  134. package/dist/catalog/scope.js +42 -0
  135. package/dist/catalog/unshare.d.ts +22 -0
  136. package/dist/catalog/unshare.js +118 -0
  137. package/dist/channels/actions.js +1 -0
  138. package/dist/channels/cards.js +20 -2
  139. package/dist/channels/channels.module.js +2 -0
  140. package/dist/channels/inbound.d.ts +9 -1
  141. package/dist/channels/inbound.js +67 -5
  142. package/dist/channels/phrases.d.ts +35 -0
  143. package/dist/channels/phrases.js +29 -0
  144. package/dist/config/docs.js +3 -1
  145. package/dist/config/schema.d.ts +10 -2
  146. package/dist/config/schema.js +70 -22
  147. package/dist/conversations/access.d.ts +6 -4
  148. package/dist/conversations/access.js +27 -5
  149. package/dist/conversations/agent-tree.d.ts +46 -0
  150. package/dist/conversations/agent-tree.js +92 -0
  151. package/dist/conversations/conversations.controller.d.ts +43 -18
  152. package/dist/conversations/conversations.controller.js +79 -38
  153. package/dist/conversations/conversations.module.d.ts +1 -1
  154. package/dist/conversations/conversations.module.js +7 -7
  155. package/dist/conversations/conversations.service.d.ts +73 -15
  156. package/dist/conversations/conversations.service.js +115 -35
  157. package/dist/conversations/environment-status.d.ts +24 -0
  158. package/dist/conversations/environment-status.js +71 -0
  159. package/dist/conversations/event-log.d.ts +20 -5
  160. package/dist/conversations/event-log.js +60 -0
  161. package/dist/conversations/events.d.ts +84 -2
  162. package/dist/conversations/events.js +91 -17
  163. package/dist/conversations/queue.service.d.ts +1 -1
  164. package/dist/conversations/queue.service.js +5 -0
  165. package/dist/conversations/titles.d.ts +5 -3
  166. package/dist/conversations/titles.js +21 -8
  167. package/dist/conversations/tree.d.ts +17 -0
  168. package/dist/conversations/tree.js +42 -0
  169. package/dist/ctx/create-ctx.d.ts +20 -1
  170. package/dist/ctx/create-ctx.js +38 -7
  171. package/dist/db/kernel-schema.d.ts +386 -18
  172. package/dist/environments/access.d.ts +41 -0
  173. package/dist/environments/access.js +77 -0
  174. package/dist/environments/conversation-environments.d.ts +61 -0
  175. package/dist/environments/conversation-environments.js +170 -0
  176. package/dist/environments/dto.d.ts +25 -0
  177. package/dist/environments/dto.js +12 -0
  178. package/dist/environments/environments.controller.d.ts +33 -0
  179. package/dist/environments/environments.controller.js +110 -0
  180. package/dist/environments/environments.module.d.ts +8 -0
  181. package/dist/environments/environments.module.js +27 -0
  182. package/dist/environments/environments.service.d.ts +153 -0
  183. package/dist/environments/environments.service.js +541 -0
  184. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  185. package/dist/environments/legacy-cleanup.job.js +141 -0
  186. package/dist/errors.d.ts +85 -2
  187. package/dist/errors.js +85 -2
  188. package/dist/evals/reconstruct.d.ts +18 -9
  189. package/dist/evals/reconstruct.js +26 -7
  190. package/dist/evals/run-replay.d.ts +4 -2
  191. package/dist/evals/run-replay.js +20 -6
  192. package/dist/evals/runs.service.d.ts +2 -1
  193. package/dist/evals/runs.service.js +13 -12
  194. package/dist/evals/step-replay.d.ts +4 -6
  195. package/dist/evals/step-replay.js +4 -3
  196. package/dist/evals/trajectory.service.d.ts +8 -3
  197. package/dist/evals/trajectory.service.js +26 -14
  198. package/dist/evals/worker.d.ts +5 -5
  199. package/dist/evals/worker.js +9 -3
  200. package/dist/extensions/admin-ops.d.ts +36 -10
  201. package/dist/extensions/admin-ops.js +65 -42
  202. package/dist/extensions/admin-view.d.ts +37 -10
  203. package/dist/extensions/admin-view.js +103 -20
  204. package/dist/extensions/bootstrap.d.ts +17 -4
  205. package/dist/extensions/bootstrap.js +70 -9
  206. package/dist/extensions/cli.d.ts +12 -0
  207. package/dist/extensions/cli.js +11 -2
  208. package/dist/extensions/config-hash.d.ts +10 -0
  209. package/dist/extensions/config-hash.js +38 -0
  210. package/dist/extensions/deployment-config.d.ts +28 -5
  211. package/dist/extensions/deployment-config.js +48 -7
  212. package/dist/extensions/effective-config.d.ts +127 -0
  213. package/dist/extensions/effective-config.js +368 -0
  214. package/dist/extensions/extensions.module.js +11 -11
  215. package/dist/extensions/hooks.d.ts +37 -4
  216. package/dist/extensions/hooks.js +82 -16
  217. package/dist/extensions/host.d.ts +24 -10
  218. package/dist/extensions/host.js +49 -54
  219. package/dist/extensions/installs.d.ts +20 -8
  220. package/dist/extensions/installs.js +37 -15
  221. package/dist/extensions/org-config.d.ts +75 -6
  222. package/dist/extensions/org-config.js +184 -32
  223. package/dist/extensions/org-levels.d.ts +37 -0
  224. package/dist/extensions/org-levels.js +71 -0
  225. package/dist/extensions/org-overrides.d.ts +151 -0
  226. package/dist/extensions/org-overrides.js +524 -0
  227. package/dist/extensions/permission-view.d.ts +16 -4
  228. package/dist/extensions/permission-view.js +4 -4
  229. package/dist/extensions/plugin-items.d.ts +21 -0
  230. package/dist/extensions/plugin-items.js +42 -0
  231. package/dist/extensions/point-defaults.d.ts +12 -5
  232. package/dist/extensions/point-defaults.js +37 -9
  233. package/dist/extensions/resolve.d.ts +5 -1
  234. package/dist/extensions/resolve.js +15 -2
  235. package/dist/extensions/state.module.d.ts +9 -0
  236. package/dist/extensions/state.module.js +38 -0
  237. package/dist/files/previewers.d.ts +8 -1
  238. package/dist/files/previewers.js +35 -6
  239. package/dist/http/api.module.js +25 -3
  240. package/dist/http/app.d.ts +11 -2
  241. package/dist/http/app.js +31 -5
  242. package/dist/http/plugin-dispatch.d.ts +4 -1
  243. package/dist/http/plugin-dispatch.js +14 -2
  244. package/dist/identity/accounts.d.ts +29 -29
  245. package/dist/identity/accounts.js +47 -47
  246. package/dist/identity/audit.d.ts +2 -1
  247. package/dist/identity/auth.guard.d.ts +13 -5
  248. package/dist/identity/auth.guard.js +26 -9
  249. package/dist/identity/identity.module.d.ts +1 -1
  250. package/dist/identity/identity.module.js +4 -4
  251. package/dist/identity/me.controller.js +1 -1
  252. package/dist/identity/principal.d.ts +3 -3
  253. package/dist/identity/principal.js +3 -3
  254. package/dist/identity/settings.d.ts +22 -11
  255. package/dist/identity/settings.js +53 -18
  256. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  257. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  258. package/dist/inbox/inbox.module.d.ts +4 -1
  259. package/dist/inbox/inbox.module.js +7 -3
  260. package/dist/inbox/inbox.service.d.ts +62 -3
  261. package/dist/inbox/inbox.service.js +74 -4
  262. package/dist/inbox/org-notices.d.ts +63 -0
  263. package/dist/inbox/org-notices.js +91 -0
  264. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  265. package/dist/inbox/platform-inbox.controller.js +58 -0
  266. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  267. package/dist/inbox/platform-inbox.service.js +263 -0
  268. package/dist/inbox/platform-notices.d.ts +19 -0
  269. package/dist/inbox/platform-notices.js +9 -0
  270. package/dist/index.d.ts +1 -1
  271. package/dist/index.js +1 -1
  272. package/dist/infra/cli/kernel-cli.module.js +9 -1
  273. package/dist/infra/config/kernel-config.service.js +24 -1
  274. package/dist/infra/database/xact-lock.d.ts +1 -1
  275. package/dist/infra/database/xact-lock.js +1 -1
  276. package/dist/infra/events/kernel-events.d.ts +19 -2
  277. package/dist/infra/queue/add-job-once.d.ts +14 -0
  278. package/dist/infra/queue/add-job-once.js +16 -0
  279. package/dist/kernel.module.js +6 -0
  280. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  281. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  282. package/dist/models/embeddings.d.ts +82 -0
  283. package/dist/models/embeddings.js +326 -0
  284. package/dist/models/enablement.controller.d.ts +40 -0
  285. package/dist/models/enablement.controller.js +74 -0
  286. package/dist/models/enablement.d.ts +99 -0
  287. package/dist/models/enablement.js +263 -0
  288. package/dist/models/models.module.d.ts +5 -1
  289. package/dist/models/models.module.js +16 -4
  290. package/dist/models/prices.d.ts +5 -5
  291. package/dist/models/prices.js +4 -4
  292. package/dist/models/purposes.controller.d.ts +6 -4
  293. package/dist/models/purposes.controller.js +13 -7
  294. package/dist/models/purposes.d.ts +37 -12
  295. package/dist/models/purposes.js +63 -17
  296. package/dist/orgs/directory-sync.d.ts +14 -5
  297. package/dist/orgs/directory-sync.js +41 -17
  298. package/dist/orgs/offboarding.d.ts +9 -7
  299. package/dist/orgs/offboarding.js +28 -17
  300. package/dist/orgs/org-lock.d.ts +5 -0
  301. package/dist/orgs/org-lock.js +13 -0
  302. package/dist/orgs/org.guard.d.ts +10 -0
  303. package/dist/orgs/org.guard.js +43 -32
  304. package/dist/orgs/orgs.module.js +3 -0
  305. package/dist/orgs/orgs.service.d.ts +20 -7
  306. package/dist/orgs/orgs.service.js +32 -12
  307. package/dist/orgs/roles.d.ts +1 -1
  308. package/dist/orgs/roles.js +5 -1
  309. package/dist/orgs/settings.controller.d.ts +1 -1
  310. package/dist/orgs/settings.service.d.ts +15 -3
  311. package/dist/orgs/settings.service.js +6 -2
  312. package/dist/overrides.d.ts +3 -0
  313. package/dist/overrides.js +2 -0
  314. package/dist/platform/actor.d.ts +48 -0
  315. package/dist/platform/actor.js +100 -0
  316. package/dist/platform/agent-docs.d.ts +18 -0
  317. package/dist/platform/agent-docs.js +59 -0
  318. package/dist/platform/availability.d.ts +14 -0
  319. package/dist/platform/availability.js +43 -0
  320. package/dist/platform/errors.d.ts +11 -0
  321. package/dist/platform/errors.js +26 -0
  322. package/dist/platform/exclusions.d.ts +12 -0
  323. package/dist/platform/exclusions.js +1405 -0
  324. package/dist/platform/method.d.ts +6 -0
  325. package/dist/platform/method.js +15 -0
  326. package/dist/platform/operation.d.ts +92 -0
  327. package/dist/platform/operation.js +35 -0
  328. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  329. package/dist/platform/ops/agent-templates.ops.js +92 -0
  330. package/dist/platform/ops/agents.ops.d.ts +19 -0
  331. package/dist/platform/ops/agents.ops.js +294 -0
  332. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  333. package/dist/platform/ops/connectors.ops.js +126 -0
  334. package/dist/platform/ops/errors.d.ts +11 -0
  335. package/dist/platform/ops/errors.js +22 -0
  336. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  337. package/dist/platform/ops/extensions.ops.js +116 -0
  338. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  339. package/dist/platform/ops/marketplaces.ops.js +157 -0
  340. package/dist/platform/ops/paging.d.ts +14 -0
  341. package/dist/platform/ops/paging.js +20 -0
  342. package/dist/platform/ops/platform.ops.d.ts +23 -0
  343. package/dist/platform/ops/platform.ops.js +158 -0
  344. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  345. package/dist/platform/ops/plugins.ops.js +377 -0
  346. package/dist/platform/ops/requests.ops.d.ts +14 -0
  347. package/dist/platform/ops/requests.ops.js +153 -0
  348. package/dist/platform/ops/role.d.ts +4 -0
  349. package/dist/platform/ops/role.js +10 -0
  350. package/dist/platform/ops/skills.ops.d.ts +13 -0
  351. package/dist/platform/ops/skills.ops.js +98 -0
  352. package/dist/platform/ops/summary.d.ts +10 -0
  353. package/dist/platform/ops/summary.js +18 -0
  354. package/dist/platform/platform-ops.module.d.ts +7 -0
  355. package/dist/platform/platform-ops.module.js +55 -0
  356. package/dist/platform/platform.module.d.ts +8 -0
  357. package/dist/platform/platform.module.js +25 -0
  358. package/dist/platform/redact-orgs.d.ts +7 -0
  359. package/dist/platform/redact-orgs.js +52 -0
  360. package/dist/platform/registry.d.ts +30 -0
  361. package/dist/platform/registry.js +111 -0
  362. package/dist/roles/worker-role.d.ts +6 -4
  363. package/dist/roles/worker-role.js +14 -7
  364. package/dist/roles/worker.module.d.ts +1 -1
  365. package/dist/roles/worker.module.js +9 -1
  366. package/dist/runtime/context/build.d.ts +6 -4
  367. package/dist/runtime/context/build.js +26 -7
  368. package/dist/runtime/context/claude-tools.d.ts +2 -1
  369. package/dist/runtime/context/claude-tools.js +5 -4
  370. package/dist/runtime/context/compaction.js +9 -0
  371. package/dist/runtime/context/reminders.d.ts +2 -0
  372. package/dist/runtime/context/reminders.js +2 -0
  373. package/dist/runtime/context/skills.js +9 -2
  374. package/dist/runtime/context/tool-changes.d.ts +27 -0
  375. package/dist/runtime/context/tool-changes.js +60 -0
  376. package/dist/runtime/hook-calls.d.ts +8 -1
  377. package/dist/runtime/hook-calls.js +40 -7
  378. package/dist/runtime/langgraph-loop.d.ts +3 -1
  379. package/dist/runtime/langgraph-loop.js +35 -17
  380. package/dist/runtime/loop.d.ts +32 -4
  381. package/dist/runtime/maintenance.d.ts +7 -4
  382. package/dist/runtime/maintenance.js +23 -8
  383. package/dist/runtime/model-call.d.ts +38 -11
  384. package/dist/runtime/model-call.js +97 -24
  385. package/dist/runtime/providers.d.ts +146 -32
  386. package/dist/runtime/providers.js +321 -67
  387. package/dist/runtime/run-control.d.ts +11 -1
  388. package/dist/runtime/run-control.js +12 -0
  389. package/dist/runtime/run-drafts.d.ts +85 -0
  390. package/dist/runtime/run-drafts.js +230 -0
  391. package/dist/runtime/run-jobs.d.ts +3 -5
  392. package/dist/runtime/run-jobs.js +3 -7
  393. package/dist/runtime/run-queue.d.ts +37 -3
  394. package/dist/runtime/run-queue.js +188 -11
  395. package/dist/runtime/run-worker.d.ts +12 -6
  396. package/dist/runtime/run-worker.js +58 -35
  397. package/dist/runtime/runtime.module.js +3 -0
  398. package/dist/runtime/step-log.d.ts +9 -4
  399. package/dist/runtime/step-log.js +8 -5
  400. package/dist/runtime/stream.controller.d.ts +23 -1
  401. package/dist/runtime/stream.controller.js +60 -3
  402. package/dist/runtime/stream.d.ts +4 -1
  403. package/dist/runtime/stream.js +27 -3
  404. package/dist/runtime/subagents/child.d.ts +55 -7
  405. package/dist/runtime/subagents/child.js +105 -7
  406. package/dist/runtime/subagents/definition.d.ts +12 -3
  407. package/dist/runtime/subagents/definition.js +46 -32
  408. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  409. package/dist/runtime/subagents/deliveries.js +228 -0
  410. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  411. package/dist/runtime/subagents/dispatch.js +212 -141
  412. package/dist/runtime/subagents/limits.d.ts +24 -5
  413. package/dist/runtime/subagents/limits.js +40 -6
  414. package/dist/runtime/subagents/messages.d.ts +95 -0
  415. package/dist/runtime/subagents/messages.js +328 -0
  416. package/dist/runtime/subagents/preamble.d.ts +4 -4
  417. package/dist/runtime/subagents/preamble.js +9 -7
  418. package/dist/runtime/subagents/progress.d.ts +8 -6
  419. package/dist/runtime/subagents/progress.js +11 -6
  420. package/dist/runtime/subagents/render.d.ts +30 -0
  421. package/dist/runtime/subagents/render.js +53 -0
  422. package/dist/runtime/subagents/roster.d.ts +24 -7
  423. package/dist/runtime/subagents/roster.js +47 -11
  424. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  425. package/dist/runtime/subagents/skill-fork.js +8 -4
  426. package/dist/runtime/subagents/status.d.ts +14 -0
  427. package/dist/runtime/subagents/status.js +23 -0
  428. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  429. package/dist/runtime/subagents/subagents.service.js +11 -6
  430. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  431. package/dist/runtime/usage-report-jobs.js +158 -0
  432. package/dist/runtime/usage-report.d.ts +33 -38
  433. package/dist/runtime/usage-report.js +169 -96
  434. package/dist/runtime/waits.d.ts +140 -37
  435. package/dist/runtime/waits.js +394 -106
  436. package/dist/sandbox/jobs.d.ts +40 -13
  437. package/dist/sandbox/jobs.js +57 -20
  438. package/dist/sandbox/leases.d.ts +37 -54
  439. package/dist/sandbox/leases.js +71 -115
  440. package/dist/sandbox/providers.d.ts +2 -2
  441. package/dist/sandbox/providers.js +1 -1
  442. package/dist/sandbox/sandbox.module.d.ts +3 -2
  443. package/dist/sandbox/sandbox.module.js +4 -3
  444. package/dist/sandbox/sandbox.service.d.ts +229 -134
  445. package/dist/sandbox/sandbox.service.js +630 -409
  446. package/dist/skills/catalog.d.ts +3 -2
  447. package/dist/skills/catalog.js +21 -43
  448. package/dist/skills/changes.controller.d.ts +7 -0
  449. package/dist/skills/changes.controller.js +19 -1
  450. package/dist/skills/invoke.js +8 -3
  451. package/dist/skills/package.d.ts +20 -1
  452. package/dist/skills/package.js +28 -1
  453. package/dist/skills/skills.controller.d.ts +39 -4
  454. package/dist/skills/skills.controller.js +88 -10
  455. package/dist/skills/skills.module.js +10 -1
  456. package/dist/skills/skills.service.d.ts +106 -26
  457. package/dist/skills/skills.service.js +421 -75
  458. package/dist/skills/usable.d.ts +81 -0
  459. package/dist/skills/usable.js +379 -0
  460. package/dist/tools/approvals.service.d.ts +20 -2
  461. package/dist/tools/approvals.service.js +23 -4
  462. package/dist/tools/builtin-names.d.ts +21 -5
  463. package/dist/tools/builtin-names.js +30 -5
  464. package/dist/tools/builtins/agent.d.ts +23 -21
  465. package/dist/tools/builtins/agent.js +62 -55
  466. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  467. package/dist/tools/builtins/builtin-tools.js +37 -12
  468. package/dist/tools/builtins/handback.d.ts +28 -0
  469. package/dist/tools/builtins/handback.js +53 -0
  470. package/dist/tools/builtins/platform.d.ts +34 -0
  471. package/dist/tools/builtins/platform.js +362 -0
  472. package/dist/tools/builtins/sandbox/bash.js +13 -3
  473. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  474. package/dist/tools/builtins/sandbox/common.js +80 -45
  475. package/dist/tools/builtins/sandbox/edit.js +2 -2
  476. package/dist/tools/builtins/sandbox/glob.js +2 -2
  477. package/dist/tools/builtins/sandbox/grep.js +2 -4
  478. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  479. package/dist/tools/builtins/sandbox/index.js +1 -1
  480. package/dist/tools/builtins/sandbox/read.js +1 -1
  481. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  482. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  483. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  484. package/dist/tools/builtins/sandbox/write.js +2 -2
  485. package/dist/tools/builtins/send-message.d.ts +56 -0
  486. package/dist/tools/builtins/send-message.js +100 -0
  487. package/dist/tools/builtins/skill-load.d.ts +22 -14
  488. package/dist/tools/builtins/skill-load.js +86 -57
  489. package/dist/tools/builtins/skill-write.js +1 -1
  490. package/dist/tools/builtins/web/extract.js +5 -1
  491. package/dist/tools/builtins/web/fetch.js +1 -0
  492. package/dist/tools/builtins/web/search.js +1 -0
  493. package/dist/tools/connectors.controller.d.ts +10 -0
  494. package/dist/tools/connectors.controller.js +12 -0
  495. package/dist/tools/connectors.service.d.ts +46 -5
  496. package/dist/tools/connectors.service.js +94 -15
  497. package/dist/tools/extension-tools.controller.d.ts +14 -0
  498. package/dist/tools/extension-tools.controller.js +37 -0
  499. package/dist/tools/info.d.ts +42 -1
  500. package/dist/tools/info.js +64 -1
  501. package/dist/tools/org-tool-switches.d.ts +74 -0
  502. package/dist/tools/org-tool-switches.js +184 -0
  503. package/dist/tools/pipeline.d.ts +46 -40
  504. package/dist/tools/pipeline.js +193 -364
  505. package/dist/tools/policy.d.ts +1 -1
  506. package/dist/tools/policy.js +36 -16
  507. package/dist/tools/registry.d.ts +98 -5
  508. package/dist/tools/registry.js +87 -9
  509. package/dist/tools/tools.module.js +12 -2
  510. package/dist/ui/views.d.ts +2 -1
  511. package/dist/ui/views.js +17 -3
  512. package/package.json +3 -3
  513. package/src/migrations/0074_subagent_tree.sql +50 -0
  514. package/src/migrations/0075_plugin_scope.sql +61 -0
  515. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  516. package/src/migrations/0077_scope_requests.sql +52 -0
  517. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  518. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  519. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  520. package/src/migrations/0081_platform_components.sql +129 -0
  521. package/src/migrations/0082_platform_migration.sql +33 -0
  522. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  523. package/src/migrations/0084_org_owned_items.sql +85 -0
  524. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  525. package/src/migrations/0086_org_layering.sql +30 -0
  526. package/src/migrations/0087_approval_summary.sql +6 -0
  527. package/src/migrations/0088_environments.sql +80 -0
  528. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  529. package/dist/catalog/upgrade-targets.d.ts +0 -56
  530. package/dist/catalog/upgrade-targets.js +0 -90
  531. package/dist/conversations/sandbox-status.d.ts +0 -24
  532. package/dist/conversations/sandbox-status.js +0 -52
  533. package/dist/extensions/org-config.controller.d.ts +0 -32
  534. package/dist/extensions/org-config.controller.js +0 -70
@@ -0,0 +1,34 @@
1
+ import type { OrgSettings } from "../../orgs/settings.service.js";
2
+ import type { ActorFacts } from "../../platform/actor.js";
3
+ import type { AgentDocTopic } from "../../platform/agent-docs.js";
4
+ import type { PlatformOperations } from "../../platform/registry.js";
5
+ import type { BuiltinTool, CallPolicyContext } from "../registry.js";
6
+ /**
7
+ * The `Platform` builtin (Platform tool spec §3–§6): one tool through which an agent discovers and
8
+ * calls the platform's own operations as the run's trigger account, and reads the agent docs.
9
+ * - `browse` / `search` / `describe` / `read` only read; their policy is the tool's `allow`.
10
+ * - `call` gets a per-call policy key `Platform:<operation>` ({@link BuiltinTool.callPolicy}): a
11
+ * read runs, a write asks (remembered only for `personal`), an operation that cannot run now is
12
+ * denied with its reason. Right before `op.run` the availability is checked again on fresh facts
13
+ * (the actor may have lost the role while the confirmation waited).
14
+ * - The actor, the agent and the conversation come from the runtime context, never from input.
15
+ * - Results are JSON text; a list an operation returns is capped at {@link LIST_MAX} entries.
16
+ */
17
+ /** The most entries of a list in one result (operations that page return `next`). */
18
+ export declare const LIST_MAX = 50;
19
+ /** The tool's `unavailable` reason when the org setting `platformTool` is `off` (spec §3). */
20
+ export declare const PLATFORM_UNAVAILABLE_OFF = "The org turned the Platform tool off; ask an org admin to turn it on.";
21
+ /** What the tool needs; `BuiltinTools` passes the Nest providers. */
22
+ export interface PlatformToolDeps {
23
+ ops: Pick<PlatformOperations, "domains" | "inDomain" | "get" | "search">;
24
+ actor: {
25
+ facts(ctx: CallPolicyContext): Promise<ActorFacts>;
26
+ };
27
+ docs: {
28
+ topics(): AgentDocTopic[];
29
+ read(id: string): string | null;
30
+ };
31
+ /** The org setting `platformTool`. */
32
+ setting(orgId: string): Promise<OrgSettings["platformTool"]>;
33
+ }
34
+ export declare function platformTool(deps: PlatformToolDeps): BuiltinTool;
@@ -0,0 +1,362 @@
1
+ import { ToolError } from "@capybara-hq/plugin-sdk";
2
+ import { z } from "zod";
3
+ import { availability } from "../../platform/availability.js";
4
+ import { toToolError } from "../../platform/errors.js";
5
+ import { PLATFORM_METHOD } from "../../platform/method.js";
6
+ import { OPERATION_ID, operationDomain, } from "../../platform/operation.js";
7
+ import { BUILTIN } from "../builtin-names.js";
8
+ /**
9
+ * The `Platform` builtin (Platform tool spec §3–§6): one tool through which an agent discovers and
10
+ * calls the platform's own operations as the run's trigger account, and reads the agent docs.
11
+ * - `browse` / `search` / `describe` / `read` only read; their policy is the tool's `allow`.
12
+ * - `call` gets a per-call policy key `Platform:<operation>` ({@link BuiltinTool.callPolicy}): a
13
+ * read runs, a write asks (remembered only for `personal`), an operation that cannot run now is
14
+ * denied with its reason. Right before `op.run` the availability is checked again on fresh facts
15
+ * (the actor may have lost the role while the confirmation waited).
16
+ * - The actor, the agent and the conversation come from the runtime context, never from input.
17
+ * - Results are JSON text; a list an operation returns is capped at {@link LIST_MAX} entries.
18
+ */
19
+ /** The most entries of a list in one result (operations that page return `next`). */
20
+ export const LIST_MAX = 50;
21
+ /** The most operations `search` returns. */
22
+ const SEARCH_MAX = 20;
23
+ /** The tool's `unavailable` reason when the org setting `platformTool` is `off` (spec §3). */
24
+ export const PLATFORM_UNAVAILABLE_OFF = "The org turned the Platform tool off; ask an org admin to turn it on.";
25
+ const ACTIONS = ["browse", "search", "describe", "call", "read"];
26
+ const SPEC = {
27
+ name: BUILTIN.Platform,
28
+ description: "Discover and use the platform's own operations (skills, agents, templates, plugins, " +
29
+ "marketplaces, requests, connectors, extensions) and its documentation, as the person you are " +
30
+ 'working for. Start with action "browse", then "describe" an operation before you "call" it; ' +
31
+ 'never guess parameters. Writes ask the person to confirm. Use "read" for how-to documentation ' +
32
+ "(plugin format, skills, extension points).",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ action: {
37
+ type: "string",
38
+ enum: [...ACTIONS],
39
+ description: 'browse: the domains and the method, or one domain\'s operations with "domain"; search: ' +
40
+ 'operations matching "query"; describe: one operation\'s full definition; call: run ' +
41
+ '"operation" with "params"; read: a documentation topic, or the list of topics without ' +
42
+ '"topic".',
43
+ },
44
+ domain: {
45
+ type: "string",
46
+ maxLength: 100,
47
+ description: 'For browse: a domain id from the browse result, e.g. "skills".',
48
+ },
49
+ query: {
50
+ type: "string",
51
+ maxLength: 200,
52
+ description: "For search: words to look for in operation ids and descriptions.",
53
+ },
54
+ operation: {
55
+ type: "string",
56
+ maxLength: 100,
57
+ description: 'For describe and call: an operation id, e.g. "skills.list".',
58
+ },
59
+ params: {
60
+ type: "object",
61
+ description: "For call: the operation's input, matching the inputSchema describe returned. Pass " +
62
+ '"cursor" from a previous result\'s "next" to get the next page.',
63
+ },
64
+ topic: {
65
+ type: "string",
66
+ maxLength: 100,
67
+ description: "For read: a topic id from the topic list.",
68
+ },
69
+ },
70
+ required: ["action"],
71
+ additionalProperties: false,
72
+ },
73
+ keyArgs: ["action", "operation", "domain"],
74
+ };
75
+ const json = (value, summary) => ({
76
+ content: [{ type: "text", text: JSON.stringify(value) }],
77
+ display: { summary },
78
+ });
79
+ /** Longest model-written text quoted in a display summary (summaries are at most 200). */
80
+ const SUMMARY_QUOTE_MAX = 80;
81
+ const clip = (s) => s.length > SUMMARY_QUOTE_MAX ? `${s.slice(0, SUMMARY_QUOTE_MAX)}…` : s;
82
+ /** The first sentence of a description: the line `browse` and `search` show. */
83
+ const firstSentence = (text) => {
84
+ const m = /^(.+?[.!?])(\s|$)/s.exec(text.trim());
85
+ return (m?.[1] ?? text).trim();
86
+ };
87
+ const kindOf = (op) => op.confirm === "read" ? "read" : "write";
88
+ const availabilityFields = (a) => a.ok ? { available: true } : { available: false, reason: a.reason };
89
+ /** One operation as `browse` and `search` list it. */
90
+ const line = (op, facts) => ({
91
+ id: op.id,
92
+ description: firstSentence(op.description),
93
+ kind: kindOf(op),
94
+ ...availabilityFields(availability(op, facts)),
95
+ });
96
+ const capped = (items) => ({
97
+ items: items.slice(0, LIST_MAX),
98
+ ...(items.length > LIST_MAX && {
99
+ total: items.length,
100
+ truncated: true,
101
+ hint: "Narrow the query or pass params.cursor where the operation pages.",
102
+ }),
103
+ });
104
+ /** An operation's result as a JSON object: a bare list is capped, nothing becomes `{ ok: true }`. */
105
+ function asResult(value) {
106
+ if (Array.isArray(value))
107
+ return capped(value);
108
+ if (value === undefined || value === null)
109
+ return { ok: true };
110
+ if (typeof value !== "object")
111
+ return { result: value };
112
+ return value;
113
+ }
114
+ const unknownOperationText = (id) => `Unknown operation "${id}". Use browse or search to find an operation id, then describe it.`;
115
+ const missingText = (action, field, what) => `Action ${action} needs "${field}": pass ${what}.`;
116
+ const invalidParamsText = (id, problems) => `Invalid params for ${id}: ${problems}. Call describe with operation "${id}" for its input schema and an example, then call again.`;
117
+ const unavailableOpText = (id, reason) => `Operation ${id} is unavailable, so do not call it again as is: ${reason}`;
118
+ const outputRefText = (id) => `Operation ${id} writes, and its params hold a {"$output": ...} reference, which the person confirming would see instead of the content. Pass the content inline in params and call again.`;
119
+ /** Whether a value holds a `{"$output": …}` reference anywhere (the pipeline's form). */
120
+ function hasOutputRef(v) {
121
+ if (Array.isArray(v))
122
+ return v.some(hasOutputRef);
123
+ if (typeof v !== "object" || v === null)
124
+ return false;
125
+ const keys = Object.keys(v);
126
+ if (keys.length === 1 && keys[0] === "$output")
127
+ return true;
128
+ return Object.values(v).some(hasOutputRef);
129
+ }
130
+ /** Zod issues as one line: `path: message; …` (at most five). */
131
+ function issuesText(error) {
132
+ const parts = error.issues
133
+ .slice(0, 5)
134
+ .map((i) => `${i.path.length === 0 ? "params" : i.path.join(".")}: ${i.message}`);
135
+ if (error.issues.length > 5)
136
+ parts.push(`and ${error.issues.length - 5} more`);
137
+ return parts.join("; ");
138
+ }
139
+ /** The operation of a `call` / `describe`; a `ToolError` when there is none (model-visible). */
140
+ function operationOf(deps, action, id) {
141
+ if (id === undefined || id === "") {
142
+ throw new ToolError(missingText(action, "operation", "an operation id from browse or search"));
143
+ }
144
+ const op = deps.ops.get(id);
145
+ if (op === null)
146
+ throw new ToolError(unknownOperationText(id));
147
+ return op;
148
+ }
149
+ /** `params` checked against the operation's schema; a `ToolError` naming `describe` otherwise. */
150
+ function paramsOf(op, params) {
151
+ const parsed = op.input.safeParse(params ?? {});
152
+ if (!parsed.success)
153
+ throw new ToolError(invalidParamsText(op.id, issuesText(parsed.error)));
154
+ return parsed.data;
155
+ }
156
+ /**
157
+ * The operation context of a confirmation (`confirmFor`, `summary`): the runtime's ids, never
158
+ * input. Nothing aborts it; it only reads.
159
+ */
160
+ const confirmCtx = (ctx) => ({
161
+ orgId: ctx.orgId,
162
+ actorAccountId: ctx.accountId,
163
+ agentId: ctx.agentId,
164
+ conversationId: ctx.conversationId,
165
+ runId: ctx.runId,
166
+ signal: new AbortController().signal,
167
+ });
168
+ const factsCtx = (ctx) => ({
169
+ orgId: ctx.orgId,
170
+ accountId: ctx.accountId,
171
+ agentId: ctx.agentId,
172
+ conversationId: ctx.conversationId,
173
+ runId: ctx.runId ?? null,
174
+ });
175
+ export function platformTool(deps) {
176
+ const facts = (ctx) => deps.actor.facts(ctx);
177
+ async function callPolicy(raw, ctx) {
178
+ const input = raw;
179
+ if (input.action !== "call")
180
+ return null;
181
+ const id = input.operation;
182
+ const key = `${BUILTIN.Platform}:${id !== undefined && OPERATION_ID.test(id) ? id : "unknown"}`;
183
+ const deny = (denyReason) => ({
184
+ key,
185
+ policy: "deny",
186
+ remember: false,
187
+ denyReason,
188
+ });
189
+ let op;
190
+ let params;
191
+ try {
192
+ op = operationOf(deps, "call", id);
193
+ // params that cannot run are refused here, so the person is never asked to confirm them
194
+ params = paramsOf(op, input.params);
195
+ }
196
+ catch (e) {
197
+ if (e instanceof ToolError)
198
+ return deny(e.message);
199
+ throw e;
200
+ }
201
+ const verdict = availability(op, await facts(ctx));
202
+ if (!verdict.ok)
203
+ return deny(unavailableOpText(op.id, verdict.reason));
204
+ if (op.confirm === "read")
205
+ return { key, policy: "allow", remember: false };
206
+ // the card shows the raw input: a write must carry what it writes, not a reference to it
207
+ if (hasOutputRef(ctx.rawInput?.params)) {
208
+ return deny(outputRefText(op.id));
209
+ }
210
+ const octx = confirmCtx(ctx);
211
+ const [cls, summary] = await Promise.all([
212
+ classOf(op, params, octx),
213
+ summaryOf(op, params, octx),
214
+ ]);
215
+ return {
216
+ key,
217
+ policy: "ask",
218
+ // org / platform writes are confirmed every time (spec §6.2)
219
+ remember: cls === "personal",
220
+ summary,
221
+ };
222
+ }
223
+ async function run(raw, ctx) {
224
+ const input = raw;
225
+ switch (input.action) {
226
+ case "browse":
227
+ return input.domain === undefined ? browseRoot() : browseDomain(input.domain, ctx);
228
+ case "search":
229
+ return search(input.query, ctx);
230
+ case "describe":
231
+ return describe(input.operation, ctx);
232
+ case "call":
233
+ return call(input, ctx);
234
+ case "read":
235
+ return read(input.topic);
236
+ }
237
+ }
238
+ function browseRoot() {
239
+ const domains = deps.ops.domains().map((d) => ({
240
+ id: d.id,
241
+ description: d.description,
242
+ operations: deps.ops.inDomain(d.id).length,
243
+ }));
244
+ return json({ domains, method: PLATFORM_METHOD }, { zh: "浏览平台操作", en: "Browsed platform operations" });
245
+ }
246
+ async function browseDomain(domain, ctx) {
247
+ const ids = deps.ops.domains().map((d) => d.id);
248
+ if (!ids.includes(domain)) {
249
+ throw new ToolError(`Unknown domain "${domain}". Use one of: ${ids.join(", ")}; or call browse without a domain.`);
250
+ }
251
+ const f = await facts(factsCtx(ctx));
252
+ const ops = deps.ops.inDomain(domain);
253
+ return json({
254
+ domain,
255
+ operations: ops.slice(0, LIST_MAX).map((op) => line(op, f)),
256
+ ...(ops.length > LIST_MAX && { truncated: true, hint: "Use search to narrow the list." }),
257
+ }, { zh: `浏览平台操作:${domain}`, en: `Browsed platform operations: ${domain}` });
258
+ }
259
+ async function search(query, ctx) {
260
+ if (query === undefined || query.trim() === "") {
261
+ throw new ToolError(missingText("search", "query", "words to look for"));
262
+ }
263
+ const f = await facts(factsCtx(ctx));
264
+ const found = deps.ops.search(query, SEARCH_MAX);
265
+ return json({
266
+ query,
267
+ operations: found.map((op) => line(op, f)),
268
+ ...(found.length === 0 && {
269
+ hint: "Nothing matched; use other words, or browse a domain.",
270
+ }),
271
+ }, { zh: `搜索平台操作:${clip(query)}`, en: `Searched platform operations: ${clip(query)}` });
272
+ }
273
+ async function describe(id, ctx) {
274
+ const op = operationOf(deps, "describe", id);
275
+ const f = await facts(factsCtx(ctx));
276
+ return json({
277
+ id: op.id,
278
+ description: op.description,
279
+ kind: kindOf(op),
280
+ confirm: op.confirm,
281
+ inputSchema: z.toJSONSchema(op.input, { io: "input", unrepresentable: "any" }),
282
+ example: op.example,
283
+ ...(op.errors !== undefined && op.errors.length > 0 && { errors: op.errors }),
284
+ ...availabilityFields(availability(op, f)),
285
+ related: deps.ops
286
+ .inDomain(operationDomain(op.id))
287
+ .filter((o) => o.id !== op.id)
288
+ .map((o) => o.id),
289
+ }, { zh: `查看平台操作 ${op.id}`, en: `Described platform operation ${op.id}` });
290
+ }
291
+ async function call(input, ctx) {
292
+ const op = operationOf(deps, "call", input.operation);
293
+ const params = paramsOf(op, input.params);
294
+ // fresh facts right before running: the role may be gone since the confirmation (Review Focus 3)
295
+ const verdict = availability(op, await facts(factsCtx(ctx)));
296
+ if (!verdict.ok)
297
+ throw new ToolError(unavailableOpText(op.id, verdict.reason));
298
+ let result;
299
+ try {
300
+ result = await op.run(params, {
301
+ orgId: ctx.orgId,
302
+ actorAccountId: ctx.accountId,
303
+ agentId: ctx.agentId,
304
+ conversationId: ctx.conversationId,
305
+ runId: ctx.runId ?? null,
306
+ signal: ctx.signal,
307
+ });
308
+ }
309
+ catch (e) {
310
+ throw toToolError(e);
311
+ }
312
+ return json(asResult(result), { zh: `调用平台操作 ${op.id}`, en: `Called ${op.id}` });
313
+ }
314
+ function read(topic) {
315
+ if (topic === undefined || topic === "") {
316
+ return json({ topics: deps.docs.topics(), hint: 'Read one with action "read" and its "topic".' }, { zh: "查看平台文档目录", en: "Listed platform docs" });
317
+ }
318
+ const text = deps.docs.read(topic);
319
+ if (text === null) {
320
+ throw new ToolError(`Unknown topic "${topic}". Call read without a topic to list the topics.`);
321
+ }
322
+ return {
323
+ content: [{ type: "text", text }],
324
+ display: { summary: { zh: `阅读平台文档 ${topic}`, en: `Read platform doc ${topic}` } },
325
+ };
326
+ }
327
+ return {
328
+ spec: SPEC,
329
+ defaultPolicy: "allow",
330
+ run,
331
+ callPolicy,
332
+ async unavailable({ orgId }) {
333
+ return (await deps.setting(orgId)) === "off" ? PLATFORM_UNAVAILABLE_OFF : null;
334
+ },
335
+ };
336
+ }
337
+ /**
338
+ * The class of one write: `confirmFor` when the operation has one (the target decides), else
339
+ * `confirm`. A `confirmFor` that throws counts as `org`: never remembered.
340
+ */
341
+ async function classOf(op, params, ctx) {
342
+ if (op.confirmFor === undefined)
343
+ return op.confirm;
344
+ try {
345
+ return await op.confirmFor(params, ctx);
346
+ }
347
+ catch {
348
+ return "org";
349
+ }
350
+ }
351
+ /** The card summary of a write, rendered from the validated params and kernel reads. */
352
+ async function summaryOf(op, params, ctx) {
353
+ try {
354
+ const s = await op.summary?.(params, ctx);
355
+ if (s !== undefined)
356
+ return s;
357
+ }
358
+ catch {
359
+ // a summary that cannot render falls back to the operation id (the card shows every param)
360
+ }
361
+ return { zh: `平台操作 ${op.id}`, en: `Platform operation ${op.id}` };
362
+ }
@@ -1,7 +1,7 @@
1
1
  import { ToolError } from "@capybara-hq/plugin-sdk";
2
2
  import { backgroundMaxSeconds, LAUNCH_EXEC_TIMEOUT_MS, launchScript, newTaskId, startedText, taskOutputPath, taskSidPath, } from "../../../background/launch.js";
3
3
  import { KILL_SESSION_TIMEOUT_MS, killSession, SID_RE } from "../../../background/session.js";
4
- import { clip, display, inSandbox, noSandboxError, runBudgetNote, runTimeLeftMs, sandboxBaseTimeoutMs, sandboxConversationOf, unavailableWhenNoSandbox, withNotices, } from "./common.js";
4
+ import { clip, display, inSandbox, mapSandboxError, noSandboxError, runBudgetNote, runTimeLeftMs, sandboxBaseTimeoutMs, sandboxConversationOf, unavailableWhenNoSandbox, withNotices, } from "./common.js";
5
5
  /** The command timeout in seconds when `timeout` is not given, at most `sandbox.limits.maxCommandSeconds`. */
6
6
  export const BASH_DEFAULT_TIMEOUT_SECONDS = 120;
7
7
  /** The longest `description` (the shell row shows it instead of the command). */
@@ -19,7 +19,8 @@ const SPEC = {
19
19
  "filesystem. The working directory is /workspace; files persist between calls in the same " +
20
20
  "conversation, but background processes may not: when the sandbox is suspended after a period " +
21
21
  "without use they can be stopped and /tmp cleared, so keep results in files under /workspace. " +
22
- "Files the user attached to the conversation are under /workspace/attachments, " +
22
+ "Files the user attached to the conversation are copied to /workspace/attachments/<conversation>/ " +
23
+ "(the result names the paths), " +
23
24
  "and skill files under /skills (read-only). Each call runs in a fresh shell (no state such as " +
24
25
  "cd or environment variables carries over). The result has stdout, stderr and the exit code; " +
25
26
  "long output is saved and can be paged with ReadToolOutput. A command that runs longer than " +
@@ -143,6 +144,14 @@ async function runInBackground(deps, ctx, input) {
143
144
  const requested = input.timeout;
144
145
  const seconds = Math.max(1, Math.ceil(Math.min(requested ?? maxMs, maxMs) / 1000));
145
146
  const root = sandboxConversationOf(ctx);
147
+ // the environment the task will run in (the root conversation's, bound for good)
148
+ let environmentId;
149
+ try {
150
+ environmentId = await deps.environments.forTool(ctx.orgId, root);
151
+ }
152
+ catch (e) {
153
+ throw mapSandboxError(e);
154
+ }
146
155
  const maxTasks = cfg.sandbox.background.maxTasks;
147
156
  const id = newTaskId();
148
157
  const description = input.description ?? clip(input.command, 120);
@@ -152,6 +161,7 @@ async function runInBackground(deps, ctx, input) {
152
161
  orgId: ctx.orgId,
153
162
  conversationId: ctx.conversationId,
154
163
  sandboxConversationId: root,
164
+ environmentId,
155
165
  runId: ctx.runId,
156
166
  callId: ctx.callId,
157
167
  // the run's trigger account (the pipeline passes `runs.trigger_account_id` as `accountId`)
@@ -224,7 +234,7 @@ async function runInBackground(deps, ctx, input) {
224
234
  const sid = out;
225
235
  try {
226
236
  // under the shared lease: no rebuild can come between the launch and this read
227
- const instance = await currentInstance(root);
237
+ const instance = await currentInstance(environmentId);
228
238
  if (instance === null)
229
239
  throw new Error("the sandbox instance could not be read");
230
240
  const marked = await background.markStarted(id, {
@@ -1,12 +1,13 @@
1
- import { type SandboxHandle, type SandboxProvider, ToolError } from "@capybara-hq/plugin-sdk";
1
+ import { type SandboxHandle, ToolError } from "@capybara-hq/plugin-sdk";
2
2
  import type { BackgroundTaskFinisher } from "../../../background/finish.js";
3
3
  import type { BackgroundTaskStopper } from "../../../background/stop.js";
4
4
  import type { BackgroundTaskStore } from "../../../background/store.js";
5
5
  import type { KernelConfig } from "../../../config/schema.js";
6
6
  import type { AttachmentsService } from "../../../conversations/attachments.service.js";
7
7
  import type { EventLog } from "../../../conversations/event-log.js";
8
+ import { type ConversationEnvironments } from "../../../environments/conversation-environments.js";
8
9
  import type { KernelConfigService } from "../../../infra/config/kernel-config.service.js";
9
- import { type SandboxService } from "../../../sandbox/sandbox.service.js";
10
+ import { type HeldProvider, type SandboxService } from "../../../sandbox/sandbox.service.js";
10
11
  import type { StorageService } from "../../../storage/storage.service.js";
11
12
  import type { BuiltinCallContext } from "../../registry.js";
12
13
  /** 沙箱工具的依赖(都按调用时取,多副本下无进程内状态)。 */
@@ -17,6 +18,8 @@ export interface SandboxToolDeps {
17
18
  * `ifRunning`, which `TaskOutput` reads a task through.
18
19
  */
19
20
  sandbox: Pick<SandboxService, "available" | "withSandbox"> & Partial<Pick<SandboxService, "pathLease" | "currentInstance" | "ifRunning">>;
21
+ /** The environment a call enters: the root conversation's, checked for its owner every call. */
22
+ environments: Pick<ConversationEnvironments, "forTool">;
20
23
  /** Background `Bash` tasks; absent in test stubs, where `run_in_background` is refused. */
21
24
  background?: Pick<BackgroundTaskStore, "reserve" | "markStarted" | "failLaunch" | "finishStoppedLaunch" | "releaseStop" | "get" | "advanceOffset">;
22
25
  /**
@@ -28,32 +31,43 @@ export interface SandboxToolDeps {
28
31
  stopper: Pick<BackgroundTaskStopper, "stop">;
29
32
  };
30
33
  attachments: Pick<AttachmentsService, "listForConversation" | "openForConversation">;
31
- storage: Pick<StorageService, "kernel" | "available">;
34
+ storage: Pick<StorageService, "kernel" | "deployment" | "available">;
32
35
  /** `publishChanged`: `Deliver` announces `changed: files` (UI refresh B). */
33
36
  eventLog: Pick<EventLog, "append" | "latestFileState"> & Partial<Pick<EventLog, "publishChanged">>;
34
37
  config: Pick<KernelConfigService, "get">;
35
38
  }
36
- /** 回调拿到的沙箱:句柄、提供方与「调用 signal + 锁丢失」合并后的 signal(每个提供方调用都传它)。 */
39
+ /**
40
+ * The sandbox a callback gets: the instance handle, the provider (every `exec` carries the
41
+ * holder's tag and the call's actor) and the call's signal combined with the lease's (pass it to
42
+ * every provider call).
43
+ */
37
44
  export interface SandboxSession {
45
+ /** The environment the call runs in (path leases are taken on it). */
46
+ environmentId: string;
38
47
  h: SandboxHandle;
39
- p: SandboxProvider;
48
+ p: HeldProvider;
40
49
  signal: AbortSignal;
41
- /** 本次是新建 / 重建的沙箱(之前复制进去的文件都已不在)。 */
42
- reset: boolean;
43
50
  }
44
51
  /** 没有沙箱提供方时「工具不可用」的原因(进提醒与调用结果)。 */
45
- /** 本对话第一次用沙箱。 */
46
- export declare const SANDBOX_STARTED_NOTICE = "Sandbox started for this conversation (first use); the working directory is /workspace.";
47
- /** 沙箱被重建(之前的实例已销毁或不在了)。 */
48
- export declare const SANDBOX_RECREATED_NOTICE = "Sandbox was recreated; previous files are gone.";
52
+ /** This conversation's first use of its environment. */
53
+ export declare const SANDBOX_STARTED_NOTICE = "Environment started (first use in this conversation); the working directory is /workspace, shared with the environment's other conversations.";
54
+ /** A new instance came up on the environment's kept files. */
55
+ export declare const SANDBOX_RESTARTED_NOTICE = "The environment's instance was restarted; files are kept, running processes and /tmp are gone.";
49
56
  /** 没有沙箱提供方时「工具不可用」的原因(进提醒,内核在后面补句号):与调用时的错误同一句话。 */
50
57
  export declare const SANDBOX_UNAVAILABLE_REASON: string;
51
58
  /** The error of a sandbox call in a deployment without a sandbox provider. */
52
59
  export declare function noSandboxError(): ToolError;
53
- /** 沙箱里附件所在目录。 */
54
- export declare const ATTACHMENTS_DIR = "/workspace/attachments";
55
- /** 已同步附件的标记文件:`{ <附件 id>: <文件名> }`。 */
56
- export declare const SYNC_MARKER = "/workspace/attachments/.capybara-sync.json";
60
+ /** The directory of attachments in the environment (each conversation has a subdirectory). */
61
+ export declare const ATTACHMENTS_ROOT = "/workspace/attachments";
62
+ /**
63
+ * One conversation's attachment directory: the first 12 hex digits of the root conversation's
64
+ * UUID, so conversations sharing an environment do not overwrite each other's files.
65
+ */
66
+ export declare const attachmentsDir: (rootConversationId: string) => string;
67
+ /** The conversation's marker of synced attachments: `{ <attachment id>: <file name> }`. */
68
+ export declare const syncMarkerPath: (rootConversationId: string) => string;
69
+ /** Whether a path, or a Grep output line starting with one, belongs to a sync marker (hidden from Glob / Grep). */
70
+ export declare const isSyncMarkerEntry: (pathOrLine: string) => boolean;
57
71
  /** 附件文件名的上限(UTF-8 字节,常见文件系统单个文件名上限 255 字节,留出 `-N` 后缀的余量)。 */
58
72
  export declare const ATTACHMENT_NAME_MAX_BYTES = 200;
59
73
  /**
@@ -115,23 +129,28 @@ export declare function assignAttachmentNames(items: readonly {
115
129
  /** 沙箱服务的错误 → 给模型的可执行说明;其余原样抛出(管线按「工具失败」处理)。 */
116
130
  export declare function mapSandboxError(e: unknown): unknown;
117
131
  /**
118
- * 在本对话的沙箱上执行 `fn`(`SandboxService.withSandbox`:懒创建、恢复、重建):先同步附件,
119
- * 再执行;返回结果与要加在结果开头的状态说明(首次使用 / 重建 / 新复制的附件)。
120
- * `withSandbox` 遇到实例不在时会重建并再调用一次回调,说明按最后一次调用的为准。
132
+ * Runs `fn` in the environment of the call's conversation (a sub-agent: its root's): resolves and
133
+ * checks the environment for the conversation's owner (binding an unbound conversation to the
134
+ * owner's default first), then `SandboxService.withSandbox` (the instance created, resumed or
135
+ * rebuilt on the kept files as needed, every `exec` carrying the call's actor). Attachments are
136
+ * synced first. Returns the value and the notices to put before the result (first use, a new
137
+ * instance, newly copied attachments). When `withSandbox` rebuilds a gone instance and calls
138
+ * `fn` again, the notices are the last call's.
121
139
  */
122
140
  export declare function inSandbox<T>(deps: SandboxToolDeps, ctx: BuiltinCallContext, fn: (s: SandboxSession) => Promise<T>): Promise<{
123
141
  value: T;
124
142
  notices: string[];
125
143
  }>;
126
- /** The conversation whose sandbox a call uses (the parent's for a sub-agent). */
144
+ /** The conversation whose environment a call uses (the root conversation's for a sub-agent). */
127
145
  export declare const sandboxConversationOf: (ctx: BuiltinCallContext) => string;
128
146
  /**
129
- * Runs `fn` under the per-path lease of `path` in the call's sandbox (spec §10.4: the kernel's own
130
- * read-modify-write of one file never loses another holder's update). `fn` gets `signal` combined
131
- * with the path lease's: pass it to every provider call, so a lost path lease stops the write.
132
- * Without `pathLease` (test stubs) it just runs `fn` with `signal`.
147
+ * Runs `fn` under the per-path lease of `path` in the session's environment (spec §10.4: the
148
+ * kernel's own read-modify-write of one file never loses another holder's update, from any
149
+ * conversation sharing the environment). `fn` gets `signal` combined with the path lease's: pass
150
+ * it to every provider call, so a lost path lease stops the write. Without `pathLease` (test
151
+ * stubs) it just runs `fn` with `signal`.
133
152
  */
134
- export declare function withPathLease<T>(deps: Pick<SandboxToolDeps, "sandbox">, ctx: BuiltinCallContext, path: string, signal: AbortSignal, fn: (signal: AbortSignal) => Promise<T>): Promise<T>;
153
+ export declare function withPathLease<T>(deps: Pick<SandboxToolDeps, "sandbox">, s: Pick<SandboxSession, "environmentId">, path: string, signal: AbortSignal, fn: (signal: AbortSignal) => Promise<T>): Promise<T>;
135
154
  /** 本部署是否有沙箱:没有时返回「不可用」原因(注册表据此把沙箱工具报为不可用)。 */
136
155
  export declare const unavailableWhenNoSandbox: (deps: Pick<SandboxToolDeps, "sandbox">) => (_ctx?: {
137
156
  orgId: string;