From 54a0a233595ea4068ff9ed5263ef27c69aacded0 Mon Sep 17 00:00:00 2001 From: luccast <2213102+luccast@users.noreply.github.com> Date: Mon, 26 Jan 2026 08:23:20 -0500 Subject: [PATCH] Enhance agent event handling in Clawdbot integration - Added support for lifecycle events in the agentEventToAction function, distinguishing between 'start' and 'end' phases. - Updated sessionKey handling to prioritize the event's sessionKey over the stream. - Implemented filtering to skip system events and assistant streams in parseEventFrame, focusing on lifecycle events for session management. - Introduced session status updates based on event phases, improving session tracking. --- src/integrations/clawdbot/parser.ts | 39 ++++++++++++++++++++++++--- src/integrations/clawdbot/protocol.ts | 1 + 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/integrations/clawdbot/parser.ts b/src/integrations/clawdbot/parser.ts index a0764f7..fc3101a 100644 --- a/src/integrations/clawdbot/parser.ts +++ b/src/integrations/clawdbot/parser.ts @@ -84,7 +84,16 @@ export function agentEventToAction(event: AgentEvent): MonitorAction { let toolName: string | undefined let toolArgs: unknown | undefined - if (data.type === 'tool_use') { + // Handle lifecycle events + if (event.stream === 'lifecycle') { + if (data.phase === 'start') { + type = 'delta' + content = 'Agent run started' + } else if (data.phase === 'end') { + type = 'final' + content = 'Agent run completed' + } + } else if (data.type === 'tool_use') { type = 'tool_call' toolName = String(data.name || 'unknown') toolArgs = data.input @@ -100,7 +109,8 @@ export function agentEventToAction(event: AgentEvent): MonitorAction { return { id: `${event.runId}-${event.seq}`, runId: event.runId, - sessionKey: event.stream, + // Use sessionKey from event if available, fallback to stream + sessionKey: event.sessionKey || event.stream, seq: event.seq, type, eventType: 'agent' as const, @@ -114,6 +124,11 @@ export function agentEventToAction(event: AgentEvent): MonitorAction { export function parseEventFrame( frame: EventFrame ): { session?: Partial; action?: MonitorAction } | null { + // Skip system events + if (frame.event === 'health' || frame.event === 'tick') { + return null + } + if (frame.event === 'chat' && frame.payload) { const chatEvent = frame.payload as ChatEvent return { @@ -128,9 +143,25 @@ export function parseEventFrame( if (frame.event === 'agent' && frame.payload) { const agentEvent = frame.payload as AgentEvent - return { - action: agentEventToAction(agentEvent), + + // Skip assistant stream - it duplicates chat events + if (agentEvent.stream === 'assistant') { + return null } + + // Only process lifecycle events (start/end markers) + if (agentEvent.stream === 'lifecycle') { + return { + action: agentEventToAction(agentEvent), + session: agentEvent.sessionKey ? { + key: agentEvent.sessionKey, + status: agentEvent.data?.phase === 'start' ? 'thinking' : 'active', + lastActivityAt: Date.now(), + } : undefined, + } + } + + return null } return null diff --git a/src/integrations/clawdbot/protocol.ts b/src/integrations/clawdbot/protocol.ts index 875fc98..1e2625a 100644 --- a/src/integrations/clawdbot/protocol.ts +++ b/src/integrations/clawdbot/protocol.ts @@ -81,6 +81,7 @@ export interface AgentEvent { stream: string ts: number data: Record + sessionKey?: string } // Sessions