@capybara-hq/kernel 0.0.0-stage → 0.1.0-rc.1

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 (637) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +26 -0
  5. package/dist/admin/admin.controller.d.ts +139 -0
  6. package/dist/admin/admin.controller.js +238 -0
  7. package/dist/admin/extensions.controller.d.ts +100 -0
  8. package/dist/admin/extensions.controller.js +226 -0
  9. package/dist/admin/setup.controller.d.ts +36 -0
  10. package/dist/admin/setup.controller.js +106 -0
  11. package/dist/admin/setup.service.d.ts +47 -0
  12. package/dist/admin/setup.service.js +90 -0
  13. package/dist/agents/agents.controller.d.ts +205 -0
  14. package/dist/agents/agents.controller.js +144 -0
  15. package/dist/agents/agents.service.d.ts +177 -0
  16. package/dist/agents/agents.service.js +677 -0
  17. package/dist/agents/definition.d.ts +198 -0
  18. package/dist/agents/definition.js +152 -0
  19. package/dist/agents/models.controller.d.ts +13 -0
  20. package/dist/agents/models.controller.js +31 -0
  21. package/dist/agents/templates.controller.d.ts +15 -0
  22. package/dist/agents/templates.controller.js +37 -0
  23. package/dist/agents/templates.d.ts +83 -0
  24. package/dist/agents/templates.js +173 -0
  25. package/dist/catalog/admin-catalog.controller.d.ts +143 -0
  26. package/dist/catalog/admin-catalog.controller.js +245 -0
  27. package/dist/catalog/catalog.service.d.ts +430 -0
  28. package/dist/catalog/catalog.service.js +882 -0
  29. package/dist/catalog/claude/agents.d.ts +27 -0
  30. package/dist/catalog/claude/agents.js +270 -0
  31. package/dist/catalog/claude/commands.d.ts +50 -0
  32. package/dist/catalog/claude/commands.js +179 -0
  33. package/dist/catalog/claude/manifest.d.ts +69 -0
  34. package/dist/catalog/claude/manifest.js +134 -0
  35. package/dist/catalog/claude/marketplace.d.ts +35 -0
  36. package/dist/catalog/claude/marketplace.js +194 -0
  37. package/dist/catalog/claude/mcp.d.ts +33 -0
  38. package/dist/catalog/claude/mcp.js +226 -0
  39. package/dist/catalog/claude/report.d.ts +86 -0
  40. package/dist/catalog/claude/report.js +121 -0
  41. package/dist/catalog/claude/translate.d.ts +56 -0
  42. package/dist/catalog/claude/translate.js +857 -0
  43. package/dist/catalog/cli.d.ts +46 -0
  44. package/dist/catalog/cli.js +211 -0
  45. package/dist/catalog/git-source.d.ts +127 -0
  46. package/dist/catalog/git-source.js +520 -0
  47. package/dist/catalog/marketplace-fetch.d.ts +99 -0
  48. package/dist/catalog/marketplace-fetch.js +203 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +97 -0
  50. package/dist/catalog/marketplaces.controller.js +197 -0
  51. package/dist/catalog/marketplaces.service.d.ts +340 -0
  52. package/dist/catalog/marketplaces.service.js +1217 -0
  53. package/dist/catalog/org-catalog.controller.d.ts +128 -0
  54. package/dist/catalog/org-catalog.controller.js +277 -0
  55. package/dist/catalog/org-catalog.service.d.ts +246 -0
  56. package/dist/catalog/org-catalog.service.js +625 -0
  57. package/dist/catalog/plugin-import.d.ts +436 -0
  58. package/dist/catalog/plugin-import.js +1069 -0
  59. package/dist/catalog/plugin-install.d.ts +447 -0
  60. package/dist/catalog/plugin-install.js +1333 -0
  61. package/dist/catalog/plugin-package.d.ts +143 -0
  62. package/dist/catalog/plugin-package.js +382 -0
  63. package/dist/catalog/plugin-upgrade.d.ts +222 -0
  64. package/dist/catalog/plugin-upgrade.js +1219 -0
  65. package/dist/catalog/requests.service.d.ts +162 -0
  66. package/dist/catalog/requests.service.js +504 -0
  67. package/dist/catalog/schema-path.d.ts +7 -0
  68. package/dist/catalog/schema-path.js +63 -0
  69. package/dist/catalog/upgrade-targets.d.ts +59 -0
  70. package/dist/catalog/upgrade-targets.js +90 -0
  71. package/dist/catalog/versions.d.ts +31 -0
  72. package/dist/catalog/versions.js +44 -0
  73. package/dist/channels/actions.d.ts +37 -0
  74. package/dist/channels/actions.js +121 -0
  75. package/dist/channels/cards.d.ts +44 -0
  76. package/dist/channels/cards.js +156 -0
  77. package/dist/channels/connections.controller.d.ts +59 -0
  78. package/dist/channels/connections.controller.js +115 -0
  79. package/dist/channels/connections.service.d.ts +187 -0
  80. package/dist/channels/connections.service.js +534 -0
  81. package/dist/channels/features.d.ts +12 -0
  82. package/dist/channels/features.js +22 -0
  83. package/dist/channels/inbound.d.ts +120 -0
  84. package/dist/channels/inbound.js +332 -0
  85. package/dist/channels/outbound.d.ts +140 -0
  86. package/dist/channels/outbound.js +1126 -0
  87. package/dist/channels/phrases.d.ts +100 -0
  88. package/dist/channels/phrases.js +81 -0
  89. package/dist/channels/supervisor.d.ts +182 -0
  90. package/dist/channels/supervisor.js +625 -0
  91. package/dist/channels/threads.d.ts +29 -0
  92. package/dist/channels/threads.js +104 -0
  93. package/dist/channels/webhook-url.d.ts +16 -0
  94. package/dist/channels/webhook-url.js +34 -0
  95. package/dist/channels/webhook.controller.d.ts +19 -0
  96. package/dist/channels/webhook.controller.js +72 -0
  97. package/dist/channels/webhook.d.ts +73 -0
  98. package/dist/channels/webhook.js +274 -0
  99. package/dist/config/docs.d.ts +9 -0
  100. package/dist/config/docs.js +85 -0
  101. package/dist/config/env.d.ts +6 -0
  102. package/dist/config/env.js +73 -0
  103. package/dist/config/fields.d.ts +42 -0
  104. package/dist/config/fields.js +214 -0
  105. package/dist/config/file-source.d.ts +3 -0
  106. package/dist/config/file-source.js +31 -0
  107. package/dist/config/load.d.ts +20 -0
  108. package/dist/config/load.js +98 -0
  109. package/dist/config/nacos-source.d.ts +31 -0
  110. package/dist/config/nacos-source.js +229 -0
  111. package/dist/config/schema.d.ts +237 -0
  112. package/dist/config/schema.js +1192 -0
  113. package/dist/config/sources.d.ts +18 -0
  114. package/dist/config/sources.js +59 -0
  115. package/dist/config/types.d.ts +9 -0
  116. package/dist/config/types.js +7 -0
  117. package/dist/conversations/artifacts.d.ts +52 -0
  118. package/dist/conversations/artifacts.js +137 -0
  119. package/dist/conversations/attachments.controller.d.ts +28 -0
  120. package/dist/conversations/attachments.controller.js +96 -0
  121. package/dist/conversations/attachments.service.d.ts +180 -0
  122. package/dist/conversations/attachments.service.js +578 -0
  123. package/dist/conversations/conversations.controller.d.ts +288 -0
  124. package/dist/conversations/conversations.controller.js +607 -0
  125. package/dist/conversations/conversations.service.d.ts +321 -0
  126. package/dist/conversations/conversations.service.js +754 -0
  127. package/dist/conversations/event-log.d.ts +122 -0
  128. package/dist/conversations/event-log.js +259 -0
  129. package/dist/conversations/events.d.ts +856 -0
  130. package/dist/conversations/events.js +639 -0
  131. package/dist/conversations/files.d.ts +92 -0
  132. package/dist/conversations/files.js +213 -0
  133. package/dist/conversations/outputs-read.d.ts +34 -0
  134. package/dist/conversations/outputs-read.js +37 -0
  135. package/dist/conversations/queue.d.ts +169 -0
  136. package/dist/conversations/queue.js +527 -0
  137. package/dist/conversations/sandbox-status.d.ts +21 -0
  138. package/dist/conversations/sandbox-status.js +24 -0
  139. package/dist/conversations/selection.d.ts +46 -0
  140. package/dist/conversations/selection.js +75 -0
  141. package/dist/conversations/titles.d.ts +93 -0
  142. package/dist/conversations/titles.js +423 -0
  143. package/dist/ctx/bus.d.ts +16 -0
  144. package/dist/ctx/bus.js +101 -0
  145. package/dist/ctx/create-ctx.d.ts +109 -0
  146. package/dist/ctx/create-ctx.js +592 -0
  147. package/dist/ctx/kv.d.ts +4 -0
  148. package/dist/ctx/kv.js +31 -0
  149. package/dist/ctx/lock.d.ts +4 -0
  150. package/dist/ctx/lock.js +39 -0
  151. package/dist/ctx/namespace.d.ts +6 -0
  152. package/dist/ctx/namespace.js +12 -0
  153. package/dist/ctx/queue.d.ts +25 -0
  154. package/dist/ctx/queue.js +151 -0
  155. package/dist/ctx/secrets.d.ts +45 -0
  156. package/dist/ctx/secrets.js +175 -0
  157. package/dist/db/kernel-schema.d.ts +1122 -0
  158. package/dist/db/kernel-schema.js +5 -0
  159. package/dist/db/migrator.d.ts +28 -0
  160. package/dist/db/migrator.js +140 -0
  161. package/dist/db/pool.d.ts +21 -0
  162. package/dist/db/pool.js +28 -0
  163. package/dist/db/sql-statements.d.ts +34 -0
  164. package/dist/db/sql-statements.js +168 -0
  165. package/dist/errors.d.ts +211 -0
  166. package/dist/errors.js +213 -0
  167. package/dist/evals/budget.d.ts +61 -0
  168. package/dist/evals/budget.js +181 -0
  169. package/dist/evals/diff.d.ts +55 -0
  170. package/dist/evals/diff.js +133 -0
  171. package/dist/evals/judge.d.ts +53 -0
  172. package/dist/evals/judge.js +149 -0
  173. package/dist/evals/plan.d.ts +47 -0
  174. package/dist/evals/plan.js +77 -0
  175. package/dist/evals/reconstruct.d.ts +137 -0
  176. package/dist/evals/reconstruct.js +322 -0
  177. package/dist/evals/recorded-tools.d.ts +54 -0
  178. package/dist/evals/recorded-tools.js +167 -0
  179. package/dist/evals/run-replay.d.ts +86 -0
  180. package/dist/evals/run-replay.js +502 -0
  181. package/dist/evals/runs.controller.d.ts +100 -0
  182. package/dist/evals/runs.controller.js +199 -0
  183. package/dist/evals/runs.service.d.ts +275 -0
  184. package/dist/evals/runs.service.js +836 -0
  185. package/dist/evals/sets.controller.d.ts +61 -0
  186. package/dist/evals/sets.controller.js +183 -0
  187. package/dist/evals/sets.service.d.ts +128 -0
  188. package/dist/evals/sets.service.js +558 -0
  189. package/dist/evals/snapshot.d.ts +76 -0
  190. package/dist/evals/snapshot.js +207 -0
  191. package/dist/evals/step-replay.d.ts +113 -0
  192. package/dist/evals/step-replay.js +181 -0
  193. package/dist/evals/trajectory.controller.d.ts +41 -0
  194. package/dist/evals/trajectory.controller.js +88 -0
  195. package/dist/evals/trajectory.d.ts +144 -0
  196. package/dist/evals/trajectory.js +338 -0
  197. package/dist/evals/trajectory.service.d.ts +108 -0
  198. package/dist/evals/trajectory.service.js +323 -0
  199. package/dist/evals/worker.d.ts +101 -0
  200. package/dist/evals/worker.js +790 -0
  201. package/dist/extensions/admin-ops.d.ts +105 -0
  202. package/dist/extensions/admin-ops.js +353 -0
  203. package/dist/extensions/admin-view.d.ts +79 -0
  204. package/dist/extensions/admin-view.js +327 -0
  205. package/dist/extensions/approvals.d.ts +119 -0
  206. package/dist/extensions/approvals.js +205 -0
  207. package/dist/extensions/blobs.d.ts +45 -0
  208. package/dist/extensions/blobs.js +160 -0
  209. package/dist/extensions/bootstrap.d.ts +176 -0
  210. package/dist/extensions/bootstrap.js +535 -0
  211. package/dist/extensions/cli.d.ts +61 -0
  212. package/dist/extensions/cli.js +165 -0
  213. package/dist/extensions/config-json-schema.d.ts +9 -0
  214. package/dist/extensions/config-json-schema.js +73 -0
  215. package/dist/extensions/deployment-config.d.ts +138 -0
  216. package/dist/extensions/deployment-config.js +394 -0
  217. package/dist/extensions/enabled.d.ts +31 -0
  218. package/dist/extensions/enabled.js +55 -0
  219. package/dist/extensions/hooks.d.ts +161 -0
  220. package/dist/extensions/hooks.js +425 -0
  221. package/dist/extensions/host.d.ts +577 -0
  222. package/dist/extensions/host.js +2071 -0
  223. package/dist/extensions/inflight.d.ts +69 -0
  224. package/dist/extensions/inflight.js +277 -0
  225. package/dist/extensions/installs.d.ts +166 -0
  226. package/dist/extensions/installs.js +253 -0
  227. package/dist/extensions/instance.d.ts +167 -0
  228. package/dist/extensions/instance.js +329 -0
  229. package/dist/extensions/ledger.d.ts +30 -0
  230. package/dist/extensions/ledger.js +50 -0
  231. package/dist/extensions/lifecycle.d.ts +80 -0
  232. package/dist/extensions/lifecycle.js +152 -0
  233. package/dist/extensions/migrate-lock.d.ts +51 -0
  234. package/dist/extensions/migrate-lock.js +100 -0
  235. package/dist/extensions/org-config.controller.d.ts +24 -0
  236. package/dist/extensions/org-config.controller.js +59 -0
  237. package/dist/extensions/org-config.d.ts +169 -0
  238. package/dist/extensions/org-config.js +520 -0
  239. package/dist/extensions/package.d.ts +115 -0
  240. package/dist/extensions/package.js +246 -0
  241. package/dist/extensions/permission-set.d.ts +117 -0
  242. package/dist/extensions/permission-set.js +184 -0
  243. package/dist/extensions/permission-view.d.ts +194 -0
  244. package/dist/extensions/permission-view.js +284 -0
  245. package/dist/extensions/registry.d.ts +24 -0
  246. package/dist/extensions/registry.js +56 -0
  247. package/dist/extensions/resolve.d.ts +12 -0
  248. package/dist/extensions/resolve.js +71 -0
  249. package/dist/extensions/sources.d.ts +69 -0
  250. package/dist/extensions/sources.js +120 -0
  251. package/dist/extensions/sync.d.ts +40 -0
  252. package/dist/extensions/sync.js +242 -0
  253. package/dist/files/previewers.controller.d.ts +46 -0
  254. package/dist/files/previewers.controller.js +105 -0
  255. package/dist/files/previewers.d.ts +100 -0
  256. package/dist/files/previewers.js +250 -0
  257. package/dist/http/api.module.d.ts +114 -0
  258. package/dist/http/api.module.js +448 -0
  259. package/dist/http/app.d.ts +77 -0
  260. package/dist/http/app.js +220 -0
  261. package/dist/http/error.filter.d.ts +21 -0
  262. package/dist/http/error.filter.js +85 -0
  263. package/dist/http/gateway.module.d.ts +15 -0
  264. package/dist/http/gateway.module.js +13 -0
  265. package/dist/http/health.controller.d.ts +26 -0
  266. package/dist/http/health.controller.js +79 -0
  267. package/dist/http/nest-logger.d.ts +20 -0
  268. package/dist/http/nest-logger.js +28 -0
  269. package/dist/http/plugin-dispatch.d.ts +68 -0
  270. package/dist/http/plugin-dispatch.js +200 -0
  271. package/dist/http/tokens.d.ts +131 -0
  272. package/dist/http/tokens.js +131 -0
  273. package/dist/http/zod.pipe.d.ts +8 -0
  274. package/dist/http/zod.pipe.js +14 -0
  275. package/dist/identity/accounts.d.ts +93 -0
  276. package/dist/identity/accounts.js +367 -0
  277. package/dist/identity/api-tokens.d.ts +73 -0
  278. package/dist/identity/api-tokens.js +197 -0
  279. package/dist/identity/audit.d.ts +23 -0
  280. package/dist/identity/audit.js +41 -0
  281. package/dist/identity/auth.controller.d.ts +40 -0
  282. package/dist/identity/auth.controller.js +130 -0
  283. package/dist/identity/auth.guard.d.ts +41 -0
  284. package/dist/identity/auth.guard.js +162 -0
  285. package/dist/identity/binding.d.ts +47 -0
  286. package/dist/identity/binding.js +84 -0
  287. package/dist/identity/cookies.d.ts +16 -0
  288. package/dist/identity/cookies.js +32 -0
  289. package/dist/identity/credential-check.d.ts +17 -0
  290. package/dist/identity/credential-check.js +24 -0
  291. package/dist/identity/enterprise-admin.d.ts +14 -0
  292. package/dist/identity/enterprise-admin.js +27 -0
  293. package/dist/identity/external.d.ts +106 -0
  294. package/dist/identity/external.js +337 -0
  295. package/dist/identity/hash.d.ts +2 -0
  296. package/dist/identity/hash.js +3 -0
  297. package/dist/identity/login.d.ts +6 -0
  298. package/dist/identity/login.js +20 -0
  299. package/dist/identity/me.controller.d.ts +61 -0
  300. package/dist/identity/me.controller.js +159 -0
  301. package/dist/identity/passwords.d.ts +6 -0
  302. package/dist/identity/passwords.js +37 -0
  303. package/dist/identity/principal.d.ts +56 -0
  304. package/dist/identity/principal.js +38 -0
  305. package/dist/identity/rate-limit.d.ts +55 -0
  306. package/dist/identity/rate-limit.js +121 -0
  307. package/dist/identity/sessions.d.ts +84 -0
  308. package/dist/identity/sessions.js +306 -0
  309. package/dist/identity/settings.d.ts +121 -0
  310. package/dist/identity/settings.js +248 -0
  311. package/dist/identity/sso.controller.d.ts +59 -0
  312. package/dist/identity/sso.controller.js +192 -0
  313. package/dist/identity/sso.d.ts +83 -0
  314. package/dist/identity/sso.js +202 -0
  315. package/dist/inbox/inbox.service.d.ts +43 -0
  316. package/dist/inbox/inbox.service.js +57 -0
  317. package/dist/index.d.ts +69 -0
  318. package/dist/index.js +67 -0
  319. package/dist/kernel.d.ts +259 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log-config.d.ts +9 -0
  322. package/dist/log-config.js +27 -0
  323. package/dist/log-context.d.ts +32 -0
  324. package/dist/log-context.js +40 -0
  325. package/dist/log-loki.d.ts +34 -0
  326. package/dist/log-loki.js +145 -0
  327. package/dist/log.d.ts +79 -0
  328. package/dist/log.js +303 -0
  329. package/dist/models/prices.d.ts +53 -0
  330. package/dist/models/prices.js +121 -0
  331. package/dist/models/purposes.controller.d.ts +19 -0
  332. package/dist/models/purposes.controller.js +56 -0
  333. package/dist/models/purposes.d.ts +140 -0
  334. package/dist/models/purposes.js +267 -0
  335. package/dist/net/proxy.d.ts +44 -0
  336. package/dist/net/proxy.js +162 -0
  337. package/dist/net/public-address.d.ts +60 -0
  338. package/dist/net/public-address.js +272 -0
  339. package/dist/net/safe-fetch.d.ts +38 -0
  340. package/dist/net/safe-fetch.js +140 -0
  341. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  342. package/dist/orgs/directory-sync.controller.js +40 -0
  343. package/dist/orgs/directory-sync.d.ts +166 -0
  344. package/dist/orgs/directory-sync.js +558 -0
  345. package/dist/orgs/invitations.controller.d.ts +58 -0
  346. package/dist/orgs/invitations.controller.js +137 -0
  347. package/dist/orgs/invitations.service.d.ts +80 -0
  348. package/dist/orgs/invitations.service.js +217 -0
  349. package/dist/orgs/members.service.d.ts +63 -0
  350. package/dist/orgs/members.service.js +234 -0
  351. package/dist/orgs/offboarding.d.ts +141 -0
  352. package/dist/orgs/offboarding.js +398 -0
  353. package/dist/orgs/org-lock.d.ts +32 -0
  354. package/dist/orgs/org-lock.js +46 -0
  355. package/dist/orgs/org.guard.d.ts +35 -0
  356. package/dist/orgs/org.guard.js +95 -0
  357. package/dist/orgs/orgs.controller.d.ts +78 -0
  358. package/dist/orgs/orgs.controller.js +192 -0
  359. package/dist/orgs/orgs.service.d.ts +61 -0
  360. package/dist/orgs/orgs.service.js +209 -0
  361. package/dist/orgs/roles.d.ts +13 -0
  362. package/dist/orgs/roles.js +58 -0
  363. package/dist/orgs/settings.controller.d.ts +20 -0
  364. package/dist/orgs/settings.controller.js +53 -0
  365. package/dist/orgs/settings.service.d.ts +120 -0
  366. package/dist/orgs/settings.service.js +178 -0
  367. package/dist/packages/npm.d.ts +50 -0
  368. package/dist/packages/npm.js +218 -0
  369. package/dist/packages/provenance.d.ts +47 -0
  370. package/dist/packages/provenance.js +147 -0
  371. package/dist/packages/tgz.d.ts +76 -0
  372. package/dist/packages/tgz.js +225 -0
  373. package/dist/runtime/abort.d.ts +32 -0
  374. package/dist/runtime/abort.js +71 -0
  375. package/dist/runtime/checkpointer.d.ts +32 -0
  376. package/dist/runtime/checkpointer.js +243 -0
  377. package/dist/runtime/context/build.d.ts +254 -0
  378. package/dist/runtime/context/build.js +693 -0
  379. package/dist/runtime/context/claude-tools.d.ts +11 -0
  380. package/dist/runtime/context/claude-tools.js +24 -0
  381. package/dist/runtime/context/compaction.d.ts +26 -0
  382. package/dist/runtime/context/compaction.js +195 -0
  383. package/dist/runtime/context/pairing.d.ts +11 -0
  384. package/dist/runtime/context/pairing.js +82 -0
  385. package/dist/runtime/context/reminders.d.ts +5 -0
  386. package/dist/runtime/context/reminders.js +11 -0
  387. package/dist/runtime/context/skills.d.ts +105 -0
  388. package/dist/runtime/context/skills.js +283 -0
  389. package/dist/runtime/context/tokens.d.ts +19 -0
  390. package/dist/runtime/context/tokens.js +104 -0
  391. package/dist/runtime/conversation-lock.d.ts +40 -0
  392. package/dist/runtime/conversation-lock.js +97 -0
  393. package/dist/runtime/hook-calls.d.ts +84 -0
  394. package/dist/runtime/hook-calls.js +136 -0
  395. package/dist/runtime/langgraph-loop.d.ts +52 -0
  396. package/dist/runtime/langgraph-loop.js +247 -0
  397. package/dist/runtime/loop.d.ts +93 -0
  398. package/dist/runtime/loop.js +7 -0
  399. package/dist/runtime/maintenance.d.ts +80 -0
  400. package/dist/runtime/maintenance.js +148 -0
  401. package/dist/runtime/media-cache.d.ts +21 -0
  402. package/dist/runtime/media-cache.js +51 -0
  403. package/dist/runtime/model-call.d.ts +176 -0
  404. package/dist/runtime/model-call.js +1049 -0
  405. package/dist/runtime/providers.d.ts +86 -0
  406. package/dist/runtime/providers.js +224 -0
  407. package/dist/runtime/quota.d.ts +29 -0
  408. package/dist/runtime/quota.js +70 -0
  409. package/dist/runtime/run-finish.d.ts +45 -0
  410. package/dist/runtime/run-finish.js +69 -0
  411. package/dist/runtime/run-queue.d.ts +121 -0
  412. package/dist/runtime/run-queue.js +493 -0
  413. package/dist/runtime/run-worker.d.ts +138 -0
  414. package/dist/runtime/run-worker.js +806 -0
  415. package/dist/runtime/stream.controller.d.ts +34 -0
  416. package/dist/runtime/stream.controller.js +122 -0
  417. package/dist/runtime/stream.d.ts +63 -0
  418. package/dist/runtime/stream.js +262 -0
  419. package/dist/runtime/subagents/child.d.ts +80 -0
  420. package/dist/runtime/subagents/child.js +225 -0
  421. package/dist/runtime/subagents/definition.d.ts +103 -0
  422. package/dist/runtime/subagents/definition.js +392 -0
  423. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  424. package/dist/runtime/subagents/dispatch.js +502 -0
  425. package/dist/runtime/subagents/limits.d.ts +23 -0
  426. package/dist/runtime/subagents/limits.js +34 -0
  427. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  428. package/dist/runtime/subagents/org-agents.js +70 -0
  429. package/dist/runtime/subagents/preamble.d.ts +7 -0
  430. package/dist/runtime/subagents/preamble.js +11 -0
  431. package/dist/runtime/subagents/progress.d.ts +26 -0
  432. package/dist/runtime/subagents/progress.js +36 -0
  433. package/dist/runtime/subagents/roster.d.ts +55 -0
  434. package/dist/runtime/subagents/roster.js +111 -0
  435. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  436. package/dist/runtime/subagents/skill-fork.js +259 -0
  437. package/dist/runtime/usage-report.d.ts +163 -0
  438. package/dist/runtime/usage-report.js +551 -0
  439. package/dist/runtime/waits.d.ts +233 -0
  440. package/dist/runtime/waits.js +883 -0
  441. package/dist/sandbox/leases.d.ts +169 -0
  442. package/dist/sandbox/leases.js +515 -0
  443. package/dist/sandbox/lifecycle.d.ts +21 -0
  444. package/dist/sandbox/lifecycle.js +68 -0
  445. package/dist/sandbox/sandbox.service.d.ts +249 -0
  446. package/dist/sandbox/sandbox.service.js +908 -0
  447. package/dist/skills/catalog.d.ts +149 -0
  448. package/dist/skills/catalog.js +405 -0
  449. package/dist/skills/changes.controller.d.ts +56 -0
  450. package/dist/skills/changes.controller.js +136 -0
  451. package/dist/skills/changes.service.d.ts +175 -0
  452. package/dist/skills/changes.service.js +805 -0
  453. package/dist/skills/invocable.controller.d.ts +23 -0
  454. package/dist/skills/invocable.controller.js +50 -0
  455. package/dist/skills/invocation-keys.d.ts +23 -0
  456. package/dist/skills/invocation-keys.js +44 -0
  457. package/dist/skills/invoke.d.ts +135 -0
  458. package/dist/skills/invoke.js +286 -0
  459. package/dist/skills/package.d.ts +87 -0
  460. package/dist/skills/package.js +227 -0
  461. package/dist/skills/skills.controller.d.ts +40 -0
  462. package/dist/skills/skills.controller.js +110 -0
  463. package/dist/skills/skills.service.d.ts +192 -0
  464. package/dist/skills/skills.service.js +567 -0
  465. package/dist/storage/prefix.d.ts +36 -0
  466. package/dist/storage/prefix.js +104 -0
  467. package/dist/storage/purge.d.ts +27 -0
  468. package/dist/storage/purge.js +75 -0
  469. package/dist/storage/storage.service.d.ts +44 -0
  470. package/dist/storage/storage.service.js +145 -0
  471. package/dist/text.d.ts +13 -0
  472. package/dist/text.js +13 -0
  473. package/dist/tools/approvals.controller.d.ts +53 -0
  474. package/dist/tools/approvals.controller.js +128 -0
  475. package/dist/tools/approvals.service.d.ts +172 -0
  476. package/dist/tools/approvals.service.js +568 -0
  477. package/dist/tools/breaker.d.ts +28 -0
  478. package/dist/tools/breaker.js +72 -0
  479. package/dist/tools/builtins/agent.d.ts +81 -0
  480. package/dist/tools/builtins/agent.js +223 -0
  481. package/dist/tools/builtins/ask-user.d.ts +28 -0
  482. package/dist/tools/builtins/ask-user.js +139 -0
  483. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  484. package/dist/tools/builtins/read-tool-output.js +108 -0
  485. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  486. package/dist/tools/builtins/sandbox/bash.js +137 -0
  487. package/dist/tools/builtins/sandbox/common.d.ts +116 -0
  488. package/dist/tools/builtins/sandbox/common.js +306 -0
  489. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  490. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  491. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  492. package/dist/tools/builtins/sandbox/edit.js +98 -0
  493. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  494. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  495. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  496. package/dist/tools/builtins/sandbox/glob.js +104 -0
  497. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  498. package/dist/tools/builtins/sandbox/grep.js +133 -0
  499. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  500. package/dist/tools/builtins/sandbox/index.js +27 -0
  501. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  502. package/dist/tools/builtins/sandbox/names.js +20 -0
  503. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  504. package/dist/tools/builtins/sandbox/read.js +121 -0
  505. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  506. package/dist/tools/builtins/sandbox/write.js +88 -0
  507. package/dist/tools/builtins/skill-load.d.ts +53 -0
  508. package/dist/tools/builtins/skill-load.js +446 -0
  509. package/dist/tools/builtins/skill-write.d.ts +59 -0
  510. package/dist/tools/builtins/skill-write.js +244 -0
  511. package/dist/tools/builtins/tool-search.d.ts +31 -0
  512. package/dist/tools/builtins/tool-search.js +171 -0
  513. package/dist/tools/connector-content.controller.d.ts +34 -0
  514. package/dist/tools/connector-content.controller.js +78 -0
  515. package/dist/tools/connector-content.d.ts +104 -0
  516. package/dist/tools/connector-content.js +267 -0
  517. package/dist/tools/connectors.controller.d.ts +210 -0
  518. package/dist/tools/connectors.controller.js +234 -0
  519. package/dist/tools/connectors.service.d.ts +303 -0
  520. package/dist/tools/connectors.service.js +1102 -0
  521. package/dist/tools/credentials.d.ts +139 -0
  522. package/dist/tools/credentials.js +351 -0
  523. package/dist/tools/drift.d.ts +141 -0
  524. package/dist/tools/drift.js +539 -0
  525. package/dist/tools/elicitation.d.ts +81 -0
  526. package/dist/tools/elicitation.js +266 -0
  527. package/dist/tools/endpoint.d.ts +18 -0
  528. package/dist/tools/endpoint.js +115 -0
  529. package/dist/tools/info.d.ts +67 -0
  530. package/dist/tools/info.js +113 -0
  531. package/dist/tools/naming.d.ts +27 -0
  532. package/dist/tools/naming.js +47 -0
  533. package/dist/tools/oauth/discovery.d.ts +65 -0
  534. package/dist/tools/oauth/discovery.js +307 -0
  535. package/dist/tools/oauth/flow.d.ts +63 -0
  536. package/dist/tools/oauth/flow.js +237 -0
  537. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  538. package/dist/tools/oauth/oauth.controller.js +95 -0
  539. package/dist/tools/oauth/tokens.d.ts +111 -0
  540. package/dist/tools/oauth/tokens.js +258 -0
  541. package/dist/tools/outputs.d.ts +61 -0
  542. package/dist/tools/outputs.js +156 -0
  543. package/dist/tools/pipeline.d.ts +322 -0
  544. package/dist/tools/pipeline.js +1236 -0
  545. package/dist/tools/policy.d.ts +60 -0
  546. package/dist/tools/policy.js +236 -0
  547. package/dist/tools/questions.controller.d.ts +24 -0
  548. package/dist/tools/questions.controller.js +58 -0
  549. package/dist/tools/questions.service.d.ts +103 -0
  550. package/dist/tools/questions.service.js +295 -0
  551. package/dist/tools/redact.d.ts +20 -0
  552. package/dist/tools/redact.js +60 -0
  553. package/dist/tools/registry.d.ts +246 -0
  554. package/dist/tools/registry.js +481 -0
  555. package/dist/tools/resources.d.ts +16 -0
  556. package/dist/tools/resources.js +76 -0
  557. package/dist/tools/specs.d.ts +14 -0
  558. package/dist/tools/specs.js +31 -0
  559. package/dist/tools/validate.d.ts +20 -0
  560. package/dist/tools/validate.js +183 -0
  561. package/dist/tools/view.d.ts +43 -0
  562. package/dist/tools/view.js +225 -0
  563. package/dist/ui/embed-token.d.ts +31 -0
  564. package/dist/ui/embed-token.js +132 -0
  565. package/dist/ui/registry.d.ts +58 -0
  566. package/dist/ui/registry.js +90 -0
  567. package/dist/ui/ui-stream.d.ts +37 -0
  568. package/dist/ui/ui-stream.js +162 -0
  569. package/dist/ui/views.controller.d.ts +81 -0
  570. package/dist/ui/views.controller.js +261 -0
  571. package/dist/ui/views.d.ts +155 -0
  572. package/dist/ui/views.js +306 -0
  573. package/dist/version.d.ts +5 -0
  574. package/dist/version.js +6 -0
  575. package/package.json +69 -3
  576. package/src/migrations/0001_init.sql +8 -0
  577. package/src/migrations/0002_secrets.sql +8 -0
  578. package/src/migrations/0003_identity.sql +117 -0
  579. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  580. package/src/migrations/0005_agents.sql +27 -0
  581. package/src/migrations/0006_conversations.sql +37 -0
  582. package/src/migrations/0007_checkpoints.sql +26 -0
  583. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  584. package/src/migrations/0009_runs_active_unique.sql +4 -0
  585. package/src/migrations/0010_tools.sql +125 -0
  586. package/src/migrations/0011_approvals_spec.sql +10 -0
  587. package/src/migrations/0012_run_waits.sql +24 -0
  588. package/src/migrations/0013_app_tools_source.sql +4 -0
  589. package/src/migrations/0014_tool_specs.sql +8 -0
  590. package/src/migrations/0015_tool_drift.sql +20 -0
  591. package/src/migrations/0016_plugin_permissions.sql +11 -0
  592. package/src/migrations/0017_identity_sources.sql +6 -0
  593. package/src/migrations/0018_channels.sql +74 -0
  594. package/src/migrations/0019_identity_trust.sql +17 -0
  595. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  596. package/src/migrations/0021_org_storage_purge.sql +9 -0
  597. package/src/migrations/0022_attachments.sql +29 -0
  598. package/src/migrations/0023_sandboxes.sql +37 -0
  599. package/src/migrations/0024_skills.sql +46 -0
  600. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  601. package/src/migrations/0026_skill_changes.sql +34 -0
  602. package/src/migrations/0027_model_prices.sql +18 -0
  603. package/src/migrations/0028_evals.sql +105 -0
  604. package/src/migrations/0029_model_purposes.sql +18 -0
  605. package/src/migrations/0030_plugin_installs.sql +73 -0
  606. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  607. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  608. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  609. package/src/migrations/0034_directory.sql +49 -0
  610. package/src/migrations/0035_catalogs.sql +40 -0
  611. package/src/migrations/0036_app_import_staging.sql +17 -0
  612. package/src/migrations/0037_directory_installs.sql +92 -0
  613. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  614. package/src/migrations/0039_channel_card_pending.sql +8 -0
  615. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  616. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  617. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  618. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  619. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  620. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  621. package/src/migrations/0046_git_sources.sql +25 -0
  622. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  623. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  624. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  625. package/src/migrations/0050_bootstrap.sql +53 -0
  626. package/src/migrations/0051_claude_compat.sql +26 -0
  627. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  628. package/src/migrations/0053_subagents.sql +73 -0
  629. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  630. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  631. package/src/migrations/0056_approval_reason.sql +3 -0
  632. package/src/migrations/0057_conversation_titles.sql +11 -0
  633. package/src/migrations/0058_conversation_selection.sql +4 -0
  634. package/src/migrations/0059_conversation_queue.sql +22 -0
  635. package/src/migrations/0060_file_previewers.sql +10 -0
  636. package/src/migrations/0061_queue_selection.sql +5 -0
  637. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,137 @@
1
+ import { ToolError } from "@capybara-hq/plugin-sdk";
2
+ import { clip, display, inSandbox, runBudgetNote, runTimeLeftMs, sandboxBaseTimeoutMs, unavailableWhenNoSandbox, withNotices, } from "./common.js";
3
+ /** 不给 `timeoutSeconds` 时的命令超时(秒),不超过 `sandbox.limits.maxCommandSeconds`。 */
4
+ export const BASH_DEFAULT_TIMEOUT_SECONDS = 120;
5
+ /** The longest `description` (the shell row shows it instead of the command). */
6
+ export const BASH_DESCRIPTION_MAX_CHARS = 120;
7
+ /** bash 结果超过这么多字符即转存(走现有输出存档,模型用 read_tool_output 分页读)。 */
8
+ export const BASH_SPILL_CHARS = 30_000;
9
+ /** 一次命令最多收集的输出字节(stdout + stderr);超出的丢弃并在结果里说明。 */
10
+ const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
11
+ const SPEC = {
12
+ name: "sandbox_bash",
13
+ // Display only (the tool row; not in the fingerprint, never sent to the model).
14
+ keyArgs: ["command"],
15
+ description: "Run a shell command (bash) in this conversation's sandbox, an isolated Linux machine. " +
16
+ "Use it to run programs and scripts, install packages, process files and inspect the " +
17
+ "filesystem. The working directory is /workspace; files persist between calls in the same " +
18
+ "conversation, but background processes may not: when the sandbox is suspended after a period " +
19
+ "without use they can be stopped and /tmp cleared, so keep results in files under /workspace. " +
20
+ "Files the user attached to the conversation are under /workspace/attachments, " +
21
+ "and skill files under /skills (read-only). Each call runs in a fresh shell (no state such as " +
22
+ "cd or environment variables carries over). The result has stdout, stderr and the exit code; " +
23
+ "long output is saved and can be paged with read_tool_output. A command that runs longer than " +
24
+ "timeoutSeconds is stopped. Prefer sandbox_read, sandbox_write, sandbox_edit, sandbox_glob and " +
25
+ "sandbox_grep for reading, writing and searching files. To give a file to the user, use " +
26
+ "sandbox_deliver. Other sub-agents of this conversation may run commands in this sandbox at " +
27
+ "the same time. Always pass description: a few words saying what the command is for; the " +
28
+ "user sees it instead of the command.",
29
+ inputSchema: {
30
+ type: "object",
31
+ properties: {
32
+ command: {
33
+ type: "string",
34
+ minLength: 1,
35
+ description: 'The command line to run, e.g. "python3 analyze.py data.csv".',
36
+ },
37
+ description: {
38
+ type: "string",
39
+ minLength: 1,
40
+ maxLength: BASH_DESCRIPTION_MAX_CHARS,
41
+ description: 'What this command does, in a few words (e.g. "Generate the final PDF"). Shown to the user.',
42
+ },
43
+ timeoutSeconds: {
44
+ type: "integer",
45
+ minimum: 1,
46
+ description: `Seconds before the command is stopped. Default ${BASH_DEFAULT_TIMEOUT_SECONDS}; the deployment sets a maximum (7200 by default).`,
47
+ },
48
+ },
49
+ required: ["command", "description"],
50
+ additionalProperties: false,
51
+ },
52
+ };
53
+ /** 本次命令的超时(秒):给定的值,或默认值(不超过上限)。 */
54
+ const secondsFor = (input, max) => input.timeoutSeconds ?? Math.min(BASH_DEFAULT_TIMEOUT_SECONDS, max);
55
+ /**
56
+ * 命令结果 → 给模型的文本。`budgetClamped`:运行的时限把超时收紧到了 `seconds`(Ruling M20),超时说明改为
57
+ * 指向 `runtime.maxRunSeconds`,而不是让模型加大 timeoutSeconds。
58
+ */
59
+ export function formatExec(r, seconds, budgetClamped = false) {
60
+ const parts = [];
61
+ if (r.stdout !== "")
62
+ parts.push(r.stdout.replace(/\n$/, ""));
63
+ if (r.stderr !== "")
64
+ parts.push(`[stderr]\n${r.stderr.replace(/\n$/, "")}`);
65
+ if (r.truncated)
66
+ parts.push(`[Output truncated: only the first ${MAX_OUTPUT_BYTES} bytes were kept.]`);
67
+ if (r.timedOut && budgetClamped) {
68
+ parts.push(`[timedOut: the command did not finish within ${seconds}s and was stopped. ${runBudgetNote(seconds)} The sandbox is still usable; split the work into shorter steps that save progress to files under /workspace, or run long jobs in the background and check on them in a later run.]`);
69
+ }
70
+ else if (r.timedOut) {
71
+ parts.push(`[timedOut: the command did not finish within ${seconds}s and was stopped. The sandbox is still usable; pass a larger timeoutSeconds (up to the deployment maximum), or split the work into shorter steps that save progress to files under /workspace.]`);
72
+ }
73
+ else if (r.exitCode === null) {
74
+ parts.push("[The command was stopped before it finished; its effects may be partial. Check the sandbox state before retrying.]");
75
+ }
76
+ else {
77
+ parts.push(`[exit code: ${r.exitCode}]`);
78
+ if (budgetClamped)
79
+ parts.push(`[${runBudgetNote(seconds)}]`);
80
+ }
81
+ return parts.join("\n");
82
+ }
83
+ /** 内置工具 `sandbox_bash`:在本对话的沙箱里执行命令。 */
84
+ export function sandboxBashTool(deps) {
85
+ return {
86
+ spec: SPEC,
87
+ defaultPolicy: "allow",
88
+ spillChars: BASH_SPILL_CHARS,
89
+ unavailable: unavailableWhenNoSandbox(deps),
90
+ // 命令自己的超时先到(提供方停掉命令、返回 timedOut),管线的时限再留出等锁与创建 / 恢复的余量
91
+ timeoutMs: (input) => {
92
+ const cfg = deps.config();
93
+ const max = cfg.sandbox.limits.maxCommandSeconds;
94
+ return Math.min(secondsFor(input, max), max) * 1000 + sandboxBaseTimeoutMs(cfg);
95
+ },
96
+ async run(input, ctx) {
97
+ const { command, description } = input;
98
+ const max = deps.config().sandbox.limits.maxCommandSeconds;
99
+ const req = input.timeoutSeconds;
100
+ if (req !== undefined && req > max) {
101
+ throw new ToolError(`timeoutSeconds ${req} is over the limit of ${max} seconds; pass a value of at most ${max}.`);
102
+ }
103
+ const asked = secondsFor(input, max);
104
+ // 运行截止前命令要自己超时(Ruling M20):在拿到沙箱之后算,等锁与恢复用掉的时间一并扣掉
105
+ let seconds = asked;
106
+ const { value: r, notices } = await inSandbox(deps, ctx, ({ h, p, signal }) => {
107
+ const left = Math.floor(runTimeLeftMs(ctx.runDeadline) / 1000);
108
+ seconds = Math.max(1, Math.min(asked, left));
109
+ return p.exec(h, {
110
+ command,
111
+ cwd: "/workspace",
112
+ timeoutMs: seconds * 1000,
113
+ maxOutputBytes: MAX_OUTPUT_BYTES,
114
+ signal,
115
+ });
116
+ });
117
+ const clamped = seconds < asked;
118
+ const shown = clip(command, 120);
119
+ return {
120
+ content: [{ type: "text", text: withNotices(notices, formatExec(r, seconds, clamped)) }],
121
+ isError: r.timedOut || r.exitCode === null,
122
+ // display only: a non-zero exit shows as failed on the row, `isError` stays as it was
123
+ view: {
124
+ kind: "command",
125
+ ...(description !== undefined && { description }),
126
+ exitCode: r.exitCode,
127
+ timedOut: r.timedOut,
128
+ },
129
+ display: r.timedOut
130
+ ? display(`命令超时(${seconds} 秒):${shown}`, `Command timed out (${seconds}s): ${shown}`)
131
+ : r.exitCode === null
132
+ ? display(`命令被中止:${shown}`, `Command stopped: ${shown}`)
133
+ : display(`运行命令(退出码 ${r.exitCode}):${shown}`, `Ran command (exit ${r.exitCode}): ${shown}`),
134
+ };
135
+ },
136
+ };
137
+ }
@@ -0,0 +1,116 @@
1
+ import { type SandboxHandle, type SandboxProvider } from "@capybara-hq/plugin-sdk";
2
+ import type { KernelConfig } from "../../../config/schema.js";
3
+ import type { AttachmentsService } from "../../../conversations/attachments.service.js";
4
+ import type { EventLog } from "../../../conversations/event-log.js";
5
+ import { type SandboxService } from "../../../sandbox/sandbox.service.js";
6
+ import type { StorageService } from "../../../storage/storage.service.js";
7
+ import type { BuiltinCallContext } from "../../registry.js";
8
+ /** 沙箱工具的依赖(都按调用时取,多副本下无进程内状态)。 */
9
+ export interface SandboxToolDeps {
10
+ /** `pathLease` may be absent (test stubs): the kernel's own file writes then take no path lease. */
11
+ sandbox: Pick<SandboxService, "available" | "withSandbox"> & Partial<Pick<SandboxService, "pathLease">>;
12
+ attachments: Pick<AttachmentsService, "listForConversation" | "openForConversation">;
13
+ storage: Pick<StorageService, "kernel" | "available">;
14
+ /** `publishChanged`: `sandbox_deliver` announces `changed: files` (UI refresh B). */
15
+ eventLog: Pick<EventLog, "append"> & Partial<Pick<EventLog, "publishChanged">>;
16
+ config: () => KernelConfig;
17
+ }
18
+ /** 回调拿到的沙箱:句柄、提供方与「调用 signal + 锁丢失」合并后的 signal(每个提供方调用都传它)。 */
19
+ export interface SandboxSession {
20
+ h: SandboxHandle;
21
+ p: SandboxProvider;
22
+ signal: AbortSignal;
23
+ /** 本次是新建 / 重建的沙箱(之前复制进去的文件都已不在)。 */
24
+ reset: boolean;
25
+ }
26
+ /** 没有沙箱提供方时「工具不可用」的原因(进提醒与调用结果)。 */
27
+ /** 本对话第一次用沙箱。 */
28
+ export declare const SANDBOX_STARTED_NOTICE = "Sandbox started for this conversation (first use); the working directory is /workspace.";
29
+ /** 沙箱被重建(之前的实例已销毁或不在了)。 */
30
+ export declare const SANDBOX_RECREATED_NOTICE = "Sandbox was recreated; previous files are gone.";
31
+ /** 没有沙箱提供方时「工具不可用」的原因(进提醒,内核在后面补句号):与调用时的错误同一句话。 */
32
+ export declare const SANDBOX_UNAVAILABLE_REASON: string;
33
+ /** 沙箱里附件所在目录。 */
34
+ export declare const ATTACHMENTS_DIR = "/workspace/attachments";
35
+ /** 已同步附件的标记文件:`{ <附件 id>: <文件名> }`。 */
36
+ export declare const SYNC_MARKER = "/workspace/attachments/.capybara-sync.json";
37
+ /** 附件文件名的上限(UTF-8 字节,常见文件系统单个文件名上限 255 字节,留出 `-N` 后缀的余量)。 */
38
+ export declare const ATTACHMENT_NAME_MAX_BYTES = 200;
39
+ /**
40
+ * Extra margin (ms) on top of a sandbox tool's time limit: creating / resuming the sandbox, and the
41
+ * fallback for stopping a command after its timeout (when the E2B kill script does not finish, the
42
+ * sandbox is restarted: up to about 20 s to kill, plus pause and a cold connect of up to 120 s, about
43
+ * 160 s). Pulling the image on first creation is not included (deployments pre-pull
44
+ * `sandbox.image`; see the sandbox-docker plugin's README in capybara-hq/plugins).
45
+ */
46
+ export declare const SANDBOX_SETUP_MARGIN_MS = 180000;
47
+ /**
48
+ * 沙箱工具的基本执行时限:`tools.timeoutMs` + 等锁(`sandbox.lockWaitSeconds`)+ {@link SANDBOX_SETUP_MARGIN_MS}。
49
+ */
50
+ export declare const sandboxBaseTimeoutMs: (cfg: KernelConfig) => number;
51
+ /**
52
+ * 运行截止前给沙箱命令留的余量(毫秒):命令超时后停命令、写工具结果的时间(Ruling M20)。
53
+ */
54
+ export declare const RUN_DEADLINE_MARGIN_MS = 30000;
55
+ /**
56
+ * 运行还允许沙箱命令跑多久(毫秒):截止时间减去 {@link RUN_DEADLINE_MARGIN_MS};没有截止时间为 Infinity。
57
+ * 可能为负(快到截止了),调用方自己取下限。
58
+ */
59
+ export declare function runTimeLeftMs(runDeadline: number | undefined, now?: number): number;
60
+ /**
61
+ * glob / grep 的命令超时:不超过 `tools.timeoutMs`,且放得进本次调用剩下的时间(基本时限从 `startedAt` 起算,
62
+ * 扣掉 {@link SANDBOX_SETUP_MARGIN_MS},留给超时后停命令的兜底)与运行剩下的时间({@link runTimeLeftMs})——
63
+ * 等锁或恢复沙箱用掉的时间从这里扣,命令自己先超时、给模型可执行的说明,而不是被管线的时限或运行截止打断。
64
+ * 至少 1 秒。
65
+ */
66
+ export declare function searchTimeoutMs(cfg: KernelConfig, startedAt: number, now?: number, runDeadline?: number): number;
67
+ /** 运行时限收紧了命令超时时给模型的说明(英文)。 */
68
+ export declare const runBudgetNote: (seconds: number) => string;
69
+ /** 显示摘要(中英文,各截到 200 码点以内;只给界面看)。 */
70
+ export declare function display(zh: string, en: string): {
71
+ summary: {
72
+ zh: string;
73
+ en: string;
74
+ };
75
+ };
76
+ /** 折叠空白并按码点截断(显示摘要与错误里引用用户 / 模型给的文本)。 */
77
+ export declare function clip(s: string, max: number): string;
78
+ /** 结果正文前加上沙箱状态说明。 */
79
+ export declare function withNotices(notices: readonly string[], text: string): string;
80
+ /** 校验沙箱内路径(`validateSandboxPath`);不合法抛给模型可执行的错误。 */
81
+ export declare function checkPath(path: string, field?: string): string;
82
+ /** 写入类工具的路径:`/skills` 是技能文件的只读副本。 */
83
+ export declare function checkWritable(path: string): string;
84
+ /** POSIX shell 单引号转义。 */
85
+ export declare function shellQuote(s: string): string;
86
+ /**
87
+ * 给附件分配沙箱里的文件名(按给定顺序,确定性):清理成安全的路径段(≤ {@link ATTACHMENT_NAME_MAX_BYTES}
88
+ * 字节),与 `used`(已同步的)及彼此不重名,重名时加 `-2`、`-3`……(加在扩展名之前)。
89
+ * 清理后仍不是合法沙箱路径的用 `attachment-<id 前 8 位>`。
90
+ */
91
+ export declare function assignAttachmentNames(items: readonly {
92
+ id: string;
93
+ name: string;
94
+ }[], used: ReadonlySet<string>): Map<string, string>;
95
+ /**
96
+ * 在本对话的沙箱上执行 `fn`(`SandboxService.withSandbox`:懒创建、恢复、重建):先同步附件,
97
+ * 再执行;返回结果与要加在结果开头的状态说明(首次使用 / 重建 / 新复制的附件)。
98
+ * `withSandbox` 遇到实例不在时会重建并再调用一次回调,说明按最后一次调用的为准。
99
+ */
100
+ export declare function inSandbox<T>(deps: SandboxToolDeps, ctx: BuiltinCallContext, fn: (s: SandboxSession) => Promise<T>): Promise<{
101
+ value: T;
102
+ notices: string[];
103
+ }>;
104
+ /** The conversation whose sandbox a call uses (the parent's for a sub-agent). */
105
+ export declare const sandboxConversationOf: (ctx: BuiltinCallContext) => string;
106
+ /**
107
+ * Runs `fn` under the per-path lease of `path` in the call's sandbox (spec §10.4: the kernel's own
108
+ * read-modify-write of one file never loses another holder's update). `fn` gets `signal` combined
109
+ * with the path lease's: pass it to every provider call, so a lost path lease stops the write.
110
+ * Without `pathLease` (test stubs) it just runs `fn` with `signal`.
111
+ */
112
+ export declare function withPathLease<T>(deps: Pick<SandboxToolDeps, "sandbox">, ctx: BuiltinCallContext, path: string, signal: AbortSignal, fn: (signal: AbortSignal) => Promise<T>): Promise<T>;
113
+ /** 本部署是否有沙箱:没有时返回「不可用」原因(注册表据此把沙箱工具报为不可用)。 */
114
+ export declare const unavailableWhenNoSandbox: (deps: Pick<SandboxToolDeps, "sandbox">) => () => string | null;
115
+ /** 读出的字节是否像二进制(开头 8 KB 里有 NUL)。 */
116
+ export declare function looksBinary(data: Uint8Array): boolean;
@@ -0,0 +1,306 @@
1
+ import { isSandboxGoneError, ToolError, validateSandboxPath, } from "@capybara-hq/plugin-sdk";
2
+ import { ApiError } from "../../../errors.js";
3
+ import { SandboxPathBusyError } from "../../../sandbox/leases.js";
4
+ import { SandboxLockLostError } from "../../../sandbox/sandbox.service.js";
5
+ // ---- 模型可见文案(英文) ----
6
+ /** 没有沙箱提供方时「工具不可用」的原因(进提醒与调用结果)。 */
7
+ /** 本对话第一次用沙箱。 */
8
+ export const SANDBOX_STARTED_NOTICE = "Sandbox started for this conversation (first use); the working directory is /workspace.";
9
+ /** 沙箱被重建(之前的实例已销毁或不在了)。 */
10
+ export const SANDBOX_RECREATED_NOTICE = "Sandbox was recreated; previous files are gone.";
11
+ const BUSY_TEXT = "The sandbox is busy with another command in this conversation; wait for it to finish and retry.";
12
+ const NO_SANDBOX_TEXT = "No sandbox is configured in this deployment; ask an administrator to install a sandbox plugin, or do the task without the sandbox.";
13
+ /** 没有沙箱提供方时「工具不可用」的原因(进提醒,内核在后面补句号):与调用时的错误同一句话。 */
14
+ export const SANDBOX_UNAVAILABLE_REASON = NO_SANDBOX_TEXT.slice(0, -1);
15
+ const PATH_BUSY_TEXT = "Another sub-agent is writing this file; wait a moment and retry.";
16
+ const LOCK_LOST_TEXT = "The sandbox operation was interrupted because the sandbox lock was lost; check the sandbox state and retry.";
17
+ /** 沙箱里附件所在目录。 */
18
+ export const ATTACHMENTS_DIR = "/workspace/attachments";
19
+ /** 已同步附件的标记文件:`{ <附件 id>: <文件名> }`。 */
20
+ export const SYNC_MARKER = `${ATTACHMENTS_DIR}/.capybara-sync.json`;
21
+ const MARKER_MAX_BYTES = 1024 * 1024;
22
+ /** 附件文件名的上限(UTF-8 字节,常见文件系统单个文件名上限 255 字节,留出 `-N` 后缀的余量)。 */
23
+ export const ATTACHMENT_NAME_MAX_BYTES = 200;
24
+ /**
25
+ * Extra margin (ms) on top of a sandbox tool's time limit: creating / resuming the sandbox, and the
26
+ * fallback for stopping a command after its timeout (when the E2B kill script does not finish, the
27
+ * sandbox is restarted: up to about 20 s to kill, plus pause and a cold connect of up to 120 s, about
28
+ * 160 s). Pulling the image on first creation is not included (deployments pre-pull
29
+ * `sandbox.image`; see the sandbox-docker plugin's README in capybara-hq/plugins).
30
+ */
31
+ export const SANDBOX_SETUP_MARGIN_MS = 180_000;
32
+ /**
33
+ * 沙箱工具的基本执行时限:`tools.timeoutMs` + 等锁(`sandbox.lockWaitSeconds`)+ {@link SANDBOX_SETUP_MARGIN_MS}。
34
+ */
35
+ export const sandboxBaseTimeoutMs = (cfg) => cfg.tools.timeoutMs + cfg.sandbox.lockWaitSeconds * 1000 + SANDBOX_SETUP_MARGIN_MS;
36
+ /**
37
+ * 运行截止前给沙箱命令留的余量(毫秒):命令超时后停命令、写工具结果的时间(Ruling M20)。
38
+ */
39
+ export const RUN_DEADLINE_MARGIN_MS = 30_000;
40
+ /**
41
+ * 运行还允许沙箱命令跑多久(毫秒):截止时间减去 {@link RUN_DEADLINE_MARGIN_MS};没有截止时间为 Infinity。
42
+ * 可能为负(快到截止了),调用方自己取下限。
43
+ */
44
+ export function runTimeLeftMs(runDeadline, now = Date.now()) {
45
+ return runDeadline === undefined ? Infinity : runDeadline - RUN_DEADLINE_MARGIN_MS - now;
46
+ }
47
+ /**
48
+ * glob / grep 的命令超时:不超过 `tools.timeoutMs`,且放得进本次调用剩下的时间(基本时限从 `startedAt` 起算,
49
+ * 扣掉 {@link SANDBOX_SETUP_MARGIN_MS},留给超时后停命令的兜底)与运行剩下的时间({@link runTimeLeftMs})——
50
+ * 等锁或恢复沙箱用掉的时间从这里扣,命令自己先超时、给模型可执行的说明,而不是被管线的时限或运行截止打断。
51
+ * 至少 1 秒。
52
+ */
53
+ export function searchTimeoutMs(cfg, startedAt, now = Date.now(), runDeadline) {
54
+ const left = startedAt + sandboxBaseTimeoutMs(cfg) - SANDBOX_SETUP_MARGIN_MS - now;
55
+ return Math.max(1000, Math.min(cfg.tools.timeoutMs, left, runTimeLeftMs(runDeadline, now)));
56
+ }
57
+ /** 运行时限收紧了命令超时时给模型的说明(英文)。 */
58
+ export const runBudgetNote = (seconds) => `This run's time budget limits commands to ${seconds} seconds (configurable via runtime.maxRunSeconds).`;
59
+ /** 显示摘要(中英文,各截到 200 码点以内;只给界面看)。 */
60
+ export function display(zh, en) {
61
+ return { summary: { zh: clip(zh, 200), en: clip(en, 200) } };
62
+ }
63
+ /** 折叠空白并按码点截断(显示摘要与错误里引用用户 / 模型给的文本)。 */
64
+ export function clip(s, max) {
65
+ const flat = s.replace(/\s+/g, " ").trim();
66
+ const cps = [...flat];
67
+ return cps.length <= max ? flat : `${cps.slice(0, max - 1).join("")}…`;
68
+ }
69
+ /** 结果正文前加上沙箱状态说明。 */
70
+ export function withNotices(notices, text) {
71
+ return [...notices, text].join("\n\n");
72
+ }
73
+ /** 校验沙箱内路径(`validateSandboxPath`);不合法抛给模型可执行的错误。 */
74
+ export function checkPath(path, field = "path") {
75
+ const errors = validateSandboxPath(path);
76
+ if (errors.length > 0) {
77
+ throw new ToolError(`Invalid ${field} "${clip(path, 200)}": ${errors.join("; ")}. Pass an absolute path under /workspace, /skills or /tmp.`);
78
+ }
79
+ return path.length > 1 && path.endsWith("/") ? path.slice(0, -1) : path;
80
+ }
81
+ /** 写入类工具的路径:`/skills` 是技能文件的只读副本。 */
82
+ export function checkWritable(path) {
83
+ const p = checkPath(path);
84
+ if (p === "/skills" || p.startsWith("/skills/")) {
85
+ throw new ToolError(`Path ${clip(p, 200)} is read-only (/skills holds skill files); pass a path under /workspace or /tmp instead.`);
86
+ }
87
+ return p;
88
+ }
89
+ /** POSIX shell 单引号转义。 */
90
+ export function shellQuote(s) {
91
+ return `'${s.replace(/'/g, `'\\''`)}'`;
92
+ }
93
+ const utf8 = new TextEncoder();
94
+ const byteLength = (s) => Buffer.byteLength(s, "utf8");
95
+ /** 拆成主名与扩展名(扩展名不超过 20 字节,`.` 开头的隐藏文件没有扩展名)。 */
96
+ function splitExt(n) {
97
+ const dot = n.lastIndexOf(".");
98
+ return dot > 0 && byteLength(n.slice(dot)) <= 20 ? [n.slice(0, dot), n.slice(dot)] : [n, ""];
99
+ }
100
+ /** `stem + suffix + ext` 不超过 {@link ATTACHMENT_NAME_MAX_BYTES} 字节:按码点截短主名,保留后缀与扩展名。 */
101
+ function fitName(stem, suffix, ext) {
102
+ const room = ATTACHMENT_NAME_MAX_BYTES - byteLength(suffix + ext);
103
+ let out = "";
104
+ let used = 0;
105
+ for (const cp of stem) {
106
+ const b = byteLength(cp);
107
+ if (used + b > room)
108
+ break;
109
+ out += cp;
110
+ used += b;
111
+ }
112
+ return out + suffix + ext;
113
+ }
114
+ /** 把一个文件名清理成单个安全的路径段(控制字符、`/`、`\` 换成 `_`),过长时保留扩展名按字节截断。 */
115
+ function sanitizeName(raw) {
116
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: 正是要换掉控制字符
117
+ const n = raw.replace(/[\u0000-\u001f\u007f/\\]/g, "_").trim();
118
+ if (n === "" || n === "." || n === "..")
119
+ return "attachment";
120
+ if (byteLength(n) <= ATTACHMENT_NAME_MAX_BYTES)
121
+ return n;
122
+ const [stem, ext] = splitExt(n);
123
+ return fitName(stem, "", ext);
124
+ }
125
+ /**
126
+ * 给附件分配沙箱里的文件名(按给定顺序,确定性):清理成安全的路径段(≤ {@link ATTACHMENT_NAME_MAX_BYTES}
127
+ * 字节),与 `used`(已同步的)及彼此不重名,重名时加 `-2`、`-3`……(加在扩展名之前)。
128
+ * 清理后仍不是合法沙箱路径的用 `attachment-<id 前 8 位>`。
129
+ */
130
+ export function assignAttachmentNames(items, used) {
131
+ const taken = new Set(used);
132
+ taken.add(SYNC_MARKER.slice(ATTACHMENTS_DIR.length + 1));
133
+ const out = new Map();
134
+ for (const a of items) {
135
+ let base = sanitizeName(a.name);
136
+ if (validateSandboxPath(`${ATTACHMENTS_DIR}/${base}`).length > 0) {
137
+ base = `attachment-${a.id.slice(0, 8)}`;
138
+ }
139
+ let name = base;
140
+ if (taken.has(name)) {
141
+ const [stem, ext] = splitExt(base);
142
+ for (let i = 2; taken.has(name); i++)
143
+ name = fitName(stem, `-${i}`, ext);
144
+ }
145
+ taken.add(name);
146
+ out.set(a.id, name);
147
+ }
148
+ return out;
149
+ }
150
+ /** 解析标记文件;坏的按空处理(重新同步,同名文件被覆盖)。 */
151
+ function parseMarker(data) {
152
+ try {
153
+ const v = JSON.parse(new TextDecoder().decode(data));
154
+ if (v === null || typeof v !== "object" || Array.isArray(v))
155
+ return {};
156
+ return Object.fromEntries(Object.entries(v).filter((e) => typeof e[1] === "string"));
157
+ }
158
+ catch {
159
+ return {};
160
+ }
161
+ }
162
+ /** 一个附件复制失败时给模型的原因(不带内部细节)。 */
163
+ function copyFailureReason(e) {
164
+ if (e instanceof ApiError && e.code === "storage.unavailable") {
165
+ return "file storage is unavailable";
166
+ }
167
+ return "a temporary error occurred; it will be retried on the next sandbox call";
168
+ }
169
+ /**
170
+ * 把本对话已 ready 的附件复制到 `/workspace/attachments/<name>`,标记文件记下已复制的(不重复复制)。
171
+ * `reset`(新建 / 重建的沙箱,文件已不在)时忽略标记文件全部重新复制。对象已不在的附件跳过(下次再试)。
172
+ * 每复制一个就更新标记文件:中途超时 / 中止,下次从停下的地方继续。
173
+ * 单个附件失败(存储故障等)只跳过它并给出说明,不让工具调用失败;signal 已中止或实例已不在时照常抛出。
174
+ * 返回本次复制的沙箱路径与失败说明。
175
+ */
176
+ async function syncAttachments(deps, ctx, s, reset) {
177
+ const none = { copied: [], failures: [] };
178
+ const conv = sandboxConversationOf(ctx);
179
+ const list = await deps.attachments.listForConversation(ctx.orgId, conv);
180
+ if (list.length === 0)
181
+ return none;
182
+ // nothing to copy (the usual case): no path lease, so calls do not queue on the marker
183
+ if (!reset) {
184
+ const marker = await readSyncMarker(s);
185
+ if (list.every((a) => Object.hasOwn(marker, a.id)))
186
+ return none;
187
+ }
188
+ // the sync marker is read, changed and written: one holder at a time
189
+ return withPathLease(deps, ctx, SYNC_MARKER, s.signal, (signal) => copyAttachments(deps, ctx, { ...s, signal }, reset, conv, list));
190
+ }
191
+ /** The sync marker's entries (`{}` when it is missing, too large or unreadable). */
192
+ async function readSyncMarker(s) {
193
+ const m = await s.p.readFile(s.h, SYNC_MARKER, { maxBytes: MARKER_MAX_BYTES, signal: s.signal });
194
+ return m && !m.truncated ? parseMarker(m.data) : {};
195
+ }
196
+ async function copyAttachments(deps, ctx, s, reset, conv, list) {
197
+ const none = { copied: [], failures: [] };
198
+ let marker = reset ? {} : await readSyncMarker(s);
199
+ const pending = list.filter((a) => !Object.hasOwn(marker, a.id));
200
+ if (pending.length === 0)
201
+ return none;
202
+ const names = assignAttachmentNames(pending, new Set(Object.values(marker)));
203
+ const copied = [];
204
+ const failures = [];
205
+ for (const a of pending) {
206
+ const name = names.get(a.id);
207
+ const path = `${ATTACHMENTS_DIR}/${name}`;
208
+ try {
209
+ const opened = await deps.attachments.openForConversation(ctx.orgId, conv, a.id);
210
+ if (!opened)
211
+ continue;
212
+ const bytes = new Uint8Array(await new Response(opened.body).arrayBuffer());
213
+ await s.p.writeFile(s.h, path, bytes, s.signal);
214
+ }
215
+ catch (e) {
216
+ // 中止(超时 / 锁丢失 / 运行停止)与实例已不在(withSandbox 据此重建)不吞
217
+ if (s.signal.aborted || isSandboxGoneError(e))
218
+ throw e;
219
+ failures.push(`Attachment ${name} could not be copied: ${copyFailureReason(e)}.`);
220
+ continue;
221
+ }
222
+ // 文件已复制:本次算复制成功。标记写成功后才记进内存里的标记(之后的写入不带上未落盘的项);
223
+ // 标记写失败只意味着下次会重新复制这个文件
224
+ copied.push(path);
225
+ const next = { ...marker, [a.id]: name };
226
+ try {
227
+ await s.p.writeFile(s.h, SYNC_MARKER, utf8.encode(JSON.stringify(next)), s.signal);
228
+ marker = next;
229
+ }
230
+ catch (e) {
231
+ if (s.signal.aborted || isSandboxGoneError(e))
232
+ throw e;
233
+ }
234
+ }
235
+ return { copied, failures };
236
+ }
237
+ /** 沙箱服务的错误 → 给模型的可执行说明;其余原样抛出(管线按「工具失败」处理)。 */
238
+ function mapError(e) {
239
+ if (e instanceof ApiError) {
240
+ if (e.code === "sandbox.busy")
241
+ return new ToolError(BUSY_TEXT);
242
+ if (e.code === "sandbox.unavailable")
243
+ return new ToolError(NO_SANDBOX_TEXT);
244
+ }
245
+ if (e instanceof SandboxLockLostError)
246
+ return new ToolError(LOCK_LOST_TEXT);
247
+ if (e instanceof SandboxPathBusyError)
248
+ return new ToolError(PATH_BUSY_TEXT);
249
+ return e;
250
+ }
251
+ /**
252
+ * 在本对话的沙箱上执行 `fn`(`SandboxService.withSandbox`:懒创建、恢复、重建):先同步附件,
253
+ * 再执行;返回结果与要加在结果开头的状态说明(首次使用 / 重建 / 新复制的附件)。
254
+ * `withSandbox` 遇到实例不在时会重建并再调用一次回调,说明按最后一次调用的为准。
255
+ */
256
+ export async function inSandbox(deps, ctx, fn) {
257
+ try {
258
+ return await deps.sandbox.withSandbox({
259
+ orgId: ctx.orgId,
260
+ conversationId: sandboxConversationOf(ctx),
261
+ // a sub-agent is told when another holder rebuilt the shared sandbox (final review m5)
262
+ holderConversationId: ctx.conversationId,
263
+ }, async (h, p, info, signal) => {
264
+ const s = { h, p, signal, reset: info.fresh || info.recreated };
265
+ const notices = [];
266
+ if (info.recreated)
267
+ notices.push(SANDBOX_RECREATED_NOTICE);
268
+ else if (info.fresh)
269
+ notices.push(SANDBOX_STARTED_NOTICE);
270
+ const { copied, failures } = await syncAttachments(deps, ctx, s, s.reset);
271
+ if (copied.length > 0) {
272
+ notices.push(`Attachments copied into the sandbox: ${copied.join(", ")}.`);
273
+ }
274
+ notices.push(...failures);
275
+ return { value: await fn(s), notices };
276
+ }, ctx.signal);
277
+ }
278
+ catch (e) {
279
+ throw mapError(e);
280
+ }
281
+ }
282
+ /** The conversation whose sandbox a call uses (the parent's for a sub-agent). */
283
+ export const sandboxConversationOf = (ctx) => ctx.sandboxConversationId ?? ctx.conversationId;
284
+ /**
285
+ * Runs `fn` under the per-path lease of `path` in the call's sandbox (spec §10.4: the kernel's own
286
+ * read-modify-write of one file never loses another holder's update). `fn` gets `signal` combined
287
+ * with the path lease's: pass it to every provider call, so a lost path lease stops the write.
288
+ * Without `pathLease` (test stubs) it just runs `fn` with `signal`.
289
+ */
290
+ export async function withPathLease(deps, ctx, path, signal, fn) {
291
+ if (!deps.sandbox.pathLease)
292
+ return fn(signal);
293
+ const lease = await deps.sandbox.pathLease(sandboxConversationOf(ctx), path, signal);
294
+ try {
295
+ return await fn(AbortSignal.any([signal, lease.signal]));
296
+ }
297
+ finally {
298
+ await lease.release().catch(() => { });
299
+ }
300
+ }
301
+ /** 本部署是否有沙箱:没有时返回「不可用」原因(注册表据此把沙箱工具报为不可用)。 */
302
+ export const unavailableWhenNoSandbox = (deps) => () => deps.sandbox.available ? null : SANDBOX_UNAVAILABLE_REASON;
303
+ /** 读出的字节是否像二进制(开头 8 KB 里有 NUL)。 */
304
+ export function looksBinary(data) {
305
+ return data.subarray(0, 8192).includes(0);
306
+ }
@@ -0,0 +1,5 @@
1
+ import type { BuiltinTool } from "../../registry.js";
2
+ import { type SandboxToolDeps } from "./common.js";
3
+ export declare function contentTypeFor(name: string): string;
4
+ /** 内置工具 `sandbox_deliver`:把沙箱里的文件存进对象存储,写 `artifact_created`,用户可下载。 */
5
+ export declare function sandboxDeliverTool(deps: SandboxToolDeps): BuiltinTool;