import type { Client, AgentInfoResult } from "#client/index.js"; import type { DevelopmentCredentialGate } from "#services/dev-client/credential-gate.js"; import type { DevelopmentOidcTokenResolution } from "#services/dev-client/request-headers.js"; import type { ResolvedVercelDeployment, VercelDeploymentResolution } from "#setup/vercel-deployment.js"; import type { RemoteAuthCompletedMutation, RemoteAuthPreparation } from "./remote-auth-result.js"; import type { RemoteDevelopmentTarget } from "./target.js"; export type RemoteAuthChallenge = { readonly kind: "eve-oidc"; } | { readonly kind: "vercel-deployment-protection"; }; interface RemoteRequestFailure { readonly code?: string; readonly message: string; } export type RemoteConnectionState = { readonly state: "checking"; } | { readonly state: "ready"; readonly info?: AgentInfoResult; } | { readonly state: "auth-required"; readonly challenge: RemoteAuthChallenge; } | { readonly state: "authenticating"; readonly challenge: RemoteAuthChallenge; } | { readonly state: "auth-failed"; readonly challenge: RemoteAuthChallenge; } | { readonly state: "unavailable"; readonly failure: RemoteRequestFailure; }; export interface RemoteConnectionSnapshot { readonly target: RemoteDevelopmentTarget; readonly connection: RemoteConnectionState; /** Last deployment identity resolved from Vercel for this target. */ readonly deployment?: ResolvedVercelDeployment; } export type RemoteAuthCompletion = { readonly kind: "authenticated"; } | { readonly kind: "cancelled"; readonly completedMutations: readonly RemoteAuthCompletedMutation[]; } | { readonly kind: "failed"; readonly message: string; } | { readonly kind: "unavailable"; readonly failure: RemoteRequestFailure; }; export interface RemoteConnectionController { current(): RemoteConnectionSnapshot; check(): Promise; authenticate(prepare: (signal: AbortSignal) => Promise, signal?: AbortSignal): Promise; reportFailure(error: unknown): RemoteConnectionState; dispose(): void; } export interface RemoteConnectionControllerOptions { readonly client: Client; readonly credentials: DevelopmentCredentialGate; readonly target: RemoteDevelopmentTarget; /** Resolves an ambient token only after Vercel proves the exact target origin. */ readonly resolveOidcToken?: (deployment: Pick) => Promise; readonly resolveDeployment?: (signal: AbortSignal) => Promise; readonly onChange: (snapshot: RemoteConnectionSnapshot) => void; } export {};