import type { ExtensionContext } from "@earendil-works/pi-coding-agent"; import type { RelayResolution } from "../config.js"; import type { Ed25519Keypair } from "../pairing/crypto.js"; import type { HostConnectOptions, RelayClient } from "../transport/relay_client.js"; export type RemoteState = "idle" | "started"; export type RelayConnectivity = "connected" | "reconnecting" | "disconnected"; export type RelayDisplayStatus = "off" | "connecting" | "connected" | "reconnecting" | "failed"; export type InitialRelayResult = "completed" | "cancelled"; export type RelayStartContext = Pick; export interface RelayLifecycleDependencies { loadIdentity(): Promise; resolveRelayUrl(): RelayResolution; createClient(relayUrl: string, identity: Ed25519Keypair): RelayClient; buildConnectOptions(cwd?: string): Promise; handleIdentityError(error: unknown, ctx: RelayStartContext): boolean; describeConnection(resolution: RelayResolution): string; onStateChange(): void; onDisplayStatusChange(): void; onConnected(client: RelayClient, ctx?: RelayStartContext): void; onDisconnected(): void; } export declare class RelayLifecycle { private readonly deps; private activeRelay; private pendingCandidate; private currentRelayUrl; private identity; private initialAttempt; private cancelInitialAttempt; private reconnectTimer; private reconnectAttempt; private generation; private isDisposed; private currentState; private currentDisplayStatus; private readonly closedCandidates; constructor(deps: RelayLifecycleDependencies); get state(): RemoteState; get relay(): RelayClient | null; get relayUrl(): string | null; get keypair(): Ed25519Keypair | null; get disposed(): boolean; get hasPendingReconnect(): boolean; get status(): RelayConnectivity; get displayStatus(): RelayDisplayStatus; isCurrent(candidate: RelayClient): boolean; setDisposed(value: boolean): void; start(ctx: RelayStartContext): Promise; waitForInitial(): Promise; stop(): void; private startInitial; private scheduleReconnect; private reconnect; private onRelayClose; private handleConnectionFailure; private markInitialFailure; private setDisplayStatus; private clearCandidate; private closeCandidateOnce; private clearInitialAttempt; private isOperationCurrent; private isReconnectCurrent; private notify; }