import type { ImageContent } from "@earendil-works/pi-ai";
import type { ReplyOperation } from "../../../auto-reply/reply/reply-run-registry.js";
import type { ReasoningLevel, ThinkLevel, VerboseLevel } from "../../../auto-reply/thinking.js";
import type { ReplyPayload } from "../../../auto-reply/types.js";
import type { KaijiBotConfig } from "../../../config/config.js";
import type { PromptImageOrderEntry } from "../../../media/prompt-image-order.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 { AgentStreamParams, ClientToolDefinition } from "../../command/shared-types.js";
import type { AgentInternalEvent } from "../../internal-events.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 } from "../../command/shared-types.js";
export type EmbeddedRunTrigger = "cron" | "heartbeat" | "manual" | "memory" | "overflow" | "user";
export type RunEmbeddedPiAgentParams = {
    sessionId: string;
    sessionKey?: string;
    agentId?: string;
    messageChannel?: string;
    messageProvider?: string;
    agentAccountId?: string;
    /** What initiated this agent run: "user", "heartbeat", "cron", "memory", "overflow", or "manual". */
    trigger?: EmbeddedRunTrigger;
    /** Relative workspace path that memory-triggered writes are allowed to append to. */
    memoryFlushWritePath?: 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;
    /** Current inbound message id for action fallbacks (e.g. Telegram react). */
    currentMessageId?: string | number;
    /** Reply-to mode for Slack auto-threading. */
    replyToMode?: "off" | "first" | "all" | "batched";
    /** 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;
    /** Allow runtime plugins for this run to late-bind the gateway subagent. */
    allowGatewaySubagentBinding?: boolean;
    /** Transient session — skip persistence. */
    transient?: boolean;
    sessionFile: string;
    workspaceDir: string;
    agentDir?: string;
    config?: KaijiBotConfig;
    skillsSnapshot?: SkillSnapshot;
    prompt: string;
    images?: ImageContent[];
    imageOrder?: PromptImageOrderEntry[];
    /** 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;
    fastMode?: boolean;
    verboseLevel?: VerboseLevel;
    reasoningLevel?: ReasoningLevel;
    toolResultFormat?: ToolResultFormat;
    /** If true, suppress tool error warning payloads for this run (including mutating tools). */
    suppressToolErrorWarnings?: boolean;
    /** Bootstrap context mode for workspace file injection. */
    bootstrapContextMode?: "full" | "lightweight";
    /** Run kind hint for context mode behavior. */
    bootstrapContextRunKind?: "default" | "heartbeat" | "cron";
    /** Optional tool allow-list; when set, only these tools are sent to the model. */
    toolsAllow?: string[];
    /** Seen bootstrap truncation warning signatures for this session (once mode dedupe). */
    bootstrapPromptWarningSignaturesSeen?: string[];
    /** Last shown bootstrap truncation warning signature for this session. */
    bootstrapPromptWarningSignature?: string;
    execOverrides?: Pick<ExecToolDefaults, "host" | "security" | "ask" | "node">;
    bashElevated?: ExecElevatedDefaults;
    timeoutMs: number;
    runId: string;
    abortSignal?: AbortSignal;
    replyOperation?: ReplyOperation;
    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: ReplyPayload) => void | Promise<void>;
    onAgentEvent?: (evt: {
        stream: string;
        data: Record<string, unknown>;
    }) => void;
    lane?: string;
    enqueue?: typeof enqueueCommand;
    extraSystemPrompt?: string;
    internalEvents?: AgentInternalEvent[];
    inputProvenance?: InputProvenance;
    streamParams?: AgentStreamParams;
    ownerNumbers?: string[];
    enforceFinalTag?: boolean;
    silentExpected?: boolean;
    /**
     * Allow a single run attempt even when all auth profiles are in cooldown,
     * but only for inferred transient cooldowns like `rate_limit` or `overloaded`.
     *
     * This is used by model fallback when trying sibling models on providers
     * where transient service pressure is often model-scoped.
     */
    allowTransientCooldownProbe?: boolean;
    /**
     * Dispose bundled MCP runtimes when the overall run ends instead of preserving
     * the session-scoped cache. Intended for one-shot local CLI runs that must
     * exit promptly after emitting the final JSON result.
     */
    cleanupBundleMcpOnRunEnd?: boolean;
};
