show chat run errors as agent messages (#887)
This commit is contained in:
@@ -467,6 +467,18 @@ export function disconnectChatRun(): void {
|
||||
}
|
||||
}
|
||||
|
||||
function removeSocketListener(socket: Socket, event: string, handler: (...args: any[]) => void): void {
|
||||
const candidate = socket as Socket & {
|
||||
off?: (event: string, handler: (...args: any[]) => void) => Socket
|
||||
removeListener?: (event: string, handler: (...args: any[]) => void) => Socket
|
||||
}
|
||||
if (typeof candidate.off === 'function') {
|
||||
candidate.off(event, handler)
|
||||
return
|
||||
}
|
||||
candidate.removeListener?.(event, handler)
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a chat run via Socket.IO and stream events back.
|
||||
* Returns an AbortController-compatible handle for cancellation.
|
||||
@@ -500,6 +512,23 @@ export function startRunViaSocket(
|
||||
|
||||
let closed = false
|
||||
const socket = connectChatRun()
|
||||
const handleSocketError = (err: Error) => {
|
||||
if (closed) return
|
||||
closed = true
|
||||
sessionEventHandlers.delete(sid)
|
||||
onError(err)
|
||||
}
|
||||
socket.once('connect_error', handleSocketError)
|
||||
const handleSocketDisconnect = (reason: string) => {
|
||||
if (closed || reason === 'io client disconnect') return
|
||||
handleSocketError(new Error(`Socket disconnected: ${reason}`))
|
||||
}
|
||||
socket.once('disconnect', handleSocketDisconnect)
|
||||
|
||||
const removeTerminalSocketListeners = () => {
|
||||
removeSocketListener(socket, 'connect_error', handleSocketError)
|
||||
removeSocketListener(socket, 'disconnect', handleSocketDisconnect)
|
||||
}
|
||||
|
||||
if (sessionEventHandlers.has(sid)) {
|
||||
socket.emit('run', body)
|
||||
@@ -548,6 +577,7 @@ export function startRunViaSocket(
|
||||
onEvent(evt)
|
||||
if ((evt as any).queue_remaining > 0) return
|
||||
closed = true
|
||||
removeTerminalSocketListeners()
|
||||
onDone()
|
||||
},
|
||||
onRunFailed: (evt: RunEvent) => {
|
||||
@@ -555,7 +585,8 @@ export function startRunViaSocket(
|
||||
onEvent(evt)
|
||||
if ((evt as any).queue_remaining > 0) return
|
||||
closed = true
|
||||
onError(new Error(evt.error || 'Run failed'))
|
||||
removeTerminalSocketListeners()
|
||||
onDone()
|
||||
},
|
||||
onCompressionStarted: (evt: RunEvent) => {
|
||||
if (closed) return
|
||||
@@ -574,6 +605,7 @@ export function startRunViaSocket(
|
||||
onEvent(evt)
|
||||
if ((evt as any).queue_length > 0) return
|
||||
closed = true
|
||||
removeTerminalSocketListeners()
|
||||
onDone()
|
||||
},
|
||||
onUsageUpdated: (evt: RunEvent) => {
|
||||
@@ -585,6 +617,7 @@ export function startRunViaSocket(
|
||||
onEvent(evt)
|
||||
if ((evt as any).terminal === false) return
|
||||
closed = true
|
||||
removeTerminalSocketListeners()
|
||||
sessionEventHandlers.delete(sid)
|
||||
onDone()
|
||||
},
|
||||
|
||||
@@ -34,7 +34,7 @@ export interface ChatMessage {
|
||||
tool_call_id?: string | null
|
||||
tool_calls?: any[] | null
|
||||
tool_name?: string | null
|
||||
finish_reason?: string | null
|
||||
finish_reason?: 'streaming' | 'tool_calls' | 'error' | string | null
|
||||
reasoning?: string | null
|
||||
reasoning_details?: string | null
|
||||
reasoning_content?: string | null
|
||||
|
||||
Reference in New Issue
Block a user