import type { ConnectionInfo, CredentialOAuth, CredentialValue, IntegrationEnvMethod, IntegrationInputs, IntegrationKeyMethod, IntegrationMethod, IntegrationOAuthMethod, IntegrationRef } from "@opencode-ai/sdk/v2/types";
import type { Effect, Scope } from "effect";
import type { Hooks } from "./registration.js";
export type IntegrationOAuthAuthorization = {
    readonly url: string;
    readonly instructions: string;
} & ({
    readonly mode: "auto";
    readonly callback: Effect.Effect<CredentialOAuth, unknown>;
} | {
    readonly mode: "code";
    readonly callback: (code: string) => Effect.Effect<CredentialOAuth, unknown>;
});
export type IntegrationOAuthMethodRegistration = {
    readonly integrationID: string;
    readonly method: IntegrationOAuthMethod;
    readonly authorize: (inputs: IntegrationInputs) => Effect.Effect<IntegrationOAuthAuthorization, unknown, Scope.Scope>;
    readonly refresh?: (credential: CredentialOAuth) => Effect.Effect<CredentialOAuth, unknown>;
    readonly label?: (credential: CredentialOAuth) => string | undefined;
};
export type IntegrationMethodRegistration = IntegrationOAuthMethodRegistration | {
    readonly integrationID: string;
    readonly method: IntegrationKeyMethod;
} | {
    readonly integrationID: string;
    readonly method: IntegrationEnvMethod;
};
export interface IntegrationDraft {
    list(): readonly IntegrationRef[];
    get(id: string): IntegrationRef | undefined;
    update(id: string, update: (integration: IntegrationRef) => void): void;
    remove(id: string): void;
    readonly method: {
        list(integrationID: string): readonly IntegrationMethod[];
        update(input: IntegrationMethodRegistration): void;
        remove(integrationID: string, method: IntegrationMethod): void;
    };
}
export interface IntegrationHooks extends Hooks<{
    transform: IntegrationDraft;
}> {
    readonly connection: {
        readonly active: (integrationID: string) => Effect.Effect<ConnectionInfo | undefined>;
        readonly resolve: (connection: ConnectionInfo) => Effect.Effect<CredentialValue | undefined, unknown>;
    };
}
