import { ConversationMessage, ConversationToolCall } from "../generated/graphql-types.js";
import { ContextManagementAction } from "./agent.js";
/**
 * Tool execution status for streaming
 */
export type ToolExecutionStatus = "preparing" | "executing" | "ready" | "completed" | "failed";
/**
 * Reasoning format types
 */
export type ReasoningFormat = "thinking_tag" | "markdown" | "custom";
/**
 * Context window usage event - emitted at start of agent interaction
 */
export type ContextWindowEvent = {
    type: "context_window";
    usage: {
        usedTokens: number;
        maxTokens: number;
        percentage: number;
        remainingTokens: number;
    };
    timestamp: Date;
};
/**
 * Structured reasoning/thinking metadata.
 * Provides a canonical representation across all providers so the UI
 * can decide whether and how to render model reasoning.
 */
export type ReasoningMetadata = {
    content: string;
    format: ReasoningFormat;
    signature?: string;
};
/**
 * Extended conversation message with additional streaming metadata
 */
export type StreamingConversationMessage = Partial<ConversationMessage> & {
    message: string;
    modelName?: string;
    isThinking?: boolean;
    thinkingContent?: string;
};
/**
 * Simplified UI-focused streaming events using GraphQL types
 */
export type AgentStreamEvent = {
    type: "conversation_started";
    conversationId: string;
    timestamp: Date;
    model?: string;
} | {
    type: "conversation_queued";
    conversationId: string;
    timestamp: Date;
} | {
    type: "conversation_cancelled";
    conversationId: string;
    timestamp: Date;
} | ContextWindowEvent | {
    type: "context_management";
    action: ContextManagementAction;
    usage: {
        usedTokens: number;
        maxTokens: number;
        percentage: number;
        remainingTokens: number;
    };
    timestamp: Date;
} | {
    type: "message_update";
    message: StreamingConversationMessage;
    isStreaming: boolean;
    reasoning?: ReasoningMetadata;
    metrics?: {
        ttft?: number;
        elapsedTime: number;
        conversationDuration: number;
        tokenCount?: number;
        avgTokenDelay?: number;
        streamingThroughput?: number;
    };
} | {
    type: "tool_update";
    toolCall: ConversationToolCall;
    status: ToolExecutionStatus;
    timestamp?: Date;
    startedAt?: string;
    completedAt?: string;
    durationMs?: number;
    failedAt?: string;
    result?: unknown;
    error?: string;
} | {
    type: "reasoning_update";
    content: string;
    format: ReasoningFormat;
    isComplete: boolean;
} | {
    type: "conversation_completed";
    message: StreamingConversationMessage;
    reasoning?: ReasoningMetadata;
    metrics?: {
        ttft?: number;
        totalTime: number;
        conversationDuration: number;
        tokenCount?: number;
        llmTokens?: number;
        avgTokenDelay?: number;
        streamingThroughput?: number;
    };
    contextWindow?: {
        usedTokens: number;
        maxTokens: number;
        percentage: number;
        remainingTokens: number;
    };
    usage?: {
        promptTokens: number;
        completionTokens: number;
        totalTokens: number;
        model?: string;
        provider?: string;
        cachedInputTokens?: number;
        cacheCreationInputTokens?: number;
        cacheReadInputTokens?: number;
        metadata?: Record<string, unknown>;
    };
} | {
    type: "error";
    error: {
        message: string;
        code?: string;
        recoverable?: boolean;
    };
    conversationId: string;
    timestamp: Date;
};
