import type { ToolSet } from "ai"; import type { HarnessToolDefinition } from "#harness/execute-tool.js"; /** * A model-facing code-execution sandbox over a *subset* of the agent's tools. * * `code_mode` and `Workflow` are two instances of this one concept: each is a * QuickJS sandbox the model drives by writing JavaScript, differing only in * which tools it exposes and how it presents itself. Modeling them as surfaces * (rather than parallel boolean branches) keeps the partition uniform and makes * a third sandbox a one-line addition. */ export interface SandboxSurface { /** Reserved model-facing tool name (e.g. `"code_mode"`, `"Workflow"`). */ readonly toolName: string; /** * Whether this surface wraps the given tool into its sandbox. A tool enters * *every* active surface that claims it, so an agent tool — claimed by both * surfaces — is callable from either sandbox when both are enabled. */ readonly claims: (harnessTool: HarnessToolDefinition | undefined, tool: ToolSet[string]) => boolean; /** * Optional transform applied to the description auto-generated by * `createCodeModeTool`. Receives the generated text (which lists the callable * tool signatures) and the names of the tools in this sandbox, so the framing * can adapt to what is actually callable. Omit to use the generated * description as-is. */ readonly describe?: (input: { readonly generated: string; readonly toolNames: readonly string[]; }) => string; } /** * The `Workflow` sandbox: agents only. Its sole callable operations are the * agent's subagents and remote agents, for orchestrating them from * model-authored JavaScript. */ export declare const WORKFLOW_SURFACE: SandboxSurface; /** * The `code_mode` sandbox: every sandboxable tool — subagent/remote-agent * (`runtimeAction`) tools and ordinary executable host tools (bash, fs, web, * skills). Provider-managed tools with no executor are never sandboxed. This is * unchanged by whether `Workflow` is also enabled. */ export declare const CODE_MODE_SURFACE: SandboxSurface; /** * Active sandbox surfaces for a harness config. A tool enters every surface * that claims it, so the two compose without interfering: `code_mode` is the * full sandbox (agents + host tools) regardless of `Workflow`, and `Workflow` * is an additional agents-only sandbox. When both are enabled, agents are * callable from either; other host tools remain only in `code_mode`. Order is * the emission order and does not affect routing. */ export declare function selectSandboxSurfaces(config: { readonly codeMode?: boolean; readonly workflow?: boolean; }): SandboxSurface[]; /** Whether any sandbox surface is active — i.e. the model gets a sandbox tool. */ export declare function isSandboxEnabled(config: { readonly codeMode?: boolean; readonly workflow?: boolean; }): boolean; /** * Every known surface. Used on replay to rebuild the full sandbox tool set * without knowing which surface a pending interrupt came from — a script only * references its own tools, so the superset is safe. */ export declare const ALL_SANDBOX_SURFACES: readonly SandboxSurface[];