mirror of
https://github.com/AgentSeal/codeburn.git
synced 2026-05-17 12:20:43 +00:00
Use strip-ansi (already in dep tree via Ink) in extractBashCommands to prevent terminal escape codes from leaking into dashboard bash breakdown keys. Route goose, gemini, qwen, and openclaw through extractBashCommands instead of inline split, which also gives them multi-command extraction (matching claude/codex/droid behavior).
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { basename } from 'path'
|
|
import stripAnsi from 'strip-ansi'
|
|
|
|
function stripQuotedStrings(command: string): string {
|
|
return command.replace(/"[^"]*"|'[^']*'/g, match => ' '.repeat(match.length))
|
|
}
|
|
|
|
export function extractBashCommands(rawCommand: string): string[] {
|
|
if (!rawCommand || !rawCommand.trim()) return []
|
|
|
|
const command = stripAnsi(rawCommand)
|
|
const stripped = stripQuotedStrings(command)
|
|
|
|
const separatorRegex = /\s*(?:&&|;|\|)\s*/g
|
|
const separators: Array<{ start: number; end: number }> = []
|
|
let match: RegExpExecArray | null
|
|
|
|
while ((match = separatorRegex.exec(stripped)) !== null) {
|
|
separators.push({ start: match.index, end: match.index + match[0].length })
|
|
}
|
|
|
|
const ranges: Array<[number, number]> = []
|
|
let cursor = 0
|
|
for (const sep of separators) {
|
|
ranges.push([cursor, sep.start])
|
|
cursor = sep.end
|
|
}
|
|
ranges.push([cursor, command.length])
|
|
|
|
const commands: string[] = []
|
|
for (const [start, end] of ranges) {
|
|
const segment = command.slice(start, end).trim()
|
|
if (!segment) continue
|
|
|
|
const tokens = segment.split(/\s+/)
|
|
let i = 0
|
|
while (i < tokens.length && /^\w+=/.test(tokens[i]!)) i++
|
|
const base = i < tokens.length ? basename(tokens[i]!) : ''
|
|
|
|
if (base && base !== 'cd' && base !== 'true' && base !== 'false') {
|
|
commands.push(base)
|
|
}
|
|
}
|
|
|
|
return commands
|
|
}
|