50 lines
2.0 KiB
TypeScript
50 lines
2.0 KiB
TypeScript
/**
|
|
* Internal shell-quoting and sandbox-result classification helpers.
|
|
*
|
|
* @module @deepseek-ai/dsh-bash-sandbox/helpers
|
|
*/
|
|
|
|
import type { BashRunResult } from '@deepseek-ai/dsh-bash'
|
|
|
|
/**
|
|
* Quote one string as a single-quoted POSIX shell word.
|
|
* @param text - raw argv element to preserve through the outer shell parse.
|
|
* @returns the quoted shell word.
|
|
*/
|
|
export function shellQuote(text: string): string {
|
|
return `'${text.replaceAll("'", String.raw`'\''`)}'`
|
|
}
|
|
|
|
/**
|
|
* Classify a failed run against the selected backend's denial dialect.
|
|
* @param result - settled foreground run.
|
|
* @param signatures - case-insensitive denial substrings from the active wrap.
|
|
* @returns whether the failed run matches that denial dialect.
|
|
*/
|
|
export function classifyDenial(result: BashRunResult, signatures: readonly string[]): boolean {
|
|
return matchesSignature(result.exitCode, result.stderr.text, signatures)
|
|
}
|
|
|
|
/**
|
|
* Classify a failed run against the selected backend's runner-failure dialect.
|
|
* @param result - settled foreground run.
|
|
* @param signatures - case-insensitive runner-failure substrings from the active wrap.
|
|
* @returns whether the failed run matches that runner-failure dialect.
|
|
*/
|
|
export function classifyRunnerFailure(result: BashRunResult, signatures: readonly string[]): boolean {
|
|
return matchesSignature(result.exitCode, result.stderr.text, signatures)
|
|
}
|
|
|
|
/**
|
|
* Match a non-zero exit against case-insensitive stderr signatures.
|
|
* @param exitCode - process exit code; null means signal termination.
|
|
* @param stderr - collected stderr text.
|
|
* @param signatures - substrings identifying the selected backend's dialect.
|
|
* @returns whether this is a non-zero exit whose stderr matches a signature.
|
|
*/
|
|
export function matchesSignature(exitCode: number | null, stderr: string, signatures: readonly string[]): boolean {
|
|
if (exitCode === null || exitCode === 0) return false
|
|
const lowered = stderr.toLowerCase()
|
|
return signatures.some(signature => lowered.includes(signature.toLowerCase()))
|
|
}
|