1- import fs from 'fs'
2- import path from 'path'
31import { execSync } from 'child_process'
42import { promisify } from 'util'
53import { exec } from 'child_process'
@@ -11,17 +9,15 @@ import { CodebuffClient } from '@codebuff/sdk'
119import { withTestRepo } from '../subagents/test-repo-utils'
1210import { ClaudeRunner } from './runners/claude'
1311import { CodexRunner } from './runners/codex'
12+ import { CodebuffRunner } from './runners/codebuff'
1413
15- import type { PrintModeEvent } from '@codebuff/common/types/print-mode'
1614import type { EvalCommitV2 , FinalCheckOutput } from './types'
17- import type { Runner } from './runners/runner'
15+ import type { Runner , AgentStep } from './runners/runner'
1816
19- export type AgentStep = PrintModeEvent
17+ export type { AgentStep }
2018
2119export type ExternalAgentType = 'claude' | 'codex'
2220
23- const DEBUG_ERROR = true
24-
2521export async function runAgentOnCommit ( {
2622 client,
2723 agentId,
@@ -73,78 +69,34 @@ export async function runAgentOnCommit({
7369 env,
7470 } ,
7571 async ( repoDir ) => {
76- // Use external CLI runner if specified
77- if ( externalAgentType ) {
78- const runner : Runner =
79- externalAgentType === 'claude'
80- ? new ClaudeRunner ( repoDir , env )
81- : new CodexRunner ( repoDir , env )
82-
83- console . log (
84- `[${ commit . id } ] Running external agent: ${ externalAgentType } ` ,
85- )
86-
87- const result = await runner . run ( commit . prompt )
88- trace . push ( ...result . steps )
89- cost = result . totalCostUsd
90- diff = result . diff
72+ // Select the appropriate runner
73+ let runner : Runner
74+ if ( externalAgentType === 'claude' ) {
75+ runner = new ClaudeRunner ( repoDir , env )
76+ } else if ( externalAgentType === 'codex' ) {
77+ runner = new CodexRunner ( repoDir , env )
9178 } else {
92- // Use Codebuff client
93- const maxAgentSteps = 40
94- const result = await client . run ( {
95- agent : agentId ,
96- prompt : commit . prompt ,
97- agentDefinitions : localAgentDefinitions ,
79+ runner = new CodebuffRunner ( {
9880 cwd : repoDir ,
9981 env,
100- maxAgentSteps,
101- handleEvent : ( event ) => {
102- if (
103- ( event . type === 'tool_call' || event . type === 'tool_result' ) &&
104- event . toolName === 'set_messages'
105- ) {
106- return
107- }
108- if ( event . type === 'error' ) {
109- console . error (
110- `[${ commit . id } :${ agentId } ] Error event:` ,
111- event . message ,
112- )
113- if ( DEBUG_ERROR && ! event . message . startsWith ( 'Invalid JSON' ) ) {
114- // Save errors in a file, but not tool calls with invalid json.
115- fs . writeFileSync (
116- path . join (
117- __dirname ,
118- `${ commit . id } -${ agentId } -error-${ Math . random ( ) . toString ( 36 ) . substring ( 2 , 6 ) } .json` ,
119- ) ,
120- JSON . stringify (
121- {
122- error : event . message ,
123- trace : trace ,
124- } ,
125- null ,
126- 2 ,
127- ) ,
128- )
129- }
130- } else if ( printEvents ) {
131- console . log (
132- `[${ commit . id } :${ agentId } ]` ,
133- JSON . stringify ( event , null , 2 ) ,
134- )
135- }
136- trace . push ( event )
137- } ,
138- } )
139- cost = ( result . sessionState ?. mainAgentState . creditsUsed ?? 0 ) / 100
140-
141- execSync ( 'git add .' , { cwd : repoDir , stdio : 'ignore' } )
142- diff = execSync ( `git diff ${ commit . parentSha } ` , {
143- cwd : repoDir ,
144- encoding : 'utf-8' ,
82+ client,
83+ agentId,
84+ localAgentDefinitions,
85+ printEvents,
86+ commitId : commit . id ,
87+ parentSha : commit . parentSha ,
14588 } )
14689 }
14790
91+ console . log (
92+ `[${ commit . id } ] Running agent: ${ externalAgentType || 'codebuff' } ` ,
93+ )
94+
95+ const result = await runner . run ( commit . prompt )
96+ trace . push ( ...result . steps )
97+ cost = result . totalCostUsd
98+ diff = result . diff
99+
148100 const contextFilePaths = new Set < string > ( [
149101 ...commit . supplementalFiles ,
150102 ...commit . fileDiffs . map ( ( fd ) => fd . path ) ,
0 commit comments