run402-mcp
Version:
MCP server for Run402 — full-stack backend infrastructure for AI agents: Postgres, auth, storage, serverless functions and atomic deploys. Paid with x402/MPP. Includes $0.03 image generation.
44 lines • 2.07 kB
TypeScript
/**
* `waitFor` — the one poll loop (attention-architecture Wave E).
*
* Every wait on this platform is the same shape: fetch a fact, ask whether it
* has reached the state you need, sleep, repeat, stop at a deadline. Before
* this helper the shape was hand-rolled three times (escalations'
* `raiseAndWait`, the CLI's `--wait`, room catch-up polling), and each copy
* had to re-decide the one contract that matters:
*
* **Silence is an answer.** On timeout, `waitFor` RETURNS the last observed
* state — it never throws. A thrown timeout invites `catch`-and-proceed,
* which quietly converts "nobody answered" into consent. Returning the
* still-unsettled state forces the caller to look at it and decide, with
* "nothing happened" as a visible input rather than an exception it
* swallowed. (This is the same reason an exhausted escalation rests OPEN and
* a deploy gate must not auto-approve on timeout.)
*/
export interface WaitForOptions {
/** Delay between polls. Clamped to ≥1s so a tight loop cannot hammer the API. */
pollMs?: number;
/** Total budget. When it elapses, the LAST OBSERVED state is returned. */
timeoutMs?: number;
/**
* Called after each poll with the latest state — progress reporting
* (a CLI prints to stderr here) without owning the loop.
*/
onPoll?: (state: unknown, elapsedMs: number) => void;
}
export interface WaitForResult<T> {
state: T;
/** True when `predicate` accepted `state`; false means the wait timed out. */
settled: boolean;
elapsedMs: number;
polls: number;
}
/**
* Poll `fetch` until `predicate(state)` is true or the timeout elapses.
*
* The initial state is fetched immediately (a wait that starts already
* settled costs one call and zero sleeps). A `fetch` rejection propagates —
* an API failure is not silence and must not be mistaken for it.
*/
export declare function waitFor<T>(fetchState: () => Promise<T>, predicate: (state: T) => boolean, opts?: WaitForOptions): Promise<WaitForResult<T>>;
//# sourceMappingURL=wait.d.ts.map