@anvia/sandbox 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js
CHANGED
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/image-builder.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { lstat, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { assertDockerCli } from \"./docker-cli\";\nimport {\n renderSandboxImageContext,\n resolveSandboxImageSpec,\n type SandboxImageFeature,\n type SandboxImageInput,\n type SandboxImageManifest,\n type SandboxImageRuntime,\n type SandboxImageVersions,\n unpinnedSandboxImagePackages,\n} from \"./image-builder\";\n\ninterface CliOptions {\n command?: string;\n name?: string;\n tag?: string;\n output?: string;\n runtimes: SandboxImageRuntime[];\n features: SandboxImageFeature[];\n apt: string[];\n npm: string[];\n uv: string[];\n versions: Partial<SandboxImageVersions>;\n dockerPath: string;\n build: boolean;\n buildExplicit: boolean;\n dryRun: boolean;\n force: boolean;\n help: boolean;\n}\n\nexport interface SandboxImageCliIo {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n stdout(chunk: Uint8Array): void;\n stderr(chunk: Uint8Array): void;\n}\n\nexport interface SandboxImagePromptResult {\n name: string;\n runtimes: SandboxImageRuntime[];\n features: SandboxImageFeature[];\n apt: string[];\n npm: string[];\n uv: string[];\n tag?: string;\n output?: string;\n build: boolean;\n}\n\nexport interface SandboxImageCliDependencies {\n isTTY?: boolean;\n packageVersion?: string;\n prompt?: (options: Readonly<CliOptions>) => Promise<SandboxImagePromptResult | undefined>;\n buildImage?: (input: {\n contextPath: string;\n tag: string;\n dockerPath: string;\n io: SandboxImageCliIo;\n }) => Promise<void>;\n}\n\nconst generatedFileNames = new Set([\n \".dockerignore\",\n \"Dockerfile\",\n \"anvia-sandbox.json\",\n \"package.json\",\n \"pyproject.toml\",\n]);\n\nconst commonAptPackages = [\n { value: \"git\", label: \"Git\", hint: \"Source control and repository operations\" },\n { value: \"curl\", label: \"curl\", hint: \"HTTP downloads and API debugging\" },\n { value: \"jq\", label: \"jq\", hint: \"JSON processing from the shell\" },\n { value: \"ffmpeg\", label: \"FFmpeg\", hint: \"Audio and video processing\" },\n { value: \"imagemagick\", label: \"ImageMagick\", hint: \"Image conversion and editing\" },\n { value: \"poppler-utils\", label: \"Poppler tools\", hint: \"PDF inspection and conversion\" },\n { value: \"libreoffice\", label: \"LibreOffice\", hint: \"Large; office document conversion\" },\n] as const;\n\nconst commonNpmPackages = [\n { value: \"pdfkit@0.19.1\", label: \"PDFKit\", hint: \"Generate PDF documents\" },\n { value: \"sharp@0.35.3\", label: \"Sharp\", hint: \"Resize and transform images\" },\n { value: \"exceljs@4.4.0\", label: \"ExcelJS\", hint: \"Read and write Excel workbooks\" },\n { value: \"docx@9.7.1\", label: \"docx\", hint: \"Generate Word documents\" },\n { value: \"pptxgenjs@4.0.1\", label: \"PptxGenJS\", hint: \"Generate PowerPoint presentations\" },\n] as const;\n\nconst commonUvPackages = [\n { value: \"httpx==0.28.1\", label: \"HTTPX\", hint: \"Modern HTTP client\" },\n { value: \"beautifulsoup4==4.15.0\", label: \"Beautiful Soup\", hint: \"HTML and XML parsing\" },\n { value: \"scipy==1.18.0\", label: \"SciPy\", hint: \"Scientific computing\" },\n { value: \"scikit-learn==1.9.0\", label: \"scikit-learn\", hint: \"Machine learning utilities\" },\n { value: \"polars==1.42.1\", label: \"Polars\", hint: \"Fast dataframe processing\" },\n] as const;\n\nconst defaultIo: SandboxImageCliIo = {\n log: console.log,\n warn: console.warn,\n error: console.error,\n stdout: (chunk) => process.stdout.write(chunk),\n stderr: (chunk) => process.stderr.write(chunk),\n};\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2),\n cwd = process.cwd(),\n io: SandboxImageCliIo = defaultIo,\n dependencies: SandboxImageCliDependencies = {},\n): Promise<number> {\n let options: CliOptions;\n try {\n options = parseArgs(argv);\n } catch (error) {\n io.error(errorMessage(error));\n io.log(helpText());\n return 1;\n }\n\n if (options.help || options.command === undefined) {\n io.log(helpText());\n return 0;\n }\n if (options.command !== \"create-image\") {\n io.error(`Unknown command: ${options.command}`);\n io.log(helpText());\n return 1;\n }\n\n try {\n const shouldPrompt =\n options.name === undefined ||\n (options.runtimes.length === 0 &&\n options.features.length === 0 &&\n options.npm.length === 0 &&\n options.uv.length === 0);\n if (shouldPrompt) {\n const isTTY = dependencies.isTTY ?? (process.stdin.isTTY && process.stdout.isTTY);\n if (!isTTY) {\n throw new Error(\n \"Non-interactive create-image requires --name and at least one --runtime or --feature.\",\n );\n }\n const prompt = dependencies.prompt ?? promptForImage;\n const result = await prompt(options);\n if (result === undefined) return 130;\n options = applyPromptResult(options, result);\n }\n\n const input: SandboxImageInput = {\n name: required(options.name, \"Image name is required.\"),\n runtimes: options.runtimes,\n features: options.features,\n packages: {\n apt: options.apt,\n npm: options.npm,\n uv: options.uv,\n },\n versions: options.versions,\n };\n if (options.tag !== undefined) input.tag = options.tag;\n\n const spec = resolveSandboxImageSpec(input);\n const packageVersion = dependencies.packageVersion ?? (await readPackageVersion());\n const context = renderSandboxImageContext(spec, packageVersion);\n const outputPath = path.resolve(\n cwd,\n options.output ?? path.join(\".anvia\", \"sandbox-images\", spec.name),\n );\n const displayPath = relativeDisplayPath(cwd, outputPath);\n const unpinned = unpinnedSandboxImagePackages(spec);\n if (unpinned.length > 0) {\n io.warn(`Unpinned custom packages may change on rebuild: ${unpinned.join(\", \")}`);\n }\n\n if (options.dryRun) {\n printDryRun(context.files, displayPath, spec.tag, io);\n return 0;\n }\n\n await writeImageContext(outputPath, context.manifest, context.files, options.force);\n io.log(`Created ${displayPath}`);\n\n if (!options.build) {\n io.log(\"\");\n io.log(\"Build later:\");\n io.log(` ${shellCommand([options.dockerPath, \"build\", \"--tag\", spec.tag, displayPath])}`);\n printUsageSnippet(spec.tag, io);\n return 0;\n }\n\n const buildImage = dependencies.buildImage ?? buildDockerImage;\n await buildImage({\n contextPath: outputPath,\n tag: spec.tag,\n dockerPath: options.dockerPath,\n io,\n });\n io.log(`Built ${spec.tag}`);\n printUsageSnippet(spec.tag, io);\n return 0;\n } catch (error) {\n io.error(errorMessage(error));\n return 1;\n }\n}\n\nasync function promptForImage(\n options: Readonly<CliOptions>,\n): Promise<SandboxImagePromptResult | undefined> {\n assertInteractiveNodeVersion();\n const prompts = await import(\"@clack/prompts\");\n prompts.intro(\"Create an Anvia sandbox image\");\n\n const nameResult =\n options.name ??\n (await prompts.text({\n message: \"Image name\",\n placeholder: \"reports\",\n validate: (value) =>\n /^[a-z0-9][a-z0-9-]{0,62}$/.test(value ?? \"\")\n ? undefined\n : \"Use 1-63 lowercase letters, numbers, or hyphens.\",\n }));\n if (prompts.isCancel(nameResult)) return cancelPrompt(prompts);\n const name = promptString(nameResult, \"Image name\");\n\n let runtimes = [...options.runtimes];\n let features = [...options.features];\n if (\n runtimes.length === 0 &&\n features.length === 0 &&\n options.npm.length === 0 &&\n options.uv.length === 0\n ) {\n const capabilities = await prompts.multiselect<SandboxImageRuntime | SandboxImageFeature>({\n message: \"Select runtimes and features\",\n required: true,\n options: [\n { value: \"node\", label: \"Node.js\", hint: \"Includes npm and pnpm\" },\n { value: \"bun\", label: \"Bun\", hint: \"Includes bun and bunx\" },\n { value: \"python\", label: \"Python\", hint: \"Includes uv and uvx\" },\n { value: \"artifacts\", label: \"Reporting and artifacts\", hint: \"Adds Python automatically\" },\n { value: \"playwright\", label: \"Playwright + Chromium\", hint: \"Adds Node.js automatically\" },\n ],\n });\n if (prompts.isCancel(capabilities)) return cancelPrompt(prompts);\n runtimes = capabilities.filter(isRuntime);\n features = capabilities.filter(isFeature);\n }\n\n const aptResult = await selectCommonPackages(\n prompts,\n \"Select common apt tools (optional)\",\n commonAptPackages,\n options.apt,\n );\n if (aptResult === undefined) return cancelPrompt(prompts);\n const npmResult = await selectCommonPackages(\n prompts,\n \"Select common npm libraries (optional)\",\n commonNpmPackages,\n options.npm,\n );\n if (npmResult === undefined) return cancelPrompt(prompts);\n const uvResult = await selectCommonPackages(\n prompts,\n \"Select common Python libraries with uv (optional)\",\n commonUvPackages,\n options.uv,\n );\n if (uvResult === undefined) return cancelPrompt(prompts);\n\n const tagResult =\n options.tag ??\n (await prompts.text({\n message: \"Docker image tag\",\n initialValue: `anvia-sandbox-${name}:latest`,\n }));\n if (prompts.isCancel(tagResult)) return cancelPrompt(prompts);\n const outputResult =\n options.output ??\n (await prompts.text({\n message: \"Generated source directory\",\n initialValue: path.join(\".anvia\", \"sandbox-images\", name),\n }));\n if (prompts.isCancel(outputResult)) return cancelPrompt(prompts);\n\n const buildResult = options.buildExplicit\n ? options.build\n : await prompts.confirm({ message: \"Build the image now?\", initialValue: true });\n if (prompts.isCancel(buildResult)) return cancelPrompt(prompts);\n const confirmed = await prompts.confirm({\n message: \"Create this sandbox image?\",\n initialValue: true,\n });\n if (prompts.isCancel(confirmed) || !confirmed) return cancelPrompt(prompts);\n\n prompts.outro(\"Configuration ready\");\n return {\n name,\n runtimes,\n features,\n apt: aptResult,\n npm: npmResult,\n uv: uvResult,\n tag: promptString(tagResult, \"Docker image tag\"),\n output: promptString(outputResult, \"Generated source directory\"),\n build: promptBoolean(buildResult, \"Build selection\"),\n };\n}\n\nasync function selectCommonPackages(\n prompts: typeof import(\"@clack/prompts\"),\n message: string,\n options: readonly { value: string; label: string; hint: string }[],\n existing: readonly string[],\n): Promise<string[] | undefined> {\n const commonValues = new Set(options.map((option) => option.value));\n const result = await prompts.multiselect<string>({\n message,\n required: false,\n options: [...options],\n initialValues: existing.filter((value) => commonValues.has(value)),\n });\n if (prompts.isCancel(result)) return undefined;\n return [...new Set([...existing, ...result])];\n}\n\nfunction cancelPrompt(prompts: typeof import(\"@clack/prompts\")): undefined {\n prompts.cancel(\"Image creation cancelled.\");\n return undefined;\n}\n\nasync function buildDockerImage(input: {\n contextPath: string;\n tag: string;\n dockerPath: string;\n io: SandboxImageCliIo;\n}): Promise<void> {\n await assertDockerCli([\"build\", \"--tag\", input.tag, input.contextPath], {\n dockerPath: input.dockerPath,\n onStdout: input.io.stdout,\n onStderr: input.io.stderr,\n });\n}\n\nasync function writeImageContext(\n outputPath: string,\n manifest: SandboxImageManifest,\n files: ReadonlyMap<string, string>,\n force: boolean,\n): Promise<void> {\n const outputStat = await safeLstat(outputPath);\n if (outputStat?.isSymbolicLink()) {\n throw new Error(`Refusing to write through symlink: ${outputPath}`);\n }\n\n if (outputStat !== undefined) {\n if (!outputStat.isDirectory()) throw new Error(`Output path is not a directory: ${outputPath}`);\n const previousManifest = await readGeneratedManifest(outputPath);\n if (previousManifest === undefined) {\n throw new Error(\n `Output directory already exists but was not generated by @anvia/sandbox: ${outputPath}`,\n );\n }\n if (!force) throw new Error(`Output directory already exists. Use --force to regenerate it.`);\n\n for (const filename of previousManifest.generatedFiles) {\n const target = path.join(outputPath, filename);\n const targetStat = await safeLstat(target);\n if (targetStat?.isSymbolicLink()) throw new Error(`Refusing to replace symlink: ${target}`);\n if (targetStat !== undefined) await rm(target);\n }\n } else {\n await mkdir(outputPath, { recursive: true });\n }\n\n for (const [filename, content] of files) {\n if (!generatedFileNames.has(filename))\n throw new Error(`Unexpected generated filename: ${filename}`);\n const target = path.join(outputPath, filename);\n const targetStat = await safeLstat(target);\n if (targetStat?.isSymbolicLink()) throw new Error(`Refusing to replace symlink: ${target}`);\n await writeFile(target, content, \"utf8\");\n }\n\n if (!files.has(\"anvia-sandbox.json\") || manifest.generatedFiles.length !== files.size) {\n throw new Error(\"Generated image context manifest is inconsistent.\");\n }\n}\n\nasync function readGeneratedManifest(\n outputPath: string,\n): Promise<SandboxImageManifest | undefined> {\n const manifestPath = path.join(outputPath, \"anvia-sandbox.json\");\n const stat = await safeLstat(manifestPath);\n if (stat === undefined) return undefined;\n if (stat.isSymbolicLink() || !stat.isFile()) {\n throw new Error(`Invalid generated manifest: ${manifestPath}`);\n }\n\n let value: unknown;\n try {\n value = JSON.parse(await readFile(manifestPath, \"utf8\"));\n } catch (error) {\n throw new Error(`Unable to read generated manifest: ${manifestPath}`, { cause: error });\n }\n if (!isGeneratedManifest(value)) {\n throw new Error(\n `Output manifest is not recognized as an @anvia/sandbox manifest: ${manifestPath}`,\n );\n }\n return value;\n}\n\nfunction isGeneratedManifest(value: unknown): value is SandboxImageManifest {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n const generatedBy = record.generatedBy as Record<string, unknown> | undefined;\n const files = record.generatedFiles;\n return (\n record.schemaVersion === 1 &&\n generatedBy?.package === \"@anvia/sandbox\" &&\n Array.isArray(files) &&\n files.every((file) => typeof file === \"string\" && generatedFileNames.has(file))\n );\n}\n\nasync function safeLstat(target: string) {\n try {\n return await lstat(target);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n}\n\nfunction printDryRun(\n files: ReadonlyMap<string, string>,\n outputPath: string,\n tag: string,\n io: SandboxImageCliIo,\n): void {\n io.log(`Would create ${outputPath}`);\n for (const [filename, content] of files) {\n io.log(\"\");\n io.log(`--- ${filename}`);\n io.log(content.trimEnd());\n }\n io.log(\"\");\n io.log(`Would build ${tag}`);\n}\n\nfunction printUsageSnippet(tag: string, io: SandboxImageCliIo): void {\n io.log(\"\");\n io.log(\"Use with @anvia/sandbox:\");\n io.log(' import { DockerSandboxClient } from \"@anvia/sandbox\";');\n io.log(\"\");\n io.log(\" const client = new DockerSandboxClient();\");\n io.log(\" await using sandbox = await client.createSandbox({\");\n io.log(` image: ${JSON.stringify(tag)},`);\n io.log(' workspace: { type: \"ephemeral\" },');\n io.log(' network: { mode: \"none\" },');\n io.log(\" });\");\n}\n\nfunction applyPromptResult(options: CliOptions, result: SandboxImagePromptResult): CliOptions {\n const next: CliOptions = {\n ...options,\n name: result.name,\n runtimes: result.runtimes,\n features: result.features,\n apt: result.apt,\n npm: result.npm,\n uv: result.uv,\n build: result.build,\n buildExplicit: true,\n };\n if (result.tag !== undefined) next.tag = result.tag;\n if (result.output !== undefined) next.output = result.output;\n return next;\n}\n\nfunction parseArgs(argv: string[]): CliOptions {\n const options: CliOptions = {\n runtimes: [],\n features: [],\n apt: [],\n npm: [],\n uv: [],\n versions: {},\n dockerPath: \"docker\",\n build: true,\n buildExplicit: false,\n dryRun: false,\n force: false,\n help: false,\n };\n\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index] ?? \"\";\n if (!argument.startsWith(\"-\")) {\n if (options.command !== undefined) throw new Error(`Unexpected argument: ${argument}`);\n options.command = argument;\n continue;\n }\n\n const [flag, inlineValue] = splitFlag(argument);\n const value = () => inlineValue ?? required(argv[++index], `${flag} requires a value.`);\n switch (flag) {\n case \"-h\":\n case \"--help\":\n options.help = true;\n break;\n case \"--name\":\n options.name = value();\n break;\n case \"--tag\":\n options.tag = value();\n break;\n case \"--output\":\n options.output = value();\n break;\n case \"--runtime\":\n options.runtimes.push(parseRuntime(value()));\n break;\n case \"--feature\":\n options.features.push(parseFeature(value()));\n break;\n case \"--apt\":\n options.apt.push(value());\n break;\n case \"--npm\":\n options.npm.push(value());\n break;\n case \"--uv\":\n options.uv.push(value());\n break;\n case \"--node-version\":\n options.versions.node = value();\n break;\n case \"--pnpm-version\":\n options.versions.pnpm = value();\n break;\n case \"--bun-version\":\n options.versions.bun = value();\n break;\n case \"--python-version\":\n options.versions.python = value();\n break;\n case \"--uv-version\":\n options.versions.uv = value();\n break;\n case \"--playwright-version\":\n options.versions.playwright = value();\n break;\n case \"--docker-path\":\n options.dockerPath = value();\n break;\n case \"--no-build\":\n rejectInlineValue(flag, inlineValue);\n options.build = false;\n options.buildExplicit = true;\n break;\n case \"--dry-run\":\n rejectInlineValue(flag, inlineValue);\n options.dryRun = true;\n break;\n case \"--force\":\n rejectInlineValue(flag, inlineValue);\n options.force = true;\n break;\n default:\n throw new Error(`Unknown option: ${flag}`);\n }\n }\n return options;\n}\n\nfunction splitFlag(argument: string): [string, string | undefined] {\n const separator = argument.indexOf(\"=\");\n return separator === -1\n ? [argument, undefined]\n : [argument.slice(0, separator), argument.slice(separator + 1)];\n}\n\nfunction rejectInlineValue(flag: string, value: string | undefined): void {\n if (value !== undefined) throw new Error(`${flag} does not accept a value.`);\n}\n\nfunction parseRuntime(value: string): SandboxImageRuntime {\n if (isRuntime(value)) return value;\n throw new Error(`Unknown runtime: ${value}. Expected node, bun, or python.`);\n}\n\nfunction parseFeature(value: string): SandboxImageFeature {\n if (isFeature(value)) return value;\n throw new Error(`Unknown feature: ${value}. Expected artifacts or playwright.`);\n}\n\nfunction isRuntime(value: string): value is SandboxImageRuntime {\n return value === \"node\" || value === \"bun\" || value === \"python\";\n}\n\nfunction isFeature(value: string): value is SandboxImageFeature {\n return value === \"artifacts\" || value === \"playwright\";\n}\n\nfunction assertInteractiveNodeVersion(): void {\n const [major = 0, minor = 0] = process.versions.node.split(\".\").map(Number);\n if (major < 20 || (major === 20 && minor < 12)) {\n throw new Error(\"The interactive create-image wizard requires Node.js 20.12 or newer.\");\n }\n}\n\nasync function readPackageVersion(): Promise<string> {\n const packageJson = JSON.parse(\n await readFile(new URL(\"../package.json\", import.meta.url), \"utf8\"),\n ) as {\n version?: unknown;\n };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"unknown\";\n}\n\nfunction relativeDisplayPath(cwd: string, target: string): string {\n const relative = path.relative(cwd, target);\n return relative && !relative.startsWith(\"..\") ? relative : target;\n}\n\nfunction shellCommand(args: readonly string[]): string {\n return args.map(shellArgument).join(\" \");\n}\n\nfunction shellArgument(value: string): string {\n if (/^[a-zA-Z0-9_./:@+-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n\nfunction required<T>(value: T | undefined, message: string): T {\n if (value === undefined || value === \"\") throw new Error(message);\n return value;\n}\n\nfunction promptString(value: unknown, name: string): string {\n if (typeof value !== \"string\") throw new TypeError(`${name} must be a string.`);\n return value;\n}\n\nfunction promptBoolean(value: unknown, name: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`${name} must be a boolean.`);\n return value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Unknown sandbox CLI error\";\n}\n\nfunction helpText(): string {\n return `Usage:\n pnpm dlx @anvia/sandbox create-image [options]\n\nOptions:\n --name <slug> Image profile name\n --runtime <node|bun|python> Runtime to include; repeatable\n --feature <artifacts|playwright>\n Curated feature to include; repeatable\n --apt <package> Additional apt package; repeatable\n --npm <package[@version]> Additional npm package; repeatable\n --uv <requirement> Additional Python package installed with uv; repeatable\n --tag <tag> Local image tag\n --output <directory> Generated context directory\n --node-version <version> Override Node.js version\n --pnpm-version <version> Override pnpm version\n --bun-version <version> Override Bun version\n --python-version <version> Override Python version\n --uv-version <version> Override uv version\n --playwright-version <version> Override Playwright and browser image version\n --docker-path <path> Docker CLI path (default: docker)\n --no-build Generate files without building\n --dry-run Print generated files without writing or building\n --force Regenerate a context previously created by this CLI\n -h, --help Show this help\n\nExamples:\n pnpm dlx @anvia/sandbox create-image\n pnpm dlx @anvia/sandbox create-image --name reports --feature artifacts\n pnpm dlx @anvia/sandbox create-image --name browser --runtime bun --feature playwright`;\n}\n\nconst invokedPath = process.argv[1] === undefined ? undefined : path.resolve(process.argv[1]);\nif (invokedPath !== undefined && invokedPath === fileURLToPath(import.meta.url)) {\n runCli().then((code) => {\n process.exitCode = code;\n });\n}\n","export type SandboxImageRuntime = \"node\" | \"bun\" | \"python\";\nexport type SandboxImageFeature = \"artifacts\" | \"playwright\";\n\nexport interface SandboxImageVersions {\n node: string;\n pnpm: string;\n bun: string;\n python: string;\n uv: string;\n playwright: string;\n}\n\nexport interface SandboxImagePackages {\n apt: string[];\n npm: string[];\n uv: string[];\n}\n\nexport interface SandboxImageInput {\n name: string;\n tag?: string;\n runtimes?: readonly SandboxImageRuntime[];\n features?: readonly SandboxImageFeature[];\n packages?: Partial<SandboxImagePackages>;\n versions?: Partial<SandboxImageVersions>;\n}\n\nexport interface SandboxImageSpec {\n name: string;\n tag: string;\n runtimes: SandboxImageRuntime[];\n features: SandboxImageFeature[];\n packages: SandboxImagePackages;\n versions: SandboxImageVersions;\n}\n\nexport interface SandboxImageManifest extends SandboxImageSpec {\n schemaVersion: 1;\n generatedBy: {\n package: \"@anvia/sandbox\";\n version: string;\n };\n generatedFiles: string[];\n}\n\nexport interface SandboxImageContext {\n manifest: SandboxImageManifest;\n files: ReadonlyMap<string, string>;\n}\n\nexport const defaultSandboxImageVersions: Readonly<SandboxImageVersions> = {\n node: \"24.18.0\",\n pnpm: \"11.0.4\",\n bun: \"1.3.14\",\n python: \"3.13.14\",\n uv: \"0.11.29\",\n playwright: \"1.61.0\",\n};\n\nexport const artifactPythonPackages = [\n \"matplotlib==3.11.1\",\n \"seaborn==0.13.2\",\n \"Pillow==12.3.0\",\n \"ReportLab==5.0.0\",\n \"pypdf==6.14.2\",\n \"pandas==3.0.3\",\n \"openpyxl==3.1.5\",\n \"XlsxWriter==3.2.9\",\n \"python-docx==1.2.0\",\n] as const;\n\nconst runtimeOrder: SandboxImageRuntime[] = [\"node\", \"bun\", \"python\"];\nconst featureOrder: SandboxImageFeature[] = [\"artifacts\", \"playwright\"];\nconst commonAptPackages = [\"bash\", \"ca-certificates\", \"findutils\", \"libstdc++6\", \"procps\"];\n\nexport function resolveSandboxImageSpec(input: SandboxImageInput): SandboxImageSpec {\n validateName(input.name);\n\n const runtimes = new Set(input.runtimes ?? []);\n const features = new Set(input.features ?? []);\n const packages: SandboxImagePackages = {\n apt: unique(input.packages?.apt ?? []),\n npm: unique(input.packages?.npm ?? []),\n uv: unique(input.packages?.uv ?? []),\n };\n\n for (const runtime of runtimes) validateRuntime(runtime);\n for (const feature of features) validateFeature(feature);\n for (const packageName of packages.apt) validateAptPackage(packageName);\n for (const packageSpec of packages.npm) parseNpmPackageSpec(packageSpec);\n for (const requirement of packages.uv) validateUvRequirement(requirement);\n\n if (features.has(\"artifacts\") || packages.uv.length > 0) runtimes.add(\"python\");\n if (features.has(\"playwright\")) runtimes.add(\"node\");\n if (packages.npm.length > 0 && !runtimes.has(\"node\") && !runtimes.has(\"bun\")) {\n runtimes.add(\"node\");\n }\n\n if (runtimes.size === 0) {\n throw new Error(\"Select at least one runtime or feature.\");\n }\n\n const versions = { ...defaultSandboxImageVersions, ...input.versions };\n for (const [name, version] of Object.entries(versions)) validateVersion(name, version);\n\n const tag = input.tag ?? `anvia-sandbox-${input.name}:latest`;\n validateImageTag(tag);\n\n return {\n name: input.name,\n tag,\n runtimes: runtimeOrder.filter((runtime) => runtimes.has(runtime)),\n features: featureOrder.filter((feature) => features.has(feature)),\n packages,\n versions,\n };\n}\n\nexport function renderSandboxImageContext(\n spec: SandboxImageSpec,\n generatorVersion: string,\n): SandboxImageContext {\n const files = new Map<string, string>();\n const pythonRequirements = [...spec.packages.uv];\n if (spec.features.includes(\"artifacts\")) {\n pythonRequirements.unshift(...artifactPythonPackages);\n }\n const npmDependencies = npmDependenciesFor(spec);\n\n files.set(\"Dockerfile\", `${renderDockerfile(spec, pythonRequirements, npmDependencies)}\\n`);\n files.set(\n \".dockerignore\",\n renderDockerignore(pythonRequirements.length > 0, npmDependencies.size > 0),\n );\n\n if (pythonRequirements.length > 0) {\n files.set(\"pyproject.toml\", renderPythonProject(spec, unique(pythonRequirements)));\n }\n if (npmDependencies.size > 0) {\n files.set(\n \"package.json\",\n `${JSON.stringify(\n {\n private: true,\n description: `Generated dependencies for ${spec.name}`,\n dependencies: Object.fromEntries(npmDependencies),\n },\n null,\n 2,\n )}\\n`,\n );\n }\n\n const generatedFiles = [...files.keys(), \"anvia-sandbox.json\"].sort();\n const manifest: SandboxImageManifest = {\n schemaVersion: 1,\n generatedBy: {\n package: \"@anvia/sandbox\",\n version: generatorVersion,\n },\n ...spec,\n generatedFiles,\n };\n files.set(\"anvia-sandbox.json\", `${JSON.stringify(manifest, null, 2)}\\n`);\n\n return { manifest, files };\n}\n\nexport function unpinnedSandboxImagePackages(spec: SandboxImageSpec): string[] {\n const unpinned: string[] = [];\n for (const value of spec.packages.npm) {\n if (parseNpmPackageSpec(value).version === \"latest\") unpinned.push(value);\n }\n for (const value of spec.packages.uv) {\n if (!/===|==|@\\s*https?:/i.test(value)) unpinned.push(value);\n }\n return unpinned;\n}\n\nfunction renderDockerfile(\n spec: SandboxImageSpec,\n pythonRequirements: readonly string[],\n npmDependencies: ReadonlyMap<string, string>,\n): string {\n const hasNode = spec.runtimes.includes(\"node\");\n const hasBun = spec.runtimes.includes(\"bun\");\n const hasPython = spec.runtimes.includes(\"python\");\n const hasPlaywright = spec.features.includes(\"playwright\");\n const lines = [\n \"# Generated by @anvia/sandbox. Edit the manifest and regenerate instead of editing this file.\",\n ];\n\n if (hasNode) lines.push(`FROM node:${spec.versions.node}-bookworm-slim AS node-runtime`);\n if (hasPython) lines.push(`FROM python:${spec.versions.python}-slim-bookworm AS python-runtime`);\n if (hasBun) lines.push(`FROM oven/bun:${spec.versions.bun}-slim AS bun-runtime`);\n if (hasPython) lines.push(`FROM ghcr.io/astral-sh/uv:${spec.versions.uv} AS uv-runtime`);\n\n if (hasPlaywright) {\n lines.push(`FROM mcr.microsoft.com/playwright:v${spec.versions.playwright}-noble AS final`);\n } else if (hasPython) {\n lines.push(\"FROM python-runtime AS final\");\n } else if (hasNode) {\n lines.push(\"FROM node-runtime AS final\");\n } else {\n lines.push(\"FROM bun-runtime AS final\");\n }\n\n lines.push(\"\", \"USER root\");\n\n if (hasPython && (hasPlaywright || !isFinalRuntime(spec, \"python\"))) {\n lines.push(\"COPY --from=python-runtime /usr/local/ /usr/local/\");\n }\n if (hasNode && (hasPlaywright || !isFinalRuntime(spec, \"node\"))) {\n lines.push(\"COPY --from=node-runtime /usr/local/bin/ /usr/local/bin/\");\n lines.push(\n \"COPY --from=node-runtime /usr/local/lib/node_modules/ /usr/local/lib/node_modules/\",\n );\n }\n if (hasBun && !isFinalRuntime(spec, \"bun\")) {\n lines.push(\"COPY --from=bun-runtime /usr/local/bin/bun /usr/local/bin/bun\");\n lines.push(\"RUN ln -sf /usr/local/bin/bun /usr/local/bin/bunx\");\n }\n if (hasPython) {\n lines.push(\"COPY --from=uv-runtime /uv /uvx /usr/local/bin/\");\n }\n\n const requestedAptPackages = [...commonAptPackages];\n if (spec.features.includes(\"artifacts\")) requestedAptPackages.push(\"fonts-dejavu-core\");\n requestedAptPackages.push(...spec.packages.apt);\n const aptPackages = unique(requestedAptPackages).sort();\n lines.push(\n \"\",\n \"RUN apt-get update \\\\\",\n ` && apt-get install -y --no-install-recommends ${aptPackages.map(shellQuote).join(\" \")} \\\\`,\n \" && rm -rf /var/lib/apt/lists/*\",\n );\n\n if (hasNode) {\n lines.push(\n \"\",\n `RUN npm install --global ${shellQuote(`pnpm@${spec.versions.pnpm}`)} --no-audit --no-fund \\\\`,\n \" && npm cache clean --force\",\n );\n }\n\n if (pythonRequirements.length > 0) {\n lines.push(\n \"\",\n \"COPY pyproject.toml /opt/anvia-python/pyproject.toml\",\n \"RUN cd /opt/anvia-python \\\\\",\n \" && uv sync --no-dev --no-cache --no-install-project\",\n \"ENV VIRTUAL_ENV=/opt/anvia-python/.venv\",\n \"ENV PATH=/opt/anvia-python/.venv/bin:$PATH\",\n );\n }\n\n if (npmDependencies.size > 0) {\n lines.push(\"\", \"COPY package.json /opt/anvia-js/package.json\");\n if (hasNode) {\n lines.push(\n \"RUN npm install --prefix /opt/anvia-js --omit=dev --no-audit --no-fund \\\\\",\n \" && ln -s /opt/anvia-js/node_modules /node_modules \\\\\",\n \" && npm cache clean --force\",\n );\n } else {\n lines.push(\n \"RUN cd /opt/anvia-js \\\\\",\n \" && bun install --production --no-save \\\\\",\n \" && ln -s /opt/anvia-js/node_modules /node_modules\",\n );\n }\n lines.push(\"ENV NODE_PATH=/opt/anvia-js/node_modules\");\n lines.push(\"ENV PATH=/opt/anvia-js/node_modules/.bin:$PATH\");\n }\n\n lines.push(\"\");\n if (hasPlaywright) lines.push(\"ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright\");\n lines.push(\n \"RUN mkdir -p /workspace\",\n \"WORKDIR /workspace\",\n \"ENTRYPOINT []\",\n 'CMD [\"sh\", \"-c\", \"trap \\'exit 0\\' TERM INT; while :; do sleep 3600 & wait $!; done\"]',\n );\n\n return lines.join(\"\\n\");\n}\n\nfunction renderDockerignore(hasPython: boolean, hasNpm: boolean): string {\n const lines = [\"**\", \"!Dockerfile\", \"!.dockerignore\", \"!anvia-sandbox.json\"];\n if (hasPython) lines.push(\"!pyproject.toml\");\n if (hasNpm) lines.push(\"!package.json\");\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderPythonProject(spec: SandboxImageSpec, requirements: readonly string[]): string {\n const [major, minor] = spec.versions.python.split(\".\");\n return [\n \"[project]\",\n `name = ${JSON.stringify(`anvia-sandbox-${spec.name}`)}`,\n 'version = \"0.0.0\"',\n `requires-python = ${JSON.stringify(`>=${major}.${minor}`)}`,\n \"dependencies = [\",\n ...requirements.map((requirement) => ` ${JSON.stringify(requirement)},`),\n \"]\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction npmDependenciesFor(spec: SandboxImageSpec): Map<string, string> {\n const dependencies = new Map<string, string>();\n if (spec.features.includes(\"playwright\")) {\n dependencies.set(\"playwright\", spec.versions.playwright);\n }\n for (const packageSpec of spec.packages.npm) {\n const parsed = parseNpmPackageSpec(packageSpec);\n if (dependencies.has(parsed.name)) {\n throw new Error(`Duplicate npm package: ${parsed.name}`);\n }\n dependencies.set(parsed.name, parsed.version);\n }\n return new Map([...dependencies.entries()].sort(([left], [right]) => left.localeCompare(right)));\n}\n\nfunction isFinalRuntime(spec: SandboxImageSpec, runtime: SandboxImageRuntime): boolean {\n if (spec.features.includes(\"playwright\")) return false;\n if (spec.runtimes.includes(\"python\")) return runtime === \"python\";\n if (spec.runtimes.includes(\"node\")) return runtime === \"node\";\n return runtime === \"bun\";\n}\n\nfunction validateName(name: string): void {\n if (!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name)) {\n throw new Error(\n \"Image name must be 1-63 lowercase letters, numbers, or hyphens and cannot start with a hyphen.\",\n );\n }\n}\n\nfunction validateRuntime(runtime: string): asserts runtime is SandboxImageRuntime {\n if (!runtimeOrder.includes(runtime as SandboxImageRuntime)) {\n throw new Error(`Unknown runtime: ${runtime}. Expected node, bun, or python.`);\n }\n}\n\nfunction validateFeature(feature: string): asserts feature is SandboxImageFeature {\n if (!featureOrder.includes(feature as SandboxImageFeature)) {\n throw new Error(`Unknown feature: ${feature}. Expected artifacts or playwright.`);\n }\n}\n\nfunction validateAptPackage(packageName: string): void {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9.+:~=-]*$/.test(packageName)) {\n throw new Error(`Invalid apt package: ${packageName}`);\n }\n}\n\nfunction parseNpmPackageSpec(packageSpec: string): { name: string; version: string } {\n if (/\\s/.test(packageSpec) || hasControlCharacter(packageSpec)) {\n throw new Error(`Invalid npm package spec: ${packageSpec}`);\n }\n\n const separator = packageSpec.startsWith(\"@\")\n ? packageSpec.indexOf(\"@\", packageSpec.indexOf(\"/\") + 1)\n : packageSpec.indexOf(\"@\");\n const name = separator === -1 ? packageSpec : packageSpec.slice(0, separator);\n const version = separator === -1 ? \"latest\" : packageSpec.slice(separator + 1);\n\n if (!/^(?:@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/i.test(name) || !version) {\n throw new Error(`Invalid npm package spec: ${packageSpec}`);\n }\n if (/[\\s'\"`$;&|<>\\\\]/.test(version) || hasControlCharacter(version)) {\n throw new Error(`Invalid npm package version in: ${packageSpec}`);\n }\n return { name, version };\n}\n\nfunction validateUvRequirement(requirement: string): void {\n if (!requirement || requirement.startsWith(\"-\") || hasControlCharacter(requirement)) {\n throw new Error(`Invalid uv package requirement: ${requirement}`);\n }\n}\n\nfunction validateVersion(name: string, version: string): void {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(version)) {\n throw new Error(`Invalid ${name} version: ${version}`);\n }\n}\n\nfunction validateImageTag(tag: string): void {\n if (\n !tag ||\n tag.startsWith(\"-\") ||\n tag.includes(\"@\") ||\n /\\s/.test(tag) ||\n hasControlCharacter(tag)\n ) {\n throw new Error(`Invalid Docker image tag: ${tag}`);\n }\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return [...value].some((character) => character.charCodeAt(0) < 32);\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n"],"mappings":"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","names":["commonAptPackages"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/image-builder.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { lstat, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { assertDockerCli } from \"./docker-cli\";\nimport {\n renderSandboxImageContext,\n resolveSandboxImageSpec,\n type SandboxImageFeature,\n type SandboxImageInput,\n type SandboxImageManifest,\n type SandboxImageRuntime,\n type SandboxImageVersions,\n unpinnedSandboxImagePackages,\n} from \"./image-builder\";\n\ninterface CliOptions {\n command?: string;\n name?: string;\n tag?: string;\n output?: string;\n runtimes: SandboxImageRuntime[];\n features: SandboxImageFeature[];\n apt: string[];\n npm: string[];\n uv: string[];\n versions: Partial<SandboxImageVersions>;\n dockerPath: string;\n build: boolean;\n buildExplicit: boolean;\n dryRun: boolean;\n force: boolean;\n help: boolean;\n}\n\nexport interface SandboxImageCliIo {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n stdout(chunk: Uint8Array): void;\n stderr(chunk: Uint8Array): void;\n}\n\nexport interface SandboxImagePromptResult {\n name: string;\n runtimes: SandboxImageRuntime[];\n features: SandboxImageFeature[];\n apt: string[];\n npm: string[];\n uv: string[];\n tag?: string;\n output?: string;\n build: boolean;\n}\n\nexport interface SandboxImageCliDependencies {\n isTTY?: boolean;\n packageVersion?: string;\n prompt?: (options: Readonly<CliOptions>) => Promise<SandboxImagePromptResult | undefined>;\n buildImage?: (input: {\n contextPath: string;\n tag: string;\n dockerPath: string;\n io: SandboxImageCliIo;\n }) => Promise<void>;\n}\n\nconst generatedFileNames = new Set([\n \".dockerignore\",\n \"Dockerfile\",\n \"anvia-sandbox.json\",\n \"package.json\",\n \"pyproject.toml\",\n]);\n\nconst commonAptPackages = [\n { value: \"git\", label: \"Git\", hint: \"Source control and repository operations\" },\n { value: \"curl\", label: \"curl\", hint: \"HTTP downloads and API debugging\" },\n { value: \"jq\", label: \"jq\", hint: \"JSON processing from the shell\" },\n { value: \"ffmpeg\", label: \"FFmpeg\", hint: \"Audio and video processing\" },\n { value: \"imagemagick\", label: \"ImageMagick\", hint: \"Image conversion and editing\" },\n { value: \"poppler-utils\", label: \"Poppler tools\", hint: \"PDF inspection and conversion\" },\n { value: \"libreoffice\", label: \"LibreOffice\", hint: \"Large; office document conversion\" },\n] as const;\n\nconst commonNpmPackages = [\n { value: \"pdfkit@0.19.1\", label: \"PDFKit\", hint: \"Generate PDF documents\" },\n { value: \"sharp@0.35.3\", label: \"Sharp\", hint: \"Resize and transform images\" },\n { value: \"exceljs@4.4.0\", label: \"ExcelJS\", hint: \"Read and write Excel workbooks\" },\n { value: \"docx@9.7.1\", label: \"docx\", hint: \"Generate Word documents\" },\n { value: \"pptxgenjs@4.0.1\", label: \"PptxGenJS\", hint: \"Generate PowerPoint presentations\" },\n] as const;\n\nconst commonUvPackages = [\n { value: \"httpx==0.28.1\", label: \"HTTPX\", hint: \"Modern HTTP client\" },\n { value: \"beautifulsoup4==4.15.0\", label: \"Beautiful Soup\", hint: \"HTML and XML parsing\" },\n { value: \"scipy==1.18.0\", label: \"SciPy\", hint: \"Scientific computing\" },\n { value: \"scikit-learn==1.9.0\", label: \"scikit-learn\", hint: \"Machine learning utilities\" },\n { value: \"polars==1.42.1\", label: \"Polars\", hint: \"Fast dataframe processing\" },\n] as const;\n\nconst defaultIo: SandboxImageCliIo = {\n log: console.log,\n warn: console.warn,\n error: console.error,\n stdout: (chunk) => process.stdout.write(chunk),\n stderr: (chunk) => process.stderr.write(chunk),\n};\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2),\n cwd = process.cwd(),\n io: SandboxImageCliIo = defaultIo,\n dependencies: SandboxImageCliDependencies = {},\n): Promise<number> {\n let options: CliOptions;\n try {\n options = parseArgs(argv);\n } catch (error) {\n io.error(errorMessage(error));\n io.log(helpText());\n return 1;\n }\n\n if (options.help || options.command === undefined) {\n io.log(helpText());\n return 0;\n }\n if (options.command !== \"create-image\") {\n io.error(`Unknown command: ${options.command}`);\n io.log(helpText());\n return 1;\n }\n\n try {\n const shouldPrompt =\n options.name === undefined ||\n (options.runtimes.length === 0 &&\n options.features.length === 0 &&\n options.npm.length === 0 &&\n options.uv.length === 0);\n if (shouldPrompt) {\n const isTTY = dependencies.isTTY ?? (process.stdin.isTTY && process.stdout.isTTY);\n if (!isTTY) {\n throw new Error(\n \"Non-interactive create-image requires --name and at least one --runtime or --feature.\",\n );\n }\n const prompt = dependencies.prompt ?? promptForImage;\n const result = await prompt(options);\n if (result === undefined) return 130;\n options = applyPromptResult(options, result);\n }\n\n const input: SandboxImageInput = {\n name: required(options.name, \"Image name is required.\"),\n runtimes: options.runtimes,\n features: options.features,\n packages: {\n apt: options.apt,\n npm: options.npm,\n uv: options.uv,\n },\n versions: options.versions,\n };\n if (options.tag !== undefined) input.tag = options.tag;\n\n const spec = resolveSandboxImageSpec(input);\n const packageVersion = dependencies.packageVersion ?? (await readPackageVersion());\n const context = renderSandboxImageContext(spec, packageVersion);\n const outputPath = path.resolve(\n cwd,\n options.output ?? path.join(\".anvia\", \"sandbox-images\", spec.name),\n );\n const displayPath = relativeDisplayPath(cwd, outputPath);\n const unpinned = unpinnedSandboxImagePackages(spec);\n if (unpinned.length > 0) {\n io.warn(`Unpinned custom packages may change on rebuild: ${unpinned.join(\", \")}`);\n }\n\n if (options.dryRun) {\n printDryRun(context.files, displayPath, spec.tag, io);\n return 0;\n }\n\n await writeImageContext(outputPath, context.manifest, context.files, options.force);\n io.log(`Created ${displayPath}`);\n\n if (!options.build) {\n io.log(\"\");\n io.log(\"Build later:\");\n io.log(` ${shellCommand([options.dockerPath, \"build\", \"--tag\", spec.tag, displayPath])}`);\n printUsageSnippet(spec.tag, io);\n return 0;\n }\n\n const buildImage = dependencies.buildImage ?? buildDockerImage;\n await buildImage({\n contextPath: outputPath,\n tag: spec.tag,\n dockerPath: options.dockerPath,\n io,\n });\n io.log(`Built ${spec.tag}`);\n printUsageSnippet(spec.tag, io);\n return 0;\n } catch (error) {\n io.error(errorMessage(error));\n return 1;\n }\n}\n\nasync function promptForImage(\n options: Readonly<CliOptions>,\n): Promise<SandboxImagePromptResult | undefined> {\n assertInteractiveNodeVersion();\n const prompts = await import(\"@clack/prompts\");\n prompts.intro(\"Create an Anvia sandbox image\");\n\n const nameResult =\n options.name ??\n (await prompts.text({\n message: \"Image name\",\n placeholder: \"reports\",\n validate: (value) =>\n /^[a-z0-9][a-z0-9-]{0,62}$/.test(value ?? \"\")\n ? undefined\n : \"Use 1-63 lowercase letters, numbers, or hyphens.\",\n }));\n if (prompts.isCancel(nameResult)) return cancelPrompt(prompts);\n const name = promptString(nameResult, \"Image name\");\n\n let runtimes = [...options.runtimes];\n let features = [...options.features];\n if (\n runtimes.length === 0 &&\n features.length === 0 &&\n options.npm.length === 0 &&\n options.uv.length === 0\n ) {\n const capabilities = await prompts.multiselect<SandboxImageRuntime | SandboxImageFeature>({\n message: \"Select runtimes and features\",\n required: true,\n options: [\n { value: \"node\", label: \"Node.js\", hint: \"Includes npm and pnpm\" },\n { value: \"bun\", label: \"Bun\", hint: \"Includes bun and bunx\" },\n { value: \"python\", label: \"Python\", hint: \"Includes uv and uvx\" },\n { value: \"artifacts\", label: \"Reporting and artifacts\", hint: \"Adds Python automatically\" },\n { value: \"playwright\", label: \"Playwright + Chromium\", hint: \"Adds Node.js automatically\" },\n ],\n });\n if (prompts.isCancel(capabilities)) return cancelPrompt(prompts);\n runtimes = capabilities.filter(isRuntime);\n features = capabilities.filter(isFeature);\n }\n\n const aptResult = await selectCommonPackages(\n prompts,\n \"Select common apt tools (optional)\",\n commonAptPackages,\n options.apt,\n );\n if (aptResult === undefined) return cancelPrompt(prompts);\n const npmResult = await selectCommonPackages(\n prompts,\n \"Select common npm libraries (optional)\",\n commonNpmPackages,\n options.npm,\n );\n if (npmResult === undefined) return cancelPrompt(prompts);\n const uvResult = await selectCommonPackages(\n prompts,\n \"Select common Python libraries with uv (optional)\",\n commonUvPackages,\n options.uv,\n );\n if (uvResult === undefined) return cancelPrompt(prompts);\n\n const tagResult =\n options.tag ??\n (await prompts.text({\n message: \"Docker image tag\",\n initialValue: `anvia-sandbox-${name}:latest`,\n }));\n if (prompts.isCancel(tagResult)) return cancelPrompt(prompts);\n const outputResult =\n options.output ??\n (await prompts.text({\n message: \"Generated source directory\",\n initialValue: path.join(\".anvia\", \"sandbox-images\", name),\n }));\n if (prompts.isCancel(outputResult)) return cancelPrompt(prompts);\n\n const buildResult = options.buildExplicit\n ? options.build\n : await prompts.confirm({ message: \"Build the image now?\", initialValue: true });\n if (prompts.isCancel(buildResult)) return cancelPrompt(prompts);\n const confirmed = await prompts.confirm({\n message: \"Create this sandbox image?\",\n initialValue: true,\n });\n if (prompts.isCancel(confirmed) || !confirmed) return cancelPrompt(prompts);\n\n prompts.outro(\"Configuration ready\");\n return {\n name,\n runtimes,\n features,\n apt: aptResult,\n npm: npmResult,\n uv: uvResult,\n tag: promptString(tagResult, \"Docker image tag\"),\n output: promptString(outputResult, \"Generated source directory\"),\n build: promptBoolean(buildResult, \"Build selection\"),\n };\n}\n\nasync function selectCommonPackages(\n prompts: typeof import(\"@clack/prompts\"),\n message: string,\n options: readonly { value: string; label: string; hint: string }[],\n existing: readonly string[],\n): Promise<string[] | undefined> {\n const commonValues = new Set(options.map((option) => option.value));\n const result = await prompts.multiselect<string>({\n message,\n required: false,\n options: [...options],\n initialValues: existing.filter((value) => commonValues.has(value)),\n });\n if (prompts.isCancel(result)) return undefined;\n return [...new Set([...existing, ...result])];\n}\n\nfunction cancelPrompt(prompts: typeof import(\"@clack/prompts\")): undefined {\n prompts.cancel(\"Image creation cancelled.\");\n return undefined;\n}\n\nasync function buildDockerImage(input: {\n contextPath: string;\n tag: string;\n dockerPath: string;\n io: SandboxImageCliIo;\n}): Promise<void> {\n await assertDockerCli([\"build\", \"--tag\", input.tag, input.contextPath], {\n dockerPath: input.dockerPath,\n onStdout: input.io.stdout,\n onStderr: input.io.stderr,\n });\n}\n\nasync function writeImageContext(\n outputPath: string,\n manifest: SandboxImageManifest,\n files: ReadonlyMap<string, string>,\n force: boolean,\n): Promise<void> {\n const outputStat = await safeLstat(outputPath);\n if (outputStat?.isSymbolicLink()) {\n throw new Error(`Refusing to write through symlink: ${outputPath}`);\n }\n\n if (outputStat !== undefined) {\n if (!outputStat.isDirectory()) throw new Error(`Output path is not a directory: ${outputPath}`);\n const previousManifest = await readGeneratedManifest(outputPath);\n if (previousManifest === undefined) {\n throw new Error(\n `Output directory already exists but was not generated by @anvia/sandbox: ${outputPath}`,\n );\n }\n if (!force) throw new Error(`Output directory already exists. Use --force to regenerate it.`);\n\n for (const filename of previousManifest.generatedFiles) {\n const target = path.join(outputPath, filename);\n const targetStat = await safeLstat(target);\n if (targetStat?.isSymbolicLink()) throw new Error(`Refusing to replace symlink: ${target}`);\n if (targetStat !== undefined) await rm(target);\n }\n } else {\n await mkdir(outputPath, { recursive: true });\n }\n\n for (const [filename, content] of files) {\n if (!generatedFileNames.has(filename))\n throw new Error(`Unexpected generated filename: ${filename}`);\n const target = path.join(outputPath, filename);\n const targetStat = await safeLstat(target);\n if (targetStat?.isSymbolicLink()) throw new Error(`Refusing to replace symlink: ${target}`);\n await writeFile(target, content, \"utf8\");\n }\n\n if (!files.has(\"anvia-sandbox.json\") || manifest.generatedFiles.length !== files.size) {\n throw new Error(\"Generated image context manifest is inconsistent.\");\n }\n}\n\nasync function readGeneratedManifest(\n outputPath: string,\n): Promise<SandboxImageManifest | undefined> {\n const manifestPath = path.join(outputPath, \"anvia-sandbox.json\");\n const stat = await safeLstat(manifestPath);\n if (stat === undefined) return undefined;\n if (stat.isSymbolicLink() || !stat.isFile()) {\n throw new Error(`Invalid generated manifest: ${manifestPath}`);\n }\n\n let value: unknown;\n try {\n value = JSON.parse(await readFile(manifestPath, \"utf8\"));\n } catch (error) {\n throw new Error(`Unable to read generated manifest: ${manifestPath}`, { cause: error });\n }\n if (!isGeneratedManifest(value)) {\n throw new Error(\n `Output manifest is not recognized as an @anvia/sandbox manifest: ${manifestPath}`,\n );\n }\n return value;\n}\n\nfunction isGeneratedManifest(value: unknown): value is SandboxImageManifest {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n const generatedBy = record.generatedBy as Record<string, unknown> | undefined;\n const files = record.generatedFiles;\n return (\n record.schemaVersion === 1 &&\n generatedBy?.package === \"@anvia/sandbox\" &&\n Array.isArray(files) &&\n files.every((file) => typeof file === \"string\" && generatedFileNames.has(file))\n );\n}\n\nasync function safeLstat(target: string) {\n try {\n return await lstat(target);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n}\n\nfunction printDryRun(\n files: ReadonlyMap<string, string>,\n outputPath: string,\n tag: string,\n io: SandboxImageCliIo,\n): void {\n io.log(`Would create ${outputPath}`);\n for (const [filename, content] of files) {\n io.log(\"\");\n io.log(`--- ${filename}`);\n io.log(content.trimEnd());\n }\n io.log(\"\");\n io.log(`Would build ${tag}`);\n}\n\nfunction printUsageSnippet(tag: string, io: SandboxImageCliIo): void {\n io.log(\"\");\n io.log(\"Use with @anvia/sandbox:\");\n io.log(' import { DockerSandboxClient } from \"@anvia/sandbox\";');\n io.log(\"\");\n io.log(\" const client = new DockerSandboxClient();\");\n io.log(\" await using sandbox = await client.createSandbox({\");\n io.log(` image: ${JSON.stringify(tag)},`);\n io.log(' workspace: { type: \"ephemeral\" },');\n io.log(' network: { mode: \"none\" },');\n io.log(\" });\");\n}\n\nfunction applyPromptResult(options: CliOptions, result: SandboxImagePromptResult): CliOptions {\n const next: CliOptions = {\n ...options,\n name: result.name,\n runtimes: result.runtimes,\n features: result.features,\n apt: result.apt,\n npm: result.npm,\n uv: result.uv,\n build: result.build,\n buildExplicit: true,\n };\n if (result.tag !== undefined) next.tag = result.tag;\n if (result.output !== undefined) next.output = result.output;\n return next;\n}\n\nfunction parseArgs(argv: string[]): CliOptions {\n const options: CliOptions = {\n runtimes: [],\n features: [],\n apt: [],\n npm: [],\n uv: [],\n versions: {},\n dockerPath: \"docker\",\n build: true,\n buildExplicit: false,\n dryRun: false,\n force: false,\n help: false,\n };\n\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index] ?? \"\";\n if (!argument.startsWith(\"-\")) {\n if (options.command !== undefined) throw new Error(`Unexpected argument: ${argument}`);\n options.command = argument;\n continue;\n }\n\n const [flag, inlineValue] = splitFlag(argument);\n const value = () => inlineValue ?? required(argv[++index], `${flag} requires a value.`);\n switch (flag) {\n case \"-h\":\n case \"--help\":\n options.help = true;\n break;\n case \"--name\":\n options.name = value();\n break;\n case \"--tag\":\n options.tag = value();\n break;\n case \"--output\":\n options.output = value();\n break;\n case \"--runtime\":\n options.runtimes.push(parseRuntime(value()));\n break;\n case \"--feature\":\n options.features.push(parseFeature(value()));\n break;\n case \"--apt\":\n options.apt.push(value());\n break;\n case \"--npm\":\n options.npm.push(value());\n break;\n case \"--uv\":\n options.uv.push(value());\n break;\n case \"--node-version\":\n options.versions.node = value();\n break;\n case \"--pnpm-version\":\n options.versions.pnpm = value();\n break;\n case \"--bun-version\":\n options.versions.bun = value();\n break;\n case \"--python-version\":\n options.versions.python = value();\n break;\n case \"--uv-version\":\n options.versions.uv = value();\n break;\n case \"--playwright-version\":\n options.versions.playwright = value();\n break;\n case \"--docker-path\":\n options.dockerPath = value();\n break;\n case \"--no-build\":\n rejectInlineValue(flag, inlineValue);\n options.build = false;\n options.buildExplicit = true;\n break;\n case \"--dry-run\":\n rejectInlineValue(flag, inlineValue);\n options.dryRun = true;\n break;\n case \"--force\":\n rejectInlineValue(flag, inlineValue);\n options.force = true;\n break;\n default:\n throw new Error(`Unknown option: ${flag}`);\n }\n }\n return options;\n}\n\nfunction splitFlag(argument: string): [string, string | undefined] {\n const separator = argument.indexOf(\"=\");\n return separator === -1\n ? [argument, undefined]\n : [argument.slice(0, separator), argument.slice(separator + 1)];\n}\n\nfunction rejectInlineValue(flag: string, value: string | undefined): void {\n if (value !== undefined) throw new Error(`${flag} does not accept a value.`);\n}\n\nfunction parseRuntime(value: string): SandboxImageRuntime {\n if (isRuntime(value)) return value;\n throw new Error(`Unknown runtime: ${value}. Expected node, bun, or python.`);\n}\n\nfunction parseFeature(value: string): SandboxImageFeature {\n if (isFeature(value)) return value;\n throw new Error(`Unknown feature: ${value}. Expected artifacts or playwright.`);\n}\n\nfunction isRuntime(value: string): value is SandboxImageRuntime {\n return value === \"node\" || value === \"bun\" || value === \"python\";\n}\n\nfunction isFeature(value: string): value is SandboxImageFeature {\n return value === \"artifacts\" || value === \"playwright\";\n}\n\nfunction assertInteractiveNodeVersion(): void {\n const [major = 0, minor = 0] = process.versions.node.split(\".\").map(Number);\n if (major < 20 || (major === 20 && minor < 12)) {\n throw new Error(\"The interactive create-image wizard requires Node.js 20.12 or newer.\");\n }\n}\n\nasync function readPackageVersion(): Promise<string> {\n const packageJson = JSON.parse(\n await readFile(new URL(\"../package.json\", import.meta.url), \"utf8\"),\n ) as {\n version?: unknown;\n };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"unknown\";\n}\n\nfunction relativeDisplayPath(cwd: string, target: string): string {\n const relative = path.relative(cwd, target);\n return relative && !relative.startsWith(\"..\") ? relative : target;\n}\n\nfunction shellCommand(args: readonly string[]): string {\n return args.map(shellArgument).join(\" \");\n}\n\nfunction shellArgument(value: string): string {\n if (/^[a-zA-Z0-9_./:@+-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n\nfunction required<T>(value: T | undefined, message: string): T {\n if (value === undefined || value === \"\") throw new Error(message);\n return value;\n}\n\nfunction promptString(value: unknown, name: string): string {\n if (typeof value !== \"string\") throw new TypeError(`${name} must be a string.`);\n return value;\n}\n\nfunction promptBoolean(value: unknown, name: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`${name} must be a boolean.`);\n return value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Unknown sandbox CLI error\";\n}\n\nfunction helpText(): string {\n return `Usage:\n pnpm dlx @anvia/sandbox create-image [options]\n\nOptions:\n --name <slug> Image profile name\n --runtime <node|bun|python> Runtime to include; repeatable\n --feature <artifacts|playwright>\n Curated feature to include; repeatable\n --apt <package> Additional apt package; repeatable\n --npm <package[@version]> Additional npm package; repeatable\n --uv <requirement> Additional Python package installed with uv; repeatable\n --tag <tag> Local image tag\n --output <directory> Generated context directory\n --node-version <version> Override Node.js version\n --pnpm-version <version> Override pnpm version\n --bun-version <version> Override Bun version\n --python-version <version> Override Python version\n --uv-version <version> Override uv version\n --playwright-version <version> Override Playwright and browser image version\n --docker-path <path> Docker CLI path (default: docker)\n --no-build Generate files without building\n --dry-run Print generated files without writing or building\n --force Regenerate a context previously created by this CLI\n -h, --help Show this help\n\nExamples:\n pnpm dlx @anvia/sandbox create-image\n pnpm dlx @anvia/sandbox create-image --name reports --feature artifacts\n pnpm dlx @anvia/sandbox create-image --name browser --runtime bun --feature playwright`;\n}\n\nconst invokedPath = process.argv[1] === undefined ? undefined : path.resolve(process.argv[1]);\nif (invokedPath !== undefined && invokedPath === fileURLToPath(import.meta.url)) {\n runCli().then((code) => {\n process.exitCode = code;\n });\n}\n","export type SandboxImageRuntime = \"node\" | \"bun\" | \"python\";\nexport type SandboxImageFeature = \"artifacts\" | \"playwright\";\n\nexport interface SandboxImageVersions {\n node: string;\n pnpm: string;\n bun: string;\n python: string;\n uv: string;\n playwright: string;\n}\n\nexport interface SandboxImagePackages {\n apt: string[];\n npm: string[];\n uv: string[];\n}\n\nexport interface SandboxImageInput {\n name: string;\n tag?: string;\n runtimes?: readonly SandboxImageRuntime[];\n features?: readonly SandboxImageFeature[];\n packages?: Partial<SandboxImagePackages>;\n versions?: Partial<SandboxImageVersions>;\n}\n\nexport interface SandboxImageSpec {\n name: string;\n tag: string;\n runtimes: SandboxImageRuntime[];\n features: SandboxImageFeature[];\n packages: SandboxImagePackages;\n versions: SandboxImageVersions;\n}\n\nexport interface SandboxImageManifest extends SandboxImageSpec {\n schemaVersion: 1;\n generatedBy: {\n package: \"@anvia/sandbox\";\n version: string;\n };\n generatedFiles: string[];\n}\n\nexport interface SandboxImageContext {\n manifest: SandboxImageManifest;\n files: ReadonlyMap<string, string>;\n}\n\nexport const defaultSandboxImageVersions: Readonly<SandboxImageVersions> = {\n node: \"24.18.0\",\n pnpm: \"11.0.4\",\n bun: \"1.3.14\",\n python: \"3.13.14\",\n uv: \"0.11.29\",\n playwright: \"1.62.1\",\n};\n\nexport const artifactPythonPackages = [\n \"matplotlib==3.11.1\",\n \"seaborn==0.13.2\",\n \"Pillow==12.3.0\",\n \"ReportLab==5.0.0\",\n \"pypdf==6.14.2\",\n \"pandas==3.0.3\",\n \"openpyxl==3.1.5\",\n \"XlsxWriter==3.2.9\",\n \"python-docx==1.2.0\",\n] as const;\n\nconst runtimeOrder: SandboxImageRuntime[] = [\"node\", \"bun\", \"python\"];\nconst featureOrder: SandboxImageFeature[] = [\"artifacts\", \"playwright\"];\nconst commonAptPackages = [\"bash\", \"ca-certificates\", \"findutils\", \"libstdc++6\", \"procps\"];\n\nexport function resolveSandboxImageSpec(input: SandboxImageInput): SandboxImageSpec {\n validateName(input.name);\n\n const runtimes = new Set(input.runtimes ?? []);\n const features = new Set(input.features ?? []);\n const packages: SandboxImagePackages = {\n apt: unique(input.packages?.apt ?? []),\n npm: unique(input.packages?.npm ?? []),\n uv: unique(input.packages?.uv ?? []),\n };\n\n for (const runtime of runtimes) validateRuntime(runtime);\n for (const feature of features) validateFeature(feature);\n for (const packageName of packages.apt) validateAptPackage(packageName);\n for (const packageSpec of packages.npm) parseNpmPackageSpec(packageSpec);\n for (const requirement of packages.uv) validateUvRequirement(requirement);\n\n if (features.has(\"artifacts\") || packages.uv.length > 0) runtimes.add(\"python\");\n if (features.has(\"playwright\")) runtimes.add(\"node\");\n if (packages.npm.length > 0 && !runtimes.has(\"node\") && !runtimes.has(\"bun\")) {\n runtimes.add(\"node\");\n }\n\n if (runtimes.size === 0) {\n throw new Error(\"Select at least one runtime or feature.\");\n }\n\n const versions = { ...defaultSandboxImageVersions, ...input.versions };\n for (const [name, version] of Object.entries(versions)) validateVersion(name, version);\n\n const tag = input.tag ?? `anvia-sandbox-${input.name}:latest`;\n validateImageTag(tag);\n\n return {\n name: input.name,\n tag,\n runtimes: runtimeOrder.filter((runtime) => runtimes.has(runtime)),\n features: featureOrder.filter((feature) => features.has(feature)),\n packages,\n versions,\n };\n}\n\nexport function renderSandboxImageContext(\n spec: SandboxImageSpec,\n generatorVersion: string,\n): SandboxImageContext {\n const files = new Map<string, string>();\n const pythonRequirements = [...spec.packages.uv];\n if (spec.features.includes(\"artifacts\")) {\n pythonRequirements.unshift(...artifactPythonPackages);\n }\n const npmDependencies = npmDependenciesFor(spec);\n\n files.set(\"Dockerfile\", `${renderDockerfile(spec, pythonRequirements, npmDependencies)}\\n`);\n files.set(\n \".dockerignore\",\n renderDockerignore(pythonRequirements.length > 0, npmDependencies.size > 0),\n );\n\n if (pythonRequirements.length > 0) {\n files.set(\"pyproject.toml\", renderPythonProject(spec, unique(pythonRequirements)));\n }\n if (npmDependencies.size > 0) {\n files.set(\n \"package.json\",\n `${JSON.stringify(\n {\n private: true,\n description: `Generated dependencies for ${spec.name}`,\n dependencies: Object.fromEntries(npmDependencies),\n },\n null,\n 2,\n )}\\n`,\n );\n }\n\n const generatedFiles = [...files.keys(), \"anvia-sandbox.json\"].sort();\n const manifest: SandboxImageManifest = {\n schemaVersion: 1,\n generatedBy: {\n package: \"@anvia/sandbox\",\n version: generatorVersion,\n },\n ...spec,\n generatedFiles,\n };\n files.set(\"anvia-sandbox.json\", `${JSON.stringify(manifest, null, 2)}\\n`);\n\n return { manifest, files };\n}\n\nexport function unpinnedSandboxImagePackages(spec: SandboxImageSpec): string[] {\n const unpinned: string[] = [];\n for (const value of spec.packages.npm) {\n if (parseNpmPackageSpec(value).version === \"latest\") unpinned.push(value);\n }\n for (const value of spec.packages.uv) {\n if (!/===|==|@\\s*https?:/i.test(value)) unpinned.push(value);\n }\n return unpinned;\n}\n\nfunction renderDockerfile(\n spec: SandboxImageSpec,\n pythonRequirements: readonly string[],\n npmDependencies: ReadonlyMap<string, string>,\n): string {\n const hasNode = spec.runtimes.includes(\"node\");\n const hasBun = spec.runtimes.includes(\"bun\");\n const hasPython = spec.runtimes.includes(\"python\");\n const hasPlaywright = spec.features.includes(\"playwright\");\n const lines = [\n \"# Generated by @anvia/sandbox. Edit the manifest and regenerate instead of editing this file.\",\n ];\n\n if (hasNode) lines.push(`FROM node:${spec.versions.node}-bookworm-slim AS node-runtime`);\n if (hasPython) lines.push(`FROM python:${spec.versions.python}-slim-bookworm AS python-runtime`);\n if (hasBun) lines.push(`FROM oven/bun:${spec.versions.bun}-slim AS bun-runtime`);\n if (hasPython) lines.push(`FROM ghcr.io/astral-sh/uv:${spec.versions.uv} AS uv-runtime`);\n\n if (hasPlaywright) {\n lines.push(`FROM mcr.microsoft.com/playwright:v${spec.versions.playwright}-noble AS final`);\n } else if (hasPython) {\n lines.push(\"FROM python-runtime AS final\");\n } else if (hasNode) {\n lines.push(\"FROM node-runtime AS final\");\n } else {\n lines.push(\"FROM bun-runtime AS final\");\n }\n\n lines.push(\"\", \"USER root\");\n\n if (hasPython && (hasPlaywright || !isFinalRuntime(spec, \"python\"))) {\n lines.push(\"COPY --from=python-runtime /usr/local/ /usr/local/\");\n }\n if (hasNode && (hasPlaywright || !isFinalRuntime(spec, \"node\"))) {\n lines.push(\"COPY --from=node-runtime /usr/local/bin/ /usr/local/bin/\");\n lines.push(\n \"COPY --from=node-runtime /usr/local/lib/node_modules/ /usr/local/lib/node_modules/\",\n );\n }\n if (hasBun && !isFinalRuntime(spec, \"bun\")) {\n lines.push(\"COPY --from=bun-runtime /usr/local/bin/bun /usr/local/bin/bun\");\n lines.push(\"RUN ln -sf /usr/local/bin/bun /usr/local/bin/bunx\");\n }\n if (hasPython) {\n lines.push(\"COPY --from=uv-runtime /uv /uvx /usr/local/bin/\");\n }\n\n const requestedAptPackages = [...commonAptPackages];\n if (spec.features.includes(\"artifacts\")) requestedAptPackages.push(\"fonts-dejavu-core\");\n requestedAptPackages.push(...spec.packages.apt);\n const aptPackages = unique(requestedAptPackages).sort();\n lines.push(\n \"\",\n \"RUN apt-get update \\\\\",\n ` && apt-get install -y --no-install-recommends ${aptPackages.map(shellQuote).join(\" \")} \\\\`,\n \" && rm -rf /var/lib/apt/lists/*\",\n );\n\n if (hasNode) {\n lines.push(\n \"\",\n `RUN npm install --global ${shellQuote(`pnpm@${spec.versions.pnpm}`)} --no-audit --no-fund \\\\`,\n \" && npm cache clean --force\",\n );\n }\n\n if (pythonRequirements.length > 0) {\n lines.push(\n \"\",\n \"COPY pyproject.toml /opt/anvia-python/pyproject.toml\",\n \"RUN cd /opt/anvia-python \\\\\",\n \" && uv sync --no-dev --no-cache --no-install-project\",\n \"ENV VIRTUAL_ENV=/opt/anvia-python/.venv\",\n \"ENV PATH=/opt/anvia-python/.venv/bin:$PATH\",\n );\n }\n\n if (npmDependencies.size > 0) {\n lines.push(\"\", \"COPY package.json /opt/anvia-js/package.json\");\n if (hasNode) {\n lines.push(\n \"RUN npm install --prefix /opt/anvia-js --omit=dev --no-audit --no-fund \\\\\",\n \" && ln -s /opt/anvia-js/node_modules /node_modules \\\\\",\n \" && npm cache clean --force\",\n );\n } else {\n lines.push(\n \"RUN cd /opt/anvia-js \\\\\",\n \" && bun install --production --no-save \\\\\",\n \" && ln -s /opt/anvia-js/node_modules /node_modules\",\n );\n }\n lines.push(\"ENV NODE_PATH=/opt/anvia-js/node_modules\");\n lines.push(\"ENV PATH=/opt/anvia-js/node_modules/.bin:$PATH\");\n }\n\n lines.push(\"\");\n if (hasPlaywright) lines.push(\"ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright\");\n lines.push(\n \"RUN mkdir -p /workspace\",\n \"WORKDIR /workspace\",\n \"ENTRYPOINT []\",\n 'CMD [\"sh\", \"-c\", \"trap \\'exit 0\\' TERM INT; while :; do sleep 3600 & wait $!; done\"]',\n );\n\n return lines.join(\"\\n\");\n}\n\nfunction renderDockerignore(hasPython: boolean, hasNpm: boolean): string {\n const lines = [\"**\", \"!Dockerfile\", \"!.dockerignore\", \"!anvia-sandbox.json\"];\n if (hasPython) lines.push(\"!pyproject.toml\");\n if (hasNpm) lines.push(\"!package.json\");\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderPythonProject(spec: SandboxImageSpec, requirements: readonly string[]): string {\n const [major, minor] = spec.versions.python.split(\".\");\n return [\n \"[project]\",\n `name = ${JSON.stringify(`anvia-sandbox-${spec.name}`)}`,\n 'version = \"0.0.0\"',\n `requires-python = ${JSON.stringify(`>=${major}.${minor}`)}`,\n \"dependencies = [\",\n ...requirements.map((requirement) => ` ${JSON.stringify(requirement)},`),\n \"]\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction npmDependenciesFor(spec: SandboxImageSpec): Map<string, string> {\n const dependencies = new Map<string, string>();\n if (spec.features.includes(\"playwright\")) {\n dependencies.set(\"playwright\", spec.versions.playwright);\n }\n for (const packageSpec of spec.packages.npm) {\n const parsed = parseNpmPackageSpec(packageSpec);\n if (dependencies.has(parsed.name)) {\n throw new Error(`Duplicate npm package: ${parsed.name}`);\n }\n dependencies.set(parsed.name, parsed.version);\n }\n return new Map([...dependencies.entries()].sort(([left], [right]) => left.localeCompare(right)));\n}\n\nfunction isFinalRuntime(spec: SandboxImageSpec, runtime: SandboxImageRuntime): boolean {\n if (spec.features.includes(\"playwright\")) return false;\n if (spec.runtimes.includes(\"python\")) return runtime === \"python\";\n if (spec.runtimes.includes(\"node\")) return runtime === \"node\";\n return runtime === \"bun\";\n}\n\nfunction validateName(name: string): void {\n if (!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name)) {\n throw new Error(\n \"Image name must be 1-63 lowercase letters, numbers, or hyphens and cannot start with a hyphen.\",\n );\n }\n}\n\nfunction validateRuntime(runtime: string): asserts runtime is SandboxImageRuntime {\n if (!runtimeOrder.includes(runtime as SandboxImageRuntime)) {\n throw new Error(`Unknown runtime: ${runtime}. Expected node, bun, or python.`);\n }\n}\n\nfunction validateFeature(feature: string): asserts feature is SandboxImageFeature {\n if (!featureOrder.includes(feature as SandboxImageFeature)) {\n throw new Error(`Unknown feature: ${feature}. Expected artifacts or playwright.`);\n }\n}\n\nfunction validateAptPackage(packageName: string): void {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9.+:~=-]*$/.test(packageName)) {\n throw new Error(`Invalid apt package: ${packageName}`);\n }\n}\n\nfunction parseNpmPackageSpec(packageSpec: string): { name: string; version: string } {\n if (/\\s/.test(packageSpec) || hasControlCharacter(packageSpec)) {\n throw new Error(`Invalid npm package spec: ${packageSpec}`);\n }\n\n const separator = packageSpec.startsWith(\"@\")\n ? packageSpec.indexOf(\"@\", packageSpec.indexOf(\"/\") + 1)\n : packageSpec.indexOf(\"@\");\n const name = separator === -1 ? packageSpec : packageSpec.slice(0, separator);\n const version = separator === -1 ? \"latest\" : packageSpec.slice(separator + 1);\n\n if (!/^(?:@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/i.test(name) || !version) {\n throw new Error(`Invalid npm package spec: ${packageSpec}`);\n }\n if (/[\\s'\"`$;&|<>\\\\]/.test(version) || hasControlCharacter(version)) {\n throw new Error(`Invalid npm package version in: ${packageSpec}`);\n }\n return { name, version };\n}\n\nfunction validateUvRequirement(requirement: string): void {\n if (!requirement || requirement.startsWith(\"-\") || hasControlCharacter(requirement)) {\n throw new Error(`Invalid uv package requirement: ${requirement}`);\n }\n}\n\nfunction validateVersion(name: string, version: string): void {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(version)) {\n throw new Error(`Invalid ${name} version: ${version}`);\n }\n}\n\nfunction validateImageTag(tag: string): void {\n if (\n !tag ||\n tag.startsWith(\"-\") ||\n tag.includes(\"@\") ||\n /\\s/.test(tag) ||\n hasControlCharacter(tag)\n ) {\n throw new Error(`Invalid Docker image tag: ${tag}`);\n }\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return [...value].some((character) => character.charCodeAt(0) < 32);\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n"],"mappings":";;;;;;AACA,SAAS,OAAO,OAAO,UAAU,IAAI,iBAAiB;AACtD,OAAO,UAAU;AACjB,SAAS,qBAAqB;;;AC+CvB,IAAM,8BAA8D;AAAA,EACzE,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,YAAY;AACd;AAEO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,eAAsC,CAAC,QAAQ,OAAO,QAAQ;AACpE,IAAM,eAAsC,CAAC,aAAa,YAAY;AACtE,IAAM,oBAAoB,CAAC,QAAQ,mBAAmB,aAAa,cAAc,QAAQ;AAElF,SAAS,wBAAwB,OAA4C;AAClF,eAAa,MAAM,IAAI;AAEvB,QAAM,WAAW,IAAI,IAAI,MAAM,YAAY,CAAC,CAAC;AAC7C,QAAM,WAAW,IAAI,IAAI,MAAM,YAAY,CAAC,CAAC;AAC7C,QAAM,WAAiC;AAAA,IACrC,KAAK,OAAO,MAAM,UAAU,OAAO,CAAC,CAAC;AAAA,IACrC,KAAK,OAAO,MAAM,UAAU,OAAO,CAAC,CAAC;AAAA,IACrC,IAAI,OAAO,MAAM,UAAU,MAAM,CAAC,CAAC;AAAA,EACrC;AAEA,aAAW,WAAW,SAAU,iBAAgB,OAAO;AACvD,aAAW,WAAW,SAAU,iBAAgB,OAAO;AACvD,aAAW,eAAe,SAAS,IAAK,oBAAmB,WAAW;AACtE,aAAW,eAAe,SAAS,IAAK,qBAAoB,WAAW;AACvE,aAAW,eAAe,SAAS,GAAI,uBAAsB,WAAW;AAExE,MAAI,SAAS,IAAI,WAAW,KAAK,SAAS,GAAG,SAAS,EAAG,UAAS,IAAI,QAAQ;AAC9E,MAAI,SAAS,IAAI,YAAY,EAAG,UAAS,IAAI,MAAM;AACnD,MAAI,SAAS,IAAI,SAAS,KAAK,CAAC,SAAS,IAAI,MAAM,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG;AAC5E,aAAS,IAAI,MAAM;AAAA,EACrB;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,WAAW,EAAE,GAAG,6BAA6B,GAAG,MAAM,SAAS;AACrE,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,EAAG,iBAAgB,MAAM,OAAO;AAErF,QAAM,MAAM,MAAM,OAAO,iBAAiB,MAAM,IAAI;AACpD,mBAAiB,GAAG;AAEpB,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,UAAU,aAAa,OAAO,CAAC,YAAY,SAAS,IAAI,OAAO,CAAC;AAAA,IAChE,UAAU,aAAa,OAAO,CAAC,YAAY,SAAS,IAAI,OAAO,CAAC;AAAA,IAChE;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,0BACd,MACA,kBACqB;AACrB,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,qBAAqB,CAAC,GAAG,KAAK,SAAS,EAAE;AAC/C,MAAI,KAAK,SAAS,SAAS,WAAW,GAAG;AACvC,uBAAmB,QAAQ,GAAG,sBAAsB;AAAA,EACtD;AACA,QAAM,kBAAkB,mBAAmB,IAAI;AAE/C,QAAM,IAAI,cAAc,GAAG,iBAAiB,MAAM,oBAAoB,eAAe,CAAC;AAAA,CAAI;AAC1F,QAAM;AAAA,IACJ;AAAA,IACA,mBAAmB,mBAAmB,SAAS,GAAG,gBAAgB,OAAO,CAAC;AAAA,EAC5E;AAEA,MAAI,mBAAmB,SAAS,GAAG;AACjC,UAAM,IAAI,kBAAkB,oBAAoB,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAAA,EACnF;AACA,MAAI,gBAAgB,OAAO,GAAG;AAC5B,UAAM;AAAA,MACJ;AAAA,MACA,GAAG,KAAK;AAAA,QACN;AAAA,UACE,SAAS;AAAA,UACT,aAAa,8BAA8B,KAAK,IAAI;AAAA,UACpD,cAAc,OAAO,YAAY,eAAe;AAAA,QAClD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,GAAG,MAAM,KAAK,GAAG,oBAAoB,EAAE,KAAK;AACpE,QAAM,WAAiC;AAAA,IACrC,eAAe;AAAA,IACf,aAAa;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,IAAI,sBAAsB,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAExE,SAAO,EAAE,UAAU,MAAM;AAC3B;AAEO,SAAS,6BAA6B,MAAkC;AAC7E,QAAM,WAAqB,CAAC;AAC5B,aAAW,SAAS,KAAK,SAAS,KAAK;AACrC,QAAI,oBAAoB,KAAK,EAAE,YAAY,SAAU,UAAS,KAAK,KAAK;AAAA,EAC1E;AACA,aAAW,SAAS,KAAK,SAAS,IAAI;AACpC,QAAI,CAAC,sBAAsB,KAAK,KAAK,EAAG,UAAS,KAAK,KAAK;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,iBACP,MACA,oBACA,iBACQ;AACR,QAAM,UAAU,KAAK,SAAS,SAAS,MAAM;AAC7C,QAAM,SAAS,KAAK,SAAS,SAAS,KAAK;AAC3C,QAAM,YAAY,KAAK,SAAS,SAAS,QAAQ;AACjD,QAAM,gBAAgB,KAAK,SAAS,SAAS,YAAY;AACzD,QAAM,QAAQ;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,QAAS,OAAM,KAAK,aAAa,KAAK,SAAS,IAAI,gCAAgC;AACvF,MAAI,UAAW,OAAM,KAAK,eAAe,KAAK,SAAS,MAAM,kCAAkC;AAC/F,MAAI,OAAQ,OAAM,KAAK,iBAAiB,KAAK,SAAS,GAAG,sBAAsB;AAC/E,MAAI,UAAW,OAAM,KAAK,6BAA6B,KAAK,SAAS,EAAE,gBAAgB;AAEvF,MAAI,eAAe;AACjB,UAAM,KAAK,sCAAsC,KAAK,SAAS,UAAU,iBAAiB;AAAA,EAC5F,WAAW,WAAW;AACpB,UAAM,KAAK,8BAA8B;AAAA,EAC3C,WAAW,SAAS;AAClB,UAAM,KAAK,4BAA4B;AAAA,EACzC,OAAO;AACL,UAAM,KAAK,2BAA2B;AAAA,EACxC;AAEA,QAAM,KAAK,IAAI,WAAW;AAE1B,MAAI,cAAc,iBAAiB,CAAC,eAAe,MAAM,QAAQ,IAAI;AACnE,UAAM,KAAK,oDAAoD;AAAA,EACjE;AACA,MAAI,YAAY,iBAAiB,CAAC,eAAe,MAAM,MAAM,IAAI;AAC/D,UAAM,KAAK,0DAA0D;AACrE,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,MAAI,UAAU,CAAC,eAAe,MAAM,KAAK,GAAG;AAC1C,UAAM,KAAK,+DAA+D;AAC1E,UAAM,KAAK,mDAAmD;AAAA,EAChE;AACA,MAAI,WAAW;AACb,UAAM,KAAK,iDAAiD;AAAA,EAC9D;AAEA,QAAM,uBAAuB,CAAC,GAAG,iBAAiB;AAClD,MAAI,KAAK,SAAS,SAAS,WAAW,EAAG,sBAAqB,KAAK,mBAAmB;AACtF,uBAAqB,KAAK,GAAG,KAAK,SAAS,GAAG;AAC9C,QAAM,cAAc,OAAO,oBAAoB,EAAE,KAAK;AACtD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,mDAAmD,YAAY,IAAI,UAAU,EAAE,KAAK,GAAG,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,MAAI,SAAS;AACX,UAAM;AAAA,MACJ;AAAA,MACA,4BAA4B,WAAW,QAAQ,KAAK,SAAS,IAAI,EAAE,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB,SAAS,GAAG;AACjC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,OAAO,GAAG;AAC5B,UAAM,KAAK,IAAI,8CAA8C;AAC7D,QAAI,SAAS;AACX,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,0CAA0C;AACrD,UAAM,KAAK,gDAAgD;AAAA,EAC7D;AAEA,QAAM,KAAK,EAAE;AACb,MAAI,cAAe,OAAM,KAAK,6CAA6C;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,mBAAmB,WAAoB,QAAyB;AACvE,QAAM,QAAQ,CAAC,MAAM,eAAe,kBAAkB,qBAAqB;AAC3E,MAAI,UAAW,OAAM,KAAK,iBAAiB;AAC3C,MAAI,OAAQ,OAAM,KAAK,eAAe;AACtC,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,oBAAoB,MAAwB,cAAyC;AAC5F,QAAM,CAAC,OAAO,KAAK,IAAI,KAAK,SAAS,OAAO,MAAM,GAAG;AACrD,SAAO;AAAA,IACL;AAAA,IACA,UAAU,KAAK,UAAU,iBAAiB,KAAK,IAAI,EAAE,CAAC;AAAA,IACtD;AAAA,IACA,qBAAqB,KAAK,UAAU,KAAK,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,IAC1D;AAAA,IACA,GAAG,aAAa,IAAI,CAAC,gBAAgB,KAAK,KAAK,UAAU,WAAW,CAAC,GAAG;AAAA,IACxE;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,mBAAmB,MAA6C;AACvE,QAAM,eAAe,oBAAI,IAAoB;AAC7C,MAAI,KAAK,SAAS,SAAS,YAAY,GAAG;AACxC,iBAAa,IAAI,cAAc,KAAK,SAAS,UAAU;AAAA,EACzD;AACA,aAAW,eAAe,KAAK,SAAS,KAAK;AAC3C,UAAM,SAAS,oBAAoB,WAAW;AAC9C,QAAI,aAAa,IAAI,OAAO,IAAI,GAAG;AACjC,YAAM,IAAI,MAAM,0BAA0B,OAAO,IAAI,EAAE;AAAA,IACzD;AACA,iBAAa,IAAI,OAAO,MAAM,OAAO,OAAO;AAAA,EAC9C;AACA,SAAO,IAAI,IAAI,CAAC,GAAG,aAAa,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,CAAC;AACjG;AAEA,SAAS,eAAe,MAAwB,SAAuC;AACrF,MAAI,KAAK,SAAS,SAAS,YAAY,EAAG,QAAO;AACjD,MAAI,KAAK,SAAS,SAAS,QAAQ,EAAG,QAAO,YAAY;AACzD,MAAI,KAAK,SAAS,SAAS,MAAM,EAAG,QAAO,YAAY;AACvD,SAAO,YAAY;AACrB;AAEA,SAAS,aAAa,MAAoB;AACxC,MAAI,CAAC,4BAA4B,KAAK,IAAI,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,SAAyD;AAChF,MAAI,CAAC,aAAa,SAAS,OAA8B,GAAG;AAC1D,UAAM,IAAI,MAAM,oBAAoB,OAAO,kCAAkC;AAAA,EAC/E;AACF;AAEA,SAAS,gBAAgB,SAAyD;AAChF,MAAI,CAAC,aAAa,SAAS,OAA8B,GAAG;AAC1D,UAAM,IAAI,MAAM,oBAAoB,OAAO,qCAAqC;AAAA,EAClF;AACF;AAEA,SAAS,mBAAmB,aAA2B;AACrD,MAAI,CAAC,kCAAkC,KAAK,WAAW,GAAG;AACxD,UAAM,IAAI,MAAM,wBAAwB,WAAW,EAAE;AAAA,EACvD;AACF;AAEA,SAAS,oBAAoB,aAAwD;AACnF,MAAI,KAAK,KAAK,WAAW,KAAK,oBAAoB,WAAW,GAAG;AAC9D,UAAM,IAAI,MAAM,6BAA6B,WAAW,EAAE;AAAA,EAC5D;AAEA,QAAM,YAAY,YAAY,WAAW,GAAG,IACxC,YAAY,QAAQ,KAAK,YAAY,QAAQ,GAAG,IAAI,CAAC,IACrD,YAAY,QAAQ,GAAG;AAC3B,QAAM,OAAO,cAAc,KAAK,cAAc,YAAY,MAAM,GAAG,SAAS;AAC5E,QAAM,UAAU,cAAc,KAAK,WAAW,YAAY,MAAM,YAAY,CAAC;AAE7E,MAAI,CAAC,sDAAsD,KAAK,IAAI,KAAK,CAAC,SAAS;AACjF,UAAM,IAAI,MAAM,6BAA6B,WAAW,EAAE;AAAA,EAC5D;AACA,MAAI,kBAAkB,KAAK,OAAO,KAAK,oBAAoB,OAAO,GAAG;AACnE,UAAM,IAAI,MAAM,mCAAmC,WAAW,EAAE;AAAA,EAClE;AACA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,SAAS,sBAAsB,aAA2B;AACxD,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG,KAAK,oBAAoB,WAAW,GAAG;AACnF,UAAM,IAAI,MAAM,mCAAmC,WAAW,EAAE;AAAA,EAClE;AACF;AAEA,SAAS,gBAAgB,MAAc,SAAuB;AAC5D,MAAI,CAAC,+BAA+B,KAAK,OAAO,GAAG;AACjD,UAAM,IAAI,MAAM,WAAW,IAAI,aAAa,OAAO,EAAE;AAAA,EACvD;AACF;AAEA,SAAS,iBAAiB,KAAmB;AAC3C,MACE,CAAC,OACD,IAAI,WAAW,GAAG,KAClB,IAAI,SAAS,GAAG,KAChB,KAAK,KAAK,GAAG,KACb,oBAAoB,GAAG,GACvB;AACA,UAAM,IAAI,MAAM,6BAA6B,GAAG,EAAE;AAAA,EACpD;AACF;AAEA,SAAS,OAAO,QAAqC;AACnD,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC5B;AAEA,SAAS,oBAAoB,OAAwB;AACnD,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,cAAc,UAAU,WAAW,CAAC,IAAI,EAAE;AACpE;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,IAAI,MAAM,WAAW,KAAK,OAAO,CAAC;AAC3C;;;ADxVA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAMA,qBAAoB;AAAA,EACxB,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,2CAA2C;AAAA,EAC/E,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,mCAAmC;AAAA,EACzE,EAAE,OAAO,MAAM,OAAO,MAAM,MAAM,iCAAiC;AAAA,EACnE,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,6BAA6B;AAAA,EACvE,EAAE,OAAO,eAAe,OAAO,eAAe,MAAM,+BAA+B;AAAA,EACnF,EAAE,OAAO,iBAAiB,OAAO,iBAAiB,MAAM,gCAAgC;AAAA,EACxF,EAAE,OAAO,eAAe,OAAO,eAAe,MAAM,oCAAoC;AAC1F;AAEA,IAAM,oBAAoB;AAAA,EACxB,EAAE,OAAO,iBAAiB,OAAO,UAAU,MAAM,yBAAyB;AAAA,EAC1E,EAAE,OAAO,gBAAgB,OAAO,SAAS,MAAM,8BAA8B;AAAA,EAC7E,EAAE,OAAO,iBAAiB,OAAO,WAAW,MAAM,iCAAiC;AAAA,EACnF,EAAE,OAAO,cAAc,OAAO,QAAQ,MAAM,0BAA0B;AAAA,EACtE,EAAE,OAAO,mBAAmB,OAAO,aAAa,MAAM,oCAAoC;AAC5F;AAEA,IAAM,mBAAmB;AAAA,EACvB,EAAE,OAAO,iBAAiB,OAAO,SAAS,MAAM,qBAAqB;AAAA,EACrE,EAAE,OAAO,0BAA0B,OAAO,kBAAkB,MAAM,uBAAuB;AAAA,EACzF,EAAE,OAAO,iBAAiB,OAAO,SAAS,MAAM,uBAAuB;AAAA,EACvE,EAAE,OAAO,uBAAuB,OAAO,gBAAgB,MAAM,6BAA6B;AAAA,EAC1F,EAAE,OAAO,kBAAkB,OAAO,UAAU,MAAM,4BAA4B;AAChF;AAEA,IAAM,YAA+B;AAAA,EACnC,KAAK,QAAQ;AAAA,EACb,MAAM,QAAQ;AAAA,EACd,OAAO,QAAQ;AAAA,EACf,QAAQ,CAAC,UAAU,QAAQ,OAAO,MAAM,KAAK;AAAA,EAC7C,QAAQ,CAAC,UAAU,QAAQ,OAAO,MAAM,KAAK;AAC/C;AAEA,eAAsB,OACpB,OAAiB,QAAQ,KAAK,MAAM,CAAC,GACrC,MAAM,QAAQ,IAAI,GAClB,KAAwB,WACxB,eAA4C,CAAC,GAC5B;AACjB,MAAI;AACJ,MAAI;AACF,cAAU,UAAU,IAAI;AAAA,EAC1B,SAAS,OAAO;AACd,OAAG,MAAM,aAAa,KAAK,CAAC;AAC5B,OAAG,IAAI,SAAS,CAAC;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,QAAQ,QAAQ,YAAY,QAAW;AACjD,OAAG,IAAI,SAAS,CAAC;AACjB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,YAAY,gBAAgB;AACtC,OAAG,MAAM,oBAAoB,QAAQ,OAAO,EAAE;AAC9C,OAAG,IAAI,SAAS,CAAC;AACjB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,eACJ,QAAQ,SAAS,UAChB,QAAQ,SAAS,WAAW,KAC3B,QAAQ,SAAS,WAAW,KAC5B,QAAQ,IAAI,WAAW,KACvB,QAAQ,GAAG,WAAW;AAC1B,QAAI,cAAc;AAChB,YAAM,QAAQ,aAAa,UAAU,QAAQ,MAAM,SAAS,QAAQ,OAAO;AAC3E,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,aAAa,UAAU;AACtC,YAAM,SAAS,MAAM,OAAO,OAAO;AACnC,UAAI,WAAW,OAAW,QAAO;AACjC,gBAAU,kBAAkB,SAAS,MAAM;AAAA,IAC7C;AAEA,UAAM,QAA2B;AAAA,MAC/B,MAAM,SAAS,QAAQ,MAAM,yBAAyB;AAAA,MACtD,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,UAAU;AAAA,QACR,KAAK,QAAQ;AAAA,QACb,KAAK,QAAQ;AAAA,QACb,IAAI,QAAQ;AAAA,MACd;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AACA,QAAI,QAAQ,QAAQ,OAAW,OAAM,MAAM,QAAQ;AAEnD,UAAM,OAAO,wBAAwB,KAAK;AAC1C,UAAM,iBAAiB,aAAa,kBAAmB,MAAM,mBAAmB;AAChF,UAAM,UAAU,0BAA0B,MAAM,cAAc;AAC9D,UAAM,aAAa,KAAK;AAAA,MACtB;AAAA,MACA,QAAQ,UAAU,KAAK,KAAK,UAAU,kBAAkB,KAAK,IAAI;AAAA,IACnE;AACA,UAAM,cAAc,oBAAoB,KAAK,UAAU;AACvD,UAAM,WAAW,6BAA6B,IAAI;AAClD,QAAI,SAAS,SAAS,GAAG;AACvB,SAAG,KAAK,mDAAmD,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,IAClF;AAEA,QAAI,QAAQ,QAAQ;AAClB,kBAAY,QAAQ,OAAO,aAAa,KAAK,KAAK,EAAE;AACpD,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,YAAY,QAAQ,UAAU,QAAQ,OAAO,QAAQ,KAAK;AAClF,OAAG,IAAI,WAAW,WAAW,EAAE;AAE/B,QAAI,CAAC,QAAQ,OAAO;AAClB,SAAG,IAAI,EAAE;AACT,SAAG,IAAI,cAAc;AACrB,SAAG,IAAI,KAAK,aAAa,CAAC,QAAQ,YAAY,SAAS,SAAS,KAAK,KAAK,WAAW,CAAC,CAAC,EAAE;AACzF,wBAAkB,KAAK,KAAK,EAAE;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,aAAa,cAAc;AAC9C,UAAM,WAAW;AAAA,MACf,aAAa;AAAA,MACb,KAAK,KAAK;AAAA,MACV,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AACD,OAAG,IAAI,SAAS,KAAK,GAAG,EAAE;AAC1B,sBAAkB,KAAK,KAAK,EAAE;AAC9B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,OAAG,MAAM,aAAa,KAAK,CAAC;AAC5B,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eACb,SAC+C;AAC/C,+BAA6B;AAC7B,QAAM,UAAU,MAAM,OAAO,gBAAgB;AAC7C,UAAQ,MAAM,+BAA+B;AAE7C,QAAM,aACJ,QAAQ,QACP,MAAM,QAAQ,KAAK;AAAA,IAClB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU,CAAC,UACT,4BAA4B,KAAK,SAAS,EAAE,IACxC,SACA;AAAA,EACR,CAAC;AACH,MAAI,QAAQ,SAAS,UAAU,EAAG,QAAO,aAAa,OAAO;AAC7D,QAAM,OAAO,aAAa,YAAY,YAAY;AAElD,MAAI,WAAW,CAAC,GAAG,QAAQ,QAAQ;AACnC,MAAI,WAAW,CAAC,GAAG,QAAQ,QAAQ;AACnC,MACE,SAAS,WAAW,KACpB,SAAS,WAAW,KACpB,QAAQ,IAAI,WAAW,KACvB,QAAQ,GAAG,WAAW,GACtB;AACA,UAAM,eAAe,MAAM,QAAQ,YAAuD;AAAA,MACxF,SAAS;AAAA,MACT,UAAU;AAAA,MACV,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,WAAW,MAAM,wBAAwB;AAAA,QACjE,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,wBAAwB;AAAA,QAC5D,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,sBAAsB;AAAA,QAChE,EAAE,OAAO,aAAa,OAAO,2BAA2B,MAAM,4BAA4B;AAAA,QAC1F,EAAE,OAAO,cAAc,OAAO,yBAAyB,MAAM,6BAA6B;AAAA,MAC5F;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,SAAS,YAAY,EAAG,QAAO,aAAa,OAAO;AAC/D,eAAW,aAAa,OAAO,SAAS;AACxC,eAAW,aAAa,OAAO,SAAS;AAAA,EAC1C;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACAA;AAAA,IACA,QAAQ;AAAA,EACV;AACA,MAAI,cAAc,OAAW,QAAO,aAAa,OAAO;AACxD,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACA,MAAI,cAAc,OAAW,QAAO,aAAa,OAAO;AACxD,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACA,MAAI,aAAa,OAAW,QAAO,aAAa,OAAO;AAEvD,QAAM,YACJ,QAAQ,OACP,MAAM,QAAQ,KAAK;AAAA,IAClB,SAAS;AAAA,IACT,cAAc,iBAAiB,IAAI;AAAA,EACrC,CAAC;AACH,MAAI,QAAQ,SAAS,SAAS,EAAG,QAAO,aAAa,OAAO;AAC5D,QAAM,eACJ,QAAQ,UACP,MAAM,QAAQ,KAAK;AAAA,IAClB,SAAS;AAAA,IACT,cAAc,KAAK,KAAK,UAAU,kBAAkB,IAAI;AAAA,EAC1D,CAAC;AACH,MAAI,QAAQ,SAAS,YAAY,EAAG,QAAO,aAAa,OAAO;AAE/D,QAAM,cAAc,QAAQ,gBACxB,QAAQ,QACR,MAAM,QAAQ,QAAQ,EAAE,SAAS,wBAAwB,cAAc,KAAK,CAAC;AACjF,MAAI,QAAQ,SAAS,WAAW,EAAG,QAAO,aAAa,OAAO;AAC9D,QAAM,YAAY,MAAM,QAAQ,QAAQ;AAAA,IACtC,SAAS;AAAA,IACT,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,QAAQ,SAAS,SAAS,KAAK,CAAC,UAAW,QAAO,aAAa,OAAO;AAE1E,UAAQ,MAAM,qBAAqB;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK,aAAa,WAAW,kBAAkB;AAAA,IAC/C,QAAQ,aAAa,cAAc,4BAA4B;AAAA,IAC/D,OAAO,cAAc,aAAa,iBAAiB;AAAA,EACrD;AACF;AAEA,eAAe,qBACb,SACA,SACA,SACA,UAC+B;AAC/B,QAAM,eAAe,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC;AAClE,QAAM,SAAS,MAAM,QAAQ,YAAoB;AAAA,IAC/C;AAAA,IACA,UAAU;AAAA,IACV,SAAS,CAAC,GAAG,OAAO;AAAA,IACpB,eAAe,SAAS,OAAO,CAAC,UAAU,aAAa,IAAI,KAAK,CAAC;AAAA,EACnE,CAAC;AACD,MAAI,QAAQ,SAAS,MAAM,EAAG,QAAO;AACrC,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,MAAM,CAAC,CAAC;AAC9C;AAEA,SAAS,aAAa,SAAqD;AACzE,UAAQ,OAAO,2BAA2B;AAC1C,SAAO;AACT;AAEA,eAAe,iBAAiB,OAKd;AAChB,QAAM,gBAAgB,CAAC,SAAS,SAAS,MAAM,KAAK,MAAM,WAAW,GAAG;AAAA,IACtE,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM,GAAG;AAAA,IACnB,UAAU,MAAM,GAAG;AAAA,EACrB,CAAC;AACH;AAEA,eAAe,kBACb,YACA,UACA,OACA,OACe;AACf,QAAM,aAAa,MAAM,UAAU,UAAU;AAC7C,MAAI,YAAY,eAAe,GAAG;AAChC,UAAM,IAAI,MAAM,sCAAsC,UAAU,EAAE;AAAA,EACpE;AAEA,MAAI,eAAe,QAAW;AAC5B,QAAI,CAAC,WAAW,YAAY,EAAG,OAAM,IAAI,MAAM,mCAAmC,UAAU,EAAE;AAC9F,UAAM,mBAAmB,MAAM,sBAAsB,UAAU;AAC/D,QAAI,qBAAqB,QAAW;AAClC,YAAM,IAAI;AAAA,QACR,4EAA4E,UAAU;AAAA,MACxF;AAAA,IACF;AACA,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,gEAAgE;AAE5F,eAAW,YAAY,iBAAiB,gBAAgB;AACtD,YAAM,SAAS,KAAK,KAAK,YAAY,QAAQ;AAC7C,YAAM,aAAa,MAAM,UAAU,MAAM;AACzC,UAAI,YAAY,eAAe,EAAG,OAAM,IAAI,MAAM,gCAAgC,MAAM,EAAE;AAC1F,UAAI,eAAe,OAAW,OAAM,GAAG,MAAM;AAAA,IAC/C;AAAA,EACF,OAAO;AACL,UAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AAEA,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AACvC,QAAI,CAAC,mBAAmB,IAAI,QAAQ;AAClC,YAAM,IAAI,MAAM,kCAAkC,QAAQ,EAAE;AAC9D,UAAM,SAAS,KAAK,KAAK,YAAY,QAAQ;AAC7C,UAAM,aAAa,MAAM,UAAU,MAAM;AACzC,QAAI,YAAY,eAAe,EAAG,OAAM,IAAI,MAAM,gCAAgC,MAAM,EAAE;AAC1F,UAAM,UAAU,QAAQ,SAAS,MAAM;AAAA,EACzC;AAEA,MAAI,CAAC,MAAM,IAAI,oBAAoB,KAAK,SAAS,eAAe,WAAW,MAAM,MAAM;AACrF,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACF;AAEA,eAAe,sBACb,YAC2C;AAC3C,QAAM,eAAe,KAAK,KAAK,YAAY,oBAAoB;AAC/D,QAAM,OAAO,MAAM,UAAU,YAAY;AACzC,MAAI,SAAS,OAAW,QAAO;AAC/B,MAAI,KAAK,eAAe,KAAK,CAAC,KAAK,OAAO,GAAG;AAC3C,UAAM,IAAI,MAAM,+BAA+B,YAAY,EAAE;AAAA,EAC/D;AAEA,MAAI;AACJ,MAAI;AACF,YAAQ,KAAK,MAAM,MAAM,SAAS,cAAc,MAAM,CAAC;AAAA,EACzD,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,sCAAsC,YAAY,IAAI,EAAE,OAAO,MAAM,CAAC;AAAA,EACxF;AACA,MAAI,CAAC,oBAAoB,KAAK,GAAG;AAC/B,UAAM,IAAI;AAAA,MACR,oEAAoE,YAAY;AAAA,IAClF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAA+C;AAC1E,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,QAAM,cAAc,OAAO;AAC3B,QAAM,QAAQ,OAAO;AACrB,SACE,OAAO,kBAAkB,KACzB,aAAa,YAAY,oBACzB,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,YAAY,mBAAmB,IAAI,IAAI,CAAC;AAElF;AAEA,eAAe,UAAU,QAAgB;AACvC,MAAI;AACF,WAAO,MAAM,MAAM,MAAM;AAAA,EAC3B,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACR;AACF;AAEA,SAAS,YACP,OACA,YACA,KACA,IACM;AACN,KAAG,IAAI,gBAAgB,UAAU,EAAE;AACnC,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AACvC,OAAG,IAAI,EAAE;AACT,OAAG,IAAI,OAAO,QAAQ,EAAE;AACxB,OAAG,IAAI,QAAQ,QAAQ,CAAC;AAAA,EAC1B;AACA,KAAG,IAAI,EAAE;AACT,KAAG,IAAI,eAAe,GAAG,EAAE;AAC7B;AAEA,SAAS,kBAAkB,KAAa,IAA6B;AACnE,KAAG,IAAI,EAAE;AACT,KAAG,IAAI,0BAA0B;AACjC,KAAG,IAAI,yDAAyD;AAChE,KAAG,IAAI,EAAE;AACT,KAAG,IAAI,6CAA6C;AACpD,KAAG,IAAI,sDAAsD;AAC7D,KAAG,IAAI,cAAc,KAAK,UAAU,GAAG,CAAC,GAAG;AAC3C,KAAG,IAAI,uCAAuC;AAC9C,KAAG,IAAI,gCAAgC;AACvC,KAAG,IAAI,OAAO;AAChB;AAEA,SAAS,kBAAkB,SAAqB,QAA8C;AAC5F,QAAM,OAAmB;AAAA,IACvB,GAAG;AAAA,IACH,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,IAAI,OAAO;AAAA,IACX,OAAO,OAAO;AAAA,IACd,eAAe;AAAA,EACjB;AACA,MAAI,OAAO,QAAQ,OAAW,MAAK,MAAM,OAAO;AAChD,MAAI,OAAO,WAAW,OAAW,MAAK,SAAS,OAAO;AACtD,SAAO;AACT;AAEA,SAAS,UAAU,MAA4B;AAC7C,QAAM,UAAsB;AAAA,IAC1B,UAAU,CAAC;AAAA,IACX,UAAU,CAAC;AAAA,IACX,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,IAAI,CAAC;AAAA,IACL,UAAU,CAAC;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,WAAW,KAAK,KAAK,KAAK;AAChC,QAAI,CAAC,SAAS,WAAW,GAAG,GAAG;AAC7B,UAAI,QAAQ,YAAY,OAAW,OAAM,IAAI,MAAM,wBAAwB,QAAQ,EAAE;AACrF,cAAQ,UAAU;AAClB;AAAA,IACF;AAEA,UAAM,CAAC,MAAM,WAAW,IAAI,UAAU,QAAQ;AAC9C,UAAM,QAAQ,MAAM,eAAe,SAAS,KAAK,EAAE,KAAK,GAAG,GAAG,IAAI,oBAAoB;AACtF,YAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,OAAO;AACf;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO,MAAM;AACrB;AAAA,MACF,KAAK;AACH,gBAAQ,MAAM,MAAM;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,MAAM;AACvB;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,KAAK,aAAa,MAAM,CAAC,CAAC;AAC3C;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,KAAK,aAAa,MAAM,CAAC,CAAC;AAC3C;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,KAAK,MAAM,CAAC;AACxB;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,KAAK,MAAM,CAAC;AACxB;AAAA,MACF,KAAK;AACH,gBAAQ,GAAG,KAAK,MAAM,CAAC;AACvB;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,OAAO,MAAM;AAC9B;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,OAAO,MAAM;AAC9B;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,MAAM,MAAM;AAC7B;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,SAAS,MAAM;AAChC;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,KAAK,MAAM;AAC5B;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,aAAa,MAAM;AACpC;AAAA,MACF,KAAK;AACH,gBAAQ,aAAa,MAAM;AAC3B;AAAA,MACF,KAAK;AACH,0BAAkB,MAAM,WAAW;AACnC,gBAAQ,QAAQ;AAChB,gBAAQ,gBAAgB;AACxB;AAAA,MACF,KAAK;AACH,0BAAkB,MAAM,WAAW;AACnC,gBAAQ,SAAS;AACjB;AAAA,MACF,KAAK;AACH,0BAAkB,MAAM,WAAW;AACnC,gBAAQ,QAAQ;AAChB;AAAA,MACF;AACE,cAAM,IAAI,MAAM,mBAAmB,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,UAAgD;AACjE,QAAM,YAAY,SAAS,QAAQ,GAAG;AACtC,SAAO,cAAc,KACjB,CAAC,UAAU,MAAS,IACpB,CAAC,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,MAAM,YAAY,CAAC,CAAC;AAClE;AAEA,SAAS,kBAAkB,MAAc,OAAiC;AACxE,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,GAAG,IAAI,2BAA2B;AAC7E;AAEA,SAAS,aAAa,OAAoC;AACxD,MAAI,UAAU,KAAK,EAAG,QAAO;AAC7B,QAAM,IAAI,MAAM,oBAAoB,KAAK,kCAAkC;AAC7E;AAEA,SAAS,aAAa,OAAoC;AACxD,MAAI,UAAU,KAAK,EAAG,QAAO;AAC7B,QAAM,IAAI,MAAM,oBAAoB,KAAK,qCAAqC;AAChF;AAEA,SAAS,UAAU,OAA6C;AAC9D,SAAO,UAAU,UAAU,UAAU,SAAS,UAAU;AAC1D;AAEA,SAAS,UAAU,OAA6C;AAC9D,SAAO,UAAU,eAAe,UAAU;AAC5C;AAEA,SAAS,+BAAqC;AAC5C,QAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAC1E,MAAI,QAAQ,MAAO,UAAU,MAAM,QAAQ,IAAK;AAC9C,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACF;AAEA,eAAe,qBAAsC;AACnD,QAAM,cAAc,KAAK;AAAA,IACvB,MAAM,SAAS,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,MAAM;AAAA,EACpE;AAGA,SAAO,OAAO,YAAY,YAAY,WAAW,YAAY,UAAU;AACzE;AAEA,SAAS,oBAAoB,KAAa,QAAwB;AAChE,QAAM,WAAW,KAAK,SAAS,KAAK,MAAM;AAC1C,SAAO,YAAY,CAAC,SAAS,WAAW,IAAI,IAAI,WAAW;AAC7D;AAEA,SAAS,aAAa,MAAiC;AACrD,SAAO,KAAK,IAAI,aAAa,EAAE,KAAK,GAAG;AACzC;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,wBAAwB,KAAK,KAAK,EAAG,QAAO;AAChD,SAAO,IAAI,MAAM,WAAW,KAAK,OAAO,CAAC;AAC3C;AAEA,SAAS,SAAY,OAAsB,SAAoB;AAC7D,MAAI,UAAU,UAAa,UAAU,GAAI,OAAM,IAAI,MAAM,OAAO;AAChE,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,MAAsB;AAC1D,MAAI,OAAO,UAAU,SAAU,OAAM,IAAI,UAAU,GAAG,IAAI,oBAAoB;AAC9E,SAAO;AACT;AAEA,SAAS,cAAc,OAAgB,MAAuB;AAC5D,MAAI,OAAO,UAAU,UAAW,OAAM,IAAI,UAAU,GAAG,IAAI,qBAAqB;AAChF,SAAO;AACT;AAEA,SAAS,aAAa,OAAwB;AAC5C,SAAO,iBAAiB,QAAQ,MAAM,UAAU;AAClD;AAEA,SAAS,WAAmB;AAC1B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BT;AAEA,IAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,SAAY,SAAY,KAAK,QAAQ,QAAQ,KAAK,CAAC,CAAC;AAC5F,IAAI,gBAAgB,UAAa,gBAAgB,cAAc,YAAY,GAAG,GAAG;AAC/E,SAAO,EAAE,KAAK,CAAC,SAAS;AACtB,YAAQ,WAAW;AAAA,EACrB,CAAC;AACH;","names":["commonAptPackages"]}
|
package/dist/index.js
CHANGED
|
@@ -1258,7 +1258,7 @@ var DockerSandboxRuntimeImpl = class {
|
|
|
1258
1258
|
async closeActiveOperations(message) {
|
|
1259
1259
|
const reason = new DockerSandboxError(message, "invalid_state");
|
|
1260
1260
|
for (const controller of this.activeControllers) controller.abort(reason);
|
|
1261
|
-
await Promise.allSettled(
|
|
1261
|
+
await Promise.allSettled(this.activeOperations);
|
|
1262
1262
|
}
|
|
1263
1263
|
async disposeProcesses(abortSignal) {
|
|
1264
1264
|
if (this.processDisposed) return;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/docker-sandbox.ts","../src/docker-process.ts","../src/path.ts","../src/text-file.ts","../src/tools.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstat, mkdtemp, readFile, realpath, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { assertDockerCli, decodeUtf8, runDockerCli } from \"./docker-cli\";\nimport { DockerProcessManager } from \"./docker-process\";\nimport { DockerSandboxError } from \"./errors\";\nimport { containerPath, normalizeSandboxPath, parentSandboxPath } from \"./path\";\nimport { createTextFilePage } from \"./text-file\";\nimport type {\n CreateDockerSandboxOptions,\n DockerSandbox,\n DockerSandboxClientOptions,\n DockerSandboxExecOptions,\n DockerSandboxExecResult,\n DockerSandboxExecStreamEvent,\n DockerSandboxFileEntry,\n DockerSandboxFileType,\n DockerSandboxInspectionOptions,\n DockerSandboxInspector,\n DockerSandboxListFilesOptions,\n DockerSandboxListProcessesOptions,\n DockerSandboxProcessInfo,\n DockerSandboxProcessLogs,\n DockerSandboxProcessStartOptions,\n DockerSandboxPublishedPort,\n DockerSandboxReadFileOptions,\n DockerSandboxReadProcessLogsOptions,\n DockerSandboxReadTextFilePageOptions,\n DockerSandboxRuntime,\n DockerSandboxRuntimeLimits,\n DockerSandboxState,\n DockerSandboxStopProcessOptions,\n DockerSandboxTextFilePage,\n DockerSandboxWaitForPortOptions,\n DockerSandboxWorkspace,\n DockerSandboxWriteFileOptions,\n DockerSandboxWriteTextFileOptions,\n PullDockerImageOptions,\n ResumeDockerSandboxOptions,\n} from \"./types\";\n\nconst schemaVersion = \"1\";\nconst labelPrefix = \"anvia.sandbox.\";\nconst defaultWorkdir = \"/workspace\";\nconst defaultCommandTimeoutMs = 30_000;\nconst defaultMaxOutputBytes = 1024 * 1024;\nconst defaultMaxFileBytes = 10 * 1024 * 1024;\nconst defaultMaxProcesses = 4;\nconst defaultTextFilePageLines = 500;\nconst defaultTextFilePageBytes = 64 * 1024;\nconst defaultPortWaitTimeoutMs = 30_000;\nconst defaultPortWaitIntervalMs = 100;\nconst idPattern = /^[a-z0-9](?:[a-z0-9_.-]{0,62})$/;\nconst envKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst labels = {\n schema: `${labelPrefix}schema`,\n id: `${labelPrefix}id`,\n workdir: `${labelPrefix}workdir`,\n workspaceType: `${labelPrefix}workspace.type`,\n workspaceVolume: `${labelPrefix}workspace.volume`,\n networkMode: `${labelPrefix}network.mode`,\n commandTimeoutMs: `${labelPrefix}runtime.command-timeout-ms`,\n maxOutputBytes: `${labelPrefix}runtime.max-output-bytes`,\n maxFileBytes: `${labelPrefix}runtime.max-file-bytes`,\n maxProcesses: `${labelPrefix}runtime.max-processes`,\n} as const;\n\nconst portProbeScript = [\n 'port=\"$(printf \\'%04X\\' \"$1\")\"',\n \"for table in /proc/net/tcp /proc/net/tcp6; do\",\n ' [ -r \"$table\" ] || continue',\n \" while read -r _ local _ state _; do\",\n ' case \"$local\" in',\n ' \"00000000:$port\"|\"00000000000000000000000000000000:$port\")',\n ' [ \"$state\" = \"0A\" ] && exit 0',\n \" ;;\",\n \" esac\",\n ' done < \"$table\"',\n \"done\",\n \"exit 1\",\n].join(\"\\n\");\n\ntype ResolvedRuntimeLimits = Required<DockerSandboxRuntimeLimits>;\n\ntype SandboxConfiguration = {\n id: string;\n containerName: string;\n workdir: string;\n workspace: DockerSandboxWorkspace;\n volumeName: string;\n ownsVolume: boolean;\n env: Record<string, string>;\n runtime: ResolvedRuntimeLimits;\n publishedPorts: DockerSandboxPublishedPort[];\n};\n\nexport class DockerSandboxClient {\n private readonly dockerPath: string;\n\n constructor(options: DockerSandboxClientOptions = {}) {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n this.dockerPath = options.dockerPath ?? \"docker\";\n assertNonEmptyString(this.dockerPath, \"dockerPath\");\n }\n\n async pullImage(options: PullDockerImageOptions): Promise<void> {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n assertNonEmptyString(options.image, \"image\");\n options.abortSignal?.throwIfAborted();\n await assertDockerCli([\"pull\", options.image], this.cliOptions(options.abortSignal));\n }\n\n async createSandbox(options: CreateDockerSandboxOptions): Promise<DockerSandbox> {\n validateCreateOptions(options);\n options = snapshotCreateOptions(options);\n options.abortSignal?.throwIfAborted();\n\n const id = options.id ?? randomUUID();\n assertSandboxId(id);\n const containerName = containerNameFor(id);\n const workdir = options.workdir ?? defaultWorkdir;\n const runtime = resolveRuntimeLimits(options.runtime);\n const workspace = copyWorkspace(options.workspace);\n const network = copyNetwork(options.network);\n const env = copyStringRecord(options.env, \"env\");\n const userLabels = copyStringRecord(options.labels, \"labels\");\n const volumeName =\n workspace.type === \"ephemeral\"\n ? `${containerName}-workspace-${randomUUID()}`\n : workspace.name;\n const ownsVolume = workspace.type === \"ephemeral\";\n\n await this.assertContainerDoesNotExist(containerName, options.abortSignal);\n await this.assertImageExists(options.image, options.abortSignal);\n if (workspace.type === \"docker-volume\") {\n await this.assertVolumeExists(workspace.name, options.abortSignal);\n }\n\n let containerCreated = false;\n let volumeCreated = false;\n try {\n if (workspace.type === \"ephemeral\") {\n await assertDockerCli(\n [\"volume\", \"create\", \"--label\", `${labels.id}=${id}`, volumeName],\n this.cliOptions(options.abortSignal),\n );\n volumeCreated = true;\n }\n await assertDockerCli(\n createRunArgs({\n id,\n containerName,\n image: options.image,\n workdir,\n workspace,\n volumeName,\n env,\n user: options.user,\n userLabels,\n resources: options.resources,\n runtime,\n security: options.security,\n network,\n }),\n {\n ...this.cliOptions(options.abortSignal),\n timeoutMs: runtime.commandTimeoutMs,\n },\n );\n containerCreated = true;\n\n const publishedPorts = await inspectPublishedPorts({\n dockerPath: this.dockerPath,\n containerName,\n ports: network.mode === \"bridge\" ? [...(network.ports ?? [])] : [],\n abortSignal: options.abortSignal,\n });\n const sandbox = this.createHandle({\n id,\n containerName,\n workdir,\n workspace,\n volumeName,\n ownsVolume,\n env,\n runtime,\n publishedPorts,\n });\n await applyInitialContent(sandbox.runtime, options);\n return sandbox;\n } catch (error) {\n const cleanupErrors: unknown[] = [];\n if (containerCreated) {\n try {\n await removeContainer(this.dockerPath, containerName);\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n if (ownsVolume && volumeCreated) {\n try {\n await removeVolume(this.dockerPath, volumeName);\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n if (cleanupErrors.length > 0) {\n throw new AggregateError([error, ...cleanupErrors], \"Sandbox creation and rollback failed\");\n }\n throw error;\n }\n }\n\n async resumeSandbox(options: ResumeDockerSandboxOptions): Promise<DockerSandbox> {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n assertSandboxId(options.id);\n options.abortSignal?.throwIfAborted();\n const containerName = containerNameFor(options.id);\n const inspection = await inspectContainer(\n this.dockerPath,\n containerName,\n options.abortSignal,\n true,\n );\n const configuration = configurationFromInspection(options.id, containerName, inspection);\n\n if (inspection.State.Paused === true || inspection.State.Dead === true) {\n throw new DockerSandboxError(\n `Sandbox cannot be resumed from Docker state: ${inspection.State.Status ?? \"unknown\"}`,\n \"invalid_state\",\n );\n }\n if (inspection.State.Running === true) {\n await assertDockerCli([\"stop\", containerName], this.cliOptions(options.abortSignal));\n }\n await assertDockerCli([\"start\", containerName], this.cliOptions(options.abortSignal));\n configuration.publishedPorts = await inspectPublishedPorts({\n dockerPath: this.dockerPath,\n containerName,\n ports: configuredContainerPorts(inspection),\n abortSignal: options.abortSignal,\n });\n return this.createHandle(configuration);\n }\n\n private createHandle(configuration: SandboxConfiguration): DockerSandbox {\n return new DockerSandboxHandle({\n dockerPath: this.dockerPath,\n configuration,\n });\n }\n\n private async assertImageExists(image: string, abortSignal?: AbortSignal): Promise<void> {\n const result = await runDockerCli([\"image\", \"inspect\", image], this.cliOptions(abortSignal));\n if (result.exitCode === 0) return;\n const message = safeDecode(result.stderr);\n if (message.toLowerCase().includes(\"no such image\")) {\n throw new DockerSandboxError(\n `Docker image is not available locally: ${image}`,\n \"image_not_found\",\n );\n }\n throw new DockerSandboxError(\n \"Unable to inspect Docker image.\",\n \"docker_command_failed\",\n result,\n );\n }\n\n private async assertContainerDoesNotExist(\n containerName: string,\n abortSignal?: AbortSignal,\n ): Promise<void> {\n const result = await runDockerCli([\"container\", \"inspect\", containerName], {\n ...this.cliOptions(abortSignal),\n maxOutputBytes: defaultMaxOutputBytes,\n });\n if (result.exitCode === 0) {\n throw new DockerSandboxError(\n `A Docker container already exists for sandbox: ${containerName}`,\n \"invalid_state\",\n );\n }\n if (safeDecode(result.stderr).toLowerCase().includes(\"no such\")) return;\n throw new DockerSandboxError(\n \"Unable to check whether the Docker sandbox already exists.\",\n \"docker_command_failed\",\n result,\n );\n }\n\n private async assertVolumeExists(name: string, abortSignal?: AbortSignal): Promise<void> {\n const result = await runDockerCli([\"volume\", \"inspect\", name], this.cliOptions(abortSignal));\n if (result.exitCode === 0) return;\n const message = safeDecode(result.stderr);\n if (message.toLowerCase().includes(\"no such volume\")) {\n throw new DockerSandboxError(`Docker volume does not exist: ${name}`, \"volume_not_found\");\n }\n throw new DockerSandboxError(\n \"Unable to inspect Docker volume.\",\n \"docker_command_failed\",\n result,\n );\n }\n\n private cliOptions(abortSignal?: AbortSignal) {\n return { dockerPath: this.dockerPath, signal: abortSignal };\n }\n}\n\nclass DockerSandboxHandle implements DockerSandbox {\n readonly id: string;\n readonly runtime: DockerSandboxRuntime;\n\n private currentState: DockerSandboxState = \"running\";\n private readonly dockerPath: string;\n private readonly configuration: SandboxConfiguration;\n private readonly runtimeImpl: DockerSandboxRuntimeImpl;\n private stopPromise: Promise<void> | undefined;\n private destroyPromise: Promise<void> | undefined;\n\n constructor(options: { dockerPath: string; configuration: SandboxConfiguration }) {\n this.dockerPath = options.dockerPath;\n this.configuration = options.configuration;\n this.id = options.configuration.id;\n this.runtimeImpl = new DockerSandboxRuntimeImpl({\n configuration: options.configuration,\n dockerPath: options.dockerPath,\n state: () => this.currentState,\n });\n this.runtime = Object.freeze(this.runtimeImpl.publicRuntime());\n }\n\n get state(): DockerSandboxState {\n return this.currentState;\n }\n\n inspector(options: DockerSandboxInspectionOptions): DockerSandboxInspector {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (options.files !== true && options.ports !== true && options.processes !== true) {\n throw new TypeError(\"Sandbox inspector must enable at least one capability.\");\n }\n let inspector: DockerSandboxInspector = {\n id: this.id,\n provider: \"docker\",\n workdir: this.configuration.workdir,\n };\n if (options.files === true) {\n inspector = {\n ...inspector,\n listFiles: this.runtime.listFiles.bind(this.runtime),\n readFile: this.runtime.readFile.bind(this.runtime),\n };\n }\n if (options.ports === true) {\n inspector = { ...inspector, publishedPorts: this.runtime.publishedPorts };\n }\n if (options.processes === true) {\n inspector = {\n ...inspector,\n listProcesses: this.runtime.listProcesses.bind(this.runtime),\n readProcessLogs: this.runtime.readProcessLogs.bind(this.runtime),\n };\n }\n return Object.freeze(inspector);\n }\n\n async stop(options: Readonly<{ abortSignal?: AbortSignal }> = {}): Promise<void> {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (this.currentState === \"stopped\") return;\n if (this.currentState === \"destroyed\" || this.currentState === \"destroying\") {\n throw invalidState(this.id, this.currentState);\n }\n if (this.stopPromise !== undefined) return this.stopPromise;\n this.stopPromise = this.performStop(options.abortSignal);\n try {\n await this.stopPromise;\n } finally {\n this.stopPromise = undefined;\n }\n }\n\n private async performStop(abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n this.currentState = \"stopping\";\n try {\n await this.runtimeImpl.closeActiveOperations(\"Sandbox is stopping.\");\n await this.runtimeImpl.disposeProcesses(abortSignal);\n await assertDockerCli([\"stop\", this.configuration.containerName], {\n dockerPath: this.dockerPath,\n signal: abortSignal,\n });\n this.currentState = \"stopped\";\n } catch (error) {\n this.currentState = \"error\";\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n if (this.currentState === \"destroyed\") return;\n if (this.destroyPromise !== undefined) return this.destroyPromise;\n this.destroyPromise = this.performDestroy();\n try {\n await this.destroyPromise;\n } finally {\n this.destroyPromise = undefined;\n }\n }\n\n private async performDestroy(): Promise<void> {\n if (this.stopPromise !== undefined) await this.stopPromise.catch(() => undefined);\n this.currentState = \"destroying\";\n const failures: unknown[] = [];\n try {\n await this.runtimeImpl.closeActiveOperations(\"Sandbox is being destroyed.\");\n } catch (error) {\n failures.push(error);\n }\n try {\n await this.runtimeImpl.disposeProcesses();\n } catch (error) {\n failures.push(error);\n }\n try {\n await removeContainer(this.dockerPath, this.configuration.containerName);\n } catch (error) {\n failures.push(error);\n }\n if (this.configuration.ownsVolume) {\n try {\n await removeVolume(this.dockerPath, this.configuration.volumeName);\n } catch (error) {\n failures.push(error);\n }\n }\n if (failures.length > 0) {\n this.currentState = \"error\";\n throw new AggregateError(failures, `Unable to destroy sandbox: ${this.id}`);\n }\n this.currentState = \"destroyed\";\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.destroy();\n }\n}\n\nclass DockerSandboxRuntimeImpl {\n private readonly configuration: SandboxConfiguration;\n private readonly dockerPath: string;\n private readonly state: () => DockerSandboxState;\n private readonly processManager: DockerProcessManager;\n private readonly activeControllers = new Set<AbortController>();\n private readonly activeOperations = new Set<Promise<unknown>>();\n private processDisposed = false;\n\n constructor(options: {\n configuration: SandboxConfiguration;\n dockerPath: string;\n state: () => DockerSandboxState;\n }) {\n this.configuration = options.configuration;\n this.dockerPath = options.dockerPath;\n this.state = options.state;\n this.processManager = new DockerProcessManager({\n containerName: options.configuration.containerName,\n dockerPath: options.dockerPath,\n workdir: options.configuration.workdir,\n env: options.configuration.env,\n maxOutputBytes: options.configuration.runtime.maxOutputBytes,\n maxProcesses: options.configuration.runtime.maxProcesses,\n startupTimeoutMs: options.configuration.runtime.commandTimeoutMs,\n });\n }\n\n publicRuntime(): DockerSandboxRuntime {\n return {\n id: this.configuration.id,\n provider: \"docker\",\n workdir: this.configuration.workdir,\n publishedPorts: Object.freeze(\n this.configuration.publishedPorts.map((port) => Object.freeze({ ...port })),\n ),\n exec: (options) => this.exec(options),\n execStream: (options) => this.execStream(options),\n readFile: (options) => this.readFile(options),\n readTextFile: (options) => this.readTextFile(options),\n readTextFilePage: (options) => this.readTextFilePage(options),\n writeFile: (options) => this.writeFile(options),\n writeTextFile: (options) => this.writeTextFile(options),\n listFiles: (options) => this.listFiles(options),\n startProcess: (options) => this.startProcess(options),\n listProcesses: (options) => this.listProcesses(options),\n readProcessLogs: (options) => this.readProcessLogs(options),\n stopProcess: (options) => this.stopProcess(options),\n waitForPort: (options) => this.waitForPort(options),\n };\n }\n\n async exec(options: DockerSandboxExecOptions): Promise<DockerSandboxExecResult> {\n validateExecOptions(options);\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const result = await runDockerCli(this.execArgs(options), {\n dockerPath: this.dockerPath,\n timeoutMs: options.timeoutMs ?? this.configuration.runtime.commandTimeoutMs,\n maxOutputBytes: this.configuration.runtime.maxOutputBytes,\n input: options.input,\n signal: abortSignal,\n });\n return toExecResult(result);\n });\n }\n\n async *execStream(\n options: DockerSandboxExecOptions,\n ): AsyncIterable<DockerSandboxExecStreamEvent> {\n validateExecOptions(options);\n this.assertRunning();\n const streamAbort = new AbortController();\n const combined = combineSignals(options.abortSignal, streamAbort.signal);\n const queue: DockerSandboxExecStreamEvent[] = [];\n let queuedBytes = 0;\n let wake: (() => void) | undefined;\n let complete = false;\n let failure: unknown;\n const push = (event: DockerSandboxExecStreamEvent) => {\n if (event.type !== \"result\") {\n queuedBytes += event.data.byteLength;\n if (queuedBytes > this.configuration.runtime.maxOutputBytes) {\n streamAbort.abort(\n new DockerSandboxError(\"Sandbox stream consumer is too slow.\", \"docker_command_failed\"),\n );\n return;\n }\n }\n queue.push(event);\n wake?.();\n wake = undefined;\n };\n const run = this.runOperation(combined, async (abortSignal) => {\n const result = await runDockerCli(this.execArgs(options), {\n dockerPath: this.dockerPath,\n timeoutMs: options.timeoutMs ?? this.configuration.runtime.commandTimeoutMs,\n maxOutputBytes: this.configuration.runtime.maxOutputBytes,\n input: options.input,\n signal: abortSignal,\n onStdout: (data) => push({ type: \"stdout\", data: data.slice() }),\n onStderr: (data) => push({ type: \"stderr\", data: data.slice() }),\n });\n push({ type: \"result\", result: toExecResult(result) });\n });\n void run.then(\n () => {\n complete = true;\n wake?.();\n },\n (error) => {\n failure = error;\n complete = true;\n wake?.();\n },\n );\n\n try {\n while (!complete || queue.length > 0) {\n const event = queue.shift();\n if (event !== undefined) {\n if (event.type !== \"result\") queuedBytes -= event.data.byteLength;\n yield event;\n continue;\n }\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n if (failure !== undefined) throw failure;\n } finally {\n if (!complete) streamAbort.abort(new DOMException(\"Stream closed\", \"AbortError\"));\n await run.catch(() => undefined);\n }\n }\n\n async readFile(options: DockerSandboxReadFileOptions): Promise<Uint8Array> {\n assertReadOptions(options);\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const normalized = normalizeSandboxPath(options.path);\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"anvia-sandbox-read-\"));\n const target = path.join(tempDir, path.basename(normalized));\n try {\n await assertDockerCli(\n [\n \"cp\",\n `${this.configuration.containerName}:${containerPath(this.configuration.workdir, normalized)}`,\n target,\n ],\n { dockerPath: this.dockerPath, signal: abortSignal },\n );\n await assertCopiedRegularFile(tempDir, target, normalized);\n const bytes = await readFile(target, { signal: abortSignal });\n this.assertFileSize(bytes.byteLength, normalized);\n return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength).slice();\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n });\n }\n\n async readTextFile(options: DockerSandboxReadFileOptions): Promise<string> {\n return decodeUtf8(await this.readFile(options));\n }\n\n async readTextFilePage(\n options: DockerSandboxReadTextFilePageOptions,\n ): Promise<DockerSandboxTextFilePage> {\n assertReadOptions(options);\n const startLine = options.startLine ?? 1;\n const lineCount = options.lineCount ?? defaultTextFilePageLines;\n const maxBytes = options.maxBytes ?? defaultTextFilePageBytes;\n assertPositiveSafeInteger(startLine, \"startLine\");\n assertPositiveSafeInteger(lineCount, \"lineCount\");\n assertPositiveSafeInteger(maxBytes, \"maxBytes\");\n let readOptions: DockerSandboxReadFileOptions = {\n path: options.path,\n };\n if (options.abortSignal !== undefined) {\n readOptions = { ...readOptions, abortSignal: options.abortSignal };\n }\n const text = await this.readTextFile(readOptions);\n return createTextFilePage(text, { startLine, lineCount, maxBytes });\n }\n\n async writeFile(options: DockerSandboxWriteFileOptions): Promise<void> {\n assertOptionsObject(options);\n if (!(options.data instanceof Uint8Array)) throw new TypeError(\"data must be a Uint8Array.\");\n const data = options.data.slice();\n await this.writeBytes(options.path, data, options.abortSignal);\n }\n\n async writeTextFile(options: DockerSandboxWriteTextFileOptions): Promise<void> {\n assertOptionsObject(options);\n if (typeof options.text !== \"string\") throw new TypeError(\"text must be a string.\");\n await this.writeBytes(\n options.path,\n new TextEncoder().encode(options.text),\n options.abortSignal,\n );\n }\n\n private async writeBytes(\n filePath: string,\n data: Uint8Array,\n abortSignal?: AbortSignal,\n ): Promise<void> {\n const normalized = normalizeSandboxPath(filePath);\n this.assertFileSize(data.byteLength, normalized);\n await this.runOperation(abortSignal, async (effectiveSignal) => {\n await this.mkdir(parentSandboxPath(normalized), effectiveSignal);\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"anvia-sandbox-write-\"));\n const source = path.join(tempDir, path.basename(normalized));\n try {\n await writeFile(source, data, { signal: effectiveSignal });\n await assertDockerCli(\n [\n \"cp\",\n source,\n `${this.configuration.containerName}:${containerPath(this.configuration.workdir, normalized)}`,\n ],\n { dockerPath: this.dockerPath, signal: effectiveSignal },\n );\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n });\n }\n\n async listFiles(\n options: DockerSandboxListFilesOptions = {},\n ): Promise<readonly DockerSandboxFileEntry[]> {\n assertOptionsObject(options);\n const requestedPath = options.path ?? \".\";\n const normalized = normalizeSandboxPath(requestedPath, { allowRoot: true });\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const result = await this.execCommand(\n {\n command: \"find\",\n args: [\n containerPath(this.configuration.workdir, normalized),\n \"-mindepth\",\n \"1\",\n \"-maxdepth\",\n \"1\",\n \"-printf\",\n \"%p\\t%y\\t%s\\n\",\n ],\n },\n abortSignal,\n );\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new DockerSandboxError(\n \"Unable to list sandbox files.\",\n \"docker_command_failed\",\n result,\n );\n }\n const output = decodeUtf8(result.stdout);\n return output\n .split(\"\\n\")\n .filter((line) => line.length > 0)\n .map((line) => parseFindEntry(line, this.configuration.workdir));\n });\n }\n\n async startProcess(options: DockerSandboxProcessStartOptions): Promise<DockerSandboxProcessInfo> {\n validateProcessStartOptions(options);\n return this.runOperation(options.abortSignal, async (abortSignal) =>\n this.processManager.start({ ...options, abortSignal }),\n );\n }\n\n async listProcesses(\n options: DockerSandboxListProcessesOptions = {},\n ): Promise<readonly DockerSandboxProcessInfo[]> {\n assertOptionsObject(options);\n return this.runOperation(options.abortSignal, async () => this.processManager.list());\n }\n\n async readProcessLogs(\n options: DockerSandboxReadProcessLogsOptions,\n ): Promise<DockerSandboxProcessLogs> {\n assertOptionsObject(options);\n assertNonEmptyString(options.processId, \"processId\");\n if (options.tailBytes !== undefined)\n assertNonNegativeSafeInteger(options.tailBytes, \"tailBytes\");\n return this.runOperation(options.abortSignal, async () =>\n this.processManager.logs(options.processId, options.tailBytes),\n );\n }\n\n async stopProcess(options: DockerSandboxStopProcessOptions): Promise<DockerSandboxProcessInfo> {\n assertOptionsObject(options);\n assertNonEmptyString(options.processId, \"processId\");\n if (options.gracePeriodMs !== undefined) {\n assertNonNegativeSafeInteger(options.gracePeriodMs, \"gracePeriodMs\");\n }\n return this.runOperation(options.abortSignal, async (abortSignal) =>\n this.processManager.stop(options.processId, options.gracePeriodMs, abortSignal),\n );\n }\n\n async waitForPort(options: DockerSandboxWaitForPortOptions): Promise<DockerSandboxPublishedPort> {\n assertOptionsObject(options);\n assertPort(options.containerPort);\n const publishedPort = this.configuration.publishedPorts.find(\n (candidate) => candidate.containerPort === options.containerPort,\n );\n if (publishedPort === undefined) {\n throw new DockerSandboxError(\n `Sandbox port is not published: ${options.containerPort}/tcp`,\n \"port\",\n );\n }\n const timeoutMs = options.timeoutMs ?? defaultPortWaitTimeoutMs;\n const intervalMs = options.intervalMs ?? defaultPortWaitIntervalMs;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n assertPositiveSafeInteger(intervalMs, \"intervalMs\");\n\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n const result = await this.execCommand(\n {\n command: \"sh\",\n args: [\"-c\", portProbeScript, \"anvia-port-probe\", `${options.containerPort}`],\n timeoutMs: Math.min(5_000, timeoutMs),\n },\n abortSignal,\n );\n if (result.status === \"exited\" && result.exitCode === 0) return { ...publishedPort };\n if (Date.now() >= deadline) {\n throw new DockerSandboxError(\n `Waiting for sandbox port timed out: ${options.containerPort}`,\n \"timeout\",\n );\n }\n await waitWithSignal(Math.min(intervalMs, deadline - Date.now()), abortSignal);\n }\n });\n }\n\n async closeActiveOperations(message: string): Promise<void> {\n const reason = new DockerSandboxError(message, \"invalid_state\");\n for (const controller of this.activeControllers) controller.abort(reason);\n await Promise.allSettled([...this.activeOperations]);\n }\n\n async disposeProcesses(abortSignal?: AbortSignal): Promise<void> {\n if (this.processDisposed) return;\n await this.processManager.dispose(abortSignal);\n this.processDisposed = true;\n }\n\n private async runOperation<T>(\n abortSignal: AbortSignal | undefined,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n this.assertRunning();\n abortSignal?.throwIfAborted();\n const controller = new AbortController();\n const effectiveSignal = combineSignals(abortSignal, controller.signal);\n const execution = operation(effectiveSignal);\n this.activeControllers.add(controller);\n this.activeOperations.add(execution);\n try {\n return await execution;\n } finally {\n this.activeControllers.delete(controller);\n this.activeOperations.delete(execution);\n }\n }\n\n private assertRunning(): void {\n const current = this.state();\n if (current !== \"running\") throw invalidState(this.configuration.id, current);\n }\n\n private execArgs(options: DockerSandboxExecOptions): string[] {\n const args = [\"exec\"];\n if (options.input !== undefined) args.push(\"-i\");\n args.push(\"-w\", containerPath(this.configuration.workdir, options.cwd ?? \".\"));\n for (const [key, value] of Object.entries(options.env ?? {}))\n args.push(\"-e\", `${key}=${value}`);\n args.push(this.configuration.containerName, options.command, ...(options.args ?? []));\n return args;\n }\n\n private async execCommand(\n options: Omit<DockerSandboxExecOptions, \"abortSignal\">,\n abortSignal: AbortSignal,\n ): Promise<DockerSandboxExecResult> {\n const result = await runDockerCli(this.execArgs(options), {\n dockerPath: this.dockerPath,\n timeoutMs: options.timeoutMs ?? this.configuration.runtime.commandTimeoutMs,\n maxOutputBytes: this.configuration.runtime.maxOutputBytes,\n input: options.input,\n signal: abortSignal,\n });\n return toExecResult(result);\n }\n\n private async mkdir(directory: string, abortSignal: AbortSignal): Promise<void> {\n if (directory === \".\") return;\n const result = await this.execCommand(\n { command: \"mkdir\", args: [\"-p\", containerPath(this.configuration.workdir, directory)] },\n abortSignal,\n );\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new DockerSandboxError(\n \"Unable to create sandbox directory.\",\n \"docker_command_failed\",\n result,\n );\n }\n }\n\n private assertFileSize(size: number, filePath: string): void {\n if (size > this.configuration.runtime.maxFileBytes) {\n throw new DockerSandboxError(\n `Sandbox file exceeds maxFileBytes (${size} > ${this.configuration.runtime.maxFileBytes}): ${filePath}`,\n \"file_too_large\",\n );\n }\n }\n}\n\nasync function applyInitialContent(\n runtime: DockerSandboxRuntime,\n options: CreateDockerSandboxOptions,\n): Promise<void> {\n for (const directory of options.directories ?? []) {\n const marker = path.posix.join(normalizeSandboxPath(directory), \".anvia-keep\");\n const abort = options.abortSignal === undefined ? {} : { abortSignal: options.abortSignal };\n await runtime.writeFile({ path: marker, data: new Uint8Array(), ...abort });\n const removed = await runtime.exec({ command: \"rm\", args: [marker], ...abort });\n if (removed.status !== \"exited\" || removed.exitCode !== 0) {\n throw new DockerSandboxError(\n `Unable to create initial sandbox directory: ${directory}`,\n \"docker_command_failed\",\n removed,\n );\n }\n }\n for (const [filePath, content] of Object.entries(options.files ?? {})) {\n if (typeof content === \"string\") {\n let writeOptions: DockerSandboxWriteTextFileOptions = {\n path: filePath,\n text: content,\n };\n if (options.abortSignal !== undefined) {\n writeOptions = { ...writeOptions, abortSignal: options.abortSignal };\n }\n await runtime.writeTextFile(writeOptions);\n } else {\n let writeOptions: DockerSandboxWriteFileOptions = {\n path: filePath,\n data: content,\n };\n if (options.abortSignal !== undefined) {\n writeOptions = { ...writeOptions, abortSignal: options.abortSignal };\n }\n await runtime.writeFile(writeOptions);\n }\n }\n}\n\nfunction createRunArgs(options: {\n id: string;\n containerName: string;\n image: string;\n workdir: string;\n workspace: DockerSandboxWorkspace;\n volumeName: string;\n env: Record<string, string>;\n user: string | undefined;\n userLabels: Record<string, string>;\n resources: CreateDockerSandboxOptions[\"resources\"] | undefined;\n runtime: ResolvedRuntimeLimits;\n security: CreateDockerSandboxOptions[\"security\"] | undefined;\n network: CreateDockerSandboxOptions[\"network\"];\n}): string[] {\n const runtimeLabels: Record<string, string> = {\n [labels.schema]: schemaVersion,\n [labels.id]: options.id,\n [labels.workdir]: options.workdir,\n [labels.workspaceType]: options.workspace.type,\n [labels.workspaceVolume]: options.volumeName,\n [labels.networkMode]: options.network.mode,\n [labels.commandTimeoutMs]: `${options.runtime.commandTimeoutMs}`,\n [labels.maxOutputBytes]: `${options.runtime.maxOutputBytes}`,\n [labels.maxFileBytes]: `${options.runtime.maxFileBytes}`,\n [labels.maxProcesses]: `${options.runtime.maxProcesses}`,\n };\n const args = [\n \"run\",\n \"-d\",\n \"--name\",\n options.containerName,\n \"--mount\",\n `type=volume,src=${options.volumeName},dst=${options.workdir}`,\n \"-w\",\n options.workdir,\n ];\n for (const [key, value] of Object.entries({ ...options.userLabels, ...runtimeLabels })) {\n args.push(\"--label\", `${key}=${value}`);\n }\n for (const [key, value] of Object.entries(options.env)) args.push(\"--env\", `${key}=${value}`);\n if (options.user !== undefined) args.push(\"--user\", options.user);\n if (options.network.mode === \"none\") {\n args.push(\"--network\", \"none\");\n } else {\n for (const port of options.network.ports ?? [])\n args.push(\"--publish\", `127.0.0.1::${port}/tcp`);\n }\n if (options.resources?.memoryMb !== undefined)\n args.push(\"--memory\", `${options.resources.memoryMb}m`);\n if (options.resources?.cpus !== undefined) args.push(\"--cpus\", `${options.resources.cpus}`);\n if (options.resources?.pidsLimit !== undefined) {\n args.push(\"--pids-limit\", `${options.resources.pidsLimit}`);\n }\n if (options.resources?.sharedMemoryMb !== undefined) {\n args.push(\"--shm-size\", `${options.resources.sharedMemoryMb}m`);\n }\n if (options.security?.readonlyRootfs === true) args.push(\"--read-only\");\n if (options.security?.noNewPrivileges ?? true)\n args.push(\"--security-opt\", \"no-new-privileges:true\");\n if (options.security?.seccompProfile !== undefined) {\n args.push(\"--security-opt\", `seccomp=${options.security.seccompProfile.path}`);\n }\n for (const capability of options.security?.dropCapabilities ?? [\"ALL\"]) {\n args.push(\"--cap-drop\", capability);\n }\n for (const capability of options.security?.addCapabilities ?? []) {\n args.push(\"--cap-add\", capability);\n }\n args.push(\n options.image,\n \"sh\",\n \"-c\",\n \"trap 'exit 0' TERM INT; while :; do sleep 3600 & wait $!; done\",\n );\n return args;\n}\n\nfunction validateCreateOptions(options: CreateDockerSandboxOptions): void {\n if (options === null || typeof options !== \"object\")\n throw new TypeError(\"options must be an object.\");\n assertNonEmptyString(options.image, \"image\");\n if (options.id !== undefined) assertSandboxId(options.id);\n const workdir = options.workdir ?? defaultWorkdir;\n if (!path.posix.isAbsolute(workdir) || workdir.includes(\"\\0\")) {\n throw new TypeError(\"workdir must be an absolute POSIX path.\");\n }\n if (!isRecord(options.workspace)) throw new TypeError(\"workspace must be an object.\");\n if (options.workspace.type === \"docker-volume\") assertDockerVolumeName(options.workspace.name);\n if (options.workspace.type !== \"ephemeral\" && options.workspace.type !== \"docker-volume\") {\n throw new TypeError(\"workspace must use type ephemeral or docker-volume.\");\n }\n if (options.workspace.type === \"ephemeral\" && \"name\" in options.workspace) {\n throw new TypeError(\"An ephemeral workspace cannot specify a Docker volume name.\");\n }\n if (!isRecord(options.network)) throw new TypeError(\"network must be an object.\");\n if (options.network.mode !== \"none\" && options.network.mode !== \"bridge\") {\n throw new TypeError(\"network must use mode none or bridge.\");\n }\n if (options.network.mode === \"none\" && \"ports\" in options.network) {\n throw new TypeError(\"Network mode none cannot publish ports.\");\n }\n if (options.network.mode === \"bridge\") {\n if (options.network.ports !== undefined && !Array.isArray(options.network.ports)) {\n throw new TypeError(\"network.ports must be an array.\");\n }\n validatePorts(options.network.ports ?? []);\n }\n validateRuntimeLimits(options.runtime);\n validateResources(options.resources);\n validateSecurity(options.security);\n copyStringRecord(options.env, \"env\");\n const userLabels = copyStringRecord(options.labels, \"labels\");\n for (const key of Object.keys(userLabels)) {\n if (key.startsWith(labelPrefix)) throw new TypeError(`Docker label is reserved: ${key}`);\n }\n if (options.user !== undefined) assertNonEmptyString(options.user, \"user\");\n if (options.directories !== undefined && !Array.isArray(options.directories)) {\n throw new TypeError(\"directories must be an array.\");\n }\n for (const directory of options.directories ?? []) {\n if (typeof directory !== \"string\") throw new TypeError(\"directories must contain strings.\");\n normalizeSandboxPath(directory);\n }\n if (options.files !== undefined && !isRecord(options.files)) {\n throw new TypeError(\"files must be an object.\");\n }\n for (const [filePath, content] of Object.entries(options.files ?? {})) {\n normalizeSandboxPath(filePath);\n if (typeof content !== \"string\" && !(content instanceof Uint8Array)) {\n throw new TypeError(`Initial file must be a string or Uint8Array: ${filePath}`);\n }\n const byteLength =\n typeof content === \"string\"\n ? new TextEncoder().encode(content).byteLength\n : content.byteLength;\n const maxFileBytes = options.runtime?.maxFileBytes ?? defaultMaxFileBytes;\n if (byteLength > maxFileBytes) {\n throw new DockerSandboxError(\n `Initial file exceeds maxFileBytes (${byteLength} > ${maxFileBytes}): ${filePath}`,\n \"file_too_large\",\n );\n }\n }\n}\n\nfunction validateRuntimeLimits(runtime?: DockerSandboxRuntimeLimits): void {\n if (runtime !== undefined && !isRecord(runtime)) {\n throw new TypeError(\"runtime must be an object.\");\n }\n if (runtime?.commandTimeoutMs !== undefined)\n assertPositiveSafeInteger(runtime.commandTimeoutMs, \"commandTimeoutMs\");\n if (runtime?.maxOutputBytes !== undefined)\n assertNonNegativeSafeInteger(runtime.maxOutputBytes, \"maxOutputBytes\");\n if (runtime?.maxFileBytes !== undefined)\n assertNonNegativeSafeInteger(runtime.maxFileBytes, \"maxFileBytes\");\n if (runtime?.maxProcesses !== undefined)\n assertNonNegativeSafeInteger(runtime.maxProcesses, \"maxProcesses\");\n}\n\nfunction validateResources(resources: CreateDockerSandboxOptions[\"resources\"]): void {\n if (resources !== undefined && !isRecord(resources)) {\n throw new TypeError(\"resources must be an object.\");\n }\n if (resources?.memoryMb !== undefined) assertPositiveSafeInteger(resources.memoryMb, \"memoryMb\");\n if (resources?.pidsLimit !== undefined)\n assertPositiveSafeInteger(resources.pidsLimit, \"pidsLimit\");\n if (resources?.sharedMemoryMb !== undefined)\n assertPositiveSafeInteger(resources.sharedMemoryMb, \"sharedMemoryMb\");\n if (resources?.cpus !== undefined && (!Number.isFinite(resources.cpus) || resources.cpus <= 0)) {\n throw new RangeError(\"cpus must be a positive finite number.\");\n }\n}\n\nfunction validateSecurity(security: CreateDockerSandboxOptions[\"security\"]): void {\n if (security !== undefined && !isRecord(security)) {\n throw new TypeError(\"security must be an object.\");\n }\n if (security?.dropCapabilities !== undefined && !Array.isArray(security.dropCapabilities)) {\n throw new TypeError(\"dropCapabilities must be an array.\");\n }\n if (security?.addCapabilities !== undefined && !Array.isArray(security.addCapabilities)) {\n throw new TypeError(\"addCapabilities must be an array.\");\n }\n if (security?.readonlyRootfs !== undefined && typeof security.readonlyRootfs !== \"boolean\") {\n throw new TypeError(\"readonlyRootfs must be a boolean.\");\n }\n if (security?.noNewPrivileges !== undefined && typeof security.noNewPrivileges !== \"boolean\") {\n throw new TypeError(\"noNewPrivileges must be a boolean.\");\n }\n if (security?.seccompProfile !== undefined) {\n if (!isRecord(security.seccompProfile) || security.seccompProfile.type !== \"path\") {\n throw new TypeError('seccompProfile must be a { type: \"path\", path } object.');\n }\n assertNonEmptyString(security.seccompProfile.path, \"seccompProfile.path\");\n if (\n !path.isAbsolute(security.seccompProfile.path) ||\n security.seccompProfile.path.includes(\"\\0\")\n ) {\n throw new TypeError(\"seccompProfile.path must be an absolute host path.\");\n }\n }\n const seen = new Set<string>();\n for (const capability of security?.dropCapabilities ?? []) {\n assertNonEmptyString(capability, \"dropCapabilities value\");\n if (seen.has(capability))\n throw new TypeError(`dropCapabilities contains a duplicate: ${capability}`);\n seen.add(capability);\n }\n seen.clear();\n for (const capability of security?.addCapabilities ?? []) {\n assertNonEmptyString(capability, \"addCapabilities value\");\n if (seen.has(capability))\n throw new TypeError(`addCapabilities contains a duplicate: ${capability}`);\n seen.add(capability);\n }\n}\n\nfunction validateExecOptions(options: DockerSandboxExecOptions): void {\n assertOptionsObject(options);\n assertNonEmptyString(options.command, \"command\");\n if (\n options.args !== undefined &&\n (!Array.isArray(options.args) || !options.args.every((value) => typeof value === \"string\"))\n ) {\n throw new TypeError(\"args must contain only strings.\");\n }\n if (options.cwd !== undefined) normalizeSandboxPath(options.cwd, { allowRoot: true });\n copyStringRecord(options.env, \"env\");\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (\n options.input !== undefined &&\n typeof options.input !== \"string\" &&\n !(options.input instanceof Uint8Array)\n ) {\n throw new TypeError(\"input must be a string or Uint8Array.\");\n }\n}\n\nfunction validateProcessStartOptions(options: DockerSandboxProcessStartOptions): void {\n assertOptionsObject(options);\n assertNonEmptyString(options.command, \"command\");\n if (\n options.args !== undefined &&\n (!Array.isArray(options.args) || !options.args.every((value) => typeof value === \"string\"))\n ) {\n throw new TypeError(\"args must contain only strings.\");\n }\n if (options.cwd !== undefined) normalizeSandboxPath(options.cwd, { allowRoot: true });\n copyStringRecord(options.env, \"env\");\n}\n\nfunction assertReadOptions(options: DockerSandboxReadFileOptions): void {\n assertOptionsObject(options);\n normalizeSandboxPath(options.path);\n}\n\nfunction assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (!isRecord(value)) throw new TypeError(\"options must be an object.\");\n}\n\nfunction resolveRuntimeLimits(runtime?: DockerSandboxRuntimeLimits): ResolvedRuntimeLimits {\n return {\n commandTimeoutMs: runtime?.commandTimeoutMs ?? defaultCommandTimeoutMs,\n maxOutputBytes: runtime?.maxOutputBytes ?? defaultMaxOutputBytes,\n maxFileBytes: runtime?.maxFileBytes ?? defaultMaxFileBytes,\n maxProcesses: runtime?.maxProcesses ?? defaultMaxProcesses,\n };\n}\n\nfunction snapshotCreateOptions(options: CreateDockerSandboxOptions): CreateDockerSandboxOptions {\n const files: Record<string, string | Uint8Array> = {};\n for (const [filePath, content] of Object.entries(options.files ?? {})) {\n files[filePath] = typeof content === \"string\" ? content : content.slice();\n }\n const workspace = copyWorkspace(options.workspace);\n const network = copyNetwork(options.network);\n let snapshot: CreateDockerSandboxOptions = {\n image: options.image,\n workspace,\n network,\n };\n if (options.id !== undefined) snapshot = { ...snapshot, id: options.id };\n if (options.workdir !== undefined) snapshot = { ...snapshot, workdir: options.workdir };\n if (options.files !== undefined) snapshot = { ...snapshot, files: Object.freeze(files) };\n if (options.directories !== undefined) {\n snapshot = { ...snapshot, directories: Object.freeze([...options.directories]) };\n }\n if (options.env !== undefined) {\n snapshot = { ...snapshot, env: Object.freeze({ ...options.env }) };\n }\n if (options.user !== undefined) snapshot = { ...snapshot, user: options.user };\n if (options.labels !== undefined) {\n snapshot = { ...snapshot, labels: Object.freeze({ ...options.labels }) };\n }\n if (options.resources !== undefined) {\n snapshot = { ...snapshot, resources: Object.freeze({ ...options.resources }) };\n }\n if (options.runtime !== undefined) {\n snapshot = { ...snapshot, runtime: Object.freeze({ ...options.runtime }) };\n }\n if (options.security !== undefined) {\n let security: NonNullable<CreateDockerSandboxOptions[\"security\"]> = {\n ...options.security,\n };\n if (options.security.seccompProfile !== undefined) {\n security = {\n ...security,\n seccompProfile: Object.freeze({ ...options.security.seccompProfile }),\n };\n }\n if (options.security.dropCapabilities !== undefined) {\n security = {\n ...security,\n dropCapabilities: Object.freeze([...options.security.dropCapabilities]),\n };\n }\n if (options.security.addCapabilities !== undefined) {\n security = {\n ...security,\n addCapabilities: Object.freeze([...options.security.addCapabilities]),\n };\n }\n snapshot = { ...snapshot, security: Object.freeze(security) };\n }\n if (options.abortSignal !== undefined) {\n snapshot = { ...snapshot, abortSignal: options.abortSignal };\n }\n return Object.freeze(snapshot);\n}\n\nfunction configurationFromInspection(\n id: string,\n containerName: string,\n inspection: DockerContainerInspection,\n): SandboxConfiguration {\n const containerLabels = inspection.Config.Labels ?? {};\n if (containerLabels[labels.schema] !== schemaVersion || containerLabels[labels.id] !== id) {\n throw new DockerSandboxError(\n `Container is not an Anvia sandbox: ${containerName}`,\n \"sandbox_not_found\",\n );\n }\n const workdir = requiredLabel(containerLabels, labels.workdir);\n const workspaceType = requiredLabel(containerLabels, labels.workspaceType);\n const volumeName = requiredLabel(containerLabels, labels.workspaceVolume);\n const networkMode = requiredLabel(containerLabels, labels.networkMode);\n if (networkMode !== \"none\" && networkMode !== \"bridge\") invalidInspection(\"network mode\");\n const workspace: DockerSandboxWorkspace =\n workspaceType === \"ephemeral\"\n ? { type: \"ephemeral\" }\n : workspaceType === \"docker-volume\"\n ? { type: \"docker-volume\", name: volumeName }\n : invalidInspection(\"workspace type\");\n const runtime = {\n commandTimeoutMs: parseLabelInteger(containerLabels, labels.commandTimeoutMs, true),\n maxOutputBytes: parseLabelInteger(containerLabels, labels.maxOutputBytes, false),\n maxFileBytes: parseLabelInteger(containerLabels, labels.maxFileBytes, false),\n maxProcesses: parseLabelInteger(containerLabels, labels.maxProcesses, false),\n };\n return {\n id,\n containerName,\n workdir,\n workspace,\n volumeName,\n ownsVolume: workspace.type === \"ephemeral\",\n env: {},\n runtime,\n publishedPorts: [],\n };\n}\n\ntype DockerContainerInspection = {\n Config: { Labels?: Record<string, string>; WorkingDir?: string };\n HostConfig?: {\n PortBindings?: Record<string, Array<{ HostIp?: string; HostPort?: string }> | null>;\n };\n State: { Running?: boolean; Paused?: boolean; Dead?: boolean; Status?: string };\n NetworkSettings?: {\n Ports?: Record<string, Array<{ HostIp?: string; HostPort?: string }> | null>;\n };\n};\n\nasync function inspectContainer(\n dockerPath: string,\n containerName: string,\n abortSignal: AbortSignal | undefined,\n notFoundAsSandboxError: boolean,\n): Promise<DockerContainerInspection> {\n const result = await runDockerCli([\"container\", \"inspect\", containerName], {\n dockerPath,\n signal: abortSignal,\n });\n if (result.exitCode !== 0) {\n const message = safeDecode(result.stderr);\n if (notFoundAsSandboxError && message.toLowerCase().includes(\"no such\")) {\n throw new DockerSandboxError(`Sandbox does not exist: ${containerName}`, \"sandbox_not_found\");\n }\n throw new DockerSandboxError(\n \"Unable to inspect Docker sandbox.\",\n \"docker_command_failed\",\n result,\n );\n }\n let value: unknown;\n try {\n value = JSON.parse(decodeUtf8(result.stdout));\n } catch (error) {\n throw new DockerSandboxError(\n \"Docker returned invalid container metadata.\",\n \"docker_command_failed\",\n undefined,\n { cause: error },\n );\n }\n if (!Array.isArray(value) || value.length !== 1 || !isInspection(value[0])) {\n throw new DockerSandboxError(\n \"Docker returned invalid container metadata.\",\n \"docker_command_failed\",\n );\n }\n return value[0];\n}\n\nfunction isInspection(value: unknown): value is DockerContainerInspection {\n return isRecord(value) && isRecord(value.Config) && isRecord(value.State);\n}\n\nasync function inspectPublishedPorts(options: {\n dockerPath: string;\n containerName: string;\n ports: readonly number[];\n abortSignal?: AbortSignal | undefined;\n}): Promise<DockerSandboxPublishedPort[]> {\n if (options.ports.length === 0) return [];\n const inspection = await inspectContainer(\n options.dockerPath,\n options.containerName,\n options.abortSignal,\n false,\n );\n const mappings = inspection.NetworkSettings?.Ports ?? {};\n return options.ports.map((containerPort) => {\n const entries = mappings[`${containerPort}/tcp`];\n const entry = entries?.find((candidate) => candidate.HostIp === \"127.0.0.1\");\n const hostPort = Number(entry?.HostPort);\n if (!isPort(hostPort)) {\n throw new DockerSandboxError(`Docker did not publish port: ${containerPort}`, \"port\");\n }\n return { containerPort, host: \"127.0.0.1\", hostPort, protocol: \"tcp\" };\n });\n}\n\nfunction configuredContainerPorts(inspection: DockerContainerInspection): number[] {\n return Object.keys(inspection.HostConfig?.PortBindings ?? {}).flatMap((key) => {\n const match = /^(\\d+)\\/tcp$/.exec(key);\n if (match?.[1] === undefined) return [];\n const value = Number(match[1]);\n return isPort(value) ? [value] : [];\n });\n}\n\nasync function assertCopiedRegularFile(\n temporaryDirectory: string,\n target: string,\n sandboxPath: string,\n): Promise<void> {\n const metadata = await lstat(target);\n if (metadata.isSymbolicLink() || !metadata.isFile()) {\n throw new DockerSandboxError(\n `Sandbox path is not a regular file: ${sandboxPath}`,\n \"invalid_path\",\n );\n }\n const resolvedTarget = await realpath(target);\n const relativeTarget = path.relative(temporaryDirectory, resolvedTarget);\n if (\n relativeTarget === \"\" ||\n relativeTarget === \"..\" ||\n relativeTarget.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativeTarget)\n ) {\n throw new DockerSandboxError(\n `Sandbox file escaped its temporary read boundary: ${sandboxPath}`,\n \"invalid_path\",\n );\n }\n}\n\nasync function removeContainer(dockerPath: string, containerName: string): Promise<void> {\n const result = await runDockerCli([\"rm\", \"-f\", containerName], { dockerPath });\n if (result.exitCode === 0 || safeDecode(result.stderr).toLowerCase().includes(\"no such\")) return;\n throw new DockerSandboxError(\"Unable to remove Docker sandbox.\", \"docker_command_failed\", result);\n}\n\nasync function removeVolume(dockerPath: string, volumeName: string): Promise<void> {\n const result = await runDockerCli([\"volume\", \"rm\", volumeName], { dockerPath });\n if (result.exitCode === 0 || safeDecode(result.stderr).toLowerCase().includes(\"no such\")) return;\n throw new DockerSandboxError(\n \"Unable to remove Docker sandbox volume.\",\n \"docker_command_failed\",\n result,\n );\n}\n\nfunction parseFindEntry(line: string, workdir: string): DockerSandboxFileEntry {\n const [absolutePath, rawType, rawSize] = line.split(\"\\t\");\n if (absolutePath === undefined || rawType === undefined || rawSize === undefined) {\n throw new DockerSandboxError(\"Docker returned invalid file metadata.\", \"docker_command_failed\");\n }\n const relativePath = path.posix.relative(workdir, absolutePath);\n const size = Number(rawSize);\n const type = mapFindType(rawType);\n let entry: DockerSandboxFileEntry = {\n path: normalizeSandboxPath(relativePath),\n type,\n };\n if (type === \"file\" && Number.isSafeInteger(size) && size >= 0) {\n entry = { ...entry, size };\n }\n return entry;\n}\n\nfunction mapFindType(value: string): DockerSandboxFileType {\n if (value === \"f\") return \"file\";\n if (value === \"d\") return \"directory\";\n if (value === \"l\") return \"symlink\";\n return \"other\";\n}\n\nfunction toExecResult(result: Awaited<ReturnType<typeof runDockerCli>>): DockerSandboxExecResult {\n const common = {\n stdout: result.stdout.slice(),\n stderr: result.stderr.slice(),\n durationMs: result.durationMs,\n stdoutTruncated: result.stdoutTruncated,\n stderrTruncated: result.stderrTruncated,\n };\n return result.timedOut\n ? { ...common, status: \"timed_out\" }\n : { ...common, status: \"exited\", exitCode: result.exitCode };\n}\n\nfunction copyWorkspace(workspace: DockerSandboxWorkspace): DockerSandboxWorkspace {\n return workspace.type === \"ephemeral\"\n ? Object.freeze({ type: \"ephemeral\" })\n : Object.freeze({ type: \"docker-volume\", name: workspace.name });\n}\n\nfunction copyNetwork(\n network: CreateDockerSandboxOptions[\"network\"],\n): CreateDockerSandboxOptions[\"network\"] {\n return network.mode === \"none\"\n ? Object.freeze({ mode: \"none\" })\n : Object.freeze({ mode: \"bridge\", ports: Object.freeze([...(network.ports ?? [])]) });\n}\n\nfunction copyStringRecord(\n value: Readonly<Record<string, string>> | undefined,\n name: string,\n): Record<string, string> {\n if (value === undefined) return {};\n if (!isRecord(value)) throw new TypeError(`${name} must be an object.`);\n const copy: Record<string, string> = {};\n for (const [key, item] of Object.entries(value)) {\n if (typeof item !== \"string\") throw new TypeError(`${name}.${key} must be a string.`);\n if (name === \"env\" && !envKeyPattern.test(key))\n throw new TypeError(`Invalid environment variable name: ${key}`);\n copy[key] = item;\n }\n return copy;\n}\n\nfunction requiredLabel(containerLabels: Record<string, string>, name: string): string {\n const value = containerLabels[name];\n if (value === undefined || value.length === 0) invalidInspection(name);\n return value;\n}\n\nfunction parseLabelInteger(\n containerLabels: Record<string, string>,\n name: string,\n positive: boolean,\n): number {\n const value = Number(requiredLabel(containerLabels, name));\n if (!Number.isSafeInteger(value) || (positive ? value <= 0 : value < 0)) invalidInspection(name);\n return value;\n}\n\nfunction invalidInspection(field: string): never {\n throw new DockerSandboxError(`Sandbox metadata is invalid: ${field}`, \"invalid_state\");\n}\n\nfunction validatePorts(ports: readonly number[]): void {\n if (!Array.isArray(ports)) throw new TypeError(\"ports must be an array.\");\n const seen = new Set<number>();\n for (const port of ports) {\n assertPort(port);\n if (seen.has(port)) throw new DockerSandboxError(`Sandbox port is duplicated: ${port}`, \"port\");\n seen.add(port);\n }\n}\n\nfunction assertPort(port: number): void {\n if (!isPort(port))\n throw new DockerSandboxError(\n `Sandbox port must be an integer from 1 to 65535: ${port}`,\n \"port\",\n );\n}\n\nfunction isPort(port: number): boolean {\n return Number.isInteger(port) && port >= 1 && port <= 65_535;\n}\n\nfunction assertSandboxId(id: string): void {\n if (typeof id !== \"string\" || !idPattern.test(id)) {\n throw new TypeError(\n \"Sandbox id must be 1-63 lowercase letters, numbers, dots, underscores, or hyphens.\",\n );\n }\n}\n\nfunction assertDockerVolumeName(name: string): void {\n assertNonEmptyString(name, \"workspace.name\");\n if (name.includes(\",\") || name.includes(\"\\0\"))\n throw new TypeError(\"workspace.name is not a valid Docker volume name.\");\n}\n\nfunction assertNonEmptyString(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0)\n throw new TypeError(`${name} must be a non-empty string.`);\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new RangeError(`${name} must be a positive safe integer.`);\n}\n\nfunction assertNonNegativeSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new RangeError(`${name} must be a non-negative safe integer.`);\n}\n\nfunction invalidState(id: string, state: DockerSandboxState): DockerSandboxError {\n return new DockerSandboxError(`Sandbox ${id} is not running (${state}).`, \"invalid_state\", {\n state,\n });\n}\n\nfunction containerNameFor(id: string): string {\n return `anvia-sandbox-${id}`;\n}\n\nfunction combineSignals(first: AbortSignal | undefined, second: AbortSignal): AbortSignal {\n return first === undefined ? second : AbortSignal.any([first, second]);\n}\n\nasync function waitWithSignal(timeoutMs: number, abortSignal: AbortSignal): Promise<void> {\n abortSignal.throwIfAborted();\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n abortSignal.removeEventListener(\"abort\", abort);\n resolve();\n }, timeoutMs);\n const abort = () => {\n clearTimeout(timeout);\n reject(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nfunction safeDecode(bytes: Uint8Array): string {\n try {\n return decodeUtf8(bytes);\n } catch {\n return \"\";\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { decodeUtf8, runDockerCli } from \"./docker-cli\";\nimport { DockerSandboxError } from \"./errors\";\nimport { containerPath } from \"./path\";\nimport type {\n DockerSandboxProcessInfo,\n DockerSandboxProcessLogs,\n DockerSandboxProcessStartOptions,\n} from \"./types\";\n\nconst processMarkerPrefix = \"ANVIA_PROCESS\";\n// Establish a killable process group and report it before starting the user command. The wrapper\n// waits for a host acknowledgement, so cancelling startup before the marker is accepted can only\n// leave an idle wrapper that exits when Docker closes stdin, never an untracked user process.\nconst processLauncher = [\n 'wrapper=\"$1\"',\n \"shift\",\n // GNU setsid forks when it is already a process-group leader. `-w` keeps that launcher alive\n // until the new session exits, so Docker does not detach from a still-running managed process.\n \"if command -v setsid >/dev/null 2>&1 && setsid -w true >/dev/null 2>&1; then\",\n ' exec setsid -w sh -c \"$wrapper\" \"$@\"',\n \"fi\",\n 'exec sh -c \"$wrapper\" \"$@\"',\n].join(\"\\n\");\n\nconst processWrapper = [\n 'marker=\"$1\"',\n \"shift\",\n \"group=$$\",\n `printf '\\\\036%s:%s:%s\\\\036' \"$marker\" \"$$\" \"$group\"`,\n \"IFS= read -r ready || exit 125\",\n '[ \"$ready\" = \"start\" ] || exit 125',\n '\"$@\" &',\n \"child=$!\",\n \"terminate() {\",\n ' wait \"$child\" 2>/dev/null || true',\n \" exit 143\",\n \"}\",\n \"trap terminate TERM INT\",\n 'wait \"$child\"',\n \"exit $?\",\n].join(\"\\n\");\n\ninterface DockerProcessManagerOptions {\n containerName: string;\n dockerPath: string;\n workdir: string;\n env: Record<string, string>;\n maxOutputBytes: number;\n maxProcesses: number;\n startupTimeoutMs: number;\n}\n\ntype MutableProcessInfo = {\n id: string;\n command: string;\n args: string[];\n cwd?: string;\n status: \"running\" | \"exited\" | \"stopped\";\n exitCode?: number;\n startedAt: string;\n endedAt?: string;\n};\n\ninterface ManagedProcessRecord {\n info: MutableProcessInfo;\n child: ChildProcessWithoutNullStreams;\n stdout: TailOutputCollector;\n stderr: TailOutputCollector;\n markerStart: Buffer;\n markerBuffer: Buffer;\n supervisorPid?: number;\n processGroupId?: number;\n spawnFailed: boolean;\n stopRequested: boolean;\n startResolved: boolean;\n resolveStarted: () => void;\n rejectStarted: (error: unknown) => void;\n started: Promise<void>;\n resolveClosed: () => void;\n closed: Promise<void>;\n}\n\nexport class DockerProcessManager {\n private readonly records = new Map<string, ManagedProcessRecord>();\n private disposed = false;\n\n constructor(private readonly options: DockerProcessManagerOptions) {\n if (!Number.isInteger(options.maxProcesses) || options.maxProcesses < 0) {\n throw processError(\"Sandbox maxProcesses must be a non-negative integer.\");\n }\n if (!Number.isInteger(options.maxOutputBytes) || options.maxOutputBytes < 0) {\n throw processError(\"Sandbox maxOutputBytes must be a non-negative integer.\");\n }\n if (!Number.isInteger(options.startupTimeoutMs) || options.startupTimeoutMs <= 0) {\n throw processError(\"Sandbox process startup timeout must be a positive integer.\");\n }\n }\n\n async start(options: DockerSandboxProcessStartOptions): Promise<DockerSandboxProcessInfo> {\n this.assertActive();\n assertStartOptions(options);\n options.abortSignal?.throwIfAborted();\n await this.pruneCompletedRecords(options.abortSignal);\n\n const trackedCount = this.records.size;\n if (trackedCount >= this.options.maxProcesses) {\n throw processError(\n `Sandbox process limit reached (${trackedCount} >= ${this.options.maxProcesses}).`,\n );\n }\n\n const id = randomUUID();\n const marker = `${processMarkerPrefix}:${id}`;\n const dockerArgs = this.createExecArgs(options, marker);\n const child = spawn(this.options.dockerPath, dockerArgs, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let resolveStarted!: () => void;\n let rejectStarted!: (error: unknown) => void;\n const started = new Promise<void>((resolve, reject) => {\n resolveStarted = resolve;\n rejectStarted = reject;\n });\n let resolveClosed!: () => void;\n const closed = new Promise<void>((resolve) => {\n resolveClosed = resolve;\n });\n\n const info: MutableProcessInfo = {\n id,\n command: options.command,\n args: [...(options.args ?? [])],\n status: \"running\",\n startedAt: new Date().toISOString(),\n };\n if (options.cwd !== undefined) info.cwd = options.cwd;\n\n const record: ManagedProcessRecord = {\n info,\n child,\n stdout: new TailOutputCollector(this.options.maxOutputBytes),\n stderr: new TailOutputCollector(this.options.maxOutputBytes),\n markerStart: Buffer.from(`\\u001e${marker}:`),\n markerBuffer: Buffer.alloc(0),\n spawnFailed: false,\n stopRequested: false,\n startResolved: false,\n resolveStarted,\n rejectStarted,\n started,\n resolveClosed,\n closed,\n };\n this.records.set(id, record);\n this.observe(record);\n\n try {\n await this.waitForStart(record, options.abortSignal);\n record.startResolved = true;\n return copyProcessInfo(record.info);\n } catch (error) {\n if (await this.cleanupFailedStart(record)) this.records.delete(id);\n throw error;\n }\n }\n\n list(): DockerSandboxProcessInfo[] {\n this.assertActive();\n return [...this.records.values()].map((record) => copyProcessInfo(record.info));\n }\n\n logs(processId: string, tailBytes?: number): DockerSandboxProcessLogs {\n this.assertActive();\n const record = this.getRecord(processId);\n const stdout = record.stdout.snapshot(tailBytes);\n const stderr = record.stderr.snapshot(tailBytes);\n return {\n stdout: stdout.bytes,\n stderr: stderr.bytes,\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n };\n }\n\n async stop(\n processId: string,\n gracePeriodMs = 5_000,\n abortSignal?: AbortSignal,\n ): Promise<DockerSandboxProcessInfo> {\n this.assertActive();\n const record = this.getRecord(processId);\n if (!Number.isInteger(gracePeriodMs) || gracePeriodMs < 0) {\n throw processError(\"Process gracePeriodMs must be a non-negative integer.\");\n }\n\n try {\n if (!(await this.terminateRecord(record, gracePeriodMs, abortSignal))) {\n throw processError(`Sandbox process did not stop: ${processId}`);\n }\n } catch (error) {\n if (record.info.status === \"running\") record.stopRequested = false;\n throw error;\n }\n\n return copyProcessInfo(record.info);\n }\n\n async dispose(abortSignal?: AbortSignal): Promise<void> {\n if (this.disposed) return;\n abortSignal?.throwIfAborted();\n\n await Promise.all(\n [...this.records.values()].map(async (record) => {\n if (!(await this.terminateRecord(record, 1_000, abortSignal))) {\n throw processError(`Sandbox process did not stop: ${record.info.id}`);\n }\n }),\n );\n this.disposed = true;\n }\n\n private createExecArgs(options: DockerSandboxProcessStartOptions, marker: string): string[] {\n const args = [\"exec\", \"-i\", \"-w\", containerPath(this.options.workdir, options.cwd ?? \".\")];\n for (const [key, value] of Object.entries({ ...this.options.env, ...options.env })) {\n args.push(\"-e\", `${key}=${value}`);\n }\n args.push(\n this.options.containerName,\n \"sh\",\n \"-c\",\n processLauncher,\n \"anvia-process-launcher\",\n processWrapper,\n \"anvia-managed-process\",\n marker,\n options.command,\n ...(options.args ?? []),\n );\n return args;\n }\n\n private observe(record: ManagedProcessRecord): void {\n record.child.stdout.on(\"data\", (chunk: Buffer) => this.acceptStdout(record, chunk));\n record.child.stderr.on(\"data\", (chunk: Buffer) => record.stderr.accept(chunk));\n\n record.child.on(\"error\", (error) => {\n record.spawnFailed = true;\n const normalized =\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n ? new DockerSandboxError(\"Docker CLI was not found.\", \"docker_unavailable\", undefined, {\n cause: error,\n })\n : error;\n record.rejectStarted(normalized);\n });\n\n record.child.on(\"close\", (code) => {\n if (record.markerBuffer.length > 0) {\n record.stdout.accept(record.markerBuffer);\n record.markerBuffer = Buffer.alloc(0);\n }\n record.info.status = record.stopRequested ? \"stopped\" : \"exited\";\n record.info.exitCode = code ?? 1;\n record.info.endedAt = new Date().toISOString();\n record.rejectStarted(\n processError(`Sandbox process exited before startup completed: ${record.info.id}`),\n );\n record.resolveClosed();\n });\n }\n\n private acceptStdout(record: ManagedProcessRecord, chunk: Buffer): void {\n if (record.supervisorPid !== undefined) {\n record.stdout.accept(chunk);\n return;\n }\n\n record.markerBuffer = Buffer.concat([record.markerBuffer, chunk]);\n const start = record.markerBuffer.indexOf(record.markerStart);\n if (start < 0) {\n const retainedBytes = Math.max(0, record.markerStart.length - 1);\n if (record.markerBuffer.length > retainedBytes) {\n const split = record.markerBuffer.length - retainedBytes;\n record.stdout.accept(record.markerBuffer.subarray(0, split));\n record.markerBuffer = record.markerBuffer.subarray(split);\n }\n return;\n }\n\n const end = record.markerBuffer.indexOf(0x1e, start + record.markerStart.length);\n if (end < 0) {\n if (start > 0) {\n record.stdout.accept(record.markerBuffer.subarray(0, start));\n record.markerBuffer = record.markerBuffer.subarray(start);\n }\n return;\n }\n\n const rawPids = decodeUtf8(\n record.markerBuffer.subarray(start + record.markerStart.length, end),\n ).split(\":\");\n const supervisorPid = Number(rawPids[0]);\n const processGroupId = Number(rawPids[1]);\n if (!isProcessId(supervisorPid) || !isProcessId(processGroupId) || rawPids.length !== 2) {\n record.rejectStarted(processError(\"Sandbox process returned invalid process IDs.\"));\n return;\n }\n\n if (start > 0) record.stdout.accept(record.markerBuffer.subarray(0, start));\n if (end + 1 < record.markerBuffer.length) {\n record.stdout.accept(record.markerBuffer.subarray(end + 1));\n }\n record.markerBuffer = Buffer.alloc(0);\n record.supervisorPid = supervisorPid;\n record.processGroupId = processGroupId;\n // Keep stdin attached for the lifetime of `docker exec -i`. Closing it makes the Docker CLI\n // return successfully while the in-container process keeps running, which would orphan the\n // process from status, logs, and lifecycle management.\n record.child.stdin.write(\"start\\n\");\n record.resolveStarted();\n }\n\n private async waitForStart(\n record: ManagedProcessRecord,\n abortSignal: AbortSignal | undefined,\n ): Promise<void> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abort: (() => void) | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n reject(new DockerSandboxError(\"Starting sandbox process timed out.\", \"timeout\"));\n }, this.options.startupTimeoutMs);\n timeout.unref?.();\n });\n\n try {\n const abortPromise = new Promise<never>((_, reject) => {\n if (abortSignal === undefined) return;\n abort = () => reject(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n if (abortSignal.aborted) abort();\n else abortSignal.addEventListener(\"abort\", abort, { once: true });\n });\n await Promise.race([record.started, timeoutPromise, abortPromise]);\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n if (abort !== undefined) abortSignal?.removeEventListener(\"abort\", abort);\n }\n }\n\n private async cleanupFailedStart(record: ManagedProcessRecord): Promise<boolean> {\n record.stopRequested = true;\n if (record.processGroupId === undefined && record.info.status === \"running\") {\n record.child.stdin.destroy();\n record.child.kill(\"SIGKILL\");\n await waitForPromise(record.closed, 1_000);\n }\n\n try {\n return await this.terminateRecord(record, 1_000);\n } catch {\n return false;\n }\n }\n\n private async terminateRecord(\n record: ManagedProcessRecord,\n gracePeriodMs: number,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n abortSignal?.throwIfAborted();\n record.stopRequested = true;\n\n if (record.processGroupId === undefined) {\n if (record.info.status === \"running\") {\n await waitForPromise(record.closed, Math.min(gracePeriodMs, 250), abortSignal);\n }\n if (record.processGroupId === undefined) {\n return record.info.status !== \"running\";\n }\n }\n\n if (!(await this.isProcessGroupRunning(record, abortSignal))) {\n return this.finishAfterGroupExit(record, abortSignal);\n }\n\n await this.signal(record, \"TERM\", abortSignal);\n if (await this.waitForRecordExit(record, gracePeriodMs, abortSignal)) return true;\n\n await this.signal(record, \"KILL\", abortSignal);\n if (await this.waitForRecordExit(record, 1_000, abortSignal)) return true;\n\n return false;\n }\n\n private async waitForRecordExit(\n record: ManagedProcessRecord,\n timeoutMs: number,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n abortSignal?.throwIfAborted();\n if (!(await this.isProcessGroupRunning(record, abortSignal))) {\n return this.finishAfterGroupExit(record, abortSignal);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) return false;\n const intervalMs = Math.min(50, remainingMs);\n if (record.info.status === \"running\") {\n await waitForPromise(record.closed, intervalMs, abortSignal);\n } else {\n await waitForDelay(intervalMs, abortSignal);\n }\n }\n }\n\n private async finishAfterGroupExit(\n record: ManagedProcessRecord,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n if (record.info.status !== \"running\") return true;\n record.child.kill(\"SIGKILL\");\n return waitForPromise(record.closed, 1_000, abortSignal);\n }\n\n private async isProcessGroupRunning(\n record: ManagedProcessRecord,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n if (record.processGroupId === undefined) return false;\n const result = await runDockerCli(\n [\n \"exec\",\n this.options.containerName,\n \"sh\",\n \"-c\",\n 'kill -0 \"-$1\" 2>/dev/null',\n \"anvia-process-group-check\",\n `${record.processGroupId}`,\n ],\n {\n dockerPath: this.options.dockerPath,\n timeoutMs: 5_000,\n maxOutputBytes: this.options.maxOutputBytes,\n signal: abortSignal,\n },\n );\n return result.exitCode === 0;\n }\n\n private async signal(\n record: ManagedProcessRecord,\n dockerSignal: \"TERM\" | \"KILL\",\n abortSignal?: AbortSignal,\n ): Promise<void> {\n if (record.processGroupId === undefined) return;\n const result = await runDockerCli(\n [\n \"exec\",\n this.options.containerName,\n \"sh\",\n \"-c\",\n 'kill \"-$2\" \"-$1\" 2>/dev/null || ! kill -0 \"-$1\" 2>/dev/null',\n \"anvia-process-signal\",\n `${record.processGroupId}`,\n dockerSignal,\n ],\n {\n dockerPath: this.options.dockerPath,\n timeoutMs: 5_000,\n maxOutputBytes: this.options.maxOutputBytes,\n signal: abortSignal,\n },\n );\n if (result.exitCode !== 0) {\n throw new DockerSandboxError(\n `Unable to stop sandbox process: ${record.info.id}`,\n \"docker_command_failed\",\n result,\n );\n }\n }\n\n private getRecord(processId: string): ManagedProcessRecord {\n const record = this.records.get(processId);\n if (record === undefined) {\n throw processError(`Unknown sandbox process: ${processId}`);\n }\n return record;\n }\n\n private async pruneCompletedRecords(abortSignal?: AbortSignal): Promise<void> {\n for (const [id, record] of this.records) {\n if (this.records.size < this.options.maxProcesses) return;\n const cleanupConfirmed =\n record.processGroupId === undefined\n ? record.spawnFailed\n : !(await this.isProcessGroupRunning(record, abortSignal));\n if (record.info.status !== \"running\" && cleanupConfirmed) {\n this.records.delete(id);\n }\n }\n }\n\n private assertActive(): void {\n if (this.disposed) {\n throw processError(\"Sandbox process manager has been disposed.\");\n }\n }\n}\n\nclass TailOutputCollector {\n private chunks: Buffer[] = [];\n private length = 0;\n private didTruncate = false;\n\n constructor(private readonly maxBytes: number) {}\n\n accept(chunk: Buffer): void {\n if (chunk.length === 0) return;\n if (this.maxBytes <= 0) {\n this.didTruncate = true;\n return;\n }\n\n if (chunk.length >= this.maxBytes) {\n this.chunks = [chunk.subarray(chunk.length - this.maxBytes)];\n this.length = this.maxBytes;\n this.didTruncate = true;\n return;\n }\n\n this.chunks.push(chunk);\n this.length += chunk.length;\n while (this.length > this.maxBytes) {\n const first = this.chunks[0];\n if (first === undefined) break;\n const overflow = this.length - this.maxBytes;\n if (first.length <= overflow) {\n this.chunks.shift();\n this.length -= first.length;\n } else {\n this.chunks[0] = first.subarray(overflow);\n this.length -= overflow;\n }\n this.didTruncate = true;\n }\n }\n\n snapshot(tailBytes?: number): { bytes: Uint8Array; truncated: boolean } {\n if (tailBytes !== undefined && (!Number.isInteger(tailBytes) || tailBytes < 0)) {\n throw processError(\"Process tailBytes must be a non-negative integer.\");\n }\n const bytes = Buffer.concat(this.chunks, this.length);\n const selected =\n tailBytes === 0\n ? Buffer.alloc(0)\n : tailBytes === undefined || bytes.length <= tailBytes\n ? bytes\n : bytes.subarray(bytes.length - tailBytes);\n return {\n bytes: new Uint8Array(selected.buffer, selected.byteOffset, selected.byteLength).slice(),\n truncated: this.didTruncate || selected.length < bytes.length,\n };\n }\n}\n\nfunction processError(message: string): DockerSandboxError {\n return new DockerSandboxError(message, \"process\");\n}\n\nfunction assertStartOptions(options: DockerSandboxProcessStartOptions): void {\n if (options.command.trim().length === 0) {\n throw processError(\"Sandbox process command cannot be empty.\");\n }\n}\n\nfunction isProcessId(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\nfunction copyProcessInfo(info: DockerSandboxProcessInfo): DockerSandboxProcessInfo {\n let copy: DockerSandboxProcessInfo = {\n id: info.id,\n command: info.command,\n args: [...info.args],\n status: info.status,\n startedAt: info.startedAt,\n };\n if (info.cwd !== undefined) copy = { ...copy, cwd: info.cwd };\n if (info.exitCode !== undefined) copy = { ...copy, exitCode: info.exitCode };\n if (info.endedAt !== undefined) copy = { ...copy, endedAt: info.endedAt };\n return copy;\n}\n\nasync function waitForPromise(\n promise: Promise<void>,\n timeoutMs: number,\n abortSignal?: AbortSignal,\n): Promise<boolean> {\n abortSignal?.throwIfAborted();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abort: (() => void) | undefined;\n try {\n return await Promise.race([\n promise.then(() => true),\n new Promise<boolean>((resolve) => {\n timeout = setTimeout(() => resolve(false), timeoutMs);\n timeout.unref?.();\n }),\n new Promise<boolean>((_, reject) => {\n if (abortSignal === undefined) return;\n abort = () => reject(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n if (abortSignal.aborted) abort();\n else abortSignal.addEventListener(\"abort\", abort, { once: true });\n }),\n ]);\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n if (abort !== undefined) abortSignal?.removeEventListener(\"abort\", abort);\n }\n}\n\nasync function waitForDelay(timeoutMs: number, abortSignal?: AbortSignal): Promise<void> {\n await waitForPromise(\n new Promise<void>((resolve) => {\n const timeout = setTimeout(resolve, timeoutMs);\n timeout.unref?.();\n }),\n timeoutMs,\n abortSignal,\n );\n}\n","import path from \"node:path\";\nimport { DockerSandboxError } from \"./errors\";\n\nexport function normalizeSandboxPath(input: string, options: { allowRoot?: boolean } = {}): string {\n if (input.length === 0) {\n throw new DockerSandboxError(\"Sandbox path cannot be empty.\", \"invalid_path\");\n }\n\n if (input.includes(\"\\0\")) {\n throw new DockerSandboxError(\"Sandbox path cannot contain null bytes.\", \"invalid_path\");\n }\n\n const normalized = path.posix.normalize(input.replaceAll(\"\\\\\", \"/\"));\n\n if (path.posix.isAbsolute(normalized)) {\n throw new DockerSandboxError(`Sandbox path must be relative: ${input}`, \"invalid_path\");\n }\n\n if (normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new DockerSandboxError(\n `Sandbox path cannot leave the workspace: ${input}`,\n \"invalid_path\",\n );\n }\n\n if (normalized === \".\" && options.allowRoot !== true) {\n throw new DockerSandboxError(\n \"Sandbox path must refer to a file or directory inside the workspace.\",\n \"invalid_path\",\n );\n }\n\n return normalized;\n}\n\nexport function containerPath(workdir: string, relativePath: string): string {\n const normalizedWorkdir = path.posix.normalize(workdir);\n const normalizedPath = normalizeSandboxPath(relativePath, { allowRoot: true });\n return normalizedPath === \".\"\n ? normalizedWorkdir\n : path.posix.join(normalizedWorkdir, normalizedPath);\n}\n\nexport function parentSandboxPath(relativePath: string): string {\n const normalized = normalizeSandboxPath(relativePath);\n const parent = path.posix.dirname(normalized);\n return parent === \".\" ? \".\" : parent;\n}\n","import type { DockerSandboxTextFilePage } from \"./types\";\n\ninterface CreateTextFilePageOptions {\n startLine: number;\n lineCount: number;\n maxBytes: number;\n contentStartLine?: number;\n}\n\nexport function createTextFilePage(\n text: string,\n options: CreateTextFilePageOptions,\n): DockerSandboxTextFilePage {\n const contentStartLine = options.contentStartLine ?? 1;\n const relativeStart = Math.max(0, options.startLine - contentStartLine);\n const lines = splitLines(text).slice(relativeStart, relativeStart + options.lineCount + 1);\n const hasMoreLines = lines.length > options.lineCount;\n const selectedLines = lines.slice(0, options.lineCount);\n const selectedContent = selectedLines.join(\"\");\n const selectedBytes = Buffer.from(selectedContent);\n\n if (selectedBytes.byteLength > options.maxBytes) {\n const content = decodeCompleteUtf8(selectedBytes.subarray(0, options.maxBytes));\n const lineBreaks = countLineBreaks(content);\n const endedAtLineBoundary = content.endsWith(\"\\n\");\n return {\n content,\n startLine: options.startLine,\n endLine:\n content.length === 0\n ? null\n : options.startLine + lineBreaks - (endedAtLineBoundary ? 1 : 0),\n nextStartLine: endedAtLineBoundary ? options.startLine + lineBreaks : null,\n truncated: true,\n truncatedBy: \"bytes\",\n };\n }\n\n return {\n content: selectedContent,\n startLine: options.startLine,\n endLine: selectedLines.length === 0 ? null : options.startLine + selectedLines.length - 1,\n nextStartLine: hasMoreLines ? options.startLine + selectedLines.length : null,\n truncated: hasMoreLines,\n truncatedBy: hasMoreLines ? \"lines\" : null,\n };\n}\n\nfunction splitLines(text: string): string[] {\n return text.match(/[^\\n]*\\n|[^\\n]+$/g) ?? [];\n}\n\nfunction countLineBreaks(text: string): number {\n let count = 0;\n for (const character of text) {\n if (character === \"\\n\") count += 1;\n }\n return count;\n}\n\nfunction decodeCompleteUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes, { stream: true });\n}\n","import { type AnyTool, createTool } from \"@anvia/core/tool\";\nimport { z } from \"zod\";\nimport { decodeUtf8 } from \"./docker-cli\";\nimport { DockerSandboxError } from \"./errors\";\nimport type {\n CreateDockerSandboxToolsOptions,\n DockerSandboxCommandPolicy,\n DockerSandboxExecOptions,\n DockerSandboxExecResult,\n DockerSandboxProcessInfo,\n DockerSandboxRuntime,\n DockerSandboxToolName,\n} from \"./types\";\n\nconst allToolNames = [\n \"exec_command\",\n \"read_file\",\n \"write_file\",\n \"list_files\",\n \"list_ports\",\n \"start_process\",\n \"list_processes\",\n \"read_process_logs\",\n \"stop_process\",\n \"wait_for_port\",\n] as const satisfies readonly DockerSandboxToolName[];\n\nconst execCommandInput = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n timeoutMs: z.number().int().positive().max(300_000).optional(),\n input: z.string().optional(),\n});\n\nconst execResultOutput = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"exited\"),\n exitCode: z.number().int(),\n stdout: z.string(),\n stderr: z.string(),\n durationMs: z.number().nonnegative(),\n stdoutTruncated: z.boolean(),\n stderrTruncated: z.boolean(),\n }),\n z.object({\n status: z.literal(\"timed_out\"),\n stdout: z.string(),\n stderr: z.string(),\n durationMs: z.number().nonnegative(),\n stdoutTruncated: z.boolean(),\n stderrTruncated: z.boolean(),\n }),\n]);\n\nconst readFileInput = z.object({\n path: z.string().min(1),\n startLine: z.number().int().positive().optional(),\n lineCount: z.number().int().positive().max(10_000).optional(),\n});\n\nconst readFileOutput = z.object({\n content: z.string(),\n startLine: z.number().int().positive(),\n endLine: z.number().int().positive().nullable(),\n nextStartLine: z.number().int().positive().nullable(),\n truncated: z.boolean(),\n truncatedBy: z.enum([\"lines\", \"bytes\"]).nullable(),\n});\n\nconst writeFileInput = z.object({\n path: z.string().min(1),\n content: z.string(),\n});\n\nconst writeFileOutput = z.object({\n path: z.string(),\n bytesWritten: z.number().int().nonnegative(),\n});\n\nconst listFilesInput = z.object({ path: z.string().optional() });\nconst fileEntryOutput = z.object({\n path: z.string(),\n type: z.enum([\"file\", \"directory\", \"symlink\", \"other\"]),\n size: z.number().int().nonnegative().optional(),\n});\nconst listFilesOutput = z.object({\n path: z.string(),\n entries: z.array(fileEntryOutput),\n});\n\nconst emptyInput = z.object({});\nconst publishedPortOutput = z.object({\n containerPort: z.number().int(),\n host: z.literal(\"127.0.0.1\"),\n hostPort: z.number().int(),\n protocol: z.literal(\"tcp\"),\n});\nconst listPortsOutput = z.object({ ports: z.array(publishedPortOutput) });\n\nconst startProcessInput = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\nconst processInfoOutput = z.object({\n id: z.string(),\n command: z.string(),\n args: z.array(z.string()),\n cwd: z.string().optional(),\n status: z.enum([\"running\", \"exited\", \"stopped\"]),\n exitCode: z.number().int().optional(),\n startedAt: z.string(),\n endedAt: z.string().optional(),\n});\nconst listProcessesOutput = z.object({ processes: z.array(processInfoOutput) });\n\nconst processIdInput = z.object({ processId: z.string().min(1) });\nconst readProcessLogsInput = processIdInput.extend({\n tailBytes: z\n .number()\n .int()\n .nonnegative()\n .max(1024 * 1024)\n .optional(),\n});\nconst processLogsOutput = z.object({\n processId: z.string(),\n stdout: z.string(),\n stderr: z.string(),\n stdoutTruncated: z.boolean(),\n stderrTruncated: z.boolean(),\n});\n\nconst waitForPortInput = z.object({\n containerPort: z.number().int().min(1).max(65_535),\n timeoutMs: z.number().int().positive().max(300_000).optional(),\n});\nconst waitForPortOutput = z.object({ port: publishedPortOutput });\n\nconst defaultReadFileLineCount = 500;\nconst defaultReadFileMaxLineCount = 2_000;\nconst defaultReadFileMaxBytes = 64 * 1024;\nconst maxToolReadFileLines = 10_000;\nconst maxToolBytes = 1024 * 1024;\nconst maxToolTimeoutMs = 300_000;\n\nexport function createDockerSandboxTools(\n options: CreateDockerSandboxToolsOptions,\n): readonly AnyTool[] {\n validateFactoryOptions(options);\n options = snapshotFactoryOptions(options);\n const selected = new Set(options.tools);\n const tools: AnyTool[] = [];\n\n for (const name of options.tools) {\n if (name === \"exec_command\") tools.push(createExecCommandTool(options));\n else if (name === \"read_file\") tools.push(createReadFileTool(options));\n else if (name === \"write_file\") tools.push(createWriteFileTool(options));\n else if (name === \"list_files\") tools.push(createListFilesTool(options.sandbox));\n else if (name === \"list_ports\") tools.push(createListPortsTool(options.sandbox));\n else if (name === \"start_process\") tools.push(createStartProcessTool(options));\n else if (name === \"list_processes\") tools.push(createListProcessesTool(options.sandbox));\n else if (name === \"read_process_logs\") tools.push(createReadProcessLogsTool(options));\n else if (name === \"stop_process\") tools.push(createStopProcessTool(options));\n else if (name === \"wait_for_port\") tools.push(createWaitForPortTool(options));\n }\n\n if (tools.length !== selected.size) {\n throw toolPolicyError(\"Sandbox tool selection contains an unsupported tool name.\");\n }\n return Object.freeze(tools);\n}\n\nfunction createExecCommandTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"exec_command\",\n description: \"Run one executable inside the sandbox with structured arguments.\",\n inputSchema: execCommandInput,\n outputSchema: execResultOutput,\n execute: async ({ command, args, cwd, env, timeoutMs, input }, context) => {\n assertCommandAllowed(command, options.exec?.commands);\n const effectiveTimeoutMs = timeoutMs ?? options.exec?.defaultTimeoutMs;\n assertTimeoutAllowed(effectiveTimeoutMs, options.exec?.maxTimeoutMs);\n let execOptions: DockerSandboxExecOptions = {\n command,\n };\n if (args !== undefined) execOptions = { ...execOptions, args };\n if (cwd !== undefined) execOptions = { ...execOptions, cwd };\n if (env !== undefined) execOptions = { ...execOptions, env };\n if (effectiveTimeoutMs !== undefined) {\n execOptions = { ...execOptions, timeoutMs: effectiveTimeoutMs };\n }\n if (input !== undefined) execOptions = { ...execOptions, input };\n if (context.abortSignal !== undefined) {\n execOptions = { ...execOptions, abortSignal: context.abortSignal };\n }\n return serializeExecResult(await options.sandbox.exec(execOptions));\n },\n });\n}\n\nfunction createReadFileTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n const limits = resolveReadFileLimits(options);\n return createTool({\n name: \"read_file\",\n description: \"Read a bounded page of a UTF-8 text file from the sandbox workspace.\",\n inputSchema: readFileInput,\n outputSchema: readFileOutput,\n execute: async ({ path, startLine, lineCount }, context) => {\n const effectiveLineCount = lineCount ?? limits.defaultLineCount;\n if (effectiveLineCount > limits.maxLineCount) {\n throw toolPolicyError(\n `File read line count exceeds policy (${effectiveLineCount} > ${limits.maxLineCount}).`,\n );\n }\n let readOptions: Parameters<typeof options.sandbox.readTextFilePage>[0] = {\n path,\n startLine: startLine ?? 1,\n lineCount: effectiveLineCount,\n maxBytes: limits.maxBytes,\n };\n if (context.abortSignal !== undefined) {\n readOptions = { ...readOptions, abortSignal: context.abortSignal };\n }\n return options.sandbox.readTextFilePage(readOptions);\n },\n });\n}\n\nfunction createWriteFileTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"write_file\",\n description: \"Write a complete UTF-8 text file inside the sandbox workspace.\",\n inputSchema: writeFileInput,\n outputSchema: writeFileOutput,\n execute: async ({ path, content }, context) => {\n const bytesWritten = new TextEncoder().encode(content).byteLength;\n const maxBytes = options.writeFile?.maxBytes;\n if (maxBytes !== undefined && bytesWritten > maxBytes) {\n throw toolPolicyError(`File content exceeds policy (${bytesWritten} > ${maxBytes}).`);\n }\n let writeOptions: Parameters<typeof options.sandbox.writeTextFile>[0] = {\n path,\n text: content,\n };\n if (context.abortSignal !== undefined) {\n writeOptions = { ...writeOptions, abortSignal: context.abortSignal };\n }\n await options.sandbox.writeTextFile(writeOptions);\n return { path, bytesWritten };\n },\n });\n}\n\nfunction createListFilesTool(sandbox: DockerSandboxRuntime): AnyTool {\n return createTool({\n name: \"list_files\",\n description: \"List direct children of a directory in the sandbox workspace.\",\n inputSchema: listFilesInput,\n outputSchema: listFilesOutput,\n execute: async ({ path }, context) => {\n let listOptions: Parameters<typeof sandbox.listFiles>[0] = {};\n if (path !== undefined) listOptions = { ...listOptions, path };\n if (context.abortSignal !== undefined) {\n listOptions = { ...listOptions, abortSignal: context.abortSignal };\n }\n return { path: path ?? \".\", entries: [...(await sandbox.listFiles(listOptions))] };\n },\n });\n}\n\nfunction createListPortsTool(sandbox: DockerSandboxRuntime): AnyTool {\n return createTool({\n name: \"list_ports\",\n description: \"List explicitly published localhost TCP ports for the sandbox.\",\n inputSchema: emptyInput,\n outputSchema: listPortsOutput,\n execute: async () => ({ ports: [...sandbox.publishedPorts] }),\n });\n}\n\nfunction createStartProcessTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"start_process\",\n description: \"Start a managed long-running process inside the sandbox.\",\n inputSchema: startProcessInput,\n outputSchema: processInfoOutput,\n execute: async ({ command, args, cwd, env }, context) => {\n assertCommandAllowed(command, options.exec?.commands);\n let startOptions: Parameters<typeof options.sandbox.startProcess>[0] = { command };\n if (args !== undefined) startOptions = { ...startOptions, args };\n if (cwd !== undefined) startOptions = { ...startOptions, cwd };\n if (env !== undefined) startOptions = { ...startOptions, env };\n if (context.abortSignal !== undefined) {\n startOptions = { ...startOptions, abortSignal: context.abortSignal };\n }\n return serializeProcessInfo(await options.sandbox.startProcess(startOptions));\n },\n });\n}\n\nfunction createListProcessesTool(sandbox: DockerSandboxRuntime): AnyTool {\n return createTool({\n name: \"list_processes\",\n description: \"List processes managed by this live sandbox handle.\",\n inputSchema: emptyInput,\n outputSchema: listProcessesOutput,\n execute: async (_, context) => ({\n processes: (\n await sandbox.listProcesses(\n context.abortSignal === undefined ? {} : { abortSignal: context.abortSignal },\n )\n ).map(serializeProcessInfo),\n }),\n });\n}\n\nfunction createReadProcessLogsTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n const maxLogBytes = options.process?.maxLogBytes ?? 64 * 1024;\n return createTool({\n name: \"read_process_logs\",\n description: \"Read bounded UTF-8 output from a managed sandbox process.\",\n inputSchema: readProcessLogsInput,\n outputSchema: processLogsOutput,\n execute: async ({ processId, tailBytes }, context) => {\n const effectiveTailBytes = tailBytes ?? maxLogBytes;\n if (effectiveTailBytes > maxLogBytes) {\n throw toolPolicyError(\n `Process log request exceeds policy (${effectiveTailBytes} > ${maxLogBytes}).`,\n );\n }\n let readOptions: Parameters<typeof options.sandbox.readProcessLogs>[0] = {\n processId,\n tailBytes: effectiveTailBytes,\n };\n if (context.abortSignal !== undefined) {\n readOptions = { ...readOptions, abortSignal: context.abortSignal };\n }\n const logs = await options.sandbox.readProcessLogs(readOptions);\n return {\n processId,\n stdout: decodeUtf8(logs.stdout),\n stderr: decodeUtf8(logs.stderr),\n stdoutTruncated: logs.stdoutTruncated,\n stderrTruncated: logs.stderrTruncated,\n };\n },\n });\n}\n\nfunction createStopProcessTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"stop_process\",\n description: \"Stop a process managed by this live sandbox handle.\",\n inputSchema: processIdInput,\n outputSchema: processInfoOutput,\n execute: async ({ processId }, context) => {\n let stopOptions: Parameters<typeof options.sandbox.stopProcess>[0] = {\n processId,\n gracePeriodMs: options.process?.stopGracePeriodMs ?? 5_000,\n };\n if (context.abortSignal !== undefined) {\n stopOptions = { ...stopOptions, abortSignal: context.abortSignal };\n }\n return serializeProcessInfo(await options.sandbox.stopProcess(stopOptions));\n },\n });\n}\n\nfunction createWaitForPortTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"wait_for_port\",\n description: \"Wait until an explicitly published sandbox TCP port is listening.\",\n inputSchema: waitForPortInput,\n outputSchema: waitForPortOutput,\n execute: async ({ containerPort, timeoutMs }, context) => {\n const effectiveTimeoutMs = timeoutMs ?? options.process?.defaultWaitTimeoutMs ?? 30_000;\n const maxWaitTimeoutMs = options.process?.maxWaitTimeoutMs ?? maxToolTimeoutMs;\n if (effectiveTimeoutMs > maxWaitTimeoutMs) {\n throw toolPolicyError(\n `Port wait timeout exceeds policy (${effectiveTimeoutMs} > ${maxWaitTimeoutMs}).`,\n );\n }\n let waitOptions: Parameters<typeof options.sandbox.waitForPort>[0] = {\n containerPort,\n timeoutMs: effectiveTimeoutMs,\n };\n if (context.abortSignal !== undefined) {\n waitOptions = { ...waitOptions, abortSignal: context.abortSignal };\n }\n return { port: await options.sandbox.waitForPort(waitOptions) };\n },\n });\n}\n\nfunction serializeExecResult(result: DockerSandboxExecResult) {\n const output = {\n status: result.status,\n stdout: decodeUtf8(result.stdout),\n stderr: decodeUtf8(result.stderr),\n durationMs: result.durationMs,\n stdoutTruncated: result.stdoutTruncated,\n stderrTruncated: result.stderrTruncated,\n };\n return result.status === \"exited\"\n ? { ...output, status: \"exited\" as const, exitCode: result.exitCode }\n : { ...output, status: \"timed_out\" as const };\n}\n\nfunction serializeProcessInfo(\n process: DockerSandboxProcessInfo,\n): z.infer<typeof processInfoOutput> {\n let serialized: z.infer<typeof processInfoOutput> = {\n id: process.id,\n command: process.command,\n args: [...process.args],\n status: process.status,\n startedAt: process.startedAt,\n };\n if (process.cwd !== undefined) serialized = { ...serialized, cwd: process.cwd };\n if (process.exitCode !== undefined) serialized = { ...serialized, exitCode: process.exitCode };\n if (process.endedAt !== undefined) serialized = { ...serialized, endedAt: process.endedAt };\n return serialized;\n}\n\nfunction validateFactoryOptions(options: CreateDockerSandboxToolsOptions): void {\n if (!isRecord(options)) {\n throw new TypeError(\"options must be an object.\");\n }\n if (!isDockerSandboxRuntime(options.sandbox)) {\n throw new TypeError(\"sandbox must be a DockerSandboxRuntime.\");\n }\n if (!Array.isArray(options.tools) || options.tools.length === 0) {\n throw new TypeError(\"tools must be a non-empty array.\");\n }\n const known = new Set<string>(allToolNames);\n const seen = new Set<string>();\n for (const name of options.tools as readonly unknown[]) {\n if (typeof name !== \"string\" || !known.has(name)) {\n throw new TypeError(\"tools contains an unsupported sandbox tool name.\");\n }\n if (seen.has(name)) throw new TypeError(`tools contains a duplicate: ${name}`);\n seen.add(name);\n }\n for (const [name, policy] of [\n [\"exec\", options.exec],\n [\"readFile\", options.readFile],\n [\"writeFile\", options.writeFile],\n [\"process\", options.process],\n ] as const) {\n if (policy !== undefined && !isRecord(policy)) {\n throw new TypeError(`${name} must be an object.`);\n }\n }\n validateCommandPolicy(options.exec?.commands);\n assertOptionalPositiveInteger(options.exec?.defaultTimeoutMs, \"exec.defaultTimeoutMs\");\n assertOptionalPositiveInteger(options.exec?.maxTimeoutMs, \"exec.maxTimeoutMs\");\n if (\n (options.exec?.defaultTimeoutMs ?? 0) > maxToolTimeoutMs ||\n (options.exec?.maxTimeoutMs ?? 0) > maxToolTimeoutMs\n ) {\n throw toolPolicyError(`Sandbox tool command timeouts cannot exceed ${maxToolTimeoutMs}.`);\n }\n if (\n options.exec?.defaultTimeoutMs !== undefined &&\n options.exec.maxTimeoutMs !== undefined &&\n options.exec.defaultTimeoutMs > options.exec.maxTimeoutMs\n ) {\n throw toolPolicyError(\"exec.defaultTimeoutMs cannot exceed exec.maxTimeoutMs.\");\n }\n assertOptionalBoundedPositiveInteger(options.readFile?.maxBytes, \"readFile.maxBytes\");\n assertOptionalPositiveInteger(options.readFile?.defaultLineCount, \"readFile.defaultLineCount\");\n assertOptionalPositiveInteger(options.readFile?.maxLineCount, \"readFile.maxLineCount\");\n assertOptionalBoundedNonNegativeInteger(options.writeFile?.maxBytes, \"writeFile.maxBytes\");\n assertOptionalBoundedNonNegativeInteger(options.process?.maxLogBytes, \"process.maxLogBytes\");\n assertOptionalPositiveInteger(\n options.process?.defaultWaitTimeoutMs,\n \"process.defaultWaitTimeoutMs\",\n );\n assertOptionalPositiveInteger(options.process?.maxWaitTimeoutMs, \"process.maxWaitTimeoutMs\");\n assertOptionalNonNegativeInteger(options.process?.stopGracePeriodMs, \"process.stopGracePeriodMs\");\n const defaultWaitTimeoutMs = options.process?.defaultWaitTimeoutMs;\n const maxWaitTimeoutMs = options.process?.maxWaitTimeoutMs ?? maxToolTimeoutMs;\n if (maxWaitTimeoutMs > maxToolTimeoutMs) {\n throw toolPolicyError(`process.maxWaitTimeoutMs cannot exceed ${maxToolTimeoutMs}.`);\n }\n if (defaultWaitTimeoutMs !== undefined && defaultWaitTimeoutMs > maxWaitTimeoutMs) {\n throw toolPolicyError(\"process.defaultWaitTimeoutMs cannot exceed process.maxWaitTimeoutMs.\");\n }\n}\n\nfunction snapshotFactoryOptions(\n options: CreateDockerSandboxToolsOptions,\n): CreateDockerSandboxToolsOptions {\n const toolNames = Object.freeze([...options.tools]) as unknown as readonly [\n DockerSandboxToolName,\n ...DockerSandboxToolName[],\n ];\n const commands =\n options.exec?.commands === undefined\n ? undefined\n : Object.freeze({\n mode: options.exec.commands.mode,\n values: Object.freeze([...options.exec.commands.values]),\n });\n let snapshot: CreateDockerSandboxToolsOptions = {\n sandbox: options.sandbox,\n tools: toolNames,\n };\n if (options.exec !== undefined) {\n let exec = { ...options.exec };\n if (commands !== undefined) exec = { ...exec, commands };\n snapshot = { ...snapshot, exec: Object.freeze(exec) };\n }\n if (options.readFile !== undefined) {\n snapshot = { ...snapshot, readFile: Object.freeze({ ...options.readFile }) };\n }\n if (options.writeFile !== undefined) {\n snapshot = { ...snapshot, writeFile: Object.freeze({ ...options.writeFile }) };\n }\n if (options.process !== undefined) {\n snapshot = { ...snapshot, process: Object.freeze({ ...options.process }) };\n }\n return Object.freeze(snapshot);\n}\n\nfunction validateCommandPolicy(policy: DockerSandboxCommandPolicy | undefined): void {\n if (policy === undefined) return;\n if (!isRecord(policy)) throw toolPolicyError(\"exec.commands must be an object.\");\n if (policy.mode !== \"allow\" && policy.mode !== \"block\") {\n throw toolPolicyError(\"exec.commands must use mode allow or block.\");\n }\n if (!Array.isArray(policy.values))\n throw toolPolicyError(\"exec.commands.values must be an array.\");\n const seen = new Set<string>();\n for (const value of policy.values as readonly unknown[]) {\n if (typeof value !== \"string\" || value.length === 0) {\n throw toolPolicyError(\"exec.commands.values must contain non-empty strings.\");\n }\n if (seen.has(value))\n throw toolPolicyError(`exec.commands.values contains a duplicate: ${value}`);\n seen.add(value);\n }\n}\n\nfunction assertCommandAllowed(\n command: string,\n policy: DockerSandboxCommandPolicy | undefined,\n): void {\n if (policy === undefined) return;\n const included = policy.values.includes(command);\n if ((policy.mode === \"allow\" && !included) || (policy.mode === \"block\" && included)) {\n throw toolPolicyError(`Command is rejected by sandbox tool policy: ${command}`);\n }\n}\n\nfunction assertTimeoutAllowed(timeoutMs: number | undefined, maxTimeoutMs: number | undefined) {\n if (timeoutMs !== undefined && maxTimeoutMs !== undefined && timeoutMs > maxTimeoutMs) {\n throw toolPolicyError(`Command timeout exceeds policy (${timeoutMs} > ${maxTimeoutMs}).`);\n }\n}\n\nfunction resolveReadFileLimits(options: CreateDockerSandboxToolsOptions) {\n const defaultLineCount = options.readFile?.defaultLineCount ?? defaultReadFileLineCount;\n const maxLineCount = options.readFile?.maxLineCount ?? defaultReadFileMaxLineCount;\n const maxBytes = options.readFile?.maxBytes ?? defaultReadFileMaxBytes;\n if (defaultLineCount > maxLineCount) {\n throw toolPolicyError(\"readFile.defaultLineCount cannot exceed readFile.maxLineCount.\");\n }\n if (maxLineCount > maxToolReadFileLines) {\n throw toolPolicyError(`readFile.maxLineCount cannot exceed ${maxToolReadFileLines}.`);\n }\n return { defaultLineCount, maxLineCount, maxBytes };\n}\n\nfunction assertOptionalPositiveInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw toolPolicyError(`${name} must be a positive safe integer.`);\n }\n}\n\nfunction assertOptionalNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw toolPolicyError(`${name} must be a non-negative safe integer.`);\n }\n}\n\nfunction assertOptionalBoundedNonNegativeInteger(value: number | undefined, name: string): void {\n assertOptionalNonNegativeInteger(value, name);\n if (value !== undefined && value > maxToolBytes) {\n throw toolPolicyError(`${name} cannot exceed ${maxToolBytes}.`);\n }\n}\n\nfunction assertOptionalBoundedPositiveInteger(value: number | undefined, name: string): void {\n assertOptionalPositiveInteger(value, name);\n if (value !== undefined && value > maxToolBytes) {\n throw toolPolicyError(`${name} cannot exceed ${maxToolBytes}.`);\n }\n}\n\nfunction isDockerSandboxRuntime(value: unknown): value is DockerSandboxRuntime {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n value.provider === \"docker\" &&\n typeof value.workdir === \"string\" &&\n Array.isArray(value.publishedPorts) &&\n [\n \"exec\",\n \"execStream\",\n \"readFile\",\n \"readTextFile\",\n \"readTextFilePage\",\n \"writeFile\",\n \"writeTextFile\",\n \"listFiles\",\n \"startProcess\",\n \"listProcesses\",\n \"readProcessLogs\",\n \"stopProcess\",\n \"waitForPort\",\n ].every((name) => typeof value[name] === \"function\")\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toolPolicyError(message: string): DockerSandboxError {\n return new DockerSandboxError(message, \"tool_policy\");\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,OAAO,SAAS,UAAU,UAAU,IAAI,iBAAiB;AAClE,OAAO,QAAQ;AACf,OAAOC,WAAU;;;ACHjB,SAA8C,aAAa;AAC3D,SAAS,kBAAkB;;;ACD3B,OAAO,UAAU;AAGV,SAAS,qBAAqB,OAAe,UAAmC,CAAC,GAAW;AACjG,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,mBAAmB,iCAAiC,cAAc;AAAA,EAC9E;AAEA,MAAI,MAAM,SAAS,IAAI,GAAG;AACxB,UAAM,IAAI,mBAAmB,2CAA2C,cAAc;AAAA,EACxF;AAEA,QAAM,aAAa,KAAK,MAAM,UAAU,MAAM,WAAW,MAAM,GAAG,CAAC;AAEnE,MAAI,KAAK,MAAM,WAAW,UAAU,GAAG;AACrC,UAAM,IAAI,mBAAmB,kCAAkC,KAAK,IAAI,cAAc;AAAA,EACxF;AAEA,MAAI,eAAe,QAAQ,WAAW,WAAW,KAAK,GAAG;AACvD,UAAM,IAAI;AAAA,MACR,4CAA4C,KAAK;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,OAAO,QAAQ,cAAc,MAAM;AACpD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,SAAiB,cAA8B;AAC3E,QAAM,oBAAoB,KAAK,MAAM,UAAU,OAAO;AACtD,QAAM,iBAAiB,qBAAqB,cAAc,EAAE,WAAW,KAAK,CAAC;AAC7E,SAAO,mBAAmB,MACtB,oBACA,KAAK,MAAM,KAAK,mBAAmB,cAAc;AACvD;AAEO,SAAS,kBAAkB,cAA8B;AAC9D,QAAM,aAAa,qBAAqB,YAAY;AACpD,QAAM,SAAS,KAAK,MAAM,QAAQ,UAAU;AAC5C,SAAO,WAAW,MAAM,MAAM;AAChC;;;ADpCA,IAAM,sBAAsB;AAI5B,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AA0CJ,IAAM,uBAAN,MAA2B;AAAA,EAIhC,YAA6B,SAAsC;AAAtC;AAC3B,QAAI,CAAC,OAAO,UAAU,QAAQ,YAAY,KAAK,QAAQ,eAAe,GAAG;AACvE,YAAM,aAAa,sDAAsD;AAAA,IAC3E;AACA,QAAI,CAAC,OAAO,UAAU,QAAQ,cAAc,KAAK,QAAQ,iBAAiB,GAAG;AAC3E,YAAM,aAAa,wDAAwD;AAAA,IAC7E;AACA,QAAI,CAAC,OAAO,UAAU,QAAQ,gBAAgB,KAAK,QAAQ,oBAAoB,GAAG;AAChF,YAAM,aAAa,6DAA6D;AAAA,IAClF;AAAA,EACF;AAAA,EAV6B;AAAA,EAHZ,UAAU,oBAAI,IAAkC;AAAA,EACzD,WAAW;AAAA,EAcnB,MAAM,MAAM,SAA8E;AACxF,SAAK,aAAa;AAClB,uBAAmB,OAAO;AAC1B,YAAQ,aAAa,eAAe;AACpC,UAAM,KAAK,sBAAsB,QAAQ,WAAW;AAEpD,UAAM,eAAe,KAAK,QAAQ;AAClC,QAAI,gBAAgB,KAAK,QAAQ,cAAc;AAC7C,YAAM;AAAA,QACJ,kCAAkC,YAAY,OAAO,KAAK,QAAQ,YAAY;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,KAAK,WAAW;AACtB,UAAM,SAAS,GAAG,mBAAmB,IAAI,EAAE;AAC3C,UAAM,aAAa,KAAK,eAAe,SAAS,MAAM;AACtD,UAAM,QAAQ,MAAM,KAAK,QAAQ,YAAY,YAAY;AAAA,MACvD,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAED,QAAI;AACJ,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,SAAS,WAAW;AACrD,uBAAiB;AACjB,sBAAgB;AAAA,IAClB,CAAC;AACD,QAAI;AACJ,UAAM,SAAS,IAAI,QAAc,CAAC,YAAY;AAC5C,sBAAgB;AAAA,IAClB,CAAC;AAED,UAAM,OAA2B;AAAA,MAC/B;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,MAAM,CAAC,GAAI,QAAQ,QAAQ,CAAC,CAAE;AAAA,MAC9B,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,QAAI,QAAQ,QAAQ,OAAW,MAAK,MAAM,QAAQ;AAElD,UAAM,SAA+B;AAAA,MACnC;AAAA,MACA;AAAA,MACA,QAAQ,IAAI,oBAAoB,KAAK,QAAQ,cAAc;AAAA,MAC3D,QAAQ,IAAI,oBAAoB,KAAK,QAAQ,cAAc;AAAA,MAC3D,aAAa,OAAO,KAAK,IAAS,MAAM,GAAG;AAAA,MAC3C,cAAc,OAAO,MAAM,CAAC;AAAA,MAC5B,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,QAAQ,IAAI,IAAI,MAAM;AAC3B,SAAK,QAAQ,MAAM;AAEnB,QAAI;AACF,YAAM,KAAK,aAAa,QAAQ,QAAQ,WAAW;AACnD,aAAO,gBAAgB;AACvB,aAAO,gBAAgB,OAAO,IAAI;AAAA,IACpC,SAAS,OAAO;AACd,UAAI,MAAM,KAAK,mBAAmB,MAAM,EAAG,MAAK,QAAQ,OAAO,EAAE;AACjE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,OAAmC;AACjC,SAAK,aAAa;AAClB,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,gBAAgB,OAAO,IAAI,CAAC;AAAA,EAChF;AAAA,EAEA,KAAK,WAAmB,WAA8C;AACpE,SAAK,aAAa;AAClB,UAAM,SAAS,KAAK,UAAU,SAAS;AACvC,UAAM,SAAS,OAAO,OAAO,SAAS,SAAS;AAC/C,UAAM,SAAS,OAAO,OAAO,SAAS,SAAS;AAC/C,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,iBAAiB,OAAO;AAAA,MACxB,iBAAiB,OAAO;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,WACA,gBAAgB,KAChB,aACmC;AACnC,SAAK,aAAa;AAClB,UAAM,SAAS,KAAK,UAAU,SAAS;AACvC,QAAI,CAAC,OAAO,UAAU,aAAa,KAAK,gBAAgB,GAAG;AACzD,YAAM,aAAa,uDAAuD;AAAA,IAC5E;AAEA,QAAI;AACF,UAAI,CAAE,MAAM,KAAK,gBAAgB,QAAQ,eAAe,WAAW,GAAI;AACrE,cAAM,aAAa,iCAAiC,SAAS,EAAE;AAAA,MACjE;AAAA,IACF,SAAS,OAAO;AACd,UAAI,OAAO,KAAK,WAAW,UAAW,QAAO,gBAAgB;AAC7D,YAAM;AAAA,IACR;AAEA,WAAO,gBAAgB,OAAO,IAAI;AAAA,EACpC;AAAA,EAEA,MAAM,QAAQ,aAA0C;AACtD,QAAI,KAAK,SAAU;AACnB,iBAAa,eAAe;AAE5B,UAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,OAAO,WAAW;AAC/C,YAAI,CAAE,MAAM,KAAK,gBAAgB,QAAQ,KAAO,WAAW,GAAI;AAC7D,gBAAM,aAAa,iCAAiC,OAAO,KAAK,EAAE,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,eAAe,SAA2C,QAA0B;AAC1F,UAAM,OAAO,CAAC,QAAQ,MAAM,MAAM,cAAc,KAAK,QAAQ,SAAS,QAAQ,OAAO,GAAG,CAAC;AACzF,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,EAAE,GAAG,KAAK,QAAQ,KAAK,GAAG,QAAQ,IAAI,CAAC,GAAG;AAClF,WAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IACnC;AACA,SAAK;AAAA,MACH,KAAK,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,GAAI,QAAQ,QAAQ,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,QAAoC;AAClD,WAAO,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,KAAK,aAAa,QAAQ,KAAK,CAAC;AAClF,WAAO,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB,OAAO,OAAO,OAAO,KAAK,CAAC;AAE7E,WAAO,MAAM,GAAG,SAAS,CAAC,UAAU;AAClC,aAAO,cAAc;AACrB,YAAM,aACH,MAAgC,SAAS,WACtC,IAAI,mBAAmB,6BAA6B,sBAAsB,QAAW;AAAA,QACnF,OAAO;AAAA,MACT,CAAC,IACD;AACN,aAAO,cAAc,UAAU;AAAA,IACjC,CAAC;AAED,WAAO,MAAM,GAAG,SAAS,CAAC,SAAS;AACjC,UAAI,OAAO,aAAa,SAAS,GAAG;AAClC,eAAO,OAAO,OAAO,OAAO,YAAY;AACxC,eAAO,eAAe,OAAO,MAAM,CAAC;AAAA,MACtC;AACA,aAAO,KAAK,SAAS,OAAO,gBAAgB,YAAY;AACxD,aAAO,KAAK,WAAW,QAAQ;AAC/B,aAAO,KAAK,WAAU,oBAAI,KAAK,GAAE,YAAY;AAC7C,aAAO;AAAA,QACL,aAAa,oDAAoD,OAAO,KAAK,EAAE,EAAE;AAAA,MACnF;AACA,aAAO,cAAc;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,QAA8B,OAAqB;AACtE,QAAI,OAAO,kBAAkB,QAAW;AACtC,aAAO,OAAO,OAAO,KAAK;AAC1B;AAAA,IACF;AAEA,WAAO,eAAe,OAAO,OAAO,CAAC,OAAO,cAAc,KAAK,CAAC;AAChE,UAAM,QAAQ,OAAO,aAAa,QAAQ,OAAO,WAAW;AAC5D,QAAI,QAAQ,GAAG;AACb,YAAM,gBAAgB,KAAK,IAAI,GAAG,OAAO,YAAY,SAAS,CAAC;AAC/D,UAAI,OAAO,aAAa,SAAS,eAAe;AAC9C,cAAM,QAAQ,OAAO,aAAa,SAAS;AAC3C,eAAO,OAAO,OAAO,OAAO,aAAa,SAAS,GAAG,KAAK,CAAC;AAC3D,eAAO,eAAe,OAAO,aAAa,SAAS,KAAK;AAAA,MAC1D;AACA;AAAA,IACF;AAEA,UAAM,MAAM,OAAO,aAAa,QAAQ,IAAM,QAAQ,OAAO,YAAY,MAAM;AAC/E,QAAI,MAAM,GAAG;AACX,UAAI,QAAQ,GAAG;AACb,eAAO,OAAO,OAAO,OAAO,aAAa,SAAS,GAAG,KAAK,CAAC;AAC3D,eAAO,eAAe,OAAO,aAAa,SAAS,KAAK;AAAA,MAC1D;AACA;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd,OAAO,aAAa,SAAS,QAAQ,OAAO,YAAY,QAAQ,GAAG;AAAA,IACrE,EAAE,MAAM,GAAG;AACX,UAAM,gBAAgB,OAAO,QAAQ,CAAC,CAAC;AACvC,UAAM,iBAAiB,OAAO,QAAQ,CAAC,CAAC;AACxC,QAAI,CAAC,YAAY,aAAa,KAAK,CAAC,YAAY,cAAc,KAAK,QAAQ,WAAW,GAAG;AACvF,aAAO,cAAc,aAAa,+CAA+C,CAAC;AAClF;AAAA,IACF;AAEA,QAAI,QAAQ,EAAG,QAAO,OAAO,OAAO,OAAO,aAAa,SAAS,GAAG,KAAK,CAAC;AAC1E,QAAI,MAAM,IAAI,OAAO,aAAa,QAAQ;AACxC,aAAO,OAAO,OAAO,OAAO,aAAa,SAAS,MAAM,CAAC,CAAC;AAAA,IAC5D;AACA,WAAO,eAAe,OAAO,MAAM,CAAC;AACpC,WAAO,gBAAgB;AACvB,WAAO,iBAAiB;AAIxB,WAAO,MAAM,MAAM,MAAM,SAAS;AAClC,WAAO,eAAe;AAAA,EACxB;AAAA,EAEA,MAAc,aACZ,QACA,aACe;AACf,QAAI;AACJ,QAAI;AACJ,UAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,gBAAU,WAAW,MAAM;AACzB,eAAO,IAAI,mBAAmB,uCAAuC,SAAS,CAAC;AAAA,MACjF,GAAG,KAAK,QAAQ,gBAAgB;AAChC,cAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI;AACF,YAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,YAAI,gBAAgB,OAAW;AAC/B,gBAAQ,MAAM,OAAO,YAAY,UAAU,IAAI,aAAa,WAAW,YAAY,CAAC;AACpF,YAAI,YAAY,QAAS,OAAM;AAAA,YAC1B,aAAY,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,MAClE,CAAC;AACD,YAAM,QAAQ,KAAK,CAAC,OAAO,SAAS,gBAAgB,YAAY,CAAC;AAAA,IACnE,UAAE;AACA,UAAI,YAAY,OAAW,cAAa,OAAO;AAC/C,UAAI,UAAU,OAAW,cAAa,oBAAoB,SAAS,KAAK;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,QAAgD;AAC/E,WAAO,gBAAgB;AACvB,QAAI,OAAO,mBAAmB,UAAa,OAAO,KAAK,WAAW,WAAW;AAC3E,aAAO,MAAM,MAAM,QAAQ;AAC3B,aAAO,MAAM,KAAK,SAAS;AAC3B,YAAM,eAAe,OAAO,QAAQ,GAAK;AAAA,IAC3C;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,gBAAgB,QAAQ,GAAK;AAAA,IACjD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,QACA,eACA,aACkB;AAClB,iBAAa,eAAe;AAC5B,WAAO,gBAAgB;AAEvB,QAAI,OAAO,mBAAmB,QAAW;AACvC,UAAI,OAAO,KAAK,WAAW,WAAW;AACpC,cAAM,eAAe,OAAO,QAAQ,KAAK,IAAI,eAAe,GAAG,GAAG,WAAW;AAAA,MAC/E;AACA,UAAI,OAAO,mBAAmB,QAAW;AACvC,eAAO,OAAO,KAAK,WAAW;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,CAAE,MAAM,KAAK,sBAAsB,QAAQ,WAAW,GAAI;AAC5D,aAAO,KAAK,qBAAqB,QAAQ,WAAW;AAAA,IACtD;AAEA,UAAM,KAAK,OAAO,QAAQ,QAAQ,WAAW;AAC7C,QAAI,MAAM,KAAK,kBAAkB,QAAQ,eAAe,WAAW,EAAG,QAAO;AAE7E,UAAM,KAAK,OAAO,QAAQ,QAAQ,WAAW;AAC7C,QAAI,MAAM,KAAK,kBAAkB,QAAQ,KAAO,WAAW,EAAG,QAAO;AAErE,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBACZ,QACA,WACA,aACkB;AAClB,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,MAAM;AACX,mBAAa,eAAe;AAC5B,UAAI,CAAE,MAAM,KAAK,sBAAsB,QAAQ,WAAW,GAAI;AAC5D,eAAO,KAAK,qBAAqB,QAAQ,WAAW;AAAA,MACtD;AAEA,YAAM,cAAc,WAAW,KAAK,IAAI;AACxC,UAAI,eAAe,EAAG,QAAO;AAC7B,YAAM,aAAa,KAAK,IAAI,IAAI,WAAW;AAC3C,UAAI,OAAO,KAAK,WAAW,WAAW;AACpC,cAAM,eAAe,OAAO,QAAQ,YAAY,WAAW;AAAA,MAC7D,OAAO;AACL,cAAM,aAAa,YAAY,WAAW;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,qBACZ,QACA,aACkB;AAClB,QAAI,OAAO,KAAK,WAAW,UAAW,QAAO;AAC7C,WAAO,MAAM,KAAK,SAAS;AAC3B,WAAO,eAAe,OAAO,QAAQ,KAAO,WAAW;AAAA,EACzD;AAAA,EAEA,MAAc,sBACZ,QACA,aACkB;AAClB,QAAI,OAAO,mBAAmB,OAAW,QAAO;AAChD,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,QACE;AAAA,QACA,KAAK,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,OAAO,cAAc;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,YAAY,KAAK,QAAQ;AAAA,QACzB,WAAW;AAAA,QACX,gBAAgB,KAAK,QAAQ;AAAA,QAC7B,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,OAAO,aAAa;AAAA,EAC7B;AAAA,EAEA,MAAc,OACZ,QACA,cACA,aACe;AACf,QAAI,OAAO,mBAAmB,OAAW;AACzC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,QACE;AAAA,QACA,KAAK,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,OAAO,cAAc;AAAA,QACxB;AAAA,MACF;AAAA,MACA;AAAA,QACE,YAAY,KAAK,QAAQ;AAAA,QACzB,WAAW;AAAA,QACX,gBAAgB,KAAK,QAAQ;AAAA,QAC7B,QAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,mCAAmC,OAAO,KAAK,EAAE;AAAA,QACjD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UAAU,WAAyC;AACzD,UAAM,SAAS,KAAK,QAAQ,IAAI,SAAS;AACzC,QAAI,WAAW,QAAW;AACxB,YAAM,aAAa,4BAA4B,SAAS,EAAE;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,sBAAsB,aAA0C;AAC5E,eAAW,CAAC,IAAI,MAAM,KAAK,KAAK,SAAS;AACvC,UAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ,aAAc;AACnD,YAAM,mBACJ,OAAO,mBAAmB,SACtB,OAAO,cACP,CAAE,MAAM,KAAK,sBAAsB,QAAQ,WAAW;AAC5D,UAAI,OAAO,KAAK,WAAW,aAAa,kBAAkB;AACxD,aAAK,QAAQ,OAAO,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,UAAU;AACjB,YAAM,aAAa,4CAA4C;AAAA,IACjE;AAAA,EACF;AACF;AAEA,IAAM,sBAAN,MAA0B;AAAA,EAKxB,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAJrB,SAAmB,CAAC;AAAA,EACpB,SAAS;AAAA,EACT,cAAc;AAAA,EAItB,OAAO,OAAqB;AAC1B,QAAI,MAAM,WAAW,EAAG;AACxB,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,cAAc;AACnB;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,KAAK,UAAU;AACjC,WAAK,SAAS,CAAC,MAAM,SAAS,MAAM,SAAS,KAAK,QAAQ,CAAC;AAC3D,WAAK,SAAS,KAAK;AACnB,WAAK,cAAc;AACnB;AAAA,IACF;AAEA,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,UAAU,MAAM;AACrB,WAAO,KAAK,SAAS,KAAK,UAAU;AAClC,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,UAAI,UAAU,OAAW;AACzB,YAAM,WAAW,KAAK,SAAS,KAAK;AACpC,UAAI,MAAM,UAAU,UAAU;AAC5B,aAAK,OAAO,MAAM;AAClB,aAAK,UAAU,MAAM;AAAA,MACvB,OAAO;AACL,aAAK,OAAO,CAAC,IAAI,MAAM,SAAS,QAAQ;AACxC,aAAK,UAAU;AAAA,MACjB;AACA,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAS,WAA+D;AACtE,QAAI,cAAc,WAAc,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,IAAI;AAC9E,YAAM,aAAa,mDAAmD;AAAA,IACxE;AACA,UAAM,QAAQ,OAAO,OAAO,KAAK,QAAQ,KAAK,MAAM;AACpD,UAAM,WACJ,cAAc,IACV,OAAO,MAAM,CAAC,IACd,cAAc,UAAa,MAAM,UAAU,YACzC,QACA,MAAM,SAAS,MAAM,SAAS,SAAS;AAC/C,WAAO;AAAA,MACL,OAAO,IAAI,WAAW,SAAS,QAAQ,SAAS,YAAY,SAAS,UAAU,EAAE,MAAM;AAAA,MACvF,WAAW,KAAK,eAAe,SAAS,SAAS,MAAM;AAAA,IACzD;AAAA,EACF;AACF;AAEA,SAAS,aAAa,SAAqC;AACzD,SAAO,IAAI,mBAAmB,SAAS,SAAS;AAClD;AAEA,SAAS,mBAAmB,SAAiD;AAC3E,MAAI,QAAQ,QAAQ,KAAK,EAAE,WAAW,GAAG;AACvC,UAAM,aAAa,0CAA0C;AAAA,EAC/D;AACF;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,cAAc,KAAK,KAAK,QAAQ;AAChD;AAEA,SAAS,gBAAgB,MAA0D;AACjF,MAAI,OAAiC;AAAA,IACnC,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,MAAM,CAAC,GAAG,KAAK,IAAI;AAAA,IACnB,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,EAClB;AACA,MAAI,KAAK,QAAQ,OAAW,QAAO,EAAE,GAAG,MAAM,KAAK,KAAK,IAAI;AAC5D,MAAI,KAAK,aAAa,OAAW,QAAO,EAAE,GAAG,MAAM,UAAU,KAAK,SAAS;AAC3E,MAAI,KAAK,YAAY,OAAW,QAAO,EAAE,GAAG,MAAM,SAAS,KAAK,QAAQ;AACxE,SAAO;AACT;AAEA,eAAe,eACb,SACA,WACA,aACkB;AAClB,eAAa,eAAe;AAC5B,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK;AAAA,MACxB,QAAQ,KAAK,MAAM,IAAI;AAAA,MACvB,IAAI,QAAiB,CAAC,YAAY;AAChC,kBAAU,WAAW,MAAM,QAAQ,KAAK,GAAG,SAAS;AACpD,gBAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,MACD,IAAI,QAAiB,CAAC,GAAG,WAAW;AAClC,YAAI,gBAAgB,OAAW;AAC/B,gBAAQ,MAAM,OAAO,YAAY,UAAU,IAAI,aAAa,WAAW,YAAY,CAAC;AACpF,YAAI,YAAY,QAAS,OAAM;AAAA,YAC1B,aAAY,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,MAClE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,UAAE;AACA,QAAI,YAAY,OAAW,cAAa,OAAO;AAC/C,QAAI,UAAU,OAAW,cAAa,oBAAoB,SAAS,KAAK;AAAA,EAC1E;AACF;AAEA,eAAe,aAAa,WAAmB,aAA0C;AACvF,QAAM;AAAA,IACJ,IAAI,QAAc,CAAC,YAAY;AAC7B,YAAM,UAAU,WAAW,SAAS,SAAS;AAC7C,cAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,IACD;AAAA,IACA;AAAA,EACF;AACF;;;AEnnBO,SAAS,mBACd,MACA,SAC2B;AAC3B,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,gBAAgB,KAAK,IAAI,GAAG,QAAQ,YAAY,gBAAgB;AACtE,QAAM,QAAQ,WAAW,IAAI,EAAE,MAAM,eAAe,gBAAgB,QAAQ,YAAY,CAAC;AACzF,QAAM,eAAe,MAAM,SAAS,QAAQ;AAC5C,QAAM,gBAAgB,MAAM,MAAM,GAAG,QAAQ,SAAS;AACtD,QAAM,kBAAkB,cAAc,KAAK,EAAE;AAC7C,QAAM,gBAAgB,OAAO,KAAK,eAAe;AAEjD,MAAI,cAAc,aAAa,QAAQ,UAAU;AAC/C,UAAM,UAAU,mBAAmB,cAAc,SAAS,GAAG,QAAQ,QAAQ,CAAC;AAC9E,UAAM,aAAa,gBAAgB,OAAO;AAC1C,UAAM,sBAAsB,QAAQ,SAAS,IAAI;AACjD,WAAO;AAAA,MACL;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SACE,QAAQ,WAAW,IACf,OACA,QAAQ,YAAY,cAAc,sBAAsB,IAAI;AAAA,MAClE,eAAe,sBAAsB,QAAQ,YAAY,aAAa;AAAA,MACtE,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW,QAAQ;AAAA,IACnB,SAAS,cAAc,WAAW,IAAI,OAAO,QAAQ,YAAY,cAAc,SAAS;AAAA,IACxF,eAAe,eAAe,QAAQ,YAAY,cAAc,SAAS;AAAA,IACzE,WAAW;AAAA,IACX,aAAa,eAAe,UAAU;AAAA,EACxC;AACF;AAEA,SAAS,WAAW,MAAwB;AAC1C,SAAO,KAAK,MAAM,mBAAmB,KAAK,CAAC;AAC7C;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,MAAI,QAAQ;AACZ,aAAW,aAAa,MAAM;AAC5B,QAAI,cAAc,KAAM,UAAS;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA2B;AACrD,SAAO,IAAI,YAAY,EAAE,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACzD;;;AHpBA,IAAM,gBAAgB;AACtB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,0BAA0B;AAChC,IAAM,wBAAwB,OAAO;AACrC,IAAM,sBAAsB,KAAK,OAAO;AACxC,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,2BAA2B,KAAK;AACtC,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAClC,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAEtB,IAAM,SAAS;AAAA,EACb,QAAQ,GAAG,WAAW;AAAA,EACtB,IAAI,GAAG,WAAW;AAAA,EAClB,SAAS,GAAG,WAAW;AAAA,EACvB,eAAe,GAAG,WAAW;AAAA,EAC7B,iBAAiB,GAAG,WAAW;AAAA,EAC/B,aAAa,GAAG,WAAW;AAAA,EAC3B,kBAAkB,GAAG,WAAW;AAAA,EAChC,gBAAgB,GAAG,WAAW;AAAA,EAC9B,cAAc,GAAG,WAAW;AAAA,EAC5B,cAAc,GAAG,WAAW;AAC9B;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAgBJ,IAAM,sBAAN,MAA0B;AAAA,EACd;AAAA,EAEjB,YAAY,UAAsC,CAAC,GAAG;AACpD,QAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,UAAU,4BAA4B;AACxE,SAAK,aAAa,QAAQ,cAAc;AACxC,yBAAqB,KAAK,YAAY,YAAY;AAAA,EACpD;AAAA,EAEA,MAAM,UAAU,SAAgD;AAC9D,QAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,UAAU,4BAA4B;AACxE,yBAAqB,QAAQ,OAAO,OAAO;AAC3C,YAAQ,aAAa,eAAe;AACpC,UAAM,gBAAgB,CAAC,QAAQ,QAAQ,KAAK,GAAG,KAAK,WAAW,QAAQ,WAAW,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,cAAc,SAA6D;AAC/E,0BAAsB,OAAO;AAC7B,cAAU,sBAAsB,OAAO;AACvC,YAAQ,aAAa,eAAe;AAEpC,UAAM,KAAK,QAAQ,MAAMC,YAAW;AACpC,oBAAgB,EAAE;AAClB,UAAM,gBAAgB,iBAAiB,EAAE;AACzC,UAAM,UAAU,QAAQ,WAAW;AACnC,UAAM,UAAU,qBAAqB,QAAQ,OAAO;AACpD,UAAM,YAAY,cAAc,QAAQ,SAAS;AACjD,UAAM,UAAU,YAAY,QAAQ,OAAO;AAC3C,UAAM,MAAM,iBAAiB,QAAQ,KAAK,KAAK;AAC/C,UAAM,aAAa,iBAAiB,QAAQ,QAAQ,QAAQ;AAC5D,UAAM,aACJ,UAAU,SAAS,cACf,GAAG,aAAa,cAAcA,YAAW,CAAC,KAC1C,UAAU;AAChB,UAAM,aAAa,UAAU,SAAS;AAEtC,UAAM,KAAK,4BAA4B,eAAe,QAAQ,WAAW;AACzE,UAAM,KAAK,kBAAkB,QAAQ,OAAO,QAAQ,WAAW;AAC/D,QAAI,UAAU,SAAS,iBAAiB;AACtC,YAAM,KAAK,mBAAmB,UAAU,MAAM,QAAQ,WAAW;AAAA,IACnE;AAEA,QAAI,mBAAmB;AACvB,QAAI,gBAAgB;AACpB,QAAI;AACF,UAAI,UAAU,SAAS,aAAa;AAClC,cAAM;AAAA,UACJ,CAAC,UAAU,UAAU,WAAW,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,UAAU;AAAA,UAChE,KAAK,WAAW,QAAQ,WAAW;AAAA,QACrC;AACA,wBAAgB;AAAA,MAClB;AACA,YAAM;AAAA,QACJ,cAAc;AAAA,UACZ;AAAA,UACA;AAAA,UACA,OAAO,QAAQ;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM,QAAQ;AAAA,UACd;AAAA,UACA,WAAW,QAAQ;AAAA,UACnB;AAAA,UACA,UAAU,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,QACD;AAAA,UACE,GAAG,KAAK,WAAW,QAAQ,WAAW;AAAA,UACtC,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AACA,yBAAmB;AAEnB,YAAM,iBAAiB,MAAM,sBAAsB;AAAA,QACjD,YAAY,KAAK;AAAA,QACjB;AAAA,QACA,OAAO,QAAQ,SAAS,WAAW,CAAC,GAAI,QAAQ,SAAS,CAAC,CAAE,IAAI,CAAC;AAAA,QACjE,aAAa,QAAQ;AAAA,MACvB,CAAC;AACD,YAAM,UAAU,KAAK,aAAa;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,oBAAoB,QAAQ,SAAS,OAAO;AAClD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,gBAA2B,CAAC;AAClC,UAAI,kBAAkB;AACpB,YAAI;AACF,gBAAM,gBAAgB,KAAK,YAAY,aAAa;AAAA,QACtD,SAAS,cAAc;AACrB,wBAAc,KAAK,YAAY;AAAA,QACjC;AAAA,MACF;AACA,UAAI,cAAc,eAAe;AAC/B,YAAI;AACF,gBAAM,aAAa,KAAK,YAAY,UAAU;AAAA,QAChD,SAAS,cAAc;AACrB,wBAAc,KAAK,YAAY;AAAA,QACjC;AAAA,MACF;AACA,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,IAAI,eAAe,CAAC,OAAO,GAAG,aAAa,GAAG,sCAAsC;AAAA,MAC5F;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAA6D;AAC/E,QAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,UAAU,4BAA4B;AACxE,oBAAgB,QAAQ,EAAE;AAC1B,YAAQ,aAAa,eAAe;AACpC,UAAM,gBAAgB,iBAAiB,QAAQ,EAAE;AACjD,UAAM,aAAa,MAAM;AAAA,MACvB,KAAK;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF;AACA,UAAM,gBAAgB,4BAA4B,QAAQ,IAAI,eAAe,UAAU;AAEvF,QAAI,WAAW,MAAM,WAAW,QAAQ,WAAW,MAAM,SAAS,MAAM;AACtE,YAAM,IAAI;AAAA,QACR,gDAAgD,WAAW,MAAM,UAAU,SAAS;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,MAAM,YAAY,MAAM;AACrC,YAAM,gBAAgB,CAAC,QAAQ,aAAa,GAAG,KAAK,WAAW,QAAQ,WAAW,CAAC;AAAA,IACrF;AACA,UAAM,gBAAgB,CAAC,SAAS,aAAa,GAAG,KAAK,WAAW,QAAQ,WAAW,CAAC;AACpF,kBAAc,iBAAiB,MAAM,sBAAsB;AAAA,MACzD,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,OAAO,yBAAyB,UAAU;AAAA,MAC1C,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,WAAO,KAAK,aAAa,aAAa;AAAA,EACxC;AAAA,EAEQ,aAAa,eAAoD;AACvE,WAAO,IAAI,oBAAoB;AAAA,MAC7B,YAAY,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,kBAAkB,OAAe,aAA0C;AACvF,UAAM,SAAS,MAAM,aAAa,CAAC,SAAS,WAAW,KAAK,GAAG,KAAK,WAAW,WAAW,CAAC;AAC3F,QAAI,OAAO,aAAa,EAAG;AAC3B,UAAM,UAAU,WAAW,OAAO,MAAM;AACxC,QAAI,QAAQ,YAAY,EAAE,SAAS,eAAe,GAAG;AACnD,YAAM,IAAI;AAAA,QACR,0CAA0C,KAAK;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,4BACZ,eACA,aACe;AACf,UAAM,SAAS,MAAM,aAAa,CAAC,aAAa,WAAW,aAAa,GAAG;AAAA,MACzE,GAAG,KAAK,WAAW,WAAW;AAAA,MAC9B,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAI,OAAO,aAAa,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,kDAAkD,aAAa;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,OAAO,MAAM,EAAE,YAAY,EAAE,SAAS,SAAS,EAAG;AACjE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,MAAc,aAA0C;AACvF,UAAM,SAAS,MAAM,aAAa,CAAC,UAAU,WAAW,IAAI,GAAG,KAAK,WAAW,WAAW,CAAC;AAC3F,QAAI,OAAO,aAAa,EAAG;AAC3B,UAAM,UAAU,WAAW,OAAO,MAAM;AACxC,QAAI,QAAQ,YAAY,EAAE,SAAS,gBAAgB,GAAG;AACpD,YAAM,IAAI,mBAAmB,iCAAiC,IAAI,IAAI,kBAAkB;AAAA,IAC1F;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,aAA2B;AAC5C,WAAO,EAAE,YAAY,KAAK,YAAY,QAAQ,YAAY;AAAA,EAC5D;AACF;AAEA,IAAM,sBAAN,MAAmD;AAAA,EACxC;AAAA,EACA;AAAA,EAED,eAAmC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAER,YAAY,SAAsE;AAChF,SAAK,aAAa,QAAQ;AAC1B,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,KAAK,QAAQ,cAAc;AAChC,SAAK,cAAc,IAAI,yBAAyB;AAAA,MAC9C,eAAe,QAAQ;AAAA,MACvB,YAAY,QAAQ;AAAA,MACpB,OAAO,MAAM,KAAK;AAAA,IACpB,CAAC;AACD,SAAK,UAAU,OAAO,OAAO,KAAK,YAAY,cAAc,CAAC;AAAA,EAC/D;AAAA,EAEA,IAAI,QAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,SAAiE;AACzE,QAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,UAAU,4BAA4B;AACxE,QAAI,QAAQ,UAAU,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,cAAc,MAAM;AAClF,YAAM,IAAI,UAAU,wDAAwD;AAAA,IAC9E;AACA,QAAI,YAAoC;AAAA,MACtC,IAAI,KAAK;AAAA,MACT,UAAU;AAAA,MACV,SAAS,KAAK,cAAc;AAAA,IAC9B;AACA,QAAI,QAAQ,UAAU,MAAM;AAC1B,kBAAY;AAAA,QACV,GAAG;AAAA,QACH,WAAW,KAAK,QAAQ,UAAU,KAAK,KAAK,OAAO;AAAA,QACnD,UAAU,KAAK,QAAQ,SAAS,KAAK,KAAK,OAAO;AAAA,MACnD;AAAA,IACF;AACA,QAAI,QAAQ,UAAU,MAAM;AAC1B,kBAAY,EAAE,GAAG,WAAW,gBAAgB,KAAK,QAAQ,eAAe;AAAA,IAC1E;AACA,QAAI,QAAQ,cAAc,MAAM;AAC9B,kBAAY;AAAA,QACV,GAAG;AAAA,QACH,eAAe,KAAK,QAAQ,cAAc,KAAK,KAAK,OAAO;AAAA,QAC3D,iBAAiB,KAAK,QAAQ,gBAAgB,KAAK,KAAK,OAAO;AAAA,MACjE;AAAA,IACF;AACA,WAAO,OAAO,OAAO,SAAS;AAAA,EAChC;AAAA,EAEA,MAAM,KAAK,UAAmD,CAAC,GAAkB;AAC/E,QAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,UAAU,4BAA4B;AACxE,QAAI,KAAK,iBAAiB,UAAW;AACrC,QAAI,KAAK,iBAAiB,eAAe,KAAK,iBAAiB,cAAc;AAC3E,YAAM,aAAa,KAAK,IAAI,KAAK,YAAY;AAAA,IAC/C;AACA,QAAI,KAAK,gBAAgB,OAAW,QAAO,KAAK;AAChD,SAAK,cAAc,KAAK,YAAY,QAAQ,WAAW;AACvD,QAAI;AACF,YAAM,KAAK;AAAA,IACb,UAAE;AACA,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,aAA0C;AAClE,iBAAa,eAAe;AAC5B,SAAK,eAAe;AACpB,QAAI;AACF,YAAM,KAAK,YAAY,sBAAsB,sBAAsB;AACnE,YAAM,KAAK,YAAY,iBAAiB,WAAW;AACnD,YAAM,gBAAgB,CAAC,QAAQ,KAAK,cAAc,aAAa,GAAG;AAAA,QAChE,YAAY,KAAK;AAAA,QACjB,QAAQ;AAAA,MACV,CAAC;AACD,WAAK,eAAe;AAAA,IACtB,SAAS,OAAO;AACd,WAAK,eAAe;AACpB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,iBAAiB,YAAa;AACvC,QAAI,KAAK,mBAAmB,OAAW,QAAO,KAAK;AACnD,SAAK,iBAAiB,KAAK,eAAe;AAC1C,QAAI;AACF,YAAM,KAAK;AAAA,IACb,UAAE;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,iBAAgC;AAC5C,QAAI,KAAK,gBAAgB,OAAW,OAAM,KAAK,YAAY,MAAM,MAAM,MAAS;AAChF,SAAK,eAAe;AACpB,UAAM,WAAsB,CAAC;AAC7B,QAAI;AACF,YAAM,KAAK,YAAY,sBAAsB,6BAA6B;AAAA,IAC5E,SAAS,OAAO;AACd,eAAS,KAAK,KAAK;AAAA,IACrB;AACA,QAAI;AACF,YAAM,KAAK,YAAY,iBAAiB;AAAA,IAC1C,SAAS,OAAO;AACd,eAAS,KAAK,KAAK;AAAA,IACrB;AACA,QAAI;AACF,YAAM,gBAAgB,KAAK,YAAY,KAAK,cAAc,aAAa;AAAA,IACzE,SAAS,OAAO;AACd,eAAS,KAAK,KAAK;AAAA,IACrB;AACA,QAAI,KAAK,cAAc,YAAY;AACjC,UAAI;AACF,cAAM,aAAa,KAAK,YAAY,KAAK,cAAc,UAAU;AAAA,MACnE,SAAS,OAAO;AACd,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,WAAK,eAAe;AACpB,YAAM,IAAI,eAAe,UAAU,8BAA8B,KAAK,EAAE,EAAE;AAAA,IAC5E;AACA,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,OAAO,OAAO,YAAY,IAAmB;AAC3C,UAAM,KAAK,QAAQ;AAAA,EACrB;AACF;AAEA,IAAM,2BAAN,MAA+B;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB,oBAAI,IAAqB;AAAA,EAC7C,mBAAmB,oBAAI,IAAsB;AAAA,EACtD,kBAAkB;AAAA,EAE1B,YAAY,SAIT;AACD,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,aAAa,QAAQ;AAC1B,SAAK,QAAQ,QAAQ;AACrB,SAAK,iBAAiB,IAAI,qBAAqB;AAAA,MAC7C,eAAe,QAAQ,cAAc;AAAA,MACrC,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ,cAAc;AAAA,MAC/B,KAAK,QAAQ,cAAc;AAAA,MAC3B,gBAAgB,QAAQ,cAAc,QAAQ;AAAA,MAC9C,cAAc,QAAQ,cAAc,QAAQ;AAAA,MAC5C,kBAAkB,QAAQ,cAAc,QAAQ;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,gBAAsC;AACpC,WAAO;AAAA,MACL,IAAI,KAAK,cAAc;AAAA,MACvB,UAAU;AAAA,MACV,SAAS,KAAK,cAAc;AAAA,MAC5B,gBAAgB,OAAO;AAAA,QACrB,KAAK,cAAc,eAAe,IAAI,CAAC,SAAS,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;AAAA,MAC5E;AAAA,MACA,MAAM,CAAC,YAAY,KAAK,KAAK,OAAO;AAAA,MACpC,YAAY,CAAC,YAAY,KAAK,WAAW,OAAO;AAAA,MAChD,UAAU,CAAC,YAAY,KAAK,SAAS,OAAO;AAAA,MAC5C,cAAc,CAAC,YAAY,KAAK,aAAa,OAAO;AAAA,MACpD,kBAAkB,CAAC,YAAY,KAAK,iBAAiB,OAAO;AAAA,MAC5D,WAAW,CAAC,YAAY,KAAK,UAAU,OAAO;AAAA,MAC9C,eAAe,CAAC,YAAY,KAAK,cAAc,OAAO;AAAA,MACtD,WAAW,CAAC,YAAY,KAAK,UAAU,OAAO;AAAA,MAC9C,cAAc,CAAC,YAAY,KAAK,aAAa,OAAO;AAAA,MACpD,eAAe,CAAC,YAAY,KAAK,cAAc,OAAO;AAAA,MACtD,iBAAiB,CAAC,YAAY,KAAK,gBAAgB,OAAO;AAAA,MAC1D,aAAa,CAAC,YAAY,KAAK,YAAY,OAAO;AAAA,MAClD,aAAa,CAAC,YAAY,KAAK,YAAY,OAAO;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAqE;AAC9E,wBAAoB,OAAO;AAC3B,WAAO,KAAK,aAAa,QAAQ,aAAa,OAAO,gBAAgB;AACnE,YAAM,SAAS,MAAM,aAAa,KAAK,SAAS,OAAO,GAAG;AAAA,QACxD,YAAY,KAAK;AAAA,QACjB,WAAW,QAAQ,aAAa,KAAK,cAAc,QAAQ;AAAA,QAC3D,gBAAgB,KAAK,cAAc,QAAQ;AAAA,QAC3C,OAAO,QAAQ;AAAA,QACf,QAAQ;AAAA,MACV,CAAC;AACD,aAAO,aAAa,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,WACL,SAC6C;AAC7C,wBAAoB,OAAO;AAC3B,SAAK,cAAc;AACnB,UAAM,cAAc,IAAI,gBAAgB;AACxC,UAAM,WAAW,eAAe,QAAQ,aAAa,YAAY,MAAM;AACvE,UAAM,QAAwC,CAAC;AAC/C,QAAI,cAAc;AAClB,QAAI;AACJ,QAAI,WAAW;AACf,QAAI;AACJ,UAAM,OAAO,CAAC,UAAwC;AACpD,UAAI,MAAM,SAAS,UAAU;AAC3B,uBAAe,MAAM,KAAK;AAC1B,YAAI,cAAc,KAAK,cAAc,QAAQ,gBAAgB;AAC3D,sBAAY;AAAA,YACV,IAAI,mBAAmB,wCAAwC,uBAAuB;AAAA,UACxF;AACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,KAAK,KAAK;AAChB,aAAO;AACP,aAAO;AAAA,IACT;AACA,UAAM,MAAM,KAAK,aAAa,UAAU,OAAO,gBAAgB;AAC7D,YAAM,SAAS,MAAM,aAAa,KAAK,SAAS,OAAO,GAAG;AAAA,QACxD,YAAY,KAAK;AAAA,QACjB,WAAW,QAAQ,aAAa,KAAK,cAAc,QAAQ;AAAA,QAC3D,gBAAgB,KAAK,cAAc,QAAQ;AAAA,QAC3C,OAAO,QAAQ;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC,SAAS,KAAK,EAAE,MAAM,UAAU,MAAM,KAAK,MAAM,EAAE,CAAC;AAAA,QAC/D,UAAU,CAAC,SAAS,KAAK,EAAE,MAAM,UAAU,MAAM,KAAK,MAAM,EAAE,CAAC;AAAA,MACjE,CAAC;AACD,WAAK,EAAE,MAAM,UAAU,QAAQ,aAAa,MAAM,EAAE,CAAC;AAAA,IACvD,CAAC;AACD,SAAK,IAAI;AAAA,MACP,MAAM;AACJ,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,MACA,CAAC,UAAU;AACT,kBAAU;AACV,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,aAAO,CAAC,YAAY,MAAM,SAAS,GAAG;AACpC,cAAM,QAAQ,MAAM,MAAM;AAC1B,YAAI,UAAU,QAAW;AACvB,cAAI,MAAM,SAAS,SAAU,gBAAe,MAAM,KAAK;AACvD,gBAAM;AACN;AAAA,QACF;AACA,cAAM,IAAI,QAAc,CAAC,YAAY;AACnC,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,UAAI,YAAY,OAAW,OAAM;AAAA,IACnC,UAAE;AACA,UAAI,CAAC,SAAU,aAAY,MAAM,IAAI,aAAa,iBAAiB,YAAY,CAAC;AAChF,YAAM,IAAI,MAAM,MAAM,MAAS;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAA4D;AACzE,sBAAkB,OAAO;AACzB,WAAO,KAAK,aAAa,QAAQ,aAAa,OAAO,gBAAgB;AACnE,YAAM,aAAa,qBAAqB,QAAQ,IAAI;AACpD,YAAM,UAAU,MAAM,QAAQC,MAAK,KAAK,GAAG,OAAO,GAAG,qBAAqB,CAAC;AAC3E,YAAM,SAASA,MAAK,KAAK,SAASA,MAAK,SAAS,UAAU,CAAC;AAC3D,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA,GAAG,KAAK,cAAc,aAAa,IAAI,cAAc,KAAK,cAAc,SAAS,UAAU,CAAC;AAAA,YAC5F;AAAA,UACF;AAAA,UACA,EAAE,YAAY,KAAK,YAAY,QAAQ,YAAY;AAAA,QACrD;AACA,cAAM,wBAAwB,SAAS,QAAQ,UAAU;AACzD,cAAM,QAAQ,MAAM,SAAS,QAAQ,EAAE,QAAQ,YAAY,CAAC;AAC5D,aAAK,eAAe,MAAM,YAAY,UAAU;AAChD,eAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU,EAAE,MAAM;AAAA,MAChF,UAAE;AACA,cAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,SAAwD;AACzE,WAAO,WAAW,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,EAChD;AAAA,EAEA,MAAM,iBACJ,SACoC;AACpC,sBAAkB,OAAO;AACzB,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,WAAW,QAAQ,YAAY;AACrC,8BAA0B,WAAW,WAAW;AAChD,8BAA0B,WAAW,WAAW;AAChD,8BAA0B,UAAU,UAAU;AAC9C,QAAI,cAA4C;AAAA,MAC9C,MAAM,QAAQ;AAAA,IAChB;AACA,QAAI,QAAQ,gBAAgB,QAAW;AACrC,oBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,IACnE;AACA,UAAM,OAAO,MAAM,KAAK,aAAa,WAAW;AAChD,WAAO,mBAAmB,MAAM,EAAE,WAAW,WAAW,SAAS,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,UAAU,SAAuD;AACrE,wBAAoB,OAAO;AAC3B,QAAI,EAAE,QAAQ,gBAAgB,YAAa,OAAM,IAAI,UAAU,4BAA4B;AAC3F,UAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,UAAM,KAAK,WAAW,QAAQ,MAAM,MAAM,QAAQ,WAAW;AAAA,EAC/D;AAAA,EAEA,MAAM,cAAc,SAA2D;AAC7E,wBAAoB,OAAO;AAC3B,QAAI,OAAO,QAAQ,SAAS,SAAU,OAAM,IAAI,UAAU,wBAAwB;AAClF,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,IAAI,YAAY,EAAE,OAAO,QAAQ,IAAI;AAAA,MACrC,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,UACA,MACA,aACe;AACf,UAAM,aAAa,qBAAqB,QAAQ;AAChD,SAAK,eAAe,KAAK,YAAY,UAAU;AAC/C,UAAM,KAAK,aAAa,aAAa,OAAO,oBAAoB;AAC9D,YAAM,KAAK,MAAM,kBAAkB,UAAU,GAAG,eAAe;AAC/D,YAAM,UAAU,MAAM,QAAQA,MAAK,KAAK,GAAG,OAAO,GAAG,sBAAsB,CAAC;AAC5E,YAAM,SAASA,MAAK,KAAK,SAASA,MAAK,SAAS,UAAU,CAAC;AAC3D,UAAI;AACF,cAAM,UAAU,QAAQ,MAAM,EAAE,QAAQ,gBAAgB,CAAC;AACzD,cAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA;AAAA,YACA,GAAG,KAAK,cAAc,aAAa,IAAI,cAAc,KAAK,cAAc,SAAS,UAAU,CAAC;AAAA,UAC9F;AAAA,UACA,EAAE,YAAY,KAAK,YAAY,QAAQ,gBAAgB;AAAA,QACzD;AAAA,MACF,UAAE;AACA,cAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,UAAyC,CAAC,GACE;AAC5C,wBAAoB,OAAO;AAC3B,UAAM,gBAAgB,QAAQ,QAAQ;AACtC,UAAM,aAAa,qBAAqB,eAAe,EAAE,WAAW,KAAK,CAAC;AAC1E,WAAO,KAAK,aAAa,QAAQ,aAAa,OAAO,gBAAgB;AACnE,YAAM,SAAS,MAAM,KAAK;AAAA,QACxB;AAAA,UACE,SAAS;AAAA,UACT,MAAM;AAAA,YACJ,cAAc,KAAK,cAAc,SAAS,UAAU;AAAA,YACpD;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,MACF;AACA,UAAI,OAAO,WAAW,YAAY,OAAO,aAAa,GAAG;AACvD,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,WAAW,OAAO,MAAM;AACvC,aAAO,OACJ,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,IAAI,CAAC,SAAS,eAAe,MAAM,KAAK,cAAc,OAAO,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,SAA8E;AAC/F,gCAA4B,OAAO;AACnC,WAAO,KAAK;AAAA,MAAa,QAAQ;AAAA,MAAa,OAAO,gBACnD,KAAK,eAAe,MAAM,EAAE,GAAG,SAAS,YAAY,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,UAA6C,CAAC,GACA;AAC9C,wBAAoB,OAAO;AAC3B,WAAO,KAAK,aAAa,QAAQ,aAAa,YAAY,KAAK,eAAe,KAAK,CAAC;AAAA,EACtF;AAAA,EAEA,MAAM,gBACJ,SACmC;AACnC,wBAAoB,OAAO;AAC3B,yBAAqB,QAAQ,WAAW,WAAW;AACnD,QAAI,QAAQ,cAAc;AACxB,mCAA6B,QAAQ,WAAW,WAAW;AAC7D,WAAO,KAAK;AAAA,MAAa,QAAQ;AAAA,MAAa,YAC5C,KAAK,eAAe,KAAK,QAAQ,WAAW,QAAQ,SAAS;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAA6E;AAC7F,wBAAoB,OAAO;AAC3B,yBAAqB,QAAQ,WAAW,WAAW;AACnD,QAAI,QAAQ,kBAAkB,QAAW;AACvC,mCAA6B,QAAQ,eAAe,eAAe;AAAA,IACrE;AACA,WAAO,KAAK;AAAA,MAAa,QAAQ;AAAA,MAAa,OAAO,gBACnD,KAAK,eAAe,KAAK,QAAQ,WAAW,QAAQ,eAAe,WAAW;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAA+E;AAC/F,wBAAoB,OAAO;AAC3B,eAAW,QAAQ,aAAa;AAChC,UAAM,gBAAgB,KAAK,cAAc,eAAe;AAAA,MACtD,CAAC,cAAc,UAAU,kBAAkB,QAAQ;AAAA,IACrD;AACA,QAAI,kBAAkB,QAAW;AAC/B,YAAM,IAAI;AAAA,QACR,kCAAkC,QAAQ,aAAa;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AACA,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,aAAa,QAAQ,cAAc;AACzC,8BAA0B,WAAW,WAAW;AAChD,8BAA0B,YAAY,YAAY;AAElD,WAAO,KAAK,aAAa,QAAQ,aAAa,OAAO,gBAAgB;AACnE,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO,MAAM;AACX,cAAM,SAAS,MAAM,KAAK;AAAA,UACxB;AAAA,YACE,SAAS;AAAA,YACT,MAAM,CAAC,MAAM,iBAAiB,oBAAoB,GAAG,QAAQ,aAAa,EAAE;AAAA,YAC5E,WAAW,KAAK,IAAI,KAAO,SAAS;AAAA,UACtC;AAAA,UACA;AAAA,QACF;AACA,YAAI,OAAO,WAAW,YAAY,OAAO,aAAa,EAAG,QAAO,EAAE,GAAG,cAAc;AACnF,YAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,gBAAM,IAAI;AAAA,YACR,uCAAuC,QAAQ,aAAa;AAAA,YAC5D;AAAA,UACF;AAAA,QACF;AACA,cAAM,eAAe,KAAK,IAAI,YAAY,WAAW,KAAK,IAAI,CAAC,GAAG,WAAW;AAAA,MAC/E;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,sBAAsB,SAAgC;AAC1D,UAAM,SAAS,IAAI,mBAAmB,SAAS,eAAe;AAC9D,eAAW,cAAc,KAAK,kBAAmB,YAAW,MAAM,MAAM;AACxE,UAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,gBAAgB,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,iBAAiB,aAA0C;AAC/D,QAAI,KAAK,gBAAiB;AAC1B,UAAM,KAAK,eAAe,QAAQ,WAAW;AAC7C,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAc,aACZ,aACA,WACY;AACZ,SAAK,cAAc;AACnB,iBAAa,eAAe;AAC5B,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,kBAAkB,eAAe,aAAa,WAAW,MAAM;AACrE,UAAM,YAAY,UAAU,eAAe;AAC3C,SAAK,kBAAkB,IAAI,UAAU;AACrC,SAAK,iBAAiB,IAAI,SAAS;AACnC,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AACA,WAAK,kBAAkB,OAAO,UAAU;AACxC,WAAK,iBAAiB,OAAO,SAAS;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,UAAM,UAAU,KAAK,MAAM;AAC3B,QAAI,YAAY,UAAW,OAAM,aAAa,KAAK,cAAc,IAAI,OAAO;AAAA,EAC9E;AAAA,EAEQ,SAAS,SAA6C;AAC5D,UAAM,OAAO,CAAC,MAAM;AACpB,QAAI,QAAQ,UAAU,OAAW,MAAK,KAAK,IAAI;AAC/C,SAAK,KAAK,MAAM,cAAc,KAAK,cAAc,SAAS,QAAQ,OAAO,GAAG,CAAC;AAC7E,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,CAAC,CAAC;AACzD,WAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACnC,SAAK,KAAK,KAAK,cAAc,eAAe,QAAQ,SAAS,GAAI,QAAQ,QAAQ,CAAC,CAAE;AACpF,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YACZ,SACA,aACkC;AAClC,UAAM,SAAS,MAAM,aAAa,KAAK,SAAS,OAAO,GAAG;AAAA,MACxD,YAAY,KAAK;AAAA,MACjB,WAAW,QAAQ,aAAa,KAAK,cAAc,QAAQ;AAAA,MAC3D,gBAAgB,KAAK,cAAc,QAAQ;AAAA,MAC3C,OAAO,QAAQ;AAAA,MACf,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,aAAa,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAc,MAAM,WAAmB,aAAyC;AAC9E,QAAI,cAAc,IAAK;AACvB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,EAAE,SAAS,SAAS,MAAM,CAAC,MAAM,cAAc,KAAK,cAAc,SAAS,SAAS,CAAC,EAAE;AAAA,MACvF;AAAA,IACF;AACA,QAAI,OAAO,WAAW,YAAY,OAAO,aAAa,GAAG;AACvD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,MAAc,UAAwB;AAC3D,QAAI,OAAO,KAAK,cAAc,QAAQ,cAAc;AAClD,YAAM,IAAI;AAAA,QACR,sCAAsC,IAAI,MAAM,KAAK,cAAc,QAAQ,YAAY,MAAM,QAAQ;AAAA,QACrG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,oBACb,SACA,SACe;AACf,aAAW,aAAa,QAAQ,eAAe,CAAC,GAAG;AACjD,UAAM,SAASA,MAAK,MAAM,KAAK,qBAAqB,SAAS,GAAG,aAAa;AAC7E,UAAM,QAAQ,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAC1F,UAAM,QAAQ,UAAU,EAAE,MAAM,QAAQ,MAAM,IAAI,WAAW,GAAG,GAAG,MAAM,CAAC;AAC1E,UAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,SAAS,MAAM,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC;AAC9E,QAAI,QAAQ,WAAW,YAAY,QAAQ,aAAa,GAAG;AACzD,YAAM,IAAI;AAAA,QACR,+CAA+C,SAAS;AAAA,QACxD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,GAAG;AACrE,QAAI,OAAO,YAAY,UAAU;AAC/B,UAAI,eAAkD;AAAA,QACpD,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,uBAAe,EAAE,GAAG,cAAc,aAAa,QAAQ,YAAY;AAAA,MACrE;AACA,YAAM,QAAQ,cAAc,YAAY;AAAA,IAC1C,OAAO;AACL,UAAI,eAA8C;AAAA,QAChD,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,uBAAe,EAAE,GAAG,cAAc,aAAa,QAAQ,YAAY;AAAA,MACrE;AACA,YAAM,QAAQ,UAAU,YAAY;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAcV;AACX,QAAM,gBAAwC;AAAA,IAC5C,CAAC,OAAO,MAAM,GAAG;AAAA,IACjB,CAAC,OAAO,EAAE,GAAG,QAAQ;AAAA,IACrB,CAAC,OAAO,OAAO,GAAG,QAAQ;AAAA,IAC1B,CAAC,OAAO,aAAa,GAAG,QAAQ,UAAU;AAAA,IAC1C,CAAC,OAAO,eAAe,GAAG,QAAQ;AAAA,IAClC,CAAC,OAAO,WAAW,GAAG,QAAQ,QAAQ;AAAA,IACtC,CAAC,OAAO,gBAAgB,GAAG,GAAG,QAAQ,QAAQ,gBAAgB;AAAA,IAC9D,CAAC,OAAO,cAAc,GAAG,GAAG,QAAQ,QAAQ,cAAc;AAAA,IAC1D,CAAC,OAAO,YAAY,GAAG,GAAG,QAAQ,QAAQ,YAAY;AAAA,IACtD,CAAC,OAAO,YAAY,GAAG,GAAG,QAAQ,QAAQ,YAAY;AAAA,EACxD;AACA,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,mBAAmB,QAAQ,UAAU,QAAQ,QAAQ,OAAO;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,EACV;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,EAAE,GAAG,QAAQ,YAAY,GAAG,cAAc,CAAC,GAAG;AACtF,SAAK,KAAK,WAAW,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACxC;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,EAAG,MAAK,KAAK,SAAS,GAAG,GAAG,IAAI,KAAK,EAAE;AAC5F,MAAI,QAAQ,SAAS,OAAW,MAAK,KAAK,UAAU,QAAQ,IAAI;AAChE,MAAI,QAAQ,QAAQ,SAAS,QAAQ;AACnC,SAAK,KAAK,aAAa,MAAM;AAAA,EAC/B,OAAO;AACL,eAAW,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AAC3C,WAAK,KAAK,aAAa,cAAc,IAAI,MAAM;AAAA,EACnD;AACA,MAAI,QAAQ,WAAW,aAAa;AAClC,SAAK,KAAK,YAAY,GAAG,QAAQ,UAAU,QAAQ,GAAG;AACxD,MAAI,QAAQ,WAAW,SAAS,OAAW,MAAK,KAAK,UAAU,GAAG,QAAQ,UAAU,IAAI,EAAE;AAC1F,MAAI,QAAQ,WAAW,cAAc,QAAW;AAC9C,SAAK,KAAK,gBAAgB,GAAG,QAAQ,UAAU,SAAS,EAAE;AAAA,EAC5D;AACA,MAAI,QAAQ,WAAW,mBAAmB,QAAW;AACnD,SAAK,KAAK,cAAc,GAAG,QAAQ,UAAU,cAAc,GAAG;AAAA,EAChE;AACA,MAAI,QAAQ,UAAU,mBAAmB,KAAM,MAAK,KAAK,aAAa;AACtE,MAAI,QAAQ,UAAU,mBAAmB;AACvC,SAAK,KAAK,kBAAkB,wBAAwB;AACtD,MAAI,QAAQ,UAAU,mBAAmB,QAAW;AAClD,SAAK,KAAK,kBAAkB,WAAW,QAAQ,SAAS,eAAe,IAAI,EAAE;AAAA,EAC/E;AACA,aAAW,cAAc,QAAQ,UAAU,oBAAoB,CAAC,KAAK,GAAG;AACtE,SAAK,KAAK,cAAc,UAAU;AAAA,EACpC;AACA,aAAW,cAAc,QAAQ,UAAU,mBAAmB,CAAC,GAAG;AAChE,SAAK,KAAK,aAAa,UAAU;AAAA,EACnC;AACA,OAAK;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAA2C;AACxE,MAAI,YAAY,QAAQ,OAAO,YAAY;AACzC,UAAM,IAAI,UAAU,4BAA4B;AAClD,uBAAqB,QAAQ,OAAO,OAAO;AAC3C,MAAI,QAAQ,OAAO,OAAW,iBAAgB,QAAQ,EAAE;AACxD,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,CAACA,MAAK,MAAM,WAAW,OAAO,KAAK,QAAQ,SAAS,IAAI,GAAG;AAC7D,UAAM,IAAI,UAAU,yCAAyC;AAAA,EAC/D;AACA,MAAI,CAAC,SAAS,QAAQ,SAAS,EAAG,OAAM,IAAI,UAAU,8BAA8B;AACpF,MAAI,QAAQ,UAAU,SAAS,gBAAiB,wBAAuB,QAAQ,UAAU,IAAI;AAC7F,MAAI,QAAQ,UAAU,SAAS,eAAe,QAAQ,UAAU,SAAS,iBAAiB;AACxF,UAAM,IAAI,UAAU,qDAAqD;AAAA,EAC3E;AACA,MAAI,QAAQ,UAAU,SAAS,eAAe,UAAU,QAAQ,WAAW;AACzE,UAAM,IAAI,UAAU,6DAA6D;AAAA,EACnF;AACA,MAAI,CAAC,SAAS,QAAQ,OAAO,EAAG,OAAM,IAAI,UAAU,4BAA4B;AAChF,MAAI,QAAQ,QAAQ,SAAS,UAAU,QAAQ,QAAQ,SAAS,UAAU;AACxE,UAAM,IAAI,UAAU,uCAAuC;AAAA,EAC7D;AACA,MAAI,QAAQ,QAAQ,SAAS,UAAU,WAAW,QAAQ,SAAS;AACjE,UAAM,IAAI,UAAU,yCAAyC;AAAA,EAC/D;AACA,MAAI,QAAQ,QAAQ,SAAS,UAAU;AACrC,QAAI,QAAQ,QAAQ,UAAU,UAAa,CAAC,MAAM,QAAQ,QAAQ,QAAQ,KAAK,GAAG;AAChF,YAAM,IAAI,UAAU,iCAAiC;AAAA,IACvD;AACA,kBAAc,QAAQ,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC3C;AACA,wBAAsB,QAAQ,OAAO;AACrC,oBAAkB,QAAQ,SAAS;AACnC,mBAAiB,QAAQ,QAAQ;AACjC,mBAAiB,QAAQ,KAAK,KAAK;AACnC,QAAM,aAAa,iBAAiB,QAAQ,QAAQ,QAAQ;AAC5D,aAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AACzC,QAAI,IAAI,WAAW,WAAW,EAAG,OAAM,IAAI,UAAU,6BAA6B,GAAG,EAAE;AAAA,EACzF;AACA,MAAI,QAAQ,SAAS,OAAW,sBAAqB,QAAQ,MAAM,MAAM;AACzE,MAAI,QAAQ,gBAAgB,UAAa,CAAC,MAAM,QAAQ,QAAQ,WAAW,GAAG;AAC5E,UAAM,IAAI,UAAU,+BAA+B;AAAA,EACrD;AACA,aAAW,aAAa,QAAQ,eAAe,CAAC,GAAG;AACjD,QAAI,OAAO,cAAc,SAAU,OAAM,IAAI,UAAU,mCAAmC;AAC1F,yBAAqB,SAAS;AAAA,EAChC;AACA,MAAI,QAAQ,UAAU,UAAa,CAAC,SAAS,QAAQ,KAAK,GAAG;AAC3D,UAAM,IAAI,UAAU,0BAA0B;AAAA,EAChD;AACA,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,GAAG;AACrE,yBAAqB,QAAQ;AAC7B,QAAI,OAAO,YAAY,YAAY,EAAE,mBAAmB,aAAa;AACnE,YAAM,IAAI,UAAU,gDAAgD,QAAQ,EAAE;AAAA,IAChF;AACA,UAAM,aACJ,OAAO,YAAY,WACf,IAAI,YAAY,EAAE,OAAO,OAAO,EAAE,aAClC,QAAQ;AACd,UAAM,eAAe,QAAQ,SAAS,gBAAgB;AACtD,QAAI,aAAa,cAAc;AAC7B,YAAM,IAAI;AAAA,QACR,sCAAsC,UAAU,MAAM,YAAY,MAAM,QAAQ;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,SAA4C;AACzE,MAAI,YAAY,UAAa,CAAC,SAAS,OAAO,GAAG;AAC/C,UAAM,IAAI,UAAU,4BAA4B;AAAA,EAClD;AACA,MAAI,SAAS,qBAAqB;AAChC,8BAA0B,QAAQ,kBAAkB,kBAAkB;AACxE,MAAI,SAAS,mBAAmB;AAC9B,iCAA6B,QAAQ,gBAAgB,gBAAgB;AACvE,MAAI,SAAS,iBAAiB;AAC5B,iCAA6B,QAAQ,cAAc,cAAc;AACnE,MAAI,SAAS,iBAAiB;AAC5B,iCAA6B,QAAQ,cAAc,cAAc;AACrE;AAEA,SAAS,kBAAkB,WAA0D;AACnF,MAAI,cAAc,UAAa,CAAC,SAAS,SAAS,GAAG;AACnD,UAAM,IAAI,UAAU,8BAA8B;AAAA,EACpD;AACA,MAAI,WAAW,aAAa,OAAW,2BAA0B,UAAU,UAAU,UAAU;AAC/F,MAAI,WAAW,cAAc;AAC3B,8BAA0B,UAAU,WAAW,WAAW;AAC5D,MAAI,WAAW,mBAAmB;AAChC,8BAA0B,UAAU,gBAAgB,gBAAgB;AACtE,MAAI,WAAW,SAAS,WAAc,CAAC,OAAO,SAAS,UAAU,IAAI,KAAK,UAAU,QAAQ,IAAI;AAC9F,UAAM,IAAI,WAAW,wCAAwC;AAAA,EAC/D;AACF;AAEA,SAAS,iBAAiB,UAAwD;AAChF,MAAI,aAAa,UAAa,CAAC,SAAS,QAAQ,GAAG;AACjD,UAAM,IAAI,UAAU,6BAA6B;AAAA,EACnD;AACA,MAAI,UAAU,qBAAqB,UAAa,CAAC,MAAM,QAAQ,SAAS,gBAAgB,GAAG;AACzF,UAAM,IAAI,UAAU,oCAAoC;AAAA,EAC1D;AACA,MAAI,UAAU,oBAAoB,UAAa,CAAC,MAAM,QAAQ,SAAS,eAAe,GAAG;AACvF,UAAM,IAAI,UAAU,mCAAmC;AAAA,EACzD;AACA,MAAI,UAAU,mBAAmB,UAAa,OAAO,SAAS,mBAAmB,WAAW;AAC1F,UAAM,IAAI,UAAU,mCAAmC;AAAA,EACzD;AACA,MAAI,UAAU,oBAAoB,UAAa,OAAO,SAAS,oBAAoB,WAAW;AAC5F,UAAM,IAAI,UAAU,oCAAoC;AAAA,EAC1D;AACA,MAAI,UAAU,mBAAmB,QAAW;AAC1C,QAAI,CAAC,SAAS,SAAS,cAAc,KAAK,SAAS,eAAe,SAAS,QAAQ;AACjF,YAAM,IAAI,UAAU,yDAAyD;AAAA,IAC/E;AACA,yBAAqB,SAAS,eAAe,MAAM,qBAAqB;AACxE,QACE,CAACA,MAAK,WAAW,SAAS,eAAe,IAAI,KAC7C,SAAS,eAAe,KAAK,SAAS,IAAI,GAC1C;AACA,YAAM,IAAI,UAAU,oDAAoD;AAAA,IAC1E;AAAA,EACF;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,cAAc,UAAU,oBAAoB,CAAC,GAAG;AACzD,yBAAqB,YAAY,wBAAwB;AACzD,QAAI,KAAK,IAAI,UAAU;AACrB,YAAM,IAAI,UAAU,0CAA0C,UAAU,EAAE;AAC5E,SAAK,IAAI,UAAU;AAAA,EACrB;AACA,OAAK,MAAM;AACX,aAAW,cAAc,UAAU,mBAAmB,CAAC,GAAG;AACxD,yBAAqB,YAAY,uBAAuB;AACxD,QAAI,KAAK,IAAI,UAAU;AACrB,YAAM,IAAI,UAAU,yCAAyC,UAAU,EAAE;AAC3E,SAAK,IAAI,UAAU;AAAA,EACrB;AACF;AAEA,SAAS,oBAAoB,SAAyC;AACpE,sBAAoB,OAAO;AAC3B,uBAAqB,QAAQ,SAAS,SAAS;AAC/C,MACE,QAAQ,SAAS,WAChB,CAAC,MAAM,QAAQ,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IACzF;AACA,UAAM,IAAI,UAAU,iCAAiC;AAAA,EACvD;AACA,MAAI,QAAQ,QAAQ,OAAW,sBAAqB,QAAQ,KAAK,EAAE,WAAW,KAAK,CAAC;AACpF,mBAAiB,QAAQ,KAAK,KAAK;AACnC,MAAI,QAAQ,cAAc,OAAW,2BAA0B,QAAQ,WAAW,WAAW;AAC7F,MACE,QAAQ,UAAU,UAClB,OAAO,QAAQ,UAAU,YACzB,EAAE,QAAQ,iBAAiB,aAC3B;AACA,UAAM,IAAI,UAAU,uCAAuC;AAAA,EAC7D;AACF;AAEA,SAAS,4BAA4B,SAAiD;AACpF,sBAAoB,OAAO;AAC3B,uBAAqB,QAAQ,SAAS,SAAS;AAC/C,MACE,QAAQ,SAAS,WAChB,CAAC,MAAM,QAAQ,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IACzF;AACA,UAAM,IAAI,UAAU,iCAAiC;AAAA,EACvD;AACA,MAAI,QAAQ,QAAQ,OAAW,sBAAqB,QAAQ,KAAK,EAAE,WAAW,KAAK,CAAC;AACpF,mBAAiB,QAAQ,KAAK,KAAK;AACrC;AAEA,SAAS,kBAAkB,SAA6C;AACtE,sBAAoB,OAAO;AAC3B,uBAAqB,QAAQ,IAAI;AACnC;AAEA,SAAS,oBAAoB,OAA0D;AACrF,MAAI,CAAC,SAAS,KAAK,EAAG,OAAM,IAAI,UAAU,4BAA4B;AACxE;AAEA,SAAS,qBAAqB,SAA6D;AACzF,SAAO;AAAA,IACL,kBAAkB,SAAS,oBAAoB;AAAA,IAC/C,gBAAgB,SAAS,kBAAkB;AAAA,IAC3C,cAAc,SAAS,gBAAgB;AAAA,IACvC,cAAc,SAAS,gBAAgB;AAAA,EACzC;AACF;AAEA,SAAS,sBAAsB,SAAiE;AAC9F,QAAM,QAA6C,CAAC;AACpD,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,GAAG;AACrE,UAAM,QAAQ,IAAI,OAAO,YAAY,WAAW,UAAU,QAAQ,MAAM;AAAA,EAC1E;AACA,QAAM,YAAY,cAAc,QAAQ,SAAS;AACjD,QAAM,UAAU,YAAY,QAAQ,OAAO;AAC3C,MAAI,WAAuC;AAAA,IACzC,OAAO,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,OAAO,OAAW,YAAW,EAAE,GAAG,UAAU,IAAI,QAAQ,GAAG;AACvE,MAAI,QAAQ,YAAY,OAAW,YAAW,EAAE,GAAG,UAAU,SAAS,QAAQ,QAAQ;AACtF,MAAI,QAAQ,UAAU,OAAW,YAAW,EAAE,GAAG,UAAU,OAAO,OAAO,OAAO,KAAK,EAAE;AACvF,MAAI,QAAQ,gBAAgB,QAAW;AACrC,eAAW,EAAE,GAAG,UAAU,aAAa,OAAO,OAAO,CAAC,GAAG,QAAQ,WAAW,CAAC,EAAE;AAAA,EACjF;AACA,MAAI,QAAQ,QAAQ,QAAW;AAC7B,eAAW,EAAE,GAAG,UAAU,KAAK,OAAO,OAAO,EAAE,GAAG,QAAQ,IAAI,CAAC,EAAE;AAAA,EACnE;AACA,MAAI,QAAQ,SAAS,OAAW,YAAW,EAAE,GAAG,UAAU,MAAM,QAAQ,KAAK;AAC7E,MAAI,QAAQ,WAAW,QAAW;AAChC,eAAW,EAAE,GAAG,UAAU,QAAQ,OAAO,OAAO,EAAE,GAAG,QAAQ,OAAO,CAAC,EAAE;AAAA,EACzE;AACA,MAAI,QAAQ,cAAc,QAAW;AACnC,eAAW,EAAE,GAAG,UAAU,WAAW,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,CAAC,EAAE;AAAA,EAC/E;AACA,MAAI,QAAQ,YAAY,QAAW;AACjC,eAAW,EAAE,GAAG,UAAU,SAAS,OAAO,OAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC,EAAE;AAAA,EAC3E;AACA,MAAI,QAAQ,aAAa,QAAW;AAClC,QAAI,WAAgE;AAAA,MAClE,GAAG,QAAQ;AAAA,IACb;AACA,QAAI,QAAQ,SAAS,mBAAmB,QAAW;AACjD,iBAAW;AAAA,QACT,GAAG;AAAA,QACH,gBAAgB,OAAO,OAAO,EAAE,GAAG,QAAQ,SAAS,eAAe,CAAC;AAAA,MACtE;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,qBAAqB,QAAW;AACnD,iBAAW;AAAA,QACT,GAAG;AAAA,QACH,kBAAkB,OAAO,OAAO,CAAC,GAAG,QAAQ,SAAS,gBAAgB,CAAC;AAAA,MACxE;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,oBAAoB,QAAW;AAClD,iBAAW;AAAA,QACT,GAAG;AAAA,QACH,iBAAiB,OAAO,OAAO,CAAC,GAAG,QAAQ,SAAS,eAAe,CAAC;AAAA,MACtE;AAAA,IACF;AACA,eAAW,EAAE,GAAG,UAAU,UAAU,OAAO,OAAO,QAAQ,EAAE;AAAA,EAC9D;AACA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,eAAW,EAAE,GAAG,UAAU,aAAa,QAAQ,YAAY;AAAA,EAC7D;AACA,SAAO,OAAO,OAAO,QAAQ;AAC/B;AAEA,SAAS,4BACP,IACA,eACA,YACsB;AACtB,QAAM,kBAAkB,WAAW,OAAO,UAAU,CAAC;AACrD,MAAI,gBAAgB,OAAO,MAAM,MAAM,iBAAiB,gBAAgB,OAAO,EAAE,MAAM,IAAI;AACzF,UAAM,IAAI;AAAA,MACR,sCAAsC,aAAa;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,cAAc,iBAAiB,OAAO,OAAO;AAC7D,QAAM,gBAAgB,cAAc,iBAAiB,OAAO,aAAa;AACzE,QAAM,aAAa,cAAc,iBAAiB,OAAO,eAAe;AACxE,QAAM,cAAc,cAAc,iBAAiB,OAAO,WAAW;AACrE,MAAI,gBAAgB,UAAU,gBAAgB,SAAU,mBAAkB,cAAc;AACxF,QAAM,YACJ,kBAAkB,cACd,EAAE,MAAM,YAAY,IACpB,kBAAkB,kBAChB,EAAE,MAAM,iBAAiB,MAAM,WAAW,IAC1C,kBAAkB,gBAAgB;AAC1C,QAAM,UAAU;AAAA,IACd,kBAAkB,kBAAkB,iBAAiB,OAAO,kBAAkB,IAAI;AAAA,IAClF,gBAAgB,kBAAkB,iBAAiB,OAAO,gBAAgB,KAAK;AAAA,IAC/E,cAAc,kBAAkB,iBAAiB,OAAO,cAAc,KAAK;AAAA,IAC3E,cAAc,kBAAkB,iBAAiB,OAAO,cAAc,KAAK;AAAA,EAC7E;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,UAAU,SAAS;AAAA,IAC/B,KAAK,CAAC;AAAA,IACN;AAAA,IACA,gBAAgB,CAAC;AAAA,EACnB;AACF;AAaA,eAAe,iBACb,YACA,eACA,aACA,wBACoC;AACpC,QAAM,SAAS,MAAM,aAAa,CAAC,aAAa,WAAW,aAAa,GAAG;AAAA,IACzE;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,OAAO,aAAa,GAAG;AACzB,UAAM,UAAU,WAAW,OAAO,MAAM;AACxC,QAAI,0BAA0B,QAAQ,YAAY,EAAE,SAAS,SAAS,GAAG;AACvE,YAAM,IAAI,mBAAmB,2BAA2B,aAAa,IAAI,mBAAmB;AAAA,IAC9F;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,YAAQ,KAAK,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,EAC9C,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,CAAC,aAAa,MAAM,CAAC,CAAC,GAAG;AAC1E,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,CAAC;AAChB;AAEA,SAAS,aAAa,OAAoD;AACxE,SAAO,SAAS,KAAK,KAAK,SAAS,MAAM,MAAM,KAAK,SAAS,MAAM,KAAK;AAC1E;AAEA,eAAe,sBAAsB,SAKK;AACxC,MAAI,QAAQ,MAAM,WAAW,EAAG,QAAO,CAAC;AACxC,QAAM,aAAa,MAAM;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,WAAW,WAAW,iBAAiB,SAAS,CAAC;AACvD,SAAO,QAAQ,MAAM,IAAI,CAAC,kBAAkB;AAC1C,UAAM,UAAU,SAAS,GAAG,aAAa,MAAM;AAC/C,UAAM,QAAQ,SAAS,KAAK,CAAC,cAAc,UAAU,WAAW,WAAW;AAC3E,UAAM,WAAW,OAAO,OAAO,QAAQ;AACvC,QAAI,CAAC,OAAO,QAAQ,GAAG;AACrB,YAAM,IAAI,mBAAmB,gCAAgC,aAAa,IAAI,MAAM;AAAA,IACtF;AACA,WAAO,EAAE,eAAe,MAAM,aAAa,UAAU,UAAU,MAAM;AAAA,EACvE,CAAC;AACH;AAEA,SAAS,yBAAyB,YAAiD;AACjF,SAAO,OAAO,KAAK,WAAW,YAAY,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AAC7E,UAAM,QAAQ,eAAe,KAAK,GAAG;AACrC,QAAI,QAAQ,CAAC,MAAM,OAAW,QAAO,CAAC;AACtC,UAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,WAAO,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAAA,EACpC,CAAC;AACH;AAEA,eAAe,wBACb,oBACA,QACA,aACe;AACf,QAAM,WAAW,MAAM,MAAM,MAAM;AACnC,MAAI,SAAS,eAAe,KAAK,CAAC,SAAS,OAAO,GAAG;AACnD,UAAM,IAAI;AAAA,MACR,uCAAuC,WAAW;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,QAAM,iBAAiB,MAAM,SAAS,MAAM;AAC5C,QAAM,iBAAiBA,MAAK,SAAS,oBAAoB,cAAc;AACvE,MACE,mBAAmB,MACnB,mBAAmB,QACnB,eAAe,WAAW,KAAKA,MAAK,GAAG,EAAE,KACzCA,MAAK,WAAW,cAAc,GAC9B;AACA,UAAM,IAAI;AAAA,MACR,qDAAqD,WAAW;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,YAAoB,eAAsC;AACvF,QAAM,SAAS,MAAM,aAAa,CAAC,MAAM,MAAM,aAAa,GAAG,EAAE,WAAW,CAAC;AAC7E,MAAI,OAAO,aAAa,KAAK,WAAW,OAAO,MAAM,EAAE,YAAY,EAAE,SAAS,SAAS,EAAG;AAC1F,QAAM,IAAI,mBAAmB,oCAAoC,yBAAyB,MAAM;AAClG;AAEA,eAAe,aAAa,YAAoB,YAAmC;AACjF,QAAM,SAAS,MAAM,aAAa,CAAC,UAAU,MAAM,UAAU,GAAG,EAAE,WAAW,CAAC;AAC9E,MAAI,OAAO,aAAa,KAAK,WAAW,OAAO,MAAM,EAAE,YAAY,EAAE,SAAS,SAAS,EAAG;AAC1F,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAc,SAAyC;AAC7E,QAAM,CAAC,cAAc,SAAS,OAAO,IAAI,KAAK,MAAM,GAAI;AACxD,MAAI,iBAAiB,UAAa,YAAY,UAAa,YAAY,QAAW;AAChF,UAAM,IAAI,mBAAmB,0CAA0C,uBAAuB;AAAA,EAChG;AACA,QAAM,eAAeA,MAAK,MAAM,SAAS,SAAS,YAAY;AAC9D,QAAM,OAAO,OAAO,OAAO;AAC3B,QAAM,OAAO,YAAY,OAAO;AAChC,MAAI,QAAgC;AAAA,IAClC,MAAM,qBAAqB,YAAY;AAAA,IACvC;AAAA,EACF;AACA,MAAI,SAAS,UAAU,OAAO,cAAc,IAAI,KAAK,QAAQ,GAAG;AAC9D,YAAQ,EAAE,GAAG,OAAO,KAAK;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAsC;AACzD,MAAI,UAAU,IAAK,QAAO;AAC1B,MAAI,UAAU,IAAK,QAAO;AAC1B,MAAI,UAAU,IAAK,QAAO;AAC1B,SAAO;AACT;AAEA,SAAS,aAAa,QAA2E;AAC/F,QAAM,SAAS;AAAA,IACb,QAAQ,OAAO,OAAO,MAAM;AAAA,IAC5B,QAAQ,OAAO,OAAO,MAAM;AAAA,IAC5B,YAAY,OAAO;AAAA,IACnB,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,OAAO;AAAA,EAC1B;AACA,SAAO,OAAO,WACV,EAAE,GAAG,QAAQ,QAAQ,YAAY,IACjC,EAAE,GAAG,QAAQ,QAAQ,UAAU,UAAU,OAAO,SAAS;AAC/D;AAEA,SAAS,cAAc,WAA2D;AAChF,SAAO,UAAU,SAAS,cACtB,OAAO,OAAO,EAAE,MAAM,YAAY,CAAC,IACnC,OAAO,OAAO,EAAE,MAAM,iBAAiB,MAAM,UAAU,KAAK,CAAC;AACnE;AAEA,SAAS,YACP,SACuC;AACvC,SAAO,QAAQ,SAAS,SACpB,OAAO,OAAO,EAAE,MAAM,OAAO,CAAC,IAC9B,OAAO,OAAO,EAAE,MAAM,UAAU,OAAO,OAAO,OAAO,CAAC,GAAI,QAAQ,SAAS,CAAC,CAAE,CAAC,EAAE,CAAC;AACxF;AAEA,SAAS,iBACP,OACA,MACwB;AACxB,MAAI,UAAU,OAAW,QAAO,CAAC;AACjC,MAAI,CAAC,SAAS,KAAK,EAAG,OAAM,IAAI,UAAU,GAAG,IAAI,qBAAqB;AACtE,QAAM,OAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,OAAO,SAAS,SAAU,OAAM,IAAI,UAAU,GAAG,IAAI,IAAI,GAAG,oBAAoB;AACpF,QAAI,SAAS,SAAS,CAAC,cAAc,KAAK,GAAG;AAC3C,YAAM,IAAI,UAAU,sCAAsC,GAAG,EAAE;AACjE,SAAK,GAAG,IAAI;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,cAAc,iBAAyC,MAAsB;AACpF,QAAM,QAAQ,gBAAgB,IAAI;AAClC,MAAI,UAAU,UAAa,MAAM,WAAW,EAAG,mBAAkB,IAAI;AACrE,SAAO;AACT;AAEA,SAAS,kBACP,iBACA,MACA,UACQ;AACR,QAAM,QAAQ,OAAO,cAAc,iBAAiB,IAAI,CAAC;AACzD,MAAI,CAAC,OAAO,cAAc,KAAK,MAAM,WAAW,SAAS,IAAI,QAAQ,GAAI,mBAAkB,IAAI;AAC/F,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAsB;AAC/C,QAAM,IAAI,mBAAmB,gCAAgC,KAAK,IAAI,eAAe;AACvF;AAEA,SAAS,cAAc,OAAgC;AACrD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,yBAAyB;AACxE,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,eAAW,IAAI;AACf,QAAI,KAAK,IAAI,IAAI,EAAG,OAAM,IAAI,mBAAmB,+BAA+B,IAAI,IAAI,MAAM;AAC9F,SAAK,IAAI,IAAI;AAAA,EACf;AACF;AAEA,SAAS,WAAW,MAAoB;AACtC,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI;AAAA,MACR,oDAAoD,IAAI;AAAA,MACxD;AAAA,IACF;AACJ;AAEA,SAAS,OAAO,MAAuB;AACrC,SAAO,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,QAAQ;AACxD;AAEA,SAAS,gBAAgB,IAAkB;AACzC,MAAI,OAAO,OAAO,YAAY,CAAC,UAAU,KAAK,EAAE,GAAG;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,MAAoB;AAClD,uBAAqB,MAAM,gBAAgB;AAC3C,MAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI;AAC1C,UAAM,IAAI,UAAU,mDAAmD;AAC3E;AAEA,SAAS,qBAAqB,OAAgB,MAAuC;AACnF,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW;AAChD,UAAM,IAAI,UAAU,GAAG,IAAI,8BAA8B;AAC7D;AAEA,SAAS,0BAA0B,OAAe,MAAoB;AACpE,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS;AAC3C,UAAM,IAAI,WAAW,GAAG,IAAI,mCAAmC;AACnE;AAEA,SAAS,6BAA6B,OAAe,MAAoB;AACvE,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ;AAC1C,UAAM,IAAI,WAAW,GAAG,IAAI,uCAAuC;AACvE;AAEA,SAAS,aAAa,IAAY,OAA+C;AAC/E,SAAO,IAAI,mBAAmB,WAAW,EAAE,oBAAoB,KAAK,MAAM,iBAAiB;AAAA,IACzF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBAAiB,IAAoB;AAC5C,SAAO,iBAAiB,EAAE;AAC5B;AAEA,SAAS,eAAe,OAAgC,QAAkC;AACxF,SAAO,UAAU,SAAY,SAAS,YAAY,IAAI,CAAC,OAAO,MAAM,CAAC;AACvE;AAEA,eAAe,eAAe,WAAmB,aAAyC;AACxF,cAAY,eAAe;AAC3B,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAM,UAAU,WAAW,MAAM;AAC/B,kBAAY,oBAAoB,SAAS,KAAK;AAC9C,cAAQ;AAAA,IACV,GAAG,SAAS;AACZ,UAAM,QAAQ,MAAM;AAClB,mBAAa,OAAO;AACpB,aAAO,YAAY,UAAU,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,IACxE;AACA,gBAAY,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EAC7D,CAAC;AACH;AAEA,SAAS,WAAW,OAA2B;AAC7C,MAAI;AACF,WAAO,WAAW,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AIjkDA,SAAuB,kBAAkB;AACzC,SAAS,SAAS;AAalB,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAO,EAAE,SAAS;AAAA,EAC7D,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAM,mBAAmB,EAAE,mBAAmB,UAAU;AAAA,EACtD,EAAE,OAAO;AAAA,IACP,QAAQ,EAAE,QAAQ,QAAQ;AAAA,IAC1B,UAAU,EAAE,OAAO,EAAE,IAAI;AAAA,IACzB,QAAQ,EAAE,OAAO;AAAA,IACjB,QAAQ,EAAE,OAAO;AAAA,IACjB,YAAY,EAAE,OAAO,EAAE,YAAY;AAAA,IACnC,iBAAiB,EAAE,QAAQ;AAAA,IAC3B,iBAAiB,EAAE,QAAQ;AAAA,EAC7B,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,QAAQ,EAAE,QAAQ,WAAW;AAAA,IAC7B,QAAQ,EAAE,OAAO;AAAA,IACjB,QAAQ,EAAE,OAAO;AAAA,IACjB,YAAY,EAAE,OAAO,EAAE,YAAY;AAAA,IACnC,iBAAiB,EAAE,QAAQ;AAAA,IAC3B,iBAAiB,EAAE,QAAQ;AAAA,EAC7B,CAAC;AACH,CAAC;AAED,IAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAM,EAAE,SAAS;AAC9D,CAAC;AAED,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACrC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACpD,WAAW,EAAE,QAAQ;AAAA,EACrB,aAAa,EAAE,KAAK,CAAC,SAAS,OAAO,CAAC,EAAE,SAAS;AACnD,CAAC;AAED,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAAS,EAAE,OAAO;AACpB,CAAC;AAED,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,MAAM,EAAE,OAAO;AAAA,EACf,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAC7C,CAAC;AAED,IAAM,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC/D,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,KAAK,CAAC,QAAQ,aAAa,WAAW,OAAO,CAAC;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAChD,CAAC;AACD,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,MAAM,eAAe;AAClC,CAAC;AAED,IAAM,aAAa,EAAE,OAAO,CAAC,CAAC;AAC9B,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,eAAe,EAAE,OAAO,EAAE,IAAI;AAAA,EAC9B,MAAM,EAAE,QAAQ,WAAW;AAAA,EAC3B,UAAU,EAAE,OAAO,EAAE,IAAI;AAAA,EACzB,UAAU,EAAE,QAAQ,KAAK;AAC3B,CAAC;AACD,IAAM,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAExE,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AACjD,CAAC;AACD,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACxB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,QAAQ,EAAE,KAAK,CAAC,WAAW,UAAU,SAAS,CAAC;AAAA,EAC/C,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpC,WAAW,EAAE,OAAO;AAAA,EACpB,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AACD,IAAM,sBAAsB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,EAAE,CAAC;AAE9E,IAAM,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAChE,IAAM,uBAAuB,eAAe,OAAO;AAAA,EACjD,WAAW,EACR,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,IAAI,OAAO,IAAI,EACf,SAAS;AACd,CAAC;AACD,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,WAAW,EAAE,OAAO;AAAA,EACpB,QAAQ,EAAE,OAAO;AAAA,EACjB,QAAQ,EAAE,OAAO;AAAA,EACjB,iBAAiB,EAAE,QAAQ;AAAA,EAC3B,iBAAiB,EAAE,QAAQ;AAC7B,CAAC;AAED,IAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAM;AAAA,EACjD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAO,EAAE,SAAS;AAC/D,CAAC;AACD,IAAM,oBAAoB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEhE,IAAM,2BAA2B;AACjC,IAAM,8BAA8B;AACpC,IAAM,0BAA0B,KAAK;AACrC,IAAM,uBAAuB;AAC7B,IAAM,eAAe,OAAO;AAC5B,IAAM,mBAAmB;AAElB,SAAS,yBACd,SACoB;AACpB,yBAAuB,OAAO;AAC9B,YAAU,uBAAuB,OAAO;AACxC,QAAM,WAAW,IAAI,IAAI,QAAQ,KAAK;AACtC,QAAM,QAAmB,CAAC;AAE1B,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,SAAS,eAAgB,OAAM,KAAK,sBAAsB,OAAO,CAAC;AAAA,aAC7D,SAAS,YAAa,OAAM,KAAK,mBAAmB,OAAO,CAAC;AAAA,aAC5D,SAAS,aAAc,OAAM,KAAK,oBAAoB,OAAO,CAAC;AAAA,aAC9D,SAAS,aAAc,OAAM,KAAK,oBAAoB,QAAQ,OAAO,CAAC;AAAA,aACtE,SAAS,aAAc,OAAM,KAAK,oBAAoB,QAAQ,OAAO,CAAC;AAAA,aACtE,SAAS,gBAAiB,OAAM,KAAK,uBAAuB,OAAO,CAAC;AAAA,aACpE,SAAS,iBAAkB,OAAM,KAAK,wBAAwB,QAAQ,OAAO,CAAC;AAAA,aAC9E,SAAS,oBAAqB,OAAM,KAAK,0BAA0B,OAAO,CAAC;AAAA,aAC3E,SAAS,eAAgB,OAAM,KAAK,sBAAsB,OAAO,CAAC;AAAA,aAClE,SAAS,gBAAiB,OAAM,KAAK,sBAAsB,OAAO,CAAC;AAAA,EAC9E;AAEA,MAAI,MAAM,WAAW,SAAS,MAAM;AAClC,UAAM,gBAAgB,2DAA2D;AAAA,EACnF;AACA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEA,SAAS,sBAAsB,SAAmD;AAChF,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,SAAS,MAAM,KAAK,KAAK,WAAW,MAAM,GAAG,YAAY;AACzE,2BAAqB,SAAS,QAAQ,MAAM,QAAQ;AACpD,YAAM,qBAAqB,aAAa,QAAQ,MAAM;AACtD,2BAAqB,oBAAoB,QAAQ,MAAM,YAAY;AACnE,UAAI,cAAwC;AAAA,QAC1C;AAAA,MACF;AACA,UAAI,SAAS,OAAW,eAAc,EAAE,GAAG,aAAa,KAAK;AAC7D,UAAI,QAAQ,OAAW,eAAc,EAAE,GAAG,aAAa,IAAI;AAC3D,UAAI,QAAQ,OAAW,eAAc,EAAE,GAAG,aAAa,IAAI;AAC3D,UAAI,uBAAuB,QAAW;AACpC,sBAAc,EAAE,GAAG,aAAa,WAAW,mBAAmB;AAAA,MAChE;AACA,UAAI,UAAU,OAAW,eAAc,EAAE,GAAG,aAAa,MAAM;AAC/D,UAAI,QAAQ,gBAAgB,QAAW;AACrC,sBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,MACnE;AACA,aAAO,oBAAoB,MAAM,QAAQ,QAAQ,KAAK,WAAW,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBAAmB,SAAmD;AAC7E,QAAM,SAAS,sBAAsB,OAAO;AAC5C,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,MAAAC,OAAM,WAAW,UAAU,GAAG,YAAY;AAC1D,YAAM,qBAAqB,aAAa,OAAO;AAC/C,UAAI,qBAAqB,OAAO,cAAc;AAC5C,cAAM;AAAA,UACJ,wCAAwC,kBAAkB,MAAM,OAAO,YAAY;AAAA,QACrF;AAAA,MACF;AACA,UAAI,cAAsE;AAAA,QACxE,MAAAA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,WAAW;AAAA,QACX,UAAU,OAAO;AAAA,MACnB;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,sBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,MACnE;AACA,aAAO,QAAQ,QAAQ,iBAAiB,WAAW;AAAA,IACrD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAmD;AAC9E,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,MAAAA,OAAM,QAAQ,GAAG,YAAY;AAC7C,YAAM,eAAe,IAAI,YAAY,EAAE,OAAO,OAAO,EAAE;AACvD,YAAM,WAAW,QAAQ,WAAW;AACpC,UAAI,aAAa,UAAa,eAAe,UAAU;AACrD,cAAM,gBAAgB,gCAAgC,YAAY,MAAM,QAAQ,IAAI;AAAA,MACtF;AACA,UAAI,eAAoE;AAAA,QACtE,MAAAA;AAAA,QACA,MAAM;AAAA,MACR;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,uBAAe,EAAE,GAAG,cAAc,aAAa,QAAQ,YAAY;AAAA,MACrE;AACA,YAAM,QAAQ,QAAQ,cAAc,YAAY;AAChD,aAAO,EAAE,MAAAA,OAAM,aAAa;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAwC;AACnE,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,MAAAA,MAAK,GAAG,YAAY;AACpC,UAAI,cAAuD,CAAC;AAC5D,UAAIA,UAAS,OAAW,eAAc,EAAE,GAAG,aAAa,MAAAA,MAAK;AAC7D,UAAI,QAAQ,gBAAgB,QAAW;AACrC,sBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,MACnE;AACA,aAAO,EAAE,MAAMA,SAAQ,KAAK,SAAS,CAAC,GAAI,MAAM,QAAQ,UAAU,WAAW,CAAE,EAAE;AAAA,IACnF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAwC;AACnE,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,aAAa,EAAE,OAAO,CAAC,GAAG,QAAQ,cAAc,EAAE;AAAA,EAC7D,CAAC;AACH;AAEA,SAAS,uBAAuB,SAAmD;AACjF,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY;AACvD,2BAAqB,SAAS,QAAQ,MAAM,QAAQ;AACpD,UAAI,eAAmE,EAAE,QAAQ;AACjF,UAAI,SAAS,OAAW,gBAAe,EAAE,GAAG,cAAc,KAAK;AAC/D,UAAI,QAAQ,OAAW,gBAAe,EAAE,GAAG,cAAc,IAAI;AAC7D,UAAI,QAAQ,OAAW,gBAAe,EAAE,GAAG,cAAc,IAAI;AAC7D,UAAI,QAAQ,gBAAgB,QAAW;AACrC,uBAAe,EAAE,GAAG,cAAc,aAAa,QAAQ,YAAY;AAAA,MACrE;AACA,aAAO,qBAAqB,MAAM,QAAQ,QAAQ,aAAa,YAAY,CAAC;AAAA,IAC9E;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBAAwB,SAAwC;AACvE,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,GAAG,aAAa;AAAA,MAC9B,YACE,MAAM,QAAQ;AAAA,QACZ,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAAA,MAC9E,GACA,IAAI,oBAAoB;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,0BAA0B,SAAmD;AACpF,QAAM,cAAc,QAAQ,SAAS,eAAe,KAAK;AACzD,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,WAAW,UAAU,GAAG,YAAY;AACpD,YAAM,qBAAqB,aAAa;AACxC,UAAI,qBAAqB,aAAa;AACpC,cAAM;AAAA,UACJ,uCAAuC,kBAAkB,MAAM,WAAW;AAAA,QAC5E;AAAA,MACF;AACA,UAAI,cAAqE;AAAA,QACvE;AAAA,QACA,WAAW;AAAA,MACb;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,sBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,MACnE;AACA,YAAM,OAAO,MAAM,QAAQ,QAAQ,gBAAgB,WAAW;AAC9D,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,WAAW,KAAK,MAAM;AAAA,QAC9B,QAAQ,WAAW,KAAK,MAAM;AAAA,QAC9B,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sBAAsB,SAAmD;AAChF,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,UAAU,GAAG,YAAY;AACzC,UAAI,cAAiE;AAAA,QACnE;AAAA,QACA,eAAe,QAAQ,SAAS,qBAAqB;AAAA,MACvD;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,sBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,MACnE;AACA,aAAO,qBAAqB,MAAM,QAAQ,QAAQ,YAAY,WAAW,CAAC;AAAA,IAC5E;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sBAAsB,SAAmD;AAChF,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,EAAE,eAAe,UAAU,GAAG,YAAY;AACxD,YAAM,qBAAqB,aAAa,QAAQ,SAAS,wBAAwB;AACjF,YAAM,mBAAmB,QAAQ,SAAS,oBAAoB;AAC9D,UAAI,qBAAqB,kBAAkB;AACzC,cAAM;AAAA,UACJ,qCAAqC,kBAAkB,MAAM,gBAAgB;AAAA,QAC/E;AAAA,MACF;AACA,UAAI,cAAiE;AAAA,QACnE;AAAA,QACA,WAAW;AAAA,MACb;AACA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,sBAAc,EAAE,GAAG,aAAa,aAAa,QAAQ,YAAY;AAAA,MACnE;AACA,aAAO,EAAE,MAAM,MAAM,QAAQ,QAAQ,YAAY,WAAW,EAAE;AAAA,IAChE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,QAAiC;AAC5D,QAAM,SAAS;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,QAAQ,WAAW,OAAO,MAAM;AAAA,IAChC,QAAQ,WAAW,OAAO,MAAM;AAAA,IAChC,YAAY,OAAO;AAAA,IACnB,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,OAAO;AAAA,EAC1B;AACA,SAAO,OAAO,WAAW,WACrB,EAAE,GAAG,QAAQ,QAAQ,UAAmB,UAAU,OAAO,SAAS,IAClE,EAAE,GAAG,QAAQ,QAAQ,YAAqB;AAChD;AAEA,SAAS,qBACP,SACmC;AACnC,MAAI,aAAgD;AAAA,IAClD,IAAI,QAAQ;AAAA,IACZ,SAAS,QAAQ;AAAA,IACjB,MAAM,CAAC,GAAG,QAAQ,IAAI;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,EACrB;AACA,MAAI,QAAQ,QAAQ,OAAW,cAAa,EAAE,GAAG,YAAY,KAAK,QAAQ,IAAI;AAC9E,MAAI,QAAQ,aAAa,OAAW,cAAa,EAAE,GAAG,YAAY,UAAU,QAAQ,SAAS;AAC7F,MAAI,QAAQ,YAAY,OAAW,cAAa,EAAE,GAAG,YAAY,SAAS,QAAQ,QAAQ;AAC1F,SAAO;AACT;AAEA,SAAS,uBAAuB,SAAgD;AAC9E,MAAI,CAACC,UAAS,OAAO,GAAG;AACtB,UAAM,IAAI,UAAU,4BAA4B;AAAA,EAClD;AACA,MAAI,CAAC,uBAAuB,QAAQ,OAAO,GAAG;AAC5C,UAAM,IAAI,UAAU,yCAAyC;AAAA,EAC/D;AACA,MAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,WAAW,GAAG;AAC/D,UAAM,IAAI,UAAU,kCAAkC;AAAA,EACxD;AACA,QAAM,QAAQ,IAAI,IAAY,YAAY;AAC1C,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,QAAQ,OAA6B;AACtD,QAAI,OAAO,SAAS,YAAY,CAAC,MAAM,IAAI,IAAI,GAAG;AAChD,YAAM,IAAI,UAAU,kDAAkD;AAAA,IACxE;AACA,QAAI,KAAK,IAAI,IAAI,EAAG,OAAM,IAAI,UAAU,+BAA+B,IAAI,EAAE;AAC7E,SAAK,IAAI,IAAI;AAAA,EACf;AACA,aAAW,CAAC,MAAM,MAAM,KAAK;AAAA,IAC3B,CAAC,QAAQ,QAAQ,IAAI;AAAA,IACrB,CAAC,YAAY,QAAQ,QAAQ;AAAA,IAC7B,CAAC,aAAa,QAAQ,SAAS;AAAA,IAC/B,CAAC,WAAW,QAAQ,OAAO;AAAA,EAC7B,GAAY;AACV,QAAI,WAAW,UAAa,CAACA,UAAS,MAAM,GAAG;AAC7C,YAAM,IAAI,UAAU,GAAG,IAAI,qBAAqB;AAAA,IAClD;AAAA,EACF;AACA,wBAAsB,QAAQ,MAAM,QAAQ;AAC5C,gCAA8B,QAAQ,MAAM,kBAAkB,uBAAuB;AACrF,gCAA8B,QAAQ,MAAM,cAAc,mBAAmB;AAC7E,OACG,QAAQ,MAAM,oBAAoB,KAAK,qBACvC,QAAQ,MAAM,gBAAgB,KAAK,kBACpC;AACA,UAAM,gBAAgB,+CAA+C,gBAAgB,GAAG;AAAA,EAC1F;AACA,MACE,QAAQ,MAAM,qBAAqB,UACnC,QAAQ,KAAK,iBAAiB,UAC9B,QAAQ,KAAK,mBAAmB,QAAQ,KAAK,cAC7C;AACA,UAAM,gBAAgB,wDAAwD;AAAA,EAChF;AACA,uCAAqC,QAAQ,UAAU,UAAU,mBAAmB;AACpF,gCAA8B,QAAQ,UAAU,kBAAkB,2BAA2B;AAC7F,gCAA8B,QAAQ,UAAU,cAAc,uBAAuB;AACrF,0CAAwC,QAAQ,WAAW,UAAU,oBAAoB;AACzF,0CAAwC,QAAQ,SAAS,aAAa,qBAAqB;AAC3F;AAAA,IACE,QAAQ,SAAS;AAAA,IACjB;AAAA,EACF;AACA,gCAA8B,QAAQ,SAAS,kBAAkB,0BAA0B;AAC3F,mCAAiC,QAAQ,SAAS,mBAAmB,2BAA2B;AAChG,QAAM,uBAAuB,QAAQ,SAAS;AAC9C,QAAM,mBAAmB,QAAQ,SAAS,oBAAoB;AAC9D,MAAI,mBAAmB,kBAAkB;AACvC,UAAM,gBAAgB,0CAA0C,gBAAgB,GAAG;AAAA,EACrF;AACA,MAAI,yBAAyB,UAAa,uBAAuB,kBAAkB;AACjF,UAAM,gBAAgB,sEAAsE;AAAA,EAC9F;AACF;AAEA,SAAS,uBACP,SACiC;AACjC,QAAM,YAAY,OAAO,OAAO,CAAC,GAAG,QAAQ,KAAK,CAAC;AAIlD,QAAM,WACJ,QAAQ,MAAM,aAAa,SACvB,SACA,OAAO,OAAO;AAAA,IACZ,MAAM,QAAQ,KAAK,SAAS;AAAA,IAC5B,QAAQ,OAAO,OAAO,CAAC,GAAG,QAAQ,KAAK,SAAS,MAAM,CAAC;AAAA,EACzD,CAAC;AACP,MAAI,WAA4C;AAAA,IAC9C,SAAS,QAAQ;AAAA,IACjB,OAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,QAAW;AAC9B,QAAI,OAAO,EAAE,GAAG,QAAQ,KAAK;AAC7B,QAAI,aAAa,OAAW,QAAO,EAAE,GAAG,MAAM,SAAS;AACvD,eAAW,EAAE,GAAG,UAAU,MAAM,OAAO,OAAO,IAAI,EAAE;AAAA,EACtD;AACA,MAAI,QAAQ,aAAa,QAAW;AAClC,eAAW,EAAE,GAAG,UAAU,UAAU,OAAO,OAAO,EAAE,GAAG,QAAQ,SAAS,CAAC,EAAE;AAAA,EAC7E;AACA,MAAI,QAAQ,cAAc,QAAW;AACnC,eAAW,EAAE,GAAG,UAAU,WAAW,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,CAAC,EAAE;AAAA,EAC/E;AACA,MAAI,QAAQ,YAAY,QAAW;AACjC,eAAW,EAAE,GAAG,UAAU,SAAS,OAAO,OAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC,EAAE;AAAA,EAC3E;AACA,SAAO,OAAO,OAAO,QAAQ;AAC/B;AAEA,SAAS,sBAAsB,QAAsD;AACnF,MAAI,WAAW,OAAW;AAC1B,MAAI,CAACA,UAAS,MAAM,EAAG,OAAM,gBAAgB,kCAAkC;AAC/E,MAAI,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS;AACtD,UAAM,gBAAgB,6CAA6C;AAAA,EACrE;AACA,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM;AAC9B,UAAM,gBAAgB,wCAAwC;AAChE,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,SAAS,OAAO,QAA8B;AACvD,QAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,YAAM,gBAAgB,sDAAsD;AAAA,IAC9E;AACA,QAAI,KAAK,IAAI,KAAK;AAChB,YAAM,gBAAgB,8CAA8C,KAAK,EAAE;AAC7E,SAAK,IAAI,KAAK;AAAA,EAChB;AACF;AAEA,SAAS,qBACP,SACA,QACM;AACN,MAAI,WAAW,OAAW;AAC1B,QAAM,WAAW,OAAO,OAAO,SAAS,OAAO;AAC/C,MAAK,OAAO,SAAS,WAAW,CAAC,YAAc,OAAO,SAAS,WAAW,UAAW;AACnF,UAAM,gBAAgB,+CAA+C,OAAO,EAAE;AAAA,EAChF;AACF;AAEA,SAAS,qBAAqB,WAA+B,cAAkC;AAC7F,MAAI,cAAc,UAAa,iBAAiB,UAAa,YAAY,cAAc;AACrF,UAAM,gBAAgB,mCAAmC,SAAS,MAAM,YAAY,IAAI;AAAA,EAC1F;AACF;AAEA,SAAS,sBAAsB,SAA0C;AACvE,QAAM,mBAAmB,QAAQ,UAAU,oBAAoB;AAC/D,QAAM,eAAe,QAAQ,UAAU,gBAAgB;AACvD,QAAM,WAAW,QAAQ,UAAU,YAAY;AAC/C,MAAI,mBAAmB,cAAc;AACnC,UAAM,gBAAgB,gEAAgE;AAAA,EACxF;AACA,MAAI,eAAe,sBAAsB;AACvC,UAAM,gBAAgB,uCAAuC,oBAAoB,GAAG;AAAA,EACtF;AACA,SAAO,EAAE,kBAAkB,cAAc,SAAS;AACpD;AAEA,SAAS,8BAA8B,OAA2B,MAAoB;AACpF,MAAI,UAAU,WAAc,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,IAAI;AACvE,UAAM,gBAAgB,GAAG,IAAI,mCAAmC;AAAA,EAClE;AACF;AAEA,SAAS,iCAAiC,OAA2B,MAAoB;AACvF,MAAI,UAAU,WAAc,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI;AACtE,UAAM,gBAAgB,GAAG,IAAI,uCAAuC;AAAA,EACtE;AACF;AAEA,SAAS,wCAAwC,OAA2B,MAAoB;AAC9F,mCAAiC,OAAO,IAAI;AAC5C,MAAI,UAAU,UAAa,QAAQ,cAAc;AAC/C,UAAM,gBAAgB,GAAG,IAAI,kBAAkB,YAAY,GAAG;AAAA,EAChE;AACF;AAEA,SAAS,qCAAqC,OAA2B,MAAoB;AAC3F,gCAA8B,OAAO,IAAI;AACzC,MAAI,UAAU,UAAa,QAAQ,cAAc;AAC/C,UAAM,gBAAgB,GAAG,IAAI,kBAAkB,YAAY,GAAG;AAAA,EAChE;AACF;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,MAAI,CAACA,UAAS,KAAK,EAAG,QAAO;AAC7B,SACE,OAAO,MAAM,OAAO,YACpB,MAAM,aAAa,YACnB,OAAO,MAAM,YAAY,YACzB,MAAM,QAAQ,MAAM,cAAc,KAClC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,MAAM,CAAC,SAAS,OAAO,MAAM,IAAI,MAAM,UAAU;AAEvD;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,gBAAgB,SAAqC;AAC5D,SAAO,IAAI,mBAAmB,SAAS,aAAa;AACtD;","names":["randomUUID","path","randomUUID","path","path","isRecord"]}
|
|
1
|
+
{"version":3,"sources":["../src/docker-sandbox.ts","../src/docker-process.ts","../src/path.ts","../src/text-file.ts","../src/tools.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstat, mkdtemp, readFile, realpath, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { assertDockerCli, decodeUtf8, runDockerCli } from \"./docker-cli\";\nimport { DockerProcessManager } from \"./docker-process\";\nimport { DockerSandboxError } from \"./errors\";\nimport { containerPath, normalizeSandboxPath, parentSandboxPath } from \"./path\";\nimport { createTextFilePage } from \"./text-file\";\nimport type {\n CreateDockerSandboxOptions,\n DockerSandbox,\n DockerSandboxClientOptions,\n DockerSandboxExecOptions,\n DockerSandboxExecResult,\n DockerSandboxExecStreamEvent,\n DockerSandboxFileEntry,\n DockerSandboxFileType,\n DockerSandboxInspectionOptions,\n DockerSandboxInspector,\n DockerSandboxListFilesOptions,\n DockerSandboxListProcessesOptions,\n DockerSandboxProcessInfo,\n DockerSandboxProcessLogs,\n DockerSandboxProcessStartOptions,\n DockerSandboxPublishedPort,\n DockerSandboxReadFileOptions,\n DockerSandboxReadProcessLogsOptions,\n DockerSandboxReadTextFilePageOptions,\n DockerSandboxRuntime,\n DockerSandboxRuntimeLimits,\n DockerSandboxState,\n DockerSandboxStopProcessOptions,\n DockerSandboxTextFilePage,\n DockerSandboxWaitForPortOptions,\n DockerSandboxWorkspace,\n DockerSandboxWriteFileOptions,\n DockerSandboxWriteTextFileOptions,\n PullDockerImageOptions,\n ResumeDockerSandboxOptions,\n} from \"./types\";\n\nconst schemaVersion = \"1\";\nconst labelPrefix = \"anvia.sandbox.\";\nconst defaultWorkdir = \"/workspace\";\nconst defaultCommandTimeoutMs = 30_000;\nconst defaultMaxOutputBytes = 1024 * 1024;\nconst defaultMaxFileBytes = 10 * 1024 * 1024;\nconst defaultMaxProcesses = 4;\nconst defaultTextFilePageLines = 500;\nconst defaultTextFilePageBytes = 64 * 1024;\nconst defaultPortWaitTimeoutMs = 30_000;\nconst defaultPortWaitIntervalMs = 100;\nconst idPattern = /^[a-z0-9](?:[a-z0-9_.-]{0,62})$/;\nconst envKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst labels = {\n schema: `${labelPrefix}schema`,\n id: `${labelPrefix}id`,\n workdir: `${labelPrefix}workdir`,\n workspaceType: `${labelPrefix}workspace.type`,\n workspaceVolume: `${labelPrefix}workspace.volume`,\n networkMode: `${labelPrefix}network.mode`,\n commandTimeoutMs: `${labelPrefix}runtime.command-timeout-ms`,\n maxOutputBytes: `${labelPrefix}runtime.max-output-bytes`,\n maxFileBytes: `${labelPrefix}runtime.max-file-bytes`,\n maxProcesses: `${labelPrefix}runtime.max-processes`,\n} as const;\n\nconst portProbeScript = [\n 'port=\"$(printf \\'%04X\\' \"$1\")\"',\n \"for table in /proc/net/tcp /proc/net/tcp6; do\",\n ' [ -r \"$table\" ] || continue',\n \" while read -r _ local _ state _; do\",\n ' case \"$local\" in',\n ' \"00000000:$port\"|\"00000000000000000000000000000000:$port\")',\n ' [ \"$state\" = \"0A\" ] && exit 0',\n \" ;;\",\n \" esac\",\n ' done < \"$table\"',\n \"done\",\n \"exit 1\",\n].join(\"\\n\");\n\ntype ResolvedRuntimeLimits = Required<DockerSandboxRuntimeLimits>;\n\ntype SandboxConfiguration = {\n id: string;\n containerName: string;\n workdir: string;\n workspace: DockerSandboxWorkspace;\n volumeName: string;\n ownsVolume: boolean;\n env: Record<string, string>;\n runtime: ResolvedRuntimeLimits;\n publishedPorts: DockerSandboxPublishedPort[];\n};\n\nexport class DockerSandboxClient {\n private readonly dockerPath: string;\n\n constructor(options: DockerSandboxClientOptions = {}) {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n this.dockerPath = options.dockerPath ?? \"docker\";\n assertNonEmptyString(this.dockerPath, \"dockerPath\");\n }\n\n async pullImage(options: PullDockerImageOptions): Promise<void> {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n assertNonEmptyString(options.image, \"image\");\n options.abortSignal?.throwIfAborted();\n await assertDockerCli([\"pull\", options.image], this.cliOptions(options.abortSignal));\n }\n\n async createSandbox(options: CreateDockerSandboxOptions): Promise<DockerSandbox> {\n validateCreateOptions(options);\n options = snapshotCreateOptions(options);\n options.abortSignal?.throwIfAborted();\n\n const id = options.id ?? randomUUID();\n assertSandboxId(id);\n const containerName = containerNameFor(id);\n const workdir = options.workdir ?? defaultWorkdir;\n const runtime = resolveRuntimeLimits(options.runtime);\n const workspace = copyWorkspace(options.workspace);\n const network = copyNetwork(options.network);\n const env = copyStringRecord(options.env, \"env\");\n const userLabels = copyStringRecord(options.labels, \"labels\");\n const volumeName =\n workspace.type === \"ephemeral\"\n ? `${containerName}-workspace-${randomUUID()}`\n : workspace.name;\n const ownsVolume = workspace.type === \"ephemeral\";\n\n await this.assertContainerDoesNotExist(containerName, options.abortSignal);\n await this.assertImageExists(options.image, options.abortSignal);\n if (workspace.type === \"docker-volume\") {\n await this.assertVolumeExists(workspace.name, options.abortSignal);\n }\n\n let containerCreated = false;\n let volumeCreated = false;\n try {\n if (workspace.type === \"ephemeral\") {\n await assertDockerCli(\n [\"volume\", \"create\", \"--label\", `${labels.id}=${id}`, volumeName],\n this.cliOptions(options.abortSignal),\n );\n volumeCreated = true;\n }\n await assertDockerCli(\n createRunArgs({\n id,\n containerName,\n image: options.image,\n workdir,\n workspace,\n volumeName,\n env,\n user: options.user,\n userLabels,\n resources: options.resources,\n runtime,\n security: options.security,\n network,\n }),\n {\n ...this.cliOptions(options.abortSignal),\n timeoutMs: runtime.commandTimeoutMs,\n },\n );\n containerCreated = true;\n\n const publishedPorts = await inspectPublishedPorts({\n dockerPath: this.dockerPath,\n containerName,\n ports: network.mode === \"bridge\" ? [...(network.ports ?? [])] : [],\n abortSignal: options.abortSignal,\n });\n const sandbox = this.createHandle({\n id,\n containerName,\n workdir,\n workspace,\n volumeName,\n ownsVolume,\n env,\n runtime,\n publishedPorts,\n });\n await applyInitialContent(sandbox.runtime, options);\n return sandbox;\n } catch (error) {\n const cleanupErrors: unknown[] = [];\n if (containerCreated) {\n try {\n await removeContainer(this.dockerPath, containerName);\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n if (ownsVolume && volumeCreated) {\n try {\n await removeVolume(this.dockerPath, volumeName);\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n if (cleanupErrors.length > 0) {\n throw new AggregateError([error, ...cleanupErrors], \"Sandbox creation and rollback failed\");\n }\n throw error;\n }\n }\n\n async resumeSandbox(options: ResumeDockerSandboxOptions): Promise<DockerSandbox> {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n assertSandboxId(options.id);\n options.abortSignal?.throwIfAborted();\n const containerName = containerNameFor(options.id);\n const inspection = await inspectContainer(\n this.dockerPath,\n containerName,\n options.abortSignal,\n true,\n );\n const configuration = configurationFromInspection(options.id, containerName, inspection);\n\n if (inspection.State.Paused === true || inspection.State.Dead === true) {\n throw new DockerSandboxError(\n `Sandbox cannot be resumed from Docker state: ${inspection.State.Status ?? \"unknown\"}`,\n \"invalid_state\",\n );\n }\n if (inspection.State.Running === true) {\n await assertDockerCli([\"stop\", containerName], this.cliOptions(options.abortSignal));\n }\n await assertDockerCli([\"start\", containerName], this.cliOptions(options.abortSignal));\n configuration.publishedPorts = await inspectPublishedPorts({\n dockerPath: this.dockerPath,\n containerName,\n ports: configuredContainerPorts(inspection),\n abortSignal: options.abortSignal,\n });\n return this.createHandle(configuration);\n }\n\n private createHandle(configuration: SandboxConfiguration): DockerSandbox {\n return new DockerSandboxHandle({\n dockerPath: this.dockerPath,\n configuration,\n });\n }\n\n private async assertImageExists(image: string, abortSignal?: AbortSignal): Promise<void> {\n const result = await runDockerCli([\"image\", \"inspect\", image], this.cliOptions(abortSignal));\n if (result.exitCode === 0) return;\n const message = safeDecode(result.stderr);\n if (message.toLowerCase().includes(\"no such image\")) {\n throw new DockerSandboxError(\n `Docker image is not available locally: ${image}`,\n \"image_not_found\",\n );\n }\n throw new DockerSandboxError(\n \"Unable to inspect Docker image.\",\n \"docker_command_failed\",\n result,\n );\n }\n\n private async assertContainerDoesNotExist(\n containerName: string,\n abortSignal?: AbortSignal,\n ): Promise<void> {\n const result = await runDockerCli([\"container\", \"inspect\", containerName], {\n ...this.cliOptions(abortSignal),\n maxOutputBytes: defaultMaxOutputBytes,\n });\n if (result.exitCode === 0) {\n throw new DockerSandboxError(\n `A Docker container already exists for sandbox: ${containerName}`,\n \"invalid_state\",\n );\n }\n if (safeDecode(result.stderr).toLowerCase().includes(\"no such\")) return;\n throw new DockerSandboxError(\n \"Unable to check whether the Docker sandbox already exists.\",\n \"docker_command_failed\",\n result,\n );\n }\n\n private async assertVolumeExists(name: string, abortSignal?: AbortSignal): Promise<void> {\n const result = await runDockerCli([\"volume\", \"inspect\", name], this.cliOptions(abortSignal));\n if (result.exitCode === 0) return;\n const message = safeDecode(result.stderr);\n if (message.toLowerCase().includes(\"no such volume\")) {\n throw new DockerSandboxError(`Docker volume does not exist: ${name}`, \"volume_not_found\");\n }\n throw new DockerSandboxError(\n \"Unable to inspect Docker volume.\",\n \"docker_command_failed\",\n result,\n );\n }\n\n private cliOptions(abortSignal?: AbortSignal) {\n return { dockerPath: this.dockerPath, signal: abortSignal };\n }\n}\n\nclass DockerSandboxHandle implements DockerSandbox {\n readonly id: string;\n readonly runtime: DockerSandboxRuntime;\n\n private currentState: DockerSandboxState = \"running\";\n private readonly dockerPath: string;\n private readonly configuration: SandboxConfiguration;\n private readonly runtimeImpl: DockerSandboxRuntimeImpl;\n private stopPromise: Promise<void> | undefined;\n private destroyPromise: Promise<void> | undefined;\n\n constructor(options: { dockerPath: string; configuration: SandboxConfiguration }) {\n this.dockerPath = options.dockerPath;\n this.configuration = options.configuration;\n this.id = options.configuration.id;\n this.runtimeImpl = new DockerSandboxRuntimeImpl({\n configuration: options.configuration,\n dockerPath: options.dockerPath,\n state: () => this.currentState,\n });\n this.runtime = Object.freeze(this.runtimeImpl.publicRuntime());\n }\n\n get state(): DockerSandboxState {\n return this.currentState;\n }\n\n inspector(options: DockerSandboxInspectionOptions): DockerSandboxInspector {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (options.files !== true && options.ports !== true && options.processes !== true) {\n throw new TypeError(\"Sandbox inspector must enable at least one capability.\");\n }\n let inspector: DockerSandboxInspector = {\n id: this.id,\n provider: \"docker\",\n workdir: this.configuration.workdir,\n };\n if (options.files === true) {\n inspector = {\n ...inspector,\n listFiles: this.runtime.listFiles.bind(this.runtime),\n readFile: this.runtime.readFile.bind(this.runtime),\n };\n }\n if (options.ports === true) {\n inspector = { ...inspector, publishedPorts: this.runtime.publishedPorts };\n }\n if (options.processes === true) {\n inspector = {\n ...inspector,\n listProcesses: this.runtime.listProcesses.bind(this.runtime),\n readProcessLogs: this.runtime.readProcessLogs.bind(this.runtime),\n };\n }\n return Object.freeze(inspector);\n }\n\n async stop(options: Readonly<{ abortSignal?: AbortSignal }> = {}): Promise<void> {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (this.currentState === \"stopped\") return;\n if (this.currentState === \"destroyed\" || this.currentState === \"destroying\") {\n throw invalidState(this.id, this.currentState);\n }\n if (this.stopPromise !== undefined) return this.stopPromise;\n this.stopPromise = this.performStop(options.abortSignal);\n try {\n await this.stopPromise;\n } finally {\n this.stopPromise = undefined;\n }\n }\n\n private async performStop(abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n this.currentState = \"stopping\";\n try {\n await this.runtimeImpl.closeActiveOperations(\"Sandbox is stopping.\");\n await this.runtimeImpl.disposeProcesses(abortSignal);\n await assertDockerCli([\"stop\", this.configuration.containerName], {\n dockerPath: this.dockerPath,\n signal: abortSignal,\n });\n this.currentState = \"stopped\";\n } catch (error) {\n this.currentState = \"error\";\n throw error;\n }\n }\n\n async destroy(): Promise<void> {\n if (this.currentState === \"destroyed\") return;\n if (this.destroyPromise !== undefined) return this.destroyPromise;\n this.destroyPromise = this.performDestroy();\n try {\n await this.destroyPromise;\n } finally {\n this.destroyPromise = undefined;\n }\n }\n\n private async performDestroy(): Promise<void> {\n if (this.stopPromise !== undefined) await this.stopPromise.catch(() => undefined);\n this.currentState = \"destroying\";\n const failures: unknown[] = [];\n try {\n await this.runtimeImpl.closeActiveOperations(\"Sandbox is being destroyed.\");\n } catch (error) {\n failures.push(error);\n }\n try {\n await this.runtimeImpl.disposeProcesses();\n } catch (error) {\n failures.push(error);\n }\n try {\n await removeContainer(this.dockerPath, this.configuration.containerName);\n } catch (error) {\n failures.push(error);\n }\n if (this.configuration.ownsVolume) {\n try {\n await removeVolume(this.dockerPath, this.configuration.volumeName);\n } catch (error) {\n failures.push(error);\n }\n }\n if (failures.length > 0) {\n this.currentState = \"error\";\n throw new AggregateError(failures, `Unable to destroy sandbox: ${this.id}`);\n }\n this.currentState = \"destroyed\";\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.destroy();\n }\n}\n\nclass DockerSandboxRuntimeImpl {\n private readonly configuration: SandboxConfiguration;\n private readonly dockerPath: string;\n private readonly state: () => DockerSandboxState;\n private readonly processManager: DockerProcessManager;\n private readonly activeControllers = new Set<AbortController>();\n private readonly activeOperations = new Set<Promise<unknown>>();\n private processDisposed = false;\n\n constructor(options: {\n configuration: SandboxConfiguration;\n dockerPath: string;\n state: () => DockerSandboxState;\n }) {\n this.configuration = options.configuration;\n this.dockerPath = options.dockerPath;\n this.state = options.state;\n this.processManager = new DockerProcessManager({\n containerName: options.configuration.containerName,\n dockerPath: options.dockerPath,\n workdir: options.configuration.workdir,\n env: options.configuration.env,\n maxOutputBytes: options.configuration.runtime.maxOutputBytes,\n maxProcesses: options.configuration.runtime.maxProcesses,\n startupTimeoutMs: options.configuration.runtime.commandTimeoutMs,\n });\n }\n\n publicRuntime(): DockerSandboxRuntime {\n return {\n id: this.configuration.id,\n provider: \"docker\",\n workdir: this.configuration.workdir,\n publishedPorts: Object.freeze(\n this.configuration.publishedPorts.map((port) => Object.freeze({ ...port })),\n ),\n exec: (options) => this.exec(options),\n execStream: (options) => this.execStream(options),\n readFile: (options) => this.readFile(options),\n readTextFile: (options) => this.readTextFile(options),\n readTextFilePage: (options) => this.readTextFilePage(options),\n writeFile: (options) => this.writeFile(options),\n writeTextFile: (options) => this.writeTextFile(options),\n listFiles: (options) => this.listFiles(options),\n startProcess: (options) => this.startProcess(options),\n listProcesses: (options) => this.listProcesses(options),\n readProcessLogs: (options) => this.readProcessLogs(options),\n stopProcess: (options) => this.stopProcess(options),\n waitForPort: (options) => this.waitForPort(options),\n };\n }\n\n async exec(options: DockerSandboxExecOptions): Promise<DockerSandboxExecResult> {\n validateExecOptions(options);\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const result = await runDockerCli(this.execArgs(options), {\n dockerPath: this.dockerPath,\n timeoutMs: options.timeoutMs ?? this.configuration.runtime.commandTimeoutMs,\n maxOutputBytes: this.configuration.runtime.maxOutputBytes,\n input: options.input,\n signal: abortSignal,\n });\n return toExecResult(result);\n });\n }\n\n async *execStream(\n options: DockerSandboxExecOptions,\n ): AsyncIterable<DockerSandboxExecStreamEvent> {\n validateExecOptions(options);\n this.assertRunning();\n const streamAbort = new AbortController();\n const combined = combineSignals(options.abortSignal, streamAbort.signal);\n const queue: DockerSandboxExecStreamEvent[] = [];\n let queuedBytes = 0;\n let wake: (() => void) | undefined;\n let complete = false;\n let failure: unknown;\n const push = (event: DockerSandboxExecStreamEvent) => {\n if (event.type !== \"result\") {\n queuedBytes += event.data.byteLength;\n if (queuedBytes > this.configuration.runtime.maxOutputBytes) {\n streamAbort.abort(\n new DockerSandboxError(\"Sandbox stream consumer is too slow.\", \"docker_command_failed\"),\n );\n return;\n }\n }\n queue.push(event);\n wake?.();\n wake = undefined;\n };\n const run = this.runOperation(combined, async (abortSignal) => {\n const result = await runDockerCli(this.execArgs(options), {\n dockerPath: this.dockerPath,\n timeoutMs: options.timeoutMs ?? this.configuration.runtime.commandTimeoutMs,\n maxOutputBytes: this.configuration.runtime.maxOutputBytes,\n input: options.input,\n signal: abortSignal,\n onStdout: (data) => push({ type: \"stdout\", data: data.slice() }),\n onStderr: (data) => push({ type: \"stderr\", data: data.slice() }),\n });\n push({ type: \"result\", result: toExecResult(result) });\n });\n void run.then(\n () => {\n complete = true;\n wake?.();\n },\n (error) => {\n failure = error;\n complete = true;\n wake?.();\n },\n );\n\n try {\n while (!complete || queue.length > 0) {\n const event = queue.shift();\n if (event !== undefined) {\n if (event.type !== \"result\") queuedBytes -= event.data.byteLength;\n yield event;\n continue;\n }\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n if (failure !== undefined) throw failure;\n } finally {\n if (!complete) streamAbort.abort(new DOMException(\"Stream closed\", \"AbortError\"));\n await run.catch(() => undefined);\n }\n }\n\n async readFile(options: DockerSandboxReadFileOptions): Promise<Uint8Array> {\n assertReadOptions(options);\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const normalized = normalizeSandboxPath(options.path);\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"anvia-sandbox-read-\"));\n const target = path.join(tempDir, path.basename(normalized));\n try {\n await assertDockerCli(\n [\n \"cp\",\n `${this.configuration.containerName}:${containerPath(this.configuration.workdir, normalized)}`,\n target,\n ],\n { dockerPath: this.dockerPath, signal: abortSignal },\n );\n await assertCopiedRegularFile(tempDir, target, normalized);\n const bytes = await readFile(target, { signal: abortSignal });\n this.assertFileSize(bytes.byteLength, normalized);\n return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength).slice();\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n });\n }\n\n async readTextFile(options: DockerSandboxReadFileOptions): Promise<string> {\n return decodeUtf8(await this.readFile(options));\n }\n\n async readTextFilePage(\n options: DockerSandboxReadTextFilePageOptions,\n ): Promise<DockerSandboxTextFilePage> {\n assertReadOptions(options);\n const startLine = options.startLine ?? 1;\n const lineCount = options.lineCount ?? defaultTextFilePageLines;\n const maxBytes = options.maxBytes ?? defaultTextFilePageBytes;\n assertPositiveSafeInteger(startLine, \"startLine\");\n assertPositiveSafeInteger(lineCount, \"lineCount\");\n assertPositiveSafeInteger(maxBytes, \"maxBytes\");\n let readOptions: DockerSandboxReadFileOptions = {\n path: options.path,\n };\n if (options.abortSignal !== undefined) {\n readOptions = { ...readOptions, abortSignal: options.abortSignal };\n }\n const text = await this.readTextFile(readOptions);\n return createTextFilePage(text, { startLine, lineCount, maxBytes });\n }\n\n async writeFile(options: DockerSandboxWriteFileOptions): Promise<void> {\n assertOptionsObject(options);\n if (!(options.data instanceof Uint8Array)) throw new TypeError(\"data must be a Uint8Array.\");\n const data = options.data.slice();\n await this.writeBytes(options.path, data, options.abortSignal);\n }\n\n async writeTextFile(options: DockerSandboxWriteTextFileOptions): Promise<void> {\n assertOptionsObject(options);\n if (typeof options.text !== \"string\") throw new TypeError(\"text must be a string.\");\n await this.writeBytes(\n options.path,\n new TextEncoder().encode(options.text),\n options.abortSignal,\n );\n }\n\n private async writeBytes(\n filePath: string,\n data: Uint8Array,\n abortSignal?: AbortSignal,\n ): Promise<void> {\n const normalized = normalizeSandboxPath(filePath);\n this.assertFileSize(data.byteLength, normalized);\n await this.runOperation(abortSignal, async (effectiveSignal) => {\n await this.mkdir(parentSandboxPath(normalized), effectiveSignal);\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"anvia-sandbox-write-\"));\n const source = path.join(tempDir, path.basename(normalized));\n try {\n await writeFile(source, data, { signal: effectiveSignal });\n await assertDockerCli(\n [\n \"cp\",\n source,\n `${this.configuration.containerName}:${containerPath(this.configuration.workdir, normalized)}`,\n ],\n { dockerPath: this.dockerPath, signal: effectiveSignal },\n );\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n });\n }\n\n async listFiles(\n options: DockerSandboxListFilesOptions = {},\n ): Promise<readonly DockerSandboxFileEntry[]> {\n assertOptionsObject(options);\n const requestedPath = options.path ?? \".\";\n const normalized = normalizeSandboxPath(requestedPath, { allowRoot: true });\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const result = await this.execCommand(\n {\n command: \"find\",\n args: [\n containerPath(this.configuration.workdir, normalized),\n \"-mindepth\",\n \"1\",\n \"-maxdepth\",\n \"1\",\n \"-printf\",\n \"%p\\t%y\\t%s\\n\",\n ],\n },\n abortSignal,\n );\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new DockerSandboxError(\n \"Unable to list sandbox files.\",\n \"docker_command_failed\",\n result,\n );\n }\n const output = decodeUtf8(result.stdout);\n return output\n .split(\"\\n\")\n .filter((line) => line.length > 0)\n .map((line) => parseFindEntry(line, this.configuration.workdir));\n });\n }\n\n async startProcess(options: DockerSandboxProcessStartOptions): Promise<DockerSandboxProcessInfo> {\n validateProcessStartOptions(options);\n return this.runOperation(options.abortSignal, async (abortSignal) =>\n this.processManager.start({ ...options, abortSignal }),\n );\n }\n\n async listProcesses(\n options: DockerSandboxListProcessesOptions = {},\n ): Promise<readonly DockerSandboxProcessInfo[]> {\n assertOptionsObject(options);\n return this.runOperation(options.abortSignal, async () => this.processManager.list());\n }\n\n async readProcessLogs(\n options: DockerSandboxReadProcessLogsOptions,\n ): Promise<DockerSandboxProcessLogs> {\n assertOptionsObject(options);\n assertNonEmptyString(options.processId, \"processId\");\n if (options.tailBytes !== undefined)\n assertNonNegativeSafeInteger(options.tailBytes, \"tailBytes\");\n return this.runOperation(options.abortSignal, async () =>\n this.processManager.logs(options.processId, options.tailBytes),\n );\n }\n\n async stopProcess(options: DockerSandboxStopProcessOptions): Promise<DockerSandboxProcessInfo> {\n assertOptionsObject(options);\n assertNonEmptyString(options.processId, \"processId\");\n if (options.gracePeriodMs !== undefined) {\n assertNonNegativeSafeInteger(options.gracePeriodMs, \"gracePeriodMs\");\n }\n return this.runOperation(options.abortSignal, async (abortSignal) =>\n this.processManager.stop(options.processId, options.gracePeriodMs, abortSignal),\n );\n }\n\n async waitForPort(options: DockerSandboxWaitForPortOptions): Promise<DockerSandboxPublishedPort> {\n assertOptionsObject(options);\n assertPort(options.containerPort);\n const publishedPort = this.configuration.publishedPorts.find(\n (candidate) => candidate.containerPort === options.containerPort,\n );\n if (publishedPort === undefined) {\n throw new DockerSandboxError(\n `Sandbox port is not published: ${options.containerPort}/tcp`,\n \"port\",\n );\n }\n const timeoutMs = options.timeoutMs ?? defaultPortWaitTimeoutMs;\n const intervalMs = options.intervalMs ?? defaultPortWaitIntervalMs;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n assertPositiveSafeInteger(intervalMs, \"intervalMs\");\n\n return this.runOperation(options.abortSignal, async (abortSignal) => {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n const result = await this.execCommand(\n {\n command: \"sh\",\n args: [\"-c\", portProbeScript, \"anvia-port-probe\", `${options.containerPort}`],\n timeoutMs: Math.min(5_000, timeoutMs),\n },\n abortSignal,\n );\n if (result.status === \"exited\" && result.exitCode === 0) return { ...publishedPort };\n if (Date.now() >= deadline) {\n throw new DockerSandboxError(\n `Waiting for sandbox port timed out: ${options.containerPort}`,\n \"timeout\",\n );\n }\n await waitWithSignal(Math.min(intervalMs, deadline - Date.now()), abortSignal);\n }\n });\n }\n\n async closeActiveOperations(message: string): Promise<void> {\n const reason = new DockerSandboxError(message, \"invalid_state\");\n for (const controller of this.activeControllers) controller.abort(reason);\n await Promise.allSettled(this.activeOperations);\n }\n\n async disposeProcesses(abortSignal?: AbortSignal): Promise<void> {\n if (this.processDisposed) return;\n await this.processManager.dispose(abortSignal);\n this.processDisposed = true;\n }\n\n private async runOperation<T>(\n abortSignal: AbortSignal | undefined,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n this.assertRunning();\n abortSignal?.throwIfAborted();\n const controller = new AbortController();\n const effectiveSignal = combineSignals(abortSignal, controller.signal);\n const execution = operation(effectiveSignal);\n this.activeControllers.add(controller);\n this.activeOperations.add(execution);\n try {\n return await execution;\n } finally {\n this.activeControllers.delete(controller);\n this.activeOperations.delete(execution);\n }\n }\n\n private assertRunning(): void {\n const current = this.state();\n if (current !== \"running\") throw invalidState(this.configuration.id, current);\n }\n\n private execArgs(options: DockerSandboxExecOptions): string[] {\n const args = [\"exec\"];\n if (options.input !== undefined) args.push(\"-i\");\n args.push(\"-w\", containerPath(this.configuration.workdir, options.cwd ?? \".\"));\n for (const [key, value] of Object.entries(options.env ?? {}))\n args.push(\"-e\", `${key}=${value}`);\n args.push(this.configuration.containerName, options.command, ...(options.args ?? []));\n return args;\n }\n\n private async execCommand(\n options: Omit<DockerSandboxExecOptions, \"abortSignal\">,\n abortSignal: AbortSignal,\n ): Promise<DockerSandboxExecResult> {\n const result = await runDockerCli(this.execArgs(options), {\n dockerPath: this.dockerPath,\n timeoutMs: options.timeoutMs ?? this.configuration.runtime.commandTimeoutMs,\n maxOutputBytes: this.configuration.runtime.maxOutputBytes,\n input: options.input,\n signal: abortSignal,\n });\n return toExecResult(result);\n }\n\n private async mkdir(directory: string, abortSignal: AbortSignal): Promise<void> {\n if (directory === \".\") return;\n const result = await this.execCommand(\n { command: \"mkdir\", args: [\"-p\", containerPath(this.configuration.workdir, directory)] },\n abortSignal,\n );\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new DockerSandboxError(\n \"Unable to create sandbox directory.\",\n \"docker_command_failed\",\n result,\n );\n }\n }\n\n private assertFileSize(size: number, filePath: string): void {\n if (size > this.configuration.runtime.maxFileBytes) {\n throw new DockerSandboxError(\n `Sandbox file exceeds maxFileBytes (${size} > ${this.configuration.runtime.maxFileBytes}): ${filePath}`,\n \"file_too_large\",\n );\n }\n }\n}\n\nasync function applyInitialContent(\n runtime: DockerSandboxRuntime,\n options: CreateDockerSandboxOptions,\n): Promise<void> {\n for (const directory of options.directories ?? []) {\n const marker = path.posix.join(normalizeSandboxPath(directory), \".anvia-keep\");\n const abort = options.abortSignal === undefined ? {} : { abortSignal: options.abortSignal };\n await runtime.writeFile({ path: marker, data: new Uint8Array(), ...abort });\n const removed = await runtime.exec({ command: \"rm\", args: [marker], ...abort });\n if (removed.status !== \"exited\" || removed.exitCode !== 0) {\n throw new DockerSandboxError(\n `Unable to create initial sandbox directory: ${directory}`,\n \"docker_command_failed\",\n removed,\n );\n }\n }\n for (const [filePath, content] of Object.entries(options.files ?? {})) {\n if (typeof content === \"string\") {\n let writeOptions: DockerSandboxWriteTextFileOptions = {\n path: filePath,\n text: content,\n };\n if (options.abortSignal !== undefined) {\n writeOptions = { ...writeOptions, abortSignal: options.abortSignal };\n }\n await runtime.writeTextFile(writeOptions);\n } else {\n let writeOptions: DockerSandboxWriteFileOptions = {\n path: filePath,\n data: content,\n };\n if (options.abortSignal !== undefined) {\n writeOptions = { ...writeOptions, abortSignal: options.abortSignal };\n }\n await runtime.writeFile(writeOptions);\n }\n }\n}\n\nfunction createRunArgs(options: {\n id: string;\n containerName: string;\n image: string;\n workdir: string;\n workspace: DockerSandboxWorkspace;\n volumeName: string;\n env: Record<string, string>;\n user: string | undefined;\n userLabels: Record<string, string>;\n resources: CreateDockerSandboxOptions[\"resources\"] | undefined;\n runtime: ResolvedRuntimeLimits;\n security: CreateDockerSandboxOptions[\"security\"] | undefined;\n network: CreateDockerSandboxOptions[\"network\"];\n}): string[] {\n const runtimeLabels: Record<string, string> = {\n [labels.schema]: schemaVersion,\n [labels.id]: options.id,\n [labels.workdir]: options.workdir,\n [labels.workspaceType]: options.workspace.type,\n [labels.workspaceVolume]: options.volumeName,\n [labels.networkMode]: options.network.mode,\n [labels.commandTimeoutMs]: `${options.runtime.commandTimeoutMs}`,\n [labels.maxOutputBytes]: `${options.runtime.maxOutputBytes}`,\n [labels.maxFileBytes]: `${options.runtime.maxFileBytes}`,\n [labels.maxProcesses]: `${options.runtime.maxProcesses}`,\n };\n const args = [\n \"run\",\n \"-d\",\n \"--name\",\n options.containerName,\n \"--mount\",\n `type=volume,src=${options.volumeName},dst=${options.workdir}`,\n \"-w\",\n options.workdir,\n ];\n for (const [key, value] of Object.entries({ ...options.userLabels, ...runtimeLabels })) {\n args.push(\"--label\", `${key}=${value}`);\n }\n for (const [key, value] of Object.entries(options.env)) args.push(\"--env\", `${key}=${value}`);\n if (options.user !== undefined) args.push(\"--user\", options.user);\n if (options.network.mode === \"none\") {\n args.push(\"--network\", \"none\");\n } else {\n for (const port of options.network.ports ?? [])\n args.push(\"--publish\", `127.0.0.1::${port}/tcp`);\n }\n if (options.resources?.memoryMb !== undefined)\n args.push(\"--memory\", `${options.resources.memoryMb}m`);\n if (options.resources?.cpus !== undefined) args.push(\"--cpus\", `${options.resources.cpus}`);\n if (options.resources?.pidsLimit !== undefined) {\n args.push(\"--pids-limit\", `${options.resources.pidsLimit}`);\n }\n if (options.resources?.sharedMemoryMb !== undefined) {\n args.push(\"--shm-size\", `${options.resources.sharedMemoryMb}m`);\n }\n if (options.security?.readonlyRootfs === true) args.push(\"--read-only\");\n if (options.security?.noNewPrivileges ?? true)\n args.push(\"--security-opt\", \"no-new-privileges:true\");\n if (options.security?.seccompProfile !== undefined) {\n args.push(\"--security-opt\", `seccomp=${options.security.seccompProfile.path}`);\n }\n for (const capability of options.security?.dropCapabilities ?? [\"ALL\"]) {\n args.push(\"--cap-drop\", capability);\n }\n for (const capability of options.security?.addCapabilities ?? []) {\n args.push(\"--cap-add\", capability);\n }\n args.push(\n options.image,\n \"sh\",\n \"-c\",\n \"trap 'exit 0' TERM INT; while :; do sleep 3600 & wait $!; done\",\n );\n return args;\n}\n\nfunction validateCreateOptions(options: CreateDockerSandboxOptions): void {\n if (options === null || typeof options !== \"object\")\n throw new TypeError(\"options must be an object.\");\n assertNonEmptyString(options.image, \"image\");\n if (options.id !== undefined) assertSandboxId(options.id);\n const workdir = options.workdir ?? defaultWorkdir;\n if (!path.posix.isAbsolute(workdir) || workdir.includes(\"\\0\")) {\n throw new TypeError(\"workdir must be an absolute POSIX path.\");\n }\n if (!isRecord(options.workspace)) throw new TypeError(\"workspace must be an object.\");\n if (options.workspace.type === \"docker-volume\") assertDockerVolumeName(options.workspace.name);\n if (options.workspace.type !== \"ephemeral\" && options.workspace.type !== \"docker-volume\") {\n throw new TypeError(\"workspace must use type ephemeral or docker-volume.\");\n }\n if (options.workspace.type === \"ephemeral\" && \"name\" in options.workspace) {\n throw new TypeError(\"An ephemeral workspace cannot specify a Docker volume name.\");\n }\n if (!isRecord(options.network)) throw new TypeError(\"network must be an object.\");\n if (options.network.mode !== \"none\" && options.network.mode !== \"bridge\") {\n throw new TypeError(\"network must use mode none or bridge.\");\n }\n if (options.network.mode === \"none\" && \"ports\" in options.network) {\n throw new TypeError(\"Network mode none cannot publish ports.\");\n }\n if (options.network.mode === \"bridge\") {\n if (options.network.ports !== undefined && !Array.isArray(options.network.ports)) {\n throw new TypeError(\"network.ports must be an array.\");\n }\n validatePorts(options.network.ports ?? []);\n }\n validateRuntimeLimits(options.runtime);\n validateResources(options.resources);\n validateSecurity(options.security);\n copyStringRecord(options.env, \"env\");\n const userLabels = copyStringRecord(options.labels, \"labels\");\n for (const key of Object.keys(userLabels)) {\n if (key.startsWith(labelPrefix)) throw new TypeError(`Docker label is reserved: ${key}`);\n }\n if (options.user !== undefined) assertNonEmptyString(options.user, \"user\");\n if (options.directories !== undefined && !Array.isArray(options.directories)) {\n throw new TypeError(\"directories must be an array.\");\n }\n for (const directory of options.directories ?? []) {\n if (typeof directory !== \"string\") throw new TypeError(\"directories must contain strings.\");\n normalizeSandboxPath(directory);\n }\n if (options.files !== undefined && !isRecord(options.files)) {\n throw new TypeError(\"files must be an object.\");\n }\n for (const [filePath, content] of Object.entries(options.files ?? {})) {\n normalizeSandboxPath(filePath);\n if (typeof content !== \"string\" && !(content instanceof Uint8Array)) {\n throw new TypeError(`Initial file must be a string or Uint8Array: ${filePath}`);\n }\n const byteLength =\n typeof content === \"string\"\n ? new TextEncoder().encode(content).byteLength\n : content.byteLength;\n const maxFileBytes = options.runtime?.maxFileBytes ?? defaultMaxFileBytes;\n if (byteLength > maxFileBytes) {\n throw new DockerSandboxError(\n `Initial file exceeds maxFileBytes (${byteLength} > ${maxFileBytes}): ${filePath}`,\n \"file_too_large\",\n );\n }\n }\n}\n\nfunction validateRuntimeLimits(runtime?: DockerSandboxRuntimeLimits): void {\n if (runtime !== undefined && !isRecord(runtime)) {\n throw new TypeError(\"runtime must be an object.\");\n }\n if (runtime?.commandTimeoutMs !== undefined)\n assertPositiveSafeInteger(runtime.commandTimeoutMs, \"commandTimeoutMs\");\n if (runtime?.maxOutputBytes !== undefined)\n assertNonNegativeSafeInteger(runtime.maxOutputBytes, \"maxOutputBytes\");\n if (runtime?.maxFileBytes !== undefined)\n assertNonNegativeSafeInteger(runtime.maxFileBytes, \"maxFileBytes\");\n if (runtime?.maxProcesses !== undefined)\n assertNonNegativeSafeInteger(runtime.maxProcesses, \"maxProcesses\");\n}\n\nfunction validateResources(resources: CreateDockerSandboxOptions[\"resources\"]): void {\n if (resources !== undefined && !isRecord(resources)) {\n throw new TypeError(\"resources must be an object.\");\n }\n if (resources?.memoryMb !== undefined) assertPositiveSafeInteger(resources.memoryMb, \"memoryMb\");\n if (resources?.pidsLimit !== undefined)\n assertPositiveSafeInteger(resources.pidsLimit, \"pidsLimit\");\n if (resources?.sharedMemoryMb !== undefined)\n assertPositiveSafeInteger(resources.sharedMemoryMb, \"sharedMemoryMb\");\n if (resources?.cpus !== undefined && (!Number.isFinite(resources.cpus) || resources.cpus <= 0)) {\n throw new RangeError(\"cpus must be a positive finite number.\");\n }\n}\n\nfunction validateSecurity(security: CreateDockerSandboxOptions[\"security\"]): void {\n if (security !== undefined && !isRecord(security)) {\n throw new TypeError(\"security must be an object.\");\n }\n if (security?.dropCapabilities !== undefined && !Array.isArray(security.dropCapabilities)) {\n throw new TypeError(\"dropCapabilities must be an array.\");\n }\n if (security?.addCapabilities !== undefined && !Array.isArray(security.addCapabilities)) {\n throw new TypeError(\"addCapabilities must be an array.\");\n }\n if (security?.readonlyRootfs !== undefined && typeof security.readonlyRootfs !== \"boolean\") {\n throw new TypeError(\"readonlyRootfs must be a boolean.\");\n }\n if (security?.noNewPrivileges !== undefined && typeof security.noNewPrivileges !== \"boolean\") {\n throw new TypeError(\"noNewPrivileges must be a boolean.\");\n }\n if (security?.seccompProfile !== undefined) {\n if (!isRecord(security.seccompProfile) || security.seccompProfile.type !== \"path\") {\n throw new TypeError('seccompProfile must be a { type: \"path\", path } object.');\n }\n assertNonEmptyString(security.seccompProfile.path, \"seccompProfile.path\");\n if (\n !path.isAbsolute(security.seccompProfile.path) ||\n security.seccompProfile.path.includes(\"\\0\")\n ) {\n throw new TypeError(\"seccompProfile.path must be an absolute host path.\");\n }\n }\n const seen = new Set<string>();\n for (const capability of security?.dropCapabilities ?? []) {\n assertNonEmptyString(capability, \"dropCapabilities value\");\n if (seen.has(capability))\n throw new TypeError(`dropCapabilities contains a duplicate: ${capability}`);\n seen.add(capability);\n }\n seen.clear();\n for (const capability of security?.addCapabilities ?? []) {\n assertNonEmptyString(capability, \"addCapabilities value\");\n if (seen.has(capability))\n throw new TypeError(`addCapabilities contains a duplicate: ${capability}`);\n seen.add(capability);\n }\n}\n\nfunction validateExecOptions(options: DockerSandboxExecOptions): void {\n assertOptionsObject(options);\n assertNonEmptyString(options.command, \"command\");\n if (\n options.args !== undefined &&\n (!Array.isArray(options.args) || !options.args.every((value) => typeof value === \"string\"))\n ) {\n throw new TypeError(\"args must contain only strings.\");\n }\n if (options.cwd !== undefined) normalizeSandboxPath(options.cwd, { allowRoot: true });\n copyStringRecord(options.env, \"env\");\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (\n options.input !== undefined &&\n typeof options.input !== \"string\" &&\n !(options.input instanceof Uint8Array)\n ) {\n throw new TypeError(\"input must be a string or Uint8Array.\");\n }\n}\n\nfunction validateProcessStartOptions(options: DockerSandboxProcessStartOptions): void {\n assertOptionsObject(options);\n assertNonEmptyString(options.command, \"command\");\n if (\n options.args !== undefined &&\n (!Array.isArray(options.args) || !options.args.every((value) => typeof value === \"string\"))\n ) {\n throw new TypeError(\"args must contain only strings.\");\n }\n if (options.cwd !== undefined) normalizeSandboxPath(options.cwd, { allowRoot: true });\n copyStringRecord(options.env, \"env\");\n}\n\nfunction assertReadOptions(options: DockerSandboxReadFileOptions): void {\n assertOptionsObject(options);\n normalizeSandboxPath(options.path);\n}\n\nfunction assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (!isRecord(value)) throw new TypeError(\"options must be an object.\");\n}\n\nfunction resolveRuntimeLimits(runtime?: DockerSandboxRuntimeLimits): ResolvedRuntimeLimits {\n return {\n commandTimeoutMs: runtime?.commandTimeoutMs ?? defaultCommandTimeoutMs,\n maxOutputBytes: runtime?.maxOutputBytes ?? defaultMaxOutputBytes,\n maxFileBytes: runtime?.maxFileBytes ?? defaultMaxFileBytes,\n maxProcesses: runtime?.maxProcesses ?? defaultMaxProcesses,\n };\n}\n\nfunction snapshotCreateOptions(options: CreateDockerSandboxOptions): CreateDockerSandboxOptions {\n const files: Record<string, string | Uint8Array> = {};\n for (const [filePath, content] of Object.entries(options.files ?? {})) {\n files[filePath] = typeof content === \"string\" ? content : content.slice();\n }\n const workspace = copyWorkspace(options.workspace);\n const network = copyNetwork(options.network);\n let snapshot: CreateDockerSandboxOptions = {\n image: options.image,\n workspace,\n network,\n };\n if (options.id !== undefined) snapshot = { ...snapshot, id: options.id };\n if (options.workdir !== undefined) snapshot = { ...snapshot, workdir: options.workdir };\n if (options.files !== undefined) snapshot = { ...snapshot, files: Object.freeze(files) };\n if (options.directories !== undefined) {\n snapshot = { ...snapshot, directories: Object.freeze([...options.directories]) };\n }\n if (options.env !== undefined) {\n snapshot = { ...snapshot, env: Object.freeze({ ...options.env }) };\n }\n if (options.user !== undefined) snapshot = { ...snapshot, user: options.user };\n if (options.labels !== undefined) {\n snapshot = { ...snapshot, labels: Object.freeze({ ...options.labels }) };\n }\n if (options.resources !== undefined) {\n snapshot = { ...snapshot, resources: Object.freeze({ ...options.resources }) };\n }\n if (options.runtime !== undefined) {\n snapshot = { ...snapshot, runtime: Object.freeze({ ...options.runtime }) };\n }\n if (options.security !== undefined) {\n let security: NonNullable<CreateDockerSandboxOptions[\"security\"]> = {\n ...options.security,\n };\n if (options.security.seccompProfile !== undefined) {\n security = {\n ...security,\n seccompProfile: Object.freeze({ ...options.security.seccompProfile }),\n };\n }\n if (options.security.dropCapabilities !== undefined) {\n security = {\n ...security,\n dropCapabilities: Object.freeze([...options.security.dropCapabilities]),\n };\n }\n if (options.security.addCapabilities !== undefined) {\n security = {\n ...security,\n addCapabilities: Object.freeze([...options.security.addCapabilities]),\n };\n }\n snapshot = { ...snapshot, security: Object.freeze(security) };\n }\n if (options.abortSignal !== undefined) {\n snapshot = { ...snapshot, abortSignal: options.abortSignal };\n }\n return Object.freeze(snapshot);\n}\n\nfunction configurationFromInspection(\n id: string,\n containerName: string,\n inspection: DockerContainerInspection,\n): SandboxConfiguration {\n const containerLabels = inspection.Config.Labels ?? {};\n if (containerLabels[labels.schema] !== schemaVersion || containerLabels[labels.id] !== id) {\n throw new DockerSandboxError(\n `Container is not an Anvia sandbox: ${containerName}`,\n \"sandbox_not_found\",\n );\n }\n const workdir = requiredLabel(containerLabels, labels.workdir);\n const workspaceType = requiredLabel(containerLabels, labels.workspaceType);\n const volumeName = requiredLabel(containerLabels, labels.workspaceVolume);\n const networkMode = requiredLabel(containerLabels, labels.networkMode);\n if (networkMode !== \"none\" && networkMode !== \"bridge\") invalidInspection(\"network mode\");\n const workspace: DockerSandboxWorkspace =\n workspaceType === \"ephemeral\"\n ? { type: \"ephemeral\" }\n : workspaceType === \"docker-volume\"\n ? { type: \"docker-volume\", name: volumeName }\n : invalidInspection(\"workspace type\");\n const runtime = {\n commandTimeoutMs: parseLabelInteger(containerLabels, labels.commandTimeoutMs, true),\n maxOutputBytes: parseLabelInteger(containerLabels, labels.maxOutputBytes, false),\n maxFileBytes: parseLabelInteger(containerLabels, labels.maxFileBytes, false),\n maxProcesses: parseLabelInteger(containerLabels, labels.maxProcesses, false),\n };\n return {\n id,\n containerName,\n workdir,\n workspace,\n volumeName,\n ownsVolume: workspace.type === \"ephemeral\",\n env: {},\n runtime,\n publishedPorts: [],\n };\n}\n\ntype DockerContainerInspection = {\n Config: { Labels?: Record<string, string>; WorkingDir?: string };\n HostConfig?: {\n PortBindings?: Record<string, Array<{ HostIp?: string; HostPort?: string }> | null>;\n };\n State: { Running?: boolean; Paused?: boolean; Dead?: boolean; Status?: string };\n NetworkSettings?: {\n Ports?: Record<string, Array<{ HostIp?: string; HostPort?: string }> | null>;\n };\n};\n\nasync function inspectContainer(\n dockerPath: string,\n containerName: string,\n abortSignal: AbortSignal | undefined,\n notFoundAsSandboxError: boolean,\n): Promise<DockerContainerInspection> {\n const result = await runDockerCli([\"container\", \"inspect\", containerName], {\n dockerPath,\n signal: abortSignal,\n });\n if (result.exitCode !== 0) {\n const message = safeDecode(result.stderr);\n if (notFoundAsSandboxError && message.toLowerCase().includes(\"no such\")) {\n throw new DockerSandboxError(`Sandbox does not exist: ${containerName}`, \"sandbox_not_found\");\n }\n throw new DockerSandboxError(\n \"Unable to inspect Docker sandbox.\",\n \"docker_command_failed\",\n result,\n );\n }\n let value: unknown;\n try {\n value = JSON.parse(decodeUtf8(result.stdout));\n } catch (error) {\n throw new DockerSandboxError(\n \"Docker returned invalid container metadata.\",\n \"docker_command_failed\",\n undefined,\n { cause: error },\n );\n }\n if (!Array.isArray(value) || value.length !== 1 || !isInspection(value[0])) {\n throw new DockerSandboxError(\n \"Docker returned invalid container metadata.\",\n \"docker_command_failed\",\n );\n }\n return value[0];\n}\n\nfunction isInspection(value: unknown): value is DockerContainerInspection {\n return isRecord(value) && isRecord(value.Config) && isRecord(value.State);\n}\n\nasync function inspectPublishedPorts(options: {\n dockerPath: string;\n containerName: string;\n ports: readonly number[];\n abortSignal?: AbortSignal | undefined;\n}): Promise<DockerSandboxPublishedPort[]> {\n if (options.ports.length === 0) return [];\n const inspection = await inspectContainer(\n options.dockerPath,\n options.containerName,\n options.abortSignal,\n false,\n );\n const mappings = inspection.NetworkSettings?.Ports ?? {};\n return options.ports.map((containerPort) => {\n const entries = mappings[`${containerPort}/tcp`];\n const entry = entries?.find((candidate) => candidate.HostIp === \"127.0.0.1\");\n const hostPort = Number(entry?.HostPort);\n if (!isPort(hostPort)) {\n throw new DockerSandboxError(`Docker did not publish port: ${containerPort}`, \"port\");\n }\n return { containerPort, host: \"127.0.0.1\", hostPort, protocol: \"tcp\" };\n });\n}\n\nfunction configuredContainerPorts(inspection: DockerContainerInspection): number[] {\n return Object.keys(inspection.HostConfig?.PortBindings ?? {}).flatMap((key) => {\n const match = /^(\\d+)\\/tcp$/.exec(key);\n if (match?.[1] === undefined) return [];\n const value = Number(match[1]);\n return isPort(value) ? [value] : [];\n });\n}\n\nasync function assertCopiedRegularFile(\n temporaryDirectory: string,\n target: string,\n sandboxPath: string,\n): Promise<void> {\n const metadata = await lstat(target);\n if (metadata.isSymbolicLink() || !metadata.isFile()) {\n throw new DockerSandboxError(\n `Sandbox path is not a regular file: ${sandboxPath}`,\n \"invalid_path\",\n );\n }\n const resolvedTarget = await realpath(target);\n const relativeTarget = path.relative(temporaryDirectory, resolvedTarget);\n if (\n relativeTarget === \"\" ||\n relativeTarget === \"..\" ||\n relativeTarget.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativeTarget)\n ) {\n throw new DockerSandboxError(\n `Sandbox file escaped its temporary read boundary: ${sandboxPath}`,\n \"invalid_path\",\n );\n }\n}\n\nasync function removeContainer(dockerPath: string, containerName: string): Promise<void> {\n const result = await runDockerCli([\"rm\", \"-f\", containerName], { dockerPath });\n if (result.exitCode === 0 || safeDecode(result.stderr).toLowerCase().includes(\"no such\")) return;\n throw new DockerSandboxError(\"Unable to remove Docker sandbox.\", \"docker_command_failed\", result);\n}\n\nasync function removeVolume(dockerPath: string, volumeName: string): Promise<void> {\n const result = await runDockerCli([\"volume\", \"rm\", volumeName], { dockerPath });\n if (result.exitCode === 0 || safeDecode(result.stderr).toLowerCase().includes(\"no such\")) return;\n throw new DockerSandboxError(\n \"Unable to remove Docker sandbox volume.\",\n \"docker_command_failed\",\n result,\n );\n}\n\nfunction parseFindEntry(line: string, workdir: string): DockerSandboxFileEntry {\n const [absolutePath, rawType, rawSize] = line.split(\"\\t\");\n if (absolutePath === undefined || rawType === undefined || rawSize === undefined) {\n throw new DockerSandboxError(\"Docker returned invalid file metadata.\", \"docker_command_failed\");\n }\n const relativePath = path.posix.relative(workdir, absolutePath);\n const size = Number(rawSize);\n const type = mapFindType(rawType);\n let entry: DockerSandboxFileEntry = {\n path: normalizeSandboxPath(relativePath),\n type,\n };\n if (type === \"file\" && Number.isSafeInteger(size) && size >= 0) {\n entry = { ...entry, size };\n }\n return entry;\n}\n\nfunction mapFindType(value: string): DockerSandboxFileType {\n if (value === \"f\") return \"file\";\n if (value === \"d\") return \"directory\";\n if (value === \"l\") return \"symlink\";\n return \"other\";\n}\n\nfunction toExecResult(result: Awaited<ReturnType<typeof runDockerCli>>): DockerSandboxExecResult {\n const common = {\n stdout: result.stdout.slice(),\n stderr: result.stderr.slice(),\n durationMs: result.durationMs,\n stdoutTruncated: result.stdoutTruncated,\n stderrTruncated: result.stderrTruncated,\n };\n return result.timedOut\n ? { ...common, status: \"timed_out\" }\n : { ...common, status: \"exited\", exitCode: result.exitCode };\n}\n\nfunction copyWorkspace(workspace: DockerSandboxWorkspace): DockerSandboxWorkspace {\n return workspace.type === \"ephemeral\"\n ? Object.freeze({ type: \"ephemeral\" })\n : Object.freeze({ type: \"docker-volume\", name: workspace.name });\n}\n\nfunction copyNetwork(\n network: CreateDockerSandboxOptions[\"network\"],\n): CreateDockerSandboxOptions[\"network\"] {\n return network.mode === \"none\"\n ? Object.freeze({ mode: \"none\" })\n : Object.freeze({ mode: \"bridge\", ports: Object.freeze([...(network.ports ?? [])]) });\n}\n\nfunction copyStringRecord(\n value: Readonly<Record<string, string>> | undefined,\n name: string,\n): Record<string, string> {\n if (value === undefined) return {};\n if (!isRecord(value)) throw new TypeError(`${name} must be an object.`);\n const copy: Record<string, string> = {};\n for (const [key, item] of Object.entries(value)) {\n if (typeof item !== \"string\") throw new TypeError(`${name}.${key} must be a string.`);\n if (name === \"env\" && !envKeyPattern.test(key))\n throw new TypeError(`Invalid environment variable name: ${key}`);\n copy[key] = item;\n }\n return copy;\n}\n\nfunction requiredLabel(containerLabels: Record<string, string>, name: string): string {\n const value = containerLabels[name];\n if (value === undefined || value.length === 0) invalidInspection(name);\n return value;\n}\n\nfunction parseLabelInteger(\n containerLabels: Record<string, string>,\n name: string,\n positive: boolean,\n): number {\n const value = Number(requiredLabel(containerLabels, name));\n if (!Number.isSafeInteger(value) || (positive ? value <= 0 : value < 0)) invalidInspection(name);\n return value;\n}\n\nfunction invalidInspection(field: string): never {\n throw new DockerSandboxError(`Sandbox metadata is invalid: ${field}`, \"invalid_state\");\n}\n\nfunction validatePorts(ports: readonly number[]): void {\n if (!Array.isArray(ports)) throw new TypeError(\"ports must be an array.\");\n const seen = new Set<number>();\n for (const port of ports) {\n assertPort(port);\n if (seen.has(port)) throw new DockerSandboxError(`Sandbox port is duplicated: ${port}`, \"port\");\n seen.add(port);\n }\n}\n\nfunction assertPort(port: number): void {\n if (!isPort(port))\n throw new DockerSandboxError(\n `Sandbox port must be an integer from 1 to 65535: ${port}`,\n \"port\",\n );\n}\n\nfunction isPort(port: number): boolean {\n return Number.isInteger(port) && port >= 1 && port <= 65_535;\n}\n\nfunction assertSandboxId(id: string): void {\n if (typeof id !== \"string\" || !idPattern.test(id)) {\n throw new TypeError(\n \"Sandbox id must be 1-63 lowercase letters, numbers, dots, underscores, or hyphens.\",\n );\n }\n}\n\nfunction assertDockerVolumeName(name: string): void {\n assertNonEmptyString(name, \"workspace.name\");\n if (name.includes(\",\") || name.includes(\"\\0\"))\n throw new TypeError(\"workspace.name is not a valid Docker volume name.\");\n}\n\nfunction assertNonEmptyString(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0)\n throw new TypeError(`${name} must be a non-empty string.`);\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new RangeError(`${name} must be a positive safe integer.`);\n}\n\nfunction assertNonNegativeSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new RangeError(`${name} must be a non-negative safe integer.`);\n}\n\nfunction invalidState(id: string, state: DockerSandboxState): DockerSandboxError {\n return new DockerSandboxError(`Sandbox ${id} is not running (${state}).`, \"invalid_state\", {\n state,\n });\n}\n\nfunction containerNameFor(id: string): string {\n return `anvia-sandbox-${id}`;\n}\n\nfunction combineSignals(first: AbortSignal | undefined, second: AbortSignal): AbortSignal {\n return first === undefined ? second : AbortSignal.any([first, second]);\n}\n\nasync function waitWithSignal(timeoutMs: number, abortSignal: AbortSignal): Promise<void> {\n abortSignal.throwIfAborted();\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n abortSignal.removeEventListener(\"abort\", abort);\n resolve();\n }, timeoutMs);\n const abort = () => {\n clearTimeout(timeout);\n reject(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nfunction safeDecode(bytes: Uint8Array): string {\n try {\n return decodeUtf8(bytes);\n } catch {\n return \"\";\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { decodeUtf8, runDockerCli } from \"./docker-cli\";\nimport { DockerSandboxError } from \"./errors\";\nimport { containerPath } from \"./path\";\nimport type {\n DockerSandboxProcessInfo,\n DockerSandboxProcessLogs,\n DockerSandboxProcessStartOptions,\n} from \"./types\";\n\nconst processMarkerPrefix = \"ANVIA_PROCESS\";\n// Establish a killable process group and report it before starting the user command. The wrapper\n// waits for a host acknowledgement, so cancelling startup before the marker is accepted can only\n// leave an idle wrapper that exits when Docker closes stdin, never an untracked user process.\nconst processLauncher = [\n 'wrapper=\"$1\"',\n \"shift\",\n // GNU setsid forks when it is already a process-group leader. `-w` keeps that launcher alive\n // until the new session exits, so Docker does not detach from a still-running managed process.\n \"if command -v setsid >/dev/null 2>&1 && setsid -w true >/dev/null 2>&1; then\",\n ' exec setsid -w sh -c \"$wrapper\" \"$@\"',\n \"fi\",\n 'exec sh -c \"$wrapper\" \"$@\"',\n].join(\"\\n\");\n\nconst processWrapper = [\n 'marker=\"$1\"',\n \"shift\",\n \"group=$$\",\n `printf '\\\\036%s:%s:%s\\\\036' \"$marker\" \"$$\" \"$group\"`,\n \"IFS= read -r ready || exit 125\",\n '[ \"$ready\" = \"start\" ] || exit 125',\n '\"$@\" &',\n \"child=$!\",\n \"terminate() {\",\n ' wait \"$child\" 2>/dev/null || true',\n \" exit 143\",\n \"}\",\n \"trap terminate TERM INT\",\n 'wait \"$child\"',\n \"exit $?\",\n].join(\"\\n\");\n\ninterface DockerProcessManagerOptions {\n containerName: string;\n dockerPath: string;\n workdir: string;\n env: Record<string, string>;\n maxOutputBytes: number;\n maxProcesses: number;\n startupTimeoutMs: number;\n}\n\ntype MutableProcessInfo = {\n id: string;\n command: string;\n args: string[];\n cwd?: string;\n status: \"running\" | \"exited\" | \"stopped\";\n exitCode?: number;\n startedAt: string;\n endedAt?: string;\n};\n\ninterface ManagedProcessRecord {\n info: MutableProcessInfo;\n child: ChildProcessWithoutNullStreams;\n stdout: TailOutputCollector;\n stderr: TailOutputCollector;\n markerStart: Buffer;\n markerBuffer: Buffer;\n supervisorPid?: number;\n processGroupId?: number;\n spawnFailed: boolean;\n stopRequested: boolean;\n startResolved: boolean;\n resolveStarted: () => void;\n rejectStarted: (error: unknown) => void;\n started: Promise<void>;\n resolveClosed: () => void;\n closed: Promise<void>;\n}\n\nexport class DockerProcessManager {\n private readonly records = new Map<string, ManagedProcessRecord>();\n private disposed = false;\n\n constructor(private readonly options: DockerProcessManagerOptions) {\n if (!Number.isInteger(options.maxProcesses) || options.maxProcesses < 0) {\n throw processError(\"Sandbox maxProcesses must be a non-negative integer.\");\n }\n if (!Number.isInteger(options.maxOutputBytes) || options.maxOutputBytes < 0) {\n throw processError(\"Sandbox maxOutputBytes must be a non-negative integer.\");\n }\n if (!Number.isInteger(options.startupTimeoutMs) || options.startupTimeoutMs <= 0) {\n throw processError(\"Sandbox process startup timeout must be a positive integer.\");\n }\n }\n\n async start(options: DockerSandboxProcessStartOptions): Promise<DockerSandboxProcessInfo> {\n this.assertActive();\n assertStartOptions(options);\n options.abortSignal?.throwIfAborted();\n await this.pruneCompletedRecords(options.abortSignal);\n\n const trackedCount = this.records.size;\n if (trackedCount >= this.options.maxProcesses) {\n throw processError(\n `Sandbox process limit reached (${trackedCount} >= ${this.options.maxProcesses}).`,\n );\n }\n\n const id = randomUUID();\n const marker = `${processMarkerPrefix}:${id}`;\n const dockerArgs = this.createExecArgs(options, marker);\n const child = spawn(this.options.dockerPath, dockerArgs, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let resolveStarted!: () => void;\n let rejectStarted!: (error: unknown) => void;\n const started = new Promise<void>((resolve, reject) => {\n resolveStarted = resolve;\n rejectStarted = reject;\n });\n let resolveClosed!: () => void;\n const closed = new Promise<void>((resolve) => {\n resolveClosed = resolve;\n });\n\n const info: MutableProcessInfo = {\n id,\n command: options.command,\n args: [...(options.args ?? [])],\n status: \"running\",\n startedAt: new Date().toISOString(),\n };\n if (options.cwd !== undefined) info.cwd = options.cwd;\n\n const record: ManagedProcessRecord = {\n info,\n child,\n stdout: new TailOutputCollector(this.options.maxOutputBytes),\n stderr: new TailOutputCollector(this.options.maxOutputBytes),\n markerStart: Buffer.from(`\\u001e${marker}:`),\n markerBuffer: Buffer.alloc(0),\n spawnFailed: false,\n stopRequested: false,\n startResolved: false,\n resolveStarted,\n rejectStarted,\n started,\n resolveClosed,\n closed,\n };\n this.records.set(id, record);\n this.observe(record);\n\n try {\n await this.waitForStart(record, options.abortSignal);\n record.startResolved = true;\n return copyProcessInfo(record.info);\n } catch (error) {\n if (await this.cleanupFailedStart(record)) this.records.delete(id);\n throw error;\n }\n }\n\n list(): DockerSandboxProcessInfo[] {\n this.assertActive();\n return [...this.records.values()].map((record) => copyProcessInfo(record.info));\n }\n\n logs(processId: string, tailBytes?: number): DockerSandboxProcessLogs {\n this.assertActive();\n const record = this.getRecord(processId);\n const stdout = record.stdout.snapshot(tailBytes);\n const stderr = record.stderr.snapshot(tailBytes);\n return {\n stdout: stdout.bytes,\n stderr: stderr.bytes,\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n };\n }\n\n async stop(\n processId: string,\n gracePeriodMs = 5_000,\n abortSignal?: AbortSignal,\n ): Promise<DockerSandboxProcessInfo> {\n this.assertActive();\n const record = this.getRecord(processId);\n if (!Number.isInteger(gracePeriodMs) || gracePeriodMs < 0) {\n throw processError(\"Process gracePeriodMs must be a non-negative integer.\");\n }\n\n try {\n if (!(await this.terminateRecord(record, gracePeriodMs, abortSignal))) {\n throw processError(`Sandbox process did not stop: ${processId}`);\n }\n } catch (error) {\n if (record.info.status === \"running\") record.stopRequested = false;\n throw error;\n }\n\n return copyProcessInfo(record.info);\n }\n\n async dispose(abortSignal?: AbortSignal): Promise<void> {\n if (this.disposed) return;\n abortSignal?.throwIfAborted();\n\n await Promise.all(\n [...this.records.values()].map(async (record) => {\n if (!(await this.terminateRecord(record, 1_000, abortSignal))) {\n throw processError(`Sandbox process did not stop: ${record.info.id}`);\n }\n }),\n );\n this.disposed = true;\n }\n\n private createExecArgs(options: DockerSandboxProcessStartOptions, marker: string): string[] {\n const args = [\"exec\", \"-i\", \"-w\", containerPath(this.options.workdir, options.cwd ?? \".\")];\n for (const [key, value] of Object.entries({ ...this.options.env, ...options.env })) {\n args.push(\"-e\", `${key}=${value}`);\n }\n args.push(\n this.options.containerName,\n \"sh\",\n \"-c\",\n processLauncher,\n \"anvia-process-launcher\",\n processWrapper,\n \"anvia-managed-process\",\n marker,\n options.command,\n ...(options.args ?? []),\n );\n return args;\n }\n\n private observe(record: ManagedProcessRecord): void {\n record.child.stdout.on(\"data\", (chunk: Buffer) => this.acceptStdout(record, chunk));\n record.child.stderr.on(\"data\", (chunk: Buffer) => record.stderr.accept(chunk));\n\n record.child.on(\"error\", (error) => {\n record.spawnFailed = true;\n const normalized =\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n ? new DockerSandboxError(\"Docker CLI was not found.\", \"docker_unavailable\", undefined, {\n cause: error,\n })\n : error;\n record.rejectStarted(normalized);\n });\n\n record.child.on(\"close\", (code) => {\n if (record.markerBuffer.length > 0) {\n record.stdout.accept(record.markerBuffer);\n record.markerBuffer = Buffer.alloc(0);\n }\n record.info.status = record.stopRequested ? \"stopped\" : \"exited\";\n record.info.exitCode = code ?? 1;\n record.info.endedAt = new Date().toISOString();\n record.rejectStarted(\n processError(`Sandbox process exited before startup completed: ${record.info.id}`),\n );\n record.resolveClosed();\n });\n }\n\n private acceptStdout(record: ManagedProcessRecord, chunk: Buffer): void {\n if (record.supervisorPid !== undefined) {\n record.stdout.accept(chunk);\n return;\n }\n\n record.markerBuffer = Buffer.concat([record.markerBuffer, chunk]);\n const start = record.markerBuffer.indexOf(record.markerStart);\n if (start < 0) {\n const retainedBytes = Math.max(0, record.markerStart.length - 1);\n if (record.markerBuffer.length > retainedBytes) {\n const split = record.markerBuffer.length - retainedBytes;\n record.stdout.accept(record.markerBuffer.subarray(0, split));\n record.markerBuffer = record.markerBuffer.subarray(split);\n }\n return;\n }\n\n const end = record.markerBuffer.indexOf(0x1e, start + record.markerStart.length);\n if (end < 0) {\n if (start > 0) {\n record.stdout.accept(record.markerBuffer.subarray(0, start));\n record.markerBuffer = record.markerBuffer.subarray(start);\n }\n return;\n }\n\n const rawPids = decodeUtf8(\n record.markerBuffer.subarray(start + record.markerStart.length, end),\n ).split(\":\");\n const supervisorPid = Number(rawPids[0]);\n const processGroupId = Number(rawPids[1]);\n if (!isProcessId(supervisorPid) || !isProcessId(processGroupId) || rawPids.length !== 2) {\n record.rejectStarted(processError(\"Sandbox process returned invalid process IDs.\"));\n return;\n }\n\n if (start > 0) record.stdout.accept(record.markerBuffer.subarray(0, start));\n if (end + 1 < record.markerBuffer.length) {\n record.stdout.accept(record.markerBuffer.subarray(end + 1));\n }\n record.markerBuffer = Buffer.alloc(0);\n record.supervisorPid = supervisorPid;\n record.processGroupId = processGroupId;\n // Keep stdin attached for the lifetime of `docker exec -i`. Closing it makes the Docker CLI\n // return successfully while the in-container process keeps running, which would orphan the\n // process from status, logs, and lifecycle management.\n record.child.stdin.write(\"start\\n\");\n record.resolveStarted();\n }\n\n private async waitForStart(\n record: ManagedProcessRecord,\n abortSignal: AbortSignal | undefined,\n ): Promise<void> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abort: (() => void) | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n reject(new DockerSandboxError(\"Starting sandbox process timed out.\", \"timeout\"));\n }, this.options.startupTimeoutMs);\n timeout.unref?.();\n });\n\n try {\n const abortPromise = new Promise<never>((_, reject) => {\n if (abortSignal === undefined) return;\n abort = () => reject(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n if (abortSignal.aborted) abort();\n else abortSignal.addEventListener(\"abort\", abort, { once: true });\n });\n await Promise.race([record.started, timeoutPromise, abortPromise]);\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n if (abort !== undefined) abortSignal?.removeEventListener(\"abort\", abort);\n }\n }\n\n private async cleanupFailedStart(record: ManagedProcessRecord): Promise<boolean> {\n record.stopRequested = true;\n if (record.processGroupId === undefined && record.info.status === \"running\") {\n record.child.stdin.destroy();\n record.child.kill(\"SIGKILL\");\n await waitForPromise(record.closed, 1_000);\n }\n\n try {\n return await this.terminateRecord(record, 1_000);\n } catch {\n return false;\n }\n }\n\n private async terminateRecord(\n record: ManagedProcessRecord,\n gracePeriodMs: number,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n abortSignal?.throwIfAborted();\n record.stopRequested = true;\n\n if (record.processGroupId === undefined) {\n if (record.info.status === \"running\") {\n await waitForPromise(record.closed, Math.min(gracePeriodMs, 250), abortSignal);\n }\n if (record.processGroupId === undefined) {\n return record.info.status !== \"running\";\n }\n }\n\n if (!(await this.isProcessGroupRunning(record, abortSignal))) {\n return this.finishAfterGroupExit(record, abortSignal);\n }\n\n await this.signal(record, \"TERM\", abortSignal);\n if (await this.waitForRecordExit(record, gracePeriodMs, abortSignal)) return true;\n\n await this.signal(record, \"KILL\", abortSignal);\n if (await this.waitForRecordExit(record, 1_000, abortSignal)) return true;\n\n return false;\n }\n\n private async waitForRecordExit(\n record: ManagedProcessRecord,\n timeoutMs: number,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n abortSignal?.throwIfAborted();\n if (!(await this.isProcessGroupRunning(record, abortSignal))) {\n return this.finishAfterGroupExit(record, abortSignal);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) return false;\n const intervalMs = Math.min(50, remainingMs);\n if (record.info.status === \"running\") {\n await waitForPromise(record.closed, intervalMs, abortSignal);\n } else {\n await waitForDelay(intervalMs, abortSignal);\n }\n }\n }\n\n private async finishAfterGroupExit(\n record: ManagedProcessRecord,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n if (record.info.status !== \"running\") return true;\n record.child.kill(\"SIGKILL\");\n return waitForPromise(record.closed, 1_000, abortSignal);\n }\n\n private async isProcessGroupRunning(\n record: ManagedProcessRecord,\n abortSignal?: AbortSignal,\n ): Promise<boolean> {\n if (record.processGroupId === undefined) return false;\n const result = await runDockerCli(\n [\n \"exec\",\n this.options.containerName,\n \"sh\",\n \"-c\",\n 'kill -0 \"-$1\" 2>/dev/null',\n \"anvia-process-group-check\",\n `${record.processGroupId}`,\n ],\n {\n dockerPath: this.options.dockerPath,\n timeoutMs: 5_000,\n maxOutputBytes: this.options.maxOutputBytes,\n signal: abortSignal,\n },\n );\n return result.exitCode === 0;\n }\n\n private async signal(\n record: ManagedProcessRecord,\n dockerSignal: \"TERM\" | \"KILL\",\n abortSignal?: AbortSignal,\n ): Promise<void> {\n if (record.processGroupId === undefined) return;\n const result = await runDockerCli(\n [\n \"exec\",\n this.options.containerName,\n \"sh\",\n \"-c\",\n 'kill \"-$2\" \"-$1\" 2>/dev/null || ! kill -0 \"-$1\" 2>/dev/null',\n \"anvia-process-signal\",\n `${record.processGroupId}`,\n dockerSignal,\n ],\n {\n dockerPath: this.options.dockerPath,\n timeoutMs: 5_000,\n maxOutputBytes: this.options.maxOutputBytes,\n signal: abortSignal,\n },\n );\n if (result.exitCode !== 0) {\n throw new DockerSandboxError(\n `Unable to stop sandbox process: ${record.info.id}`,\n \"docker_command_failed\",\n result,\n );\n }\n }\n\n private getRecord(processId: string): ManagedProcessRecord {\n const record = this.records.get(processId);\n if (record === undefined) {\n throw processError(`Unknown sandbox process: ${processId}`);\n }\n return record;\n }\n\n private async pruneCompletedRecords(abortSignal?: AbortSignal): Promise<void> {\n for (const [id, record] of this.records) {\n if (this.records.size < this.options.maxProcesses) return;\n const cleanupConfirmed =\n record.processGroupId === undefined\n ? record.spawnFailed\n : !(await this.isProcessGroupRunning(record, abortSignal));\n if (record.info.status !== \"running\" && cleanupConfirmed) {\n this.records.delete(id);\n }\n }\n }\n\n private assertActive(): void {\n if (this.disposed) {\n throw processError(\"Sandbox process manager has been disposed.\");\n }\n }\n}\n\nclass TailOutputCollector {\n private chunks: Buffer[] = [];\n private length = 0;\n private didTruncate = false;\n\n constructor(private readonly maxBytes: number) {}\n\n accept(chunk: Buffer): void {\n if (chunk.length === 0) return;\n if (this.maxBytes <= 0) {\n this.didTruncate = true;\n return;\n }\n\n if (chunk.length >= this.maxBytes) {\n this.chunks = [chunk.subarray(chunk.length - this.maxBytes)];\n this.length = this.maxBytes;\n this.didTruncate = true;\n return;\n }\n\n this.chunks.push(chunk);\n this.length += chunk.length;\n while (this.length > this.maxBytes) {\n const first = this.chunks[0];\n if (first === undefined) break;\n const overflow = this.length - this.maxBytes;\n if (first.length <= overflow) {\n this.chunks.shift();\n this.length -= first.length;\n } else {\n this.chunks[0] = first.subarray(overflow);\n this.length -= overflow;\n }\n this.didTruncate = true;\n }\n }\n\n snapshot(tailBytes?: number): { bytes: Uint8Array; truncated: boolean } {\n if (tailBytes !== undefined && (!Number.isInteger(tailBytes) || tailBytes < 0)) {\n throw processError(\"Process tailBytes must be a non-negative integer.\");\n }\n const bytes = Buffer.concat(this.chunks, this.length);\n const selected =\n tailBytes === 0\n ? Buffer.alloc(0)\n : tailBytes === undefined || bytes.length <= tailBytes\n ? bytes\n : bytes.subarray(bytes.length - tailBytes);\n return {\n bytes: new Uint8Array(selected.buffer, selected.byteOffset, selected.byteLength).slice(),\n truncated: this.didTruncate || selected.length < bytes.length,\n };\n }\n}\n\nfunction processError(message: string): DockerSandboxError {\n return new DockerSandboxError(message, \"process\");\n}\n\nfunction assertStartOptions(options: DockerSandboxProcessStartOptions): void {\n if (options.command.trim().length === 0) {\n throw processError(\"Sandbox process command cannot be empty.\");\n }\n}\n\nfunction isProcessId(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\nfunction copyProcessInfo(info: DockerSandboxProcessInfo): DockerSandboxProcessInfo {\n let copy: DockerSandboxProcessInfo = {\n id: info.id,\n command: info.command,\n args: [...info.args],\n status: info.status,\n startedAt: info.startedAt,\n };\n if (info.cwd !== undefined) copy = { ...copy, cwd: info.cwd };\n if (info.exitCode !== undefined) copy = { ...copy, exitCode: info.exitCode };\n if (info.endedAt !== undefined) copy = { ...copy, endedAt: info.endedAt };\n return copy;\n}\n\nasync function waitForPromise(\n promise: Promise<void>,\n timeoutMs: number,\n abortSignal?: AbortSignal,\n): Promise<boolean> {\n abortSignal?.throwIfAborted();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abort: (() => void) | undefined;\n try {\n return await Promise.race([\n promise.then(() => true),\n new Promise<boolean>((resolve) => {\n timeout = setTimeout(() => resolve(false), timeoutMs);\n timeout.unref?.();\n }),\n new Promise<boolean>((_, reject) => {\n if (abortSignal === undefined) return;\n abort = () => reject(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n if (abortSignal.aborted) abort();\n else abortSignal.addEventListener(\"abort\", abort, { once: true });\n }),\n ]);\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n if (abort !== undefined) abortSignal?.removeEventListener(\"abort\", abort);\n }\n}\n\nasync function waitForDelay(timeoutMs: number, abortSignal?: AbortSignal): Promise<void> {\n await waitForPromise(\n new Promise<void>((resolve) => {\n const timeout = setTimeout(resolve, timeoutMs);\n timeout.unref?.();\n }),\n timeoutMs,\n abortSignal,\n );\n}\n","import path from \"node:path\";\nimport { DockerSandboxError } from \"./errors\";\n\nexport function normalizeSandboxPath(input: string, options: { allowRoot?: boolean } = {}): string {\n if (input.length === 0) {\n throw new DockerSandboxError(\"Sandbox path cannot be empty.\", \"invalid_path\");\n }\n\n if (input.includes(\"\\0\")) {\n throw new DockerSandboxError(\"Sandbox path cannot contain null bytes.\", \"invalid_path\");\n }\n\n const normalized = path.posix.normalize(input.replaceAll(\"\\\\\", \"/\"));\n\n if (path.posix.isAbsolute(normalized)) {\n throw new DockerSandboxError(`Sandbox path must be relative: ${input}`, \"invalid_path\");\n }\n\n if (normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new DockerSandboxError(\n `Sandbox path cannot leave the workspace: ${input}`,\n \"invalid_path\",\n );\n }\n\n if (normalized === \".\" && options.allowRoot !== true) {\n throw new DockerSandboxError(\n \"Sandbox path must refer to a file or directory inside the workspace.\",\n \"invalid_path\",\n );\n }\n\n return normalized;\n}\n\nexport function containerPath(workdir: string, relativePath: string): string {\n const normalizedWorkdir = path.posix.normalize(workdir);\n const normalizedPath = normalizeSandboxPath(relativePath, { allowRoot: true });\n return normalizedPath === \".\"\n ? normalizedWorkdir\n : path.posix.join(normalizedWorkdir, normalizedPath);\n}\n\nexport function parentSandboxPath(relativePath: string): string {\n const normalized = normalizeSandboxPath(relativePath);\n const parent = path.posix.dirname(normalized);\n return parent === \".\" ? \".\" : parent;\n}\n","import type { DockerSandboxTextFilePage } from \"./types\";\n\ninterface CreateTextFilePageOptions {\n startLine: number;\n lineCount: number;\n maxBytes: number;\n contentStartLine?: number;\n}\n\nexport function createTextFilePage(\n text: string,\n options: CreateTextFilePageOptions,\n): DockerSandboxTextFilePage {\n const contentStartLine = options.contentStartLine ?? 1;\n const relativeStart = Math.max(0, options.startLine - contentStartLine);\n const lines = splitLines(text).slice(relativeStart, relativeStart + options.lineCount + 1);\n const hasMoreLines = lines.length > options.lineCount;\n const selectedLines = lines.slice(0, options.lineCount);\n const selectedContent = selectedLines.join(\"\");\n const selectedBytes = Buffer.from(selectedContent);\n\n if (selectedBytes.byteLength > options.maxBytes) {\n const content = decodeCompleteUtf8(selectedBytes.subarray(0, options.maxBytes));\n const lineBreaks = countLineBreaks(content);\n const endedAtLineBoundary = content.endsWith(\"\\n\");\n return {\n content,\n startLine: options.startLine,\n endLine:\n content.length === 0\n ? null\n : options.startLine + lineBreaks - (endedAtLineBoundary ? 1 : 0),\n nextStartLine: endedAtLineBoundary ? options.startLine + lineBreaks : null,\n truncated: true,\n truncatedBy: \"bytes\",\n };\n }\n\n return {\n content: selectedContent,\n startLine: options.startLine,\n endLine: selectedLines.length === 0 ? null : options.startLine + selectedLines.length - 1,\n nextStartLine: hasMoreLines ? options.startLine + selectedLines.length : null,\n truncated: hasMoreLines,\n truncatedBy: hasMoreLines ? \"lines\" : null,\n };\n}\n\nfunction splitLines(text: string): string[] {\n return text.match(/[^\\n]*\\n|[^\\n]+$/g) ?? [];\n}\n\nfunction countLineBreaks(text: string): number {\n let count = 0;\n for (const character of text) {\n if (character === \"\\n\") count += 1;\n }\n return count;\n}\n\nfunction decodeCompleteUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes, { stream: true });\n}\n","import { type AnyTool, createTool } from \"@anvia/core/tool\";\nimport { z } from \"zod\";\nimport { decodeUtf8 } from \"./docker-cli\";\nimport { DockerSandboxError } from \"./errors\";\nimport type {\n CreateDockerSandboxToolsOptions,\n DockerSandboxCommandPolicy,\n DockerSandboxExecOptions,\n DockerSandboxExecResult,\n DockerSandboxProcessInfo,\n DockerSandboxRuntime,\n DockerSandboxToolName,\n} from \"./types\";\n\nconst allToolNames = [\n \"exec_command\",\n \"read_file\",\n \"write_file\",\n \"list_files\",\n \"list_ports\",\n \"start_process\",\n \"list_processes\",\n \"read_process_logs\",\n \"stop_process\",\n \"wait_for_port\",\n] as const satisfies readonly DockerSandboxToolName[];\n\nconst execCommandInput = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n timeoutMs: z.number().int().positive().max(300_000).optional(),\n input: z.string().optional(),\n});\n\nconst execResultOutput = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"exited\"),\n exitCode: z.number().int(),\n stdout: z.string(),\n stderr: z.string(),\n durationMs: z.number().nonnegative(),\n stdoutTruncated: z.boolean(),\n stderrTruncated: z.boolean(),\n }),\n z.object({\n status: z.literal(\"timed_out\"),\n stdout: z.string(),\n stderr: z.string(),\n durationMs: z.number().nonnegative(),\n stdoutTruncated: z.boolean(),\n stderrTruncated: z.boolean(),\n }),\n]);\n\nconst readFileInput = z.object({\n path: z.string().min(1),\n startLine: z.number().int().positive().optional(),\n lineCount: z.number().int().positive().max(10_000).optional(),\n});\n\nconst readFileOutput = z.object({\n content: z.string(),\n startLine: z.number().int().positive(),\n endLine: z.number().int().positive().nullable(),\n nextStartLine: z.number().int().positive().nullable(),\n truncated: z.boolean(),\n truncatedBy: z.enum([\"lines\", \"bytes\"]).nullable(),\n});\n\nconst writeFileInput = z.object({\n path: z.string().min(1),\n content: z.string(),\n});\n\nconst writeFileOutput = z.object({\n path: z.string(),\n bytesWritten: z.number().int().nonnegative(),\n});\n\nconst listFilesInput = z.object({ path: z.string().optional() });\nconst fileEntryOutput = z.object({\n path: z.string(),\n type: z.enum([\"file\", \"directory\", \"symlink\", \"other\"]),\n size: z.number().int().nonnegative().optional(),\n});\nconst listFilesOutput = z.object({\n path: z.string(),\n entries: z.array(fileEntryOutput),\n});\n\nconst emptyInput = z.object({});\nconst publishedPortOutput = z.object({\n containerPort: z.number().int(),\n host: z.literal(\"127.0.0.1\"),\n hostPort: z.number().int(),\n protocol: z.literal(\"tcp\"),\n});\nconst listPortsOutput = z.object({ ports: z.array(publishedPortOutput) });\n\nconst startProcessInput = z.object({\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\nconst processInfoOutput = z.object({\n id: z.string(),\n command: z.string(),\n args: z.array(z.string()),\n cwd: z.string().optional(),\n status: z.enum([\"running\", \"exited\", \"stopped\"]),\n exitCode: z.number().int().optional(),\n startedAt: z.string(),\n endedAt: z.string().optional(),\n});\nconst listProcessesOutput = z.object({ processes: z.array(processInfoOutput) });\n\nconst processIdInput = z.object({ processId: z.string().min(1) });\nconst readProcessLogsInput = processIdInput.extend({\n tailBytes: z\n .number()\n .int()\n .nonnegative()\n .max(1024 * 1024)\n .optional(),\n});\nconst processLogsOutput = z.object({\n processId: z.string(),\n stdout: z.string(),\n stderr: z.string(),\n stdoutTruncated: z.boolean(),\n stderrTruncated: z.boolean(),\n});\n\nconst waitForPortInput = z.object({\n containerPort: z.number().int().min(1).max(65_535),\n timeoutMs: z.number().int().positive().max(300_000).optional(),\n});\nconst waitForPortOutput = z.object({ port: publishedPortOutput });\n\nconst defaultReadFileLineCount = 500;\nconst defaultReadFileMaxLineCount = 2_000;\nconst defaultReadFileMaxBytes = 64 * 1024;\nconst maxToolReadFileLines = 10_000;\nconst maxToolBytes = 1024 * 1024;\nconst maxToolTimeoutMs = 300_000;\n\nexport function createDockerSandboxTools(\n options: CreateDockerSandboxToolsOptions,\n): readonly AnyTool[] {\n validateFactoryOptions(options);\n options = snapshotFactoryOptions(options);\n const selected = new Set(options.tools);\n const tools: AnyTool[] = [];\n\n for (const name of options.tools) {\n if (name === \"exec_command\") tools.push(createExecCommandTool(options));\n else if (name === \"read_file\") tools.push(createReadFileTool(options));\n else if (name === \"write_file\") tools.push(createWriteFileTool(options));\n else if (name === \"list_files\") tools.push(createListFilesTool(options.sandbox));\n else if (name === \"list_ports\") tools.push(createListPortsTool(options.sandbox));\n else if (name === \"start_process\") tools.push(createStartProcessTool(options));\n else if (name === \"list_processes\") tools.push(createListProcessesTool(options.sandbox));\n else if (name === \"read_process_logs\") tools.push(createReadProcessLogsTool(options));\n else if (name === \"stop_process\") tools.push(createStopProcessTool(options));\n else if (name === \"wait_for_port\") tools.push(createWaitForPortTool(options));\n }\n\n if (tools.length !== selected.size) {\n throw toolPolicyError(\"Sandbox tool selection contains an unsupported tool name.\");\n }\n return Object.freeze(tools);\n}\n\nfunction createExecCommandTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"exec_command\",\n description: \"Run one executable inside the sandbox with structured arguments.\",\n inputSchema: execCommandInput,\n outputSchema: execResultOutput,\n execute: async ({ command, args, cwd, env, timeoutMs, input }, context) => {\n assertCommandAllowed(command, options.exec?.commands);\n const effectiveTimeoutMs = timeoutMs ?? options.exec?.defaultTimeoutMs;\n assertTimeoutAllowed(effectiveTimeoutMs, options.exec?.maxTimeoutMs);\n let execOptions: DockerSandboxExecOptions = {\n command,\n };\n if (args !== undefined) execOptions = { ...execOptions, args };\n if (cwd !== undefined) execOptions = { ...execOptions, cwd };\n if (env !== undefined) execOptions = { ...execOptions, env };\n if (effectiveTimeoutMs !== undefined) {\n execOptions = { ...execOptions, timeoutMs: effectiveTimeoutMs };\n }\n if (input !== undefined) execOptions = { ...execOptions, input };\n if (context.abortSignal !== undefined) {\n execOptions = { ...execOptions, abortSignal: context.abortSignal };\n }\n return serializeExecResult(await options.sandbox.exec(execOptions));\n },\n });\n}\n\nfunction createReadFileTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n const limits = resolveReadFileLimits(options);\n return createTool({\n name: \"read_file\",\n description: \"Read a bounded page of a UTF-8 text file from the sandbox workspace.\",\n inputSchema: readFileInput,\n outputSchema: readFileOutput,\n execute: async ({ path, startLine, lineCount }, context) => {\n const effectiveLineCount = lineCount ?? limits.defaultLineCount;\n if (effectiveLineCount > limits.maxLineCount) {\n throw toolPolicyError(\n `File read line count exceeds policy (${effectiveLineCount} > ${limits.maxLineCount}).`,\n );\n }\n let readOptions: Parameters<typeof options.sandbox.readTextFilePage>[0] = {\n path,\n startLine: startLine ?? 1,\n lineCount: effectiveLineCount,\n maxBytes: limits.maxBytes,\n };\n if (context.abortSignal !== undefined) {\n readOptions = { ...readOptions, abortSignal: context.abortSignal };\n }\n return options.sandbox.readTextFilePage(readOptions);\n },\n });\n}\n\nfunction createWriteFileTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"write_file\",\n description: \"Write a complete UTF-8 text file inside the sandbox workspace.\",\n inputSchema: writeFileInput,\n outputSchema: writeFileOutput,\n execute: async ({ path, content }, context) => {\n const bytesWritten = new TextEncoder().encode(content).byteLength;\n const maxBytes = options.writeFile?.maxBytes;\n if (maxBytes !== undefined && bytesWritten > maxBytes) {\n throw toolPolicyError(`File content exceeds policy (${bytesWritten} > ${maxBytes}).`);\n }\n let writeOptions: Parameters<typeof options.sandbox.writeTextFile>[0] = {\n path,\n text: content,\n };\n if (context.abortSignal !== undefined) {\n writeOptions = { ...writeOptions, abortSignal: context.abortSignal };\n }\n await options.sandbox.writeTextFile(writeOptions);\n return { path, bytesWritten };\n },\n });\n}\n\nfunction createListFilesTool(sandbox: DockerSandboxRuntime): AnyTool {\n return createTool({\n name: \"list_files\",\n description: \"List direct children of a directory in the sandbox workspace.\",\n inputSchema: listFilesInput,\n outputSchema: listFilesOutput,\n execute: async ({ path }, context) => {\n let listOptions: Parameters<typeof sandbox.listFiles>[0] = {};\n if (path !== undefined) listOptions = { ...listOptions, path };\n if (context.abortSignal !== undefined) {\n listOptions = { ...listOptions, abortSignal: context.abortSignal };\n }\n return { path: path ?? \".\", entries: [...(await sandbox.listFiles(listOptions))] };\n },\n });\n}\n\nfunction createListPortsTool(sandbox: DockerSandboxRuntime): AnyTool {\n return createTool({\n name: \"list_ports\",\n description: \"List explicitly published localhost TCP ports for the sandbox.\",\n inputSchema: emptyInput,\n outputSchema: listPortsOutput,\n execute: async () => ({ ports: [...sandbox.publishedPorts] }),\n });\n}\n\nfunction createStartProcessTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"start_process\",\n description: \"Start a managed long-running process inside the sandbox.\",\n inputSchema: startProcessInput,\n outputSchema: processInfoOutput,\n execute: async ({ command, args, cwd, env }, context) => {\n assertCommandAllowed(command, options.exec?.commands);\n let startOptions: Parameters<typeof options.sandbox.startProcess>[0] = { command };\n if (args !== undefined) startOptions = { ...startOptions, args };\n if (cwd !== undefined) startOptions = { ...startOptions, cwd };\n if (env !== undefined) startOptions = { ...startOptions, env };\n if (context.abortSignal !== undefined) {\n startOptions = { ...startOptions, abortSignal: context.abortSignal };\n }\n return serializeProcessInfo(await options.sandbox.startProcess(startOptions));\n },\n });\n}\n\nfunction createListProcessesTool(sandbox: DockerSandboxRuntime): AnyTool {\n return createTool({\n name: \"list_processes\",\n description: \"List processes managed by this live sandbox handle.\",\n inputSchema: emptyInput,\n outputSchema: listProcessesOutput,\n execute: async (_, context) => ({\n processes: (\n await sandbox.listProcesses(\n context.abortSignal === undefined ? {} : { abortSignal: context.abortSignal },\n )\n ).map(serializeProcessInfo),\n }),\n });\n}\n\nfunction createReadProcessLogsTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n const maxLogBytes = options.process?.maxLogBytes ?? 64 * 1024;\n return createTool({\n name: \"read_process_logs\",\n description: \"Read bounded UTF-8 output from a managed sandbox process.\",\n inputSchema: readProcessLogsInput,\n outputSchema: processLogsOutput,\n execute: async ({ processId, tailBytes }, context) => {\n const effectiveTailBytes = tailBytes ?? maxLogBytes;\n if (effectiveTailBytes > maxLogBytes) {\n throw toolPolicyError(\n `Process log request exceeds policy (${effectiveTailBytes} > ${maxLogBytes}).`,\n );\n }\n let readOptions: Parameters<typeof options.sandbox.readProcessLogs>[0] = {\n processId,\n tailBytes: effectiveTailBytes,\n };\n if (context.abortSignal !== undefined) {\n readOptions = { ...readOptions, abortSignal: context.abortSignal };\n }\n const logs = await options.sandbox.readProcessLogs(readOptions);\n return {\n processId,\n stdout: decodeUtf8(logs.stdout),\n stderr: decodeUtf8(logs.stderr),\n stdoutTruncated: logs.stdoutTruncated,\n stderrTruncated: logs.stderrTruncated,\n };\n },\n });\n}\n\nfunction createStopProcessTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"stop_process\",\n description: \"Stop a process managed by this live sandbox handle.\",\n inputSchema: processIdInput,\n outputSchema: processInfoOutput,\n execute: async ({ processId }, context) => {\n let stopOptions: Parameters<typeof options.sandbox.stopProcess>[0] = {\n processId,\n gracePeriodMs: options.process?.stopGracePeriodMs ?? 5_000,\n };\n if (context.abortSignal !== undefined) {\n stopOptions = { ...stopOptions, abortSignal: context.abortSignal };\n }\n return serializeProcessInfo(await options.sandbox.stopProcess(stopOptions));\n },\n });\n}\n\nfunction createWaitForPortTool(options: CreateDockerSandboxToolsOptions): AnyTool {\n return createTool({\n name: \"wait_for_port\",\n description: \"Wait until an explicitly published sandbox TCP port is listening.\",\n inputSchema: waitForPortInput,\n outputSchema: waitForPortOutput,\n execute: async ({ containerPort, timeoutMs }, context) => {\n const effectiveTimeoutMs = timeoutMs ?? options.process?.defaultWaitTimeoutMs ?? 30_000;\n const maxWaitTimeoutMs = options.process?.maxWaitTimeoutMs ?? maxToolTimeoutMs;\n if (effectiveTimeoutMs > maxWaitTimeoutMs) {\n throw toolPolicyError(\n `Port wait timeout exceeds policy (${effectiveTimeoutMs} > ${maxWaitTimeoutMs}).`,\n );\n }\n let waitOptions: Parameters<typeof options.sandbox.waitForPort>[0] = {\n containerPort,\n timeoutMs: effectiveTimeoutMs,\n };\n if (context.abortSignal !== undefined) {\n waitOptions = { ...waitOptions, abortSignal: context.abortSignal };\n }\n return { port: await options.sandbox.waitForPort(waitOptions) };\n },\n });\n}\n\nfunction serializeExecResult(result: DockerSandboxExecResult) {\n const output = {\n status: result.status,\n stdout: decodeUtf8(result.stdout),\n stderr: decodeUtf8(result.stderr),\n durationMs: result.durationMs,\n stdoutTruncated: result.stdoutTruncated,\n stderrTruncated: result.stderrTruncated,\n };\n return result.status === \"exited\"\n ? { ...output, status: \"exited\" as const, exitCode: result.exitCode }\n : { ...output, status: \"timed_out\" as const };\n}\n\nfunction serializeProcessInfo(\n process: DockerSandboxProcessInfo,\n): z.infer<typeof processInfoOutput> {\n let serialized: z.infer<typeof processInfoOutput> = {\n id: process.id,\n command: process.command,\n args: [...process.args],\n status: process.status,\n startedAt: process.startedAt,\n };\n if (process.cwd !== undefined) serialized = { ...serialized, cwd: process.cwd };\n if (process.exitCode !== undefined) serialized = { ...serialized, exitCode: process.exitCode };\n if (process.endedAt !== undefined) serialized = { ...serialized, endedAt: process.endedAt };\n return serialized;\n}\n\nfunction validateFactoryOptions(options: CreateDockerSandboxToolsOptions): void {\n if (!isRecord(options)) {\n throw new TypeError(\"options must be an object.\");\n }\n if (!isDockerSandboxRuntime(options.sandbox)) {\n throw new TypeError(\"sandbox must be a DockerSandboxRuntime.\");\n }\n if (!Array.isArray(options.tools) || options.tools.length === 0) {\n throw new TypeError(\"tools must be a non-empty array.\");\n }\n const known = new Set<string>(allToolNames);\n const seen = new Set<string>();\n for (const name of options.tools as readonly unknown[]) {\n if (typeof name !== \"string\" || !known.has(name)) {\n throw new TypeError(\"tools contains an unsupported sandbox tool name.\");\n }\n if (seen.has(name)) throw new TypeError(`tools contains a duplicate: ${name}`);\n seen.add(name);\n }\n for (const [name, policy] of [\n [\"exec\", options.exec],\n [\"readFile\", options.readFile],\n [\"writeFile\", options.writeFile],\n [\"process\", options.process],\n ] as const) {\n if (policy !== undefined && !isRecord(policy)) {\n throw new TypeError(`${name} must be an object.`);\n }\n }\n validateCommandPolicy(options.exec?.commands);\n assertOptionalPositiveInteger(options.exec?.defaultTimeoutMs, \"exec.defaultTimeoutMs\");\n assertOptionalPositiveInteger(options.exec?.maxTimeoutMs, \"exec.maxTimeoutMs\");\n if (\n (options.exec?.defaultTimeoutMs ?? 0) > maxToolTimeoutMs ||\n (options.exec?.maxTimeoutMs ?? 0) > maxToolTimeoutMs\n ) {\n throw toolPolicyError(`Sandbox tool command timeouts cannot exceed ${maxToolTimeoutMs}.`);\n }\n if (\n options.exec?.defaultTimeoutMs !== undefined &&\n options.exec.maxTimeoutMs !== undefined &&\n options.exec.defaultTimeoutMs > options.exec.maxTimeoutMs\n ) {\n throw toolPolicyError(\"exec.defaultTimeoutMs cannot exceed exec.maxTimeoutMs.\");\n }\n assertOptionalBoundedPositiveInteger(options.readFile?.maxBytes, \"readFile.maxBytes\");\n assertOptionalPositiveInteger(options.readFile?.defaultLineCount, \"readFile.defaultLineCount\");\n assertOptionalPositiveInteger(options.readFile?.maxLineCount, \"readFile.maxLineCount\");\n assertOptionalBoundedNonNegativeInteger(options.writeFile?.maxBytes, \"writeFile.maxBytes\");\n assertOptionalBoundedNonNegativeInteger(options.process?.maxLogBytes, \"process.maxLogBytes\");\n assertOptionalPositiveInteger(\n options.process?.defaultWaitTimeoutMs,\n \"process.defaultWaitTimeoutMs\",\n );\n assertOptionalPositiveInteger(options.process?.maxWaitTimeoutMs, \"process.maxWaitTimeoutMs\");\n assertOptionalNonNegativeInteger(options.process?.stopGracePeriodMs, \"process.stopGracePeriodMs\");\n const defaultWaitTimeoutMs = options.process?.defaultWaitTimeoutMs;\n const maxWaitTimeoutMs = options.process?.maxWaitTimeoutMs ?? maxToolTimeoutMs;\n if (maxWaitTimeoutMs > maxToolTimeoutMs) {\n throw toolPolicyError(`process.maxWaitTimeoutMs cannot exceed ${maxToolTimeoutMs}.`);\n }\n if (defaultWaitTimeoutMs !== undefined && defaultWaitTimeoutMs > maxWaitTimeoutMs) {\n throw toolPolicyError(\"process.defaultWaitTimeoutMs cannot exceed process.maxWaitTimeoutMs.\");\n }\n}\n\nfunction snapshotFactoryOptions(\n options: CreateDockerSandboxToolsOptions,\n): CreateDockerSandboxToolsOptions {\n const toolNames = Object.freeze([...options.tools]) as unknown as readonly [\n DockerSandboxToolName,\n ...DockerSandboxToolName[],\n ];\n const commands =\n options.exec?.commands === undefined\n ? undefined\n : Object.freeze({\n mode: options.exec.commands.mode,\n values: Object.freeze([...options.exec.commands.values]),\n });\n let snapshot: CreateDockerSandboxToolsOptions = {\n sandbox: options.sandbox,\n tools: toolNames,\n };\n if (options.exec !== undefined) {\n let exec = { ...options.exec };\n if (commands !== undefined) exec = { ...exec, commands };\n snapshot = { ...snapshot, exec: Object.freeze(exec) };\n }\n if (options.readFile !== undefined) {\n snapshot = { ...snapshot, readFile: Object.freeze({ ...options.readFile }) };\n }\n if (options.writeFile !== undefined) {\n snapshot = { ...snapshot, writeFile: Object.freeze({ ...options.writeFile }) };\n }\n if (options.process !== undefined) {\n snapshot = { ...snapshot, process: Object.freeze({ ...options.process }) };\n }\n return Object.freeze(snapshot);\n}\n\nfunction validateCommandPolicy(policy: DockerSandboxCommandPolicy | undefined): void {\n if (policy === undefined) return;\n if (!isRecord(policy)) throw toolPolicyError(\"exec.commands must be an object.\");\n if (policy.mode !== \"allow\" && policy.mode !== \"block\") {\n throw toolPolicyError(\"exec.commands must use mode allow or block.\");\n }\n if (!Array.isArray(policy.values))\n throw toolPolicyError(\"exec.commands.values must be an array.\");\n const seen = new Set<string>();\n for (const value of policy.values as readonly unknown[]) {\n if (typeof value !== \"string\" || value.length === 0) {\n throw toolPolicyError(\"exec.commands.values must contain non-empty strings.\");\n }\n if (seen.has(value))\n throw toolPolicyError(`exec.commands.values contains a duplicate: ${value}`);\n seen.add(value);\n }\n}\n\nfunction assertCommandAllowed(\n command: string,\n policy: DockerSandboxCommandPolicy | undefined,\n): void {\n if (policy === undefined) return;\n const included = policy.values.includes(command);\n if ((policy.mode === \"allow\" && !included) || (policy.mode === \"block\" && included)) {\n throw toolPolicyError(`Command is rejected by sandbox tool policy: ${command}`);\n }\n}\n\nfunction assertTimeoutAllowed(timeoutMs: number | undefined, maxTimeoutMs: number | undefined) {\n if (timeoutMs !== undefined && maxTimeoutMs !== undefined && timeoutMs > maxTimeoutMs) {\n throw toolPolicyError(`Command timeout exceeds policy (${timeoutMs} > ${maxTimeoutMs}).`);\n }\n}\n\nfunction resolveReadFileLimits(options: CreateDockerSandboxToolsOptions) {\n const defaultLineCount = options.readFile?.defaultLineCount ?? defaultReadFileLineCount;\n const maxLineCount = options.readFile?.maxLineCount ?? defaultReadFileMaxLineCount;\n const maxBytes = options.readFile?.maxBytes ?? defaultReadFileMaxBytes;\n if (defaultLineCount > maxLineCount) {\n throw toolPolicyError(\"readFile.defaultLineCount cannot exceed readFile.maxLineCount.\");\n }\n if (maxLineCount > maxToolReadFileLines) {\n throw toolPolicyError(`readFile.maxLineCount cannot exceed ${maxToolReadFileLines}.`);\n }\n return { defaultLineCount, maxLineCount, maxBytes };\n}\n\nfunction assertOptionalPositiveInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw toolPolicyError(`${name} must be a positive safe integer.`);\n }\n}\n\nfunction assertOptionalNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw toolPolicyError(`${name} must be a non-negative safe integer.`);\n }\n}\n\nfunction assertOptionalBoundedNonNegativeInteger(value: number | undefined, name: string): void {\n assertOptionalNonNegativeInteger(value, name);\n if (value !== undefined && value > maxToolBytes) {\n throw toolPolicyError(`${name} cannot exceed ${maxToolBytes}.`);\n }\n}\n\nfunction assertOptionalBoundedPositiveInteger(value: number | undefined, name: string): void {\n assertOptionalPositiveInteger(value, name);\n if (value !== undefined && value > maxToolBytes) {\n throw toolPolicyError(`${name} cannot exceed ${maxToolBytes}.`);\n }\n}\n\nfunction isDockerSandboxRuntime(value: unknown): value is DockerSandboxRuntime {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n value.provider === \"docker\" &&\n typeof value.workdir === \"string\" &&\n Array.isArray(value.publishedPorts) &&\n [\n \"exec\",\n \"execStream\",\n \"readFile\",\n \"readTextFile\",\n \"readTextFilePage\",\n \"writeFile\",\n \"writeTextFile\",\n \"listFiles\",\n \"startProcess\",\n \"listProcesses\",\n \"readProcessLogs\",\n \"stopProcess\",\n \"waitForPort\",\n ].every((name) => typeof value[name] === \"function\")\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toolPolicyError(message: string): DockerSandboxError {\n return new DockerSandboxError(message, \"tool_policy\");\n}\n"],"mappings":"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","names":["randomUUID","path","randomUUID","path","path","isRecord"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/sandbox",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Sandboxed workspace tools for Anvia agents.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
"tsup": "^8.5.0",
|
|
38
38
|
"typescript": "^5.9.3",
|
|
39
39
|
"vitest": "^4.0.8",
|
|
40
|
-
"@anvia/core": "1.0.
|
|
40
|
+
"@anvia/core": "1.0.1"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@anvia/core": "1.0.
|
|
43
|
+
"@anvia/core": "1.0.1"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|
|
46
46
|
"node": ">=20.12.0"
|