@cloudflare/sandbox 0.13.0-next.651.1 → 0.13.0-next.709.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/Dockerfile +12 -17
  2. package/README.md +48 -2
  3. package/dist/bridge/index.d.ts.map +1 -1
  4. package/dist/bridge/index.js +1365 -1054
  5. package/dist/bridge/index.js.map +1 -1
  6. package/dist/{contexts-BS0Bs6IU.d.ts → contexts-1EsLHByO.d.ts} +240 -15
  7. package/dist/contexts-1EsLHByO.d.ts.map +1 -0
  8. package/dist/{dist-DF8sudAg.js → dist-Duor5GbS.js} +38 -147
  9. package/dist/dist-Duor5GbS.js.map +1 -0
  10. package/dist/errors/index.d.ts +4 -0
  11. package/dist/errors/index.js +4 -0
  12. package/dist/{errors-BG6NZiPD.js → errors-CXR0xBpw.js} +82 -13
  13. package/dist/errors-CXR0xBpw.js.map +1 -0
  14. package/dist/errors-QYlSkVGz.js +893 -0
  15. package/dist/errors-QYlSkVGz.js.map +1 -0
  16. package/dist/extensions/index.d.ts +4 -74
  17. package/dist/extensions/index.js +5 -152
  18. package/dist/extensions-CFB2xHqY.js +1023 -0
  19. package/dist/extensions-CFB2xHqY.js.map +1 -0
  20. package/dist/filesystem-BWAZCZER.d.ts +732 -0
  21. package/dist/filesystem-BWAZCZER.d.ts.map +1 -0
  22. package/dist/git/index.d.ts +63 -0
  23. package/dist/git/index.d.ts.map +1 -0
  24. package/dist/git/index.js +338 -0
  25. package/dist/git/index.js.map +1 -0
  26. package/dist/index-Bs4bqXDR.d.ts +438 -0
  27. package/dist/index-Bs4bqXDR.d.ts.map +1 -0
  28. package/dist/index-HNYBk-az.d.ts +444 -0
  29. package/dist/index-HNYBk-az.d.ts.map +1 -0
  30. package/dist/index.d.ts +487 -181
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +12 -43
  33. package/dist/index.js.map +1 -1
  34. package/dist/interpreter/index.d.ts +311 -0
  35. package/dist/interpreter/index.d.ts.map +1 -0
  36. package/dist/interpreter/index.js +292 -0
  37. package/dist/interpreter/index.js.map +1 -0
  38. package/dist/openai/index.d.ts +5 -4
  39. package/dist/openai/index.d.ts.map +1 -1
  40. package/dist/openai/index.js +11 -6
  41. package/dist/openai/index.js.map +1 -1
  42. package/dist/opencode/index.d.ts +133 -161
  43. package/dist/opencode/index.d.ts.map +1 -1
  44. package/dist/opencode/index.js +284 -203
  45. package/dist/opencode/index.js.map +1 -1
  46. package/dist/process-types-GStiZ8f8.d.ts +73 -0
  47. package/dist/process-types-GStiZ8f8.d.ts.map +1 -0
  48. package/dist/sandbox-Auuwfnur.js +10010 -0
  49. package/dist/sandbox-Auuwfnur.js.map +1 -0
  50. package/dist/sandbox-BbAabq93.d.ts +42 -0
  51. package/dist/sandbox-BbAabq93.d.ts.map +1 -0
  52. package/dist/xterm/index.d.ts +11 -7
  53. package/dist/xterm/index.d.ts.map +1 -1
  54. package/dist/xterm/index.js +61 -18
  55. package/dist/xterm/index.js.map +1 -1
  56. package/package.json +28 -4
  57. package/dist/contexts-BS0Bs6IU.d.ts.map +0 -1
  58. package/dist/dist-DF8sudAg.js.map +0 -1
  59. package/dist/errors-BG6NZiPD.js.map +0 -1
  60. package/dist/extensions/index.d.ts.map +0 -1
  61. package/dist/extensions/index.js.map +0 -1
  62. package/dist/rpc-types-PBUY-xXM.d.ts +0 -1679
  63. package/dist/rpc-types-PBUY-xXM.d.ts.map +0 -1
  64. package/dist/sandbox-BgwMBQ7S.js +0 -8273
  65. package/dist/sandbox-BgwMBQ7S.js.map +0 -1
  66. package/dist/sandbox-D_MMqExx.d.ts +0 -1077
  67. package/dist/sandbox-D_MMqExx.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["code: string","context: CodeContext","fmts: string[]","#contexts","sidecarTarball","#getOrCreateDefaultContext","#applyEvent","interruptContext: (() => Promise<void>) | undefined","interruptSettled: Promise<void>","message: OutputMessage","error: ExecutionError"],"sources":["../../../../extensions/interpreter/src/sidecar-package.tgz","../../../../extensions/interpreter/src/types.ts","../../../../extensions/interpreter/src/index.ts"],"sourcesContent":["import {__toBinaryNode} from 'rolldown:runtime'; export default __toBinaryNode('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2b97q3/3c7N/927/7lf9u/f6d7/tf7ll9u896H+zZfa/+4/+d2+b/e/e63930+zff7V//+dm//4v+/ffMvv3/7N//3f9+7/v33+vf/99s3//fv/7LbP//Zf97++Z/e+/63//ff/BS2b/wSv9B6+Z/Qdv9h+8ZfYf/Fv/wW/N/oPf9x/cNPsPbvUf3DH7D77sP7hn9h98t/PiFzsvPth56S1z56V3d155aeeVn+288oa588q/7bzyHzuvvG3uvPLezit/2XnlrzuvfLTzyifmzit/33nlO3PnlQc7r75q7rz6+s6rv9p59aa589rPd25vmTt3/7Jz91Nz5+7nO3fv7Ny9u/Pllrnz5Qc7X3648+VnO1/eNne++nDnq7/t3Nsyd+79dufeTXPn3l937n1k7tz7fOfebXPn3r2de9+YO/e+3/l6y9z5+rWdr39u7nz9q52v3zJ3vv7tztdvmztf/+Hh1qvmw62fPdz6o/lw6+OHW1+YD7e+erj1jflw67uHL75oPnzptw9f+r358KX3H770R/Phy98+fPk78+HLDx6+8qr58JW/PXzlC/Pha796+NpN8+FrDx7+7Lb58GcPHr61Zf6few/+zzdb5u5v3tz9t7fM3X+7v/vvW+bu22/uvv2Wufv2+7tvf7L79qe7v9syd3/3+e7vHpi777y3+85Nc/f3f9t99z/N3Xff3333T+buH36++4dfmLvvv7v7/hfm7s0Xd2++bO7efHX35s/M3Ztv7N5809y9+afdP26Zu3+8u/unl8zdP93d/fMdc/fPX+/++R+7f76/++fvd//yhrn7lw92/3Lb3P3gtd0Pbpq7H3y3+9dXzN2/3tn98Ne7H940dz/8y+6HfzV3P/zb7offmrsffr/70Za5+9FHux9vmbsfv7T78Svm7se/2P34prn78b3dj7/d/fh7c/eTv+1+8sXuJ1/tfnJv95O/m7uf3N/9dGv305d2P/29ufvpe7uf3jR3P/1k99M75u6nX+7eetHcvfXa7q3Xzd1bv9q99a/m7q3f7t66ae7e+uvurY/M3Vuf7966be5+9s7uZ++au599vPsZUAF/2r29Zf7XH/78X3+4bf7X+6/91/u/MP/r/X/s/WXL3Pv4s72Pb5t7n/5u79aWuXfrtb1b/2bu3frPvVvv7d1639y79dHerU/MvVv39m59Y+7d+m7v1vd7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')","/**\n * Public, user-facing types for the code interpreter extension.\n *\n * These were previously part of `@repo/shared` and the core SDK surface. They\n * now live entirely inside the `@cloudflare/sandbox/interpreter` extension so\n * the core SDK carries no interpreter-specific types.\n */\n\n// Context Management\nexport interface CreateContextOptions {\n /**\n * Programming language for the context\n * @default 'python'\n */\n language?: 'python' | 'javascript' | 'typescript';\n\n /**\n * Working directory for the context\n * @default '/workspace'\n */\n cwd?: string;\n\n /**\n * Environment variables for the context.\n * Undefined values are skipped (treated as \"not configured\").\n */\n envVars?: Record<string, string | undefined>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\n\nexport interface CodeContext {\n /**\n * Unique identifier for the context\n */\n readonly id: string;\n\n /**\n * Programming language of the context\n */\n readonly language: string;\n\n /**\n * Current working directory\n */\n readonly cwd: string;\n\n /**\n * When the context was created\n */\n readonly createdAt: Date;\n\n /**\n * When the context was last used\n */\n readonly lastUsed: Date;\n}\n\n// Execution Options\nexport interface RunCodeOptions {\n /**\n * Context to run the code in. If not provided, uses default context for the language\n */\n context?: CodeContext;\n\n /**\n * Language to use if context is not provided\n * @default 'python'\n */\n language?: 'python' | 'javascript' | 'typescript';\n\n /**\n * Environment variables for this execution.\n * Undefined values are skipped (treated as \"not configured\").\n */\n envVars?: Record<string, string | undefined>;\n\n /**\n * Execution timeout in milliseconds\n * @default 60000\n */\n timeout?: number;\n\n /**\n * AbortSignal for cancelling execution\n */\n signal?: AbortSignal;\n\n /**\n * Callback for stdout output\n */\n onStdout?: (output: OutputMessage) => void | Promise<void>;\n\n /**\n * Callback for stderr output\n */\n onStderr?: (output: OutputMessage) => void | Promise<void>;\n\n /**\n * Callback for execution results (charts, tables, etc).\n * Receives plain `ResultData` so it stays serializable when the callback\n * crosses the Worker/DO boundary.\n */\n onResult?: (result: ResultData) => void | Promise<void>;\n\n /**\n * Callback for execution errors\n */\n onError?: (error: ExecutionError) => void | Promise<void>;\n}\n\n// Output Messages\nexport interface OutputMessage {\n /**\n * The output text\n */\n text: string;\n\n /**\n * Timestamp of the output\n */\n timestamp: number;\n}\n\n// Serializable result data (no methods, safe to send across RPC)\nexport interface ResultData {\n /**\n * Plain text representation\n */\n text?: string;\n\n /**\n * HTML representation (tables, formatted output)\n */\n html?: string;\n\n /**\n * PNG image data (base64 encoded)\n */\n png?: string;\n\n /**\n * JPEG image data (base64 encoded)\n */\n jpeg?: string;\n\n /**\n * SVG image data\n */\n svg?: string;\n\n /**\n * LaTeX representation\n */\n latex?: string;\n\n /**\n * Markdown representation\n */\n markdown?: string;\n\n /**\n * JavaScript code to execute\n */\n javascript?: string;\n\n /**\n * JSON data\n */\n json?: any;\n\n /**\n * Chart data if the result is a visualization\n */\n chart?: ChartData;\n\n /**\n * Raw data object\n */\n data?: any;\n}\n\n// Execution Results\nexport interface Result extends ResultData {\n /**\n * Available output formats\n */\n formats(): string[];\n}\n\n// Chart Data\nexport interface ChartData {\n /**\n * Type of chart\n */\n type:\n | 'line'\n | 'bar'\n | 'scatter'\n | 'pie'\n | 'histogram'\n | 'heatmap'\n | 'unknown';\n\n /**\n * Chart title\n */\n title?: string;\n\n /**\n * Chart data (format depends on library)\n */\n data: any;\n\n /**\n * Chart layout/configuration\n */\n layout?: any;\n\n /**\n * Additional configuration\n */\n config?: any;\n\n /**\n * Library that generated the chart\n */\n library?: 'matplotlib' | 'plotly' | 'altair' | 'seaborn' | 'unknown';\n\n /**\n * Base64 encoded image if available\n */\n image?: string;\n}\n\n// Execution Error\nexport interface ExecutionError {\n /**\n * Error name/type (e.g., 'NameError', 'SyntaxError')\n */\n name: string;\n\n /**\n * Error message\n */\n message: string;\n\n /**\n * Stack trace\n */\n traceback: string[];\n\n /**\n * Line number where error occurred\n */\n lineNumber?: number;\n}\n\n// Serializable execution result\nexport interface ExecutionResult {\n code: string;\n logs: {\n stdout: string[];\n stderr: string[];\n };\n error?: ExecutionError;\n executionCount?: number;\n results: ResultData[];\n}\n\n// Execution Result Container\nexport class Execution {\n /**\n * All results from the execution\n */\n public results: Result[] = [];\n\n /**\n * Accumulated stdout and stderr\n */\n public logs = {\n stdout: [] as string[],\n stderr: [] as string[]\n };\n\n /**\n * Execution error if any\n */\n public error?: ExecutionError;\n\n /**\n * Execution count (for interpreter)\n */\n public executionCount?: number;\n\n constructor(\n public readonly code: string,\n public readonly context: CodeContext\n ) {}\n\n /**\n * Convert to a plain object for serialization\n */\n toJSON(): ExecutionResult {\n return {\n code: this.code,\n logs: this.logs,\n error: this.error,\n executionCount: this.executionCount,\n results: this.results.map((result) => toResultData(result))\n };\n }\n}\n\n// Project a Result into plain, RPC-safe data.\nexport function toResultData(result: Result): ResultData {\n return {\n text: result.text,\n html: result.html,\n png: result.png,\n jpeg: result.jpeg,\n svg: result.svg,\n latex: result.latex,\n markdown: result.markdown,\n javascript: result.javascript,\n json: result.json,\n chart: result.chart,\n data: result.data\n };\n}\n\n// Implementation of Result\nexport class ResultImpl implements Result {\n text?: string;\n html?: string;\n png?: string;\n jpeg?: string;\n svg?: string;\n latex?: string;\n markdown?: string;\n javascript?: string;\n json?: any;\n chart?: ChartData;\n data?: any;\n\n constructor(raw: any) {\n this.text = raw.text || raw.data?.['text/plain'];\n this.html = raw.html || raw.data?.['text/html'];\n this.png = raw.png || raw.data?.['image/png'];\n this.jpeg = raw.jpeg || raw.data?.['image/jpeg'];\n this.svg = raw.svg || raw.data?.['image/svg+xml'];\n this.latex = raw.latex || raw.data?.['text/latex'];\n this.markdown = raw.markdown || raw.data?.['text/markdown'];\n this.javascript = raw.javascript || raw.data?.['application/javascript'];\n this.json = raw.json || raw.data?.['application/json'];\n this.chart = raw.chart;\n this.data = raw.data;\n }\n\n formats(): string[] {\n const fmts: string[] = [];\n if (this.text) fmts.push('text');\n if (this.html) fmts.push('html');\n if (this.png) fmts.push('png');\n if (this.jpeg) fmts.push('jpeg');\n if (this.svg) fmts.push('svg');\n if (this.latex) fmts.push('latex');\n if (this.markdown) fmts.push('markdown');\n if (this.javascript) fmts.push('javascript');\n if (this.json) fmts.push('json');\n if (this.chart) fmts.push('chart');\n return fmts;\n }\n}\n\n/**\n * Wire-level execution event emitted by the sidecar over the bridge as a\n * streaming `evt` frame, mirrored from the container interpreter service.\n */\nexport type InterpreterExecutionEvent =\n | { type: 'stdout'; text: string }\n | { type: 'stderr'; text: string }\n | {\n type: 'result';\n metadata: Record<string, unknown>;\n [key: string]: unknown;\n }\n | { type: 'execution_complete'; execution_count: number }\n | { type: 'error'; ename: string; evalue: string; traceback: string[] };\n","/**\n * Code interpreter extension for the Cloudflare Sandbox SDK.\n *\n * This is the first real extraction validating the extension framework: the\n * entire interpreter runtime (the process pool plus the Python/JavaScript\n * executors) ships as **sidecar assets** and runs inside the container, spawned\n * and supervised by the container `ExtensionHost`. None of it is compiled into\n * the core SDK or the container binary anymore.\n *\n * Usage — attach it to a Sandbox subclass and call it as a nested extension:\n *\n * ```ts\n * import { Sandbox as BaseSandbox } from '@cloudflare/sandbox';\n * import { withInterpreter } from '@cloudflare/sandbox/interpreter';\n *\n * export class Sandbox extends BaseSandbox<Env> {\n * interpreter = withInterpreter(this);\n * }\n *\n * const context = await sandbox.interpreter.createCodeContext({ language: 'python' });\n * const result = await sandbox.interpreter.runCode('print(\"hello\")', { context });\n * ```\n */\n\nimport {\n SandboxExtension,\n type SandboxLike\n} from '@cloudflare/sandbox/extensions';\nimport type {\n InterpreterContextWire,\n InterpreterSidecarAPI,\n InterpreterSidecarEvent\n} from './sidecar-api.js';\nimport sidecarTarball from './sidecar-package.tgz';\nimport {\n type CodeContext,\n type CreateContextOptions,\n Execution,\n type ExecutionError,\n type ExecutionResult,\n type OutputMessage,\n type Result,\n type ResultData,\n ResultImpl,\n type RunCodeOptions,\n toResultData\n} from './types.js';\n\nexport type {\n ChartData,\n CodeContext,\n CreateContextOptions,\n ExecutionError,\n ExecutionResult,\n InterpreterExecutionEvent,\n OutputMessage,\n Result,\n ResultData,\n RunCodeOptions\n} from './types.js';\nexport { Execution, ResultImpl } from './types.js';\n\nconst SUPPORTED_LANGUAGES = [\n 'python',\n 'python3',\n 'javascript',\n 'js',\n 'node',\n 'typescript',\n 'ts'\n];\n\n/** Validate the requested language before issuing a sidecar call. */\nfunction validateLanguage(language: string | undefined): void {\n if (!language) return;\n if (!SUPPORTED_LANGUAGES.includes(language.toLowerCase())) {\n throw new Error(\n `Unsupported language '${language}'. Supported languages: python, javascript, typescript`\n );\n }\n}\n\nfunction toCodeContext(raw: InterpreterContextWire): CodeContext {\n return {\n id: raw.id,\n language: raw.language,\n cwd: raw.cwd,\n createdAt: new Date(raw.createdAt),\n lastUsed: new Date(raw.lastUsed)\n };\n}\n\n/**\n * The interpreter extension. Bridges to the sidecar over the extension host;\n * reconstructs streamed execution events into serializable execution results.\n */\nexport class Interpreter extends SandboxExtension {\n readonly #contexts = new Map<string, CodeContext>();\n\n constructor(sandbox: SandboxLike) {\n super(sandbox, { tarball: sidecarTarball });\n }\n\n /** Create a new code execution context. */\n async createCodeContext(\n options: CreateContextOptions = {}\n ): Promise<CodeContext> {\n validateLanguage(options.language);\n const raw = await this.withSidecar<\n InterpreterSidecarAPI,\n Awaited<ReturnType<InterpreterSidecarAPI['createContext']>>\n >('interpreter.createContext', (api) =>\n api.createContext({\n language: options.language,\n cwd: options.cwd\n })\n );\n const context = toCodeContext(raw);\n this.#contexts.set(context.id, context);\n return context;\n }\n\n /** Run code with optional context, collecting results into serializable data. */\n async runCode(\n code: string,\n options: RunCodeOptions = {}\n ): Promise<ExecutionResult> {\n const context =\n options.context ??\n (await this.#getOrCreateDefaultContext(options.language ?? 'python'));\n\n const execution = new Execution(code, context);\n\n await this.withSidecar<InterpreterSidecarAPI, void>(\n 'interpreter.runCode',\n (api) =>\n api.runCode(context.id, code, options.language, async (event) => {\n await this.#applyEvent(execution, event, options);\n })\n );\n\n return execution.toJSON();\n }\n\n /** Run code and surface raw execution events as an SSE byte stream. */\n async runCodeStream(\n code: string,\n options: RunCodeOptions = {}\n ): Promise<ReadableStream<Uint8Array>> {\n const context =\n options.context ??\n (await this.#getOrCreateDefaultContext(options.language ?? 'python'));\n\n const encoder = new TextEncoder();\n const self = this;\n let closed = false;\n let interruptContext: (() => Promise<void>) | undefined;\n let interruptSettled: Promise<void> = Promise.resolve();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n await self.withSidecar<InterpreterSidecarAPI, void>(\n 'interpreter.runCodeStream',\n async (api) => {\n interruptContext = () => api.interruptContext(context.id);\n if (closed) return;\n await api.runCode(context.id, code, options.language, (event) => {\n if (closed) return;\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`)\n );\n });\n }\n );\n if (!closed) {\n closed = true;\n controller.close();\n }\n } catch (error) {\n if (!closed) {\n closed = true;\n controller.error(error);\n }\n } finally {\n await interruptSettled;\n interruptContext = undefined;\n }\n },\n cancel() {\n closed = true;\n const interrupt = interruptContext;\n if (!interrupt) return;\n interruptSettled = interrupt().catch(() => {});\n return interruptSettled;\n }\n });\n }\n\n /** List all code contexts (refreshes the local cache). */\n async listCodeContexts(): Promise<CodeContext[]> {\n const raw = await this.withSidecar<\n InterpreterSidecarAPI,\n Awaited<ReturnType<InterpreterSidecarAPI['listContexts']>>\n >('interpreter.listContexts', (api) => api.listContexts());\n const contexts = raw.map(toCodeContext);\n for (const context of contexts) {\n this.#contexts.set(context.id, context);\n }\n return contexts;\n }\n\n /** Delete a code context. */\n async deleteCodeContext(contextId: string): Promise<void> {\n await this.withSidecar<InterpreterSidecarAPI, void>(\n 'interpreter.deleteContext',\n (api) => api.deleteContext(contextId)\n );\n this.#contexts.delete(contextId);\n }\n\n async #getOrCreateDefaultContext(\n language: 'python' | 'javascript' | 'typescript'\n ): Promise<CodeContext> {\n for (const context of this.#contexts.values()) {\n if (context.language === language) {\n return context;\n }\n }\n return this.createCodeContext({ language });\n }\n\n async #applyEvent(\n execution: Execution,\n event: InterpreterSidecarEvent,\n options: RunCodeOptions\n ): Promise<void> {\n switch (event.type) {\n case 'stdout': {\n const text = event.text;\n execution.logs.stdout.push(text);\n const message: OutputMessage = { text, timestamp: Date.now() };\n await options.onStdout?.(message);\n break;\n }\n case 'stderr': {\n const text = event.text;\n execution.logs.stderr.push(text);\n const message: OutputMessage = { text, timestamp: Date.now() };\n await options.onStderr?.(message);\n break;\n }\n case 'result': {\n const result = new ResultImpl(event as unknown as Result);\n execution.results.push(result);\n await options.onResult?.(toResultData(result));\n break;\n }\n case 'error': {\n const error: ExecutionError = {\n name: event.ename,\n message: event.evalue,\n traceback: event.traceback ?? []\n };\n execution.error = error;\n await options.onError?.(error);\n break;\n }\n case 'execution_complete': {\n execution.executionCount = event.execution_count;\n break;\n }\n }\n }\n}\n\n/** Factory — the consumer-facing API. */\nexport function withInterpreter(sandbox: SandboxLike): Interpreter {\n return new Interpreter(sandbox);\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { n as Sandbox } from "../sandbox-D_MMqExx.js";
2
- import "../rpc-types-PBUY-xXM.js";
1
+ import "../process-types-GStiZ8f8.js";
2
+ import "../filesystem-BWAZCZER.js";
3
+ import { t as ISandbox } from "../sandbox-BbAabq93.js";
3
4
  import { ApplyPatchOperation, ApplyPatchResult, Editor as Editor$1, Shell as Shell$1, ShellAction, ShellResult } from "@openai/agents";
4
5
 
5
6
  //#region src/openai/index.d.ts
@@ -27,7 +28,7 @@ declare class Shell implements Shell$1 {
27
28
  private cwd;
28
29
  results: CommandResult[];
29
30
  private readonly logger;
30
- constructor(sandbox: Sandbox);
31
+ constructor(sandbox: ISandbox);
31
32
  run(action: ShellAction): Promise<ShellResult>;
32
33
  }
33
34
  /**
@@ -39,7 +40,7 @@ declare class Editor implements Editor$1 {
39
40
  private readonly root;
40
41
  results: FileOperationResult[];
41
42
  private readonly logger;
42
- constructor(sandbox: Sandbox, root?: string);
43
+ constructor(sandbox: ISandbox, root?: string);
43
44
  /**
44
45
  * Create a new file inside the sandbox by applying the provided diff.
45
46
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/openai/index.ts"],"sourcesContent":[],"mappings":";;;;;AAgBiB,UAAA,aAAA,CAAa;EASb,OAAA,EAAA,MAAA;EA2CJ,MAAA,EAAM,MAAA;EAED,MAAA,EAAA,MAAA;EAGsB,QAAA,EAAA,MAAA,GAAA,IAAA;EAOpB,SAAA,EAAA,MAAA;;AAAc,UAvDjB,mBAAA,CAuDiB;EAZJ,SAAA,EAAA,QAAA,GAAA,QAAA,GAAA,QAAA;EAAW,IAAA,EAAA,MAAA;EAyI5B,MAAA,EAAA,WAAO,GAAA,QAAA;EACF,MAAA,EAAA,MAAA;EAIY,KAAA,CAAA,EAAA,MAAA;EAaP,SAAA,EAAA,MAAA;;;;;;AA8DlB,cAzNQ,KAAA,YAAiB,OAyNzB,CAAA;EAqFkB,iBAAA,OAAA;EAAR,QAAA,GAAA;EACF,OAAA,EA7SK,aA6SL,EAAA;EAAR,iBAAA,MAAA;EAtK0B,WAAA,CAAA,OAAA,EApIS,OAoIT;EAAa,GAAA,CAAA,MAAA,EA7HxB,WA6HwB,CAAA,EA7HV,OA6HU,CA7HF,WA6HE,CAAA;;;;;;cAA/B,MAAA,YAAkB;;;WACb;;uBAIY;;;;wBAaf,QAAQ;;OAClB,QAAQ;;;;;wBA4DE,QAAQ;;OAClB,QAAQ;;;;wBAqFE,QAAQ;;OAClB,QAAQ"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/openai/index.ts"],"sourcesContent":[],"mappings":";;;;;;UAgBiB,aAAA;EAAA,OAAA,EAAA,MAAA;EASA,MAAA,EAAA,MAAA;EA0CJ,MAAA,EAAM,MAAA;EAED,QAAA,EAAA,MAAA,GAAA,IAAA;EAGsB,SAAA,EAAA,MAAA;;AAOE,UAtDzB,mBAAA,CAsDyB;EAAR,SAAA,EAAA,QAAA,GAAA,QAAA,GAAA,QAAA;EAZJ,IAAA,EAAA,MAAA;EAAW,MAAA,EAAA,WAAA,GAAA,QAAA;EAyI5B,MAAA,EAAA,MAAO;EACF,KAAA,CAAA,EAAA,MAAA;EAIY,SAAA,EAAA,MAAA;;;;;;AA2EjB,cAzNA,KAAA,YAAiB,OAyNjB,CAAA;EAAR,iBAAA,OAAA;EAqFkB,QAAA,GAAA;EAAR,OAAA,EA5SG,aA4SH,EAAA;EACF,iBAAA,MAAA;EAAR,WAAA,CAAA,OAAA,EA1SmC,QA0SnC;EAtK0B,GAAA,CAAA,MAAA,EA7HX,WA6HW,CAAA,EA7HG,OA6HH,CA7HW,WA6HX,CAAA;;;;;;cAAlB,MAAA,YAAkB;;;WACb;;uBAIY;;;;wBAaf,QAAQ;;OAClB,QAAQ;;;;;wBA4DE,QAAQ;;OAClB,QAAQ;;;;wBAqFE,QAAQ;;OAClB,QAAQ"}
@@ -1,4 +1,5 @@
1
- import { s as createLogger } from "../dist-DF8sudAg.js";
1
+ import "../errors-CXR0xBpw.js";
2
+ import { r as createLogger } from "../dist-Duor5GbS.js";
2
3
  import { applyDiff } from "@openai/agents";
3
4
 
4
5
  //#region src/openai/index.ts
@@ -54,13 +55,17 @@ var Shell = class {
54
55
  exitCode: 0
55
56
  };
56
57
  try {
57
- const result = await this.sandbox.exec(command, {
58
+ const out = await (await this.sandbox.exec([
59
+ "/bin/bash",
60
+ "-lc",
61
+ command
62
+ ], {
58
63
  timeout: action.timeoutMs,
59
64
  cwd: this.cwd
60
- });
61
- stdout = result.stdout;
62
- stderr = result.stderr;
63
- exitCode = result.exitCode;
65
+ })).output();
66
+ stdout = new TextDecoder().decode(out.stdout);
67
+ stderr = new TextDecoder().decode(out.stderr);
68
+ exitCode = out.exitCode;
64
69
  outcome = {
65
70
  type: "exit",
66
71
  exitCode
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["sandbox: Sandbox","output: ShellResult['output']","exitCode: number | null","outcome: ShellOutputResult['outcome']","error: unknown","root: string","result: FileOperationResult","original: string","stack: string[]"],"sources":["../../src/openai/index.ts"],"sourcesContent":["/**\n * OpenAI Agents adapters for executing shell commands and file operations\n * inside a Cloudflare Sandbox.\n */\nimport {\n type ApplyPatchOperation,\n type ApplyPatchResult,\n applyDiff,\n type Editor as OpenAIEeditor,\n type Shell as OpenAIShell,\n type ShellAction,\n type ShellOutputResult,\n type ShellResult\n} from '@openai/agents';\n\n// Command result for API responses\nexport interface CommandResult {\n command: string;\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timestamp: number;\n}\n\n// File operation result for API responses\nexport interface FileOperationResult {\n operation: 'create' | 'update' | 'delete';\n path: string;\n status: 'completed' | 'failed';\n output: string;\n error?: string;\n timestamp: number;\n}\n\nimport { createLogger, type Logger } from '@repo/shared';\nimport type { Sandbox } from '../sandbox';\n\n// Helper functions for error handling\nfunction isErrorWithProperties(error: unknown): error is {\n message?: string;\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n status?: number;\n stack?: string;\n} {\n return typeof error === 'object' && error !== null;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isErrorWithProperties(error) && typeof error.message === 'string') {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Convert unknown values to Error instances when possible so downstream\n * loggers can include stack traces without losing type safety.\n */\nfunction toError(error: unknown): Error | undefined {\n return error instanceof Error ? error : undefined;\n}\n\n/**\n * Shell implementation that adapts Cloudflare Sandbox exec calls to the\n * OpenAI Agents `Shell` contract, including structured result collection.\n */\nexport class Shell implements OpenAIShell {\n private cwd: string = '/workspace';\n public results: CommandResult[] = [];\n private readonly logger: Logger;\n\n constructor(private readonly sandbox: Sandbox) {\n this.logger = createLogger({\n component: 'sandbox-do',\n operation: 'openai-shell'\n });\n }\n\n async run(action: ShellAction): Promise<ShellResult> {\n this.logger.debug('SandboxShell.run called', {\n commands: action.commands,\n timeout: action.timeoutMs\n });\n const output: ShellResult['output'] = [];\n\n for (const command of action.commands) {\n this.logger.debug('Executing command', { command, cwd: this.cwd });\n let stdout = '';\n let stderr = '';\n let exitCode: number | null = 0;\n let outcome: ShellOutputResult['outcome'] = {\n type: 'exit',\n exitCode: 0\n };\n try {\n const result = await this.sandbox.exec(command, {\n timeout: action.timeoutMs,\n cwd: this.cwd\n });\n stdout = result.stdout;\n stderr = result.stderr;\n exitCode = result.exitCode;\n // exec returns a result even for failed commands, so check success field\n // Timeout would be indicated by a specific error or exit code\n outcome = { type: 'exit', exitCode };\n\n this.logger.debug('Command executed successfully', {\n command,\n exitCode,\n stdoutLength: stdout.length,\n stderrLength: stderr.length\n });\n\n // Log warnings for non-zero exit codes or stderr output\n if (exitCode !== 0) {\n this.logger.warn(`Command failed with exit code ${exitCode}`, {\n command,\n stderr\n });\n } else if (stderr) {\n this.logger.warn(`Command produced stderr output`, {\n command,\n stderr\n });\n } else {\n this.logger.info(`Command completed successfully`, { command });\n }\n } catch (error: unknown) {\n // Handle network/HTTP errors or timeout errors\n const errorObj = isErrorWithProperties(error) ? error : {};\n exitCode =\n typeof errorObj.exitCode === 'number' ? errorObj.exitCode : null;\n stdout = typeof errorObj.stdout === 'string' ? errorObj.stdout : '';\n stderr = typeof errorObj.stderr === 'string' ? errorObj.stderr : '';\n\n // Check if it's a timeout error\n const errorMessage = getErrorMessage(error);\n if (\n errorMessage.includes('timeout') ||\n errorMessage.includes('Timeout') ||\n errorMessage.includes('timed out')\n ) {\n this.logger.error(`Command timed out`, undefined, {\n command,\n timeout: action.timeoutMs\n });\n outcome = { type: 'timeout' };\n } else {\n this.logger.error(`Error executing command`, toError(error), {\n command,\n error: errorMessage || error,\n exitCode\n });\n outcome = { type: 'exit', exitCode: exitCode ?? 1 };\n }\n }\n output.push({\n command,\n stdout,\n stderr,\n outcome\n });\n\n // Collect results for API responses\n const collectedExitCode =\n outcome.type === 'exit' ? outcome.exitCode : null;\n const timestamp = Date.now();\n this.results.push({\n command: String(command),\n stdout: String(stdout),\n stderr: String(stderr),\n exitCode: collectedExitCode,\n timestamp\n });\n this.logger.debug('Result collected', {\n command,\n exitCode: collectedExitCode,\n timestamp\n });\n\n if (outcome.type === 'timeout') {\n this.logger.warn('Breaking command loop due to timeout');\n break;\n }\n }\n\n this.logger.debug('SandboxShell.run completed', {\n totalCommands: action.commands.length,\n resultsCount: this.results.length\n });\n return {\n output,\n providerData: {\n working_directory: this.cwd\n }\n };\n }\n}\n\n/**\n * Editor implementation that projects applyPatch operations from Agents\n * into calls against the sandbox filesystem APIs.\n */\nexport class Editor implements OpenAIEeditor {\n public results: FileOperationResult[] = [];\n private readonly logger: Logger;\n\n constructor(\n private readonly sandbox: Sandbox,\n private readonly root: string = '/workspace'\n ) {\n this.logger = createLogger({\n component: 'sandbox-do',\n operation: 'openai-editor'\n });\n }\n\n /**\n * Create a new file inside the sandbox by applying the provided diff.\n */\n async createFile(\n operation: Extract<ApplyPatchOperation, { type: 'create_file' }>\n ): Promise<ApplyPatchResult | undefined> {\n const targetPath = this.resolve(operation.path);\n this.logger.debug('WorkspaceEditor.createFile called', {\n path: operation.path,\n targetPath\n });\n\n try {\n // Create parent directory if needed\n const dirPath = this.getDirname(targetPath);\n if (dirPath !== this.root && dirPath !== '/') {\n this.logger.debug('Creating parent directory', { dirPath });\n await this.sandbox.mkdir(dirPath, { recursive: true });\n }\n\n const content = applyDiff('', operation.diff, 'create');\n this.logger.debug('Writing file content', {\n path: targetPath,\n contentLength: content.length\n });\n await this.sandbox.writeFile(targetPath, content, { encoding: 'utf-8' });\n const timestamp = Date.now();\n const result: FileOperationResult = {\n operation: 'create',\n path: operation.path,\n status: 'completed',\n output: `Created ${operation.path}`,\n timestamp\n };\n this.results.push(result);\n this.logger.info('File created successfully', {\n path: operation.path,\n timestamp\n });\n return { status: 'completed', output: `Created ${operation.path}` };\n } catch (error: unknown) {\n const timestamp = Date.now();\n const errorMessage = getErrorMessage(error);\n const result: FileOperationResult = {\n operation: 'create',\n path: operation.path,\n status: 'failed',\n output: `Failed to create ${operation.path}`,\n error: errorMessage,\n timestamp\n };\n this.results.push(result);\n this.logger.error('Failed to create file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n }\n\n /**\n * Update an existing file by reading its content, applying a diff, and\n * writing the patched output back to the sandbox.\n */\n async updateFile(\n operation: Extract<ApplyPatchOperation, { type: 'update_file' }>\n ): Promise<ApplyPatchResult | undefined> {\n const targetPath = this.resolve(operation.path);\n this.logger.debug('WorkspaceEditor.updateFile called', {\n path: operation.path,\n targetPath\n });\n\n try {\n let original: string;\n try {\n this.logger.debug('Reading original file', { path: targetPath });\n const fileInfo = await this.sandbox.readFile(targetPath, {\n encoding: 'utf-8'\n });\n original = fileInfo.content;\n this.logger.debug('Original file read', {\n path: targetPath,\n originalLength: original.length\n });\n } catch (error: unknown) {\n // Sandbox API may throw errors for missing files\n const errorObj = isErrorWithProperties(error) ? error : {};\n const errorMessage = getErrorMessage(error);\n if (\n errorMessage.includes('not found') ||\n errorMessage.includes('ENOENT') ||\n errorObj.status === 404\n ) {\n this.logger.error('Cannot update missing file', undefined, {\n path: operation.path\n });\n throw new Error(`Cannot update missing file: ${operation.path}`);\n }\n this.logger.error('Error reading file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n\n const patched = applyDiff(original, operation.diff);\n this.logger.debug('Applied diff', {\n path: targetPath,\n originalLength: original.length,\n patchedLength: patched.length\n });\n await this.sandbox.writeFile(targetPath, patched, { encoding: 'utf-8' });\n const timestamp = Date.now();\n const result: FileOperationResult = {\n operation: 'update',\n path: operation.path,\n status: 'completed',\n output: `Updated ${operation.path}`,\n timestamp\n };\n this.results.push(result);\n this.logger.info('File updated successfully', {\n path: operation.path,\n timestamp\n });\n return { status: 'completed', output: `Updated ${operation.path}` };\n } catch (error: unknown) {\n const timestamp = Date.now();\n const errorMessage = getErrorMessage(error);\n const result: FileOperationResult = {\n operation: 'update',\n path: operation.path,\n status: 'failed',\n output: `Failed to update ${operation.path}`,\n error: errorMessage,\n timestamp\n };\n this.results.push(result);\n this.logger.error('Failed to update file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n }\n\n /**\n * Delete a file that was previously created through applyPatch calls.\n */\n async deleteFile(\n operation: Extract<ApplyPatchOperation, { type: 'delete_file' }>\n ): Promise<ApplyPatchResult | undefined> {\n const targetPath = this.resolve(operation.path);\n this.logger.debug('WorkspaceEditor.deleteFile called', {\n path: operation.path,\n targetPath\n });\n\n try {\n await this.sandbox.deleteFile(targetPath);\n const timestamp = Date.now();\n const result: FileOperationResult = {\n operation: 'delete',\n path: operation.path,\n status: 'completed',\n output: `Deleted ${operation.path}`,\n timestamp\n };\n this.results.push(result);\n this.logger.info('File deleted successfully', {\n path: operation.path,\n timestamp\n });\n return { status: 'completed', output: `Deleted ${operation.path}` };\n } catch (error: unknown) {\n const timestamp = Date.now();\n const errorMessage = getErrorMessage(error);\n const result: FileOperationResult = {\n operation: 'delete',\n path: operation.path,\n status: 'failed',\n output: `Failed to delete ${operation.path}`,\n error: errorMessage,\n timestamp\n };\n this.results.push(result);\n this.logger.error('Failed to delete file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n }\n\n private resolve(relativePath: string): string {\n // If the path already starts with the root, strip it to get the relative part\n let pathToProcess = relativePath;\n if (relativePath.startsWith(this.root)) {\n pathToProcess = relativePath.slice(this.root.length);\n // Remove leading slash if present after stripping root\n pathToProcess = pathToProcess.replace(/^\\//, '');\n }\n\n // Remove leading ./ or / if present, then join with root\n const normalized = pathToProcess.replace(/^\\.\\//, '').replace(/^\\//, '');\n const resolved = normalized ? `${this.root}/${normalized}` : this.root;\n\n // Normalize path separators first\n const pathWithNormalizedSeparators = resolved.replace(/\\/+/g, '/');\n\n // Normalize .. segments by processing path segments\n const segments = pathWithNormalizedSeparators\n .split('/')\n .filter((s) => s && s !== '.');\n const stack: string[] = [];\n\n for (const segment of segments) {\n if (segment === '..') {\n if (stack.length === 0) {\n throw new Error(`Operation outside workspace: ${relativePath}`);\n }\n stack.pop();\n } else {\n stack.push(segment);\n }\n }\n\n const normalizedPath = `/${stack.join('/')}`;\n\n // Ensure the resolved path is within the workspace\n if (!normalizedPath.startsWith(this.root)) {\n throw new Error(`Operation outside workspace: ${relativePath}`);\n }\n\n return normalizedPath;\n }\n\n private getDirname(filePath: string): string {\n const lastSlash = filePath.lastIndexOf('/');\n if (lastSlash === -1) {\n return '/';\n }\n return filePath.substring(0, lastSlash) || '/';\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["sandbox: ISandbox","output: ShellResult['output']","exitCode: number | null","outcome: ShellOutputResult['outcome']","error: unknown","root: string","result: FileOperationResult","original: string","stack: string[]"],"sources":["../../src/openai/index.ts"],"sourcesContent":["/**\n * OpenAI Agents adapters for executing shell commands and file operations\n * inside a Cloudflare Sandbox.\n */\nimport {\n type ApplyPatchOperation,\n type ApplyPatchResult,\n applyDiff,\n type Editor as OpenAIEeditor,\n type Shell as OpenAIShell,\n type ShellAction,\n type ShellOutputResult,\n type ShellResult\n} from '@openai/agents';\n\n// Command result for API responses\nexport interface CommandResult {\n command: string;\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timestamp: number;\n}\n\n// File operation result for API responses\nexport interface FileOperationResult {\n operation: 'create' | 'update' | 'delete';\n path: string;\n status: 'completed' | 'failed';\n output: string;\n error?: string;\n timestamp: number;\n}\n\nimport { createLogger, type ISandbox, type Logger } from '@repo/shared';\n\n// Helper functions for error handling\nfunction isErrorWithProperties(error: unknown): error is {\n message?: string;\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n status?: number;\n stack?: string;\n} {\n return typeof error === 'object' && error !== null;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isErrorWithProperties(error) && typeof error.message === 'string') {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Convert unknown values to Error instances when possible so downstream\n * loggers can include stack traces without losing type safety.\n */\nfunction toError(error: unknown): Error | undefined {\n return error instanceof Error ? error : undefined;\n}\n\n/**\n * Shell implementation that adapts Cloudflare Sandbox exec calls to the\n * OpenAI Agents `Shell` contract, including structured result collection.\n */\nexport class Shell implements OpenAIShell {\n private cwd: string = '/workspace';\n public results: CommandResult[] = [];\n private readonly logger: Logger;\n\n constructor(private readonly sandbox: ISandbox) {\n this.logger = createLogger({\n component: 'sandbox-do',\n operation: 'openai-shell'\n });\n }\n\n async run(action: ShellAction): Promise<ShellResult> {\n this.logger.debug('SandboxShell.run called', {\n commands: action.commands,\n timeout: action.timeoutMs\n });\n const output: ShellResult['output'] = [];\n\n for (const command of action.commands) {\n this.logger.debug('Executing command', { command, cwd: this.cwd });\n let stdout = '';\n let stderr = '';\n let exitCode: number | null = 0;\n let outcome: ShellOutputResult['outcome'] = {\n type: 'exit',\n exitCode: 0\n };\n try {\n const proc = await this.sandbox.exec(['/bin/bash', '-lc', command], {\n timeout: action.timeoutMs,\n cwd: this.cwd\n });\n const out = await proc.output();\n stdout = new TextDecoder().decode(out.stdout);\n stderr = new TextDecoder().decode(out.stderr);\n exitCode = out.exitCode;\n // Timeout would be indicated by a specific error or exit code\n outcome = { type: 'exit', exitCode };\n\n this.logger.debug('Command executed successfully', {\n command,\n exitCode,\n stdoutLength: stdout.length,\n stderrLength: stderr.length\n });\n\n // Log warnings for non-zero exit codes or stderr output\n if (exitCode !== 0) {\n this.logger.warn(`Command failed with exit code ${exitCode}`, {\n command,\n stderr\n });\n } else if (stderr) {\n this.logger.warn(`Command produced stderr output`, {\n command,\n stderr\n });\n } else {\n this.logger.info(`Command completed successfully`, { command });\n }\n } catch (error: unknown) {\n // Handle network/HTTP errors or timeout errors\n const errorObj = isErrorWithProperties(error) ? error : {};\n exitCode =\n typeof errorObj.exitCode === 'number' ? errorObj.exitCode : null;\n stdout = typeof errorObj.stdout === 'string' ? errorObj.stdout : '';\n stderr = typeof errorObj.stderr === 'string' ? errorObj.stderr : '';\n\n // Check if it's a timeout error\n const errorMessage = getErrorMessage(error);\n if (\n errorMessage.includes('timeout') ||\n errorMessage.includes('Timeout') ||\n errorMessage.includes('timed out')\n ) {\n this.logger.error(`Command timed out`, undefined, {\n command,\n timeout: action.timeoutMs\n });\n outcome = { type: 'timeout' };\n } else {\n this.logger.error(`Error executing command`, toError(error), {\n command,\n error: errorMessage || error,\n exitCode\n });\n outcome = { type: 'exit', exitCode: exitCode ?? 1 };\n }\n }\n output.push({\n command,\n stdout,\n stderr,\n outcome\n });\n\n // Collect results for API responses\n const collectedExitCode =\n outcome.type === 'exit' ? outcome.exitCode : null;\n const timestamp = Date.now();\n this.results.push({\n command: String(command),\n stdout: String(stdout),\n stderr: String(stderr),\n exitCode: collectedExitCode,\n timestamp\n });\n this.logger.debug('Result collected', {\n command,\n exitCode: collectedExitCode,\n timestamp\n });\n\n if (outcome.type === 'timeout') {\n this.logger.warn('Breaking command loop due to timeout');\n break;\n }\n }\n\n this.logger.debug('SandboxShell.run completed', {\n totalCommands: action.commands.length,\n resultsCount: this.results.length\n });\n return {\n output,\n providerData: {\n working_directory: this.cwd\n }\n };\n }\n}\n\n/**\n * Editor implementation that projects applyPatch operations from Agents\n * into calls against the sandbox filesystem APIs.\n */\nexport class Editor implements OpenAIEeditor {\n public results: FileOperationResult[] = [];\n private readonly logger: Logger;\n\n constructor(\n private readonly sandbox: ISandbox,\n private readonly root: string = '/workspace'\n ) {\n this.logger = createLogger({\n component: 'sandbox-do',\n operation: 'openai-editor'\n });\n }\n\n /**\n * Create a new file inside the sandbox by applying the provided diff.\n */\n async createFile(\n operation: Extract<ApplyPatchOperation, { type: 'create_file' }>\n ): Promise<ApplyPatchResult | undefined> {\n const targetPath = this.resolve(operation.path);\n this.logger.debug('WorkspaceEditor.createFile called', {\n path: operation.path,\n targetPath\n });\n\n try {\n // Create parent directory if needed\n const dirPath = this.getDirname(targetPath);\n if (dirPath !== this.root && dirPath !== '/') {\n this.logger.debug('Creating parent directory', { dirPath });\n await this.sandbox.mkdir(dirPath, { recursive: true });\n }\n\n const content = applyDiff('', operation.diff, 'create');\n this.logger.debug('Writing file content', {\n path: targetPath,\n contentLength: content.length\n });\n await this.sandbox.writeFile(targetPath, content, { encoding: 'utf-8' });\n const timestamp = Date.now();\n const result: FileOperationResult = {\n operation: 'create',\n path: operation.path,\n status: 'completed',\n output: `Created ${operation.path}`,\n timestamp\n };\n this.results.push(result);\n this.logger.info('File created successfully', {\n path: operation.path,\n timestamp\n });\n return { status: 'completed', output: `Created ${operation.path}` };\n } catch (error: unknown) {\n const timestamp = Date.now();\n const errorMessage = getErrorMessage(error);\n const result: FileOperationResult = {\n operation: 'create',\n path: operation.path,\n status: 'failed',\n output: `Failed to create ${operation.path}`,\n error: errorMessage,\n timestamp\n };\n this.results.push(result);\n this.logger.error('Failed to create file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n }\n\n /**\n * Update an existing file by reading its content, applying a diff, and\n * writing the patched output back to the sandbox.\n */\n async updateFile(\n operation: Extract<ApplyPatchOperation, { type: 'update_file' }>\n ): Promise<ApplyPatchResult | undefined> {\n const targetPath = this.resolve(operation.path);\n this.logger.debug('WorkspaceEditor.updateFile called', {\n path: operation.path,\n targetPath\n });\n\n try {\n let original: string;\n try {\n this.logger.debug('Reading original file', { path: targetPath });\n const fileInfo = await this.sandbox.readFile(targetPath, {\n encoding: 'utf-8'\n });\n original = fileInfo.content;\n this.logger.debug('Original file read', {\n path: targetPath,\n originalLength: original.length\n });\n } catch (error: unknown) {\n // Sandbox API may throw errors for missing files\n const errorObj = isErrorWithProperties(error) ? error : {};\n const errorMessage = getErrorMessage(error);\n if (\n errorMessage.includes('not found') ||\n errorMessage.includes('ENOENT') ||\n errorObj.status === 404\n ) {\n this.logger.error('Cannot update missing file', undefined, {\n path: operation.path\n });\n throw new Error(`Cannot update missing file: ${operation.path}`);\n }\n this.logger.error('Error reading file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n\n const patched = applyDiff(original, operation.diff);\n this.logger.debug('Applied diff', {\n path: targetPath,\n originalLength: original.length,\n patchedLength: patched.length\n });\n await this.sandbox.writeFile(targetPath, patched, { encoding: 'utf-8' });\n const timestamp = Date.now();\n const result: FileOperationResult = {\n operation: 'update',\n path: operation.path,\n status: 'completed',\n output: `Updated ${operation.path}`,\n timestamp\n };\n this.results.push(result);\n this.logger.info('File updated successfully', {\n path: operation.path,\n timestamp\n });\n return { status: 'completed', output: `Updated ${operation.path}` };\n } catch (error: unknown) {\n const timestamp = Date.now();\n const errorMessage = getErrorMessage(error);\n const result: FileOperationResult = {\n operation: 'update',\n path: operation.path,\n status: 'failed',\n output: `Failed to update ${operation.path}`,\n error: errorMessage,\n timestamp\n };\n this.results.push(result);\n this.logger.error('Failed to update file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n }\n\n /**\n * Delete a file that was previously created through applyPatch calls.\n */\n async deleteFile(\n operation: Extract<ApplyPatchOperation, { type: 'delete_file' }>\n ): Promise<ApplyPatchResult | undefined> {\n const targetPath = this.resolve(operation.path);\n this.logger.debug('WorkspaceEditor.deleteFile called', {\n path: operation.path,\n targetPath\n });\n\n try {\n await this.sandbox.deleteFile(targetPath);\n const timestamp = Date.now();\n const result: FileOperationResult = {\n operation: 'delete',\n path: operation.path,\n status: 'completed',\n output: `Deleted ${operation.path}`,\n timestamp\n };\n this.results.push(result);\n this.logger.info('File deleted successfully', {\n path: operation.path,\n timestamp\n });\n return { status: 'completed', output: `Deleted ${operation.path}` };\n } catch (error: unknown) {\n const timestamp = Date.now();\n const errorMessage = getErrorMessage(error);\n const result: FileOperationResult = {\n operation: 'delete',\n path: operation.path,\n status: 'failed',\n output: `Failed to delete ${operation.path}`,\n error: errorMessage,\n timestamp\n };\n this.results.push(result);\n this.logger.error('Failed to delete file', toError(error), {\n path: operation.path,\n error: errorMessage\n });\n throw error;\n }\n }\n\n private resolve(relativePath: string): string {\n // If the path already starts with the root, strip it to get the relative part\n let pathToProcess = relativePath;\n if (relativePath.startsWith(this.root)) {\n pathToProcess = relativePath.slice(this.root.length);\n // Remove leading slash if present after stripping root\n pathToProcess = pathToProcess.replace(/^\\//, '');\n }\n\n // Remove leading ./ or / if present, then join with root\n const normalized = pathToProcess.replace(/^\\.\\//, '').replace(/^\\//, '');\n const resolved = normalized ? `${this.root}/${normalized}` : this.root;\n\n // Normalize path separators first\n const pathWithNormalizedSeparators = resolved.replace(/\\/+/g, '/');\n\n // Normalize .. segments by processing path segments\n const segments = pathWithNormalizedSeparators\n .split('/')\n .filter((s) => s && s !== '.');\n const stack: string[] = [];\n\n for (const segment of segments) {\n if (segment === '..') {\n if (stack.length === 0) {\n throw new Error(`Operation outside workspace: ${relativePath}`);\n }\n stack.pop();\n } else {\n stack.push(segment);\n }\n }\n\n const normalizedPath = `/${stack.join('/')}`;\n\n // Ensure the resolved path is within the workspace\n if (!normalizedPath.startsWith(this.root)) {\n throw new Error(`Operation outside workspace: ${relativePath}`);\n }\n\n return normalizedPath;\n }\n\n private getDirname(filePath: string): string {\n const lastSlash = filePath.lastIndexOf('/');\n if (lastSlash === -1) {\n return '/';\n }\n return filePath.substring(0, lastSlash) || '/';\n }\n}\n"],"mappings":"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"}