@@ -76,10 +76,12 @@ function cleanAnsi(text: string, plainLogs: boolean): string {
7676 return text . replace ( ANSI_ESCAPE_SEQUENCE , '' ) ;
7777}
7878
79- function formatToolUse ( part : any , plainLogs : boolean ) : string {
80- const tool = part ?. tool ?? 'tool' ;
79+ function formatToolUse ( part : unknown , plainLogs : boolean ) : string {
80+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81+ const partObj = ( typeof part === 'object' && part !== null ? part : { } ) as Record < string , any > ;
82+ const tool = partObj ?. tool ?? 'tool' ;
8183 const base = formatCommand ( tool , 'success' ) ;
82- const state = part ?. state ?? { } ;
84+ const state = partObj ?. state ?? { } ;
8385
8486 if ( tool === 'bash' ) {
8587 const outputRaw =
@@ -108,15 +110,17 @@ function formatToolUse(part: any, plainLogs: boolean): string {
108110 return base ;
109111}
110112
111- function formatStepEvent ( type : string , part : any ) : string | null {
112- const reason = typeof part ?. reason === 'string' ? part . reason : undefined ;
113+ function formatStepEvent ( type : string , part : unknown ) : string | null {
114+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
115+ const partObj = ( typeof part === 'object' && part !== null ? part : { } ) as Record < string , any > ;
116+ const reason = typeof partObj ?. reason === 'string' ? partObj . reason : undefined ;
113117
114118 // Only show final step (reason: 'stop'), skip intermediate steps (reason: 'tool-calls')
115119 if ( reason !== 'stop' ) {
116120 return null ;
117121 }
118122
119- const tokens = part ?. tokens ;
123+ const tokens = partObj ?. tokens ;
120124 if ( ! tokens ) {
121125 return null ;
122126 }
@@ -128,14 +132,16 @@ function formatStepEvent(type: string, part: any): string | null {
128132 return tokenSummary ;
129133}
130134
131- function formatErrorEvent ( error : any , plainLogs : boolean ) : string {
135+ function formatErrorEvent ( error : unknown , plainLogs : boolean ) : string {
136+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
137+ const errorObj = ( typeof error === 'object' && error !== null ? error : { } ) as Record < string , any > ;
132138 const dataMessage =
133- typeof error ?. data ?. message === 'string'
134- ? error . data . message
135- : typeof error ?. message === 'string'
136- ? error . message
137- : typeof error ?. name === 'string'
138- ? error . name
139+ typeof errorObj ?. data ?. message === 'string'
140+ ? errorObj . data . message
141+ : typeof errorObj ?. message === 'string'
142+ ? errorObj . message
143+ : typeof errorObj ?. name === 'string'
144+ ? errorObj . name
139145 : 'OpenCode reported an unknown error' ;
140146
141147 const cleaned = cleanAnsi ( dataMessage , plainLogs ) ;
@@ -184,7 +190,7 @@ export async function runOpenCode(options: RunOpenCodeOptions): Promise<RunOpenC
184190 return ;
185191 }
186192
187- let parsed : any ;
193+ let parsed : unknown ;
188194 try {
189195 parsed = JSON . parse ( line ) ;
190196 } catch {
@@ -208,10 +214,17 @@ export async function runOpenCode(options: RunOpenCodeOptions): Promise<RunOpenC
208214 }
209215 }
210216
217+ // Type guard for parsed JSON
218+ if ( typeof parsed !== 'object' || parsed === null ) {
219+ return ;
220+ }
221+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
222+ const parsedObj = parsed as Record < string , any > ;
223+
211224 let formatted : string | null = null ;
212- switch ( parsed . type ) {
225+ switch ( parsedObj . type ) {
213226 case 'tool_use' :
214- formatted = formatToolUse ( parsed . part , plainLogs ) ;
227+ formatted = formatToolUse ( parsedObj . part , plainLogs ) ;
215228 break ;
216229 case 'step_start' :
217230 if ( isFirstStep ) {
@@ -221,10 +234,10 @@ export async function runOpenCode(options: RunOpenCodeOptions): Promise<RunOpenC
221234 // Subsequent step_start events are silent
222235 break ;
223236 case 'step_finish' :
224- formatted = formatStepEvent ( parsed . type , parsed . part ) ;
237+ formatted = formatStepEvent ( parsedObj . type , parsedObj . part ) ;
225238 break ;
226239 case 'text' : {
227- const textPart = parsed . part ;
240+ const textPart = parsedObj . part ;
228241 const textValue =
229242 typeof textPart ?. text === 'string'
230243 ? cleanAnsi ( textPart . text , plainLogs )
@@ -233,7 +246,7 @@ export async function runOpenCode(options: RunOpenCodeOptions): Promise<RunOpenC
233246 break ;
234247 }
235248 case 'error' :
236- formatted = formatErrorEvent ( parsed . error , plainLogs ) ;
249+ formatted = formatErrorEvent ( parsedObj . error , plainLogs ) ;
237250 break ;
238251 default :
239252 break ;
0 commit comments