{"version":3,"sources":["../src/tools/webcontainer.ts"],"names":["tool","z","info"],"mappings":"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","file":"chunk-AM3WLHUD.cjs","sourcesContent":["/**\n * webcontainer.ts — Full Node.js runtime in the browser via WebContainer API.\n *\n * Bugs fixed vs original:\n *   #1 mount() overwriting tree on every write  → now: first call mounts, subsequent calls use fs.writeFile/mkdir\n *   #2 exec read-loop could hang past the deadline  → now: race each read against timeout + kill signal\n *   #3 server-ready listener leaked on timeout  → now: unsubscribes in both resolve and reject paths\n *   #4 boot failure poisoned the cached promise forever  → now: clears _wcBootPromise on error so retry works\n *   #5 no cwd on exec  → now: optional cwd param forwarded to wc.spawn\n *   #6 no way to know if COOP/COEP missing  → now: webcontainer_isolation_status tool\n *   #7 no listdir / no delete  → now: wcLsTool, wcRmTool\n *   #8 output was tail-only with no head option  → now: keep_head option + configurable cap\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\nlet _wc: any = null\nlet _wcBootPromise: Promise<any> | null = null\nlet _mounted = false // tracks whether initial mount has happened\n\n// Persistent cache of every server-ready event we've seen.\n// The event fires ONCE per server.listen() call, so we must remember it.\ntype ServerInfo = { port: number; url: string; seen_at: number }\nconst _servers = new Map<number, ServerInfo>() // port -> info\nconst _pendingServerResolvers: Array<(info: ServerInfo) => void> = []\nlet _serverListenerInstalled = false\n\nfunction installServerListener(wc: any) {\n  if (_serverListenerInstalled) return\n  _serverListenerInstalled = true\n  try {\n    wc.on('server-ready', (port: number, url: string) => {\n      const info: ServerInfo = { port, url, seen_at: Date.now() }\n      _servers.set(port, info)\n      // Wake any pending webcontainer_server_ready callers.\n      while (_pendingServerResolvers.length > 0) {\n        const resolve = _pendingServerResolvers.shift()\n        try { resolve?.(info) } catch {}\n      }\n    })\n  } catch (err) {\n    console.warn('[webcontainer] failed to install server-ready listener:', err)\n    _serverListenerInstalled = false\n  }\n}\n\nasync function getWC() {\n  if (_wc) return _wc\n  if (_wcBootPromise) return _wcBootPromise\n  _wcBootPromise = (async () => {\n    // Pre-flight: surface actionable error when cross-origin isolation is missing.\n    if (typeof window !== 'undefined' && (window as any).crossOriginIsolated === false) {\n      throw new Error(\n        'WebContainer requires cross-origin isolation (window.crossOriginIsolated === false). ' +\n        'Ensure the COOP/COEP service worker (coi-serviceworker.js) has registered and reload the page.'\n      )\n    }\n    const mod: any = await import('@webcontainer/api')\n    const wc = await mod.WebContainer.boot()\n    _wc = wc\n    // Install the global server-ready listener IMMEDIATELY so we never miss events.\n    installServerListener(wc)\n    return wc\n  })().catch((err) => {\n    _wcBootPromise = null // CLEAR on failure so retry is possible\n    throw err\n  })\n  return _wcBootPromise\n}\n\n// --- Isolation check (call this FIRST when debugging) -----------------------\n\nexport const wcIsolationTool = tool({\n  name: 'webcontainer_isolation_status',\n  description:\n    'Check if the page has cross-origin isolation needed for WebContainer. Returns crossOriginIsolated, SharedArrayBuffer availability, and a diagnosis.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      const isolated = typeof window !== 'undefined' ? (window as any).crossOriginIsolated : false\n      const hasSAB = typeof SharedArrayBuffer !== 'undefined'\n      const isSecure = typeof window !== 'undefined' ? window.isSecureContext : false\n      const diagnosis = isolated && hasSAB\n        ? 'READY: WebContainer can boot.'\n        : !isSecure\n          ? 'Page is not in a secure context (HTTPS / localhost required).'\n          : !hasSAB\n            ? 'SharedArrayBuffer unavailable — COEP header missing or blocked.'\n            : 'Cross-origin isolation not yet active. Reload the page once after coi-serviceworker registers.'\n      return JSON.stringify({\n        status: 'success',\n        crossOriginIsolated: isolated,\n        hasSharedArrayBuffer: hasSAB,\n        isSecureContext: isSecure,\n        diagnosis,\n        fix: isolated ? null : {\n          dev: 'vite.config.ts should set server.headers for COOP/COEP (already done in this repo)',\n          prod: 'coi-serviceworker.js must be loaded in index.html BEFORE any module scripts',\n        },\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Boot -------------------------------------------------------------------\n\nexport const wcBootTool = tool({\n  name: 'webcontainer_boot',\n  description: 'Boot the WebContainer (in-browser Node.js runtime). Call once before other wc_* tools. Retryable on failure.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      const wc = await getWC()\n      return JSON.stringify({\n        status: 'success',\n        booted: true,\n        workdir: wc.workdir ?? null,\n        already_mounted: _mounted,\n        hint: 'Use webcontainer_write_files to mount your project, then webcontainer_exec to run commands.',\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({\n        status: 'error',\n        error: (err as Error).message,\n        hint: 'Run webcontainer_isolation_status first. If crossOriginIsolated is false, reload the page.',\n      })\n    }\n  },\n})\n\n// --- Write (merge-safe) -----------------------------------------------------\n\nfunction buildTree(files: Record<string, string>) {\n  const tree: any = {}\n  for (const [path, content] of Object.entries(files)) {\n    const parts = path.split('/').filter(Boolean)\n    if (parts.some((p) => p === '..' || p === '.')) {\n      throw new Error(`Illegal path segment in \"${path}\"`)\n    }\n    let cur = tree\n    for (let i = 0; i < parts.length - 1; i++) {\n      const seg = parts[i]\n      cur[seg] = cur[seg] || { directory: {} }\n      cur = cur[seg].directory\n    }\n    cur[parts[parts.length - 1]] = { file: { contents: content } }\n  }\n  return tree\n}\n\nexport const wcWriteTool = tool({\n  name: 'webcontainer_write_files',\n  description:\n    'Write files into the WebContainer filesystem. Map of relative path → content, e.g. {\"package.json\": \"...\", \"src/index.js\": \"...\"}. ' +\n    'First call bulk-mounts; subsequent calls merge individual files (do NOT overwrite the whole tree).',\n  inputSchema: z.object({\n    files: z.record(z.string(), z.string()).describe('Map of relative path to file content'),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      const entries = Object.entries(input.files)\n      if (entries.length === 0) return JSON.stringify({ status: 'success', written: 0 })\n\n      if (!_mounted) {\n        // Initial bulk mount — fast path\n        const tree = buildTree(input.files)\n        await wc.mount(tree)\n        _mounted = true\n      } else {\n        // Merge mode — write files individually so we don't blow away existing state\n        for (const [path, content] of entries) {\n          const parts = path.split('/').filter(Boolean)\n          if (parts.some((p) => p === '..' || p === '.')) {\n            throw new Error(`Illegal path segment in \"${path}\"`)\n          }\n          if (parts.length > 1) {\n            const dir = parts.slice(0, -1).join('/')\n            try { await wc.fs.mkdir(dir, { recursive: true }) } catch {}\n          }\n          await wc.fs.writeFile(path, content)\n        }\n      }\n      return JSON.stringify({ status: 'success', written: entries.length, mode: _mounted ? 'merge' : 'mount' })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Exec -------------------------------------------------------------------\n\nexport const wcExecTool = tool({\n  name: 'webcontainer_exec',\n  description:\n    'Run a shell command in the WebContainer. Example: {\"cmd\":\"npm\",\"args\":[\"install\"]}. Captures stdout/stderr with a hard timeout. ' +\n    'Default timeout is 120s (npm install is slow on first boot). Set keep_head=true to capture first 4KB instead of last.',\n  inputSchema: z.object({\n    cmd: z.string().describe('Executable, e.g. \"npm\", \"node\", \"ls\", \"cat\"'),\n    args: z.array(z.string()).optional(),\n    cwd: z.string().optional().describe('Working directory inside the container (e.g. \"src\", \"packages/api\")'),\n    timeout_ms: z.number().optional().describe('Default 120000 (2 min)'),\n    keep_head: z.boolean().optional().describe('Keep first 4KB of output instead of last 4KB (useful for install errors)'),\n    max_output: z.number().optional().describe('Output cap in bytes. Default 4000'),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      const spawnOpts = input.cwd ? { cwd: input.cwd } : undefined\n      const proc = await wc.spawn(input.cmd, input.args || [], spawnOpts)\n\n      const timeout = input.timeout_ms ?? 120_000\n      const maxOut = input.max_output ?? 4000\n      let out = ''\n      let killed = false\n      const killProc = () => { if (!killed) { killed = true; try { proc.kill() } catch {} } }\n\n      // Global deadline — if hit, kill the process\n      const deadlineTimer = setTimeout(killProc, timeout)\n\n      // Drain output. Race each read against the \"killed\" signal so we never hang.\n      const reader = proc.output.getReader()\n      const drainPromise = (async () => {\n        try {\n          while (true) {\n            const result = await Promise.race([\n              reader.read(),\n              new Promise<{ done: true; value: undefined }>((r) => {\n                // If the process is killed, break the loop.\n                const check = setInterval(() => {\n                  if (killed) { clearInterval(check); r({ done: true, value: undefined }) }\n                }, 50)\n              }),\n            ])\n            if (result.done) break\n            const chunk = typeof result.value === 'string' ? result.value : String(result.value ?? '')\n            out += chunk\n          }\n        } catch {}\n        try { reader.releaseLock() } catch {}\n      })()\n\n      const code: number = await Promise.race([\n        proc.exit,\n        new Promise<number>((r) => setTimeout(() => { killProc(); r(-1) }, timeout)),\n      ])\n\n      clearTimeout(deadlineTimer)\n      // Give the drain a brief window to flush, but don't block forever.\n      await Promise.race([drainPromise, new Promise((r) => setTimeout(r, 150))])\n\n      const truncated = out.length > maxOut\n      const snippet = truncated\n        ? (input.keep_head ? out.slice(0, maxOut) : out.slice(-maxOut))\n        : out\n\n      return JSON.stringify({\n        status: code === 0 ? 'success' : 'error',\n        exitCode: code,\n        output: snippet,\n        truncated,\n        full_length: out.length,\n        timed_out: code === -1,\n        cwd: input.cwd ?? null,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({\n        status: 'error',\n        error: (err as Error).message,\n        hint: (err as Error).message.includes('not found') ? 'Did you run webcontainer_write_files and npm install first?' : undefined,\n      })\n    }\n  },\n})\n\n// --- Read -------------------------------------------------------------------\n\nexport const wcReadTool = tool({\n  name: 'webcontainer_read',\n  description: 'Read a file from the WebContainer filesystem.',\n  inputSchema: z.object({\n    path: z.string().describe('Relative path, e.g. \"package.json\"'),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      const content = await wc.fs.readFile(input.path, 'utf-8')\n      return JSON.stringify({ status: 'success', path: input.path, content })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- List & Delete (new) ----------------------------------------------------\n\nexport const wcLsTool = tool({\n  name: 'webcontainer_ls',\n  description: 'List directory entries in the WebContainer. Returns file + directory names.',\n  inputSchema: z.object({\n    path: z.string().optional().describe('Directory path (default \".\")'),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      const entries = await wc.fs.readdir(input.path ?? '.', { withFileTypes: true })\n      return JSON.stringify({\n        status: 'success',\n        path: input.path ?? '.',\n        entries: entries.map((e: any) => ({\n          name: e.name,\n          type: e.isDirectory?.() ? 'dir' : 'file',\n        })),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const wcRmTool = tool({\n  name: 'webcontainer_rm',\n  description: 'Delete a file or directory from the WebContainer filesystem. Set recursive=true to delete directories.',\n  inputSchema: z.object({\n    path: z.string().describe('Path to remove'),\n    recursive: z.boolean().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      await wc.fs.rm(input.path, { recursive: input.recursive ?? false, force: true })\n      return JSON.stringify({ status: 'success', removed: input.path })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Server ready (cache-backed, never misses events) ----------------------\n\nexport const wcServerReadyTool = tool({\n  name: 'webcontainer_server_ready',\n  description:\n    'Get the preview URL for a dev server running inside the container. ' +\n    'If a port was already bound, returns its URL immediately from cache. ' +\n    'Otherwise waits for the next server-ready event up to timeout_ms. ' +\n    'Pass port=N to wait for a specific port only.',\n  inputSchema: z.object({\n    port: z.number().optional().describe('Specific port to wait for. If omitted, returns any running server or waits for the next one.'),\n    timeout_ms: z.number().optional().describe('Default 60000. Set to 0 to only check cache (no wait).'),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      // Ensure listener is installed even if boot happened in a weird path.\n      installServerListener(wc)\n\n      // Cache hit: specific port requested and already running.\n      if (input.port !== undefined && _servers.has(input.port)) {\n        const info = _servers.get(input.port)!\n        return JSON.stringify({ status: 'success', url: info.url, port: info.port, from_cache: true })\n      }\n      // Cache hit: any port, and at least one is running → return the most recent.\n      if (input.port === undefined && _servers.size > 0) {\n        const all = Array.from(_servers.values()).sort((a, b) => b.seen_at - a.seen_at)\n        const info = all[0]\n        return JSON.stringify({\n          status: 'success',\n          url: info.url,\n          port: info.port,\n          from_cache: true,\n          all_servers: all.map(s => ({ port: s.port, url: s.url })),\n        })\n      }\n\n      const timeout = input.timeout_ms ?? 60_000\n      if (timeout === 0) {\n        return JSON.stringify({ status: 'error', error: 'No servers running and timeout_ms=0 (cache-only mode).' })\n      }\n\n      const info = await new Promise<ServerInfo>((resolve, reject) => {\n        let timer: any\n        const waiter = (s: ServerInfo) => {\n          if (input.port !== undefined && s.port !== input.port) {\n            // Wrong port — keep waiting.\n            _pendingServerResolvers.push(waiter)\n            return\n          }\n          clearTimeout(timer)\n          resolve(s)\n        }\n        _pendingServerResolvers.push(waiter)\n        timer = setTimeout(() => {\n          // Remove our waiter from the queue so it doesn't leak.\n          const idx = _pendingServerResolvers.indexOf(waiter)\n          if (idx !== -1) _pendingServerResolvers.splice(idx, 1)\n          reject(new Error(\n            input.port !== undefined\n              ? `Timeout waiting for port ${input.port}. Currently running: ${Array.from(_servers.keys()).join(', ') || 'none'}`\n              : 'Timeout waiting for server-ready. Did your server actually listen()?'\n          ))\n        }, timeout)\n      })\n\n      return JSON.stringify({ status: 'success', url: info.url, port: info.port, from_cache: false })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- List running servers (new) ---------------------------------------------\n\nexport const wcServersListTool = tool({\n  name: 'webcontainer_servers_list',\n  description: 'List all servers currently running inside the WebContainer (returns port + URL for each).',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      await getWC() // ensures listener is installed\n      const all = Array.from(_servers.values()).sort((a, b) => b.seen_at - a.seen_at)\n      return JSON.stringify({\n        status: 'success',\n        count: all.length,\n        servers: all.map(s => ({\n          port: s.port,\n          url: s.url,\n          seen_at: new Date(s.seen_at).toISOString(),\n        })),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Spawn background process (fire-and-forget, returns immediately) --------\n\nexport const wcSpawnTool = tool({\n  name: 'webcontainer_spawn',\n  description:\n    'Start a long-running process in the WebContainer (like `node server.js` or `npm run dev`) without blocking. ' +\n    'Returns immediately after the first 2s of output or on listen. Use this for dev servers — do NOT use webcontainer_exec. ' +\n    'After calling this, use webcontainer_server_ready to get the preview URL.',\n  inputSchema: z.object({\n    cmd: z.string(),\n    args: z.array(z.string()).optional(),\n    cwd: z.string().optional(),\n    wait_ms: z.number().optional().describe('How long to wait for initial output before returning. Default 2000.'),\n  }),\n  callback: async (input) => {\n    try {\n      const wc = await getWC()\n      installServerListener(wc)\n      const spawnOpts = input.cwd ? { cwd: input.cwd } : undefined\n      const proc = await wc.spawn(input.cmd, input.args || [], spawnOpts)\n      const waitMs = input.wait_ms ?? 2000\n\n      let out = ''\n      const reader = proc.output.getReader()\n      // Drain output into `out` for the wait window, then return without blocking.\n      const drain = (async () => {\n        try {\n          while (true) {\n            const { value, done } = await reader.read()\n            if (done) break\n            out += typeof value === 'string' ? value : String(value ?? '')\n          }\n        } catch {}\n      })()\n      // NOTE: we don't await drain — it continues in the background.\n      // We also don't release the reader; letting it keep pulling keeps the stream flowing.\n      void drain\n\n      // Give the process a window to boot / print / call listen().\n      await new Promise((r) => setTimeout(r, waitMs))\n\n      return JSON.stringify({\n        status: 'success',\n        spawned: true,\n        cmd: input.cmd,\n        args: input.args || [],\n        initial_output: out.slice(-2000),\n        hint: 'Process is running in the background. Call webcontainer_server_ready to get the preview URL.',\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const WEBCONTAINER_TOOLS = [\n  wcIsolationTool,\n  wcBootTool,\n  wcWriteTool,\n  wcExecTool,\n  wcSpawnTool,          // NEW: fire-and-forget for long-running processes\n  wcServersListTool,    // NEW: list all running servers\n  wcReadTool,\n  wcLsTool,\n  wcRmTool,\n  wcServerReadyTool,\n]\n"]}