import { A as Async, R as RuntimeHooks, e as RuntimeEmitContext } from './effect-DbEMiMvv.js'; type CircuitBreakerState = "closed" | "open" | "half-open"; type CircuitBreakerError = { readonly _tag: "CircuitBreakerOpen"; readonly openSince: number; readonly failures: number; }; type CircuitBreakerConfig = { /** Number of consecutive failures before opening the circuit. Default: 5 */ readonly failureThreshold?: number; /** Time in ms to wait before transitioning from OPEN to HALF_OPEN. Default: 30000 */ readonly resetTimeoutMs?: number; /** Number of successes in HALF_OPEN needed to close the circuit. Default: 1 */ readonly successThreshold?: number; /** Custom predicate: should this error count as a failure? Default: all errors count. */ readonly isFailure?: (error: unknown) => boolean; /** Called on state transitions (for observability). */ readonly onStateChange?: (from: CircuitBreakerState, to: CircuitBreakerState) => void; }; type CircuitBreakerStats = { readonly state: CircuitBreakerState; readonly failures: number; readonly successes: number; readonly totalRequests: number; readonly totalFailures: number; readonly totalSuccesses: number; readonly totalRejected: number; readonly lastFailureTime: number | null; readonly lastSuccessTime: number | null; }; type CircuitBreaker = { /** Current state of the circuit breaker. */ readonly state: () => CircuitBreakerState; /** Run an effect through the circuit breaker. */ readonly protect: (effect: Async) => Async; /** Get current stats. */ readonly stats: () => CircuitBreakerStats; /** Manually reset to closed state. */ readonly reset: () => void; }; /** * Creates a circuit breaker. * * ```ts * const breaker = makeCircuitBreaker({ failureThreshold: 3, resetTimeoutMs: 10000 }); * * // Protect an effect: * const result = await run(breaker.protect(callExternalService())); * // Throws CircuitBreakerOpen if circuit is open * ``` */ declare function makeCircuitBreaker(config?: CircuitBreakerConfig): CircuitBreaker; type RuntimeTimerId = unknown; type RuntimeClock = { readonly now: () => number; readonly setTimeout: (task: () => void, ms: number) => RuntimeTimerId; readonly clearTimeout: (timer: RuntimeTimerId) => void; }; type RuntimeClockEnv = { readonly brass?: { readonly clock?: RuntimeClock; }; }; declare const liveClock: RuntimeClock; declare function runtimeClockFromEnv(env: unknown): RuntimeClock; type ScheduleDecision = { readonly continue: boolean; readonly delayMs: number; readonly attempt?: number; readonly elapsedMs?: number; readonly reason?: string; readonly name?: string; }; type ScheduleJitterOptions = { /** 1 means full jitter in [0, delay], 0.2 means +/-20% around delay. */ readonly factor?: number; /** Deterministic hook for tests. Defaults to Math.random. */ readonly random?: () => number; }; type ScheduleStepContext = { readonly clock: RuntimeClock; readonly startedAtMs: number; readonly attempt: number; readonly name?: string; }; type ScheduleObserverEvent = { readonly name?: string; readonly input: I; readonly output: O; readonly decision: ScheduleDecision; readonly attempt: number; readonly elapsedMs: number; readonly state: unknown; readonly nextState: unknown; readonly timestamp: number; }; type ScheduleObserver = (event: ScheduleObserverEvent) => void; type ScheduleDriverDecision = { readonly continue: boolean; readonly delayMs: number; readonly output: O; readonly decision: ScheduleDecision; readonly attempt: number; readonly elapsedMs: number; readonly state: unknown; }; type ScheduleDriverSnapshot = { readonly name?: string; readonly attempt: number; readonly elapsedMs: number; readonly state: unknown; readonly last?: ScheduleDriverDecision; }; type ScheduleDriverOptions = { readonly name?: string; readonly clock?: RuntimeClock; readonly startedAtMs?: number; readonly onDecision?: ScheduleObserver; readonly hooks?: RuntimeHooks; readonly emitContext?: RuntimeEmitContext; readonly captureInput?: boolean; readonly captureOutput?: boolean; }; type ScheduleDriver = { readonly next: (input: I) => ScheduleDriverDecision; readonly reset: () => void; readonly snapshot: () => ScheduleDriverSnapshot; readonly state: () => unknown; readonly last: () => ScheduleDriverDecision | undefined; }; /** Retry/repeat up to N times with no delay. */ declare function recurs(n: number): Schedule; /** Continue forever with no delay. */ declare function forever(): Schedule; /** Never continue. */ declare function never(): Schedule; /** Continue exactly once. */ declare function once(): Schedule; /** Fixed delay between each retry/repeat. */ declare function fixed(delayMs: number): Schedule; /** Alias for fixed delay schedules. */ declare const spaced: typeof fixed; /** Exponential backoff: delay doubles each time, capped at maxDelayMs. */ declare function exponential(baseMs: number, maxMs?: number): Schedule; /** Linear backoff: base, 2*base, 3*base... capped at maxDelayMs. */ declare function linear(baseMs: number, maxMs?: number): Schedule; /** Fibonacci backoff: base, base, 2*base, 3*base, 5*base, capped at maxDelayMs. */ declare function fibonacci(baseMs: number, maxMs?: number): Schedule; /** Exponential backoff with full jitter (random in [0, delay]). */ declare function jittered(baseMs: number, maxMs?: number): Schedule; /** Stop after a total elapsed time. */ declare function elapsed(maxMs: number): Schedule; /** Only continue while a predicate holds on the input. */ declare function whileInput(pred: (input: I) => boolean): Schedule; /** Continue until the input predicate becomes true. */ declare function untilInput(pred: (input: I) => boolean): Schedule; /** Limit a schedule to N repetitions. */ declare function take(schedule: Schedule, n: number): Schedule; /** Transform schedule output while preserving decisions and state. */ declare function map(schedule: Schedule, f: (output: O) => O2): Schedule; /** Transform schedule input before it reaches the wrapped schedule. */ declare function contramap(schedule: Schedule, f: (input: I0) => I): Schedule; /** Add jitter to any schedule's delay. */ declare function jitteredSchedule(schedule: Schedule, options?: number | ScheduleJitterOptions): Schedule; declare const jitter: typeof jitteredSchedule; /** * Reset a schedule's internal state after a rolling time window. * Useful for retry/polling policies that should forgive old bursts. */ declare function windowed(schedule: Schedule, windowMs: number, clock?: () => number): Schedule; /** Cap a schedule's delay without changing its state or output. */ declare function maxDelay(schedule: Schedule, maxMs: number): Schedule; /** Stop a schedule after a total elapsed runtime-clock budget. */ declare function maxElapsed(schedule: Schedule, maxMs: number): Schedule; declare const upTo: typeof maxElapsed; /** Continue while a predicate holds on the wrapped schedule output. */ declare function whileOutput(schedule: Schedule, pred: (output: O) => boolean): Schedule; /** Continue until a predicate holds on the wrapped schedule output. */ declare function untilOutput(schedule: Schedule, pred: (output: O) => boolean): Schedule; /** Attach an observability name to a schedule. */ declare function named(name: string, schedule: Schedule): Schedule; /** Observe each schedule decision without changing semantics. */ declare function tapDecision(schedule: Schedule, tap: ScheduleObserver): Schedule; /** Compose two schedules: use the first, then switch to the second. */ declare function andThen(first: Schedule, second: Schedule): Schedule; /** Run both schedules and continue while BOTH say continue. Use max delay. */ declare function intersect(left: Schedule, right: Schedule): Schedule; /** Run both schedules and continue while EITHER says continue. Use min delay. */ declare function union(left: Schedule, right: Schedule): Schedule; declare function makeScheduleDriver(schedule: Schedule, options?: ScheduleDriverOptions): ScheduleDriver; declare const scheduleDriver: typeof makeScheduleDriver; declare function runSchedule(schedule: Schedule, inputs: Iterable, options?: ScheduleDriverOptions): ScheduleDriverDecision[]; /** * Retry an effect according to a schedule. * The schedule receives the error as input on each failure. */ declare function retryWithSchedule(effect: Async, schedule: Schedule, options?: ScheduleDriverOptions): Async; declare const retry: typeof retryWithSchedule; /** * Repeat an effect according to a schedule. * The schedule receives the success value as input on each iteration. * Returns the last successful value. */ declare function repeatWithSchedule(effect: Async, schedule: Schedule, options?: ScheduleDriverOptions): Async; declare const repeat: typeof repeatWithSchedule; declare const poll: typeof repeatWithSchedule; /** * A Schedule takes an input I (typically the error or output of an effect) * and decides whether to continue and with what delay. */ type Schedule = { readonly _tag: "Schedule"; readonly name?: string; /** Initial state */ readonly initial: (context?: ScheduleStepContext) => any; /** Given current state and input, produce a decision and next state */ readonly step: (state: any, input: I, context?: ScheduleStepContext) => [ScheduleDecision, any, O]; }; declare const Schedule: Readonly<{ driver: typeof makeScheduleDriver; run: typeof runSchedule; recurs: typeof recurs; forever: typeof forever; never: typeof never; once: typeof once; fixed: typeof fixed; spaced: typeof fixed; linear: typeof linear; exponential: typeof exponential; fibonacci: typeof fibonacci; jittered: typeof jittered; jitteredSchedule: typeof jitteredSchedule; jitter: typeof jitteredSchedule; elapsed: typeof elapsed; whileInput: typeof whileInput; untilInput: typeof untilInput; whileOutput: typeof whileOutput; untilOutput: typeof untilOutput; take: typeof take; map: typeof map; contramap: typeof contramap; maxDelay: typeof maxDelay; maxElapsed: typeof maxElapsed; upTo: typeof maxElapsed; windowed: typeof windowed; named: typeof named; tapDecision: typeof tapDecision; andThen: typeof andThen; intersect: typeof intersect; union: typeof union; retry: typeof retryWithSchedule; repeat: typeof repeatWithSchedule; poll: typeof repeatWithSchedule; }>; type ServiceTag = { readonly _tag: "ServiceTag"; readonly key: symbol; readonly name: string; }; declare class MissingLayerServiceError extends Error { readonly _tag: "MissingLayerService"; readonly serviceName: string; constructor(serviceName: string); } declare function formatLayerError(error: unknown): string; declare function makeServiceTag(name: string): ServiceTag; declare const serviceTag: typeof makeServiceTag; declare const defineService: typeof makeServiceTag; declare class LayerContext { private readonly services; constructor(entries?: Iterable, unknown]> | Map); static empty(): LayerContext; get(tag: ServiceTag): A | undefined; unsafeGet(tag: ServiceTag): A; has(tag: ServiceTag): boolean; add(tag: ServiceTag, service: A): LayerContext; merge(other: LayerContext): LayerContext; size(): number; } type LayerScope = { readonly get: (layer: Layer, deps?: RIn) => Async; readonly close: () => Async; readonly size: () => number; }; type BuiltLayer = { readonly service: ROut; readonly scope: LayerScope; readonly close: () => Async; readonly use: (body: (service: ROut) => Async) => Async; }; type AnyLayer = Layer; type LayerInputOf = L extends Layer ? RIn : never; type LayerErrorOf = L extends Layer ? E : never; type LayerOutputOf = L extends Layer ? ROut : never; type UnionToIntersection = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never; type LastOf = T extends readonly [...unknown[], infer Last] ? Last : never; type ServiceTagMap = Record>; type ServicesOf = { readonly [K in keyof Tags]: Tags[K] extends ServiceTag ? A : never; }; declare function makeLayerScope(): LayerScope; /** * Creates a Layer from an acquire/release pair. * * ```ts * const DbLayer = layer( * () => createPool({ max: 10 }), * (pool) => pool.close() * ); * ``` */ declare function layer(acquire: () => Async, release?: (service: ROut) => Async): Layer; declare function layerValue(tag: ServiceTag, value: A): Layer; declare const makeTestLayer: typeof layerValue; type TestLayerProvider = readonly [ServiceTag, A]; declare function makeTestLayers(...providers: readonly TestLayerProvider[]): Layer; declare function layerEffect(tag: ServiceTag, acquire: (deps: LayerContext) => Async, release?: (service: A) => Async): Layer; declare const layerFromContext: typeof layerEffect; declare const defineLayer: typeof layerEffect; declare function getService(tag: ServiceTag): Async; declare function getServices(tags: Tags): Async>; declare function useService(tag: ServiceTag, use: (service: A) => Async): (context: LayerContext) => Async; declare function useServices(tags: Tags, use: (services: ServicesOf) => Async): (context: LayerContext) => Async; /** * Creates a Layer that depends on another service. * * ```ts * const RepoLayer = layerFrom()( * (pool) => createRepo(pool), * (repo) => repo.close() * ); * ``` */ declare function layerFrom(): (acquire: (deps: RIn) => Async, release?: (service: ROut) => Async) => Layer; /** * Creates a Layer from a pure value (no lifecycle). * * ```ts * const ConfigLayer = layerSucceed({ port: 3000, host: "localhost" }); * ``` */ declare function layerSucceed(value: ROut): Layer; /** * Creates a Layer that always fails. */ declare function layerFail(error: E): Layer; /** * Compose two layers: the output of `from` feeds into `to`. * * ```ts * const AppLayer = compose(DbLayer, RepoLayer); * // DbLayer produces DbPool → RepoLayer consumes DbPool → produces Repo * ``` */ declare function compose(from: Layer, to: Layer): Layer; declare function composeAll(...layers: Layers): Layer, LayerErrorOf, LayerOutputOf>>; /** * Merge two independent layers into one that produces both services. * * ```ts * const AppLayer = merge(DbLayer, CacheLayer); * // Produces { db: DbPool, cache: CacheClient } * ``` */ declare function merge(left: Layer, right: Layer): Layer; declare function mergeAll(...layers: Layers): Layer>, LayerErrorOf, UnionToIntersection>>; /** * Map the output of a layer. */ declare function mapLayer(l: Layer, f: (a: A) => B): Layer; declare function buildLayer(l: Layer, deps?: RIn): Async>; /** * Builds a layer, runs an effect with the produced service, and releases. * * ```ts * const result = await run( * provideLayer(AppLayer, (services) => services.db.query("SELECT 1")) * ); * ``` */ declare function provideLayer(l: Layer, use: (service: ROut) => Async, deps?: RIn): Async; declare function provideLayerContext(l: Layer, use: (context: LayerContext) => Async, deps?: LayerContext): Async; declare const provide: typeof provideLayer; declare const provideContext: typeof provideLayerContext; /** * A Layer describes how to build a service. * * - RIn: dependencies required to build this service * - E: possible failure during construction * - ROut: the service produced */ type Layer = { readonly _tag: "Layer"; readonly build: (deps: RIn) => Async Async; }>; readonly buildScoped?: (deps: RIn, scope: LayerScope) => Async; }; declare const Layer: Readonly<{ make: typeof layer; from: typeof layerFrom; succeed: typeof layerSucceed; fail: typeof layerFail; value: typeof layerValue; test: typeof layerValue; tests: typeof makeTestLayers; effect: typeof layerEffect; define: typeof layerEffect; fromContext: typeof layerEffect; compose: typeof compose; composeAll: typeof composeAll; merge: typeof merge; all: typeof mergeAll; mergeAll: typeof mergeAll; map: typeof mapLayer; provide: typeof provideLayer; provideContext: typeof provideLayerContext; build: typeof buildLayer; scope: typeof makeLayerScope; context: typeof LayerContext.empty; tag: typeof makeServiceTag; service: typeof getService; services: typeof getServices; use: typeof useService; useAll: typeof useServices; }>; export { layerSucceed as $, contramap as A, type BuiltLayer as B, type CircuitBreakerStats as C, defineLayer as D, defineService as E, elapsed as F, exponential as G, fibonacci as H, fixed as I, forever as J, formatLayerError as K, Layer as L, MissingLayerServiceError as M, getService as N, getServices as O, intersect as P, jitter as Q, type RuntimeClock as R, type ServiceTag as S, type TestLayerProvider as T, jittered as U, jitteredSchedule as V, layer as W, layerEffect as X, layerFail as Y, layerFrom as Z, layerFromContext as _, LayerContext as a, layerValue as a0, linear as a1, liveClock as a2, makeCircuitBreaker as a3, makeLayerScope as a4, makeScheduleDriver as a5, makeServiceTag as a6, makeTestLayer as a7, makeTestLayers as a8, mapLayer as a9, untilInput as aA, untilOutput as aB, upTo as aC, useService as aD, useServices as aE, whileInput as aF, whileOutput as aG, windowed as aH, map as aa, maxDelay as ab, maxElapsed as ac, mergeAll as ad, merge as ae, named as af, never as ag, once as ah, poll as ai, provide as aj, provideContext as ak, provideLayer as al, provideLayerContext as am, recurs as an, repeatWithSchedule as ao, repeat as ap, retryWithSchedule as aq, retry as ar, runSchedule as as, runtimeClockFromEnv as at, scheduleDriver as au, serviceTag as av, spaced as aw, take as ax, tapDecision as ay, union as az, type CircuitBreaker as b, type CircuitBreakerConfig as c, type CircuitBreakerError as d, type CircuitBreakerState as e, type LayerErrorOf as f, type LayerInputOf as g, type LayerOutputOf as h, type LayerScope as i, type RuntimeClockEnv as j, type RuntimeTimerId as k, Schedule as l, type ScheduleDecision as m, type ScheduleDriver as n, type ScheduleDriverDecision as o, type ScheduleDriverOptions as p, type ScheduleDriverSnapshot as q, type ScheduleObserver as r, type ScheduleObserverEvent as s, type ScheduleStepContext as t, type ServiceTagMap as u, type ServicesOf as v, andThen as w, buildLayer as x, composeAll as y, compose as z };