import { detectProjectIdentity, type ProjectIdentity } from "#setup/project-resolution.js"; /** Workspace-scoped Vercel state shown in the dev TUI's status line. */ export interface VercelStatusSnapshot { /** Resolved link identity; absent while unlinked or while a probe is in flight. */ identity?: ProjectIdentity; /** A /channels run added ≥1 channel this session and no /deploy has shipped since. */ pendingDeploy: boolean; } /** * Status-line effect a completed setup command reports back to the runner. * Session-scoped by design: a deploy from another terminal or channels added * before this session escape it — accepted v1 limits. */ export type VercelStatusEffect = { kind: "channels-added"; } | { kind: "deployed"; } | { kind: "refresh-identity"; }; export interface VercelStatusTrackerOptions { /** Absolute local application root holding the `.vercel` link directory. */ appRoot: string; /** Receives every snapshot change, including async identity resolutions. */ onChange: (snapshot: VercelStatusSnapshot) => void; /** Test seam; defaults to the real network-bound probe. */ detectIdentity?: typeof detectProjectIdentity; } /** * Owns the Vercel segment of the dev TUI status line: one cached link * identity and the session-scoped pending-deploy flag. The identity probe is * network-bound (it shells `vercel api`), so it runs only at startup and * after provider setup or a /deploy — never on a poll. A linked directory * whose `vercel` CLI call fails resolves to the raw project id as the name * (see {@link detectProjectIdentity}); an unlinked one resolves to no identity, * which hides the segment. */ export interface VercelStatusTracker { /** Fire-and-forget identity re-probe; stale resolutions are discarded. */ refreshIdentity(): void; applyEffect(effect: VercelStatusEffect): void; current(): VercelStatusSnapshot; /** Stops future onChange emissions; in-flight probe results are dropped. */ dispose(): void; } /** Creates the {@link VercelStatusTracker} for one dev TUI session. */ export declare function createVercelStatusTracker(options: VercelStatusTrackerOptions): VercelStatusTracker;