import type { DiscordPluralKitConfig } from "../channels/impl/discord/pluralkit.js";
import type { BlockStreamingCoalesceConfig, DmPolicy, GroupPolicy, MarkdownConfig, OutboundRetryConfig, ReplyToMode } from "./types.base.js";
import type { ChannelHeartbeatVisibilityConfig } from "./types.channels.js";
import type { DmConfig, ProviderCommandsConfig } from "./types.messages.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";
export type DiscordDmConfig = {
    /** If false, ignore all incoming Discord DMs. Default: true. */
    enabled?: boolean;
    /** Direct message access policy (default: pairing). */
    policy?: DmPolicy;
    /** Allowlist for DM senders (ids or names). */
    allowFrom?: string[];
    /** If true, allow group DMs (default: false). */
    groupEnabled?: boolean;
    /** Optional allowlist for group DM channels (ids or slugs). */
    groupChannels?: string[];
};
export type DiscordGuildChannelConfig = {
    allow?: boolean;
    requireMention?: boolean;
    /** Optional tool policy overrides for this channel. */
    tools?: GroupToolPolicyConfig;
    toolsBySender?: GroupToolPolicyBySenderConfig;
    /** If specified, only load these skills for this channel. Omit = all skills; empty = no skills. */
    skills?: string[];
    /** If false, disable the bot for this channel. */
    enabled?: boolean;
    /** Optional allowlist for channel senders (ids or names). */
    users?: string[];
    /** Optional allowlist for channel senders by role ID. */
    roles?: string[];
    /** Optional system prompt snippet for this channel. */
    systemPrompt?: string;
    /** If false, omit thread starter context for this channel (default: true). */
    includeThreadStarter?: boolean;
};
export type DiscordReactionNotificationMode = "off" | "own" | "all" | "allowlist";
export type DiscordGuildEntry = {
    slug?: string;
    requireMention?: boolean;
    /** Optional tool policy overrides for this guild (used when channel override is missing). */
    tools?: GroupToolPolicyConfig;
    toolsBySender?: GroupToolPolicyBySenderConfig;
    /** Reaction notification mode (off|own|all|allowlist). Default: own. */
    reactionNotifications?: DiscordReactionNotificationMode;
    /** Optional allowlist for guild senders (ids or names). */
    users?: string[];
    /** Optional allowlist for guild senders by role ID. */
    roles?: string[];
    channels?: Record<string, DiscordGuildChannelConfig>;
};
export type DiscordActionConfig = {
    reactions?: boolean;
    stickers?: boolean;
    polls?: boolean;
    permissions?: boolean;
    messages?: boolean;
    threads?: boolean;
    pins?: boolean;
    search?: boolean;
    memberInfo?: boolean;
    roleInfo?: boolean;
    roles?: boolean;
    channelInfo?: boolean;
    voiceStatus?: boolean;
    events?: boolean;
    moderation?: boolean;
    emojiUploads?: boolean;
    stickerUploads?: boolean;
    channels?: boolean;
    /** Enable bot presence/activity changes (default: false). */
    presence?: boolean;
};
export type DiscordIntentsConfig = {
    /** Enable Guild Presences privileged intent (requires Portal opt-in). Default: false. */
    presence?: boolean;
    /** Enable Guild Members privileged intent (requires Portal opt-in). Default: false. */
    guildMembers?: boolean;
};
export type DiscordExecApprovalConfig = {
    /** Enable exec approval forwarding to Discord DMs. Default: false. */
    enabled?: boolean;
    /** Discord user IDs to receive approval prompts. Required if enabled. */
    approvers?: string[];
    /** Only forward approvals for these agent IDs. Omit = all agents. */
    agentFilter?: string[];
    /** Only forward approvals matching these session key patterns (substring or regex). */
    sessionFilter?: string[];
    /** Delete approval DMs after approval, denial, or timeout. Default: false. */
    cleanupAfterResolve?: boolean;
    /** Where to send approval prompts. "dm" sends to approver DMs (default), "channel" sends to the
     *  originating Discord channel, "both" sends to both. When target is "channel" or "both", buttons
     *  are only usable by configured approvers; other users receive an ephemeral denial. */
    target?: "dm" | "channel" | "both";
};
export type DiscordAgentComponentsConfig = {
    /** Enable agent-controlled interactive components (buttons, select menus). Default: true. */
    enabled?: boolean;
};
export type DiscordUiComponentsConfig = {
    /** Accent color used by Discord component containers (hex). */
    accentColor?: string;
};
export type DiscordUiConfig = {
    components?: DiscordUiComponentsConfig;
};
export type DiscordAccountConfig = {
    /** Optional display name for this account (used in CLI/UI lists). */
    name?: string;
    /** Optional provider capability tags used for agent/runtime guidance. */
    capabilities?: string[];
    /** Markdown formatting overrides (tables). */
    markdown?: MarkdownConfig;
    /** Override native command registration for Discord (bool or "auto"). */
    commands?: ProviderCommandsConfig;
    /** Allow channel-initiated config writes (default: true). */
    configWrites?: boolean;
    /** If false, do not start this Discord account. Default: true. */
    enabled?: boolean;
    token?: string;
    /** HTTP(S) proxy URL for Discord gateway WebSocket connections. */
    proxy?: string;
    /** Allow bot-authored messages to trigger replies (default: false). */
    allowBots?: boolean;
    /**
     * Controls how guild channel messages are handled:
     * - "open": guild channels bypass allowlists; mention-gating applies
     * - "disabled": block all guild channel messages
     * - "allowlist": only allow channels present in discord.guilds.*.channels
     */
    groupPolicy?: GroupPolicy;
    /** Outbound text chunk size (chars). Default: 2000. */
    textChunkLimit?: number;
    /** Chunking mode: "length" (default) splits by size; "newline" splits on every newline. */
    chunkMode?: "length" | "newline";
    /** Disable block streaming for this account. */
    blockStreaming?: boolean;
    /** Merge streamed block replies before sending. */
    blockStreamingCoalesce?: BlockStreamingCoalesceConfig;
    /**
     * Soft max line count per Discord message.
     * Discord clients can clip/collapse very tall messages; splitting by lines
     * keeps replies readable in-channel. Default: 17.
     */
    maxLinesPerMessage?: number;
    mediaMaxMb?: number;
    historyLimit?: number;
    /** Max DM turns to keep as history context. */
    dmHistoryLimit?: number;
    /** Per-DM config overrides keyed by user ID. */
    dms?: Record<string, DmConfig>;
    /** Retry policy for outbound Discord API calls. */
    retry?: OutboundRetryConfig;
    /** Per-action tool gating (default: true for all). */
    actions?: DiscordActionConfig;
    /** Control reply threading when reply tags are present (off|first|all). */
    replyToMode?: ReplyToMode;
    /**
     * Alias for dm.policy (prefer this so it inherits cleanly via base->account shallow merge).
     * Legacy key: channels.discord.dm.policy.
     */
    dmPolicy?: DmPolicy;
    /**
     * Alias for dm.allowFrom (prefer this so it inherits cleanly via base->account shallow merge).
     * Legacy key: channels.discord.dm.allowFrom.
     */
    allowFrom?: string[];
    dm?: DiscordDmConfig;
    /** New per-guild config keyed by guild id or slug. */
    guilds?: Record<string, DiscordGuildEntry>;
    /** Heartbeat visibility settings for this channel. */
    heartbeat?: ChannelHeartbeatVisibilityConfig;
    /** Exec approval forwarding configuration. */
    execApprovals?: DiscordExecApprovalConfig;
    /** Agent-controlled interactive components (buttons, select menus). */
    agentComponents?: DiscordAgentComponentsConfig;
    /** Discord UI customization (components, modals, etc.). */
    ui?: DiscordUiConfig;
    /** Privileged Gateway Intents (must also be enabled in Discord Developer Portal). */
    intents?: DiscordIntentsConfig;
    /** PluralKit identity resolution for proxied messages. */
    pluralkit?: DiscordPluralKitConfig;
    /** Outbound response prefix override for this channel/account. */
    responsePrefix?: string;
    /**
     * Per-channel ack reaction override.
     * Discord supports both unicode emoji and custom emoji names.
     */
    ackReaction?: string;
    /** Bot activity status text (e.g. "Watching X"). */
    activity?: string;
    /** Bot status (online|dnd|idle|invisible). Defaults to online when presence is configured. */
    status?: "online" | "dnd" | "idle" | "invisible";
    /** Activity type (0=Game, 1=Streaming, 2=Listening, 3=Watching, 4=Custom, 5=Competing). Defaults to 4 (Custom) when activity is set. */
    activityType?: 0 | 1 | 2 | 3 | 4 | 5;
    /** Streaming URL (Twitch/YouTube). Required when activityType=1. */
    activityUrl?: string;
};
export type DiscordConfig = {
    /** Optional per-account Discord configuration (multi-account). */
    accounts?: Record<string, DiscordAccountConfig>;
    /** Delay (ms) between starting successive bot accounts (default: 2000). */
    startupStaggerMs?: number;
} & DiscordAccountConfig;
