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.
This commit is contained in:
luccast
2026-01-26 08:23:20 -05:00
parent bc0b610e72
commit 54a0a23359
2 changed files with 36 additions and 4 deletions
+35 -4
View File
@@ -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<MonitorSession>; 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
+1
View File
@@ -81,6 +81,7 @@ export interface AgentEvent {
stream: string
ts: number
data: Record<string, unknown>
sessionKey?: string
}
// Sessions