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

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 (631) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +22 -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 +1125 -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 +223 -0
  112. package/dist/config/schema.js +1151 -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 +422 -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 +150 -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 +210 -0
  166. package/dist/errors.js +212 -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 +789 -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 +149 -0
  210. package/dist/extensions/bootstrap.js +441 -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 +170 -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 +67 -0
  318. package/dist/index.js +65 -0
  319. package/dist/kernel.d.ts +256 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log.d.ts +48 -0
  322. package/dist/log.js +229 -0
  323. package/dist/models/prices.d.ts +53 -0
  324. package/dist/models/prices.js +121 -0
  325. package/dist/models/purposes.controller.d.ts +19 -0
  326. package/dist/models/purposes.controller.js +56 -0
  327. package/dist/models/purposes.d.ts +140 -0
  328. package/dist/models/purposes.js +267 -0
  329. package/dist/net/proxy.d.ts +44 -0
  330. package/dist/net/proxy.js +162 -0
  331. package/dist/net/public-address.d.ts +60 -0
  332. package/dist/net/public-address.js +271 -0
  333. package/dist/net/safe-fetch.d.ts +38 -0
  334. package/dist/net/safe-fetch.js +140 -0
  335. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  336. package/dist/orgs/directory-sync.controller.js +40 -0
  337. package/dist/orgs/directory-sync.d.ts +166 -0
  338. package/dist/orgs/directory-sync.js +558 -0
  339. package/dist/orgs/invitations.controller.d.ts +58 -0
  340. package/dist/orgs/invitations.controller.js +137 -0
  341. package/dist/orgs/invitations.service.d.ts +80 -0
  342. package/dist/orgs/invitations.service.js +217 -0
  343. package/dist/orgs/members.service.d.ts +63 -0
  344. package/dist/orgs/members.service.js +234 -0
  345. package/dist/orgs/offboarding.d.ts +141 -0
  346. package/dist/orgs/offboarding.js +398 -0
  347. package/dist/orgs/org-lock.d.ts +32 -0
  348. package/dist/orgs/org-lock.js +46 -0
  349. package/dist/orgs/org.guard.d.ts +35 -0
  350. package/dist/orgs/org.guard.js +95 -0
  351. package/dist/orgs/orgs.controller.d.ts +78 -0
  352. package/dist/orgs/orgs.controller.js +192 -0
  353. package/dist/orgs/orgs.service.d.ts +61 -0
  354. package/dist/orgs/orgs.service.js +209 -0
  355. package/dist/orgs/roles.d.ts +13 -0
  356. package/dist/orgs/roles.js +58 -0
  357. package/dist/orgs/settings.controller.d.ts +20 -0
  358. package/dist/orgs/settings.controller.js +53 -0
  359. package/dist/orgs/settings.service.d.ts +120 -0
  360. package/dist/orgs/settings.service.js +178 -0
  361. package/dist/packages/npm.d.ts +50 -0
  362. package/dist/packages/npm.js +218 -0
  363. package/dist/packages/provenance.d.ts +47 -0
  364. package/dist/packages/provenance.js +147 -0
  365. package/dist/packages/tgz.d.ts +76 -0
  366. package/dist/packages/tgz.js +225 -0
  367. package/dist/runtime/abort.d.ts +32 -0
  368. package/dist/runtime/abort.js +71 -0
  369. package/dist/runtime/checkpointer.d.ts +32 -0
  370. package/dist/runtime/checkpointer.js +243 -0
  371. package/dist/runtime/context/build.d.ts +254 -0
  372. package/dist/runtime/context/build.js +693 -0
  373. package/dist/runtime/context/claude-tools.d.ts +11 -0
  374. package/dist/runtime/context/claude-tools.js +24 -0
  375. package/dist/runtime/context/compaction.d.ts +26 -0
  376. package/dist/runtime/context/compaction.js +195 -0
  377. package/dist/runtime/context/pairing.d.ts +11 -0
  378. package/dist/runtime/context/pairing.js +82 -0
  379. package/dist/runtime/context/reminders.d.ts +5 -0
  380. package/dist/runtime/context/reminders.js +11 -0
  381. package/dist/runtime/context/skills.d.ts +105 -0
  382. package/dist/runtime/context/skills.js +283 -0
  383. package/dist/runtime/context/tokens.d.ts +19 -0
  384. package/dist/runtime/context/tokens.js +104 -0
  385. package/dist/runtime/conversation-lock.d.ts +40 -0
  386. package/dist/runtime/conversation-lock.js +97 -0
  387. package/dist/runtime/hook-calls.d.ts +84 -0
  388. package/dist/runtime/hook-calls.js +136 -0
  389. package/dist/runtime/langgraph-loop.d.ts +52 -0
  390. package/dist/runtime/langgraph-loop.js +247 -0
  391. package/dist/runtime/loop.d.ts +93 -0
  392. package/dist/runtime/loop.js +7 -0
  393. package/dist/runtime/maintenance.d.ts +80 -0
  394. package/dist/runtime/maintenance.js +147 -0
  395. package/dist/runtime/media-cache.d.ts +21 -0
  396. package/dist/runtime/media-cache.js +51 -0
  397. package/dist/runtime/model-call.d.ts +176 -0
  398. package/dist/runtime/model-call.js +1049 -0
  399. package/dist/runtime/providers.d.ts +86 -0
  400. package/dist/runtime/providers.js +224 -0
  401. package/dist/runtime/quota.d.ts +29 -0
  402. package/dist/runtime/quota.js +70 -0
  403. package/dist/runtime/run-finish.d.ts +45 -0
  404. package/dist/runtime/run-finish.js +69 -0
  405. package/dist/runtime/run-queue.d.ts +121 -0
  406. package/dist/runtime/run-queue.js +493 -0
  407. package/dist/runtime/run-worker.d.ts +138 -0
  408. package/dist/runtime/run-worker.js +805 -0
  409. package/dist/runtime/stream.controller.d.ts +34 -0
  410. package/dist/runtime/stream.controller.js +122 -0
  411. package/dist/runtime/stream.d.ts +63 -0
  412. package/dist/runtime/stream.js +262 -0
  413. package/dist/runtime/subagents/child.d.ts +80 -0
  414. package/dist/runtime/subagents/child.js +225 -0
  415. package/dist/runtime/subagents/definition.d.ts +103 -0
  416. package/dist/runtime/subagents/definition.js +392 -0
  417. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  418. package/dist/runtime/subagents/dispatch.js +502 -0
  419. package/dist/runtime/subagents/limits.d.ts +23 -0
  420. package/dist/runtime/subagents/limits.js +34 -0
  421. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  422. package/dist/runtime/subagents/org-agents.js +70 -0
  423. package/dist/runtime/subagents/preamble.d.ts +7 -0
  424. package/dist/runtime/subagents/preamble.js +11 -0
  425. package/dist/runtime/subagents/progress.d.ts +26 -0
  426. package/dist/runtime/subagents/progress.js +36 -0
  427. package/dist/runtime/subagents/roster.d.ts +55 -0
  428. package/dist/runtime/subagents/roster.js +111 -0
  429. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  430. package/dist/runtime/subagents/skill-fork.js +259 -0
  431. package/dist/runtime/usage-report.d.ts +163 -0
  432. package/dist/runtime/usage-report.js +550 -0
  433. package/dist/runtime/waits.d.ts +233 -0
  434. package/dist/runtime/waits.js +883 -0
  435. package/dist/sandbox/leases.d.ts +169 -0
  436. package/dist/sandbox/leases.js +515 -0
  437. package/dist/sandbox/lifecycle.d.ts +21 -0
  438. package/dist/sandbox/lifecycle.js +68 -0
  439. package/dist/sandbox/sandbox.service.d.ts +249 -0
  440. package/dist/sandbox/sandbox.service.js +908 -0
  441. package/dist/skills/catalog.d.ts +149 -0
  442. package/dist/skills/catalog.js +405 -0
  443. package/dist/skills/changes.controller.d.ts +56 -0
  444. package/dist/skills/changes.controller.js +136 -0
  445. package/dist/skills/changes.service.d.ts +175 -0
  446. package/dist/skills/changes.service.js +805 -0
  447. package/dist/skills/invocable.controller.d.ts +23 -0
  448. package/dist/skills/invocable.controller.js +50 -0
  449. package/dist/skills/invocation-keys.d.ts +23 -0
  450. package/dist/skills/invocation-keys.js +44 -0
  451. package/dist/skills/invoke.d.ts +135 -0
  452. package/dist/skills/invoke.js +286 -0
  453. package/dist/skills/package.d.ts +87 -0
  454. package/dist/skills/package.js +227 -0
  455. package/dist/skills/skills.controller.d.ts +40 -0
  456. package/dist/skills/skills.controller.js +110 -0
  457. package/dist/skills/skills.service.d.ts +192 -0
  458. package/dist/skills/skills.service.js +567 -0
  459. package/dist/storage/prefix.d.ts +36 -0
  460. package/dist/storage/prefix.js +104 -0
  461. package/dist/storage/purge.d.ts +27 -0
  462. package/dist/storage/purge.js +75 -0
  463. package/dist/storage/storage.service.d.ts +44 -0
  464. package/dist/storage/storage.service.js +145 -0
  465. package/dist/text.d.ts +13 -0
  466. package/dist/text.js +13 -0
  467. package/dist/tools/approvals.controller.d.ts +53 -0
  468. package/dist/tools/approvals.controller.js +128 -0
  469. package/dist/tools/approvals.service.d.ts +172 -0
  470. package/dist/tools/approvals.service.js +568 -0
  471. package/dist/tools/breaker.d.ts +28 -0
  472. package/dist/tools/breaker.js +72 -0
  473. package/dist/tools/builtins/agent.d.ts +81 -0
  474. package/dist/tools/builtins/agent.js +223 -0
  475. package/dist/tools/builtins/ask-user.d.ts +28 -0
  476. package/dist/tools/builtins/ask-user.js +139 -0
  477. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  478. package/dist/tools/builtins/read-tool-output.js +108 -0
  479. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  480. package/dist/tools/builtins/sandbox/bash.js +137 -0
  481. package/dist/tools/builtins/sandbox/common.d.ts +114 -0
  482. package/dist/tools/builtins/sandbox/common.js +304 -0
  483. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  484. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  485. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  486. package/dist/tools/builtins/sandbox/edit.js +98 -0
  487. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  488. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  489. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  490. package/dist/tools/builtins/sandbox/glob.js +104 -0
  491. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  492. package/dist/tools/builtins/sandbox/grep.js +133 -0
  493. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  494. package/dist/tools/builtins/sandbox/index.js +27 -0
  495. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  496. package/dist/tools/builtins/sandbox/names.js +20 -0
  497. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  498. package/dist/tools/builtins/sandbox/read.js +121 -0
  499. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  500. package/dist/tools/builtins/sandbox/write.js +88 -0
  501. package/dist/tools/builtins/skill-load.d.ts +53 -0
  502. package/dist/tools/builtins/skill-load.js +446 -0
  503. package/dist/tools/builtins/skill-write.d.ts +59 -0
  504. package/dist/tools/builtins/skill-write.js +244 -0
  505. package/dist/tools/builtins/tool-search.d.ts +31 -0
  506. package/dist/tools/builtins/tool-search.js +171 -0
  507. package/dist/tools/connector-content.controller.d.ts +34 -0
  508. package/dist/tools/connector-content.controller.js +78 -0
  509. package/dist/tools/connector-content.d.ts +104 -0
  510. package/dist/tools/connector-content.js +267 -0
  511. package/dist/tools/connectors.controller.d.ts +210 -0
  512. package/dist/tools/connectors.controller.js +234 -0
  513. package/dist/tools/connectors.service.d.ts +303 -0
  514. package/dist/tools/connectors.service.js +1102 -0
  515. package/dist/tools/credentials.d.ts +139 -0
  516. package/dist/tools/credentials.js +351 -0
  517. package/dist/tools/drift.d.ts +141 -0
  518. package/dist/tools/drift.js +539 -0
  519. package/dist/tools/elicitation.d.ts +81 -0
  520. package/dist/tools/elicitation.js +266 -0
  521. package/dist/tools/endpoint.d.ts +18 -0
  522. package/dist/tools/endpoint.js +115 -0
  523. package/dist/tools/info.d.ts +67 -0
  524. package/dist/tools/info.js +113 -0
  525. package/dist/tools/naming.d.ts +27 -0
  526. package/dist/tools/naming.js +47 -0
  527. package/dist/tools/oauth/discovery.d.ts +65 -0
  528. package/dist/tools/oauth/discovery.js +307 -0
  529. package/dist/tools/oauth/flow.d.ts +63 -0
  530. package/dist/tools/oauth/flow.js +237 -0
  531. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  532. package/dist/tools/oauth/oauth.controller.js +95 -0
  533. package/dist/tools/oauth/tokens.d.ts +111 -0
  534. package/dist/tools/oauth/tokens.js +258 -0
  535. package/dist/tools/outputs.d.ts +61 -0
  536. package/dist/tools/outputs.js +156 -0
  537. package/dist/tools/pipeline.d.ts +322 -0
  538. package/dist/tools/pipeline.js +1236 -0
  539. package/dist/tools/policy.d.ts +60 -0
  540. package/dist/tools/policy.js +236 -0
  541. package/dist/tools/questions.controller.d.ts +24 -0
  542. package/dist/tools/questions.controller.js +58 -0
  543. package/dist/tools/questions.service.d.ts +103 -0
  544. package/dist/tools/questions.service.js +295 -0
  545. package/dist/tools/redact.d.ts +20 -0
  546. package/dist/tools/redact.js +60 -0
  547. package/dist/tools/registry.d.ts +246 -0
  548. package/dist/tools/registry.js +481 -0
  549. package/dist/tools/resources.d.ts +16 -0
  550. package/dist/tools/resources.js +76 -0
  551. package/dist/tools/specs.d.ts +14 -0
  552. package/dist/tools/specs.js +31 -0
  553. package/dist/tools/validate.d.ts +20 -0
  554. package/dist/tools/validate.js +183 -0
  555. package/dist/tools/view.d.ts +43 -0
  556. package/dist/tools/view.js +225 -0
  557. package/dist/ui/embed-token.d.ts +31 -0
  558. package/dist/ui/embed-token.js +132 -0
  559. package/dist/ui/registry.d.ts +58 -0
  560. package/dist/ui/registry.js +90 -0
  561. package/dist/ui/ui-stream.d.ts +37 -0
  562. package/dist/ui/ui-stream.js +162 -0
  563. package/dist/ui/views.controller.d.ts +81 -0
  564. package/dist/ui/views.controller.js +261 -0
  565. package/dist/ui/views.d.ts +155 -0
  566. package/dist/ui/views.js +306 -0
  567. package/dist/version.d.ts +5 -0
  568. package/dist/version.js +6 -0
  569. package/package.json +67 -3
  570. package/src/migrations/0001_init.sql +8 -0
  571. package/src/migrations/0002_secrets.sql +8 -0
  572. package/src/migrations/0003_identity.sql +117 -0
  573. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  574. package/src/migrations/0005_agents.sql +27 -0
  575. package/src/migrations/0006_conversations.sql +37 -0
  576. package/src/migrations/0007_checkpoints.sql +26 -0
  577. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  578. package/src/migrations/0009_runs_active_unique.sql +4 -0
  579. package/src/migrations/0010_tools.sql +125 -0
  580. package/src/migrations/0011_approvals_spec.sql +10 -0
  581. package/src/migrations/0012_run_waits.sql +24 -0
  582. package/src/migrations/0013_app_tools_source.sql +4 -0
  583. package/src/migrations/0014_tool_specs.sql +8 -0
  584. package/src/migrations/0015_tool_drift.sql +20 -0
  585. package/src/migrations/0016_plugin_permissions.sql +11 -0
  586. package/src/migrations/0017_identity_sources.sql +6 -0
  587. package/src/migrations/0018_channels.sql +74 -0
  588. package/src/migrations/0019_identity_trust.sql +17 -0
  589. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  590. package/src/migrations/0021_org_storage_purge.sql +9 -0
  591. package/src/migrations/0022_attachments.sql +29 -0
  592. package/src/migrations/0023_sandboxes.sql +37 -0
  593. package/src/migrations/0024_skills.sql +46 -0
  594. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  595. package/src/migrations/0026_skill_changes.sql +34 -0
  596. package/src/migrations/0027_model_prices.sql +18 -0
  597. package/src/migrations/0028_evals.sql +105 -0
  598. package/src/migrations/0029_model_purposes.sql +18 -0
  599. package/src/migrations/0030_plugin_installs.sql +73 -0
  600. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  601. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  602. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  603. package/src/migrations/0034_directory.sql +49 -0
  604. package/src/migrations/0035_catalogs.sql +40 -0
  605. package/src/migrations/0036_app_import_staging.sql +17 -0
  606. package/src/migrations/0037_directory_installs.sql +92 -0
  607. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  608. package/src/migrations/0039_channel_card_pending.sql +8 -0
  609. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  610. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  611. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  612. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  613. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  614. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  615. package/src/migrations/0046_git_sources.sql +25 -0
  616. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  617. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  618. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  619. package/src/migrations/0050_bootstrap.sql +53 -0
  620. package/src/migrations/0051_claude_compat.sql +26 -0
  621. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  622. package/src/migrations/0053_subagents.sql +73 -0
  623. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  624. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  625. package/src/migrations/0056_approval_reason.sql +3 -0
  626. package/src/migrations/0057_conversation_titles.sql +11 -0
  627. package/src/migrations/0058_conversation_selection.sql +4 -0
  628. package/src/migrations/0059_conversation_queue.sql +22 -0
  629. package/src/migrations/0060_file_previewers.sql +10 -0
  630. package/src/migrations/0061_queue_selection.sql +5 -0
  631. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,180 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { ExtensionPointUnavailableError, MEDIA_NAME_MAX_CHARS, ToolError, } from "@capybara-hq/plugin-sdk";
3
+ import { isValidArtifactName } from "../../../conversations/events.js";
4
+ import { ApiError } from "../../../errors.js";
5
+ import { checkPath, clip, display, inSandbox, sandboxBaseTimeoutMs, unavailableWhenNoSandbox, withNotices, } from "./common.js";
6
+ const SPEC = {
7
+ name: "sandbox_deliver",
8
+ // Display only (the tool row; not in the fingerprint, never sent to the model).
9
+ keyArgs: ["path"],
10
+ description: "Deliver a file from this conversation's sandbox to the user as a downloadable artifact. Use " +
11
+ "it when the user should receive a file you produced (a report, chart, spreadsheet, archive " +
12
+ "and so on); files that stay in the sandbox are not visible to the user. Delivers one file " +
13
+ "per call; archive a directory first (e.g. zip -r with sandbox_bash). The file size is " +
14
+ "limited (100 MB by default). Do not use it for intermediate files the user does not need.",
15
+ inputSchema: {
16
+ type: "object",
17
+ properties: {
18
+ path: {
19
+ type: "string",
20
+ minLength: 1,
21
+ description: 'Absolute path of the file in the sandbox, e.g. "/workspace/out/report.pdf".',
22
+ },
23
+ name: {
24
+ type: "string",
25
+ minLength: 1,
26
+ maxLength: MEDIA_NAME_MAX_CHARS,
27
+ description: 'File name shown to the user, e.g. "Q3 report.pdf". Default: the file name in path.',
28
+ },
29
+ },
30
+ required: ["path"],
31
+ additionalProperties: false,
32
+ },
33
+ };
34
+ /** 按扩展名猜的内容类型(下载一律 `attachment`,类型只用于显示与预览判断)。 */
35
+ const CONTENT_TYPES = {
36
+ txt: "text/plain",
37
+ log: "text/plain",
38
+ md: "text/markdown",
39
+ csv: "text/csv",
40
+ tsv: "text/tab-separated-values",
41
+ json: "application/json",
42
+ xml: "application/xml",
43
+ yaml: "application/yaml",
44
+ yml: "application/yaml",
45
+ html: "text/html",
46
+ htm: "text/html",
47
+ css: "text/css",
48
+ js: "text/javascript",
49
+ ts: "text/plain",
50
+ py: "text/x-python",
51
+ sql: "application/sql",
52
+ pdf: "application/pdf",
53
+ png: "image/png",
54
+ jpg: "image/jpeg",
55
+ jpeg: "image/jpeg",
56
+ gif: "image/gif",
57
+ webp: "image/webp",
58
+ svg: "image/svg+xml",
59
+ zip: "application/zip",
60
+ gz: "application/gzip",
61
+ tar: "application/x-tar",
62
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
63
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
64
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
65
+ mp3: "audio/mpeg",
66
+ mp4: "video/mp4",
67
+ wav: "audio/wav",
68
+ };
69
+ export function contentTypeFor(name) {
70
+ const dot = name.lastIndexOf(".");
71
+ const ext = dot > 0 ? name.slice(dot + 1).toLowerCase() : "";
72
+ return CONTENT_TYPES[ext] ?? "application/octet-stream";
73
+ }
74
+ const notFound = (path) => `File not found: ${clip(path, 200)}. Check the path with sandbox_glob.`;
75
+ const isDirectory = (path) => `${clip(path, 200)} is a directory; deliver one file, e.g. archive the directory first with sandbox_bash (zip -r) and retry.`;
76
+ const tooLarge = (path, size, max) => `File ${clip(path, 200)} is ${size} bytes, over the delivery limit of ${max} bytes; compress or split it with sandbox_bash and retry.`;
77
+ const BAD_NAME = "name must not contain control characters, / or \\; pass a plain file name such as report.pdf.";
78
+ /** 默认产物名:路径的文件名部分,过长时保留末尾(扩展名)截到 255 个 UTF-16 单元以内。 */
79
+ function defaultName(path) {
80
+ const cps = [...path.slice(path.lastIndexOf("/") + 1)];
81
+ let out = "";
82
+ for (let i = cps.length - 1; i >= 0; i--) {
83
+ const next = cps[i] + out;
84
+ if (next.length > MEDIA_NAME_MAX_CHARS)
85
+ break;
86
+ out = next;
87
+ }
88
+ return isValidArtifactName(out) ? out : "artifact";
89
+ }
90
+ const NO_STORAGE = "File storage is not configured in this deployment, so files cannot be delivered; ask an administrator, or provide the result in your reply instead.";
91
+ /** 「工具不可用」提醒里的原因(内核在后面补句号)。 */
92
+ const NO_STORAGE_REASON = NO_STORAGE.slice(0, -1);
93
+ /** 内置工具 `sandbox_deliver`:把沙箱里的文件存进对象存储,写 `artifact_created`,用户可下载。 */
94
+ export function sandboxDeliverTool(deps) {
95
+ return {
96
+ spec: SPEC,
97
+ defaultPolicy: "allow",
98
+ // 没有沙箱或没有对象存储都交付不了(先报沙箱的原因)
99
+ unavailable: () => unavailableWhenNoSandbox(deps)() ?? (deps.storage.available ? null : NO_STORAGE_REASON),
100
+ timeoutMs: () => 2 * sandboxBaseTimeoutMs(deps.config()),
101
+ async run(input, ctx) {
102
+ // 存储在调用前就核对:不为一个交付不了的文件去 stat / 读沙箱
103
+ if (!deps.storage.available)
104
+ throw new ToolError(NO_STORAGE);
105
+ const path = checkPath(input.path);
106
+ const given = input.name?.trim();
107
+ // 与 artifact_created 的 schema 同一规则,在上传前检查(不合法的名字不会在写事件时才失败)
108
+ if (given !== undefined && (!isValidArtifactName(given) || /[/\\]/.test(given))) {
109
+ throw new ToolError(BAD_NAME);
110
+ }
111
+ const name = given ?? defaultName(path);
112
+ const max = deps.config().sandbox.deliverMaxBytes;
113
+ const { value: data, notices } = await inSandbox(deps, ctx, async ({ h, p, signal }) => {
114
+ const st = await p.stat(h, path, signal);
115
+ if (st === null)
116
+ throw new ToolError(notFound(path));
117
+ if (st.isDir)
118
+ throw new ToolError(isDirectory(path));
119
+ if (st.size > max)
120
+ throw new ToolError(tooLarge(path, st.size, max));
121
+ const got = await p.readFile(h, path, { maxBytes: max, signal });
122
+ if (got === null)
123
+ throw new ToolError(notFound(path));
124
+ // 读的过程中文件变大了
125
+ if (got.truncated)
126
+ throw new ToolError(tooLarge(path, max + 1, max));
127
+ return got.data;
128
+ });
129
+ // 上传在沙箱锁之外进行:不占着沙箱
130
+ const artifactId = randomUUID();
131
+ const objectKey = `artifacts/${ctx.conversationId}/${artifactId}`;
132
+ const contentType = contentTypeFor(name);
133
+ try {
134
+ await deps.storage.kernel(ctx.orgId).put(objectKey, data, {
135
+ contentType,
136
+ size: data.byteLength,
137
+ signal: ctx.signal,
138
+ });
139
+ }
140
+ catch (e) {
141
+ if ((e instanceof ApiError && e.code === "storage.unavailable") ||
142
+ e instanceof ExtensionPointUnavailableError) {
143
+ throw new ToolError(NO_STORAGE);
144
+ }
145
+ throw e;
146
+ }
147
+ try {
148
+ await deps.eventLog.append(ctx.conversationId, [
149
+ {
150
+ type: "artifact_created",
151
+ ...(ctx.runId !== undefined && { runId: ctx.runId }),
152
+ payload: {
153
+ artifactId,
154
+ name,
155
+ contentType,
156
+ size: data.byteLength,
157
+ objectKey,
158
+ sourcePath: path,
159
+ callId: ctx.callId,
160
+ },
161
+ },
162
+ ]);
163
+ }
164
+ catch (e) {
165
+ // 事件没写进去:对象没人引用,尽力删掉
166
+ await deps.storage
167
+ .kernel(ctx.orgId)
168
+ .delete(objectKey)
169
+ .catch(() => { });
170
+ throw e;
171
+ }
172
+ await deps.eventLog.publishChanged?.(ctx.conversationId, "files");
173
+ const text = `Delivered ${name} (${data.byteLength} bytes, ${contentType}) to the user as artifact ${artifactId}; the user can download it from the conversation.`;
174
+ return {
175
+ content: [{ type: "text", text: withNotices(notices, text) }],
176
+ display: display(`交付文件 ${clip(name, 180)}`, `Delivered ${clip(name, 180)}`),
177
+ };
178
+ },
179
+ };
180
+ }
@@ -0,0 +1,4 @@
1
+ import type { BuiltinTool } from "../../registry.js";
2
+ import { type SandboxToolDeps } from "./common.js";
3
+ /** 内置工具 `sandbox_edit`:按精确文本替换。 */
4
+ export declare function sandboxEditTool(deps: SandboxToolDeps): BuiltinTool;
@@ -0,0 +1,98 @@
1
+ import { ToolError } from "@capybara-hq/plugin-sdk";
2
+ import { lineDiff, viewPath } from "../../view.js";
3
+ import { checkWritable, clip, display, inSandbox, looksBinary, sandboxBaseTimeoutMs, unavailableWhenNoSandbox, withNotices, withPathLease, } from "./common.js";
4
+ /** 可编辑的最大文件(字节):更大的用 sandbox_bash 处理。 */
5
+ const EDIT_MAX_BYTES = 10 * 1024 * 1024;
6
+ const SPEC = {
7
+ name: "sandbox_edit",
8
+ // Display only (the tool row; not in the fingerprint, never sent to the model).
9
+ keyArgs: ["path"],
10
+ description: "Edit a text file in this conversation's sandbox by replacing exact text. oldText must match " +
11
+ "the file exactly (including whitespace and indentation) and, unless replaceAll is true, occur " +
12
+ "exactly once; include enough surrounding lines to make it unique. Read the file with " +
13
+ "sandbox_read first. Use sandbox_write to create a file or replace all of it.",
14
+ inputSchema: {
15
+ type: "object",
16
+ properties: {
17
+ path: {
18
+ type: "string",
19
+ minLength: 1,
20
+ description: 'Absolute path of the file, e.g. "/workspace/src/app.py".',
21
+ },
22
+ oldText: { type: "string", minLength: 1, description: "The exact text to replace." },
23
+ newText: { type: "string", description: "The replacement text." },
24
+ replaceAll: {
25
+ type: "boolean",
26
+ description: "Replace every occurrence of oldText instead of exactly one. Default false.",
27
+ },
28
+ },
29
+ required: ["path", "oldText", "newText"],
30
+ additionalProperties: false,
31
+ },
32
+ };
33
+ const notFound = (path) => `File not found: ${clip(path, 200)}. Check the path with sandbox_glob, or use sandbox_write to create it.`;
34
+ const notText = (path) => `${clip(path, 200)} is a directory, a binary file or larger than ${EDIT_MAX_BYTES} bytes; use sandbox_bash to change it.`;
35
+ const SAME_TEXT = "oldText and newText are the same; pass the text you want to change and its replacement.";
36
+ const noMatch = (path) => `oldText was not found in ${clip(path, 200)}; call sandbox_read and pass the exact text, including whitespace.`;
37
+ const ambiguous = (n) => `oldText occurs ${n} times; pass more surrounding text to make it unique, or pass replaceAll: true.`;
38
+ /** 出现次数(不重叠)。 */
39
+ function occurrences(text, sub) {
40
+ let n = 0;
41
+ for (let i = text.indexOf(sub); i !== -1; i = text.indexOf(sub, i + sub.length))
42
+ n++;
43
+ return n;
44
+ }
45
+ /** 内置工具 `sandbox_edit`:按精确文本替换。 */
46
+ export function sandboxEditTool(deps) {
47
+ return {
48
+ spec: SPEC,
49
+ defaultPolicy: "allow",
50
+ unavailable: unavailableWhenNoSandbox(deps),
51
+ timeoutMs: () => sandboxBaseTimeoutMs(deps.config()),
52
+ async run(input, ctx) {
53
+ const { oldText, newText, replaceAll = false } = input;
54
+ const path = checkWritable(input.path);
55
+ if (oldText === newText)
56
+ throw new ToolError(SAME_TEXT);
57
+ const { value: edit, notices } = await inSandbox(deps, ctx, ({ h, p, signal }) =>
58
+ // read, replace, write: one holder at a time per file
59
+ withPathLease(deps, ctx, path, signal, async (signal) => {
60
+ const st = await p.stat(h, path, signal);
61
+ if (st === null)
62
+ throw new ToolError(notFound(path));
63
+ if (st.isDir)
64
+ throw new ToolError(notText(path));
65
+ const got = await p.readFile(h, path, { maxBytes: EDIT_MAX_BYTES, signal });
66
+ if (got === null)
67
+ throw new ToolError(notFound(path));
68
+ if (got.truncated || looksBinary(got.data))
69
+ throw new ToolError(notText(path));
70
+ const text = new TextDecoder().decode(got.data);
71
+ const count = occurrences(text, oldText);
72
+ if (count === 0)
73
+ throw new ToolError(noMatch(path));
74
+ if (count > 1 && !replaceAll)
75
+ throw new ToolError(ambiguous(count));
76
+ // 用函数形式替换:newText 里的 `$&` 等不被当成替换模式
77
+ const next = replaceAll
78
+ ? text.split(oldText).join(newText)
79
+ : text.replace(oldText, () => newText);
80
+ await p.writeFile(h, path, new TextEncoder().encode(next), signal);
81
+ return { n: replaceAll ? count : 1, before: text, after: next };
82
+ }));
83
+ const { n } = edit;
84
+ const text = `Edited ${path}: replaced ${n} occurrence${n === 1 ? "" : "s"}.`;
85
+ return {
86
+ content: [{ type: "text", text: withNotices(notices, text) }],
87
+ display: display(`编辑 ${clip(path, 180)}`, `Edited ${clip(path, 180)}`),
88
+ // display only: the diff on the row
89
+ view: {
90
+ kind: "edit",
91
+ path: viewPath(path),
92
+ created: false,
93
+ ...lineDiff(edit.before, edit.after),
94
+ },
95
+ };
96
+ },
97
+ };
98
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 线性时间的 glob 匹配(sandbox_glob 用;模式由模型给出,不能编译成会回溯爆炸的正则)。
3
+ *
4
+ * 语法:路径按 `/` 分段;整段 `**` 跨任意层目录(含零层);段内 `*` 匹配任意个字符(不跨 `/`),`?` 一个字符,
5
+ * `[abc]` / `[a-z]` / `[!x]`(或 `[^x]`)字符类,`{a,b}` 二选一(可嵌套,展开后最多 {@link MAX_ALTERNATIVES} 个);
6
+ * 其余字符按字面。
7
+ *
8
+ * 复杂度:段内用双指针通配匹配(只回溯到最近的 `*`),O(段长 × 模式段长);跨段的 `**` 用
9
+ * (模式段数 + 1) × (路径段数 + 1) 的记忆化,整体为多项式,最坏也不会指数回溯。
10
+ * 另限制模式长度、`*` 个数(连续的 `*` 先合并)与展开后的分支数,超过即拒绝。
11
+ */
12
+ /** 模式最长字符数。 */
13
+ export declare const MAX_GLOB_LENGTH = 1000;
14
+ /** 模式里最多的 `*`(合并连续的之后,各分支合计)。 */
15
+ export declare const MAX_GLOB_STARS = 32;
16
+ /** `{a,b}` 展开后最多的分支数。 */
17
+ export declare const MAX_ALTERNATIVES = 64;
18
+ /** 模式不合法或超出限制;message 为英文,供工具层拼进给模型的错误。 */
19
+ export declare class GlobPatternError extends Error {
20
+ constructor(message: string);
21
+ }
22
+ /**
23
+ * 编译 glob(相对路径,`/` 分隔)为匹配函数。模式不合法或超出限制抛 {@link GlobPatternError}。
24
+ */
25
+ export declare function compileGlob(pattern: string): (relPath: string) => boolean;
@@ -0,0 +1,240 @@
1
+ /**
2
+ * 线性时间的 glob 匹配(sandbox_glob 用;模式由模型给出,不能编译成会回溯爆炸的正则)。
3
+ *
4
+ * 语法:路径按 `/` 分段;整段 `**` 跨任意层目录(含零层);段内 `*` 匹配任意个字符(不跨 `/`),`?` 一个字符,
5
+ * `[abc]` / `[a-z]` / `[!x]`(或 `[^x]`)字符类,`{a,b}` 二选一(可嵌套,展开后最多 {@link MAX_ALTERNATIVES} 个);
6
+ * 其余字符按字面。
7
+ *
8
+ * 复杂度:段内用双指针通配匹配(只回溯到最近的 `*`),O(段长 × 模式段长);跨段的 `**` 用
9
+ * (模式段数 + 1) × (路径段数 + 1) 的记忆化,整体为多项式,最坏也不会指数回溯。
10
+ * 另限制模式长度、`*` 个数(连续的 `*` 先合并)与展开后的分支数,超过即拒绝。
11
+ */
12
+ /** 模式最长字符数。 */
13
+ export const MAX_GLOB_LENGTH = 1000;
14
+ /** 模式里最多的 `*`(合并连续的之后,各分支合计)。 */
15
+ export const MAX_GLOB_STARS = 32;
16
+ /** `{a,b}` 展开后最多的分支数。 */
17
+ export const MAX_ALTERNATIVES = 64;
18
+ /** 模式不合法或超出限制;message 为英文,供工具层拼进给模型的错误。 */
19
+ export class GlobPatternError extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = "GlobPatternError";
23
+ }
24
+ }
25
+ /** 展开 `{a,b}`(可嵌套);分支数超过上限抛错。未闭合的 `{` 按字面。 */
26
+ function expandBraces(p) {
27
+ let depth = 0;
28
+ let open = -1;
29
+ for (let i = 0; i < p.length; i++) {
30
+ const c = p[i];
31
+ if (c === "[") {
32
+ // 字符类里的花括号按字面
33
+ const end = p.indexOf("]", i + 2);
34
+ if (end !== -1)
35
+ i = end;
36
+ continue;
37
+ }
38
+ if (c === "{") {
39
+ if (depth === 0)
40
+ open = i;
41
+ depth++;
42
+ }
43
+ else if (c === "}" && depth > 0) {
44
+ depth--;
45
+ if (depth === 0) {
46
+ const body = p.slice(open + 1, i);
47
+ const parts = [];
48
+ let d = 0;
49
+ let start = 0;
50
+ for (let j = 0; j < body.length; j++) {
51
+ if (body[j] === "{")
52
+ d++;
53
+ else if (body[j] === "}")
54
+ d--;
55
+ else if (body[j] === "," && d === 0) {
56
+ parts.push(body.slice(start, j));
57
+ start = j + 1;
58
+ }
59
+ }
60
+ parts.push(body.slice(start));
61
+ const prefix = p.slice(0, open);
62
+ const rest = expandBraces(p.slice(i + 1));
63
+ const out = [];
64
+ for (const part of parts) {
65
+ for (const inner of expandBraces(part)) {
66
+ for (const tail of rest) {
67
+ out.push(prefix + inner + tail);
68
+ if (out.length > MAX_ALTERNATIVES) {
69
+ throw new GlobPatternError(`the pattern expands to more than ${MAX_ALTERNATIVES} alternatives`);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ return out;
75
+ }
76
+ }
77
+ }
78
+ return [p];
79
+ }
80
+ /** 解析一段(不含 `/`)为 token;连续的 `*` 合并为一个。 */
81
+ function parseSegment(seg) {
82
+ const chars = Array.from(seg);
83
+ const out = [];
84
+ for (let i = 0; i < chars.length; i++) {
85
+ const c = chars[i];
86
+ if (c === "*") {
87
+ if (out.at(-1)?.kind !== "star")
88
+ out.push({ kind: "star" });
89
+ }
90
+ else if (c === "?") {
91
+ out.push({ kind: "any" });
92
+ }
93
+ else if (c === "[") {
94
+ let j = i + 1;
95
+ let negate = false;
96
+ if (chars[j] === "!" || chars[j] === "^") {
97
+ negate = true;
98
+ j++;
99
+ }
100
+ // `]` 紧跟在开头时按字面
101
+ const first = j;
102
+ while (j < chars.length && (chars[j] !== "]" || j === first))
103
+ j++;
104
+ if (j >= chars.length) {
105
+ out.push({ kind: "char", c });
106
+ continue;
107
+ }
108
+ const body = chars.slice(first, j);
109
+ const items = [];
110
+ for (let k = 0; k < body.length; k++) {
111
+ const a = body[k];
112
+ if (body[k + 1] === "-" && k + 2 < body.length) {
113
+ items.push([a, body[k + 2]]);
114
+ k += 2;
115
+ }
116
+ else {
117
+ items.push(a);
118
+ }
119
+ }
120
+ out.push({ kind: "class", negate, items });
121
+ i = j;
122
+ }
123
+ else {
124
+ out.push({ kind: "char", c });
125
+ }
126
+ }
127
+ return out;
128
+ }
129
+ function tokenMatches(t, c) {
130
+ switch (t.kind) {
131
+ case "char":
132
+ return t.c === c;
133
+ case "any":
134
+ return true;
135
+ case "class": {
136
+ const hit = t.items.some((it) => typeof it === "string" ? it === c : it[0] <= c && c <= it[1]);
137
+ return hit !== t.negate;
138
+ }
139
+ default:
140
+ return false;
141
+ }
142
+ }
143
+ /** 段内通配匹配:双指针,失配时只回溯到最近的 `*`(O(n × m))。 */
144
+ function matchSegment(tokens, name) {
145
+ const s = Array.from(name);
146
+ let p = 0;
147
+ let i = 0;
148
+ let star = -1;
149
+ let mark = 0;
150
+ while (i < s.length) {
151
+ const t = tokens[p];
152
+ if (t !== undefined && t.kind !== "star" && tokenMatches(t, s[i])) {
153
+ p++;
154
+ i++;
155
+ }
156
+ else if (t !== undefined && t.kind === "star") {
157
+ star = p;
158
+ mark = i;
159
+ p++;
160
+ }
161
+ else if (star !== -1) {
162
+ p = star + 1;
163
+ mark++;
164
+ i = mark;
165
+ }
166
+ else {
167
+ return false;
168
+ }
169
+ }
170
+ while (tokens[p]?.kind === "star")
171
+ p++;
172
+ return p === tokens.length;
173
+ }
174
+ /** 一个分支:按段匹配,`**` 用 (段数 + 1)² 的记忆化。 */
175
+ function matchSegments(pattern, path) {
176
+ const P = pattern.length;
177
+ const N = path.length;
178
+ // 0 = 未算,1 = 不匹配,2 = 匹配
179
+ const memo = new Uint8Array((P + 1) * (N + 1));
180
+ const go = (i, j) => {
181
+ const k = i * (N + 1) + j;
182
+ const m = memo[k];
183
+ if (m !== 0)
184
+ return m === 2;
185
+ let r;
186
+ if (i === P) {
187
+ r = j === N;
188
+ }
189
+ else {
190
+ const seg = pattern[i];
191
+ if (seg.globstar) {
192
+ r = go(i + 1, j) || (j < N && go(i, j + 1));
193
+ }
194
+ else {
195
+ r = j < N && matchSegment(seg.tokens, path[j]) && go(i + 1, j + 1);
196
+ }
197
+ }
198
+ memo[k] = r ? 2 : 1;
199
+ return r;
200
+ };
201
+ return go(0, 0);
202
+ }
203
+ /**
204
+ * 编译 glob(相对路径,`/` 分隔)为匹配函数。模式不合法或超出限制抛 {@link GlobPatternError}。
205
+ */
206
+ export function compileGlob(pattern) {
207
+ if (pattern.length > MAX_GLOB_LENGTH) {
208
+ throw new GlobPatternError(`the pattern is longer than ${MAX_GLOB_LENGTH} characters`);
209
+ }
210
+ const branches = expandBraces(pattern).map((alt) => {
211
+ const segs = [];
212
+ for (const raw of alt.split("/")) {
213
+ if (raw === "")
214
+ continue;
215
+ if (raw === "**") {
216
+ // 连续的 `**` 合并
217
+ if (!segs.at(-1)?.globstar) {
218
+ segs.push({ globstar: true });
219
+ }
220
+ }
221
+ else {
222
+ segs.push({ globstar: false, tokens: parseSegment(raw) });
223
+ }
224
+ }
225
+ return segs;
226
+ });
227
+ let stars = 0;
228
+ for (const segs of branches) {
229
+ for (const s of segs) {
230
+ stars += s.globstar ? 1 : s.tokens.filter((t) => t.kind === "star").length;
231
+ }
232
+ }
233
+ if (stars > MAX_GLOB_STARS) {
234
+ throw new GlobPatternError(`the pattern has more than ${MAX_GLOB_STARS} wildcards`);
235
+ }
236
+ return (relPath) => {
237
+ const parts = relPath.split("/").filter((x) => x !== "");
238
+ return branches.some((segs) => matchSegments(segs, parts));
239
+ };
240
+ }
@@ -0,0 +1,4 @@
1
+ import type { BuiltinTool } from "../../registry.js";
2
+ import { type SandboxToolDeps } from "./common.js";
3
+ /** 内置工具 `sandbox_glob`:按文件名模式找文件(只读)。 */
4
+ export declare function sandboxGlobTool(deps: SandboxToolDeps): BuiltinTool;
@@ -0,0 +1,104 @@
1
+ import { ToolError } from "@capybara-hq/plugin-sdk";
2
+ import { checkPath, clip, display, inSandbox, SYNC_MARKER, sandboxBaseTimeoutMs, searchTimeoutMs, unavailableWhenNoSandbox, withNotices, } from "./common.js";
3
+ import { compileGlob, GlobPatternError } from "./glob-match.js";
4
+ /** 最多列出的文件数。 */
5
+ const MAX_RESULTS = 1000;
6
+ /** `find` 输出的上限(字节)。 */
7
+ const MAX_FIND_BYTES = 8 * 1024 * 1024;
8
+ const SPEC = {
9
+ name: "sandbox_glob",
10
+ // Display only (the tool row; not in the fingerprint, never sent to the model).
11
+ keyArgs: ["pattern"],
12
+ description: "Find files by name pattern in this conversation's sandbox. Use it to list files and to " +
13
+ 'locate files by name, e.g. pattern "**/*.py" for all Python files. The pattern is matched ' +
14
+ "against paths relative to path (default /workspace): * matches within one directory, ** " +
15
+ "matches across directories, ? matches one character, {a,b} matches either. Returns absolute " +
16
+ "paths sorted by name, up to 1000. To search file contents, use sandbox_grep.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ pattern: {
21
+ type: "string",
22
+ minLength: 1,
23
+ description: 'Glob pattern relative to path, e.g. "**/*.csv" or "src/*.ts".',
24
+ },
25
+ path: {
26
+ type: "string",
27
+ minLength: 1,
28
+ description: "Absolute directory to search in. Default /workspace.",
29
+ },
30
+ },
31
+ required: ["pattern"],
32
+ additionalProperties: false,
33
+ },
34
+ annotations: { readOnlyHint: true },
35
+ };
36
+ const ABSOLUTE_PATTERN = 'The pattern must be relative to path; pass the directory in path and a relative pattern such as "**/*.py".';
37
+ const notDirectory = (path) => `${clip(path, 200)} is not a directory; pass an existing directory in path (default /workspace).`;
38
+ const FIND_FAILED = "Listing files did not finish in time; pass a narrower path or pattern and retry.";
39
+ /** 内置工具 `sandbox_glob`:按文件名模式找文件(只读)。 */
40
+ export function sandboxGlobTool(deps) {
41
+ return {
42
+ spec: SPEC,
43
+ defaultPolicy: "allow",
44
+ unavailable: unavailableWhenNoSandbox(deps),
45
+ timeoutMs: () => sandboxBaseTimeoutMs(deps.config()),
46
+ async run(input, ctx) {
47
+ const startedAt = Date.now();
48
+ const { pattern } = input;
49
+ if (pattern.startsWith("/"))
50
+ throw new ToolError(ABSOLUTE_PATTERN);
51
+ const dir = checkPath(input.path ?? "/workspace");
52
+ let matches;
53
+ try {
54
+ matches = compileGlob(pattern);
55
+ }
56
+ catch (e) {
57
+ if (!(e instanceof GlobPatternError))
58
+ throw e;
59
+ throw new ToolError(`Invalid glob pattern: ${e.message}; pass a simpler pattern (fewer wildcards and braces) and retry.`);
60
+ }
61
+ const { value: files, notices } = await inSandbox(deps, ctx, async ({ h, p, signal }) => {
62
+ const st = await p.stat(h, dir, signal);
63
+ if (!st?.isDir)
64
+ throw new ToolError(notDirectory(dir));
65
+ const r = await p.exec(h, {
66
+ command: "find . -type f -print0",
67
+ cwd: dir,
68
+ timeoutMs: searchTimeoutMs(deps.config(), startedAt, Date.now(), ctx.runDeadline),
69
+ maxOutputBytes: MAX_FIND_BYTES,
70
+ signal,
71
+ });
72
+ if (r.timedOut || r.exitCode === null)
73
+ throw new ToolError(FIND_FAILED);
74
+ // -print0:文件名里可能有换行,按 NUL 切分;最后一项(截断时不完整)丢掉
75
+ const names = r.stdout.split("\0");
76
+ names.pop();
77
+ if (r.truncated)
78
+ names.pop();
79
+ const base = dir === "/" ? "" : dir;
80
+ return (names
81
+ .filter((l) => l.startsWith("./"))
82
+ .map((l) => l.slice(2))
83
+ .filter((rel) => matches(rel))
84
+ .map((rel) => `${base}/${rel}`)
85
+ .filter((abs) => abs !== SYNC_MARKER)
86
+ .sort()
87
+ // 文件名里的换行显示为 `\n`(与 sandbox_grep 一致),一行一个文件
88
+ .map((abs) => abs.replace(/\n/g, "\\n")));
89
+ });
90
+ const shown = files.slice(0, MAX_RESULTS);
91
+ const text = files.length === 0
92
+ ? `No files match ${pattern} under ${dir}.`
93
+ : shown.join("\n") +
94
+ (files.length > MAX_RESULTS
95
+ ? `\n[Showing the first ${MAX_RESULTS} of ${files.length} files; use a narrower pattern.]`
96
+ : "");
97
+ const n = files.length;
98
+ return {
99
+ content: [{ type: "text", text: withNotices(notices, text) }],
100
+ display: display(`查找文件 ${clip(pattern, 120)}(${n} 个)`, `Found ${n} file${n === 1 ? "" : "s"} matching ${clip(pattern, 120)}`),
101
+ };
102
+ },
103
+ };
104
+ }
@@ -0,0 +1,9 @@
1
+ import type { BuiltinTool } from "../../registry.js";
2
+ import { type SandboxToolDeps } from "./common.js";
3
+ /**
4
+ * 解析 `grep -nH --null` 的输出:每条为 `<文件名>\0<行号>:<行>\n`(文件名可能含换行,行本身不含)。
5
+ * 返回 `<绝对路径>:<行号>:<行>`;文件名里的换行显示为 `\n`。最后一条不完整(输出被截断)时丢掉。
6
+ */
7
+ export declare function parseGrepNull(stdout: string, base: string): string[];
8
+ /** 内置工具 `sandbox_grep`:按正则搜文件内容(只读)。 */
9
+ export declare function sandboxGrepTool(deps: SandboxToolDeps): BuiltinTool;