import { type EffectMetadata } from "./ledger.js"; /** A bounded, payload-free stage in an effect's lifecycle. */ export type EffectLifecycleStage = "admission" | "execution" | "compensation" | "reconciliation"; export type EffectLifecyclePhase = "started" | "succeeded" | "failed" | "ambiguous"; /** Trace-parent tokens copied structurally from an installed tracing plugin. */ export interface EffectTraceParent { readonly traceId: string; readonly spanId: string; readonly sampled: boolean; } /** * Token-only lifecycle evidence. There is deliberately no payload, argument, result, error message, * request, or context field, so observation adapters cannot accidentally export business data. */ export interface EffectLifecycleEvent extends EffectMetadata { readonly effectId: string; readonly capability: string; readonly stage: EffectLifecycleStage; readonly phase: EffectLifecyclePhase; readonly at: number; readonly durationMs?: number; readonly attempt?: number; readonly errorCode?: string; readonly trace?: EffectTraceParent; } /** Observation is fail-open: a broken sink must never change effect behavior. */ export type EffectLifecycleObserver = (event: EffectLifecycleEvent) => void; export declare function effectTraceParentOf(context: object): EffectTraceParent | undefined; export interface EmitEffectLifecycleInput extends EffectMetadata { readonly effectId: string; readonly capability: string; readonly stage: EffectLifecycleStage; readonly phase: EffectLifecyclePhase; readonly at?: number; readonly durationMs?: number; readonly attempt?: number; readonly errorCode?: string; readonly trace?: EffectTraceParent; } /** @internal Validate, freeze, and fan out one token-only event. */ export declare function emitEffectLifecycle(observers: readonly EffectLifecycleObserver[], input: EmitEffectLifecycleInput): void; //# sourceMappingURL=effect-lifecycle.d.ts.map