{"version":3,"file":"parsers.mjs","names":[],"sources":["../../src/files-touched/parsers.ts"],"sourcesContent":["import {\n\textractShellOperands,\n\tsplitShellCommands,\n\tstripShellCommandWrappers,\n} from '@live-compaction/files-touched/tokenizer';\nimport type { FileTouchOperation, FileTrackingAction } from '@live-compaction/files-touched/types';\n\n// ---------------------------------------------------------------------------\n// Generic helpers\n// ---------------------------------------------------------------------------\n\nexport function firstDefinedString(...values: unknown[]): string | null {\n\tfor (const value of values) {\n\t\tif (typeof value === 'string' && value.length > 0) return value;\n\t}\n\treturn null;\n}\n\nfunction extractJsonObject(text: string, prefix: string): Record<string, unknown> | null {\n\tconst trimmed = text.trim();\n\tif (!trimmed.startsWith(prefix)) return null;\n\tconst jsonText = trimmed.slice(prefix.length).trim();\n\tif (!jsonText.startsWith('{')) return null;\n\ttry {\n\t\tconst parsed = JSON.parse(jsonText);\n\t\treturn parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n\t\t\t? (parsed as Record<string, unknown>)\n\t\t\t: null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extractCliNamedArg(cmd: string, key: string): string | null {\n\tconst escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\tconst match = cmd.match(new RegExp(`(?:^|\\\\s)${escapedKey}=(?:\"([^\"]+)\"|'([^']+)'|(\\\\S+))`));\n\treturn firstDefinedString(...(match?.slice(1) ?? []));\n}\n\nfunction commandStartsWith(cmd: string, name: string): boolean {\n\tconst trimmed = cmd.trim();\n\treturn trimmed === name || trimmed.startsWith(`${name} `);\n}\n\nfunction extractReadPathFromCliCommand(cmd: string): string | null {\n\tconst readFileMatch = cmd.match(/(?:^|\\s)read_file\\s+.*?\\bpath=(?:\"([^\"]+)\"|'([^']+)'|(\\S+))/);\n\tif (readFileMatch) {\n\t\treturn stripReadSliceSuffix(firstDefinedString(...readFileMatch.slice(1)) ?? '');\n\t}\n\tconst simpleReadMatch = cmd.match(/^(?:read|cat)\\s+(?:\"([^\"]+)\"|'([^']+)'|(\\S+))/);\n\tif (simpleReadMatch) {\n\t\treturn stripReadSliceSuffix(firstDefinedString(...simpleReadMatch.slice(1)) ?? '');\n\t}\n\treturn null;\n}\n\nfunction stripReadSliceSuffix(value: string): string {\n\treturn value.replace(/:(\\d+)-(\\d+)$/, '');\n}\n\n// ---------------------------------------------------------------------------\n// Shell parsing helpers\n// ---------------------------------------------------------------------------\n\nfunction isIgnoredRedirectTarget(value: string): boolean {\n\treturn value === '/dev/null' || value === '/dev/stderr' || value === '/dev/stdout';\n}\n\nfunction extractRedirectWriteTargets(tokens: string[], actions: FileTrackingAction[]): void {\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\t\tif (token === '>' || token === '>>') {\n\t\t\tif (i + 1 < tokens.length && !isIgnoredRedirectTarget(tokens[i + 1])) {\n\t\t\t\tactions.push({ kind: 'touch', path: tokens[i + 1], operation: 'write' });\n\t\t\t}\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.startsWith('>>') && token.length > 2) {\n\t\t\tconst target = token.slice(2);\n\t\t\tif (!isIgnoredRedirectTarget(target)) {\n\t\t\t\tactions.push({ kind: 'touch', path: target, operation: 'write' });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.startsWith('>') && token.length > 1) {\n\t\t\tconst target = token.slice(1);\n\t\t\tif (!isIgnoredRedirectTarget(target)) {\n\t\t\t\tactions.push({ kind: 'touch', path: target, operation: 'write' });\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction looksLikeSedExpression(value: string): boolean {\n\treturn /^[sy]?\\/.+\\//.test(value) || /^\\d+[,\\d]*[acdipqs]?$/.test(value);\n}\n\nfunction stripRedirectTokens(tokens: string[]): string[] {\n\tconst result: string[] = [];\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tconst token = tokens[i];\n\t\tif (token === '>' || token === '>>' || token === '>|' || token === '<') {\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === '<<' || token === '<<-' || token === '<<~') {\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\ttoken.startsWith('>>') ||\n\t\t\ttoken.startsWith('>') ||\n\t\t\ttoken.startsWith('<<') ||\n\t\t\ttoken.startsWith('<')\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tresult.push(token);\n\t}\n\treturn result;\n}\n\nfunction stripHeredocBodies(cmd: string): string {\n\tconst lines = cmd.split('\\n');\n\tconst result: string[] = [];\n\tlet terminator: string | null = null;\n\tlet justClosedHeredoc = false;\n\tfor (const line of lines) {\n\t\tif (terminator !== null) {\n\t\t\tif (line.trim() === terminator) {\n\t\t\t\tterminator = null;\n\t\t\t\tjustClosedHeredoc = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst match = line.match(/<<-?\\s*(?:['\"]([\\w]+)['\"]|([\\w]+))/);\n\t\tif (match) terminator = match[1] ?? match[2];\n\t\tif (justClosedHeredoc) {\n\t\t\tresult.push(`; ${line}`);\n\t\t\tjustClosedHeredoc = false;\n\t\t} else result.push(line);\n\t}\n\treturn result.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Bash action parser\n// ---------------------------------------------------------------------------\n\nexport function parseBashActions(cmd: string): FileTrackingAction[] {\n\tconst actions: FileTrackingAction[] = [];\n\tfor (const tokens of splitShellCommands(stripHeredocBodies(cmd))) {\n\t\textractRedirectWriteTargets(tokens, actions);\n\t\tconst command = stripShellCommandWrappers(stripRedirectTokens(tokens));\n\t\tif (command.length === 0) continue;\n\n\t\tif (command[0] === 'git' && command[1] === 'mv') {\n\t\t\tconst operands = extractShellOperands(command.slice(2));\n\t\t\tif (operands.length === 2) actions.push({ kind: 'move', from: operands[0], to: operands[1] });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'git' && command[1] === 'rm') {\n\t\t\tfor (const operand of extractShellOperands(command.slice(2)))\n\t\t\t\tactions.push({ kind: 'touch', path: operand, operation: 'delete' });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'mv') {\n\t\t\tconst operands = extractShellOperands(command.slice(1));\n\t\t\tif (operands.length === 2) actions.push({ kind: 'move', from: operands[0], to: operands[1] });\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tcommand[0] === 'rm' ||\n\t\t\tcommand[0] === 'trash' ||\n\t\t\tcommand[0] === 'trash-put' ||\n\t\t\tcommand[0] === 'unlink'\n\t\t) {\n\t\t\tfor (const operand of extractShellOperands(command.slice(1)))\n\t\t\t\tactions.push({ kind: 'touch', path: operand, operation: 'delete' });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'sed') {\n\t\t\tif (command.some((t) => /^-[a-z]*i/.test(t))) {\n\t\t\t\tconst hasExplicitExpr = command.some((t) => t === '-e' || t === '-f');\n\t\t\t\tconst operands = extractShellOperands(command.slice(1));\n\t\t\t\tconst fileOperands = hasExplicitExpr ? operands : operands.slice(1);\n\t\t\t\tfor (const operand of fileOperands)\n\t\t\t\t\tif (!looksLikeSedExpression(operand))\n\t\t\t\t\t\tactions.push({ kind: 'touch', path: operand, operation: 'edit' });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'cp' || command[0] === 'rsync') {\n\t\t\tconst operands = extractShellOperands(command.slice(1));\n\t\t\tif (operands.length >= 2)\n\t\t\t\tactions.push({ kind: 'touch', path: operands[operands.length - 1], operation: 'write' });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'tee' || command[0] === 'touch') {\n\t\t\tfor (const operand of extractShellOperands(command.slice(1)))\n\t\t\t\tactions.push({ kind: 'touch', path: operand, operation: 'write' });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'patch') {\n\t\t\tconst operands = extractShellOperands(command.slice(1));\n\t\t\tif (operands.length > 0)\n\t\t\t\tactions.push({ kind: 'touch', path: operands[0], operation: 'edit' });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'curl') {\n\t\t\tfor (let i = 1; i < command.length; i++) {\n\t\t\t\tif ((command[i] === '-o' || command[i] === '--output') && i + 1 < command.length) {\n\t\t\t\t\tactions.push({ kind: 'touch', path: command[i + 1], operation: 'write' });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'wget') {\n\t\t\tfor (let i = 1; i < command.length; i++) {\n\t\t\t\tif ((command[i] === '-O' || command[i] === '--output-document') && i + 1 < command.length) {\n\t\t\t\t\tactions.push({ kind: 'touch', path: command[i + 1], operation: 'write' });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[0] === 'cat' || command[0] === 'head' || command[0] === 'tail') {\n\t\t\tfor (const operand of extractShellOperands(command.slice(1)))\n\t\t\t\tactions.push({ kind: 'touch', path: operand, operation: 'read' });\n\t\t}\n\t}\n\treturn actions;\n}\n\n// ---------------------------------------------------------------------------\n// rp_exec action parser\n// ---------------------------------------------------------------------------\n\nexport function parseRpExecActions(cmd: string): FileTrackingAction[] {\n\tconst normalized = cmd.trim();\n\tif (!normalized) return [];\n\tconst actions: FileTrackingAction[] = [];\n\n\tconst readFileArgs = extractJsonObject(normalized, 'call read_file');\n\tif (readFileArgs && typeof readFileArgs.path === 'string') {\n\t\tactions.push({\n\t\t\tkind: 'touch',\n\t\t\tpath: stripReadSliceSuffix(readFileArgs.path),\n\t\t\toperation: 'read',\n\t\t});\n\t}\n\n\tconst applyEditsArgs = extractJsonObject(normalized, 'call apply_edits');\n\tif (applyEditsArgs && typeof applyEditsArgs.path === 'string') {\n\t\tactions.push({ kind: 'touch', path: applyEditsArgs.path, operation: 'edit' });\n\t}\n\n\tconst fileActionsArgs = extractJsonObject(normalized, 'call file_actions');\n\tif (fileActionsArgs) {\n\t\tconst action = typeof fileActionsArgs.action === 'string' ? fileActionsArgs.action : '';\n\t\tconst targetPath = typeof fileActionsArgs.path === 'string' ? fileActionsArgs.path : null;\n\t\tconst newPath = typeof fileActionsArgs.new_path === 'string' ? fileActionsArgs.new_path : null;\n\t\tif (action === 'create' && targetPath)\n\t\t\tactions.push({ kind: 'touch', path: targetPath, operation: 'write' });\n\t\tif (action === 'delete' && targetPath)\n\t\t\tactions.push({ kind: 'touch', path: targetPath, operation: 'delete' });\n\t\tif (action === 'move' && targetPath && newPath)\n\t\t\tactions.push({ kind: 'move', from: targetPath, to: newPath });\n\t}\n\n\tif (commandStartsWith(normalized, 'apply_edits')) {\n\t\tconst targetPath = extractCliNamedArg(normalized, 'path');\n\t\tif (targetPath) actions.push({ kind: 'touch', path: targetPath, operation: 'edit' });\n\t}\n\n\tif (commandStartsWith(normalized, 'file_actions')) {\n\t\tconst action = extractCliNamedArg(normalized, 'action');\n\t\tconst targetPath = extractCliNamedArg(normalized, 'path');\n\t\tconst newPath = extractCliNamedArg(normalized, 'new_path');\n\t\tif (action === 'create' && targetPath)\n\t\t\tactions.push({ kind: 'touch', path: targetPath, operation: 'write' });\n\t\tif (action === 'delete' && targetPath)\n\t\t\tactions.push({ kind: 'touch', path: targetPath, operation: 'delete' });\n\t\tif (action === 'move' && targetPath && newPath)\n\t\t\tactions.push({ kind: 'move', from: targetPath, to: newPath });\n\t}\n\n\tfor (const command of splitShellCommands(normalized)) {\n\t\tif (command[0] !== 'file') continue;\n\t\tif (command[1] === 'delete') {\n\t\t\tfor (const operand of extractShellOperands(command.slice(2)))\n\t\t\t\tactions.push({ kind: 'touch', path: operand, operation: 'delete' });\n\t\t\tcontinue;\n\t\t}\n\t\tif (command[1] === 'move') {\n\t\t\tconst operands = extractShellOperands(command.slice(2));\n\t\t\tif (operands.length === 2) actions.push({ kind: 'move', from: operands[0], to: operands[1] });\n\t\t}\n\t}\n\n\tconst readPath = extractReadPathFromCliCommand(normalized);\n\tif (readPath) actions.push({ kind: 'touch', path: readPath, operation: 'read' });\n\treturn actions;\n}\n\n// ---------------------------------------------------------------------------\n// Tool action dispatcher\n// ---------------------------------------------------------------------------\n\nexport function getTrackedToolActions(\n\tname: string,\n\targs: Record<string, unknown>,\n): FileTrackingAction[] {\n\tif ((name === 'read' || name === 'write' || name === 'edit') && typeof args.path === 'string') {\n\t\treturn [{ kind: 'touch', path: args.path, operation: name as FileTouchOperation }];\n\t}\n\n\tif (name === 'rp') {\n\t\tconst rpCall = typeof args.call === 'string' ? args.call : null;\n\t\tconst rpArgs =\n\t\t\targs.args && typeof args.args === 'object' && !Array.isArray(args.args)\n\t\t\t\t? (args.args as Record<string, unknown>)\n\t\t\t\t: null;\n\t\tif (!rpCall || !rpArgs) return [];\n\t\tif (rpCall === 'read_file' && typeof rpArgs.path === 'string')\n\t\t\treturn [{ kind: 'touch', path: rpArgs.path, operation: 'read' }];\n\t\tif (rpCall === 'apply_edits' && typeof rpArgs.path === 'string')\n\t\t\treturn [{ kind: 'touch', path: rpArgs.path, operation: 'edit' }];\n\t\tif (rpCall === 'file_actions') {\n\t\t\tconst action = typeof rpArgs.action === 'string' ? rpArgs.action : '';\n\t\t\tif (action === 'create' && typeof rpArgs.path === 'string')\n\t\t\t\treturn [{ kind: 'touch', path: rpArgs.path, operation: 'write' }];\n\t\t\tif (action === 'delete' && typeof rpArgs.path === 'string')\n\t\t\t\treturn [{ kind: 'touch', path: rpArgs.path, operation: 'delete' }];\n\t\t\tif (\n\t\t\t\taction === 'move' &&\n\t\t\t\ttypeof rpArgs.path === 'string' &&\n\t\t\t\ttypeof rpArgs.new_path === 'string'\n\t\t\t)\n\t\t\t\treturn [{ kind: 'move', from: rpArgs.path, to: rpArgs.new_path }];\n\t\t}\n\t}\n\n\tif (name === 'rp_exec') {\n\t\tconst cmd = typeof args.command === 'string' ? args.command : '';\n\t\treturn parseRpExecActions(cmd);\n\t}\n\n\tif (name === 'bash') {\n\t\tconst command = typeof args.command === 'string' ? args.command : '';\n\t\treturn parseBashActions(command);\n\t}\n\n\treturn [];\n}\n"],"mappings":"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"}