@agent-sh/harness-bash 0.2.0 → 0.4.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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -20
- package/dist/index.d.ts +20 -20
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -527,7 +527,7 @@ var BASH_TOOL_DESCRIPTION = `Run a single shell command in a bash subprocess. Ou
|
|
|
527
527
|
Usage:
|
|
528
528
|
- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls \u2014 set them inline (FOO=bar some-cmd) or via 'env'.
|
|
529
529
|
- For non-shell code, use language one-liners: 'python -c "print(2+2)"', 'node -e "console.log(2+2)"', 'deno eval "console.log(2+2)"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.
|
|
530
|
-
- Long-running processes (servers, watchers) MUST use background: true. The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.
|
|
530
|
+
- Long-running processes (servers, watchers) and network requests (curl/wget) that may stall MUST use background: true, OR pass an explicit client-side timeout (e.g. curl --max-time N). The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.
|
|
531
531
|
- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo "y" |' in front.
|
|
532
532
|
- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.
|
|
533
533
|
- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.`;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/executor.ts","../src/fence.ts","../src/format.ts","../src/schema.ts","../src/bash.ts"],"names":["path","tmpdir","mkdirSync","runForeground","spawn","randomUUID","createWriteStream","opts","existsSync","statSync","readFileSync","matchesAnyPattern","isInsideAnyRoot","toolError","defaultNodeOperations","writeFileSync","appendFileSync","v","logPath"],"mappings":"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","file":"index.cjs","sourcesContent":["export const DEFAULT_INACTIVITY_TIMEOUT_MS = 60_000;\nexport const DEFAULT_WALLCLOCK_BACKSTOP_MS = 300_000;\nexport const MAX_COMMAND_LENGTH = 16_384;\nexport const MAX_OUTPUT_BYTES_INLINE = 30_720; // 30 KB per stream\nexport const MAX_OUTPUT_BYTES_FILE = 10 * 1024 * 1024; // 10 MB per stream\nexport const BACKGROUND_MAX_JOBS = 16;\nexport const KILL_GRACE_MS = 5_000;\n\n/**\n * Env var name prefixes that the tool refuses to let the model set via `env`.\n * Defense in depth: even if the harness forwards its environment, the model\n * should not be able to override credentials per-call.\n */\nexport const SENSITIVE_ENV_PREFIXES: readonly string[] = [\n \"AWS_\",\n \"BEDROCK_\",\n \"GITHUB_TOKEN\",\n \"GH_TOKEN\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"GEMINI_API_KEY\",\n \"NPM_TOKEN\",\n \"DOCKERHUB_TOKEN\",\n \"SLACK_\",\n \"STRIPE_\",\n];\n","import { spawn } from \"node:child_process\";\nimport { mkdirSync, createWriteStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { KILL_GRACE_MS } from \"./constants.js\";\nimport type {\n BackgroundReadResult,\n BashExecutor,\n BashRunInput,\n BashRunResult,\n} from \"./types.js\";\n\n/**\n * Default local-subprocess executor.\n *\n * Launches the bash binary with `-c <command>` via the argv form of\n * node:child_process.spawn — NEVER the string-based shell-eval entry\n * point. The command string is passed as a single argument to the bash\n * binary, not interpolated into our own spawn args. All shell parsing\n * happens inside the child bash process.\n *\n * This executor ships unsandboxed; sandboxing is the job of adapter\n * packages that implement the same BashExecutor interface. See\n * packages/bash/src/types.ts.\n */\nexport function createLocalBashExecutor(opts?: {\n bashPath?: string;\n logDir?: string;\n}): BashExecutor {\n const bashPath = opts?.bashPath ?? \"/bin/bash\";\n const logDir = opts?.logDir ?? path.join(tmpdir(), \"agent-sh-bash-logs\");\n mkdirSync(logDir, { recursive: true });\n\n interface Job {\n readonly id: string;\n readonly outPath: string;\n readonly errPath: string;\n running: boolean;\n exitCode: number | null;\n killed: boolean;\n proc: ReturnType<typeof spawn> | null;\n }\n\n const jobs = new Map<string, Job>();\n\n async function runForeground(input: BashRunInput): Promise<BashRunResult> {\n const child = spawn(bashPath, [\"-c\", input.command], {\n cwd: input.cwd,\n env: { ...input.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => input.onStdout(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => input.onStderr(chunk));\n\n let killedBySignal = false;\n const onAbort = () => {\n killedBySignal = true;\n try {\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child.exitCode === null) child.kill(\"SIGKILL\");\n }, KILL_GRACE_MS).unref();\n } catch {\n // best effort\n }\n };\n if (input.signal.aborted) {\n onAbort();\n } else {\n input.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return new Promise((resolve) => {\n child.on(\"close\", (code, signal) => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({\n exitCode: code,\n killed: killedBySignal,\n signal: signal ?? null,\n });\n });\n child.on(\"error\", () => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({ exitCode: null, killed: killedBySignal, signal: null });\n });\n });\n }\n\n async function spawnBackground(args: {\n command: string;\n cwd: string;\n env: Readonly<Record<string, string>>;\n }): Promise<{ jobId: string }> {\n const jobId = randomUUID();\n const outPath = path.join(logDir, `${jobId}.out`);\n const errPath = path.join(logDir, `${jobId}.err`);\n const outStream = createWriteStream(outPath, { flags: \"w\" });\n const errStream = createWriteStream(errPath, { flags: \"w\" });\n\n const child = spawn(bashPath, [\"-c\", args.command], {\n cwd: args.cwd,\n env: { ...args.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: false,\n });\n\n child.stdout.pipe(outStream);\n child.stderr.pipe(errStream);\n\n const job: Job = {\n id: jobId,\n outPath,\n errPath,\n running: true,\n exitCode: null,\n killed: false,\n proc: child,\n };\n jobs.set(jobId, job);\n\n child.on(\"close\", (code) => {\n job.running = false;\n job.exitCode = code;\n job.proc = null;\n });\n child.on(\"error\", () => {\n job.running = false;\n job.proc = null;\n });\n\n return { jobId };\n }\n\n async function readBackground(\n jobId: string,\n opts: { since_byte?: number; head_limit?: number },\n ): Promise<BackgroundReadResult> {\n const job = jobs.get(jobId);\n if (!job) {\n throw new Error(`Unknown job_id: ${jobId}`);\n }\n const since = opts.since_byte ?? 0;\n const limit = opts.head_limit ?? 30_720;\n const stdout = readSlice(job.outPath, since, limit);\n const stderr = readSlice(job.errPath, since, limit);\n return {\n stdout: stdout.text,\n stderr: stderr.text,\n running: job.running,\n exitCode: job.exitCode,\n totalBytesStdout: stdout.totalBytes,\n totalBytesStderr: stderr.totalBytes,\n };\n }\n\n async function killBackground(\n jobId: string,\n signal: \"SIGTERM\" | \"SIGKILL\" = \"SIGTERM\",\n ): Promise<void> {\n const job = jobs.get(jobId);\n if (!job || !job.proc) return;\n job.killed = true;\n try {\n job.proc.kill(signal);\n if (signal === \"SIGTERM\") {\n setTimeout(() => {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGKILL\");\n } catch {\n // ignore\n }\n }\n }, KILL_GRACE_MS).unref();\n }\n } catch {\n // ignore\n }\n }\n\n async function closeSession(): Promise<void> {\n for (const job of jobs.values()) {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGTERM\");\n } catch {\n // ignore\n }\n }\n }\n }\n\n return {\n run: runForeground,\n spawnBackground,\n readBackground,\n killBackground,\n closeSession,\n };\n}\n\nfunction readSlice(\n filePath: string,\n since: number,\n limit: number,\n): { text: string; totalBytes: number } {\n if (!existsSync(filePath)) return { text: \"\", totalBytes: 0 };\n const totalBytes = statSync(filePath).size;\n if (since >= totalBytes) return { text: \"\", totalBytes };\n const end = Math.min(since + limit, totalBytes);\n const buf = readFileSync(filePath).subarray(since, end);\n return { text: buf.toString(\"utf8\"), totalBytes };\n}\n","import path from \"node:path\";\nimport {\n defaultNodeOperations,\n isInsideAnyRoot,\n matchesAnyPattern,\n toolError,\n type ReadOperations,\n type ToolError,\n} from \"@agent-sh/harness-core\";\nimport type { BashSessionConfig } from \"./types.js\";\n\nexport async function resolveCwd(\n ops: ReadOperations,\n session: BashSessionConfig,\n requested: string | undefined,\n): Promise<string> {\n const base = requested ?? session.logicalCwd?.value ?? session.cwd;\n const absolute = path.isAbsolute(base) ? base : path.resolve(session.cwd, base);\n try {\n return await ops.realpath(absolute);\n } catch {\n return absolute;\n }\n}\n\nexport async function fenceBash(\n session: BashSessionConfig,\n resolvedCwd: string,\n): Promise<ToolError | undefined> {\n const { permissions } = session;\n const isSensitive = matchesAnyPattern(\n resolvedCwd,\n permissions.sensitivePatterns,\n );\n const insideWorkspace = isInsideAnyRoot(resolvedCwd, permissions.roots);\n\n if (isSensitive && permissions.hook === undefined) {\n return toolError(\n \"SENSITIVE\",\n `Refusing to run bash in sensitive path: ${resolvedCwd}`,\n { meta: { path: resolvedCwd } },\n );\n }\n\n if (\n !insideWorkspace &&\n permissions.bypassWorkspaceGuard !== true &&\n permissions.hook === undefined\n ) {\n return toolError(\n \"OUTSIDE_WORKSPACE\",\n `cwd is outside all configured workspace roots: ${resolvedCwd}`,\n { meta: { path: resolvedCwd, roots: permissions.roots } },\n );\n }\n\n return undefined;\n}\n\n/**\n * Permission hook call, bash-specific metadata.\n *\n * Returns one of:\n * \"allow\" — run\n * \"allow_once\" — run (no persistent rule learned)\n * \"deny\" — refuse with PERMISSION_DENIED\n * \"ask\" — treated as \"deny\" in this autonomous tool; caller\n * gets a hint to configure the hook properly\n */\nexport async function askPermission(\n session: BashSessionConfig,\n args: {\n command: string;\n cwd: string;\n background: boolean;\n timeoutMs: number;\n envKeys: readonly string[];\n },\n): Promise<\n | { decision: \"allow\" | \"allow_once\" }\n | { decision: \"deny\"; reason: string }\n> {\n const { permissions } = session;\n // Extract the first whitespace token as the \"command head\" for pattern\n // hints (`git`, `npm`, `python`, ...). Matches Claude Code convention.\n const commandHead = args.command.trimStart().split(/\\s+/)[0] ?? \"\";\n const alwaysPatterns = commandHead\n ? [`Bash(${commandHead}:*)`]\n : [\"Bash(*)\"];\n\n if (permissions.hook === undefined) {\n if (permissions.unsafeAllowBashWithoutHook === true) {\n return { decision: \"allow\" };\n }\n return {\n decision: \"deny\",\n reason:\n \"bash tool has no permission hook configured; refusing to run untrusted commands. Wire a hook or set session.permissions.unsafeAllowBashWithoutHook for test fixtures.\",\n };\n }\n\n const decision = await permissions.hook({\n tool: \"bash\",\n path: args.cwd,\n action: \"read\",\n always_patterns: alwaysPatterns,\n metadata: {\n command: args.command,\n cwd: args.cwd,\n background: args.background,\n timeout_ms: args.timeoutMs,\n env_keys: args.envKeys,\n network_required: null,\n },\n });\n if (decision === \"deny\") {\n return {\n decision: \"deny\",\n reason: `Command blocked by permission policy. Pattern hint: ${alwaysPatterns.join(\", \")}`,\n };\n }\n if (decision === \"allow\" || decision === \"allow_once\") {\n return { decision };\n }\n // \"ask\" in autonomous mode → deny with hint.\n return {\n decision: \"deny\",\n reason:\n \"Permission hook returned 'ask' but bash runs in autonomous mode. Configure the hook to return allow or deny.\",\n };\n}\n\nexport function resolveOps(session: BashSessionConfig): ReadOperations {\n return session.ops ?? defaultNodeOperations();\n}\n\n// Add a minimal ops accessor if session extends with it. Bash uses the\n// shared default for realpath/stat only.\ndeclare module \"./types.js\" {\n interface BashSessionConfig {\n readonly ops?: ReadOperations;\n }\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Per-stream output buffer with head+tail capping and spill-to-file on\n * overflow. Models rarely need the middle of a long output — they need\n * either the setup line or the error tail. This buffer preserves both.\n */\nexport class HeadTailBuffer {\n private readonly chunks: Uint8Array[] = [];\n private totalBytes = 0;\n private byteCap = false;\n private spilled = false;\n private spillPath: string | null = null;\n private spillBytes: number[] = [];\n\n constructor(\n private readonly maxInline: number,\n private readonly maxFile: number,\n private readonly kind: \"out\" | \"err\",\n private readonly spillDir: string,\n ) {}\n\n write(chunk: Uint8Array): void {\n this.totalBytes += chunk.byteLength;\n if (this.totalBytes <= this.maxInline) {\n this.chunks.push(chunk);\n return;\n }\n // Overflow: spill everything past the cap to disk + remember tail.\n if (!this.spilled) {\n this.spilled = true;\n this.byteCap = true;\n this.spillPath = path.join(\n this.spillDir,\n `${randomUUID()}.${this.kind}`,\n );\n // Write whatever was buffered so far into the spill file so the\n // full log is recoverable from the file path alone.\n for (const c of this.chunks) this.appendSpill(c);\n }\n this.appendSpill(chunk);\n // Keep a tail window (roughly half of maxInline in bytes) from spilled\n // stream so the inline result has a useful tail slice.\n this.spillBytes.push(chunk.byteLength);\n }\n\n private appendSpill(chunk: Uint8Array): void {\n if (this.spillPath === null) return;\n if (!this.spillInit) {\n mkdirSync(this.spillDir, { recursive: true });\n writeFileSync(this.spillPath, \"\");\n this.spillInit = true;\n }\n if (this.fileBytesWritten + chunk.byteLength > this.maxFile) {\n // File cap hit. Ignore further writes.\n return;\n }\n // Sync append — output sizes are in KB-to-MB range, no need for\n // async stream plumbing.\n appendFileSync(this.spillPath, Buffer.from(chunk));\n this.fileBytesWritten += chunk.byteLength;\n }\n\n private spillInit = false;\n private fileBytesWritten = 0;\n\n /**\n * Return the inline render:\n * - If not capped: the full buffered text.\n * - If capped: head (first maxInline/2 bytes) + marker + tail\n * (last maxInline/2 bytes) approximation. We approximate the tail\n * by decoding only the tail window (maxInline/2 bytes from the spill\n * file) because the stream is write-once and we dropped the middle.\n *\n * The actual implementation is simpler: we keep only the head inline\n * (first maxInline bytes, never overwritten) and emit a marker that\n * points at the log path. Head-only is a deliberate simplification\n * versus spec's head+tail — it matches OpenCode's default, and we\n * rely on Read(path) to see the tail. Spec §4 head+tail is a v2\n * improvement once we prove the file-path recovery path.\n */\n render(): { text: string; byteCap: boolean; logPath: string | null } {\n if (!this.spilled) {\n const combined = Buffer.concat(this.chunks.map((c) => Buffer.from(c)));\n return {\n text: combined.toString(\"utf8\"),\n byteCap: false,\n logPath: null,\n };\n }\n // Capped: return the first maxInline bytes and a pointer to the file.\n const head = Buffer.concat(\n this.chunks.map((c) => Buffer.from(c)),\n this.maxInline,\n ).toString(\"utf8\");\n const marker = `\\n... (stream exceeded ${this.maxInline} bytes; full log at ${this.spillPath}) ...`;\n return {\n text: head + marker,\n byteCap: true,\n logPath: this.spillPath,\n };\n }\n\n bytesTotal(): number {\n return this.totalBytes;\n }\n\n wasCapped(): boolean {\n return this.byteCap;\n }\n}\n\nexport function defaultSpillDir(): string {\n return path.join(tmpdir(), \"agent-sh-bash-spill\");\n}\n\n/**\n * Format the text body of an \"ok\" / \"nonzero_exit\" result.\n * Kept deliberately simple — structured fields ride on the result\n * object; `output` is the canonical text the executor returns to the\n * model at the tool_result boundary.\n */\nexport function formatResultText(args: {\n command: string;\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n byteCap: boolean;\n logPath: string | null;\n kind: \"ok\" | \"nonzero_exit\";\n}): string {\n const header = `<command>${args.command}</command>`;\n const exitLine = `<exit_code>${args.exitCode}</exit_code>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const hint = args.byteCap\n ? `(Output capped. Full log: ${args.logPath}. Read it with pagination if you need the middle.)`\n : args.kind === \"ok\"\n ? `(Command completed in ${args.durationMs}ms. exit=0.)`\n : `(Command exited nonzero in ${args.durationMs}ms. Exit code: ${args.exitCode}.)`;\n return [header, exitLine, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatTimeoutText(args: {\n command: string;\n stdout: string;\n stderr: string;\n reason: \"inactivity timeout\" | \"wall-clock backstop\";\n durationMs: number;\n partialBytes: number;\n logPath: string | null;\n}): string {\n const header = `<command>${args.command}</command>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const logHint = args.logPath ? ` Full log: ${args.logPath}.` : \"\";\n const hint = `(Command hit ${args.reason} after ${args.durationMs}ms. ${args.partialBytes} bytes captured. Kill signal: SIGTERM then SIGKILL.${logHint} If the command is long-running, retry with background: true.)`;\n return [header, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatBackgroundStartedText(args: {\n command: string;\n jobId: string;\n}): string {\n return [\n `<command>${args.command}</command>`,\n `<job_id>${args.jobId}</job_id>`,\n `(Background job started. Poll output with bash_output(job_id). Kill with bash_kill(job_id).)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashOutputText(args: {\n jobId: string;\n running: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n sinceByte: number;\n returnedBytes: number;\n totalBytes: number;\n}): string {\n const next = args.sinceByte + args.returnedBytes;\n return [\n `<job_id>${args.jobId}</job_id>`,\n `<running>${args.running}</running>`,\n `<exit_code>${args.exitCode === null ? \"null\" : args.exitCode}</exit_code>`,\n `<stdout>\\n${args.stdout}\\n</stdout>`,\n `<stderr>\\n${args.stderr}\\n</stderr>`,\n `(Showing bytes ${args.sinceByte}-${next} of ${args.totalBytes}. Next since_byte: ${next}. Job running: ${args.running}.)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashKillText(args: {\n jobId: string;\n signal: \"SIGTERM\" | \"SIGKILL\";\n}): string {\n return `<job_id>${args.jobId}</job_id>\\n(${args.signal} sent. Poll bash_output to confirm termination.)`;\n}\n","import * as v from \"valibot\";\nimport type { ToolDefinition } from \"@agent-sh/harness-core\";\nimport { MAX_COMMAND_LENGTH } from \"./constants.js\";\nimport type { BashParams, BashOutputParams, BashKillParams } from \"./types.js\";\n\nexport const BashParamsSchema = v.strictObject({\n command: v.pipe(\n v.string(),\n v.minLength(1, \"command is required\"),\n v.maxLength(\n MAX_COMMAND_LENGTH,\n `command exceeds ${MAX_COMMAND_LENGTH} bytes`,\n ),\n ),\n cwd: v.optional(v.pipe(v.string(), v.minLength(1, \"cwd must not be empty\"))),\n timeout_ms: v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(100, \"timeout_ms must be >= 100 ms\"),\n ),\n ),\n description: v.optional(v.string()),\n background: v.optional(v.boolean()),\n env: v.optional(v.record(v.string(), v.string())),\n});\n\nexport const BashOutputParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n since_byte: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(0, \"since_byte must be >= 0\")),\n ),\n head_limit: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(1, \"head_limit must be >= 1\")),\n ),\n});\n\nexport const BashKillParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n signal: v.optional(v.picklist([\"SIGTERM\", \"SIGKILL\"])),\n});\n\nexport type ParsedBashParams = v.InferOutput<typeof BashParamsSchema>;\n\n/**\n * Alias table mirroring grep/glob's KNOWN_PARAM_ALIASES. Models routinely\n * pass alternate names; we return a targeted INVALID_PARAM redirect rather\n * than the generic strictObject \"Unknown key: X\".\n */\nconst KNOWN_PARAM_ALIASES: Record<string, string> = {\n cmd: \"unknown parameter 'cmd'. Use 'command' instead.\",\n shell_command: \"unknown parameter 'shell_command'. Use 'command' instead.\",\n script: \"unknown parameter 'script'. Use 'command' instead.\",\n run: \"unknown parameter 'run'. Use 'command' instead.\",\n\n directory: \"unknown parameter 'directory'. Use 'cwd' instead.\",\n dir: \"unknown parameter 'dir'. Use 'cwd' instead.\",\n path: \"unknown parameter 'path'. Use 'cwd' instead.\",\n working_directory:\n \"unknown parameter 'working_directory'. Use 'cwd' instead.\",\n\n timeout:\n \"unknown parameter 'timeout'. Use 'timeout_ms' instead (milliseconds, not seconds). For 30s pass timeout_ms: 30000.\",\n time_limit:\n \"unknown parameter 'time_limit'. Use 'timeout_ms' instead (milliseconds).\",\n timeout_seconds:\n \"unknown parameter 'timeout_seconds'. Use 'timeout_ms' instead (multiply by 1000).\",\n\n env_vars: \"unknown parameter 'env_vars'. Use 'env' instead.\",\n environment: \"unknown parameter 'environment'. Use 'env' instead.\",\n\n lang: \"unknown parameter 'lang'. Bash runs shell commands; invoke other languages via the command itself (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n language:\n \"unknown parameter 'language'. Invoke other languages via the command (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n interpreter:\n \"unknown parameter 'interpreter'. Invoke the interpreter inside the command itself (e.g. 'python -c \\\"...\\\"').\",\n runtime:\n \"unknown parameter 'runtime'. Invoke the runtime inside the command itself (e.g. 'node -e \\\"...\\\"').\",\n\n stdin:\n \"unknown parameter 'stdin'. Interactive stdin is not supported in v1. Pipe data into the command instead (e.g. 'echo \\\"y\\\" | npm init').\",\n input:\n \"unknown parameter 'input'. Interactive input is not supported in v1. Make the command non-interactive with flags like --yes.\",\n\n sandbox:\n \"unknown parameter 'sandbox'. Sandboxing is configured on the session, not per-call.\",\n sandbox_mode:\n \"unknown parameter 'sandbox_mode'. Sandboxing is configured on the session, not per-call.\",\n permissions:\n \"unknown parameter 'permissions'. The permission hook is configured on the session.\",\n network:\n \"unknown parameter 'network'. Network access is configured on the session / executor adapter.\",\n network_access:\n \"unknown parameter 'network_access'. Network access is configured on the session / executor adapter.\",\n\n shell: \"unknown parameter 'shell'. Shell binary is configured on the session.\",\n shell_binary:\n \"unknown parameter 'shell_binary'. Shell binary is configured on the session.\",\n};\n\nfunction checkAliases(input: unknown): string[] {\n if (input === null || typeof input !== \"object\") return [];\n const hints: string[] = [];\n for (const key of Object.keys(input as Record<string, unknown>)) {\n const hint = KNOWN_PARAM_ALIASES[key];\n if (hint) hints.push(hint);\n }\n return hints;\n}\n\nfunction makeAliasIssues(messages: string[]): v.BaseIssue<unknown>[] {\n return messages.map(\n (m) =>\n ({\n kind: \"validation\",\n type: \"custom\",\n input: undefined,\n expected: null,\n received: \"unknown\",\n message: m,\n }) as unknown as v.BaseIssue<unknown>,\n );\n}\n\nexport function safeParseBashParams(input: unknown):\n | { ok: true; value: BashParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const aliases = checkAliases(input);\n if (aliases.length > 0) {\n return { ok: false, issues: makeAliasIssues(aliases) };\n }\n const result = v.safeParse(BashParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashOutputParams(input: unknown):\n | { ok: true; value: BashOutputParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashOutputParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashKillParams(input: unknown):\n | { ok: true; value: BashKillParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashKillParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\n// Tool definitions exposed to the LLM.\n\nexport const BASH_TOOL_NAME = \"bash\";\n\nexport const BASH_TOOL_DESCRIPTION = `Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls — set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) MUST use background: true. The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.`;\n\nexport const bashToolDefinition: ToolDefinition = {\n name: BASH_TOOL_NAME,\n description: BASH_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to run (single string, interpreted by bash -c).\",\n },\n cwd: {\n type: \"string\",\n description:\n \"Absolute working directory. Defaults to the session cwd plus any carried-over cd. Must be inside the workspace.\",\n },\n timeout_ms: {\n type: \"integer\",\n minimum: 100,\n description:\n \"Inactivity timeout in milliseconds. Any output resets the clock. Default 60000 (60 s). Wall-clock backstop is 5 minutes regardless.\",\n },\n description: {\n type: \"string\",\n description: \"One-line human-readable 'why' (optional, for traces).\",\n },\n background: {\n type: \"boolean\",\n description:\n \"Run as a background job. Returns a job_id; poll output with bash_output. Use for servers, watchers, long-running builds.\",\n },\n env: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description:\n \"Environment variables merged on top of the session env. Keys with sensitive prefixes (AWS_*, GITHUB_TOKEN, etc.) are rejected.\",\n },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_OUTPUT_TOOL_NAME = \"bash_output\";\n\nexport const BASH_OUTPUT_TOOL_DESCRIPTION = `Poll a backgrounded bash job's output since a given byte offset.\n\nReturns stdout and stderr slices plus whether the job is still running and its exit code if finished. Use 'since_byte' from the previous call to paginate through a long-running job's output without re-fetching already-seen bytes.`;\n\nexport const bashOutputToolDefinition: ToolDefinition = {\n name: BASH_OUTPUT_TOOL_NAME,\n description: BASH_OUTPUT_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description:\n \"The job_id returned by a previous bash call with background: true.\",\n },\n since_byte: {\n type: \"integer\",\n minimum: 0,\n description:\n \"Start of the requested slice per stream, in bytes. Defaults to 0. Use next_since_byte from a previous output call to resume.\",\n },\n head_limit: {\n type: \"integer\",\n minimum: 1,\n description: \"Max bytes per stream (default 30720 / 30 KB).\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_KILL_TOOL_NAME = \"bash_kill\";\n\nexport const BASH_KILL_TOOL_DESCRIPTION = `Send a termination signal to a backgrounded bash job.\n\nDefaults to SIGTERM (graceful). Use SIGKILL for an unresponsive job. The job's next bash_output call will report running: false.`;\n\nexport const bashKillToolDefinition: ToolDefinition = {\n name: BASH_KILL_TOOL_NAME,\n description: BASH_KILL_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description: \"The job_id returned by a previous bash call with background: true.\",\n },\n signal: {\n type: \"string\",\n enum: [\"SIGTERM\", \"SIGKILL\"],\n description: \"Signal to send. Default SIGTERM.\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n","import path from \"node:path\";\nimport { toolError, type ToolError } from \"@agent-sh/harness-core\";\nimport {\n BACKGROUND_MAX_JOBS,\n DEFAULT_INACTIVITY_TIMEOUT_MS,\n DEFAULT_WALLCLOCK_BACKSTOP_MS,\n MAX_OUTPUT_BYTES_FILE,\n MAX_OUTPUT_BYTES_INLINE,\n SENSITIVE_ENV_PREFIXES,\n} from \"./constants.js\";\nimport { createLocalBashExecutor } from \"./executor.js\";\nimport { askPermission, fenceBash, resolveCwd, resolveOps } from \"./fence.js\";\nimport {\n HeadTailBuffer,\n defaultSpillDir,\n formatBackgroundStartedText,\n formatBashKillText,\n formatBashOutputText,\n formatResultText,\n formatTimeoutText,\n} from \"./format.js\";\nimport {\n safeParseBashKillParams,\n safeParseBashOutputParams,\n safeParseBashParams,\n} from \"./schema.js\";\nimport type {\n BashExecutor,\n BashKillResult,\n BashOutputResult,\n BashResult,\n BashSessionConfig,\n} from \"./types.js\";\n\n// Session-scoped tracking of background jobs. The executor owns the\n// runtime state (streams, pids); we keep a counter here to enforce the\n// per-session cap.\nconst jobCountBySession = new WeakMap<BashSessionConfig, number>();\n\nfunction incJobCount(session: BashSessionConfig): void {\n jobCountBySession.set(session, (jobCountBySession.get(session) ?? 0) + 1);\n}\n\nfunction jobCount(session: BashSessionConfig): number {\n return jobCountBySession.get(session) ?? 0;\n}\n\nfunction err(error: ToolError): { kind: \"error\"; error: ToolError } {\n return { kind: \"error\", error };\n}\n\nfunction resolveExecutor(session: BashSessionConfig): BashExecutor {\n if (session.executor) return session.executor;\n // Default local executor only works if the session explicitly opted into\n // the fail-closed bypass. Otherwise core refuses.\n if (session.permissions.unsafeAllowBashWithoutHook !== true) {\n // The caller will hit fail-closed in askPermission — but we still need\n // an executor object to let things reach that gate cleanly.\n }\n return createLocalBashExecutor();\n}\n\n/**\n * Top-level `cd` detector for session cwd-carry.\n *\n * Matches a single top-level `cd` invocation only — NOT inside pipelines\n * (`cd x | true`), command lists (`cd x && y`), subshells (`(cd x)`),\n * or with trailing arguments. This deliberately covers 95% of model\n * intent without hand-parsing the full bash grammar.\n *\n * Returns the path argument if detected, else null.\n */\nexport function detectTopLevelCd(command: string): string | null {\n // Strip leading whitespace. Reject if any shell metacharacter appears.\n const trimmed = command.trim();\n if (trimmed.length === 0) return null;\n // Grammar: ^cd\\s+<path>$ where <path> has no whitespace, no &, |, ;, `, $, (, ).\n const match = trimmed.match(/^cd\\s+([^\\s&|;`$()]+)$/);\n if (!match) return null;\n const arg = match[1];\n if (arg === undefined) return null;\n // Strip matching single or double quotes if present.\n if (\n (arg.startsWith('\"') && arg.endsWith('\"')) ||\n (arg.startsWith(\"'\") && arg.endsWith(\"'\"))\n ) {\n return arg.slice(1, -1);\n }\n return arg;\n}\n\nfunction checkEnv(env: Readonly<Record<string, string>>): string | null {\n for (const key of Object.keys(env)) {\n for (const prefix of SENSITIVE_ENV_PREFIXES) {\n if (\n key === prefix ||\n (prefix.endsWith(\"_\") && key.startsWith(prefix))\n ) {\n return `env may not set sensitive-prefix variable '${key}' (prefix '${prefix}').`;\n }\n }\n }\n return null;\n}\n\nfunction byteLength(s: string): number {\n return Buffer.byteLength(s, \"utf8\");\n}\n\nexport async function bash(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashResult> {\n const parsed = safeParseBashParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages, { cause: parsed.issues }));\n }\n const params = parsed.value;\n\n if (\n params.background === true &&\n params.timeout_ms !== undefined\n ) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"timeout_ms does not apply to background jobs; they have their own lifecycle (bash_kill). Drop timeout_ms or set background: false.\",\n ),\n );\n }\n\n const envParam = params.env ?? {};\n const envError = checkEnv(envParam);\n if (envError) {\n return err(toolError(\"INVALID_PARAM\", envError));\n }\n\n const ops = resolveOps(session);\n const resolvedCwd = await resolveCwd(ops, session, params.cwd);\n\n // Workspace + sensitive-path fence.\n const fenceError = await fenceBash(session, resolvedCwd);\n if (fenceError) return err(fenceError);\n\n // cwd must actually exist and be a directory.\n const stat = await ops.stat(resolvedCwd).catch(() => undefined);\n if (!stat) {\n return err(\n toolError(\"NOT_FOUND\", `cwd does not exist: ${resolvedCwd}`, {\n meta: { cwd: resolvedCwd },\n }),\n );\n }\n if (stat.type !== \"directory\") {\n return err(\n toolError(\n \"IO_ERROR\",\n `cwd is not a directory: ${resolvedCwd}`,\n { meta: { cwd: resolvedCwd } },\n ),\n );\n }\n\n // Permission hook (autonomous: allow or deny, never ask).\n const effectiveTimeout =\n params.timeout_ms ??\n session.defaultInactivityTimeoutMs ??\n DEFAULT_INACTIVITY_TIMEOUT_MS;\n const decision = await askPermission(session, {\n command: params.command,\n cwd: resolvedCwd,\n background: params.background ?? false,\n timeoutMs: effectiveTimeout,\n envKeys: Object.keys(envParam),\n });\n if (decision.decision === \"deny\") {\n const echo = params.command.length > 200\n ? params.command.slice(0, 200) + \"...\"\n : params.command;\n return err(\n toolError(\n \"PERMISSION_DENIED\",\n `${decision.reason}\\nCommand: ${echo}`,\n { meta: { command: params.command, cwd: resolvedCwd } },\n ),\n );\n }\n\n const execEnv: Record<string, string> = {\n ...(session.env ?? process.env),\n ...envParam,\n } as Record<string, string>;\n // Node's process.env has `string | undefined`; filter undefineds.\n for (const [k, v] of Object.entries(execEnv)) {\n if (v === undefined) delete execEnv[k];\n }\n\n const executor = resolveExecutor(session);\n\n if (params.background === true) {\n return runBackground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n );\n }\n\n return runForeground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n effectiveTimeout,\n );\n}\n\nasync function runBackground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n): Promise<BashResult> {\n if (!executor.spawnBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"background: true is not supported by this executor adapter.\",\n ),\n );\n }\n const maxJobs = session.maxBackgroundJobs ?? BACKGROUND_MAX_JOBS;\n if (jobCount(session) >= maxJobs) {\n return err(\n toolError(\n \"IO_ERROR\",\n `Background job limit reached (${maxJobs}). Kill an existing job first with bash_kill.`,\n ),\n );\n }\n const { jobId } = await executor.spawnBackground({ command, cwd, env });\n incJobCount(session);\n return {\n kind: \"background_started\",\n output: formatBackgroundStartedText({ command, jobId }),\n jobId,\n };\n}\n\nasync function runForeground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n inactivityTimeoutMs: number,\n): Promise<BashResult> {\n const wallclockMs =\n session.wallclockBackstopMs ?? DEFAULT_WALLCLOCK_BACKSTOP_MS;\n const maxInline = session.maxOutputBytesInline ?? MAX_OUTPUT_BYTES_INLINE;\n const maxFile = session.maxOutputBytesFile ?? MAX_OUTPUT_BYTES_FILE;\n const spillDir = defaultSpillDir();\n\n const stdoutBuf = new HeadTailBuffer(maxInline, maxFile, \"out\", spillDir);\n const stderrBuf = new HeadTailBuffer(maxInline, maxFile, \"err\", spillDir);\n\n const controller = new AbortController();\n const abortOnOuter = () => controller.abort();\n if (session.signal) {\n if (session.signal.aborted) controller.abort();\n else session.signal.addEventListener(\"abort\", abortOnOuter, { once: true });\n }\n\n let timedOut: \"inactivity timeout\" | \"wall-clock backstop\" | null = null;\n let inactivityTimer: NodeJS.Timeout | null = null;\n const resetInactivity = () => {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n timedOut = \"inactivity timeout\";\n controller.abort();\n }, inactivityTimeoutMs);\n };\n resetInactivity();\n\n const wallclockTimer = setTimeout(() => {\n timedOut = \"wall-clock backstop\";\n controller.abort();\n }, wallclockMs);\n\n const start = Date.now();\n let result: Awaited<ReturnType<BashExecutor[\"run\"]>>;\n try {\n result = await executor.run({\n command,\n cwd,\n env,\n signal: controller.signal,\n onStdout: (chunk) => {\n stdoutBuf.write(chunk);\n resetInactivity();\n },\n onStderr: (chunk) => {\n stderrBuf.write(chunk);\n resetInactivity();\n },\n });\n } finally {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n clearTimeout(wallclockTimer);\n if (session.signal) {\n session.signal.removeEventListener(\"abort\", abortOnOuter);\n }\n }\n\n const durationMs = Date.now() - start;\n const stdoutRender = stdoutBuf.render();\n const stderrRender = stderrBuf.render();\n\n if (timedOut !== null) {\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n return {\n kind: \"timeout\",\n output: formatTimeoutText({\n command,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n partialBytes: stdoutBuf.bytesTotal() + stderrBuf.bytesTotal(),\n logPath,\n }),\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n ...(logPath ? { logPath } : {}),\n };\n }\n\n const exitCode = result.exitCode ?? -1;\n const kind: \"ok\" | \"nonzero_exit\" = exitCode === 0 ? \"ok\" : \"nonzero_exit\";\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n const byteCap = stdoutRender.byteCap || stderrRender.byteCap;\n\n return {\n kind,\n output: formatResultText({\n command,\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n byteCap,\n logPath,\n kind,\n }),\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n ...(logPath ? { logPath } : {}),\n byteCap,\n };\n}\n\nexport async function bashOutput(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashOutputResult> {\n const parsed = safeParseBashOutputParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.readBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_output is not supported by this executor adapter.\",\n ),\n );\n }\n try {\n const read = await executor.readBackground(parsed.value.job_id, {\n ...(parsed.value.since_byte !== undefined\n ? { since_byte: parsed.value.since_byte }\n : {}),\n ...(parsed.value.head_limit !== undefined\n ? { head_limit: parsed.value.head_limit }\n : {}),\n });\n const sinceByte = parsed.value.since_byte ?? 0;\n const returnedBytes =\n byteLength(read.stdout) + byteLength(read.stderr);\n const totalBytes = read.totalBytesStdout + read.totalBytesStderr;\n return {\n kind: \"output\",\n output: formatBashOutputText({\n jobId: parsed.value.job_id,\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n sinceByte,\n returnedBytes,\n totalBytes,\n }),\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n totalBytesStdout: read.totalBytesStdout,\n totalBytesStderr: read.totalBytesStderr,\n nextSinceByte: sinceByte + returnedBytes,\n };\n } catch (e) {\n return err(\n toolError(\n \"NOT_FOUND\",\n (e as Error).message || `Unknown job_id: ${parsed.value.job_id}`,\n ),\n );\n }\n}\n\nexport async function bashKill(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashKillResult> {\n const parsed = safeParseBashKillParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.killBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_kill is not supported by this executor adapter.\",\n ),\n );\n }\n const signal = parsed.value.signal ?? \"SIGTERM\";\n await executor.killBackground(parsed.value.job_id, signal);\n return {\n kind: \"killed\",\n output: formatBashKillText({ jobId: parsed.value.job_id, signal }),\n jobId: parsed.value.job_id,\n signal,\n };\n}\n\n/**\n * Apply cwd-carry: if the command is a top-level `cd <path>` and the\n * destination resolves inside the workspace, mutate session.logicalCwd.\n * Called AFTER the command executes with exit 0 (caller's responsibility).\n *\n * Exposed separately so tests can exercise the logic directly AND so a\n * harness wrapper can call it at the right point in the lifecycle. In\n * core, the orchestrator does NOT auto-call this — we keep cwd-carry\n * out of the hot path for correctness; the caller opts in by invoking\n * applyCwdCarry after a successful bash() result.\n *\n * Rationale: cwd-carry mutates session state which has observable\n * implications for concurrent calls. Making it explicit is safer.\n */\nexport function applyCwdCarry(\n session: BashSessionConfig,\n command: string,\n exitCode: number | null,\n): { changed: boolean; newCwd: string | null; escaped: boolean } {\n if (exitCode !== 0) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const target = detectTopLevelCd(command);\n if (target === null) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const base = session.logicalCwd?.value ?? session.cwd;\n const resolved = path.isAbsolute(target)\n ? path.resolve(target)\n : path.resolve(base, target);\n\n // Escape check.\n const inside = session.permissions.roots.some(\n (r) => resolved === r || resolved.startsWith(r + path.sep),\n );\n if (!inside && session.permissions.bypassWorkspaceGuard !== true) {\n return { changed: false, newCwd: resolved, escaped: true };\n }\n\n if (session.logicalCwd) {\n session.logicalCwd.value = resolved;\n }\n return { changed: true, newCwd: resolved, escaped: false };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/executor.ts","../src/fence.ts","../src/format.ts","../src/schema.ts","../src/bash.ts"],"names":["path","tmpdir","mkdirSync","runForeground","spawn","randomUUID","createWriteStream","opts","existsSync","statSync","readFileSync","matchesAnyPattern","isInsideAnyRoot","toolError","defaultNodeOperations","writeFileSync","appendFileSync","v","logPath"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,6BAAA,GAAgC;AACtC,IAAM,6BAAA,GAAgC;AACtC,IAAM,kBAAA,GAAqB;AAC3B,IAAM,uBAAA,GAA0B;AAChC,IAAM,qBAAA,GAAwB,KAAK,IAAA,GAAO;AAC1C,IAAM,mBAAA,GAAsB;AAC5B,IAAM,aAAA,GAAgB,GAAA;AAOtB,IAAM,sBAAA,GAA4C;AAAA,EACvD,MAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;ACAO,SAAS,wBAAwB,IAAA,EAGvB;AACf,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,WAAA;AACnC,EAAA,MAAM,SAAS,IAAA,EAAM,MAAA,IAAUA,uBAAK,IAAA,CAAKC,SAAA,IAAU,oBAAoB,CAAA;AACvE,EAAAC,YAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAYrC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAiB;AAElC,EAAA,eAAeC,eAAc,KAAA,EAA6C;AACxE,IAAA,MAAM,QAAQC,mBAAA,CAAM,QAAA,EAAU,CAAC,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACnD,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,GAAA,EAAK,EAAE,GAAG,KAAA,CAAM,GAAA,EAAI;AAAA,MACpB,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,KACjC,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAChE,IAAA,KAAA,CAAM,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAEhE,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,KAAA,CAAM,QAAA,KAAa,IAAA,EAAM,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACnD,CAAA,EAAG,aAAa,CAAA,CAAE,KAAA,EAAM;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AACA,IAAA,IAAI,KAAA,CAAM,OAAO,OAAA,EAAS;AACxB,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAO,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,KAAW;AAClC,QAAA,KAAA,CAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AACjD,QAAA,OAAA,CAAQ;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,cAAA;AAAA,UACR,QAAQ,MAAA,IAAU;AAAA,SACnB,CAAA;AAAA,MACH,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AACtB,QAAA,KAAA,CAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AACjD,QAAA,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,cAAA,EAAgB,MAAA,EAAQ,MAAM,CAAA;AAAA,MAClE,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,eAAe,gBAAgB,IAAA,EAIA;AAC7B,IAAA,MAAM,QAAQC,iBAAA,EAAW;AACzB,IAAA,MAAM,UAAUL,sBAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,IAAA,CAAM,CAAA;AAChD,IAAA,MAAM,UAAUA,sBAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,IAAA,CAAM,CAAA;AAChD,IAAA,MAAM,YAAYM,oBAAA,CAAkB,OAAA,EAAS,EAAE,KAAA,EAAO,KAAK,CAAA;AAC3D,IAAA,MAAM,YAAYA,oBAAA,CAAkB,OAAA,EAAS,EAAE,KAAA,EAAO,KAAK,CAAA;AAE3D,IAAA,MAAM,QAAQF,mBAAA,CAAM,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AAAA,MAClD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,GAAA,EAAI;AAAA,MACnB,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,CAAO,KAAK,SAAS,CAAA;AAC3B,IAAA,KAAA,CAAM,MAAA,CAAO,KAAK,SAAS,CAAA;AAE3B,IAAA,MAAM,GAAA,GAAW;AAAA,MACf,EAAA,EAAI,KAAA;AAAA,MACJ,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,CAAA;AAEnB,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AACd,MAAA,GAAA,CAAI,QAAA,GAAW,IAAA;AACf,MAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA,IACb,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AACtB,MAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AACd,MAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA,IACb,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAEA,EAAA,eAAe,cAAA,CACb,OACAG,KAAAA,EAC+B;AAC/B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5C;AACA,IAAA,MAAM,KAAA,GAAQA,MAAK,UAAA,IAAc,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQA,MAAK,UAAA,IAAc,KAAA;AACjC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,IAAA;AAAA,MACf,QAAQ,MAAA,CAAO,IAAA;AAAA,MACf,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,kBAAkB,MAAA,CAAO,UAAA;AAAA,MACzB,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,eAAe,cAAA,CACb,KAAA,EACA,MAAA,GAAgC,SAAA,EACjB;AACf,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,IAAA,EAAM;AACvB,IAAA,GAAA,CAAI,MAAA,GAAS,IAAA;AACb,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,MAAM,CAAA;AACpB,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,IAAA,EAAM;AAC3B,YAAA,IAAI;AACF,cAAA,GAAA,CAAI,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,YACzB,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF,CAAA,EAAG,aAAa,CAAA,CAAE,KAAA,EAAM;AAAA,MAC1B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,eAAe,YAAA,GAA8B;AAC3C,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,EAAO,EAAG;AAC/B,MAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,IAAA,EAAM;AAC3B,QAAA,IAAI;AACF,UAAA,GAAA,CAAI,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,QACzB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAKJ,cAAAA;AAAA,IACL,eAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CACP,QAAA,EACA,KAAA,EACA,KAAA,EACsC;AACtC,EAAA,IAAI,CAACK,cAAW,QAAQ,CAAA,SAAU,EAAE,IAAA,EAAM,EAAA,EAAI,UAAA,EAAY,CAAA,EAAE;AAC5D,EAAA,MAAM,UAAA,GAAaC,WAAA,CAAS,QAAQ,CAAA,CAAE,IAAA;AACtC,EAAA,IAAI,SAAS,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,IAAI,UAAA,EAAW;AACvD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC9C,EAAA,MAAM,MAAMC,eAAA,CAAa,QAAQ,CAAA,CAAE,QAAA,CAAS,OAAO,GAAG,CAAA;AACtD,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,UAAA,EAAW;AAClD;AC3MA,eAAsB,UAAA,CACpB,GAAA,EACA,OAAA,EACA,SAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,SAAA,IAAa,OAAA,CAAQ,UAAA,EAAY,SAAS,OAAA,CAAQ,GAAA;AAC/D,EAAA,MAAM,QAAA,GAAWV,sBAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,OAAOA,sBAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC9E,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,eAAsB,SAAA,CACpB,SACA,WAAA,EACgC;AAChC,EAAA,MAAM,EAAE,aAAY,GAAI,OAAA;AACxB,EAAA,MAAM,WAAA,GAAcW,6BAAA;AAAA,IAClB,WAAA;AAAA,IACA,WAAA,CAAY;AAAA,GACd;AACA,EAAA,MAAM,eAAA,GAAkBC,2BAAA,CAAgB,WAAA,EAAa,WAAA,CAAY,KAAK,CAAA;AAEtE,EAAA,IAAI,WAAA,IAAe,WAAA,CAAY,IAAA,KAAS,MAAA,EAAW;AACjD,IAAA,OAAOC,qBAAA;AAAA,MACL,WAAA;AAAA,MACA,2CAA2C,WAAW,CAAA,CAAA;AAAA,MACtD,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,aAAY;AAAE,KAChC;AAAA,EACF;AAEA,EAAA,IACE,CAAC,eAAA,IACD,WAAA,CAAY,yBAAyB,IAAA,IACrC,WAAA,CAAY,SAAS,MAAA,EACrB;AACA,IAAA,OAAOA,qBAAA;AAAA,MACL,mBAAA;AAAA,MACA,kDAAkD,WAAW,CAAA,CAAA;AAAA,MAC7D,EAAE,MAAM,EAAE,IAAA,EAAM,aAAa,KAAA,EAAO,WAAA,CAAY,OAAM;AAAE,KAC1D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAYA,eAAsB,aAAA,CACpB,SACA,IAAA,EAUA;AACA,EAAA,MAAM,EAAE,aAAY,GAAI,OAAA;AAGxB,EAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAChE,EAAA,MAAM,cAAA,GAAiB,cACnB,CAAC,CAAA,KAAA,EAAQ,WAAW,CAAA,GAAA,CAAK,CAAA,GACzB,CAAC,SAAS,CAAA;AAEd,EAAA,IAAI,WAAA,CAAY,SAAS,MAAA,EAAW;AAClC,IAAA,IAAI,WAAA,CAAY,+BAA+B,IAAA,EAAM;AACnD,MAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAAA,IAC7B;AACA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EACE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,IAAA,CAAK;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,MAAM,IAAA,CAAK,GAAA;AAAA,IACX,MAAA,EAAQ,MAAA;AAAA,IACR,eAAA,EAAiB,cAAA;AAAA,IACjB,QAAA,EAAU;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,UAAU,IAAA,CAAK,OAAA;AAAA,MACf,gBAAA,EAAkB;AAAA;AACpB,GACD,CAAA;AACD,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,CAAA,oDAAA,EAAuD,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACA,EAAA,IAAI,QAAA,KAAa,OAAA,IAAW,QAAA,KAAa,YAAA,EAAc;AACrD,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EACE;AAAA,GACJ;AACF;AAEO,SAAS,WAAW,OAAA,EAA4C;AACrE,EAAA,OAAO,OAAA,CAAQ,OAAOC,iCAAA,EAAsB;AAC9C;AC5HO,IAAM,iBAAN,MAAqB;AAAA,EAQ1B,WAAA,CACmB,SAAA,EACA,OAAA,EACA,IAAA,EACA,QAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAJgB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EAXF,SAAuB,EAAC;AAAA,EACjC,UAAA,GAAa,CAAA;AAAA,EACb,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,SAAA,GAA2B,IAAA;AAAA,EAC3B,aAAuB,EAAC;AAAA,EAShC,MAAM,KAAA,EAAyB;AAC7B,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,UAAA;AACzB,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,YAAYd,sBAAAA,CAAK,IAAA;AAAA,QACpB,IAAA,CAAK,QAAA;AAAA,QACL,CAAA,EAAGK,iBAAAA,EAAY,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA;AAAA,OAC9B;AAGA,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,IACjD;AACA,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAGtB,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,EACvC;AAAA,EAEQ,YAAY,KAAA,EAAyB;AAC3C,IAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AAC7B,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAAH,aAAU,IAAA,CAAK,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,MAAAa,gBAAA,CAAc,IAAA,CAAK,WAAW,EAAE,CAAA;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,gBAAA,GAAmB,KAAA,CAAM,UAAA,GAAa,KAAK,OAAA,EAAS;AAE3D,MAAA;AAAA,IACF;AAGA,IAAAC,iBAAA,CAAe,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,oBAAoB,KAAA,CAAM,UAAA;AAAA,EACjC;AAAA,EAEQ,SAAA,GAAY,KAAA;AAAA,EACZ,gBAAA,GAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB3B,MAAA,GAAqE;AACnE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AACrE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAAA,QAC9B,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA;AAAA,MAClB,IAAA,CAAK,OAAO,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MACrC,IAAA,CAAK;AAAA,KACP,CAAE,SAAS,MAAM,CAAA;AACjB,IAAA,MAAM,MAAA,GAAS;AAAA,qBAAA,EAA0B,IAAA,CAAK,SAAS,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAS,CAAA,KAAA,CAAA;AAC5F,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,GAAO,MAAA;AAAA,MACb,OAAA,EAAS,IAAA;AAAA,MACT,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAOhB,sBAAAA,CAAK,IAAA,CAAKC,SAAAA,EAAO,EAAG,qBAAqB,CAAA;AAClD;AAQO,SAAS,iBAAiB,IAAA,EAStB;AACT,EAAA,MAAM,MAAA,GAAS,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAA,UAAA,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,CAAA,WAAA,EAAc,IAAA,CAAK,QAAQ,CAAA,YAAA,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA,EAAa,KAAK,MAAM;AAAA,SAAA,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA,EAAa,KAAK,MAAM;AAAA,SAAA,CAAA;AAC5C,EAAA,MAAM,OAAO,IAAA,CAAK,OAAA,GACd,6BAA6B,IAAA,CAAK,OAAO,uDACzC,IAAA,CAAK,IAAA,KAAS,OACZ,CAAA,sBAAA,EAAyB,IAAA,CAAK,UAAU,CAAA,YAAA,CAAA,GACxC,CAAA,2BAAA,EAA8B,KAAK,UAAU,CAAA,eAAA,EAAkB,KAAK,QAAQ,CAAA,EAAA,CAAA;AAClF,EAAA,OAAO,CAAC,QAAQ,QAAA,EAAU,WAAA,EAAa,aAAa,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AACrE;AAEO,SAAS,kBAAkB,IAAA,EAQvB;AACT,EAAA,MAAM,MAAA,GAAS,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAA,UAAA,CAAA;AACvC,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA,EAAa,KAAK,MAAM;AAAA,SAAA,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA,EAAa,KAAK,MAAM;AAAA,SAAA,CAAA;AAC5C,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAU,CAAA,WAAA,EAAc,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAM,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA,IAAA,EAAO,IAAA,CAAK,YAAY,CAAA,mDAAA,EAAsD,OAAO,CAAA,8DAAA,CAAA;AACtJ,EAAA,OAAO,CAAC,MAAA,EAAQ,WAAA,EAAa,aAAa,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3D;AAEO,SAAS,4BAA4B,IAAA,EAGjC;AACT,EAAA,OAAO;AAAA,IACL,CAAA,SAAA,EAAY,KAAK,OAAO,CAAA,UAAA,CAAA;AAAA,IACxB,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA,SAAA,CAAA;AAAA,IACrB,CAAA,4FAAA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAEO,SAAS,qBAAqB,IAAA,EAS1B;AACT,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,aAAA;AACnC,EAAA,OAAO;AAAA,IACL,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA,SAAA,CAAA;AAAA,IACrB,CAAA,SAAA,EAAY,KAAK,OAAO,CAAA,UAAA,CAAA;AAAA,IACxB,cAAc,IAAA,CAAK,QAAA,KAAa,IAAA,GAAO,MAAA,GAAS,KAAK,QAAQ,CAAA,YAAA,CAAA;AAAA,IAC7D,CAAA;AAAA,EAAa,KAAK,MAAM;AAAA,SAAA,CAAA;AAAA,IACxB,CAAA;AAAA,EAAa,KAAK,MAAM;AAAA,SAAA,CAAA;AAAA,IACxB,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK,UAAU,CAAA,mBAAA,EAAsB,IAAI,CAAA,eAAA,EAAkB,IAAA,CAAK,OAAO,CAAA,EAAA;AAAA,GACxH,CAAE,KAAK,IAAI,CAAA;AACb;AAEO,SAAS,mBAAmB,IAAA,EAGxB;AACT,EAAA,OAAO,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA;AAAA,CAAA,EAAe,KAAK,MAAM,CAAA,gDAAA,CAAA;AACxD;ACpMO,IAAM,mBAAqBgB,YAAA,CAAA,YAAA,CAAa;AAAA,EAC7C,OAAA,EAAWA,YAAA,CAAA,IAAA;AAAA,IACPA,YAAA,CAAA,MAAA,EAAO;AAAA,IACPA,YAAA,CAAA,SAAA,CAAU,GAAG,qBAAqB,CAAA;AAAA,IAClCA,YAAA,CAAA,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAmB,kBAAkB,CAAA,MAAA;AAAA;AACvC,GACF;AAAA,EACA,GAAA,EAAOA,sBAAWA,YAAA,CAAA,IAAA,CAAOA,YAAA,CAAA,MAAA,IAAYA,YAAA,CAAA,SAAA,CAAU,CAAA,EAAG,uBAAuB,CAAC,CAAC,CAAA;AAAA,EAC3E,UAAA,EAAcA,YAAA,CAAA,QAAA;AAAA,IACVA,YAAA,CAAA,IAAA;AAAA,MACEA,YAAA,CAAA,MAAA,EAAO;AAAA,MACPA,YAAA,CAAA,OAAA,EAAQ;AAAA,MACRA,YAAA,CAAA,QAAA,CAAS,KAAK,8BAA8B;AAAA;AAChD,GACF;AAAA,EACA,WAAA,EAAeA,YAAA,CAAA,QAAA,CAAWA,YAAA,CAAA,MAAA,EAAQ,CAAA;AAAA,EAClC,UAAA,EAAcA,YAAA,CAAA,QAAA,CAAWA,YAAA,CAAA,OAAA,EAAS,CAAA;AAAA,EAClC,KAAOA,YAAA,CAAA,QAAA,CAAWA,YAAA,CAAA,MAAA,CAASA,qBAAO,EAAKA,YAAA,CAAA,MAAA,EAAQ,CAAC;AAClD,CAAC;AAEM,IAAM,yBAA2BA,YAAA,CAAA,YAAA,CAAa;AAAA,EACnD,QAAUA,YAAA,CAAA,IAAA,CAAOA,YAAA,CAAA,MAAA,IAAYA,YAAA,CAAA,SAAA,CAAU,CAAA,EAAG,oBAAoB,CAAC,CAAA;AAAA,EAC/D,UAAA,EAAcA,YAAA,CAAA,QAAA;AAAA,IACVA,YAAA,CAAA,IAAA,CAAOA,qBAAO,EAAKA,YAAA,CAAA,OAAA,IAAaA,YAAA,CAAA,QAAA,CAAS,CAAA,EAAG,yBAAyB,CAAC;AAAA,GAC1E;AAAA,EACA,UAAA,EAAcA,YAAA,CAAA,QAAA;AAAA,IACVA,YAAA,CAAA,IAAA,CAAOA,qBAAO,EAAKA,YAAA,CAAA,OAAA,IAAaA,YAAA,CAAA,QAAA,CAAS,CAAA,EAAG,yBAAyB,CAAC;AAAA;AAE5E,CAAC;AAEM,IAAM,uBAAyBA,YAAA,CAAA,YAAA,CAAa;AAAA,EACjD,QAAUA,YAAA,CAAA,IAAA,CAAOA,YAAA,CAAA,MAAA,IAAYA,YAAA,CAAA,SAAA,CAAU,CAAA,EAAG,oBAAoB,CAAC,CAAA;AAAA,EAC/D,QAAUA,YAAA,CAAA,QAAA,CAAWA,YAAA,CAAA,QAAA,CAAS,CAAC,SAAA,EAAW,SAAS,CAAC,CAAC;AACvD,CAAC;AASD,IAAM,mBAAA,GAA8C;AAAA,EAClD,GAAA,EAAK,iDAAA;AAAA,EACL,aAAA,EAAe,2DAAA;AAAA,EACf,MAAA,EAAQ,oDAAA;AAAA,EACR,GAAA,EAAK,iDAAA;AAAA,EAEL,SAAA,EAAW,mDAAA;AAAA,EACX,GAAA,EAAK,6CAAA;AAAA,EACL,IAAA,EAAM,8CAAA;AAAA,EACN,iBAAA,EACE,2DAAA;AAAA,EAEF,OAAA,EACE,oHAAA;AAAA,EACF,UAAA,EACE,0EAAA;AAAA,EACF,eAAA,EACE,mFAAA;AAAA,EAEF,QAAA,EAAU,kDAAA;AAAA,EACV,WAAA,EAAa,qDAAA;AAAA,EAEb,IAAA,EAAM,CAAA,4IAAA,CAAA;AAAA,EACN,QAAA,EACE,CAAA,+GAAA,CAAA;AAAA,EACF,WAAA,EACE,CAAA,2GAAA,CAAA;AAAA,EACF,OAAA,EACE,CAAA,iGAAA,CAAA;AAAA,EAEF,KAAA,EACE,CAAA,qIAAA,CAAA;AAAA,EACF,KAAA,EACE,8HAAA;AAAA,EAEF,OAAA,EACE,qFAAA;AAAA,EACF,YAAA,EACE,0FAAA;AAAA,EACF,WAAA,EACE,oFAAA;AAAA,EACF,OAAA,EACE,8FAAA;AAAA,EACF,cAAA,EACE,qGAAA;AAAA,EAEF,KAAA,EAAO,uEAAA;AAAA,EACP,YAAA,EACE;AACJ,CAAA;AAEA,SAAS,aAAa,KAAA,EAA0B;AAC9C,EAAA,IAAI,UAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,SAAiB,EAAC;AACzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA,EAAG;AAC/D,IAAA,MAAM,IAAA,GAAO,oBAAoB,GAAG,CAAA;AACpC,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gBAAgB,QAAA,EAA4C;AACnE,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IACd,CAAC,CAAA,MACE;AAAA,MACC,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACX;AAAA,GACJ;AACF;AAEO,SAAS,oBAAoB,KAAA,EAEc;AAChD,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,eAAA,CAAgB,OAAO,CAAA,EAAE;AAAA,EACvD;AACA,EAAA,MAAM,MAAA,GAAWA,YAAA,CAAA,SAAA,CAAU,gBAAA,EAAkB,KAAK,CAAA;AAClD,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,EAAO;AAC5D,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAC5C;AAEO,SAAS,0BAA0B,KAAA,EAEQ;AAChD,EAAA,MAAM,MAAA,GAAWA,YAAA,CAAA,SAAA,CAAU,sBAAA,EAAwB,KAAK,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,EAAO;AAC5D,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAC5C;AAEO,SAAS,wBAAwB,KAAA,EAEU;AAChD,EAAA,MAAM,MAAA,GAAWA,YAAA,CAAA,SAAA,CAAU,oBAAA,EAAsB,KAAK,CAAA;AACtD,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,OAAO,MAAA,EAAO;AAC5D,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAC5C;AAIO,IAAM,cAAA,GAAiB;AAEvB,IAAM,qBAAA,GAAwB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kIAAA;AAU9B,IAAM,kBAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EAAa,qBAAA;AAAA,EACb,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA,OACJ;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,GAAA;AAAA,QACT,WAAA,EACE;AAAA,OACJ;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EACE;AAAA,OACJ;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,QAAA;AAAA,QACN,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvC,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,IACpB,oBAAA,EAAsB;AAAA;AAE1B;AAEO,IAAM,qBAAA,GAAwB;AAE9B,IAAM,4BAAA,GAA+B,CAAA;;AAAA,qOAAA;AAIrC,IAAM,wBAAA,GAA2C;AAAA,EACtD,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EAAa,4BAAA;AAAA,EACb,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA,OACJ;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAA;AAAA,QACT,WAAA,EACE;AAAA,OACJ;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAA;AAAA,QACT,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,IACnB,oBAAA,EAAsB;AAAA;AAE1B;AAEO,IAAM,mBAAA,GAAsB;AAE5B,IAAM,0BAAA,GAA6B,CAAA;;AAAA,gIAAA;AAInC,IAAM,sBAAA,GAAyC;AAAA,EACpD,IAAA,EAAM,mBAAA;AAAA,EACN,WAAA,EAAa,0BAAA;AAAA,EACb,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,SAAA,EAAW,SAAS,CAAA;AAAA,QAC3B,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,IACnB,oBAAA,EAAsB;AAAA;AAE1B;;;ACtOA,IAAM,iBAAA,uBAAwB,OAAA,EAAmC;AAEjE,SAAS,YAAY,OAAA,EAAkC;AACrD,EAAA,iBAAA,CAAkB,IAAI,OAAA,EAAA,CAAU,iBAAA,CAAkB,IAAI,OAAO,CAAA,IAAK,KAAK,CAAC,CAAA;AAC1E;AAEA,SAAS,SAAS,OAAA,EAAoC;AACpD,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AAC3C;AAEA,SAAS,IAAI,KAAA,EAAuD;AAClE,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAChC;AAEA,SAAS,gBAAgB,OAAA,EAA0C;AACjE,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,OAAO,OAAA,CAAQ,QAAA;AAGrC,EAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,0BAAA,KAA+B,IAAA,EAAM;AAI7D,EAAA,OAAO,uBAAA,EAAwB;AACjC;AAYO,SAAS,iBAAiB,OAAA,EAAgC;AAE/D,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,wBAAwB,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,IAAA;AAE9B,EAAA,IACG,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,IAAI,QAAA,CAAS,GAAG,CAAA,IACvC,GAAA,CAAI,WAAW,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EACxC;AACA,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAS,GAAA,EAAsD;AACtE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,KAAA,MAAW,UAAU,sBAAA,EAAwB;AAC3C,MAAA,IACE,GAAA,KAAQ,UACP,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAC9C;AACA,QAAA,OAAO,CAAA,2CAAA,EAA8C,GAAG,CAAA,WAAA,EAAc,MAAM,CAAA,GAAA,CAAA;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA;AACpC;AAEA,eAAsB,IAAA,CACpB,OACA,OAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,oBAAoB,KAAK,CAAA;AACxC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,IAAA,OAAO,GAAA,CAAIJ,sBAAU,eAAA,EAAiB,QAAA,EAAU,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,SAAS,MAAA,CAAO,KAAA;AAEtB,EAAA,IACE,MAAA,CAAO,UAAA,KAAe,IAAA,IACtB,MAAA,CAAO,eAAe,MAAA,EACtB;AACA,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,IAAO,EAAC;AAChC,EAAA,MAAM,QAAA,GAAW,SAAS,QAAQ,CAAA;AAClC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,GAAA,CAAIA,qBAAAA,CAAU,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,GAAA,GAAM,WAAW,OAAO,CAAA;AAC9B,EAAA,MAAM,cAAc,MAAM,UAAA,CAAW,GAAA,EAAK,OAAA,EAAS,OAAO,GAAG,CAAA;AAG7D,EAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAW,CAAA;AACvD,EAAA,IAAI,UAAA,EAAY,OAAO,GAAA,CAAI,UAAU,CAAA;AAGrC,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC9D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA,CAAU,WAAA,EAAa,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAA,EAAI;AAAA,QAC3D,IAAA,EAAM,EAAE,GAAA,EAAK,WAAA;AAAY,OAC1B;AAAA,KACH;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,UAAA;AAAA,QACA,2BAA2B,WAAW,CAAA,CAAA;AAAA,QACtC,EAAE,IAAA,EAAM,EAAE,GAAA,EAAK,aAAY;AAAE;AAC/B,KACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,UAAA,IACP,OAAA,CAAQ,0BAAA,IACR,6BAAA;AACF,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,OAAA,EAAS;AAAA,IAC5C,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,GAAA,EAAK,WAAA;AAAA,IACL,UAAA,EAAY,OAAO,UAAA,IAAc,KAAA;AAAA,IACjC,SAAA,EAAW,gBAAA;AAAA,IACX,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,QAAQ;AAAA,GAC9B,CAAA;AACD,EAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAQ;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,GAAA,GACjC,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA,GAC/B,MAAA,CAAO,OAAA;AACX,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,mBAAA;AAAA,QACA,CAAA,EAAG,SAAS,MAAM;AAAA,SAAA,EAAc,IAAI,CAAA,CAAA;AAAA,QACpC,EAAE,MAAM,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,GAAA,EAAK,aAAY;AAAE;AACxD,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,GAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AAAA,IAC3B,GAAG;AAAA,GACL;AAEA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAGI,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5C,IAAA,IAAIA,EAAAA,KAAM,MAAA,EAAW,OAAO,OAAA,CAAQ,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,QAAA,GAAW,gBAAgB,OAAO,CAAA;AAExC,EAAA,IAAI,MAAA,CAAO,eAAe,IAAA,EAAM;AAC9B,IAAA,OAAO,aAAA;AAAA,MACL,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,CAAO,OAAA;AAAA,MACP,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AAAA,IACL,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,CAAO,OAAA;AAAA,IACP,WAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAe,aAAA,CACb,OAAA,EACA,QAAA,EACA,OAAA,EACA,KACA,GAAA,EACqB;AACrB,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB;AAC7B,IAAA,OAAO,GAAA;AAAA,MACLJ,qBAAAA;AAAA,QACE,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,iBAAA,IAAqB,mBAAA;AAC7C,EAAA,IAAI,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,EAAS;AAChC,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,UAAA;AAAA,QACA,iCAAiC,OAAO,CAAA,6CAAA;AAAA;AAC1C,KACF;AAAA,EACF;AACA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,QAAA,CAAS,gBAAgB,EAAE,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,CAAA;AACtE,EAAA,WAAA,CAAY,OAAO,CAAA;AACnB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,oBAAA;AAAA,IACN,MAAA,EAAQ,2BAAA,CAA4B,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,IACtD;AAAA,GACF;AACF;AAEA,eAAe,cACb,OAAA,EACA,QAAA,EACA,OAAA,EACA,GAAA,EACA,KACA,mBAAA,EACqB;AACrB,EAAA,MAAM,WAAA,GACJ,QAAQ,mBAAA,IAAuB,6BAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,oBAAA,IAAwB,uBAAA;AAClD,EAAA,MAAM,OAAA,GAAU,QAAQ,kBAAA,IAAsB,qBAAA;AAC9C,EAAA,MAAM,WAAW,eAAA,EAAgB;AAEjC,EAAA,MAAM,YAAY,IAAI,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,OAAO,QAAQ,CAAA;AACxE,EAAA,MAAM,YAAY,IAAI,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,OAAO,QAAQ,CAAA;AAExE,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAA,GAAe,MAAM,UAAA,CAAW,KAAA,EAAM;AAC5C,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAAA,SACxC,OAAA,CAAQ,OAAO,gBAAA,CAAiB,OAAA,EAAS,cAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC5E;AAEA,EAAA,IAAI,QAAA,GAAgE,IAAA;AACpE,EAAA,IAAI,eAAA,GAAyC,IAAA;AAC7C,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,eAAA,eAA8B,eAAe,CAAA;AACjD,IAAA,eAAA,GAAkB,WAAW,MAAM;AACjC,MAAA,QAAA,GAAW,oBAAA;AACX,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,GAAG,mBAAmB,CAAA;AAAA,EACxB,CAAA;AACA,EAAA,eAAA,EAAgB;AAEhB,EAAA,MAAM,cAAA,GAAiB,WAAW,MAAM;AACtC,IAAA,QAAA,GAAW,qBAAA;AACX,IAAA,UAAA,CAAW,KAAA,EAAM;AAAA,EACnB,GAAG,WAAW,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,SAAS,GAAA,CAAI;AAAA,MAC1B,OAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,SAAA,CAAU,MAAM,KAAK,CAAA;AACrB,QAAA,eAAA,EAAgB;AAAA,MAClB,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,SAAA,CAAU,MAAM,KAAK,CAAA;AACrB,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,KACD,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,IAAI,eAAA,eAA8B,eAAe,CAAA;AACjD,IAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,YAAY,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAChC,EAAA,MAAM,YAAA,GAAe,UAAU,MAAA,EAAO;AACtC,EAAA,MAAM,YAAA,GAAe,UAAU,MAAA,EAAO;AAEtC,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,MAAMK,QAAAA,GAAU,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,OAAA;AACrD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,QAAQ,iBAAA,CAAkB;AAAA,QACxB,OAAA;AAAA,QACA,QAAQ,YAAA,CAAa,IAAA;AAAA,QACrB,QAAQ,YAAA,CAAa,IAAA;AAAA,QACrB,MAAA,EAAQ,QAAA;AAAA,QACR,UAAA;AAAA,QACA,YAAA,EAAc,SAAA,CAAU,UAAA,EAAW,GAAI,UAAU,UAAA,EAAW;AAAA,QAC5D,OAAA,EAAAA;AAAA,OACD,CAAA;AAAA,MACD,QAAQ,YAAA,CAAa,IAAA;AAAA,MACrB,QAAQ,YAAA,CAAa,IAAA;AAAA,MACrB,MAAA,EAAQ,QAAA;AAAA,MACR,UAAA;AAAA,MACA,GAAIA,QAAAA,GAAU,EAAE,OAAA,EAAAA,QAAAA,KAAY;AAAC,KAC/B;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,EAAA,MAAM,IAAA,GAA8B,QAAA,KAAa,CAAA,GAAI,IAAA,GAAO,cAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,OAAA;AACrD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,OAAA;AAErD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAQ,gBAAA,CAAiB;AAAA,MACvB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAQ,YAAA,CAAa,IAAA;AAAA,MACrB,QAAQ,YAAA,CAAa,IAAA;AAAA,MACrB,UAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,QAAA;AAAA,IACA,QAAQ,YAAA,CAAa,IAAA;AAAA,IACrB,QAAQ,YAAA,CAAa,IAAA;AAAA,IACrB,UAAA;AAAA,IACA,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,IAC7B;AAAA,GACF;AACF;AAEA,eAAsB,UAAA,CACpB,OACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,0BAA0B,KAAK,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,IAAA,OAAO,GAAA,CAAIL,qBAAAA,CAAU,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,uBAAA,EAAwB;AAC7D,EAAA,IAAI,CAAC,SAAS,cAAA,EAAgB;AAC5B,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,QAAA,CAAS,cAAA,CAAe,MAAA,CAAO,MAAM,MAAA,EAAQ;AAAA,MAC9D,GAAI,MAAA,CAAO,KAAA,CAAM,UAAA,KAAe,KAAA,CAAA,GAC5B,EAAE,UAAA,EAAY,MAAA,CAAO,KAAA,CAAM,UAAA,EAAW,GACtC,EAAC;AAAA,MACL,GAAI,MAAA,CAAO,KAAA,CAAM,UAAA,KAAe,KAAA,CAAA,GAC5B,EAAE,UAAA,EAAY,MAAA,CAAO,KAAA,CAAM,UAAA,EAAW,GACtC;AAAC,KACN,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,CAAA;AAC7C,IAAA,MAAM,gBACJ,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,GAAI,UAAA,CAAW,KAAK,MAAM,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA;AAChD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,QAAQ,oBAAA,CAAqB;AAAA,QAC3B,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAAA,QACpB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,eAAe,SAAA,GAAY;AAAA,KAC7B;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,WAAA;AAAA,QACC,CAAA,CAAY,OAAA,IAAW,CAAA,gBAAA,EAAmB,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA;AAChE,KACF;AAAA,EACF;AACF;AAEA,eAAsB,QAAA,CACpB,OACA,OAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,wBAAwB,KAAK,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,IAAA,OAAO,GAAA,CAAIA,qBAAAA,CAAU,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,uBAAA,EAAwB;AAC7D,EAAA,IAAI,CAAC,SAAS,cAAA,EAAgB;AAC5B,IAAA,OAAO,GAAA;AAAA,MACLA,qBAAAA;AAAA,QACE,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,SAAA;AACtC,EAAA,MAAM,QAAA,CAAS,cAAA,CAAe,MAAA,CAAO,KAAA,CAAM,QAAQ,MAAM,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,mBAAmB,EAAE,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACjE,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAAA,IACpB;AAAA,GACF;AACF;AAgBO,SAAS,aAAA,CACd,OAAA,EACA,OAAA,EACA,QAAA,EAC+D;AAC/D,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA,EACxD;AACA,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA,EACxD;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,UAAA,EAAY,KAAA,IAAS,OAAA,CAAQ,GAAA;AAClD,EAAA,MAAM,QAAA,GAAWb,sBAAAA,CAAK,UAAA,CAAW,MAAM,CAAA,GACnCA,sBAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,GACnBA,sBAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAG7B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,WAAA,CAAY,KAAA,CAAM,IAAA;AAAA,IACvC,CAAC,MAAM,QAAA,KAAa,CAAA,IAAK,SAAS,UAAA,CAAW,CAAA,GAAIA,uBAAK,GAAG;AAAA,GAC3D;AACA,EAAA,IAAI,CAAC,MAAA,IAAU,OAAA,CAAQ,WAAA,CAAY,yBAAyB,IAAA,EAAM;AAChE,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAA,EAAK;AAAA,EAC3D;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAA,CAAQ,WAAW,KAAA,GAAQ,QAAA;AAAA,EAC7B;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,SAAS,KAAA,EAAM;AAC3D","file":"index.cjs","sourcesContent":["export const DEFAULT_INACTIVITY_TIMEOUT_MS = 60_000;\nexport const DEFAULT_WALLCLOCK_BACKSTOP_MS = 300_000;\nexport const MAX_COMMAND_LENGTH = 16_384;\nexport const MAX_OUTPUT_BYTES_INLINE = 30_720; // 30 KB per stream\nexport const MAX_OUTPUT_BYTES_FILE = 10 * 1024 * 1024; // 10 MB per stream\nexport const BACKGROUND_MAX_JOBS = 16;\nexport const KILL_GRACE_MS = 5_000;\n\n/**\n * Env var name prefixes that the tool refuses to let the model set via `env`.\n * Defense in depth: even if the harness forwards its environment, the model\n * should not be able to override credentials per-call.\n */\nexport const SENSITIVE_ENV_PREFIXES: readonly string[] = [\n \"AWS_\",\n \"BEDROCK_\",\n \"GITHUB_TOKEN\",\n \"GH_TOKEN\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"GEMINI_API_KEY\",\n \"NPM_TOKEN\",\n \"DOCKERHUB_TOKEN\",\n \"SLACK_\",\n \"STRIPE_\",\n];\n","import { spawn } from \"node:child_process\";\nimport { mkdirSync, createWriteStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { KILL_GRACE_MS } from \"./constants.js\";\nimport type {\n BackgroundReadResult,\n BashExecutor,\n BashRunInput,\n BashRunResult,\n} from \"./types.js\";\n\n/**\n * Default local-subprocess executor.\n *\n * Launches the bash binary with `-c <command>` via the argv form of\n * node:child_process.spawn — NEVER the string-based shell-eval entry\n * point. The command string is passed as a single argument to the bash\n * binary, not interpolated into our own spawn args. All shell parsing\n * happens inside the child bash process.\n *\n * This executor ships unsandboxed; sandboxing is the job of adapter\n * packages that implement the same BashExecutor interface. See\n * packages/bash/src/types.ts.\n */\nexport function createLocalBashExecutor(opts?: {\n bashPath?: string;\n logDir?: string;\n}): BashExecutor {\n const bashPath = opts?.bashPath ?? \"/bin/bash\";\n const logDir = opts?.logDir ?? path.join(tmpdir(), \"agent-sh-bash-logs\");\n mkdirSync(logDir, { recursive: true });\n\n interface Job {\n readonly id: string;\n readonly outPath: string;\n readonly errPath: string;\n running: boolean;\n exitCode: number | null;\n killed: boolean;\n proc: ReturnType<typeof spawn> | null;\n }\n\n const jobs = new Map<string, Job>();\n\n async function runForeground(input: BashRunInput): Promise<BashRunResult> {\n const child = spawn(bashPath, [\"-c\", input.command], {\n cwd: input.cwd,\n env: { ...input.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => input.onStdout(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => input.onStderr(chunk));\n\n let killedBySignal = false;\n const onAbort = () => {\n killedBySignal = true;\n try {\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child.exitCode === null) child.kill(\"SIGKILL\");\n }, KILL_GRACE_MS).unref();\n } catch {\n // best effort\n }\n };\n if (input.signal.aborted) {\n onAbort();\n } else {\n input.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return new Promise((resolve) => {\n child.on(\"close\", (code, signal) => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({\n exitCode: code,\n killed: killedBySignal,\n signal: signal ?? null,\n });\n });\n child.on(\"error\", () => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({ exitCode: null, killed: killedBySignal, signal: null });\n });\n });\n }\n\n async function spawnBackground(args: {\n command: string;\n cwd: string;\n env: Readonly<Record<string, string>>;\n }): Promise<{ jobId: string }> {\n const jobId = randomUUID();\n const outPath = path.join(logDir, `${jobId}.out`);\n const errPath = path.join(logDir, `${jobId}.err`);\n const outStream = createWriteStream(outPath, { flags: \"w\" });\n const errStream = createWriteStream(errPath, { flags: \"w\" });\n\n const child = spawn(bashPath, [\"-c\", args.command], {\n cwd: args.cwd,\n env: { ...args.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: false,\n });\n\n child.stdout.pipe(outStream);\n child.stderr.pipe(errStream);\n\n const job: Job = {\n id: jobId,\n outPath,\n errPath,\n running: true,\n exitCode: null,\n killed: false,\n proc: child,\n };\n jobs.set(jobId, job);\n\n child.on(\"close\", (code) => {\n job.running = false;\n job.exitCode = code;\n job.proc = null;\n });\n child.on(\"error\", () => {\n job.running = false;\n job.proc = null;\n });\n\n return { jobId };\n }\n\n async function readBackground(\n jobId: string,\n opts: { since_byte?: number; head_limit?: number },\n ): Promise<BackgroundReadResult> {\n const job = jobs.get(jobId);\n if (!job) {\n throw new Error(`Unknown job_id: ${jobId}`);\n }\n const since = opts.since_byte ?? 0;\n const limit = opts.head_limit ?? 30_720;\n const stdout = readSlice(job.outPath, since, limit);\n const stderr = readSlice(job.errPath, since, limit);\n return {\n stdout: stdout.text,\n stderr: stderr.text,\n running: job.running,\n exitCode: job.exitCode,\n totalBytesStdout: stdout.totalBytes,\n totalBytesStderr: stderr.totalBytes,\n };\n }\n\n async function killBackground(\n jobId: string,\n signal: \"SIGTERM\" | \"SIGKILL\" = \"SIGTERM\",\n ): Promise<void> {\n const job = jobs.get(jobId);\n if (!job || !job.proc) return;\n job.killed = true;\n try {\n job.proc.kill(signal);\n if (signal === \"SIGTERM\") {\n setTimeout(() => {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGKILL\");\n } catch {\n // ignore\n }\n }\n }, KILL_GRACE_MS).unref();\n }\n } catch {\n // ignore\n }\n }\n\n async function closeSession(): Promise<void> {\n for (const job of jobs.values()) {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGTERM\");\n } catch {\n // ignore\n }\n }\n }\n }\n\n return {\n run: runForeground,\n spawnBackground,\n readBackground,\n killBackground,\n closeSession,\n };\n}\n\nfunction readSlice(\n filePath: string,\n since: number,\n limit: number,\n): { text: string; totalBytes: number } {\n if (!existsSync(filePath)) return { text: \"\", totalBytes: 0 };\n const totalBytes = statSync(filePath).size;\n if (since >= totalBytes) return { text: \"\", totalBytes };\n const end = Math.min(since + limit, totalBytes);\n const buf = readFileSync(filePath).subarray(since, end);\n return { text: buf.toString(\"utf8\"), totalBytes };\n}\n","import path from \"node:path\";\nimport {\n defaultNodeOperations,\n isInsideAnyRoot,\n matchesAnyPattern,\n toolError,\n type ReadOperations,\n type ToolError,\n} from \"@agent-sh/harness-core\";\nimport type { BashSessionConfig } from \"./types.js\";\n\nexport async function resolveCwd(\n ops: ReadOperations,\n session: BashSessionConfig,\n requested: string | undefined,\n): Promise<string> {\n const base = requested ?? session.logicalCwd?.value ?? session.cwd;\n const absolute = path.isAbsolute(base) ? base : path.resolve(session.cwd, base);\n try {\n return await ops.realpath(absolute);\n } catch {\n return absolute;\n }\n}\n\nexport async function fenceBash(\n session: BashSessionConfig,\n resolvedCwd: string,\n): Promise<ToolError | undefined> {\n const { permissions } = session;\n const isSensitive = matchesAnyPattern(\n resolvedCwd,\n permissions.sensitivePatterns,\n );\n const insideWorkspace = isInsideAnyRoot(resolvedCwd, permissions.roots);\n\n if (isSensitive && permissions.hook === undefined) {\n return toolError(\n \"SENSITIVE\",\n `Refusing to run bash in sensitive path: ${resolvedCwd}`,\n { meta: { path: resolvedCwd } },\n );\n }\n\n if (\n !insideWorkspace &&\n permissions.bypassWorkspaceGuard !== true &&\n permissions.hook === undefined\n ) {\n return toolError(\n \"OUTSIDE_WORKSPACE\",\n `cwd is outside all configured workspace roots: ${resolvedCwd}`,\n { meta: { path: resolvedCwd, roots: permissions.roots } },\n );\n }\n\n return undefined;\n}\n\n/**\n * Permission hook call, bash-specific metadata.\n *\n * Returns one of:\n * \"allow\" — run\n * \"allow_once\" — run (no persistent rule learned)\n * \"deny\" — refuse with PERMISSION_DENIED\n * \"ask\" — treated as \"deny\" in this autonomous tool; caller\n * gets a hint to configure the hook properly\n */\nexport async function askPermission(\n session: BashSessionConfig,\n args: {\n command: string;\n cwd: string;\n background: boolean;\n timeoutMs: number;\n envKeys: readonly string[];\n },\n): Promise<\n | { decision: \"allow\" | \"allow_once\" }\n | { decision: \"deny\"; reason: string }\n> {\n const { permissions } = session;\n // Extract the first whitespace token as the \"command head\" for pattern\n // hints (`git`, `npm`, `python`, ...). Matches Claude Code convention.\n const commandHead = args.command.trimStart().split(/\\s+/)[0] ?? \"\";\n const alwaysPatterns = commandHead\n ? [`Bash(${commandHead}:*)`]\n : [\"Bash(*)\"];\n\n if (permissions.hook === undefined) {\n if (permissions.unsafeAllowBashWithoutHook === true) {\n return { decision: \"allow\" };\n }\n return {\n decision: \"deny\",\n reason:\n \"bash tool has no permission hook configured; refusing to run untrusted commands. Wire a hook or set session.permissions.unsafeAllowBashWithoutHook for test fixtures.\",\n };\n }\n\n const decision = await permissions.hook({\n tool: \"bash\",\n path: args.cwd,\n action: \"read\",\n always_patterns: alwaysPatterns,\n metadata: {\n command: args.command,\n cwd: args.cwd,\n background: args.background,\n timeout_ms: args.timeoutMs,\n env_keys: args.envKeys,\n network_required: null,\n },\n });\n if (decision === \"deny\") {\n return {\n decision: \"deny\",\n reason: `Command blocked by permission policy. Pattern hint: ${alwaysPatterns.join(\", \")}`,\n };\n }\n if (decision === \"allow\" || decision === \"allow_once\") {\n return { decision };\n }\n // \"ask\" in autonomous mode → deny with hint.\n return {\n decision: \"deny\",\n reason:\n \"Permission hook returned 'ask' but bash runs in autonomous mode. Configure the hook to return allow or deny.\",\n };\n}\n\nexport function resolveOps(session: BashSessionConfig): ReadOperations {\n return session.ops ?? defaultNodeOperations();\n}\n\n// Add a minimal ops accessor if session extends with it. Bash uses the\n// shared default for realpath/stat only.\ndeclare module \"./types.js\" {\n interface BashSessionConfig {\n readonly ops?: ReadOperations;\n }\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Per-stream output buffer with head+tail capping and spill-to-file on\n * overflow. Models rarely need the middle of a long output — they need\n * either the setup line or the error tail. This buffer preserves both.\n */\nexport class HeadTailBuffer {\n private readonly chunks: Uint8Array[] = [];\n private totalBytes = 0;\n private byteCap = false;\n private spilled = false;\n private spillPath: string | null = null;\n private spillBytes: number[] = [];\n\n constructor(\n private readonly maxInline: number,\n private readonly maxFile: number,\n private readonly kind: \"out\" | \"err\",\n private readonly spillDir: string,\n ) {}\n\n write(chunk: Uint8Array): void {\n this.totalBytes += chunk.byteLength;\n if (this.totalBytes <= this.maxInline) {\n this.chunks.push(chunk);\n return;\n }\n // Overflow: spill everything past the cap to disk + remember tail.\n if (!this.spilled) {\n this.spilled = true;\n this.byteCap = true;\n this.spillPath = path.join(\n this.spillDir,\n `${randomUUID()}.${this.kind}`,\n );\n // Write whatever was buffered so far into the spill file so the\n // full log is recoverable from the file path alone.\n for (const c of this.chunks) this.appendSpill(c);\n }\n this.appendSpill(chunk);\n // Keep a tail window (roughly half of maxInline in bytes) from spilled\n // stream so the inline result has a useful tail slice.\n this.spillBytes.push(chunk.byteLength);\n }\n\n private appendSpill(chunk: Uint8Array): void {\n if (this.spillPath === null) return;\n if (!this.spillInit) {\n mkdirSync(this.spillDir, { recursive: true });\n writeFileSync(this.spillPath, \"\");\n this.spillInit = true;\n }\n if (this.fileBytesWritten + chunk.byteLength > this.maxFile) {\n // File cap hit. Ignore further writes.\n return;\n }\n // Sync append — output sizes are in KB-to-MB range, no need for\n // async stream plumbing.\n appendFileSync(this.spillPath, Buffer.from(chunk));\n this.fileBytesWritten += chunk.byteLength;\n }\n\n private spillInit = false;\n private fileBytesWritten = 0;\n\n /**\n * Return the inline render:\n * - If not capped: the full buffered text.\n * - If capped: head (first maxInline/2 bytes) + marker + tail\n * (last maxInline/2 bytes) approximation. We approximate the tail\n * by decoding only the tail window (maxInline/2 bytes from the spill\n * file) because the stream is write-once and we dropped the middle.\n *\n * The actual implementation is simpler: we keep only the head inline\n * (first maxInline bytes, never overwritten) and emit a marker that\n * points at the log path. Head-only is a deliberate simplification\n * versus spec's head+tail — it matches OpenCode's default, and we\n * rely on Read(path) to see the tail. Spec §4 head+tail is a v2\n * improvement once we prove the file-path recovery path.\n */\n render(): { text: string; byteCap: boolean; logPath: string | null } {\n if (!this.spilled) {\n const combined = Buffer.concat(this.chunks.map((c) => Buffer.from(c)));\n return {\n text: combined.toString(\"utf8\"),\n byteCap: false,\n logPath: null,\n };\n }\n // Capped: return the first maxInline bytes and a pointer to the file.\n const head = Buffer.concat(\n this.chunks.map((c) => Buffer.from(c)),\n this.maxInline,\n ).toString(\"utf8\");\n const marker = `\\n... (stream exceeded ${this.maxInline} bytes; full log at ${this.spillPath}) ...`;\n return {\n text: head + marker,\n byteCap: true,\n logPath: this.spillPath,\n };\n }\n\n bytesTotal(): number {\n return this.totalBytes;\n }\n\n wasCapped(): boolean {\n return this.byteCap;\n }\n}\n\nexport function defaultSpillDir(): string {\n return path.join(tmpdir(), \"agent-sh-bash-spill\");\n}\n\n/**\n * Format the text body of an \"ok\" / \"nonzero_exit\" result.\n * Kept deliberately simple — structured fields ride on the result\n * object; `output` is the canonical text the executor returns to the\n * model at the tool_result boundary.\n */\nexport function formatResultText(args: {\n command: string;\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n byteCap: boolean;\n logPath: string | null;\n kind: \"ok\" | \"nonzero_exit\";\n}): string {\n const header = `<command>${args.command}</command>`;\n const exitLine = `<exit_code>${args.exitCode}</exit_code>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const hint = args.byteCap\n ? `(Output capped. Full log: ${args.logPath}. Read it with pagination if you need the middle.)`\n : args.kind === \"ok\"\n ? `(Command completed in ${args.durationMs}ms. exit=0.)`\n : `(Command exited nonzero in ${args.durationMs}ms. Exit code: ${args.exitCode}.)`;\n return [header, exitLine, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatTimeoutText(args: {\n command: string;\n stdout: string;\n stderr: string;\n reason: \"inactivity timeout\" | \"wall-clock backstop\";\n durationMs: number;\n partialBytes: number;\n logPath: string | null;\n}): string {\n const header = `<command>${args.command}</command>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const logHint = args.logPath ? ` Full log: ${args.logPath}.` : \"\";\n const hint = `(Command hit ${args.reason} after ${args.durationMs}ms. ${args.partialBytes} bytes captured. Kill signal: SIGTERM then SIGKILL.${logHint} If the command is long-running, retry with background: true.)`;\n return [header, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatBackgroundStartedText(args: {\n command: string;\n jobId: string;\n}): string {\n return [\n `<command>${args.command}</command>`,\n `<job_id>${args.jobId}</job_id>`,\n `(Background job started. Poll output with bash_output(job_id). Kill with bash_kill(job_id).)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashOutputText(args: {\n jobId: string;\n running: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n sinceByte: number;\n returnedBytes: number;\n totalBytes: number;\n}): string {\n const next = args.sinceByte + args.returnedBytes;\n return [\n `<job_id>${args.jobId}</job_id>`,\n `<running>${args.running}</running>`,\n `<exit_code>${args.exitCode === null ? \"null\" : args.exitCode}</exit_code>`,\n `<stdout>\\n${args.stdout}\\n</stdout>`,\n `<stderr>\\n${args.stderr}\\n</stderr>`,\n `(Showing bytes ${args.sinceByte}-${next} of ${args.totalBytes}. Next since_byte: ${next}. Job running: ${args.running}.)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashKillText(args: {\n jobId: string;\n signal: \"SIGTERM\" | \"SIGKILL\";\n}): string {\n return `<job_id>${args.jobId}</job_id>\\n(${args.signal} sent. Poll bash_output to confirm termination.)`;\n}\n","import * as v from \"valibot\";\nimport type { ToolDefinition } from \"@agent-sh/harness-core\";\nimport { MAX_COMMAND_LENGTH } from \"./constants.js\";\nimport type { BashParams, BashOutputParams, BashKillParams } from \"./types.js\";\n\nexport const BashParamsSchema = v.strictObject({\n command: v.pipe(\n v.string(),\n v.minLength(1, \"command is required\"),\n v.maxLength(\n MAX_COMMAND_LENGTH,\n `command exceeds ${MAX_COMMAND_LENGTH} bytes`,\n ),\n ),\n cwd: v.optional(v.pipe(v.string(), v.minLength(1, \"cwd must not be empty\"))),\n timeout_ms: v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(100, \"timeout_ms must be >= 100 ms\"),\n ),\n ),\n description: v.optional(v.string()),\n background: v.optional(v.boolean()),\n env: v.optional(v.record(v.string(), v.string())),\n});\n\nexport const BashOutputParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n since_byte: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(0, \"since_byte must be >= 0\")),\n ),\n head_limit: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(1, \"head_limit must be >= 1\")),\n ),\n});\n\nexport const BashKillParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n signal: v.optional(v.picklist([\"SIGTERM\", \"SIGKILL\"])),\n});\n\nexport type ParsedBashParams = v.InferOutput<typeof BashParamsSchema>;\n\n/**\n * Alias table mirroring grep/glob's KNOWN_PARAM_ALIASES. Models routinely\n * pass alternate names; we return a targeted INVALID_PARAM redirect rather\n * than the generic strictObject \"Unknown key: X\".\n */\nconst KNOWN_PARAM_ALIASES: Record<string, string> = {\n cmd: \"unknown parameter 'cmd'. Use 'command' instead.\",\n shell_command: \"unknown parameter 'shell_command'. Use 'command' instead.\",\n script: \"unknown parameter 'script'. Use 'command' instead.\",\n run: \"unknown parameter 'run'. Use 'command' instead.\",\n\n directory: \"unknown parameter 'directory'. Use 'cwd' instead.\",\n dir: \"unknown parameter 'dir'. Use 'cwd' instead.\",\n path: \"unknown parameter 'path'. Use 'cwd' instead.\",\n working_directory:\n \"unknown parameter 'working_directory'. Use 'cwd' instead.\",\n\n timeout:\n \"unknown parameter 'timeout'. Use 'timeout_ms' instead (milliseconds, not seconds). For 30s pass timeout_ms: 30000.\",\n time_limit:\n \"unknown parameter 'time_limit'. Use 'timeout_ms' instead (milliseconds).\",\n timeout_seconds:\n \"unknown parameter 'timeout_seconds'. Use 'timeout_ms' instead (multiply by 1000).\",\n\n env_vars: \"unknown parameter 'env_vars'. Use 'env' instead.\",\n environment: \"unknown parameter 'environment'. Use 'env' instead.\",\n\n lang: \"unknown parameter 'lang'. Bash runs shell commands; invoke other languages via the command itself (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n language:\n \"unknown parameter 'language'. Invoke other languages via the command (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n interpreter:\n \"unknown parameter 'interpreter'. Invoke the interpreter inside the command itself (e.g. 'python -c \\\"...\\\"').\",\n runtime:\n \"unknown parameter 'runtime'. Invoke the runtime inside the command itself (e.g. 'node -e \\\"...\\\"').\",\n\n stdin:\n \"unknown parameter 'stdin'. Interactive stdin is not supported in v1. Pipe data into the command instead (e.g. 'echo \\\"y\\\" | npm init').\",\n input:\n \"unknown parameter 'input'. Interactive input is not supported in v1. Make the command non-interactive with flags like --yes.\",\n\n sandbox:\n \"unknown parameter 'sandbox'. Sandboxing is configured on the session, not per-call.\",\n sandbox_mode:\n \"unknown parameter 'sandbox_mode'. Sandboxing is configured on the session, not per-call.\",\n permissions:\n \"unknown parameter 'permissions'. The permission hook is configured on the session.\",\n network:\n \"unknown parameter 'network'. Network access is configured on the session / executor adapter.\",\n network_access:\n \"unknown parameter 'network_access'. Network access is configured on the session / executor adapter.\",\n\n shell: \"unknown parameter 'shell'. Shell binary is configured on the session.\",\n shell_binary:\n \"unknown parameter 'shell_binary'. Shell binary is configured on the session.\",\n};\n\nfunction checkAliases(input: unknown): string[] {\n if (input === null || typeof input !== \"object\") return [];\n const hints: string[] = [];\n for (const key of Object.keys(input as Record<string, unknown>)) {\n const hint = KNOWN_PARAM_ALIASES[key];\n if (hint) hints.push(hint);\n }\n return hints;\n}\n\nfunction makeAliasIssues(messages: string[]): v.BaseIssue<unknown>[] {\n return messages.map(\n (m) =>\n ({\n kind: \"validation\",\n type: \"custom\",\n input: undefined,\n expected: null,\n received: \"unknown\",\n message: m,\n }) as unknown as v.BaseIssue<unknown>,\n );\n}\n\nexport function safeParseBashParams(input: unknown):\n | { ok: true; value: BashParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const aliases = checkAliases(input);\n if (aliases.length > 0) {\n return { ok: false, issues: makeAliasIssues(aliases) };\n }\n const result = v.safeParse(BashParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashOutputParams(input: unknown):\n | { ok: true; value: BashOutputParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashOutputParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashKillParams(input: unknown):\n | { ok: true; value: BashKillParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashKillParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\n// Tool definitions exposed to the LLM.\n\nexport const BASH_TOOL_NAME = \"bash\";\n\nexport const BASH_TOOL_DESCRIPTION = `Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls — set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) and network requests (curl/wget) that may stall MUST use background: true, OR pass an explicit client-side timeout (e.g. curl --max-time N). The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.`;\n\nexport const bashToolDefinition: ToolDefinition = {\n name: BASH_TOOL_NAME,\n description: BASH_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to run (single string, interpreted by bash -c).\",\n },\n cwd: {\n type: \"string\",\n description:\n \"Absolute working directory. Defaults to the session cwd plus any carried-over cd. Must be inside the workspace.\",\n },\n timeout_ms: {\n type: \"integer\",\n minimum: 100,\n description:\n \"Inactivity timeout in milliseconds. Any output resets the clock. Default 60000 (60 s). Wall-clock backstop is 5 minutes regardless.\",\n },\n description: {\n type: \"string\",\n description: \"One-line human-readable 'why' (optional, for traces).\",\n },\n background: {\n type: \"boolean\",\n description:\n \"Run as a background job. Returns a job_id; poll output with bash_output. Use for servers, watchers, long-running builds.\",\n },\n env: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description:\n \"Environment variables merged on top of the session env. Keys with sensitive prefixes (AWS_*, GITHUB_TOKEN, etc.) are rejected.\",\n },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_OUTPUT_TOOL_NAME = \"bash_output\";\n\nexport const BASH_OUTPUT_TOOL_DESCRIPTION = `Poll a backgrounded bash job's output since a given byte offset.\n\nReturns stdout and stderr slices plus whether the job is still running and its exit code if finished. Use 'since_byte' from the previous call to paginate through a long-running job's output without re-fetching already-seen bytes.`;\n\nexport const bashOutputToolDefinition: ToolDefinition = {\n name: BASH_OUTPUT_TOOL_NAME,\n description: BASH_OUTPUT_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description:\n \"The job_id returned by a previous bash call with background: true.\",\n },\n since_byte: {\n type: \"integer\",\n minimum: 0,\n description:\n \"Start of the requested slice per stream, in bytes. Defaults to 0. Use next_since_byte from a previous output call to resume.\",\n },\n head_limit: {\n type: \"integer\",\n minimum: 1,\n description: \"Max bytes per stream (default 30720 / 30 KB).\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_KILL_TOOL_NAME = \"bash_kill\";\n\nexport const BASH_KILL_TOOL_DESCRIPTION = `Send a termination signal to a backgrounded bash job.\n\nDefaults to SIGTERM (graceful). Use SIGKILL for an unresponsive job. The job's next bash_output call will report running: false.`;\n\nexport const bashKillToolDefinition: ToolDefinition = {\n name: BASH_KILL_TOOL_NAME,\n description: BASH_KILL_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description: \"The job_id returned by a previous bash call with background: true.\",\n },\n signal: {\n type: \"string\",\n enum: [\"SIGTERM\", \"SIGKILL\"],\n description: \"Signal to send. Default SIGTERM.\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n","import path from \"node:path\";\nimport { toolError, type ToolError } from \"@agent-sh/harness-core\";\nimport {\n BACKGROUND_MAX_JOBS,\n DEFAULT_INACTIVITY_TIMEOUT_MS,\n DEFAULT_WALLCLOCK_BACKSTOP_MS,\n MAX_OUTPUT_BYTES_FILE,\n MAX_OUTPUT_BYTES_INLINE,\n SENSITIVE_ENV_PREFIXES,\n} from \"./constants.js\";\nimport { createLocalBashExecutor } from \"./executor.js\";\nimport { askPermission, fenceBash, resolveCwd, resolveOps } from \"./fence.js\";\nimport {\n HeadTailBuffer,\n defaultSpillDir,\n formatBackgroundStartedText,\n formatBashKillText,\n formatBashOutputText,\n formatResultText,\n formatTimeoutText,\n} from \"./format.js\";\nimport {\n safeParseBashKillParams,\n safeParseBashOutputParams,\n safeParseBashParams,\n} from \"./schema.js\";\nimport type {\n BashExecutor,\n BashKillResult,\n BashOutputResult,\n BashResult,\n BashSessionConfig,\n} from \"./types.js\";\n\n// Session-scoped tracking of background jobs. The executor owns the\n// runtime state (streams, pids); we keep a counter here to enforce the\n// per-session cap.\nconst jobCountBySession = new WeakMap<BashSessionConfig, number>();\n\nfunction incJobCount(session: BashSessionConfig): void {\n jobCountBySession.set(session, (jobCountBySession.get(session) ?? 0) + 1);\n}\n\nfunction jobCount(session: BashSessionConfig): number {\n return jobCountBySession.get(session) ?? 0;\n}\n\nfunction err(error: ToolError): { kind: \"error\"; error: ToolError } {\n return { kind: \"error\", error };\n}\n\nfunction resolveExecutor(session: BashSessionConfig): BashExecutor {\n if (session.executor) return session.executor;\n // Default local executor only works if the session explicitly opted into\n // the fail-closed bypass. Otherwise core refuses.\n if (session.permissions.unsafeAllowBashWithoutHook !== true) {\n // The caller will hit fail-closed in askPermission — but we still need\n // an executor object to let things reach that gate cleanly.\n }\n return createLocalBashExecutor();\n}\n\n/**\n * Top-level `cd` detector for session cwd-carry.\n *\n * Matches a single top-level `cd` invocation only — NOT inside pipelines\n * (`cd x | true`), command lists (`cd x && y`), subshells (`(cd x)`),\n * or with trailing arguments. This deliberately covers 95% of model\n * intent without hand-parsing the full bash grammar.\n *\n * Returns the path argument if detected, else null.\n */\nexport function detectTopLevelCd(command: string): string | null {\n // Strip leading whitespace. Reject if any shell metacharacter appears.\n const trimmed = command.trim();\n if (trimmed.length === 0) return null;\n // Grammar: ^cd\\s+<path>$ where <path> has no whitespace, no &, |, ;, `, $, (, ).\n const match = trimmed.match(/^cd\\s+([^\\s&|;`$()]+)$/);\n if (!match) return null;\n const arg = match[1];\n if (arg === undefined) return null;\n // Strip matching single or double quotes if present.\n if (\n (arg.startsWith('\"') && arg.endsWith('\"')) ||\n (arg.startsWith(\"'\") && arg.endsWith(\"'\"))\n ) {\n return arg.slice(1, -1);\n }\n return arg;\n}\n\nfunction checkEnv(env: Readonly<Record<string, string>>): string | null {\n for (const key of Object.keys(env)) {\n for (const prefix of SENSITIVE_ENV_PREFIXES) {\n if (\n key === prefix ||\n (prefix.endsWith(\"_\") && key.startsWith(prefix))\n ) {\n return `env may not set sensitive-prefix variable '${key}' (prefix '${prefix}').`;\n }\n }\n }\n return null;\n}\n\nfunction byteLength(s: string): number {\n return Buffer.byteLength(s, \"utf8\");\n}\n\nexport async function bash(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashResult> {\n const parsed = safeParseBashParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages, { cause: parsed.issues }));\n }\n const params = parsed.value;\n\n if (\n params.background === true &&\n params.timeout_ms !== undefined\n ) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"timeout_ms does not apply to background jobs; they have their own lifecycle (bash_kill). Drop timeout_ms or set background: false.\",\n ),\n );\n }\n\n const envParam = params.env ?? {};\n const envError = checkEnv(envParam);\n if (envError) {\n return err(toolError(\"INVALID_PARAM\", envError));\n }\n\n const ops = resolveOps(session);\n const resolvedCwd = await resolveCwd(ops, session, params.cwd);\n\n // Workspace + sensitive-path fence.\n const fenceError = await fenceBash(session, resolvedCwd);\n if (fenceError) return err(fenceError);\n\n // cwd must actually exist and be a directory.\n const stat = await ops.stat(resolvedCwd).catch(() => undefined);\n if (!stat) {\n return err(\n toolError(\"NOT_FOUND\", `cwd does not exist: ${resolvedCwd}`, {\n meta: { cwd: resolvedCwd },\n }),\n );\n }\n if (stat.type !== \"directory\") {\n return err(\n toolError(\n \"IO_ERROR\",\n `cwd is not a directory: ${resolvedCwd}`,\n { meta: { cwd: resolvedCwd } },\n ),\n );\n }\n\n // Permission hook (autonomous: allow or deny, never ask).\n const effectiveTimeout =\n params.timeout_ms ??\n session.defaultInactivityTimeoutMs ??\n DEFAULT_INACTIVITY_TIMEOUT_MS;\n const decision = await askPermission(session, {\n command: params.command,\n cwd: resolvedCwd,\n background: params.background ?? false,\n timeoutMs: effectiveTimeout,\n envKeys: Object.keys(envParam),\n });\n if (decision.decision === \"deny\") {\n const echo = params.command.length > 200\n ? params.command.slice(0, 200) + \"...\"\n : params.command;\n return err(\n toolError(\n \"PERMISSION_DENIED\",\n `${decision.reason}\\nCommand: ${echo}`,\n { meta: { command: params.command, cwd: resolvedCwd } },\n ),\n );\n }\n\n const execEnv: Record<string, string> = {\n ...(session.env ?? process.env),\n ...envParam,\n } as Record<string, string>;\n // Node's process.env has `string | undefined`; filter undefineds.\n for (const [k, v] of Object.entries(execEnv)) {\n if (v === undefined) delete execEnv[k];\n }\n\n const executor = resolveExecutor(session);\n\n if (params.background === true) {\n return runBackground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n );\n }\n\n return runForeground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n effectiveTimeout,\n );\n}\n\nasync function runBackground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n): Promise<BashResult> {\n if (!executor.spawnBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"background: true is not supported by this executor adapter.\",\n ),\n );\n }\n const maxJobs = session.maxBackgroundJobs ?? BACKGROUND_MAX_JOBS;\n if (jobCount(session) >= maxJobs) {\n return err(\n toolError(\n \"IO_ERROR\",\n `Background job limit reached (${maxJobs}). Kill an existing job first with bash_kill.`,\n ),\n );\n }\n const { jobId } = await executor.spawnBackground({ command, cwd, env });\n incJobCount(session);\n return {\n kind: \"background_started\",\n output: formatBackgroundStartedText({ command, jobId }),\n jobId,\n };\n}\n\nasync function runForeground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n inactivityTimeoutMs: number,\n): Promise<BashResult> {\n const wallclockMs =\n session.wallclockBackstopMs ?? DEFAULT_WALLCLOCK_BACKSTOP_MS;\n const maxInline = session.maxOutputBytesInline ?? MAX_OUTPUT_BYTES_INLINE;\n const maxFile = session.maxOutputBytesFile ?? MAX_OUTPUT_BYTES_FILE;\n const spillDir = defaultSpillDir();\n\n const stdoutBuf = new HeadTailBuffer(maxInline, maxFile, \"out\", spillDir);\n const stderrBuf = new HeadTailBuffer(maxInline, maxFile, \"err\", spillDir);\n\n const controller = new AbortController();\n const abortOnOuter = () => controller.abort();\n if (session.signal) {\n if (session.signal.aborted) controller.abort();\n else session.signal.addEventListener(\"abort\", abortOnOuter, { once: true });\n }\n\n let timedOut: \"inactivity timeout\" | \"wall-clock backstop\" | null = null;\n let inactivityTimer: NodeJS.Timeout | null = null;\n const resetInactivity = () => {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n timedOut = \"inactivity timeout\";\n controller.abort();\n }, inactivityTimeoutMs);\n };\n resetInactivity();\n\n const wallclockTimer = setTimeout(() => {\n timedOut = \"wall-clock backstop\";\n controller.abort();\n }, wallclockMs);\n\n const start = Date.now();\n let result: Awaited<ReturnType<BashExecutor[\"run\"]>>;\n try {\n result = await executor.run({\n command,\n cwd,\n env,\n signal: controller.signal,\n onStdout: (chunk) => {\n stdoutBuf.write(chunk);\n resetInactivity();\n },\n onStderr: (chunk) => {\n stderrBuf.write(chunk);\n resetInactivity();\n },\n });\n } finally {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n clearTimeout(wallclockTimer);\n if (session.signal) {\n session.signal.removeEventListener(\"abort\", abortOnOuter);\n }\n }\n\n const durationMs = Date.now() - start;\n const stdoutRender = stdoutBuf.render();\n const stderrRender = stderrBuf.render();\n\n if (timedOut !== null) {\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n return {\n kind: \"timeout\",\n output: formatTimeoutText({\n command,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n partialBytes: stdoutBuf.bytesTotal() + stderrBuf.bytesTotal(),\n logPath,\n }),\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n ...(logPath ? { logPath } : {}),\n };\n }\n\n const exitCode = result.exitCode ?? -1;\n const kind: \"ok\" | \"nonzero_exit\" = exitCode === 0 ? \"ok\" : \"nonzero_exit\";\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n const byteCap = stdoutRender.byteCap || stderrRender.byteCap;\n\n return {\n kind,\n output: formatResultText({\n command,\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n byteCap,\n logPath,\n kind,\n }),\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n ...(logPath ? { logPath } : {}),\n byteCap,\n };\n}\n\nexport async function bashOutput(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashOutputResult> {\n const parsed = safeParseBashOutputParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.readBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_output is not supported by this executor adapter.\",\n ),\n );\n }\n try {\n const read = await executor.readBackground(parsed.value.job_id, {\n ...(parsed.value.since_byte !== undefined\n ? { since_byte: parsed.value.since_byte }\n : {}),\n ...(parsed.value.head_limit !== undefined\n ? { head_limit: parsed.value.head_limit }\n : {}),\n });\n const sinceByte = parsed.value.since_byte ?? 0;\n const returnedBytes =\n byteLength(read.stdout) + byteLength(read.stderr);\n const totalBytes = read.totalBytesStdout + read.totalBytesStderr;\n return {\n kind: \"output\",\n output: formatBashOutputText({\n jobId: parsed.value.job_id,\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n sinceByte,\n returnedBytes,\n totalBytes,\n }),\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n totalBytesStdout: read.totalBytesStdout,\n totalBytesStderr: read.totalBytesStderr,\n nextSinceByte: sinceByte + returnedBytes,\n };\n } catch (e) {\n return err(\n toolError(\n \"NOT_FOUND\",\n (e as Error).message || `Unknown job_id: ${parsed.value.job_id}`,\n ),\n );\n }\n}\n\nexport async function bashKill(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashKillResult> {\n const parsed = safeParseBashKillParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.killBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_kill is not supported by this executor adapter.\",\n ),\n );\n }\n const signal = parsed.value.signal ?? \"SIGTERM\";\n await executor.killBackground(parsed.value.job_id, signal);\n return {\n kind: \"killed\",\n output: formatBashKillText({ jobId: parsed.value.job_id, signal }),\n jobId: parsed.value.job_id,\n signal,\n };\n}\n\n/**\n * Apply cwd-carry: if the command is a top-level `cd <path>` and the\n * destination resolves inside the workspace, mutate session.logicalCwd.\n * Called AFTER the command executes with exit 0 (caller's responsibility).\n *\n * Exposed separately so tests can exercise the logic directly AND so a\n * harness wrapper can call it at the right point in the lifecycle. In\n * core, the orchestrator does NOT auto-call this — we keep cwd-carry\n * out of the hot path for correctness; the caller opts in by invoking\n * applyCwdCarry after a successful bash() result.\n *\n * Rationale: cwd-carry mutates session state which has observable\n * implications for concurrent calls. Making it explicit is safer.\n */\nexport function applyCwdCarry(\n session: BashSessionConfig,\n command: string,\n exitCode: number | null,\n): { changed: boolean; newCwd: string | null; escaped: boolean } {\n if (exitCode !== 0) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const target = detectTopLevelCd(command);\n if (target === null) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const base = session.logicalCwd?.value ?? session.cwd;\n const resolved = path.isAbsolute(target)\n ? path.resolve(target)\n : path.resolve(base, target);\n\n // Escape check.\n const inside = session.permissions.roots.some(\n (r) => resolved === r || resolved.startsWith(r + path.sep),\n );\n if (!inside && session.permissions.bypassWorkspaceGuard !== true) {\n return { changed: false, newCwd: resolved, escaped: true };\n }\n\n if (session.logicalCwd) {\n session.logicalCwd.value = resolved;\n }\n return { changed: true, newCwd: resolved, escaped: false };\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -3,20 +3,20 @@ import * as v from 'valibot';
|
|
|
3
3
|
|
|
4
4
|
interface BashParams {
|
|
5
5
|
readonly command: string;
|
|
6
|
-
readonly cwd?: string;
|
|
7
|
-
readonly timeout_ms?: number;
|
|
8
|
-
readonly description?: string;
|
|
9
|
-
readonly background?: boolean;
|
|
10
|
-
readonly env?: Readonly<Record<string, string
|
|
6
|
+
readonly cwd?: string | undefined;
|
|
7
|
+
readonly timeout_ms?: number | undefined;
|
|
8
|
+
readonly description?: string | undefined;
|
|
9
|
+
readonly background?: boolean | undefined;
|
|
10
|
+
readonly env?: Readonly<Record<string, string>> | undefined;
|
|
11
11
|
}
|
|
12
12
|
interface BashOutputParams {
|
|
13
13
|
readonly job_id: string;
|
|
14
|
-
readonly since_byte?: number;
|
|
15
|
-
readonly head_limit?: number;
|
|
14
|
+
readonly since_byte?: number | undefined;
|
|
15
|
+
readonly head_limit?: number | undefined;
|
|
16
16
|
}
|
|
17
17
|
interface BashKillParams {
|
|
18
18
|
readonly job_id: string;
|
|
19
|
-
readonly signal?: "SIGTERM" | "SIGKILL";
|
|
19
|
+
readonly signal?: "SIGTERM" | "SIGKILL" | undefined;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
22
|
* Executor interface — the pluggable boundary between core (which ships a
|
|
@@ -182,21 +182,21 @@ declare function applyCwdCarry(session: BashSessionConfig, command: string, exit
|
|
|
182
182
|
};
|
|
183
183
|
|
|
184
184
|
declare const BashParamsSchema: v.StrictObjectSchema<{
|
|
185
|
-
readonly command: v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "command is required">, v.MaxLengthAction<string, 16384, "command exceeds 16384 bytes">]>;
|
|
186
|
-
readonly cwd: v.OptionalSchema<v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "cwd must not be empty">]>,
|
|
187
|
-
readonly timeout_ms: v.OptionalSchema<v.SchemaWithPipe<[v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 100, "timeout_ms must be >= 100 ms">]>,
|
|
188
|
-
readonly description: v.OptionalSchema<v.StringSchema<undefined>,
|
|
189
|
-
readonly background: v.OptionalSchema<v.BooleanSchema<undefined>,
|
|
190
|
-
readonly env: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>,
|
|
185
|
+
readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "command is required">, v.MaxLengthAction<string, 16384, "command exceeds 16384 bytes">]>;
|
|
186
|
+
readonly cwd: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "cwd must not be empty">]>, undefined>;
|
|
187
|
+
readonly timeout_ms: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 100, "timeout_ms must be >= 100 ms">]>, undefined>;
|
|
188
|
+
readonly description: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
189
|
+
readonly background: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
190
|
+
readonly env: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
|
|
191
191
|
}, undefined>;
|
|
192
192
|
declare const BashOutputParamsSchema: v.StrictObjectSchema<{
|
|
193
|
-
readonly job_id: v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
194
|
-
readonly since_byte: v.OptionalSchema<v.SchemaWithPipe<[v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, "since_byte must be >= 0">]>,
|
|
195
|
-
readonly head_limit: v.OptionalSchema<v.SchemaWithPipe<[v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, "head_limit must be >= 1">]>,
|
|
193
|
+
readonly job_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
194
|
+
readonly since_byte: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, "since_byte must be >= 0">]>, undefined>;
|
|
195
|
+
readonly head_limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, "head_limit must be >= 1">]>, undefined>;
|
|
196
196
|
}, undefined>;
|
|
197
197
|
declare const BashKillParamsSchema: v.StrictObjectSchema<{
|
|
198
|
-
readonly job_id: v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
199
|
-
readonly signal: v.OptionalSchema<v.PicklistSchema<["SIGTERM", "SIGKILL"], undefined>,
|
|
198
|
+
readonly job_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
199
|
+
readonly signal: v.OptionalSchema<v.PicklistSchema<["SIGTERM", "SIGKILL"], undefined>, undefined>;
|
|
200
200
|
}, undefined>;
|
|
201
201
|
declare function safeParseBashParams(input: unknown): {
|
|
202
202
|
ok: true;
|
|
@@ -220,7 +220,7 @@ declare function safeParseBashKillParams(input: unknown): {
|
|
|
220
220
|
issues: v.BaseIssue<unknown>[];
|
|
221
221
|
};
|
|
222
222
|
declare const BASH_TOOL_NAME = "bash";
|
|
223
|
-
declare const BASH_TOOL_DESCRIPTION = "Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls \u2014 set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) MUST use background: true. The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.";
|
|
223
|
+
declare const BASH_TOOL_DESCRIPTION = "Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls \u2014 set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) and network requests (curl/wget) that may stall MUST use background: true, OR pass an explicit client-side timeout (e.g. curl --max-time N). The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.";
|
|
224
224
|
declare const bashToolDefinition: ToolDefinition;
|
|
225
225
|
declare const BASH_OUTPUT_TOOL_NAME = "bash_output";
|
|
226
226
|
declare const BASH_OUTPUT_TOOL_DESCRIPTION = "Poll a backgrounded bash job's output since a given byte offset.\n\nReturns stdout and stderr slices plus whether the job is still running and its exit code if finished. Use 'since_byte' from the previous call to paginate through a long-running job's output without re-fetching already-seen bytes.";
|
package/dist/index.d.ts
CHANGED
|
@@ -3,20 +3,20 @@ import * as v from 'valibot';
|
|
|
3
3
|
|
|
4
4
|
interface BashParams {
|
|
5
5
|
readonly command: string;
|
|
6
|
-
readonly cwd?: string;
|
|
7
|
-
readonly timeout_ms?: number;
|
|
8
|
-
readonly description?: string;
|
|
9
|
-
readonly background?: boolean;
|
|
10
|
-
readonly env?: Readonly<Record<string, string
|
|
6
|
+
readonly cwd?: string | undefined;
|
|
7
|
+
readonly timeout_ms?: number | undefined;
|
|
8
|
+
readonly description?: string | undefined;
|
|
9
|
+
readonly background?: boolean | undefined;
|
|
10
|
+
readonly env?: Readonly<Record<string, string>> | undefined;
|
|
11
11
|
}
|
|
12
12
|
interface BashOutputParams {
|
|
13
13
|
readonly job_id: string;
|
|
14
|
-
readonly since_byte?: number;
|
|
15
|
-
readonly head_limit?: number;
|
|
14
|
+
readonly since_byte?: number | undefined;
|
|
15
|
+
readonly head_limit?: number | undefined;
|
|
16
16
|
}
|
|
17
17
|
interface BashKillParams {
|
|
18
18
|
readonly job_id: string;
|
|
19
|
-
readonly signal?: "SIGTERM" | "SIGKILL";
|
|
19
|
+
readonly signal?: "SIGTERM" | "SIGKILL" | undefined;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
22
|
* Executor interface — the pluggable boundary between core (which ships a
|
|
@@ -182,21 +182,21 @@ declare function applyCwdCarry(session: BashSessionConfig, command: string, exit
|
|
|
182
182
|
};
|
|
183
183
|
|
|
184
184
|
declare const BashParamsSchema: v.StrictObjectSchema<{
|
|
185
|
-
readonly command: v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "command is required">, v.MaxLengthAction<string, 16384, "command exceeds 16384 bytes">]>;
|
|
186
|
-
readonly cwd: v.OptionalSchema<v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "cwd must not be empty">]>,
|
|
187
|
-
readonly timeout_ms: v.OptionalSchema<v.SchemaWithPipe<[v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 100, "timeout_ms must be >= 100 ms">]>,
|
|
188
|
-
readonly description: v.OptionalSchema<v.StringSchema<undefined>,
|
|
189
|
-
readonly background: v.OptionalSchema<v.BooleanSchema<undefined>,
|
|
190
|
-
readonly env: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>,
|
|
185
|
+
readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "command is required">, v.MaxLengthAction<string, 16384, "command exceeds 16384 bytes">]>;
|
|
186
|
+
readonly cwd: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "cwd must not be empty">]>, undefined>;
|
|
187
|
+
readonly timeout_ms: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 100, "timeout_ms must be >= 100 ms">]>, undefined>;
|
|
188
|
+
readonly description: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
189
|
+
readonly background: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
190
|
+
readonly env: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
|
|
191
191
|
}, undefined>;
|
|
192
192
|
declare const BashOutputParamsSchema: v.StrictObjectSchema<{
|
|
193
|
-
readonly job_id: v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
194
|
-
readonly since_byte: v.OptionalSchema<v.SchemaWithPipe<[v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, "since_byte must be >= 0">]>,
|
|
195
|
-
readonly head_limit: v.OptionalSchema<v.SchemaWithPipe<[v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, "head_limit must be >= 1">]>,
|
|
193
|
+
readonly job_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
194
|
+
readonly since_byte: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, "since_byte must be >= 0">]>, undefined>;
|
|
195
|
+
readonly head_limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, "head_limit must be >= 1">]>, undefined>;
|
|
196
196
|
}, undefined>;
|
|
197
197
|
declare const BashKillParamsSchema: v.StrictObjectSchema<{
|
|
198
|
-
readonly job_id: v.SchemaWithPipe<[v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
199
|
-
readonly signal: v.OptionalSchema<v.PicklistSchema<["SIGTERM", "SIGKILL"], undefined>,
|
|
198
|
+
readonly job_id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "job_id is required">]>;
|
|
199
|
+
readonly signal: v.OptionalSchema<v.PicklistSchema<["SIGTERM", "SIGKILL"], undefined>, undefined>;
|
|
200
200
|
}, undefined>;
|
|
201
201
|
declare function safeParseBashParams(input: unknown): {
|
|
202
202
|
ok: true;
|
|
@@ -220,7 +220,7 @@ declare function safeParseBashKillParams(input: unknown): {
|
|
|
220
220
|
issues: v.BaseIssue<unknown>[];
|
|
221
221
|
};
|
|
222
222
|
declare const BASH_TOOL_NAME = "bash";
|
|
223
|
-
declare const BASH_TOOL_DESCRIPTION = "Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls \u2014 set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) MUST use background: true. The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.";
|
|
223
|
+
declare const BASH_TOOL_DESCRIPTION = "Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls \u2014 set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) and network requests (curl/wget) that may stall MUST use background: true, OR pass an explicit client-side timeout (e.g. curl --max-time N). The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.";
|
|
224
224
|
declare const bashToolDefinition: ToolDefinition;
|
|
225
225
|
declare const BASH_OUTPUT_TOOL_NAME = "bash_output";
|
|
226
226
|
declare const BASH_OUTPUT_TOOL_DESCRIPTION = "Poll a backgrounded bash job's output since a given byte offset.\n\nReturns stdout and stderr slices plus whether the job is still running and its exit code if finished. Use 'since_byte' from the previous call to paginate through a long-running job's output without re-fetching already-seen bytes.";
|
package/dist/index.js
CHANGED
|
@@ -502,7 +502,7 @@ var BASH_TOOL_DESCRIPTION = `Run a single shell command in a bash subprocess. Ou
|
|
|
502
502
|
Usage:
|
|
503
503
|
- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls \u2014 set them inline (FOO=bar some-cmd) or via 'env'.
|
|
504
504
|
- For non-shell code, use language one-liners: 'python -c "print(2+2)"', 'node -e "console.log(2+2)"', 'deno eval "console.log(2+2)"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.
|
|
505
|
-
- Long-running processes (servers, watchers) MUST use background: true. The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.
|
|
505
|
+
- Long-running processes (servers, watchers) and network requests (curl/wget) that may stall MUST use background: true, OR pass an explicit client-side timeout (e.g. curl --max-time N). The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.
|
|
506
506
|
- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo "y" |' in front.
|
|
507
507
|
- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.
|
|
508
508
|
- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.`;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/executor.ts","../src/fence.ts","../src/format.ts","../src/schema.ts","../src/bash.ts"],"names":["path","runForeground","opts","randomUUID","mkdirSync","tmpdir","toolError","v","logPath"],"mappings":"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","file":"index.js","sourcesContent":["export const DEFAULT_INACTIVITY_TIMEOUT_MS = 60_000;\nexport const DEFAULT_WALLCLOCK_BACKSTOP_MS = 300_000;\nexport const MAX_COMMAND_LENGTH = 16_384;\nexport const MAX_OUTPUT_BYTES_INLINE = 30_720; // 30 KB per stream\nexport const MAX_OUTPUT_BYTES_FILE = 10 * 1024 * 1024; // 10 MB per stream\nexport const BACKGROUND_MAX_JOBS = 16;\nexport const KILL_GRACE_MS = 5_000;\n\n/**\n * Env var name prefixes that the tool refuses to let the model set via `env`.\n * Defense in depth: even if the harness forwards its environment, the model\n * should not be able to override credentials per-call.\n */\nexport const SENSITIVE_ENV_PREFIXES: readonly string[] = [\n \"AWS_\",\n \"BEDROCK_\",\n \"GITHUB_TOKEN\",\n \"GH_TOKEN\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"GEMINI_API_KEY\",\n \"NPM_TOKEN\",\n \"DOCKERHUB_TOKEN\",\n \"SLACK_\",\n \"STRIPE_\",\n];\n","import { spawn } from \"node:child_process\";\nimport { mkdirSync, createWriteStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { KILL_GRACE_MS } from \"./constants.js\";\nimport type {\n BackgroundReadResult,\n BashExecutor,\n BashRunInput,\n BashRunResult,\n} from \"./types.js\";\n\n/**\n * Default local-subprocess executor.\n *\n * Launches the bash binary with `-c <command>` via the argv form of\n * node:child_process.spawn — NEVER the string-based shell-eval entry\n * point. The command string is passed as a single argument to the bash\n * binary, not interpolated into our own spawn args. All shell parsing\n * happens inside the child bash process.\n *\n * This executor ships unsandboxed; sandboxing is the job of adapter\n * packages that implement the same BashExecutor interface. See\n * packages/bash/src/types.ts.\n */\nexport function createLocalBashExecutor(opts?: {\n bashPath?: string;\n logDir?: string;\n}): BashExecutor {\n const bashPath = opts?.bashPath ?? \"/bin/bash\";\n const logDir = opts?.logDir ?? path.join(tmpdir(), \"agent-sh-bash-logs\");\n mkdirSync(logDir, { recursive: true });\n\n interface Job {\n readonly id: string;\n readonly outPath: string;\n readonly errPath: string;\n running: boolean;\n exitCode: number | null;\n killed: boolean;\n proc: ReturnType<typeof spawn> | null;\n }\n\n const jobs = new Map<string, Job>();\n\n async function runForeground(input: BashRunInput): Promise<BashRunResult> {\n const child = spawn(bashPath, [\"-c\", input.command], {\n cwd: input.cwd,\n env: { ...input.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => input.onStdout(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => input.onStderr(chunk));\n\n let killedBySignal = false;\n const onAbort = () => {\n killedBySignal = true;\n try {\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child.exitCode === null) child.kill(\"SIGKILL\");\n }, KILL_GRACE_MS).unref();\n } catch {\n // best effort\n }\n };\n if (input.signal.aborted) {\n onAbort();\n } else {\n input.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return new Promise((resolve) => {\n child.on(\"close\", (code, signal) => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({\n exitCode: code,\n killed: killedBySignal,\n signal: signal ?? null,\n });\n });\n child.on(\"error\", () => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({ exitCode: null, killed: killedBySignal, signal: null });\n });\n });\n }\n\n async function spawnBackground(args: {\n command: string;\n cwd: string;\n env: Readonly<Record<string, string>>;\n }): Promise<{ jobId: string }> {\n const jobId = randomUUID();\n const outPath = path.join(logDir, `${jobId}.out`);\n const errPath = path.join(logDir, `${jobId}.err`);\n const outStream = createWriteStream(outPath, { flags: \"w\" });\n const errStream = createWriteStream(errPath, { flags: \"w\" });\n\n const child = spawn(bashPath, [\"-c\", args.command], {\n cwd: args.cwd,\n env: { ...args.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: false,\n });\n\n child.stdout.pipe(outStream);\n child.stderr.pipe(errStream);\n\n const job: Job = {\n id: jobId,\n outPath,\n errPath,\n running: true,\n exitCode: null,\n killed: false,\n proc: child,\n };\n jobs.set(jobId, job);\n\n child.on(\"close\", (code) => {\n job.running = false;\n job.exitCode = code;\n job.proc = null;\n });\n child.on(\"error\", () => {\n job.running = false;\n job.proc = null;\n });\n\n return { jobId };\n }\n\n async function readBackground(\n jobId: string,\n opts: { since_byte?: number; head_limit?: number },\n ): Promise<BackgroundReadResult> {\n const job = jobs.get(jobId);\n if (!job) {\n throw new Error(`Unknown job_id: ${jobId}`);\n }\n const since = opts.since_byte ?? 0;\n const limit = opts.head_limit ?? 30_720;\n const stdout = readSlice(job.outPath, since, limit);\n const stderr = readSlice(job.errPath, since, limit);\n return {\n stdout: stdout.text,\n stderr: stderr.text,\n running: job.running,\n exitCode: job.exitCode,\n totalBytesStdout: stdout.totalBytes,\n totalBytesStderr: stderr.totalBytes,\n };\n }\n\n async function killBackground(\n jobId: string,\n signal: \"SIGTERM\" | \"SIGKILL\" = \"SIGTERM\",\n ): Promise<void> {\n const job = jobs.get(jobId);\n if (!job || !job.proc) return;\n job.killed = true;\n try {\n job.proc.kill(signal);\n if (signal === \"SIGTERM\") {\n setTimeout(() => {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGKILL\");\n } catch {\n // ignore\n }\n }\n }, KILL_GRACE_MS).unref();\n }\n } catch {\n // ignore\n }\n }\n\n async function closeSession(): Promise<void> {\n for (const job of jobs.values()) {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGTERM\");\n } catch {\n // ignore\n }\n }\n }\n }\n\n return {\n run: runForeground,\n spawnBackground,\n readBackground,\n killBackground,\n closeSession,\n };\n}\n\nfunction readSlice(\n filePath: string,\n since: number,\n limit: number,\n): { text: string; totalBytes: number } {\n if (!existsSync(filePath)) return { text: \"\", totalBytes: 0 };\n const totalBytes = statSync(filePath).size;\n if (since >= totalBytes) return { text: \"\", totalBytes };\n const end = Math.min(since + limit, totalBytes);\n const buf = readFileSync(filePath).subarray(since, end);\n return { text: buf.toString(\"utf8\"), totalBytes };\n}\n","import path from \"node:path\";\nimport {\n defaultNodeOperations,\n isInsideAnyRoot,\n matchesAnyPattern,\n toolError,\n type ReadOperations,\n type ToolError,\n} from \"@agent-sh/harness-core\";\nimport type { BashSessionConfig } from \"./types.js\";\n\nexport async function resolveCwd(\n ops: ReadOperations,\n session: BashSessionConfig,\n requested: string | undefined,\n): Promise<string> {\n const base = requested ?? session.logicalCwd?.value ?? session.cwd;\n const absolute = path.isAbsolute(base) ? base : path.resolve(session.cwd, base);\n try {\n return await ops.realpath(absolute);\n } catch {\n return absolute;\n }\n}\n\nexport async function fenceBash(\n session: BashSessionConfig,\n resolvedCwd: string,\n): Promise<ToolError | undefined> {\n const { permissions } = session;\n const isSensitive = matchesAnyPattern(\n resolvedCwd,\n permissions.sensitivePatterns,\n );\n const insideWorkspace = isInsideAnyRoot(resolvedCwd, permissions.roots);\n\n if (isSensitive && permissions.hook === undefined) {\n return toolError(\n \"SENSITIVE\",\n `Refusing to run bash in sensitive path: ${resolvedCwd}`,\n { meta: { path: resolvedCwd } },\n );\n }\n\n if (\n !insideWorkspace &&\n permissions.bypassWorkspaceGuard !== true &&\n permissions.hook === undefined\n ) {\n return toolError(\n \"OUTSIDE_WORKSPACE\",\n `cwd is outside all configured workspace roots: ${resolvedCwd}`,\n { meta: { path: resolvedCwd, roots: permissions.roots } },\n );\n }\n\n return undefined;\n}\n\n/**\n * Permission hook call, bash-specific metadata.\n *\n * Returns one of:\n * \"allow\" — run\n * \"allow_once\" — run (no persistent rule learned)\n * \"deny\" — refuse with PERMISSION_DENIED\n * \"ask\" — treated as \"deny\" in this autonomous tool; caller\n * gets a hint to configure the hook properly\n */\nexport async function askPermission(\n session: BashSessionConfig,\n args: {\n command: string;\n cwd: string;\n background: boolean;\n timeoutMs: number;\n envKeys: readonly string[];\n },\n): Promise<\n | { decision: \"allow\" | \"allow_once\" }\n | { decision: \"deny\"; reason: string }\n> {\n const { permissions } = session;\n // Extract the first whitespace token as the \"command head\" for pattern\n // hints (`git`, `npm`, `python`, ...). Matches Claude Code convention.\n const commandHead = args.command.trimStart().split(/\\s+/)[0] ?? \"\";\n const alwaysPatterns = commandHead\n ? [`Bash(${commandHead}:*)`]\n : [\"Bash(*)\"];\n\n if (permissions.hook === undefined) {\n if (permissions.unsafeAllowBashWithoutHook === true) {\n return { decision: \"allow\" };\n }\n return {\n decision: \"deny\",\n reason:\n \"bash tool has no permission hook configured; refusing to run untrusted commands. Wire a hook or set session.permissions.unsafeAllowBashWithoutHook for test fixtures.\",\n };\n }\n\n const decision = await permissions.hook({\n tool: \"bash\",\n path: args.cwd,\n action: \"read\",\n always_patterns: alwaysPatterns,\n metadata: {\n command: args.command,\n cwd: args.cwd,\n background: args.background,\n timeout_ms: args.timeoutMs,\n env_keys: args.envKeys,\n network_required: null,\n },\n });\n if (decision === \"deny\") {\n return {\n decision: \"deny\",\n reason: `Command blocked by permission policy. Pattern hint: ${alwaysPatterns.join(\", \")}`,\n };\n }\n if (decision === \"allow\" || decision === \"allow_once\") {\n return { decision };\n }\n // \"ask\" in autonomous mode → deny with hint.\n return {\n decision: \"deny\",\n reason:\n \"Permission hook returned 'ask' but bash runs in autonomous mode. Configure the hook to return allow or deny.\",\n };\n}\n\nexport function resolveOps(session: BashSessionConfig): ReadOperations {\n return session.ops ?? defaultNodeOperations();\n}\n\n// Add a minimal ops accessor if session extends with it. Bash uses the\n// shared default for realpath/stat only.\ndeclare module \"./types.js\" {\n interface BashSessionConfig {\n readonly ops?: ReadOperations;\n }\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Per-stream output buffer with head+tail capping and spill-to-file on\n * overflow. Models rarely need the middle of a long output — they need\n * either the setup line or the error tail. This buffer preserves both.\n */\nexport class HeadTailBuffer {\n private readonly chunks: Uint8Array[] = [];\n private totalBytes = 0;\n private byteCap = false;\n private spilled = false;\n private spillPath: string | null = null;\n private spillBytes: number[] = [];\n\n constructor(\n private readonly maxInline: number,\n private readonly maxFile: number,\n private readonly kind: \"out\" | \"err\",\n private readonly spillDir: string,\n ) {}\n\n write(chunk: Uint8Array): void {\n this.totalBytes += chunk.byteLength;\n if (this.totalBytes <= this.maxInline) {\n this.chunks.push(chunk);\n return;\n }\n // Overflow: spill everything past the cap to disk + remember tail.\n if (!this.spilled) {\n this.spilled = true;\n this.byteCap = true;\n this.spillPath = path.join(\n this.spillDir,\n `${randomUUID()}.${this.kind}`,\n );\n // Write whatever was buffered so far into the spill file so the\n // full log is recoverable from the file path alone.\n for (const c of this.chunks) this.appendSpill(c);\n }\n this.appendSpill(chunk);\n // Keep a tail window (roughly half of maxInline in bytes) from spilled\n // stream so the inline result has a useful tail slice.\n this.spillBytes.push(chunk.byteLength);\n }\n\n private appendSpill(chunk: Uint8Array): void {\n if (this.spillPath === null) return;\n if (!this.spillInit) {\n mkdirSync(this.spillDir, { recursive: true });\n writeFileSync(this.spillPath, \"\");\n this.spillInit = true;\n }\n if (this.fileBytesWritten + chunk.byteLength > this.maxFile) {\n // File cap hit. Ignore further writes.\n return;\n }\n // Sync append — output sizes are in KB-to-MB range, no need for\n // async stream plumbing.\n appendFileSync(this.spillPath, Buffer.from(chunk));\n this.fileBytesWritten += chunk.byteLength;\n }\n\n private spillInit = false;\n private fileBytesWritten = 0;\n\n /**\n * Return the inline render:\n * - If not capped: the full buffered text.\n * - If capped: head (first maxInline/2 bytes) + marker + tail\n * (last maxInline/2 bytes) approximation. We approximate the tail\n * by decoding only the tail window (maxInline/2 bytes from the spill\n * file) because the stream is write-once and we dropped the middle.\n *\n * The actual implementation is simpler: we keep only the head inline\n * (first maxInline bytes, never overwritten) and emit a marker that\n * points at the log path. Head-only is a deliberate simplification\n * versus spec's head+tail — it matches OpenCode's default, and we\n * rely on Read(path) to see the tail. Spec §4 head+tail is a v2\n * improvement once we prove the file-path recovery path.\n */\n render(): { text: string; byteCap: boolean; logPath: string | null } {\n if (!this.spilled) {\n const combined = Buffer.concat(this.chunks.map((c) => Buffer.from(c)));\n return {\n text: combined.toString(\"utf8\"),\n byteCap: false,\n logPath: null,\n };\n }\n // Capped: return the first maxInline bytes and a pointer to the file.\n const head = Buffer.concat(\n this.chunks.map((c) => Buffer.from(c)),\n this.maxInline,\n ).toString(\"utf8\");\n const marker = `\\n... (stream exceeded ${this.maxInline} bytes; full log at ${this.spillPath}) ...`;\n return {\n text: head + marker,\n byteCap: true,\n logPath: this.spillPath,\n };\n }\n\n bytesTotal(): number {\n return this.totalBytes;\n }\n\n wasCapped(): boolean {\n return this.byteCap;\n }\n}\n\nexport function defaultSpillDir(): string {\n return path.join(tmpdir(), \"agent-sh-bash-spill\");\n}\n\n/**\n * Format the text body of an \"ok\" / \"nonzero_exit\" result.\n * Kept deliberately simple — structured fields ride on the result\n * object; `output` is the canonical text the executor returns to the\n * model at the tool_result boundary.\n */\nexport function formatResultText(args: {\n command: string;\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n byteCap: boolean;\n logPath: string | null;\n kind: \"ok\" | \"nonzero_exit\";\n}): string {\n const header = `<command>${args.command}</command>`;\n const exitLine = `<exit_code>${args.exitCode}</exit_code>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const hint = args.byteCap\n ? `(Output capped. Full log: ${args.logPath}. Read it with pagination if you need the middle.)`\n : args.kind === \"ok\"\n ? `(Command completed in ${args.durationMs}ms. exit=0.)`\n : `(Command exited nonzero in ${args.durationMs}ms. Exit code: ${args.exitCode}.)`;\n return [header, exitLine, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatTimeoutText(args: {\n command: string;\n stdout: string;\n stderr: string;\n reason: \"inactivity timeout\" | \"wall-clock backstop\";\n durationMs: number;\n partialBytes: number;\n logPath: string | null;\n}): string {\n const header = `<command>${args.command}</command>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const logHint = args.logPath ? ` Full log: ${args.logPath}.` : \"\";\n const hint = `(Command hit ${args.reason} after ${args.durationMs}ms. ${args.partialBytes} bytes captured. Kill signal: SIGTERM then SIGKILL.${logHint} If the command is long-running, retry with background: true.)`;\n return [header, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatBackgroundStartedText(args: {\n command: string;\n jobId: string;\n}): string {\n return [\n `<command>${args.command}</command>`,\n `<job_id>${args.jobId}</job_id>`,\n `(Background job started. Poll output with bash_output(job_id). Kill with bash_kill(job_id).)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashOutputText(args: {\n jobId: string;\n running: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n sinceByte: number;\n returnedBytes: number;\n totalBytes: number;\n}): string {\n const next = args.sinceByte + args.returnedBytes;\n return [\n `<job_id>${args.jobId}</job_id>`,\n `<running>${args.running}</running>`,\n `<exit_code>${args.exitCode === null ? \"null\" : args.exitCode}</exit_code>`,\n `<stdout>\\n${args.stdout}\\n</stdout>`,\n `<stderr>\\n${args.stderr}\\n</stderr>`,\n `(Showing bytes ${args.sinceByte}-${next} of ${args.totalBytes}. Next since_byte: ${next}. Job running: ${args.running}.)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashKillText(args: {\n jobId: string;\n signal: \"SIGTERM\" | \"SIGKILL\";\n}): string {\n return `<job_id>${args.jobId}</job_id>\\n(${args.signal} sent. Poll bash_output to confirm termination.)`;\n}\n","import * as v from \"valibot\";\nimport type { ToolDefinition } from \"@agent-sh/harness-core\";\nimport { MAX_COMMAND_LENGTH } from \"./constants.js\";\nimport type { BashParams, BashOutputParams, BashKillParams } from \"./types.js\";\n\nexport const BashParamsSchema = v.strictObject({\n command: v.pipe(\n v.string(),\n v.minLength(1, \"command is required\"),\n v.maxLength(\n MAX_COMMAND_LENGTH,\n `command exceeds ${MAX_COMMAND_LENGTH} bytes`,\n ),\n ),\n cwd: v.optional(v.pipe(v.string(), v.minLength(1, \"cwd must not be empty\"))),\n timeout_ms: v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(100, \"timeout_ms must be >= 100 ms\"),\n ),\n ),\n description: v.optional(v.string()),\n background: v.optional(v.boolean()),\n env: v.optional(v.record(v.string(), v.string())),\n});\n\nexport const BashOutputParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n since_byte: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(0, \"since_byte must be >= 0\")),\n ),\n head_limit: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(1, \"head_limit must be >= 1\")),\n ),\n});\n\nexport const BashKillParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n signal: v.optional(v.picklist([\"SIGTERM\", \"SIGKILL\"])),\n});\n\nexport type ParsedBashParams = v.InferOutput<typeof BashParamsSchema>;\n\n/**\n * Alias table mirroring grep/glob's KNOWN_PARAM_ALIASES. Models routinely\n * pass alternate names; we return a targeted INVALID_PARAM redirect rather\n * than the generic strictObject \"Unknown key: X\".\n */\nconst KNOWN_PARAM_ALIASES: Record<string, string> = {\n cmd: \"unknown parameter 'cmd'. Use 'command' instead.\",\n shell_command: \"unknown parameter 'shell_command'. Use 'command' instead.\",\n script: \"unknown parameter 'script'. Use 'command' instead.\",\n run: \"unknown parameter 'run'. Use 'command' instead.\",\n\n directory: \"unknown parameter 'directory'. Use 'cwd' instead.\",\n dir: \"unknown parameter 'dir'. Use 'cwd' instead.\",\n path: \"unknown parameter 'path'. Use 'cwd' instead.\",\n working_directory:\n \"unknown parameter 'working_directory'. Use 'cwd' instead.\",\n\n timeout:\n \"unknown parameter 'timeout'. Use 'timeout_ms' instead (milliseconds, not seconds). For 30s pass timeout_ms: 30000.\",\n time_limit:\n \"unknown parameter 'time_limit'. Use 'timeout_ms' instead (milliseconds).\",\n timeout_seconds:\n \"unknown parameter 'timeout_seconds'. Use 'timeout_ms' instead (multiply by 1000).\",\n\n env_vars: \"unknown parameter 'env_vars'. Use 'env' instead.\",\n environment: \"unknown parameter 'environment'. Use 'env' instead.\",\n\n lang: \"unknown parameter 'lang'. Bash runs shell commands; invoke other languages via the command itself (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n language:\n \"unknown parameter 'language'. Invoke other languages via the command (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n interpreter:\n \"unknown parameter 'interpreter'. Invoke the interpreter inside the command itself (e.g. 'python -c \\\"...\\\"').\",\n runtime:\n \"unknown parameter 'runtime'. Invoke the runtime inside the command itself (e.g. 'node -e \\\"...\\\"').\",\n\n stdin:\n \"unknown parameter 'stdin'. Interactive stdin is not supported in v1. Pipe data into the command instead (e.g. 'echo \\\"y\\\" | npm init').\",\n input:\n \"unknown parameter 'input'. Interactive input is not supported in v1. Make the command non-interactive with flags like --yes.\",\n\n sandbox:\n \"unknown parameter 'sandbox'. Sandboxing is configured on the session, not per-call.\",\n sandbox_mode:\n \"unknown parameter 'sandbox_mode'. Sandboxing is configured on the session, not per-call.\",\n permissions:\n \"unknown parameter 'permissions'. The permission hook is configured on the session.\",\n network:\n \"unknown parameter 'network'. Network access is configured on the session / executor adapter.\",\n network_access:\n \"unknown parameter 'network_access'. Network access is configured on the session / executor adapter.\",\n\n shell: \"unknown parameter 'shell'. Shell binary is configured on the session.\",\n shell_binary:\n \"unknown parameter 'shell_binary'. Shell binary is configured on the session.\",\n};\n\nfunction checkAliases(input: unknown): string[] {\n if (input === null || typeof input !== \"object\") return [];\n const hints: string[] = [];\n for (const key of Object.keys(input as Record<string, unknown>)) {\n const hint = KNOWN_PARAM_ALIASES[key];\n if (hint) hints.push(hint);\n }\n return hints;\n}\n\nfunction makeAliasIssues(messages: string[]): v.BaseIssue<unknown>[] {\n return messages.map(\n (m) =>\n ({\n kind: \"validation\",\n type: \"custom\",\n input: undefined,\n expected: null,\n received: \"unknown\",\n message: m,\n }) as unknown as v.BaseIssue<unknown>,\n );\n}\n\nexport function safeParseBashParams(input: unknown):\n | { ok: true; value: BashParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const aliases = checkAliases(input);\n if (aliases.length > 0) {\n return { ok: false, issues: makeAliasIssues(aliases) };\n }\n const result = v.safeParse(BashParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashOutputParams(input: unknown):\n | { ok: true; value: BashOutputParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashOutputParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashKillParams(input: unknown):\n | { ok: true; value: BashKillParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashKillParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\n// Tool definitions exposed to the LLM.\n\nexport const BASH_TOOL_NAME = \"bash\";\n\nexport const BASH_TOOL_DESCRIPTION = `Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls — set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) MUST use background: true. The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.`;\n\nexport const bashToolDefinition: ToolDefinition = {\n name: BASH_TOOL_NAME,\n description: BASH_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to run (single string, interpreted by bash -c).\",\n },\n cwd: {\n type: \"string\",\n description:\n \"Absolute working directory. Defaults to the session cwd plus any carried-over cd. Must be inside the workspace.\",\n },\n timeout_ms: {\n type: \"integer\",\n minimum: 100,\n description:\n \"Inactivity timeout in milliseconds. Any output resets the clock. Default 60000 (60 s). Wall-clock backstop is 5 minutes regardless.\",\n },\n description: {\n type: \"string\",\n description: \"One-line human-readable 'why' (optional, for traces).\",\n },\n background: {\n type: \"boolean\",\n description:\n \"Run as a background job. Returns a job_id; poll output with bash_output. Use for servers, watchers, long-running builds.\",\n },\n env: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description:\n \"Environment variables merged on top of the session env. Keys with sensitive prefixes (AWS_*, GITHUB_TOKEN, etc.) are rejected.\",\n },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_OUTPUT_TOOL_NAME = \"bash_output\";\n\nexport const BASH_OUTPUT_TOOL_DESCRIPTION = `Poll a backgrounded bash job's output since a given byte offset.\n\nReturns stdout and stderr slices plus whether the job is still running and its exit code if finished. Use 'since_byte' from the previous call to paginate through a long-running job's output without re-fetching already-seen bytes.`;\n\nexport const bashOutputToolDefinition: ToolDefinition = {\n name: BASH_OUTPUT_TOOL_NAME,\n description: BASH_OUTPUT_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description:\n \"The job_id returned by a previous bash call with background: true.\",\n },\n since_byte: {\n type: \"integer\",\n minimum: 0,\n description:\n \"Start of the requested slice per stream, in bytes. Defaults to 0. Use next_since_byte from a previous output call to resume.\",\n },\n head_limit: {\n type: \"integer\",\n minimum: 1,\n description: \"Max bytes per stream (default 30720 / 30 KB).\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_KILL_TOOL_NAME = \"bash_kill\";\n\nexport const BASH_KILL_TOOL_DESCRIPTION = `Send a termination signal to a backgrounded bash job.\n\nDefaults to SIGTERM (graceful). Use SIGKILL for an unresponsive job. The job's next bash_output call will report running: false.`;\n\nexport const bashKillToolDefinition: ToolDefinition = {\n name: BASH_KILL_TOOL_NAME,\n description: BASH_KILL_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description: \"The job_id returned by a previous bash call with background: true.\",\n },\n signal: {\n type: \"string\",\n enum: [\"SIGTERM\", \"SIGKILL\"],\n description: \"Signal to send. Default SIGTERM.\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n","import path from \"node:path\";\nimport { toolError, type ToolError } from \"@agent-sh/harness-core\";\nimport {\n BACKGROUND_MAX_JOBS,\n DEFAULT_INACTIVITY_TIMEOUT_MS,\n DEFAULT_WALLCLOCK_BACKSTOP_MS,\n MAX_OUTPUT_BYTES_FILE,\n MAX_OUTPUT_BYTES_INLINE,\n SENSITIVE_ENV_PREFIXES,\n} from \"./constants.js\";\nimport { createLocalBashExecutor } from \"./executor.js\";\nimport { askPermission, fenceBash, resolveCwd, resolveOps } from \"./fence.js\";\nimport {\n HeadTailBuffer,\n defaultSpillDir,\n formatBackgroundStartedText,\n formatBashKillText,\n formatBashOutputText,\n formatResultText,\n formatTimeoutText,\n} from \"./format.js\";\nimport {\n safeParseBashKillParams,\n safeParseBashOutputParams,\n safeParseBashParams,\n} from \"./schema.js\";\nimport type {\n BashExecutor,\n BashKillResult,\n BashOutputResult,\n BashResult,\n BashSessionConfig,\n} from \"./types.js\";\n\n// Session-scoped tracking of background jobs. The executor owns the\n// runtime state (streams, pids); we keep a counter here to enforce the\n// per-session cap.\nconst jobCountBySession = new WeakMap<BashSessionConfig, number>();\n\nfunction incJobCount(session: BashSessionConfig): void {\n jobCountBySession.set(session, (jobCountBySession.get(session) ?? 0) + 1);\n}\n\nfunction jobCount(session: BashSessionConfig): number {\n return jobCountBySession.get(session) ?? 0;\n}\n\nfunction err(error: ToolError): { kind: \"error\"; error: ToolError } {\n return { kind: \"error\", error };\n}\n\nfunction resolveExecutor(session: BashSessionConfig): BashExecutor {\n if (session.executor) return session.executor;\n // Default local executor only works if the session explicitly opted into\n // the fail-closed bypass. Otherwise core refuses.\n if (session.permissions.unsafeAllowBashWithoutHook !== true) {\n // The caller will hit fail-closed in askPermission — but we still need\n // an executor object to let things reach that gate cleanly.\n }\n return createLocalBashExecutor();\n}\n\n/**\n * Top-level `cd` detector for session cwd-carry.\n *\n * Matches a single top-level `cd` invocation only — NOT inside pipelines\n * (`cd x | true`), command lists (`cd x && y`), subshells (`(cd x)`),\n * or with trailing arguments. This deliberately covers 95% of model\n * intent without hand-parsing the full bash grammar.\n *\n * Returns the path argument if detected, else null.\n */\nexport function detectTopLevelCd(command: string): string | null {\n // Strip leading whitespace. Reject if any shell metacharacter appears.\n const trimmed = command.trim();\n if (trimmed.length === 0) return null;\n // Grammar: ^cd\\s+<path>$ where <path> has no whitespace, no &, |, ;, `, $, (, ).\n const match = trimmed.match(/^cd\\s+([^\\s&|;`$()]+)$/);\n if (!match) return null;\n const arg = match[1];\n if (arg === undefined) return null;\n // Strip matching single or double quotes if present.\n if (\n (arg.startsWith('\"') && arg.endsWith('\"')) ||\n (arg.startsWith(\"'\") && arg.endsWith(\"'\"))\n ) {\n return arg.slice(1, -1);\n }\n return arg;\n}\n\nfunction checkEnv(env: Readonly<Record<string, string>>): string | null {\n for (const key of Object.keys(env)) {\n for (const prefix of SENSITIVE_ENV_PREFIXES) {\n if (\n key === prefix ||\n (prefix.endsWith(\"_\") && key.startsWith(prefix))\n ) {\n return `env may not set sensitive-prefix variable '${key}' (prefix '${prefix}').`;\n }\n }\n }\n return null;\n}\n\nfunction byteLength(s: string): number {\n return Buffer.byteLength(s, \"utf8\");\n}\n\nexport async function bash(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashResult> {\n const parsed = safeParseBashParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages, { cause: parsed.issues }));\n }\n const params = parsed.value;\n\n if (\n params.background === true &&\n params.timeout_ms !== undefined\n ) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"timeout_ms does not apply to background jobs; they have their own lifecycle (bash_kill). Drop timeout_ms or set background: false.\",\n ),\n );\n }\n\n const envParam = params.env ?? {};\n const envError = checkEnv(envParam);\n if (envError) {\n return err(toolError(\"INVALID_PARAM\", envError));\n }\n\n const ops = resolveOps(session);\n const resolvedCwd = await resolveCwd(ops, session, params.cwd);\n\n // Workspace + sensitive-path fence.\n const fenceError = await fenceBash(session, resolvedCwd);\n if (fenceError) return err(fenceError);\n\n // cwd must actually exist and be a directory.\n const stat = await ops.stat(resolvedCwd).catch(() => undefined);\n if (!stat) {\n return err(\n toolError(\"NOT_FOUND\", `cwd does not exist: ${resolvedCwd}`, {\n meta: { cwd: resolvedCwd },\n }),\n );\n }\n if (stat.type !== \"directory\") {\n return err(\n toolError(\n \"IO_ERROR\",\n `cwd is not a directory: ${resolvedCwd}`,\n { meta: { cwd: resolvedCwd } },\n ),\n );\n }\n\n // Permission hook (autonomous: allow or deny, never ask).\n const effectiveTimeout =\n params.timeout_ms ??\n session.defaultInactivityTimeoutMs ??\n DEFAULT_INACTIVITY_TIMEOUT_MS;\n const decision = await askPermission(session, {\n command: params.command,\n cwd: resolvedCwd,\n background: params.background ?? false,\n timeoutMs: effectiveTimeout,\n envKeys: Object.keys(envParam),\n });\n if (decision.decision === \"deny\") {\n const echo = params.command.length > 200\n ? params.command.slice(0, 200) + \"...\"\n : params.command;\n return err(\n toolError(\n \"PERMISSION_DENIED\",\n `${decision.reason}\\nCommand: ${echo}`,\n { meta: { command: params.command, cwd: resolvedCwd } },\n ),\n );\n }\n\n const execEnv: Record<string, string> = {\n ...(session.env ?? process.env),\n ...envParam,\n } as Record<string, string>;\n // Node's process.env has `string | undefined`; filter undefineds.\n for (const [k, v] of Object.entries(execEnv)) {\n if (v === undefined) delete execEnv[k];\n }\n\n const executor = resolveExecutor(session);\n\n if (params.background === true) {\n return runBackground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n );\n }\n\n return runForeground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n effectiveTimeout,\n );\n}\n\nasync function runBackground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n): Promise<BashResult> {\n if (!executor.spawnBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"background: true is not supported by this executor adapter.\",\n ),\n );\n }\n const maxJobs = session.maxBackgroundJobs ?? BACKGROUND_MAX_JOBS;\n if (jobCount(session) >= maxJobs) {\n return err(\n toolError(\n \"IO_ERROR\",\n `Background job limit reached (${maxJobs}). Kill an existing job first with bash_kill.`,\n ),\n );\n }\n const { jobId } = await executor.spawnBackground({ command, cwd, env });\n incJobCount(session);\n return {\n kind: \"background_started\",\n output: formatBackgroundStartedText({ command, jobId }),\n jobId,\n };\n}\n\nasync function runForeground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n inactivityTimeoutMs: number,\n): Promise<BashResult> {\n const wallclockMs =\n session.wallclockBackstopMs ?? DEFAULT_WALLCLOCK_BACKSTOP_MS;\n const maxInline = session.maxOutputBytesInline ?? MAX_OUTPUT_BYTES_INLINE;\n const maxFile = session.maxOutputBytesFile ?? MAX_OUTPUT_BYTES_FILE;\n const spillDir = defaultSpillDir();\n\n const stdoutBuf = new HeadTailBuffer(maxInline, maxFile, \"out\", spillDir);\n const stderrBuf = new HeadTailBuffer(maxInline, maxFile, \"err\", spillDir);\n\n const controller = new AbortController();\n const abortOnOuter = () => controller.abort();\n if (session.signal) {\n if (session.signal.aborted) controller.abort();\n else session.signal.addEventListener(\"abort\", abortOnOuter, { once: true });\n }\n\n let timedOut: \"inactivity timeout\" | \"wall-clock backstop\" | null = null;\n let inactivityTimer: NodeJS.Timeout | null = null;\n const resetInactivity = () => {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n timedOut = \"inactivity timeout\";\n controller.abort();\n }, inactivityTimeoutMs);\n };\n resetInactivity();\n\n const wallclockTimer = setTimeout(() => {\n timedOut = \"wall-clock backstop\";\n controller.abort();\n }, wallclockMs);\n\n const start = Date.now();\n let result: Awaited<ReturnType<BashExecutor[\"run\"]>>;\n try {\n result = await executor.run({\n command,\n cwd,\n env,\n signal: controller.signal,\n onStdout: (chunk) => {\n stdoutBuf.write(chunk);\n resetInactivity();\n },\n onStderr: (chunk) => {\n stderrBuf.write(chunk);\n resetInactivity();\n },\n });\n } finally {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n clearTimeout(wallclockTimer);\n if (session.signal) {\n session.signal.removeEventListener(\"abort\", abortOnOuter);\n }\n }\n\n const durationMs = Date.now() - start;\n const stdoutRender = stdoutBuf.render();\n const stderrRender = stderrBuf.render();\n\n if (timedOut !== null) {\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n return {\n kind: \"timeout\",\n output: formatTimeoutText({\n command,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n partialBytes: stdoutBuf.bytesTotal() + stderrBuf.bytesTotal(),\n logPath,\n }),\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n ...(logPath ? { logPath } : {}),\n };\n }\n\n const exitCode = result.exitCode ?? -1;\n const kind: \"ok\" | \"nonzero_exit\" = exitCode === 0 ? \"ok\" : \"nonzero_exit\";\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n const byteCap = stdoutRender.byteCap || stderrRender.byteCap;\n\n return {\n kind,\n output: formatResultText({\n command,\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n byteCap,\n logPath,\n kind,\n }),\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n ...(logPath ? { logPath } : {}),\n byteCap,\n };\n}\n\nexport async function bashOutput(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashOutputResult> {\n const parsed = safeParseBashOutputParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.readBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_output is not supported by this executor adapter.\",\n ),\n );\n }\n try {\n const read = await executor.readBackground(parsed.value.job_id, {\n ...(parsed.value.since_byte !== undefined\n ? { since_byte: parsed.value.since_byte }\n : {}),\n ...(parsed.value.head_limit !== undefined\n ? { head_limit: parsed.value.head_limit }\n : {}),\n });\n const sinceByte = parsed.value.since_byte ?? 0;\n const returnedBytes =\n byteLength(read.stdout) + byteLength(read.stderr);\n const totalBytes = read.totalBytesStdout + read.totalBytesStderr;\n return {\n kind: \"output\",\n output: formatBashOutputText({\n jobId: parsed.value.job_id,\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n sinceByte,\n returnedBytes,\n totalBytes,\n }),\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n totalBytesStdout: read.totalBytesStdout,\n totalBytesStderr: read.totalBytesStderr,\n nextSinceByte: sinceByte + returnedBytes,\n };\n } catch (e) {\n return err(\n toolError(\n \"NOT_FOUND\",\n (e as Error).message || `Unknown job_id: ${parsed.value.job_id}`,\n ),\n );\n }\n}\n\nexport async function bashKill(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashKillResult> {\n const parsed = safeParseBashKillParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.killBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_kill is not supported by this executor adapter.\",\n ),\n );\n }\n const signal = parsed.value.signal ?? \"SIGTERM\";\n await executor.killBackground(parsed.value.job_id, signal);\n return {\n kind: \"killed\",\n output: formatBashKillText({ jobId: parsed.value.job_id, signal }),\n jobId: parsed.value.job_id,\n signal,\n };\n}\n\n/**\n * Apply cwd-carry: if the command is a top-level `cd <path>` and the\n * destination resolves inside the workspace, mutate session.logicalCwd.\n * Called AFTER the command executes with exit 0 (caller's responsibility).\n *\n * Exposed separately so tests can exercise the logic directly AND so a\n * harness wrapper can call it at the right point in the lifecycle. In\n * core, the orchestrator does NOT auto-call this — we keep cwd-carry\n * out of the hot path for correctness; the caller opts in by invoking\n * applyCwdCarry after a successful bash() result.\n *\n * Rationale: cwd-carry mutates session state which has observable\n * implications for concurrent calls. Making it explicit is safer.\n */\nexport function applyCwdCarry(\n session: BashSessionConfig,\n command: string,\n exitCode: number | null,\n): { changed: boolean; newCwd: string | null; escaped: boolean } {\n if (exitCode !== 0) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const target = detectTopLevelCd(command);\n if (target === null) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const base = session.logicalCwd?.value ?? session.cwd;\n const resolved = path.isAbsolute(target)\n ? path.resolve(target)\n : path.resolve(base, target);\n\n // Escape check.\n const inside = session.permissions.roots.some(\n (r) => resolved === r || resolved.startsWith(r + path.sep),\n );\n if (!inside && session.permissions.bypassWorkspaceGuard !== true) {\n return { changed: false, newCwd: resolved, escaped: true };\n }\n\n if (session.logicalCwd) {\n session.logicalCwd.value = resolved;\n }\n return { changed: true, newCwd: resolved, escaped: false };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/executor.ts","../src/fence.ts","../src/format.ts","../src/schema.ts","../src/bash.ts"],"names":["path","runForeground","opts","randomUUID","mkdirSync","tmpdir","toolError","v","logPath"],"mappings":"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","file":"index.js","sourcesContent":["export const DEFAULT_INACTIVITY_TIMEOUT_MS = 60_000;\nexport const DEFAULT_WALLCLOCK_BACKSTOP_MS = 300_000;\nexport const MAX_COMMAND_LENGTH = 16_384;\nexport const MAX_OUTPUT_BYTES_INLINE = 30_720; // 30 KB per stream\nexport const MAX_OUTPUT_BYTES_FILE = 10 * 1024 * 1024; // 10 MB per stream\nexport const BACKGROUND_MAX_JOBS = 16;\nexport const KILL_GRACE_MS = 5_000;\n\n/**\n * Env var name prefixes that the tool refuses to let the model set via `env`.\n * Defense in depth: even if the harness forwards its environment, the model\n * should not be able to override credentials per-call.\n */\nexport const SENSITIVE_ENV_PREFIXES: readonly string[] = [\n \"AWS_\",\n \"BEDROCK_\",\n \"GITHUB_TOKEN\",\n \"GH_TOKEN\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"GEMINI_API_KEY\",\n \"NPM_TOKEN\",\n \"DOCKERHUB_TOKEN\",\n \"SLACK_\",\n \"STRIPE_\",\n];\n","import { spawn } from \"node:child_process\";\nimport { mkdirSync, createWriteStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { KILL_GRACE_MS } from \"./constants.js\";\nimport type {\n BackgroundReadResult,\n BashExecutor,\n BashRunInput,\n BashRunResult,\n} from \"./types.js\";\n\n/**\n * Default local-subprocess executor.\n *\n * Launches the bash binary with `-c <command>` via the argv form of\n * node:child_process.spawn — NEVER the string-based shell-eval entry\n * point. The command string is passed as a single argument to the bash\n * binary, not interpolated into our own spawn args. All shell parsing\n * happens inside the child bash process.\n *\n * This executor ships unsandboxed; sandboxing is the job of adapter\n * packages that implement the same BashExecutor interface. See\n * packages/bash/src/types.ts.\n */\nexport function createLocalBashExecutor(opts?: {\n bashPath?: string;\n logDir?: string;\n}): BashExecutor {\n const bashPath = opts?.bashPath ?? \"/bin/bash\";\n const logDir = opts?.logDir ?? path.join(tmpdir(), \"agent-sh-bash-logs\");\n mkdirSync(logDir, { recursive: true });\n\n interface Job {\n readonly id: string;\n readonly outPath: string;\n readonly errPath: string;\n running: boolean;\n exitCode: number | null;\n killed: boolean;\n proc: ReturnType<typeof spawn> | null;\n }\n\n const jobs = new Map<string, Job>();\n\n async function runForeground(input: BashRunInput): Promise<BashRunResult> {\n const child = spawn(bashPath, [\"-c\", input.command], {\n cwd: input.cwd,\n env: { ...input.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => input.onStdout(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => input.onStderr(chunk));\n\n let killedBySignal = false;\n const onAbort = () => {\n killedBySignal = true;\n try {\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child.exitCode === null) child.kill(\"SIGKILL\");\n }, KILL_GRACE_MS).unref();\n } catch {\n // best effort\n }\n };\n if (input.signal.aborted) {\n onAbort();\n } else {\n input.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return new Promise((resolve) => {\n child.on(\"close\", (code, signal) => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({\n exitCode: code,\n killed: killedBySignal,\n signal: signal ?? null,\n });\n });\n child.on(\"error\", () => {\n input.signal.removeEventListener(\"abort\", onAbort);\n resolve({ exitCode: null, killed: killedBySignal, signal: null });\n });\n });\n }\n\n async function spawnBackground(args: {\n command: string;\n cwd: string;\n env: Readonly<Record<string, string>>;\n }): Promise<{ jobId: string }> {\n const jobId = randomUUID();\n const outPath = path.join(logDir, `${jobId}.out`);\n const errPath = path.join(logDir, `${jobId}.err`);\n const outStream = createWriteStream(outPath, { flags: \"w\" });\n const errStream = createWriteStream(errPath, { flags: \"w\" });\n\n const child = spawn(bashPath, [\"-c\", args.command], {\n cwd: args.cwd,\n env: { ...args.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: false,\n });\n\n child.stdout.pipe(outStream);\n child.stderr.pipe(errStream);\n\n const job: Job = {\n id: jobId,\n outPath,\n errPath,\n running: true,\n exitCode: null,\n killed: false,\n proc: child,\n };\n jobs.set(jobId, job);\n\n child.on(\"close\", (code) => {\n job.running = false;\n job.exitCode = code;\n job.proc = null;\n });\n child.on(\"error\", () => {\n job.running = false;\n job.proc = null;\n });\n\n return { jobId };\n }\n\n async function readBackground(\n jobId: string,\n opts: { since_byte?: number; head_limit?: number },\n ): Promise<BackgroundReadResult> {\n const job = jobs.get(jobId);\n if (!job) {\n throw new Error(`Unknown job_id: ${jobId}`);\n }\n const since = opts.since_byte ?? 0;\n const limit = opts.head_limit ?? 30_720;\n const stdout = readSlice(job.outPath, since, limit);\n const stderr = readSlice(job.errPath, since, limit);\n return {\n stdout: stdout.text,\n stderr: stderr.text,\n running: job.running,\n exitCode: job.exitCode,\n totalBytesStdout: stdout.totalBytes,\n totalBytesStderr: stderr.totalBytes,\n };\n }\n\n async function killBackground(\n jobId: string,\n signal: \"SIGTERM\" | \"SIGKILL\" = \"SIGTERM\",\n ): Promise<void> {\n const job = jobs.get(jobId);\n if (!job || !job.proc) return;\n job.killed = true;\n try {\n job.proc.kill(signal);\n if (signal === \"SIGTERM\") {\n setTimeout(() => {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGKILL\");\n } catch {\n // ignore\n }\n }\n }, KILL_GRACE_MS).unref();\n }\n } catch {\n // ignore\n }\n }\n\n async function closeSession(): Promise<void> {\n for (const job of jobs.values()) {\n if (job.running && job.proc) {\n try {\n job.proc.kill(\"SIGTERM\");\n } catch {\n // ignore\n }\n }\n }\n }\n\n return {\n run: runForeground,\n spawnBackground,\n readBackground,\n killBackground,\n closeSession,\n };\n}\n\nfunction readSlice(\n filePath: string,\n since: number,\n limit: number,\n): { text: string; totalBytes: number } {\n if (!existsSync(filePath)) return { text: \"\", totalBytes: 0 };\n const totalBytes = statSync(filePath).size;\n if (since >= totalBytes) return { text: \"\", totalBytes };\n const end = Math.min(since + limit, totalBytes);\n const buf = readFileSync(filePath).subarray(since, end);\n return { text: buf.toString(\"utf8\"), totalBytes };\n}\n","import path from \"node:path\";\nimport {\n defaultNodeOperations,\n isInsideAnyRoot,\n matchesAnyPattern,\n toolError,\n type ReadOperations,\n type ToolError,\n} from \"@agent-sh/harness-core\";\nimport type { BashSessionConfig } from \"./types.js\";\n\nexport async function resolveCwd(\n ops: ReadOperations,\n session: BashSessionConfig,\n requested: string | undefined,\n): Promise<string> {\n const base = requested ?? session.logicalCwd?.value ?? session.cwd;\n const absolute = path.isAbsolute(base) ? base : path.resolve(session.cwd, base);\n try {\n return await ops.realpath(absolute);\n } catch {\n return absolute;\n }\n}\n\nexport async function fenceBash(\n session: BashSessionConfig,\n resolvedCwd: string,\n): Promise<ToolError | undefined> {\n const { permissions } = session;\n const isSensitive = matchesAnyPattern(\n resolvedCwd,\n permissions.sensitivePatterns,\n );\n const insideWorkspace = isInsideAnyRoot(resolvedCwd, permissions.roots);\n\n if (isSensitive && permissions.hook === undefined) {\n return toolError(\n \"SENSITIVE\",\n `Refusing to run bash in sensitive path: ${resolvedCwd}`,\n { meta: { path: resolvedCwd } },\n );\n }\n\n if (\n !insideWorkspace &&\n permissions.bypassWorkspaceGuard !== true &&\n permissions.hook === undefined\n ) {\n return toolError(\n \"OUTSIDE_WORKSPACE\",\n `cwd is outside all configured workspace roots: ${resolvedCwd}`,\n { meta: { path: resolvedCwd, roots: permissions.roots } },\n );\n }\n\n return undefined;\n}\n\n/**\n * Permission hook call, bash-specific metadata.\n *\n * Returns one of:\n * \"allow\" — run\n * \"allow_once\" — run (no persistent rule learned)\n * \"deny\" — refuse with PERMISSION_DENIED\n * \"ask\" — treated as \"deny\" in this autonomous tool; caller\n * gets a hint to configure the hook properly\n */\nexport async function askPermission(\n session: BashSessionConfig,\n args: {\n command: string;\n cwd: string;\n background: boolean;\n timeoutMs: number;\n envKeys: readonly string[];\n },\n): Promise<\n | { decision: \"allow\" | \"allow_once\" }\n | { decision: \"deny\"; reason: string }\n> {\n const { permissions } = session;\n // Extract the first whitespace token as the \"command head\" for pattern\n // hints (`git`, `npm`, `python`, ...). Matches Claude Code convention.\n const commandHead = args.command.trimStart().split(/\\s+/)[0] ?? \"\";\n const alwaysPatterns = commandHead\n ? [`Bash(${commandHead}:*)`]\n : [\"Bash(*)\"];\n\n if (permissions.hook === undefined) {\n if (permissions.unsafeAllowBashWithoutHook === true) {\n return { decision: \"allow\" };\n }\n return {\n decision: \"deny\",\n reason:\n \"bash tool has no permission hook configured; refusing to run untrusted commands. Wire a hook or set session.permissions.unsafeAllowBashWithoutHook for test fixtures.\",\n };\n }\n\n const decision = await permissions.hook({\n tool: \"bash\",\n path: args.cwd,\n action: \"read\",\n always_patterns: alwaysPatterns,\n metadata: {\n command: args.command,\n cwd: args.cwd,\n background: args.background,\n timeout_ms: args.timeoutMs,\n env_keys: args.envKeys,\n network_required: null,\n },\n });\n if (decision === \"deny\") {\n return {\n decision: \"deny\",\n reason: `Command blocked by permission policy. Pattern hint: ${alwaysPatterns.join(\", \")}`,\n };\n }\n if (decision === \"allow\" || decision === \"allow_once\") {\n return { decision };\n }\n // \"ask\" in autonomous mode → deny with hint.\n return {\n decision: \"deny\",\n reason:\n \"Permission hook returned 'ask' but bash runs in autonomous mode. Configure the hook to return allow or deny.\",\n };\n}\n\nexport function resolveOps(session: BashSessionConfig): ReadOperations {\n return session.ops ?? defaultNodeOperations();\n}\n\n// Add a minimal ops accessor if session extends with it. Bash uses the\n// shared default for realpath/stat only.\ndeclare module \"./types.js\" {\n interface BashSessionConfig {\n readonly ops?: ReadOperations;\n }\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Per-stream output buffer with head+tail capping and spill-to-file on\n * overflow. Models rarely need the middle of a long output — they need\n * either the setup line or the error tail. This buffer preserves both.\n */\nexport class HeadTailBuffer {\n private readonly chunks: Uint8Array[] = [];\n private totalBytes = 0;\n private byteCap = false;\n private spilled = false;\n private spillPath: string | null = null;\n private spillBytes: number[] = [];\n\n constructor(\n private readonly maxInline: number,\n private readonly maxFile: number,\n private readonly kind: \"out\" | \"err\",\n private readonly spillDir: string,\n ) {}\n\n write(chunk: Uint8Array): void {\n this.totalBytes += chunk.byteLength;\n if (this.totalBytes <= this.maxInline) {\n this.chunks.push(chunk);\n return;\n }\n // Overflow: spill everything past the cap to disk + remember tail.\n if (!this.spilled) {\n this.spilled = true;\n this.byteCap = true;\n this.spillPath = path.join(\n this.spillDir,\n `${randomUUID()}.${this.kind}`,\n );\n // Write whatever was buffered so far into the spill file so the\n // full log is recoverable from the file path alone.\n for (const c of this.chunks) this.appendSpill(c);\n }\n this.appendSpill(chunk);\n // Keep a tail window (roughly half of maxInline in bytes) from spilled\n // stream so the inline result has a useful tail slice.\n this.spillBytes.push(chunk.byteLength);\n }\n\n private appendSpill(chunk: Uint8Array): void {\n if (this.spillPath === null) return;\n if (!this.spillInit) {\n mkdirSync(this.spillDir, { recursive: true });\n writeFileSync(this.spillPath, \"\");\n this.spillInit = true;\n }\n if (this.fileBytesWritten + chunk.byteLength > this.maxFile) {\n // File cap hit. Ignore further writes.\n return;\n }\n // Sync append — output sizes are in KB-to-MB range, no need for\n // async stream plumbing.\n appendFileSync(this.spillPath, Buffer.from(chunk));\n this.fileBytesWritten += chunk.byteLength;\n }\n\n private spillInit = false;\n private fileBytesWritten = 0;\n\n /**\n * Return the inline render:\n * - If not capped: the full buffered text.\n * - If capped: head (first maxInline/2 bytes) + marker + tail\n * (last maxInline/2 bytes) approximation. We approximate the tail\n * by decoding only the tail window (maxInline/2 bytes from the spill\n * file) because the stream is write-once and we dropped the middle.\n *\n * The actual implementation is simpler: we keep only the head inline\n * (first maxInline bytes, never overwritten) and emit a marker that\n * points at the log path. Head-only is a deliberate simplification\n * versus spec's head+tail — it matches OpenCode's default, and we\n * rely on Read(path) to see the tail. Spec §4 head+tail is a v2\n * improvement once we prove the file-path recovery path.\n */\n render(): { text: string; byteCap: boolean; logPath: string | null } {\n if (!this.spilled) {\n const combined = Buffer.concat(this.chunks.map((c) => Buffer.from(c)));\n return {\n text: combined.toString(\"utf8\"),\n byteCap: false,\n logPath: null,\n };\n }\n // Capped: return the first maxInline bytes and a pointer to the file.\n const head = Buffer.concat(\n this.chunks.map((c) => Buffer.from(c)),\n this.maxInline,\n ).toString(\"utf8\");\n const marker = `\\n... (stream exceeded ${this.maxInline} bytes; full log at ${this.spillPath}) ...`;\n return {\n text: head + marker,\n byteCap: true,\n logPath: this.spillPath,\n };\n }\n\n bytesTotal(): number {\n return this.totalBytes;\n }\n\n wasCapped(): boolean {\n return this.byteCap;\n }\n}\n\nexport function defaultSpillDir(): string {\n return path.join(tmpdir(), \"agent-sh-bash-spill\");\n}\n\n/**\n * Format the text body of an \"ok\" / \"nonzero_exit\" result.\n * Kept deliberately simple — structured fields ride on the result\n * object; `output` is the canonical text the executor returns to the\n * model at the tool_result boundary.\n */\nexport function formatResultText(args: {\n command: string;\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n byteCap: boolean;\n logPath: string | null;\n kind: \"ok\" | \"nonzero_exit\";\n}): string {\n const header = `<command>${args.command}</command>`;\n const exitLine = `<exit_code>${args.exitCode}</exit_code>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const hint = args.byteCap\n ? `(Output capped. Full log: ${args.logPath}. Read it with pagination if you need the middle.)`\n : args.kind === \"ok\"\n ? `(Command completed in ${args.durationMs}ms. exit=0.)`\n : `(Command exited nonzero in ${args.durationMs}ms. Exit code: ${args.exitCode}.)`;\n return [header, exitLine, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatTimeoutText(args: {\n command: string;\n stdout: string;\n stderr: string;\n reason: \"inactivity timeout\" | \"wall-clock backstop\";\n durationMs: number;\n partialBytes: number;\n logPath: string | null;\n}): string {\n const header = `<command>${args.command}</command>`;\n const stdoutBlock = `<stdout>\\n${args.stdout}\\n</stdout>`;\n const stderrBlock = `<stderr>\\n${args.stderr}\\n</stderr>`;\n const logHint = args.logPath ? ` Full log: ${args.logPath}.` : \"\";\n const hint = `(Command hit ${args.reason} after ${args.durationMs}ms. ${args.partialBytes} bytes captured. Kill signal: SIGTERM then SIGKILL.${logHint} If the command is long-running, retry with background: true.)`;\n return [header, stdoutBlock, stderrBlock, hint].join(\"\\n\");\n}\n\nexport function formatBackgroundStartedText(args: {\n command: string;\n jobId: string;\n}): string {\n return [\n `<command>${args.command}</command>`,\n `<job_id>${args.jobId}</job_id>`,\n `(Background job started. Poll output with bash_output(job_id). Kill with bash_kill(job_id).)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashOutputText(args: {\n jobId: string;\n running: boolean;\n exitCode: number | null;\n stdout: string;\n stderr: string;\n sinceByte: number;\n returnedBytes: number;\n totalBytes: number;\n}): string {\n const next = args.sinceByte + args.returnedBytes;\n return [\n `<job_id>${args.jobId}</job_id>`,\n `<running>${args.running}</running>`,\n `<exit_code>${args.exitCode === null ? \"null\" : args.exitCode}</exit_code>`,\n `<stdout>\\n${args.stdout}\\n</stdout>`,\n `<stderr>\\n${args.stderr}\\n</stderr>`,\n `(Showing bytes ${args.sinceByte}-${next} of ${args.totalBytes}. Next since_byte: ${next}. Job running: ${args.running}.)`,\n ].join(\"\\n\");\n}\n\nexport function formatBashKillText(args: {\n jobId: string;\n signal: \"SIGTERM\" | \"SIGKILL\";\n}): string {\n return `<job_id>${args.jobId}</job_id>\\n(${args.signal} sent. Poll bash_output to confirm termination.)`;\n}\n","import * as v from \"valibot\";\nimport type { ToolDefinition } from \"@agent-sh/harness-core\";\nimport { MAX_COMMAND_LENGTH } from \"./constants.js\";\nimport type { BashParams, BashOutputParams, BashKillParams } from \"./types.js\";\n\nexport const BashParamsSchema = v.strictObject({\n command: v.pipe(\n v.string(),\n v.minLength(1, \"command is required\"),\n v.maxLength(\n MAX_COMMAND_LENGTH,\n `command exceeds ${MAX_COMMAND_LENGTH} bytes`,\n ),\n ),\n cwd: v.optional(v.pipe(v.string(), v.minLength(1, \"cwd must not be empty\"))),\n timeout_ms: v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(100, \"timeout_ms must be >= 100 ms\"),\n ),\n ),\n description: v.optional(v.string()),\n background: v.optional(v.boolean()),\n env: v.optional(v.record(v.string(), v.string())),\n});\n\nexport const BashOutputParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n since_byte: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(0, \"since_byte must be >= 0\")),\n ),\n head_limit: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(1, \"head_limit must be >= 1\")),\n ),\n});\n\nexport const BashKillParamsSchema = v.strictObject({\n job_id: v.pipe(v.string(), v.minLength(1, \"job_id is required\")),\n signal: v.optional(v.picklist([\"SIGTERM\", \"SIGKILL\"])),\n});\n\nexport type ParsedBashParams = v.InferOutput<typeof BashParamsSchema>;\n\n/**\n * Alias table mirroring grep/glob's KNOWN_PARAM_ALIASES. Models routinely\n * pass alternate names; we return a targeted INVALID_PARAM redirect rather\n * than the generic strictObject \"Unknown key: X\".\n */\nconst KNOWN_PARAM_ALIASES: Record<string, string> = {\n cmd: \"unknown parameter 'cmd'. Use 'command' instead.\",\n shell_command: \"unknown parameter 'shell_command'. Use 'command' instead.\",\n script: \"unknown parameter 'script'. Use 'command' instead.\",\n run: \"unknown parameter 'run'. Use 'command' instead.\",\n\n directory: \"unknown parameter 'directory'. Use 'cwd' instead.\",\n dir: \"unknown parameter 'dir'. Use 'cwd' instead.\",\n path: \"unknown parameter 'path'. Use 'cwd' instead.\",\n working_directory:\n \"unknown parameter 'working_directory'. Use 'cwd' instead.\",\n\n timeout:\n \"unknown parameter 'timeout'. Use 'timeout_ms' instead (milliseconds, not seconds). For 30s pass timeout_ms: 30000.\",\n time_limit:\n \"unknown parameter 'time_limit'. Use 'timeout_ms' instead (milliseconds).\",\n timeout_seconds:\n \"unknown parameter 'timeout_seconds'. Use 'timeout_ms' instead (multiply by 1000).\",\n\n env_vars: \"unknown parameter 'env_vars'. Use 'env' instead.\",\n environment: \"unknown parameter 'environment'. Use 'env' instead.\",\n\n lang: \"unknown parameter 'lang'. Bash runs shell commands; invoke other languages via the command itself (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n language:\n \"unknown parameter 'language'. Invoke other languages via the command (e.g. 'python -c \\\"...\\\"', 'node -e \\\"...\\\"').\",\n interpreter:\n \"unknown parameter 'interpreter'. Invoke the interpreter inside the command itself (e.g. 'python -c \\\"...\\\"').\",\n runtime:\n \"unknown parameter 'runtime'. Invoke the runtime inside the command itself (e.g. 'node -e \\\"...\\\"').\",\n\n stdin:\n \"unknown parameter 'stdin'. Interactive stdin is not supported in v1. Pipe data into the command instead (e.g. 'echo \\\"y\\\" | npm init').\",\n input:\n \"unknown parameter 'input'. Interactive input is not supported in v1. Make the command non-interactive with flags like --yes.\",\n\n sandbox:\n \"unknown parameter 'sandbox'. Sandboxing is configured on the session, not per-call.\",\n sandbox_mode:\n \"unknown parameter 'sandbox_mode'. Sandboxing is configured on the session, not per-call.\",\n permissions:\n \"unknown parameter 'permissions'. The permission hook is configured on the session.\",\n network:\n \"unknown parameter 'network'. Network access is configured on the session / executor adapter.\",\n network_access:\n \"unknown parameter 'network_access'. Network access is configured on the session / executor adapter.\",\n\n shell: \"unknown parameter 'shell'. Shell binary is configured on the session.\",\n shell_binary:\n \"unknown parameter 'shell_binary'. Shell binary is configured on the session.\",\n};\n\nfunction checkAliases(input: unknown): string[] {\n if (input === null || typeof input !== \"object\") return [];\n const hints: string[] = [];\n for (const key of Object.keys(input as Record<string, unknown>)) {\n const hint = KNOWN_PARAM_ALIASES[key];\n if (hint) hints.push(hint);\n }\n return hints;\n}\n\nfunction makeAliasIssues(messages: string[]): v.BaseIssue<unknown>[] {\n return messages.map(\n (m) =>\n ({\n kind: \"validation\",\n type: \"custom\",\n input: undefined,\n expected: null,\n received: \"unknown\",\n message: m,\n }) as unknown as v.BaseIssue<unknown>,\n );\n}\n\nexport function safeParseBashParams(input: unknown):\n | { ok: true; value: BashParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const aliases = checkAliases(input);\n if (aliases.length > 0) {\n return { ok: false, issues: makeAliasIssues(aliases) };\n }\n const result = v.safeParse(BashParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashOutputParams(input: unknown):\n | { ok: true; value: BashOutputParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashOutputParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\nexport function safeParseBashKillParams(input: unknown):\n | { ok: true; value: BashKillParams }\n | { ok: false; issues: v.BaseIssue<unknown>[] } {\n const result = v.safeParse(BashKillParamsSchema, input);\n if (result.success) return { ok: true, value: result.output };\n return { ok: false, issues: result.issues };\n}\n\n// Tool definitions exposed to the LLM.\n\nexport const BASH_TOOL_NAME = \"bash\";\n\nexport const BASH_TOOL_DESCRIPTION = `Run a single shell command in a bash subprocess. Output is captured and returned with the exit code.\n\nUsage:\n- 'cd' carries over to subsequent calls if it stays inside the workspace; otherwise the cwd is reset. Environment variables do NOT persist across calls — set them inline (FOO=bar some-cmd) or via 'env'.\n- For non-shell code, use language one-liners: 'python -c \"print(2+2)\"', 'node -e \"console.log(2+2)\"', 'deno eval \"console.log(2+2)\"'. For multi-line scripts, write a temp file with the write tool and invoke the interpreter on it.\n- Long-running processes (servers, watchers) and network requests (curl/wget) that may stall MUST use background: true, OR pass an explicit client-side timeout (e.g. curl --max-time N). The tool returns a job_id; poll output with bash_output(job_id). Do not leave a foreground command running past the 5-minute wall-clock backstop.\n- No interactive commands. Anything that needs stdin (pagers, Y/n prompts, REPLs, 'git commit' without -m) will hang until the inactivity timeout. Use flags to make commands non-interactive (--yes, -y, --no-pager) or pipe 'echo \"y\" |' in front.\n- Inactivity timeout resets on any output; default 60000 ms. Override with timeout_ms. Wall-clock backstop is 5 minutes for foreground calls.\n- Prefer this tool over other ways of running shell commands. For filename search prefer 'glob'; for content search prefer 'grep'.`;\n\nexport const bashToolDefinition: ToolDefinition = {\n name: BASH_TOOL_NAME,\n description: BASH_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to run (single string, interpreted by bash -c).\",\n },\n cwd: {\n type: \"string\",\n description:\n \"Absolute working directory. Defaults to the session cwd plus any carried-over cd. Must be inside the workspace.\",\n },\n timeout_ms: {\n type: \"integer\",\n minimum: 100,\n description:\n \"Inactivity timeout in milliseconds. Any output resets the clock. Default 60000 (60 s). Wall-clock backstop is 5 minutes regardless.\",\n },\n description: {\n type: \"string\",\n description: \"One-line human-readable 'why' (optional, for traces).\",\n },\n background: {\n type: \"boolean\",\n description:\n \"Run as a background job. Returns a job_id; poll output with bash_output. Use for servers, watchers, long-running builds.\",\n },\n env: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description:\n \"Environment variables merged on top of the session env. Keys with sensitive prefixes (AWS_*, GITHUB_TOKEN, etc.) are rejected.\",\n },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_OUTPUT_TOOL_NAME = \"bash_output\";\n\nexport const BASH_OUTPUT_TOOL_DESCRIPTION = `Poll a backgrounded bash job's output since a given byte offset.\n\nReturns stdout and stderr slices plus whether the job is still running and its exit code if finished. Use 'since_byte' from the previous call to paginate through a long-running job's output without re-fetching already-seen bytes.`;\n\nexport const bashOutputToolDefinition: ToolDefinition = {\n name: BASH_OUTPUT_TOOL_NAME,\n description: BASH_OUTPUT_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description:\n \"The job_id returned by a previous bash call with background: true.\",\n },\n since_byte: {\n type: \"integer\",\n minimum: 0,\n description:\n \"Start of the requested slice per stream, in bytes. Defaults to 0. Use next_since_byte from a previous output call to resume.\",\n },\n head_limit: {\n type: \"integer\",\n minimum: 1,\n description: \"Max bytes per stream (default 30720 / 30 KB).\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n\nexport const BASH_KILL_TOOL_NAME = \"bash_kill\";\n\nexport const BASH_KILL_TOOL_DESCRIPTION = `Send a termination signal to a backgrounded bash job.\n\nDefaults to SIGTERM (graceful). Use SIGKILL for an unresponsive job. The job's next bash_output call will report running: false.`;\n\nexport const bashKillToolDefinition: ToolDefinition = {\n name: BASH_KILL_TOOL_NAME,\n description: BASH_KILL_TOOL_DESCRIPTION,\n inputSchema: {\n type: \"object\",\n properties: {\n job_id: {\n type: \"string\",\n description: \"The job_id returned by a previous bash call with background: true.\",\n },\n signal: {\n type: \"string\",\n enum: [\"SIGTERM\", \"SIGKILL\"],\n description: \"Signal to send. Default SIGTERM.\",\n },\n },\n required: [\"job_id\"],\n additionalProperties: false,\n },\n};\n","import path from \"node:path\";\nimport { toolError, type ToolError } from \"@agent-sh/harness-core\";\nimport {\n BACKGROUND_MAX_JOBS,\n DEFAULT_INACTIVITY_TIMEOUT_MS,\n DEFAULT_WALLCLOCK_BACKSTOP_MS,\n MAX_OUTPUT_BYTES_FILE,\n MAX_OUTPUT_BYTES_INLINE,\n SENSITIVE_ENV_PREFIXES,\n} from \"./constants.js\";\nimport { createLocalBashExecutor } from \"./executor.js\";\nimport { askPermission, fenceBash, resolveCwd, resolveOps } from \"./fence.js\";\nimport {\n HeadTailBuffer,\n defaultSpillDir,\n formatBackgroundStartedText,\n formatBashKillText,\n formatBashOutputText,\n formatResultText,\n formatTimeoutText,\n} from \"./format.js\";\nimport {\n safeParseBashKillParams,\n safeParseBashOutputParams,\n safeParseBashParams,\n} from \"./schema.js\";\nimport type {\n BashExecutor,\n BashKillResult,\n BashOutputResult,\n BashResult,\n BashSessionConfig,\n} from \"./types.js\";\n\n// Session-scoped tracking of background jobs. The executor owns the\n// runtime state (streams, pids); we keep a counter here to enforce the\n// per-session cap.\nconst jobCountBySession = new WeakMap<BashSessionConfig, number>();\n\nfunction incJobCount(session: BashSessionConfig): void {\n jobCountBySession.set(session, (jobCountBySession.get(session) ?? 0) + 1);\n}\n\nfunction jobCount(session: BashSessionConfig): number {\n return jobCountBySession.get(session) ?? 0;\n}\n\nfunction err(error: ToolError): { kind: \"error\"; error: ToolError } {\n return { kind: \"error\", error };\n}\n\nfunction resolveExecutor(session: BashSessionConfig): BashExecutor {\n if (session.executor) return session.executor;\n // Default local executor only works if the session explicitly opted into\n // the fail-closed bypass. Otherwise core refuses.\n if (session.permissions.unsafeAllowBashWithoutHook !== true) {\n // The caller will hit fail-closed in askPermission — but we still need\n // an executor object to let things reach that gate cleanly.\n }\n return createLocalBashExecutor();\n}\n\n/**\n * Top-level `cd` detector for session cwd-carry.\n *\n * Matches a single top-level `cd` invocation only — NOT inside pipelines\n * (`cd x | true`), command lists (`cd x && y`), subshells (`(cd x)`),\n * or with trailing arguments. This deliberately covers 95% of model\n * intent without hand-parsing the full bash grammar.\n *\n * Returns the path argument if detected, else null.\n */\nexport function detectTopLevelCd(command: string): string | null {\n // Strip leading whitespace. Reject if any shell metacharacter appears.\n const trimmed = command.trim();\n if (trimmed.length === 0) return null;\n // Grammar: ^cd\\s+<path>$ where <path> has no whitespace, no &, |, ;, `, $, (, ).\n const match = trimmed.match(/^cd\\s+([^\\s&|;`$()]+)$/);\n if (!match) return null;\n const arg = match[1];\n if (arg === undefined) return null;\n // Strip matching single or double quotes if present.\n if (\n (arg.startsWith('\"') && arg.endsWith('\"')) ||\n (arg.startsWith(\"'\") && arg.endsWith(\"'\"))\n ) {\n return arg.slice(1, -1);\n }\n return arg;\n}\n\nfunction checkEnv(env: Readonly<Record<string, string>>): string | null {\n for (const key of Object.keys(env)) {\n for (const prefix of SENSITIVE_ENV_PREFIXES) {\n if (\n key === prefix ||\n (prefix.endsWith(\"_\") && key.startsWith(prefix))\n ) {\n return `env may not set sensitive-prefix variable '${key}' (prefix '${prefix}').`;\n }\n }\n }\n return null;\n}\n\nfunction byteLength(s: string): number {\n return Buffer.byteLength(s, \"utf8\");\n}\n\nexport async function bash(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashResult> {\n const parsed = safeParseBashParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages, { cause: parsed.issues }));\n }\n const params = parsed.value;\n\n if (\n params.background === true &&\n params.timeout_ms !== undefined\n ) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"timeout_ms does not apply to background jobs; they have their own lifecycle (bash_kill). Drop timeout_ms or set background: false.\",\n ),\n );\n }\n\n const envParam = params.env ?? {};\n const envError = checkEnv(envParam);\n if (envError) {\n return err(toolError(\"INVALID_PARAM\", envError));\n }\n\n const ops = resolveOps(session);\n const resolvedCwd = await resolveCwd(ops, session, params.cwd);\n\n // Workspace + sensitive-path fence.\n const fenceError = await fenceBash(session, resolvedCwd);\n if (fenceError) return err(fenceError);\n\n // cwd must actually exist and be a directory.\n const stat = await ops.stat(resolvedCwd).catch(() => undefined);\n if (!stat) {\n return err(\n toolError(\"NOT_FOUND\", `cwd does not exist: ${resolvedCwd}`, {\n meta: { cwd: resolvedCwd },\n }),\n );\n }\n if (stat.type !== \"directory\") {\n return err(\n toolError(\n \"IO_ERROR\",\n `cwd is not a directory: ${resolvedCwd}`,\n { meta: { cwd: resolvedCwd } },\n ),\n );\n }\n\n // Permission hook (autonomous: allow or deny, never ask).\n const effectiveTimeout =\n params.timeout_ms ??\n session.defaultInactivityTimeoutMs ??\n DEFAULT_INACTIVITY_TIMEOUT_MS;\n const decision = await askPermission(session, {\n command: params.command,\n cwd: resolvedCwd,\n background: params.background ?? false,\n timeoutMs: effectiveTimeout,\n envKeys: Object.keys(envParam),\n });\n if (decision.decision === \"deny\") {\n const echo = params.command.length > 200\n ? params.command.slice(0, 200) + \"...\"\n : params.command;\n return err(\n toolError(\n \"PERMISSION_DENIED\",\n `${decision.reason}\\nCommand: ${echo}`,\n { meta: { command: params.command, cwd: resolvedCwd } },\n ),\n );\n }\n\n const execEnv: Record<string, string> = {\n ...(session.env ?? process.env),\n ...envParam,\n } as Record<string, string>;\n // Node's process.env has `string | undefined`; filter undefineds.\n for (const [k, v] of Object.entries(execEnv)) {\n if (v === undefined) delete execEnv[k];\n }\n\n const executor = resolveExecutor(session);\n\n if (params.background === true) {\n return runBackground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n );\n }\n\n return runForeground(\n session,\n executor,\n params.command,\n resolvedCwd,\n execEnv,\n effectiveTimeout,\n );\n}\n\nasync function runBackground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n): Promise<BashResult> {\n if (!executor.spawnBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"background: true is not supported by this executor adapter.\",\n ),\n );\n }\n const maxJobs = session.maxBackgroundJobs ?? BACKGROUND_MAX_JOBS;\n if (jobCount(session) >= maxJobs) {\n return err(\n toolError(\n \"IO_ERROR\",\n `Background job limit reached (${maxJobs}). Kill an existing job first with bash_kill.`,\n ),\n );\n }\n const { jobId } = await executor.spawnBackground({ command, cwd, env });\n incJobCount(session);\n return {\n kind: \"background_started\",\n output: formatBackgroundStartedText({ command, jobId }),\n jobId,\n };\n}\n\nasync function runForeground(\n session: BashSessionConfig,\n executor: BashExecutor,\n command: string,\n cwd: string,\n env: Record<string, string>,\n inactivityTimeoutMs: number,\n): Promise<BashResult> {\n const wallclockMs =\n session.wallclockBackstopMs ?? DEFAULT_WALLCLOCK_BACKSTOP_MS;\n const maxInline = session.maxOutputBytesInline ?? MAX_OUTPUT_BYTES_INLINE;\n const maxFile = session.maxOutputBytesFile ?? MAX_OUTPUT_BYTES_FILE;\n const spillDir = defaultSpillDir();\n\n const stdoutBuf = new HeadTailBuffer(maxInline, maxFile, \"out\", spillDir);\n const stderrBuf = new HeadTailBuffer(maxInline, maxFile, \"err\", spillDir);\n\n const controller = new AbortController();\n const abortOnOuter = () => controller.abort();\n if (session.signal) {\n if (session.signal.aborted) controller.abort();\n else session.signal.addEventListener(\"abort\", abortOnOuter, { once: true });\n }\n\n let timedOut: \"inactivity timeout\" | \"wall-clock backstop\" | null = null;\n let inactivityTimer: NodeJS.Timeout | null = null;\n const resetInactivity = () => {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n timedOut = \"inactivity timeout\";\n controller.abort();\n }, inactivityTimeoutMs);\n };\n resetInactivity();\n\n const wallclockTimer = setTimeout(() => {\n timedOut = \"wall-clock backstop\";\n controller.abort();\n }, wallclockMs);\n\n const start = Date.now();\n let result: Awaited<ReturnType<BashExecutor[\"run\"]>>;\n try {\n result = await executor.run({\n command,\n cwd,\n env,\n signal: controller.signal,\n onStdout: (chunk) => {\n stdoutBuf.write(chunk);\n resetInactivity();\n },\n onStderr: (chunk) => {\n stderrBuf.write(chunk);\n resetInactivity();\n },\n });\n } finally {\n if (inactivityTimer) clearTimeout(inactivityTimer);\n clearTimeout(wallclockTimer);\n if (session.signal) {\n session.signal.removeEventListener(\"abort\", abortOnOuter);\n }\n }\n\n const durationMs = Date.now() - start;\n const stdoutRender = stdoutBuf.render();\n const stderrRender = stderrBuf.render();\n\n if (timedOut !== null) {\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n return {\n kind: \"timeout\",\n output: formatTimeoutText({\n command,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n partialBytes: stdoutBuf.bytesTotal() + stderrBuf.bytesTotal(),\n logPath,\n }),\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n reason: timedOut,\n durationMs,\n ...(logPath ? { logPath } : {}),\n };\n }\n\n const exitCode = result.exitCode ?? -1;\n const kind: \"ok\" | \"nonzero_exit\" = exitCode === 0 ? \"ok\" : \"nonzero_exit\";\n const logPath = stdoutRender.logPath ?? stderrRender.logPath;\n const byteCap = stdoutRender.byteCap || stderrRender.byteCap;\n\n return {\n kind,\n output: formatResultText({\n command,\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n byteCap,\n logPath,\n kind,\n }),\n exitCode,\n stdout: stdoutRender.text,\n stderr: stderrRender.text,\n durationMs,\n ...(logPath ? { logPath } : {}),\n byteCap,\n };\n}\n\nexport async function bashOutput(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashOutputResult> {\n const parsed = safeParseBashOutputParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.readBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_output is not supported by this executor adapter.\",\n ),\n );\n }\n try {\n const read = await executor.readBackground(parsed.value.job_id, {\n ...(parsed.value.since_byte !== undefined\n ? { since_byte: parsed.value.since_byte }\n : {}),\n ...(parsed.value.head_limit !== undefined\n ? { head_limit: parsed.value.head_limit }\n : {}),\n });\n const sinceByte = parsed.value.since_byte ?? 0;\n const returnedBytes =\n byteLength(read.stdout) + byteLength(read.stderr);\n const totalBytes = read.totalBytesStdout + read.totalBytesStderr;\n return {\n kind: \"output\",\n output: formatBashOutputText({\n jobId: parsed.value.job_id,\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n sinceByte,\n returnedBytes,\n totalBytes,\n }),\n running: read.running,\n exitCode: read.exitCode,\n stdout: read.stdout,\n stderr: read.stderr,\n totalBytesStdout: read.totalBytesStdout,\n totalBytesStderr: read.totalBytesStderr,\n nextSinceByte: sinceByte + returnedBytes,\n };\n } catch (e) {\n return err(\n toolError(\n \"NOT_FOUND\",\n (e as Error).message || `Unknown job_id: ${parsed.value.job_id}`,\n ),\n );\n }\n}\n\nexport async function bashKill(\n input: unknown,\n session: BashSessionConfig,\n): Promise<BashKillResult> {\n const parsed = safeParseBashKillParams(input);\n if (!parsed.ok) {\n const messages = parsed.issues.map((i) => i.message).join(\"; \");\n return err(toolError(\"INVALID_PARAM\", messages));\n }\n const executor = session.executor ?? createLocalBashExecutor();\n if (!executor.killBackground) {\n return err(\n toolError(\n \"INVALID_PARAM\",\n \"bash_kill is not supported by this executor adapter.\",\n ),\n );\n }\n const signal = parsed.value.signal ?? \"SIGTERM\";\n await executor.killBackground(parsed.value.job_id, signal);\n return {\n kind: \"killed\",\n output: formatBashKillText({ jobId: parsed.value.job_id, signal }),\n jobId: parsed.value.job_id,\n signal,\n };\n}\n\n/**\n * Apply cwd-carry: if the command is a top-level `cd <path>` and the\n * destination resolves inside the workspace, mutate session.logicalCwd.\n * Called AFTER the command executes with exit 0 (caller's responsibility).\n *\n * Exposed separately so tests can exercise the logic directly AND so a\n * harness wrapper can call it at the right point in the lifecycle. In\n * core, the orchestrator does NOT auto-call this — we keep cwd-carry\n * out of the hot path for correctness; the caller opts in by invoking\n * applyCwdCarry after a successful bash() result.\n *\n * Rationale: cwd-carry mutates session state which has observable\n * implications for concurrent calls. Making it explicit is safer.\n */\nexport function applyCwdCarry(\n session: BashSessionConfig,\n command: string,\n exitCode: number | null,\n): { changed: boolean; newCwd: string | null; escaped: boolean } {\n if (exitCode !== 0) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const target = detectTopLevelCd(command);\n if (target === null) {\n return { changed: false, newCwd: null, escaped: false };\n }\n const base = session.logicalCwd?.value ?? session.cwd;\n const resolved = path.isAbsolute(target)\n ? path.resolve(target)\n : path.resolve(base, target);\n\n // Escape check.\n const inside = session.permissions.roots.some(\n (r) => resolved === r || resolved.startsWith(r + path.sep),\n );\n if (!inside && session.permissions.bypassWorkspaceGuard !== true) {\n return { changed: false, newCwd: resolved, escaped: true };\n }\n\n if (session.logicalCwd) {\n session.logicalCwd.value = resolved;\n }\n return { changed: true, newCwd: resolved, escaped: false };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-sh/harness-bash",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Bash tool for AI agent harnesses — autonomous shell execution with pluggable executor, permission hook, cwd-carry, inactivity timeout, and background job support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"node": ">=20"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"valibot": "^
|
|
50
|
+
"valibot": "^1.2.0",
|
|
51
51
|
"@agent-sh/harness-core": "0.2.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|