{"version":3,"sources":["../src/tools/file-system.ts"],"names":["tool","z"],"mappings":"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","file":"chunk-DB54ZU5Y.cjs","sourcesContent":["/**\n * file-system.ts — Real local filesystem access via File System Access API.\n *\n * Bugs fixed vs original:\n *   #1 fs_read base64 used char-by-char concat + single btoa() → O(n²) + stack\n *      overflow on files >100 KB. Now uses FileReader.readAsDataURL for base64\n *      (browser-native, no size limit).\n *   #2 fs_write(append:true) read the entire existing file into JS memory,\n *      concatenated, and wrote back → 2× memory + 2× disk write for every\n *      append. Now uses writable.seek(file.size) + writable.write(delta).\n *   #3 No capability pre-flight — agent had to parse an error string. Now\n *      fs_check_support returns {supported, engine, reason, fallback}.\n *   #4 fs_list recursed UNBOUNDED through deep trees before truncating at 500\n *      in the response. Now bails out of the walk as soon as the cap is hit.\n *   #5 fs_pick_file(multiple:true) returned {aliases:[...]} while all other\n *      tools accept {alias:string} — inconsistent shape. Now also registers\n *      each file under just the base alias at position 0 for simple single-file\n *      access after a multi-pick.\n *   #6 Hash/inode identity — if the user re-picks the SAME folder, we now\n *      detect via isSameEntry() and reuse instead of creating a new handle.\n *      Fixes stale-alias bugs.\n *   #7 Path traversal in \"dirAlias:relative/../../etc/passwd\" silently worked\n *      at the library level (FSA API doesn't block it). Now rejects '..' in\n *      relative path segments.\n *   #8 No way to verifyPermission() on a stored handle — reloading the page\n *      loses permission. Now fs_request_permission can re-prompt.\n *   #9 fs_write didn't support binary (base64) content. Now accepts\n *      content_base64 or content with explicit encoding.\n *   #10 fs_get_metadata tool — size / type / lastModified / permission\n *       without reading the file body.\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\nconst DIR_HANDLES = new Map<string, FileSystemDirectoryHandle>()\nconst FILE_HANDLES = new Map<string, FileSystemFileHandle>()\n\nfunction isSupported(): boolean {\n  return typeof window !== 'undefined' &&\n    typeof (window as any).showDirectoryPicker === 'function'\n}\n\nfunction isPickFileSupported(): boolean {\n  return typeof window !== 'undefined' &&\n    typeof (window as any).showOpenFilePicker === 'function'\n}\n\n/* Reject path segments that'd allow escape from the alias root. */\nfunction validateSegments(parts: string[], fullPath: string) {\n  for (const p of parts) {\n    if (p === '..' || p === '.' || p === '') {\n      throw new Error(`Illegal path segment \"${p}\" in \"${fullPath}\"`)\n    }\n    if (p.startsWith('/') || /[\\\\:*?\"<>|]/.test(p)) {\n      throw new Error(`Invalid character in path segment \"${p}\"`)\n    }\n  }\n}\n\nfunction splitAliasPath(input: string): { alias: string; parts: string[] } {\n  const idx = input.indexOf(':')\n  if (idx === -1) return { alias: input, parts: [] }\n  const alias = input.slice(0, idx)\n  const rel = input.slice(idx + 1)\n  const parts = rel.split('/').filter(Boolean)\n  validateSegments(parts, input)\n  return { alias, parts }\n}\n\nasync function resolveFileHandle(pathOrAlias: string, create: boolean = false): Promise<FileSystemFileHandle> {\n  // Direct alias\n  if (FILE_HANDLES.has(pathOrAlias)) return FILE_HANDLES.get(pathOrAlias)!\n  const { alias, parts } = splitAliasPath(pathOrAlias)\n  if (parts.length === 0) throw new Error(`Unknown file alias: ${alias}`)\n  const dir = DIR_HANDLES.get(alias)\n  if (!dir) throw new Error(`Unknown directory alias: ${alias}`)\n  let cur: any = dir\n  for (let i = 0; i < parts.length - 1; i++) {\n    cur = await cur.getDirectoryHandle(parts[i], { create })\n  }\n  return cur.getFileHandle(parts[parts.length - 1], { create })\n}\n\nasync function resolveDirHandle(aliasOrPath: string, create: boolean = false): Promise<FileSystemDirectoryHandle> {\n  const { alias, parts } = splitAliasPath(aliasOrPath)\n  const base = DIR_HANDLES.get(alias)\n  if (!base) throw new Error(`Unknown directory alias: ${alias}`)\n  let cur: FileSystemDirectoryHandle = base\n  for (const p of parts) {\n    cur = await cur.getDirectoryHandle(p, { create })\n  }\n  return cur\n}\n\n/* ------------------------------------------------------------------------- */\n\nexport const fsCheckSupportTool = tool({\n  name: 'fs_check_support',\n  description:\n    'Check if the File System Access API is available in the current browser. ' +\n    'Returns {supported, directory_pick_supported, file_pick_supported, engine, reason, fallback}. ' +\n    'Call this FIRST before any fs_pick_* tool to give the user a clear error instead of an opaque failure.',\n  inputSchema: z.object({}),\n  callback: () => {\n    const dir = isSupported()\n    const file = isPickFileSupported()\n    const ua = navigator.userAgent\n    let engine = 'unknown'\n    if (/Firefox\\//.test(ua)) engine = 'Firefox'\n    else if (/Edg\\//.test(ua)) engine = 'Edge'\n    else if (/Chrome\\//.test(ua)) engine = 'Chrome'\n    else if (/Safari\\//.test(ua)) engine = 'Safari'\n    const supported = dir && file\n    let reason: string | null = null\n    let fallback: string | null = null\n    if (!supported) {\n      if (engine === 'Firefox') {\n        reason = 'Firefox does not implement the File System Access API (Mozilla refused to ship for fingerprinting/security concerns).'\n        fallback = 'Use the WebContainer tools (webcontainer_write_files / webcontainer_read / webcontainer_ls) for an in-browser Node.js filesystem instead — works in any browser with cross-origin isolation.'\n      } else if (engine === 'Safari') {\n        reason = 'Safari has partial File System Access API support (origin private FS only, no user-picked directories).'\n        fallback = 'Switch to Chrome/Edge for full FS access, or use WebContainer for an in-browser FS.'\n      } else {\n        reason = 'File System Access API not detected in this browser.'\n        fallback = 'Use WebContainer tools, or switch to Chrome/Edge/Opera.'\n      }\n    }\n    return JSON.stringify({\n      status: 'success',\n      supported,\n      directory_pick_supported: dir,\n      file_pick_supported: file,\n      engine,\n      is_secure_context: typeof window !== 'undefined' ? window.isSecureContext : false,\n      reason,\n      fallback,\n    })\n  },\n})\n\nexport const fsPickDirTool = tool({\n  name: 'fs_pick_dir',\n  description:\n    'Prompt user to pick a local directory. Returns an alias for later reads/writes. REQUIRES USER GESTURE. Chrome/Edge only — call fs_check_support first.',\n  inputSchema: z.object({\n    alias: z.string().describe('Name to refer to this directory later, e.g. \"project\"'),\n    mode: z.enum(['read', 'readwrite']).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      if (!isSupported()) {\n        return JSON.stringify({\n          status: 'error',\n          error: 'File System Access API not supported',\n          hint: 'Run fs_check_support for the full diagnosis. Use WebContainer tools on Firefox.',\n        })\n      }\n      const handle: FileSystemDirectoryHandle = await (window as any).showDirectoryPicker({\n        mode: input.mode || 'readwrite',\n      })\n      // Deduplicate: if we already have this exact directory under another\n      // alias, reuse the existing handle so both aliases stay valid.\n      for (const [existingAlias, existing] of DIR_HANDLES.entries()) {\n        if (await existing.isSameEntry?.(handle as any).catch(() => false)) {\n          DIR_HANDLES.set(input.alias, existing)\n          return JSON.stringify({\n            status: 'success',\n            alias: input.alias,\n            name: existing.name,\n            reused_from: existingAlias,\n          })\n        }\n      }\n      DIR_HANDLES.set(input.alias, handle)\n      return JSON.stringify({ status: 'success', alias: input.alias, name: handle.name })\n    } catch (err: unknown) {\n      const msg = (err as Error).message\n      if (msg.includes('aborted') || msg.includes('AbortError')) {\n        return JSON.stringify({ status: 'cancelled', error: 'User cancelled the picker' })\n      }\n      return JSON.stringify({ status: 'error', error: msg })\n    }\n  },\n})\n\nexport const fsPickFileTool = tool({\n  name: 'fs_pick_file',\n  description: 'Prompt user to pick file(s). Returns an alias (or aliases). REQUIRES USER GESTURE. Chrome/Edge only.',\n  inputSchema: z.object({\n    alias: z.string().describe('Name to refer to this file later'),\n    multiple: z.boolean().optional(),\n    types: z.array(z.object({\n      description: z.string().optional(),\n      accept: z.record(z.string(), z.array(z.string())).describe('{\"text/*\": [\".txt\",\".md\"]}'),\n    })).optional().describe('File type filters for the picker'),\n  }),\n  callback: async (input) => {\n    try {\n      if (!isPickFileSupported()) {\n        return JSON.stringify({\n          status: 'error',\n          error: 'File System Access API not supported (showOpenFilePicker)',\n          hint: 'Run fs_check_support. Use WebContainer tools on Firefox.',\n        })\n      }\n      const pickerOpts: any = { multiple: !!input.multiple }\n      if (input.types) pickerOpts.types = input.types\n      const handles: FileSystemFileHandle[] = await (window as any).showOpenFilePicker(pickerOpts)\n      if (input.multiple) {\n        const aliases: string[] = []\n        for (let i = 0; i < handles.length; i++) {\n          const a = `${input.alias}_${i}`\n          FILE_HANDLES.set(a, handles[i])\n          aliases.push(a)\n        }\n        // Also register the first under the bare alias for convenience.\n        FILE_HANDLES.set(input.alias, handles[0])\n        return JSON.stringify({\n          status: 'success',\n          aliases,\n          primary_alias: input.alias,\n          count: handles.length,\n        })\n      }\n      FILE_HANDLES.set(input.alias, handles[0])\n      return JSON.stringify({ status: 'success', alias: input.alias, name: handles[0].name })\n    } catch (err: unknown) {\n      const msg = (err as Error).message\n      if (msg.includes('aborted') || msg.includes('AbortError')) {\n        return JSON.stringify({ status: 'cancelled', error: 'User cancelled the picker' })\n      }\n      return JSON.stringify({ status: 'error', error: msg })\n    }\n  },\n})\n\n/* Re-verify permissions on stored handles after a page reload or permission loss. */\nexport const fsRequestPermissionTool = tool({\n  name: 'fs_request_permission',\n  description:\n    'Re-prompt the user for permission on a stored handle (useful after a page reload where permission is often lost). ' +\n    'Requires user gesture.',\n  inputSchema: z.object({\n    alias: z.string().describe('Directory or file alias'),\n    mode: z.enum(['read', 'readwrite']).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const handle: any = DIR_HANDLES.get(input.alias) ?? FILE_HANDLES.get(input.alias)\n      if (!handle) return JSON.stringify({ status: 'error', error: `Unknown alias: ${input.alias}` })\n      const opts = { mode: input.mode ?? 'readwrite' }\n      const query = await handle.queryPermission?.(opts)\n      if (query === 'granted') return JSON.stringify({ status: 'success', permission: 'granted', requested: false })\n      const result = await handle.requestPermission?.(opts)\n      return JSON.stringify({ status: 'success', permission: result, requested: true })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const fsListTool = tool({\n  name: 'fs_list',\n  description:\n    'List entries in a directory alias. Optionally recursive. Path can be \"alias\" or \"alias:subdir\". ' +\n    'Bails out of the walk when max_entries is hit (default 500) so it never hangs on huge trees.',\n  inputSchema: z.object({\n    path: z.string().describe('Directory alias, or \"alias:subdir\"'),\n    recursive: z.boolean().optional(),\n    maxDepth: z.number().optional(),\n    max_entries: z.number().optional().describe('Stop after N total entries. Default 500.'),\n    pattern: z.string().optional().describe('Optional filename regex filter'),\n  }),\n  callback: async (input) => {\n    try {\n      const dir = await resolveDirHandle(input.path)\n      const entries: any[] = []\n      const cap = input.max_entries ?? 500\n      const maxDepth = input.maxDepth ?? 10\n      const re = input.pattern ? new RegExp(input.pattern) : null\n      let hitCap = false\n\n      async function walk(d: FileSystemDirectoryHandle, prefix: string, depth: number) {\n        if (hitCap) return\n        for await (const [name, handle] of (d as any).entries()) {\n          if (hitCap || entries.length >= cap) { hitCap = true; return }\n          const path = prefix ? `${prefix}/${name}` : name\n          if (re && !re.test(name)) continue\n          if (handle.kind === 'file') {\n            const f = await (handle as FileSystemFileHandle).getFile()\n            entries.push({\n              path, kind: 'file', size: f.size, type: f.type, modified: f.lastModified,\n            })\n          } else {\n            entries.push({ path, kind: 'dir' })\n            if (input.recursive && depth < maxDepth) {\n              await walk(handle as FileSystemDirectoryHandle, path, depth + 1)\n            }\n          }\n        }\n      }\n      await walk(dir, '', 0)\n\n      return JSON.stringify({\n        status: 'success',\n        path: input.path,\n        count: entries.length,\n        truncated: hitCap,\n        entries,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const fsGetMetadataTool = tool({\n  name: 'fs_metadata',\n  description: 'Return file metadata (size, type, lastModified, permission) without reading the file body.',\n  inputSchema: z.object({\n    path: z.string().describe('File alias or \"dirAlias:relative/path.ext\"'),\n  }),\n  callback: async (input) => {\n    try {\n      const handle = await resolveFileHandle(input.path, false)\n      const f = await handle.getFile()\n      const perm = await (handle as any).queryPermission?.({ mode: 'readwrite' }).catch(() => 'unknown')\n      return JSON.stringify({\n        status: 'success',\n        path: input.path,\n        name: f.name,\n        size: f.size,\n        type: f.type || 'application/octet-stream',\n        modified: f.lastModified,\n        permission: perm,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const fsReadTool = tool({\n  name: 'fs_read',\n  description:\n    'Read a file. Path is either a file alias or \"dirAlias:relative/path.ext\". ' +\n    'Returns text by default. as:\"base64\" returns base64 (chunked, safe for large files). as:\"json\" parses JSON. ' +\n    'Respects maxBytes as a hard cap before any read happens.',\n  inputSchema: z.object({\n    path: z.string(),\n    as: z.enum(['text', 'base64', 'json']).optional(),\n    maxBytes: z.number().optional().describe('Reject files larger than this. Default: no limit.'),\n    encoding: z.string().optional().describe('Text encoding for text/json (default utf-8)'),\n  }),\n  callback: async (input) => {\n    try {\n      const handle = await resolveFileHandle(input.path, false)\n      const file = await handle.getFile()\n      if (input.maxBytes && file.size > input.maxBytes) {\n        return JSON.stringify({\n          status: 'error',\n          error: `File too large (${file.size} > ${input.maxBytes})`,\n          size: file.size,\n        })\n      }\n      if (input.as === 'base64') {\n        // Use FileReader.readAsDataURL — browser-native, chunk-safe, no O(n²).\n        const dataUrl = await new Promise<string>((resolve, reject) => {\n          const fr = new FileReader()\n          fr.onload = () => resolve(fr.result as string)\n          fr.onerror = () => reject(fr.error ?? new Error('FileReader error'))\n          fr.readAsDataURL(file)\n        })\n        // Strip \"data:<mime>;base64,\" prefix\n        const commaIdx = dataUrl.indexOf(',')\n        const b64 = commaIdx !== -1 ? dataUrl.slice(commaIdx + 1) : dataUrl\n        return JSON.stringify({\n          status: 'success', name: file.name, size: file.size, type: file.type, content: b64,\n        })\n      }\n      const text = await file.text()\n      if (input.as === 'json') {\n        try {\n          return JSON.stringify({\n            status: 'success', name: file.name, size: file.size, json: JSON.parse(text),\n          })\n        } catch (e) {\n          return JSON.stringify({\n            status: 'error', error: 'Not valid JSON', preview: text.slice(0, 200),\n            parse_error: (e as Error).message,\n          })\n        }\n      }\n      return JSON.stringify({ status: 'success', name: file.name, size: file.size, content: text })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const fsWriteTool = tool({\n  name: 'fs_write',\n  description:\n    'Write content to a file alias or \"dirAlias:relative/path.ext\". Creates intermediate dirs. ' +\n    'Text mode by default; pass content_base64 instead of content for binary data. ' +\n    'append:true uses writable.seek() for efficient O(1) append instead of reading the whole file.',\n  inputSchema: z.object({\n    path: z.string(),\n    content: z.string().optional(),\n    content_base64: z.string().optional().describe('Base64 content — decoded and written as binary.'),\n    append: z.boolean().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      if (!input.content && !input.content_base64) {\n        return JSON.stringify({ status: 'error', error: 'Provide content (text) or content_base64 (binary)' })\n      }\n      const handle = await resolveFileHandle(input.path, true)\n      // Decide payload + size up front (needed for append seek)\n      let payload: Uint8Array | string\n      let byteLen: number\n      if (input.content_base64) {\n        const bin = atob(input.content_base64)\n        const bytes = new Uint8Array(bin.length)\n        for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n        payload = bytes\n        byteLen = bytes.byteLength\n      } else {\n        payload = input.content!\n        byteLen = new TextEncoder().encode(input.content!).byteLength\n      }\n\n      const writable: any = await (handle as any).createWritable({ keepExistingData: !!input.append })\n      if (input.append) {\n        // Efficient append: seek past existing bytes, then write delta.\n        const existing = await handle.getFile()\n        try {\n          if (typeof writable.seek === 'function') {\n            await writable.seek(existing.size)\n          }\n          await writable.write(payload)\n        } catch {\n          // Fallback path (older FSA implementations without seek)\n          const existingText = await existing.text()\n          const combined = typeof payload === 'string' ? existingText + payload : existingText\n          await writable.write(combined)\n          if (payload instanceof Uint8Array) {\n            // Append raw bytes after text (rare path)\n            await writable.write(payload)\n          }\n        }\n      } else {\n        await writable.write(payload)\n      }\n      await writable.close()\n      return JSON.stringify({\n        status: 'success',\n        path: input.path,\n        bytes: byteLen,\n        mode: input.append ? 'append' : 'overwrite',\n        kind: input.content_base64 ? 'binary' : 'text',\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const fsDeleteTool = tool({\n  name: 'fs_delete',\n  description: 'Delete a file or subdirectory in a dir alias. Path: \"dirAlias:relative/path\". Set recursive:true for directories.',\n  inputSchema: z.object({\n    path: z.string(),\n    recursive: z.boolean().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const { alias, parts } = splitAliasPath(input.path)\n      const dir = DIR_HANDLES.get(alias)\n      if (!dir) return JSON.stringify({ status: 'error', error: `Unknown alias: ${alias}` })\n      if (parts.length === 0) {\n        return JSON.stringify({\n          status: 'error',\n          error: 'Refusing to delete the entire directory root via fs_delete. Use fs_forget to remove the alias.',\n        })\n      }\n      let cur: any = dir\n      for (let i = 0; i < parts.length - 1; i++) {\n        cur = await cur.getDirectoryHandle(parts[i])\n      }\n      await cur.removeEntry(parts[parts.length - 1], { recursive: !!input.recursive })\n      return JSON.stringify({ status: 'success', deleted: input.path })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const fsForgetTool = tool({\n  name: 'fs_forget',\n  description: 'Drop a directory or file alias from the registry (does NOT delete from disk).',\n  inputSchema: z.object({\n    alias: z.string(),\n  }),\n  callback: (input) => {\n    const hadDir = DIR_HANDLES.delete(input.alias)\n    const hadFile = FILE_HANDLES.delete(input.alias)\n    return JSON.stringify({\n      status: 'success',\n      alias: input.alias,\n      removed_dir: hadDir,\n      removed_file: hadFile,\n    })\n  },\n})\n\nexport const fsStatusTool = tool({\n  name: 'fs_status',\n  description: 'List currently opened directory and file aliases, plus API support status.',\n  inputSchema: z.object({}),\n  callback: () => {\n    return JSON.stringify({\n      status: 'success',\n      supported: isSupported(),\n      directories: Array.from(DIR_HANDLES.entries()).map(([a, h]) => ({ alias: a, name: h.name })),\n      files: Array.from(FILE_HANDLES.entries()).map(([a, h]) => ({ alias: a, name: h.name })),\n    })\n  },\n})\n\nexport const FILE_SYSTEM_TOOLS = [\n  fsCheckSupportTool,       // NEW: call first\n  fsPickDirTool,\n  fsPickFileTool,\n  fsRequestPermissionTool,  // NEW: reauth after reload\n  fsListTool,\n  fsGetMetadataTool,        // NEW: stat without read\n  fsReadTool,\n  fsWriteTool,\n  fsDeleteTool,\n  fsForgetTool,             // NEW: unregister alias\n  fsStatusTool,\n]\n"]}