Skip to content

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: 20
  • timeout: 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:

NameTypeDescription
failureCaseFailureCaseThe failure case to fix
workDirstringWorking directory (repository root)
previousAttemptsArrayPrevious fix attempts for context
artifactsObjectAdditional 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): void

getVerbosity()

Get current verbosity level.

getVerbosity(): VerbosityLevel

Events

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:

ToolDescription
ReadRead file contents
EditMake targeted code edits
WriteWrite new files
GlobFind files by pattern
GrepSearch file contents
BashRun shell commands (restricted)

Bash Restrictions

For security, certain Bash commands are blocked:

  • rm -rf, rm -r /
  • sudo, chmod, chown
  • mkfs, dd
  • Pipe to shell (curl | sh)

Allowed commands include:

  • cat, ls, pwd, echo, grep, find
  • npm 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 events
fixer.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 case
const failureCase = JSON.parse(
await readFile('./failure-case.json', 'utf-8')
);
// Load artifacts
const screenshot = await readFile('./artifacts/screenshot.png');
const dom = await readFile('./artifacts/dom.html', 'utf-8');
// Run the fix
const 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