{"version":3,"sources":["../../../tools/warp_grep/agent/config.ts","../../../tools/warp_grep/utils/ripgrep.ts","../../../tools/warp_grep/utils/paths.ts","../../../tools/warp_grep/utils/files.ts","../../../tools/warp_grep/providers/local.ts","../../../tools/warp_grep/openai.ts","../../../tools/warp_grep/agent/runner.ts","../../../tools/warp_grep/agent/parser.ts","../../../tools/warp_grep/agent/tools/grep.ts","../../../tools/warp_grep/agent/tools/read.ts","../../../tools/warp_grep/agent/tools/list_directory.ts","../../../tools/warp_grep/agent/tools/glob.ts","../../../tools/warp_grep/agent/tools/finish.ts","../../../tools/warp_grep/agent/helpers.ts","../../../package.json","../../../version.ts","../../../logger.ts","../../../tools/warp_grep/providers/remote.ts","../../../tools/warp_grep/providers/code_storage_http.ts","../../../tools/warp_grep/utils/github.ts","../../../tools/utils/resilience.ts","../../../core/error.ts","../../../core/client.ts","../../../core/resource.ts","../../../tools/compact/core.ts","../../../tools/compact/utils.ts","../../../tools/warp_grep/client.ts","../../../tools/warp_grep/prompts.ts"],"sourcesContent":["// Parse timeout from env, defaulting to 30 seconds\nconst parseEnvTimeout = (envValue: string | undefined, defaultMs: number): number => {\n  if (!envValue) return defaultMs;\n  const parsed = parseInt(envValue, 10);\n  return isNaN(parsed) || parsed <= 0 ? defaultMs : parsed;\n};\n\nexport const AGENT_CONFIG = {\n  MAX_TURNS: 6,\n  /** Default timeout for model calls. Can be overridden via MORPH_WARP_GREP_TIMEOUT env var (in ms) */\n  TIMEOUT_MS: parseEnvTimeout(process.env.MORPH_WARP_GREP_TIMEOUT, 60_000),\n  MAX_CONTEXT_CHARS: 321_600,\n  MAX_OUTPUT_LINES: 200,\n  MAX_LIST_RESULTS: 500,\n  MAX_READ_LINES: 800,\n  MAX_LIST_DEPTH: 3,\n  LIST_TIMEOUT_MS: 2_000,\n};\n\n/**\n * Comprehensive exclusion list for directories and files\n * These patterns are used with ripgrep's -g flag\n */\nconst BUILTIN_EXCLUDES = [\n  // Version control\n  '.git', '.svn', '.hg', '.bzr',\n  \n  // Dependencies\n  'node_modules', 'bower_components', '.pnpm', '.yarn',\n  'vendor', 'packages', 'Pods', '.bundle',\n  \n  // Python\n  '__pycache__', '.pytest_cache', '.mypy_cache', '.ruff_cache',\n  '.venv', 'venv', '.tox', '.nox', '.eggs', '*.egg-info',\n  \n  // Build outputs\n  'dist', 'build', 'out', 'output', 'target', '_build',\n  '.next', '.nuxt', '.output', '.vercel', '.netlify',\n  \n  // Cache directories\n  '.cache', '.parcel-cache', '.turbo', '.nx', '.gradle',\n  \n  // IDE/Editor\n  '.idea', '.vscode', '.vs',\n  \n  // Coverage\n  'coverage', '.coverage', 'htmlcov', '.nyc_output',\n  \n  // Temporary\n  'tmp', 'temp', '.tmp', '.temp',\n  \n  // Lock files\n  'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb',\n  'Cargo.lock', 'Gemfile.lock', 'poetry.lock',\n  \n  // Binary/minified\n  '*.min.js', '*.min.css', '*.bundle.js',\n  '*.wasm', '*.so', '*.dll', '*.pyc',\n  '*.map', '*.js.map',\n  \n  // Hidden directories catch-all\n  '.*',\n];\n\nexport const DEFAULT_EXCLUDES = (process.env.MORPH_WARP_GREP_EXCLUDE || '')\n  .split(',')\n  .map(s => s.trim())\n  .filter(Boolean)\n  .concat(BUILTIN_EXCLUDES);\n\nexport const DEFAULT_MODEL = 'morph-warp-grep-v2.1';\n","import { spawn } from 'child_process';\nimport { rgPath } from '@vscode/ripgrep';\n\nexport type ExecResult = { stdout: string; stderr: string; exitCode: number };\n\n// Cache the working ripgrep path to avoid repeated fallback checks\nlet resolvedRgPath: string | null = null;\nlet rgPathChecked = false;\n\nfunction spawnRg(rgBinary: string, args: string[], opts?: { cwd?: string; env?: NodeJS.ProcessEnv }): Promise<ExecResult> {\n  return new Promise((resolve) => {\n    const child = spawn(rgBinary, args, {\n      cwd: opts?.cwd,\n      env: { ...process.env, ...(opts?.env || {}) },\n      stdio: ['ignore', 'pipe', 'pipe'],\n    });\n    let stdout = '';\n    let stderr = '';\n    child.stdout.on('data', (d) => (stdout += d.toString()));\n    child.stderr.on('data', (d) => (stderr += d.toString()));\n    child.on('close', (code) => {\n      resolve({ stdout, stderr, exitCode: typeof code === 'number' ? code : -1 });\n    });\n    child.on('error', () => {\n      resolve({ stdout: '', stderr: 'Failed to spawn ripgrep.', exitCode: -1 });\n    });\n  });\n}\n\n// Check if a result indicates a binary compatibility failure (not a normal rg error)\nfunction isBinaryFailure(result: ExecResult): boolean {\n  // Spawn error\n  if (result.exitCode === -1) return true;\n  // jemalloc page size issue (common on ARM64 with non-standard page sizes)\n  if (result.stderr.includes('jemalloc') || result.stderr.includes('Unsupported system page size')) return true;\n  // SIGABRT (134 = 128 + 6)\n  if (result.exitCode === 134) return true;\n  return false;\n}\n\nexport async function runRipgrep(args: string[], opts?: { cwd?: string; env?: NodeJS.ProcessEnv }): Promise<ExecResult> {\n  // If we've already determined the working path, use it\n  if (rgPathChecked && resolvedRgPath) {\n    return spawnRg(resolvedRgPath, args, opts);\n  }\n\n  // First attempt: bundled ripgrep\n  if (!rgPathChecked) {\n    const result = await spawnRg(rgPath, args, opts);\n    \n    if (!isBinaryFailure(result)) {\n      // Bundled binary works, cache it\n      resolvedRgPath = rgPath;\n      rgPathChecked = true;\n      return result;\n    }\n\n    // Bundled binary failed, try system rg\n    const fallbackResult = await spawnRg('rg', args, opts);\n    \n    if (!isBinaryFailure(fallbackResult)) {\n      // System rg works, cache it\n      resolvedRgPath = 'rg';\n      rgPathChecked = true;\n      return fallbackResult;\n    }\n\n    // Neither works, mark as checked and return the original error\n    rgPathChecked = true;\n    return { \n      stdout: '', \n      stderr: 'Failed to spawn ripgrep. Neither bundled nor system rg is available.', \n      exitCode: -1 \n    };\n  }\n\n  // rgPathChecked is true but resolvedRgPath is null - no working rg found\n  return { \n    stdout: '', \n    stderr: 'Failed to spawn ripgrep. Neither bundled nor system rg is available.', \n    exitCode: -1 \n  };\n}\n\n\n","import fs from 'fs';\nimport path from 'path';\n\nexport function resolveUnderRepo(repoRoot: string, targetPath: string): string {\n  const absRoot = path.resolve(repoRoot);\n  const resolved = path.resolve(absRoot, targetPath);\n  ensureWithinRepo(absRoot, resolved);\n  return resolved;\n}\n\nexport function ensureWithinRepo(repoRoot: string, absTarget: string): void {\n  const rel = path.relative(path.resolve(repoRoot), path.resolve(absTarget));\n  if (rel.startsWith('..') || path.isAbsolute(rel)) {\n    throw new Error(`Path outside repository root: ${absTarget}`);\n  }\n}\n\nexport function toRepoRelative(repoRoot: string, absPath: string): string {\n  return path.relative(path.resolve(repoRoot), path.resolve(absPath));\n}\n\nexport function isSymlink(p: string): boolean {\n  try {\n    const st = fs.lstatSync(p);\n    return st.isSymbolicLink();\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Detects and removes consecutive duplicate path segments.\n *\n * When the model predicts a path that includes the repo directory name,\n * joining with repoRoot creates duplication:\n *   repoRoot=\"/Users/dhruv/repo\" + predicted=\"repo/src/file.ts\"\n *   → \"/Users/dhruv/repo/repo/src/file.ts\"\n *\n * This function detects such patterns and returns the corrected path,\n * or null if no duplication is found.\n */\nexport function fixPathRepetition(fullPath: string): string | null {\n  const segments = fullPath.split(path.sep).filter(Boolean);\n  if (segments.length < 2) return null;\n\n  for (let len = Math.floor(segments.length / 2); len >= 1; len--) {\n    for (let i = 0; i <= segments.length - 2 * len; i++) {\n      const first = segments.slice(i, i + len);\n      const second = segments.slice(i + len, i + 2 * len);\n\n      if (first.every((seg, idx) => seg === second[idx])) {\n        const fixed = [...segments.slice(0, i), ...segments.slice(i + len)];\n        return path.sep + fixed.join(path.sep);\n      }\n    }\n  }\n\n  return null;\n}\n\nexport function isTextualFile(filePath: string, maxBytes = 2_000_000): boolean {\n  try {\n    const st = fs.statSync(filePath);\n    if (!st.isFile()) return false;\n    if (st.size > maxBytes) return false;\n    const fd = fs.openSync(filePath, 'r');\n    const buf = Buffer.alloc(512);\n    const read = fs.readSync(fd, buf, 0, buf.length, 0);\n    fs.closeSync(fd);\n    for (let i = 0; i < read; i++) {\n      const c = buf[i];\n      if (c === 0) return false; // binary heuristic\n    }\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n\n","import fs from 'fs/promises';\n\nexport async function readAllLines(filePath: string): Promise<string[]> {\n  const content = await fs.readFile(filePath, 'utf8');\n  // Preserve newlines; split keeping consistency\n  return content.split(/\\r?\\n/);\n}\n\n\n","import fs from 'fs/promises';\nimport fssync from 'fs';\nimport path from 'path';\nimport { runRipgrep } from '../utils/ripgrep.js';\nimport { ensureWithinRepo, resolveUnderRepo, toRepoRelative, isSymlink, isTextualFile, fixPathRepetition } from '../utils/paths.js';\nimport type { WarpGrepProvider, GrepResult, ReadResult, GlobResult, ListDirectoryEntry } from './types.js';\nimport { readAllLines } from '../utils/files.js';\nimport { DEFAULT_EXCLUDES, AGENT_CONFIG } from '../agent/config.js';\n\n/**\n * Directories/files to always skip (exact name match)\n */\nconst SKIP_NAMES = new Set([\n  // Version control\n  '.git', '.svn', '.hg', '.bzr',\n  // Dependencies\n  'node_modules', 'bower_components', '.pnpm', '.yarn',\n  'vendor', 'Pods', '.bundle',\n  // Python\n  '__pycache__', '.pytest_cache', '.mypy_cache', '.ruff_cache',\n  '.venv', 'venv', '.tox', '.nox', '.eggs',\n  // Build outputs\n  'dist', 'build', 'out', 'output', 'target', '_build',\n  '.next', '.nuxt', '.output', '.vercel', '.netlify',\n  // Cache\n  '.cache', '.parcel-cache', '.turbo', '.nx', '.gradle',\n  // IDE\n  '.idea', '.vscode', '.vs',\n  // Coverage\n  'coverage', '.coverage', 'htmlcov', '.nyc_output',\n  // Temp\n  'tmp', 'temp', '.tmp', '.temp',\n  // Lock files\n  'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb',\n  'Cargo.lock', 'Gemfile.lock', 'poetry.lock',\n]);\n\n/**\n * File extensions to skip\n */\n\nconst SKIP_EXTENSIONS = new Set([\n  '.min.js', '.min.css', '.bundle.js',\n  '.wasm', '.so', '.dll', '.pyc',\n  '.map', '.js.map',\n]);\n\n/**\n * Check if a filename should be skipped\n */\nfunction shouldSkip(name: string, allowNames?: Set<string>): boolean {\n  // Allow explicitly permitted names through\n  if (allowNames?.has(name)) return false;\n\n  // Skip exact name matches\n  if (SKIP_NAMES.has(name)) return true;\n\n  // Skip hidden files/directories (start with .)\n  if (name.startsWith('.')) return true;\n\n  // Skip files with certain extensions\n  for (const ext of SKIP_EXTENSIONS) {\n    if (name.endsWith(ext)) return true;\n  }\n\n  return false;\n}\n\nexport class LocalRipgrepProvider implements WarpGrepProvider {\n  private readonly allowNames?: Set<string>;\n\n  constructor(\n    private readonly repoRoot: string,\n    private readonly excludes: string[] = DEFAULT_EXCLUDES,\n    options?: { allowNames?: string[] },\n  ) {\n    if (options?.allowNames?.length) {\n      this.allowNames = new Set(options.allowNames);\n    }\n  }\n\n  async grep(params: { pattern: string; path: string; glob?: string; context_lines?: number; case_sensitive?: boolean }): Promise<GrepResult> {\n    let abs: string;\n    try {\n      abs = resolveUnderRepo(this.repoRoot, params.path);\n    } catch (err) {\n      return {\n        lines: [],\n        error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}`,\n      };\n    }\n    const stat = await fs.stat(abs).catch(() => null);\n    if (!stat) return { lines: [] };\n    const targetArg = abs === path.resolve(this.repoRoot) ? '.' : toRepoRelative(this.repoRoot, abs);\n    const contextLines = params.context_lines !== undefined ? String(params.context_lines) : '1';\n    const args = [\n      '--no-config',\n      '--no-heading',\n      '--with-filename',\n      '--line-number',\n      '--color=never',\n      '--trim',\n      '--max-columns=400',\n      '-C', contextLines,\n      ...(params.case_sensitive === false ? ['--ignore-case'] : []),\n      ...(params.glob ? ['--glob', params.glob] : []),\n      ...this.excludes.filter(e => !this.allowNames?.has(e)).flatMap((e) => ['-g', `!${e}`]),\n      params.pattern,\n      targetArg || '.',\n    ];\n    const res = await runRipgrep(args, { cwd: this.repoRoot });\n    \n    // Gracefully handle ripgrep not being available\n    if (res.exitCode === -1) {\n      return {\n        lines: [],\n        error: `[RIPGREP NOT AVAILABLE] ripgrep (rg) is required but failed to execute. Please install it:\\n` +\n               `  • macOS: brew install ripgrep\\n` +\n               `  • Ubuntu/Debian: apt install ripgrep\\n` +\n               `  • Windows: choco install ripgrep\\n` +\n               `  • Or visit: https://github.com/BurntSushi/ripgrep#installation\\n` +\n               `Exit code: ${res.exitCode}${res.stderr ? `\\nDetails: ${res.stderr}` : ''}`,\n      };\n    }\n    \n    // Handle other ripgrep errors gracefully\n    if (res.exitCode !== 0 && res.exitCode !== 1) {\n      return {\n        lines: [],\n        error: `[RIPGREP ERROR] grep failed with exit code ${res.exitCode}${res.stderr ? `: ${res.stderr}` : ''}`,\n      };\n    }\n    \n    const lines = (res.stdout || '')\n      .trim()\n      .split(/\\r?\\n/)\n      .filter((l) => l.length > 0);\n    if (lines.length > AGENT_CONFIG.MAX_OUTPUT_LINES) {\n      const truncated = lines.slice(0, AGENT_CONFIG.MAX_OUTPUT_LINES);\n      truncated.push(`... (output truncated at ${AGENT_CONFIG.MAX_OUTPUT_LINES} of ${lines.length} lines)`);\n      return { lines: truncated };\n    }\n    \n    return { lines };\n  }\n\n  async read(params: { path: string; start?: number; end?: number }): Promise<ReadResult> {\n    let abs: string;\n    try {\n      abs = resolveUnderRepo(this.repoRoot, params.path);\n    } catch (err) {\n      return {\n        lines: [],\n        error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}`,\n      };\n    }\n    let stat = await fs.stat(abs).catch(() => null);\n\n    // Handle duplicate path segments from model predictions\n    if (!stat || !stat.isFile()) {\n      const fixedPath = fixPathRepetition(abs);\n      if (fixedPath) {\n        const fixedStat = await fs.stat(fixedPath).catch(() => null);\n        if (fixedStat?.isFile()) {\n          abs = fixedPath;\n          stat = fixedStat;\n        }\n      }\n    }\n\n    // Gracefully handle file not found / not a file\n    if (!stat || !stat.isFile()) {\n      return {\n        lines: [],\n        error: `[FILE NOT FOUND] You tried to read \"${params.path}\" but there is no file at this path. ` +\n               `Double-check the path exists and is spelled correctly.`,\n      };\n    }\n    \n    // Gracefully handle symlinks\n    if (isSymlink(abs)) {\n      return {\n        lines: [],\n        error: `[SYMLINK] You tried to read \"${params.path}\" but this is a symlink. ` +\n               `Try reading the actual file it points to instead.`,\n      };\n    }\n    \n    // Gracefully handle non-text or too-large files\n    if (!isTextualFile(abs)) {\n      return {\n        lines: [],\n        error: `[UNREADABLE FILE] You tried to read \"${params.path}\" but this file is either too large ` +\n               `or not a text file, so it cannot be read. Try a different file.`,\n      };\n    }\n    \n    let lines: string[];\n    try {\n      lines = await readAllLines(abs);\n    } catch (err) {\n      return {\n        lines: [],\n        error: `[READ ERROR] Failed to read \"${params.path}\": ${err instanceof Error ? err.message : String(err)}`,\n      };\n    }\n    const total = lines.length;\n    const rawStart = params.start;\n    const rawEnd = params.end;\n    \n    let s = 1;\n    let e = total;\n    \n    const startValid = rawStart === undefined || (Number.isFinite(rawStart) && rawStart > 0);\n    const endValid = rawEnd === undefined || (Number.isFinite(rawEnd) && rawEnd > 0);\n    \n    if (startValid && endValid) {\n      s = rawStart ?? 1;\n      e = Math.min(rawEnd ?? total, total);\n      if ((s > total && total > 0) || (s > e)) {\n        s = 1;\n        e = total;\n      }\n    }\n    const out: string[] = [];\n    for (let i = s; i <= e; i += 1) {\n      const content = lines[i - 1] ?? '';\n      out.push(`${i}|${content}`);\n    }\n    if (out.length > AGENT_CONFIG.MAX_READ_LINES) {\n      const truncated = out.slice(0, AGENT_CONFIG.MAX_READ_LINES);\n      truncated.push(`... (output truncated at ${AGENT_CONFIG.MAX_READ_LINES} of ${out.length} lines)`);\n      return { lines: truncated };\n    }\n    \n    return { lines: out };\n  }\n\n  async listDirectory(params: { path: string; pattern?: string | null; maxResults?: number; maxDepth?: number }): Promise<ListDirectoryEntry[]> {\n    let abs: string;\n    try {\n      abs = resolveUnderRepo(this.repoRoot, params.path);\n    } catch {\n      // Path outside repo - return empty (graceful failure)\n      return [];\n    }\n    const stat = await fs.stat(abs).catch(() => null);\n    if (!stat || !stat.isDirectory()) {\n      return [];\n    }\n    const maxResults = params.maxResults ?? AGENT_CONFIG.MAX_OUTPUT_LINES;\n    const maxDepth = params.maxDepth ?? AGENT_CONFIG.MAX_LIST_DEPTH;\n    const regex = params.pattern ? new RegExp(params.pattern) : null;\n    const repoRoot = this.repoRoot;\n    const allowNames = this.allowNames;\n\n    const results: ListDirectoryEntry[] = [];\n    let timedOut = false;\n    const startTime = Date.now();\n\n    async function walk(dir: string, depth: number) {\n      if (Date.now() - startTime > AGENT_CONFIG.LIST_TIMEOUT_MS) {\n        timedOut = true;\n        return;\n      }\n      if (depth > maxDepth || results.length >= maxResults) return;\n      let entries: import('fs').Dirent[];\n      try {\n        entries = await fs.readdir(dir, { withFileTypes: true });\n      } catch {\n        return; // skip unreadable directories (ENOENT, EACCES, etc.)\n      }\n      for (const entry of entries) {\n        if (timedOut || results.length >= maxResults) break;\n\n        // Simple name-based filtering - skip junk dirs/files\n        if (shouldSkip(entry.name, allowNames)) continue;\n        \n        // Apply user-provided pattern filter\n        if (regex && !regex.test(entry.name)) continue;\n        \n        const full = path.join(dir, entry.name);\n        const isDir = entry.isDirectory();\n        \n        results.push({\n          name: entry.name,\n          path: toRepoRelative(repoRoot, full),\n          type: isDir ? 'dir' : 'file',\n          depth,\n        });\n        if (isDir) {\n          await walk(full, depth + 1);\n        }\n      }\n    }\n    await walk(abs, 0);\n    return results;\n  }\n\n  async glob(params: { pattern: string; path?: string }): Promise<GlobResult> {\n    let abs: string;\n    try {\n      abs = params.path ? resolveUnderRepo(this.repoRoot, params.path) : this.repoRoot;\n    } catch (err) {\n      return { files: [], searchDir: this.repoRoot, totalFound: 0, error: `[PATH ERROR] ${err instanceof Error ? err.message : String(err)}` };\n    }\n    const stat = await fs.stat(abs).catch(() => null);\n    if (!stat || !stat.isDirectory()) {\n      return { files: [], searchDir: abs, totalFound: 0, error: `[PATH ERROR] Directory not found: ${params.path || '.'}` };\n    }\n\n    const targetArg = abs === path.resolve(this.repoRoot) ? '.' : toRepoRelative(this.repoRoot, abs);\n    const args = [\n      '--no-config',\n      '--files',\n      '--color=never',\n      '-g', params.pattern,\n      ...this.excludes.filter(e => !this.allowNames?.has(e)).flatMap(e => ['-g', `!${e}`]),\n      targetArg || '.',\n    ];\n\n    const res = await runRipgrep(args, { cwd: this.repoRoot });\n    if (res.exitCode === -1) {\n      return { files: [], searchDir: abs, totalFound: 0, error: `[RIPGREP NOT AVAILABLE] ripgrep (rg) is required for glob search.` };\n    }\n    if (res.exitCode !== 0 && res.exitCode !== 1) {\n      return { files: [], searchDir: abs, totalFound: 0, error: `[GLOB ERROR] glob failed with exit code ${res.exitCode}${res.stderr ? `: ${res.stderr}` : ''}` };\n    }\n\n    // Convert to absolute paths\n    const absRoot = path.resolve(this.repoRoot);\n    const relFiles = (res.stdout || '').trim().split(/\\r?\\n/).filter(l => l.length > 0);\n    const absFiles = relFiles.map(f => path.resolve(absRoot, f));\n\n    // Sort by mtime descending (newest first), matching training format\n    const withMtime: Array<{ file: string; mtime: number }> = [];\n    for (const f of absFiles) {\n      const s = await fs.stat(f).catch(() => null);\n      withMtime.push({ file: f, mtime: s?.mtimeMs ?? 0 });\n    }\n    withMtime.sort((a, b) => b.mtime - a.mtime);\n\n    const totalFound = withMtime.length;\n    return { files: withMtime.slice(0, 100).map(f => f.file), searchDir: abs, totalFound };\n  }\n}\n","/**\n * OpenAI SDK adapter for morph-warp-grep tool\n */\n\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions';\nimport { executeToolCall, formatResult, WarpGrepClient, executeGitHubReadFile, formatGitHubReadFileResult } from './client.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, GITHUB_SEARCH_TOOL_NAME, GITHUB_SEARCH_DESCRIPTION, GITHUB_SEARCH_INPUT_SCHEMA, GITHUB_READ_FILE_TOOL_NAME, GITHUB_READ_FILE_DESCRIPTION, GITHUB_READ_FILE_INPUT_SCHEMA } from './prompts.js';\nimport type { WarpGrepToolConfig, WarpGrepResult, GitHubSearchToolConfig, GitHubReadFileInput, GitHubReadFileResult, GitHubReadFileToolConfig } from './types.js';\n\n/**\n * Input schema for the warp grep tool\n */\nconst TOOL_PARAMETERS = {\n  type: 'object',\n  properties: {\n    search_term: { type: 'string', description: 'Search problem statement that this subagent is supposed to research for' },\n  },\n  required: ['search_term'],\n} as const;\n\n/**\n * OpenAI-native warp grep tool definition\n * \n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { warpGrepTool, execute } from '@morphllm/morphsdk/tools/warp-grep/openai';\n * \n * const client = new OpenAI();\n * const response = await client.chat.completions.create({\n *   model: 'gpt-4o',\n *   tools: [warpGrepTool],\n *   messages: [{ role: 'user', content: 'Find authentication middleware' }]\n * });\n * \n * // Execute the tool call\n * const result = await execute({ search_term: '...' }, { repoRoot: '.' });\n * ```\n */\nexport const warpGrepTool: ChatCompletionTool = {\n  type: 'function',\n  function: {\n    name: WARP_GREP_TOOL_NAME,\n    description: WARP_GREP_DESCRIPTION,\n    parameters: TOOL_PARAMETERS,\n  },\n};\n\n/**\n * Execute warp grep search\n * \n * @param input - Tool input with search_term\n * @param config - Configuration with repoRoot and optional provider\n * @returns Search results\n */\nexport async function execute(\n  input: { search_term: string } | string,\n  config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n  return executeToolCall(input, config);\n}\n\n// Re-export formatResult for convenience\nexport { formatResult };\n\n/**\n * Create a custom warp grep tool with configuration and methods\n * \n * @param config - Configuration options\n * @returns Tool definition with execute and formatResult methods\n * \n * @example Local usage\n * ```typescript\n * import OpenAI from 'openai';\n * import { createWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/openai';\n * \n * const tool = createWarpGrepTool({ repoRoot: '.' });\n * \n * const client = new OpenAI();\n * const response = await client.chat.completions.create({\n *   model: 'gpt-4o',\n *   tools: [tool],\n *   messages: [{ role: 'user', content: 'Find authentication middleware' }]\n * });\n * ```\n * \n * @example Remote sandbox (E2B, Modal, etc.)\n * ```typescript\n * const tool = createMorphWarpGrepTool({\n *   repoRoot: '/home/repo',\n *   remoteCommands: {\n *     grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,\n *     read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,\n *     listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,\n *   },\n * });\n * ```\n */\nexport function createWarpGrepTool(config: WarpGrepToolConfig) {\n  const tool: ChatCompletionTool = {\n    type: 'function',\n    function: {\n      name: config.name ?? WARP_GREP_TOOL_NAME,\n      description: config.description ?? WARP_GREP_DESCRIPTION,\n      parameters: TOOL_PARAMETERS,\n    },\n  };\n\n  return Object.assign(tool, {\n    execute: async (input: unknown): Promise<WarpGrepResult> => {\n      return executeToolCall(input as { search_term: string } | string, config);\n    },\n    formatResult: (result: WarpGrepResult): string => {\n      return formatResult(result);\n    },\n  });\n}\n\n/**\n * Create a GitHub search tool for OpenAI SDK\n *\n * @param config - Configuration options (morphApiKey, morphApiUrl, codeSearchUrl, timeout)\n * @returns OpenAI ChatCompletionTool with execute and formatResult methods\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { createGitHubSearchTool } from '@morphllm/morphsdk/tools/warp-grep/openai';\n *\n * const tool = createGitHubSearchTool({ morphApiKey: process.env.MORPH_API_KEY });\n *\n * const response = await openai.chat.completions.create({\n *   model: 'gpt-4o',\n *   tools: [tool],\n *   messages: [{ role: 'user', content: 'How does auth work in vercel/next.js?' }]\n * });\n *\n * // Execute\n * const result = await tool.execute({ search_term: 'auth middleware', github_url: 'https://github.com/vercel/next.js' });\n * console.log(tool.formatResult(result));\n * ```\n */\nexport function createGitHubSearchTool(config: GitHubSearchToolConfig) {\n  const client = new WarpGrepClient(config);\n\n  const tool: ChatCompletionTool = {\n    type: 'function',\n    function: {\n      name: GITHUB_SEARCH_TOOL_NAME,\n      description: GITHUB_SEARCH_DESCRIPTION,\n      parameters: GITHUB_SEARCH_INPUT_SCHEMA,\n    },\n  };\n\n  return Object.assign(tool, {\n    execute: async (input: { search_term: string; github_url?: string; owner_repo?: string; branch?: string }): Promise<WarpGrepResult> => {\n      const github = input.github_url || input.owner_repo;\n      if (!github) {\n        throw new Error('Please provide github search url or owner/repo id');\n      }\n      return client.searchGitHub({ searchTerm: input.search_term, github, branch: input.branch });\n    },\n    formatResult: (result: WarpGrepResult): string => {\n      return formatResult(result);\n    },\n  });\n}\n\n/**\n * Create a GitHub read file tool for OpenAI SDK\n *\n * @param config - Optional configuration (timeout)\n * @returns OpenAI ChatCompletionTool with execute and formatResult methods\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { createGitHubReadFileTool } from '@morphllm/morphsdk/tools/warp-grep/openai';\n *\n * const tool = createGitHubReadFileTool();\n *\n * const response = await openai.chat.completions.create({\n *   model: 'gpt-4o',\n *   tools: [tool],\n *   messages: [{ role: 'user', content: 'Read the package.json from vercel/next.js' }]\n * });\n *\n * const result = await tool.execute({ github: 'vercel/next.js', path: 'package.json' });\n * console.log(tool.formatResult(result));\n * ```\n */\nexport function createGitHubReadFileTool(config?: GitHubReadFileToolConfig) {\n  const tool: ChatCompletionTool = {\n    type: 'function',\n    function: {\n      name: GITHUB_READ_FILE_TOOL_NAME,\n      description: GITHUB_READ_FILE_DESCRIPTION,\n      parameters: GITHUB_READ_FILE_INPUT_SCHEMA,\n    },\n  };\n\n  return Object.assign(tool, {\n    execute: async (input: GitHubReadFileInput): Promise<GitHubReadFileResult> => {\n      return executeGitHubReadFile(input, config);\n    },\n    formatResult: (result: GitHubReadFileResult): string => {\n      return formatGitHubReadFileResult(result);\n    },\n  });\n}\n\nexport default warpGrepTool;\n","import { AGENT_CONFIG, DEFAULT_MODEL } from './config.js';\nimport type { AgentRunResult, ChatMessage, SessionConfig, AgentFinish, ToolCallRef, WarpGrepExecutionMetrics, WarpGrepTurnMetrics, WarpGrepStep } from './types.js';\nimport { parseFinishFiles, parseReadLines, extractPathFromCommand } from './parser.js';\nimport type { WarpGrepProvider } from '../providers/types.js';\nimport { toolGrep } from './tools/grep.js';\nimport { toolRead } from './tools/read.js';\nimport { toolListDirectory } from './tools/list_directory.js';\nimport { toolGlob } from './tools/glob.js';\nimport { readFinishFiles } from './tools/finish.js';\nimport type { RetryConfig } from '../../utils/resilience.js';\nimport { formatTurnMessage, calculateContextBudget, buildInitialState, enforceContextLimit } from './helpers.js';\nimport OpenAI from 'openai';\nimport { SDK_VERSION } from '../../../version.js';\nimport path from 'path';\nimport { logger } from '../../../logger.js';\n\ntype EventName =\n  | 'initial_state'\n  | 'round_start'\n  | 'round_end'\n  | 'finish'\n  | 'error';\n\nexport type EventCallback = (name: EventName, payload: Record<string, unknown>) => void;\n\nconst DEFAULT_API_URL = 'https://api.morphllm.com';\n\n// Tool definitions sent to the model (OpenAI function calling format)\nconst TOOL_SPECS: OpenAI.Chat.ChatCompletionTool[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'list_directory',\n      description: 'Execute ls or find commands to explore directory structure. Max 500 results. Common junk directories are excluded automatically.',\n      parameters: {\n        type: 'object',\n        properties: {\n          command: {\n            type: 'string',\n            description: \"Full ls or find command (e.g. ls -la src/, find . -maxdepth 2 -type f -name '*.py', find . -type d, ls -d */).\",\n          },\n        },\n        required: ['command'],\n      },\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'grep_search',\n      description: 'Search for a regex pattern in file contents. Returns matching lines with file paths and line numbers. Case-insensitive. Respects .gitignore.',\n      parameters: {\n        type: 'object',\n        properties: {\n          pattern: {\n            type: 'string',\n            description: \"Regex pattern to search for in file contents (e.g. 'class\\\\s+\\\\w+Error', 'import|require|from', 'def (get|set|update)_user').\",\n          },\n          path: {\n            type: 'string',\n            description: 'File or directory to search in. Defaults to current working directory.',\n          },\n          glob: {\n            type: 'string',\n            description: \"Glob pattern to filter files (e.g. '*.py', '*.{ts,tsx,js,jsx,py,go}', 'src/**/*.go', '!*.test.*').\",\n          },\n          limit: {\n            type: 'integer',\n            description: 'Limit output to first N matching lines. Shows all matches if not specified.',\n          },\n        },\n        required: ['pattern'],\n      },\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'glob',\n      description: 'Find files by name/extension using glob patterns. Returns absolute paths sorted by modification time (newest first). Respects .gitignore. Max 100 results.',\n      parameters: {\n        type: 'object',\n        properties: {\n          pattern: {\n            type: 'string',\n            description: \"Glob pattern to match files (e.g. '*.py', 'src/**/*.js', '*.{ts,tsx}', 'test_*.py').\",\n          },\n          path: {\n            type: 'string',\n            description: 'Directory to search in. Defaults to repository root.',\n          },\n        },\n        required: ['pattern'],\n      },\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'read',\n      description: 'Read entire files or specific line ranges using absolute paths.',\n      parameters: {\n        type: 'object',\n        properties: {\n          path: {\n            type: 'string',\n            description: \"File path to read, using absolute path (e.g. '/home/ubuntu/repo/src/main.py' or windows path).\",\n          },\n          lines: {\n            type: 'string',\n            description: \"Optional line range (e.g. '1-50' or '1-20,45-80'). Omit to read entire file.\",\n          },\n        },\n        required: ['path'],\n      },\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'finish',\n      description: 'Submit final answer with all relevant code locations. Include imports and over-include rather than miss context.',\n      parameters: {\n        type: 'object',\n        properties: {\n          files: {\n            type: 'string',\n            description: \"One file per line as path:lines (e.g. 'src/auth.py:1-15,25-50\\\\nsrc/user.py'). Omit line range to include entire file.\",\n          },\n        },\n        required: ['files'],\n      },\n    },\n  },\n];\n\ninterface CallModelOptions {\n  morphApiKey?: string;\n  morphApiUrl?: string;\n  retryConfig?: RetryConfig;\n  timeout?: number;\n  search_type?: string;\n}\n\ntype ModelResponse = {\n  content: string | null;\n  tool_calls: ToolCallRef[];\n};\n\nasync function callModel(\n  messages: ChatMessage[],\n  model: string,\n  options: CallModelOptions = {}\n): Promise<ModelResponse> {\n  const baseUrl = options.morphApiUrl || DEFAULT_API_URL;\n  const apiKey = options.morphApiKey || process.env.MORPH_API_KEY || '';\n  const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n\n  const parsedUrl = new URL(baseUrl);\n  const baseURL = parsedUrl.pathname === '/' ? `${baseUrl}/v1` : baseUrl;\n\n  const client = new OpenAI({\n    apiKey,\n    baseURL,\n    maxRetries: 0,\n    timeout: timeoutMs,\n    defaultHeaders: { 'X-Morph-SDK-Version': SDK_VERSION },\n  });\n\n  const MAX_EMPTY_RETRIES = 1;\n\n  logger.debug('WarpGrep', 'model_call', { url: baseURL, model, message_count: messages.length });\n  const callStartTime = Date.now();\n\n  for (let attempt = 0; attempt <= MAX_EMPTY_RETRIES; attempt++) {\n    let data;\n    try {\n      data = await client.chat.completions.create({\n        model,\n        temperature: 0.0,\n        max_tokens: 2048,\n        messages: messages as OpenAI.Chat.ChatCompletionMessageParam[],\n        tools: TOOL_SPECS,\n        ...(options.search_type ? { search_type: options.search_type } as Record<string, unknown> : {}),\n      });\n    } catch (error) {\n      const callLatencyMs = Date.now() - callStartTime;\n      if (error instanceof OpenAI.APIError) {\n        logger.error('WarpGrep', 'model_call_error', { status: error.status, error: error.message, latency_ms: callLatencyMs });\n        if (error.status === 404) {\n          const defaultMsg =\n            'The endpoint you are trying to call is likely deprecated. Please update with: npm cache clean --force && npx -y @morphllm/morphmcp@latest or visit: https://morphllm.com/mcp';\n          const errorText = error.message?.trim();\n          throw new Error(errorText || defaultMsg);\n        }\n      } else {\n        logger.error('WarpGrep', 'model_call_error', { status: undefined, error: error instanceof Error ? error.message : String(error), latency_ms: callLatencyMs });\n      }\n      throw error;\n    }\n\n    const choice = data?.choices?.[0];\n    const message = choice?.message;\n\n    if (!message) {\n      if (attempt === MAX_EMPTY_RETRIES) {\n        throw new Error('Invalid response from model: no message in response');\n      }\n      await new Promise(resolve => setTimeout(resolve, 200));\n      continue;\n    }\n\n    const toolCalls: ToolCallRef[] = (message.tool_calls || []).map(tc => ({\n      id: tc.id,\n      type: 'function' as const,\n      function: { name: tc.function.name, arguments: tc.function.arguments },\n    }));\n\n    if (message.content || toolCalls.length > 0) {\n      logger.debug('WarpGrep', 'model_call_complete', { latency_ms: Date.now() - callStartTime, tool_calls_count: toolCalls.length, finish_reason: choice?.finish_reason ?? 'unknown' });\n      return { content: message.content ?? null, tool_calls: toolCalls };\n    }\n\n    if (attempt === MAX_EMPTY_RETRIES) {\n      const finishReason = choice?.finish_reason ?? 'unknown';\n      throw new Error(\n        `Invalid response from model: no content and no tool_calls, finish_reason=${finishReason}`\n      );\n    }\n    await new Promise(resolve => setTimeout(resolve, 200));\n  }\n\n  throw new Error('Invalid response from model');\n}\n\n/** Safely parse JSON, returning empty object on failure */\nfunction safeParseJSON(s: string): Record<string, unknown> {\n  try {\n    return JSON.parse(s);\n  } catch {\n    return {};\n  }\n}\n\n/**\n * Execute a single tool call against the provider, returning the output string.\n */\nasync function executeTool(\n  provider: WarpGrepProvider,\n  name: string,\n  args: Record<string, unknown>,\n  repoRoot?: string,\n): Promise<string> {\n  switch (name) {\n    case 'grep_search': {\n      const grepArgs: { pattern: string; path: string; glob?: string; case_sensitive?: boolean } = {\n        pattern: args.pattern as string,\n        path: (args.path as string) || '.',\n      };\n      if (args.glob) grepArgs.glob = args.glob as string;\n      if (args.case_sensitive !== undefined) grepArgs.case_sensitive = args.case_sensitive as boolean;\n      const result = await toolGrep(provider, grepArgs);\n      let output = result.output;\n      if (args.limit && typeof args.limit === 'number') {\n        const lines = output.split('\\n');\n        if (lines.length > args.limit) {\n          output = lines.slice(0, args.limit).join('\\n') + `\\n... (truncated at ${args.limit} lines)`;\n        }\n      }\n      return output;\n    }\n    case 'glob': {\n      return toolGlob(provider, {\n        pattern: args.pattern as string,\n        path: args.path as string | undefined,\n      });\n    }\n    case 'list_directory': {\n      const dirPath = extractPathFromCommand((args.command as string) || '.');\n      return toolListDirectory(provider, { path: dirPath }, repoRoot);\n    }\n    case 'read': {\n      const readArgs: { path: string; start?: number; end?: number; lines?: Array<[number, number]> } = {\n        path: args.path as string,\n      };\n      if (args.lines && typeof args.lines === 'string') {\n        Object.assign(readArgs, parseReadLines(args.lines));\n      }\n      return toolRead(provider, readArgs);\n    }\n    default:\n      return `Unknown tool: ${name}`;\n  }\n}\n\n/**\n * Streaming version of runWarpGrep that yields step information after each turn.\n * Yields WarpGrepStep with tool calls for each turn, then returns the final AgentRunResult.\n */\nexport async function* runWarpGrepStreaming(\n  config: SessionConfig & { provider: WarpGrepProvider }\n): AsyncGenerator<WarpGrepStep, AgentRunResult, undefined> {\n  const totalStart = Date.now();\n  const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n  const timings: Partial<WarpGrepExecutionMetrics> = { turns: [], timeout_ms: timeoutMs };\n\n  const repoRoot = config.repoRoot || process.cwd();\n  const model = config.model || DEFAULT_MODEL;\n  const messages: ChatMessage[] = [];\n\n  const maxTurns = AGENT_CONFIG.MAX_TURNS;\n\n  logger.debug('WarpGrep', 'session_start', { search_term: config.searchTerm, model, max_turns: maxTurns });\n\n  const initialStateStart = Date.now();\n  const initialState = await buildInitialState(repoRoot, config.searchTerm, config.provider, { search_type: config.search_type });\n  timings.initial_state_ms = Date.now() - initialStateStart;\n\n  logger.debug('WarpGrep', 'initial_state', { system_prompt_len: initialState.length, user_message_len: initialState.length });\n\n  messages.push({ role: 'user', content: initialState });\n\n  const provider = config.provider;\n  const errors: Array<{ message: string }> = [];\n\n  let finishMeta: AgentFinish | undefined;\n  let terminationReason: AgentRunResult['terminationReason'] = 'terminated';\n\n  for (let turn = 1; turn <= maxTurns; turn += 1) {\n    const turnMetrics: WarpGrepTurnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };\n\n    logger.debug('WarpGrep', 'turn_start', { turn, message_count: messages.length });\n\n    const beforeChars = messages.reduce((sum, m) => sum + (typeof m.content === 'string' ? m.content.length : 0), 0);\n    enforceContextLimit(messages);\n    const afterChars = messages.reduce((sum, m) => sum + (typeof m.content === 'string' ? m.content.length : 0), 0);\n    if (afterChars < beforeChars) {\n      logger.debug('WarpGrep', 'context_truncated', { before_chars: beforeChars, after_chars: afterChars });\n    }\n\n    // Call model\n    const modelCallStart = Date.now();\n    const response = await callModel(messages, model, {\n      morphApiKey: config.morphApiKey,\n      morphApiUrl: config.morphApiUrl,\n      retryConfig: config.retryConfig,\n      timeout: timeoutMs,\n      search_type: config.search_type,\n    }).catch((e: unknown) => {\n      const errMsg = e instanceof Error ? e.message : String(e);\n      console.error(`[warp_grep] Morph API call failed on turn ${turn}:`, errMsg);\n      logger.error('WarpGrep', 'error', { turn, error: errMsg, phase: 'model_call' });\n      errors.push({ message: errMsg });\n      return null;\n    });\n    turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n\n    if (!response) {\n      timings.turns!.push(turnMetrics);\n      break;\n    }\n\n    const toolCalls = response.tool_calls;\n    logger.debug('WarpGrep', 'model_response', { turn, tool_calls: toolCalls.map(tc => tc.function.name), latency_ms: turnMetrics.morph_api_ms });\n\n    // Add assistant message to history\n    messages.push({\n      role: 'assistant',\n      content: response.content,\n      ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n    });\n\n    if (toolCalls.length === 0) {\n      console.error(`[warp_grep] No tool calls on turn ${turn}. Content: ${(response.content || '').slice(0, 500)}`);\n      errors.push({ message: 'No tool calls produced by the model.' });\n      terminationReason = 'terminated';\n      timings.turns!.push(turnMetrics);\n      break;\n    }\n\n    // Yield step for streaming consumers\n    yield {\n      turn,\n      toolCalls: toolCalls.map(tc => ({\n        name: tc.function.name,\n        arguments: safeParseJSON(tc.function.arguments),\n      })),\n    };\n\n    // Check for finish call\n    const finishCall = toolCalls.find(tc => tc.function.name === 'finish');\n    if (finishCall) {\n      const args = safeParseJSON(finishCall.function.arguments) as { files?: string };\n      const filesStr = args.files || '';\n      const files = parseFinishFiles(filesStr);\n      finishMeta = { files };\n      terminationReason = 'completed';\n      logger.debug('WarpGrep', 'finish', { turns: turn, files: files.map(f => f.path) });\n\n      if (files.length === 0) {\n        const payload = filesStr || 'No relevant code found.';\n        timings.turns!.push(turnMetrics);\n        timings.total_ms = Date.now() - totalStart;\n        return {\n          terminationReason: 'completed',\n          messages,\n          finish: { payload, metadata: finishMeta },\n          timings: timings as WarpGrepExecutionMetrics,\n        };\n      }\n\n      timings.turns!.push(turnMetrics);\n      break;\n    }\n\n    // Execute non-finish tool calls in parallel\n    const toolExecStart = Date.now();\n    const results = await Promise.all(\n      toolCalls.map(async (tc) => {\n        const args = safeParseJSON(tc.function.arguments);\n        const argsSummary = Object.fromEntries(Object.entries(args).map(([k, v]) => [k, typeof v === 'string' && v.length > 100 ? v.slice(0, 100) + '...' : v]));\n        logger.debug('WarpGrep', 'tool_exec', { turn, tool: tc.function.name, args_summary: argsSummary });\n        const toolStart = Date.now();\n        const output = await executeTool(provider, tc.function.name, args, repoRoot).catch(err => String(err));\n        logger.debug('WarpGrep', 'tool_result', { turn, tool: tc.function.name, result_len: output.length, latency_ms: Date.now() - toolStart });\n        return { tool_call_id: tc.id, content: output };\n      })\n    );\n    turnMetrics.local_tools_ms = Date.now() - toolExecStart;\n\n    // Add tool result messages\n    for (const result of results) {\n      messages.push({ role: 'tool', tool_call_id: result.tool_call_id, content: result.content });\n    }\n\n    // Add turn counter hint\n    const turnMsg = formatTurnMessage(turn, maxTurns);\n    const budget = calculateContextBudget(messages);\n    messages.push({ role: 'user', content: turnMsg + '\\n' + budget });\n\n    timings.turns!.push(turnMetrics);\n  }\n\n  if (terminationReason !== 'completed' || !finishMeta) {\n    timings.total_ms = Date.now() - totalStart;\n    return { terminationReason, messages, errors, timings: timings as WarpGrepExecutionMetrics };\n  }\n\n  // Build finish payload\n  const parts: string[] = ['Relevant context found:'];\n  for (const f of finishMeta.files) {\n    const ranges = f.lines === '*' ? '*'\n      : Array.isArray(f.lines) ? f.lines.map(([s, e]) => `${s}-${e}`).join(', ')\n      : '*';\n    parts.push(`- ${f.path}: ${ranges}`);\n  }\n  const payload = parts.join('\\n');\n\n  // Resolve file contents for returned ranges\n  const finishResolutionStart = Date.now();\n  const fileReadErrors: Array<{ path: string; error: string }> = [];\n  const resolved = await readFinishFiles(\n    repoRoot,\n    finishMeta.files,\n    async (p: string, s?: number, e?: number) => {\n      // If the model returned a path that doesn't start with repoRoot,\n      // try resolving it against repoRoot (handles truncated absolute paths)\n      let resolvedPath = p;\n      if (!p.startsWith(repoRoot)) {\n        // Strip leading slash for path.join, then try the resolved path\n        const relative = p.startsWith('/') ? p.slice(1) : p;\n        resolvedPath = path.join(repoRoot, relative);\n      }\n      try {\n        const rr = await provider.read({ path: resolvedPath, start: s, end: e });\n        return rr.lines.map(l => {\n          const idx = l.indexOf('|');\n          return idx >= 0 ? l.slice(idx + 1) : l;\n        });\n      } catch (err) {\n        const errorMsg = err instanceof Error ? err.message : String(err);\n        fileReadErrors.push({ path: resolvedPath, error: errorMsg });\n        console.error(`[warp_grep] Failed to read file: ${resolvedPath} - ${errorMsg}`);\n        return [`[couldn't find: ${resolvedPath}]`];\n      }\n    }\n  );\n\n  timings.finish_resolution_ms = Date.now() - finishResolutionStart;\n\n  if (fileReadErrors.length > 0) {\n    errors.push(...fileReadErrors.map(e => ({ message: `File read error: ${e.path} - ${e.error}` })));\n  }\n\n  timings.total_ms = Date.now() - totalStart;\n  return {\n    terminationReason: 'completed',\n    messages,\n    finish: { payload, metadata: finishMeta, resolved },\n    timings: timings as WarpGrepExecutionMetrics,\n  };\n}\n\n/**\n * Non-streaming version. Runs the agent loop and returns the final result.\n */\nexport async function runWarpGrep(config: SessionConfig & { provider: WarpGrepProvider }): Promise<AgentRunResult> {\n  const gen = runWarpGrepStreaming(config);\n  // Drain all yielded steps, return the final result\n  let result = await gen.next();\n  while (!result.done) {\n    result = await gen.next();\n  }\n  return result.value;\n}\n","// Helpers for parsing string-format tool arguments from OpenAI tool calls\n\nimport type { FinishFileSpec } from './types.js';\n\n/** Parse \"lines\" string from read tool (e.g. \"1-50\" or \"1-20,45-80\") into structured args */\nexport function parseReadLines(linesStr: string): { start?: number; end?: number; lines?: Array<[number, number]> } {\n  const ranges: Array<[number, number]> = [];\n  for (const rangeStr of linesStr.split(',')) {\n    const trimmed = rangeStr.trim();\n    if (!trimmed) continue;\n    const parts = trimmed.split('-').map(v => parseInt(v.trim(), 10));\n    if (parts.length >= 2 && Number.isFinite(parts[0]) && Number.isFinite(parts[1])) {\n      ranges.push([parts[0], parts[1]]);\n    } else if (Number.isFinite(parts[0])) {\n      ranges.push([parts[0], parts[0]]);\n    }\n  }\n  if (ranges.length === 1) return { start: ranges[0][0], end: ranges[0][1] };\n  if (ranges.length > 1) return { lines: ranges };\n  return {};\n}\n\n/** Parse \"files\" string from finish tool (e.g. \"src/auth.py:1-50\\nsrc/user.py\" or space-separated) into FinishFileSpec[] */\nexport function parseFinishFiles(filesStr: string): FinishFileSpec[] {\n  const files: FinishFileSpec[] = [];\n  // Split on whitespace (training uses space-separated, SDK also supports newlines)\n  for (const line of filesStr.trim().split(/\\s+/)) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    // Skip Windows drive letter prefix (e.g. \"C:\") to avoid splitting on it\n    const searchFrom = /^[A-Za-z]:/.test(trimmed) ? 2 : 0;\n    const colonIdx = trimmed.indexOf(':', searchFrom);\n    if (colonIdx === -1) {\n      files.push({ path: trimmed, lines: '*' });\n      continue;\n    }\n    const filePath = trimmed.slice(0, colonIdx);\n    const rangesPart = trimmed.slice(colonIdx + 1);\n    if (!rangesPart.trim() || rangesPart.trim() === '*') {\n      files.push({ path: filePath, lines: '*' });\n      continue;\n    }\n    const ranges: Array<[number, number]> = [];\n    for (const rangeStr of rangesPart.split(',')) {\n      const rt = rangeStr.trim();\n      if (!rt) continue;\n      const parts = rt.split('-').map(v => parseInt(v.trim(), 10));\n      if (parts.length >= 2 && Number.isFinite(parts[0]) && Number.isFinite(parts[1])) {\n        ranges.push([parts[0], parts[1]]);\n      } else if (Number.isFinite(parts[0])) {\n        ranges.push([parts[0], parts[0]]);\n      }\n    }\n    files.push({ path: filePath, lines: ranges.length > 0 ? ranges : '*' });\n  }\n  return files;\n}\n\n/** Extract directory path from a list_directory command string (e.g. \"ls -la src/\" → \"src/\") */\nexport function extractPathFromCommand(command: string): string {\n  const tokens = command.trim().split(/\\s+/);\n  const pathTokens = tokens.slice(1).filter(t => !t.startsWith('-') && !t.startsWith('|') && !t.startsWith('\\\\('));\n  return pathTokens[0] || '.';\n}\n","import type { WarpGrepProvider } from '../../providers/types.js';\n\nexport async function toolGrep(\n  provider: WarpGrepProvider,\n  args: { pattern: string; path: string; glob?: string; context_lines?: number; case_sensitive?: boolean }\n): Promise<{ output: string }> {\n  const res = await provider.grep(args);\n  \n  // Return errors as output - let the model see and handle them\n  if (res.error) {\n    return { output: res.error };\n  }\n  \n  if (!res.lines.length) {\n    return { output: 'no matches' };\n  }\n  \n  return { output: res.lines.join('\\n') };\n}\n\n","import type { WarpGrepProvider } from '../../providers/types.js';\n\nfunction isValidRange(start: unknown, end: unknown): boolean {\n  return (\n    typeof start === 'number' &&\n    typeof end === 'number' &&\n    Number.isFinite(start) &&\n    Number.isFinite(end) &&\n    start > 0 &&\n    end >= start\n  );\n}\n\nexport async function toolRead(\n  provider: WarpGrepProvider,\n  args: { path: string; start?: number; end?: number; lines?: Array<[number, number]> }\n): Promise<string> {\n  if (args.lines && Array.isArray(args.lines) && args.lines.length > 0) {\n    const validRanges: Array<[number, number]> = [];\n    for (const range of args.lines) {\n      if (Array.isArray(range) && range.length >= 2 && isValidRange(range[0], range[1])) {\n        validRanges.push([range[0], range[1]]);\n      }\n    }\n    \n    if (validRanges.length === 0) {\n      const res = await provider.read({ path: args.path });\n      if (res.error) return res.error;\n      if (!res.lines.length) return '(empty file)';\n      return res.lines.join('\\n');\n    }\n    \n    const chunks: string[] = [];\n    for (const [start, end] of validRanges) {\n      const res = await provider.read({ path: args.path, start, end });\n      if (res.error) return res.error;\n      chunks.push(res.lines.join('\\n'));\n    }\n    if (chunks.every(c => c === '')) return '(empty file)';\n    return chunks.join('\\n...\\n');\n  }\n\n  const res = await provider.read({ path: args.path, start: args.start, end: args.end });\n  if (res.error) {\n    return res.error;\n  }\n  if (!res.lines.length) return '(empty file)';\n  return res.lines.join('\\n');\n}\n\n","import type { WarpGrepProvider } from '../../providers/types.js';\nimport { AGENT_CONFIG } from '../config.js';\nimport path from 'path';\n\nexport async function toolListDirectory(\n  provider: WarpGrepProvider,\n  args: { path: string; pattern?: string | null; maxResults?: number; maxDepth?: number },\n  repoRoot?: string,\n): Promise<string> {\n\n  const maxResults = args.maxResults ?? AGENT_CONFIG.MAX_LIST_RESULTS;\n  const maxDepth = args.maxDepth ?? AGENT_CONFIG.MAX_LIST_DEPTH;\n\n  const entries = await provider.listDirectory({\n    path: args.path,\n    pattern: args.pattern ?? null,\n    maxResults,\n    maxDepth,\n  });\n\n  if (!entries.length) return 'empty';\n\n  // Flat absolute paths (matches training format)\n  // If repoRoot is available, convert relative paths to absolute\n  if (repoRoot) {\n    const absRoot = repoRoot;\n    const lines = entries.map(e => path.join(absRoot, e.path));\n    return lines.join('\\n');\n  }\n\n  // Fallback: return relative paths if repoRoot not available\n  return entries.map(e => e.path).join('\\n');\n}\n","import type { WarpGrepProvider } from '../../providers/types.js';\n\nexport async function toolGlob(\n  provider: WarpGrepProvider,\n  args: { pattern: string; path?: string }\n): Promise<string> {\n  const res = await provider.glob(args);\n\n  if (res.error) {\n    return res.error;\n  }\n\n  if (!res.files.length) {\n    return 'no matches';\n  }\n\n  // Match training output format exactly\n  const header = `Found ${res.totalFound} file(s) matching \"${args.pattern}\" within ${res.searchDir}, sorted by modification time (newest first):`;\n  const body = res.files.join('\\n');\n  const truncated = res.totalFound > res.files.length\n    ? `\\n[${res.totalFound - res.files.length} files truncated]`\n    : '';\n  return `${header}\\n---\\n${body}\\n---${truncated}`;\n}\n","import type { FinishFileSpec } from '../types.js';\n\nfunction isValidRange(range: unknown): range is [number, number] {\n  return (\n    Array.isArray(range) &&\n    range.length >= 2 &&\n    typeof range[0] === 'number' &&\n    typeof range[1] === 'number' &&\n    Number.isFinite(range[0]) &&\n    Number.isFinite(range[1]) &&\n    range[0] > 0 &&\n    range[1] >= range[0]\n  );\n}\n\nfunction extractValidRanges(lines: unknown): Array<[number, number]> | null {\n  if (!Array.isArray(lines)) return null;\n  const valid: Array<[number, number]> = [];\n  for (const range of lines) {\n    if (isValidRange(range)) {\n      valid.push([range[0], range[1]]);\n    }\n  }\n  return valid.length > 0 ? valid : null;\n}\n\nexport function normalizeFinishFiles(files: FinishFileSpec[]): FinishFileSpec[] {\n  return files.map((f) => {\n    if (f.lines === '*') return { path: f.path, lines: '*' };\n    const validRanges = extractValidRanges(f.lines);\n    if (!validRanges) return { path: f.path, lines: '*' };\n    return { path: f.path, lines: mergeRanges(validRanges) };\n  });\n}\n\nexport async function readFinishFiles(\n  repoRoot: string,\n  files: FinishFileSpec[],\n  reader: (path: string, start?: number, end?: number) => Promise<string[]>\n): Promise<{ path: string; ranges: '*' | Array<[number, number]>; content: string }[]> {\n  const out: { path: string; ranges: '*' | Array<[number, number]>; content: string }[] = [];\n  for (const f of files) {\n    const validRanges = f.lines === '*' ? null : extractValidRanges(f.lines);\n    if (f.lines === '*' || !validRanges) {\n      const lines = await reader(f.path);\n      out.push({ path: f.path, ranges: '*', content: lines.join('\\n') });\n    } else {\n      const ranges = mergeRanges(validRanges);\n      const chunks: string[] = [];\n      for (let i = 0; i < ranges.length; i++) {\n        const [s, e] = ranges[i];\n        if (i === 0 && s > 1) {\n          chunks.push(`// ... existing code, block starting at line ${s} ...`);\n        } else if (i > 0) {\n          chunks.push(`// ... existing code, block starting at line ${s} ...`);\n        }\n        const lines = await reader(f.path, s, e);\n        chunks.push(lines.join('\\n'));\n      }\n      out.push({ path: f.path, ranges, content: chunks.join('\\n') });\n    }\n  }\n  return out;\n}\n\nfunction mergeRanges(ranges: Array<[number, number]>): Array<[number, number]> {\n  if (!ranges.length) return [];\n  const sorted = [...ranges].sort((a, b) => a[0] - b[0]);\n  const merged: Array<[number, number]> = [];\n  let [cs, ce] = sorted[0];\n  for (let i = 1; i < sorted.length; i++) {\n    const [s, e] = sorted[i];\n    if (s <= ce + 1) {\n      ce = Math.max(ce, e);\n    } else {\n      merged.push([cs, ce]);\n      cs = s;\n      ce = e;\n    }\n  }\n  merged.push([cs, ce]);\n  return merged;\n}\n\n","/**\n * Shared helper functions for warp-grep agent loop.\n * Used by both the internal runner and exported for harness users.\n */\n\nimport path from 'path';\nimport { AGENT_CONFIG } from './config.js';\nimport type { ChatMessage } from './types.js';\nimport type { WarpGrepProvider, ListDirectoryEntry } from '../providers/types.js';\n\nconst TRUNCATED_MARKER = '[truncated for context limit]';\n\n/**\n * Get the character size of a ChatMessage (handles all message types).\n */\nfunction getMessageSize(m: ChatMessage): number {\n  if (m.role === 'tool') return m.content.length;\n  if (m.role === 'assistant') {\n    let size = typeof m.content === 'string' ? m.content.length : 0;\n    if (m.tool_calls) {\n      size += m.tool_calls.reduce((s, tc) => s + tc.function.name.length + tc.function.arguments.length, 0);\n    }\n    return size;\n  }\n  // system or user\n  return (m as { content: string }).content.length;\n}\n\n/**\n * Format the turn counter message shown to the model.\n */\nexport function formatTurnMessage(turnsUsed: number, maxTurns: number): string {\n  const turnsRemaining = maxTurns - turnsUsed;\n  if (turnsRemaining === 1) {\n    return `\\nYou have used ${turnsUsed} turns, you only have 1 turn remaining. You have run out of turns to explore the code base and MUST call the finish tool now`;\n  }\n  return `\\nYou have used ${turnsUsed} turn${turnsUsed === 1 ? '' : 's'} and have ${turnsRemaining} remaining`;\n}\n\n/**\n * Calculate and format the context budget indicator.\n */\nexport function calculateContextBudget(messages: ChatMessage[]): string {\n  const totalChars = messages.reduce((sum, m) => sum + getMessageSize(m), 0);\n  const maxChars = AGENT_CONFIG.MAX_CONTEXT_CHARS;\n  const percent = Math.floor((totalChars / maxChars) * 100);\n  const usedK = Math.floor(totalChars / 1000);\n  const maxK = Math.floor(maxChars / 1000);\n  return `<context_budget>${percent}% (${usedK}K/${maxK}K chars)</context_budget>`;\n}\n\n/**\n * Build the initial state message containing repo structure and search term.\n */\nexport async function buildInitialState(\n  repoRoot: string,\n  searchTerm: string,\n  provider: WarpGrepProvider,\n  options?: { search_type?: string },\n): Promise<string> {\n  const budget = calculateContextBudget([]);\n  const turnTag = `You have used 0 turns and have ${AGENT_CONFIG.MAX_TURNS} remaining`;\n  const treeDepth = options?.search_type === 'node_modules' ? 1 : 2;\n\n  const absRoot = repoRoot;\n\n  try {\n    const entries = await provider.listDirectory({\n      path: '.',\n      maxResults: AGENT_CONFIG.MAX_OUTPUT_LINES,\n      maxDepth: treeDepth,\n    });\n\n    // Flat list of absolute paths (matches training format)\n    // First line is the repo root, then one absolute path per entry\n    const lines = [absRoot];\n    for (const e of entries) {\n      lines.push(path.join(absRoot, e.path));\n    }\n\n    return `<repo_structure>\\n${lines.join('\\n')}\\n</repo_structure>\\n\\n<search_string>\\n${searchTerm}\\n</search_string>\\n${budget}\\n${turnTag}`;\n  } catch {\n    return `<repo_structure>\\n${absRoot}\\n</repo_structure>\\n\\n<search_string>\\n${searchTerm}\\n</search_string>\\n${budget}\\n${turnTag}`;\n  }\n}\n\n/**\n * Format directory entries as an indented tree string.\n */\nexport function formatListDirectoryTree(entries: ListDirectoryEntry[]): string {\n  if (!entries.length) return 'empty';\n  return entries\n    .map((e) => {\n      const indent = '  '.repeat(e.depth);\n      const name = e.type === 'dir' ? `${e.name}/` : e.name;\n      return `${indent}${name}`;\n    })\n    .join('\\n');\n}\n\n/**\n * Enforce hard context limit by truncating tool result messages.\n * Preserves the first user message (initial query) and all assistant messages.\n * Truncates tool/user messages from oldest to newest until under the threshold.\n *\n * @param messages - The conversation messages array (mutated in place)\n * @param maxChars - Maximum total character count (defaults to AGENT_CONFIG.MAX_CONTEXT_CHARS)\n * @returns The same messages array, truncated if necessary\n */\nexport function enforceContextLimit(\n  messages: ChatMessage[],\n  maxChars: number = AGENT_CONFIG.MAX_CONTEXT_CHARS\n): ChatMessage[] {\n  const getTotalChars = () => messages.reduce((sum, m) => sum + getMessageSize(m), 0);\n\n  if (getTotalChars() <= maxChars) {\n    return messages;\n  }\n\n  // Find indices of truncatable messages (tool results and non-first user messages)\n  const truncatableIndices: number[] = [];\n  let firstUserSkipped = false;\n  for (let i = 0; i < messages.length; i++) {\n    const m = messages[i];\n    if (m.role === 'tool') {\n      truncatableIndices.push(i);\n    } else if (m.role === 'user') {\n      if (!firstUserSkipped) {\n        firstUserSkipped = true;\n        continue; // Skip first user message (contains the search query)\n      }\n      truncatableIndices.push(i);\n    }\n  }\n\n  // Truncate from oldest to newest until under limit\n  for (const idx of truncatableIndices) {\n    if (getTotalChars() <= maxChars) {\n      break;\n    }\n    const m = messages[idx];\n    if (m.role === 'tool' && m.content !== TRUNCATED_MARKER) {\n      messages[idx] = { role: 'tool', tool_call_id: m.tool_call_id, content: TRUNCATED_MARKER };\n    } else if (m.role === 'user' && (m as { content: string }).content !== TRUNCATED_MARKER) {\n      messages[idx] = { role: 'user', content: TRUNCATED_MARKER };\n    }\n  }\n\n  return messages;\n}\n","{\n  \"name\": \"@morphllm/morphsdk\",\n  \"version\": \"0.2.194\",\n  \"description\": \"TypeScript SDK and CLI for Morph Fast Apply integration\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.cjs\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\"\n    },\n    \"./logger\": {\n      \"types\": \"./dist/logger.d.ts\",\n      \"import\": \"./dist/logger.js\",\n      \"require\": \"./dist/logger.cjs\"\n    },\n    \"./edge\": {\n      \"types\": \"./dist/edge.d.ts\",\n      \"import\": \"./dist/edge.js\",\n      \"require\": \"./dist/edge.cjs\"\n    },\n    \"./tools/warp-grep\": {\n      \"types\": \"./dist/tools/warp_grep/index.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/index.js\",\n      \"require\": \"./dist/tools/warp_grep/index.cjs\"\n    },\n    \"./tools/warp-grep/openai\": {\n      \"types\": \"./dist/tools/warp_grep/openai.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/openai.js\",\n      \"require\": \"./dist/tools/warp_grep/openai.cjs\"\n    },\n    \"./tools/warp-grep/anthropic\": {\n      \"types\": \"./dist/tools/warp_grep/anthropic.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/anthropic.js\",\n      \"require\": \"./dist/tools/warp_grep/anthropic.cjs\"\n    },\n    \"./tools/warp-grep/vercel\": {\n      \"types\": \"./dist/tools/warp_grep/vercel.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/vercel.js\",\n      \"require\": \"./dist/tools/warp_grep/vercel.cjs\"\n    },\n    \"./tools/warp-grep/client\": {\n      \"types\": \"./dist/tools/warp_grep/client.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/client.js\",\n      \"require\": \"./dist/tools/warp_grep/client.cjs\"\n    },\n    \"./tools/warp-grep/gemini\": {\n      \"types\": \"./dist/tools/warp_grep/gemini.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/gemini.js\",\n      \"require\": \"./dist/tools/warp_grep/gemini.cjs\"\n    },\n    \"./tools/warp-grep/harness\": {\n      \"types\": \"./dist/tools/warp_grep/harness.d.ts\",\n      \"import\": \"./dist/tools/warp_grep/harness.js\",\n      \"require\": \"./dist/tools/warp_grep/harness.cjs\"\n    },\n    \"./tracing\": {\n      \"types\": \"./dist/tracing/index.d.ts\",\n      \"import\": \"./dist/tracing/index.js\",\n      \"require\": \"./dist/tracing/index.cjs\"\n    },\n    \"./tracing/otel\": {\n      \"types\": \"./dist/tracing/otel.d.ts\",\n      \"import\": \"./dist/tracing/otel.js\",\n      \"require\": \"./dist/tracing/otel.cjs\"\n    },\n    \"./tools/fastapply\": {\n      \"types\": \"./dist/tools/fastapply/index.d.ts\",\n      \"import\": \"./dist/tools/fastapply/index.js\",\n      \"require\": \"./dist/tools/fastapply/index.cjs\"\n    },\n    \"./tools/fastapply/anthropic\": {\n      \"types\": \"./dist/tools/fastapply/anthropic.d.ts\",\n      \"import\": \"./dist/tools/fastapply/anthropic.js\",\n      \"require\": \"./dist/tools/fastapply/anthropic.cjs\"\n    },\n    \"./tools/fastapply/openai\": {\n      \"types\": \"./dist/tools/fastapply/openai.d.ts\",\n      \"import\": \"./dist/tools/fastapply/openai.js\",\n      \"require\": \"./dist/tools/fastapply/openai.cjs\"\n    },\n    \"./tools/fastapply/vercel\": {\n      \"types\": \"./dist/tools/fastapply/vercel.d.ts\",\n      \"import\": \"./dist/tools/fastapply/vercel.js\",\n      \"require\": \"./dist/tools/fastapply/vercel.cjs\"\n    },\n    \"./tools/codebase-search\": {\n      \"types\": \"./dist/tools/codebase_search/index.d.ts\",\n      \"import\": \"./dist/tools/codebase_search/index.js\",\n      \"require\": \"./dist/tools/codebase_search/index.cjs\"\n    },\n    \"./tools/codebase-search/anthropic\": {\n      \"types\": \"./dist/tools/codebase_search/anthropic.d.ts\",\n      \"import\": \"./dist/tools/codebase_search/anthropic.js\",\n      \"require\": \"./dist/tools/codebase_search/anthropic.cjs\"\n    },\n    \"./tools/codebase-search/openai\": {\n      \"types\": \"./dist/tools/codebase_search/openai.d.ts\",\n      \"import\": \"./dist/tools/codebase_search/openai.js\",\n      \"require\": \"./dist/tools/codebase_search/openai.cjs\"\n    },\n    \"./tools/codebase-search/vercel\": {\n      \"types\": \"./dist/tools/codebase_search/vercel.d.ts\",\n      \"import\": \"./dist/tools/codebase_search/vercel.js\",\n      \"require\": \"./dist/tools/codebase_search/vercel.cjs\"\n    },\n    \"./tools/git\": {\n      \"types\": \"./dist/git/index.d.ts\",\n      \"import\": \"./dist/git/index.js\",\n      \"require\": \"./dist/git/index.cjs\"\n    },\n    \"./tools/browser\": {\n      \"types\": \"./dist/tools/browser/index.d.ts\",\n      \"import\": \"./dist/tools/browser/index.js\",\n      \"require\": \"./dist/tools/browser/index.cjs\"\n    },\n    \"./tools/browser/anthropic\": {\n      \"types\": \"./dist/tools/browser/anthropic.d.ts\",\n      \"import\": \"./dist/tools/browser/anthropic.js\",\n      \"require\": \"./dist/tools/browser/anthropic.cjs\"\n    },\n    \"./tools/browser/openai\": {\n      \"types\": \"./dist/tools/browser/openai.d.ts\",\n      \"import\": \"./dist/tools/browser/openai.js\",\n      \"require\": \"./dist/tools/browser/openai.cjs\"\n    },\n    \"./tools/browser/vercel\": {\n      \"types\": \"./dist/tools/browser/vercel.d.ts\",\n      \"import\": \"./dist/tools/browser/vercel.js\",\n      \"require\": \"./dist/tools/browser/vercel.cjs\"\n    },\n    \"./tools/browser/profiles\": {\n      \"types\": \"./dist/tools/browser/profiles/index.d.ts\",\n      \"import\": \"./dist/tools/browser/profiles/index.js\",\n      \"require\": \"./dist/tools/browser/profiles/index.cjs\"\n    },\n    \"./modelrouter\": {\n      \"types\": \"./dist/modelrouter/index.d.ts\",\n      \"import\": \"./dist/modelrouter/index.js\",\n      \"require\": \"./dist/modelrouter/index.cjs\"\n    },\n    \"./tools/compact\": {\n      \"types\": \"./dist/tools/compact/index.d.ts\",\n      \"import\": \"./dist/tools/compact/index.js\",\n      \"require\": \"./dist/tools/compact/index.cjs\"\n    },\n    \"./tools/reflex\": {\n      \"types\": \"./dist/tools/reflex/index.d.ts\",\n      \"import\": \"./dist/tools/reflex/index.js\",\n      \"require\": \"./dist/tools/reflex/index.cjs\"\n    },\n    \"./tools/traces\": {\n      \"types\": \"./dist/tools/traces/index.d.ts\",\n      \"import\": \"./dist/tools/traces/index.js\",\n      \"require\": \"./dist/tools/traces/index.cjs\"\n    },\n    \"./subagents\": {\n      \"types\": \"./dist/subagents/index.d.ts\",\n      \"import\": \"./dist/subagents/index.js\",\n      \"require\": \"./dist/subagents/index.cjs\"\n    },\n    \"./subagents/vercel\": {\n      \"types\": \"./dist/subagents/vercel.d.ts\",\n      \"import\": \"./dist/subagents/vercel.js\",\n      \"require\": \"./dist/subagents/vercel.cjs\"\n    },\n    \"./subagents/anthropic\": {\n      \"types\": \"./dist/subagents/anthropic.d.ts\",\n      \"import\": \"./dist/subagents/anthropic.js\",\n      \"require\": \"./dist/subagents/anthropic.cjs\"\n    }\n  },\n  \"files\": [\n    \"dist/**/*.js\",\n    \"dist/**/*.cjs\",\n    \"dist/**/*.d.ts\",\n    \"dist/**/*.map\",\n    \"!dist/**/__tests__/**\",\n    \"!dist/**/*.test.*\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup version.ts index.ts edge.ts client.ts core/index.ts core/client.ts core/resource.ts core/error.ts tools/index.ts tools/fastapply/index.ts tools/fastapply/core.ts tools/fastapply/apply.ts tools/fastapply/types.ts tools/fastapply/prompts.ts tools/fastapply/anthropic.ts tools/fastapply/openai.ts tools/fastapply/vercel.ts tools/codebase_search/index.ts tools/codebase_search/core.ts tools/codebase_search/types.ts tools/codebase_search/prompts.ts tools/codebase_search/anthropic.ts tools/codebase_search/openai.ts tools/codebase_search/vercel.ts tools/warp_grep/index.ts tools/warp_grep/client.ts tools/warp_grep/openai.ts tools/warp_grep/anthropic.ts tools/warp_grep/vercel.ts tools/warp_grep/gemini.ts tools/warp_grep/harness.ts tools/warp_grep/agent/config.ts tools/warp_grep/agent/parser.ts tools/warp_grep/agent/runner.ts tools/warp_grep/agent/types.ts tools/warp_grep/agent/formatter.ts tools/warp_grep/providers/types.ts tools/warp_grep/providers/local.ts tools/warp_grep/providers/remote.ts tools/warp_grep/providers/code_storage_http.ts tools/warp_grep/tools/grep.ts tools/warp_grep/tools/analyse.ts tools/warp_grep/tools/read.ts tools/warp_grep/tools/finish.ts tools/warp_grep/utils/paths.ts tools/warp_grep/utils/github.ts tools/warp_grep/utils/ripgrep.ts tools/warp_grep/utils/format.ts tools/warp_grep/utils/files.ts git/index.ts git/client.ts git/config.ts git/types.ts tools/browser/index.ts tools/browser/core.ts tools/browser/types.ts tools/browser/prompts.ts tools/browser/anthropic.ts tools/browser/openai.ts tools/browser/vercel.ts tools/browser/live.ts tools/browser/errors.ts tools/browser/profiles/index.ts tools/browser/profiles/core.ts tools/browser/profiles/types.ts modelrouter/index.ts modelrouter/core.ts modelrouter/types.ts tools/compact/index.ts tools/compact/core.ts tools/compact/types.ts tools/reflex/index.ts tools/reflex/core.ts tools/reflex/types.ts tools/traces/index.ts tools/traces/core.ts tools/traces/types.ts tools/utils/resilience.ts subagents/index.ts subagents/types.ts subagents/prompts.ts subagents/vercel.ts subagents/anthropic.ts tracing/index.ts tracing/core.ts tracing/interaction.ts tracing/otel.ts tracing/types.ts --format esm,cjs --sourcemap --clean --dts --dts-resolve\",\n    \"prepare\": \"npm run build\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"lint\": \"eslint .\",\n    \"test\": \"vitest run\",\n    \"test:watch\": \"vitest watch\",\n    \"test:anthropic\": \"vitest run anthropic\",\n    \"test:openai\": \"vitest run openai\",\n    \"test:vercel\": \"vitest run vercel\",\n    \"test:git\": \"vitest run git\",\n    \"test:browser\": \"vitest run browser\",\n    \"test:agent\": \"npx tsx tests/fullAgentTest.ts\",\n    \"test:integration\": \"npx tsx tests/fullIntegrationTest.ts\",\n    \"test:e2e\": \"vitest run --config vitest.e2e.config.ts\",\n    \"release:patch\": \"npm version patch && npm publish\",\n    \"release:minor\": \"npm version minor && npm publish\",\n    \"release:major\": \"npm version major && npm publish\"\n  },\n  \"keywords\": [\n    \"morph\",\n    \"fast-apply\",\n    \"cli\",\n    \"sdk\",\n    \"edit-file\"\n  ],\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@opentelemetry/api\": \"^1.9.0\",\n    \"@opentelemetry/exporter-trace-otlp-http\": \"^0.203.0\",\n    \"@opentelemetry/sdk-trace-base\": \"^2.7.1\",\n    \"@traceloop/node-server-sdk\": \"^0.27.0\",\n    \"@vscode/ripgrep\": \"^1.17.0\",\n    \"ai\": \">=5.0.0\",\n    \"diff\": \"^7.0.0\",\n    \"isomorphic-git\": \"^1.25.10\",\n    \"openai\": \"^4.52.7\",\n    \"zod\": \">=3.23.0\"\n  },\n  \"devDependencies\": {\n    \"@ai-sdk/anthropic\": \"^2.0.70\",\n    \"@ai-sdk/openai\": \"^2.0.35\",\n    \"@anthropic-ai/sdk\": \"^0.30.1\",\n    \"@google/generative-ai\": \"^0.24.1\",\n    \"@types/diff\": \"^7.0.2\",\n    \"@types/node\": \"^20.14.10\",\n    \"@typescript-eslint/eslint-plugin\": \"^7.18.0\",\n    \"@typescript-eslint/parser\": \"^7.18.0\",\n    \"dotenv\": \"^16.4.5\",\n    \"eslint\": \"^8.57.0\",\n    \"shx\": \"^0.3.4\",\n    \"tsup\": \"^8.5.0\",\n    \"tsx\": \"^4.16.2\",\n    \"typescript\": \"^5.5.4\",\n    \"vitest\": \"^2.1.6\"\n  },\n  \"peerDependencies\": {\n    \"@anthropic-ai/sdk\": \">=0.25.0\",\n    \"@google/generative-ai\": \">=0.21.0\",\n    \"ai\": \">=5.0.0\",\n    \"zod\": \">=3.23.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@anthropic-ai/sdk\": {\n      \"optional\": true\n    },\n    \"@google/generative-ai\": {\n      \"optional\": true\n    },\n    \"ai\": {\n      \"optional\": true\n    },\n    \"zod\": {\n      \"optional\": true\n    }\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n","import pkg from './package.json' with { type: 'json' };\nexport const SDK_VERSION: string = pkg.version;\n","/**\n * Edge-safe logger.\n *\n * This module is imported transitively by the edge entrypoint\n * (`@morphllm/morphsdk/edge`) via fastapply, modelrouter, etc.\n * Edge runtimes (Vercel Edge Functions, Cloudflare Workers, Deno Deploy)\n * run on V8 isolates — not Node.js — so Node built-ins like fs don't\n * exist. A top-level static import of fs would crash at module-load time,\n * even if createWriteStream is only called conditionally.\n *\n * Fix: we use a dynamic import() behind a runtime check. In Node the\n * import resolves and file logging works normally. In edge runtimes the\n * import rejects and we silently fall back to console-only logging.\n */\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface WriteStream {\n  write(chunk: string): boolean;\n}\n\nclass MorphLogger {\n  private enabled: boolean;\n  private fileStream: WriteStream | null;\n  /** Resolves once the file stream is initialized (or immediately if no file logging). */\n  readonly ready: Promise<void>;\n\n  constructor() {\n    this.enabled = typeof process !== 'undefined' &&\n      (process.env.MORPH_DEBUG === '1' || !!process.env.MORPH_LOG_FILE);\n    this.fileStream = null;\n\n    const f = typeof process !== 'undefined' ? process.env.MORPH_LOG_FILE : undefined;\n    if (f) {\n      // Dynamic import — never evaluated at parse time, so edge runtimes\n      // don't blow up with \"Module 'fs' not found\".\n      this.ready = import('fs')\n        .then((fs) => {\n          this.fileStream = fs.createWriteStream(f, { flags: 'a' });\n        })\n        .catch(() => {\n          // Edge runtime — fs unavailable, silently skip file logging\n        });\n    } else {\n      this.ready = Promise.resolve();\n    }\n  }\n\n  debug(component: string, msg: string, data?: Record<string, unknown>) { this._log('debug', component, msg, data); }\n  info(component: string, msg: string, data?: Record<string, unknown>) { this._log('info', component, msg, data); }\n  warn(component: string, msg: string, data?: Record<string, unknown>) { this._log('warn', component, msg, data); }\n  error(component: string, msg: string, data?: Record<string, unknown>) { this._log('error', component, msg, data); }\n\n  enable() { this.enabled = true; }\n  get isEnabled() { return this.enabled; }\n\n  private _log(level: LogLevel, component: string, msg: string, data?: Record<string, unknown>) {\n    if (level !== 'error' && !this.enabled) return;\n    const ts = new Date().toISOString();\n    const prefix = `[${ts}] [${level.toUpperCase()}] [${component}]`;\n    console.error(data ? `${prefix} ${msg} ${JSON.stringify(data)}` : `${prefix} ${msg}`);\n    this.fileStream?.write(JSON.stringify({ ts, level, component, msg, ...(data && { data }) }) + '\\n');\n  }\n}\n\nexport const logger = new MorphLogger();\n","/**\n * RemoteCommandsProvider - wraps simple RemoteCommands into WarpGrepProvider\n * \n * Handles parsing of raw stdout from grep/read/listDir commands.\n * Users just return stdout, SDK handles all format conversion.\n */\n\nimport type { WarpGrepProvider, GrepResult, ReadResult, GlobResult, ListDirectoryEntry } from './types.js';\nimport type { RemoteCommands } from '../types.js';\nimport { AGENT_CONFIG } from '../agent/config.js';\n\n/**\n * Directories/files to always skip (exact name match)\n */\nconst SKIP_NAMES = new Set([\n  // Version control\n  '.git', '.svn', '.hg', '.bzr',\n  // Dependencies\n  'node_modules', 'bower_components', '.pnpm', '.yarn',\n  'vendor', 'Pods', '.bundle',\n  // Python\n  '__pycache__', '.pytest_cache', '.mypy_cache', '.ruff_cache',\n  '.venv', 'venv', '.tox', '.nox', '.eggs',\n  // Build outputs\n  'dist', 'build', 'out', 'output', 'target', '_build',\n  '.next', '.nuxt', '.output', '.vercel', '.netlify',\n  // Cache\n  '.cache', '.parcel-cache', '.turbo', '.nx', '.gradle',\n  // IDE\n  '.idea', '.vscode', '.vs',\n  // Coverage\n  'coverage', '.coverage', 'htmlcov', '.nyc_output',\n  // Temp\n  'tmp', 'temp', '.tmp', '.temp',\n  // Lock files\n  'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb',\n  'Cargo.lock', 'Gemfile.lock', 'poetry.lock',\n]);\n\n/**\n * File extensions to skip\n */\nconst SKIP_EXTENSIONS = new Set([\n  '.min.js', '.min.css', '.bundle.js',\n  '.wasm', '.so', '.dll', '.pyc',\n  '.map', '.js.map',\n]);\n\n/**\n * Check if a filename should be skipped\n */\nfunction shouldSkip(name: string): boolean {\n  // Skip exact name matches\n  if (SKIP_NAMES.has(name)) return true;\n  \n  // Skip hidden files/directories (start with .)\n  if (name.startsWith('.')) return true;\n  \n  // Skip files with certain extensions\n  for (const ext of SKIP_EXTENSIONS) {\n    if (name.endsWith(ext)) return true;\n  }\n  \n  return false;\n}\n\n/**\n * Wraps simple RemoteCommands functions into a full WarpGrepProvider.\n * \n * This allows users to provide three simple functions that return raw stdout,\n * and the SDK handles all parsing internally.\n * \n * @example\n * ```typescript\n * const provider = new RemoteCommandsProvider('/home/repo', {\n *   grep: async (pattern, path) => {\n *     const r = await sandbox.run(`rg '${pattern}' '${path}'`);\n *     return r.stdout;\n *   },\n *   read: async (path, start, end) => {\n *     const r = await sandbox.run(`sed -n '${start},${end}p' '${path}'`);\n *     return r.stdout;\n *   },\n *   listDir: async (path, maxDepth) => {\n *     const r = await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`);\n *     return r.stdout;\n *   },\n * });\n * ```\n */\nexport class RemoteCommandsProvider implements WarpGrepProvider {\n  constructor(\n    private readonly repoRoot: string,\n    private readonly commands: RemoteCommands\n  ) {}\n\n  /**\n   * Run grep command and parse ripgrep output\n   */\n  async grep(params: { pattern: string; path: string; glob?: string }): Promise<GrepResult> {\n    try {\n      const stdout = await this.commands.grep(params.pattern, params.path, params.glob);\n      \n      // Parse ripgrep output: each line is \"path:line:content\" or \"path-line-content\" for context\n      const lines = (stdout || '')\n        .trim()\n        .split(/\\r?\\n/)\n        .filter((l) => l.length > 0);\n      \n      // Truncate if too many lines (return partial results like training harness)\n      if (lines.length > AGENT_CONFIG.MAX_OUTPUT_LINES) {\n        const truncated = lines.slice(0, AGENT_CONFIG.MAX_OUTPUT_LINES);\n        truncated.push(`... (output truncated at ${AGENT_CONFIG.MAX_OUTPUT_LINES} of ${lines.length} lines)`);\n        return { lines: truncated };\n      }\n      \n      return { lines };\n    } catch (error) {\n      return {\n        lines: [],\n        error: `[GREP ERROR] ${error instanceof Error ? error.message : String(error)}`,\n      };\n    }\n  }\n\n  /**\n   * Read file and add line numbers\n   */\n  async read(params: { path: string; start?: number; end?: number }): Promise<ReadResult> {\n    const rawStart = params.start;\n    const rawEnd = params.end;\n    \n    const startValid = rawStart === undefined || (Number.isFinite(rawStart) && rawStart > 0);\n    const endValid = rawEnd === undefined || (Number.isFinite(rawEnd) && rawEnd > 0);\n    const rangeValid = startValid && endValid && \n      (rawStart === undefined || rawEnd === undefined || rawStart <= rawEnd);\n    \n    const start = rangeValid && rawStart !== undefined ? rawStart : 1;\n    const end = rangeValid && rawEnd !== undefined ? rawEnd : 1_000_000;\n    \n    try {\n      const stdout = await this.commands.read(params.path, start, end);\n      \n      // Split content into lines and add line numbers\n      const contentLines = (stdout || '').split('\\n');\n      \n      // Remove trailing empty line if present (common with sed output)\n      if (contentLines.length > 0 && contentLines[contentLines.length - 1] === '') {\n        contentLines.pop();\n      }\n      \n      // Format as \"lineNumber|content\"\n      const lines = contentLines.map((content, idx) => `${start + idx}|${content}`);\n      \n      // Check if output is too large\n      if (lines.length > AGENT_CONFIG.MAX_READ_LINES) {\n        const truncated = lines.slice(0, AGENT_CONFIG.MAX_READ_LINES);\n        truncated.push(`... (output truncated at ${AGENT_CONFIG.MAX_READ_LINES} of ${lines.length} lines)`);\n        return { lines: truncated };\n      }\n      \n      return { lines };\n    } catch (error) {\n      return {\n        lines: [],\n        error: `[READ ERROR] ${error instanceof Error ? error.message : String(error)}`,\n      };\n    }\n  }\n\n  /**\n   * List directory and parse find output\n   */\n  async listDirectory(params: { \n    path: string; \n    pattern?: string | null; \n    maxResults?: number; \n    maxDepth?: number;\n  }): Promise<ListDirectoryEntry[]> {\n    const maxDepth = params.maxDepth ?? AGENT_CONFIG.MAX_LIST_DEPTH;\n    const maxResults = params.maxResults ?? AGENT_CONFIG.MAX_OUTPUT_LINES;\n    \n    try {\n      const stdout = await this.commands.listDir(params.path, maxDepth);\n      \n      // Parse find output: one path per line\n      const paths = (stdout || '')\n        .trim()\n        .split(/\\r?\\n/)\n        .filter((p) => p.length > 0);\n      \n      const regex = params.pattern ? new RegExp(params.pattern) : null;\n      const entries: ListDirectoryEntry[] = [];\n      \n      for (const fullPath of paths) {\n        // Skip the root path itself\n        if (fullPath === params.path || fullPath === this.repoRoot) continue;\n        \n        const name = fullPath.split('/').pop() || '';\n        \n        // Simple name-based filtering - skip junk dirs/files\n        if (shouldSkip(name)) continue;\n        \n        // Apply pattern filter if provided\n        if (regex && !regex.test(name)) continue;\n        \n        // Determine relative path\n        let relativePath = fullPath;\n        if (fullPath.startsWith(this.repoRoot)) {\n          relativePath = fullPath.slice(this.repoRoot.length).replace(/^\\//, '');\n        }\n        \n        // Calculate depth based on path separators\n        const depth = relativePath.split('/').filter(Boolean).length - 1;\n        \n        // Determine if it's a directory (ends with / or infer from path structure)\n        // Note: Most sandbox find commands don't indicate type, so we guess based on extension\n        const hasExtension = name.includes('.') && !name.startsWith('.');\n        const type: 'file' | 'dir' = hasExtension ? 'file' : 'dir';\n        \n        entries.push({\n          name,\n          path: relativePath,\n          type,\n          depth: Math.max(0, depth),\n        });\n        \n        if (entries.length >= maxResults) break;\n      }\n      \n      return entries;\n    } catch (error) {\n      // Return empty array on error (consistent with LocalRipgrepProvider)\n      return [];\n    }\n  }\n\n  /**\n   * Glob search - finds files matching a pattern.\n   * Falls back to a grep --files approach via the listDir command.\n   */\n  async glob(params: { pattern: string; path?: string }): Promise<GlobResult> {\n    const searchPath = params.path || this.repoRoot;\n    try {\n      // Use find with -name to simulate glob\n      const stdout = await this.commands.listDir(searchPath, 10);\n      const allPaths = (stdout || '')\n        .trim()\n        .split(/\\r?\\n/)\n        .filter((p) => p.length > 0);\n\n      // Simple glob matching: convert glob pattern to regex\n      const globToRegex = (glob: string) => {\n        const escaped = glob\n          .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n          .replace(/\\*/g, '.*')\n          .replace(/\\?/g, '.');\n        return new RegExp(escaped);\n      };\n      const regex = globToRegex(params.pattern);\n\n      const matched = allPaths\n        .filter(p => {\n          const name = p.split('/').pop() || '';\n          return regex.test(name) && !shouldSkip(name);\n        });\n\n      const totalFound = matched.length;\n      return { files: matched.slice(0, 100), searchDir: searchPath, totalFound };\n    } catch (error) {\n      return {\n        files: [],\n        searchDir: searchPath,\n        totalFound: 0,\n        error: `[GLOB ERROR] ${error instanceof Error ? error.message : String(error)}`,\n      };\n    }\n  }\n}\n","/**\n * HTTP-based RemoteCommands for code search against the Morph landing API.\n *\n * Translates grep/read/listDir into POST requests to the code-search endpoints,\n * so the WarpGrep agent can search GitHub repositories that have been indexed\n * by the Morph code storage service.\n */\n\nimport type { RemoteCommands } from '../types.js';\n\n/**\n * The WarpGrep model addresses files as if the repo were checked out at\n * /home/ubuntu/repo (its training root), while the code-search endpoints\n * expect repo-relative paths. Strip the training root and any leading\n * slashes at this boundary — the same normalization the dashboard\n * playground applies via warpgrep-mock-paths.ts.\n */\nconst MODEL_REPO_ROOT = /^\\/?home\\/ubuntu\\/repo(?:\\/|$)/;\n\nexport function toRepoRelative(path: string): string {\n  if (!path) return path;\n  const stripped = path.replace(MODEL_REPO_ROOT, '').replace(/^\\.?\\/+/, '');\n  return stripped || '.';\n}\n\nexport interface CodeStorageHttpConfig {\n  /** Base URL for the code search API (e.g. \"https://api.morphllm.com\") */\n  baseUrl: string;\n  /** Repository ID returned by the get-or-create endpoint */\n  repoId: string;\n  /** Git branch to search */\n  branch: string;\n  /** Morph API key, forwarded as a Bearer token (api.morphllm.com requires it) */\n  apiKey?: string;\n}\n\nasync function post(url: string, body: Record<string, unknown>, op: string, apiKey?: string): Promise<string> {\n  const res = await fetch(url, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n    },\n    body: JSON.stringify(body),\n  });\n  if (!res.ok) {\n    const text = await res.text().catch(() => res.statusText);\n    // Return error as content instead of throwing so the agent can handle it gracefully\n    try {\n      const parsed = JSON.parse(text);\n      if (parsed.error) return `Error: ${parsed.error}`;\n    } catch { /* not JSON, fall through */ }\n    return `Error: ${op} failed (${res.status}): ${text}`;\n  }\n  const data = await res.json();\n  if (data.error) throw new Error(data.error);\n  return data.stdout;\n}\n\nexport function createCodeStorageHttpCommands(config: CodeStorageHttpConfig): RemoteCommands {\n  const { baseUrl, repoId, branch, apiKey } = config;\n  const encodedRepoId = encodeURIComponent(repoId);\n\n  return {\n    grep: (pattern: string, path: string, glob?: string) =>\n      post(`${baseUrl}/api/code-search/${encodedRepoId}/grep`, { pattern, path: toRepoRelative(path), glob, branch }, 'grep', apiKey),\n\n    read: (path: string, start: number, end: number) =>\n      post(`${baseUrl}/api/code-search/${encodedRepoId}/read`, { path: toRepoRelative(path), start, end, branch }, 'read', apiKey),\n\n    listDir: (path: string, maxDepth: number) =>\n      post(`${baseUrl}/api/code-search/${encodedRepoId}/list`, { path: toRepoRelative(path), maxDepth, branch }, 'list', apiKey),\n  };\n}\n","/**\n * GitHub URL parsing utilities\n */\n\n/**\n * Parse GitHub URL or \"owner/repo\" shorthand into owner and repo components.\n * Handles: \"owner/repo\", \"https://github.com/owner/repo\", \"github.com/owner/repo.git\"\n */\nexport function parseGitHubUrl(input: string): { owner: string; repo: string } {\n  input = input.trim();\n\n  // Try URL patterns first\n  const urlPattern = /^(?:https?:\\/\\/)?github\\.com\\/([^\\/]+)\\/([^\\/\\?\\#]+)/;\n  const match = input.match(urlPattern);\n  if (match) {\n    return { owner: match[1], repo: match[2].replace(/\\.git$/, '') };\n  }\n\n  // Try \"owner/repo\" shorthand (reject if owner contains '.', e.g. \"github.com/owner\")\n  const shortPattern = /^([^\\/]+)\\/([^\\/]+)$/;\n  const shortMatch = input.match(shortPattern);\n  if (shortMatch && !shortMatch[1].includes('.')) {\n    return { owner: shortMatch[1], repo: shortMatch[2].replace(/\\.git$/, '') };\n  }\n\n  throw new Error(\n    `Invalid GitHub URL or shorthand: \"${input}\". Expected \"owner/repo\" or \"https://github.com/owner/repo\"`\n  );\n}\n","/**\n * Resilience utilities for retry logic and timeout handling\n */\n\nimport { SDK_VERSION } from '../../version.js';\n\nexport interface RetryConfig {\n  maxRetries?: number;        // Default: 3\n  initialDelay?: number;      // Default: 1000ms\n  maxDelay?: number;          // Default: 30000ms\n  backoffMultiplier?: number; // Default: 2\n  retryableErrors?: string[]; // Default: ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND']\n  onRetry?: (attempt: number, error: Error) => void;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<Omit<RetryConfig, 'onRetry'>> = {\n  maxRetries: 3,\n  initialDelay: 1000,\n  maxDelay: 30000,\n  backoffMultiplier: 2,\n  retryableErrors: ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND'],\n};\n\n/**\n * Retry a fetch request with exponential backoff\n * \n * @param url - Request URL\n * @param options - Fetch options\n * @param retryConfig - Retry configuration\n * @returns Response from fetch\n * \n * @example\n * ```typescript\n * const response = await fetchWithRetry(\n *   'https://api.example.com/data',\n *   { method: 'POST', body: JSON.stringify(data) },\n *   { maxRetries: 5, initialDelay: 500 }\n * );\n * ```\n */\nexport async function fetchWithRetry(\n  url: string,\n  options: RequestInit,\n  retryConfig: RetryConfig = {}\n): Promise<Response> {\n  const {\n    maxRetries = DEFAULT_RETRY_CONFIG.maxRetries,\n    initialDelay = DEFAULT_RETRY_CONFIG.initialDelay,\n    maxDelay = DEFAULT_RETRY_CONFIG.maxDelay,\n    backoffMultiplier = DEFAULT_RETRY_CONFIG.backoffMultiplier,\n    retryableErrors = DEFAULT_RETRY_CONFIG.retryableErrors,\n    onRetry,\n  } = retryConfig;\n\n  let lastError: Error | null = null;\n  let delay = initialDelay;\n\n  // Inject SDK version header (caller-provided headers can override)\n  options = { ...options, headers: { 'X-Morph-SDK-Version': SDK_VERSION, ...options.headers } };\n\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      const response = await fetch(url, options);\n      \n      // Retry on 429 (rate limit) or 503 (service unavailable)\n      if (response.status === 429 || response.status === 503) {\n        if (attempt < maxRetries) {\n          // Check for Retry-After header\n          const retryAfter = response.headers.get('Retry-After');\n          const waitTime = retryAfter \n            ? parseInt(retryAfter) * 1000 \n            : Math.min(delay, maxDelay);\n          \n          const error = new Error(`HTTP ${response.status}: Retrying after ${waitTime}ms`);\n          if (onRetry) {\n            onRetry(attempt + 1, error);\n          }\n          \n          await sleep(waitTime);\n          delay *= backoffMultiplier;\n          continue;\n        }\n      }\n\n      return response;\n    } catch (error) {\n      lastError = error as Error;\n      \n      // Check if error is retryable\n      const isRetryable = retryableErrors.some(errType => \n        lastError?.message?.includes(errType)\n      );\n\n      if (!isRetryable || attempt === maxRetries) {\n        throw lastError;\n      }\n\n      // Exponential backoff\n      const waitTime = Math.min(delay, maxDelay);\n      if (onRetry) {\n        onRetry(attempt + 1, lastError);\n      }\n      \n      await sleep(waitTime);\n      delay *= backoffMultiplier;\n    }\n  }\n\n  throw lastError || new Error('Max retries exceeded');\n}\n\n/**\n * Add timeout to any promise\n * \n * @param promise - Promise to wrap with timeout\n * @param timeoutMs - Timeout in milliseconds\n * @param errorMessage - Optional custom error message\n * @returns Promise that rejects if timeout is reached\n * \n * @example\n * ```typescript\n * const result = await withTimeout(\n *   fetchData(),\n *   5000,\n *   'Data fetch timed out'\n * );\n * ```\n */\nexport async function withTimeout<T>(\n  promise: Promise<T>,\n  timeoutMs: number,\n  errorMessage?: string\n): Promise<T> {\n  let timeoutId: NodeJS.Timeout | number;\n  \n  const timeoutPromise = new Promise<never>((_, reject) => {\n    timeoutId = setTimeout(() => {\n      reject(new Error(errorMessage || `Operation timed out after ${timeoutMs}ms`));\n    }, timeoutMs);\n  });\n\n  try {\n    const result = await Promise.race([promise, timeoutPromise]);\n    clearTimeout(timeoutId!);\n    return result;\n  } catch (error) {\n    clearTimeout(timeoutId!);\n    throw error;\n  }\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Unified error type for all tools\n */\nexport class MorphError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public statusCode?: number,\n    public retryable: boolean = false\n  ) {\n    super(message);\n    this.name = 'MorphError';\n  }\n}\n\n\n","/**\n * Single error mapper for the SDK transport.\n *\n * Consolidates the per-tool error handling that used to live in every client\n * (compact, reflex, github, …) into one place, preserving the actionable\n * 401/429 messaging. Reuses the existing `MorphError` type so callers that\n * `instanceof MorphError` keep working.\n */\nimport { MorphError } from '../tools/utils/resilience.js';\n\ninterface ApiErrorBody {\n  error?: { message?: string; code?: string; type?: string };\n  message?: string;\n}\n\n/**\n * Turn a non-OK `Response` into a `MorphError`, extracting the API's error\n * message when present and marking 429/503 as retryable.\n */\nexport async function toMorphError(response: Response): Promise<MorphError> {\n  let message = `Morph API request failed (${response.status})`;\n  let code = 'api_error';\n\n  try {\n    const body = (await response.json()) as ApiErrorBody;\n    message = body.error?.message ?? body.message ?? message;\n    code = body.error?.code ?? body.error?.type ?? code;\n  } catch {\n    // Non-JSON body — keep the status-based default message.\n  }\n\n  if (response.status === 401) code = 'authentication_error';\n  if (response.status === 429) code = 'rate_limit_exceeded';\n\n  const retryable = response.status === 429 || response.status === 503;\n  return new MorphError(message, code, response.status, retryable);\n}\n","/**\n * MorphAPIClient — the SDK transport.\n *\n * One place owns authentication, the Morph service hosts, default headers,\n * retries, timeouts, and error mapping. Every resource (FastApply, Compact,\n * Reflex, …) holds a reference to this client and delegates HTTP to it via\n * `get`/`post`/`delete`/`request`, exactly like the OpenAI SDK.\n *\n * This module is intentionally free of tool imports and Node built-ins so it\n * stays edge-safe (it is reachable from `@morphllm/morphsdk/edge` through the\n * Compact and model-router resources).\n */\nimport { fetchWithRetry, withTimeout, MorphError, type RetryConfig } from '../tools/utils/resilience.js';\nimport { logger } from '../logger.js';\nimport { SDK_VERSION } from '../version.js';\nimport { toMorphError } from './error.js';\n\n/** The Morph services the SDK talks to. */\nconst DEFAULT_BASE_URL = 'https://api.morphllm.com';\nconst DEFAULT_REPOS_URL = 'https://repos.morphllm.com';\nconst DEFAULT_BROWSER_URL = 'https://browser.morphllm.com';\nconst DEFAULT_TIMEOUT = 60_000;\n\nconst env = (name: string): string | undefined =>\n  typeof process !== 'undefined' ? process.env?.[name] : undefined;\n\nconst stripTrailingSlash = (url: string): string => url.replace(/\\/+$/, '');\n\nexport interface MorphAPIClientOptions {\n  /** Morph API key. Resolved against `MORPH_API_KEY` at request time if omitted. */\n  apiKey?: string;\n  /** Primary API host (default `https://api.morphllm.com`). */\n  baseURL?: string;\n  /** Code-storage host for codebase search and git (default `https://repos.morphllm.com`). */\n  reposURL?: string;\n  /** Browser-automation host (default `https://browser.morphllm.com`). */\n  browserURL?: string;\n  /** Default per-request timeout in ms (default 60s). Resources may override per call. */\n  timeout?: number;\n  /** Retry policy for transient failures. */\n  retryConfig?: RetryConfig;\n  /** Enable debug logging. */\n  debug?: boolean;\n}\n\n/** Per-request options accepted by `request`/`get`/`post`/`delete`. */\nexport interface RequestOptions {\n  /** JSON body; serialized with `JSON.stringify`. */\n  body?: unknown;\n  /** Query parameters; `undefined`/`null` values are dropped. */\n  query?: Record<string, string | number | boolean | undefined | null>;\n  /** Extra headers, merged over (and able to override) the defaults. */\n  headers?: Record<string, string>;\n  /** Override the timeout for this call. */\n  timeout?: number;\n  /** Hit a different host than the default (e.g. `this._client.reposURL`). */\n  baseURL?: string;\n  /** Return the raw `Response` of a successful (2xx) request instead of parsed JSON (for streaming). */\n  stream?: boolean;\n  /**\n   * Return the raw `Response` without throwing on non-2xx and without parsing.\n   * For resources that map errors into their own taxonomy (e.g. GitHub).\n   */\n  raw?: boolean;\n  /** Caller-supplied abort signal. */\n  signal?: AbortSignal;\n}\n\nexport class MorphAPIClient {\n  /** Explicit key as provided; resolved against env at request time. */\n  apiKey?: string;\n  baseURL: string;\n  reposURL: string;\n  browserURL: string;\n  /** Explicit default timeout (ms), if set. The request default is applied lazily so\n   * resources can read an undefined value and supply their own fallback. */\n  timeout?: number;\n  retryConfig?: RetryConfig;\n  debug: boolean;\n\n  constructor(options: MorphAPIClientOptions = {}) {\n    this.apiKey = options.apiKey;\n    this.baseURL = stripTrailingSlash(options.baseURL ?? DEFAULT_BASE_URL);\n    this.reposURL = stripTrailingSlash(options.reposURL ?? env('MORPH_SEARCH_URL') ?? DEFAULT_REPOS_URL);\n    this.browserURL = stripTrailingSlash(\n      options.browserURL ?? (env('MORPH_ENVIRONMENT') === 'DEV' ? 'http://localhost:8000' : DEFAULT_BROWSER_URL),\n    );\n    this.timeout = options.timeout;\n    this.retryConfig = options.retryConfig;\n    this.debug = options.debug ?? false;\n    if (this.debug) logger.enable();\n  }\n\n  /** The key actually used for requests: explicit, else `MORPH_API_KEY`. */\n  resolveApiKey(): string | undefined {\n    return this.apiKey ?? env('MORPH_API_KEY');\n  }\n\n  /** Headers shared with tools that bring their own HTTP client (FastApply/WarpGrep via the `openai` package). */\n  defaultHeaders(): Record<string, string> {\n    return { 'X-Morph-SDK-Version': SDK_VERSION };\n  }\n\n  buildURL(path: string, baseURL?: string): string {\n    if (/^https?:\\/\\//i.test(path)) return path;\n    const base = stripTrailingSlash(baseURL ?? this.baseURL);\n    return `${base}${path.startsWith('/') ? '' : '/'}${path}`;\n  }\n\n  private buildHeaders(apiKey: string, extra?: Record<string, string>): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'X-Morph-SDK-Version': SDK_VERSION,\n      Authorization: `Bearer ${apiKey}`,\n      ...extra,\n    };\n  }\n\n  private applyQuery(url: string, query?: RequestOptions['query']): string {\n    if (!query) return url;\n    const params = new URLSearchParams();\n    for (const [key, value] of Object.entries(query)) {\n      if (value !== undefined && value !== null) params.set(key, String(value));\n    }\n    const qs = params.toString();\n    return qs ? `${url}${url.includes('?') ? '&' : '?'}${qs}` : url;\n  }\n\n  async request<T>(method: string, path: string, opts: RequestOptions = {}): Promise<T> {\n    const apiKey = this.resolveApiKey();\n    if (!apiKey) {\n      throw new MorphError(\n        'Morph API key not found. Set the MORPH_API_KEY environment variable or pass apiKey in config.',\n        'missing_api_key',\n        401,\n      );\n    }\n\n    const url = this.applyQuery(this.buildURL(path, opts.baseURL), opts.query);\n    const timeout = opts.timeout ?? this.timeout ?? DEFAULT_TIMEOUT;\n\n    const init: RequestInit = {\n      method,\n      headers: this.buildHeaders(apiKey, opts.headers),\n      ...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),\n      ...(opts.signal ? { signal: opts.signal } : {}),\n    };\n\n    logger.debug('MorphAPIClient', 'request', { method, url });\n\n    const response = await withTimeout(\n      fetchWithRetry(url, init, this.retryConfig ?? {}),\n      timeout,\n      `Morph request to ${url} timed out after ${timeout}ms`,\n    );\n\n    if (opts.raw) return response as unknown as T;\n    if (!response.ok) throw await toMorphError(response);\n    if (opts.stream) return response as unknown as T;\n    if (response.status === 204) return undefined as T;\n\n    const text = await response.text();\n    return (text ? JSON.parse(text) : undefined) as T;\n  }\n\n  get<T>(path: string, opts?: RequestOptions): Promise<T> {\n    return this.request<T>('GET', path, opts);\n  }\n\n  post<T>(path: string, opts?: RequestOptions): Promise<T> {\n    return this.request<T>('POST', path, opts);\n  }\n\n  delete<T>(path: string, opts?: RequestOptions): Promise<T> {\n    return this.request<T>('DELETE', path, opts);\n  }\n}\n","/**\n * Base class for every API resource (FastApply, Compact, Reflex, …).\n *\n * Mirrors the OpenAI SDK's `APIResource`: a resource holds nothing but a\n * reference to the transport (`MorphAPIClient`) and delegates all HTTP to it.\n * Sub-resources receive the same client by reference, so configuration and the\n * fetch/retry/auth machinery live in exactly one place.\n */\nimport type { MorphAPIClient } from './client.js';\n\nexport abstract class APIResource {\n  protected _client: MorphAPIClient;\n\n  constructor(client: MorphAPIClient) {\n    this._client = client;\n  }\n}\n","/**\n * CompactClient — calls the Morph /v1/compact endpoint.\n *\n * Returns per-message compacted_line_ranges showing which lines were removed.\n * HTTP goes through the shared `MorphAPIClient` transport.\n */\nimport { MorphAPIClient } from '../../core/client.js';\nimport { APIResource } from '../../core/resource.js';\nimport { MorphError } from '../utils/resilience.js';\nimport type { CompactConfig, CompactInput, CompactResult } from './types.js';\n\nconst DEFAULT_API_URL = 'https://api.morphllm.com';\nconst DEFAULT_TIMEOUT = 120000;\n\nfunction resolveClient(clientOrConfig: MorphAPIClient | CompactConfig): MorphAPIClient {\n  if (clientOrConfig instanceof MorphAPIClient) return clientOrConfig;\n  return new MorphAPIClient({\n    apiKey: clientOrConfig.morphApiKey,\n    baseURL: clientOrConfig.morphApiUrl ?? DEFAULT_API_URL,\n    timeout: clientOrConfig.timeout ?? DEFAULT_TIMEOUT,\n    retryConfig: clientOrConfig.retryConfig,\n    debug: clientOrConfig.debug,\n  });\n}\n\n/**\n * @deprecated Prefer the unified `MorphClient` (`new MorphClient({ apiKey }).compact`).\n * In edge runtimes where `MorphClient` is unavailable, pass a shared transport:\n * `new CompactClient(new MorphAPIClient({ apiKey }))`. Kept only for backwards compatibility.\n */\nexport class CompactClient extends APIResource {\n  /** Resolved URL/timeout, exposed for backwards-compatible introspection. */\n  readonly config: { morphApiUrl: string; timeout: number; debug: boolean };\n\n  constructor(clientOrConfig: MorphAPIClient | CompactConfig = {}) {\n    super(resolveClient(clientOrConfig));\n    const cfg = clientOrConfig instanceof MorphAPIClient ? {} : clientOrConfig;\n    this.config = {\n      morphApiUrl: this._client.baseURL,\n      timeout: cfg.timeout ?? DEFAULT_TIMEOUT,\n      debug: cfg.debug ?? false,\n    };\n  }\n\n  /**\n   * Compact messages or text via /v1/compact.\n   * Returns per-message `compacted_line_ranges` showing which lines were removed.\n   *\n   * @example\n   * ```typescript\n   * const client = new CompactClient({ morphApiKey: 'sk-...' });\n   * const result = await client.compact({\n   *   input: codeFile,\n   *   query: \"authentication\",\n   *   compressionRatio: 0.5,\n   * });\n   * console.log(result.output);\n   * ```\n   */\n  async compact(input: CompactInput): Promise<CompactResult> {\n    // Build request body with snake_case keys\n    const body: Record<string, unknown> = {\n      compression_ratio: input.compressionRatio ?? 0.5,\n      preserve_recent: input.preserveRecent ?? 2,\n      model: input.model ?? 'morph-compactor',\n      include_line_ranges: input.includeLineRanges ?? true,\n      include_markers: input.includeMarkers ?? true,\n    };\n\n    if (input.query !== undefined) body.query = input.query;\n\n    // Normalize input: string → { input }, array → { messages }, messages field → { messages }\n    if (input.messages) body.messages = input.messages;\n    else if (typeof input.input === 'string') body.input = input.input;\n    else if (Array.isArray(input.input)) body.messages = input.input;\n    else throw new Error(\"Either 'input' or 'messages' must be provided\");\n\n    try {\n      return await this._client.post<CompactResult>('/v1/compact', { body, timeout: this.config.timeout });\n    } catch (err) {\n      // Preserve the historical `Compact API error <status>: ...` message shape.\n      if (err instanceof MorphError) {\n        throw new Error(`Compact API error ${err.statusCode}: ${err.message}`);\n      }\n      throw err;\n    }\n  }\n}\n","import { CompactClient } from './core.js';\n\nexport async function compactFileContexts(\n  files: { path: string; content: string }[],\n  query: string,\n  apiKey?: string,\n  apiUrl?: string,\n  maxTokens: number = 10000,\n  maxConcurrency: number = 3\n): Promise<{ path: string; content: string }[]> {\n  const totalLength = files.reduce((sum, file) => sum + file.content.length, 0);\n  const estimatedTokens = totalLength / 3;\n\n  if (estimatedTokens <= maxTokens) {\n    return files;\n  }\n\n  let compressionRatio = maxTokens / estimatedTokens;\n  compressionRatio = Math.max(0.3, Math.min(0.99, compressionRatio));\n\n  const client = new CompactClient({\n    morphApiKey: apiKey,\n    morphApiUrl: apiUrl,\n  });\n\n  const results: { path: string; content: string }[] = [];\n  const inProgress = new Set<Promise<void>>();\n\n  for (const file of files) {\n    if (file.content.length < 500) {\n      results.push({ path: file.path, content: file.content });\n      continue;\n    }\n\n    const task = async () => {\n      try {\n        const result = await client.compact({\n          input: file.content,\n          query,\n          compressionRatio,\n          preserveRecent: 0,\n        });\n        results.push({ path: file.path, content: result.output });\n      } catch (error) {\n        console.error(`[compactFileContexts] Failed to compact file ${file.path}:`, error);\n        results.push({ path: file.path, content: file.content });\n      }\n    };\n\n    const promise = task().finally(() => inProgress.delete(promise));\n    inProgress.add(promise);\n\n    if (inProgress.size >= maxConcurrency) {\n      await Promise.race(inProgress);\n    }\n  }\n\n  await Promise.all(inProgress);\n\n  const orderMap = new Map(files.map((f, i) => [f.path, i]));\n  return results.sort((a, b) => (orderMap.get(a.path) ?? 0) - (orderMap.get(b.path) ?? 0));\n}\n","/**\n * WarpGrep client for programmatic code search\n */\n\nimport { runWarpGrep, runWarpGrepStreaming } from './agent/runner.js';\nimport { logger } from '../../logger.js';\nimport { RemoteCommandsProvider } from './providers/remote.js';\nimport type { WarpGrepProvider } from './providers/types.js';\nimport type { AgentRunResult, WarpGrepStep } from './agent/types.js';\nimport type {\n  WarpGrepClientConfig,\n  WarpGrepInput,\n  WarpGrepResult,\n  WarpGrepContext,\n  WarpGrepToolConfig,\n  GitHubSearchInput,\n  GitHubReadFileInput,\n  GitHubReadFileResult,\n  RemoteCommands,\n} from './types.js';\nimport { createCodeStorageHttpCommands } from './providers/code_storage_http.js';\nimport { parseGitHubUrl } from './utils/github.js';\nimport { compactFileContexts } from '../compact/utils.js';\nimport { MorphAPIClient } from '../../core/client.js';\nimport { APIResource } from '../../core/resource.js';\n\nconst DEFAULT_CODE_SEARCH_URL = 'https://api.morphllm.com';\n\n/**\n * Lazy-load LocalRipgrepProvider to avoid importing Node.js-specific\n * modules (child_process, fs) in edge environments like Cloudflare Workers.\n * Only loads when actually needed (i.e., when no remoteCommands or provider is specified).\n */\nasync function getLocalProvider(repoRoot: string, excludes?: string[], allowNames?: string[]): Promise<WarpGrepProvider> {\n  const { LocalRipgrepProvider } = await import('./providers/local.js');\n  const opts = allowNames?.length ? { allowNames } : undefined;\n  return new LocalRipgrepProvider(repoRoot, excludes, opts);\n}\n\n/**\n * WarpGrep client for programmatic code search\n * \n * @example\n * ```typescript\n * import { WarpGrepClient } from '@morphllm/morphsdk';\n * \n * const client = new WarpGrepClient({ morphApiKey: process.env.MORPH_API_KEY });\n * \n * // Simple usage - defaults to LocalRipgrepProvider\n * const result = await client.execute({\n *   searchTerm: 'Find authentication middleware',\n *   repoRoot: '.'\n * });\n *\n * // With custom excludes\n * const result = await client.execute({\n *   searchTerm: 'Find database models',\n *   repoRoot: '.',\n *   excludes: ['node_modules', '.git', 'dist']\n * });\n * ```\n *\n * @deprecated Prefer the unified `MorphClient` (`new MorphClient({ apiKey }).warpGrep`).\n * Standalone clients remain only for backwards compatibility and may be removed in a future\n * major version — do not use them in new code.\n */\nexport class WarpGrepClient extends APIResource {\n  private config: WarpGrepClientConfig;\n\n  constructor(clientOrConfig: MorphAPIClient | WarpGrepClientConfig = {}) {\n    const isClient = clientOrConfig instanceof MorphAPIClient;\n    super(\n      isClient\n        ? clientOrConfig\n        : new MorphAPIClient({\n            apiKey: clientOrConfig.morphApiKey,\n            baseURL: clientOrConfig.morphApiUrl,\n            timeout: clientOrConfig.timeout,\n            retryConfig: clientOrConfig.retryConfig,\n            debug: clientOrConfig.debug,\n          }),\n    );\n    const cfg: WarpGrepClientConfig = isClient ? {} : clientOrConfig;\n    // The agent loop talks to /v1/chat/completions through the `openai` package\n    // (see agent/runner.ts), sourcing credentials/host/timeout from the transport.\n    // `timeout` stays undefined-able so the runner's env-aware default still applies.\n    this.config = {\n      ...cfg,\n      morphApiKey: this._client.resolveApiKey(),\n      morphApiUrl: this._client.baseURL,\n      timeout: this._client.timeout,\n      retryConfig: this._client.retryConfig,\n      debug: this._client.debug,\n    };\n  }\n\n  /**\n   * Execute a code search\n   *\n   * @param input - Search parameters including searchTerm, repoRoot, and optional provider\n   * @returns Search results with relevant code contexts, or an AsyncGenerator if streamSteps is true\n   *\n   * @example\n   * ```typescript\n   * // Standard execution\n   * const result = await client.execute({\n   *   searchTerm: 'Find authentication middleware',\n   *   repoRoot: '.'\n   * });\n   *\n   * if (result.success) {\n   *   for (const ctx of result.contexts) {\n   *     console.log(`File: ${ctx.file}`);\n   *     console.log(ctx.content);\n   *   }\n   * }\n   *\n   * // Streaming execution\n   * const stream = client.execute({\n   *   searchTerm: 'Find auth middleware',\n   *   repoRoot: '.',\n   *   streamSteps: true\n   * });\n   *\n   * for await (const step of stream) {\n   *   console.log(`Turn ${step.turn}:`, step.toolCalls);\n   * }\n   * ```\n   */\n  execute(input: WarpGrepInput & { streamSteps: true }): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\n  execute(input: WarpGrepInput & { streamSteps?: false | undefined }): Promise<WarpGrepResult>;\n  execute(input: WarpGrepInput): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n    const toolConfig: WarpGrepToolConfig = {\n      repoRoot: input.repoRoot,\n      remoteCommands: input.remoteCommands,\n      provider: input.provider,\n      excludes: input.excludes,\n      includes: input.includes,\n      debug: input.debug ?? this.config.debug,\n      morphApiKey: this.config.morphApiKey,\n      morphApiUrl: this.config.morphApiUrl,\n      retryConfig: this.config.retryConfig,\n      timeout: this.config.timeout,\n      search_type: input.search_type,\n    };\n\n    if (input.streamSteps) {\n      return executeToolCallStreaming({ search_term: input.searchTerm }, toolConfig);\n    }\n    return executeToolCall({ search_term: input.searchTerm }, toolConfig);\n  }\n\n  /**\n   * Search a public GitHub repository\n   *\n   * @example\n   * ```typescript\n   * // Simple usage\n   * const result = await client.searchGitHub({\n   *   searchTerm: 'Find authentication middleware',\n   *   github: 'vercel/next.js',\n   * });\n   *\n   * // With streaming\n   * const stream = client.searchGitHub({\n   *   searchTerm: 'Find auth middleware',\n   *   github: 'https://github.com/vercel/next.js',\n   *   streamSteps: true,\n   * });\n   * for await (const step of stream) {\n   *   console.log(`Turn ${step.turn}:`, step.toolCalls);\n   * }\n   * ```\n   */\n  searchGitHub(input: GitHubSearchInput & { streamSteps: true }): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\n  searchGitHub(input: GitHubSearchInput & { streamSteps?: false | undefined }): Promise<WarpGrepResult>;\n  searchGitHub(input: GitHubSearchInput): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n    if (input.streamSteps) {\n      return this._searchGitHubStreaming(input);\n    }\n    return this._searchGitHubAsync(input);\n  }\n\n  /**\n   * Read a single file from a public GitHub repository\n   *\n   * @example\n   * ```typescript\n   * const result = await client.readGitHubFile({\n   *   github: 'vercel/next.js',\n   *   path: 'src/server/app-render/index.tsx',\n   *   startLine: 1,\n   *   endLine: 50,\n   * });\n   * if (result.success) console.log(result.content);\n   * ```\n   */\n  async readGitHubFile(input: GitHubReadFileInput): Promise<GitHubReadFileResult> {\n    return executeGitHubReadFile(input, { timeout: this.config.timeout });\n  }\n\n  private async _resolveGitHubRepo(input: GitHubSearchInput): Promise<{ repo: string; remoteCommands: RemoteCommands }> {\n    const { owner, repo } = parseGitHubUrl(input.github);\n    const baseUrl = this.config.codeSearchUrl || DEFAULT_CODE_SEARCH_URL;\n    logger.debug('WarpGrep', 'github_resolve', { owner_repo: `${owner}/${repo}`, branch: input.branch });\n\n    const resolveStart = Date.now();\n    const importRes = await fetch(`${baseUrl}/api/code-search/get-or-create?url=${encodeURIComponent(`${owner}/${repo}`)}`, {\n      headers: this.config.morphApiKey ? { Authorization: `Bearer ${this.config.morphApiKey}` } : undefined,\n    });\n    if (!importRes.ok) {\n      const text = await importRes.text().catch(() => importRes.statusText);\n      logger.error('WarpGrep', 'github_resolve_failed', { owner_repo: `${owner}/${repo}`, status: importRes.status, error: text });\n      throw new Error(`Failed to import repo ${owner}/${repo}: ${text}`);\n    }\n    const { repoId, defaultBranch } = await importRes.json();\n    logger.debug('WarpGrep', 'github_repo_fetched', { repo_id: repoId, default_branch: defaultBranch, latency_ms: Date.now() - resolveStart });\n\n    return {\n      repo,\n      remoteCommands: createCodeStorageHttpCommands({\n        baseUrl,\n        repoId,\n        branch: input.branch || defaultBranch,\n        apiKey: this.config.morphApiKey,\n      }),\n    };\n  }\n\n  private async _searchGitHubAsync(input: GitHubSearchInput): Promise<WarpGrepResult> {\n    try {\n      const { remoteCommands } = await this._resolveGitHubRepo(input);\n      return this.execute({\n        searchTerm: input.searchTerm,\n        repoRoot: '.',\n        remoteCommands,\n      });\n    } catch (error) {\n      return { success: false, error: error instanceof Error ? error.message : String(error) };\n    }\n  }\n\n  private async *_searchGitHubStreaming(input: GitHubSearchInput): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n    let remoteCommands: RemoteCommands;\n    try {\n      ({ remoteCommands } = await this._resolveGitHubRepo(input));\n    } catch (error) {\n      return { success: false, error: error instanceof Error ? error.message : String(error) };\n    }\n\n    const generator = this.execute({\n      searchTerm: input.searchTerm,\n      repoRoot: '.',\n      remoteCommands,\n      streamSteps: true,\n    });\n\n    let result: WarpGrepResult;\n    for (;;) {\n      const { value, done } = await generator.next();\n      if (done) {\n        result = value;\n        break;\n      }\n      yield value;\n    }\n    return result;\n  }\n}\n\n/**\n * Execute a warp grep search directly\n *\n * @param input - Search parameters\n * @param config - Optional client configuration\n * @returns Search results, or an AsyncGenerator if streamSteps is true\n *\n * @example\n * ```typescript\n * import { executeWarpGrep } from '@morphllm/morphsdk/tools/warp-grep';\n *\n * const result = await executeWarpGrep({\n *   searchTerm: 'Find authentication middleware',\n *   repoRoot: '.'\n * });\n *\n * // Streaming\n * const stream = executeWarpGrep({\n *   searchTerm: 'Find auth',\n *   repoRoot: '.',\n *   streamSteps: true\n * });\n * for await (const step of stream) {\n *   console.log(step.turn, step.toolCalls);\n * }\n * ```\n */\nexport function executeWarpGrep(\n  input: WarpGrepInput & { streamSteps: true },\n  config?: WarpGrepClientConfig\n): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\nexport function executeWarpGrep(\n  input: WarpGrepInput & { streamSteps?: false | undefined },\n  config?: WarpGrepClientConfig\n): Promise<WarpGrepResult>;\nexport function executeWarpGrep(\n  input: WarpGrepInput,\n  config?: WarpGrepClientConfig\n): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n  const client = new WarpGrepClient(config);\n  if (input.streamSteps) {\n    return client.execute({ ...input, streamSteps: true });\n  }\n  return client.execute({ ...input, streamSteps: false });\n}\n\nexport async function executeToolCall(\n  input: { search_term: string } | string,\n  config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n  const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n\n  // Priority: remoteCommands > provider > LocalRipgrepProvider (lazy-loaded for edge compatibility)\n  const allowNames = config.search_type === 'node_modules' ? ['node_modules'] : undefined;\n  const provider = config.remoteCommands\n    ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n    : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes, allowNames);\n\n  const result = await runWarpGrep({\n    searchTerm: parsed.search_term,\n    repoRoot: config.repoRoot,\n    provider,\n    excludes: config.excludes,\n    includes: config.includes,\n    debug: config.debug ?? false,\n    morphApiKey: config.morphApiKey,\n    morphApiUrl: config.morphApiUrl,\n    retryConfig: config.retryConfig,\n    timeout: config.timeout,\n    search_type: config.search_type,\n  });\n\n  return processAgentResult(result, parsed.search_term, config.morphApiKey, config.morphApiUrl);\n}\n\n/**\n * Helper to process AgentRunResult into WarpGrepResult\n */\nasync function processAgentResult(\n  result: AgentRunResult,\n  searchTerm: string,\n  apiKey?: string,\n  apiUrl?: string\n): Promise<WarpGrepResult> {\n  const finish = result.finish;\n  if (result.terminationReason !== 'completed' || !finish?.metadata) {\n    const errorDetails = result.errors?.map(e => e.message).join('; ') || 'unknown reason';\n    console.error(`[warp_grep] processAgentResult failed. Reason: ${result.terminationReason}. Errors: ${errorDetails}. Turns: ${result.timings?.turns?.length ?? 0}`);\n    return { success: false, error: `Search did not complete: ${errorDetails}` };\n  }\n\n  const contexts: WarpGrepContext[] = (finish.resolved ?? []).map(r => ({\n    file: r.path,\n    content: r.content,\n    lines: r.ranges,\n  }));\n\n  try {\n    const compactable = contexts.map(c => ({ path: c.file, content: c.content }));\n    const compacted = await compactFileContexts(compactable, searchTerm, apiKey, apiUrl);\n    for (let i = 0; i < contexts.length; i++) {\n      contexts[i].content = compacted[i].content;\n    }\n  } catch (error) {\n    console.error(`[warp_grep] Failed to compact result contexts:`, error);\n  }\n\n  return { success: true, contexts, summary: finish.payload };\n}\n\n/**\n * Streaming version of executeToolCall that yields WarpGrepStep for each turn.\n */\nexport async function* executeToolCallStreaming(\n  input: { search_term: string } | string,\n  config: WarpGrepToolConfig\n): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n  const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n\n  // Priority: remoteCommands > provider > LocalRipgrepProvider (lazy-loaded for edge compatibility)\n  const allowNames = config.search_type === 'node_modules' ? ['node_modules'] : undefined;\n  const provider = config.remoteCommands\n    ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n    : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes, allowNames);\n\n  const generator = runWarpGrepStreaming({\n    searchTerm: parsed.search_term,\n    repoRoot: config.repoRoot,\n    provider,\n    excludes: config.excludes,\n    includes: config.includes,\n    debug: config.debug ?? false,\n    morphApiKey: config.morphApiKey,\n    morphApiUrl: config.morphApiUrl,\n    retryConfig: config.retryConfig,\n    timeout: config.timeout,\n    search_type: config.search_type,\n  });\n\n  // Forward all yielded steps\n  let agentResult: AgentRunResult;\n  for (;;) {\n    const { value, done } = await generator.next();\n    if (done) {\n      agentResult = value;\n      break;\n    }\n    yield value;\n  }\n\n  // `await` is load-bearing: an async generator hands its `return` value back as\n  // the `done` result without awaiting it, so returning the Promise directly would\n  // surface an un-awaited Promise to streaming consumers instead of the result.\n  return await processAgentResult(agentResult, parsed.search_term, config.morphApiKey, config.morphApiUrl);\n}\n\n/**\n * Fetch raw file content from a public GitHub repository.\n * Tries the given branch first, then falls back to main/master/develop.\n */\nasync function fetchRawGitHubFile(\n  owner: string,\n  repo: string,\n  filePath: string,\n  branch?: string,\n  timeout?: number,\n): Promise<{ content: string; branch: string }> {\n  const branches = branch ? [branch] : ['HEAD'];\n  const fallbacks = ['main', 'master', 'develop'];\n\n  const fetchWithTimeout = (url: string) =>\n    timeout ? fetch(url, { signal: AbortSignal.timeout(timeout) }) : fetch(url);\n\n  for (const b of branches) {\n    const url = `https://raw.githubusercontent.com/${owner}/${repo}/${b}/${filePath}`;\n    const res = await fetchWithTimeout(url);\n    if (res.ok) return { content: await res.text(), branch: b };\n  }\n\n  for (const fb of fallbacks) {\n    if (branch && fb === branch) continue;\n    const url = `https://raw.githubusercontent.com/${owner}/${repo}/${fb}/${filePath}`;\n    const res = await fetchWithTimeout(url);\n    if (res.ok) return { content: await res.text(), branch: fb };\n  }\n\n  throw new Error(`File not found: ${owner}/${repo}/${filePath}`);\n}\n\n/**\n * Read a single file (or line range) from a public GitHub repository\n */\nexport async function executeGitHubReadFile(\n  input: GitHubReadFileInput,\n  config?: { timeout?: number },\n): Promise<GitHubReadFileResult> {\n  try {\n    const { owner, repo } = parseGitHubUrl(input.github);\n    const { content: raw, branch } = await fetchRawGitHubFile(\n      owner, repo, input.path, input.branch, config?.timeout,\n    );\n\n    const allLines = raw.split('\\n');\n    const totalLines = allLines.length;\n    const start = Math.max(1, input.startLine ?? 1);\n    const end = Math.min(totalLines, input.endLine ?? totalLines);\n\n    const selected = allLines.slice(start - 1, end);\n    const padWidth = String(end).length;\n    const numbered = selected\n      .map((line, i) => `${String(start + i).padStart(padWidth)}|${line}`)\n      .join('\\n');\n\n    return {\n      success: true,\n      content: numbered,\n      path: input.path,\n      github: `${owner}/${repo}`,\n      branch,\n      lineRange: [start, end],\n      totalLines,\n    };\n  } catch (error) {\n    return {\n      success: false,\n      error: error instanceof Error ? error.message : String(error),\n    };\n  }\n}\n\n/**\n * Format a GitHub read file result for display or tool responses\n */\nexport function formatGitHubReadFileResult(result: GitHubReadFileResult): string {\n  if (!result.success) {\n    return `Failed to read file: ${result.error}`;\n  }\n\n  const rangeStr = result.lineRange\n    ? ` (lines ${result.lineRange[0]}-${result.lineRange[1]} of ${result.totalLines})`\n    : '';\n\n  return `File: ${result.github}/${result.path}${rangeStr}\\n\\n${result.content}`;\n}\n\n/**\n * Format warp grep results for display or tool responses\n * \n * @param result - The search result\n * @returns Formatted string representation\n */\nexport function formatResult(result: WarpGrepResult): string {\n  if (!result.success) {\n    return `Search failed: ${result.error}`;\n  }\n\n  if (!result.contexts || result.contexts.length === 0) {\n    return 'No relevant code found. Try rephrasing your search term.';\n  }\n\n  const parts: string[] = [];\n  parts.push(`Morph Fast Context subagent performed search on repository:\\n`);\n  parts.push('Relevant context found:');\n\n  for (const ctx of result.contexts) {\n    const rangeStr = !ctx.lines || ctx.lines === '*'\n      ? '*'\n      : ctx.lines.map(([s, e]) => `${s}-${e}`).join(',');\n    parts.push(`- ${ctx.file}:${rangeStr}`);\n  }\n\n  parts.push('\\nHere is the content of files:\\n');\n\n  for (const ctx of result.contexts) {\n    const rangeStr = !ctx.lines || ctx.lines === '*'\n      ? ''\n      : ` lines=\"${ctx.lines.map(([s, e]) => `${s}-${e}`).join(',')}\"`;\n    parts.push(`<file path=\"${ctx.file}\"${rangeStr}>`);\n    parts.push(ctx.content);\n    parts.push('</file>\\n');\n  }\n\n  return parts.join('\\n');\n}\n\n","/**\n * Prompts and descriptions for codebase_search\n */\n\n/**\n * Default tool name for the warp grep tool\n */\nexport const WARP_GREP_TOOL_NAME = 'codebase_search';\n\n/**\n * Default tool description for the warp grep tool\n */\nexport const WARP_GREP_DESCRIPTION = \n  'Very fast code search exploration subagent (not a grep tool) that runs parallel grep and file read calls over multiple turns to locate relevant files and line ranges. ' +\n  'The search term should be a targeted natural-language query describing what you are trying to find or accomplish, e.g. ' +\n  '\"Find where authentication requests are handled in the Express routes\" or \"How do callers of processOrder handle the error case?\". ' +\n  'Fill in extra context you can infer to make the query specific. Do not pass bare keywords or symbol names — use grep directly for exact symbol lookups. ' +\n  'Use this tool first when exploring unfamiliar code. The results may be partial — follow up with classical search tools or direct file reads if needed.'\n  'When a task requires exploration beyond a single known file, ALWAYS default to warpgrep codebase search before other search mechanisms.'\n\nexport const GITHUB_WARP_GREP_SEARCH_TOOL_NAME = 'github_codebase_search';\n\nexport const GITHUB_WARP_GREP_SEARCH_DESCRIPTION =\n  'Always use this when debugging errors in third-party dependencies to check for upstream fixes, open issues, or newer code pathsSearch tool for public GitHub repositories.' +\n  'Code search exploration subagent for public GitHub repositories (not your local workspace — use codebase_search for that). ' +\n  'Runs parallel grep and file read calls to locate relevant files and line ranges in external github repositories without cloning the repository. ' +\n  'Pass a targeted natural-language query, not bare keywords. Useful for understanding how a library works or investigating upstream bugs. ' +\n  'You must provide either github_url or owner_repo (at least one required). '\n\nexport const GITHUB_WARP_GREP_SEARCH_INPUT_SCHEMA = {\n  type: 'object' as const,\n  properties: {\n    search_term: { type: 'string' as const, description: 'A targeted natural-language query describing what to find (e.g. \"How does auth work for SSO users?\"). Not a keyword or symbol name.' },\n    github_url: { type: 'string' as const, description: 'GitHub repository URL to search (e.g. \"https://github.com/vercel/next.js\"). You must provide either github_url or owner_repo.' },\n    owner_repo: { type: 'string' as const, description: 'Repository owner/repo shorthand (e.g. \"vercel/next.js\"). You must provide either github_url or owner_repo.' },\n    branch: { type: 'string' as const, description: 'Branch to search (defaults to the repository default branch)' },\n  },\n  required: ['search_term'] as const,\n};\n\nexport const GITHUB_SEARCH_TOOL_NAME = GITHUB_WARP_GREP_SEARCH_TOOL_NAME;\nexport const GITHUB_SEARCH_DESCRIPTION = GITHUB_WARP_GREP_SEARCH_DESCRIPTION;\nexport const GITHUB_SEARCH_INPUT_SCHEMA = GITHUB_WARP_GREP_SEARCH_INPUT_SCHEMA;\n\nexport const GITHUB_READ_FILE_TOOL_NAME = 'readfile_github_search';\n\nexport const GITHUB_READ_FILE_DESCRIPTION =\n  'Read a single file (or a line range) from a public GitHub repository. ' +\n  'ONLY USE THIS WHEN YOU ALREADY KNOW THE EXACT FILE PATH YOU WANT TO READ, for example after finding it via github_codebase_search results. ' +\n  'Takes owner/repo shorthand and the file path within the repo. Optionally specify startLine and endLine (1-based) to read a specific range. ' +\n  'Returns the file content with line numbers.';\n\nexport const GITHUB_READ_FILE_INPUT_SCHEMA = {\n  type: 'object' as const,\n  properties: {\n    github: { type: 'string' as const, description: 'owner/repo shorthand (e.g., \"vercel/next.js\")' },\n    path: { type: 'string' as const, description: 'File path within the repository (e.g., \"src/server/index.ts\")' },\n    startLine: { type: 'number' as const, description: 'Start line number (1-based). Omit to start from beginning.' },\n    endLine: { type: 'number' as const, description: 'End line number (1-based, inclusive). Omit to read to the end.' },\n    branch: { type: 'string' as const, description: 'Branch to read from (defaults to the repository default branch)' },\n  },\n  required: ['github', 'path'] as const,\n};\n"],"mappings":"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","names":["path","toRepoRelative","fs","import_path","fs","shouldSkip","SKIP_NAMES","SKIP_EXTENSIONS","import_promises","import_path","fs","path","toRepoRelative","res","path","isValidRange","import_path","path","import_path","fs","OpenAI","payload","path","path","path","DEFAULT_API_URL","DEFAULT_TIMEOUT","LocalRipgrepProvider"]}