diff --git a/src/gateway/handlers/agent.ts b/src/gateway/handlers/agent.ts index edc3c3e..0aebf80 100644 --- a/src/gateway/handlers/agent.ts +++ b/src/gateway/handlers/agent.ts @@ -37,6 +37,9 @@ export function createAgentHandlers(deps: AgentHandlerDeps) { // Enqueue the work — if the lane is idle it runs immediately, // otherwise it waits for earlier requests on the same session to finish. + const requestId = request.id.toString(); + deps.metrics?.startRequest(requestId, { sessionId: laneId, channel: 'ws' }); + return deps.laneQueue.enqueue(laneId, async () => { deps.sessionBridge.setBusy(connectionId, true); @@ -53,6 +56,17 @@ export function createAgentHandlers(deps: AgentHandlerDeps) { error: event.result.error, } : undefined, })); + // Record tool failures as error events + if (event.result && !event.result.success) { + deps.metrics?.incrementErrors(); + deps.metrics?.recordEvent({ + timestamp: Date.now(), + level: 'error', + source: 'tool', + message: `Tool '${event.tool}' failed: ${event.result.error ?? 'unknown error'}`, + context: { sessionId: laneId, tool: event.tool }, + }); + } } }); @@ -66,13 +80,23 @@ export function createAgentHandlers(deps: AgentHandlerDeps) { })); const response = await agent.process(params.message!, attachments); + deps.metrics?.incrementMessages(); send(makeEvent(request.id, 'done', { content: response })); } catch (err) { const message = err instanceof Error ? err.message : 'Unknown error'; + deps.metrics?.incrementErrors(); + deps.metrics?.recordEvent({ + timestamp: Date.now(), + level: 'error', + source: 'agent.send', + message, + context: { sessionId: laneId }, + }); send(makeEvent(request.id, 'error', { code: ErrorCode.InternalError, message })); } finally { deps.sessionBridge.setBusy(connectionId, false); deps.sessionBridge.setOnToolUse(connectionId, undefined); + deps.metrics?.endRequest(requestId); } }); },