AgentFixer
AgentFixer
Low-level class for direct interaction with Claude Agent for fixing failures.
Import
import { AgentFixer } from '@korvol/fixwright';Constructor
constructor(config?: AgentFixerConfig)Parameters:
interface AgentFixerConfig { /** Claude model to use */ model?: string;
/** Maximum tool interaction turns */ maxTurns?: number;
/** Timeout in milliseconds */ timeout?: number;
/** Verbosity level */ verbosity?: VerbosityLevel;}Defaults:
model:'claude-sonnet-4-20250514'maxTurns:20timeout:300000(5 minutes)verbosity:'normal'
Example:
const fixer = new AgentFixer({ model: 'claude-sonnet-4-20250514', maxTurns: 30, timeout: 600000, verbosity: 'verbose',});Methods
fix(failureCase, workDir, previousAttempts?, artifacts?)
Attempt to fix a failure case using Claude Agent.
async fix( failureCase: FailureCase, workDir: string, previousAttempts?: { analysis: string; fix: string; result: string }[], artifacts?: { screenshot?: Buffer; dom?: string; consoleLogs?: string; }): Promise<AgentFixResult>Parameters:
| Name | Type | Description |
|---|---|---|
failureCase | FailureCase | The failure case to fix |
workDir | string | Working directory (repository root) |
previousAttempts | Array | Previous fix attempts for context |
artifacts | Object | Additional artifacts |
Returns: Promise<AgentFixResult>
interface AgentFixResult { success: boolean; analysis?: FailureAnalysis; proposedFix?: ProposedFix; sessionId?: string; error?: string; totalCostUsd?: number; duration?: number; edits?: EditInfo[];}Example:
const fixer = new AgentFixer();
const result = await fixer.fix( failureCase, '/path/to/repo', [], // No previous attempts { screenshot: screenshotBuffer, dom: domString, consoleLogs: logsString, });
if (result.success) { console.log('Analysis:', result.analysis); console.log('Fix:', result.proposedFix); console.log('Edits:', result.edits);}setVerbosity(level)
Set verbosity level.
setVerbosity(level: VerbosityLevel): voidgetVerbosity()
Get current verbosity level.
getVerbosity(): VerbosityLevelEvents
AgentFixer extends EventEmitter:
Raw Events (Always Emitted)
fixer.on('agent:message', (message: SDKMessage) => void);fixer.on('agent:error', (error: Error) => void);Verbose Events (Based on Verbosity)
fixer.on('agent:thinking', (text: string) => void);fixer.on('agent:text', (text: string) => void);fixer.on('agent:tool_use', (toolName: string, input: unknown) => void);fixer.on('agent:tool_result', (toolName: string, result: unknown) => void);Tool Events (Verbose Mode Only)
fixer.on('agent:read', (info: ReadInfo) => void);fixer.on('agent:edit', (info: EditInfo) => void);fixer.on('agent:bash', (info: BashInfo) => void);fixer.on('agent:grep', (info: GrepInfo) => void);fixer.on('agent:glob', (info: GlobInfo) => void);Status Events
fixer.on('agent:start', () => void);fixer.on('agent:complete', (result: AgentFixResult) => void);Event Data Types
EditInfo
interface EditInfo { filePath: string; oldString: string; newString: string; timestamp: Date;}ReadInfo
interface ReadInfo { filePath: string; linesRead?: number; timestamp: Date;}BashInfo
interface BashInfo { command: string; description?: string; timestamp: Date;}GrepInfo
interface GrepInfo { pattern: string; path?: string; glob?: string; timestamp: Date;}GlobInfo
interface GlobInfo { pattern: string; path?: string; timestamp: Date;}Available Tools
Claude has access to these tools:
| Tool | Description |
|---|---|
Read | Read file contents |
Edit | Make targeted code edits |
Write | Write new files |
Glob | Find files by pattern |
Grep | Search file contents |
Bash | Run shell commands (restricted) |
Bash Restrictions
For security, certain Bash commands are blocked:
rm -rf,rm -r /sudo,chmod,chownmkfs,dd- Pipe to shell (
curl | sh)
Allowed commands include:
cat,ls,pwd,echo,grep,findnpm test,npm run,npx,pnpm,yarn,node
Complete Example
import { AgentFixer } from '@korvol/fixwright';import { readFile } from 'fs/promises';
const fixer = new AgentFixer({ model: 'claude-sonnet-4-20250514', maxTurns: 20, verbosity: 'verbose',});
// Listen to eventsfixer.on('agent:start', () => { console.log('Agent starting...');});
fixer.on('agent:thinking', (text) => { console.log('Thinking:', text.slice(0, 100));});
fixer.on('agent:tool_use', (tool, input) => { console.log(`Using ${tool}:`, JSON.stringify(input).slice(0, 100));});
fixer.on('agent:edit', (info) => { console.log(`Editing ${info.filePath}:`); console.log(` - ${info.oldString.slice(0, 50)}...`); console.log(` + ${info.newString.slice(0, 50)}...`);});
fixer.on('agent:complete', (result) => { console.log('Agent complete'); console.log('Cost:', result.totalCostUsd); console.log('Duration:', result.duration, 'ms');});
// Load failure caseconst failureCase = JSON.parse( await readFile('./failure-case.json', 'utf-8'));
// Load artifactsconst screenshot = await readFile('./artifacts/screenshot.png');const dom = await readFile('./artifacts/dom.html', 'utf-8');
// Run the fixconst result = await fixer.fix( failureCase, process.cwd(), [], { screenshot, dom });
if (result.success) { console.log('\nFix successful!'); console.log('Analysis:', result.analysis); console.log('\nEdits made:'); for (const edit of result.edits || []) { console.log(` ${edit.filePath}`); }} else { console.log('Fix failed:', result.error);}See Also
- FixWright Class - High-level API
- AI Configuration - Configure Claude
- Types - All type definitions