{"version":3,"sources":["../../../../tools/warp_grep/agent/parser.ts"],"sourcesContent":["// 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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,SAAS,eAAe,UAAqF;AAClH,QAAM,SAAkC,CAAC;AACzC,aAAW,YAAY,SAAS,MAAM,GAAG,GAAG;AAC1C,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAK,SAAS,EAAE,KAAK,GAAG,EAAE,CAAC;AAChE,QAAI,MAAM,UAAU,KAAK,OAAO,SAAS,MAAM,CAAC,CAAC,KAAK,OAAO,SAAS,MAAM,CAAC,CAAC,GAAG;AAC/E,aAAO,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,IAClC,WAAW,OAAO,SAAS,MAAM,CAAC,CAAC,GAAG;AACpC,aAAO,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,IAClC;AAAA,EACF;AACA,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,OAAO,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE;AACzE,MAAI,OAAO,SAAS,EAAG,QAAO,EAAE,OAAO,OAAO;AAC9C,SAAO,CAAC;AACV;AAGO,SAAS,iBAAiB,UAAoC;AACnE,QAAM,QAA0B,CAAC;AAEjC,aAAW,QAAQ,SAAS,KAAK,EAAE,MAAM,KAAK,GAAG;AAC/C,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AAEd,UAAM,aAAa,aAAa,KAAK,OAAO,IAAI,IAAI;AACpD,UAAM,WAAW,QAAQ,QAAQ,KAAK,UAAU;AAChD,QAAI,aAAa,IAAI;AACnB,YAAM,KAAK,EAAE,MAAM,SAAS,OAAO,IAAI,CAAC;AACxC;AAAA,IACF;AACA,UAAM,WAAW,QAAQ,MAAM,GAAG,QAAQ;AAC1C,UAAM,aAAa,QAAQ,MAAM,WAAW,CAAC;AAC7C,QAAI,CAAC,WAAW,KAAK,KAAK,WAAW,KAAK,MAAM,KAAK;AACnD,YAAM,KAAK,EAAE,MAAM,UAAU,OAAO,IAAI,CAAC;AACzC;AAAA,IACF;AACA,UAAM,SAAkC,CAAC;AACzC,eAAW,YAAY,WAAW,MAAM,GAAG,GAAG;AAC5C,YAAM,KAAK,SAAS,KAAK;AACzB,UAAI,CAAC,GAAI;AACT,YAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,IAAI,OAAK,SAAS,EAAE,KAAK,GAAG,EAAE,CAAC;AAC3D,UAAI,MAAM,UAAU,KAAK,OAAO,SAAS,MAAM,CAAC,CAAC,KAAK,OAAO,SAAS,MAAM,CAAC,CAAC,GAAG;AAC/E,eAAO,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,MAClC,WAAW,OAAO,SAAS,MAAM,CAAC,CAAC,GAAG;AACpC,eAAO,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,MAClC;AAAA,IACF;AACA,UAAM,KAAK,EAAE,MAAM,UAAU,OAAO,OAAO,SAAS,IAAI,SAAS,IAAI,CAAC;AAAA,EACxE;AACA,SAAO;AACT;AAGO,SAAS,uBAAuB,SAAyB;AAC9D,QAAM,SAAS,QAAQ,KAAK,EAAE,MAAM,KAAK;AACzC,QAAM,aAAa,OAAO,MAAM,CAAC,EAAE,OAAO,OAAK,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,EAAE,WAAW,KAAK,CAAC;AAC/G,SAAO,WAAW,CAAC,KAAK;AAC1B;","names":[]}