import { createPromptCommandOutput, type ChannelSetupLog } from "#setup/cli/index.js"; import { captureVercel, runVercel } from "#setup/primitives/run-vercel.js"; import { z } from "zod"; import { type RawSlackConnector, type SlackConnectorDetails, type SlackConnectorRef, type SlackWorkspaceConnection } from "./slack-connect.js"; export declare const CONNECT_LOOKUP_TIMEOUT_MS = 60000; export declare const CONNECT_MUTATION_TIMEOUT_MS: number; declare const VercelProjectLinkSchema: z.ZodObject<{ projectId: z.ZodString; orgId: z.ZodString; }, z.core.$strip>; /** Connect subprocess operations needed to inventory and remove Slack connectors. */ export interface SlackConnectLifecycleDeps { captureVercel: typeof captureVercel; runVercel: typeof runVercel; } export type SlackConnectorInventory = { state: "ok"; body: unknown; connectors: readonly RawSlackConnector[]; } | { state: "failed"; message: string; }; export type SlackConnectorCleanupResult = { state: "clean"; } | { state: "failed"; connectorUids: readonly string[]; }; type CommandOutput = ReturnType; /** Shared dependencies and output routing for one connector cleanup operation. */ export interface SlackConnectorCleanupContext { log: ChannelSetupLog; deps: SlackConnectLifecycleDeps; projectRoot: string; onOutput: CommandOutput; } /** Reads and validates the account-level Slack connector inventory. */ export declare function listSlackConnectors(deps: SlackConnectLifecycleDeps, projectRoot: string, onOutput: CommandOutput, signal?: AbortSignal): Promise; /** Project and team identifiers from a valid on-disk Vercel link. */ export type VercelProjectLink = z.infer; /** Reads the linked Vercel project and team ids from `.vercel/project.json`. */ export declare function readProjectLink(projectRoot: string): Promise; export type SlackConnectorLookup = { state: "found"; connector: SlackConnectorRef; connectorUids: ReadonlySet; } | { state: "not-found"; connectorUids: ReadonlySet; } | { state: "failed"; message: string; }; /** Resolves the expected (or newest project-attached) Slack connector from the inventory. */ export declare function findSlackConnector(deps: SlackConnectLifecycleDeps, projectRoot: string, projectId: string | undefined, expectedUid: string | undefined, onOutput: CommandOutput, signal?: AbortSignal): Promise; /** * Outcome of pointing a connector's trigger destination at this project's eve * route. Detach and attach are reported separately because attach must not run * while an old trigger destination may still exist. A `detach-failed` connector * is left in a known-stale state the caller surfaces with manual recovery steps. */ export type SlackConnectorAttachmentResult = { state: "attached"; } | { state: "detach-failed"; } | { state: "attach-failed"; }; /** * Replaces the connector's default trigger destination with the eve route: * detach the existing destination first, then attach this project. Either * subprocess failing short-circuits so a half-configured connector is reported * rather than silently left pointing at the wrong place. */ export declare function attachSlackConnector(deps: SlackConnectLifecycleDeps, projectRoot: string, ref: SlackConnectorRef, onOutput: CommandOutput, signal?: AbortSignal): Promise; export type SlackWorkspaceLookup = { state: "connected"; workspace: SlackWorkspaceConnection; } | { state: "pending"; } | { state: "failed"; message: string; }; export type SlackConnectorDetailsLookup = { state: "found"; details: SlackConnectorDetails; } | { state: "failed"; message: string; }; /** Fetches and validates one team-scoped connector detail payload. */ export declare function fetchSlackConnectorDetails(input: { deps: Pick; projectRoot: string; connectorId: string; orgId: string | undefined; onOutput: CommandOutput; timeoutMs: number; signal?: AbortSignal; }): Promise; /** Fetches the Slack workspace connected to a connector, if one exists yet. */ export declare function fetchSlackWorkspace(input: { deps: Pick; projectRoot: string; connectorId: string; orgId: string | undefined; onOutput: CommandOutput; timeoutMs: number; signal?: AbortSignal; }): Promise; /** * Removes the exact connector returned by `connect create`. When no UID was * returned, ownership cannot be proven: a concurrent or eventually-consistent * connector looks the same as this attempt's. So cleanup fails closed. It * removes nothing and instead surfaces the connectors that look like this * attempt's, matching `expectedUid` and absent from the pre-create snapshot, so * the caller can stop rather than risk removing a bystander's connector. */ export declare function cleanupCreatedAttempt(context: SlackConnectorCleanupContext, input: { expectedUid: string; baselineConnectorUids: ReadonlySet; createdRef: SlackConnectorRef | undefined; }): Promise; export {};