import { AgentIntegrationConfig, type AgentIntegrationSettings, type AgentIntegrationStatusResponse } from '@n8n/api-types';
import { Logger } from '@n8n/backend-common';
import { GlobalConfig } from '@n8n/config';
import type { Channel, Thread, UserInfo } from 'chat';
import { InstanceSettings } from 'n8n-core';
import { CredentialsFinderService } from '../../../credentials/credentials-finder.service';
import { CredentialsService } from '../../../credentials/credentials.service';
import { Publisher } from '../../../scaling/pubsub/publisher.service';
import type { PubSubCommandMap } from '../../../scaling/pubsub/pubsub.event-map';
import { UrlService } from '../../../services/url.service';
import { ChatIntegrationRegistry } from './agent-chat-integration';
import type { Agent } from '../entities/agent.entity';
import { AgentRepository } from '../repositories/agent.repository';
type WebhookHandler = (request: Request, options?: {
    waitUntil?: (task: Promise<unknown>) => void;
}) => Promise<Response>;
export interface ChatInstance {
    initialize(): Promise<void>;
    shutdown(): Promise<void>;
    webhooks: Record<string, WebhookHandler>;
    onNewMention: (handler: unknown) => void;
    onSubscribedMessage: (handler: unknown) => void;
    onAction: (handler: unknown) => void;
    getAdapter(name: string): unknown;
    openDM(user: string): Promise<Thread>;
    thread(threadId: string): Thread;
    channel(channelId: string): Channel;
    getUser(user: string): Promise<UserInfo | null>;
}
interface ConnectOptions {
    skipExternalHooks?: boolean;
    settings?: AgentIntegrationSettings;
}
interface DisconnectOptions {
    skipExternalHooks?: boolean;
}
export declare class ChatIntegrationService {
    private readonly logger;
    private readonly agentRepository;
    private readonly credentialsService;
    private readonly credentialsFinderService;
    private readonly urlService;
    private readonly integrationRegistry;
    private readonly instanceSettings;
    private readonly publisher;
    private readonly globalConfig;
    private readonly connections;
    constructor(logger: Logger, agentRepository: AgentRepository, credentialsService: CredentialsService, credentialsFinderService: CredentialsFinderService, urlService: UrlService, integrationRegistry: ChatIntegrationRegistry, instanceSettings: InstanceSettings, publisher: Publisher, globalConfig: GlobalConfig);
    broadcastIntegrationChange(agentId: string, integration: AgentIntegrationConfig, action: 'connect' | 'disconnect'): Promise<void>;
    private connectionKey;
    private connectionTypeFromKey;
    connect(agentId: string, integration: AgentIntegrationConfig, userId: string, projectId: string, options?: ConnectOptions): Promise<void>;
    disconnect(agentId: string, integration?: {
        credentialId: string;
        type: string;
    }, options?: DisconnectOptions): Promise<void>;
    disconnectAll(): Promise<void>;
    disconnectLeaderOnlyIntegrations(): Promise<void>;
    syncToConfig(agent: Agent, previous: AgentIntegrationConfig[], next: AgentIntegrationConfig[]): Promise<void>;
    getStatus(agentId: string): AgentIntegrationStatusResponse & {
        connections: number;
    };
    getChatInstance(agentId: string, integration?: {
        type: string;
        credentialId: string;
    }): ChatInstance | undefined;
    getWebhookHandler(agentId: string, platform: string): WebhookHandler | undefined;
    reconnectAll(): Promise<void>;
    handleIntegrationChanged(payload: PubSubCommandMap['agent-chat-integration-changed']): Promise<void>;
    private disconnectOne;
    private resolveUser;
    private decryptCredential;
    private buildWebhookUrl;
    private connectOptionsFor;
}
export {};
