@librechat/agents 3.1.92 → 3.1.93
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/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +1 -0
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +13 -7
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +1 -0
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +13 -7
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
- package/dist/types/types/tools.d.ts +6 -0
- package/package.json +1 -1
- package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +87 -8
- package/src/tools/cloudflare/CloudflareBridgeRuntime.ts +1 -0
- package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +13 -7
- package/src/types/tools.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareBridgeRuntime.cjs","sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"names":["path","exports"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CloudflareBridgeRuntime.cjs","sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n supportsExecSignal: true,\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"names":["path","exports"],"mappings":"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"}
|
|
@@ -289,8 +289,8 @@ function createCloudflareSpawn(config) {
|
|
|
289
289
|
return (command, args, options) => {
|
|
290
290
|
const stdout = new stream.PassThrough();
|
|
291
291
|
const stderr = new stream.PassThrough();
|
|
292
|
-
const abortController = new AbortController();
|
|
293
292
|
const child = new events.EventEmitter();
|
|
293
|
+
const abortController = new AbortController();
|
|
294
294
|
const state = { closed: false };
|
|
295
295
|
const closeOnce = (exitCode, signal) => {
|
|
296
296
|
if (state.closed) {
|
|
@@ -330,13 +330,19 @@ function createCloudflareSpawn(config) {
|
|
|
330
330
|
: ctx.timeoutMs;
|
|
331
331
|
const timedCommand = withInSandboxTimeout(rendered, timeoutMs);
|
|
332
332
|
const cwd = options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();
|
|
333
|
+
if (state.closed) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const execOptions = {
|
|
337
|
+
cwd,
|
|
338
|
+
env: ctx.env,
|
|
339
|
+
timeout: outerTimeoutMs(timeoutMs),
|
|
340
|
+
};
|
|
341
|
+
if (ctx.sandbox.supportsExecSignal === true) {
|
|
342
|
+
execOptions.signal = abortController.signal;
|
|
343
|
+
}
|
|
333
344
|
try {
|
|
334
|
-
const result = await ctx.sandbox.exec(timedCommand,
|
|
335
|
-
cwd,
|
|
336
|
-
env: ctx.env,
|
|
337
|
-
timeout: outerTimeoutMs(timeoutMs),
|
|
338
|
-
signal: abortController.signal,
|
|
339
|
-
});
|
|
345
|
+
const result = await ctx.sandbox.exec(timedCommand, execOptions);
|
|
340
346
|
if (state.closed) {
|
|
341
347
|
return;
|
|
342
348
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareSandboxExecutionEngine.cjs","sources":["../../../../src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { PassThrough } from 'stream';\nimport { posix as path } from 'path';\nimport type { ChildProcessWithoutNullStreams } from 'child_process';\nimport type { WriteFileOptions, MakeDirectoryOptions, Stats } from 'fs';\nimport type { FileHandle } from 'fs/promises';\nimport type * as t from '@/types';\nimport {\n LOCAL_SPAWN_TIMEOUT_MS,\n validateBashCommand,\n} from '@/tools/local/LocalExecutionEngine';\nimport type { WorkspaceFS, ReaddirEntry } from '@/tools/local/workspaceFS';\n\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_TIMEOUT_MS = 60000;\nconst DEFAULT_MAX_OUTPUT_CHARS = 200000;\nconst PROTECTED_TARGET_ARG_RE = /^(?:\\/|~|\\$\\{?HOME\\}?|\\.)(?:\\/?\\.?\\*|\\/)?$/;\nconst DESTRUCTIVE_OP_IN_COMMAND_RE =\n /\\b(?:rm\\s+-[^\\s]*[rf]|chmod\\s+-R|chown\\s+-R)\\b/;\n\ntype SpawnResult = {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n};\n\ntype RuntimeCommand = {\n fileName: string;\n source?: string;\n command: string;\n};\n\ntype SandboxRuntimeContext = {\n sandbox: t.CloudflareSandboxRuntime;\n workspaceRoot: string;\n env?: Record<string, string | undefined>;\n timeoutMs: number;\n maxOutputChars: number;\n shell: string;\n};\n\nconst sandboxFactoryCache = new WeakMap<\n t.CloudflareSandboxExecutionConfig,\n Promise<t.CloudflareSandboxRuntime>\n>();\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nexport function getCloudflareWorkspaceRoot(\n config?: t.CloudflareSandboxExecutionConfig\n): string {\n return normalizeWorkspaceRoot(\n config?.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n}\n\nexport async function resolveCloudflareSandbox(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<t.CloudflareSandboxRuntime> {\n const sandbox = config.sandbox;\n if (typeof sandbox !== 'function') {\n return sandbox;\n }\n let cached = sandboxFactoryCache.get(config);\n if (cached == null) {\n cached = Promise.resolve()\n .then(() => sandbox())\n .catch((error: unknown) => {\n sandboxFactoryCache.delete(config);\n throw error;\n });\n sandboxFactoryCache.set(config, cached);\n }\n return cached;\n}\n\nasync function getRuntimeContext(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SandboxRuntimeContext> {\n return {\n sandbox: await resolveCloudflareSandbox(config),\n workspaceRoot: getCloudflareWorkspaceRoot(config),\n env: config.env,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxOutputChars: config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS,\n shell: config.shell ?? 'bash',\n };\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction withInSandboxTimeout(command: string, timeoutMs: number): string {\n const timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));\n return `timeout -k 2s ${timeoutSeconds}s ${command}`;\n}\n\nfunction outerTimeoutMs(timeoutMs: number): number {\n return timeoutMs + 5000;\n}\n\nfunction isInSandboxTimeoutExit(exitCode: number | null): boolean {\n return exitCode === 124 || exitCode === 137;\n}\n\nfunction truncateOutput(value: string, maxChars: number): string {\n if (maxChars <= 0 || value.length <= maxChars) {\n return value;\n }\n const head = Math.max(Math.floor(maxChars / 2), 0);\n const tail = Math.max(maxChars - head, 0);\n return `${value.slice(0, head)}\\n...[truncated ${value.length - maxChars} chars]...\\n${value.slice(value.length - tail)}`;\n}\n\nasync function readStream(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n}\n\nasync function normalizeReadFileContent(\n result: t.CloudflareSandboxReadFileResult\n): Promise<Buffer> {\n if (typeof result === 'string') {\n return Buffer.from(result, 'utf8');\n }\n if (Buffer.isBuffer(result)) {\n return result;\n }\n if (result instanceof Uint8Array) {\n return Buffer.from(result);\n }\n const content = result.content;\n if (typeof content === 'string') {\n if (result.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, 'utf8');\n }\n if (Buffer.isBuffer(content)) {\n return content;\n }\n if (content instanceof Uint8Array) {\n return Buffer.from(content);\n }\n return readStream(content);\n}\n\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller): void {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\nfunction normalizeWriteFileContent(content: string | Buffer | Uint8Array): {\n content: string | ReadableStream<Uint8Array>;\n options?: { encoding?: string };\n} {\n if (typeof content === 'string') {\n return { content, options: { encoding: 'utf8' } };\n }\n return { content: bytesToStream(content) };\n}\n\nfunction createStats(info: {\n size?: number;\n type?: t.CloudflareSandboxFileInfo['type'];\n}): Stats {\n const type = info.type ?? 'file';\n const now = new Date();\n return {\n size: info.size ?? 0,\n isFile: () => type === 'file',\n isDirectory: () => type === 'directory',\n isSymbolicLink: () => type === 'symlink',\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: 0,\n ino: 0,\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n atimeMs: now.getTime(),\n mtimeMs: now.getTime(),\n ctimeMs: now.getTime(),\n birthtimeMs: now.getTime(),\n atime: now,\n mtime: now,\n ctime: now,\n birthtime: now,\n } as Stats;\n}\n\nfunction normalizeFileList(\n result: t.CloudflareSandboxListFilesResult\n): t.CloudflareSandboxFileInfo[] {\n return Array.isArray(result) ? result : result.files;\n}\n\nfunction entryNameFor(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.name !== '') {\n return info.name.includes('/') ? path.basename(info.name) : info.name;\n }\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.basename(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.basename(info.relativePath);\n }\n return path.basename(parentPath);\n}\n\nfunction entryAbsolutePath(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.normalize(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.resolve(parentPath, info.relativePath);\n }\n return path.resolve(parentPath, info.name);\n}\n\nfunction createDirent(info: t.CloudflareSandboxFileInfo): ReaddirEntry {\n return {\n name: entryNameFor(info, ''),\n isFile: () => (info.type ?? 'file') === 'file',\n isDirectory: () => info.type === 'directory',\n isSymbolicLink: () => info.type === 'symlink',\n };\n}\n\nasync function findChildInfo(\n sandbox: t.CloudflareSandboxRuntime,\n filePath: string\n): Promise<t.CloudflareSandboxFileInfo | undefined> {\n const parent = path.dirname(filePath);\n const basename = path.basename(filePath);\n const entries = normalizeFileList(\n await sandbox.listFiles(parent, { includeHidden: true })\n );\n return entries.find((entry) => {\n const absolute = entryAbsolutePath(entry, parent);\n return absolute === filePath || entryNameFor(entry, parent) === basename;\n });\n}\n\nexport function createCloudflareWorkspaceFS(\n config: t.CloudflareSandboxExecutionConfig\n): WorkspaceFS {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n\n const fs: WorkspaceFS = {\n readFile: (async (filePath: string, encoding?: 'utf8') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved, encoding ? { encoding } : undefined)\n );\n return encoding != null ? buffer.toString(encoding) : buffer;\n }) as WorkspaceFS['readFile'],\n writeFile: async (\n filePath: string,\n content: string | Buffer,\n _options?: WriteFileOptions\n ) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const normalized = normalizeWriteFileContent(content);\n await sandbox.writeFile(resolved, normalized.content, normalized.options);\n },\n stat: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n if (resolved === workspaceRoot) {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n }\n const info = await findChildInfo(sandbox, resolved);\n if (info != null) {\n return createStats({ size: info.size, type: info.type });\n }\n try {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n } catch {\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return createStats({ size: buffer.length, type: 'file' });\n }\n },\n readdir: (async (filePath: string, options?: { withFileTypes: true }) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n if (options?.withFileTypes === true) {\n return entries.map(createDirent);\n }\n return entries.map((entry) => entryNameFor(entry, resolved));\n }) as WorkspaceFS['readdir'],\n mkdir: async (filePath: string, options?: MakeDirectoryOptions) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.mkdir(toSandboxPath(filePath, workspaceRoot), {\n recursive: options?.recursive,\n });\n },\n realpath: async (filePath: string) =>\n toSandboxPath(filePath, workspaceRoot),\n unlink: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.deleteFile(toSandboxPath(filePath, workspaceRoot));\n },\n open: async (filePath: string, _flags: 'r') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return {\n read: async (\n target: Buffer,\n offset: number,\n length: number,\n position: number\n ) => {\n const start = Math.max(position, 0);\n const slice = buffer.subarray(start, start + length);\n slice.copy(target, offset);\n return { bytesRead: slice.length, buffer: target };\n },\n close: async () => undefined,\n } as unknown as FileHandle;\n },\n };\n\n return fs;\n}\n\nfunction createCloudflareSpawn(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalSpawn {\n return (command, args, options) => {\n const stdout = new PassThrough();\n const stderr = new PassThrough();\n const abortController = new AbortController();\n const child = new EventEmitter() as ChildProcessWithoutNullStreams;\n const state = { closed: false };\n const closeOnce = (\n exitCode: number | null,\n signal: NodeJS.Signals | null\n ): void => {\n if (state.closed) {\n return;\n }\n state.closed = true;\n stdout.end();\n stderr.end();\n Object.assign(child, {\n exitCode,\n signalCode: signal,\n });\n child.emit('close', exitCode, signal);\n };\n Object.assign(child, {\n stdout,\n stderr,\n stdin: new PassThrough(),\n stdio: [null, stdout, stderr],\n killed: false,\n exitCode: null,\n signalCode: null,\n pid: undefined,\n kill: (signal: NodeJS.Signals = 'SIGTERM') => {\n Object.assign(child, { killed: true, signalCode: signal });\n abortController.abort();\n closeOnce(null, signal);\n return true;\n },\n });\n\n void (async (): Promise<void> => {\n const ctx = await getRuntimeContext(config);\n const rendered = [command, ...args].map(quote).join(' ');\n const spawnTimeoutMs = (\n options as {\n [LOCAL_SPAWN_TIMEOUT_MS]?: number;\n }\n )[LOCAL_SPAWN_TIMEOUT_MS];\n const timeoutMs =\n typeof spawnTimeoutMs === 'number' && Number.isFinite(spawnTimeoutMs)\n ? spawnTimeoutMs\n : ctx.timeoutMs;\n const timedCommand = withInSandboxTimeout(rendered, timeoutMs);\n const cwd =\n options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();\n try {\n const result = await ctx.sandbox.exec(timedCommand, {\n cwd,\n env: ctx.env,\n timeout: outerTimeoutMs(timeoutMs),\n signal: abortController.signal,\n });\n if (state.closed) {\n return;\n }\n if (result.stdout) stdout.write(result.stdout);\n if (result.stderr) stderr.write(result.stderr);\n closeOnce(result.exitCode, null);\n } catch (error) {\n if (state.closed) {\n return;\n }\n stderr.write((error as Error).message);\n closeOnce(1, null);\n }\n })();\n\n return child;\n };\n}\n\nexport function createCloudflareLocalExecutionConfig(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalExecutionConfig {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n return {\n cwd: workspaceRoot,\n workspace: { root: workspaceRoot },\n exec: {\n spawn: createCloudflareSpawn(config),\n fs: createCloudflareWorkspaceFS(config),\n sandboxed: true,\n },\n shell: config.shell ?? 'bash',\n timeoutMs: config.timeoutMs,\n maxOutputChars: config.maxOutputChars,\n env: config.env,\n includeCodingTools: config.includeCodingTools,\n compileCheck: config.compileCheck,\n readOnly: config.readOnly,\n allowDangerousCommands: config.allowDangerousCommands,\n bashAst: config.bashAst,\n fileCheckpointing: config.fileCheckpointing,\n maxReadBytes: config.maxReadBytes,\n attachReadAttachments: config.attachReadAttachments,\n maxAttachmentBytes: config.maxAttachmentBytes,\n postEditSyntaxCheck: config.postEditSyntaxCheck,\n };\n}\n\nexport async function validateCloudflareBashCommand(\n command: string,\n args: readonly string[],\n config: t.CloudflareSandboxExecutionConfig\n): Promise<void> {\n const localConfig = createCloudflareLocalExecutionConfig(config);\n const validation = await validateBashCommand(command, localConfig);\n if (!validation.valid) {\n throw new Error(validation.errors.join('\\n'));\n }\n\n if (\n args.length > 0 &&\n config.allowDangerousCommands !== true &&\n DESTRUCTIVE_OP_IN_COMMAND_RE.test(command)\n ) {\n const offending = args.find((arg) => PROTECTED_TARGET_ARG_RE.test(arg));\n if (offending !== undefined) {\n throw new Error(\n `Command matches a destructive command pattern (protected target \"${offending}\" passed via positional arg).`\n );\n }\n }\n}\n\nexport async function executeCloudflareBash(\n command: string,\n config: t.CloudflareSandboxExecutionConfig,\n args: readonly string[] = []\n): Promise<SpawnResult> {\n await validateCloudflareBashCommand(command, args, config);\n const ctx = await getRuntimeContext(config);\n const shellCommand =\n args.length > 0\n ? `${ctx.shell} -lc ${quote(command)} -- ${args.map(quote).join(' ')}`\n : `${ctx.shell} -lc ${quote(command)}`;\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(shellCommand, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n}\n\nfunction runtimeForCode(\n lang: string,\n tempDir: string,\n code: string,\n args: string[] = [],\n shell = 'bash'\n): RuntimeCommand {\n const fileFor = (name: string): string => path.join(tempDir, name);\n const argText = args.map(quote).join(' ');\n switch (lang) {\n case 'py':\n case 'python':\n return {\n fileName: 'main.py',\n source: code,\n command: `python3 ${quote(fileFor('main.py'))} ${argText}`,\n };\n case 'js':\n case 'javascript':\n return {\n fileName: 'main.js',\n source: code,\n command: `node ${quote(fileFor('main.js'))} ${argText}`,\n };\n case 'ts':\n case 'typescript':\n return {\n fileName: 'main.ts',\n source: code,\n command: `npx --no-install tsx ${quote(fileFor('main.ts'))} ${argText}`,\n };\n case 'php':\n return {\n fileName: 'main.php',\n source: code,\n command: `php ${quote(fileFor('main.php'))} ${argText}`,\n };\n case 'go':\n return {\n fileName: 'main.go',\n source: code,\n command: `go run ${quote(fileFor('main.go'))} ${argText}`,\n };\n case 'rs':\n return {\n fileName: 'main.rs',\n source: code,\n command: `${shell} -lc ${quote(\n `rustc ${quote(fileFor('main.rs'))} -o ${quote(fileFor('main-rs'))} && ${quote(fileFor('main-rs'))} ${argText}`\n )}`,\n };\n case 'c':\n return {\n fileName: 'main.c',\n source: code,\n command: `${shell} -lc ${quote(\n `cc ${quote(fileFor('main.c'))} -o ${quote(fileFor('main-c'))} && ${quote(fileFor('main-c'))} ${argText}`\n )}`,\n };\n case 'cpp':\n return {\n fileName: 'main.cpp',\n source: code,\n command: `${shell} -lc ${quote(\n `c++ ${quote(fileFor('main.cpp'))} -o ${quote(fileFor('main-cpp'))} && ${quote(fileFor('main-cpp'))} ${argText}`\n )}`,\n };\n case 'java':\n return {\n fileName: 'Main.java',\n source: code,\n command: `${shell} -lc ${quote(\n `javac ${quote(fileFor('Main.java'))} && java -cp ${quote(tempDir)} Main ${argText}`\n )}`,\n };\n case 'r':\n return {\n fileName: 'main.R',\n source: code,\n command: `Rscript ${quote(fileFor('main.R'))} ${argText}`,\n };\n case 'd':\n return {\n fileName: 'main.d',\n source: code,\n command: `${shell} -lc ${quote(\n `dmd ${quote(fileFor('main.d'))} -of=${quote(fileFor('main-d'))} && ${quote(fileFor('main-d'))} ${argText}`\n )}`,\n };\n case 'f90':\n return {\n fileName: 'main.f90',\n source: code,\n command: `${shell} -lc ${quote(\n `gfortran ${quote(fileFor('main.f90'))} -o ${quote(fileFor('main-f90'))} && ${quote(fileFor('main-f90'))} ${argText}`\n )}`,\n };\n case 'bash':\n case 'sh':\n return {\n fileName: 'main.sh',\n source: code,\n command: `${shell} -lc ${quote(code)} -- ${argText}`,\n };\n default:\n throw new Error(`Unsupported Cloudflare sandbox runtime: ${lang}`);\n }\n}\n\nexport async function executeCloudflareCode(\n input: { lang: string; code: string; args?: string[] },\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SpawnResult> {\n if (input.lang === 'bash' || input.lang === 'sh') {\n return executeCloudflareBash(input.code, config, input.args ?? []);\n }\n const ctx = await getRuntimeContext(config);\n const id = globalThis.crypto.randomUUID();\n const tempDir = path.join(ctx.workspaceRoot, '.lc-exec', id);\n const runtime = runtimeForCode(\n input.lang,\n tempDir,\n input.code,\n input.args,\n ctx.shell\n );\n await ctx.sandbox.mkdir(tempDir, { recursive: true });\n if (runtime.source != null) {\n await ctx.sandbox.writeFile(\n path.join(tempDir, runtime.fileName),\n runtime.source,\n {\n encoding: 'utf8',\n }\n );\n }\n try {\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(runtime.command, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n } finally {\n await ctx.sandbox\n .exec(`rm -rf ${quote(tempDir)}`, {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: 10000,\n })\n .catch(() => undefined);\n }\n}\n\nexport function formatCloudflareOutput(\n result: SpawnResult,\n cwd: string\n): string {\n let formatted = '';\n if (result.stdout !== '') {\n formatted += `stdout:\\n${result.stdout}\\n`;\n } else {\n formatted += 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\n }\n if (result.stderr !== '') {\n formatted += `stderr:\\n${result.stderr}\\n`;\n }\n if (result.exitCode != null && result.exitCode !== 0) {\n formatted += `exit_code: ${result.exitCode}\\n`;\n }\n if (result.timedOut) {\n formatted += 'timed_out: true\\n';\n }\n formatted += `working_directory: ${cwd}`;\n return formatted.trim();\n}\n"],"names":["path","PassThrough","EventEmitter","LOCAL_SPAWN_TIMEOUT_MS","validateBashCommand"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CloudflareSandboxExecutionEngine.cjs","sources":["../../../../src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { PassThrough } from 'stream';\nimport { posix as path } from 'path';\nimport type { ChildProcessWithoutNullStreams } from 'child_process';\nimport type { WriteFileOptions, MakeDirectoryOptions, Stats } from 'fs';\nimport type { FileHandle } from 'fs/promises';\nimport type * as t from '@/types';\nimport {\n LOCAL_SPAWN_TIMEOUT_MS,\n validateBashCommand,\n} from '@/tools/local/LocalExecutionEngine';\nimport type { WorkspaceFS, ReaddirEntry } from '@/tools/local/workspaceFS';\n\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_TIMEOUT_MS = 60000;\nconst DEFAULT_MAX_OUTPUT_CHARS = 200000;\nconst PROTECTED_TARGET_ARG_RE = /^(?:\\/|~|\\$\\{?HOME\\}?|\\.)(?:\\/?\\.?\\*|\\/)?$/;\nconst DESTRUCTIVE_OP_IN_COMMAND_RE =\n /\\b(?:rm\\s+-[^\\s]*[rf]|chmod\\s+-R|chown\\s+-R)\\b/;\n\ntype SpawnResult = {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n};\n\ntype RuntimeCommand = {\n fileName: string;\n source?: string;\n command: string;\n};\n\ntype SandboxRuntimeContext = {\n sandbox: t.CloudflareSandboxRuntime;\n workspaceRoot: string;\n env?: Record<string, string | undefined>;\n timeoutMs: number;\n maxOutputChars: number;\n shell: string;\n};\n\nconst sandboxFactoryCache = new WeakMap<\n t.CloudflareSandboxExecutionConfig,\n Promise<t.CloudflareSandboxRuntime>\n>();\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nexport function getCloudflareWorkspaceRoot(\n config?: t.CloudflareSandboxExecutionConfig\n): string {\n return normalizeWorkspaceRoot(\n config?.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n}\n\nexport async function resolveCloudflareSandbox(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<t.CloudflareSandboxRuntime> {\n const sandbox = config.sandbox;\n if (typeof sandbox !== 'function') {\n return sandbox;\n }\n let cached = sandboxFactoryCache.get(config);\n if (cached == null) {\n cached = Promise.resolve()\n .then(() => sandbox())\n .catch((error: unknown) => {\n sandboxFactoryCache.delete(config);\n throw error;\n });\n sandboxFactoryCache.set(config, cached);\n }\n return cached;\n}\n\nasync function getRuntimeContext(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SandboxRuntimeContext> {\n return {\n sandbox: await resolveCloudflareSandbox(config),\n workspaceRoot: getCloudflareWorkspaceRoot(config),\n env: config.env,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxOutputChars: config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS,\n shell: config.shell ?? 'bash',\n };\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction withInSandboxTimeout(command: string, timeoutMs: number): string {\n const timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));\n return `timeout -k 2s ${timeoutSeconds}s ${command}`;\n}\n\nfunction outerTimeoutMs(timeoutMs: number): number {\n return timeoutMs + 5000;\n}\n\nfunction isInSandboxTimeoutExit(exitCode: number | null): boolean {\n return exitCode === 124 || exitCode === 137;\n}\n\nfunction truncateOutput(value: string, maxChars: number): string {\n if (maxChars <= 0 || value.length <= maxChars) {\n return value;\n }\n const head = Math.max(Math.floor(maxChars / 2), 0);\n const tail = Math.max(maxChars - head, 0);\n return `${value.slice(0, head)}\\n...[truncated ${value.length - maxChars} chars]...\\n${value.slice(value.length - tail)}`;\n}\n\nasync function readStream(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n}\n\nasync function normalizeReadFileContent(\n result: t.CloudflareSandboxReadFileResult\n): Promise<Buffer> {\n if (typeof result === 'string') {\n return Buffer.from(result, 'utf8');\n }\n if (Buffer.isBuffer(result)) {\n return result;\n }\n if (result instanceof Uint8Array) {\n return Buffer.from(result);\n }\n const content = result.content;\n if (typeof content === 'string') {\n if (result.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, 'utf8');\n }\n if (Buffer.isBuffer(content)) {\n return content;\n }\n if (content instanceof Uint8Array) {\n return Buffer.from(content);\n }\n return readStream(content);\n}\n\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller): void {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\nfunction normalizeWriteFileContent(content: string | Buffer | Uint8Array): {\n content: string | ReadableStream<Uint8Array>;\n options?: { encoding?: string };\n} {\n if (typeof content === 'string') {\n return { content, options: { encoding: 'utf8' } };\n }\n return { content: bytesToStream(content) };\n}\n\nfunction createStats(info: {\n size?: number;\n type?: t.CloudflareSandboxFileInfo['type'];\n}): Stats {\n const type = info.type ?? 'file';\n const now = new Date();\n return {\n size: info.size ?? 0,\n isFile: () => type === 'file',\n isDirectory: () => type === 'directory',\n isSymbolicLink: () => type === 'symlink',\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: 0,\n ino: 0,\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n atimeMs: now.getTime(),\n mtimeMs: now.getTime(),\n ctimeMs: now.getTime(),\n birthtimeMs: now.getTime(),\n atime: now,\n mtime: now,\n ctime: now,\n birthtime: now,\n } as Stats;\n}\n\nfunction normalizeFileList(\n result: t.CloudflareSandboxListFilesResult\n): t.CloudflareSandboxFileInfo[] {\n return Array.isArray(result) ? result : result.files;\n}\n\nfunction entryNameFor(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.name !== '') {\n return info.name.includes('/') ? path.basename(info.name) : info.name;\n }\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.basename(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.basename(info.relativePath);\n }\n return path.basename(parentPath);\n}\n\nfunction entryAbsolutePath(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.normalize(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.resolve(parentPath, info.relativePath);\n }\n return path.resolve(parentPath, info.name);\n}\n\nfunction createDirent(info: t.CloudflareSandboxFileInfo): ReaddirEntry {\n return {\n name: entryNameFor(info, ''),\n isFile: () => (info.type ?? 'file') === 'file',\n isDirectory: () => info.type === 'directory',\n isSymbolicLink: () => info.type === 'symlink',\n };\n}\n\nasync function findChildInfo(\n sandbox: t.CloudflareSandboxRuntime,\n filePath: string\n): Promise<t.CloudflareSandboxFileInfo | undefined> {\n const parent = path.dirname(filePath);\n const basename = path.basename(filePath);\n const entries = normalizeFileList(\n await sandbox.listFiles(parent, { includeHidden: true })\n );\n return entries.find((entry) => {\n const absolute = entryAbsolutePath(entry, parent);\n return absolute === filePath || entryNameFor(entry, parent) === basename;\n });\n}\n\nexport function createCloudflareWorkspaceFS(\n config: t.CloudflareSandboxExecutionConfig\n): WorkspaceFS {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n\n const fs: WorkspaceFS = {\n readFile: (async (filePath: string, encoding?: 'utf8') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved, encoding ? { encoding } : undefined)\n );\n return encoding != null ? buffer.toString(encoding) : buffer;\n }) as WorkspaceFS['readFile'],\n writeFile: async (\n filePath: string,\n content: string | Buffer,\n _options?: WriteFileOptions\n ) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const normalized = normalizeWriteFileContent(content);\n await sandbox.writeFile(resolved, normalized.content, normalized.options);\n },\n stat: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n if (resolved === workspaceRoot) {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n }\n const info = await findChildInfo(sandbox, resolved);\n if (info != null) {\n return createStats({ size: info.size, type: info.type });\n }\n try {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n } catch {\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return createStats({ size: buffer.length, type: 'file' });\n }\n },\n readdir: (async (filePath: string, options?: { withFileTypes: true }) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n if (options?.withFileTypes === true) {\n return entries.map(createDirent);\n }\n return entries.map((entry) => entryNameFor(entry, resolved));\n }) as WorkspaceFS['readdir'],\n mkdir: async (filePath: string, options?: MakeDirectoryOptions) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.mkdir(toSandboxPath(filePath, workspaceRoot), {\n recursive: options?.recursive,\n });\n },\n realpath: async (filePath: string) =>\n toSandboxPath(filePath, workspaceRoot),\n unlink: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.deleteFile(toSandboxPath(filePath, workspaceRoot));\n },\n open: async (filePath: string, _flags: 'r') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return {\n read: async (\n target: Buffer,\n offset: number,\n length: number,\n position: number\n ) => {\n const start = Math.max(position, 0);\n const slice = buffer.subarray(start, start + length);\n slice.copy(target, offset);\n return { bytesRead: slice.length, buffer: target };\n },\n close: async () => undefined,\n } as unknown as FileHandle;\n },\n };\n\n return fs;\n}\n\nfunction createCloudflareSpawn(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalSpawn {\n return (command, args, options) => {\n const stdout = new PassThrough();\n const stderr = new PassThrough();\n const child = new EventEmitter() as ChildProcessWithoutNullStreams;\n const abortController = new AbortController();\n const state = { closed: false };\n const closeOnce = (\n exitCode: number | null,\n signal: NodeJS.Signals | null\n ): void => {\n if (state.closed) {\n return;\n }\n state.closed = true;\n stdout.end();\n stderr.end();\n Object.assign(child, {\n exitCode,\n signalCode: signal,\n });\n child.emit('close', exitCode, signal);\n };\n Object.assign(child, {\n stdout,\n stderr,\n stdin: new PassThrough(),\n stdio: [null, stdout, stderr],\n killed: false,\n exitCode: null,\n signalCode: null,\n pid: undefined,\n kill: (signal: NodeJS.Signals = 'SIGTERM') => {\n Object.assign(child, { killed: true, signalCode: signal });\n abortController.abort();\n closeOnce(null, signal);\n return true;\n },\n });\n\n void (async (): Promise<void> => {\n const ctx = await getRuntimeContext(config);\n const rendered = [command, ...args].map(quote).join(' ');\n const spawnTimeoutMs = (\n options as {\n [LOCAL_SPAWN_TIMEOUT_MS]?: number;\n }\n )[LOCAL_SPAWN_TIMEOUT_MS];\n const timeoutMs =\n typeof spawnTimeoutMs === 'number' && Number.isFinite(spawnTimeoutMs)\n ? spawnTimeoutMs\n : ctx.timeoutMs;\n const timedCommand = withInSandboxTimeout(rendered, timeoutMs);\n const cwd =\n options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();\n if (state.closed) {\n return;\n }\n const execOptions: t.CloudflareSandboxExecOptions = {\n cwd,\n env: ctx.env,\n timeout: outerTimeoutMs(timeoutMs),\n };\n if (ctx.sandbox.supportsExecSignal === true) {\n execOptions.signal = abortController.signal;\n }\n try {\n const result = await ctx.sandbox.exec(timedCommand, execOptions);\n if (state.closed) {\n return;\n }\n if (result.stdout) stdout.write(result.stdout);\n if (result.stderr) stderr.write(result.stderr);\n closeOnce(result.exitCode, null);\n } catch (error) {\n if (state.closed) {\n return;\n }\n stderr.write((error as Error).message);\n closeOnce(1, null);\n }\n })();\n\n return child;\n };\n}\n\nexport function createCloudflareLocalExecutionConfig(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalExecutionConfig {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n return {\n cwd: workspaceRoot,\n workspace: { root: workspaceRoot },\n exec: {\n spawn: createCloudflareSpawn(config),\n fs: createCloudflareWorkspaceFS(config),\n sandboxed: true,\n },\n shell: config.shell ?? 'bash',\n timeoutMs: config.timeoutMs,\n maxOutputChars: config.maxOutputChars,\n env: config.env,\n includeCodingTools: config.includeCodingTools,\n compileCheck: config.compileCheck,\n readOnly: config.readOnly,\n allowDangerousCommands: config.allowDangerousCommands,\n bashAst: config.bashAst,\n fileCheckpointing: config.fileCheckpointing,\n maxReadBytes: config.maxReadBytes,\n attachReadAttachments: config.attachReadAttachments,\n maxAttachmentBytes: config.maxAttachmentBytes,\n postEditSyntaxCheck: config.postEditSyntaxCheck,\n };\n}\n\nexport async function validateCloudflareBashCommand(\n command: string,\n args: readonly string[],\n config: t.CloudflareSandboxExecutionConfig\n): Promise<void> {\n const localConfig = createCloudflareLocalExecutionConfig(config);\n const validation = await validateBashCommand(command, localConfig);\n if (!validation.valid) {\n throw new Error(validation.errors.join('\\n'));\n }\n\n if (\n args.length > 0 &&\n config.allowDangerousCommands !== true &&\n DESTRUCTIVE_OP_IN_COMMAND_RE.test(command)\n ) {\n const offending = args.find((arg) => PROTECTED_TARGET_ARG_RE.test(arg));\n if (offending !== undefined) {\n throw new Error(\n `Command matches a destructive command pattern (protected target \"${offending}\" passed via positional arg).`\n );\n }\n }\n}\n\nexport async function executeCloudflareBash(\n command: string,\n config: t.CloudflareSandboxExecutionConfig,\n args: readonly string[] = []\n): Promise<SpawnResult> {\n await validateCloudflareBashCommand(command, args, config);\n const ctx = await getRuntimeContext(config);\n const shellCommand =\n args.length > 0\n ? `${ctx.shell} -lc ${quote(command)} -- ${args.map(quote).join(' ')}`\n : `${ctx.shell} -lc ${quote(command)}`;\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(shellCommand, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n}\n\nfunction runtimeForCode(\n lang: string,\n tempDir: string,\n code: string,\n args: string[] = [],\n shell = 'bash'\n): RuntimeCommand {\n const fileFor = (name: string): string => path.join(tempDir, name);\n const argText = args.map(quote).join(' ');\n switch (lang) {\n case 'py':\n case 'python':\n return {\n fileName: 'main.py',\n source: code,\n command: `python3 ${quote(fileFor('main.py'))} ${argText}`,\n };\n case 'js':\n case 'javascript':\n return {\n fileName: 'main.js',\n source: code,\n command: `node ${quote(fileFor('main.js'))} ${argText}`,\n };\n case 'ts':\n case 'typescript':\n return {\n fileName: 'main.ts',\n source: code,\n command: `npx --no-install tsx ${quote(fileFor('main.ts'))} ${argText}`,\n };\n case 'php':\n return {\n fileName: 'main.php',\n source: code,\n command: `php ${quote(fileFor('main.php'))} ${argText}`,\n };\n case 'go':\n return {\n fileName: 'main.go',\n source: code,\n command: `go run ${quote(fileFor('main.go'))} ${argText}`,\n };\n case 'rs':\n return {\n fileName: 'main.rs',\n source: code,\n command: `${shell} -lc ${quote(\n `rustc ${quote(fileFor('main.rs'))} -o ${quote(fileFor('main-rs'))} && ${quote(fileFor('main-rs'))} ${argText}`\n )}`,\n };\n case 'c':\n return {\n fileName: 'main.c',\n source: code,\n command: `${shell} -lc ${quote(\n `cc ${quote(fileFor('main.c'))} -o ${quote(fileFor('main-c'))} && ${quote(fileFor('main-c'))} ${argText}`\n )}`,\n };\n case 'cpp':\n return {\n fileName: 'main.cpp',\n source: code,\n command: `${shell} -lc ${quote(\n `c++ ${quote(fileFor('main.cpp'))} -o ${quote(fileFor('main-cpp'))} && ${quote(fileFor('main-cpp'))} ${argText}`\n )}`,\n };\n case 'java':\n return {\n fileName: 'Main.java',\n source: code,\n command: `${shell} -lc ${quote(\n `javac ${quote(fileFor('Main.java'))} && java -cp ${quote(tempDir)} Main ${argText}`\n )}`,\n };\n case 'r':\n return {\n fileName: 'main.R',\n source: code,\n command: `Rscript ${quote(fileFor('main.R'))} ${argText}`,\n };\n case 'd':\n return {\n fileName: 'main.d',\n source: code,\n command: `${shell} -lc ${quote(\n `dmd ${quote(fileFor('main.d'))} -of=${quote(fileFor('main-d'))} && ${quote(fileFor('main-d'))} ${argText}`\n )}`,\n };\n case 'f90':\n return {\n fileName: 'main.f90',\n source: code,\n command: `${shell} -lc ${quote(\n `gfortran ${quote(fileFor('main.f90'))} -o ${quote(fileFor('main-f90'))} && ${quote(fileFor('main-f90'))} ${argText}`\n )}`,\n };\n case 'bash':\n case 'sh':\n return {\n fileName: 'main.sh',\n source: code,\n command: `${shell} -lc ${quote(code)} -- ${argText}`,\n };\n default:\n throw new Error(`Unsupported Cloudflare sandbox runtime: ${lang}`);\n }\n}\n\nexport async function executeCloudflareCode(\n input: { lang: string; code: string; args?: string[] },\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SpawnResult> {\n if (input.lang === 'bash' || input.lang === 'sh') {\n return executeCloudflareBash(input.code, config, input.args ?? []);\n }\n const ctx = await getRuntimeContext(config);\n const id = globalThis.crypto.randomUUID();\n const tempDir = path.join(ctx.workspaceRoot, '.lc-exec', id);\n const runtime = runtimeForCode(\n input.lang,\n tempDir,\n input.code,\n input.args,\n ctx.shell\n );\n await ctx.sandbox.mkdir(tempDir, { recursive: true });\n if (runtime.source != null) {\n await ctx.sandbox.writeFile(\n path.join(tempDir, runtime.fileName),\n runtime.source,\n {\n encoding: 'utf8',\n }\n );\n }\n try {\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(runtime.command, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n } finally {\n await ctx.sandbox\n .exec(`rm -rf ${quote(tempDir)}`, {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: 10000,\n })\n .catch(() => undefined);\n }\n}\n\nexport function formatCloudflareOutput(\n result: SpawnResult,\n cwd: string\n): string {\n let formatted = '';\n if (result.stdout !== '') {\n formatted += `stdout:\\n${result.stdout}\\n`;\n } else {\n formatted += 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\n }\n if (result.stderr !== '') {\n formatted += `stderr:\\n${result.stderr}\\n`;\n }\n if (result.exitCode != null && result.exitCode !== 0) {\n formatted += `exit_code: ${result.exitCode}\\n`;\n }\n if (result.timedOut) {\n formatted += 'timed_out: true\\n';\n }\n formatted += `working_directory: ${cwd}`;\n return formatted.trim();\n}\n"],"names":["path","PassThrough","EventEmitter","LOCAL_SPAWN_TIMEOUT_MS","validateBashCommand"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareBridgeRuntime.mjs","sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"names":["path","exports"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CloudflareBridgeRuntime.mjs","sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n supportsExecSignal: true,\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"names":["path","exports"],"mappings":"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"}
|
|
@@ -287,8 +287,8 @@ function createCloudflareSpawn(config) {
|
|
|
287
287
|
return (command, args, options) => {
|
|
288
288
|
const stdout = new PassThrough();
|
|
289
289
|
const stderr = new PassThrough();
|
|
290
|
-
const abortController = new AbortController();
|
|
291
290
|
const child = new EventEmitter();
|
|
291
|
+
const abortController = new AbortController();
|
|
292
292
|
const state = { closed: false };
|
|
293
293
|
const closeOnce = (exitCode, signal) => {
|
|
294
294
|
if (state.closed) {
|
|
@@ -328,13 +328,19 @@ function createCloudflareSpawn(config) {
|
|
|
328
328
|
: ctx.timeoutMs;
|
|
329
329
|
const timedCommand = withInSandboxTimeout(rendered, timeoutMs);
|
|
330
330
|
const cwd = options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();
|
|
331
|
+
if (state.closed) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const execOptions = {
|
|
335
|
+
cwd,
|
|
336
|
+
env: ctx.env,
|
|
337
|
+
timeout: outerTimeoutMs(timeoutMs),
|
|
338
|
+
};
|
|
339
|
+
if (ctx.sandbox.supportsExecSignal === true) {
|
|
340
|
+
execOptions.signal = abortController.signal;
|
|
341
|
+
}
|
|
331
342
|
try {
|
|
332
|
-
const result = await ctx.sandbox.exec(timedCommand,
|
|
333
|
-
cwd,
|
|
334
|
-
env: ctx.env,
|
|
335
|
-
timeout: outerTimeoutMs(timeoutMs),
|
|
336
|
-
signal: abortController.signal,
|
|
337
|
-
});
|
|
343
|
+
const result = await ctx.sandbox.exec(timedCommand, execOptions);
|
|
338
344
|
if (state.closed) {
|
|
339
345
|
return;
|
|
340
346
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareSandboxExecutionEngine.mjs","sources":["../../../../src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { PassThrough } from 'stream';\nimport { posix as path } from 'path';\nimport type { ChildProcessWithoutNullStreams } from 'child_process';\nimport type { WriteFileOptions, MakeDirectoryOptions, Stats } from 'fs';\nimport type { FileHandle } from 'fs/promises';\nimport type * as t from '@/types';\nimport {\n LOCAL_SPAWN_TIMEOUT_MS,\n validateBashCommand,\n} from '@/tools/local/LocalExecutionEngine';\nimport type { WorkspaceFS, ReaddirEntry } from '@/tools/local/workspaceFS';\n\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_TIMEOUT_MS = 60000;\nconst DEFAULT_MAX_OUTPUT_CHARS = 200000;\nconst PROTECTED_TARGET_ARG_RE = /^(?:\\/|~|\\$\\{?HOME\\}?|\\.)(?:\\/?\\.?\\*|\\/)?$/;\nconst DESTRUCTIVE_OP_IN_COMMAND_RE =\n /\\b(?:rm\\s+-[^\\s]*[rf]|chmod\\s+-R|chown\\s+-R)\\b/;\n\ntype SpawnResult = {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n};\n\ntype RuntimeCommand = {\n fileName: string;\n source?: string;\n command: string;\n};\n\ntype SandboxRuntimeContext = {\n sandbox: t.CloudflareSandboxRuntime;\n workspaceRoot: string;\n env?: Record<string, string | undefined>;\n timeoutMs: number;\n maxOutputChars: number;\n shell: string;\n};\n\nconst sandboxFactoryCache = new WeakMap<\n t.CloudflareSandboxExecutionConfig,\n Promise<t.CloudflareSandboxRuntime>\n>();\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nexport function getCloudflareWorkspaceRoot(\n config?: t.CloudflareSandboxExecutionConfig\n): string {\n return normalizeWorkspaceRoot(\n config?.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n}\n\nexport async function resolveCloudflareSandbox(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<t.CloudflareSandboxRuntime> {\n const sandbox = config.sandbox;\n if (typeof sandbox !== 'function') {\n return sandbox;\n }\n let cached = sandboxFactoryCache.get(config);\n if (cached == null) {\n cached = Promise.resolve()\n .then(() => sandbox())\n .catch((error: unknown) => {\n sandboxFactoryCache.delete(config);\n throw error;\n });\n sandboxFactoryCache.set(config, cached);\n }\n return cached;\n}\n\nasync function getRuntimeContext(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SandboxRuntimeContext> {\n return {\n sandbox: await resolveCloudflareSandbox(config),\n workspaceRoot: getCloudflareWorkspaceRoot(config),\n env: config.env,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxOutputChars: config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS,\n shell: config.shell ?? 'bash',\n };\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction withInSandboxTimeout(command: string, timeoutMs: number): string {\n const timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));\n return `timeout -k 2s ${timeoutSeconds}s ${command}`;\n}\n\nfunction outerTimeoutMs(timeoutMs: number): number {\n return timeoutMs + 5000;\n}\n\nfunction isInSandboxTimeoutExit(exitCode: number | null): boolean {\n return exitCode === 124 || exitCode === 137;\n}\n\nfunction truncateOutput(value: string, maxChars: number): string {\n if (maxChars <= 0 || value.length <= maxChars) {\n return value;\n }\n const head = Math.max(Math.floor(maxChars / 2), 0);\n const tail = Math.max(maxChars - head, 0);\n return `${value.slice(0, head)}\\n...[truncated ${value.length - maxChars} chars]...\\n${value.slice(value.length - tail)}`;\n}\n\nasync function readStream(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n}\n\nasync function normalizeReadFileContent(\n result: t.CloudflareSandboxReadFileResult\n): Promise<Buffer> {\n if (typeof result === 'string') {\n return Buffer.from(result, 'utf8');\n }\n if (Buffer.isBuffer(result)) {\n return result;\n }\n if (result instanceof Uint8Array) {\n return Buffer.from(result);\n }\n const content = result.content;\n if (typeof content === 'string') {\n if (result.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, 'utf8');\n }\n if (Buffer.isBuffer(content)) {\n return content;\n }\n if (content instanceof Uint8Array) {\n return Buffer.from(content);\n }\n return readStream(content);\n}\n\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller): void {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\nfunction normalizeWriteFileContent(content: string | Buffer | Uint8Array): {\n content: string | ReadableStream<Uint8Array>;\n options?: { encoding?: string };\n} {\n if (typeof content === 'string') {\n return { content, options: { encoding: 'utf8' } };\n }\n return { content: bytesToStream(content) };\n}\n\nfunction createStats(info: {\n size?: number;\n type?: t.CloudflareSandboxFileInfo['type'];\n}): Stats {\n const type = info.type ?? 'file';\n const now = new Date();\n return {\n size: info.size ?? 0,\n isFile: () => type === 'file',\n isDirectory: () => type === 'directory',\n isSymbolicLink: () => type === 'symlink',\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: 0,\n ino: 0,\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n atimeMs: now.getTime(),\n mtimeMs: now.getTime(),\n ctimeMs: now.getTime(),\n birthtimeMs: now.getTime(),\n atime: now,\n mtime: now,\n ctime: now,\n birthtime: now,\n } as Stats;\n}\n\nfunction normalizeFileList(\n result: t.CloudflareSandboxListFilesResult\n): t.CloudflareSandboxFileInfo[] {\n return Array.isArray(result) ? result : result.files;\n}\n\nfunction entryNameFor(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.name !== '') {\n return info.name.includes('/') ? path.basename(info.name) : info.name;\n }\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.basename(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.basename(info.relativePath);\n }\n return path.basename(parentPath);\n}\n\nfunction entryAbsolutePath(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.normalize(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.resolve(parentPath, info.relativePath);\n }\n return path.resolve(parentPath, info.name);\n}\n\nfunction createDirent(info: t.CloudflareSandboxFileInfo): ReaddirEntry {\n return {\n name: entryNameFor(info, ''),\n isFile: () => (info.type ?? 'file') === 'file',\n isDirectory: () => info.type === 'directory',\n isSymbolicLink: () => info.type === 'symlink',\n };\n}\n\nasync function findChildInfo(\n sandbox: t.CloudflareSandboxRuntime,\n filePath: string\n): Promise<t.CloudflareSandboxFileInfo | undefined> {\n const parent = path.dirname(filePath);\n const basename = path.basename(filePath);\n const entries = normalizeFileList(\n await sandbox.listFiles(parent, { includeHidden: true })\n );\n return entries.find((entry) => {\n const absolute = entryAbsolutePath(entry, parent);\n return absolute === filePath || entryNameFor(entry, parent) === basename;\n });\n}\n\nexport function createCloudflareWorkspaceFS(\n config: t.CloudflareSandboxExecutionConfig\n): WorkspaceFS {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n\n const fs: WorkspaceFS = {\n readFile: (async (filePath: string, encoding?: 'utf8') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved, encoding ? { encoding } : undefined)\n );\n return encoding != null ? buffer.toString(encoding) : buffer;\n }) as WorkspaceFS['readFile'],\n writeFile: async (\n filePath: string,\n content: string | Buffer,\n _options?: WriteFileOptions\n ) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const normalized = normalizeWriteFileContent(content);\n await sandbox.writeFile(resolved, normalized.content, normalized.options);\n },\n stat: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n if (resolved === workspaceRoot) {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n }\n const info = await findChildInfo(sandbox, resolved);\n if (info != null) {\n return createStats({ size: info.size, type: info.type });\n }\n try {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n } catch {\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return createStats({ size: buffer.length, type: 'file' });\n }\n },\n readdir: (async (filePath: string, options?: { withFileTypes: true }) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n if (options?.withFileTypes === true) {\n return entries.map(createDirent);\n }\n return entries.map((entry) => entryNameFor(entry, resolved));\n }) as WorkspaceFS['readdir'],\n mkdir: async (filePath: string, options?: MakeDirectoryOptions) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.mkdir(toSandboxPath(filePath, workspaceRoot), {\n recursive: options?.recursive,\n });\n },\n realpath: async (filePath: string) =>\n toSandboxPath(filePath, workspaceRoot),\n unlink: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.deleteFile(toSandboxPath(filePath, workspaceRoot));\n },\n open: async (filePath: string, _flags: 'r') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return {\n read: async (\n target: Buffer,\n offset: number,\n length: number,\n position: number\n ) => {\n const start = Math.max(position, 0);\n const slice = buffer.subarray(start, start + length);\n slice.copy(target, offset);\n return { bytesRead: slice.length, buffer: target };\n },\n close: async () => undefined,\n } as unknown as FileHandle;\n },\n };\n\n return fs;\n}\n\nfunction createCloudflareSpawn(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalSpawn {\n return (command, args, options) => {\n const stdout = new PassThrough();\n const stderr = new PassThrough();\n const abortController = new AbortController();\n const child = new EventEmitter() as ChildProcessWithoutNullStreams;\n const state = { closed: false };\n const closeOnce = (\n exitCode: number | null,\n signal: NodeJS.Signals | null\n ): void => {\n if (state.closed) {\n return;\n }\n state.closed = true;\n stdout.end();\n stderr.end();\n Object.assign(child, {\n exitCode,\n signalCode: signal,\n });\n child.emit('close', exitCode, signal);\n };\n Object.assign(child, {\n stdout,\n stderr,\n stdin: new PassThrough(),\n stdio: [null, stdout, stderr],\n killed: false,\n exitCode: null,\n signalCode: null,\n pid: undefined,\n kill: (signal: NodeJS.Signals = 'SIGTERM') => {\n Object.assign(child, { killed: true, signalCode: signal });\n abortController.abort();\n closeOnce(null, signal);\n return true;\n },\n });\n\n void (async (): Promise<void> => {\n const ctx = await getRuntimeContext(config);\n const rendered = [command, ...args].map(quote).join(' ');\n const spawnTimeoutMs = (\n options as {\n [LOCAL_SPAWN_TIMEOUT_MS]?: number;\n }\n )[LOCAL_SPAWN_TIMEOUT_MS];\n const timeoutMs =\n typeof spawnTimeoutMs === 'number' && Number.isFinite(spawnTimeoutMs)\n ? spawnTimeoutMs\n : ctx.timeoutMs;\n const timedCommand = withInSandboxTimeout(rendered, timeoutMs);\n const cwd =\n options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();\n try {\n const result = await ctx.sandbox.exec(timedCommand, {\n cwd,\n env: ctx.env,\n timeout: outerTimeoutMs(timeoutMs),\n signal: abortController.signal,\n });\n if (state.closed) {\n return;\n }\n if (result.stdout) stdout.write(result.stdout);\n if (result.stderr) stderr.write(result.stderr);\n closeOnce(result.exitCode, null);\n } catch (error) {\n if (state.closed) {\n return;\n }\n stderr.write((error as Error).message);\n closeOnce(1, null);\n }\n })();\n\n return child;\n };\n}\n\nexport function createCloudflareLocalExecutionConfig(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalExecutionConfig {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n return {\n cwd: workspaceRoot,\n workspace: { root: workspaceRoot },\n exec: {\n spawn: createCloudflareSpawn(config),\n fs: createCloudflareWorkspaceFS(config),\n sandboxed: true,\n },\n shell: config.shell ?? 'bash',\n timeoutMs: config.timeoutMs,\n maxOutputChars: config.maxOutputChars,\n env: config.env,\n includeCodingTools: config.includeCodingTools,\n compileCheck: config.compileCheck,\n readOnly: config.readOnly,\n allowDangerousCommands: config.allowDangerousCommands,\n bashAst: config.bashAst,\n fileCheckpointing: config.fileCheckpointing,\n maxReadBytes: config.maxReadBytes,\n attachReadAttachments: config.attachReadAttachments,\n maxAttachmentBytes: config.maxAttachmentBytes,\n postEditSyntaxCheck: config.postEditSyntaxCheck,\n };\n}\n\nexport async function validateCloudflareBashCommand(\n command: string,\n args: readonly string[],\n config: t.CloudflareSandboxExecutionConfig\n): Promise<void> {\n const localConfig = createCloudflareLocalExecutionConfig(config);\n const validation = await validateBashCommand(command, localConfig);\n if (!validation.valid) {\n throw new Error(validation.errors.join('\\n'));\n }\n\n if (\n args.length > 0 &&\n config.allowDangerousCommands !== true &&\n DESTRUCTIVE_OP_IN_COMMAND_RE.test(command)\n ) {\n const offending = args.find((arg) => PROTECTED_TARGET_ARG_RE.test(arg));\n if (offending !== undefined) {\n throw new Error(\n `Command matches a destructive command pattern (protected target \"${offending}\" passed via positional arg).`\n );\n }\n }\n}\n\nexport async function executeCloudflareBash(\n command: string,\n config: t.CloudflareSandboxExecutionConfig,\n args: readonly string[] = []\n): Promise<SpawnResult> {\n await validateCloudflareBashCommand(command, args, config);\n const ctx = await getRuntimeContext(config);\n const shellCommand =\n args.length > 0\n ? `${ctx.shell} -lc ${quote(command)} -- ${args.map(quote).join(' ')}`\n : `${ctx.shell} -lc ${quote(command)}`;\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(shellCommand, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n}\n\nfunction runtimeForCode(\n lang: string,\n tempDir: string,\n code: string,\n args: string[] = [],\n shell = 'bash'\n): RuntimeCommand {\n const fileFor = (name: string): string => path.join(tempDir, name);\n const argText = args.map(quote).join(' ');\n switch (lang) {\n case 'py':\n case 'python':\n return {\n fileName: 'main.py',\n source: code,\n command: `python3 ${quote(fileFor('main.py'))} ${argText}`,\n };\n case 'js':\n case 'javascript':\n return {\n fileName: 'main.js',\n source: code,\n command: `node ${quote(fileFor('main.js'))} ${argText}`,\n };\n case 'ts':\n case 'typescript':\n return {\n fileName: 'main.ts',\n source: code,\n command: `npx --no-install tsx ${quote(fileFor('main.ts'))} ${argText}`,\n };\n case 'php':\n return {\n fileName: 'main.php',\n source: code,\n command: `php ${quote(fileFor('main.php'))} ${argText}`,\n };\n case 'go':\n return {\n fileName: 'main.go',\n source: code,\n command: `go run ${quote(fileFor('main.go'))} ${argText}`,\n };\n case 'rs':\n return {\n fileName: 'main.rs',\n source: code,\n command: `${shell} -lc ${quote(\n `rustc ${quote(fileFor('main.rs'))} -o ${quote(fileFor('main-rs'))} && ${quote(fileFor('main-rs'))} ${argText}`\n )}`,\n };\n case 'c':\n return {\n fileName: 'main.c',\n source: code,\n command: `${shell} -lc ${quote(\n `cc ${quote(fileFor('main.c'))} -o ${quote(fileFor('main-c'))} && ${quote(fileFor('main-c'))} ${argText}`\n )}`,\n };\n case 'cpp':\n return {\n fileName: 'main.cpp',\n source: code,\n command: `${shell} -lc ${quote(\n `c++ ${quote(fileFor('main.cpp'))} -o ${quote(fileFor('main-cpp'))} && ${quote(fileFor('main-cpp'))} ${argText}`\n )}`,\n };\n case 'java':\n return {\n fileName: 'Main.java',\n source: code,\n command: `${shell} -lc ${quote(\n `javac ${quote(fileFor('Main.java'))} && java -cp ${quote(tempDir)} Main ${argText}`\n )}`,\n };\n case 'r':\n return {\n fileName: 'main.R',\n source: code,\n command: `Rscript ${quote(fileFor('main.R'))} ${argText}`,\n };\n case 'd':\n return {\n fileName: 'main.d',\n source: code,\n command: `${shell} -lc ${quote(\n `dmd ${quote(fileFor('main.d'))} -of=${quote(fileFor('main-d'))} && ${quote(fileFor('main-d'))} ${argText}`\n )}`,\n };\n case 'f90':\n return {\n fileName: 'main.f90',\n source: code,\n command: `${shell} -lc ${quote(\n `gfortran ${quote(fileFor('main.f90'))} -o ${quote(fileFor('main-f90'))} && ${quote(fileFor('main-f90'))} ${argText}`\n )}`,\n };\n case 'bash':\n case 'sh':\n return {\n fileName: 'main.sh',\n source: code,\n command: `${shell} -lc ${quote(code)} -- ${argText}`,\n };\n default:\n throw new Error(`Unsupported Cloudflare sandbox runtime: ${lang}`);\n }\n}\n\nexport async function executeCloudflareCode(\n input: { lang: string; code: string; args?: string[] },\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SpawnResult> {\n if (input.lang === 'bash' || input.lang === 'sh') {\n return executeCloudflareBash(input.code, config, input.args ?? []);\n }\n const ctx = await getRuntimeContext(config);\n const id = globalThis.crypto.randomUUID();\n const tempDir = path.join(ctx.workspaceRoot, '.lc-exec', id);\n const runtime = runtimeForCode(\n input.lang,\n tempDir,\n input.code,\n input.args,\n ctx.shell\n );\n await ctx.sandbox.mkdir(tempDir, { recursive: true });\n if (runtime.source != null) {\n await ctx.sandbox.writeFile(\n path.join(tempDir, runtime.fileName),\n runtime.source,\n {\n encoding: 'utf8',\n }\n );\n }\n try {\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(runtime.command, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n } finally {\n await ctx.sandbox\n .exec(`rm -rf ${quote(tempDir)}`, {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: 10000,\n })\n .catch(() => undefined);\n }\n}\n\nexport function formatCloudflareOutput(\n result: SpawnResult,\n cwd: string\n): string {\n let formatted = '';\n if (result.stdout !== '') {\n formatted += `stdout:\\n${result.stdout}\\n`;\n } else {\n formatted += 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\n }\n if (result.stderr !== '') {\n formatted += `stderr:\\n${result.stderr}\\n`;\n }\n if (result.exitCode != null && result.exitCode !== 0) {\n formatted += `exit_code: ${result.exitCode}\\n`;\n }\n if (result.timedOut) {\n formatted += 'timed_out: true\\n';\n }\n formatted += `working_directory: ${cwd}`;\n return formatted.trim();\n}\n"],"names":["path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CloudflareSandboxExecutionEngine.mjs","sources":["../../../../src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { PassThrough } from 'stream';\nimport { posix as path } from 'path';\nimport type { ChildProcessWithoutNullStreams } from 'child_process';\nimport type { WriteFileOptions, MakeDirectoryOptions, Stats } from 'fs';\nimport type { FileHandle } from 'fs/promises';\nimport type * as t from '@/types';\nimport {\n LOCAL_SPAWN_TIMEOUT_MS,\n validateBashCommand,\n} from '@/tools/local/LocalExecutionEngine';\nimport type { WorkspaceFS, ReaddirEntry } from '@/tools/local/workspaceFS';\n\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_TIMEOUT_MS = 60000;\nconst DEFAULT_MAX_OUTPUT_CHARS = 200000;\nconst PROTECTED_TARGET_ARG_RE = /^(?:\\/|~|\\$\\{?HOME\\}?|\\.)(?:\\/?\\.?\\*|\\/)?$/;\nconst DESTRUCTIVE_OP_IN_COMMAND_RE =\n /\\b(?:rm\\s+-[^\\s]*[rf]|chmod\\s+-R|chown\\s+-R)\\b/;\n\ntype SpawnResult = {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n};\n\ntype RuntimeCommand = {\n fileName: string;\n source?: string;\n command: string;\n};\n\ntype SandboxRuntimeContext = {\n sandbox: t.CloudflareSandboxRuntime;\n workspaceRoot: string;\n env?: Record<string, string | undefined>;\n timeoutMs: number;\n maxOutputChars: number;\n shell: string;\n};\n\nconst sandboxFactoryCache = new WeakMap<\n t.CloudflareSandboxExecutionConfig,\n Promise<t.CloudflareSandboxRuntime>\n>();\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nexport function getCloudflareWorkspaceRoot(\n config?: t.CloudflareSandboxExecutionConfig\n): string {\n return normalizeWorkspaceRoot(\n config?.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n}\n\nexport async function resolveCloudflareSandbox(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<t.CloudflareSandboxRuntime> {\n const sandbox = config.sandbox;\n if (typeof sandbox !== 'function') {\n return sandbox;\n }\n let cached = sandboxFactoryCache.get(config);\n if (cached == null) {\n cached = Promise.resolve()\n .then(() => sandbox())\n .catch((error: unknown) => {\n sandboxFactoryCache.delete(config);\n throw error;\n });\n sandboxFactoryCache.set(config, cached);\n }\n return cached;\n}\n\nasync function getRuntimeContext(\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SandboxRuntimeContext> {\n return {\n sandbox: await resolveCloudflareSandbox(config),\n workspaceRoot: getCloudflareWorkspaceRoot(config),\n env: config.env,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxOutputChars: config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS,\n shell: config.shell ?? 'bash',\n };\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction withInSandboxTimeout(command: string, timeoutMs: number): string {\n const timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));\n return `timeout -k 2s ${timeoutSeconds}s ${command}`;\n}\n\nfunction outerTimeoutMs(timeoutMs: number): number {\n return timeoutMs + 5000;\n}\n\nfunction isInSandboxTimeoutExit(exitCode: number | null): boolean {\n return exitCode === 124 || exitCode === 137;\n}\n\nfunction truncateOutput(value: string, maxChars: number): string {\n if (maxChars <= 0 || value.length <= maxChars) {\n return value;\n }\n const head = Math.max(Math.floor(maxChars / 2), 0);\n const tail = Math.max(maxChars - head, 0);\n return `${value.slice(0, head)}\\n...[truncated ${value.length - maxChars} chars]...\\n${value.slice(value.length - tail)}`;\n}\n\nasync function readStream(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n}\n\nasync function normalizeReadFileContent(\n result: t.CloudflareSandboxReadFileResult\n): Promise<Buffer> {\n if (typeof result === 'string') {\n return Buffer.from(result, 'utf8');\n }\n if (Buffer.isBuffer(result)) {\n return result;\n }\n if (result instanceof Uint8Array) {\n return Buffer.from(result);\n }\n const content = result.content;\n if (typeof content === 'string') {\n if (result.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, 'utf8');\n }\n if (Buffer.isBuffer(content)) {\n return content;\n }\n if (content instanceof Uint8Array) {\n return Buffer.from(content);\n }\n return readStream(content);\n}\n\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller): void {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\nfunction normalizeWriteFileContent(content: string | Buffer | Uint8Array): {\n content: string | ReadableStream<Uint8Array>;\n options?: { encoding?: string };\n} {\n if (typeof content === 'string') {\n return { content, options: { encoding: 'utf8' } };\n }\n return { content: bytesToStream(content) };\n}\n\nfunction createStats(info: {\n size?: number;\n type?: t.CloudflareSandboxFileInfo['type'];\n}): Stats {\n const type = info.type ?? 'file';\n const now = new Date();\n return {\n size: info.size ?? 0,\n isFile: () => type === 'file',\n isDirectory: () => type === 'directory',\n isSymbolicLink: () => type === 'symlink',\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: 0,\n ino: 0,\n mode: 0,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n blksize: 0,\n blocks: 0,\n atimeMs: now.getTime(),\n mtimeMs: now.getTime(),\n ctimeMs: now.getTime(),\n birthtimeMs: now.getTime(),\n atime: now,\n mtime: now,\n ctime: now,\n birthtime: now,\n } as Stats;\n}\n\nfunction normalizeFileList(\n result: t.CloudflareSandboxListFilesResult\n): t.CloudflareSandboxFileInfo[] {\n return Array.isArray(result) ? result : result.files;\n}\n\nfunction entryNameFor(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.name !== '') {\n return info.name.includes('/') ? path.basename(info.name) : info.name;\n }\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.basename(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.basename(info.relativePath);\n }\n return path.basename(parentPath);\n}\n\nfunction entryAbsolutePath(\n info: t.CloudflareSandboxFileInfo,\n parentPath: string\n): string {\n if (info.absolutePath != null && info.absolutePath !== '') {\n return path.normalize(info.absolutePath);\n }\n if (info.relativePath != null && info.relativePath !== '') {\n return path.resolve(parentPath, info.relativePath);\n }\n return path.resolve(parentPath, info.name);\n}\n\nfunction createDirent(info: t.CloudflareSandboxFileInfo): ReaddirEntry {\n return {\n name: entryNameFor(info, ''),\n isFile: () => (info.type ?? 'file') === 'file',\n isDirectory: () => info.type === 'directory',\n isSymbolicLink: () => info.type === 'symlink',\n };\n}\n\nasync function findChildInfo(\n sandbox: t.CloudflareSandboxRuntime,\n filePath: string\n): Promise<t.CloudflareSandboxFileInfo | undefined> {\n const parent = path.dirname(filePath);\n const basename = path.basename(filePath);\n const entries = normalizeFileList(\n await sandbox.listFiles(parent, { includeHidden: true })\n );\n return entries.find((entry) => {\n const absolute = entryAbsolutePath(entry, parent);\n return absolute === filePath || entryNameFor(entry, parent) === basename;\n });\n}\n\nexport function createCloudflareWorkspaceFS(\n config: t.CloudflareSandboxExecutionConfig\n): WorkspaceFS {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n\n const fs: WorkspaceFS = {\n readFile: (async (filePath: string, encoding?: 'utf8') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved, encoding ? { encoding } : undefined)\n );\n return encoding != null ? buffer.toString(encoding) : buffer;\n }) as WorkspaceFS['readFile'],\n writeFile: async (\n filePath: string,\n content: string | Buffer,\n _options?: WriteFileOptions\n ) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const normalized = normalizeWriteFileContent(content);\n await sandbox.writeFile(resolved, normalized.content, normalized.options);\n },\n stat: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n if (resolved === workspaceRoot) {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n }\n const info = await findChildInfo(sandbox, resolved);\n if (info != null) {\n return createStats({ size: info.size, type: info.type });\n }\n try {\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n return createStats({ size: entries.length, type: 'directory' });\n } catch {\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return createStats({ size: buffer.length, type: 'file' });\n }\n },\n readdir: (async (filePath: string, options?: { withFileTypes: true }) => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const entries = normalizeFileList(\n await sandbox.listFiles(resolved, { includeHidden: true })\n );\n if (options?.withFileTypes === true) {\n return entries.map(createDirent);\n }\n return entries.map((entry) => entryNameFor(entry, resolved));\n }) as WorkspaceFS['readdir'],\n mkdir: async (filePath: string, options?: MakeDirectoryOptions) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.mkdir(toSandboxPath(filePath, workspaceRoot), {\n recursive: options?.recursive,\n });\n },\n realpath: async (filePath: string) =>\n toSandboxPath(filePath, workspaceRoot),\n unlink: async (filePath: string) => {\n const sandbox = await resolveCloudflareSandbox(config);\n await sandbox.deleteFile(toSandboxPath(filePath, workspaceRoot));\n },\n open: async (filePath: string, _flags: 'r') => {\n const sandbox = await resolveCloudflareSandbox(config);\n const resolved = toSandboxPath(filePath, workspaceRoot);\n const buffer = await normalizeReadFileContent(\n await sandbox.readFile(resolved)\n );\n return {\n read: async (\n target: Buffer,\n offset: number,\n length: number,\n position: number\n ) => {\n const start = Math.max(position, 0);\n const slice = buffer.subarray(start, start + length);\n slice.copy(target, offset);\n return { bytesRead: slice.length, buffer: target };\n },\n close: async () => undefined,\n } as unknown as FileHandle;\n },\n };\n\n return fs;\n}\n\nfunction createCloudflareSpawn(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalSpawn {\n return (command, args, options) => {\n const stdout = new PassThrough();\n const stderr = new PassThrough();\n const child = new EventEmitter() as ChildProcessWithoutNullStreams;\n const abortController = new AbortController();\n const state = { closed: false };\n const closeOnce = (\n exitCode: number | null,\n signal: NodeJS.Signals | null\n ): void => {\n if (state.closed) {\n return;\n }\n state.closed = true;\n stdout.end();\n stderr.end();\n Object.assign(child, {\n exitCode,\n signalCode: signal,\n });\n child.emit('close', exitCode, signal);\n };\n Object.assign(child, {\n stdout,\n stderr,\n stdin: new PassThrough(),\n stdio: [null, stdout, stderr],\n killed: false,\n exitCode: null,\n signalCode: null,\n pid: undefined,\n kill: (signal: NodeJS.Signals = 'SIGTERM') => {\n Object.assign(child, { killed: true, signalCode: signal });\n abortController.abort();\n closeOnce(null, signal);\n return true;\n },\n });\n\n void (async (): Promise<void> => {\n const ctx = await getRuntimeContext(config);\n const rendered = [command, ...args].map(quote).join(' ');\n const spawnTimeoutMs = (\n options as {\n [LOCAL_SPAWN_TIMEOUT_MS]?: number;\n }\n )[LOCAL_SPAWN_TIMEOUT_MS];\n const timeoutMs =\n typeof spawnTimeoutMs === 'number' && Number.isFinite(spawnTimeoutMs)\n ? spawnTimeoutMs\n : ctx.timeoutMs;\n const timedCommand = withInSandboxTimeout(rendered, timeoutMs);\n const cwd =\n options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();\n if (state.closed) {\n return;\n }\n const execOptions: t.CloudflareSandboxExecOptions = {\n cwd,\n env: ctx.env,\n timeout: outerTimeoutMs(timeoutMs),\n };\n if (ctx.sandbox.supportsExecSignal === true) {\n execOptions.signal = abortController.signal;\n }\n try {\n const result = await ctx.sandbox.exec(timedCommand, execOptions);\n if (state.closed) {\n return;\n }\n if (result.stdout) stdout.write(result.stdout);\n if (result.stderr) stderr.write(result.stderr);\n closeOnce(result.exitCode, null);\n } catch (error) {\n if (state.closed) {\n return;\n }\n stderr.write((error as Error).message);\n closeOnce(1, null);\n }\n })();\n\n return child;\n };\n}\n\nexport function createCloudflareLocalExecutionConfig(\n config: t.CloudflareSandboxExecutionConfig\n): t.LocalExecutionConfig {\n const workspaceRoot = getCloudflareWorkspaceRoot(config);\n return {\n cwd: workspaceRoot,\n workspace: { root: workspaceRoot },\n exec: {\n spawn: createCloudflareSpawn(config),\n fs: createCloudflareWorkspaceFS(config),\n sandboxed: true,\n },\n shell: config.shell ?? 'bash',\n timeoutMs: config.timeoutMs,\n maxOutputChars: config.maxOutputChars,\n env: config.env,\n includeCodingTools: config.includeCodingTools,\n compileCheck: config.compileCheck,\n readOnly: config.readOnly,\n allowDangerousCommands: config.allowDangerousCommands,\n bashAst: config.bashAst,\n fileCheckpointing: config.fileCheckpointing,\n maxReadBytes: config.maxReadBytes,\n attachReadAttachments: config.attachReadAttachments,\n maxAttachmentBytes: config.maxAttachmentBytes,\n postEditSyntaxCheck: config.postEditSyntaxCheck,\n };\n}\n\nexport async function validateCloudflareBashCommand(\n command: string,\n args: readonly string[],\n config: t.CloudflareSandboxExecutionConfig\n): Promise<void> {\n const localConfig = createCloudflareLocalExecutionConfig(config);\n const validation = await validateBashCommand(command, localConfig);\n if (!validation.valid) {\n throw new Error(validation.errors.join('\\n'));\n }\n\n if (\n args.length > 0 &&\n config.allowDangerousCommands !== true &&\n DESTRUCTIVE_OP_IN_COMMAND_RE.test(command)\n ) {\n const offending = args.find((arg) => PROTECTED_TARGET_ARG_RE.test(arg));\n if (offending !== undefined) {\n throw new Error(\n `Command matches a destructive command pattern (protected target \"${offending}\" passed via positional arg).`\n );\n }\n }\n}\n\nexport async function executeCloudflareBash(\n command: string,\n config: t.CloudflareSandboxExecutionConfig,\n args: readonly string[] = []\n): Promise<SpawnResult> {\n await validateCloudflareBashCommand(command, args, config);\n const ctx = await getRuntimeContext(config);\n const shellCommand =\n args.length > 0\n ? `${ctx.shell} -lc ${quote(command)} -- ${args.map(quote).join(' ')}`\n : `${ctx.shell} -lc ${quote(command)}`;\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(shellCommand, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n}\n\nfunction runtimeForCode(\n lang: string,\n tempDir: string,\n code: string,\n args: string[] = [],\n shell = 'bash'\n): RuntimeCommand {\n const fileFor = (name: string): string => path.join(tempDir, name);\n const argText = args.map(quote).join(' ');\n switch (lang) {\n case 'py':\n case 'python':\n return {\n fileName: 'main.py',\n source: code,\n command: `python3 ${quote(fileFor('main.py'))} ${argText}`,\n };\n case 'js':\n case 'javascript':\n return {\n fileName: 'main.js',\n source: code,\n command: `node ${quote(fileFor('main.js'))} ${argText}`,\n };\n case 'ts':\n case 'typescript':\n return {\n fileName: 'main.ts',\n source: code,\n command: `npx --no-install tsx ${quote(fileFor('main.ts'))} ${argText}`,\n };\n case 'php':\n return {\n fileName: 'main.php',\n source: code,\n command: `php ${quote(fileFor('main.php'))} ${argText}`,\n };\n case 'go':\n return {\n fileName: 'main.go',\n source: code,\n command: `go run ${quote(fileFor('main.go'))} ${argText}`,\n };\n case 'rs':\n return {\n fileName: 'main.rs',\n source: code,\n command: `${shell} -lc ${quote(\n `rustc ${quote(fileFor('main.rs'))} -o ${quote(fileFor('main-rs'))} && ${quote(fileFor('main-rs'))} ${argText}`\n )}`,\n };\n case 'c':\n return {\n fileName: 'main.c',\n source: code,\n command: `${shell} -lc ${quote(\n `cc ${quote(fileFor('main.c'))} -o ${quote(fileFor('main-c'))} && ${quote(fileFor('main-c'))} ${argText}`\n )}`,\n };\n case 'cpp':\n return {\n fileName: 'main.cpp',\n source: code,\n command: `${shell} -lc ${quote(\n `c++ ${quote(fileFor('main.cpp'))} -o ${quote(fileFor('main-cpp'))} && ${quote(fileFor('main-cpp'))} ${argText}`\n )}`,\n };\n case 'java':\n return {\n fileName: 'Main.java',\n source: code,\n command: `${shell} -lc ${quote(\n `javac ${quote(fileFor('Main.java'))} && java -cp ${quote(tempDir)} Main ${argText}`\n )}`,\n };\n case 'r':\n return {\n fileName: 'main.R',\n source: code,\n command: `Rscript ${quote(fileFor('main.R'))} ${argText}`,\n };\n case 'd':\n return {\n fileName: 'main.d',\n source: code,\n command: `${shell} -lc ${quote(\n `dmd ${quote(fileFor('main.d'))} -of=${quote(fileFor('main-d'))} && ${quote(fileFor('main-d'))} ${argText}`\n )}`,\n };\n case 'f90':\n return {\n fileName: 'main.f90',\n source: code,\n command: `${shell} -lc ${quote(\n `gfortran ${quote(fileFor('main.f90'))} -o ${quote(fileFor('main-f90'))} && ${quote(fileFor('main-f90'))} ${argText}`\n )}`,\n };\n case 'bash':\n case 'sh':\n return {\n fileName: 'main.sh',\n source: code,\n command: `${shell} -lc ${quote(code)} -- ${argText}`,\n };\n default:\n throw new Error(`Unsupported Cloudflare sandbox runtime: ${lang}`);\n }\n}\n\nexport async function executeCloudflareCode(\n input: { lang: string; code: string; args?: string[] },\n config: t.CloudflareSandboxExecutionConfig\n): Promise<SpawnResult> {\n if (input.lang === 'bash' || input.lang === 'sh') {\n return executeCloudflareBash(input.code, config, input.args ?? []);\n }\n const ctx = await getRuntimeContext(config);\n const id = globalThis.crypto.randomUUID();\n const tempDir = path.join(ctx.workspaceRoot, '.lc-exec', id);\n const runtime = runtimeForCode(\n input.lang,\n tempDir,\n input.code,\n input.args,\n ctx.shell\n );\n await ctx.sandbox.mkdir(tempDir, { recursive: true });\n if (runtime.source != null) {\n await ctx.sandbox.writeFile(\n path.join(tempDir, runtime.fileName),\n runtime.source,\n {\n encoding: 'utf8',\n }\n );\n }\n try {\n const result = await ctx.sandbox.exec(\n withInSandboxTimeout(runtime.command, ctx.timeoutMs),\n {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: outerTimeoutMs(ctx.timeoutMs),\n }\n );\n return {\n stdout: truncateOutput(result.stdout, ctx.maxOutputChars),\n stderr: truncateOutput(result.stderr, ctx.maxOutputChars),\n exitCode: result.exitCode,\n timedOut: isInSandboxTimeoutExit(result.exitCode),\n };\n } finally {\n await ctx.sandbox\n .exec(`rm -rf ${quote(tempDir)}`, {\n cwd: ctx.workspaceRoot,\n env: ctx.env,\n timeout: 10000,\n })\n .catch(() => undefined);\n }\n}\n\nexport function formatCloudflareOutput(\n result: SpawnResult,\n cwd: string\n): string {\n let formatted = '';\n if (result.stdout !== '') {\n formatted += `stdout:\\n${result.stdout}\\n`;\n } else {\n formatted += 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\n }\n if (result.stderr !== '') {\n formatted += `stderr:\\n${result.stderr}\\n`;\n }\n if (result.exitCode != null && result.exitCode !== 0) {\n formatted += `exit_code: ${result.exitCode}\\n`;\n }\n if (result.timedOut) {\n formatted += 'timed_out: true\\n';\n }\n formatted += `working_directory: ${cwd}`;\n return formatted.trim();\n}\n"],"names":["path"],"mappings":"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"}
|
|
@@ -791,6 +791,12 @@ export type CloudflareSandboxListFilesResult = CloudflareSandboxFileInfo[] | {
|
|
|
791
791
|
success?: boolean;
|
|
792
792
|
};
|
|
793
793
|
export interface CloudflareSandboxRuntime {
|
|
794
|
+
/**
|
|
795
|
+
* True when this runtime can consume AbortSignal values in exec options.
|
|
796
|
+
* Native Cloudflare Sandbox Durable Object RPC cannot clone AbortSignal,
|
|
797
|
+
* but HTTP bridge runtimes can use it to abort the underlying fetch.
|
|
798
|
+
*/
|
|
799
|
+
supportsExecSignal?: boolean;
|
|
794
800
|
exec(command: string, options?: CloudflareSandboxExecOptions): Promise<CloudflareSandboxExecResult>;
|
|
795
801
|
readFile(path: string, options?: {
|
|
796
802
|
encoding?: string;
|
package/package.json
CHANGED
|
@@ -107,26 +107,105 @@ describe('Cloudflare sandbox execution backend', () => {
|
|
|
107
107
|
expect(listPaths).toEqual(['/workspace']);
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
it('
|
|
111
|
-
let
|
|
110
|
+
it('does not pass AbortSignal to Cloudflare spawn exec options', async () => {
|
|
111
|
+
let resolveExecCalled!: () => void;
|
|
112
|
+
const execCalled = new Promise<void>((resolve) => {
|
|
113
|
+
resolveExecCalled = resolve;
|
|
114
|
+
});
|
|
115
|
+
let receivedOptions: t.CloudflareSandboxExecOptions | undefined;
|
|
116
|
+
const sandbox = createRuntime({
|
|
117
|
+
exec: (_command, options) => {
|
|
118
|
+
receivedOptions = options;
|
|
119
|
+
resolveExecCalled();
|
|
120
|
+
return new Promise<t.CloudflareSandboxExecResult>(() => undefined);
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
const config = createCloudflareLocalExecutionConfig({
|
|
124
|
+
sandbox,
|
|
125
|
+
timeoutMs: 50,
|
|
126
|
+
workspaceRoot: '/workspace',
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const resultPromise = spawnLocalProcess(
|
|
130
|
+
'bash',
|
|
131
|
+
['-lc', 'sleep 10'],
|
|
132
|
+
config
|
|
133
|
+
);
|
|
134
|
+
await execCalled;
|
|
135
|
+
const result = await resultPromise;
|
|
136
|
+
|
|
137
|
+
expect(receivedOptions).not.toHaveProperty('signal');
|
|
138
|
+
expect(result.timedOut).toBe(true);
|
|
139
|
+
expect(result.exitCode).toBe(143);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('passes AbortSignal to signal-aware runtimes and aborts it on kill', async () => {
|
|
143
|
+
let resolveExecCalled!: () => void;
|
|
144
|
+
const execCalled = new Promise<void>((resolve) => {
|
|
145
|
+
resolveExecCalled = resolve;
|
|
146
|
+
});
|
|
147
|
+
let receivedSignal: AbortSignal | undefined;
|
|
148
|
+
let abortEvents = 0;
|
|
112
149
|
const sandbox = createRuntime({
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
150
|
+
supportsExecSignal: true,
|
|
151
|
+
exec: (_command, options) => {
|
|
152
|
+
receivedSignal = options?.signal;
|
|
153
|
+
receivedSignal?.addEventListener('abort', () => {
|
|
154
|
+
abortEvents += 1;
|
|
155
|
+
});
|
|
156
|
+
resolveExecCalled();
|
|
157
|
+
return new Promise<t.CloudflareSandboxExecResult>(() => undefined);
|
|
158
|
+
},
|
|
118
159
|
});
|
|
119
160
|
const config = createCloudflareLocalExecutionConfig({
|
|
120
161
|
sandbox,
|
|
162
|
+
timeoutMs: 50,
|
|
163
|
+
workspaceRoot: '/workspace',
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const resultPromise = spawnLocalProcess(
|
|
167
|
+
'bash',
|
|
168
|
+
['-lc', 'sleep 10'],
|
|
169
|
+
config
|
|
170
|
+
);
|
|
171
|
+
await execCalled;
|
|
172
|
+
const result = await resultPromise;
|
|
173
|
+
|
|
174
|
+
expect(receivedSignal).toBeDefined();
|
|
175
|
+
expect(receivedSignal?.aborted).toBe(true);
|
|
176
|
+
expect(abortEvents).toBe(1);
|
|
177
|
+
expect(result.timedOut).toBe(true);
|
|
178
|
+
expect(result.exitCode).toBe(143);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('does not start remote exec when killed before async sandbox resolution finishes', async () => {
|
|
182
|
+
let execCalls = 0;
|
|
183
|
+
let resolveSandbox!: (runtime: t.CloudflareSandboxRuntime) => void;
|
|
184
|
+
const sandboxPromise = new Promise<t.CloudflareSandboxRuntime>(
|
|
185
|
+
(resolve) => {
|
|
186
|
+
resolveSandbox = resolve;
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
const config = createCloudflareLocalExecutionConfig({
|
|
190
|
+
sandbox: () => sandboxPromise,
|
|
121
191
|
timeoutMs: 10,
|
|
122
192
|
workspaceRoot: '/workspace',
|
|
123
193
|
});
|
|
124
194
|
|
|
125
195
|
const result = await spawnLocalProcess('bash', ['-lc', 'sleep 10'], config);
|
|
196
|
+
resolveSandbox(
|
|
197
|
+
createRuntime({
|
|
198
|
+
exec: async () => {
|
|
199
|
+
execCalls += 1;
|
|
200
|
+
return { exitCode: 0, stdout: '', stderr: '' };
|
|
201
|
+
},
|
|
202
|
+
})
|
|
203
|
+
);
|
|
204
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
126
205
|
|
|
127
|
-
expect(signal?.aborted).toBe(true);
|
|
128
206
|
expect(result.timedOut).toBe(true);
|
|
129
207
|
expect(result.exitCode).toBe(143);
|
|
208
|
+
expect(execCalls).toBe(0);
|
|
130
209
|
});
|
|
131
210
|
|
|
132
211
|
it('memoizes sandbox factory results per config object', async () => {
|
|
@@ -400,8 +400,8 @@ function createCloudflareSpawn(
|
|
|
400
400
|
return (command, args, options) => {
|
|
401
401
|
const stdout = new PassThrough();
|
|
402
402
|
const stderr = new PassThrough();
|
|
403
|
-
const abortController = new AbortController();
|
|
404
403
|
const child = new EventEmitter() as ChildProcessWithoutNullStreams;
|
|
404
|
+
const abortController = new AbortController();
|
|
405
405
|
const state = { closed: false };
|
|
406
406
|
const closeOnce = (
|
|
407
407
|
exitCode: number | null,
|
|
@@ -451,13 +451,19 @@ function createCloudflareSpawn(
|
|
|
451
451
|
const timedCommand = withInSandboxTimeout(rendered, timeoutMs);
|
|
452
452
|
const cwd =
|
|
453
453
|
options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();
|
|
454
|
+
if (state.closed) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
const execOptions: t.CloudflareSandboxExecOptions = {
|
|
458
|
+
cwd,
|
|
459
|
+
env: ctx.env,
|
|
460
|
+
timeout: outerTimeoutMs(timeoutMs),
|
|
461
|
+
};
|
|
462
|
+
if (ctx.sandbox.supportsExecSignal === true) {
|
|
463
|
+
execOptions.signal = abortController.signal;
|
|
464
|
+
}
|
|
454
465
|
try {
|
|
455
|
-
const result = await ctx.sandbox.exec(timedCommand,
|
|
456
|
-
cwd,
|
|
457
|
-
env: ctx.env,
|
|
458
|
-
timeout: outerTimeoutMs(timeoutMs),
|
|
459
|
-
signal: abortController.signal,
|
|
460
|
-
});
|
|
466
|
+
const result = await ctx.sandbox.exec(timedCommand, execOptions);
|
|
461
467
|
if (state.closed) {
|
|
462
468
|
return;
|
|
463
469
|
}
|
package/src/types/tools.ts
CHANGED
|
@@ -853,6 +853,12 @@ export type CloudflareSandboxListFilesResult =
|
|
|
853
853
|
};
|
|
854
854
|
|
|
855
855
|
export interface CloudflareSandboxRuntime {
|
|
856
|
+
/**
|
|
857
|
+
* True when this runtime can consume AbortSignal values in exec options.
|
|
858
|
+
* Native Cloudflare Sandbox Durable Object RPC cannot clone AbortSignal,
|
|
859
|
+
* but HTTP bridge runtimes can use it to abort the underlying fetch.
|
|
860
|
+
*/
|
|
861
|
+
supportsExecSignal?: boolean;
|
|
856
862
|
exec(
|
|
857
863
|
command: string,
|
|
858
864
|
options?: CloudflareSandboxExecOptions
|