import type { ImageContent } from "@mariozechner/pi-ai";
import type { ReasoningLevel, ThinkLevel, VerboseLevel } from "../../../auto-reply/thinking.js";
import type { AgentStreamParams } from "../../../commands/agent/types.js";
import type { SymiConfig } from "../../../config/config.js";
import type { enqueueCommand } from "../../../process/command-queue.js";
import type { InputProvenance } from "../../../sessions/input-provenance.js";
import type { ExecElevatedDefaults, ExecToolDefaults } from "../../bash-tools.js";
import type { BlockReplyPayload } from "../../pi-embedded-payloads.js";
import type { BlockReplyChunking, ToolResultFormat } from "../../pi-embedded-subscribe.js";
import type { SkillSnapshot } from "../../skills.js";
export type ClientToolDefinition = {
    type: "function";
    function: {
        name: string;
        description?: string;
        parameters?: Record<string, unknown>;
    };
};
export type RunEmbeddedPiAgentParams = {
    sessionId: string;
    sessionKey?: string;
    agentId?: string;
    messageChannel?: string;
    messageProvider?: string;
    agentAccountId?: string;
    /** Delivery target (e.g. telegram:group:123:topic:456) for topic/thread routing. */
    messageTo?: string;
    /** Thread/topic identifier for routing replies to the originating thread. */
    messageThreadId?: string | number;
    /** Group id for channel-level tool policy resolution. */
    groupId?: string | null;
    /** Group channel label (e.g. #general) for channel-level tool policy resolution. */
    groupChannel?: string | null;
    /** Group space label (e.g. guild/team id) for channel-level tool policy resolution. */
    groupSpace?: string | null;
    /** Parent session key for subagent policy inheritance. */
    spawnedBy?: string | null;
    senderId?: string | null;
    senderName?: string | null;
    senderUsername?: string | null;
    senderE164?: string | null;
    /** Whether the sender is an owner (required for owner-only tools). */
    senderIsOwner?: boolean;
    /** Current channel ID for auto-threading (Slack). */
    currentChannelId?: string;
    /** Current thread timestamp for auto-threading (Slack). */
    currentThreadTs?: string;
    /** Reply-to mode for Slack auto-threading. */
    replyToMode?: "off" | "first" | "all";
    /** Mutable ref to track if a reply was sent (for "first" mode). */
    hasRepliedRef?: {
        value: boolean;
    };
    /** Require explicit message tool targets (no implicit last-route sends). */
    requireExplicitMessageTarget?: boolean;
    /** If true, omit the message tool from the tool list. */
    disableMessageTool?: boolean;
    sessionFile: string;
    workspaceDir: string;
    agentDir?: string;
    config?: SymiConfig;
    skillsSnapshot?: SkillSnapshot;
    prompt: string;
    images?: ImageContent[];
    /** Optional client-provided tools (OpenResponses hosted tools). */
    clientTools?: ClientToolDefinition[];
    /** Disable built-in tools for this run (LLM-only mode). */
    disableTools?: boolean;
    provider?: string;
    model?: string;
    authProfileId?: string;
    authProfileIdSource?: "auto" | "user";
    thinkLevel?: ThinkLevel;
    verboseLevel?: VerboseLevel;
    reasoningLevel?: ReasoningLevel;
    toolResultFormat?: ToolResultFormat;
    /** If true, suppress tool error warning payloads for this run (including mutating tools). */
    suppressToolErrorWarnings?: boolean;
    execOverrides?: Pick<ExecToolDefaults, "host" | "security" | "ask" | "node">;
    bashElevated?: ExecElevatedDefaults;
    timeoutMs: number;
    /** Symipulse inactivity timeout in milliseconds.  Resets on model/tool activity. */
    symipulseMs?: number;
    runId: string;
    abortSignal?: AbortSignal;
    shouldEmitToolResult?: () => boolean;
    shouldEmitToolOutput?: () => boolean;
    onPartialReply?: (payload: {
        text?: string;
        mediaUrls?: string[];
    }) => void | Promise<void>;
    onAssistantMessageStart?: () => void | Promise<void>;
    onBlockReply?: (payload: BlockReplyPayload) => void | Promise<void>;
    onBlockReplyFlush?: () => void | Promise<void>;
    blockReplyBreak?: "text_end" | "message_end";
    blockReplyChunking?: BlockReplyChunking;
    onReasoningStream?: (payload: {
        text?: string;
        mediaUrls?: string[];
    }) => void | Promise<void>;
    onReasoningEnd?: () => void | Promise<void>;
    onToolResult?: (payload: {
        text?: string;
        mediaUrls?: string[];
    }) => void | Promise<void>;
    onAgentEvent?: (evt: {
        stream: string;
        data: Record<string, unknown>;
    }) => void;
    lane?: string;
    enqueue?: typeof enqueueCommand;
    extraSystemPrompt?: string;
    inputProvenance?: InputProvenance;
    streamParams?: AgentStreamParams;
    ownerNumbers?: string[];
    enforceFinalTag?: boolean;
};
