import type { SKYKOIConfig } from "../config/config.js";
export type RoutePeerKind = "dm" | "group" | "channel";
export type RoutePeer = {
    kind: RoutePeerKind;
    id: string;
};
export type ResolveKoiRouteInput = {
    cfg: SKYKOIConfig;
    channel: string;
    accountId?: string | null;
    peer?: RoutePeer | null;
    /** Parent peer for threads — used for binding inheritance when peer doesn't match directly. */
    parentPeer?: RoutePeer | null;
    guildId?: string | null;
    teamId?: string | null;
};
export type ResolvedKoiRoute = {
    koiId: string;
    channel: string;
    accountId: string;
    /** Internal session key used for persistence + concurrency. */
    sessionKey: string;
    /** Convenience alias for direct-chat collapse. */
    mainSessionKey: string;
    /** Match description for debugging/logging. */
    matchedBy: "binding.peer" | "binding.peer.parent" | "binding.guild" | "binding.team" | "binding.account" | "binding.channel" | "default";
};
export { DEFAULT_ACCOUNT_ID, DEFAULT_KOI_ID } from "./session-key.js";
export declare function buildKoiSessionKey(params: {
    koiId: string;
    channel: string;
    accountId?: string | null;
    peer?: RoutePeer | null;
    /** DM session scope. */
    dmScope?: "main" | "per-peer" | "per-channel-peer" | "per-account-channel-peer";
    identityLinks?: Record<string, string[]>;
}): string;
export declare function resolveKoiRoute(input: ResolveKoiRouteInput): ResolvedKoiRoute;
