/** * The one block a deployment prints when `createVendo` finishes composing. * * ◆ vendo ready * │ ✓ sandbox cloud VENDO_API_KEY * │ ✓ store local .vendo/data * │ ✓ models cloud VENDO_API_KEY (gateway) * │ ✓ auth clerk auth: clerk() * │ ⚠ store .vendo/data is under /tmp — data will not survive a redeploy. * │ Mount a volume, or pass url: "postgres://…" to createVendo. * * Column 2 is the VENUE — which implementation the adapter rule chose. Column 3 * is what chose it: the env variable, or the config line the host wrote. The * rows are the same facts `/status` reports (wire/misc.ts), said once, at boot, * to the operator instead of to a client. * * Two hard constraints: * * 1. COMPOSED FACTS ONLY. `createVendo` must stay I/O-free at module init for * Workers portability (compose-store.ts's `selectFiles` note), so nothing * here may stat a path, open a handle, or await anything. Every row is a * property read off the finished composition or an env variable — including * the ephemeral-disk judgment, which its OWNER makes (the store, at * `createStore`) and hangs on the engine handle, so this block reads it * like any other composed fact and renders it as a WARNING, which is data * in `BootSummary`, not a special case in the renderer. * * 2. ONE BLOCK PER PROCESS. A dev server recomposes on nearly every request; * this is a boot fact, not a per-request one (the same latch * `reportHostedStoreOnce` uses). */ import { type VendoStyle } from "./core/index.js"; import type { VendoComposition } from "./compose-context.js"; /** One seam that is serving, and what chose it. */ export interface BootRow { /** The seam, as `/status` names it: sandbox, store, models, connections… */ readonly label: string; /** The implementation the adapter rule picked — cloud, local, e2b, byo… */ readonly venue: string; /** The env variable or config line that chose that venue. */ readonly detail: string; } /** Something the operator has to know about a seam that composed anyway. Data, not a special case: a producer that discovers one (the ephemeral-disk check) appends it, and the renderer already knows how to draw it. */ export interface BootWarning { readonly label: string; /** Shown in the venue column when the warning is ABOUT the venue (a stray key that no longer selects one). Absent → the text starts at that column. */ readonly venue?: string; /** The text, already broken into rail lines. Continuations align under the first line; a degraded run joins them into one. */ readonly lines: readonly string[]; } export interface BootSummary { readonly rows: readonly BootRow[]; readonly warnings: readonly BootWarning[]; } /** The block as text, for the style handed in. Pure — the printer below is the only thing with state, which is what makes every rendering testable. */ export declare function renderBootSummary(summary: BootSummary, style: VendoStyle): string; /** * Say it, once. Everything Vendo says out loud goes through core's sink * (log.ts), so a host can route or quieten this like any other line — and it is * ONE event, so the block can never be split across stdout and stderr and * arrive interleaved with something else. */ export declare function announceBootSummary(summary: BootSummary, style?: VendoStyle): void; /** * The composed facts, as rows. * * A seam earns a row only when it is actually SERVING. An unset sandbox, an * unconfigured guard and an unbrokered connections seam say nothing here — * silence is the honest report for a seam a host chose not to fill, and the * block stays four lines for the deployment that filled four seams. */ export declare function bootSummaryFor(composition: VendoComposition): BootSummary;