{"version":3,"sources":["../../../../tools/warp_grep/utils/ripgrep.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAsB;AACtB,qBAAuB;AAKvB,IAAI,iBAAgC;AACpC,IAAI,gBAAgB;AAEpB,SAAS,QAAQ,UAAkB,MAAgB,MAAuE;AACxH,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,YAAQ,4BAAM,UAAU,MAAM;AAAA,MAClC,KAAK,MAAM;AAAA,MACX,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAI,MAAM,OAAO,CAAC,EAAG;AAAA,MAC5C,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,UAAM,OAAO,GAAG,QAAQ,CAAC,MAAO,UAAU,EAAE,SAAS,CAAE;AACvD,UAAM,OAAO,GAAG,QAAQ,CAAC,MAAO,UAAU,EAAE,SAAS,CAAE;AACvD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,cAAQ,EAAE,QAAQ,QAAQ,UAAU,OAAO,SAAS,WAAW,OAAO,GAAG,CAAC;AAAA,IAC5E,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACtB,cAAQ,EAAE,QAAQ,IAAI,QAAQ,4BAA4B,UAAU,GAAG,CAAC;AAAA,IAC1E,CAAC;AAAA,EACH,CAAC;AACH;AAGA,SAAS,gBAAgB,QAA6B;AAEpD,MAAI,OAAO,aAAa,GAAI,QAAO;AAEnC,MAAI,OAAO,OAAO,SAAS,UAAU,KAAK,OAAO,OAAO,SAAS,8BAA8B,EAAG,QAAO;AAEzG,MAAI,OAAO,aAAa,IAAK,QAAO;AACpC,SAAO;AACT;AAEA,eAAsB,WAAW,MAAgB,MAAuE;AAEtH,MAAI,iBAAiB,gBAAgB;AACnC,WAAO,QAAQ,gBAAgB,MAAM,IAAI;AAAA,EAC3C;AAGA,MAAI,CAAC,eAAe;AAClB,UAAM,SAAS,MAAM,QAAQ,uBAAQ,MAAM,IAAI;AAE/C,QAAI,CAAC,gBAAgB,MAAM,GAAG;AAE5B,uBAAiB;AACjB,sBAAgB;AAChB,aAAO;AAAA,IACT;AAGA,UAAM,iBAAiB,MAAM,QAAQ,MAAM,MAAM,IAAI;AAErD,QAAI,CAAC,gBAAgB,cAAc,GAAG;AAEpC,uBAAiB;AACjB,sBAAgB;AAChB,aAAO;AAAA,IACT;AAGA,oBAAgB;AAChB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AACF;","names":[]}