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 } | { readonly mode: "code" readonly callback: (code: string) => Effect.Effect } ) export type IntegrationOAuthMethodRegistration = { readonly integrationID: string readonly method: IntegrationOAuthMethod readonly authorize: (inputs: IntegrationInputs) => Effect.Effect readonly refresh?: (credential: CredentialOAuth) => Effect.Effect 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 readonly resolve: (connection: ConnectionInfo) => Effect.Effect } }