import { Tool } from '@n8n/agents';
import { z } from 'zod';
import type { AgentIntegrationConfig } from '@n8n/api-types';
import { type IntegrationErrorCode } from './integration-error-codes';
export type IntegrationMessageTarget = {
    type: 'thread';
    threadId: string;
    channelId?: string;
    userId?: string;
} | {
    type: 'channel';
    channelId: string;
    threadId?: string;
} | {
    type: 'dm';
    userId: string;
    threadId?: string;
};
export interface IntegrationMessageContext {
    integrationConnectionId: string;
    platform: string;
    target: IntegrationMessageTarget;
    messageId?: string;
    interactingUserId?: string;
    agentUserId?: string;
    subject?: IntegrationMessageSubject;
    updatedAt: string;
}
export interface IntegrationMessageSubject {
    type: string;
    id: string;
    title?: string;
    description?: string;
    url?: string;
    status?: string;
    labels?: string[];
    assignee?: IntegrationSubjectPerson;
    author?: IntegrationSubjectPerson;
}
export interface IntegrationSubjectPerson {
    id: string;
    name: string;
}
export interface IntegrationToolConnectionDescriptor {
    agentId?: string;
    integration: AgentIntegrationConfig;
    integrationConnectionId: string;
    contextToolName: string;
    actionToolName: string;
    contextQueries: IntegrationContextQuery[];
    actions: IntegrationAction[];
}
export interface IntegrationMessageContextStore {
    getLatest(threadId: string): Promise<IntegrationMessageContext | null>;
    setLatest(threadId: string, resourceId: string, context: IntegrationMessageContext): Promise<void>;
}
export interface IntegrationContextQueryExecutor {
    execute(params: {
        descriptor: IntegrationToolConnectionDescriptor;
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
        persistence?: {
            threadId: string;
            resourceId: string;
        };
    }): Promise<unknown>;
}
export interface IntegrationActionExecutor {
    execute(params: {
        descriptor: IntegrationToolConnectionDescriptor;
        action: IntegrationAction;
        input: Record<string, unknown>;
        awaitResponse: boolean;
        runId?: string;
        toolCallId?: string;
        currentMessageContext?: IntegrationMessageContext;
    }): Promise<IntegrationActionResult>;
}
export type IntegrationContextQuery = 'get_current_message_context' | 'get_current_subject' | 'get_current_user' | 'get_current_channel_info' | 'get_user' | 'get_channel_info' | 'search_users' | 'search_channels' | 'get_team' | 'search_teams' | 'get_project' | 'search_projects' | 'search_labels' | 'search_issue_states' | 'get_issue' | 'search_issues';
export type IntegrationAction = 'respond' | 'send_dm' | 'send_channel_message' | 'add_reaction' | 'create_issue' | 'update_issue' | 'create_comment';
export type IntegrationActionResult = {
    ok: true;
    messageContext?: IntegrationMessageContext;
    [key: string]: unknown;
} | {
    ok: false;
    error: {
        code: IntegrationErrorCode;
        message: string;
    };
};
export declare const DEFAULT_INTEGRATION_CONTEXT_QUERIES: IntegrationContextQuery[];
export declare const DEFAULT_INTEGRATION_ACTIONS: IntegrationAction[];
export declare function getIntegrationToolConnectionDescriptors(integrations: AgentIntegrationConfig[], agentId?: string, capabilitiesFor?: (integration: AgentIntegrationConfig) => {
    contextQueries?: IntegrationContextQuery[];
    actions?: IntegrationAction[];
}): IntegrationToolConnectionDescriptor[];
export declare function buildIntegrationConnectionId(integration: Pick<AgentIntegrationConfig, 'type' | 'credentialId'>): string;
export declare function createIntegrationContextTool(params: {
    descriptor: IntegrationToolConnectionDescriptor;
    messageContextStore: IntegrationMessageContextStore;
    queryExecutor: IntegrationContextQueryExecutor;
}): Tool<z.ZodEffects<z.ZodObject<{
    query: z.ZodOptional<z.ZodEnum<[IntegrationContextQuery, ...IntegrationContextQuery[]]>>;
    input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
    queries: z.ZodOptional<z.ZodArray<z.ZodObject<{
        query: z.ZodEnum<[IntegrationContextQuery, ...IntegrationContextQuery[]]>;
        input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
    }, "strict", z.ZodTypeAny, {
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
    }, {
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
    }>, "many">>;
}, "strict", z.ZodTypeAny, {
    query?: IntegrationContextQuery | undefined;
    input?: Record<string, unknown> | undefined;
    queries?: {
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
    }[] | undefined;
}, {
    query?: IntegrationContextQuery | undefined;
    input?: Record<string, unknown> | undefined;
    queries?: {
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
    }[] | undefined;
}>, {
    query?: IntegrationContextQuery | undefined;
    input?: Record<string, unknown> | undefined;
    queries?: {
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
    }[] | undefined;
}, {
    query?: IntegrationContextQuery | undefined;
    input?: Record<string, unknown> | undefined;
    queries?: {
        query: IntegrationContextQuery;
        input: Record<string, unknown>;
    }[] | undefined;
}>, z.ZodTypeAny, undefined, undefined>;
export declare function createIntegrationActionTool(params: {
    descriptor: IntegrationToolConnectionDescriptor;
    messageContextStore: IntegrationMessageContextStore;
    actionExecutor: IntegrationActionExecutor;
}): Tool<z.ZodEffects<z.ZodObject<{
    action: z.ZodOptional<z.ZodEnum<[IntegrationAction, ...IntegrationAction[]]>>;
    input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
    actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
        action: z.ZodEnum<[IntegrationAction, ...IntegrationAction[]]>;
        input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
    }, "strict", z.ZodTypeAny, {
        input: Record<string, unknown>;
        action: IntegrationAction;
    }, {
        input: Record<string, unknown>;
        action: IntegrationAction;
    }>, "many">>;
}, "strict", z.ZodTypeAny, {
    input?: Record<string, unknown> | undefined;
    action?: IntegrationAction | undefined;
    actions?: {
        input: Record<string, unknown>;
        action: IntegrationAction;
    }[] | undefined;
}, {
    input?: Record<string, unknown> | undefined;
    action?: IntegrationAction | undefined;
    actions?: {
        input: Record<string, unknown>;
        action: IntegrationAction;
    }[] | undefined;
}>, {
    input?: Record<string, unknown> | undefined;
    action?: IntegrationAction | undefined;
    actions?: {
        input: Record<string, unknown>;
        action: IntegrationAction;
    }[] | undefined;
}, {
    input?: Record<string, unknown> | undefined;
    action?: IntegrationAction | undefined;
    actions?: {
        input: Record<string, unknown>;
        action: IntegrationAction;
    }[] | undefined;
}>, z.ZodTypeAny, z.ZodObject<{
    type: z.ZodLiteral<"integration_action">;
    action: z.ZodString;
    integrationConnectionId: z.ZodString;
    messageContext: z.ZodUnknown;
}, "strip", z.ZodTypeAny, {
    type: "integration_action";
    action: string;
    integrationConnectionId: string;
    messageContext?: unknown;
}, {
    type: "integration_action";
    action: string;
    integrationConnectionId: string;
    messageContext?: unknown;
}>, z.ZodRecord<z.ZodString, z.ZodUnknown>>;
