{"version":3,"sources":["../../../tools/warp_grep/harness.ts","../../../tools/warp_grep/agent/parser.ts","../../../tools/warp_grep/agent/formatter.ts","../../../tools/warp_grep/agent/helpers.ts","../../../tools/warp_grep/agent/config.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/providers/local.ts","../../../tools/warp_grep/utils/ripgrep.ts","../../../tools/warp_grep/utils/paths.ts","../../../tools/warp_grep/utils/files.ts"],"sourcesContent":["/**\n * Warp Grep Harness Primitives\n *\n * Building blocks for custom agent harnesses.\n * Use these when you want to control the agent loop yourself.\n *\n * @example\n * ```typescript\n * import {\n *   parseFinishFiles,\n *   parseReadLines,\n *   extractPathFromCommand,\n *   formatToolResult,\n *   formatTurnMessage,\n *   formatListDirectoryTree,\n *   calculateContextBudget,\n *   buildInitialState,\n *   toolGrep,\n *   toolRead,\n *   toolListDirectory,\n *   toolGlob,\n *   resolveFinishFiles,\n *   AGENT_CONFIG,\n *   LocalRipgrepProvider,\n *   type ToolCall,\n *   type WarpGrepProvider,\n * } from '@morphllm/morphsdk/tools/warp-grep/harness';\n *\n * const provider = new LocalRipgrepProvider(repoRoot);\n * const messages = [\n *   { role: 'user', content: await buildInitialState(repoRoot, searchTerm, provider) },\n * ];\n *\n * // With OpenAI native tool calling, tool_calls come structured from the API response.\n * // Use parseFinishFiles, parseReadLines, extractPathFromCommand to parse string args.\n * ```\n */\n\nimport type { ToolCall, ToolCallRef, ToolName, FinishFileSpec, ChatMessage } from './agent/types.js';\nimport type { WarpGrepProvider, GrepResult, ReadResult, GlobResult, ListDirectoryEntry } from './providers/types.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// PARSING HELPERS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { parseFinishFiles, parseReadLines, extractPathFromCommand } from './agent/parser.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// FORMATTING\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { formatAgentToolOutput as formatToolResult } from './agent/formatter.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// HELPERS - same functions runner.ts uses\n// ════════════════════════════════════════════════════════════════════════════\n\nexport {\n  formatTurnMessage,\n  calculateContextBudget,\n  buildInitialState,\n  formatListDirectoryTree,\n} from './agent/helpers.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// TOOL EXECUTORS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { toolGrep } from './agent/tools/grep.js';\nexport { toolRead } from './agent/tools/read.js';\nexport { toolListDirectory } from './agent/tools/list_directory.js';\nexport { toolGlob } from './agent/tools/glob.js';\nexport { readFinishFiles, normalizeFinishFiles } from './agent/tools/finish.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// FINISH RESOLUTION (convenience wrapper)\n// ════════════════════════════════════════════════════════════════════════════\n\nimport { readFinishFiles } from './agent/tools/finish.js';\n\nexport type ResolvedFile = { path: string; content: string };\n\nexport async function resolveFinishFiles(\n  provider: WarpGrepProvider,\n  files: FinishFileSpec[]\n): Promise<ResolvedFile[]> {\n  return readFinishFiles('', files, async (p, s?, e?) => {\n    const r = await provider.read({ path: p, start: s, end: e });\n    return r.lines.map((l) => {\n      const idx = l.indexOf('|');\n      return idx >= 0 ? l.slice(idx + 1) : l;\n    });\n  });\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// CONFIG + CONSTANTS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { AGENT_CONFIG, DEFAULT_EXCLUDES } from './agent/config.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// PROVIDER + TYPES\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { LocalRipgrepProvider } from './providers/local.js';\n\nexport type {\n  ToolCall,\n  ToolCallRef,\n  ToolName,\n  FinishFileSpec,\n  ChatMessage,\n  WarpGrepProvider,\n  GrepResult,\n  ReadResult,\n  GlobResult,\n  ListDirectoryEntry,\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","export class ToolOutputFormatter {\n\tformat(\n\t\ttoolName: string,\n\t\t_args: Record<string, unknown> | null | undefined,\n\t\toutput: string,\n\t\toptions: { isError?: boolean } = {}\n\t): string {\n\t\tconst name = (toolName ?? \"\").trim();\n\t\tif (!name) {\n\t\t\treturn \"\";\n\t\t}\n\t\tconst payload = (output as any)?.toString?.()?.trim?.() ?? \"\";\n\t\tconst isError = Boolean(options.isError);\n\n\t\tif (!payload && !isError) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `<tool_response>\\n${payload}\\n</tool_response>`;\n\t}\n}\n\nconst sharedFormatter = new ToolOutputFormatter();\n\nexport function formatAgentToolOutput(\n\ttoolName: string,\n\targs: Record<string, unknown> | null | undefined,\n\toutput: string,\n\toptions: { isError?: boolean } = {}\n): string {\n\treturn sharedFormatter.format(toolName, args, output, options);\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","// 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 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","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","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"],"mappings":"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","names":["path","res","import_path","path","isValidRange","import_promises","import_path","import_path","path","fs","fs","fs","path"]}