import type { Platform } from '../conversation/types'; export interface BaseEvent { traceId: string; timestamp: Date; } export interface TaskStartEvent extends BaseEvent { agentRef: string; message: string; mode: 'query' | 'execute'; pid?: number; model?: string; provider?: string; codingAgentCommand?: string; renderedPrompt?: string; metadata?: Record; threadId?: string; platform?: Platform; workspaceId?: string; workspaceName?: string; parentTaskId?: string | null; rootTraceId?: string; callerAgentId?: string | null; } export interface TaskEndEvent extends BaseEvent { agentRef: string; mode: 'query' | 'execute'; result?: string; durationMs: number; error?: { code: string; message: string; }; exitCode?: number; inputTokens?: number; outputTokens?: number; cachedInputTokens?: number; costUsd?: number; model?: string; metadata?: Record; } export interface TaskOutputEvent extends BaseEvent { agentRef: string; output: string; level?: 'stdout' | 'stderr' | 'info'; } export interface ToolBeforeEvent extends BaseEvent { agentRef: string; agentId: string; threadId: string; sessionId: string; provider: string; tool: { name: string; rawName: string; input: unknown; toolUseId?: string; }; } export interface ToolAfterEvent extends BaseEvent { agentRef: string; agentId: string; threadId: string; sessionId: string; provider: string; tool: { name: string; rawName: string; toolUseId?: string; result?: string; isError?: boolean; }; } export interface AdapterLifecycleEvent { adapterId: string; instanceId: string; state: 'starting' | 'started' | 'stopping' | 'stopped' | 'failed'; error?: Error; timestamp: Date; } export interface AdapterMessageEvent { adapterId: string; instanceId: string; direction: 'inbound' | 'outbound'; messageId: string; threadId: string; timestamp: Date; } export interface CrewxEvents { 'task:start': TaskStartEvent; 'task:end': TaskEndEvent; 'task:output': TaskOutputEvent; 'tool:observed:before': ToolBeforeEvent; 'tool:observed:after': ToolAfterEvent; 'adapter:lifecycle': AdapterLifecycleEvent; 'adapter:message': AdapterMessageEvent; } export type CrewxEventName = keyof CrewxEvents; export type CrewxEventPayload = CrewxEvents[K]; export type UnsubscribeFn = () => void;