import type { AgentSession } from "@earendil-works/pi-coding-agent";
import type { PartialReplyPayload, SourceReplyDeliveryMode } from "../auto-reply/get-reply-options.types.js";
import type { ReplyPayload } from "../auto-reply/reply-payload.js";
import type { ReasoningLevel, ThinkLevel, VerboseLevel } from "../auto-reply/thinking.js";
import type { DaoCoreConfig } from "../config/types.daocore.js";
import type { HookRunner } from "../plugins/hooks.js";
import type { AgentInternalEvent } from "./internal-events.js";
import type { BlockReplyPayload } from "./pi-embedded-payloads.js";
import type { EmbeddedRunReplayState } from "./pi-embedded-runner/replay-state.js";
import type { BlockReplyChunking, ToolProgressDetailMode, ToolResultFormat } from "./pi-embedded-subscribe.shared-types.js";
export type { BlockReplyChunking, ToolProgressDetailMode, ToolResultFormat, } from "./pi-embedded-subscribe.shared-types.js";
export type SubscribeEmbeddedPiSessionParams = {
    session: AgentSession;
    runId: string;
    initialReplayState?: EmbeddedRunReplayState;
    hookRunner?: HookRunner;
    verboseLevel?: VerboseLevel;
    reasoningMode?: ReasoningLevel;
    thinkingLevel?: ThinkLevel;
    toolResultFormat?: ToolResultFormat;
    toolProgressDetail?: ToolProgressDetailMode;
    shouldEmitToolResult?: () => boolean;
    shouldEmitToolOutput?: () => boolean;
    sourceReplyDeliveryMode?: SourceReplyDeliveryMode;
    onToolResult?: (payload: ReplyPayload) => void | Promise<void>;
    onReasoningStream?: (payload: {
        text?: string;
        mediaUrls?: string[];
    }) => void | Promise<void>;
    /** Called when a thinking/reasoning block ends (</think> tag processed). */
    onReasoningEnd?: () => void | Promise<void>;
    onBlockReply?: (payload: BlockReplyPayload) => void | Promise<void>;
    /** Flush pending block replies (e.g., before tool execution to preserve message boundaries). */
    onBlockReplyFlush?: () => void | Promise<void>;
    blockReplyBreak?: "text_end" | "message_end";
    blockReplyChunking?: BlockReplyChunking;
    onPartialReply?: (payload: PartialReplyPayload) => void | Promise<void>;
    onAssistantMessageStart?: () => void | Promise<void>;
    onExecutionPhase?: (info: {
        phase: "tool_execution_started";
        tool?: string;
        toolCallId?: string;
        source?: string;
    }) => void;
    onAgentEvent?: (evt: {
        stream: string;
        data: Record<string, unknown>;
        sessionKey?: string;
    }) => void | Promise<void>;
    terminalLifecyclePhase?: "end" | "finishing";
    /** Best-effort hook invoked immediately before the terminal lifecycle event is emitted. */
    onBeforeLifecycleTerminal?: () => void | Promise<void>;
    enforceFinalTag?: boolean;
    silentExpected?: boolean;
    config?: DaoCoreConfig;
    sessionKey?: string;
    /** Ephemeral session UUID — regenerated on /new and /reset. */
    sessionId?: string;
    /** Agent identity for hook context — resolved from session config in attempt.ts. */
    agentId?: string;
    /**
     * Exact raw names of non-plugin DaoCore tools registered for this run.
     * When provided, MEDIA: passthrough requires an exact match instead of only
     * a normalized-name collision with a trusted built-in.
     */
    builtinToolNames?: ReadonlySet<string>;
    internalEvents?: AgentInternalEvent[];
};
