import type { ModelCatalogEntry } from "../../agents/model-catalog.js";
import type { createDefaultDeps } from "../../cli/deps.js";
import type { HealthSummary } from "../../commands/health.js";
import type { CronService } from "../../cron/service.js";
import type { createSubsystemLogger } from "../../logging/subsystem.js";
import type { WizardSession } from "../../wizard/session.js";
import type { ChatAbortControllerEntry } from "../chat-abort.js";
import type { ExecApprovalManager } from "../exec-approval-manager.js";
import type { NodeRegistry } from "../node-registry.js";
import type { ConnectParams, ErrorShape, RequestFrame } from "../protocol/index.js";
import type { GatewayBroadcastFn, GatewayBroadcastToConnIdsFn } from "../server-broadcast.js";
import type { ChannelRuntimeSnapshot } from "../server-channels.js";
import type { DedupeEntry } from "../server-shared.js";
type SubsystemLogger = ReturnType<typeof createSubsystemLogger>;
export type GatewayClient = {
    connect: ConnectParams;
    connId?: string;
    clientIp?: string;
    canvasHostUrl?: string;
    canvasCapability?: string;
    canvasCapabilityExpiresAtMs?: number;
};
export type RespondFn = (ok: boolean, payload?: unknown, error?: ErrorShape, meta?: Record<string, unknown>) => void;
export type GatewayRequestContext = {
    deps: ReturnType<typeof createDefaultDeps>;
    cron: CronService;
    cronStorePath: string;
    execApprovalManager?: ExecApprovalManager;
    loadGatewayModelCatalog: () => Promise<ModelCatalogEntry[]>;
    getHealthCache: () => HealthSummary | null;
    refreshHealthSnapshot: (opts?: {
        probe?: boolean;
        includeSensitive?: boolean;
    }) => Promise<HealthSummary>;
    logHealth: {
        error: (message: string) => void;
    };
    logGateway: SubsystemLogger;
    incrementPresenceVersion: () => number;
    getHealthVersion: () => number;
    broadcast: GatewayBroadcastFn;
    broadcastToConnIds: GatewayBroadcastToConnIdsFn;
    nodeSendToSession: (sessionKey: string, event: string, payload: unknown) => void;
    nodeSendToAllSubscribed: (event: string, payload: unknown) => void;
    nodeSubscribe: (nodeId: string, sessionKey: string) => void;
    nodeUnsubscribe: (nodeId: string, sessionKey: string) => void;
    nodeUnsubscribeAll: (nodeId: string) => void;
    subscribeSessionEvents: (connId: string) => void;
    unsubscribeSessionEvents: (connId: string) => void;
    broadcastSessionLifecycleEvent: (params: {
        sessionKey: string | undefined;
        phase: string;
        runId?: string;
        reason?: string;
    }) => void;
    subscribeSessionMessageEvents: (connId: string, sessionKey: string) => void;
    unsubscribeSessionMessageEvents: (connId: string, sessionKey: string) => void;
    unsubscribeAllSessionEvents: (connId: string) => void;
    hasConnectedMobileNode: () => boolean;
    hasExecApprovalClients?: () => boolean;
    nodeRegistry: NodeRegistry;
    agentRunSeq: Map<string, number>;
    chatAbortControllers: Map<string, ChatAbortControllerEntry>;
    chatAbortedRuns: Map<string, number>;
    chatRunBuffers: Map<string, string>;
    chatDeltaSentAt: Map<string, number>;
    addChatRun: (sessionId: string, entry: {
        sessionKey: string;
        clientRunId: string;
    }) => void;
    removeChatRun: (sessionId: string, clientRunId: string, sessionKey?: string) => {
        sessionKey: string;
        clientRunId: string;
    } | undefined;
    registerToolEventRecipient: (runId: string, connId: string) => void;
    dedupe: Map<string, DedupeEntry>;
    wizardSessions: Map<string, WizardSession>;
    findRunningWizard: () => string | null;
    purgeWizardSession: (id: string) => void;
    getRuntimeSnapshot: () => ChannelRuntimeSnapshot;
    startChannel: (channel: import("../../channels/plugins/types.js").ChannelId, accountId?: string) => Promise<void>;
    stopChannel: (channel: import("../../channels/plugins/types.js").ChannelId, accountId?: string) => Promise<void>;
    markChannelLoggedOut: (channelId: import("../../channels/plugins/types.js").ChannelId, cleared: boolean, accountId?: string) => void;
    wizardRunner: (opts: import("../../commands/onboard-types.js").OnboardOptions, runtime: import("../../runtime.js").RuntimeEnv, prompter: import("../../wizard/prompts.js").WizardPrompter) => Promise<void>;
    broadcastVoiceWakeChanged: (triggers: string[]) => void;
};
export type GatewayRequestOptions = {
    req: RequestFrame;
    client: GatewayClient | null;
    isWebchatConnect: (params: ConnectParams | null | undefined) => boolean;
    respond: RespondFn;
    context: GatewayRequestContext;
};
export type GatewayRequestHandlerOptions = {
    req: RequestFrame;
    /** @deprecated Older tests used frame for the request envelope. */
    frame?: RequestFrame;
    params: Record<string, unknown>;
    client: GatewayClient | null;
    isWebchatConnect: (params: ConnectParams | null | undefined) => boolean;
    respond: RespondFn;
    context: GatewayRequestContext;
};
export type GatewayRequestHandler = (opts: GatewayRequestHandlerOptions) => Promise<void> | void;
export type GatewayRequestHandlers = Record<string, GatewayRequestHandler>;
export {};
