@walkeros/core 4.3.0-next-1784120651691 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/dev.d.mts +2 -0
- package/dist/dev.d.ts +2 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types/cache.ts","../src/types/collector.ts","../src/types/context.ts","../src/types/destination.ts","../src/types/elb.ts","../src/types/hooks.ts","../src/types/logger.ts","../src/types/mapping.ts","../src/types/on.ts","../src/types/transformer.ts","../src/types/request.ts","../src/types/source.ts","../src/types/store.ts","../src/types/trigger.ts","../src/types/lifecycle.ts","../src/types/walkeros.ts","../src/types/simulation.ts","../src/types/matcher.ts","../src/types/hint.ts","../src/types/storage.ts","../src/types/ingest.ts","../src/branch.ts","../src/anonymizeIP.ts","../src/throwError.ts","../src/contract.ts","../src/references.ts","../src/flow.ts","../src/assign.ts","../src/is.ts","../src/clone.ts","../src/byPath.ts","../src/include.ts","../src/castValue.ts","../src/consent.ts","../src/createDestination.ts","../src/deepMerge.ts","../src/getId.ts","../src/hexId.ts","../src/getSpanId.ts","../src/eventGenerator.ts","../src/getTraceId.ts","../src/parseTraceparent.ts","../src/getMarketingParameters.ts","../src/invocations.ts","../src/logger.ts","../src/property.ts","../src/tryCatch.ts","../src/fatalError.ts","../src/mapping.ts","../src/mergeMapping.ts","../src/mockEnv.ts","../src/mockLogger.ts","../src/mockContext.ts","../src/request.ts","../src/send.ts","../src/setup.ts","../src/trim.ts","../src/useHooks.ts","../src/telemetry.ts","../src/telemetryResolver.ts","../src/preview.ts","../src/journey.ts","../src/traceState.ts","../src/emitStep.ts","../src/batchedPoster.ts","../src/userAgent.ts","../src/wrapInlineCode.ts","../src/cdn.ts","../src/observeEnv.ts","../src/mcpHelpers.ts","../src/respond.ts","../src/matcher.ts","../src/route.ts","../src/cache-envelope.ts","../src/store/codec.ts","../src/cache.ts","../src/state.ts","../src/step-entry.ts","../src/examples/formatOut.ts"],"sourcesContent":["export * from './types';\n\nexport * from './branch';\nexport * from './anonymizeIP';\nexport * from './flow';\nexport * from './assign';\nexport * from './byPath';\nexport * from './include';\nexport * from './castValue';\nexport * from './clone';\nexport * from './consent';\nexport * from './createDestination';\nexport * from './deepMerge';\nexport * from './eventGenerator';\nexport * from './getId';\nexport * from './getSpanId';\nexport * from './getTraceId';\nexport { parseTraceparent } from './parseTraceparent';\nexport type { ParsedTraceparent } from './parseTraceparent';\nexport * from './getMarketingParameters';\nexport * from './invocations';\nexport * from './is';\nexport * from './logger';\nexport * from './mapping';\nexport * from './mergeMapping';\nexport * from './mockEnv';\nexport * from './mockContext';\nexport * from './mockLogger';\nexport * from './property';\nexport * from './request';\nexport * from './send';\nexport * from './setup';\nexport * from './throwError';\nexport * from './trim';\nexport * from './tryCatch';\nexport * from './fatalError';\nexport * from './useHooks';\nexport * from './telemetry';\nexport * from './telemetryResolver';\nexport * from './preview';\nexport * from './journey';\nexport { getTraceUntil, setTraceUntil } from './traceState';\nexport { emitStep } from './emitStep';\nexport * from './batchedPoster';\nexport * from './userAgent';\nexport * from './wrapInlineCode';\nexport * from './cdn';\nexport * from './contract';\nexport * from './observeEnv';\nexport * from './mcpHelpers';\nexport * from './respond';\nexport * from './matcher';\n// Route helpers. `getNextSteps` is the runtime resolver. `isRouteArray` and\n// `isRouteConfigEntry` are the canonical shape probes for `Transformer.Route`.\n// `compileNext`, `resolveNext`, `CompiledNext`, and `CompiledRoute` remain\n// package-internal.\nexport { getNextSteps, isRouteArray, isRouteConfigEntry } from './route';\nexport * from './cache';\nexport * from './cache-envelope';\nexport {\n serializeStoreValue,\n deserializeStoreValue,\n StoreCodecError,\n isStoreValue,\n} from './store/codec';\nexport * from './state';\nexport * from './step-entry';\nexport * from './examples/formatOut';\nexport {\n REF_VAR_FULL,\n REF_VAR_INLINE,\n REF_ENV,\n REF_CONTRACT,\n REF_FLOW,\n REF_STORE,\n REF_SECRET,\n REF_CODE_PREFIX,\n scanFlowRefs,\n} from './references';\n","import type { MatchExpression } from './matcher';\nimport type { Value } from './mapping';\n\ninterface BaseCacheRule {\n /**\n * Optional match expression. Omitted means always-match.\n */\n match?: MatchExpression;\n ttl: number;\n}\n\nexport interface EventCacheRule extends BaseCacheRule {\n key: string[];\n update?: Record<string, Value>;\n}\n\nexport interface StoreCacheRule extends BaseCacheRule {\n // intentionally no key (caller provides one) and no update (no event).\n}\n\nexport type CacheRule = EventCacheRule | StoreCacheRule;\n\nexport interface Cache<R extends CacheRule = CacheRule> {\n /**\n * Stop the chain on cache HIT (default: false). When true, skip remaining steps and return cached value.\n */\n stop?: boolean;\n store?: string;\n /**\n * Optional key prefix written to the store. When absent, cache keys are written directly. Same store + same key + same namespace = same cache entry.\n */\n namespace?: string;\n rules: R[];\n}\n","import type {\n Source,\n Destination,\n Store,\n Elb as ElbTypes,\n Hooks,\n Logger,\n On,\n Transformer,\n WalkerOS,\n Mapping,\n} from '.';\nimport type { Ingest } from './ingest';\nimport type { ObserverFn } from './observer';\n\n/** Identifies which kind of step a stepId belongs to. */\nexport type StepKind =\n | 'collector'\n | 'source'\n | 'transformer'\n | 'destination'\n | 'store';\n\n/**\n * Build a stepId for use as a key in `Status.dropped` /\n * `Status.connectionErrors` (and future status maps). The collector-level\n * stepId is the literal \"collector\" (no id). Source/transformer/destination/\n * store ids take the form `\"<kind>.<id>\"`, e.g. `\"destination.ga4\"`.\n *\n * The dot separator mirrors the vocabulary already used in collector\n * log messages (\"collector.queue overflow\", \"destination.dlq overflow\").\n */\nexport function stepId(kind: 'collector'): 'collector';\nexport function stepId(\n kind: 'source' | 'transformer' | 'destination' | 'store',\n id: string,\n): string;\nexport function stepId(kind: StepKind, id?: string): string {\n if (kind === 'collector') return 'collector';\n if (!id) {\n throw new Error(`stepId(${kind}) requires an id`);\n }\n return `${kind}.${id}`;\n}\n\n/**\n * Drop counters at a single step. Each buffer is optional: a step kind\n * may have only `queue` (collector), only `dlq`, both (destinations\n * today), or neither. Counts are monotonic.\n */\nexport interface DroppedCounters {\n queue?: number;\n dlq?: number;\n}\n\n/**\n * Circuit-breaker state for a single step (keyed by `stepId()` in\n * `Status.breakers`). Tracks consecutive transport failures so a step whose\n * transport is down can be skipped (gated) until a cooldown elapses, instead\n * of every event hammering a known-broken writer.\n *\n * - `closed`: healthy; events pass through. `consecutiveFailures` accrues on\n * transport failures and resets to 0 on any success.\n * - `open`: tripped; events are skipped until `openUntil`. The first event at\n * or after `openUntil` transitions to `half-open` and becomes the probe.\n * - `half-open`: a single probe event is allowed through; `probing` marks that\n * the probe slot is taken so concurrent events still skip. A probe success\n * closes the breaker; a probe failure re-opens it with a fresh `openUntil`.\n *\n * `consecutiveFailures` is CONSECUTIVE, not cumulative: a single success\n * resets it, so only an unbroken run reaching the threshold opens the breaker.\n */\nexport interface BreakerState {\n state: 'closed' | 'open' | 'half-open';\n consecutiveFailures: number;\n /** Epoch ms after which an open breaker admits a single probe. */\n openUntil?: number;\n /** True while a half-open probe is in flight (probe slot taken). */\n probing?: boolean;\n}\n\n/**\n * Core collector configuration interface\n */\nexport interface Config {\n /** Whether to run collector automatically */\n run?: boolean;\n /** Static global properties even on a new run */\n globalsStatic: WalkerOS.Properties;\n /** Static session data even on a new run */\n sessionStatic: Partial<SessionData>;\n /** Logger configuration */\n logger?: Logger.Config;\n /**\n * Maximum number of events retained in `collector.queue` for late-registered\n * destination backfill. Overflow drops oldest (FIFO). Default 1000.\n */\n queueMax?: number;\n /** Flow name; keys this flow's entry in event.source.release and the observer flowId. */\n name?: string;\n /** Config release id stamped into event.source.release for this flow. */\n release?: string;\n}\n\n/**\n * Initialization configuration that extends Config with initial state\n */\nexport interface InitConfig extends Partial<Config> {\n /** Initial consent state */\n consent?: WalkerOS.Consent;\n /** Initial user data */\n user?: WalkerOS.User;\n /** Initial global properties */\n globals?: WalkerOS.Properties;\n /** Source configurations */\n sources?: Source.InitSources;\n /** Destination configurations */\n destinations?: Destination.InitDestinations;\n /** Transformer configurations */\n transformers?: Transformer.InitTransformers;\n /** Store configurations */\n stores?: Store.InitStores;\n /** Initial custom properties */\n custom?: WalkerOS.Properties;\n /** Hooks for pipeline observation and interception */\n hooks?: Hooks.Functions;\n}\n\nexport interface SessionData extends WalkerOS.Properties {\n isStart: boolean;\n storage: boolean;\n id?: string;\n start?: number;\n marketing?: true;\n updated?: number;\n isNew?: boolean;\n device?: string;\n count?: number;\n runs?: number;\n}\n\nexport interface Status {\n startedAt: number;\n in: number;\n out: number;\n failed: number;\n sources: Record<string, SourceStatus>;\n destinations: Record<string, DestinationStatus>;\n /**\n * Monotonic counts of events dropped due to buffer caps, keyed by\n * stepId. See `stepId()` for key construction.\n *\n * Examples:\n * - `dropped[\"collector\"]?.queue`: collector replay buffer drops\n * - `dropped[\"destination.ga4\"]?.queue`: ga4's consent-denied buffer drops\n * - `dropped[\"destination.ga4\"]?.dlq`: ga4's dead-letter queue drops\n */\n dropped: Record<string, DroppedCounters>;\n /**\n * Per-step circuit-breaker state, keyed by stepId. See `stepId()` for key\n * construction; keyed step-agnostically (NOT embedded in\n * `DestinationStatus`) so the breaker can guard any step kind, though\n * destinations are the primary use today. A breaker is created lazily on\n * first accounting and stays inert unless its step is configured with a\n * `breaker` (presence-gated): existing flows never trip a breaker.\n *\n * A runtime status field, not drift-guarded (it is observed, never authored\n * in a flow config).\n *\n * Example:\n * - `breakers[\"destination.bigquery\"]`: bigquery's consecutive-failure gate.\n */\n breakers: Record<string, BreakerState>;\n /**\n * Monotonic counts of out-of-band connection-level errors reported by a\n * step via `context.reportError(err)` with no event (an orphan error from\n * an EventEmitter SDK object's `'error'` handler), keyed by stepId. See\n * `stepId()` for key construction; mirrors `dropped`.\n *\n * Distinct from `failed`: `failed` counts events lost in-band (a push that\n * threw, a DLQ'd entry). `connectionErrors` counts connection faults that\n * did not lose a specific event at the moment they fired. Operators read\n * both: a rising `connectionErrors` with flat `failed` means a writer is\n * flapping but events are still landing; both rising means the fault is\n * now dropping events.\n *\n * Example:\n * - `connectionErrors[\"destination.bigquery\"]`: BigQuery stream writer\n * `'error'` events reported between pushes.\n */\n connectionErrors: Record<string, number>;\n}\n\nexport interface SourceStatus {\n count: number;\n lastAt?: number;\n duration: number;\n}\n\nexport interface DestinationStatus {\n count: number;\n failed: number;\n lastAt?: number;\n duration: number;\n /** Current size of the destination's queuePush buffer (point-in-time). */\n queuePushSize: number;\n /** Current size of the destination's DLQ (point-in-time). */\n dlqSize: number;\n /**\n * Number of events buffered in batch scheduler windows but not yet\n * delivered to `pushBatch`. Incremented on enqueue, decremented on\n * flush (whether the flush succeeds or fails). Operators read this\n * to spot batches that never drain.\n */\n inFlightBatch?: number;\n}\n\nexport interface Sources {\n [id: string]: Source.Instance;\n}\n\nexport interface Destinations {\n [id: string]: Destination.Instance;\n}\n\nexport interface Transformers {\n [id: string]: Transformer.Instance;\n}\n\nexport interface Stores {\n [id: string]: Store.Instance;\n}\n\nexport type CommandType =\n | 'action'\n | 'config'\n | 'consent'\n | 'context'\n | 'destination'\n | 'elb'\n | 'globals'\n | 'hook'\n | 'init'\n | 'link'\n | 'run'\n | 'user'\n | 'walker'\n | string;\n\n/**\n * Options passed to collector.push() from sources.\n * NOT a Context - just push metadata.\n */\nexport interface PushOptions {\n id?: string;\n ingest?: Ingest;\n respond?: import('../respond').RespondFn;\n mapping?: Mapping.Config;\n preChain?: string[];\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * Push function signature - handles events only\n */\nexport interface PushFn {\n (\n event: WalkerOS.DeepPartialEvent,\n options?: PushOptions,\n ): Promise<ElbTypes.PushResult>;\n}\n\n/**\n * Command function signature - handles walker commands only\n */\nexport interface CommandFn {\n (command: 'config', config: Partial<Config>): Promise<ElbTypes.PushResult>;\n (command: 'consent', consent: WalkerOS.Consent): Promise<ElbTypes.PushResult>;\n <T extends Destination.Types>(\n command: 'destination',\n init: Destination.Init<T>,\n ): Promise<ElbTypes.PushResult>;\n <K extends keyof Hooks.Functions>(\n command: 'hook',\n init: { name: K; fn: Hooks.Functions[K] },\n ): Promise<ElbTypes.PushResult>;\n (\n command: 'on',\n init: {\n type: On.Types;\n rules: WalkerOS.SingleOrArray<On.Subscription>;\n },\n ): Promise<ElbTypes.PushResult>;\n (command: 'user', user: WalkerOS.User): Promise<ElbTypes.PushResult>;\n (\n command: 'run',\n runState?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): Promise<ElbTypes.PushResult>;\n (command: string, data?: unknown): Promise<ElbTypes.PushResult>;\n}\n\n/**\n * Per-cascade tracking for the bounded recursion guard (see `Instance.cascade`).\n * `counts` maps a subscriber identity object to per-cell-type delivery counts\n * within one top-level command's cascade. A pair is stopped once its count\n * exceeds the guard's bound; the non-convergence error logs once per pair on the\n * crossing transition.\n */\nexport interface Cascade {\n counts: WeakMap<object, Record<string, number>>;\n}\n\n// Main Collector interface\nexport interface Instance {\n push: PushFn;\n command: CommandFn;\n /** Flexible elb() adapter: routes `walker *` to command, events to push. */\n elb: ElbTypes.Fn;\n allowed: boolean;\n config: Config;\n consent: WalkerOS.Consent;\n custom: WalkerOS.Properties;\n sources: Sources;\n destinations: Destinations;\n transformers: Transformers;\n stores: Stores;\n globals: WalkerOS.Properties;\n hooks: Hooks.Functions;\n /**\n * First-class observation channel. The runtime self-emits FlowState\n * records at canonical step sites (collector.push, destination.push,\n * destination.init, destination.pushBatch, destination consent skip,\n * transformer.push, store.get/set/delete, store cache HIT/MISS).\n * Observers run synchronously inside emitStep; thrown values are\n * swallowed. Subscribers add/remove via the standard Set API.\n */\n observers: Set<ObserverFn>;\n /**\n * Optional observation-level supplier installed by bundle codegen. Returns\n * the level currently active for this runtime. Absent means no capture. At\n * `trace` the per-event destination push wraps its env (via `wrapEnv`) to\n * record a destination's declared vendor `calls`; `off`/`standard` and\n * absence leave the push path untouched (zero added per-push cost).\n */\n observeLevel?: () => 'off' | 'standard' | 'trace';\n logger: Logger.Instance;\n on: On.OnConfig;\n queue: WalkerOS.Events;\n round: number;\n /** Run-scoped W3C trace id, minted on each run and stamped onto events. */\n trace?: string;\n /** Static flow name; keys source.release and the observer flowId. */\n name?: string;\n /** Static config release id stamped into source.release for this flow. */\n release?: string;\n /** Per-run emission sequence; reset on each run, incremented per stamped event. */\n count: number;\n /**\n * Monotonic counter bumped on every accepted reactive-state mutation\n * (consent, user, globals, custom). Used for per-subscriber high-water-mark\n * dedup. Not bumped for non-reactive config changes.\n */\n stateVersion: number;\n /**\n * Per-cell change version: the `stateVersion` at which each state cell\n * (`consent`/`user`/`globals`/`custom`) last changed. Lets delivery dedup be\n * per-cell — a subscriber owed two cells at the same `stateVersion` receives\n * both, because each cell's freshness is tracked independently rather than\n * against the single global `stateVersion`. A missing entry reads as 0.\n */\n cellVersion: Record<string, number>;\n /**\n * Per-subscriber, per-cell high-water mark registry for exactly-once state\n * delivery. Keys are subscriber identity objects (a ConsentRule object, a\n * generic-fn, or a source instance); the inner record maps each state-cell\n * type (`consent`/`user`/`globals`/`custom`) to the `stateVersion` at which\n * that subscriber was last invoked FOR THAT CELL. A missing entry means never\n * delivered (sentinel \"-infinity\", read as -1). A subscriber is invoked for a\n * cell iff `stateVersion > mark[cell]` AND `allowed === true`.\n *\n * Per-cell (not a single scalar per subscriber) so a handler owed two\n * distinct cells at the same `stateVersion` — e.g. consent and user both\n * bumped before run — receives both at the run barrier instead of the first\n * delivery advancing one mark and swallowing the second cell's edge.\n */\n delivery: WeakMap<object, Record<string, number>>;\n /**\n * Transient per-cascade tracking for the bounded recursion guard. A\n * top-level state command creates this when it first enters the delivery\n * cascade and tears it down when it returns; nested commands emitted by\n * reacting callbacks reuse the same structure. It counts deliveries per\n * `(subscriber, cell-type)` so a cyclic cascade terminates (and logs once)\n * instead of recursing until stack overflow. `undefined` between top-level\n * commands. See `on.ts` `cascadeAllow`.\n *\n * This tracker, together with `stateVersion` and `delivery`, assumes top-level\n * state commands are processed serially on a given collector. Concurrent,\n * overlapping state commands on one shared collector are not supported (web is\n * serial; the server per-request path is event push, not state commands).\n */\n cascade?: Cascade;\n session: undefined | SessionData;\n status: Status;\n timing: number;\n user: WalkerOS.User;\n pending: {\n destinations: Destination.InitDestinations;\n };\n /**\n * Set true on the first `shutdown` command, guarding re-entrancy: a second\n * `walker shutdown` must not re-run `destroyAllSteps` and double-close\n * writers, destinations, or stores. Subsequent shutdown commands no-op.\n * Initialized to `false` by the collector factory; absence (`undefined`)\n * is treated as \"not yet shut down\", so the first shutdown still runs.\n */\n hasShutdown?: boolean;\n /**\n * Every event type ever broadcast through `onApply` (state, lifecycle, and\n * arbitrary). Lets a `require:[<arbitrary>]` gate be satisfied by the current\n * recorded state for events that have no backing cell, including a broadcast\n * that fired before the requiring step registered.\n */\n seenEvents: Set<string>;\n}\n","import type { Collector, Logger, WalkerOS } from '.';\n\n/**\n * Base context interface for walkerOS stages.\n * Sources, Transformers, and Destinations extend this.\n */\nexport interface Base<C = unknown, E = unknown> {\n collector: Collector.Instance;\n logger: Logger.Instance;\n config: C;\n env: E;\n /**\n * Out-of-band error seam available to every step kind (source,\n * transformer, store, destination). A step that owns an EventEmitter SDK\n * object (BigQuery `StreamConnection`, a Redis client, a Kafka producer)\n * calls this from the object's `'error'` handler, where there is no\n * surrounding `await`/`tryCatchAsync` to catch into and an unhandled\n * `'error'` would otherwise crash the process on a detached tick.\n *\n * MUST NOT throw (it runs on a detached emitter tick; a throw inside it\n * would reintroduce the uncaughtException it exists to prevent).\n *\n * - With `event`: routes that event through the same per-step failure\n * accounting an in-band push failure uses (the destination DLQ + the\n * `failed` counters), so a connection error that loses a specific event\n * is counted and surfaced exactly like a synchronous push failure.\n * - Without `event` (an orphan / connection-level error, e.g. a stream\n * writer that errored between pushes): a contained `logger.error` plus a\n * bump of `Status.connectionErrors[stepId]`. It does NOT bump\n * `Status.failed` (no event was lost at this instant; the next push that\n * hits the broken writer is what gets DLQ'd and counted as failed, so\n * counting the orphan against `failed` would double-count).\n */\n reportError?(err: unknown, event?: WalkerOS.Event): void;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Collector,\n Logger,\n Mapping as WalkerOSMapping,\n On,\n Transformer,\n WalkerOS,\n Context as BaseContext,\n} from '.';\nimport type { DestroyFn, SetupFn } from './lifecycle';\nimport type { Ingest } from './ingest';\n\n/**\n * Base environment requirements interface for walkerOS destinations\n *\n * This defines the core interface that destinations can use to declare\n * their runtime environment requirements. Platform-specific extensions\n * should extend this interface.\n */\nexport interface BaseEnv {\n /**\n * Generic global properties that destinations may require\n * Platform-specific implementations can extend this interface\n */\n [key: string]: unknown;\n}\n\n/**\n * Observe-mode call recorder injected into a per-push env (under the runtime\n * `OBSERVE_ENV_KEY`) for vendor-call paths that could NOT be resolved at wrap\n * time (root or leaf missing, e.g. a live-web global not yet installed). The\n * resolution-point wrapper (web-core `getEnv`) reads this, wraps the matching\n * globals via a transparent Proxy, and forwards each intercepted call to\n * `record`. The key is stripped before the env reaches the destination.\n */\nexport interface EnvObserve {\n /**\n * Dot-paths to intercept, with any `call:` prefix already stripped (as\n * `parseCallPath` returns them). Each is a `root.leaf` chain resolved against\n * the merged env.\n */\n paths: string[];\n /**\n * Appends one recorded invocation. `fn` is the full intercepted dot-path,\n * `args` the call arguments. Implementations push onto the shared `calls`\n * array that backs the destination out record.\n */\n record: (fn: string, args: unknown[]) => void;\n}\n\n/**\n * Type bundle for destination generics.\n * Groups Settings, InitSettings, Mapping, Env, and Setup into a single type parameter.\n */\nexport interface Types<\n S = unknown,\n M = unknown,\n E = BaseEnv,\n I = S,\n U = unknown,\n C = unknown,\n> {\n settings: S;\n initSettings: I;\n mapping: M;\n env: E;\n setup: U;\n credentials: C;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n env: any;\n setup: any;\n credentials: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\nexport type SetupOptions<T extends TypesGeneric = Types> = T['setup'];\nexport type Credentials<T extends TypesGeneric = Types> = T['credentials'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n config: Config<T>;\n queuePush?: WalkerOS.Events;\n queueOn?: Array<{ type: On.Types; data?: unknown }>;\n dlq?: DLQ;\n batches?: BatchRegistry<Mapping<T>>;\n type?: string;\n /**\n * Observable env callables for trace-level vendor-call capture. Dot-paths of\n * the functions this destination invokes on its env, using the same grammar\n * as the dev-env `simulation` lists (incl. an optional `call:` prefix), e.g.\n * `['call:window.gtag']`. When present AND the collector reports trace level,\n * the per-event push env is wrapped (via `wrapEnv`) so each listed call is\n * recorded onto the destination out record. Absent or empty = no capture.\n */\n calls?: string[];\n env?: Env<T>;\n setup?: SetupFn<Config<T>, Env<T>>;\n init?: InitFn<T>;\n push: PushFn<T>;\n pushBatch?: PushBatchFn<T>;\n on?: On.OnFn;\n destroy?: DestroyFn<Config<T>, Env<T>>;\n}\n\nexport interface Config<T extends TypesGeneric = Types> {\n /** Required consent states to push events; queues events when not granted. */\n consent?: WalkerOS.Consent;\n /** Implementation-specific configuration passed to the init function. */\n settings?: InitSettings<T>;\n /**\n * Optional, strictly-typed credentials slot. Back it with a managed secret\n * via `$secret.NAME` (credentials use `$secret`, not `$env`). The package\n * defines the shape via `Types['credentials']`. `settings.<sdk>` stays the\n * escape hatch for raw SDK options.\n */\n credentials?: Credentials<T>;\n /** Global data transformation applied to all events; result passed as context.data to push. */\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n /** Event sections to flatten into context.data. */\n include?: string[];\n /** Runtime dependencies merged from code and config env; extensible per destination. */\n env?: Env<T>;\n /** Destination identifier; auto-generated if not provided. */\n id?: string;\n /** Whether the destination has been initialized; prevents re-initialization. */\n init?: boolean;\n /** Whether to load external scripts (e.g., gtag.js); destination-specific behavior. */\n loadScript?: boolean;\n /** Logger configuration (level, handler) to override the collector's defaults. */\n logger?: Logger.Config;\n /** Entity-action rules to filter, rename, transform, and batch events for this destination. */\n mapping?: WalkerOSMapping.Rules<WalkerOSMapping.Rule<Mapping<T>>>;\n /** Pre-processing rules applied to all events before mapping; modifies events in-place. */\n policy?: Policy;\n /** Whether to queue events when consent is not granted; defaults to true. */\n queue?: boolean;\n /** Defer destination initialization until these collector events fire (e.g., `['consent']`). */\n require?: string[];\n /**\n * Provisioning options for `walkeros setup`. `boolean | object`.\n * Triggered only by explicit CLI invocation; never automatic.\n */\n setup?: boolean | SetupOptions<T>;\n /** Transformer chain to run after collector processing but before this destination. */\n before?: Transformer.Route;\n /** Transformer chain to run after destination push completes. Push response available at ingest._response. */\n next?: Transformer.Route;\n /** Cache configuration for deduplication (step-level: skip push on HIT). */\n cache?: import('./cache').Cache;\n /** Declarative store get/set operations applied around this destination. */\n state?: import('./state').State | import('./state').State[];\n /** Completely skip this destination — no init, no push, no queuing. */\n disabled?: boolean;\n /**\n * Per-destination delivery timeout in ms (default 10000); a delivery that\n * does not settle within this window is routed to the DLQ like a thrown push.\n */\n timeout?: number;\n /** Return this value instead of calling push(). Uses !== undefined check to support falsy values. */\n mock?: unknown;\n /**\n * Maximum number of consent-denied events retained in `queuePush` for\n * this destination. Overflow drops oldest (FIFO). Default 1000.\n */\n queueMax?: number;\n /**\n * Maximum number of failed-push entries retained in `dlq` for this\n * destination. Overflow drops oldest (FIFO). Default 100.\n */\n dlqMax?: number;\n /**\n * Enables batching for ALL of this destination's events into one shared\n * default buffer. A mapping rule's own `batch` splits that entity-action\n * into its own buffer and overrides per field (`rule ?? config ?? default`).\n * Batching stays off when neither is set. A bare number is treated as the\n * debounce `wait` window.\n *\n * - `wait`: debounce window in ms; the timer resets on every push.\n * - `size`: hard count cap; flush immediately when entries reach this number. Default 1000 when batching is enabled.\n * - `age`: time since the first entry of the current window. Forces a flush even if pushes keep arriving. Default 30000 (30s).\n */\n batch?: number | BatchOptions;\n /**\n * Per-destination circuit breaker. Presence-gated: when unset the breaker is\n * inert and behavior is unchanged. After `threshold` CONSECUTIVE transport\n * failures (a thrown push, a timed-out push, a whole-batch throw, a\n * connection-level `reportError(err, event)`) the breaker opens and events\n * are skipped (counted, not pushed) until `cooldown` ms elapse, then a single\n * probe event is allowed; its success closes the breaker, its failure\n * re-opens it. Partial-batch row failures are breaker-neutral. A bare number\n * is the `threshold`.\n *\n * - `threshold`: consecutive transport failures before opening. Default 5.\n * - `cooldown`: ms an open breaker waits before admitting a probe. Default 30000.\n */\n breaker?: number | BreakerOptions;\n}\n\n/**\n * Circuit-breaker tuning. Used at the destination-config layer\n * (`Destination.Config.breaker`). A bare number is treated as `threshold`.\n */\nexport interface BreakerOptions {\n /** Consecutive transport failures before the breaker opens. Default 5. */\n threshold?: number;\n /** Milliseconds an open breaker waits before admitting a probe. Default 30000. */\n cooldown?: number;\n}\n\n/**\n * Batch scheduling options. Used at both the mapping-rule layer\n * (`Mapping.Rule.batch`) and the destination-config layer\n * (`Destination.Config.batch`). Same shape at both layers.\n */\nexport interface BatchOptions {\n /** Debounce window in ms. Timer resets on every push. */\n wait?: number;\n /** Hard count cap. Flushes immediately at this size. */\n size?: number;\n /** Hard age cap in ms since first entry of current window. */\n age?: number;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Env<T>,\n InitSettings<T>,\n SetupOptions<T>,\n Credentials<T>\n >\n>;\n\nexport interface Policy {\n [key: string]: WalkerOSMapping.Value;\n}\n\nexport type Code<T extends TypesGeneric = Types> = Instance<T>;\n\nexport type Init<T extends TypesGeneric = Types> = {\n code: Code<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n before?: Transformer.Route;\n next?: Transformer.Route;\n cache?: import('./cache').Cache;\n state?: import('./state').State | import('./state').State[];\n};\n\nexport interface InitDestinations {\n [key: string]: Init<any>;\n}\n\nexport interface Destinations {\n [key: string]: Instance;\n}\n\n/**\n * Context provided to destination functions.\n * Extends base context with destination-specific properties.\n */\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Config<T>, Env<T>> {\n id: string;\n data?: Data;\n}\n\nexport interface PushContext<\n T extends TypesGeneric = Types,\n> extends Context<T> {\n ingest: Ingest;\n rule?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport interface PushBatchContext<\n T extends TypesGeneric = Types,\n> extends Context<T> {\n ingest: Ingest;\n rule?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\nexport type PushFn<T extends TypesGeneric = Types> = (\n event: WalkerOS.Event,\n context: PushContext<T>,\n) => WalkerOS.PromiseOrValue<void | unknown>;\n\n/**\n * Per-row outcome for a single failed batch entry.\n *\n * `index` is the position into the flushed batch's `entries` array (the same\n * order `flushBatch` iterates), so the collector can route exactly that entry\n * to the DLQ. `error` is the per-row failure carried into the DLQ pair; when\n * omitted the collector substitutes a generic batch error.\n */\nexport interface BatchFailure {\n index: number;\n error?: unknown;\n}\n\n/**\n * Partial-failure result of a `pushBatch` call.\n *\n * `failed` lists the entries (by index into the flushed batch's `entries`\n * array) that did NOT succeed. Every other entry is treated as delivered.\n */\nexport interface BatchOutcome {\n failed: BatchFailure[];\n}\n\n/**\n * Pushes a batch of events to a destination.\n *\n * Return contract (backward-compatible, additive):\n * - Resolve `void` (the historical contract): the WHOLE batch succeeded. The\n * collector counts every entry as delivered.\n * - Throw / reject: the WHOLE batch failed. The collector routes every entry\n * to the DLQ and increments `failed` by the batch size. Unchanged.\n * - Resolve a `BatchOutcome`: PARTIAL failure. Only the entries listed in\n * `outcome.failed` (by `index` into the flushed `entries` array) are routed\n * to the DLQ and counted as failed, each with its own `error`. The remaining\n * entries are counted as delivered. This lets a destination report row-level\n * failures without forcing already-succeeded rows onto the DLQ, which would\n * duplicate them on a later DLQ retry.\n *\n * Indices in `failed` must line up with the order of `batch.entries`.\n */\nexport type PushBatchFn<T extends TypesGeneric = Types> = (\n batch: Batch<Mapping<T>>,\n context: PushBatchContext<T>,\n) => WalkerOS.PromiseOrValue<void | BatchOutcome>;\n\nexport type PushEvent<Mapping = unknown> = {\n event: WalkerOS.Event;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n};\nexport type PushEvents<Mapping = unknown> = Array<PushEvent<Mapping>>;\n\nexport interface BatchEntry<Mapping = unknown> {\n event: WalkerOS.Event;\n ingest?: Ingest;\n respond?: import('../respond').RespondFn;\n rule?: WalkerOSMapping.Rule<Mapping>;\n data?: Data;\n}\n\nexport interface Batch<Mapping> {\n key: string;\n /**\n * Per-event entries carrying per-event ingest, respond, rule, and data.\n * Destinations needing per-event metadata should read this instead of\n * (or in addition to) `events` and `data`.\n */\n entries: BatchEntry<Mapping>[];\n /** Derived view: events from `entries`. Kept for back-compat. */\n events: WalkerOS.Events;\n /** Derived view: data from `entries`. Kept for back-compat. */\n data: Array<Data>;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n}\n\nexport interface BatchRegistry<Mapping> {\n [mappingKey: string]: {\n batched: Batch<Mapping>;\n /**\n * Marks a buffer created by `config.batch` (the destination-wide default\n * batch) rather than a mapping rule's own `batch`. The default buffer is\n * heterogeneous, so its flush reports `rule: undefined` to consumers.\n */\n isDefault?: boolean;\n batchFn: () => void;\n /**\n * Force a flush of the current batch immediately. Used by shutdown\n * drain and by tests for deterministic flushing without timer\n * advancement. Resolves after the underlying `pushBatch` settles.\n */\n flush: () => Promise<void>;\n };\n}\n\nexport type Data =\n | WalkerOS.Property\n | undefined\n | Array<WalkerOS.Property | undefined>;\n\nexport interface Ref {\n type: string; // Destination type (\"gtag\", \"meta\", \"bigquery\")\n data?: unknown; // Response from push()\n error?: unknown; // Error if failed\n}\n\nexport type Push = {\n queuePush?: WalkerOS.Events;\n error?: unknown;\n};\n\nexport type DLQ = Array<[WalkerOS.Event, unknown]>;\n\n/**\n * Typed accessor for destinations registered on a collector.\n *\n * The collector's `destinations` bag indexes to `Destination.Instance`\n * (defaults erase the generic). Use this helper at the call site to recover\n * the narrow type without casts.\n *\n * @example\n * type MyDestTypes = Destination.Types<MySettings, MyMapping>;\n * const dest = getDestination<MyDestTypes>(collector, 'myDest');\n * await dest.push(event, context);\n *\n * @throws Error with message `Destination not found: <id>` when the id is unknown.\n */\nexport function getDestination<T extends TypesGeneric = Types>(\n collector: { destinations: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const destination = collector.destinations[id];\n if (!destination) {\n throw new Error(`Destination not found: ${id}`);\n }\n return destination as unknown as Instance<T>;\n}\n","import type { Destination, Hooks, On, WalkerOS } from '.';\n\n// Event signatures only\nexport interface EventFn<R = Promise<PushResult>> {\n (partialEvent: WalkerOS.DeepPartialEvent): R;\n (event: string): R;\n (event: string, data: WalkerOS.Properties): R;\n}\n\n// Complete function interface - can be extended by other interfaces\nexport interface Fn<R = Promise<PushResult>, Config = unknown>\n extends EventFn<R>, WalkerCommands<R, Config> {\n // Interface intentionally empty - combines EventFn and WalkerCommands\n}\n\n// Walker commands (clear, predefined list)\nexport interface WalkerCommands<R = Promise<PushResult>, Config = unknown> {\n (event: 'walker config', config: Partial<Config>): R;\n (event: 'walker consent', consent: WalkerOS.Consent): R;\n <T extends Destination.Types>(\n event: 'walker destination',\n init: Destination.Init<T>,\n ): R;\n <K extends keyof Hooks.Functions>(\n event: 'walker hook',\n init: { name: K; fn: Hooks.Functions[K] },\n ): R;\n (\n event: 'walker on',\n init: {\n type: On.Types;\n rules: WalkerOS.SingleOrArray<On.Subscription>;\n },\n ): R;\n (event: 'walker user', user: WalkerOS.User): R;\n (\n event: 'walker run',\n runState?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): R;\n}\n\nexport type Event<R = Promise<PushResult>> = (\n partialEvent: WalkerOS.DeepPartialEvent,\n) => R;\n\n// Simplified push data types for core collector\nexport type PushData<Config = unknown> =\n | WalkerOS.DeepPartial<Config>\n | WalkerOS.Consent\n | WalkerOS.User\n | WalkerOS.Properties;\n\nexport interface PushResult {\n ok: boolean;\n event?: WalkerOS.Event;\n done?: Record<string, Destination.Ref>;\n queued?: Record<string, Destination.Ref>;\n failed?: Record<string, Destination.Ref>;\n}\n\n// Simplified Layer type for core collector\nexport type Layer = Array<IArguments | WalkerOS.DeepPartialEvent | unknown[]>;\n","// Define a generic type for functions with specific parameters and return type\nexport type AnyFunction<P extends unknown[] = never[], R = unknown> = (\n ...args: P\n) => R;\n\n// Define a generic type for a dictionary of functions\nexport type Functions = {\n [key: string]: AnyFunction;\n};\n\n// Define a parameter interface to wrap the function and its result\ninterface Parameter<P extends unknown[], R> {\n fn: (...args: P) => R;\n result?: R;\n}\n\n// Define the HookFn type using generics for better type safety\nexport type HookFn<T extends AnyFunction> = (\n params: Parameter<Parameters<T>, ReturnType<T>>,\n ...args: Parameters<T>\n) => ReturnType<T>;\n","/**\n * Log levels from most to least severe\n */\nexport enum Level {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\n/**\n * Normalized error context extracted from Error objects\n */\nexport interface ErrorContext {\n message: string;\n name: string;\n stack?: string;\n cause?: unknown;\n}\n\n/**\n * Context passed to log handlers\n * If an Error was passed, it's normalized into the error property\n */\nexport interface LogContext {\n [key: string]: unknown;\n error?: ErrorContext;\n}\n\n/**\n * Log message function signature\n * Accepts string or Error as message, with optional context\n */\nexport type LogFn = (\n message: string | Error,\n context?: unknown | Error,\n) => void;\n\n/**\n * Throw function signature - logs error then throws\n * Returns never as it always throws\n */\nexport type ThrowFn = (message: string | Error, context?: unknown) => never;\n\n/**\n * Default handler function (passed to custom handlers for chaining)\n */\nexport type DefaultHandler = (\n level: Level,\n message: string,\n context: LogContext,\n scope: string[],\n) => void;\n\n/**\n * Custom log handler function\n * Receives originalHandler to allow middleware-style chaining\n */\nexport type Handler = (\n level: Level,\n message: string,\n context: LogContext,\n scope: string[],\n originalHandler: DefaultHandler,\n) => void;\n\n/**\n * Logger instance with scoping support\n * All logs automatically include trace path from scoping\n */\nexport interface Instance {\n /**\n * Log an error message (always visible unless silenced)\n */\n error: LogFn;\n\n /**\n * Log a warning (degraded state, config issues, transient failures)\n */\n warn: LogFn;\n\n /**\n * Log an informational message\n */\n info: LogFn;\n\n /**\n * Log a debug message\n */\n debug: LogFn;\n\n /**\n * Log an error message and throw an Error\n * Combines logging and throwing in one call\n */\n throw: ThrowFn;\n\n /**\n * Output structured JSON data\n */\n json: (data: unknown) => void;\n\n /**\n * Create a scoped child logger with automatic trace path\n * @param name - Scope name (e.g., destination type, destination key)\n * @returns A new logger instance with the scope applied\n */\n scope: (name: string) => Instance;\n}\n\n/**\n * Logger configuration options\n */\nexport interface Config {\n /**\n * Minimum log level to display\n * @default Level.ERROR\n */\n level?: Level | keyof typeof Level;\n\n /**\n * Custom log handler function\n * Receives originalHandler to preserve default behavior\n */\n handler?: Handler;\n\n /** Custom handler for json() output. Default: console.log(JSON.stringify(data, null, 2)) */\n jsonHandler?: (data: unknown) => void;\n}\n\n/**\n * Internal config with resolved values and scope\n */\nexport interface InternalConfig {\n level: Level;\n handler?: Handler;\n jsonHandler?: (data: unknown) => void;\n scope: string[];\n}\n\n/**\n * Logger factory function type\n */\nexport type Factory = (config?: Config) => Instance;\n","import type { Collector, Destination, Logger, WalkerOS } from '.';\n\n/**\n * Shared mapping configuration interface.\n * Used by both Source.Config and Destination.Config.\n */\nexport interface Config<T = unknown> {\n consent?: WalkerOS.Consent; // Required consent to process events\n data?: Value | Values; // Global data transformation\n include?: string[]; // Event sections to flatten into context.data\n mapping?: Rules<Rule<T>>; // Event-specific mapping rules\n policy?: Policy; // Pre-processing rules\n}\n\nexport interface Policy {\n [key: string]: Value;\n}\n\nexport interface Rules<T = Rule> {\n [entity: string]: Record<string, T | Array<T>> | undefined;\n}\n\nexport interface Rule<Settings = unknown> {\n /**\n * Batch scheduling for this event mapping. When present, it splits this\n * event type into its own buffer, overriding `config.batch` per field\n * (`rule ?? config ?? default`). A bare number is the debounce `wait`\n * window. Object form supports `wait` (debounce ms), `size` (count cap),\n * and `age` (max ms since first entry).\n */\n batch?: number | Destination.BatchOptions;\n condition?: Condition; // Added condition\n consent?: WalkerOS.Consent; // Required consent states process the event\n settings?: Settings; // Arbitrary but protected configurations for custom event config\n data?: Data; // Mapping of event data\n include?: string[]; // Event sections to flatten into context.data\n ignore?: boolean; // Choose to no process an event when set to true\n silent?: boolean; // Process settings side effects, but suppress the destination's default push call\n name?: string; // Use a custom event name\n policy?: Policy; // Event-level policy applied after config-level policy\n /**\n * Merge mode (config layer): a partial Rule deep-merged onto the\n * package-shipped default rule at the same key, instead of replacing it.\n * Resolved at the consuming package's init via `mergeMappingRule`; not\n * seen by the runtime evaluator. A `null` value clears an inherited field.\n * Presence of `extend` or `remove` switches this rule from replace to merge.\n */\n extend?: RulePatch<Settings>;\n /**\n * Output layer: dotted paths stripped from the produced data payload\n * after evaluation, regardless of how each field was produced. Applied\n * last, so it always wins.\n */\n remove?: string[];\n}\n\n/**\n * A partial Rule used by `Rule.extend`. Every field is optional, and a\n * `null` value clears the inherited field (JSON merge-patch delete). The\n * control fields `extend` and `remove` are excluded: a patch models only\n * direct rule fields, matching what the runtime patch schema accepts.\n */\ntype RulePatchFields<Settings = unknown> = Omit<\n Rule<Settings>,\n 'extend' | 'remove'\n>;\nexport type RulePatch<Settings = unknown> = {\n [K in keyof RulePatchFields<Settings>]?: RulePatchFields<Settings>[K] | null;\n};\n\nexport interface Result {\n eventMapping?: Rule;\n mappingKey?: string;\n}\n\nexport type Data = Value | Values;\nexport type Value = ValueType | Array<ValueType>;\nexport type Values = Array<Value>;\nexport type ValueType = string | ValueConfig;\n\nexport interface ValueConfig {\n condition?: Condition;\n consent?: WalkerOS.Consent;\n fn?: Fn;\n key?: string;\n loop?: Loop;\n map?: Map;\n set?: Value[];\n validate?: Validate;\n value?: WalkerOS.PropertyType;\n}\n\n// Per-event callback context. Distinct from Context.Base (lifecycle-time) because mappings have no config/env of their own.\nexport interface Context {\n event: WalkerOS.DeepPartialEvent;\n /** The surrounding mapping config: a Value (value-level) or a Rule (rule-level). */\n mapping: Value | Rule;\n collector: Collector.Instance;\n logger: Logger.Instance;\n consent?: WalkerOS.Consent;\n}\n\nexport type Fn = (\n value: unknown,\n context: Context,\n) => WalkerOS.PromiseOrValue<WalkerOS.Property | unknown>;\n\nexport type Condition = (\n value: unknown,\n context: Context,\n) => WalkerOS.PromiseOrValue<boolean>;\n\nexport type Validate = (\n value: unknown,\n context: Context,\n) => WalkerOS.PromiseOrValue<boolean>;\n\nexport type Loop = [Value, Value];\n\nexport type Map = { [key: string]: Value };\n","import type { Collector, Destination, Logger, WalkerOS } from './';\n\n/** Collector state mapping for the `on` actions. */\nexport type Config = {\n config?: Array<GenericFn>;\n consent?: Array<ConsentRule>;\n custom?: Array<GenericFn>;\n globals?: Array<GenericFn>;\n ready?: Array<ReadyFn>;\n run?: Array<RunFn>;\n session?: Array<SessionFn>;\n user?: Array<UserFn>;\n};\n\n/** Allow arbitrary string events via `(string & {})`. */\nexport type Types = keyof Config | (string & {});\n\n/** Map each event type to its expected data payload type. */\nexport interface EventDataMap {\n config: Partial<Collector.Config>;\n consent: WalkerOS.Consent;\n custom: WalkerOS.Properties;\n globals: WalkerOS.Properties;\n ready: void;\n run: void;\n session: Collector.SessionData | undefined;\n user: WalkerOS.User;\n}\n\n/** Extract the data type for a specific event. */\nexport type EventData<T extends keyof EventDataMap> = EventDataMap[T];\n\n/** Union of all possible data types. */\nexport type AnyEventData = EventDataMap[keyof EventDataMap];\n\n/**\n * Context provided to every `on` callback.\n * Same posture as Mapping.Context: collector + logger only;\n * subscriptions are a collector-level concern, not a stage-level one.\n */\nexport interface Context {\n collector: Collector.Instance;\n logger: Logger.Instance;\n}\n\n/** Unified subscription callback shape. */\nexport type Fn<TData = unknown> = (\n data: TData,\n context: Context,\n) => WalkerOS.PromiseOrValue<void>;\n\n/** Typed-data variants for readability and IntelliSense. All reduce to Fn<TData>. */\nexport type ConsentFn = Fn<WalkerOS.Consent>;\nexport type GenericFn = Fn<unknown>;\nexport type ReadyFn = Fn<void>;\nexport type RunFn = Fn<void>;\nexport type SessionFn = Fn<Collector.SessionData | undefined>;\nexport type UserFn = Fn<WalkerOS.User>;\n\n/**\n * Consent rule: a record of `{ [consentKey]: ConsentFn }`.\n * Only the consent action uses this shape (per-key handler dispatch).\n */\nexport interface ConsentRule {\n [key: string]: ConsentFn;\n}\n\n/** Anything registerable via `walker.on(action, X)`: a typed callback or a consent rule record. */\nexport type Subscription =\n | ConsentRule\n | GenericFn\n | ReadyFn\n | RunFn\n | SessionFn\n | UserFn;\n\nexport interface OnConfig {\n config?: GenericFn[];\n consent?: ConsentRule[];\n custom?: GenericFn[];\n globals?: GenericFn[];\n ready?: ReadyFn[];\n run?: RunFn[];\n session?: SessionFn[];\n user?: UserFn[];\n [key: string]:\n | ConsentRule[]\n | GenericFn[]\n | ReadyFn[]\n | RunFn[]\n | SessionFn[]\n | UserFn[]\n | undefined;\n}\n\n/**\n * Destination `on` handler: receives the action type and a destination context.\n * Already context-style; kept for compatibility with the destination interface.\n */\nexport type OnFn<T extends Destination.TypesGeneric = Destination.Types> = (\n type: Types,\n context: Destination.Context<T>,\n) => WalkerOS.PromiseOrValue<void>;\n\nexport type OnFnRuntime = (\n type: Types,\n context: Destination.Context,\n) => WalkerOS.PromiseOrValue<void>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Collector, Logger, WalkerOS, Context as BaseContext } from '.';\nimport type { DestroyFn } from './lifecycle';\nimport type { Ingest } from './ingest';\nimport type { Config as MappingConfig } from './mapping';\nimport type { MatchExpression } from './matcher';\n\n/**\n * Unified route grammar for Flow v4. A `Route` is one of:\n * - a transformer ID string (`\"redact\"`)\n * - a sequence of routes (`[\"a\", \"b\", \"c\"]` — sugar for chained `.next`)\n * - a `RouteConfig` — a gated / dispatching node.\n *\n * `RouteConfig` is a disjoint union — set exactly one of `next`, `one`,\n * `many`, or neither (pure gate). The disjointness is enforced by `never`\n * sibling properties at the type level and `z.strictObject` at the schema\n * level.\n *\n * Operators:\n * - `next`: single continuation.\n * - `one`: first-match dispatch (walk entries, first whose match passes wins).\n * - `many`: all-match terminal fan-out (every matching entry spawns an\n * independent flow; main chain terminates here). Restricted to\n * pre-collector positions (source.next, transformer.next, transformer.before).\n */\nexport type Route = string | Route[] | RouteConfig;\n\nexport type RouteConfig =\n | RouteNextConfig\n | RouteOneConfig\n | RouteManyConfig\n | RouteGateConfig;\n\nexport interface RouteNextConfig {\n match?: MatchExpression;\n next: Route;\n one?: never;\n many?: never;\n}\n\nexport interface RouteOneConfig {\n match?: MatchExpression;\n one: Route[];\n next?: never;\n many?: never;\n}\n\nexport interface RouteManyConfig {\n match?: MatchExpression;\n many: Route[];\n next?: never;\n one?: never;\n}\n\nexport interface RouteGateConfig {\n match: MatchExpression;\n next?: never;\n one?: never;\n many?: never;\n}\n\n/**\n * Base environment interface for walkerOS transformers.\n *\n * Minimal like Destination - just an extensible object.\n * Transformers receive dependencies through context, not env.\n */\nexport interface BaseEnv {\n [key: string]: unknown;\n}\n\n/**\n * Type bundle for transformer generics.\n * Groups Settings, InitSettings, and Env into a single type parameter.\n * Follows the Source/Destination pattern.\n *\n * @template S - Settings configuration type\n * @template E - Environment type\n * @template I - InitSettings configuration type (user input)\n */\nexport interface Types<S = unknown, E = BaseEnv, I = S> {\n settings: S;\n initSettings: I;\n env: E;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access.\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n env: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle.\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\n\n/**\n * Inference helper: Extract Types from Instance.\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\n/**\n * Transformer configuration.\n */\nexport interface Config<T extends TypesGeneric = Types> {\n settings?: InitSettings<T>;\n env?: Env<T>;\n id?: string;\n logger?: Logger.Config;\n before?: Route; // Pre-transformer chain (runs before push)\n next?: Route; // Graph wiring to next transformer\n cache?: import('./cache').Cache; // Step-level cache config\n /** Declarative store get/set operations applied around this transformer. */\n state?: import('./state').State | import('./state').State[];\n init?: boolean; // Track init state (like Destination)\n disabled?: boolean; // Completely skip this transformer in chains\n /** Return this value instead of calling push(). Global mock for all chains. */\n mock?: unknown;\n /** Path-specific mock values keyed by chain path (e.g., \"destination.ga4.before\"). Takes precedence over global mock. */\n chainMocks?: Record<string, unknown>;\n /**\n * Declarative event-to-event mapping applied when this transformer step\n * has no `code`. Same field name as on `Destination.Config`, but the\n * semantic differs by position: on a destination, `mapping` produces a\n * vendor-shaped payload; on a transformer step, it mutates the event\n * itself. The collector synthesizes a push that runs\n * `processEventMapping` and returns the transformed event (or drops it\n * when a rule has `ignore: true`).\n *\n * At the transformer position, only event-mutating fields apply:\n * `policy`, `mapping[].policy`, `mapping[].name`, `mapping[].ignore`,\n * `mapping[].consent`, `include`. Vendor-payload fields (`data`,\n * `mapping[].data`, `silent`) are ignored at this position with a\n * one-time warning.\n */\n mapping?: MappingConfig;\n}\n\n/**\n * Context provided to transformer functions.\n * Extends base context with transformer-specific properties.\n */\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Config<T>, Env<T>> {\n id: string;\n ingest: Ingest;\n}\n\n/**\n * Unified result type for transformer functions.\n * Replaces the old union return type with a structured object.\n *\n * @field event - Modified event to continue with\n * @field respond - Wrapped respond function for downstream transformers\n * @field next - Branch to a different chain (replaces BranchResult)\n */\nexport interface Result<E = WalkerOS.DeepPartialEvent> {\n event?: E;\n respond?: import('../respond').RespondFn;\n next?: Route;\n}\n\n/**\n * Result of running a transformer chain.\n * Returns the processed event (singular, fan-out array, or null if dropped)\n * alongside the potentially wrapped respond function.\n *\n * `stopped` signals pipeline-halt — when set, the caller MUST NOT propagate\n * the event further downstream (no destinations, no subsequent chains).\n * Used by `cache.stop: true` on pre-collector transformers so the documented\n * \"downstream transformers and destinations are skipped\" semantic holds.\n */\nexport interface ChainResult {\n event: WalkerOS.DeepPartialEvent | WalkerOS.DeepPartialEvent[] | null;\n respond?: import('../respond').RespondFn;\n stopped?: true;\n}\n\n/**\n * The main transformer function.\n *\n * Pre-collector transformers use default E = DeepPartialEvent.\n * Post-collector transformers can use E = Event for type-safe access.\n * A transformer written for DeepPartialEvent works in both positions\n * because Event is a subtype of DeepPartialEvent.\n *\n * @returns Result - structured result with event, respond, next\n * @returns Result[] - fan-out: each Result continues independently through remaining chain\n * @returns void - continue with current event unchanged (passthrough)\n * @returns false - stop chain, cancel further processing\n */\nexport type Fn<\n T extends TypesGeneric = Types,\n E = WalkerOS.DeepPartialEvent,\n> = (\n event: E,\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<Result<E> | Result<E>[] | false | void>;\n\n/**\n * Optional initialization function.\n * Called once before first push.\n *\n * @param context - Transformer context\n * @returns void - initialization successful\n * @returns false - initialization failed, skip this transformer\n * @returns Config<T> - return updated config\n */\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\n/**\n * Transformer instance returned by Init function.\n */\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n push: Fn<T>; // Named \"push\" for consistency with Source/Destination\n init?: InitFn<T>; // Optional, called once before first push\n destroy?: DestroyFn<Config<T>, Env<T>>;\n}\n\n/**\n * Transformer initialization function.\n * Creates a transformer instance from context.\n */\nexport type Init<T extends TypesGeneric = Types> = (\n context: Context<Types<Partial<Settings<T>>, Env<T>, InitSettings<T>>>,\n) => Instance<T> | Promise<Instance<T>>;\n\n/**\n * Configuration for initializing a transformer.\n * Used in collector registration.\n */\nexport type InitTransformer<T extends TypesGeneric = Types> = {\n /**\n * Initialization function. When omitted, the entry is a pass-through step:\n * - If `mapping` is present, the collector synthesizes a mapping-only\n * push using `processEventMapping`.\n * - Otherwise it's a named hop that only hosts a `before` / `next` /\n * `cache` chain.\n *\n * Validation: an entry without `code` must declare at least one of\n * `package`, `before`, `next`, `cache`, `state`, `mapping`. Enforced by\n * `validateStepEntry` in `@walkeros/core`.\n */\n code?: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n before?: Route;\n next?: Route;\n cache?: import('./cache').Cache;\n state?: import('./state').State | import('./state').State[];\n mapping?: MappingConfig;\n};\n\n/**\n * Transformers configuration for collector.\n * Maps transformer IDs to their initialization configurations.\n */\nexport interface InitTransformers {\n [transformerId: string]: InitTransformer<any>;\n}\n\n/**\n * Active transformer instances registry.\n */\nexport interface Transformers {\n [transformerId: string]: Instance;\n}\n\n/**\n * Typed accessor for transformers registered on a collector.\n *\n * The collector's `transformers` bag indexes to `Transformer.Instance`\n * (defaults erase the generic). Use this helper at the call site to recover\n * the narrow type without casts.\n *\n * @example\n * type MyTransformerTypes = Transformer.Types<MySettings>;\n * const tx = getTransformer<MyTransformerTypes>(collector, 'redact');\n * await tx.push(event, context);\n *\n * @throws Error with message `Transformer not found: <id>` when the id is unknown.\n */\nexport function getTransformer<T extends TypesGeneric = Types>(\n collector: { transformers: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const transformer = collector.transformers[id];\n if (!transformer) {\n throw new Error(`Transformer not found: ${id}`);\n }\n return transformer as unknown as Instance<T>;\n}\n","export interface Context {\n city?: string;\n country?: string;\n encoding?: string;\n hash?: string;\n ip?: string;\n language?: string;\n origin?: string;\n region?: string;\n userAgent?: string;\n [key: string]: string | undefined;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Elb,\n On,\n Logger,\n Mapping as WalkerOSMapping,\n Collector,\n Context as BaseContext,\n} from './index';\nimport type { Ingest } from './ingest';\nimport type { DestroyFn, SetupFn } from './lifecycle';\nimport type { RespondFn } from '../respond';\nimport type { Route } from './transformer';\n\n/**\n * Base Env interface for dependency injection into sources.\n *\n * Sources receive all their dependencies through this environment object,\n * making them platform-agnostic and easily testable.\n */\nexport interface BaseEnv {\n [key: string]: unknown;\n push: Collector.PushFn;\n command: Collector.CommandFn;\n sources?: Collector.Sources;\n elb: Elb.Fn;\n logger: Logger.Instance;\n}\n\n/**\n * Type bundle for source generics.\n * Groups Settings, Mapping, Push, Env, InitSettings, and Setup into a single type parameter.\n *\n * @template S - Settings configuration type\n * @template M - Mapping configuration type\n * @template P - Push function signature (flexible to support HTTP handlers, etc.)\n * @template E - Environment dependencies type\n * @template I - InitSettings configuration type (user input)\n * @template U - Setup options type (provisioning options for `walkeros setup`)\n */\nexport interface Types<\n S = unknown,\n M = unknown,\n P = Elb.Fn,\n E = BaseEnv,\n I = S,\n U = unknown,\n C = unknown,\n> {\n settings: S;\n initSettings: I;\n mapping: M;\n push: P;\n env: E;\n setup: U;\n credentials: C;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n push: any;\n env: any;\n setup: any;\n credentials: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Push<T extends TypesGeneric = Types> = T['push'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\nexport type SetupOptions<T extends TypesGeneric = Types> = T['setup'];\nexport type Credentials<T extends TypesGeneric = Types> = T['credentials'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Config<\n T extends TypesGeneric = Types,\n> extends WalkerOSMapping.Config<Mapping<T>> {\n /** Implementation-specific configuration passed to the init function. */\n settings?: InitSettings<T>;\n /**\n * Optional, strictly-typed credentials slot. Back it with a managed secret\n * via `$secret.NAME` (credentials use `$secret`, not `$env`). The package\n * defines the shape via `Types['credentials']`. `settings.<sdk>` stays the\n * escape hatch for raw SDK options.\n */\n credentials?: Credentials<T>;\n /** Runtime dependencies injected by the collector (push, command, logger, etc.). */\n env?: Env<T>;\n /** Source identifier; defaults to the InitSources object key. */\n id?: string;\n /** Logger configuration (level, handler) to override the collector's defaults. */\n logger?: Logger.Config;\n /**\n * Respond-first acknowledgement for response-producing server sources.\n *\n * When a source produces an HTTP response (express today; future fetch /\n * lambda), `async: true` (the default for such sources) responds 2xx\n * (\"accepted\") before the event is delivered to the collector, so the\n * client is not blocked on backend delivery. `async: false` waits for\n * delivery to settle before responding. A 2xx means \"accepted\", not\n * \"delivered\".\n *\n * Browser and dataLayer sources have no HTTP response to defer and ignore\n * this flag. The default is per source type.\n */\n async?: boolean;\n /** Mark as primary source; its push function becomes the exported `elb` from startFlow. */\n primary?: boolean;\n /** Defer source initialization until these collector events fire (e.g., `['consent']`). */\n require?: string[];\n /**\n * Provisioning options for `walkeros setup`. `boolean | object`.\n * Triggered only by explicit CLI invocation; never automatic.\n */\n setup?: boolean | SetupOptions<T>;\n /**\n * Ingest metadata extraction mapping.\n * Extracts values from raw request objects (Express req, Lambda event, etc.)\n * using walkerOS mapping syntax. Extracted data flows to transformers/destinations.\n *\n * @example\n * ingest: {\n * ip: 'req.ip',\n * ua: 'req.headers.user-agent',\n * origin: 'req.headers.origin'\n * }\n */\n ingest?: WalkerOSMapping.Data;\n /** Completely skip this source — no init, no event capture. */\n disabled?: boolean;\n /**\n * Init lifecycle flag. Set by the collector to `true` after `Instance.init()`\n * has been called. Used together with `require` to gate `on()` delivery:\n * lifecycle events are queued in `Instance.queueOn` until both\n * `config.init === true` and `config.require` is empty/absent, then replayed.\n */\n init?: boolean;\n /** Declarative store get/set operations applied around this source. */\n state?: import('./state').State | import('./state').State[];\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Push<T>,\n Env<T>,\n InitSettings<T>,\n SetupOptions<T>,\n Credentials<T>\n >\n>;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n setup?: SetupFn<Config<T>, Env<T>>;\n push: Push<T>;\n destroy?: DestroyFn<Config<T>, Env<T>>;\n on?(\n event: On.Types,\n context?: unknown,\n ): void | boolean | Promise<void | boolean>;\n /**\n * Optional setup hook. Called by the collector eagerly after all source\n * factories have run, regardless of `config.require`. Use for prep work\n * such as draining a pre-init window queue or attaching DOM listeners.\n * The collector still gates `on()` delivery, and `Collector.push`\n * enforces `allowed`/consent at the destination layer.\n */\n init?: () => void | Promise<void>;\n /**\n * Lifecycle event queue. Populated by `onApply` when the source is not\n * yet started (`config.init !== true` or `config.require` non-empty).\n * Flushed by the collector when the source becomes started.\n */\n queueOn?: Array<{ type: On.Types; data: unknown }>;\n}\n\n/**\n * Per-scope environment passed to the body of `Source.Context.withScope`.\n *\n * Each call to `withScope` builds a fresh `ScopeEnv` whose `push` captures\n * the per-scope `ingest` and `respond`. Concurrent scopes cannot crosstalk:\n * each one carries its own ingest and respond all the way through the\n * pipeline. Server sources MUST use `withScope` per inbound request; sources\n * with a single logical scope (browser tab lifetime, dataLayer) may skip it\n * and use the factory-scope `env.push` directly.\n */\nexport type ScopeEnv<T extends TypesGeneric = Types> = Env<T> & {\n /** Per-scope push: captures the scope's ingest and respond for this call. */\n push: Collector.PushFn;\n /** Ingest metadata extracted from the raw scope input (if config.ingest is set). */\n ingest: Ingest;\n /** Respond function bound to this scope (undefined for scopes without a response). */\n respond?: RespondFn;\n};\n\n/**\n * Context provided to source init function.\n * Extends base context with source-specific properties.\n */\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Partial<Config<T>>, Env<T>> {\n id: string;\n /**\n * Bind ingest and respond to a single scope of work (e.g. one inbound\n * HTTP request, one queue message). Builds a fresh `Ingest` from the\n * raw input via `config.ingest` mapping, wires the per-scope `respond`,\n * and invokes `body(scopeEnv)` with a push function that captures both.\n *\n * Server sources call this once per inbound request:\n *\n * ```ts\n * await context.withScope(req, createRespond(sender), async (env) => {\n * await env.push(parsedData);\n * });\n * ```\n *\n * Browser sources with a single tab-lifetime scope may skip `withScope`\n * and use `env.push` directly.\n *\n * @param rawScope - Raw input for `config.ingest` mapping (Express req,\n * Lambda event, fetch Request, etc.). Pass `undefined` if no ingest\n * mapping applies.\n * @param respond - Per-scope respond function, or `undefined` if the\n * scope produces no response.\n * @param body - Async callback receiving the per-scope env.\n * @returns The body's return value.\n */\n withScope: <R>(\n rawScope: unknown,\n respond: RespondFn | undefined,\n body: (env: ScopeEnv<T>) => Promise<R>,\n ) => Promise<R>;\n}\n\nexport type Init<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => Instance<T> | Promise<Instance<T>>;\n\nexport type InitSource<T extends TypesGeneric = Types> = {\n code: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n primary?: boolean;\n next?: Route;\n before?: Route;\n cache?: import('./cache').Cache;\n state?: import('./state').State | import('./state').State[];\n};\n\n/**\n * Sources configuration for collector.\n * Maps source IDs to their initialization configurations.\n */\nexport interface InitSources {\n [sourceId: string]: InitSource<any>;\n}\n\n/**\n * Renderer hint for source simulation UI.\n * - 'browser': Source needs a real DOM (iframe with live preview)\n * - 'codebox': Source uses a JSON/code editor (default)\n */\nexport type Renderer = 'browser' | 'codebox';\n\n/**\n * Typed accessor for sources registered on a collector.\n *\n * The collector's `sources` bag indexes to `Source.Instance` (defaults erase\n * the generic), which collapses the source's declared `push` signature to\n * `Elb.Fn`. Use this helper at the call site to recover the narrow type\n * without casts.\n *\n * @example\n * type TestSourceTypes = Source.Types<unknown, unknown, TestPushFn>;\n * const src = getSource<TestSourceTypes>(collector, 'testSource');\n * await src.push({ method: 'GET', path: '/api/data' }); // typed!\n *\n * @throws Error with message `Source not found: <id>` when the id is unknown.\n */\nexport function getSource<T extends TypesGeneric = Types>(\n collector: { sources: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const source = collector.sources[id];\n if (!source) {\n throw new Error(`Source not found: ${id}`);\n }\n // Single, contained narrowing. The runtime instance was constructed with\n // generic T at init time; the bag erased the parameter. We're restoring\n // information that already exists at runtime.\n return source as unknown as Instance<T>;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Logger, WalkerOS, Context as BaseContext } from '.';\nimport type { DestroyFn, SetupFn } from './lifecycle';\n\nexport interface BaseEnv {\n [key: string]: unknown;\n}\n\nexport interface Types<\n S = unknown,\n E = BaseEnv,\n I = S,\n U = unknown,\n C = unknown,\n> {\n settings: S;\n initSettings: I;\n env: E;\n setup: U;\n credentials: C;\n}\n\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n env: any;\n setup: any;\n credentials: any;\n};\n\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\nexport type SetupOptions<T extends TypesGeneric = Types> = T['setup'];\nexport type Credentials<T extends TypesGeneric = Types> = T['credentials'];\n\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Config<T extends TypesGeneric = Types> {\n settings?: InitSettings<T>;\n /**\n * Optional, strictly-typed credentials slot. Back it with a managed secret\n * via `$secret.NAME` (credentials use `$secret`, not `$env`). The package\n * defines the shape via `Types['credentials']`. `settings.<sdk>` stays the\n * escape hatch for raw SDK options.\n */\n credentials?: Credentials<T>;\n env?: Env<T>;\n id?: string;\n logger?: Logger.Config;\n /**\n * Provisioning options for `walkeros setup`. `boolean | object`.\n * Triggered only by explicit CLI invocation; never automatic.\n */\n setup?: boolean | SetupOptions<T>;\n /**\n * Persist values as raw bytes, byte-exact, bypassing the structured codec.\n * Default false: values are structured `StoreValue` and pass through the\n * shared core serialization codec. Set true only on byte-native backends\n * (fs/s3/gcs) whose consumer needs the exact bytes back, e.g. serving an\n * asset such as walker.js. Structured-only backends (sheets) reject `file:\n * true` at init. One store instance is exactly one mode.\n */\n file?: boolean;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Env<T>,\n InitSettings<T>,\n SetupOptions<T>,\n Credentials<T>\n >\n>;\n\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Config<T>, Env<T>> {\n id: string;\n}\n\n/**\n * Canonical structured value persisted by a store. Includes `null`, but\n * EXCLUDES `undefined`: `undefined` is the reserved \"miss\" sentinel returned\n * by `GetFn` for an absent key, so it must never be a stored value.\n * `Uint8Array` is the platform-neutral binary leaf (never Node `Buffer`).\n */\nexport type StoreValue =\n | string\n | number\n | boolean\n | null\n | Uint8Array\n | StoreValue[]\n | { [key: string]: StoreValue };\n\nexport type GetFn<T extends StoreValue = StoreValue> = (\n key: string,\n) => T | undefined | Promise<T | undefined>;\n\nexport type SetFn<T extends StoreValue = StoreValue> = (\n key: string,\n value: T,\n /**\n * Optional expiry hint in ms; honored only by TTL-native backends\n * (in-memory, Redis). Byte/JSON backends may ignore it. Authoritative cache\n * expiry lives in the cache wrapper's {value, exp} payload.\n */\n ttl?: number,\n) => void | Promise<void>;\n\nexport type DeleteFn = (key: string) => void | Promise<void>;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n get: GetFn;\n set: SetFn;\n delete: DeleteFn;\n setup?: SetupFn<Config<T>, Env<T>>;\n destroy?: DestroyFn<Config<T>, Env<T>>;\n}\n\nexport type Init<T extends TypesGeneric = Types> = (\n context: Context<Types<Partial<Settings<T>>, Env<T>, InitSettings<T>>>,\n) => Instance<T> | Promise<Instance<T>>;\n\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\nexport type InitStore<T extends TypesGeneric = Types> = {\n code: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n};\n\nexport interface InitStores {\n [storeId: string]: InitStore<any>;\n}\n\nexport interface Stores {\n [storeId: string]: Instance;\n}\n\n/**\n * Typed accessor for stores registered on a collector.\n *\n * The collector's `stores` bag indexes to `Store.Instance` (defaults erase\n * the generic). Use this helper at the call site to recover the narrow type\n * without casts.\n *\n * @example\n * type MyStoreTypes = Store.Types<MySettings>;\n * const store = getStore<MyStoreTypes>(collector, 'cache');\n * await store.set('key', 'value');\n *\n * @throws Error with message `Store not found: <id>` when the id is unknown.\n */\nexport function getStore<T extends TypesGeneric = Types>(\n collector: { stores: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const store = collector.stores[id];\n if (!store) {\n throw new Error(`Store not found: ${id}`);\n }\n return store as unknown as Instance<T>;\n}\n\n/**\n * Read-site narrowing helper for store values.\n *\n * `Instance.get`/`set` stay value-agnostic at `StoreValue`, so callers\n * that know the concrete shape narrow here instead of threading a value type\n * through `Store.Types`. The single narrow `as` cast is justified: the store\n * channel is structurally `StoreValue`, and the caller asserts the concrete\n * sub-shape it stored. `undefined` is preserved as the miss sentinel.\n */\nexport async function getStoreValue<V extends StoreValue = StoreValue>(\n store: Instance,\n key: string,\n): Promise<V | undefined> {\n return (await store.get(key)) as V | undefined;\n}\n","/**\n * Trigger — unified interface for invoking any walkerOS step in simulation\n * and testing. Every package exports a `createTrigger` factory from its\n * examples that conforms to `Trigger.CreateFn`.\n *\n * Usage:\n * const { flow, trigger } = await createTrigger(initConfig);\n * const result = await trigger(type?, options?)(content);\n *\n * @packageDocumentation\n */\n\nimport type { Collector, Elb } from '.';\n\n/** Flow access handle returned by createTrigger. */\nexport interface FlowHandle {\n /** The collector instance created by startFlow. */\n collector: Collector.Instance;\n /** The elb push function for direct event injection. */\n elb: Elb.Fn;\n}\n\n/** What createTrigger returns — a flow handle (lazy) and a trigger function. */\nexport interface Instance<TContent = unknown, TResult = unknown> {\n /** Flow handle — undefined until first trigger() call, then stable. */\n readonly flow: FlowHandle | undefined;\n trigger: Fn<TContent, TResult>;\n}\n\n/**\n * Curried trigger function — always async.\n *\n * First call selects mechanism (type) and configures it (options).\n * Second call fires with content and returns result.\n *\n * @example\n * // Browser source — click trigger\n * trigger('click', 'button.cta')('<button data-elb=\"cta\">Sign Up</button>')\n *\n * // Express source — POST request\n * trigger('POST')({ path: '/collect', body: { name: 'page view' } })\n *\n * // DataLayer — default mechanism\n * trigger()(['event', 'purchase', { value: 25.42 }])\n */\nexport type Fn<TContent = unknown, TResult = unknown> = (\n type?: string,\n options?: unknown,\n) => (content: TContent) => Promise<TResult>;\n\n/**\n * Factory function exported by each package's examples.\n *\n * Receives full Collector.InitConfig. Does NOT call startFlow eagerly —\n * startFlow is deferred to the first trigger() invocation (lazy init).\n * The flow property uses a getter to read the closure variable live.\n * createTrigger itself stays async for consistency (other packages may\n * need await during setup). Config is passed through UNMODIFIED —\n * validation is startFlow's job.\n *\n * @example\n * // Package exports:\n * export const createTrigger: Trigger.CreateFn<HTMLContent, void> = async (config) => {\n * let flow: Trigger.FlowHandle | undefined;\n *\n * const trigger: Trigger.Fn<HTMLContent, void> = (type?, options?) => async (content) => {\n * // Pre-startFlow work (e.g., inject HTML for browser source)\n * // ...\n *\n * // Lazy init — only on first call\n * if (!flow) flow = await startFlow(config);\n *\n * // Post-startFlow work (e.g., dispatch click event)\n * // ...\n * };\n *\n * return {\n * get flow() { return flow; },\n * trigger,\n * };\n * };\n */\nexport type CreateFn<TContent = unknown, TResult = unknown> = (\n config: Collector.InitConfig,\n options?: unknown,\n) => Promise<Instance<TContent, TResult>>;\n","// packages/core/src/types/lifecycle.ts\nimport type { Logger, WalkerOS } from '.';\n\n/**\n * Shared context for one-shot lifecycle hooks (setup, destroy).\n * No event pipeline machinery — just config, env, logger, and id.\n */\nexport interface LifecycleContext<C = unknown, E = unknown> {\n id: string;\n config: C;\n env: E;\n logger: Logger.Instance;\n}\n\n/**\n * Setup function signature. Called once via `walkeros setup <kind>.<name>`.\n * Packages own idempotency and error semantics. Return value (if any) is\n * JSON-stringified to stdout by the CLI for scripting use.\n */\nexport type SetupFn<C = unknown, E = unknown> = (\n context: LifecycleContext<C, E>,\n) => WalkerOS.PromiseOrValue<unknown>;\n\n/**\n * Destroy function signature for step lifecycle cleanup.\n */\nexport type DestroyFn<C = unknown, E = unknown> = (\n context: LifecycleContext<C, E>,\n) => WalkerOS.PromiseOrValue<void>;\n\n/**\n * @deprecated Use `LifecycleContext` instead. Kept as alias for one minor cycle.\n */\nexport type DestroyContext<C = unknown, E = unknown> = LifecycleContext<C, E>;\n","import type { Elb as ElbTypes } from '.';\n\nexport type AnyObject<T = unknown> = Record<string, T>;\nexport type Elb = ElbTypes.Fn;\nexport type AnyFunction = (...args: unknown[]) => unknown;\nexport type SingleOrArray<T> = T | Array<T>;\n\nexport type Events = Array<Event>;\nexport type PartialEvent = Partial<Event>;\nexport type DeepPartialEvent = DeepPartial<Event>;\nexport interface Event {\n name: string;\n data: Properties;\n context: OrderedProperties;\n globals: Properties;\n custom: Properties;\n user: User;\n nested: Entities;\n consent: Consent;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n source: Source;\n}\n\nexport interface Consent {\n [name: string]: boolean; // name of consent group or tool\n}\n\nexport interface User extends Properties {\n // IDs\n id?: string;\n device?: string;\n session?: string;\n hash?: string;\n // User related\n address?: string;\n email?: string;\n phone?: string;\n userAgent?: string;\n browser?: string;\n browserVersion?: string;\n deviceType?: string;\n language?: string;\n country?: string;\n region?: string;\n city?: string;\n zip?: string;\n timezone?: string;\n os?: string;\n osVersion?: string;\n screenSize?: string;\n ip?: string;\n internal?: boolean;\n}\n\nexport type SourcePlatform =\n | 'web'\n | 'server'\n | 'app'\n | 'ios'\n | 'android'\n | 'terminal'\n | string;\n\n/**\n * SourceMap is the discriminated-union registry for source kinds.\n * Each source package augments this interface via `declare module\n * '@walkeros/core'` to register its own `type` literal and any\n * source-specific fields. Conflicting declarations cause compile errors,\n * intentional, to surface naming collisions early.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface SourceMap {\n collector: { type: 'collector' };\n}\n\n/**\n * Declared (named) fields of an event Source. Kept as a standalone interface so\n * its key set stays index-signature-free: `Source extends Properties` adds a\n * string index signature that collapses `keyof Source` to `string | number`,\n * which would defeat the type↔schema drift guard. The guard compares\n * `keyof SourceFields` against `keyof z.infer<typeof SourceFieldsSchema>`\n * (see schemas/__tests__/config-drift.test-d.ts).\n */\nexport interface SourceFields {\n type: string;\n platform?: SourcePlatform;\n /** Deployment version of the source emitter (string). */\n version?: string;\n /** Event-model spec version. Collector defaults to \"4\". */\n schema?: string;\n /** Emission sequence within the run. */\n count?: number;\n /** Trace id shared by every event of a run (W3C trace-id shape). */\n trace?: string;\n /** Per-flow config release map, keyed by flow name (source.release[flowName]). Accumulates across walkerOS→walkerOS crossings. */\n release?: Record<string, string>;\n /** Walker-controlled standard suggestions (sources may set). */\n url?: string;\n referrer?: string;\n tool?: string;\n command?: string;\n}\n\nexport interface Source extends Properties, SourceFields {}\n\nexport type PropertyType =\n | boolean\n | string\n | number\n | { [key: string]: Property };\n\nexport type Property = PropertyType | Array<PropertyType>;\n\nexport interface Properties {\n [key: string]: Property | undefined;\n}\nexport interface OrderedProperties {\n [key: string]: [Property, number] | undefined;\n}\n\nexport type Entities = Array<Entity>;\nexport interface Entity {\n entity: string;\n data: Properties;\n nested?: Entities;\n context?: OrderedProperties;\n}\n\nexport type ConsentHandler = Record<string, AnyFunction>;\nexport type ActionHandler = AnyFunction;\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type PromiseOrValue<T> = T | Promise<T>;\n","import type { WalkerOS } from '.';\n\n/**\n * A recorded function call made during simulation.\n * Captures what a destination called on its env (e.g., window.gtag).\n */\nexport interface Call {\n /** Dot-path of the function called: \"window.gtag\", \"dataLayer.push\" */\n fn: string;\n /** Arguments passed to the function */\n args: unknown[];\n /** Unix timestamp in ms */\n ts: number;\n}\n\n/**\n * Result of simulating a single step.\n * Same shape for source, transformer, collector, and destination.\n */\nexport interface Result {\n /** Which step type was simulated */\n step: 'source' | 'transformer' | 'destination' | 'collector';\n /** Step name, e.g. \"gtag\", \"dataLayer\", \"enricher\" */\n name: string;\n /**\n * Output events:\n * - source: captured pre-collector events\n * - transformer: [transformed event] or [] if filtered\n * - collector: [enriched event] (createEvent applied)\n * - destination: [] (destinations don't produce events)\n */\n events: WalkerOS.DeepPartialEvent[];\n /** Intercepted env calls. Populated for destinations, empty [] for others. */\n calls: Call[];\n /** Execution time in ms */\n duration: number;\n /**\n * Entity-action key of the matched mapping rule, e.g. \"product add\" or\n * \"product *\". Populated for destination simulations when a mapping rule\n * matched; absent when no rule matched or the step has no mapping.\n * Also absent when the matched rule uses batched delivery (batching\n * reports no per-event key) and on error results, where the key is not\n * available.\n */\n mappingKey?: string;\n /** Error if the step threw */\n error?: Error;\n}\n","export type MatchExpression =\n | MatchCondition\n | { and: MatchExpression[] }\n | { or: MatchExpression[] };\n\nexport interface MatchCondition {\n key: string;\n operator: MatchOperator;\n value: string;\n not?: boolean;\n}\n\nexport type MatchOperator =\n | 'eq'\n | 'contains'\n | 'prefix'\n | 'suffix'\n | 'regex'\n | 'gt'\n | 'lt'\n | 'exists';\n\n// Compiled matcher (internal)\nexport type CompiledMatcher = (context: Record<string, unknown>) => boolean;\n","export interface Code {\n lang?: string;\n code: string;\n}\n\nexport interface Hint {\n text: string;\n code?: Array<Code>;\n}\n\nexport type Hints = Record<string, Hint>;\n","export type StorageType = 'local' | 'session' | 'cookie';\n\nexport const Storage = {\n Local: 'local' as const,\n Session: 'session' as const,\n Cookie: 'cookie' as const,\n} as const;\n\nexport const Const = {\n Utils: {\n Storage,\n },\n} as const;\n","/**\n * Metadata managed by the runtime. Do not overwrite from step code.\n * The _ prefix signals \"runtime-managed.\"\n */\nexport interface IngestMeta {\n /** Number of steps this data has passed through. */\n hops: number;\n /** Ordered list of step IDs visited. path[0] is always the source ID. */\n path: string[];\n /** Current chain context, e.g., \"destination.ga4.before\" or \"source.web.next\". */\n chainPath?: string;\n /** W3C 32-hex trace id adopted from an inbound traceparent header. */\n trace?: string;\n /** Parent span (upstream event.id) from an inbound traceparent header. */\n parentEventId?: string;\n}\n\n/**\n * Mutable shared context that accumulates knowledge as data flows through the graph.\n *\n * Event = strict schema (analytics data).\n * Ingest = wild west (pipeline context).\n *\n * Any step can read and write arbitrary keys. The `_meta` section is\n * managed by the runtime — increment hops and append to path before each step.\n */\nexport interface Ingest {\n [key: string]: unknown;\n _meta: IngestMeta;\n}\n\n/** Create a fresh Ingest for a new pipeline invocation. */\nexport function createIngest(sourceId: string): Ingest {\n return {\n _meta: {\n hops: 0,\n path: [sourceId],\n },\n };\n}\n","import type { Transformer, WalkerOS } from './types';\n\n/**\n * Creates a TransformerResult for dynamic chain routing.\n * Use this in transformer push functions to redirect the chain.\n */\nexport function branch(\n event: WalkerOS.DeepPartialEvent,\n next: Transformer.Route,\n): Transformer.Result {\n return { event, next };\n}\n","/**\n * Anonymizes an IPv4 address by setting the last octet to 0.\n *\n * @param ip The IP address to anonymize.\n * @returns The anonymized IP address or an empty string if the IP is invalid.\n */\nexport function anonymizeIP(ip: string): string {\n const ipv4Pattern = /^(?:\\d{1,3}\\.){3}\\d{1,3}$/;\n\n if (!ipv4Pattern.test(ip)) return '';\n\n return ip.replace(/\\.\\d+$/, '.0'); // Set the last octet to 0\n}\n","/**\n * Throws an error.\n *\n * @param error The error to throw.\n */\nexport function throwError(error: unknown): never {\n throw new Error(String(error));\n}\n","import type { Flow } from './types';\nimport { throwError } from './throwError';\n\n/** Annotation keys to strip from AJV-compatible schemas. */\nconst ANNOTATION_KEYS = new Set([\n 'description',\n 'examples',\n 'title',\n '$comment',\n]);\n\n/** Options for {@link resolveContracts}. */\nexport interface ResolveContractsOptions {\n /**\n * When true (default), annotation keys (`description`, `examples`, `title`,\n * `$comment`) are stripped from event schemas so the result is AJV-clean for\n * runtime validation. Set to false to keep annotations (e.g. for IntelliSense\n * that surfaces property descriptions).\n */\n stripAnnotations?: boolean;\n}\n\n/**\n * Resolve all named contracts: process extend chains, expand wildcards,\n * strip annotations from event schemas.\n *\n * Returns a fully resolved map where each contract entry has inherited\n * properties merged in and wildcards expanded into concrete actions.\n *\n * By default annotations are stripped (AJV-clean). Pass\n * `{ stripAnnotations: false }` to preserve `description`/`examples`/`title`\n * on event schemas.\n */\nexport function resolveContracts(\n contracts: Flow.Contract,\n options?: ResolveContractsOptions,\n): Record<string, Flow.ContractRule> {\n const strip = options?.stripAnnotations !== false;\n const resolved: Record<string, Flow.ContractRule> = {};\n const resolving = new Set<string>(); // Circular detection\n\n function resolve(name: string): Flow.ContractRule {\n if (resolved[name]) return resolved[name];\n\n if (resolving.has(name)) {\n throwError(\n `Circular extend chain detected: ${[...resolving, name].join(' → ')}`,\n );\n }\n\n const entry = contracts[name];\n if (!entry) {\n throwError(`Contract \"${name}\" not found`);\n }\n\n resolving.add(name);\n\n let result: Flow.ContractRule = {};\n\n // 1. Resolve parent first (if extend)\n if (entry.extend) {\n const parent = resolve(entry.extend);\n result = mergeContractEntries(parent, entry);\n } else {\n result = { ...entry };\n }\n\n // Remove extend from resolved entry\n delete result.extend;\n\n // 2. Expand wildcards in events\n if (result.events) {\n result.events = expandWildcards(result.events);\n }\n\n // 3. Strip annotations from event schemas (not from section schemas).\n // Skipped when stripAnnotations is false (annotation-preserving view).\n if (result.events && strip) {\n const stripped: Flow.ContractEvents = {};\n for (const [entity, actions] of Object.entries(result.events)) {\n stripped[entity] = {};\n for (const [action, schema] of Object.entries(actions)) {\n stripped[entity][action] = stripAnnotations(schema);\n }\n }\n result.events = stripped;\n }\n\n resolving.delete(name);\n resolved[name] = result;\n return result;\n }\n\n // Resolve all contracts\n for (const name of Object.keys(contracts)) {\n resolve(name);\n }\n\n return resolved;\n}\n\n/**\n * Merge two contract entries additively.\n * Scalar metadata (tagging, description): child wins, otherwise inherited.\n * `schema`: deep additive merge via mergeContractSchemas.\n * `events`: per-entity-action merge.\n */\nfunction mergeContractEntries(\n parent: Flow.ContractRule,\n child: Flow.ContractRule,\n): Flow.ContractRule {\n const result: Flow.ContractRule = {};\n\n // Scalar metadata: child overrides if set, otherwise inherited.\n if (parent.tagging !== undefined || child.tagging !== undefined) {\n result.tagging = child.tagging ?? parent.tagging;\n }\n if (parent.description !== undefined || child.description !== undefined) {\n result.description = child.description ?? parent.description;\n }\n\n // Schema: additive deep-merge via mergeContractSchemas.\n if (parent.schema && child.schema) {\n result.schema = mergeContractSchemas(\n parent.schema as Record<string, unknown>,\n child.schema as Record<string, unknown>,\n ) as Flow.ContractRule['schema'];\n } else if (parent.schema || child.schema) {\n result.schema = {\n ...((parent.schema || child.schema) as Record<string, unknown>),\n } as Flow.ContractRule['schema'];\n }\n\n // Events: per-entity-action merge (unchanged semantics).\n if (parent.events || child.events) {\n const merged: Flow.ContractEvents = {};\n const allEntities = new Set([\n ...Object.keys(parent.events || {}),\n ...Object.keys(child.events || {}),\n ]);\n\n for (const entity of allEntities) {\n const pActions = parent.events?.[entity] || {};\n const cActions = child.events?.[entity] || {};\n const allActions = new Set([\n ...Object.keys(pActions),\n ...Object.keys(cActions),\n ]);\n\n merged[entity] = {};\n for (const action of allActions) {\n const pSchema = pActions[action];\n const cSchema = cActions[action];\n if (pSchema && cSchema) {\n merged[entity][action] = mergeContractSchemas(\n pSchema as Record<string, unknown>,\n cSchema as Record<string, unknown>,\n );\n } else {\n merged[entity][action] = {\n ...((pSchema || cSchema) as Record<string, unknown>),\n };\n }\n }\n }\n\n result.events = merged;\n }\n\n return result;\n}\n\n/**\n * Expand wildcards in an events map.\n * Merges *.* into all concrete actions, *.action into matching actions,\n * entity.* into all actions of that entity.\n */\nfunction expandWildcards(events: Flow.ContractEvents): Flow.ContractEvents {\n const result: Flow.ContractEvents = {};\n\n // For each concrete entity-action pair, merge all matching wildcard levels\n for (const entity of Object.keys(events)) {\n if (entity === '*') continue;\n result[entity] = {};\n\n for (const action of Object.keys(events[entity] || {})) {\n let merged: Record<string, unknown> = {};\n\n // Level 1: *.*\n const globalWild = events['*']?.['*'];\n if (globalWild)\n merged = mergeContractSchemas(\n merged,\n globalWild as Record<string, unknown>,\n );\n\n // Level 2: *.action\n const actionWild = events['*']?.[action];\n if (actionWild && action !== '*')\n merged = mergeContractSchemas(\n merged,\n actionWild as Record<string, unknown>,\n );\n\n // Level 3: entity.*\n const entityWild = events[entity]?.['*'];\n if (entityWild && action !== '*')\n merged = mergeContractSchemas(\n merged,\n entityWild as Record<string, unknown>,\n );\n\n // Level 4: entity.action\n const exact = events[entity]?.[action];\n if (exact)\n merged = mergeContractSchemas(merged, exact as Record<string, unknown>);\n\n result[entity][action] = merged;\n }\n }\n\n // Preserve * entries for reference\n if (events['*']) {\n result['*'] = { ...events['*'] };\n }\n\n return result;\n}\n\n/**\n * Deep merge two JSON Schema objects with additive semantics.\n * - `required` arrays: union (deduplicated)\n * - `properties`: deep merge (child wins on conflict for scalars)\n * - Scalars: child overrides parent\n */\nexport function mergeContractSchemas(\n parent: Record<string, unknown>,\n child: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...parent };\n\n for (const key of Object.keys(child)) {\n const parentVal = parent[key];\n const childVal = child[key];\n\n if (\n key === 'required' &&\n Array.isArray(parentVal) &&\n Array.isArray(childVal)\n ) {\n result[key] = [...new Set([...parentVal, ...childVal])];\n } else if (isPlainObject(parentVal) && isPlainObject(childVal)) {\n result[key] = mergeContractSchemas(\n parentVal as Record<string, unknown>,\n childVal as Record<string, unknown>,\n );\n } else {\n result[key] = childVal;\n }\n }\n\n return result;\n}\n\n/**\n * Strip annotation-only keys from a schema (deep).\n */\nfunction stripAnnotations(\n schema: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (ANNOTATION_KEYS.has(key)) continue;\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = stripAnnotations(value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * walkerOS reference-syntax regex constants — single source of truth.\n *\n * Rule:\n * - `.` = key or path (resolver walks it)\n * - `:` = literal value or raw-code payload (resolver uses it verbatim)\n *\n * Every tool that recognizes references (core resolver, CLI bundler,\n * app secrets service, explorer IntelliSense) imports these — no\n * inline regexes elsewhere.\n */\n\n// Anchored: matches only when the string is exactly \"$var.name(.deep.path)?\"\nexport const REF_VAR_FULL =\n /^\\$var\\.([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)$/;\n\n// Global inline: matches any \"$var.name(.deep.path)?\" inside a larger string.\n// Character class excludes `/`, `:`, `?`, `&`, etc. so URL contexts work.\nexport const REF_VAR_INLINE =\n /\\$var\\.([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)/g;\nexport const REF_ENV = /\\$env\\.([a-zA-Z_][a-zA-Z0-9_]*)(?::([^\"}\\s]*))?/g;\nexport const REF_CONTRACT = /^\\$contract\\.([a-zA-Z_][a-zA-Z0-9_]*)(?:\\.(.+))?$/;\n/** Whole-string `$flow.<name>(.<path>)?`: cross-flow value reference. */\nexport const REF_FLOW =\n /^\\$flow\\.([a-zA-Z_][a-zA-Z0-9_]*)(?:\\.([a-zA-Z0-9_.]+))?$/;\nexport const REF_STORE = /^\\$store\\.([a-zA-Z_][a-zA-Z0-9_]*)$/;\nexport const REF_SECRET = /^\\$secret\\.([A-Z0-9_]+)$/;\nexport const REF_CODE_PREFIX = '$code:';\n\nconst FLOW_REF_PATTERN = /\\$flow\\.([a-zA-Z_][a-zA-Z0-9_]*)/g;\n\n/**\n * Canonical scanner for the `$flow.` reference grammar. Walks strings,\n * arrays, and objects and returns every referenced flow name. The returned\n * set is the same instance as `into` when one is supplied, so callers can\n * accumulate across multiple values.\n */\nexport function scanFlowRefs(value: unknown, into?: Set<string>): Set<string> {\n const refs = into ?? new Set<string>();\n if (typeof value === 'string') {\n for (const m of value.matchAll(FLOW_REF_PATTERN)) refs.add(m[1]);\n return refs;\n }\n if (value && typeof value === 'object') {\n for (const v of Object.values(value as Record<string, unknown>))\n scanFlowRefs(v, refs);\n }\n return refs;\n}\n","/**\n * Flow Configuration Utilities\n *\n * Functions for resolving and processing Flow configurations.\n *\n * @packageDocumentation\n */\n\nimport type { Flow } from './types';\nimport { resolveContracts } from './contract';\nimport {\n REF_CONTRACT,\n REF_ENV,\n REF_FLOW,\n REF_SECRET,\n REF_VAR_FULL,\n REF_VAR_INLINE,\n} from './references';\nimport { throwError } from './throwError';\n\n/**\n * Merge variables with cascade priority.\n * Later arguments have higher priority.\n */\nfunction mergeVariables(\n ...sources: (Flow.Variables | undefined)[]\n): Flow.Variables {\n const result: Flow.Variables = {};\n for (const source of sources) {\n if (source) {\n Object.assign(result, source);\n }\n }\n return result;\n}\n\n/** Sentinel prefix for deferred $env resolution. Shared with CLI bundler. */\nexport const ENV_MARKER_PREFIX = '__WALKEROS_ENV:';\n\n/** Sentinel prefix for deferred $secret resolution. Shared with CLI bundler. */\nexport const SECRET_MARKER_PREFIX = '__WALKEROS_SECRET:';\n\nexport interface ResolveOptions {\n deferred?: boolean;\n /**\n * When false, unresolved `$flow.X.Y` refs (unknown flow, missing key,\n * empty value) trigger {@link onWarning} and the original `$flow…` string\n * is left in place. Cycles always throw regardless of this flag.\n * Default: true (strict — throws as today).\n */\n strictFlowRefs?: boolean;\n /** Called for each unresolved $flow ref when {@link strictFlowRefs} is false. */\n onWarning?: (message: string) => void;\n}\n\n/** Format an actionable hint when `$flow.X.Y` cannot be resolved. */\nfunction formatUnresolvedFlowMessage(\n flowName: string,\n path: string | undefined,\n reason: 'unknown-flow' | 'missing-key',\n): string {\n const ref = `$flow.${flowName}${path ? `.${path}` : ''}`;\n if (reason === 'unknown-flow') {\n return `${ref} cannot resolve: flow \"${flowName}\" does not exist in this config.`;\n }\n // missing-key (includes empty url / missing settings.X)\n const target = path\n ? `flows.${flowName}.config.${path}`\n : `flows.${flowName}.config`;\n return `${ref} is empty. Set ${target}, or run \\`walkeros deploy ${flowName}\\` first.`;\n}\n\n/**\n * Walk a dot-separated path into a value.\n * Throws if any intermediate segment is missing or not an object.\n */\nexport function walkPath(\n value: unknown,\n path: string,\n refPrefix: string,\n): unknown {\n const segments = path.split('.');\n let current = value;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (\n current === null ||\n current === undefined ||\n typeof current !== 'object'\n ) {\n const visited = segments.slice(0, i).join('.');\n throwError(\n `Path \"${path}\" not found in \"${refPrefix}\": \"${segment}\" does not exist${visited ? ` in \"${visited}\"` : ''}`,\n );\n }\n const obj = current as Record<string, unknown>;\n if (!(segment in obj)) {\n const visited = segments.slice(0, i).join('.');\n throwError(\n `Path \"${path}\" not found in \"${refPrefix}\": \"${segment}\" does not exist${visited ? ` in \"${visited}\"` : ''}`,\n );\n }\n current = obj[segment];\n }\n\n return current;\n}\n\n/**\n * Resolver callback for `$flow.X.Y` references.\n *\n * Given a sibling flow name, returns its fully resolved `Flow.Config` block\n * (with `$env`/`$var`/`$contract` already resolved) as `unknown` so that\n * {@link walkPath} can traverse it. Returns `undefined` if the flow does\n * not exist. Implementations are responsible for cycle detection across\n * recursive calls.\n */\nexport type FlowConfigResolver = (flowName: string) => unknown;\n\n/**\n * Resolve all dynamic patterns in a value.\n *\n * Patterns:\n * - $var.name (or $var.name.deep.path) → Look up variables[name], optional deep\n * path walk. Whole-string match preserves the native type of the variable\n * (object, array, number, boolean, string). Inline interpolation requires a\n * scalar (string/number/boolean) and throws on objects/arrays. Resolution is\n * recursive (variables may reference other variables) with cycle detection.\n * - $env.NAME or $env.NAME:default → Look up process.env[NAME] (non-secret config)\n * - $secret.NAME → Managed secret. In deferred (server) mode emits a marker the\n * bundler turns into a runtime process.env read; the deploy pipeline injects\n * the secret value. Throws in non-deferred (web) mode. Use for credentials.\n * - $contract.name(.path)? → Resolved contract value (when contracts available)\n * - $flow.name(.path)? → Sibling flow's resolved {@link Flow.Config} (when resolver available)\n *\n * Top-level object keys are preserved verbatim (only values are walked), so an\n * object input retains its declared shape after resolution. The overload below\n * lets callers pass a typed object (e.g. `Flow.Config`) and get the same type\n * back without an unsafe cast. Strings that are whole-pattern references may\n * resolve to arbitrary types — callers passing a typed object should not rely\n * on individual string fields being preserved as strings.\n */\nfunction resolvePatterns<T extends object>(\n value: T,\n variables: Flow.Variables,\n options?: ResolveOptions,\n resolvedContracts?: Record<string, Flow.ContractRule>,\n resolveFlow?: FlowConfigResolver,\n varVisiting?: Set<string>,\n): T;\nfunction resolvePatterns(\n value: unknown,\n variables: Flow.Variables,\n options?: ResolveOptions,\n resolvedContracts?: Record<string, Flow.ContractRule>,\n resolveFlow?: FlowConfigResolver,\n varVisiting?: Set<string>,\n): unknown;\nfunction resolvePatterns(\n value: unknown,\n variables: Flow.Variables,\n options?: ResolveOptions,\n resolvedContracts?: Record<string, Flow.ContractRule>,\n resolveFlow?: FlowConfigResolver,\n varVisiting?: Set<string>,\n): unknown {\n if (typeof value === 'string') {\n // Whole-string $var match: preserve native type, support deep paths\n const fullMatch = value.match(REF_VAR_FULL);\n if (fullMatch) {\n const path = fullMatch[1]; // e.g. \"name\" or \"name.deep.path\"\n const segments = path.split('.');\n const varName = segments[0];\n const deepPath = segments.slice(1).join('.');\n\n if (variables[varName] === undefined) {\n throwError(`Variable \"${varName}\" not found`);\n }\n\n const visiting = varVisiting ?? new Set<string>();\n if (visiting.has(varName)) {\n const chain = [...visiting, varName].join(' -> ');\n throwError(`Cyclic $var reference: ${chain}`);\n }\n\n visiting.add(varName);\n let resolved: unknown;\n try {\n resolved = resolvePatterns(\n variables[varName],\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n visiting,\n );\n } finally {\n visiting.delete(varName);\n }\n\n if (deepPath) {\n resolved = walkPath(resolved, deepPath, `$var.${varName}`);\n }\n\n return resolved;\n }\n\n // Check if entire string is a $contract reference with path\n const contractMatch = value.match(REF_CONTRACT);\n if (contractMatch && resolvedContracts) {\n const contractName = contractMatch[1];\n const path = contractMatch[2];\n\n if (!(contractName in resolvedContracts)) {\n throwError(`Contract \"${contractName}\" not found`);\n }\n\n let resolved: unknown = resolvedContracts[contractName];\n\n if (path) {\n resolved = walkPath(resolved, path, `$contract.${contractName}`);\n }\n\n return resolved;\n }\n\n // Check if entire string is a $flow reference with optional path\n const flowMatch = value.match(REF_FLOW);\n if (flowMatch) {\n const flowName = flowMatch[1];\n const path = flowMatch[2]; // 'url' or 'settings.region' or undefined\n const softMode = options?.strictFlowRefs === false;\n\n if (!resolveFlow) {\n throwError(\n `$flow.${flowName}${path ? `.${path}` : ''} cannot be resolved without a flow resolver`,\n );\n }\n\n // resolveFlow may throw on cycle — that always propagates (cycles are bugs).\n const targetConfig = resolveFlow(flowName);\n if (!targetConfig) {\n if (softMode) {\n options?.onWarning?.(\n formatUnresolvedFlowMessage(flowName, path, 'unknown-flow'),\n );\n return value;\n }\n throwError(`Flow \"${flowName}\" not found in $flow.${flowName}`);\n }\n\n let resolved: unknown = targetConfig;\n if (path) {\n if (softMode) {\n // Try to walk; if walk fails OR result is empty/undefined, soft-warn and keep original.\n try {\n resolved = walkPath(resolved, path, `$flow.${flowName}`);\n } catch {\n options?.onWarning?.(\n formatUnresolvedFlowMessage(flowName, path, 'missing-key'),\n );\n return value;\n }\n if (resolved === undefined || resolved === null || resolved === '') {\n options?.onWarning?.(\n formatUnresolvedFlowMessage(flowName, path, 'missing-key'),\n );\n return value;\n }\n } else {\n resolved = walkPath(resolved, path, `$flow.${flowName}`);\n }\n }\n\n return resolved;\n }\n\n // Check if entire string is a $secret reference (whole-string only).\n // Server (deferred) → emit a marker the bundler turns into a runtime\n // process.env read. Web (non-deferred) → hard error: a secret must never\n // be inlined into a browser bundle, and we never read its value here.\n const secretMatch = value.match(REF_SECRET);\n if (secretMatch) {\n const name = secretMatch[1];\n if (options?.deferred) {\n return `${SECRET_MARKER_PREFIX}${name}`;\n }\n throwError(\n `Secret \"$secret.${name}\" cannot be used in a web flow — secrets are never sent to the browser. Use a server flow.`,\n );\n }\n\n // Inline $var: must resolve to scalar\n let result = value.replace(REF_VAR_INLINE, (_match, path: string) => {\n const segments = path.split('.');\n const varName = segments[0];\n const deepPath = segments.slice(1).join('.');\n\n if (variables[varName] === undefined) {\n throwError(`Variable \"${varName}\" not found`);\n }\n\n const visiting = varVisiting ?? new Set<string>();\n if (visiting.has(varName)) {\n const chain = [...visiting, varName].join(' -> ');\n throwError(`Cyclic $var reference: ${chain}`);\n }\n\n visiting.add(varName);\n let resolved: unknown;\n try {\n resolved = resolvePatterns(\n variables[varName],\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n visiting,\n );\n } finally {\n visiting.delete(varName);\n }\n\n if (deepPath) {\n resolved = walkPath(resolved, deepPath, `$var.${varName}`);\n }\n\n if (\n resolved === null ||\n (typeof resolved !== 'string' &&\n typeof resolved !== 'number' &&\n typeof resolved !== 'boolean')\n ) {\n const type = Array.isArray(resolved) ? 'array' : typeof resolved;\n throwError(\n `Variable \"${path}\" resolves to non-scalar (${type}) and cannot be inlined into a string. Use it as a whole-string reference: \"$var.${path}\"`,\n );\n }\n\n return String(resolved);\n });\n\n // Replace $env.NAME or $env.NAME:default patterns\n result = result.replace(REF_ENV, (match, name, defaultValue) => {\n if (options?.deferred) {\n return defaultValue !== undefined\n ? `${ENV_MARKER_PREFIX}${name}:${defaultValue}`\n : `${ENV_MARKER_PREFIX}${name}`;\n }\n if (typeof process !== 'undefined' && process.env?.[name] !== undefined) {\n return process.env[name]!;\n }\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n throwError(\n `Environment variable \"${name}\" not found and no default provided`,\n );\n });\n\n return result;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) =>\n resolvePatterns(\n item,\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n varVisiting,\n ),\n );\n }\n\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = resolvePatterns(\n val,\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n varVisiting,\n );\n }\n return result;\n }\n\n return value;\n}\n\n/**\n * Convert package name to valid JavaScript variable name.\n * Used for deterministic default import naming.\n * @example\n * packageNameToVariable('@walkeros/server-destination-api')\n * // → '_walkerosServerDestinationApi'\n */\nexport function packageNameToVariable(packageName: string): string {\n const hasScope = packageName.startsWith('@');\n const normalized = packageName\n .replace('@', '')\n .replace(/[/-]/g, '_')\n .split('_')\n .filter((part) => part.length > 0)\n .map((part, i) =>\n i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join('');\n\n return hasScope ? '_' + normalized : normalized;\n}\n\n/**\n * Get resolved flow for a named flow.\n *\n * Resolution pass order:\n * 1. `$env` / `$var` resolve per-flow in isolation (no cross-flow context).\n * `$var` resolves recursively (variables may reference other variables,\n * `$env`, `$contract`, or `$flow`); cycles are detected via a visiting set.\n * 2. `$flow.X.Y` resolves against pass-1 outputs of sibling flows (so `$env`/`$var`\n * inside the referenced flow are already resolved when `$flow` reads it).\n * 3. `$contract` resolves last (with `$flow` results available).\n *\n * In practice these passes are interleaved by the resolver: when `$flow.X.Y`\n * is encountered, the sibling flow X's `Flow.Config` block is recursively\n * resolved on demand (with all its own `$env`/`$var`/`$contract` references\n * resolved first), then the deep path is walked. Cycles are detected via a\n * visiting set.\n *\n * @param config - The complete Flow.Json (root multi-flow config)\n * @param flowName - Flow name (auto-selected if only one exists)\n * @param options - Resolution options\n * @returns Resolved {@link Flow} with $var, $env, $contract, and $flow patterns resolved\n * @throws Error if flow selection is required but not specified, or flow not found\n * @throws Error if a `$flow.X.Y` reference forms a cycle\n *\n * @example\n * ```typescript\n * import { getFlowSettings } from '@walkeros/core';\n *\n * const config = JSON.parse(fs.readFileSync('walkeros.config.json', 'utf8'));\n *\n * // Auto-select if only one flow\n * const flow = getFlowSettings(config);\n *\n * // Or specify flow\n * const prodFlow = getFlowSettings(config, 'production');\n * ```\n */\nexport function getFlowSettings(\n config: Flow.Json,\n flowName?: string,\n options?: ResolveOptions,\n): Flow {\n // Per-call shared state for cross-flow resolution.\n const resolvedFlowConfigs = new Map<string, unknown>();\n const visiting = new Set<string>();\n const visitOrder: string[] = [];\n\n /**\n * Recursively resolve a sibling flow's `Flow.Config` block.\n * Used by the resolver when it encounters `$flow.X.Y`.\n * Throws on cycles. Returns undefined if the flow does not exist.\n */\n const resolveFlowConfig: FlowConfigResolver = (targetName): unknown => {\n if (resolvedFlowConfigs.has(targetName)) {\n return resolvedFlowConfigs.get(targetName);\n }\n\n const targetSettings = config.flows[targetName];\n if (!targetSettings) return undefined;\n\n if (visiting.has(targetName)) {\n const chain = [...visitOrder, targetName].join(' -> ');\n throwError(`Cyclic $flow reference: ${chain}`);\n }\n\n visiting.add(targetName);\n visitOrder.push(targetName);\n try {\n const vars = mergeVariables(config.variables, targetSettings.variables);\n // Resolve only the public config block: that is what $flow may read.\n const resolved = resolvePatterns(\n targetSettings.config ?? {},\n vars,\n options,\n undefined, // contracts not consulted inside Flow.Config\n resolveFlowConfig,\n );\n resolvedFlowConfigs.set(targetName, resolved);\n return resolved;\n } finally {\n visiting.delete(targetName);\n visitOrder.pop();\n }\n };\n\n const flowNames = Object.keys(config.flows);\n\n // Auto-select if only one flow\n if (!flowName) {\n if (flowNames.length === 1) {\n flowName = flowNames[0];\n } else {\n throwError(\n `Multiple flows found (${flowNames.join(', ')}). Please specify a flow.`,\n );\n }\n }\n\n // Check flow exists\n const settings = config.flows[flowName];\n if (!settings) {\n throwError(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n // Cycle guard for the top-level flow being resolved as well.\n // Without this, a cycle initiated from the entry flow (a → b → a) would\n // not be detected when control returned to \"a\".\n visiting.add(flowName);\n visitOrder.push(flowName);\n\n try {\n return resolveFlowSettings(config, settings, options, resolveFlowConfig);\n } finally {\n visiting.delete(flowName);\n visitOrder.pop();\n }\n}\n\nfunction resolveFlowSettings(\n config: Flow.Json,\n settings: Flow,\n options: ResolveOptions | undefined,\n resolveFlow: FlowConfigResolver,\n): Flow {\n // Deep clone to avoid mutations\n const result = JSON.parse(JSON.stringify(settings)) as Flow;\n\n // Pre-process contracts: resolve $var/$env inside contracts, then extend + wildcards\n let resolvedContracts: Record<string, Flow.ContractRule> | undefined;\n if (config.contract) {\n // Two-pass: resolve $var/$env inside contract first\n const vars = mergeVariables(config.variables, settings.variables);\n const resolvedContractInput = resolvePatterns(\n config.contract,\n vars,\n options,\n undefined,\n resolveFlow,\n ) as Flow.Contract;\n\n resolvedContracts = resolveContracts(resolvedContractInput);\n }\n\n // Process the flow's own config block so $flow/$env/$var refs inside\n // it (e.g. settings.url = '$flow.server.url') are resolved.\n if (result.config) {\n const vars = mergeVariables(config.variables, settings.variables);\n result.config = resolvePatterns(\n result.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n }\n\n // Process sources with variable cascade\n if (result.sources) {\n for (const [name, source] of Object.entries(result.sources)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n source.variables,\n );\n\n const processedConfig = resolvePatterns(\n source.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n source.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.sources[name] = {\n package: source.package,\n import: source.import,\n config: processedConfig,\n env: processedEnv,\n primary: source.primary,\n variables: source.variables,\n before: source.before,\n next: source.next,\n cache: source.cache,\n code: source.code,\n } as Flow.Source;\n }\n }\n\n // Process destinations with variable cascade\n if (result.destinations) {\n for (const [name, dest] of Object.entries(result.destinations)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n dest.variables,\n );\n\n const processedConfig = resolvePatterns(\n dest.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n dest.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.destinations[name] = {\n package: dest.package,\n import: dest.import,\n config: processedConfig,\n env: processedEnv,\n variables: dest.variables,\n before: dest.before,\n next: dest.next,\n cache: dest.cache,\n code: dest.code,\n } as Flow.Destination;\n }\n }\n\n // Process stores with variable cascade\n if (result.stores) {\n for (const [name, store] of Object.entries(result.stores)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n store.variables,\n );\n\n const processedConfig = resolvePatterns(\n store.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n store.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.stores[name] = {\n package: store.package,\n import: store.import,\n config: processedConfig,\n env: processedEnv,\n cache: store.cache,\n variables: store.variables,\n code: store.code,\n } as Flow.Store;\n }\n }\n\n // Process transformers with variable cascade\n if (result.transformers) {\n for (const [name, transformer] of Object.entries(result.transformers)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n transformer.variables,\n );\n\n const processedConfig = resolvePatterns(\n transformer.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n transformer.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.transformers[name] = {\n package: transformer.package,\n import: transformer.import,\n config: processedConfig,\n env: processedEnv,\n variables: transformer.variables,\n before: transformer.before,\n next: transformer.next,\n cache: transformer.cache,\n code: transformer.code,\n } as Flow.Transformer;\n }\n }\n\n // Process collector config\n if (result.collector) {\n const vars = mergeVariables(config.variables, settings.variables);\n\n const processedCollector = resolvePatterns(\n result.collector,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n result.collector = processedCollector as typeof result.collector;\n }\n\n return result;\n}\n\n/**\n * Get the platform of a flow ('web' or 'server').\n *\n * Reads from `flow.config.platform`.\n *\n * @param flow - Resolved flow (output of {@link getFlowSettings})\n * @returns \"web\" or \"server\"\n * @throws Error if `config.platform` is missing\n *\n * @example\n * ```typescript\n * import { getPlatform } from '@walkeros/core';\n *\n * const platform = getPlatform(flow);\n * // Returns \"web\" or \"server\"\n * ```\n */\nexport function getPlatform(flow: Flow): 'web' | 'server' {\n const platform = flow.config?.platform;\n if (platform === 'web' || platform === 'server') return platform;\n throwError('Flow must have config.platform set to \"web\" or \"server\"');\n}\n","/**\n * @interface Assign\n * @description Options for the assign function.\n * @property merge - Merge array properties instead of overriding them.\n * @property shallow - Create a shallow copy instead of updating the target object.\n * @property extend - Extend the target with new properties instead of only updating existing ones.\n */\ninterface Assign {\n merge?: boolean;\n shallow?: boolean;\n extend?: boolean;\n}\n\nconst defaultOptions: Assign = {\n merge: true,\n shallow: true,\n extend: true,\n};\n\n/**\n * Merges objects with advanced options.\n *\n * @template T, U\n * @param target - The target object to merge into.\n * @param obj - The source object to merge from.\n * @param options - Options for merging.\n * @returns The merged object.\n */\nexport function assign<T extends object, U extends object>(\n target: T,\n obj: U = {} as U,\n options: Assign = {},\n): T & U {\n options = { ...defaultOptions, ...options };\n\n const finalObj = Object.entries(obj).reduce((acc, [key, sourceProp]) => {\n const targetProp = target[key as keyof typeof target];\n\n // Only merge arrays\n if (\n options.merge &&\n Array.isArray(targetProp) &&\n Array.isArray(sourceProp)\n ) {\n acc[key as keyof typeof acc] = sourceProp.reduce(\n (acc, item) => {\n // Remove duplicates\n return acc.includes(item) ? acc : [...acc, item];\n },\n [...targetProp],\n );\n } else if (options.extend || key in target) {\n // Extend the target with new properties or update existing ones.\n //\n // With `extend: false` a source key is copied ONLY if it already exists\n // in target; keys absent from target are silently dropped. This is a\n // deliberate narrow-subset filter, not a bug: the sole caller\n // (collector.ts) picks a handful of config fields out of a much larger\n // initConfig and reads the rest (name, release, logger, consent, ...)\n // separately. Do NOT add an always-on \"dropped key\" warning here — it\n // would fire on every collector construction. A field that must survive\n // this filter has to exist in target (or be read directly, as the\n // collector does for name/release).\n acc[key as keyof typeof acc] = sourceProp;\n }\n\n return acc;\n }, {} as U);\n\n // Handle shallow or deep copy based on options\n if (options.shallow) {\n return { ...target, ...finalObj };\n } else {\n Object.assign(target, finalObj);\n return target as T & U;\n }\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Checks if a value is an arguments object.\n *\n * @param value The value to check.\n * @returns True if the value is an arguments object, false otherwise.\n */\nexport function isArguments(value: unknown): value is IArguments {\n return Object.prototype.toString.call(value) === '[object Arguments]';\n}\n\n/**\n * Checks if a value is an array.\n *\n * @param value The value to check.\n * @returns True if the value is an array, false otherwise.\n */\nexport function isArray<T>(value: unknown): value is T[] {\n return Array.isArray(value);\n}\n\n/**\n * Checks if a value is a boolean.\n *\n * @param value The value to check.\n * @returns True if the value is a boolean, false otherwise.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Checks if an entity is a walker command.\n *\n * @param entity The entity to check.\n * @returns True if the entity is a walker command, false otherwise.\n */\nexport function isCommand(entity: string) {\n return entity === 'walker';\n}\n\n/**\n * Checks if a value is defined.\n *\n * @param value The value to check.\n * @returns True if the value is defined, false otherwise.\n */\nexport function isDefined<T>(val: T | undefined): val is T {\n return typeof val !== 'undefined';\n}\n\n/**\n * Checks if a value is an element or the document.\n *\n * @param elem The value to check.\n * @returns True if the value is an element or the document, false otherwise.\n */\nexport function isElementOrDocument(elem: unknown): elem is Element {\n if (!elem || typeof elem !== 'object') return false;\n // Property check: Document has 'body', Element has 'tagName'\n return 'body' in elem || 'tagName' in elem;\n}\n\n/**\n * Checks if a value is a function.\n *\n * @param value The value to check.\n * @returns True if the value is a function, false otherwise.\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Checks if a value is a number.\n *\n * @param value The value to check.\n * @returns True if the value is a number, false otherwise.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Checks if a value is an object.\n *\n * @param value The value to check.\n * @returns True if the value is an object, false otherwise.\n */\nexport function isObject(value: unknown): value is WalkerOS.AnyObject {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Checks if two variables have the same type.\n *\n * @param variable The first variable.\n * @param type The second variable.\n * @returns True if the variables have the same type, false otherwise.\n */\nexport function isSameType<T>(\n variable: unknown,\n type: T,\n): variable is typeof type {\n return typeof variable === typeof type;\n}\n\n/**\n * Checks if a value is a string.\n *\n * @param value The value to check.\n * @returns True if the value is a string, false otherwise.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n","/**\n * Creates a deep clone of a value.\n * Supports primitive values, objects, arrays, dates, and regular expressions.\n * Handles circular references.\n *\n * @template T\n * @param org - The value to clone.\n * @param visited - A map of visited objects to handle circular references.\n * @returns The cloned value.\n */\nexport function clone<T>(\n org: T,\n visited: WeakMap<object, unknown> = new WeakMap(),\n): T {\n // Handle primitive values and functions directly\n if (typeof org !== 'object' || org === null) return org;\n\n // Check for circular references\n if (visited.has(org)) return visited.get(org) as T;\n\n // Allow list of clonable types\n const type = Object.prototype.toString.call(org);\n if (type === '[object Object]') {\n const clonedObj = {} as Record<string | symbol, unknown>;\n visited.set(org as object, clonedObj); // Remember the reference\n\n for (const key in org as Record<string | symbol, unknown>) {\n if (Object.prototype.hasOwnProperty.call(org, key)) {\n clonedObj[key] = clone(\n (org as Record<string | symbol, unknown>)[key],\n visited,\n );\n }\n }\n return clonedObj as T;\n }\n\n if (type === '[object Array]') {\n const clonedArray = [] as unknown[];\n visited.set(org as object, clonedArray); // Remember the reference\n\n (org as unknown[]).forEach((item) => {\n clonedArray.push(clone(item, visited));\n });\n\n return clonedArray as T;\n }\n\n if (type === '[object Date]') {\n return new Date((org as unknown as Date).getTime()) as T;\n }\n\n if (type === '[object RegExp]') {\n const reg = org as unknown as RegExp;\n return new RegExp(reg.source, reg.flags) as T;\n }\n\n // Skip cloning for unsupported types and return reference\n return org;\n}\n","import type { WalkerOS } from './types';\nimport { isArray, isDefined, isObject } from './is';\nimport { clone } from './clone';\n\n/**\n * Gets a value from an object by a dot-notation string.\n * Supports wildcards for arrays.\n *\n * @example\n * getByPath({ data: { id: 1 } }, \"data.id\") // Returns 1\n *\n * @param event - The object to get the value from.\n * @param key - The dot-notation string.\n * @param defaultValue - The default value to return if the key is not found.\n * @returns The value from the object or the default value.\n */\nexport function getByPath(\n event: unknown,\n key: string = '',\n defaultValue?: unknown,\n): unknown {\n const keys = key.split('.');\n let values: unknown = event;\n\n for (let index = 0; index < keys.length; index++) {\n const k = keys[index];\n\n if (k === '*' && isArray(values)) {\n const remainingKeys = keys.slice(index + 1).join('.');\n const result: unknown[] = [];\n\n for (const item of values) {\n const value = getByPath(item, remainingKeys, defaultValue);\n result.push(value);\n }\n\n return result;\n }\n\n values =\n isObject(values) || isArray(values)\n ? values[k as keyof typeof values]\n : undefined;\n\n if (values === undefined) break;\n }\n\n return isDefined(values) ? values : defaultValue;\n}\n\n/**\n * Sets a value in an object by a dot-notation string.\n *\n * @param obj - The object to set the value in.\n * @param key - The dot-notation string.\n * @param value - The value to set.\n * @returns A new object with the updated value.\n */\nexport function setByPath<T = unknown>(obj: T, key: string, value: unknown): T {\n if (!isObject(obj)) return obj;\n\n const clonedObj = clone(obj);\n const keys = key.split('.');\n let current: WalkerOS.AnyObject = clonedObj;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as keyof typeof current;\n\n // Set the value if it's the last key\n if (i === keys.length - 1) {\n current[k] = value;\n } else {\n // Traverse to the next level\n if (\n !(k in current) ||\n typeof current[k] !== 'object' ||\n current[k] === null\n ) {\n current[k] = {};\n }\n\n // Move deeper into the object\n current = current[k] as WalkerOS.AnyObject;\n }\n }\n\n return clonedObj as T;\n}\n\n/**\n * Deletes a value in an object by a dot-notation string.\n * Returns a new object; the input is not mutated. No-op when the path is\n * absent or the target is neither an object nor an array. Numeric segments\n * index into arrays; a final numeric segment splices the element out so no\n * empty slot is left behind.\n */\nexport function deleteByPath<T = unknown>(obj: T, key: string): T {\n if (!isObject(obj) && !isArray(obj)) return obj;\n const clonedObj = clone(obj);\n const keys = key.split('.');\n let current: WalkerOS.AnyObject | unknown[] = clonedObj;\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n const isLast = i === keys.length - 1;\n\n if (isArray(current)) {\n const index = Number(k);\n if (!Number.isInteger(index) || index < 0 || index >= current.length)\n return clonedObj;\n if (isLast) {\n current.splice(index, 1);\n } else {\n const next = current[index];\n if (!isObject(next) && !isArray(next)) return clonedObj;\n current = next;\n }\n } else if (isLast) {\n delete current[k];\n } else {\n const next = current[k];\n if (!isObject(next) && !isArray(next)) return clonedObj;\n current = next;\n }\n }\n return clonedObj as T;\n}\n","import type { WalkerOS } from './types';\nimport { isObject } from './is';\n\nconst SECTIONS: Record<string, (e: WalkerOS.DeepPartialEvent) => unknown> = {\n data: (e) => e.data,\n globals: (e) => e.globals,\n context: (e) => e.context,\n user: (e) => e.user,\n source: (e) => e.source,\n event: (e) => ({\n entity: e.entity,\n action: e.action,\n id: e.id,\n timestamp: e.timestamp,\n name: e.name,\n trigger: e.trigger,\n timing: (e as WalkerOS.Event).timing,\n }),\n};\n\n// Recurse into plain objects (maps), joining keys with an underscore, so a\n// nested map becomes fully flattened leaf keys. Arrays are leaves and kept\n// as-is; only plain objects recurse.\nfunction flattenInto(\n out: Record<string, unknown>,\n prefix: string,\n value: unknown,\n): void {\n if (isObject(value)) {\n for (const [k, v] of Object.entries(value)) {\n if (v === undefined) continue;\n flattenInto(out, `${prefix}_${k}`, v);\n }\n } else {\n // Leaf. Arrays land here intentionally (isObject is false for arrays): they\n // are kept whole, NOT index-flattened into `${prefix}_0`, `${prefix}_1`.\n // GA4-style vendors can't consume indexed array params meaningfully and\n // list-heavy `data` would explode into hundreds of keys. Do not \"fix\" this\n // to recurse arrays without a concrete destination that needs it.\n out[prefix] = value;\n }\n}\n\nexport function flattenIncludeSections(\n event: WalkerOS.DeepPartialEvent,\n sections: string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const effective = sections.includes('all') ? Object.keys(SECTIONS) : sections;\n\n for (const section of effective) {\n const picker = SECTIONS[section];\n if (!picker) continue;\n const bag = picker(event);\n if (!isObject(bag)) continue;\n\n for (const [key, raw] of Object.entries(bag as Record<string, unknown>)) {\n if (raw === undefined) continue;\n // Context values are OrderedProperties tuples - extract the label first,\n // then flatten (the label is usually a string leaf).\n const value = section === 'context' && Array.isArray(raw) ? raw[0] : raw;\n flattenInto(out, `${section}_${key}`, value);\n }\n }\n\n return out;\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Casts a value to a specific type.\n *\n * @param value The value to cast.\n * @returns The casted value.\n */\nexport function castValue(value: unknown): WalkerOS.PropertyType {\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n const number = Number(value); // Converts \"\" to 0\n if (value == number && value !== '') return number;\n\n return String(value);\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Checks if the required consent is granted.\n *\n * @param required - The required consent states.\n * @param state - The current consent states.\n * @param individual - Individual consent states to prioritize.\n * @returns The granted consent states or false if not granted.\n */\nexport function getGrantedConsent(\n required: WalkerOS.Consent | undefined,\n state: WalkerOS.Consent = {},\n individual: WalkerOS.Consent = {},\n): false | WalkerOS.Consent {\n // Merge state and individual, prioritizing individual states\n const states: WalkerOS.Consent = { ...state, ...individual };\n\n const grantedStates: WalkerOS.Consent = {};\n let hasRequiredConsent = !required || Object.keys(required).length === 0;\n\n Object.keys(states).forEach((name) => {\n if (states[name]) {\n // consent granted\n grantedStates[name] = true;\n\n // Check if it's required and granted consent\n if (required && required[name]) hasRequiredConsent = true;\n }\n });\n\n return hasRequiredConsent ? grantedStates : false;\n}\n","import type { Destination } from './types';\nimport type { TypesOf, Config } from './types/destination';\nimport { assign } from './assign';\n\n/**\n * Creates a new destination instance by merging a base destination with additional configuration.\n *\n * This utility enables elegant destination configuration while avoiding config side-effects\n * that could occur when reusing destination objects across multiple collector instances.\n *\n * @param baseDestination - The base destination to extend\n * @param config - Additional configuration to merge with the base destination's config\n * @returns A new destination instance with merged configuration\n *\n * @example\n * ```typescript\n * // Types are inferred automatically from destinationGtag\n * elb('walker destination', createDestination(destinationGtag, {\n * settings: { ga4: { measurementId: 'G-123' } }\n * }));\n * ```\n */\nexport function createDestination<I extends Destination.Instance>(\n baseDestination: I,\n config: Partial<Config<TypesOf<I>>>,\n): I {\n // Create a shallow copy of the base destination to avoid mutations\n const newDestination = { ...baseDestination };\n\n // Deep merge the config, handling nested objects like settings and mapping\n newDestination.config = assign(baseDestination.config, config, {\n shallow: true, // Create new object, don't mutate original\n merge: true, // Merge arrays\n extend: true, // Allow new properties\n });\n\n // Handle nested settings merging if both have settings\n if (baseDestination.config.settings && config.settings) {\n newDestination.config.settings = assign(\n baseDestination.config.settings as object,\n config.settings as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.settings;\n }\n\n // Handle nested mapping merging if both have mapping\n if (baseDestination.config.mapping && config.mapping) {\n newDestination.config.mapping = assign(\n baseDestination.config.mapping as object,\n config.mapping as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.mapping;\n }\n\n return newDestination;\n}\n","import { isObject } from './is';\n\n/**\n * Deep merges source into target, mutating target in-place.\n * Recurses into plain objects; everything else is a leaf (replaced).\n * Skips undefined source values; null overwrites.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Record<string, unknown>,\n): T {\n if (!isObject(source)) return target;\n\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === undefined) continue;\n\n if (isObject(val) && isObject(target[key])) {\n deepMerge(target[key] as Record<string, unknown>, val);\n } else {\n (target as Record<string, unknown>)[key] = val;\n }\n }\n\n return target;\n}\n","/**\n * Generates a random string of a given length.\n *\n * Draws from the platform CSPRNG (`crypto.getRandomValues`) when available,\n * with rejection sampling to keep the character distribution unbiased. Falls\n * back to `Math.random` only when no secure source is reachable.\n *\n * @param length - The length of the random string.\n * @param charset - Optional custom charset. Defaults to base-36 (0-9a-z).\n * @returns The random string.\n */\nconst defaultCharset = '0123456789abcdefghijklmnopqrstuvwxyz';\n\nexport function getId(length = 6, charset: string = defaultCharset): string {\n const n = charset.length;\n if (length <= 0 || n === 0) return '';\n\n let str = '';\n\n // Single-byte charsets can be sampled from the CSPRNG. Reject bytes above the\n // largest multiple of n that fits in a byte so every character is equally likely.\n if (n <= 256) {\n const limit = 256 - (256 % n);\n while (str.length < length) {\n const need = length - str.length;\n const buffer = new Uint8Array(Math.ceil(need * 1.3) + 4);\n if (!secureBytes(buffer)) break; // No secure source, drop to fallback below\n for (let i = 0; i < buffer.length && str.length < length; i++) {\n if (buffer[i] < limit) str += charset[buffer[i] % n];\n }\n }\n }\n\n // Fallback for a missing CSPRNG or an oversized charset.\n while (str.length < length) str += charset[(Math.random() * n) | 0];\n\n return str;\n}\n\nfunction secureBytes(buffer: Uint8Array): boolean {\n try {\n const cryptoObj: Crypto | undefined = globalThis.crypto;\n if (cryptoObj && typeof cryptoObj.getRandomValues === 'function') {\n cryptoObj.getRandomValues(buffer);\n return true;\n }\n } catch {\n // Secure source unavailable, signal the caller to use the fallback.\n }\n return false;\n}\n","import { getId } from './getId';\n\nconst hexCharset = '0123456789abcdef';\n\n/**\n * Random lowercase-hex id of `length` characters via the CSPRNG-backed getId.\n * Regenerates on the all-zero value, which W3C Trace Context forbids for\n * trace-id and span-id (astronomically rare, but kept spec-correct).\n */\nexport function hexId(length: number): string {\n let id = getId(length, hexCharset);\n while (/^0+$/.test(id)) id = getId(length, hexCharset);\n return id;\n}\n","import { hexId } from './hexId';\n\n/**\n * W3C span_id: 8 random bytes encoded as 16 lowercase hex characters.\n * Reference: W3C Trace Context (W3C Recommendation, January 2020).\n */\nexport function getSpanId(): string {\n return hexId(16);\n}\n","import type { WalkerOS } from './types';\nimport { assign } from './assign';\nimport { getSpanId } from './getSpanId';\n\n/**\n * Creates a complete event with default values.\n * Used for testing and debugging.\n *\n * Models a post-collector event: `source` always carries the run-stamped\n * `count` and `trace`, so a generated event matches one that has been pushed\n * through the collector. Override via `props.source` if needed.\n *\n * @param props - Properties to override the default values.\n * @returns A complete event.\n */\nexport function createEvent(\n props: WalkerOS.DeepPartialEvent = {},\n): WalkerOS.Event {\n const timestamp = props.timestamp || new Date().setHours(0, 13, 37, 0);\n const id = props.id || getSpanId();\n\n const defaultEvent: WalkerOS.Event = {\n name: 'entity action',\n data: {\n string: 'foo',\n number: 1,\n boolean: true,\n array: [0, 'text', false],\n not: undefined,\n },\n context: { dev: ['test', 1] },\n globals: { lang: 'elb' },\n custom: { completely: 'random' },\n user: { id: 'us3r', device: 'c00k13', session: 's3ss10n' },\n nested: [\n {\n entity: 'child',\n data: { is: 'subordinated' },\n },\n ],\n consent: { functional: true },\n id,\n trigger: 'test',\n entity: 'entity',\n action: 'action',\n timestamp,\n timing: 3.14,\n source: {\n type: 'collector',\n schema: '4',\n },\n };\n\n // Note: Always prefer the props over the defaults\n\n // Merge properties\n const event = assign(defaultEvent, props, { merge: false });\n\n // Mirror collector output: generated events always carry the run-stamped\n // source fields (per-run count and a fixed, deterministic trace) so an event\n // built from this helper matches a pushed event without tests having to\n // assert them, and two generator calls produce equal events. Any source\n // fields provided via props still win.\n event.source = {\n count: 1,\n trace: '0a1b2c3d4e5f60718293a4b5c6d7e8f9',\n ...event.source,\n };\n\n // Update conditions\n\n // Entity and action from event\n if (props.name) {\n const [entity, action] = props.name.split(' ') ?? [];\n\n if (entity && action) {\n event.entity = entity;\n event.action = action;\n }\n }\n\n return event;\n}\n\n/**\n * Creates a complete event with default values based on the event name.\n * Used for testing and debugging.\n *\n * @param name - The name of the event to create.\n * @param props - Properties to override the default values.\n * @returns A complete event.\n */\nexport function getEvent(\n name: string = 'entity action',\n props: WalkerOS.DeepPartialEvent = {},\n): WalkerOS.Event {\n const timestamp = props.timestamp || new Date().setHours(0, 13, 37, 0);\n\n const quantity = 2;\n const product1 = {\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n color: 'black',\n size: 'l',\n price: 420,\n },\n };\n const product2 = {\n data: {\n id: 'cc',\n name: 'Cool Cap',\n size: 'one size',\n price: 42,\n },\n };\n\n const defaultEvents: Record<string, WalkerOS.PartialEvent> = {\n 'cart view': {\n data: {\n currency: 'EUR',\n value: product1.data.price * quantity,\n },\n context: { shopping: ['cart', 0] },\n globals: { pagegroup: 'shop' },\n nested: [\n {\n entity: 'product',\n data: { ...product1.data, quantity },\n context: { shopping: ['cart', 0] },\n nested: [],\n },\n ],\n trigger: 'load',\n },\n 'checkout view': {\n data: {\n step: 'payment',\n currency: 'EUR',\n value: product1.data.price + product2.data.price,\n },\n context: { shopping: ['checkout', 0] },\n globals: { pagegroup: 'shop' },\n nested: [\n {\n entity: 'product',\n ...product1,\n context: { shopping: ['checkout', 0] },\n nested: [],\n },\n {\n entity: 'product',\n ...product2,\n context: { shopping: ['checkout', 0] },\n nested: [],\n },\n ],\n trigger: 'load',\n },\n 'order complete': {\n data: {\n id: '0rd3r1d',\n currency: 'EUR',\n shipping: 5.22,\n taxes: 73.76,\n total: 555,\n },\n context: { shopping: ['complete', 0] },\n globals: { pagegroup: 'shop' },\n nested: [\n {\n entity: 'product',\n ...product1,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: 'product',\n ...product2,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: 'gift',\n data: {\n name: 'Surprise',\n },\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n ],\n trigger: 'load',\n },\n 'page view': {\n data: {\n domain: 'www.example.com',\n title: 'walkerOS documentation',\n referrer: 'https://www.walkeros.io/',\n search: '?foo=bar',\n hash: '#hash',\n id: '/docs/',\n },\n globals: { pagegroup: 'docs' },\n trigger: 'load',\n },\n 'product add': {\n ...product1,\n context: { shopping: ['intent', 0] },\n globals: { pagegroup: 'shop' },\n nested: [],\n trigger: 'click',\n },\n 'product view': {\n ...product1,\n context: { shopping: ['detail', 0] },\n globals: { pagegroup: 'shop' },\n nested: [],\n trigger: 'load',\n },\n 'product visible': {\n data: { ...product1.data, position: 3, promo: true },\n context: { shopping: ['discover', 0] },\n globals: { pagegroup: 'shop' },\n nested: [],\n trigger: 'load',\n },\n 'promotion visible': {\n data: {\n name: 'Setting up tracking easily',\n position: 'hero',\n },\n context: { ab_test: ['engagement', 0] },\n globals: { pagegroup: 'homepage' },\n trigger: 'visible',\n },\n 'session start': {\n data: {\n id: 's3ss10n',\n start: timestamp,\n isNew: true,\n count: 1,\n runs: 1,\n isStart: true,\n storage: true,\n referrer: '',\n device: 'c00k13',\n },\n user: {\n id: 'us3r',\n device: 'c00k13',\n session: 's3ss10n',\n hash: 'h4sh',\n address: 'street number',\n email: 'user@example.com',\n phone: '+49 123 456 789',\n userAgent: 'Mozilla...',\n browser: 'Chrome',\n browserVersion: '90',\n deviceType: 'desktop',\n language: 'de-DE',\n country: 'DE',\n region: 'HH',\n city: 'Hamburg',\n zip: '20354',\n timezone: 'Berlin',\n os: 'walkerOS',\n osVersion: '1.0',\n screenSize: '1337x420',\n ip: '127.0.0.0',\n internal: true,\n custom: 'value',\n },\n },\n };\n\n return createEvent({ ...defaultEvents[name], ...props, name: name });\n}\n","import { hexId } from './hexId';\n\n/**\n * W3C trace_id: 16 random bytes encoded as 32 lowercase hex characters.\n * Shared by every event of a collector run. Reference: W3C Trace Context.\n */\nexport function getTraceId(): string {\n return hexId(32);\n}\n","export interface ParsedTraceparent {\n /** W3C 32-hex trace id. */\n trace: string;\n /** W3C 16-hex parent span id (upstream event id). */\n parentSpan: string;\n}\n\n// Exactly four dash-separated segments: 2-hex version, 32-hex trace,\n// 16-hex span, 2-hex flags. Lowercase only, per the W3C Trace Context spec.\nconst TRACEPARENT =\n /^(?<version>[0-9a-f]{2})-(?<trace>[0-9a-f]{32})-(?<span>[0-9a-f]{16})-[0-9a-f]{2}$/;\n\n/**\n * Parse a W3C `traceparent` header value (`00-<32hex>-<16hex>-<2hex>`).\n * Returns undefined on any mismatch, and never throws. Rejects a non-string\n * input, wrong segment count, malformed segment lengths, uppercase hex, the\n * reserved `ff` version, an all-zero trace, and an all-zero span. Any other\n * 2-hex version is accepted for forward compatibility with future spec\n * revisions.\n */\nexport function parseTraceparent(\n value: unknown,\n): ParsedTraceparent | undefined {\n if (typeof value !== 'string') return undefined;\n\n const groups = TRACEPARENT.exec(value)?.groups;\n if (!groups) return undefined;\n\n const { version, trace, span } = groups;\n if (version === undefined || trace === undefined || span === undefined)\n return undefined;\n\n // Reserved/invalid values the regex cannot express directly.\n if (version === 'ff') return undefined;\n if (/^0+$/.test(trace) || /^0+$/.test(span)) return undefined;\n\n return { trace, parentSpan: span };\n}\n","import type { WalkerOS } from './types';\nimport { assign } from './assign';\n\nexport interface MarketingParameters {\n [key: string]: string;\n}\n\n/**\n * Click-ID registry entry — maps a URL parameter name to a canonical platform.\n *\n * Runtime shape only; the corresponding Zod schema lives in\n * `@walkeros/core/dev` (schemas/marketing.ts) for dev tooling that needs\n * validation or JSON Schema generation.\n */\nexport interface ClickIdEntry {\n param: string;\n platform: string;\n}\n\n/**\n * Default click-ID registry.\n *\n * Ordered by priority: when a URL contains multiple click IDs, the entry\n * appearing earlier wins as the resolved `clickId` / `platform`. All matched\n * raw values are still preserved on the result.\n *\n * Extend via the third argument to {@link getMarketingParameters} or the\n * `clickIds` field in the session source settings.\n */\nexport const defaultClickIds: ClickIdEntry[] = [\n // Google family — highest priority (most common globally)\n { param: 'gclid', platform: 'google' },\n { param: 'wbraid', platform: 'google' },\n { param: 'gbraid', platform: 'google' },\n { param: 'dclid', platform: 'google' },\n { param: 'gclsrc', platform: 'google' },\n\n // Meta\n { param: 'fbclid', platform: 'meta' },\n { param: 'igshid', platform: 'meta' },\n\n // Microsoft / Bing\n { param: 'msclkid', platform: 'microsoft' },\n\n // TikTok\n { param: 'ttclid', platform: 'tiktok' },\n\n // X / Twitter\n { param: 'twclid', platform: 'twitter' },\n\n // LinkedIn\n { param: 'li_fat_id', platform: 'linkedin' },\n\n // Pinterest\n { param: 'epik', platform: 'pinterest' },\n\n // Snapchat — both spellings seen in the wild\n { param: 'sclid', platform: 'snapchat' },\n { param: 'sccid', platform: 'snapchat' },\n\n // Reddit\n { param: 'rdt_cid', platform: 'reddit' },\n\n // Quora\n { param: 'qclid', platform: 'quora' },\n\n // Yandex (yclid collides with Yahoo Japan; Yandex chosen as default)\n { param: 'yclid', platform: 'yandex' },\n { param: 'ymclid', platform: 'yandex' },\n { param: 'ysclid', platform: 'yandex' },\n\n // Content discovery\n { param: 'dicbo', platform: 'outbrain' },\n { param: 'obclid', platform: 'outbrain' },\n { param: 'tblci', platform: 'taboola' },\n\n // Email service providers\n { param: 'mc_cid', platform: 'mailchimp' },\n { param: 'mc_eid', platform: 'mailchimp' },\n { param: '_kx', platform: 'klaviyo' },\n { param: '_hsenc', platform: 'hubspot' },\n { param: '_hsmi', platform: 'hubspot' },\n\n // Adobe / Marketo\n { param: 's_kwcid', platform: 'adobe' },\n { param: 'ef_id', platform: 'adobe' },\n { param: 'mkt_tok', platform: 'adobe' },\n\n // Affiliate\n { param: 'irclickid', platform: 'impact' },\n { param: 'cjevent', platform: 'cj' },\n\n // Deep linking\n { param: '_branch_match_id', platform: 'branch' },\n];\n\n/**\n * Extracts marketing parameters from a URL.\n *\n * - UTM and custom params are mapped to friendly names (`utm_source` → `source`).\n * - Known click IDs are detected case-insensitively; each raw value is stored\n * under its canonical lowercase param name.\n * - `clickId` and `platform` reference the highest-priority match (first entry\n * in the registry present in the URL).\n * - Custom `clickIds` override default platforms by `param` in place and\n * append new params at the end of the priority list.\n */\nexport function getMarketingParameters(\n url: URL,\n custom: MarketingParameters = {},\n clickIds: ClickIdEntry[] = [],\n): WalkerOS.Properties {\n const data: WalkerOS.Properties = {};\n\n // UTMs and custom mapped params\n const utmParams: MarketingParameters = {\n utm_campaign: 'campaign',\n utm_content: 'content',\n utm_medium: 'medium',\n utm_source: 'source',\n utm_term: 'term',\n };\n Object.entries(assign(utmParams, custom)).forEach(([key, name]) => {\n const value = url.searchParams.get(key);\n if (value) data[name] = value;\n });\n\n // Effective registry: defaults with user overrides applied in place,\n // plus brand-new user params appended at the end. Reuses the defaults\n // array when no customization is requested.\n const registry = clickIds.length ? mergeRegistry(clickIds) : defaultClickIds;\n\n // Lowercase URL params once for case-insensitive lookup\n const lower = new Map<string, string>();\n url.searchParams.forEach((value, key) => {\n if (value) lower.set(key.toLowerCase(), value);\n });\n\n // Walk registry in priority order; first match wins as clickId/platform\n for (const entry of registry) {\n const value = lower.get(entry.param);\n if (!value) continue;\n data[entry.param] = value;\n if (!data.clickId) {\n data.clickId = entry.param;\n data.platform = entry.platform;\n }\n }\n\n return data;\n}\n\nfunction mergeRegistry(user: ClickIdEntry[]): ClickIdEntry[] {\n const overrides = new Map(user.map((e) => [e.param, e.platform]));\n const defaultParams = new Set(defaultClickIds.map((e) => e.param));\n return [\n ...defaultClickIds.map((e) =>\n overrides.has(e.param)\n ? { param: e.param, platform: overrides.get(e.param)! }\n : e,\n ),\n ...user.filter((e) => !defaultParams.has(e.param)),\n ];\n}\n","/**\n * Options for scheduling primitives ({@link debounce}, {@link throttle}).\n *\n * - `wait`: Debounce window in ms. Timer resets on every call.\n * - `size`: Hard call-count cap per window. Flush immediately when call\n * count reaches this number. Useful for batch buffers that must not\n * grow unbounded.\n * - `age`: Hard age cap in ms since the first call of the current window.\n * Forces a flush even if calls keep arriving and reset the debounce.\n * Prevents debounce starvation under sustained load.\n */\nexport interface ScheduleOptions {\n wait?: number;\n size?: number;\n age?: number;\n}\n\n/**\n * Returned by {@link debounce}: a callable that schedules `fn` plus\n * deterministic `flush` / `cancel` controls.\n */\nexport interface Debounced<P extends unknown[], R> {\n (...args: P): Promise<R | undefined>;\n /** Force an immediate flush with the most recent args. Resolves after `fn` settles. */\n flush(): Promise<R | undefined>;\n /** Cancel any pending invocation. No `fn` call, pending promises resolve to undefined. */\n cancel(): void;\n /** Number of scheduled calls since the current window opened. */\n size(): number;\n}\n\nfunction normalizeScheduleOptions(\n opts: number | ScheduleOptions | undefined,\n defaultWait: number,\n): { wait: number; size?: number; age?: number } {\n if (typeof opts === 'number') return { wait: opts };\n if (!opts) return { wait: defaultWait };\n return {\n wait: opts.wait ?? defaultWait,\n size: opts.size,\n age: opts.age,\n };\n}\n\n/**\n * Creates a debounced function that delays invoking `fn` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `fn` invocations and a `flush` method to immediately invoke them.\n *\n * The second argument is either a `wait` number (legacy form) or a\n * {@link ScheduleOptions} object. The object form adds `size` (hard count\n * cap) and `age` (hard window-age cap) so the function flushes deterministically\n * under sustained load instead of letting the debounce reset forever.\n *\n * @template P, R\n * @param fn The function to debounce.\n * @param opts Either a wait-ms number or a {@link ScheduleOptions} object.\n * @param immediate Trigger the function on the leading edge, instead of the trailing.\n * @returns A {@link Debounced} callable with `flush`, `cancel`, and `size` methods.\n */\nexport function debounce<P extends unknown[], R>(\n fn: (...args: P) => R,\n opts: number | ScheduleOptions = 1000,\n immediate = false,\n): Debounced<P, R> {\n const {\n wait,\n size: maxSize,\n age: maxAge,\n } = normalizeScheduleOptions(opts, 1000);\n\n let waitTimer: ReturnType<typeof setTimeout> | null = null;\n let ageTimer: ReturnType<typeof setTimeout> | null = null;\n let result: R | undefined;\n let hasCalledImmediately = false;\n let lastArgs: P | undefined;\n let pending: Array<(value: R | undefined) => void> = [];\n let count = 0;\n\n const reset = (): void => {\n if (waitTimer) {\n clearTimeout(waitTimer);\n waitTimer = null;\n }\n if (ageTimer) {\n clearTimeout(ageTimer);\n ageTimer = null;\n }\n count = 0;\n lastArgs = undefined;\n };\n\n const fire = (): R | undefined => {\n const args = lastArgs;\n const settle = pending;\n reset();\n pending = [];\n if (!args) {\n // Nothing scheduled. Resolve waiters with undefined.\n settle.forEach((r) => r(undefined));\n return undefined;\n }\n result = fn(...args);\n settle.forEach((r) => r(result));\n return result;\n };\n\n const debounced = ((...args: P): Promise<R | undefined> => {\n return new Promise<R | undefined>((resolve) => {\n const callNow = immediate && !hasCalledImmediately;\n\n lastArgs = args;\n count += 1;\n pending.push(resolve);\n\n // Reset debounce timer on every call.\n if (waitTimer) clearTimeout(waitTimer);\n waitTimer = setTimeout(() => {\n waitTimer = null;\n if (!immediate || hasCalledImmediately) {\n fire();\n }\n }, wait);\n\n // Arm the age timer once per window (on first call).\n if (maxAge !== undefined && !ageTimer) {\n ageTimer = setTimeout(() => {\n ageTimer = null;\n fire();\n }, maxAge);\n }\n\n // Size cap: flush synchronously when reached.\n if (maxSize !== undefined && count >= maxSize) {\n fire();\n return;\n }\n\n if (callNow) {\n hasCalledImmediately = true;\n result = fn(...args);\n // Drain pending promises (only this caller is pending at the\n // immediate edge, but be safe).\n const settle = pending;\n pending = [];\n settle.forEach((r) => r(result));\n }\n });\n }) as Debounced<P, R>;\n\n debounced.flush = (): Promise<R | undefined> => {\n if (!lastArgs && pending.length === 0) {\n // Nothing buffered, but an autonomous fire (wait/age/size cap) may have\n // already drained the window and left its `fn` return in `result`. For a\n // batch flush whose `fn` is async, that promise can still be in flight.\n // Return it so a caller like graceful shutdown awaits the in-flight work\n // instead of racing teardown (e.g. closing a writer mid-append). When\n // the last fire was sync/settled, awaiting a resolved value is a no-op.\n return Promise.resolve(result);\n }\n return new Promise<R | undefined>((resolve) => {\n pending.push(resolve);\n fire();\n });\n };\n\n debounced.cancel = (): void => {\n const settle = pending;\n pending = [];\n reset();\n // Drop the last fire's retained return so a later empty flush() cannot\n // surface a stale, cancelled-context result instead of undefined.\n result = undefined;\n settle.forEach((r) => r(undefined));\n };\n\n debounced.size = (): number => count;\n\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `fn` at most once per\n * every `delay` milliseconds.\n *\n * The second argument is either a delay-ms number (legacy form) or a\n * {@link ScheduleOptions} object. The object form is accepted for\n * symmetry with {@link debounce}; the `wait` field is used as the\n * inter-invocation interval. `size` and `age` are accepted but have no\n * semantic role in throttle (no buffer is held) — they exist so the\n * primitive can be swapped with `debounce` behind a single config shape.\n *\n * @template P, R\n * @param fn The function to throttle.\n * @param opts Either a delay-ms number or a {@link ScheduleOptions} object.\n * @returns The new throttled function.\n */\n\ntype Timeout = ReturnType<typeof setTimeout>;\nexport function throttle<P extends unknown[], R>(\n fn: (...args: P) => R | undefined,\n opts: number | ScheduleOptions = 1000,\n): (...args: P) => R | undefined {\n const { wait } = normalizeScheduleOptions(opts, 1000);\n let isBlocked: Timeout | null = null;\n\n return function (...args: P): R | undefined {\n // Skip since function is still blocked by previous call\n if (isBlocked !== null) return;\n\n // Set a blocking timeout\n isBlocked = setTimeout(() => {\n // Unblock function\n isBlocked = null;\n }, wait) as Timeout;\n\n // Call the function\n return fn(...args);\n };\n}\n","import type {\n Config,\n DefaultHandler,\n ErrorContext,\n Handler,\n Instance,\n InternalConfig,\n LogContext,\n} from './types/logger';\nimport { Level } from './types/logger';\n\n/**\n * Normalize an Error object into ErrorContext\n */\nfunction normalizeError(err: Error): ErrorContext {\n return {\n message: err.message,\n name: err.name,\n stack: err.stack,\n cause: (err as Error & { cause?: unknown }).cause,\n };\n}\n\n/**\n * Normalize message and context parameters\n * Handles Error objects passed as message or context\n */\nfunction normalizeParams(\n message: string | Error,\n context?: unknown | Error,\n): { message: string; context: LogContext } {\n let normalizedMessage: string;\n let normalizedContext: LogContext = {};\n\n // Handle message\n if (message instanceof Error) {\n normalizedMessage = message.message;\n normalizedContext.error = normalizeError(message);\n } else {\n normalizedMessage = message;\n }\n\n // Handle context\n if (context !== undefined) {\n if (context instanceof Error) {\n normalizedContext.error = normalizeError(context);\n } else if (typeof context === 'object' && context !== null) {\n normalizedContext = { ...normalizedContext, ...(context as object) };\n // If context has an error property that's an Error, normalize it\n if (\n 'error' in normalizedContext &&\n normalizedContext.error instanceof Error\n ) {\n normalizedContext.error = normalizeError(\n normalizedContext.error as unknown as Error,\n );\n }\n } else {\n normalizedContext.value = context;\n }\n }\n\n return { message: normalizedMessage, context: normalizedContext };\n}\n\n/**\n * Default console-based log handler\n */\nconst defaultHandler: DefaultHandler = (level, message, context, scope) => {\n const levelName = Level[level];\n const scopePath = scope.length > 0 ? ` [${scope.join(':')}]` : '';\n const prefix = `${levelName}${scopePath}`;\n\n const hasContext = Object.keys(context).length > 0;\n\n const consoleFn =\n level === Level.ERROR\n ? console.error\n : level === Level.WARN\n ? console.warn\n : console.log;\n\n if (hasContext) {\n consoleFn(prefix, message, context);\n } else {\n consoleFn(prefix, message);\n }\n};\n\n/**\n * Normalize log level from string or enum to enum value\n */\nfunction normalizeLevel(level: Level | keyof typeof Level): Level {\n if (typeof level === 'string') {\n return Level[level as keyof typeof Level];\n }\n return level;\n}\n\n/**\n * Create a logger instance\n *\n * @param config - Logger configuration\n * @returns Logger instance with all log methods and scoping support\n *\n * @example\n * ```typescript\n * // Basic usage\n * const logger = createLogger({ level: 'DEBUG' });\n * logger.info('Hello world');\n *\n * // With scoping\n * const destLogger = logger.scope('gtag').scope('myInstance');\n * destLogger.debug('Processing event'); // DEBUG [gtag:myInstance] Processing event\n *\n * // With custom handler\n * const logger = createLogger({\n * handler: (level, message, context, scope, originalHandler) => {\n * // Custom logic (e.g., send to Sentry)\n * originalHandler(level, message, context, scope);\n * }\n * });\n * ```\n *\n * // TODO: Consider compile-time stripping of debug logs in production builds\n * // e.g., if (__DEV__) { logger.debug(...) }\n */\nexport function createLogger(config: Config = {}): Instance {\n const level =\n config.level !== undefined ? normalizeLevel(config.level) : Level.ERROR;\n const customHandler = config.handler;\n const jsonHandler = config.jsonHandler;\n const scope: string[] = [];\n\n return createLoggerInternal({\n level,\n handler: customHandler,\n jsonHandler,\n scope,\n });\n}\n\n/**\n * Internal logger creation with resolved config\n */\nfunction createLoggerInternal(config: InternalConfig): Instance {\n const { level, handler, jsonHandler, scope } = config;\n\n /**\n * Internal log function that checks level and delegates to handler\n */\n const log = (\n logLevel: Level,\n message: string | Error,\n context?: unknown | Error,\n ): void => {\n if (logLevel <= level) {\n const normalized = normalizeParams(message, context);\n\n if (handler) {\n // Custom handler with access to default handler\n handler(\n logLevel,\n normalized.message,\n normalized.context,\n scope,\n defaultHandler,\n );\n } else {\n defaultHandler(logLevel, normalized.message, normalized.context, scope);\n }\n }\n };\n\n /**\n * Log and throw - combines logging and throwing\n */\n const logAndThrow = (message: string | Error, context?: unknown): never => {\n // Always log errors regardless of level\n const normalized = normalizeParams(message, context);\n\n if (handler) {\n handler(\n Level.ERROR,\n normalized.message,\n normalized.context,\n scope,\n defaultHandler,\n );\n } else {\n defaultHandler(\n Level.ERROR,\n normalized.message,\n normalized.context,\n scope,\n );\n }\n\n // Throw with the message\n throw new Error(normalized.message);\n };\n\n return {\n error: (message, context) => log(Level.ERROR, message, context),\n warn: (message, context) => log(Level.WARN, message, context),\n info: (message, context) => log(Level.INFO, message, context),\n debug: (message, context) => log(Level.DEBUG, message, context),\n throw: logAndThrow,\n json: (data: unknown) => {\n if (jsonHandler) {\n jsonHandler(data);\n } else {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data, null, 2));\n }\n },\n scope: (name: string) =>\n createLoggerInternal({\n level,\n handler,\n jsonHandler,\n scope: [...scope, name],\n }),\n };\n}\n\n// Re-export Level enum for convenience\nexport { Level };\n","import type { WalkerOS } from './types';\nimport {\n isArguments,\n isArray,\n isBoolean,\n isDefined,\n isNumber,\n isObject,\n isString,\n} from './is';\n\n/**\n * Checks if a value is a valid property type.\n *\n * @param value The value to check.\n * @returns True if the value is a valid property type, false otherwise.\n */\nexport function isPropertyType(value: unknown): value is WalkerOS.PropertyType {\n return (\n isBoolean(value) ||\n isString(value) ||\n isNumber(value) ||\n !isDefined(value) ||\n (isArray(value) && value.every(isPropertyType)) ||\n (isObject(value) && Object.values(value).every(isPropertyType))\n );\n}\n\n/**\n * Filters a value to only include valid property types.\n *\n * @param value The value to filter.\n * @returns The filtered value or undefined.\n */\nexport function filterValues(value: unknown): WalkerOS.Property | undefined {\n if (isBoolean(value) || isString(value) || isNumber(value)) return value;\n\n if (isArguments(value)) return filterValues(Array.from(value));\n\n if (isArray(value)) {\n return value\n .map((item) => filterValues(item))\n .filter((item): item is WalkerOS.PropertyType => item !== undefined);\n }\n\n if (isObject(value)) {\n return Object.entries(value).reduce<Record<string, WalkerOS.Property>>(\n (acc, [key, val]) => {\n const filteredValue = filterValues(val);\n if (filteredValue !== undefined) acc[key] = filteredValue;\n return acc;\n },\n {},\n );\n }\n\n return;\n}\n\n/**\n * Casts a value to a valid property type.\n *\n * @param value The value to cast.\n * @returns The casted value or undefined.\n */\nexport function castToProperty(value: unknown): WalkerOS.Property | undefined {\n return isPropertyType(value) ? value : undefined;\n}\n","/**\n * A utility function that wraps a function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped function.\n */\n// Use function overload to support different return type depending on onError\n// Types\nexport function tryCatch<P extends unknown[], R, S>(\n fn: (...args: P) => R | undefined,\n onError: (err: unknown) => S,\n onFinally?: () => void,\n): (...args: P) => R | S;\nexport function tryCatch<P extends unknown[], R>(\n fn: (...args: P) => R | undefined,\n onError?: undefined,\n onFinally?: () => void,\n): (...args: P) => R | undefined;\n// Implementation\nexport function tryCatch<P extends unknown[], R, S>(\n fn: (...args: P) => R | undefined,\n onError?: (err: unknown) => S,\n onFinally?: () => void,\n): (...args: P) => R | S | undefined {\n return function (...args: P): R | S | undefined {\n try {\n return fn(...args);\n } catch (err) {\n if (!onError) return;\n return onError(err);\n } finally {\n onFinally?.();\n }\n };\n}\n\n/**\n * A utility function that wraps an async function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The async function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped async function.\n */\n// Use function overload to support different return type depending on onError\n// Types\nexport function tryCatchAsync<P extends unknown[], R, S>(\n fn: (...args: P) => R,\n onError: (err: unknown) => S,\n onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | S>;\nexport function tryCatchAsync<P extends unknown[], R>(\n fn: (...args: P) => R,\n onError?: undefined,\n onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | undefined>;\n// Implementation\nexport function tryCatchAsync<P extends unknown[], R, S>(\n fn: (...args: P) => R,\n onError?: (err: unknown) => S,\n onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | S | undefined> {\n return async function (...args: P): Promise<R | S | undefined> {\n try {\n return await fn(...args);\n } catch (err) {\n if (!onError) return;\n return await onError(err);\n } finally {\n await onFinally?.();\n }\n };\n}\n","/**\n * Error subclass for invariant violations or operator-initiated aborts\n * that must escape the top-level boundary catches in `collector.push`\n * and `collector.command`.\n *\n * Standard `Error` instances are absorbed by the boundary, logged, and\n * counted on `collector.status.failed`. A `FatalError` rethrows so a\n * runtime supervisor (CLI runner, Express server, container orchestrator)\n * can terminate the process cleanly.\n *\n * Use sparingly. Most operational failures are recoverable and should\n * be plain `Error`. Reserve `FatalError` for programmer-error invariant\n * violations or explicit fail-stop signals.\n */\nexport class FatalError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'FatalError';\n\n // Preserve prototype chain for `instanceof` checks across realms.\n Object.setPrototypeOf(this, FatalError.prototype);\n }\n}\n","import type { Mapping, WalkerOS, Collector } from './types';\nimport { deleteByPath, getByPath, setByPath } from './byPath';\nimport { isArray, isDefined, isString, isObject } from './is';\nimport { castToProperty } from './property';\nimport { tryCatchAsync } from './tryCatch';\nimport { FatalError } from './fatalError';\nimport { getGrantedConsent } from './consent';\nimport { assign } from './assign';\nimport { flattenIncludeSections } from './include';\n\n/**\n * Gets the mapping for an event.\n *\n * @param event The event to get the mapping for (can be partial or full).\n * @param mapping The mapping rules.\n * @param collector Required to evaluate rule-level conditions against the unified Context. Legacy callers may omit; rule-level conditions then run with `undefined as never` (defensive).\n * @returns The mapping result.\n */\nexport async function getMappingEvent(\n event: WalkerOS.DeepPartialEvent | WalkerOS.PartialEvent | WalkerOS.Event,\n mapping?: Mapping.Rules,\n collector?: Collector.Instance,\n): Promise<Mapping.Result> {\n const [entity, action] = (event.name || '').split(' ');\n if (!mapping || !entity || !action) return {};\n\n let eventMapping: Mapping.Rule | undefined;\n let mappingKey = '';\n let entityKey = entity;\n let actionKey = action;\n\n const resolveEventMapping = (\n rules?: Mapping.Rule | Mapping.Rule[],\n ): Mapping.Rule | undefined => {\n if (!rules) return;\n const list = isArray(rules) ? rules : [rules];\n return list.find((rule) => {\n if (!rule.condition) return true;\n if (!collector) {\n // Rule-level condition without a collector cannot be evaluated against\n // the unified Context. Treat as match (legacy behavior) — internal\n // callers should always pass collector; this branch is defensive.\n return Boolean(rule.condition(event, undefined as never));\n }\n const ctx: Mapping.Context = {\n event,\n mapping: rule,\n collector,\n logger: collector.logger,\n consent: ((isObject(event) &&\n (event as WalkerOS.PartialEvent).consent) ||\n collector.consent) as WalkerOS.Consent,\n };\n return Boolean(rule.condition(event, ctx));\n });\n };\n\n if (!mapping[entityKey]) entityKey = '*';\n const entityMapping = mapping[entityKey];\n\n if (entityMapping) {\n if (!entityMapping[actionKey]) actionKey = '*';\n eventMapping = resolveEventMapping(entityMapping[actionKey]);\n }\n\n if (!eventMapping) {\n entityKey = '*';\n actionKey = '*';\n eventMapping = resolveEventMapping(mapping[entityKey]?.[actionKey]);\n }\n\n if (eventMapping) mappingKey = `${entityKey} ${actionKey}`;\n\n return { eventMapping, mappingKey };\n}\n\n/**\n * Gets a value from a mapping.\n *\n * @param value The value to get the mapping from.\n * @param data The mapping data.\n * @param options The mapping options.\n * @returns The mapped value.\n */\nexport async function getMappingValue(\n value: WalkerOS.DeepPartialEvent | unknown | undefined,\n data: Mapping.Data = {},\n context: Partial<Mapping.Context> = {},\n): Promise<WalkerOS.Property | undefined> {\n if (!isDefined(value)) return;\n\n // Resolve consent in priority order: value.consent > context.consent > collector.consent\n const consent =\n ((isObject(value) && value.consent) as WalkerOS.Consent) ||\n context.consent ||\n context.collector?.consent;\n\n // Resolve event: explicit context.event wins; else infer from value when it is an event-shaped object.\n const event = (context.event ??\n (isObject(value) ? value : {})) as WalkerOS.DeepPartialEvent;\n\n if (!context.collector) {\n // Internal sites (cache.ts, top-level callers) MUST pass a collector.\n // This guard catches plumbing bugs early instead of silent type-narrowing.\n throw new Error('getMappingValue: context.collector is required');\n }\n\n const baseContext: Mapping.Context = {\n event,\n mapping: data as Mapping.Value,\n collector: context.collector,\n logger: context.collector.logger,\n consent,\n };\n\n const mappings = isArray(data) ? data : [data];\n for (const mapping of mappings) {\n const result = await tryCatchAsync(\n processMappingValue,\n (err: unknown): undefined => {\n if (err instanceof FatalError) throw err;\n if (context.collector) context.collector.status.failed++;\n baseContext.logger.error('mapping processing failed', {\n event,\n error: err,\n });\n return undefined;\n },\n )(value, mapping, {\n ...baseContext,\n mapping,\n });\n if (isDefined(result)) return result;\n }\n return;\n}\n\nasync function processMappingValue(\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Mapping.Value,\n context: Mapping.Context,\n): Promise<WalkerOS.Property | undefined> {\n const mappings = isArray(mapping) ? mapping : [mapping];\n\n return mappings.reduce(\n async (accPromise, mappingItem) => {\n const acc = await accPromise;\n if (acc) return acc;\n\n const mapping = isString(mappingItem)\n ? { key: mappingItem }\n : mappingItem;\n\n if (!Object.keys(mapping).length) return;\n\n const {\n condition,\n consent,\n fn,\n key,\n loop,\n map,\n set,\n validate,\n value: staticValue,\n } = mapping;\n\n // Per-mapping context — `mapping` reflects the current item.\n const cbContext: Mapping.Context = { ...context, mapping: mappingItem };\n\n if (\n condition &&\n !(await tryCatchAsync(condition, (err: unknown): boolean => {\n if (err instanceof FatalError) throw err;\n cbContext.logger.error('mapping condition failed', {\n event: cbContext.event,\n error: err,\n });\n return false; // Preserve \"skip this rule\" semantic on throw.\n })(value, cbContext))\n )\n return;\n\n if (consent && !getGrantedConsent(consent, cbContext.consent))\n return staticValue;\n\n let mappingValue: unknown = isDefined(staticValue) ? staticValue : value;\n\n if (fn) {\n mappingValue = await tryCatchAsync(fn, (err: unknown): undefined => {\n if (err instanceof FatalError) throw err;\n cbContext.logger.error('mapping fn failed', {\n event: cbContext.event,\n error: err,\n });\n return undefined; // No transform on error.\n })(value, cbContext);\n }\n\n if (key) {\n mappingValue = getByPath(value, key, staticValue);\n }\n\n if (loop) {\n const [scope, itemMapping] = loop;\n const data =\n scope === 'this'\n ? [value]\n : await getMappingValue(value, scope, cbContext);\n\n if (isArray(data)) {\n mappingValue = (\n await Promise.all(\n data.map((item) => getMappingValue(item, itemMapping, cbContext)),\n )\n ).filter(isDefined);\n }\n } else if (map) {\n mappingValue = await Object.entries(map).reduce(\n async (mappedObjPromise, [mapKey, mapValue]) => {\n const mappedObj = await mappedObjPromise;\n const result = await getMappingValue(value, mapValue, cbContext);\n if (isDefined(result)) mappedObj[mapKey] = result;\n return mappedObj;\n },\n Promise.resolve({} as WalkerOS.AnyObject),\n );\n } else if (set) {\n mappingValue = await Promise.all(\n set.map((item) => processMappingValue(value, item, cbContext)),\n );\n }\n\n if (\n validate &&\n !(await tryCatchAsync(validate, (err: unknown): boolean => {\n if (err instanceof FatalError) throw err;\n cbContext.logger.error('mapping validate failed', {\n event: cbContext.event,\n error: err,\n });\n return false; // Preserve \"validation failed\" semantic on throw.\n })(mappingValue, cbContext))\n )\n mappingValue = undefined;\n\n const property = castToProperty(mappingValue);\n return isDefined(property) ? property : castToProperty(staticValue);\n },\n Promise.resolve(undefined as WalkerOS.Property | undefined),\n );\n}\n\n/**\n * Processes an event through mapping configuration.\n *\n * This is the unified mapping logic used by both sources and destinations.\n * It applies transformations in this order:\n * 1. Config-level policy - modifies the event itself (global rules)\n * 2. Mapping rules - finds matching rule based on entity-action\n * 3. Event-level policy - modifies the event based on specific mapping rule\n * 4. Data transformation - creates context data\n * 5. Ignore check and name override\n *\n * Sources can pass partial events, destinations pass full events.\n * getMappingValue works with both partial and full events.\n *\n * @param event - The event to process (can be partial or full, will be mutated by policies)\n * @param config - Mapping configuration (mapping, data, policy, consent)\n * @param collector - Collector instance for context\n * @returns Object with transformed event, data, mapping rule, and ignore flag\n */\nexport async function processEventMapping<\n T extends WalkerOS.DeepPartialEvent | WalkerOS.Event,\n>(\n event: T,\n config: Mapping.Config,\n collector: Collector.Instance,\n): Promise<{\n event: T;\n data?: WalkerOS.Property;\n mapping?: Mapping.Rule;\n mappingKey?: string;\n ignore: boolean;\n silent: boolean;\n}> {\n // Step 1: Apply config-level policy (modifies event)\n if (config.policy) {\n await Promise.all(\n Object.entries(config.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, {\n collector,\n event,\n });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 2: Get event mapping rule\n const { eventMapping, mappingKey } = await getMappingEvent(\n event,\n config.mapping,\n collector,\n );\n\n // Step 2.5: Apply event-level policy (modifies event)\n if (eventMapping?.policy) {\n await Promise.all(\n Object.entries(eventMapping.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, {\n collector,\n event,\n });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 3: Transform global data\n let data =\n config.data &&\n (await getMappingValue(event, config.data, { collector, event }));\n\n const silent = Boolean(eventMapping?.silent);\n\n if (eventMapping) {\n // Check if event should be ignored\n if (eventMapping.ignore) {\n return {\n event,\n data,\n mapping: eventMapping,\n mappingKey,\n ignore: true,\n silent,\n };\n }\n\n // Override event name if specified\n if (eventMapping.name) event.name = eventMapping.name;\n\n // Transform event-specific data\n if (eventMapping.data) {\n const dataEvent =\n eventMapping.data &&\n (await getMappingValue(event, eventMapping.data, {\n collector,\n event,\n }));\n data =\n isObject(data) && isObject(dataEvent) // Only merge objects\n ? assign(data, dataEvent)\n : dataEvent;\n }\n }\n\n // Include: flatten event sections into data. Rule-level replaces config-level.\n const effectiveInclude = eventMapping?.include ?? config.include;\n if (effectiveInclude && effectiveInclude.length > 0) {\n const includeData = flattenIncludeSections(event, effectiveInclude);\n if (Object.keys(includeData).length > 0) {\n // Include is the bottom layer - data wins on key conflict.\n data = isObject(data)\n ? (assign(\n includeData,\n data as Record<string, unknown>,\n ) as unknown as WalkerOS.Property)\n : (data ?? (includeData as unknown as WalkerOS.Property));\n }\n }\n\n // Output layer: strip removed paths from the produced data. Applied last,\n // after include, so remove always wins. Rooted at the produced payload.\n if (eventMapping?.remove && isObject(data)) {\n for (const path of eventMapping.remove) {\n data = deleteByPath(data, path);\n }\n }\n\n return {\n event,\n data,\n mapping: eventMapping,\n mappingKey,\n ignore: false,\n silent,\n };\n}\n","import type { Mapping } from './types';\nimport { isObject } from './is';\nimport { clone } from './clone';\n\nfunction mergePatch(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === undefined) continue;\n if (val === null) {\n delete target[key];\n continue;\n }\n const cur = target[key];\n if (isObject(val) && isObject(cur)) {\n mergePatch(cur, val);\n } else {\n target[key] = val;\n }\n }\n return target;\n}\n\n/**\n * Resolve a user mapping rule against a package-shipped default rule.\n * - No extend/remove → replace (clone of override; today's behavior).\n * - extend → partial rule deep-merged onto base (null clears a field).\n * - remove → carried onto the merged rule for eval-time output stripping.\n * The returned rule never contains `extend`.\n */\nexport function mergeMappingRule(\n base: Mapping.Rule,\n override: Mapping.Rule,\n): Mapping.Rule {\n if (override.extend === undefined && override.remove === undefined) {\n return clone(override);\n }\n const merged: Record<string, unknown> = { ...clone(base) };\n if (override.extend) {\n const patch: Record<string, unknown> = { ...override.extend };\n mergePatch(merged, patch);\n }\n delete merged.extend;\n if (override.remove) merged.remove = [...override.remove];\n else delete merged.remove;\n return merged as Mapping.Rule;\n}\n","/**\n * Environment mocking utilities for walkerOS destinations\n *\n * Provides standardized tools for intercepting function calls in environment objects,\n * enabling consistent testing patterns across all destinations.\n */\n\ntype InterceptorFn = (\n path: string[],\n args: unknown[],\n original?: Function,\n) => unknown;\n\n/**\n * Creates a proxied environment that intercepts function calls\n *\n * Uses Proxy to wrap environment objects and capture all function calls,\n * allowing for call recording, mocking, or simulation.\n *\n * @param env - The environment object to wrap\n * @param interceptor - Function called for each intercepted call\n * @returns Proxied environment with interceptor applied\n *\n * @example\n * ```typescript\n * const calls: Array<{ path: string[]; args: unknown[] }> = [];\n *\n * const testEnv = mockEnv(env.push, (path, args) => {\n * calls.push({ path, args });\n * });\n *\n * // Use testEnv with destination\n * await destination.push(event, { env: testEnv });\n *\n * // Analyze captured calls\n * expect(calls).toContainEqual({\n * path: ['window', 'gtag'],\n * args: ['event', 'purchase', { value: 99.99 }]\n * });\n * ```\n */\nexport function mockEnv<T extends object>(\n env: T,\n interceptor: InterceptorFn,\n): T {\n const createProxy = (obj: object, path: string[] = []): object => {\n return new Proxy(obj, {\n get(target, prop: string) {\n const value = (target as Record<string, unknown>)[prop];\n const currentPath = [...path, prop];\n\n if (typeof value === 'function') {\n // Preserve constructors (classes) so `new amp.Identify()` works\n if (value.prototype && value.prototype.constructor === value) {\n return value;\n }\n return (...args: unknown[]) => {\n const result = interceptor(currentPath, args, value);\n // If the function returns an object, proxy it so chained calls are intercepted\n if (result && typeof result === 'object') {\n return createProxy(result as object, currentPath);\n }\n // Fall back to calling the original and proxying its return if it's an object\n const original = (value as Function)(...args);\n if (original && typeof original === 'object') {\n return createProxy(original as object, currentPath);\n }\n return result;\n };\n }\n\n if (value && typeof value === 'object') {\n return createProxy(value as object, currentPath);\n }\n\n return value;\n },\n });\n };\n\n return createProxy(env) as T;\n}\n\n/**\n * Traverses environment object and replaces values using a replacer function\n *\n * Alternative to mockEnv for environments where Proxy is not suitable.\n * Performs deep traversal and allows value transformation at each level.\n *\n * @param env - The environment object to traverse\n * @param replacer - Function to transform values during traversal\n * @returns New environment object with transformed values\n *\n * @example\n * ```typescript\n * const recordedCalls: APICall[] = [];\n *\n * const recordingEnv = traverseEnv(originalEnv, (value, path) => {\n * if (typeof value === 'function') {\n * return (...args: unknown[]) => {\n * recordedCalls.push({\n * path: path.join('.'),\n * args: structuredClone(args)\n * });\n * return value(...args);\n * };\n * }\n * return value;\n * });\n * ```\n */\nexport function traverseEnv<T extends object>(\n env: T,\n replacer: (value: unknown, path: string[]) => unknown,\n): T {\n const traverse = (obj: unknown, path: string[] = []): unknown => {\n if (!obj || typeof obj !== 'object') return obj;\n\n const result: Record<string, unknown> | unknown[] = Array.isArray(obj)\n ? []\n : {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n if (Array.isArray(result)) {\n result[Number(key)] = replacer(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = replacer(value, currentPath);\n }\n\n if (value && typeof value === 'object' && typeof value !== 'function') {\n if (Array.isArray(result)) {\n result[Number(key)] = traverse(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = traverse(\n value,\n currentPath,\n );\n }\n }\n }\n\n return result;\n };\n\n return traverse(env) as T;\n}\n","import type { Instance } from './types/logger';\n\n/**\n * Mock logger instance for testing\n * Includes all logger methods as jest.fn() plus tracking of scoped loggers\n * Extends Instance to ensure type compatibility\n */\nexport interface MockLogger extends Instance {\n error: jest.Mock;\n warn: jest.Mock;\n info: jest.Mock;\n debug: jest.Mock;\n throw: jest.Mock<never, [string | Error, unknown?]>;\n json: jest.Mock;\n scope: jest.Mock<MockLogger, [string]>;\n\n /**\n * Array of all scoped loggers created by this logger\n * Useful for asserting on scoped logger calls in tests\n */\n scopedLoggers: MockLogger[];\n}\n\n/**\n * Create a mock logger for testing\n * All methods are jest.fn() that can be used for assertions\n *\n * @example\n * ```typescript\n * const mockLogger = createMockLogger();\n *\n * // Use in code under test\n * someFunction(mockLogger);\n *\n * // Assert on calls\n * expect(mockLogger.error).toHaveBeenCalledWith('error message');\n *\n * // Assert on scoped logger\n * const scoped = mockLogger.scopedLoggers[0];\n * expect(scoped.debug).toHaveBeenCalledWith('debug in scope');\n * ```\n */\nexport function createMockLogger(): MockLogger {\n const scopedLoggers: MockLogger[] = [];\n\n const mockThrow = jest.fn((message: string | Error): never => {\n const msg = message instanceof Error ? message.message : message;\n throw new Error(msg);\n }) as jest.Mock<never, [string | Error, unknown?]>;\n\n const mockScope = jest.fn((_name: string): MockLogger => {\n const scoped = createMockLogger();\n scopedLoggers.push(scoped);\n return scoped;\n }) as jest.Mock<MockLogger, [string]>;\n\n const mockLogger: MockLogger = {\n error: jest.fn(),\n warn: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n throw: mockThrow,\n json: jest.fn(),\n scope: mockScope,\n scopedLoggers,\n };\n\n return mockLogger;\n}\n","import type { Collector, Transformer, Destination, Ingest } from './types';\nimport { createIngest } from './types/ingest';\nimport { createMockLogger } from './mockLogger';\n\n/**\n * Create a mock context for testing transformers and destinations.\n *\n * Provides sensible defaults for all required fields. Override only\n * what the test cares about. When context signatures change, only\n * this factory needs updating — not every test file.\n *\n * @example\n * ```typescript\n * // Transformer test — only specify config\n * const ctx = createMockContext({ config: { settings: { strict: true } } });\n * const result = await transformer.push(event, ctx);\n *\n * // Destination test — specify config and custom env\n * const ctx = createMockContext({ config: { settings: { url } }, env: { sendWeb } });\n * await destination.push(event, ctx);\n *\n * // With custom ingest data\n * const ctx = createMockContext({ ingest: { ...createIngest('test'), path: '/api' } });\n * ```\n */\nexport function createMockContext<\n T extends Transformer.TypesGeneric = Transformer.Types,\n>(\n overrides: Partial<\n Omit<Transformer.Context<T>, 'config' | 'ingest'> & {\n config?: Transformer.Config<T> | Destination.Config<Destination.TypesGeneric>;\n ingest?: Ingest | (Record<string, unknown> & { _meta: Ingest['_meta'] });\n data?: unknown;\n rule?: unknown;\n }\n > = {},\n): Transformer.Context<T> & Destination.PushContext<Destination.TypesGeneric> {\n return {\n collector: {} as Collector.Instance,\n config: {} as Transformer.Config<T>,\n env: {} as Transformer.Env<T>,\n logger: createMockLogger(),\n id: 'test',\n ingest: createIngest('test'),\n ...overrides,\n } as Transformer.Context<T> & Destination.PushContext<Destination.TypesGeneric>;\n}\n","import type { WalkerOS } from './types';\nimport { tryCatch } from './tryCatch';\nimport { castValue } from './castValue';\nimport { isArray, isObject } from './is';\n\n/**\n * Converts a request string to a data object.\n *\n * @param parameter The request string to convert.\n * @returns The data object or undefined.\n */\nexport function requestToData(\n parameter: unknown,\n): WalkerOS.AnyObject | undefined {\n const str = String(parameter);\n const queryString = str.split('?')[1] || str;\n\n return tryCatch(() => {\n const params = new URLSearchParams(queryString);\n const result: WalkerOS.AnyObject = {};\n\n params.forEach((value, key) => {\n const keys = key.split(/[[\\]]+/).filter(Boolean);\n let current: unknown = result;\n\n keys.forEach((k, i) => {\n const isLast = i === keys.length - 1;\n\n if (isArray(current)) {\n const index = parseInt(k, 10);\n if (isLast) {\n (current as Array<unknown>)[index] = castValue(value);\n } else {\n (current as Array<unknown>)[index] =\n (current as Array<unknown>)[index] ||\n (isNaN(parseInt(keys[i + 1], 10)) ? {} : []);\n current = (current as Array<unknown>)[index];\n }\n } else if (isObject(current)) {\n if (isLast) {\n (current as WalkerOS.AnyObject)[k] = castValue(value);\n } else {\n (current as WalkerOS.AnyObject)[k] =\n (current as WalkerOS.AnyObject)[k] ||\n (isNaN(parseInt(keys[i + 1], 10)) ? {} : []);\n current = (current as WalkerOS.AnyObject)[k];\n }\n }\n });\n });\n\n return result;\n })();\n}\n\n/**\n * Converts a data object to a request string.\n *\n * @param data The data object to convert.\n * @returns The request string.\n */\nexport function requestToParameter(\n data: WalkerOS.AnyObject | WalkerOS.PropertyType,\n): string {\n if (!data) return '';\n\n const params: string[] = [];\n const encode = encodeURIComponent;\n\n function addParam(key: string, value: unknown) {\n if (value === undefined || value === null) return;\n\n if (isArray(value)) {\n value.forEach((item, index) => addParam(`${key}[${index}]`, item));\n } else if (isObject(value)) {\n Object.entries(value).forEach(([subKey, subValue]) =>\n addParam(`${key}[${subKey}]`, subValue),\n );\n } else {\n params.push(`${encode(key)}=${encode(String(value))}`);\n }\n }\n\n if (typeof data === 'object') {\n Object.entries(data).forEach(([key, value]) => addParam(key, value));\n } else {\n return encode(data);\n }\n\n return params.join('&');\n}\n","import type { SendDataValue, SendHeaders } from './types/send';\nimport { isSameType } from './is';\nimport { assign } from './assign';\n\nexport type { SendDataValue, SendHeaders, SendResponse } from './types/send';\n\n/**\n * Transforms data to a string.\n *\n * @param data The data to transform.\n * @returns The transformed data.\n */\nexport function transformData(data?: SendDataValue): string | undefined {\n if (data === undefined) return data;\n\n return isSameType(data, '' as string) ? data : JSON.stringify(data);\n}\n\n/**\n * Gets the headers for a request.\n *\n * @param headers The headers to merge with the default headers.\n * @returns The merged headers.\n */\nexport function getHeaders(headers: SendHeaders = {}): SendHeaders {\n return assign(\n {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n headers,\n );\n}\n","// packages/core/src/setup.ts\n\n/**\n * Normalize `config.setup` into a concrete options object, or null when disabled.\n *\n * - `false` / `undefined` → null (no setup)\n * - `true` → `defaults` as-is\n * - object → shallow merge of defaults and overrides (overrides win)\n */\nexport function resolveSetup<T extends object>(\n value: boolean | T | undefined,\n defaults: T,\n): T | null {\n if (value === false || value === undefined) return null;\n if (value === true) return defaults;\n return { ...defaults, ...value };\n}\n","/**\n * Trims quotes and whitespaces from a string.\n *\n * @param str The string to trim.\n * @returns The trimmed string.\n */\nexport function trim(str: string): string {\n // Remove quotes and whitespaces\n return str ? str.trim().replace(/^'|'$/g, '').trim() : '';\n}\n","import type { Hooks, Logger } from './types';\n\n/**\n * A utility function that wraps a function with hooks.\n *\n * Pre/post hooks are user-supplied and may throw. A throwing hook must not\n * crash the surrounding pipeline. On failure, fall back to calling the\n * original function (pre-hook) or keep the original result (post-hook).\n *\n * The generic `F` preserves the exact call shape of `fn`, including named\n * parameters and overloaded interfaces, so call sites can assign the result\n * to the same interface slot without a cast.\n *\n * @template F The exact function type being wrapped.\n * @param fn The function to wrap.\n * @param name The name of the function.\n * @param hooks The hooks to use.\n * @param logger Optional logger for hook failure warnings. Falls back to\n * `console.warn` when not provided.\n * @returns The wrapped function with the same call shape as `fn`.\n */\nexport function useHooks<F extends Hooks.AnyFunction>(\n fn: F,\n name: string,\n hooks: Hooks.Functions,\n logger?: Logger.Instance,\n): F {\n // Re-anchor `fn` to its structural call shape. The generic constraint\n // `Hooks.AnyFunction` widens calls to `unknown`, so a locally-typed alias\n // restores precise argument and return types inside the closure. Same\n // bridging concern as the two hook-lookup casts below.\n const inner = fn as (...args: Parameters<F>) => ReturnType<F>;\n const wrapped = function (this: unknown, ...args: Parameters<F>) {\n let result: ReturnType<F>;\n const preHook = ('pre' + name) as keyof Hooks.Functions;\n const postHook = ('post' + name) as keyof Hooks.Functions;\n const preHookFn = hooks[preHook] as unknown as Hooks.HookFn<typeof inner>;\n const postHookFn = hooks[postHook] as unknown as Hooks.HookFn<typeof inner>;\n\n const warn = (message: string, error: unknown) => {\n if (logger) {\n logger.warn(message, { error });\n } else {\n console.warn(message, error);\n }\n };\n\n if (preHookFn) {\n try {\n result = preHookFn({ fn: inner }, ...args);\n } catch (error) {\n warn(\n `Hook ${String(preHook)} failed, falling back to original function`,\n error,\n );\n result = inner(...args);\n }\n } else {\n result = inner(...args);\n }\n\n if (postHookFn) {\n try {\n result = postHookFn({ fn: inner, result }, ...args);\n } catch (error) {\n warn(`Hook ${String(postHook)} failed, keeping original result`, error);\n }\n }\n\n return result;\n };\n return wrapped as F;\n}\n","import type { FlowState } from './types/telemetry';\nimport type { ObserverFn } from './types/observer';\n\n/**\n * Telemetry level. Off disables emission entirely. Standard projects\n * structural state without inEvent or outEvent payloads (unless explicitly\n * opted in). Trace emits full payloads on every hop.\n */\nexport type TelemetryLevel = 'off' | 'standard' | 'trace';\n\n/**\n * Options that shape the telemetry projection strategy. Defaults are chosen\n * so a caller can pass `{ flowId }` and get sensible behavior.\n */\nexport interface TelemetryOptions {\n /** Required flow identifier; observers may use this for cross-flow correlation. */\n flowId: string;\n /** Verbosity. Defaults to 'standard'. */\n level?: TelemetryLevel;\n /** Force-include the inbound event regardless of level. */\n includeIn?: boolean;\n /** Force-include the outbound event regardless of level. */\n includeOut?: boolean;\n /** Force-include the matched mapping key (only meaningful for transformers/destinations). */\n includeMappingKey?: boolean;\n /**\n * Fraction of events to emit, between 0 and 1. Deterministic by eventId:\n * the same eventId always falls on the same side of the threshold so\n * paired in/out states either both emit or both drop.\n */\n sample?: number;\n}\n\nexport type EmitFn = (state: FlowState) => void;\n\n/**\n * Optional supplier form. When passed instead of static `TelemetryOptions`,\n * the observer evaluates the supplier on every emit so toggle-style runtime\n * overrides (e.g. `WALKEROS_TRACE_UNTIL`) reach the projection without\n * rebuilding the observer.\n */\nexport type TelemetryOptionsSupplier = () => TelemetryOptions | null;\n\n/**\n * Deterministic 32-bit FNV-1a hash of a string. Used for sampling so\n * identical eventIds always map to the same numeric bucket.\n */\nfunction fnv1a(input: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash =\n (hash +\n ((hash << 1) +\n (hash << 4) +\n (hash << 7) +\n (hash << 8) +\n (hash << 24))) >>>\n 0;\n }\n return hash >>> 0;\n}\n\n/**\n * Returns true when the eventId passes the sample gate. Sample of 1 always\n * passes; sample of 0 always fails. Anything in between buckets the eventId\n * deterministically so the in/out pair is consistent.\n */\nfunction passesSample(eventId: string, sample: number): boolean {\n if (sample >= 1) return true;\n if (sample <= 0) return false;\n const hashed = fnv1a(eventId);\n const ratio = hashed / 0xffffffff;\n return ratio < sample;\n}\n\n/**\n * Build a telemetry observer that projects FlowState records according to\n * level/sample/include flags and forwards them to `emit`. The observer is\n * synchronous, never throws (a throwing emit is swallowed), and does no\n * IO of its own. Designed to be added to `collector.observers` so the\n * runtime self-emission loop drives it.\n *\n * Accepts either a static `TelemetryOptions` value or a supplier\n * `() => TelemetryOptions | null`. With a supplier, every emit reads the\n * current opts so toggles such as `WALKEROS_TRACE_UNTIL` reach the\n * projection without rebuilding the observer. A supplier returning `null`\n * suppresses the emit (telemetry off).\n */\nexport function createTelemetryObserver(\n emit: EmitFn,\n optsOrSupplier: TelemetryOptions | TelemetryOptionsSupplier,\n): ObserverFn {\n const supply: TelemetryOptionsSupplier =\n typeof optsOrSupplier === 'function'\n ? optsOrSupplier\n : () => optsOrSupplier;\n\n return function project(state: FlowState): void {\n const opts = supply();\n if (!opts) return;\n\n const level: TelemetryLevel = opts.level ?? 'standard';\n if (level === 'off') return;\n\n const rawSample = opts.sample;\n const sample =\n typeof rawSample === 'number' && Number.isFinite(rawSample)\n ? rawSample\n : 1;\n if (state.eventId && !passesSample(state.eventId, sample)) return;\n\n const includeIn = opts.includeIn ?? level === 'trace';\n const includeOut = opts.includeOut ?? level === 'trace';\n const includeMappingKey = opts.includeMappingKey ?? level === 'trace';\n\n const projected: FlowState = { ...state };\n if (!includeIn) delete projected.inEvent;\n if (!includeOut) {\n delete projected.outEvent;\n delete projected.calls;\n }\n if (!includeMappingKey) delete projected.mappingKey;\n\n // Error message truncation: limit to 256 chars outside trace so stack\n // fragments or echoed payloads do not leak verbosely. Trace keeps the\n // full message.\n if (\n level !== 'trace' &&\n projected.error?.message &&\n projected.error.message.length > 256\n ) {\n projected.error = {\n ...projected.error,\n message: projected.error.message.slice(0, 256) + '…',\n };\n }\n\n try {\n emit(projected);\n } catch {\n // Downstream emit must not crash the pipeline. Logging would itself\n // be observer-shaped, so swallow defensively.\n }\n };\n}\n\n/**\n * Convenience export: the internal sampling predicate so callers (and\n * tests) can verify the deterministic bucketing without importing the\n * private FNV-1a helper.\n */\nexport function isSampled(eventId: string, sample: number): boolean {\n return passesSample(eventId, sample);\n}\n","/**\n * Runtime telemetry resolver.\n *\n * Converts a flow-side `Flow.Config.observe` block plus a runtime `traceUntil`\n * override into a concrete `TelemetryOptions` the collector hooks installer can\n * consume. Pure function of its inputs: it reads no environment.\n *\n * Resolution order (highest priority first):\n * 1. `traceUntil`, if a string that parses to a future ISO timestamp ->\n * force level=trace, sample=1, include in/out payloads.\n * 2. The `observe` block.\n * 3. A tier default of `{ level: 'standard' }`.\n *\n * The `traceUntil` value can flip between emits, so trace turns on and off as\n * the timestamp comes and goes. The platform-specific caller owns the value\n * and supplies it per emit.\n */\nimport type { TelemetryLevel, TelemetryOptions } from './telemetry';\n\ninterface ResolveTelemetryInput {\n flowId: string;\n /** From `flow.config?.observe`. May be undefined. */\n observe?: { level?: 'off' | 'standard' | 'trace'; sample?: number };\n /** Runtime trace override. ISO timestamp parsing to a future time forces trace. */\n traceUntil?: string | null;\n /** Clock seam for tests. Defaults to `Date.now()`. */\n now?: () => number;\n}\n\n/**\n * Returns `TelemetryOptions` ready to pass to `createTelemetryObserver`,\n * or `null` if telemetry is disabled (`level === 'off'` with no trace\n * override). Callers should skip observer installation when this returns\n * null.\n */\nexport function resolveTelemetryOptions(\n input: ResolveTelemetryInput,\n): TelemetryOptions | null {\n const now = input.now ?? (() => Date.now());\n\n const { traceUntil } = input;\n if (typeof traceUntil === 'string' && traceUntil.length > 0) {\n const parsed = Date.parse(traceUntil);\n if (!Number.isNaN(parsed) && parsed > now()) {\n return {\n flowId: input.flowId,\n level: 'trace',\n includeIn: true,\n includeOut: true,\n sample: 1,\n };\n }\n }\n\n const level: TelemetryLevel = input.observe?.level ?? 'standard';\n if (level === 'off') return null;\n\n const sample = input.observe?.sample ?? 1;\n return {\n flowId: input.flowId,\n level,\n sample,\n };\n}\n","/** Claims carried by an activation grant. See the preview-sessions design spec. */\nexport interface ActivationGrant {\n /** Issuing environment, e.g. 'app:stage'. Verifier rejects a foreign issuer. */\n iss: string;\n /** Exact origins this grant may activate on. Exact-membership match only. */\n aud: string[];\n /** Issue time, epoch seconds. The URL window is enforced against this. */\n iat: number;\n /** Session expiry, epoch seconds. Storage-sourced grants are rejected after it. */\n sxp: number;\n /** Opaque artifact id: the preview bundle is `preview/<art>.js`. */\n art: string;\n /** Subresource integrity of the artifact bytes, e.g. 'sha384-…'. */\n sri: string;\n /** Opaque per-project binding. Must equal the value baked into the host bundle. */\n pb: string;\n /** Capability. Only 'activate' exists today. */\n cap: 'activate';\n /** Per-grant unique id, for audit and revocation. */\n jti: string;\n /** Preview id, for correlation. Never a project id. */\n pid: string;\n /** Session id, present only on cross-part (web+server) grants. */\n ses?: string;\n /** Opaque per-session binding. Present iff `ses` is. */\n sb?: string;\n}\n\nexport type PreviewFailure =\n | 'no-grant'\n | 'malformed'\n | 'kid-mismatch'\n | 'bad-signature'\n | 'foreign-issuer'\n | 'expired'\n | 'aud-mismatch'\n | 'pb-mismatch'\n | 'sb-mismatch'\n | 'cap-mismatch'\n | 'no-subtle'\n | 'swap-failed';\n\nexport interface ParsedGrant {\n grant: ActivationGrant;\n kid: string;\n /** The exact bytes covered by the signature: `${header}.${payload}` as UTF-8. */\n signed: Uint8Array;\n /** Raw r‖s signature, 64 bytes. */\n signature: Uint8Array;\n}\n\nexport type VerifyResult =\n | { ok: true; grant: ActivationGrant }\n | { ok: false; reason: PreviewFailure };\n\n// Base64url alphabet, no padding: shared by every JWS segment decode below\n// and by isGrant's `art` check, since `art` is interpolated into a URL path\n// and must never carry '.', '/' or other path-traversal characters even\n// though it is not itself base64url-decoded.\nconst JWS_SEGMENT_CHARSET = /^[A-Za-z0-9_-]+$/;\n\nfunction decodeSegment(segment: string): Uint8Array | null {\n if (!JWS_SEGMENT_CHARSET.test(segment)) return null;\n const pad =\n segment.length % 4 === 0 ? '' : '='.repeat(4 - (segment.length % 4));\n const base64 = segment.replace(/-/g, '+').replace(/_/g, '/') + pad;\n // atob is untyped in core (no DOM lib, no own @types/node) but present in\n // every runtime we target (browsers, Node >=16, jsdom): structural access.\n const atobFn = (globalThis as { atob?: (data: string) => string }).atob;\n if (!atobFn) return null;\n try {\n const binary = atobFn(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n } catch {\n return null;\n }\n}\n\n// Core ships without TextEncoder/TextDecoder (no DOM lib, jsdom lacks them,\n// see batchedPoster.ts). The grant protocol is ASCII by contract: mint\n// \\u-escapes non-ASCII in the JSON payload, so any byte >0x7F is malformed.\nfunction bytesToAscii(bytes: Uint8Array): string | null {\n let out = '';\n for (let i = 0; i < bytes.length; i++) {\n const c = bytes[i];\n if (c === undefined || c > 0x7f) return null;\n out += String.fromCharCode(c);\n }\n return out;\n}\n\n// The JWS signing input (`base64url.base64url`) is inherently ASCII.\nfunction asciiToBytes(text: string): Uint8Array {\n const bytes = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) bytes[i] = text.charCodeAt(i);\n return bytes;\n}\n\nfunction decodeJson(segment: string): unknown {\n const bytes = decodeSegment(segment);\n if (!bytes) return null;\n const text = bytesToAscii(bytes);\n if (text === null) return null;\n try {\n const parsed: unknown = JSON.parse(text);\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isGrant(value: unknown): value is ActivationGrant {\n if (!isRecord(value)) return false;\n const g = value;\n return (\n typeof g.iss === 'string' &&\n Array.isArray(g.aud) &&\n g.aud.every((a) => typeof a === 'string') &&\n typeof g.iat === 'number' &&\n typeof g.sxp === 'number' &&\n typeof g.art === 'string' &&\n // Same-origin path traversal guard: `art` is interpolated into\n // `/preview/${art}.js`. The fixed `previewOrigin` authority already stops\n // a hostile `art` from leaving this origin, but without this charset\n // check a signed grant could still smuggle '../' into the request path.\n JWS_SEGMENT_CHARSET.test(g.art) &&\n typeof g.sri === 'string' &&\n typeof g.pb === 'string' &&\n g.cap === 'activate' &&\n typeof g.jti === 'string' &&\n typeof g.pid === 'string' &&\n (g.ses === undefined || typeof g.ses === 'string') &&\n (g.sb === undefined || typeof g.sb === 'string')\n );\n}\n\n/**\n * Parse a compact JWS activation grant. Pure and synchronous: this is the cheap\n * gate that runs before any crypto is touched. Returns null on anything\n * malformed: callers treat null as \"ignore, do not clear existing state\".\n */\nexport function parseGrant(raw: string): ParsedGrant | null {\n if (!raw) return null;\n const parts = raw.split('.');\n const [headerSeg, payloadSeg, sigSeg] = parts;\n if (parts.length !== 3 || !headerSeg || !payloadSeg || !sigSeg) return null;\n\n const header = decodeJson(headerSeg);\n if (!isRecord(header)) return null;\n const kid = header.kid;\n const alg = header.alg;\n if (typeof kid !== 'string' || alg !== 'ES256') return null;\n\n const payload = decodeJson(payloadSeg);\n if (!isGrant(payload)) return null;\n\n const signature = decodeSegment(sigSeg);\n if (!signature || signature.byteLength !== 64) return null;\n\n return {\n grant: payload,\n kid,\n signed: asciiToBytes(`${headerSeg}.${payloadSeg}`),\n signature,\n };\n}\n\n/** A public key a bundle or container will accept grants from. */\nexport interface PreviewKey {\n kid: string;\n /** base64url-encoded P-256 SPKI. */\n spki: string;\n}\n\n// Node's real SubtleCrypto splits importKey into a 'jwk' overload and a\n// non-'jwk' one, each with its own keyData type. A plain `Uint8Array`\n// parameter here makes TS's overload matching pick the incompatible 'jwk'\n// overload and report a false mismatch; this wider union (matching the\n// shape of Node's own BufferSource) resolves against the right overload\n// while still accepting a plain Uint8Array at every call site.\ntype PreviewBinary = ArrayBuffer | ArrayBufferView;\n\n/**\n * Structural slice of WebCrypto used by the verifier. Core compiles without\n * the DOM lib, so the ambient `Crypto` type is unavailable here: a structural\n * type also lets tests inject `node:crypto`'s webcrypto without casts and lets\n * `{}` model a subtle-less environment (same pattern as batchedPoster's\n * PosterFetch).\n */\nexport interface PreviewSubtle {\n importKey(\n format: 'spki',\n keyData: PreviewBinary,\n algorithm: { name: string; namedCurve: string },\n extractable: boolean,\n keyUsages: string[],\n ): Promise<unknown>;\n verify(\n algorithm: { name: string; hash: string },\n key: unknown,\n signature: PreviewBinary,\n data: PreviewBinary,\n ): Promise<boolean>;\n}\n\nexport interface PreviewCrypto {\n subtle?: PreviewSubtle;\n}\n\n/**\n * The two real callers of `verifyActivation` bind audience differently: the\n * web loader always has a page origin and checks `aud` against it, while a\n * container has no origin at all and is bound to one session instead. A\n * discriminated union (rather than an optional `origin`) turns \"the caller\n * forgot `origin`\" from a silent aud-check skip into a compile error on the\n * web arm; `expectSession` is forced on the container arm for the same\n * reason, since that arm's whole job is proving it checked *something*.\n */\ntype VerifyAudience =\n | { origin: string; expectSession?: undefined }\n | { origin?: undefined; expectSession: { ses: string; sb: string } };\n\nexport type VerifyParams = VerifyAudience & {\n /** Keys this host accepts. Current + previous, so rotation is non-disruptive. */\n keyring: PreviewKey[];\n /** Expected issuer, e.g. 'app:stage'. */\n iss: string;\n /** This host's baked project binding. Required unless `acceptForeign`. */\n pb?: string;\n /** Demo hosts only: skip the pb match, require aud to be a single allowlisted origin. */\n acceptForeign?: boolean;\n demoAllowlist?: string[];\n /** Which clock applies: the URL handover window, or the session expiry. */\n source: 'url' | 'storage';\n /** Epoch milliseconds. Injected so tests and the server control the clock. */\n now: number;\n /** Defaults to globalThis.crypto. Injectable for jsdom/node tests. */\n crypto?: PreviewCrypto;\n};\n\n/** A grant handed over in a URL is only accepted this long after `iat`. */\nexport const URL_WINDOW_MS = 15 * 60 * 1000;\n\n/**\n * How far a grant's `iat` may sit in the future and still count as ordinary\n * clock skew rather than a broken or hostile mint clock (RFC 7519 §4.1.5\n * iat/nbf practice: reject a token issued in the future, with tolerance).\n */\nexport const CLOCK_SKEW_MS = 60 * 1000;\n\n/**\n * Verifier-side ceiling on `sxp - iat`, independent of whatever the mint's\n * clock claims. The design spec's session TTL is a 60-minute ceiling\n * (`sxp = min(iat + 60 min, session remaining)`); this adds a modest margin\n * above that so a legitimate boundary-exact grant is never rejected by\n * rounding, while still bounding how long a leaked grant stays usable if a\n * mint clock is skewed or wrong.\n */\nexport const MAX_SESSION_MS = 65 * 60 * 1000;\n\nfunction spkiToBytes(spki: string): Uint8Array | null {\n return decodeSegment(spki);\n}\n\n/**\n * Verify an activation grant locally: no network, no DB, the signature plus\n * the baked bindings carry the whole decision.\n *\n * Claim checks run before the signature check so a hostile or malformed\n * value costs almost nothing, but `ok: true` is only ever reached after the\n * ES256 verify succeeds: no unsigned claim value is trusted on its own, it\n * only ever decides which rejection reason comes back.\n */\nexport async function verifyActivation(\n raw: string,\n params: VerifyParams,\n): Promise<VerifyResult> {\n const parsed = parseGrant(raw);\n if (!parsed) return { ok: false, reason: 'malformed' };\n const { grant, kid, signed, signature } = parsed;\n\n if (grant.iss !== params.iss) return { ok: false, reason: 'foreign-issuer' };\n // cap is already constrained to the 'activate' literal by parseGrant's\n // isGrant guard: kept as defense in depth in case that guard ever widens.\n if (grant.cap !== 'activate') return { ok: false, reason: 'cap-mismatch' };\n\n // A grant minted noticeably in the future means the mint's clock cannot be\n // trusted, and both clocks below are computed from iat: a skewed or buggy\n // mint clock would otherwise nullify them both. Tolerance, not zero,\n // because real clocks drift.\n if (grant.iat * 1000 > params.now + CLOCK_SKEW_MS) {\n return { ok: false, reason: 'expired' };\n }\n // The verifier's own bound on how long a grant may claim to live, so a\n // mint clock error can't stretch a session past what this host allows\n // regardless of what iat/sxp themselves say.\n if (grant.sxp * 1000 - grant.iat * 1000 > MAX_SESSION_MS) {\n return { ok: false, reason: 'expired' };\n }\n\n // URL grants respect BOTH clocks: the 15-minute handover window and the\n // session expiry (a re-mint near session end must not outlive the session).\n const deadline =\n params.source === 'url'\n ? Math.min(grant.iat * 1000 + URL_WINDOW_MS, grant.sxp * 1000)\n : grant.sxp * 1000;\n if (params.now >= deadline) return { ok: false, reason: 'expired' };\n\n // Exact membership only: no prefix/suffix/substring matching, so a lookalike\n // origin (an evil.com path containing the real origin, or a subdomain of it)\n // can never satisfy this.\n if (params.origin !== undefined && !grant.aud.includes(params.origin)) {\n return { ok: false, reason: 'aud-mismatch' };\n }\n if (params.acceptForeign) {\n // Demo grants are single-origin by contract: enforced verifier-side too,\n // and independent of whether an origin was supplied, so a container-side\n // caller (no `origin`) can't skip this gate.\n const allow = params.demoAllowlist ?? [];\n if (grant.aud.length !== 1 || !grant.aud.every((a) => allow.includes(a))) {\n return { ok: false, reason: 'aud-mismatch' };\n }\n }\n\n // pb binds a grant to the tenant whose bundle is running. Demo hosts opt out\n // (that is the whole point of the demo shop) and rely on the aud allowlist above.\n if (!params.acceptForeign) {\n if (!params.pb || grant.pb !== params.pb) {\n return { ok: false, reason: 'pb-mismatch' };\n }\n }\n\n // sb binds a grant to one session's container: without it, \"valid signature\"\n // would prove nothing about which tenant minted the grant, since one key\n // signs for the whole environment. Symmetric in both directions: a\n // session-scoped grant presented where no session is expected must not\n // silently pass either, or a grant minted for one session could activate at\n // a host that never asked to be bound to it.\n const grantIsSessionScoped =\n grant.ses !== undefined || grant.sb !== undefined;\n if (params.expectSession) {\n if (grant.ses !== params.expectSession.ses) {\n return { ok: false, reason: 'sb-mismatch' };\n }\n if (!grant.sb || grant.sb !== params.expectSession.sb) {\n return { ok: false, reason: 'sb-mismatch' };\n }\n } else if (grantIsSessionScoped) {\n return { ok: false, reason: 'sb-mismatch' };\n }\n\n const key = params.keyring.find((k) => k.kid === kid);\n if (!key) return { ok: false, reason: 'kid-mismatch' };\n\n // globalThis.crypto is untyped without the DOM lib: structural access is\n // the batchedPoster precedent (`globalThis.fetch as PosterFetch`).\n const cryptoImpl =\n params.crypto ?? (globalThis as { crypto?: PreviewCrypto }).crypto;\n const subtle = cryptoImpl?.subtle;\n if (!subtle) return { ok: false, reason: 'no-subtle' };\n\n const spki = spkiToBytes(key.spki);\n if (!spki) return { ok: false, reason: 'kid-mismatch' };\n\n try {\n const publicKey = await subtle.importKey(\n 'spki',\n spki,\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['verify'],\n );\n const valid = await subtle.verify(\n { name: 'ECDSA', hash: 'SHA-256' },\n publicKey,\n signature,\n signed,\n );\n if (!valid) return { ok: false, reason: 'bad-signature' };\n } catch {\n return { ok: false, reason: 'bad-signature' };\n }\n\n return { ok: true, grant };\n}\n\nexport interface SwapActivatorConfig {\n keyring: PreviewKey[];\n iss: string;\n /** This bundle's project binding. Absent on demo hosts (see acceptForeign). */\n pb?: string;\n acceptForeign?: boolean;\n demoAllowlist?: string[];\n /** Bare CDN hostname, e.g. 'cdn.walkeros.io'. */\n previewOrigin: string;\n /** Injectable for tests. */\n now?: () => number;\n crypto?: PreviewCrypto;\n}\n\nconst STORAGE_KEY = 'elbPreview';\n/**\n * Storage slot for the session-forwarding companion grant. The web arm never\n * verifies it (it is session-bound by design; the session container is its\n * verifier) — the activator only ferries it from the activation URL into\n * storage, where the seamed preview artifact reads it to stamp the\n * `X-Walkeros-Preview` header. It lives and dies with the activation state:\n * set (or cleared) whenever a URL activation succeeds, cleared whenever the\n * stored activation clears.\n */\nexport const SESSION_STORAGE_KEY = 'elbPreviewSession';\nconst LOG = '[walkerOS:preview]';\nconst SWAP_TIMEOUT_MS = 5000;\n\n// Structural slices of the browser globals the activator touches. Core\n// compiles without the DOM lib, so window/document/URLSearchParams/console/\n// setTimeout are all untyped here; reading them off globalThis behind guards\n// is the batchedPoster precedent. Runtime behavior is identical.\ninterface ScriptEl {\n onload: (() => void) | null;\n onerror: (() => void) | null;\n src: string;\n setAttribute(name: string, value: string): void;\n parentNode: { removeChild(el: ScriptEl): void } | null;\n}\n\ninterface BrowserGlobals {\n window?: {\n location: { href: string; origin: string; search: string };\n history: { replaceState(data: unknown, title: string, url: string): void };\n localStorage: {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n };\n };\n document?: {\n head: { appendChild(el: ScriptEl): void };\n createElement(tag: 'script'): ScriptEl;\n };\n URLSearchParams?: new (init: string) => {\n getAll(name: string): string[];\n delete(name: string): void;\n toString(): string;\n };\n console?: { warn(msg: string): void; info(msg: string): void };\n setTimeout?: (fn: () => void, ms: number) => number;\n clearTimeout?: (id: number) => void;\n}\n\nconst G = globalThis as BrowserGlobals;\n\ninterface PreviewStore {\n get(): string | null;\n set(value: string): void;\n clear(): void;\n}\n\n/** localStorage under `key`, with an in-memory fallback for Safari private mode. */\nfunction createStore(key: string): PreviewStore {\n let memory: string | null = null;\n return {\n get() {\n try {\n return G.window?.localStorage.getItem(key) ?? memory;\n } catch {\n return memory;\n }\n },\n set(value) {\n try {\n G.window?.localStorage.setItem(key, value);\n } catch {\n memory = value;\n }\n },\n clear() {\n memory = null;\n try {\n G.window?.localStorage.removeItem(key);\n } catch {\n // in-memory copy already cleared\n }\n },\n };\n}\n\nfunction stripParam(): void {\n const win = G.window;\n const USP = G.URLSearchParams;\n if (!win || !USP) return;\n try {\n const href = win.location.href;\n const hashIdx = href.indexOf('#');\n const hash = hashIdx >= 0 ? href.slice(hashIdx) : '';\n const withoutHash = hashIdx >= 0 ? href.slice(0, hashIdx) : href;\n const qIdx = withoutHash.indexOf('?');\n const path = qIdx >= 0 ? withoutHash.slice(0, qIdx) : withoutHash;\n const params = new USP(qIdx >= 0 ? withoutHash.slice(qIdx + 1) : '');\n params.delete('elbPreview');\n params.delete('elbPreviewSession');\n const query = params.toString();\n win.history.replaceState(\n {},\n '',\n `${path}${query ? `?${query}` : ''}${hash}`,\n );\n } catch {\n // A page that forbids history writes still previews; the param just stays.\n }\n}\n\nfunction injectArtifact(src: string, sri: string): Promise<boolean> {\n return new Promise((resolve) => {\n const doc = G.document;\n if (!doc) {\n resolve(false);\n return;\n }\n const script = doc.createElement('script');\n let settled = false;\n let timer: number | undefined;\n const done = (ok: boolean) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) G.clearTimeout?.(timer);\n if (!ok && script.parentNode) script.parentNode.removeChild(script);\n resolve(ok);\n };\n timer = G.setTimeout?.(() => done(false), SWAP_TIMEOUT_MS);\n script.onload = () => done(true);\n script.onerror = () => done(false);\n script.setAttribute('integrity', sri);\n script.setAttribute('crossorigin', 'anonymous');\n script.src = src;\n doc.head.appendChild(script);\n });\n}\n\n/**\n * Decide whether a preview bundle should boot in place of this bundle's own flow.\n *\n * Returns true iff a preview took over, in which case the caller must not boot\n * the production flow. Every failure path deterministically returns false: the\n * loader never throws, never retries, and never leaves a page without a walker.\n *\n * Anti-griefing invariant: a rejected URL grant never touches stored state,\n * the activator falls back to the stored grant instead. Only a failing stored\n * grant clears storage (self-heal), plus `off` and `swap-failed`.\n */\nexport async function browserSwapActivator(\n cfg: SwapActivatorConfig,\n): Promise<boolean> {\n const win = G.window;\n if (!win || !G.document) return false;\n\n const store = createStore(STORAGE_KEY);\n const sessionStore = createStore(SESSION_STORAGE_KEY);\n const now = cfg.now ?? (() => Date.now());\n const warn = (reason: string) => G.console?.warn(`${LOG} ${reason}`);\n\n let param: string | null = null;\n let companion: string | null = null;\n const USP = G.URLSearchParams;\n if (USP) {\n try {\n const search = new USP(win.location.search.replace(/^\\?/, ''));\n const values = search.getAll('elbPreview');\n param = values.length > 0 ? (values[values.length - 1] ?? null) : null;\n const companions = search.getAll('elbPreviewSession');\n companion =\n companions.length > 0\n ? (companions[companions.length - 1] ?? null)\n : null;\n } catch {\n param = null;\n companion = null;\n }\n }\n\n if (param === 'off') {\n store.clear();\n sessionStore.clear();\n stripParam();\n return false;\n }\n\n const stored = store.get();\n\n // Zero-work fast path: the overwhelmingly common case on a production page.\n // No crypto, no storage writes, no DOM work.\n if (!param && !stored) return false;\n\n const verify = (raw: string, source: 'url' | 'storage') =>\n verifyActivation(raw, {\n keyring: cfg.keyring,\n iss: cfg.iss,\n origin: win.location.origin,\n pb: cfg.pb,\n acceptForeign: cfg.acceptForeign,\n demoAllowlist: cfg.demoAllowlist,\n source,\n now: now(),\n crypto: cfg.crypto,\n });\n\n let grant: ActivationGrant | null = null;\n\n // 1) URL grant first. Rejection for any reason (malformed, unsigned, bad\n // signature, expired, wrong aud) is warned and ignored, and must never\n // clear stored state: verification runs cheap checks before crypto, so\n // at rejection time we cannot know whether the value was even one of\n // ours, and a crafted link must not end someone's active session.\n if (param) {\n const result = await verify(param, 'url');\n if (result.ok) {\n grant = result.grant;\n store.set(param);\n // The URL activation defines the session context: carry its companion\n // forwarding grant into storage, or clear a stale one from an earlier\n // session. Never verified here — the session container is its verifier.\n if (companion) sessionStore.set(companion);\n else sessionStore.clear();\n } else {\n warn(result.reason);\n }\n stripParam();\n }\n\n // 2) Fall back to the stored grant. This one clears on failure: it came\n // from our own storage, so clearing is self-healing, not griefable.\n // (Except `no-subtle`: that is the environment's fault, not the grant's.)\n if (!grant && stored) {\n const result = await verify(stored, 'storage');\n if (result.ok) {\n grant = result.grant;\n } else {\n warn(result.reason);\n if (result.reason !== 'no-subtle') {\n store.clear();\n sessionStore.clear();\n }\n }\n }\n\n if (!grant) return false;\n\n const src = `https://${cfg.previewOrigin}/preview/${grant.art}.js`;\n const loaded = await injectArtifact(src, grant.sri);\n\n if (!loaded) {\n warn('swap-failed');\n store.clear();\n sessionStore.clear();\n return false;\n }\n\n G.console?.info(\n `${LOG} active ${grant.art} ends ${new Date(grant.sxp * 1000).toISOString()}`,\n );\n return true;\n}\n","import type { FlowState, FlowStatePhase } from './types/telemetry';\nimport type {\n AssembleJourneysOptions,\n Journey,\n JourneyAssembly,\n JourneyBranch,\n JourneyCorrelation,\n JourneyEntry,\n JourneyGap,\n JourneyHop,\n JourneyHopStatus,\n JourneyPlatform,\n JourneyStatus,\n JourneyTopology,\n JourneyTopologyNode,\n} from './types/journey';\n\n/** Default settle window: a journey may still change until its last record is this old. */\nconst DEFAULT_SETTLE_MS = 15000;\n\n/** Terminal precedence: error beats skip beats out beats in beats init beats flush. */\nconst PHASE_RANK: Record<FlowStatePhase, number> = {\n error: 5,\n skip: 4,\n out: 3,\n in: 2,\n init: 1,\n flush: 0,\n};\n\n/** Segment key for a platform-less hop; distinct from any real platform value. */\nconst NO_PLATFORM = '\\0none';\n\n/** Field separator for composite string keys; cannot occur in the values. */\nconst SEP = '\\0';\n\n/** Composite `(platform, stepId)` key; the file's one identity for hops and topology nodes. */\nfunction keyOf(platform: JourneyPlatform | undefined, stepId: string): string {\n return `${platform ?? NO_PLATFORM}${SEP}${stepId}`;\n}\n\n/** Parse an ISO timestamp to epoch ms, treating an unparseable value as 0. */\nfunction toEpoch(iso: string): number {\n const ms = Date.parse(iso);\n return Number.isNaN(ms) ? 0 : ms;\n}\n\n/**\n * Total order over records so every downstream reduction (terminal selection,\n * tie-breaks, entry choice) is independent of input order.\n */\nfunction compareRecords(a: FlowState, b: FlowState): number {\n const pa = a.platform ?? '';\n const pb = b.platform ?? '';\n if (pa !== pb) return pa < pb ? -1 : 1;\n if (a.stepId !== b.stepId) return a.stepId < b.stepId ? -1 : 1;\n if (a.phase !== b.phase) return PHASE_RANK[a.phase] - PHASE_RANK[b.phase];\n if (a.eventId !== b.eventId) return a.eventId < b.eventId ? -1 : 1;\n const ba = a.branchId ?? '';\n const bb = b.branchId ?? '';\n if (ba !== bb) return ba < bb ? -1 : 1;\n if (a.elapsedMs !== b.elapsedMs) return a.elapsedMs - b.elapsedMs;\n const sa = a.seq ?? -1;\n const sb = b.seq ?? -1;\n if (sa !== sb) return sa - sb;\n if (a.timestamp !== b.timestamp) return a.timestamp < b.timestamp ? -1 : 1;\n return 0;\n}\n\n/**\n * Drop replayed duplicates. Prefer the poster's `(platform, seq)` identity when\n * `seq` is present; otherwise fall back to the structural tuple. First\n * occurrence wins.\n */\nfunction dedupe(records: FlowState[]): FlowState[] {\n const seen = new Set<string>();\n const out: FlowState[] = [];\n for (const r of records) {\n const key =\n r.seq !== undefined\n ? `seq${SEP}${r.platform ?? ''}${SEP}${r.seq}`\n : `tuple${SEP}${r.platform ?? ''}${SEP}${r.stepId}${SEP}${r.phase}${SEP}${\n r.eventId\n }${SEP}${r.branchId ?? ''}${SEP}${r.elapsedMs}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(r);\n }\n return out;\n}\n\n/** Read a `name` string off an inbound event without loosening the type. */\nfunction readEventName(inEvent: unknown): string | undefined {\n if (\n typeof inEvent === 'object' &&\n inEvent !== null &&\n 'name' in inEvent &&\n typeof inEvent.name === 'string'\n ) {\n return inEvent.name;\n }\n return undefined;\n}\n\n/** Map a hop's terminal phase to its collapsed status. */\nfunction hopStatusFor(phase: FlowStatePhase): JourneyHopStatus {\n switch (phase) {\n case 'error':\n return 'error';\n case 'skip':\n return 'skipped';\n case 'out':\n return 'done';\n case 'in':\n case 'init':\n case 'flush':\n return 'pending';\n }\n}\n\n/** A hop has reached a settled outcome: delivered, errored, skipped, or batch-enqueued. */\nfunction isHopTerminal(hop: JourneyHop): boolean {\n return (\n hop.terminalPhase === 'out' ||\n hop.terminalPhase === 'error' ||\n hop.terminalPhase === 'skip' ||\n hop.batched === true\n );\n}\n\n/**\n * Whether a done hop propagates expectation to its downstream steps. Only `done`\n * hops expand (`skipped`/`error`/`pending` stop the frontier); a transformer\n * that produced no output (`out` null or absent) dropped the event, so nothing\n * flows on.\n */\nfunction hopExpands(hop: JourneyHop): boolean {\n if (hop.status !== 'done') return false;\n if (\n hop.stepType === 'transformer' &&\n (hop.out === null || hop.out === undefined)\n )\n return false;\n return true;\n}\n\n/** One topology node with its rank (index in `nodes`) and composite identity. */\ninterface TopoNode {\n node: JourneyTopologyNode;\n rank: number;\n key: string;\n}\n\n/**\n * Topology precomputed once per `assembleJourneys` call: composite\n * `(platform, stepId)` keying throughout, resolved downstream edges, and the\n * root set (nodes no resolved edge targets).\n */\ninterface TopologyIndex {\n /** Node by composite key; on duplicate keys the first (lowest-rank) node wins. */\n byKey: Map<string, TopoNode>;\n /** All nodes sharing a bare stepId, for unique-match fallbacks. */\n byStepId: Map<string, TopoNode[]>;\n /** Resolved downstream targets per source node key. */\n edges: Map<string, TopoNode[]>;\n /** Nodes that are not the resolved target of any edge, in rank order. */\n roots: TopoNode[];\n}\n\n/**\n * Resolve one downstream entry of `source`: the node with that stepId AND the\n * source's platform; if none, the unique node with that stepId regardless of\n * platform (the $flow crossing case); if still ambiguous, the edge is ignored.\n */\nfunction resolveEdgeTarget(\n source: TopoNode,\n stepId: string,\n byKey: Map<string, TopoNode>,\n byStepId: Map<string, TopoNode[]>,\n): TopoNode | undefined {\n const samePlatform = byKey.get(keyOf(source.node.platform, stepId));\n if (samePlatform !== undefined) return samePlatform;\n const candidates = byStepId.get(stepId);\n if (candidates !== undefined && candidates.length === 1) return candidates[0];\n return undefined;\n}\n\n/** Build the per-call topology index. */\nfunction indexTopology(topology: JourneyTopology): TopologyIndex {\n const byKey = new Map<string, TopoNode>();\n const byStepId = new Map<string, TopoNode[]>();\n topology.nodes.forEach((node, rank) => {\n const info: TopoNode = {\n node,\n rank,\n key: keyOf(node.platform, node.stepId),\n };\n if (!byKey.has(info.key)) byKey.set(info.key, info);\n const list = byStepId.get(node.stepId);\n if (list) list.push(info);\n else byStepId.set(node.stepId, [info]);\n });\n\n const edges = new Map<string, TopoNode[]>();\n const targeted = new Set<string>();\n for (const info of byKey.values()) {\n const resolved: TopoNode[] = [];\n for (const d of info.node.downstream) {\n const target = resolveEdgeTarget(info, d, byKey, byStepId);\n if (target !== undefined) {\n resolved.push(target);\n targeted.add(target.key);\n }\n }\n edges.set(info.key, resolved);\n }\n\n const roots: TopoNode[] = [];\n for (const info of byKey.values())\n if (!targeted.has(info.key)) roots.push(info);\n roots.sort((a, b) => a.rank - b.rank);\n\n return { byKey, byStepId, edges, roots };\n}\n\n/**\n * Node an observed hop belongs to: exact `(platform, stepId)` match first, then\n * the platform-less node with that stepId, then the unique stepId match.\n */\nfunction nodeForHop(\n topo: TopologyIndex,\n stepId: string,\n platform: JourneyPlatform | undefined,\n): TopoNode | undefined {\n const exact = topo.byKey.get(keyOf(platform, stepId));\n if (exact !== undefined) return exact;\n const platformless = topo.byKey.get(keyOf(undefined, stepId));\n if (platformless !== undefined) return platformless;\n const candidates = topo.byStepId.get(stepId);\n if (candidates !== undefined && candidates.length === 1) return candidates[0];\n return undefined;\n}\n\n/**\n * Topology frontier walk. Seeding is platform-scoped: only roots whose platform\n * the journey touched (platform-less roots always) — a root on an untouched\n * platform is a sibling entry point, not missing work, so disjoint per-platform\n * sub-graphs are safe. Downstream expansion stays edge-driven and crosses\n * platforms (a done crossing hop still expects the far side's chain). When\n * seeding yields no roots (e.g. a server-only journey whose platform's entry is\n * only ever edge-targeted by a crossing), an empty walk would be vacuously\n * complete, so the no-topology rule applies instead: complete iff every\n * observed hop is terminal. Otherwise every expected step must be observed and\n * terminal for `complete`, else `partial`.\n */\nfunction frontierStatus(\n hops: JourneyHop[],\n platforms: JourneyPlatform[],\n topo: TopologyIndex,\n): JourneyStatus {\n const findHop = (info: TopoNode): JourneyHop | undefined =>\n hops.find(\n (h) =>\n h.stepId === info.node.stepId &&\n (info.node.platform === undefined || h.platform === info.node.platform),\n );\n\n const seeded = topo.roots.filter(\n (r) => r.node.platform === undefined || platforms.includes(r.node.platform),\n );\n if (seeded.length === 0)\n return hops.every(isHopTerminal) ? 'complete' : 'partial';\n\n const expected = new Map<string, TopoNode>();\n const queue: TopoNode[] = seeded;\n while (queue.length > 0) {\n const info = queue.shift();\n if (info === undefined) break;\n if (expected.has(info.key)) continue;\n expected.set(info.key, info);\n const hop = findHop(info);\n if (hop !== undefined && hopExpands(hop)) {\n const targets = topo.edges.get(info.key);\n if (targets !== undefined)\n for (const t of targets) if (!expected.has(t.key)) queue.push(t);\n }\n }\n\n for (const info of expected.values()) {\n const hop = findHop(info);\n if (hop === undefined || !isHopTerminal(hop)) return 'partial';\n }\n return 'complete';\n}\n\n/**\n * Journey completeness. `pending` until the settle window elapses (more records\n * may still arrive; `lastTimestamp` is the max over all records, so a single\n * fresh hop keeps the whole journey pending). After settle: with a topology,\n * the frontier walk decides; without one, `complete` iff every observed hop is\n * terminal, else `partial`.\n */\nfunction resolveStatus(\n hops: JourneyHop[],\n platforms: JourneyPlatform[],\n lastTimestamp: number,\n topo: TopologyIndex | undefined,\n settleMs: number,\n now: number,\n): JourneyStatus {\n if (now - lastTimestamp < settleMs) return 'pending';\n if (topo !== undefined) return frontierStatus(hops, platforms, topo);\n return hops.every(isHopTerminal) ? 'complete' : 'partial';\n}\n\n/**\n * Per-platform loss windows from the monotonic `seq` counter. Records are walked\n * in wall-clock order within each platform (`seq` is stamped per poster): a jump\n * of more than one is a gap (records dropped); a backward jump is a counter\n * reset (a new poster generation, e.g. a page reload) and never a loss. Bounds\n * come from the records adjacent to the gap.\n */\nfunction detectGaps(records: FlowState[]): JourneyGap[] {\n const byPlatform = new Map<string, FlowState[]>();\n for (const r of records) {\n if (r.seq === undefined) continue;\n const key = r.platform ?? NO_PLATFORM;\n const list = byPlatform.get(key);\n if (list) list.push(r);\n else byPlatform.set(key, [r]);\n }\n\n const gaps: JourneyGap[] = [];\n for (const key of [...byPlatform.keys()].sort()) {\n const list = byPlatform.get(key);\n if (list === undefined) continue;\n const ordered = [...list].sort((a, b) => {\n const ta = toEpoch(a.timestamp);\n const tb = toEpoch(b.timestamp);\n if (ta !== tb) return ta - tb;\n return (a.seq ?? 0) - (b.seq ?? 0);\n });\n\n let prev: FlowState | undefined;\n let prevSeq = 0;\n for (const cur of ordered) {\n const seq = cur.seq;\n if (seq === undefined) continue;\n if (prev === undefined) {\n prev = cur;\n prevSeq = seq;\n continue;\n }\n if (seq === prevSeq) continue; // duplicate (deduped upstream); ignore\n if (seq === prevSeq + 1) {\n prev = cur;\n prevSeq = seq;\n continue;\n }\n if (seq > prevSeq + 1) {\n const platform = cur.platform;\n gaps.push({\n ...(platform !== undefined ? { platform } : {}),\n fromMs: toEpoch(prev.timestamp),\n toMs: toEpoch(cur.timestamp),\n afterSeq: prevSeq,\n beforeSeq: seq,\n });\n }\n // seq > prevSeq+1 (gap, recorded above) or seq < prevSeq (reset): the new\n // record starts the ongoing run either way.\n prev = cur;\n prevSeq = seq;\n }\n }\n return gaps;\n}\n\n/**\n * A journey is lossy when its wall-clock window overlaps a gap on a platform it\n * touches. A platform-less gap (records the observer never stamped) is treated\n * conservatively as touching any journey, so loss is surfaced rather than hidden.\n */\nfunction isLossy(\n platforms: JourneyPlatform[],\n firstTimestamp: number,\n lastTimestamp: number,\n gaps: JourneyGap[],\n): boolean {\n for (const gap of gaps) {\n const touches =\n gap.platform === undefined || platforms.includes(gap.platform);\n if (!touches) continue;\n if (firstTimestamp <= gap.toMs && gap.fromMs <= lastTimestamp) return true;\n }\n return false;\n}\n\n/** Collapse one branch's records (branch-scoped, non-flush) into a JourneyBranch. */\nfunction collapseBranch(branchId: string, records: FlowState[]): JourneyBranch {\n let terminal = records[0];\n let outRecord: FlowState | undefined;\n let outPayload: unknown;\n for (const r of records) {\n if (PHASE_RANK[r.phase] > PHASE_RANK[terminal.phase]) terminal = r;\n if (r.phase === 'out') outRecord = r;\n if (r.outEvent !== undefined) outPayload = r.outEvent;\n }\n\n const terminalPhase = terminal.phase;\n const durationMs = outRecord?.durationMs;\n const skipReason = terminalPhase === 'skip' ? terminal.skipReason : undefined;\n const error = terminalPhase === 'error' ? terminal.error : undefined;\n const calls = outRecord?.calls;\n\n return {\n branchId,\n status: hopStatusFor(terminalPhase),\n terminalPhase,\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(skipReason !== undefined ? { skipReason } : {}),\n ...(error !== undefined ? { error } : {}),\n ...(outPayload !== undefined ? { out: outPayload } : {}),\n ...(calls !== undefined ? { calls } : {}),\n };\n}\n\n/**\n * Collapse all records for one `(platform, stepId)` pair into a single hop.\n * `flush` frames are excluded from identity, terminal selection, and field\n * harvest (their empty eventId must not become the hop's), but still fold in as\n * batch confirmation and still count toward `startedAtMs` (port parity).\n * `branchId` records fan out into `branches` rather than colouring the parent.\n */\nfunction collapseHop(group: FlowState[]): JourneyHop {\n // startedAtMs/timestamp anchor over ALL records incl. flush (port parity).\n let anchor = group[0];\n for (const r of group) if (r.elapsedMs < anchor.elapsedMs) anchor = r;\n\n const parentRecords: FlowState[] = [];\n const branchGroups = new Map<string, FlowState[]>();\n let hasFlush = false;\n for (const r of group) {\n if (r.phase === 'flush') {\n hasFlush = true;\n continue;\n }\n if (r.branchId !== undefined) {\n const list = branchGroups.get(r.branchId);\n if (list) list.push(r);\n else branchGroups.set(r.branchId, [r]);\n continue;\n }\n parentRecords.push(r);\n }\n\n // Parent collapse source: own (non-branch) records; a branch-only hop falls\n // back to its branch records, a flush-only hop to the flush frames, so the\n // hop still resolves identity and a (non-terminal) outcome.\n const branchRecords = [...branchGroups.values()].flat();\n const source =\n parentRecords.length > 0\n ? parentRecords\n : branchRecords.length > 0\n ? branchRecords\n : group;\n\n let identity = source[0];\n let terminal = source[0];\n let outRecord: FlowState | undefined;\n let inPayload: unknown;\n let outPayload: unknown;\n let mappingKey: string | undefined;\n let contractRule: string | undefined;\n let consent: Record<string, boolean> | undefined;\n let consentApplied: Record<string, boolean> | undefined;\n let meta: Record<string, unknown> | undefined;\n let parentEventId: string | undefined;\n\n for (const r of source) {\n if (r.elapsedMs < identity.elapsedMs) identity = r;\n if (PHASE_RANK[r.phase] > PHASE_RANK[terminal.phase]) terminal = r;\n if (r.phase === 'out') outRecord = r;\n if (r.inEvent !== undefined && inPayload === undefined)\n inPayload = r.inEvent;\n if (r.outEvent !== undefined) outPayload = r.outEvent;\n if (r.mappingKey !== undefined) mappingKey = r.mappingKey;\n if (r.contractRule !== undefined) contractRule = r.contractRule;\n if (r.consent !== undefined) consent = r.consent;\n if (r.consentApplied !== undefined) consentApplied = r.consentApplied;\n if (r.meta !== undefined) meta = r.meta;\n if (r.parentEventId !== undefined && parentEventId === undefined)\n parentEventId = r.parentEventId;\n }\n\n const terminalPhase = terminal.phase;\n const durationMs = outRecord?.durationMs;\n const error = terminalPhase === 'error' ? terminal.error : undefined;\n const skipReason = terminalPhase === 'skip' ? terminal.skipReason : undefined;\n const calls = outRecord?.calls;\n // batched requires the TERMINAL record to be a batch-stamped out: an\n // error/skip terminal over a batched out is not a successful enqueue, a\n // flush terminal's batch field describes the flush (not this hop's enqueue),\n // and an in/init terminal (batched out record lost) proves nothing.\n const batched =\n terminal.phase === 'out' && terminal.batch !== undefined ? true : undefined;\n // A flush frame confirms the batch was flushed, but only on a batched hop; a\n // pre-wire flush-only frame leaves the hop non-terminal and unconfirmed.\n const flushConfirmed = hasFlush && batched === true ? true : undefined;\n\n const branches =\n branchGroups.size > 0\n ? [...branchGroups.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([branchId, recs]) => collapseBranch(branchId, recs))\n : undefined;\n\n return {\n stepId: identity.stepId,\n stepType: identity.stepType,\n eventId: identity.eventId,\n status: hopStatusFor(terminalPhase),\n terminalPhase,\n startedAtMs: anchor.elapsedMs,\n timestamp: anchor.timestamp,\n ...(identity.platform !== undefined ? { platform: identity.platform } : {}),\n ...(parentEventId !== undefined ? { parentEventId } : {}),\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(inPayload !== undefined ? { in: inPayload } : {}),\n ...(outPayload !== undefined ? { out: outPayload } : {}),\n ...(error !== undefined ? { error } : {}),\n ...(skipReason !== undefined ? { skipReason } : {}),\n ...(mappingKey !== undefined ? { mappingKey } : {}),\n ...(contractRule !== undefined ? { contractRule } : {}),\n ...(consent !== undefined ? { consent } : {}),\n ...(consentApplied !== undefined ? { consentApplied } : {}),\n ...(calls !== undefined ? { calls } : {}),\n ...(branches !== undefined ? { branches } : {}),\n ...(batched !== undefined ? { batched } : {}),\n ...(flushConfirmed !== undefined ? { flushConfirmed } : {}),\n ...(meta !== undefined ? { meta } : {}),\n };\n}\n\n/** A platform segment: the hops of one runtime, ordered within the segment. */\ninterface Segment {\n platform?: JourneyPlatform;\n hops: JourneyHop[];\n ownedEventIds: Set<string>;\n parentEventIds: Set<string>;\n minEpoch: number;\n}\n\n/** Order the hops within one platform segment; ranks precomputed, not per comparison. */\nfunction orderWithinSegment(\n hops: JourneyHop[],\n topo: TopologyIndex | undefined,\n): JourneyHop[] {\n const entries = hops.map((hop) => ({\n hop,\n rank:\n topo !== undefined\n ? (nodeForHop(topo, hop.stepId, hop.platform)?.rank ??\n Number.MAX_SAFE_INTEGER)\n : 0,\n }));\n entries.sort((a, b) => {\n if (a.rank !== b.rank) return a.rank - b.rank;\n if (a.hop.startedAtMs !== b.hop.startedAtMs)\n return a.hop.startedAtMs - b.hop.startedAtMs;\n return a.hop.stepId < b.hop.stepId\n ? -1\n : a.hop.stepId > b.hop.stepId\n ? 1\n : 0;\n });\n return entries.map((e) => e.hop);\n}\n\n/**\n * Order platform segments by the `parentEventId` chain (a segment referencing\n * another segment's event id comes after it), then wall-clock, then platform.\n */\nfunction orderSegments(segments: Segment[]): Segment[] {\n const parentOf = new Map<number, number>();\n const stableIndexOrder = segments\n .map((_, i) => i)\n .sort((i, j) => {\n const pi = segments[i].platform ?? NO_PLATFORM;\n const pj = segments[j].platform ?? NO_PLATFORM;\n return pi < pj ? -1 : pi > pj ? 1 : 0;\n });\n\n segments.forEach((seg, i) => {\n if (seg.parentEventIds.size === 0) return;\n for (const j of stableIndexOrder) {\n if (j === i) continue;\n let hit = false;\n for (const owned of segments[j].ownedEventIds) {\n if (seg.parentEventIds.has(owned)) {\n hit = true;\n break;\n }\n }\n if (hit) {\n parentOf.set(i, j);\n break;\n }\n }\n });\n\n const depth = (start: number): number => {\n let d = 0;\n let cur = start;\n const seen = new Set<number>();\n for (;;) {\n if (seen.has(cur)) break;\n seen.add(cur);\n const p = parentOf.get(cur);\n if (p === undefined) break;\n cur = p;\n d += 1;\n }\n return d;\n };\n\n return segments\n .map((seg, i) => ({ seg, i, depth: depth(i) }))\n .sort((a, b) => {\n if (a.depth !== b.depth) return a.depth - b.depth;\n if (a.seg.minEpoch !== b.seg.minEpoch)\n return a.seg.minEpoch - b.seg.minEpoch;\n const pa = a.seg.platform ?? NO_PLATFORM;\n const pb = b.seg.platform ?? NO_PLATFORM;\n return pa < pb ? -1 : pa > pb ? 1 : 0;\n })\n .map((x) => x.seg);\n}\n\n/** Pick the originating entry record: earliest collector-in by wall-clock, else earliest record. */\nfunction pickEntry(records: FlowState[]): JourneyEntry {\n const collectorIns = records.filter(\n (r) => r.stepType === 'collector' && r.phase === 'in',\n );\n const pool = collectorIns.length > 0 ? collectorIns : records;\n\n let entryRec = pool[0];\n let best = toEpoch(entryRec.timestamp);\n for (const r of pool) {\n const ms = toEpoch(r.timestamp);\n if (ms < best) {\n best = ms;\n entryRec = r;\n }\n }\n\n const name = readEventName(entryRec.inEvent);\n return {\n eventId: entryRec.eventId,\n timestamp: entryRec.timestamp,\n ...(name !== undefined ? { name } : {}),\n ...(entryRec.sourceId !== undefined ? { sourceId: entryRec.sourceId } : {}),\n ...(entryRec.platform !== undefined ? { platform: entryRec.platform } : {}),\n };\n}\n\n/** Shared, journey-independent inputs threaded into each journey's assembly. */\ninterface AssembleContext {\n topo?: TopologyIndex;\n settleMs: number;\n now: number;\n gaps: JourneyGap[];\n}\n\n/** Assemble one correlation group (already sorted) into a Journey. */\nfunction assembleJourney(\n id: string,\n correlation: JourneyCorrelation,\n traceId: string | undefined,\n records: FlowState[],\n ctx: AssembleContext,\n): Journey {\n const { topo } = ctx;\n // Collapse per (platform, stepId).\n const hopGroups = new Map<string, FlowState[]>();\n for (const r of records) {\n const key = keyOf(r.platform, r.stepId);\n const group = hopGroups.get(key);\n if (group) group.push(r);\n else hopGroups.set(key, [r]);\n }\n const hops = [...hopGroups.values()].map(collapseHop);\n\n // Group hops into platform segments.\n const segmentMap = new Map<string, Segment>();\n for (const hop of hops) {\n const key = hop.platform ?? NO_PLATFORM;\n let seg = segmentMap.get(key);\n if (!seg) {\n seg = {\n ...(hop.platform !== undefined ? { platform: hop.platform } : {}),\n hops: [],\n ownedEventIds: new Set<string>(),\n parentEventIds: new Set<string>(),\n minEpoch: Number.POSITIVE_INFINITY,\n };\n segmentMap.set(key, seg);\n }\n seg.hops.push(hop);\n seg.ownedEventIds.add(hop.eventId);\n if (hop.parentEventId !== undefined)\n seg.parentEventIds.add(hop.parentEventId);\n seg.minEpoch = Math.min(seg.minEpoch, toEpoch(hop.timestamp));\n }\n\n const orderedSegments = orderSegments([...segmentMap.values()]);\n const orderedHops: JourneyHop[] = [];\n const platforms: JourneyPlatform[] = [];\n for (const seg of orderedSegments) {\n if (seg.platform !== undefined && !platforms.includes(seg.platform))\n platforms.push(seg.platform);\n for (const hop of orderWithinSegment(seg.hops, topo)) orderedHops.push(hop);\n }\n\n let firstTimestamp = Number.POSITIVE_INFINITY;\n let lastTimestamp = Number.NEGATIVE_INFINITY;\n for (const r of records) {\n const ms = toEpoch(r.timestamp);\n if (ms < firstTimestamp) firstTimestamp = ms;\n if (ms > lastTimestamp) lastTimestamp = ms;\n }\n\n const status = resolveStatus(\n orderedHops,\n platforms,\n lastTimestamp,\n topo,\n ctx.settleMs,\n ctx.now,\n );\n const lossy = isLossy(platforms, firstTimestamp, lastTimestamp, ctx.gaps);\n\n return {\n id,\n correlation,\n ...(traceId !== undefined ? { traceId } : {}),\n entry: pickEntry(records),\n hops: orderedHops,\n platforms,\n status,\n lossy,\n firstTimestamp,\n lastTimestamp,\n totalMs: lastTimestamp - firstTimestamp,\n };\n}\n\n/**\n * Pure assembly of raw `FlowState` records into cross-runtime journeys. The\n * function is idempotent (duplicate records are deduped first) and\n * deterministic (output does not depend on input order; `options.now` supplies\n * the settle reference so tests never depend on the wall clock). It resolves\n * completeness (`pending`/`complete`/`partial`) against the settle window and,\n * when supplied, the topology frontier; loss is detected from per-platform\n * `seq` gaps and surfaced both session-level (`gaps`) and per journey (`lossy`).\n * Journeys are returned oldest-first by `firstTimestamp`; presenters re-sort as\n * needed. Each call recomputes everything from the raw records (there is no\n * incremental mode), so callers that re-resolve status on a settle tick re-run\n * the whole pipeline and should memoize on their inputs.\n */\nexport function assembleJourneys(\n records: FlowState[],\n options?: AssembleJourneysOptions,\n): JourneyAssembly {\n const ctx: AssembleContext = {\n ...(options?.topology !== undefined\n ? { topo: indexTopology(options.topology) }\n : {}),\n settleMs: options?.settleMs ?? DEFAULT_SETTLE_MS,\n now: options?.now ?? Date.now(),\n gaps: [],\n };\n\n const deduped = dedupe(records);\n const sorted = [...deduped].sort(compareRecords);\n\n // Gaps are detected over all records (flush frames carry `seq` too, so keep\n // them here to preserve the poster's monotonic run) before any grouping.\n ctx.gaps = detectGaps(deduped);\n\n // Drop unusable traceless flush frames (empty eventId AND no traceId) so they\n // never spawn a junk `event:` journey. A flush frame WITH a traceId still\n // folds into its trace-matched journey; a traceless one carries nothing.\n const groupable = sorted.filter((r) => !(r.eventId === '' && !r.traceId));\n\n // Group into correlation groups: by traceId, else by eventId (legacy).\n interface Group {\n id: string;\n correlation: JourneyCorrelation;\n traceId?: string;\n records: FlowState[];\n }\n const groups = new Map<string, Group>();\n for (const r of groupable) {\n const trace = r.traceId ? r.traceId : undefined;\n const key = trace ? `trace${SEP}${trace}` : `event${SEP}${r.eventId}`;\n let group = groups.get(key);\n if (!group) {\n group = trace\n ? { id: trace, correlation: 'trace', traceId: trace, records: [] }\n : { id: `event:${r.eventId}`, correlation: 'legacy', records: [] };\n groups.set(key, group);\n }\n group.records.push(r);\n }\n\n const journeys = [...groups.values()].map((g) =>\n assembleJourney(g.id, g.correlation, g.traceId, g.records, ctx),\n );\n\n journeys.sort((a, b) => {\n if (a.firstTimestamp !== b.firstTimestamp)\n return a.firstTimestamp - b.firstTimestamp;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n });\n\n return { journeys, gaps: ctx.gaps };\n}\n","/**\n * Shared server-runtime holder for the active `traceUntil` value.\n *\n * The server trace-poller writes via `setTraceUntil`; the per-emit telemetry\n * supplier reads via `getTraceUntil` and passes the result to\n * `resolveTelemetryOptions`. The browser bundle does NOT use this module: it\n * keeps its own `traceUntil` variable inside its IIFE. Only\n * `resolveTelemetryOptions` is shared across platforms.\n */\nlet value: string | null = null;\n\nexport function getTraceUntil(): string | null {\n return value;\n}\n\nexport function setTraceUntil(v: string | null): void {\n value = v;\n}\n","import type { Collector } from './types';\nimport type { FlowState } from './types/telemetry';\n\n/**\n * Synchronously fans out a FlowState record to every registered observer\n * on the collector. Each call is wrapped in try/catch so a misbehaving\n * observer cannot crash the runtime; observers are advisory and must not\n * affect pipeline outcomes.\n *\n * Iterates a snapshot of the observer set so an observer adding or removing\n * another observer during the emit does not re-enter or skip in the same\n * pass. The early return on an empty set keeps the zero-observer hot path\n * allocation-free.\n */\nexport function emitStep(\n collector: Collector.Instance,\n state: FlowState,\n): void {\n if (collector.observers.size === 0) return;\n const snapshot = Array.from(collector.observers);\n for (const observer of snapshot) {\n try {\n observer(state);\n } catch {\n // Observers must never crash the pipeline.\n }\n }\n}\n","/**\n * Batched FlowState poster.\n *\n * Buffers FlowState records and flushes them to an HTTP endpoint either when\n * `batchMs` elapses since the first queued record, or when `batchSize` is\n * reached. Returns the emit callback that `createTelemetryObserver` consumes.\n *\n * Errors from the underlying fetch are swallowed (or routed through the\n * optional `onError` callback) so a transient observer outage cannot crash\n * the runtime.\n *\n * Uses the global `fetch` so the same primitive works in Node 18+, browsers,\n * and Edge runtimes. Tests may inject a stub via `opts.fetch`.\n */\nimport type { FlowState } from './types/telemetry';\n\n/**\n * Minimum HTTP response surface the poster touches. Anything that exposes\n * `ok` and `status` works. Decoupling from the DOM `Response` type lets the\n * helper run in Edge, browser, and Node-only test environments without\n * requiring `lib: dom` or a polyfill.\n */\nexport interface PosterResponse {\n ok: boolean;\n status: number;\n}\n\n/**\n * Minimum fetch surface the poster needs. A subset of `typeof fetch` that\n * lets test harnesses pass a plain async function without dragging in the\n * Response/Request DOM types.\n */\nexport type PosterFetch = (\n url: string,\n init: { method: string; headers: Record<string, string>; body: string },\n) => Promise<PosterResponse>;\n\n/**\n * UTF-8 byte length of a string. `String.length` counts UTF-16 code units,\n * which under-measures multi-byte content (CJK, emoji) against byte-based\n * body caps. Counted arithmetically rather than via TextEncoder because\n * jsdom-style sandboxes lack a TextEncoder global; the arithmetic matches\n * `TextEncoder().encode(str).length` exactly (unpaired surrogates count as\n * the 3-byte U+FFFD replacement, per WHATWG encoding).\n */\nfunction utf8ByteLength(str: string): number {\n let bytes = 0;\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code < 0x80) {\n bytes += 1;\n } else if (code < 0x800) {\n bytes += 2;\n } else if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n // Valid surrogate pair: one astral code point, 4 UTF-8 bytes.\n bytes += 4;\n i++;\n } else {\n bytes += 3;\n }\n } else {\n bytes += 3;\n }\n }\n return bytes;\n}\n\nexport interface BatchedPosterOptions {\n /** Absolute HTTP endpoint URL. POST with JSON array body. */\n url: string;\n /** Bearer token sent in the `Authorization` header. */\n token: string;\n /** Max time to wait before flushing the current batch. Default 50 ms. */\n batchMs?: number;\n /** Max records per batch. When reached, flushes immediately. Default 50. */\n batchSize?: number;\n /**\n * Max serialized body size in UTF-8 bytes (the wire size body caps are\n * enforced in). A batch whose JSON exceeds this is split in half\n * recursively until each chunk fits. Default 60000.\n */\n maxBodyBytes?: number;\n /** Test seam. Defaults to the global `fetch`. */\n fetch?: PosterFetch;\n /** Called when the underlying POST rejects. Defaults to swallowing. */\n onError?: (err: unknown) => void;\n}\n\n/**\n * Build a batched emit callback. The returned function is synchronous, never\n * throws, and schedules an async flush in the background.\n *\n * Concurrency model: a single in-memory buffer plus a single pending timer.\n * When the timer fires (or `batchSize` is hit) the buffer is moved into a\n * local variable and reset, then POSTed. New records arriving during the in-\n * flight POST land in the next batch.\n */\nexport function createBatchedPoster(\n opts: BatchedPosterOptions,\n): (state: FlowState) => void {\n // Narrow before use: nullish coalescing alone lets NaN, Infinity, 0, and\n // negatives through, all of which break setTimeout or starve the flush.\n // A garbage value falls back to the documented default rather than\n // clamping to the smallest legal step.\n const rawBatchMs = opts.batchMs;\n const batchMs =\n typeof rawBatchMs === 'number' &&\n Number.isFinite(rawBatchMs) &&\n rawBatchMs > 0\n ? Math.floor(rawBatchMs)\n : 50;\n\n const rawBatchSize = opts.batchSize;\n const batchSize =\n typeof rawBatchSize === 'number' &&\n Number.isFinite(rawBatchSize) &&\n rawBatchSize >= 1\n ? Math.floor(rawBatchSize)\n : 50;\n\n const rawMaxBodyBytes = opts.maxBodyBytes;\n const maxBodyBytes =\n typeof rawMaxBodyBytes === 'number' &&\n Number.isFinite(rawMaxBodyBytes) &&\n rawMaxBodyBytes >= 1\n ? Math.floor(rawMaxBodyBytes)\n : 60000;\n // Lazy lookup of the global `fetch` so the helper imports cleanly even in\n // environments without one (it only fails when actually used). The cast\n // is to the narrowed PosterFetch surface, not to a broader type.\n const fetchImpl: PosterFetch =\n opts.fetch ?? ((url, init) => (globalThis.fetch as PosterFetch)(url, init));\n const onError =\n opts.onError ??\n (() => {\n // swallow\n });\n\n let buffer: FlowState[] = [];\n let timer: ReturnType<typeof setTimeout> | null = null;\n let seq = 0;\n\n /**\n * Serialize a batch into byte-bounded JSON bodies, preserving order. Each\n * posted body is serialized exactly once: a batch that fits (or a single-\n * record leaf) returns its own probe serialization; only oversized parents\n * discard theirs before recursing into halves. A single record that alone\n * exceeds the limit is emitted as its own body anyway: the server rejects\n * it (413) and the resulting seq gap makes the loss visible, which is\n * preferable to silently dropping it here.\n */\n function splitToBodies(batch: FlowState[]): string[] {\n const body = JSON.stringify(batch);\n if (batch.length <= 1) return [body];\n if (utf8ByteLength(body) <= maxBodyBytes) return [body];\n const mid = Math.floor(batch.length / 2);\n return [\n ...splitToBodies(batch.slice(0, mid)),\n ...splitToBodies(batch.slice(mid)),\n ];\n }\n\n /**\n * POST one pre-serialized chunk body. Always resolves: non-2xx and\n * rejections are routed to onError so the sequential flush loop can\n * proceed to the next chunk.\n */\n function postChunk(body: string): Promise<void> {\n return Promise.resolve()\n .then(() =>\n fetchImpl(opts.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.token}`,\n },\n body,\n }),\n )\n .then((res) => {\n // 4xx/5xx is not an exception per fetch contract. Surface non-2xx\n // through onError so callers can record telemetry-of-telemetry,\n // but never throw out of this helper.\n if (res && typeof res === 'object' && 'ok' in res && !res.ok) {\n onError(new Error(`Observer responded ${res.status}`));\n }\n })\n .catch((err) => {\n onError(err);\n });\n }\n\n function flush(): void {\n if (buffer.length === 0) return;\n const batch = buffer;\n buffer = [];\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n const bodies = splitToBodies(batch);\n // Fire-and-forget. We deliberately do not await; the emit caller is\n // synchronous and a slow observer must not block the pipeline. Chunks\n // are POSTed sequentially (await previous before next) to preserve\n // arrival order at the observer.\n void (async () => {\n for (const body of bodies) {\n await postChunk(body);\n }\n })();\n }\n\n return (state: FlowState): void => {\n // Stamp a monotonic seq for gap detection. Spread-copy rather than mutate:\n // the emit callback is public and a caller may hand over a shared object.\n // Failed POSTs are never re-sequenced, so a lost record leaves a seq gap.\n buffer.push({ ...state, seq: ++seq });\n if (buffer.length >= batchSize) {\n flush();\n return;\n }\n if (timer === null) {\n timer = setTimeout(flush, batchMs);\n }\n };\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Parses a user agent string to extract browser, OS, and device information.\n *\n * @param userAgent The user agent string to parse.\n * @returns An object containing the parsed user agent information.\n */\nexport function parseUserAgent(userAgent?: string): WalkerOS.User {\n if (!userAgent) return {};\n\n return {\n userAgent,\n browser: getBrowser(userAgent),\n browserVersion: getBrowserVersion(userAgent),\n os: getOS(userAgent),\n osVersion: getOSVersion(userAgent),\n deviceType: getDeviceType(userAgent),\n };\n}\n\n/**\n * Gets the browser name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser name or undefined.\n */\nexport function getBrowser(userAgent: string): string | undefined {\n const browsers = [\n { name: 'Edge', substr: 'Edg' },\n { name: 'Chrome', substr: 'Chrome' },\n { name: 'Safari', substr: 'Safari', exclude: 'Chrome' },\n { name: 'Firefox', substr: 'Firefox' },\n { name: 'IE', substr: 'MSIE' },\n { name: 'IE', substr: 'Trident' },\n ];\n\n for (const browser of browsers) {\n if (\n userAgent.includes(browser.substr) &&\n (!browser.exclude || !userAgent.includes(browser.exclude))\n ) {\n return browser.name;\n }\n }\n\n return;\n}\n\n/**\n * Gets the browser version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser version or undefined.\n */\nexport function getBrowserVersion(userAgent: string): string | undefined {\n const rules = [\n /Edg\\/([0-9]+)/, // Edge\n /Chrome\\/([0-9]+)/, // Chrome\n /Version\\/([0-9]+).*Safari/, // Safari\n /Firefox\\/([0-9]+)/, // Firefox\n /MSIE ([0-9]+)/, // IE 10 and older\n /rv:([0-9]+).*Trident/, // IE 11\n ];\n\n for (const regex of rules) {\n const match = userAgent.match(regex);\n if (match) {\n return match[1];\n }\n }\n\n return;\n}\n\n/**\n * Gets the OS name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS name or undefined.\n */\nexport function getOS(userAgent: string): string | undefined {\n const osList = [\n { name: 'Windows', substr: 'Windows NT' },\n { name: 'macOS', substr: 'Mac OS X' },\n { name: 'Android', substr: 'Android' },\n { name: 'iOS', substr: 'iPhone OS' },\n { name: 'Linux', substr: 'Linux' },\n ];\n\n for (const os of osList) {\n if (userAgent.includes(os.substr)) {\n return os.name;\n }\n }\n\n return;\n}\n\n/**\n * Gets the OS version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS version or undefined.\n */\nexport function getOSVersion(userAgent: string): string | undefined {\n const osVersionRegex = /(?:Windows NT|Mac OS X|Android|iPhone OS) ([0-9._]+)/;\n const match = userAgent.match(osVersionRegex);\n return match ? match[1].replace(/_/g, '.') : undefined;\n}\n\n/**\n * Gets the device type from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The device type or undefined.\n */\nexport function getDeviceType(userAgent: string): string | undefined {\n let deviceType = 'Desktop';\n\n if (/Tablet|iPad/i.test(userAgent)) {\n deviceType = 'Tablet';\n } else if (\n /Mobi|Android|iPhone|iPod|BlackBerry|Opera Mini|IEMobile|WPDesktop/i.test(\n userAgent,\n )\n ) {\n deviceType = 'Mobile';\n }\n\n return deviceType;\n}\n","/**\n * Inline Code Wrapping Utilities\n *\n * Converts inline code strings to executable functions for the three mapping\n * callbacks: condition, fn, validate. All three share a single signature:\n *\n * (value, context) => result\n *\n * Inside the inline body, the available bindings are:\n * - value: unknown - the value being mapped/validated/checked\n * - context: Mapping.Context with these fields:\n * event: WalkerOS.DeepPartialEvent\n * mapping: Mapping.Value | Mapping.Rule\n * collector: Collector.Instance\n * logger: Logger.Instance\n * consent?: WalkerOS.Consent\n *\n * If the body has no explicit `return`, it is auto-wrapped with `return`.\n *\n * @packageDocumentation\n */\n\nimport type { Mapping } from './types';\n\nfunction hasReturn(code: string): boolean {\n return /\\breturn\\b/.test(code);\n}\n\nfunction wrapCode(code: string): string {\n return hasReturn(code) ? code : `return ${code}`;\n}\n\n/**\n * Wrap inline code as a Mapping.Condition.\n *\n * @example\n * ```ts\n * const c = wrapCondition('context.consent?.marketing === true');\n * c(value, context); // boolean\n * ```\n */\nexport function wrapCondition(code: string): Mapping.Condition {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'context', body) as Mapping.Condition;\n}\n\n/**\n * Wrap inline code as a Mapping.Fn.\n *\n * @example\n * ```ts\n * const fn = wrapFn('value.user.email.split(\"@\")[1]');\n * fn(value, context); // domain\n * ```\n */\nexport function wrapFn(code: string): Mapping.Fn {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'context', body) as Mapping.Fn;\n}\n\n/**\n * Wrap inline code as a Mapping.Validate.\n *\n * @example\n * ```ts\n * const v = wrapValidate('typeof value === \"string\" && value.length > 0');\n * v(value, context); // boolean\n * ```\n */\nexport function wrapValidate(code: string): Mapping.Validate {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'context', body) as Mapping.Validate;\n}\n","const JSDELIVR_BASE = 'https://cdn.jsdelivr.net/npm';\nconst DEFAULT_SCHEMA_PATH = 'dist/walkerOS.json';\n\nfunction parsePlatform(value: unknown): string | string[] | undefined {\n if (typeof value === 'string') return value;\n if (Array.isArray(value) && value.every((v) => typeof v === 'string'))\n return value as string[];\n return undefined;\n}\n\nexport interface ExampleSummary {\n name: string;\n description?: string;\n}\n\nexport interface WalkerOSPackageMeta {\n packageName: string;\n version: string;\n description?: string;\n type?: string;\n platform?: string | string[];\n}\n\nexport interface WalkerOSPackageInfo {\n packageName: string;\n version: string;\n type?: string;\n platform?: string | string[];\n schemas: Record<string, unknown>;\n examples: Record<string, unknown>;\n hints?: Record<string, unknown>;\n}\n\nexport interface WalkerOSPackage extends WalkerOSPackageInfo {\n description?: string;\n docs?: string;\n source?: string;\n hintKeys: string[];\n exampleSummaries: ExampleSummary[];\n}\n\n/**\n * Local mirror of the app's `PackageDetailResult` shape for `expand=all`\n * responses. Decoupled from the app intentionally — `core` does not import\n * from `app`. Only the fields read by `shapeFromDetail` are typed.\n */\ninterface UnifiedPackageResponse {\n package: string;\n version: string;\n description?: string;\n type?: string;\n platform?: string[];\n docs?: string;\n source?: string;\n schemas?: Record<string, unknown>;\n hints?: Record<string, unknown>;\n hintKeys?: string[];\n exampleSummaries?: ExampleSummary[];\n examples?: Record<string, unknown>;\n}\n\nexport async function fetchPackage(\n packageName: string,\n options?: {\n version?: string;\n timeout?: number;\n baseUrl?: string;\n client?: string;\n },\n): Promise<WalkerOSPackage> {\n const ver = options?.version || 'latest';\n const timeoutMs = options?.timeout || 10000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const signal = controller.signal;\n const headers = options?.client\n ? { 'X-Walkeros-Client': options.client }\n : undefined;\n\n try {\n if (options?.baseUrl) {\n // Single round-trip via the unified detail endpoint\n // (`expand=all` returns hints + examples in one shot).\n const url = `${options.baseUrl}/api/packages/${encodeURIComponent(packageName)}?version=${encodeURIComponent(ver)}&expand=all`;\n const res = await fetch(url, { signal, ...(headers && { headers }) });\n if (!res.ok)\n throw new Error(`Failed to fetch ${url} (HTTP ${res.status})`);\n const detail = (await res.json()) as UnifiedPackageResponse;\n return shapeFromDetail(packageName, ver, detail);\n }\n\n // Direct jsdelivr fallback (offline-safe path) — keep two-fetch.\n const base = `${JSDELIVR_BASE}/${packageName}@${ver}`;\n const pkg = await fetchJson(`${base}/package.json`, signal, headers);\n const walkerOSJson = await fetchJson(\n `${base}/${DEFAULT_SCHEMA_PATH}`,\n signal,\n headers,\n );\n return parsePackage(packageName, ver, pkg, walkerOSJson);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction shapeFromDetail(\n packageName: string,\n ver: string,\n detail: UnifiedPackageResponse,\n): WalkerOSPackage {\n const schemas = (detail.schemas as Record<string, unknown> | undefined) || {};\n const examples =\n (detail.examples as Record<string, unknown> | undefined) || {};\n const hints = detail.hints;\n const hintKeys = detail.hintKeys ?? (hints ? Object.keys(hints) : []);\n const exampleSummaries = detail.exampleSummaries ?? [];\n const platform = detail.platform;\n\n return {\n packageName: detail.package || packageName,\n version: typeof detail.version === 'string' ? detail.version : ver,\n ...(detail.description !== undefined && {\n description: detail.description,\n }),\n ...(detail.type !== undefined && { type: detail.type }),\n ...(platform !== undefined && { platform }),\n schemas,\n examples,\n ...(detail.docs !== undefined && { docs: detail.docs }),\n ...(detail.source !== undefined && { source: detail.source }),\n ...(hints && Object.keys(hints).length > 0 ? { hints } : {}),\n hintKeys,\n exampleSummaries,\n };\n}\n\nasync function fetchJson(\n url: string,\n signal: AbortSignal,\n headers?: Record<string, string>,\n): Promise<Record<string, unknown>> {\n const res = await fetch(url, { signal, ...(headers && { headers }) });\n if (!res.ok) throw new Error(`Failed to fetch ${url} (HTTP ${res.status})`);\n return (await res.json()) as Record<string, unknown>;\n}\n\nfunction parsePackage(\n packageName: string,\n ver: string,\n pkg: Record<string, unknown>,\n walkerOSJson: Record<string, unknown>,\n): WalkerOSPackage {\n const meta = (walkerOSJson.$meta as Record<string, unknown>) || {};\n const schemas = (walkerOSJson.schemas as Record<string, unknown>) || {};\n const examples = (walkerOSJson.examples as Record<string, unknown>) || {};\n const hints = walkerOSJson.hints as Record<string, unknown> | undefined;\n const hintKeys = hints ? Object.keys(hints) : [];\n\n const exampleSummaries: ExampleSummary[] = [];\n const stepExamples = (examples.step || {}) as Record<string, unknown>;\n for (const [name, example] of Object.entries(stepExamples)) {\n const ex = example as Record<string, unknown> | undefined;\n const summary: ExampleSummary = { name };\n if (typeof ex?.description === 'string')\n summary.description = ex.description;\n exampleSummaries.push(summary);\n }\n\n const docs = typeof meta.docs === 'string' ? meta.docs : undefined;\n const source = typeof meta.source === 'string' ? meta.source : undefined;\n\n return {\n packageName,\n version: typeof pkg.version === 'string' ? pkg.version : ver,\n description:\n typeof pkg.description === 'string' ? pkg.description : undefined,\n type: typeof meta.type === 'string' ? meta.type : undefined,\n platform: parsePlatform(meta.platform),\n schemas,\n examples,\n ...(docs ? { docs } : {}),\n ...(source ? { source } : {}),\n ...(hints && Object.keys(hints).length > 0 ? { hints } : {}),\n hintKeys,\n exampleSummaries,\n };\n}\n\n/**\n * @deprecated Use fetchPackage instead.\n * Still used by: entry.ts (validator), package-schemas.ts (MCP resource).\n */\nexport async function fetchPackageSchema(\n packageName: string,\n options?: {\n version?: string;\n timeout?: number;\n baseUrl?: string;\n client?: string;\n },\n): Promise<WalkerOSPackageInfo> {\n const pkg = await fetchPackage(packageName, options);\n return {\n packageName: pkg.packageName,\n version: pkg.version,\n type: pkg.type,\n platform: pkg.platform,\n schemas: pkg.schemas,\n examples: pkg.examples,\n ...(pkg.hints ? { hints: pkg.hints } : {}),\n };\n}\n","import type { Destination } from './types';\n\n/**\n * Env key under which the collector injects the observe-mode call recorder\n * (`Destination.EnvObserve`) into a per-push env. The resolution-point wrapper\n * strips this key before handing the env to the destination.\n */\nexport const OBSERVE_ENV_KEY = 'observe' as const;\n\n/**\n * Structural guard for `Destination.EnvObserve`: an object whose `paths` is a\n * string array and whose `record` is a function. Extra keys are tolerated.\n */\nexport function isEnvObserve(value: unknown): value is Destination.EnvObserve {\n if (typeof value !== 'object' || value === null) return false;\n if (!('paths' in value) || !('record' in value)) return false;\n const { paths, record } = value;\n return (\n Array.isArray(paths) &&\n paths.every((path) => typeof path === 'string') &&\n typeof record === 'function'\n );\n}\n\n/**\n * Prefix marking a dot-path as a recordable call. Only this literal prefix is\n * stripped; a `<word>:` that is not `call:` stays part of the path (`wrapEnv`\n * parity).\n */\nconst CALL_PREFIX = 'call:';\n\n/**\n * Parse a `simulation`/`calls` dot-path into segments, sharing one grammar with\n * `wrapEnv` so the two capture layers cannot drift. Strips a single leading\n * `call:` prefix (only the literal `call:`, never any other `<word>:`), then\n * splits on `.`. An empty path or any empty segment (leading, trailing, or\n * consecutive dots) is unresolvable and yields `[]`.\n */\nexport function parseCallPath(raw: string): string[] {\n const path = raw.startsWith(CALL_PREFIX)\n ? raw.slice(CALL_PREFIX.length)\n : raw;\n const segments = path.split('.');\n if (segments.some((segment) => segment === '')) return [];\n return segments;\n}\n","export function mcpResult(\n result: unknown,\n hints?: { next?: string[]; warnings?: string[] },\n) {\n const enriched = hints\n ? { ...(result as Record<string, unknown>), _hints: hints }\n : result;\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(enriched, null, 2),\n },\n ],\n structuredContent: enriched as Record<string, unknown>,\n };\n}\n\nexport function mcpError(error: unknown, hint?: string) {\n let message: string;\n let path: string | undefined;\n let code: string | undefined;\n let details: unknown[] | undefined;\n\n if (error instanceof Error) {\n message = error.message;\n // Detect ApiError (has code and/or details properties)\n const err = error as Error & { code?: string; details?: unknown[] };\n if (err.code) code = err.code;\n if (Array.isArray(err.details)) details = err.details;\n } else if (typeof error === 'string') {\n message = error;\n } else if (\n error &&\n typeof error === 'object' &&\n 'issues' in error &&\n Array.isArray((error as { issues: unknown[] }).issues)\n ) {\n const issues = (\n error as { issues: Array<{ path?: unknown[]; message: string }> }\n ).issues;\n message = issues.map((i) => i.message).join('; ');\n path = issues[0]?.path?.join('.') || undefined;\n } else if (error && typeof error === 'object' && 'message' in error) {\n message = String((error as { message: unknown }).message);\n } else {\n message = 'Unknown error';\n }\n\n const structured: Record<string, unknown> = { error: message };\n if (hint) structured.hint = hint;\n if (path) structured.path = path;\n if (code) structured.code = code;\n if (details) structured.details = details;\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(structured),\n },\n ],\n structuredContent: structured,\n isError: true as const,\n };\n}\n","/**\n * Options for responding to an HTTP request.\n * Same interface for web and server — sources implement the handler.\n */\nexport interface RespondOptions {\n /** Response body. Objects are JSON-serialized by source. */\n body?: unknown;\n /** HTTP status code (default: 200). Server-only, ignored by web sources. */\n status?: number;\n /** HTTP response headers. Server-only, ignored by web sources. */\n headers?: Record<string, string>;\n}\n\n/**\n * Standardized response function available on env for every step.\n * Idempotent: first call wins, subsequent calls are no-ops.\n * Created by sources via createRespond(), consumed by any step.\n */\nexport type RespondFn = (options?: RespondOptions) => void;\n\n/**\n * Creates an idempotent respond function.\n * The sender callback is source-specific (Express wraps res, Fetch wraps Response, etc.).\n *\n * @param sender - Platform-specific function that actually sends the response\n * @returns Idempotent respond function (first call wins)\n */\nexport function createRespond(\n sender: (options: RespondOptions) => void,\n): RespondFn {\n let called = false;\n return (options: RespondOptions = {}) => {\n if (called) return;\n called = true;\n sender(options);\n };\n}\n","import type {\n MatchExpression,\n MatchCondition,\n MatchOperator,\n CompiledMatcher,\n} from './types/matcher';\nimport { getByPath } from './byPath';\n\n/**\n * Compiles a match expression into a closure for fast runtime evaluation.\n * Regex patterns are compiled once. Numeric comparisons are parsed once.\n * Runtime evaluation is pure function calls with short-circuit logic.\n */\nexport function compileMatcher(\n expr: MatchExpression | '*' | undefined,\n): CompiledMatcher {\n if (expr === undefined || expr === '*') return () => true;\n\n if ('and' in expr) {\n const fns = expr.and.map(compileMatcher);\n return (ingest) => fns.every((fn) => fn(ingest));\n }\n\n if ('or' in expr) {\n const fns = expr.or.map(compileMatcher);\n return (ingest) => fns.some((fn) => fn(ingest));\n }\n\n // Leaf condition\n return compileCondition(expr);\n}\n\nfunction compileCondition(condition: MatchCondition): CompiledMatcher {\n const { key, operator, value, not } = condition;\n const test = compileOperator(operator, value);\n\n return (context) => {\n const raw = getByPath(context, key);\n const result = test(raw);\n return not ? !result : result;\n };\n}\n\nfunction compileOperator(\n operator: MatchOperator,\n value: string,\n): (input: unknown) => boolean {\n switch (operator) {\n case 'eq':\n return (input) => String(input ?? '') === value;\n case 'contains':\n return (input) => String(input ?? '').includes(value);\n case 'prefix':\n return (input) => String(input ?? '').startsWith(value);\n case 'suffix':\n return (input) => String(input ?? '').endsWith(value);\n case 'regex': {\n const re = new RegExp(value);\n return (input) => re.test(String(input ?? ''));\n }\n case 'gt': {\n const num = Number(value);\n return (input) => Number(input) > num;\n }\n case 'lt': {\n const num = Number(value);\n return (input) => Number(input) < num;\n }\n case 'exists':\n return (input) => input !== undefined && input !== null;\n }\n}\n","import type { Route, RouteConfig } from './types/transformer';\nimport type { CompiledMatcher } from './types/matcher';\nimport { compileMatcher } from './matcher';\n\n/**\n * Internal: compiled route data. Not exported from the package's public\n * surface (`@walkeros/core`), but exported here so adjacent test files\n * inside the core package can probe compilation.\n */\nexport interface CompiledRoute {\n match: CompiledMatcher;\n next: CompiledNext;\n}\n\nexport type CompiledNext =\n | { type: 'static'; value: string }\n | { type: 'chain'; value: string[] }\n | { type: 'one'; routes: CompiledRoute[] }\n | { type: 'many'; routes: CompiledRoute[] }\n | { type: 'gate'; match: CompiledMatcher; next?: CompiledNext }\n | { type: 'sequence'; value: CompiledNext[] };\n\nexport function isRouteConfigEntry(entry: unknown): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n !Array.isArray(entry) &&\n ('match' in entry || 'next' in entry || 'one' in entry || 'many' in entry)\n );\n}\n\n/**\n * Pure RouteConfig array — every element is a RouteConfig object.\n * Used to detect the legacy first-match shape (treated as implicit `one`).\n */\nexport function isRouteArray(next: Route): next is RouteConfig[] {\n return (\n Array.isArray(next) &&\n next.length > 0 &&\n next.every((entry) => isRouteConfigEntry(entry))\n );\n}\n\nfunction compileRoutes(entries: Route[]): CompiledRoute[] {\n return entries.map((entry) => {\n if (typeof entry === 'string') {\n return { match: () => true, next: { type: 'static', value: entry } };\n }\n if (Array.isArray(entry)) {\n return {\n match: () => true,\n next: compileNext(entry) ?? { type: 'chain', value: [] },\n };\n }\n const e = entry as RouteConfig;\n return {\n match: e.match ? compileMatcher(e.match) : () => true,\n next: compileNext(e) ?? { type: 'chain', value: [] },\n };\n });\n}\n\nexport function compileNext(next: Route | undefined): CompiledNext | undefined {\n if (next === undefined || next === null) return undefined;\n if (typeof next === 'string') return { type: 'static', value: next };\n\n if (Array.isArray(next)) {\n if (next.length === 0) return undefined;\n if (isRouteArray(next)) {\n // Pure RouteConfig[] — legacy first-match shape, treat as implicit { one: [...] }\n return compileNext({ one: next as RouteConfig[] });\n }\n if (next.every((entry) => typeof entry === 'string')) {\n // Pure string[] — static chain\n return { type: 'chain', value: next as string[] };\n }\n // Mixed array (strings + RouteConfig objects, possibly nested arrays) —\n // sequence form: each segment resolves independently, results concatenated.\n const segments: CompiledNext[] = [];\n for (const entry of next) {\n const compiled = compileNext(entry);\n if (compiled !== undefined) segments.push(compiled);\n }\n if (segments.length === 0) return undefined;\n return { type: 'sequence', value: segments };\n }\n\n // RouteConfig\n const cfg = next as RouteConfig;\n if ('next' in cfg && cfg.next !== undefined) {\n // next operator (optionally gated)\n if (cfg.match) {\n return {\n type: 'gate',\n match: compileMatcher(cfg.match),\n next: compileNext(cfg.next),\n };\n }\n return compileNext(cfg.next);\n }\n if ('one' in cfg && cfg.one) {\n const routes = compileRoutes(cfg.one);\n if (cfg.match) {\n // outer gate around the one\n return {\n type: 'gate',\n match: compileMatcher(cfg.match),\n next: { type: 'one', routes },\n };\n }\n return { type: 'one', routes };\n }\n if ('many' in cfg && cfg.many) {\n const routes = compileRoutes(cfg.many);\n if (cfg.match) {\n // outer gate around the many\n return {\n type: 'gate',\n match: compileMatcher(cfg.match),\n next: { type: 'many', routes },\n };\n }\n return { type: 'many', routes };\n }\n // Bare gate { match } — no next/one/many\n if (cfg.match) {\n return { type: 'gate', match: compileMatcher(cfg.match) };\n }\n\n return undefined;\n}\n\nconst compileCache = new WeakMap<object, CompiledNext>();\n\n/**\n * Resolve a Route spec against a matcher context. Returns the immediate\n * next transformer IDs.\n *\n * Return shape:\n * [] → terminate (gate failed, empty many, all matchers failed,\n * undefined spec).\n * [\"x\"] → continue main chain at x.\n * [\"a\",\"b\",…] → fan-out, only produced by `many`. Main chain terminates\n * at this dispatch point; each branch is an independent\n * flow running to its own exit.\n *\n * Reachability vs prediction: `match` rules read arbitrary event fields.\n * `getNextSteps` is deterministic for the SUPPLIED context only. Static\n * analyzers without a real event must over-approximate by treating each\n * match as \"may pass or fail\" — see `flattenRouteTargets` in the CLI\n * validator. This function does NOT predict the path a future event will\n * take; it computes the path for the event you give it.\n */\nexport function getNextSteps(\n spec: Route | undefined,\n context: Record<string, unknown> = {},\n): string[] {\n if (spec === undefined || spec === null) return [];\n let compiled: CompiledNext | undefined;\n if (typeof spec === 'object') {\n const cached = compileCache.get(spec);\n if (cached) {\n compiled = cached;\n } else {\n compiled = compileNext(spec);\n if (compiled) compileCache.set(spec, compiled);\n }\n } else {\n compiled = compileNext(spec);\n }\n if (!compiled) return [];\n const resolved = resolveNext(compiled, context);\n if (resolved === undefined) return [];\n return Array.isArray(resolved) ? resolved : [resolved];\n}\n\nexport function resolveNext(\n compiled: CompiledNext | undefined,\n context: Record<string, unknown> = {},\n): string | string[] | undefined {\n if (!compiled) return undefined;\n if (compiled.type === 'static') return compiled.value;\n if (compiled.type === 'chain') return compiled.value;\n if (compiled.type === 'gate') {\n if (!compiled.match(context)) return undefined; // gate failed → fall through\n return resolveNext(compiled.next, context);\n }\n if (compiled.type === 'sequence') {\n const ids: string[] = [];\n for (const segment of compiled.value) {\n const resolved = resolveNext(segment, context);\n if (resolved === undefined) continue;\n if (Array.isArray(resolved)) ids.push(...resolved);\n else ids.push(resolved);\n }\n return ids.length > 0 ? ids : undefined;\n }\n if (compiled.type === 'many') {\n const ids: string[] = [];\n for (const route of compiled.routes) {\n if (!route.match(context)) continue;\n const inner = resolveNext(route.next, context);\n if (inner === undefined) continue;\n if (Array.isArray(inner)) ids.push(...inner);\n else ids.push(inner);\n }\n return ids.length > 0 ? ids : undefined;\n }\n // one: first-match dispatch\n for (const route of compiled.routes) {\n if (route.match(context)) {\n return resolveNext(route.next, context);\n }\n }\n return undefined;\n}\n","import type { StoreValue } from './types/store';\n\n/**\n * Shared cache envelope used by BOTH cache mechanisms (the event cache in\n * `./cache.ts` and the store-cache wrapper in\n * `@walkeros/collector/store-cache-wrapper`). A cached value is wrapped in a\n * plain `{value, exp}` structured object, not a Buffer: the backing store\n * serializes it through the shared store codec (`./store/codec`), so any\n * structured store can persist it byte-exact, and a TTL-native tier\n * (in-memory `__cache`, Redis) can additionally evict via the `ttl` arg.\n *\n * The envelope owns expiry interpretation, not the store contract:\n * `StoreValue` carries no TTL field. The physical envelope keys are\n * namespaced (`__walkeros_cache_v__` / `__walkeros_cache_exp__`) so a user\n * value that happens to be shaped `{ value, exp }` is never mistaken for an\n * envelope, and conversely a wrapped envelope is unambiguous on read.\n */\n\nconst ENVELOPE_VALUE = '__walkeros_cache_v__';\nconst ENVELOPE_EXP = '__walkeros_cache_exp__';\n\n/** A wrapped cache envelope as it is persisted into the backing store. */\nexport type CacheEnvelope = {\n [ENVELOPE_VALUE]: StoreValue;\n [ENVELOPE_EXP]?: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, StoreValue> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Wrap a value in a `{value, exp}` envelope. When `ttlMs` is given, `exp` is\n * `now() + ttlMs`; when omitted, `exp` is left off entirely (no expiry).\n *\n * `now` is injectable so tests do not depend on ambient wall-clock time;\n * production callers omit it and the helper falls back to `Date.now`.\n */\nexport function wrapCacheEnvelope(\n value: StoreValue,\n ttlMs?: number,\n now: () => number = Date.now,\n): CacheEnvelope {\n const envelope: CacheEnvelope = { [ENVELOPE_VALUE]: value };\n if (ttlMs !== undefined) envelope[ENVELOPE_EXP] = now() + ttlMs;\n return envelope;\n}\n\n/**\n * Read a stored envelope. Returns:\n * - `undefined` when the key is absent (`stored === undefined`).\n * - `{ expired: true }` when the envelope's `exp` has elapsed (caller should\n * best-effort purge and treat as a MISS).\n * - `{ value }` otherwise.\n *\n * A stored value that is not a recognizable envelope (a raw live value, e.g.\n * a TTL-native tier that holds the value by reference, or a legacy entry) is\n * returned verbatim as `{ value: stored }`, so a non-enveloped HIT degrades\n * gracefully rather than being dropped.\n */\nexport function readCacheEnvelope(\n stored: StoreValue | undefined,\n now: () => number = Date.now,\n): { value: StoreValue } | { expired: true } | undefined {\n if (stored === undefined) return undefined;\n if (!isRecord(stored) || !(ENVELOPE_VALUE in stored))\n return { value: stored };\n\n const exp = stored[ENVELOPE_EXP];\n if (typeof exp === 'number' && now() > exp) return { expired: true };\n return { value: stored[ENVELOPE_VALUE] };\n}\n","import type { StoreValue } from '../types/store';\n\n/**\n * Shared structured codec for store values.\n *\n * Stateless, format-only: serializes a `StoreValue` to a UTF-8 JSON byte\n * payload and restores it, with no store-type branches. Binary leaves are\n * tagged base64 behind a reserved marker; user objects that happen to carry\n * the marker are escaped, so NO payload can be corrupted. On the store path\n * binary always decodes back to a platform-neutral `Uint8Array`, never a Node\n * `Buffer`.\n */\n\nconst CACHE_MARKER = '__walkeros_cache__';\n\n/**\n * Thrown when a value cannot be serialized (e.g. a cyclic structure that\n * `JSON.stringify` rejects). Catchable and distinguishable from a raw\n * `TypeError` leaking out of the platform JSON implementation.\n */\nexport class StoreCodecError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'StoreCodecError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// Precondition: the input is acyclic JSON-shaped data; binary leaves are the\n// only non-JSON values handled. A Node `Buffer`, any `Uint8Array` (e.g. a\n// Fetch-sourced body), and a raw `ArrayBuffer` all normalize to the same\n// base64 'buffer' tag and decode back through the caller-supplied binary\n// factory (see fromSerializableWith). A `Buffer` IS a `Uint8Array`, but under\n// split realms (jsdom test env) a Node `Buffer` fails the `instanceof\n// Uint8Array` check against the realm's `Uint8Array`, so the realm-independent\n// `Buffer.isBuffer` check stays FIRST. The `Uint8Array` branch then handles\n// typed-array views by slicing on byteOffset/byteLength so a subarray view\n// contributes only its own bytes.\nfunction toSerializable(value: unknown): unknown {\n if (Buffer.isBuffer(value))\n return { [CACHE_MARKER]: 'buffer', d: value.toString('base64') };\n if (value instanceof Uint8Array)\n return {\n [CACHE_MARKER]: 'buffer',\n d: Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\n 'base64',\n ),\n };\n if (value instanceof ArrayBuffer)\n return {\n [CACHE_MARKER]: 'buffer',\n d: Buffer.from(value).toString('base64'),\n };\n if (Array.isArray(value)) return value.map(toSerializable);\n if (isRecord(value)) {\n if (CACHE_MARKER in value) {\n const inner: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) inner[k] = toSerializable(v);\n return { [CACHE_MARKER]: 'escape', d: inner };\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = toSerializable(v);\n return out;\n }\n return value;\n}\n\n/**\n * Single traversal that restores the serialized form. The binary-leaf type is\n * supplied by the caller via `toBinary`; the store path constructs a plain\n * `Uint8Array`. Parametrizing the leaf factory keeps one implementation of the\n * walk while leaving the binary representation to the caller.\n */\nfunction fromSerializableWith(\n value: unknown,\n toBinary: (buf: Buffer) => Uint8Array,\n): unknown {\n if (isRecord(value)) {\n if (CACHE_MARKER in value) {\n const tag = value[CACHE_MARKER];\n const data = value.d;\n if (tag === 'buffer' && typeof data === 'string')\n return toBinary(Buffer.from(data, 'base64'));\n if (tag === 'escape' && isRecord(data)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data))\n out[k] = fromSerializableWith(v, toBinary);\n return out;\n }\n // Unrecognized tag (not 'buffer'/'escape'): fall through to default\n // object traversal so a user object that merely carries the marker key,\n // or a value from a future tag version, is preserved verbatim rather\n // than coerced.\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value))\n out[k] = fromSerializableWith(v, toBinary);\n return out;\n }\n if (Array.isArray(value))\n return value.map((v) => fromSerializableWith(v, toBinary));\n return value;\n}\n\n// Store path: binary leaves become a plain, platform-neutral Uint8Array (a\n// standalone view over the exact decoded bytes), never a Node Buffer.\nfunction toStoreBinary(buf: Buffer): Uint8Array {\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n}\n\n/**\n * Recursive type guard: the restored value is structurally a `StoreValue`.\n * The single restore walk (`fromSerializableWith`) is JSON-derived plus\n * `Uint8Array` binary leaves, so this always holds; the guard makes the\n * narrowing explicit and cast-free at the public boundary.\n *\n * The guard accepts exactly what the serializer can encode. An `undefined`\n * object property is dropped and an `undefined` array element becomes `null`\n * on `JSON.stringify`, so an `undefined` nested value does NOT disqualify the\n * containing value (matching the serializer's runtime tolerance at the\n * `unknown -> StoreValue` boundary). The `StoreValue` TYPE still excludes\n * `undefined`; this only mirrors what survives serialization.\n */\nfunction isStoreValue(value: unknown): value is StoreValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value instanceof Uint8Array\n )\n return true;\n if (Array.isArray(value))\n return value.every((v) => v === undefined || isStoreValue(v));\n if (isRecord(value))\n return Object.values(value).every(\n (v) => v === undefined || isStoreValue(v),\n );\n return false;\n}\n\n/**\n * Serialize a `StoreValue` to its UTF-8 JSON byte payload. Throws\n * `StoreCodecError` if the value cannot be encoded (e.g. a cyclic structure).\n */\nexport function serializeStoreValue(value: StoreValue): Uint8Array {\n let json: string;\n try {\n json = JSON.stringify(toSerializable(value));\n } catch (cause) {\n throw new StoreCodecError(\n 'Failed to serialize store value (likely a cyclic structure).',\n { cause },\n );\n }\n return new Uint8Array(Buffer.from(json, 'utf8'));\n}\n\n/**\n * Restore a `StoreValue` from its UTF-8 JSON byte payload (or a JSON string).\n */\nexport function deserializeStoreValue(raw: Uint8Array | string): StoreValue {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n const restored = fromSerializableWith(JSON.parse(text), toStoreBinary);\n if (!isStoreValue(restored))\n throw new StoreCodecError('Restored value is not a valid StoreValue.');\n return restored;\n}\n\n// Internal format helpers shared with the cache envelope codec (cache.ts) so\n// there is exactly one implementation of the structured transform.\n// `isStoreValue` lets boundary callers (the event cache) narrow a wide\n// `unknown` payload to `StoreValue` without a cast before wrapping it.\nexport {\n toSerializable,\n fromSerializableWith,\n CACHE_MARKER,\n isRecord,\n isStoreValue,\n};\n","import type { Cache, EventCacheRule } from './types/cache';\nimport type { Collector, Mapping, Store } from './types';\nimport type { StoreValue } from './types/store';\nimport type { CompiledMatcher } from './types/matcher';\nimport { compileMatcher } from './matcher';\nimport { getByPath, setByPath } from './byPath';\nimport { getMappingValue } from './mapping';\nimport { wrapCacheEnvelope, readCacheEnvelope } from './cache-envelope';\nimport { isStoreValue } from './store/codec';\n\ninterface CompiledCacheRule {\n match: CompiledMatcher;\n key: string[];\n ttl: number;\n update?: EventCacheRule['update'];\n}\n\nexport interface CompiledCache {\n stop: boolean;\n storeId?: string;\n namespace?: string;\n rules: CompiledCacheRule[];\n}\n\nexport interface CacheResult {\n status: 'HIT' | 'MISS';\n key: string;\n value?: StoreValue;\n rule: CompiledCacheRule;\n}\n\n/**\n * Builds a structured context object for cache and routing operations.\n * Normalizes ingest (defaulting to {}) and optionally includes event.\n */\nexport function buildCacheContext(\n ingest?: unknown,\n event?: unknown,\n): Record<string, unknown> {\n const ctx: Record<string, unknown> = {\n ingest: (ingest ?? {}) as Record<string, unknown>,\n };\n if (event !== undefined) {\n ctx.event = event as Record<string, unknown>;\n }\n return ctx;\n}\n\nexport function compileCache(cache: Cache<EventCacheRule>): CompiledCache {\n return {\n stop: cache.stop ?? false,\n storeId: cache.store,\n namespace: cache.namespace,\n rules: cache.rules.map((rule) => ({\n match: rule.match ? compileMatcher(rule.match) : () => true,\n key: rule.key,\n ttl: rule.ttl,\n update: rule.update,\n })),\n };\n}\n\nexport async function checkCache(\n compiled: CompiledCache,\n store: Store.Instance,\n context: Record<string, unknown>,\n namespace?: string,\n): Promise<CacheResult | null> {\n const rule = compiled.rules.find((r) => r.match(context));\n if (!rule) return null;\n\n const keyParts = rule.key.map((field) =>\n String(getByPath(context, field) ?? ''),\n );\n\n if (keyParts.every((p) => p === '')) return null;\n\n const keyValue = keyParts.join(':');\n const ns = namespace ?? compiled.namespace;\n const namespacedKey = ns ? `${ns}:${keyValue}` : keyValue;\n\n // `Store.GetFn` permits sync or async returns (`T | undefined |\n // Promise<T | undefined>`). Always await so a Promise return from an\n // async store (Redis, fs, the cache wrapper) never lands in the HIT\n // path as the cached \"value\".\n const decoded = readCacheEnvelope(await store.get(namespacedKey));\n\n if (decoded === undefined)\n return { status: 'MISS', key: namespacedKey, rule };\n if ('expired' in decoded) {\n try {\n await store.delete(namespacedKey);\n } catch {\n /* best-effort purge; degrade to MISS rather than throw into the request */\n }\n return { status: 'MISS', key: namespacedKey, rule };\n }\n return { status: 'HIT', key: namespacedKey, value: decoded.value, rule };\n}\n\nexport function storeCache(\n store: Store.Instance,\n key: string,\n value: unknown,\n ttlSeconds: number,\n): void {\n // Callers (source RespondOptions, destination push result, transformer\n // processed event) hold values typed wider than `StoreValue` but that are\n // structurally a `StoreValue` at runtime (JSON-shaped + binary leaves). The\n // guard narrows cast-free; a value that is genuinely not a `StoreValue` is\n // not cacheable, and the cache is advisory, so silently skip rather than\n // throw into the request path.\n if (!isStoreValue(value)) return;\n\n const ttlMs = ttlSeconds * 1000;\n // Store the plain {value, exp} envelope, not a pre-serialized Buffer: the\n // backing store serializes it through the shared store codec, so binary\n // leaves come back as Uint8Array. `exp` inside the envelope gives\n // uniform expiry for stores that ignore the ttl arg (fs/s3/gcs); the ttl\n // arg lets TTL-native stores (in-memory) evict instead of retaining until\n // read.\n // `Store.SetFn` returns `void | Promise<void>`. The write is fire-and-forget\n // (the HTTP response is sent before it lands), so an async store that rejects\n // (network error, EACCES) would otherwise surface as an unhandled rejection\n // and crash the process. Swallow it: a failed cache persist must never crash\n // the request path. Matches the best-effort silent catch on the checkCache purge.\n const result = store.set(key, wrapCacheEnvelope(value, ttlMs), ttlMs);\n if (result instanceof Promise) result.catch(() => {});\n}\n\nexport async function applyUpdate(\n value: unknown,\n update: Record<string, unknown> | undefined,\n context: Record<string, unknown>,\n collector: Collector.Instance,\n): Promise<unknown> {\n if (!update) return value;\n\n let result = value;\n for (const [path, valueConfig] of Object.entries(update)) {\n const resolved = await getMappingValue(\n context,\n valueConfig as Mapping.Data,\n { collector },\n );\n result = setByPath(result, path, resolved);\n }\n return result;\n}\n","import type { Collector, Mapping, State, Store, WalkerOS } from './types';\nimport { getMappingValue } from './mapping';\nimport { FatalError } from './fatalError';\nimport { setByPath } from './byPath';\nimport { isArray, isDefined, isObject, isString } from './is';\nimport { tryCatchAsync } from './tryCatch';\n\n/**\n * Resolve a store by id. An `undefined` id falls back to the default\n * in-memory `__cache` store. Returns `undefined` when the id is unknown.\n */\nexport type GetStore = (id: string | undefined) => Store.Instance | undefined;\n\n/** Normalize a single State or an array of States to an array. */\nexport function compileState(state: State | State[]): State[] {\n return isArray(state) ? state : [state];\n}\n\n/** Extract the event write-target path for a `get`. */\nfunction resolveTargetPath(\n value: Mapping.Value | undefined,\n): string | undefined {\n if (isString(value)) return value;\n if (isObject(value) && isString(value.key)) return value.key;\n return undefined;\n}\n\n/**\n * Apply declarative store operations against an event, in array order,\n * sequentially. `get` reads from the store and writes the fetched value to\n * the event's value path; `set` writes the resolved value to the store. Each\n * entry is fail-open: a store or resolution error is logged and the event is\n * left unmutated, the chain continues. Only `FatalError` rethrows (via\n * `getMappingValue`).\n */\nexport async function applyState<E extends WalkerOS.DeepPartialEvent>(\n states: State[],\n getStore: GetStore,\n event: E,\n collector: Collector.Instance,\n): Promise<E> {\n let result = event;\n for (const entry of states) {\n await tryCatchAsync(\n async () => {\n const store = getStore(entry.store);\n if (!store) return; // unknown store is rejected at validation; guard anyway\n\n const rawKey = await getMappingValue(result, entry.key, {\n collector,\n event: result,\n });\n if (!isString(rawKey)) return;\n // namespace state keys on the shared default store to avoid cache collisions\n const key = entry.store ? rawKey : `state:${rawKey}`;\n\n if (entry.mode === 'set') {\n const payload = await getMappingValue(result, entry.value, {\n collector,\n event: result,\n });\n if (!isDefined(payload)) return; // skip writing undefined\n await store.set(key, payload);\n } else {\n const targetPath = resolveTargetPath(entry.value);\n if (!targetPath) return; // validation already rejects this\n const fetched = await store.get(key);\n if (!isDefined(fetched)) return; // miss: leave event unchanged\n result = setByPath(result, targetPath, fetched);\n }\n },\n (error) => {\n if (error instanceof FatalError) throw error;\n collector.logger?.error?.('[state] operation failed', error);\n },\n )();\n }\n return result;\n}\n","import type { Flow } from './types/flow';\n\n/**\n * Single source of truth for step-entry validation across all four kinds.\n *\n * An empty entry (no `code`, no `package`, no `import`) is a valid no-op\n * step for all four kinds. The bundler emits no code; the runtime skips\n * registration. No error is raised for empty steps.\n *\n * Error codes:\n * - UNKNOWN_KEY unknown top-level key on a step entry\n * - CONFLICT two of {code, package, import} together, or other mutually exclusive pairs\n * - MISSING_PACKAGE `import` set without `package`\n * - OBSOLETE_CODE_STRING `code` is a string (legacy named-export shape; use `import` instead)\n * - INVALID_IMPORT `import` is set but is not a valid JS identifier\n * - INVALID_CODE_SHAPE `code` is present but is neither an object nor a string\n */\n\nexport const STEP_OPERATIVE_FIELDS: Record<Flow.StepKind, readonly string[]> = {\n Source: ['code', 'package', 'import', 'before', 'next', 'cache', 'state'],\n Transformer: [\n 'code',\n 'package',\n 'import',\n 'before',\n 'next',\n 'cache',\n 'state',\n 'mapping',\n ],\n Destination: [\n 'code',\n 'package',\n 'import',\n 'before',\n 'next',\n 'cache',\n 'state',\n ],\n Store: ['code', 'package', 'import', 'cache'],\n} as const;\n\nconst COMMON_NON_OPERATIVE = [\n 'config',\n 'env',\n 'variables',\n 'examples',\n 'disabled',\n 'id',\n 'logger',\n 'mock',\n 'chainMocks',\n] as const;\n\nconst KIND_EXTRA: Record<Flow.StepKind, readonly string[]> = {\n Source: ['primary'],\n Transformer: [],\n Destination: [],\n Store: [],\n};\n\nconst IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nexport type StepEntryErrorCode =\n | 'UNKNOWN_KEY'\n | 'CONFLICT'\n | 'MISSING_PACKAGE'\n | 'OBSOLETE_CODE_STRING'\n | 'INVALID_IMPORT'\n | 'INVALID_CODE_SHAPE';\n\nexport interface StepEntryValidation {\n ok: boolean;\n reason?: string;\n code?: StepEntryErrorCode;\n key?: string;\n}\n\nfunction allowedKeys(kind: Flow.StepKind): Set<string> {\n return new Set<string>([\n ...STEP_OPERATIVE_FIELDS[kind],\n ...COMMON_NON_OPERATIVE,\n ...KIND_EXTRA[kind],\n ]);\n}\n\nexport function validateStepEntry(\n entry: Record<string, unknown>,\n kind: Flow.StepKind,\n): StepEntryValidation {\n const allowed = allowedKeys(kind);\n\n for (const key of Object.keys(entry)) {\n if (!allowed.has(key)) {\n return {\n ok: false,\n code: 'UNKNOWN_KEY',\n key,\n reason: `Unknown key \"${key}\" on ${kind}. Allowed: ${[...allowed].sort().join(', ')}.`,\n };\n }\n }\n\n const hasPackage = entry.package !== undefined;\n const hasImport = entry.import !== undefined;\n const hasCode = entry.code !== undefined;\n\n if (hasCode && typeof entry.code === 'string') {\n return {\n ok: false,\n code: 'OBSOLETE_CODE_STRING',\n key: 'code',\n reason: `code: \"<name>\" is no longer supported. Use import: \"${entry.code}\" with the package field instead.`,\n };\n }\n\n if (\n hasCode &&\n ((typeof entry.code !== 'object' && typeof entry.code !== 'function') ||\n entry.code === null ||\n Array.isArray(entry.code))\n ) {\n return {\n ok: false,\n code: 'INVALID_CODE_SHAPE',\n key: 'code',\n reason: `code must be an object ({ push, type?, init? }) or a resolved function value.`,\n };\n }\n\n if (hasCode && hasPackage) {\n return {\n ok: false,\n code: 'CONFLICT',\n key: 'package',\n reason: 'Cannot specify both `code` and `package`. Use one or the other.',\n };\n }\n if (hasCode && hasImport) {\n return {\n ok: false,\n code: 'CONFLICT',\n key: 'import',\n reason: 'Cannot specify both `code` and `import`.',\n };\n }\n if (hasImport && !hasPackage) {\n return {\n ok: false,\n code: 'MISSING_PACKAGE',\n key: 'import',\n reason: '`import` requires `package` to be set.',\n };\n }\n if (hasImport) {\n if (typeof entry.import !== 'string' || !IDENT_RE.test(entry.import)) {\n return {\n ok: false,\n code: 'INVALID_IMPORT',\n key: 'import',\n reason: `import must match ${IDENT_RE.source}. Got: ${JSON.stringify(entry.import)}.`,\n };\n }\n }\n\n // Empty entry (no code, no package, no import) is a valid no-op step\n // for all four kinds. Bundler emits nothing, runtime skips registration.\n\n return { ok: true };\n}\n\nexport function isPathStepEntry(\n entry: Record<string, unknown>,\n kind: Flow.StepKind,\n): boolean {\n if (kind !== 'Transformer') return false;\n if (\n entry.code !== undefined ||\n entry.package !== undefined ||\n entry.import !== undefined\n ) {\n return false;\n }\n return (\n entry.before !== undefined ||\n entry.next !== undefined ||\n entry.cache !== undefined ||\n entry.state !== undefined ||\n entry.mapping !== undefined\n );\n}\n","import type { Flow } from '../types/flow';\n\ntype StepOut = Flow.StepOut;\ntype StepEffect = Flow.StepEffect;\n\n/**\n * Format a step example's `out` as readable code for docs/app rendering.\n *\n * - Empty `out` → `// no output`.\n * - `['return', value]` → `return <value>` (no parentheses).\n * - `[callable, ...args]` → `callable(<args>)`.\n * - Primitive args render as JSON (strings quoted, numbers/booleans/null bare).\n * - `undefined` renders as the literal token `undefined`.\n * - Objects/arrays render as `JSON.stringify(v, null, 2)`.\n * - Functions render as `[Function]` (rare in outs; safe fallback).\n *\n * Pure function. No runtime dependencies. Used by the website\n * `<StepExample>` renderer and the app `OutputPanel` for a single source of truth.\n */\nexport function formatOut(out: StepOut): string {\n if (out.length === 0) return '// no output';\n return out.map(formatEffect).join(';\\n\\n');\n}\n\nfunction formatEffect(effect: StepEffect): string {\n const [callable, ...args] = effect;\n const argStr = args.map(formatValue).join(', ');\n if (callable === 'return') return argStr ? `return ${argStr}` : 'return';\n return `${callable}(${argStr})`;\n}\n\nfunction formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (v === null) return 'null';\n if (typeof v === 'function') return '[Function]';\n return JSON.stringify(v, null, 2);\n}\n"],"mappings":"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","names":["compileCache","Level","value","value","value","acc","value","value","value","value","value","value","value","value","mapping","value","value","value","value","stepId","value","value","value","isRecord","value","isRecord","value","out","compileCache","value","value","getStore"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types/cache.ts","../src/types/collector.ts","../src/types/context.ts","../src/types/destination.ts","../src/types/elb.ts","../src/types/hooks.ts","../src/types/logger.ts","../src/types/mapping.ts","../src/types/on.ts","../src/types/transformer.ts","../src/types/request.ts","../src/types/source.ts","../src/types/store.ts","../src/types/trigger.ts","../src/types/lifecycle.ts","../src/types/walkeros.ts","../src/types/simulation.ts","../src/types/matcher.ts","../src/types/hint.ts","../src/types/storage.ts","../src/types/ingest.ts","../src/branch.ts","../src/anonymizeIP.ts","../src/throwError.ts","../src/contract.ts","../src/references.ts","../src/flow.ts","../src/assign.ts","../src/is.ts","../src/clone.ts","../src/byPath.ts","../src/include.ts","../src/castValue.ts","../src/consent.ts","../src/createDestination.ts","../src/deepMerge.ts","../src/getId.ts","../src/hexId.ts","../src/getSpanId.ts","../src/eventGenerator.ts","../src/getTraceId.ts","../src/parseTraceparent.ts","../src/getMarketingParameters.ts","../src/invocations.ts","../src/logger.ts","../src/property.ts","../src/tryCatch.ts","../src/fatalError.ts","../src/mapping.ts","../src/mergeMapping.ts","../src/mockEnv.ts","../src/mockLogger.ts","../src/mockContext.ts","../src/request.ts","../src/send.ts","../src/setup.ts","../src/trim.ts","../src/useHooks.ts","../src/telemetry.ts","../src/telemetryResolver.ts","../src/preview.ts","../src/journey.ts","../src/traceState.ts","../src/emitStep.ts","../src/batchedPoster.ts","../src/userAgent.ts","../src/wrapInlineCode.ts","../src/cdn.ts","../src/observeEnv.ts","../src/mcpHelpers.ts","../src/respond.ts","../src/matcher.ts","../src/route.ts","../src/cache-envelope.ts","../src/store/codec.ts","../src/cache.ts","../src/state.ts","../src/step-entry.ts","../src/examples/formatOut.ts"],"sourcesContent":["export * from './types';\n\nexport * from './branch';\nexport * from './anonymizeIP';\nexport * from './flow';\nexport * from './assign';\nexport * from './byPath';\nexport * from './include';\nexport * from './castValue';\nexport * from './clone';\nexport * from './consent';\nexport * from './createDestination';\nexport * from './deepMerge';\nexport * from './eventGenerator';\nexport * from './getId';\nexport * from './getSpanId';\nexport * from './getTraceId';\nexport { parseTraceparent } from './parseTraceparent';\nexport type { ParsedTraceparent } from './parseTraceparent';\nexport * from './getMarketingParameters';\nexport * from './invocations';\nexport * from './is';\nexport * from './logger';\nexport * from './mapping';\nexport * from './mergeMapping';\nexport * from './mockEnv';\nexport * from './mockContext';\nexport * from './mockLogger';\nexport * from './property';\nexport * from './request';\nexport * from './send';\nexport * from './setup';\nexport * from './throwError';\nexport * from './trim';\nexport * from './tryCatch';\nexport * from './fatalError';\nexport * from './useHooks';\nexport * from './telemetry';\nexport * from './telemetryResolver';\nexport * from './preview';\nexport * from './journey';\nexport { getTraceUntil, setTraceUntil } from './traceState';\nexport { emitStep } from './emitStep';\nexport * from './batchedPoster';\nexport * from './userAgent';\nexport * from './wrapInlineCode';\nexport * from './cdn';\nexport * from './contract';\nexport * from './observeEnv';\nexport * from './mcpHelpers';\nexport * from './respond';\nexport * from './matcher';\n// Route helpers. `getNextSteps` is the runtime resolver. `isRouteArray` and\n// `isRouteConfigEntry` are the canonical shape probes for `Transformer.Route`.\n// `compileNext`, `resolveNext`, `CompiledNext`, and `CompiledRoute` remain\n// package-internal.\nexport { getNextSteps, isRouteArray, isRouteConfigEntry } from './route';\nexport * from './cache';\nexport * from './cache-envelope';\nexport {\n serializeStoreValue,\n deserializeStoreValue,\n StoreCodecError,\n isStoreValue,\n} from './store/codec';\nexport * from './state';\nexport * from './step-entry';\nexport * from './examples/formatOut';\nexport {\n REF_VAR_FULL,\n REF_VAR_INLINE,\n REF_ENV,\n REF_CONTRACT,\n REF_FLOW,\n REF_STORE,\n REF_SECRET,\n REF_CODE_PREFIX,\n scanFlowRefs,\n} from './references';\n","import type { MatchExpression } from './matcher';\nimport type { Value } from './mapping';\n\ninterface BaseCacheRule {\n /**\n * Optional match expression. Omitted means always-match.\n */\n match?: MatchExpression;\n ttl: number;\n}\n\nexport interface EventCacheRule extends BaseCacheRule {\n key: string[];\n update?: Record<string, Value>;\n}\n\nexport interface StoreCacheRule extends BaseCacheRule {\n // intentionally no key (caller provides one) and no update (no event).\n}\n\nexport type CacheRule = EventCacheRule | StoreCacheRule;\n\nexport interface Cache<R extends CacheRule = CacheRule> {\n /**\n * Stop the chain on cache HIT (default: false). When true, skip remaining steps and return cached value.\n */\n stop?: boolean;\n store?: string;\n /**\n * Optional key prefix written to the store. When absent, cache keys are written directly. Same store + same key + same namespace = same cache entry.\n */\n namespace?: string;\n rules: R[];\n}\n","import type {\n Source,\n Destination,\n Store,\n Elb as ElbTypes,\n Hooks,\n Logger,\n On,\n Transformer,\n WalkerOS,\n Mapping,\n} from '.';\nimport type { Ingest } from './ingest';\nimport type { ObserverFn } from './observer';\n\n/** Identifies which kind of step a stepId belongs to. */\nexport type StepKind =\n | 'collector'\n | 'source'\n | 'transformer'\n | 'destination'\n | 'store';\n\n/**\n * Build a stepId for use as a key in `Status.dropped` /\n * `Status.connectionErrors` (and future status maps). The collector-level\n * stepId is the literal \"collector\" (no id). Source/transformer/destination/\n * store ids take the form `\"<kind>.<id>\"`, e.g. `\"destination.ga4\"`.\n *\n * The dot separator mirrors the vocabulary already used in collector\n * log messages (\"collector.queue overflow\", \"destination.dlq overflow\").\n */\nexport function stepId(kind: 'collector'): 'collector';\nexport function stepId(\n kind: 'source' | 'transformer' | 'destination' | 'store',\n id: string,\n): string;\nexport function stepId(kind: StepKind, id?: string): string {\n if (kind === 'collector') return 'collector';\n if (!id) {\n throw new Error(`stepId(${kind}) requires an id`);\n }\n return `${kind}.${id}`;\n}\n\n/**\n * Drop counters at a single step. Each buffer is optional: a step kind\n * may have only `queue` (collector), only `dlq`, both (destinations\n * today), or neither. Counts are monotonic.\n */\nexport interface DroppedCounters {\n queue?: number;\n dlq?: number;\n}\n\n/**\n * Circuit-breaker state for a single step (keyed by `stepId()` in\n * `Status.breakers`). Tracks consecutive transport failures so a step whose\n * transport is down can be skipped (gated) until a cooldown elapses, instead\n * of every event hammering a known-broken writer.\n *\n * - `closed`: healthy; events pass through. `consecutiveFailures` accrues on\n * transport failures and resets to 0 on any success.\n * - `open`: tripped; events are skipped until `openUntil`. The first event at\n * or after `openUntil` transitions to `half-open` and becomes the probe.\n * - `half-open`: a single probe event is allowed through; `probing` marks that\n * the probe slot is taken so concurrent events still skip. A probe success\n * closes the breaker; a probe failure re-opens it with a fresh `openUntil`.\n *\n * `consecutiveFailures` is CONSECUTIVE, not cumulative: a single success\n * resets it, so only an unbroken run reaching the threshold opens the breaker.\n */\nexport interface BreakerState {\n state: 'closed' | 'open' | 'half-open';\n consecutiveFailures: number;\n /** Epoch ms after which an open breaker admits a single probe. */\n openUntil?: number;\n /** True while a half-open probe is in flight (probe slot taken). */\n probing?: boolean;\n}\n\n/**\n * Core collector configuration interface\n */\nexport interface Config {\n /** Whether to run collector automatically */\n run?: boolean;\n /** Static global properties even on a new run */\n globalsStatic: WalkerOS.Properties;\n /** Static session data even on a new run */\n sessionStatic: Partial<SessionData>;\n /** Logger configuration */\n logger?: Logger.Config;\n /**\n * Maximum number of events retained in `collector.queue` for late-registered\n * destination backfill. Overflow drops oldest (FIFO). Default 1000.\n */\n queueMax?: number;\n /** Flow name; keys this flow's entry in event.source.release and the observer flowId. */\n name?: string;\n /** Config release id stamped into event.source.release for this flow. */\n release?: string;\n}\n\n/**\n * Initialization configuration that extends Config with initial state\n */\nexport interface InitConfig extends Partial<Config> {\n /** Initial consent state */\n consent?: WalkerOS.Consent;\n /** Initial user data */\n user?: WalkerOS.User;\n /** Initial global properties */\n globals?: WalkerOS.Properties;\n /** Source configurations */\n sources?: Source.InitSources;\n /** Destination configurations */\n destinations?: Destination.InitDestinations;\n /** Transformer configurations */\n transformers?: Transformer.InitTransformers;\n /** Store configurations */\n stores?: Store.InitStores;\n /** Initial custom properties */\n custom?: WalkerOS.Properties;\n /** Hooks for pipeline observation and interception */\n hooks?: Hooks.Functions;\n}\n\nexport interface SessionData extends WalkerOS.Properties {\n isStart: boolean;\n storage: boolean;\n id?: string;\n start?: number;\n marketing?: true;\n updated?: number;\n isNew?: boolean;\n device?: string;\n count?: number;\n runs?: number;\n}\n\nexport interface Status {\n startedAt: number;\n in: number;\n out: number;\n failed: number;\n sources: Record<string, SourceStatus>;\n destinations: Record<string, DestinationStatus>;\n /**\n * Monotonic counts of events dropped due to buffer caps, keyed by\n * stepId. See `stepId()` for key construction.\n *\n * Examples:\n * - `dropped[\"collector\"]?.queue`: collector replay buffer drops\n * - `dropped[\"destination.ga4\"]?.queue`: ga4's consent-denied buffer drops\n * - `dropped[\"destination.ga4\"]?.dlq`: ga4's dead-letter queue drops\n */\n dropped: Record<string, DroppedCounters>;\n /**\n * Per-step circuit-breaker state, keyed by stepId. See `stepId()` for key\n * construction; keyed step-agnostically (NOT embedded in\n * `DestinationStatus`) so the breaker can guard any step kind, though\n * destinations are the primary use today. A breaker is created lazily on\n * first accounting and stays inert unless its step is configured with a\n * `breaker` (presence-gated): existing flows never trip a breaker.\n *\n * A runtime status field, not drift-guarded (it is observed, never authored\n * in a flow config).\n *\n * Example:\n * - `breakers[\"destination.bigquery\"]`: bigquery's consecutive-failure gate.\n */\n breakers: Record<string, BreakerState>;\n /**\n * Monotonic counts of out-of-band connection-level errors reported by a\n * step via `context.reportError(err)` with no event (an orphan error from\n * an EventEmitter SDK object's `'error'` handler), keyed by stepId. See\n * `stepId()` for key construction; mirrors `dropped`.\n *\n * Distinct from `failed`: `failed` counts events lost in-band (a push that\n * threw, a DLQ'd entry). `connectionErrors` counts connection faults that\n * did not lose a specific event at the moment they fired. Operators read\n * both: a rising `connectionErrors` with flat `failed` means a writer is\n * flapping but events are still landing; both rising means the fault is\n * now dropping events.\n *\n * Example:\n * - `connectionErrors[\"destination.bigquery\"]`: BigQuery stream writer\n * `'error'` events reported between pushes.\n */\n connectionErrors: Record<string, number>;\n}\n\nexport interface SourceStatus {\n count: number;\n lastAt?: number;\n duration: number;\n}\n\nexport interface DestinationStatus {\n count: number;\n failed: number;\n lastAt?: number;\n duration: number;\n /** Current size of the destination's queuePush buffer (point-in-time). */\n queuePushSize: number;\n /** Current size of the destination's DLQ (point-in-time). */\n dlqSize: number;\n /**\n * Number of events buffered in batch scheduler windows but not yet\n * delivered to `pushBatch`. Incremented on enqueue, decremented on\n * flush (whether the flush succeeds or fails). Operators read this\n * to spot batches that never drain.\n */\n inFlightBatch?: number;\n}\n\nexport interface Sources {\n [id: string]: Source.Instance;\n}\n\nexport interface Destinations {\n [id: string]: Destination.Instance;\n}\n\nexport interface Transformers {\n [id: string]: Transformer.Instance;\n}\n\nexport interface Stores {\n [id: string]: Store.Instance;\n}\n\nexport type CommandType =\n | 'action'\n | 'config'\n | 'consent'\n | 'context'\n | 'destination'\n | 'elb'\n | 'globals'\n | 'hook'\n | 'init'\n | 'link'\n | 'run'\n | 'user'\n | 'walker'\n | string;\n\n/**\n * Options passed to collector.push() from sources.\n * NOT a Context - just push metadata.\n */\nexport interface PushOptions {\n id?: string;\n ingest?: Ingest;\n respond?: import('../respond').RespondFn;\n mapping?: Mapping.Config;\n preChain?: string[];\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * Push function signature - handles events only\n */\nexport interface PushFn {\n (\n event: WalkerOS.DeepPartialEvent,\n options?: PushOptions,\n ): Promise<ElbTypes.PushResult>;\n}\n\n/**\n * Command function signature - handles walker commands only\n */\nexport interface CommandFn {\n (command: 'config', config: Partial<Config>): Promise<ElbTypes.PushResult>;\n (command: 'consent', consent: WalkerOS.Consent): Promise<ElbTypes.PushResult>;\n <T extends Destination.Types>(\n command: 'destination',\n init: Destination.Init<T>,\n ): Promise<ElbTypes.PushResult>;\n <K extends keyof Hooks.Functions>(\n command: 'hook',\n init: { name: K; fn: Hooks.Functions[K] },\n ): Promise<ElbTypes.PushResult>;\n (\n command: 'on',\n init: {\n type: On.Types;\n rules: WalkerOS.SingleOrArray<On.Subscription>;\n },\n ): Promise<ElbTypes.PushResult>;\n (command: 'user', user: WalkerOS.User): Promise<ElbTypes.PushResult>;\n (\n command: 'run',\n runState?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): Promise<ElbTypes.PushResult>;\n (command: string, data?: unknown): Promise<ElbTypes.PushResult>;\n}\n\n/**\n * Per-cascade tracking for the bounded recursion guard (see `Instance.cascade`).\n * `counts` maps a subscriber identity object to per-cell-type delivery counts\n * within one top-level command's cascade. A pair is stopped once its count\n * exceeds the guard's bound; the non-convergence error logs once per pair on the\n * crossing transition.\n */\nexport interface Cascade {\n counts: WeakMap<object, Record<string, number>>;\n}\n\n// Main Collector interface\nexport interface Instance {\n push: PushFn;\n command: CommandFn;\n /** Flexible elb() adapter: routes `walker *` to command, events to push. */\n elb: ElbTypes.Fn;\n allowed: boolean;\n config: Config;\n consent: WalkerOS.Consent;\n custom: WalkerOS.Properties;\n sources: Sources;\n destinations: Destinations;\n transformers: Transformers;\n stores: Stores;\n globals: WalkerOS.Properties;\n hooks: Hooks.Functions;\n /**\n * First-class observation channel. The runtime self-emits FlowState\n * records at canonical step sites (collector.push, destination.push,\n * destination.init, destination.pushBatch, destination consent skip,\n * transformer.push, store.get/set/delete, store cache HIT/MISS).\n * Observers run synchronously inside emitStep; thrown values are\n * swallowed. Subscribers add/remove via the standard Set API.\n */\n observers: Set<ObserverFn>;\n /**\n * Optional observation-level supplier installed by bundle codegen. Returns\n * the level currently active for this runtime. Absent means no capture. At\n * `trace` the per-event destination push wraps its env (via `wrapEnv`) to\n * record a destination's declared vendor `calls`; `off`/`standard` and\n * absence leave the push path untouched (zero added per-push cost).\n */\n observeLevel?: () => 'off' | 'standard' | 'trace';\n logger: Logger.Instance;\n on: On.OnConfig;\n queue: WalkerOS.Events;\n round: number;\n /** Run-scoped W3C trace id, minted on each run and stamped onto events. */\n trace?: string;\n /** Static flow name; keys source.release and the observer flowId. */\n name?: string;\n /** Static config release id stamped into source.release for this flow. */\n release?: string;\n /** Per-run emission sequence; reset on each run, incremented per stamped event. */\n count: number;\n /**\n * Monotonic counter bumped on every accepted reactive-state mutation\n * (consent, user, globals, custom). Used for per-subscriber high-water-mark\n * dedup. Not bumped for non-reactive config changes.\n */\n stateVersion: number;\n /**\n * Per-cell change version: the `stateVersion` at which each state cell\n * (`consent`/`user`/`globals`/`custom`) last changed. Lets delivery dedup be\n * per-cell — a subscriber owed two cells at the same `stateVersion` receives\n * both, because each cell's freshness is tracked independently rather than\n * against the single global `stateVersion`. A missing entry reads as 0.\n */\n cellVersion: Record<string, number>;\n /**\n * Per-subscriber, per-cell high-water mark registry for exactly-once state\n * delivery. Keys are subscriber identity objects (a ConsentRule object, a\n * generic-fn, or a source instance); the inner record maps each state-cell\n * type (`consent`/`user`/`globals`/`custom`) to the `stateVersion` at which\n * that subscriber was last invoked FOR THAT CELL. A missing entry means never\n * delivered (sentinel \"-infinity\", read as -1). A subscriber is invoked for a\n * cell iff `stateVersion > mark[cell]` AND `allowed === true`.\n *\n * Per-cell (not a single scalar per subscriber) so a handler owed two\n * distinct cells at the same `stateVersion` — e.g. consent and user both\n * bumped before run — receives both at the run barrier instead of the first\n * delivery advancing one mark and swallowing the second cell's edge.\n */\n delivery: WeakMap<object, Record<string, number>>;\n /**\n * Transient per-cascade tracking for the bounded recursion guard. A\n * top-level state command creates this when it first enters the delivery\n * cascade and tears it down when it returns; nested commands emitted by\n * reacting callbacks reuse the same structure. It counts deliveries per\n * `(subscriber, cell-type)` so a cyclic cascade terminates (and logs once)\n * instead of recursing until stack overflow. `undefined` between top-level\n * commands. See `on.ts` `cascadeAllow`.\n *\n * This tracker, together with `stateVersion` and `delivery`, assumes top-level\n * state commands are processed serially on a given collector. Concurrent,\n * overlapping state commands on one shared collector are not supported (web is\n * serial; the server per-request path is event push, not state commands).\n */\n cascade?: Cascade;\n session: undefined | SessionData;\n status: Status;\n timing: number;\n user: WalkerOS.User;\n pending: {\n destinations: Destination.InitDestinations;\n };\n /**\n * Set true on the first `shutdown` command, guarding re-entrancy: a second\n * `walker shutdown` must not re-run `destroyAllSteps` and double-close\n * writers, destinations, or stores. Subsequent shutdown commands no-op.\n * Initialized to `false` by the collector factory; absence (`undefined`)\n * is treated as \"not yet shut down\", so the first shutdown still runs.\n */\n hasShutdown?: boolean;\n /**\n * Every event type ever broadcast through `onApply` (state, lifecycle, and\n * arbitrary). Lets a `require:[<arbitrary>]` gate be satisfied by the current\n * recorded state for events that have no backing cell, including a broadcast\n * that fired before the requiring step registered.\n */\n seenEvents: Set<string>;\n}\n","import type { Collector, Logger, WalkerOS } from '.';\n\n/**\n * Base context interface for walkerOS stages.\n * Sources, Transformers, and Destinations extend this.\n */\nexport interface Base<C = unknown, E = unknown> {\n collector: Collector.Instance;\n logger: Logger.Instance;\n config: C;\n env: E;\n /**\n * Out-of-band error seam available to every step kind (source,\n * transformer, store, destination). A step that owns an EventEmitter SDK\n * object (BigQuery `StreamConnection`, a Redis client, a Kafka producer)\n * calls this from the object's `'error'` handler, where there is no\n * surrounding `await`/`tryCatchAsync` to catch into and an unhandled\n * `'error'` would otherwise crash the process on a detached tick.\n *\n * MUST NOT throw (it runs on a detached emitter tick; a throw inside it\n * would reintroduce the uncaughtException it exists to prevent).\n *\n * - With `event`: routes that event through the same per-step failure\n * accounting an in-band push failure uses (the destination DLQ + the\n * `failed` counters), so a connection error that loses a specific event\n * is counted and surfaced exactly like a synchronous push failure.\n * - Without `event` (an orphan / connection-level error, e.g. a stream\n * writer that errored between pushes): a contained `logger.error` plus a\n * bump of `Status.connectionErrors[stepId]`. It does NOT bump\n * `Status.failed` (no event was lost at this instant; the next push that\n * hits the broken writer is what gets DLQ'd and counted as failed, so\n * counting the orphan against `failed` would double-count).\n */\n reportError?(err: unknown, event?: WalkerOS.Event): void;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Collector,\n Logger,\n Mapping as WalkerOSMapping,\n On,\n Transformer,\n WalkerOS,\n Context as BaseContext,\n} from '.';\nimport type { DestroyFn, SetupFn } from './lifecycle';\nimport type { Ingest } from './ingest';\n\n/**\n * Base environment requirements interface for walkerOS destinations\n *\n * This defines the core interface that destinations can use to declare\n * their runtime environment requirements. Platform-specific extensions\n * should extend this interface.\n */\nexport interface BaseEnv {\n /**\n * Generic global properties that destinations may require\n * Platform-specific implementations can extend this interface\n */\n [key: string]: unknown;\n}\n\n/**\n * Observe-mode call recorder injected into a per-push env (under the runtime\n * `OBSERVE_ENV_KEY`) for vendor-call paths that could NOT be resolved at wrap\n * time (root or leaf missing, e.g. a live-web global not yet installed). The\n * resolution-point wrapper (web-core `getEnv`) reads this, wraps the matching\n * globals via a transparent Proxy, and forwards each intercepted call to\n * `record`. The key is stripped before the env reaches the destination.\n */\nexport interface EnvObserve {\n /**\n * Dot-paths to intercept, with any `call:` prefix already stripped (as\n * `parseCallPath` returns them). Each is a `root.leaf` chain resolved against\n * the merged env.\n */\n paths: string[];\n /**\n * Appends one recorded invocation. `fn` is the full intercepted dot-path,\n * `args` the call arguments. Implementations push onto the shared `calls`\n * array that backs the destination out record.\n */\n record: (fn: string, args: unknown[]) => void;\n}\n\n/**\n * Type bundle for destination generics.\n * Groups Settings, InitSettings, Mapping, Env, and Setup into a single type parameter.\n */\nexport interface Types<\n S = unknown,\n M = unknown,\n E = BaseEnv,\n I = S,\n U = unknown,\n C = unknown,\n> {\n settings: S;\n initSettings: I;\n mapping: M;\n env: E;\n setup: U;\n credentials: C;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n env: any;\n setup: any;\n credentials: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\nexport type SetupOptions<T extends TypesGeneric = Types> = T['setup'];\nexport type Credentials<T extends TypesGeneric = Types> = T['credentials'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n config: Config<T>;\n queuePush?: WalkerOS.Events;\n queueOn?: Array<{ type: On.Types; data?: unknown }>;\n dlq?: DLQ;\n batches?: BatchRegistry<Mapping<T>>;\n type?: string;\n /**\n * Observable env callables for trace-level vendor-call capture. Dot-paths of\n * the functions this destination invokes on its env, using the same grammar\n * as the dev-env `simulation` lists (incl. an optional `call:` prefix), e.g.\n * `['call:window.gtag']`. When present AND the collector reports trace level,\n * the per-event push env is wrapped (via `wrapEnv`) so each listed call is\n * recorded onto the destination out record. Absent or empty = no capture.\n */\n calls?: string[];\n env?: Env<T>;\n setup?: SetupFn<Config<T>, Env<T>>;\n init?: InitFn<T>;\n push: PushFn<T>;\n pushBatch?: PushBatchFn<T>;\n on?: On.OnFn;\n destroy?: DestroyFn<Config<T>, Env<T>>;\n}\n\nexport interface Config<T extends TypesGeneric = Types> {\n /** Required consent states to push events; queues events when not granted. */\n consent?: WalkerOS.Consent;\n /** Implementation-specific configuration passed to the init function. */\n settings?: InitSettings<T>;\n /**\n * Optional, strictly-typed credentials slot. Back it with a managed secret\n * via `$secret.NAME` (credentials use `$secret`, not `$env`). The package\n * defines the shape via `Types['credentials']`. `settings.<sdk>` stays the\n * escape hatch for raw SDK options.\n */\n credentials?: Credentials<T>;\n /** Global data transformation applied to all events; result passed as context.data to push. */\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n /** Event sections to flatten into context.data. */\n include?: string[];\n /** Runtime dependencies merged from code and config env; extensible per destination. */\n env?: Env<T>;\n /** Destination identifier; auto-generated if not provided. */\n id?: string;\n /** Whether the destination has been initialized; prevents re-initialization. */\n init?: boolean;\n /** Whether to load external scripts (e.g., gtag.js); destination-specific behavior. */\n loadScript?: boolean;\n /** Logger configuration (level, handler) to override the collector's defaults. */\n logger?: Logger.Config;\n /** Entity-action rules to filter, rename, transform, and batch events for this destination. */\n mapping?: WalkerOSMapping.Rules<WalkerOSMapping.Rule<Mapping<T>>>;\n /** Pre-processing rules applied to all events before mapping; modifies events in-place. */\n policy?: Policy;\n /** Whether to queue events when consent is not granted; defaults to true. */\n queue?: boolean;\n /** Defer destination initialization until these collector events fire (e.g., `['consent']`). */\n require?: string[];\n /**\n * Provisioning options for `walkeros setup`. `boolean | object`.\n * Triggered only by explicit CLI invocation; never automatic.\n */\n setup?: boolean | SetupOptions<T>;\n /** Transformer chain to run after collector processing but before this destination. */\n before?: Transformer.Route;\n /** Transformer chain to run after destination push completes. Push response available at ingest._response. */\n next?: Transformer.Route;\n /** Cache configuration for deduplication (step-level: skip push on HIT). */\n cache?: import('./cache').Cache;\n /** Declarative store get/set operations applied around this destination. */\n state?: import('./state').State | import('./state').State[];\n /** Completely skip this destination — no init, no push, no queuing. */\n disabled?: boolean;\n /**\n * Per-destination delivery timeout in ms (default 10000); a delivery that\n * does not settle within this window is routed to the DLQ like a thrown push.\n */\n timeout?: number;\n /** Return this value instead of calling push(). Uses !== undefined check to support falsy values. */\n mock?: unknown;\n /**\n * Maximum number of consent-denied events retained in `queuePush` for\n * this destination. Overflow drops oldest (FIFO). Default 1000.\n */\n queueMax?: number;\n /**\n * Maximum number of failed-push entries retained in `dlq` for this\n * destination. Overflow drops oldest (FIFO). Default 100.\n */\n dlqMax?: number;\n /**\n * Enables batching for ALL of this destination's events into one shared\n * default buffer. A mapping rule's own `batch` splits that entity-action\n * into its own buffer and overrides per field (`rule ?? config ?? default`).\n * Batching stays off when neither is set. A bare number is treated as the\n * debounce `wait` window.\n *\n * - `wait`: debounce window in ms; the timer resets on every push.\n * - `size`: hard count cap; flush immediately when entries reach this number. Default 1000 when batching is enabled.\n * - `age`: time since the first entry of the current window. Forces a flush even if pushes keep arriving. Default 30000 (30s).\n */\n batch?: number | BatchOptions;\n /**\n * Per-destination circuit breaker. Presence-gated: when unset the breaker is\n * inert and behavior is unchanged. After `threshold` CONSECUTIVE transport\n * failures (a thrown push, a timed-out push, a whole-batch throw, a\n * connection-level `reportError(err, event)`) the breaker opens and events\n * are skipped (counted, not pushed) until `cooldown` ms elapse, then a single\n * probe event is allowed; its success closes the breaker, its failure\n * re-opens it. Partial-batch row failures are breaker-neutral. A bare number\n * is the `threshold`.\n *\n * - `threshold`: consecutive transport failures before opening. Default 5.\n * - `cooldown`: ms an open breaker waits before admitting a probe. Default 30000.\n */\n breaker?: number | BreakerOptions;\n}\n\n/**\n * Circuit-breaker tuning. Used at the destination-config layer\n * (`Destination.Config.breaker`). A bare number is treated as `threshold`.\n */\nexport interface BreakerOptions {\n /** Consecutive transport failures before the breaker opens. Default 5. */\n threshold?: number;\n /** Milliseconds an open breaker waits before admitting a probe. Default 30000. */\n cooldown?: number;\n}\n\n/**\n * Batch scheduling options. Used at both the mapping-rule layer\n * (`Mapping.Rule.batch`) and the destination-config layer\n * (`Destination.Config.batch`). Same shape at both layers.\n */\nexport interface BatchOptions {\n /** Debounce window in ms. Timer resets on every push. */\n wait?: number;\n /** Hard count cap. Flushes immediately at this size. */\n size?: number;\n /** Hard age cap in ms since first entry of current window. */\n age?: number;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Env<T>,\n InitSettings<T>,\n SetupOptions<T>,\n Credentials<T>\n >\n>;\n\nexport interface Policy {\n [key: string]: WalkerOSMapping.Value;\n}\n\nexport type Code<T extends TypesGeneric = Types> = Instance<T>;\n\nexport type Init<T extends TypesGeneric = Types> = {\n code: Code<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n before?: Transformer.Route;\n next?: Transformer.Route;\n cache?: import('./cache').Cache;\n state?: import('./state').State | import('./state').State[];\n};\n\nexport interface InitDestinations {\n [key: string]: Init<any>;\n}\n\nexport interface Destinations {\n [key: string]: Instance;\n}\n\n/**\n * Context provided to destination functions.\n * Extends base context with destination-specific properties.\n */\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Config<T>, Env<T>> {\n id: string;\n data?: Data;\n}\n\nexport interface PushContext<\n T extends TypesGeneric = Types,\n> extends Context<T> {\n ingest: Ingest;\n rule?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport interface PushBatchContext<\n T extends TypesGeneric = Types,\n> extends Context<T> {\n ingest: Ingest;\n rule?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\nexport type PushFn<T extends TypesGeneric = Types> = (\n event: WalkerOS.Event,\n context: PushContext<T>,\n) => WalkerOS.PromiseOrValue<void | unknown>;\n\n/**\n * Per-row outcome for a single failed batch entry.\n *\n * `index` is the position into the flushed batch's `entries` array (the same\n * order `flushBatch` iterates), so the collector can route exactly that entry\n * to the DLQ. `error` is the per-row failure carried into the DLQ pair; when\n * omitted the collector substitutes a generic batch error.\n */\nexport interface BatchFailure {\n index: number;\n error?: unknown;\n}\n\n/**\n * Partial-failure result of a `pushBatch` call.\n *\n * `failed` lists the entries (by index into the flushed batch's `entries`\n * array) that did NOT succeed. Every other entry is treated as delivered.\n */\nexport interface BatchOutcome {\n failed: BatchFailure[];\n}\n\n/**\n * Pushes a batch of events to a destination.\n *\n * Return contract (backward-compatible, additive):\n * - Resolve `void` (the historical contract): the WHOLE batch succeeded. The\n * collector counts every entry as delivered.\n * - Throw / reject: the WHOLE batch failed. The collector routes every entry\n * to the DLQ and increments `failed` by the batch size. Unchanged.\n * - Resolve a `BatchOutcome`: PARTIAL failure. Only the entries listed in\n * `outcome.failed` (by `index` into the flushed `entries` array) are routed\n * to the DLQ and counted as failed, each with its own `error`. The remaining\n * entries are counted as delivered. This lets a destination report row-level\n * failures without forcing already-succeeded rows onto the DLQ, which would\n * duplicate them on a later DLQ retry.\n *\n * Indices in `failed` must line up with the order of `batch.entries`.\n */\nexport type PushBatchFn<T extends TypesGeneric = Types> = (\n batch: Batch<Mapping<T>>,\n context: PushBatchContext<T>,\n) => WalkerOS.PromiseOrValue<void | BatchOutcome>;\n\nexport type PushEvent<Mapping = unknown> = {\n event: WalkerOS.Event;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n};\nexport type PushEvents<Mapping = unknown> = Array<PushEvent<Mapping>>;\n\nexport interface BatchEntry<Mapping = unknown> {\n event: WalkerOS.Event;\n ingest?: Ingest;\n respond?: import('../respond').RespondFn;\n rule?: WalkerOSMapping.Rule<Mapping>;\n data?: Data;\n}\n\nexport interface Batch<Mapping> {\n key: string;\n /**\n * Per-event entries carrying per-event ingest, respond, rule, and data.\n * Destinations needing per-event metadata should read this instead of\n * (or in addition to) `events` and `data`.\n */\n entries: BatchEntry<Mapping>[];\n /** Derived view: events from `entries`. Kept for back-compat. */\n events: WalkerOS.Events;\n /** Derived view: data from `entries`. Kept for back-compat. */\n data: Array<Data>;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n}\n\nexport interface BatchRegistry<Mapping> {\n [mappingKey: string]: {\n batched: Batch<Mapping>;\n /**\n * Marks a buffer created by `config.batch` (the destination-wide default\n * batch) rather than a mapping rule's own `batch`. The default buffer is\n * heterogeneous, so its flush reports `rule: undefined` to consumers.\n */\n isDefault?: boolean;\n batchFn: () => void;\n /**\n * Force a flush of the current batch immediately. Used by shutdown\n * drain and by tests for deterministic flushing without timer\n * advancement. Resolves after the underlying `pushBatch` settles.\n */\n flush: () => Promise<void>;\n };\n}\n\nexport type Data =\n | WalkerOS.Property\n | undefined\n | Array<WalkerOS.Property | undefined>;\n\nexport interface Ref {\n type: string; // Destination type (\"gtag\", \"meta\", \"bigquery\")\n data?: unknown; // Response from push()\n error?: unknown; // Error if failed\n}\n\nexport type Push = {\n queuePush?: WalkerOS.Events;\n error?: unknown;\n};\n\nexport type DLQ = Array<[WalkerOS.Event, unknown]>;\n\n/**\n * Typed accessor for destinations registered on a collector.\n *\n * The collector's `destinations` bag indexes to `Destination.Instance`\n * (defaults erase the generic). Use this helper at the call site to recover\n * the narrow type without casts.\n *\n * @example\n * type MyDestTypes = Destination.Types<MySettings, MyMapping>;\n * const dest = getDestination<MyDestTypes>(collector, 'myDest');\n * await dest.push(event, context);\n *\n * @throws Error with message `Destination not found: <id>` when the id is unknown.\n */\nexport function getDestination<T extends TypesGeneric = Types>(\n collector: { destinations: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const destination = collector.destinations[id];\n if (!destination) {\n throw new Error(`Destination not found: ${id}`);\n }\n return destination as unknown as Instance<T>;\n}\n","import type { Destination, Hooks, On, WalkerOS } from '.';\n\n// Event signatures only\nexport interface EventFn<R = Promise<PushResult>> {\n (partialEvent: WalkerOS.DeepPartialEvent): R;\n (event: string): R;\n (event: string, data: WalkerOS.Properties): R;\n}\n\n// Complete function interface - can be extended by other interfaces\nexport interface Fn<R = Promise<PushResult>, Config = unknown>\n extends EventFn<R>, WalkerCommands<R, Config> {\n // Interface intentionally empty - combines EventFn and WalkerCommands\n}\n\n// Walker commands (clear, predefined list)\nexport interface WalkerCommands<R = Promise<PushResult>, Config = unknown> {\n (event: 'walker config', config: Partial<Config>): R;\n (event: 'walker consent', consent: WalkerOS.Consent): R;\n <T extends Destination.Types>(\n event: 'walker destination',\n init: Destination.Init<T>,\n ): R;\n <K extends keyof Hooks.Functions>(\n event: 'walker hook',\n init: { name: K; fn: Hooks.Functions[K] },\n ): R;\n (\n event: 'walker on',\n init: {\n type: On.Types;\n rules: WalkerOS.SingleOrArray<On.Subscription>;\n },\n ): R;\n (event: 'walker user', user: WalkerOS.User): R;\n (\n event: 'walker run',\n runState?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): R;\n}\n\nexport type Event<R = Promise<PushResult>> = (\n partialEvent: WalkerOS.DeepPartialEvent,\n) => R;\n\n// Simplified push data types for core collector\nexport type PushData<Config = unknown> =\n | WalkerOS.DeepPartial<Config>\n | WalkerOS.Consent\n | WalkerOS.User\n | WalkerOS.Properties;\n\nexport interface PushResult {\n ok: boolean;\n event?: WalkerOS.Event;\n done?: Record<string, Destination.Ref>;\n queued?: Record<string, Destination.Ref>;\n failed?: Record<string, Destination.Ref>;\n /** Event was intentionally not forwarded: a transformer chain stopped it. */\n dropped?: boolean;\n}\n\n// Simplified Layer type for core collector\nexport type Layer = Array<IArguments | WalkerOS.DeepPartialEvent | unknown[]>;\n","// Define a generic type for functions with specific parameters and return type\nexport type AnyFunction<P extends unknown[] = never[], R = unknown> = (\n ...args: P\n) => R;\n\n// Define a generic type for a dictionary of functions\nexport type Functions = {\n [key: string]: AnyFunction;\n};\n\n// Define a parameter interface to wrap the function and its result\ninterface Parameter<P extends unknown[], R> {\n fn: (...args: P) => R;\n result?: R;\n}\n\n// Define the HookFn type using generics for better type safety\nexport type HookFn<T extends AnyFunction> = (\n params: Parameter<Parameters<T>, ReturnType<T>>,\n ...args: Parameters<T>\n) => ReturnType<T>;\n","/**\n * Log levels from most to least severe\n */\nexport enum Level {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\n/**\n * Normalized error context extracted from Error objects\n */\nexport interface ErrorContext {\n message: string;\n name: string;\n stack?: string;\n cause?: unknown;\n}\n\n/**\n * Context passed to log handlers\n * If an Error was passed, it's normalized into the error property\n */\nexport interface LogContext {\n [key: string]: unknown;\n error?: ErrorContext;\n}\n\n/**\n * Log message function signature\n * Accepts string or Error as message, with optional context\n */\nexport type LogFn = (\n message: string | Error,\n context?: unknown | Error,\n) => void;\n\n/**\n * Throw function signature - logs error then throws\n * Returns never as it always throws\n */\nexport type ThrowFn = (message: string | Error, context?: unknown) => never;\n\n/**\n * Default handler function (passed to custom handlers for chaining)\n */\nexport type DefaultHandler = (\n level: Level,\n message: string,\n context: LogContext,\n scope: string[],\n) => void;\n\n/**\n * Custom log handler function\n * Receives originalHandler to allow middleware-style chaining\n */\nexport type Handler = (\n level: Level,\n message: string,\n context: LogContext,\n scope: string[],\n originalHandler: DefaultHandler,\n) => void;\n\n/**\n * Logger instance with scoping support\n * All logs automatically include trace path from scoping\n */\nexport interface Instance {\n /**\n * Log an error message (always visible unless silenced)\n */\n error: LogFn;\n\n /**\n * Log a warning (degraded state, config issues, transient failures)\n */\n warn: LogFn;\n\n /**\n * Log an informational message\n */\n info: LogFn;\n\n /**\n * Log a debug message\n */\n debug: LogFn;\n\n /**\n * Log an error message and throw an Error\n * Combines logging and throwing in one call\n */\n throw: ThrowFn;\n\n /**\n * Output structured JSON data\n */\n json: (data: unknown) => void;\n\n /**\n * Create a scoped child logger with automatic trace path\n * @param name - Scope name (e.g., destination type, destination key)\n * @returns A new logger instance with the scope applied\n */\n scope: (name: string) => Instance;\n}\n\n/**\n * Logger configuration options\n */\nexport interface Config {\n /**\n * Minimum log level to display\n * @default Level.ERROR\n */\n level?: Level | keyof typeof Level;\n\n /**\n * Custom log handler function\n * Receives originalHandler to preserve default behavior\n */\n handler?: Handler;\n\n /** Custom handler for json() output. Default: console.log(JSON.stringify(data, null, 2)) */\n jsonHandler?: (data: unknown) => void;\n}\n\n/**\n * Internal config with resolved values and scope\n */\nexport interface InternalConfig {\n level: Level;\n handler?: Handler;\n jsonHandler?: (data: unknown) => void;\n scope: string[];\n}\n\n/**\n * Logger factory function type\n */\nexport type Factory = (config?: Config) => Instance;\n","import type { Collector, Destination, Logger, WalkerOS } from '.';\n\n/**\n * Shared mapping configuration interface.\n * Used by both Source.Config and Destination.Config.\n */\nexport interface Config<T = unknown> {\n consent?: WalkerOS.Consent; // Required consent to process events\n data?: Value | Values; // Global data transformation\n include?: string[]; // Event sections to flatten into context.data\n mapping?: Rules<Rule<T>>; // Event-specific mapping rules\n policy?: Policy; // Pre-processing rules\n}\n\nexport interface Policy {\n [key: string]: Value;\n}\n\nexport interface Rules<T = Rule> {\n [entity: string]: Record<string, T | Array<T>> | undefined;\n}\n\nexport interface Rule<Settings = unknown> {\n /**\n * Batch scheduling for this event mapping. When present, it splits this\n * event type into its own buffer, overriding `config.batch` per field\n * (`rule ?? config ?? default`). A bare number is the debounce `wait`\n * window. Object form supports `wait` (debounce ms), `size` (count cap),\n * and `age` (max ms since first entry).\n */\n batch?: number | Destination.BatchOptions;\n condition?: Condition; // Added condition\n consent?: WalkerOS.Consent; // Required consent states process the event\n settings?: Settings; // Arbitrary but protected configurations for custom event config\n data?: Data; // Mapping of event data\n include?: string[]; // Event sections to flatten into context.data\n ignore?: boolean; // Choose to no process an event when set to true\n silent?: boolean; // Process settings side effects, but suppress the destination's default push call\n name?: string; // Use a custom event name\n policy?: Policy; // Event-level policy applied after config-level policy\n /**\n * Merge mode (config layer): a partial Rule deep-merged onto the\n * package-shipped default rule at the same key, instead of replacing it.\n * Resolved at the consuming package's init via `mergeMappingRule`; not\n * seen by the runtime evaluator. A `null` value clears an inherited field.\n * Presence of `extend` or `remove` switches this rule from replace to merge.\n */\n extend?: RulePatch<Settings>;\n /**\n * Output layer: dotted paths stripped from the produced data payload\n * after evaluation, regardless of how each field was produced. Applied\n * last, so it always wins.\n */\n remove?: string[];\n}\n\n/**\n * A partial Rule used by `Rule.extend`. Every field is optional, and a\n * `null` value clears the inherited field (JSON merge-patch delete). The\n * control fields `extend` and `remove` are excluded: a patch models only\n * direct rule fields, matching what the runtime patch schema accepts.\n */\ntype RulePatchFields<Settings = unknown> = Omit<\n Rule<Settings>,\n 'extend' | 'remove'\n>;\nexport type RulePatch<Settings = unknown> = {\n [K in keyof RulePatchFields<Settings>]?: RulePatchFields<Settings>[K] | null;\n};\n\nexport interface Result {\n eventMapping?: Rule;\n mappingKey?: string;\n}\n\nexport type Data = Value | Values;\nexport type Value = ValueType | Array<ValueType>;\nexport type Values = Array<Value>;\nexport type ValueType = string | ValueConfig;\n\nexport interface ValueConfig {\n condition?: Condition;\n consent?: WalkerOS.Consent;\n fn?: Fn;\n key?: string;\n loop?: Loop;\n map?: Map;\n set?: Value[];\n validate?: Validate;\n value?: WalkerOS.PropertyType;\n}\n\n// Per-event callback context. Distinct from Context.Base (lifecycle-time) because mappings have no config/env of their own.\nexport interface Context {\n event: WalkerOS.DeepPartialEvent;\n /** The surrounding mapping config: a Value (value-level) or a Rule (rule-level). */\n mapping: Value | Rule;\n collector: Collector.Instance;\n logger: Logger.Instance;\n consent?: WalkerOS.Consent;\n}\n\nexport type Fn = (\n value: unknown,\n context: Context,\n) => WalkerOS.PromiseOrValue<WalkerOS.Property | unknown>;\n\nexport type Condition = (\n value: unknown,\n context: Context,\n) => WalkerOS.PromiseOrValue<boolean>;\n\nexport type Validate = (\n value: unknown,\n context: Context,\n) => WalkerOS.PromiseOrValue<boolean>;\n\nexport type Loop = [Value, Value];\n\nexport type Map = { [key: string]: Value };\n","import type { Collector, Destination, Logger, WalkerOS } from './';\n\n/** Collector state mapping for the `on` actions. */\nexport type Config = {\n config?: Array<GenericFn>;\n consent?: Array<ConsentRule>;\n custom?: Array<GenericFn>;\n globals?: Array<GenericFn>;\n ready?: Array<ReadyFn>;\n run?: Array<RunFn>;\n session?: Array<SessionFn>;\n user?: Array<UserFn>;\n};\n\n/** Allow arbitrary string events via `(string & {})`. */\nexport type Types = keyof Config | (string & {});\n\n/** Map each event type to its expected data payload type. */\nexport interface EventDataMap {\n config: Partial<Collector.Config>;\n consent: WalkerOS.Consent;\n custom: WalkerOS.Properties;\n globals: WalkerOS.Properties;\n ready: void;\n run: void;\n session: Collector.SessionData | undefined;\n user: WalkerOS.User;\n}\n\n/** Extract the data type for a specific event. */\nexport type EventData<T extends keyof EventDataMap> = EventDataMap[T];\n\n/** Union of all possible data types. */\nexport type AnyEventData = EventDataMap[keyof EventDataMap];\n\n/**\n * Context provided to every `on` callback.\n * Same posture as Mapping.Context: collector + logger only;\n * subscriptions are a collector-level concern, not a stage-level one.\n */\nexport interface Context {\n collector: Collector.Instance;\n logger: Logger.Instance;\n}\n\n/** Unified subscription callback shape. */\nexport type Fn<TData = unknown> = (\n data: TData,\n context: Context,\n) => WalkerOS.PromiseOrValue<void>;\n\n/** Typed-data variants for readability and IntelliSense. All reduce to Fn<TData>. */\nexport type ConsentFn = Fn<WalkerOS.Consent>;\nexport type GenericFn = Fn<unknown>;\nexport type ReadyFn = Fn<void>;\nexport type RunFn = Fn<void>;\nexport type SessionFn = Fn<Collector.SessionData | undefined>;\nexport type UserFn = Fn<WalkerOS.User>;\n\n/**\n * Consent rule: a record of `{ [consentKey]: ConsentFn }`.\n * Only the consent action uses this shape (per-key handler dispatch).\n */\nexport interface ConsentRule {\n [key: string]: ConsentFn;\n}\n\n/** Anything registerable via `walker.on(action, X)`: a typed callback or a consent rule record. */\nexport type Subscription =\n | ConsentRule\n | GenericFn\n | ReadyFn\n | RunFn\n | SessionFn\n | UserFn;\n\nexport interface OnConfig {\n config?: GenericFn[];\n consent?: ConsentRule[];\n custom?: GenericFn[];\n globals?: GenericFn[];\n ready?: ReadyFn[];\n run?: RunFn[];\n session?: SessionFn[];\n user?: UserFn[];\n [key: string]:\n | ConsentRule[]\n | GenericFn[]\n | ReadyFn[]\n | RunFn[]\n | SessionFn[]\n | UserFn[]\n | undefined;\n}\n\n/**\n * Destination `on` handler: receives the action type and a destination context.\n * Already context-style; kept for compatibility with the destination interface.\n */\nexport type OnFn<T extends Destination.TypesGeneric = Destination.Types> = (\n type: Types,\n context: Destination.Context<T>,\n) => WalkerOS.PromiseOrValue<void>;\n\nexport type OnFnRuntime = (\n type: Types,\n context: Destination.Context,\n) => WalkerOS.PromiseOrValue<void>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Collector, Logger, WalkerOS, Context as BaseContext } from '.';\nimport type { DestroyFn } from './lifecycle';\nimport type { Ingest } from './ingest';\nimport type { Config as MappingConfig } from './mapping';\nimport type { MatchExpression } from './matcher';\n\n/**\n * Unified route grammar for Flow v4. A `Route` is one of:\n * - a transformer ID string (`\"redact\"`)\n * - a sequence of routes (`[\"a\", \"b\", \"c\"]` — sugar for chained `.next`)\n * - a `RouteConfig` — a gated / dispatching node.\n *\n * `RouteConfig` is a disjoint union — set exactly one of `next`, `one`,\n * `many`, or neither (pure gate). The disjointness is enforced by `never`\n * sibling properties at the type level and `z.strictObject` at the schema\n * level.\n *\n * Operators:\n * - `next`: single continuation.\n * - `one`: first-match dispatch (walk entries, first whose match passes wins).\n * - `many`: all-match terminal fan-out (every matching entry spawns an\n * independent flow; main chain terminates here). Restricted to\n * pre-collector positions (source.next, transformer.next, transformer.before).\n */\nexport type Route = string | Route[] | RouteConfig;\n\nexport type RouteConfig =\n | RouteNextConfig\n | RouteOneConfig\n | RouteManyConfig\n | RouteGateConfig;\n\nexport interface RouteNextConfig {\n match?: MatchExpression;\n next: Route;\n one?: never;\n many?: never;\n}\n\nexport interface RouteOneConfig {\n match?: MatchExpression;\n one: Route[];\n next?: never;\n many?: never;\n}\n\nexport interface RouteManyConfig {\n match?: MatchExpression;\n many: Route[];\n next?: never;\n one?: never;\n}\n\nexport interface RouteGateConfig {\n match: MatchExpression;\n next?: never;\n one?: never;\n many?: never;\n}\n\n/**\n * Base environment interface for walkerOS transformers.\n *\n * Minimal like Destination - just an extensible object.\n * Transformers receive dependencies through context, not env.\n */\nexport interface BaseEnv {\n [key: string]: unknown;\n}\n\n/**\n * Type bundle for transformer generics.\n * Groups Settings, InitSettings, and Env into a single type parameter.\n * Follows the Source/Destination pattern.\n *\n * @template S - Settings configuration type\n * @template E - Environment type\n * @template I - InitSettings configuration type (user input)\n */\nexport interface Types<S = unknown, E = BaseEnv, I = S> {\n settings: S;\n initSettings: I;\n env: E;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access.\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n env: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle.\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\n\n/**\n * Inference helper: Extract Types from Instance.\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\n/**\n * Transformer configuration.\n */\nexport interface Config<T extends TypesGeneric = Types> {\n settings?: InitSettings<T>;\n env?: Env<T>;\n id?: string;\n logger?: Logger.Config;\n before?: Route; // Pre-transformer chain (runs before push)\n next?: Route; // Graph wiring to next transformer\n cache?: import('./cache').Cache; // Step-level cache config\n /** Declarative store get/set operations applied around this transformer. */\n state?: import('./state').State | import('./state').State[];\n init?: boolean; // Track init state (like Destination)\n disabled?: boolean; // Completely skip this transformer in chains\n /** Return this value instead of calling push(). Global mock for all chains. */\n mock?: unknown;\n /** Path-specific mock values keyed by chain path (e.g., \"destination.ga4.before\"). Takes precedence over global mock. */\n chainMocks?: Record<string, unknown>;\n /**\n * Declarative event-to-event mapping applied when this transformer step\n * has no `code`. Same field name as on `Destination.Config`, but the\n * semantic differs by position: on a destination, `mapping` produces a\n * vendor-shaped payload; on a transformer step, it mutates the event\n * itself. The collector synthesizes a push that runs\n * `processEventMapping` and returns the transformed event (or drops it\n * when a rule has `ignore: true`).\n *\n * At the transformer position, only event-mutating fields apply:\n * `policy`, `mapping[].policy`, `mapping[].name`, `mapping[].ignore`,\n * `mapping[].consent`, `include`. Vendor-payload fields (`data`,\n * `mapping[].data`, `silent`) are ignored at this position with a\n * one-time warning.\n */\n mapping?: MappingConfig;\n}\n\n/**\n * Context provided to transformer functions.\n * Extends base context with transformer-specific properties.\n */\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Config<T>, Env<T>> {\n id: string;\n ingest: Ingest;\n}\n\n/**\n * Unified result type for transformer functions.\n * Replaces the old union return type with a structured object.\n *\n * @field event - Modified event to continue with\n * @field respond - Wrapped respond function for downstream transformers\n * @field next - Branch to a different chain (replaces BranchResult)\n */\nexport interface Result<E = WalkerOS.DeepPartialEvent> {\n event?: E;\n respond?: import('../respond').RespondFn;\n next?: Route;\n}\n\n/**\n * Result of running a transformer chain.\n * Returns the processed event (singular, fan-out array, or null if dropped)\n * alongside the potentially wrapped respond function.\n *\n * `stopped` signals pipeline-halt — when set, the caller MUST NOT propagate\n * the event further downstream (no destinations, no subsequent chains).\n * Used by `cache.stop: true` on pre-collector transformers so the documented\n * \"downstream transformers and destinations are skipped\" semantic holds.\n */\nexport interface ChainResult {\n event: WalkerOS.DeepPartialEvent | WalkerOS.DeepPartialEvent[] | null;\n respond?: import('../respond').RespondFn;\n stopped?: true;\n /** Transformer that stopped the chain (returned false or threw). */\n droppedBy?: string;\n}\n\n/**\n * The main transformer function.\n *\n * Pre-collector transformers use default E = DeepPartialEvent.\n * Post-collector transformers can use E = Event for type-safe access.\n * A transformer written for DeepPartialEvent works in both positions\n * because Event is a subtype of DeepPartialEvent.\n *\n * @returns Result - structured result with event, respond, next\n * @returns Result[] - fan-out: each Result continues independently through remaining chain\n * @returns void - continue with current event unchanged (passthrough)\n * @returns false - stop chain, cancel further processing\n */\nexport type Fn<\n T extends TypesGeneric = Types,\n E = WalkerOS.DeepPartialEvent,\n> = (\n event: E,\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<Result<E> | Result<E>[] | false | void>;\n\n/**\n * Optional initialization function.\n * Called once before first push.\n *\n * @param context - Transformer context\n * @returns void - initialization successful\n * @returns false - initialization failed, skip this transformer\n * @returns Config<T> - return updated config\n */\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\n/**\n * Transformer instance returned by Init function.\n */\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n push: Fn<T>; // Named \"push\" for consistency with Source/Destination\n init?: InitFn<T>; // Optional, called once before first push\n destroy?: DestroyFn<Config<T>, Env<T>>;\n}\n\n/**\n * Transformer initialization function.\n * Creates a transformer instance from context.\n */\nexport type Init<T extends TypesGeneric = Types> = (\n context: Context<Types<Partial<Settings<T>>, Env<T>, InitSettings<T>>>,\n) => Instance<T> | Promise<Instance<T>>;\n\n/**\n * Configuration for initializing a transformer.\n * Used in collector registration.\n */\nexport type InitTransformer<T extends TypesGeneric = Types> = {\n /**\n * Initialization function. When omitted, the entry is a pass-through step:\n * - If `mapping` is present, the collector synthesizes a mapping-only\n * push using `processEventMapping`.\n * - Otherwise it's a named hop that only hosts a `before` / `next` /\n * `cache` chain.\n *\n * Validation: an entry without `code` must declare at least one of\n * `package`, `before`, `next`, `cache`, `state`, `mapping`. Enforced by\n * `validateStepEntry` in `@walkeros/core`.\n */\n code?: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n before?: Route;\n next?: Route;\n cache?: import('./cache').Cache;\n state?: import('./state').State | import('./state').State[];\n mapping?: MappingConfig;\n};\n\n/**\n * Transformers configuration for collector.\n * Maps transformer IDs to their initialization configurations.\n */\nexport interface InitTransformers {\n [transformerId: string]: InitTransformer<any>;\n}\n\n/**\n * Active transformer instances registry.\n */\nexport interface Transformers {\n [transformerId: string]: Instance;\n}\n\n/**\n * Typed accessor for transformers registered on a collector.\n *\n * The collector's `transformers` bag indexes to `Transformer.Instance`\n * (defaults erase the generic). Use this helper at the call site to recover\n * the narrow type without casts.\n *\n * @example\n * type MyTransformerTypes = Transformer.Types<MySettings>;\n * const tx = getTransformer<MyTransformerTypes>(collector, 'redact');\n * await tx.push(event, context);\n *\n * @throws Error with message `Transformer not found: <id>` when the id is unknown.\n */\nexport function getTransformer<T extends TypesGeneric = Types>(\n collector: { transformers: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const transformer = collector.transformers[id];\n if (!transformer) {\n throw new Error(`Transformer not found: ${id}`);\n }\n return transformer as unknown as Instance<T>;\n}\n","export interface Context {\n city?: string;\n country?: string;\n encoding?: string;\n hash?: string;\n ip?: string;\n language?: string;\n origin?: string;\n region?: string;\n userAgent?: string;\n [key: string]: string | undefined;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Elb,\n On,\n Logger,\n Mapping as WalkerOSMapping,\n Collector,\n Context as BaseContext,\n} from './index';\nimport type { Ingest } from './ingest';\nimport type { DestroyFn, SetupFn } from './lifecycle';\nimport type { RespondFn } from '../respond';\nimport type { Route } from './transformer';\n\n/**\n * Base Env interface for dependency injection into sources.\n *\n * Sources receive all their dependencies through this environment object,\n * making them platform-agnostic and easily testable.\n */\nexport interface BaseEnv {\n [key: string]: unknown;\n push: Collector.PushFn;\n command: Collector.CommandFn;\n sources?: Collector.Sources;\n elb: Elb.Fn;\n logger: Logger.Instance;\n}\n\n/**\n * Type bundle for source generics.\n * Groups Settings, Mapping, Push, Env, InitSettings, and Setup into a single type parameter.\n *\n * @template S - Settings configuration type\n * @template M - Mapping configuration type\n * @template P - Push function signature (flexible to support HTTP handlers, etc.)\n * @template E - Environment dependencies type\n * @template I - InitSettings configuration type (user input)\n * @template U - Setup options type (provisioning options for `walkeros setup`)\n */\nexport interface Types<\n S = unknown,\n M = unknown,\n P = Elb.Fn,\n E = BaseEnv,\n I = S,\n U = unknown,\n C = unknown,\n> {\n settings: S;\n initSettings: I;\n mapping: M;\n push: P;\n env: E;\n setup: U;\n credentials: C;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n push: any;\n env: any;\n setup: any;\n credentials: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Push<T extends TypesGeneric = Types> = T['push'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\nexport type SetupOptions<T extends TypesGeneric = Types> = T['setup'];\nexport type Credentials<T extends TypesGeneric = Types> = T['credentials'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Config<\n T extends TypesGeneric = Types,\n> extends WalkerOSMapping.Config<Mapping<T>> {\n /** Implementation-specific configuration passed to the init function. */\n settings?: InitSettings<T>;\n /**\n * Optional, strictly-typed credentials slot. Back it with a managed secret\n * via `$secret.NAME` (credentials use `$secret`, not `$env`). The package\n * defines the shape via `Types['credentials']`. `settings.<sdk>` stays the\n * escape hatch for raw SDK options.\n */\n credentials?: Credentials<T>;\n /** Runtime dependencies injected by the collector (push, command, logger, etc.). */\n env?: Env<T>;\n /** Source identifier; defaults to the InitSources object key. */\n id?: string;\n /** Logger configuration (level, handler) to override the collector's defaults. */\n logger?: Logger.Config;\n /**\n * Respond-first acknowledgement for response-producing server sources.\n *\n * When a source produces an HTTP response (express today; future fetch /\n * lambda), `async: true` (the default for such sources) responds 2xx\n * (\"accepted\") before the event is delivered to the collector, so the\n * client is not blocked on backend delivery. `async: false` waits for\n * delivery to settle before responding. A 2xx means \"accepted\", not\n * \"delivered\".\n *\n * Browser and dataLayer sources have no HTTP response to defer and ignore\n * this flag. The default is per source type.\n */\n async?: boolean;\n /** Mark as primary source; its push function becomes the exported `elb` from startFlow. */\n primary?: boolean;\n /** Defer source initialization until these collector events fire (e.g., `['consent']`). */\n require?: string[];\n /**\n * Provisioning options for `walkeros setup`. `boolean | object`.\n * Triggered only by explicit CLI invocation; never automatic.\n */\n setup?: boolean | SetupOptions<T>;\n /**\n * Ingest metadata extraction mapping.\n * Extracts values from raw request objects (Express req, Lambda event, etc.)\n * using walkerOS mapping syntax. Extracted data flows to transformers/destinations.\n *\n * @example\n * ingest: {\n * ip: 'req.ip',\n * ua: 'req.headers.user-agent',\n * origin: 'req.headers.origin'\n * }\n */\n ingest?: WalkerOSMapping.Data;\n /** Completely skip this source — no init, no event capture. */\n disabled?: boolean;\n /**\n * Init lifecycle flag. Set by the collector to `true` after `Instance.init()`\n * has been called. Used together with `require` to gate `on()` delivery:\n * lifecycle events are queued in `Instance.queueOn` until both\n * `config.init === true` and `config.require` is empty/absent, then replayed.\n */\n init?: boolean;\n /** Declarative store get/set operations applied around this source. */\n state?: import('./state').State | import('./state').State[];\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Push<T>,\n Env<T>,\n InitSettings<T>,\n SetupOptions<T>,\n Credentials<T>\n >\n>;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n setup?: SetupFn<Config<T>, Env<T>>;\n push: Push<T>;\n destroy?: DestroyFn<Config<T>, Env<T>>;\n on?(\n event: On.Types,\n context?: unknown,\n ): void | boolean | Promise<void | boolean>;\n /**\n * Optional setup hook. Called by the collector eagerly after all source\n * factories have run, regardless of `config.require`. Use for prep work\n * such as draining a pre-init window queue or attaching DOM listeners.\n * The collector still gates `on()` delivery, and `Collector.push`\n * enforces `allowed`/consent at the destination layer.\n */\n init?: () => void | Promise<void>;\n /**\n * Lifecycle event queue. Populated by `onApply` when the source is not\n * yet started (`config.init !== true` or `config.require` non-empty).\n * Flushed by the collector when the source becomes started.\n */\n queueOn?: Array<{ type: On.Types; data: unknown }>;\n}\n\n/**\n * Per-scope environment passed to the body of `Source.Context.withScope`.\n *\n * Each call to `withScope` builds a fresh `ScopeEnv` whose `push` captures\n * the per-scope `ingest` and `respond`. Concurrent scopes cannot crosstalk:\n * each one carries its own ingest and respond all the way through the\n * pipeline. Server sources MUST use `withScope` per inbound request; sources\n * with a single logical scope (browser tab lifetime, dataLayer) may skip it\n * and use the factory-scope `env.push` directly.\n */\nexport type ScopeEnv<T extends TypesGeneric = Types> = Env<T> & {\n /** Per-scope push: captures the scope's ingest and respond for this call. */\n push: Collector.PushFn;\n /** Ingest metadata extracted from the raw scope input (if config.ingest is set). */\n ingest: Ingest;\n /** Respond function bound to this scope (undefined for scopes without a response). */\n respond?: RespondFn;\n};\n\n/**\n * Context provided to source init function.\n * Extends base context with source-specific properties.\n */\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Partial<Config<T>>, Env<T>> {\n id: string;\n /**\n * Bind ingest and respond to a single scope of work (e.g. one inbound\n * HTTP request, one queue message). Builds a fresh `Ingest` from the\n * raw input via `config.ingest` mapping, wires the per-scope `respond`,\n * and invokes `body(scopeEnv)` with a push function that captures both.\n *\n * Server sources call this once per inbound request:\n *\n * ```ts\n * await context.withScope(req, createRespond(sender), async (env) => {\n * await env.push(parsedData);\n * });\n * ```\n *\n * Browser sources with a single tab-lifetime scope may skip `withScope`\n * and use `env.push` directly.\n *\n * @param rawScope - Raw input for `config.ingest` mapping (Express req,\n * Lambda event, fetch Request, etc.). Pass `undefined` if no ingest\n * mapping applies.\n * @param respond - Per-scope respond function, or `undefined` if the\n * scope produces no response.\n * @param body - Async callback receiving the per-scope env.\n * @returns The body's return value.\n */\n withScope: <R>(\n rawScope: unknown,\n respond: RespondFn | undefined,\n body: (env: ScopeEnv<T>) => Promise<R>,\n ) => Promise<R>;\n}\n\nexport type Init<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => Instance<T> | Promise<Instance<T>>;\n\nexport type InitSource<T extends TypesGeneric = Types> = {\n code: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n primary?: boolean;\n next?: Route;\n before?: Route;\n cache?: import('./cache').Cache;\n state?: import('./state').State | import('./state').State[];\n};\n\n/**\n * Sources configuration for collector.\n * Maps source IDs to their initialization configurations.\n */\nexport interface InitSources {\n [sourceId: string]: InitSource<any>;\n}\n\n/**\n * Renderer hint for source simulation UI.\n * - 'browser': Source needs a real DOM (iframe with live preview)\n * - 'codebox': Source uses a JSON/code editor (default)\n */\nexport type Renderer = 'browser' | 'codebox';\n\n/**\n * Typed accessor for sources registered on a collector.\n *\n * The collector's `sources` bag indexes to `Source.Instance` (defaults erase\n * the generic), which collapses the source's declared `push` signature to\n * `Elb.Fn`. Use this helper at the call site to recover the narrow type\n * without casts.\n *\n * @example\n * type TestSourceTypes = Source.Types<unknown, unknown, TestPushFn>;\n * const src = getSource<TestSourceTypes>(collector, 'testSource');\n * await src.push({ method: 'GET', path: '/api/data' }); // typed!\n *\n * @throws Error with message `Source not found: <id>` when the id is unknown.\n */\nexport function getSource<T extends TypesGeneric = Types>(\n collector: { sources: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const source = collector.sources[id];\n if (!source) {\n throw new Error(`Source not found: ${id}`);\n }\n // Single, contained narrowing. The runtime instance was constructed with\n // generic T at init time; the bag erased the parameter. We're restoring\n // information that already exists at runtime.\n return source as unknown as Instance<T>;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Logger, WalkerOS, Context as BaseContext } from '.';\nimport type { DestroyFn, SetupFn } from './lifecycle';\n\nexport interface BaseEnv {\n [key: string]: unknown;\n}\n\nexport interface Types<\n S = unknown,\n E = BaseEnv,\n I = S,\n U = unknown,\n C = unknown,\n> {\n settings: S;\n initSettings: I;\n env: E;\n setup: U;\n credentials: C;\n}\n\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n env: any;\n setup: any;\n credentials: any;\n};\n\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\nexport type SetupOptions<T extends TypesGeneric = Types> = T['setup'];\nexport type Credentials<T extends TypesGeneric = Types> = T['credentials'];\n\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Config<T extends TypesGeneric = Types> {\n settings?: InitSettings<T>;\n /**\n * Optional, strictly-typed credentials slot. Back it with a managed secret\n * via `$secret.NAME` (credentials use `$secret`, not `$env`). The package\n * defines the shape via `Types['credentials']`. `settings.<sdk>` stays the\n * escape hatch for raw SDK options.\n */\n credentials?: Credentials<T>;\n env?: Env<T>;\n id?: string;\n logger?: Logger.Config;\n /**\n * Provisioning options for `walkeros setup`. `boolean | object`.\n * Triggered only by explicit CLI invocation; never automatic.\n */\n setup?: boolean | SetupOptions<T>;\n /**\n * Persist values as raw bytes, byte-exact, bypassing the structured codec.\n * Default false: values are structured `StoreValue` and pass through the\n * shared core serialization codec. Set true only on byte-native backends\n * (fs/s3/gcs) whose consumer needs the exact bytes back, e.g. serving an\n * asset such as walker.js. Structured-only backends (sheets) reject `file:\n * true` at init. One store instance is exactly one mode.\n */\n file?: boolean;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Env<T>,\n InitSettings<T>,\n SetupOptions<T>,\n Credentials<T>\n >\n>;\n\nexport interface Context<\n T extends TypesGeneric = Types,\n> extends BaseContext.Base<Config<T>, Env<T>> {\n id: string;\n}\n\n/**\n * Canonical structured value persisted by a store. Includes `null`, but\n * EXCLUDES `undefined`: `undefined` is the reserved \"miss\" sentinel returned\n * by `GetFn` for an absent key, so it must never be a stored value.\n * `Uint8Array` is the platform-neutral binary leaf (never Node `Buffer`).\n */\nexport type StoreValue =\n | string\n | number\n | boolean\n | null\n | Uint8Array\n | StoreValue[]\n | { [key: string]: StoreValue };\n\nexport type GetFn<T extends StoreValue = StoreValue> = (\n key: string,\n) => T | undefined | Promise<T | undefined>;\n\nexport type SetFn<T extends StoreValue = StoreValue> = (\n key: string,\n value: T,\n /**\n * Optional expiry hint in ms; honored only by TTL-native backends\n * (in-memory, Redis). Byte/JSON backends may ignore it. Authoritative cache\n * expiry lives in the cache wrapper's {value, exp} payload.\n */\n ttl?: number,\n) => void | Promise<void>;\n\nexport type DeleteFn = (key: string) => void | Promise<void>;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n get: GetFn;\n set: SetFn;\n delete: DeleteFn;\n setup?: SetupFn<Config<T>, Env<T>>;\n destroy?: DestroyFn<Config<T>, Env<T>>;\n}\n\nexport type Init<T extends TypesGeneric = Types> = (\n context: Context<Types<Partial<Settings<T>>, Env<T>, InitSettings<T>>>,\n) => Instance<T> | Promise<Instance<T>>;\n\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: Context<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\nexport type InitStore<T extends TypesGeneric = Types> = {\n code: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n};\n\nexport interface InitStores {\n [storeId: string]: InitStore<any>;\n}\n\nexport interface Stores {\n [storeId: string]: Instance;\n}\n\n/**\n * Typed accessor for stores registered on a collector.\n *\n * The collector's `stores` bag indexes to `Store.Instance` (defaults erase\n * the generic). Use this helper at the call site to recover the narrow type\n * without casts.\n *\n * @example\n * type MyStoreTypes = Store.Types<MySettings>;\n * const store = getStore<MyStoreTypes>(collector, 'cache');\n * await store.set('key', 'value');\n *\n * @throws Error with message `Store not found: <id>` when the id is unknown.\n */\nexport function getStore<T extends TypesGeneric = Types>(\n collector: { stores: { [id: string]: Instance<any> } },\n id: string,\n): Instance<T> {\n const store = collector.stores[id];\n if (!store) {\n throw new Error(`Store not found: ${id}`);\n }\n return store as unknown as Instance<T>;\n}\n\n/**\n * Read-site narrowing helper for store values.\n *\n * `Instance.get`/`set` stay value-agnostic at `StoreValue`, so callers\n * that know the concrete shape narrow here instead of threading a value type\n * through `Store.Types`. The single narrow `as` cast is justified: the store\n * channel is structurally `StoreValue`, and the caller asserts the concrete\n * sub-shape it stored. `undefined` is preserved as the miss sentinel.\n */\nexport async function getStoreValue<V extends StoreValue = StoreValue>(\n store: Instance,\n key: string,\n): Promise<V | undefined> {\n return (await store.get(key)) as V | undefined;\n}\n","/**\n * Trigger — unified interface for invoking any walkerOS step in simulation\n * and testing. Every package exports a `createTrigger` factory from its\n * examples that conforms to `Trigger.CreateFn`.\n *\n * Usage:\n * const { flow, trigger } = await createTrigger(initConfig);\n * const result = await trigger(type?, options?)(content);\n *\n * @packageDocumentation\n */\n\nimport type { Collector, Elb } from '.';\n\n/** Flow access handle returned by createTrigger. */\nexport interface FlowHandle {\n /** The collector instance created by startFlow. */\n collector: Collector.Instance;\n /** The elb push function for direct event injection. */\n elb: Elb.Fn;\n}\n\n/** What createTrigger returns — a flow handle (lazy) and a trigger function. */\nexport interface Instance<TContent = unknown, TResult = unknown> {\n /** Flow handle — undefined until first trigger() call, then stable. */\n readonly flow: FlowHandle | undefined;\n trigger: Fn<TContent, TResult>;\n}\n\n/**\n * Curried trigger function — always async.\n *\n * First call selects mechanism (type) and configures it (options).\n * Second call fires with content and returns result.\n *\n * @example\n * // Browser source — click trigger\n * trigger('click', 'button.cta')('<button data-elb=\"cta\">Sign Up</button>')\n *\n * // Express source — POST request\n * trigger('POST')({ path: '/collect', body: { name: 'page view' } })\n *\n * // DataLayer — default mechanism\n * trigger()(['event', 'purchase', { value: 25.42 }])\n */\nexport type Fn<TContent = unknown, TResult = unknown> = (\n type?: string,\n options?: unknown,\n) => (content: TContent) => Promise<TResult>;\n\n/**\n * Factory function exported by each package's examples.\n *\n * Receives full Collector.InitConfig. Does NOT call startFlow eagerly —\n * startFlow is deferred to the first trigger() invocation (lazy init).\n * The flow property uses a getter to read the closure variable live.\n * createTrigger itself stays async for consistency (other packages may\n * need await during setup). Config is passed through UNMODIFIED —\n * validation is startFlow's job.\n *\n * @example\n * // Package exports:\n * export const createTrigger: Trigger.CreateFn<HTMLContent, void> = async (config) => {\n * let flow: Trigger.FlowHandle | undefined;\n *\n * const trigger: Trigger.Fn<HTMLContent, void> = (type?, options?) => async (content) => {\n * // Pre-startFlow work (e.g., inject HTML for browser source)\n * // ...\n *\n * // Lazy init — only on first call\n * if (!flow) flow = await startFlow(config);\n *\n * // Post-startFlow work (e.g., dispatch click event)\n * // ...\n * };\n *\n * return {\n * get flow() { return flow; },\n * trigger,\n * };\n * };\n */\nexport type CreateFn<TContent = unknown, TResult = unknown> = (\n config: Collector.InitConfig,\n options?: unknown,\n) => Promise<Instance<TContent, TResult>>;\n","// packages/core/src/types/lifecycle.ts\nimport type { Logger, WalkerOS } from '.';\n\n/**\n * Shared context for one-shot lifecycle hooks (setup, destroy).\n * No event pipeline machinery — just config, env, logger, and id.\n */\nexport interface LifecycleContext<C = unknown, E = unknown> {\n id: string;\n config: C;\n env: E;\n logger: Logger.Instance;\n}\n\n/**\n * Setup function signature. Called once via `walkeros setup <kind>.<name>`.\n * Packages own idempotency and error semantics. Return value (if any) is\n * JSON-stringified to stdout by the CLI for scripting use.\n */\nexport type SetupFn<C = unknown, E = unknown> = (\n context: LifecycleContext<C, E>,\n) => WalkerOS.PromiseOrValue<unknown>;\n\n/**\n * Destroy function signature for step lifecycle cleanup.\n */\nexport type DestroyFn<C = unknown, E = unknown> = (\n context: LifecycleContext<C, E>,\n) => WalkerOS.PromiseOrValue<void>;\n\n/**\n * @deprecated Use `LifecycleContext` instead. Kept as alias for one minor cycle.\n */\nexport type DestroyContext<C = unknown, E = unknown> = LifecycleContext<C, E>;\n","import type { Elb as ElbTypes } from '.';\n\nexport type AnyObject<T = unknown> = Record<string, T>;\nexport type Elb = ElbTypes.Fn;\nexport type AnyFunction = (...args: unknown[]) => unknown;\nexport type SingleOrArray<T> = T | Array<T>;\n\nexport type Events = Array<Event>;\nexport type PartialEvent = Partial<Event>;\nexport type DeepPartialEvent = DeepPartial<Event>;\nexport interface Event {\n name: string;\n data: Properties;\n context: OrderedProperties;\n globals: Properties;\n custom: Properties;\n user: User;\n nested: Entities;\n consent: Consent;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n source: Source;\n}\n\nexport interface Consent {\n [name: string]: boolean; // name of consent group or tool\n}\n\nexport interface User extends Properties {\n // IDs\n id?: string;\n device?: string;\n session?: string;\n hash?: string;\n // User related\n address?: string;\n email?: string;\n phone?: string;\n userAgent?: string;\n browser?: string;\n browserVersion?: string;\n deviceType?: string;\n language?: string;\n country?: string;\n region?: string;\n city?: string;\n zip?: string;\n timezone?: string;\n os?: string;\n osVersion?: string;\n screenSize?: string;\n ip?: string;\n internal?: boolean;\n}\n\nexport type SourcePlatform =\n | 'web'\n | 'server'\n | 'app'\n | 'ios'\n | 'android'\n | 'terminal'\n | string;\n\n/**\n * SourceMap is the discriminated-union registry for source kinds.\n * Each source package augments this interface via `declare module\n * '@walkeros/core'` to register its own `type` literal and any\n * source-specific fields. Conflicting declarations cause compile errors,\n * intentional, to surface naming collisions early.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface SourceMap {\n collector: { type: 'collector' };\n}\n\n/**\n * Declared (named) fields of an event Source. Kept as a standalone interface so\n * its key set stays index-signature-free: `Source extends Properties` adds a\n * string index signature that collapses `keyof Source` to `string | number`,\n * which would defeat the type↔schema drift guard. The guard compares\n * `keyof SourceFields` against `keyof z.infer<typeof SourceFieldsSchema>`\n * (see schemas/__tests__/config-drift.test-d.ts).\n */\nexport interface SourceFields {\n type: string;\n platform?: SourcePlatform;\n /** Deployment version of the source emitter (string). */\n version?: string;\n /** Event-model spec version. Collector defaults to \"4\". */\n schema?: string;\n /** Emission sequence within the run. */\n count?: number;\n /** Trace id shared by every event of a run (W3C trace-id shape). */\n trace?: string;\n /** Per-flow config release map, keyed by flow name (source.release[flowName]). Accumulates across walkerOS→walkerOS crossings. */\n release?: Record<string, string>;\n /** Walker-controlled standard suggestions (sources may set). */\n url?: string;\n referrer?: string;\n tool?: string;\n command?: string;\n}\n\nexport interface Source extends Properties, SourceFields {}\n\nexport type PropertyType =\n | boolean\n | string\n | number\n | { [key: string]: Property };\n\nexport type Property = PropertyType | Array<PropertyType>;\n\nexport interface Properties {\n [key: string]: Property | undefined;\n}\nexport interface OrderedProperties {\n [key: string]: [Property, number] | undefined;\n}\n\nexport type Entities = Array<Entity>;\nexport interface Entity {\n entity: string;\n data: Properties;\n nested?: Entities;\n context?: OrderedProperties;\n}\n\nexport type ConsentHandler = Record<string, AnyFunction>;\nexport type ActionHandler = AnyFunction;\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type PromiseOrValue<T> = T | Promise<T>;\n","import type { WalkerOS } from '.';\n\n/**\n * A recorded function call made during simulation.\n * Captures what a destination called on its env (e.g., window.gtag).\n */\nexport interface Call {\n /** Dot-path of the function called: \"window.gtag\", \"dataLayer.push\" */\n fn: string;\n /** Arguments passed to the function */\n args: unknown[];\n /** Unix timestamp in ms */\n ts: number;\n}\n\n/**\n * Result of simulating a single step.\n * Same shape for source, transformer, collector, and destination.\n */\nexport interface Result {\n /** Which step type was simulated */\n step: 'source' | 'transformer' | 'destination' | 'collector';\n /** Step name, e.g. \"gtag\", \"dataLayer\", \"enricher\" */\n name: string;\n /**\n * Output events:\n * - source: captured pre-collector events\n * - transformer: [transformed event] or [] if filtered\n * - collector: [enriched event] (createEvent applied)\n * - destination: [] (destinations don't produce events)\n */\n events: WalkerOS.DeepPartialEvent[];\n /** Intercepted env calls. Populated for destinations, empty [] for others. */\n calls: Call[];\n /** Execution time in ms */\n duration: number;\n /**\n * Entity-action key of the matched mapping rule, e.g. \"product add\" or\n * \"product *\". Populated for destination simulations when a mapping rule\n * matched; absent when no rule matched or the step has no mapping.\n * Also absent when the matched rule uses batched delivery (batching\n * reports no per-event key) and on error results, where the key is not\n * available.\n */\n mappingKey?: string;\n /** Error if the step threw */\n error?: Error;\n}\n","export type MatchExpression =\n | MatchCondition\n | { and: MatchExpression[] }\n | { or: MatchExpression[] };\n\nexport interface MatchCondition {\n key: string;\n operator: MatchOperator;\n value: string;\n not?: boolean;\n}\n\nexport type MatchOperator =\n | 'eq'\n | 'contains'\n | 'prefix'\n | 'suffix'\n | 'regex'\n | 'gt'\n | 'lt'\n | 'exists';\n\n// Compiled matcher (internal)\nexport type CompiledMatcher = (context: Record<string, unknown>) => boolean;\n","export interface Code {\n lang?: string;\n code: string;\n}\n\nexport interface Hint {\n text: string;\n code?: Array<Code>;\n}\n\nexport type Hints = Record<string, Hint>;\n","export type StorageType = 'local' | 'session' | 'cookie';\n\nexport const Storage = {\n Local: 'local' as const,\n Session: 'session' as const,\n Cookie: 'cookie' as const,\n} as const;\n\nexport const Const = {\n Utils: {\n Storage,\n },\n} as const;\n","/**\n * Metadata managed by the runtime. Do not overwrite from step code.\n * The _ prefix signals \"runtime-managed.\"\n */\nexport interface IngestMeta {\n /** Number of steps this data has passed through. */\n hops: number;\n /** Ordered list of step IDs visited. path[0] is always the source ID. */\n path: string[];\n /** Current chain context, e.g., \"destination.ga4.before\" or \"source.web.next\". */\n chainPath?: string;\n /** W3C 32-hex trace id adopted from an inbound traceparent header. */\n trace?: string;\n /** Parent span (upstream event.id) from an inbound traceparent header. */\n parentEventId?: string;\n}\n\n/**\n * Mutable shared context that accumulates knowledge as data flows through the graph.\n *\n * Event = strict schema (analytics data).\n * Ingest = wild west (pipeline context).\n *\n * Any step can read and write arbitrary keys. The `_meta` section is\n * managed by the runtime — increment hops and append to path before each step.\n */\nexport interface Ingest {\n [key: string]: unknown;\n _meta: IngestMeta;\n}\n\n/** Create a fresh Ingest for a new pipeline invocation. */\nexport function createIngest(sourceId: string): Ingest {\n return {\n _meta: {\n hops: 0,\n path: [sourceId],\n },\n };\n}\n","import type { Transformer, WalkerOS } from './types';\n\n/**\n * Creates a TransformerResult for dynamic chain routing.\n * Use this in transformer push functions to redirect the chain.\n */\nexport function branch(\n event: WalkerOS.DeepPartialEvent,\n next: Transformer.Route,\n): Transformer.Result {\n return { event, next };\n}\n","/**\n * Anonymizes an IPv4 address by setting the last octet to 0.\n *\n * @param ip The IP address to anonymize.\n * @returns The anonymized IP address or an empty string if the IP is invalid.\n */\nexport function anonymizeIP(ip: string): string {\n const ipv4Pattern = /^(?:\\d{1,3}\\.){3}\\d{1,3}$/;\n\n if (!ipv4Pattern.test(ip)) return '';\n\n return ip.replace(/\\.\\d+$/, '.0'); // Set the last octet to 0\n}\n","/**\n * Throws an error.\n *\n * @param error The error to throw.\n */\nexport function throwError(error: unknown): never {\n throw new Error(String(error));\n}\n","import type { Flow } from './types';\nimport { throwError } from './throwError';\n\n/** Annotation keys to strip from AJV-compatible schemas. */\nconst ANNOTATION_KEYS = new Set([\n 'description',\n 'examples',\n 'title',\n '$comment',\n]);\n\n/** Options for {@link resolveContracts}. */\nexport interface ResolveContractsOptions {\n /**\n * When true (default), annotation keys (`description`, `examples`, `title`,\n * `$comment`) are stripped from event schemas so the result is AJV-clean for\n * runtime validation. Set to false to keep annotations (e.g. for IntelliSense\n * that surfaces property descriptions).\n */\n stripAnnotations?: boolean;\n}\n\n/**\n * Resolve all named contracts: process extend chains, expand wildcards,\n * strip annotations from event schemas.\n *\n * Returns a fully resolved map where each contract entry has inherited\n * properties merged in and wildcards expanded into concrete actions.\n *\n * By default annotations are stripped (AJV-clean). Pass\n * `{ stripAnnotations: false }` to preserve `description`/`examples`/`title`\n * on event schemas.\n */\nexport function resolveContracts(\n contracts: Flow.Contract,\n options?: ResolveContractsOptions,\n): Record<string, Flow.ContractRule> {\n const strip = options?.stripAnnotations !== false;\n const resolved: Record<string, Flow.ContractRule> = {};\n const resolving = new Set<string>(); // Circular detection\n\n function resolve(name: string): Flow.ContractRule {\n if (resolved[name]) return resolved[name];\n\n if (resolving.has(name)) {\n throwError(\n `Circular extend chain detected: ${[...resolving, name].join(' → ')}`,\n );\n }\n\n const entry = contracts[name];\n if (!entry) {\n throwError(`Contract \"${name}\" not found`);\n }\n\n resolving.add(name);\n\n let result: Flow.ContractRule = {};\n\n // 1. Resolve parent first (if extend)\n if (entry.extend) {\n const parent = resolve(entry.extend);\n result = mergeContractEntries(parent, entry);\n } else {\n result = { ...entry };\n }\n\n // Remove extend from resolved entry\n delete result.extend;\n\n // 2. Expand wildcards in events\n if (result.events) {\n result.events = expandWildcards(result.events);\n }\n\n // 3. Strip annotations from event schemas (not from section schemas).\n // Skipped when stripAnnotations is false (annotation-preserving view).\n if (result.events && strip) {\n const stripped: Flow.ContractEvents = {};\n for (const [entity, actions] of Object.entries(result.events)) {\n stripped[entity] = {};\n for (const [action, schema] of Object.entries(actions)) {\n stripped[entity][action] = stripAnnotations(schema);\n }\n }\n result.events = stripped;\n }\n\n resolving.delete(name);\n resolved[name] = result;\n return result;\n }\n\n // Resolve all contracts\n for (const name of Object.keys(contracts)) {\n resolve(name);\n }\n\n return resolved;\n}\n\n/**\n * Merge two contract entries additively.\n * Scalar metadata (tagging, description): child wins, otherwise inherited.\n * `schema`: deep additive merge via mergeContractSchemas.\n * `events`: per-entity-action merge.\n */\nfunction mergeContractEntries(\n parent: Flow.ContractRule,\n child: Flow.ContractRule,\n): Flow.ContractRule {\n const result: Flow.ContractRule = {};\n\n // Scalar metadata: child overrides if set, otherwise inherited.\n if (parent.tagging !== undefined || child.tagging !== undefined) {\n result.tagging = child.tagging ?? parent.tagging;\n }\n if (parent.description !== undefined || child.description !== undefined) {\n result.description = child.description ?? parent.description;\n }\n\n // Schema: additive deep-merge via mergeContractSchemas.\n if (parent.schema && child.schema) {\n result.schema = mergeContractSchemas(\n parent.schema as Record<string, unknown>,\n child.schema as Record<string, unknown>,\n ) as Flow.ContractRule['schema'];\n } else if (parent.schema || child.schema) {\n result.schema = {\n ...((parent.schema || child.schema) as Record<string, unknown>),\n } as Flow.ContractRule['schema'];\n }\n\n // Events: per-entity-action merge (unchanged semantics).\n if (parent.events || child.events) {\n const merged: Flow.ContractEvents = {};\n const allEntities = new Set([\n ...Object.keys(parent.events || {}),\n ...Object.keys(child.events || {}),\n ]);\n\n for (const entity of allEntities) {\n const pActions = parent.events?.[entity] || {};\n const cActions = child.events?.[entity] || {};\n const allActions = new Set([\n ...Object.keys(pActions),\n ...Object.keys(cActions),\n ]);\n\n merged[entity] = {};\n for (const action of allActions) {\n const pSchema = pActions[action];\n const cSchema = cActions[action];\n if (pSchema && cSchema) {\n merged[entity][action] = mergeContractSchemas(\n pSchema as Record<string, unknown>,\n cSchema as Record<string, unknown>,\n );\n } else {\n merged[entity][action] = {\n ...((pSchema || cSchema) as Record<string, unknown>),\n };\n }\n }\n }\n\n result.events = merged;\n }\n\n return result;\n}\n\n/**\n * Expand wildcards in an events map.\n * Merges *.* into all concrete actions, *.action into matching actions,\n * entity.* into all actions of that entity.\n */\nfunction expandWildcards(events: Flow.ContractEvents): Flow.ContractEvents {\n const result: Flow.ContractEvents = {};\n\n // For each concrete entity-action pair, merge all matching wildcard levels\n for (const entity of Object.keys(events)) {\n if (entity === '*') continue;\n result[entity] = {};\n\n for (const action of Object.keys(events[entity] || {})) {\n let merged: Record<string, unknown> = {};\n\n // Level 1: *.*\n const globalWild = events['*']?.['*'];\n if (globalWild)\n merged = mergeContractSchemas(\n merged,\n globalWild as Record<string, unknown>,\n );\n\n // Level 2: *.action\n const actionWild = events['*']?.[action];\n if (actionWild && action !== '*')\n merged = mergeContractSchemas(\n merged,\n actionWild as Record<string, unknown>,\n );\n\n // Level 3: entity.*\n const entityWild = events[entity]?.['*'];\n if (entityWild && action !== '*')\n merged = mergeContractSchemas(\n merged,\n entityWild as Record<string, unknown>,\n );\n\n // Level 4: entity.action\n const exact = events[entity]?.[action];\n if (exact)\n merged = mergeContractSchemas(merged, exact as Record<string, unknown>);\n\n result[entity][action] = merged;\n }\n }\n\n // Preserve * entries for reference\n if (events['*']) {\n result['*'] = { ...events['*'] };\n }\n\n return result;\n}\n\n/**\n * Deep merge two JSON Schema objects with additive semantics.\n * - `required` arrays: union (deduplicated)\n * - `properties`: deep merge (child wins on conflict for scalars)\n * - Scalars: child overrides parent\n */\nexport function mergeContractSchemas(\n parent: Record<string, unknown>,\n child: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...parent };\n\n for (const key of Object.keys(child)) {\n const parentVal = parent[key];\n const childVal = child[key];\n\n if (\n key === 'required' &&\n Array.isArray(parentVal) &&\n Array.isArray(childVal)\n ) {\n result[key] = [...new Set([...parentVal, ...childVal])];\n } else if (isPlainObject(parentVal) && isPlainObject(childVal)) {\n result[key] = mergeContractSchemas(\n parentVal as Record<string, unknown>,\n childVal as Record<string, unknown>,\n );\n } else {\n result[key] = childVal;\n }\n }\n\n return result;\n}\n\n/**\n * Strip annotation-only keys from a schema (deep).\n */\nfunction stripAnnotations(\n schema: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (ANNOTATION_KEYS.has(key)) continue;\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = stripAnnotations(value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * walkerOS reference-syntax regex constants — single source of truth.\n *\n * Rule:\n * - `.` = key or path (resolver walks it)\n * - `:` = literal value or raw-code payload (resolver uses it verbatim)\n *\n * Every tool that recognizes references (core resolver, CLI bundler,\n * app secrets service, explorer IntelliSense) imports these — no\n * inline regexes elsewhere.\n */\n\n// Anchored: matches only when the string is exactly \"$var.name(.deep.path)?\"\nexport const REF_VAR_FULL =\n /^\\$var\\.([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)$/;\n\n// Global inline: matches any \"$var.name(.deep.path)?\" inside a larger string.\n// Character class excludes `/`, `:`, `?`, `&`, etc. so URL contexts work.\nexport const REF_VAR_INLINE =\n /\\$var\\.([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)/g;\nexport const REF_ENV = /\\$env\\.([a-zA-Z_][a-zA-Z0-9_]*)(?::([^\"}\\s]*))?/g;\nexport const REF_CONTRACT = /^\\$contract\\.([a-zA-Z_][a-zA-Z0-9_]*)(?:\\.(.+))?$/;\n/** Whole-string `$flow.<name>(.<path>)?`: cross-flow value reference. */\nexport const REF_FLOW =\n /^\\$flow\\.([a-zA-Z_][a-zA-Z0-9_]*)(?:\\.([a-zA-Z0-9_.]+))?$/;\nexport const REF_STORE = /^\\$store\\.([a-zA-Z_][a-zA-Z0-9_]*)$/;\nexport const REF_SECRET = /^\\$secret\\.([A-Z0-9_]+)$/;\nexport const REF_CODE_PREFIX = '$code:';\n\nconst FLOW_REF_PATTERN = /\\$flow\\.([a-zA-Z_][a-zA-Z0-9_]*)/g;\n\n/**\n * Canonical scanner for the `$flow.` reference grammar. Walks strings,\n * arrays, and objects and returns every referenced flow name. The returned\n * set is the same instance as `into` when one is supplied, so callers can\n * accumulate across multiple values.\n */\nexport function scanFlowRefs(value: unknown, into?: Set<string>): Set<string> {\n const refs = into ?? new Set<string>();\n if (typeof value === 'string') {\n for (const m of value.matchAll(FLOW_REF_PATTERN)) refs.add(m[1]);\n return refs;\n }\n if (value && typeof value === 'object') {\n for (const v of Object.values(value as Record<string, unknown>))\n scanFlowRefs(v, refs);\n }\n return refs;\n}\n","/**\n * Flow Configuration Utilities\n *\n * Functions for resolving and processing Flow configurations.\n *\n * @packageDocumentation\n */\n\nimport type { Flow } from './types';\nimport { resolveContracts } from './contract';\nimport {\n REF_CONTRACT,\n REF_ENV,\n REF_FLOW,\n REF_SECRET,\n REF_VAR_FULL,\n REF_VAR_INLINE,\n} from './references';\nimport { throwError } from './throwError';\n\n/**\n * Merge variables with cascade priority.\n * Later arguments have higher priority.\n */\nfunction mergeVariables(\n ...sources: (Flow.Variables | undefined)[]\n): Flow.Variables {\n const result: Flow.Variables = {};\n for (const source of sources) {\n if (source) {\n Object.assign(result, source);\n }\n }\n return result;\n}\n\n/** Sentinel prefix for deferred $env resolution. Shared with CLI bundler. */\nexport const ENV_MARKER_PREFIX = '__WALKEROS_ENV:';\n\n/** Sentinel prefix for deferred $secret resolution. Shared with CLI bundler. */\nexport const SECRET_MARKER_PREFIX = '__WALKEROS_SECRET:';\n\nexport interface ResolveOptions {\n deferred?: boolean;\n /**\n * When false, unresolved `$flow.X.Y` refs (unknown flow, missing key,\n * empty value) trigger {@link onWarning} and the original `$flow…` string\n * is left in place. Cycles always throw regardless of this flag.\n * Default: true (strict — throws as today).\n */\n strictFlowRefs?: boolean;\n /** Called for each unresolved $flow ref when {@link strictFlowRefs} is false. */\n onWarning?: (message: string) => void;\n}\n\n/** Format an actionable hint when `$flow.X.Y` cannot be resolved. */\nfunction formatUnresolvedFlowMessage(\n flowName: string,\n path: string | undefined,\n reason: 'unknown-flow' | 'missing-key',\n): string {\n const ref = `$flow.${flowName}${path ? `.${path}` : ''}`;\n if (reason === 'unknown-flow') {\n return `${ref} cannot resolve: flow \"${flowName}\" does not exist in this config.`;\n }\n // missing-key (includes empty url / missing settings.X)\n const target = path\n ? `flows.${flowName}.config.${path}`\n : `flows.${flowName}.config`;\n return `${ref} is empty. Set ${target}, or run \\`walkeros deploy ${flowName}\\` first.`;\n}\n\n/**\n * Walk a dot-separated path into a value.\n * Throws if any intermediate segment is missing or not an object.\n */\nexport function walkPath(\n value: unknown,\n path: string,\n refPrefix: string,\n): unknown {\n const segments = path.split('.');\n let current = value;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (\n current === null ||\n current === undefined ||\n typeof current !== 'object'\n ) {\n const visited = segments.slice(0, i).join('.');\n throwError(\n `Path \"${path}\" not found in \"${refPrefix}\": \"${segment}\" does not exist${visited ? ` in \"${visited}\"` : ''}`,\n );\n }\n const obj = current as Record<string, unknown>;\n if (!(segment in obj)) {\n const visited = segments.slice(0, i).join('.');\n throwError(\n `Path \"${path}\" not found in \"${refPrefix}\": \"${segment}\" does not exist${visited ? ` in \"${visited}\"` : ''}`,\n );\n }\n current = obj[segment];\n }\n\n return current;\n}\n\n/**\n * Resolver callback for `$flow.X.Y` references.\n *\n * Given a sibling flow name, returns its fully resolved `Flow.Config` block\n * (with `$env`/`$var`/`$contract` already resolved) as `unknown` so that\n * {@link walkPath} can traverse it. Returns `undefined` if the flow does\n * not exist. Implementations are responsible for cycle detection across\n * recursive calls.\n */\nexport type FlowConfigResolver = (flowName: string) => unknown;\n\n/**\n * Resolve all dynamic patterns in a value.\n *\n * Patterns:\n * - $var.name (or $var.name.deep.path) → Look up variables[name], optional deep\n * path walk. Whole-string match preserves the native type of the variable\n * (object, array, number, boolean, string). Inline interpolation requires a\n * scalar (string/number/boolean) and throws on objects/arrays. Resolution is\n * recursive (variables may reference other variables) with cycle detection.\n * - $env.NAME or $env.NAME:default → Look up process.env[NAME] (non-secret config)\n * - $secret.NAME → Managed secret. In deferred (server) mode emits a marker the\n * bundler turns into a runtime process.env read; the deploy pipeline injects\n * the secret value. Throws in non-deferred (web) mode. Use for credentials.\n * - $contract.name(.path)? → Resolved contract value (when contracts available)\n * - $flow.name(.path)? → Sibling flow's resolved {@link Flow.Config} (when resolver available)\n *\n * Top-level object keys are preserved verbatim (only values are walked), so an\n * object input retains its declared shape after resolution. The overload below\n * lets callers pass a typed object (e.g. `Flow.Config`) and get the same type\n * back without an unsafe cast. Strings that are whole-pattern references may\n * resolve to arbitrary types — callers passing a typed object should not rely\n * on individual string fields being preserved as strings.\n */\nfunction resolvePatterns<T extends object>(\n value: T,\n variables: Flow.Variables,\n options?: ResolveOptions,\n resolvedContracts?: Record<string, Flow.ContractRule>,\n resolveFlow?: FlowConfigResolver,\n varVisiting?: Set<string>,\n): T;\nfunction resolvePatterns(\n value: unknown,\n variables: Flow.Variables,\n options?: ResolveOptions,\n resolvedContracts?: Record<string, Flow.ContractRule>,\n resolveFlow?: FlowConfigResolver,\n varVisiting?: Set<string>,\n): unknown;\nfunction resolvePatterns(\n value: unknown,\n variables: Flow.Variables,\n options?: ResolveOptions,\n resolvedContracts?: Record<string, Flow.ContractRule>,\n resolveFlow?: FlowConfigResolver,\n varVisiting?: Set<string>,\n): unknown {\n if (typeof value === 'string') {\n // Whole-string $var match: preserve native type, support deep paths\n const fullMatch = value.match(REF_VAR_FULL);\n if (fullMatch) {\n const path = fullMatch[1]; // e.g. \"name\" or \"name.deep.path\"\n const segments = path.split('.');\n const varName = segments[0];\n const deepPath = segments.slice(1).join('.');\n\n if (variables[varName] === undefined) {\n throwError(`Variable \"${varName}\" not found`);\n }\n\n const visiting = varVisiting ?? new Set<string>();\n if (visiting.has(varName)) {\n const chain = [...visiting, varName].join(' -> ');\n throwError(`Cyclic $var reference: ${chain}`);\n }\n\n visiting.add(varName);\n let resolved: unknown;\n try {\n resolved = resolvePatterns(\n variables[varName],\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n visiting,\n );\n } finally {\n visiting.delete(varName);\n }\n\n if (deepPath) {\n resolved = walkPath(resolved, deepPath, `$var.${varName}`);\n }\n\n return resolved;\n }\n\n // Check if entire string is a $contract reference with path\n const contractMatch = value.match(REF_CONTRACT);\n if (contractMatch && resolvedContracts) {\n const contractName = contractMatch[1];\n const path = contractMatch[2];\n\n if (!(contractName in resolvedContracts)) {\n throwError(`Contract \"${contractName}\" not found`);\n }\n\n let resolved: unknown = resolvedContracts[contractName];\n\n if (path) {\n resolved = walkPath(resolved, path, `$contract.${contractName}`);\n }\n\n return resolved;\n }\n\n // Check if entire string is a $flow reference with optional path\n const flowMatch = value.match(REF_FLOW);\n if (flowMatch) {\n const flowName = flowMatch[1];\n const path = flowMatch[2]; // 'url' or 'settings.region' or undefined\n const softMode = options?.strictFlowRefs === false;\n\n if (!resolveFlow) {\n throwError(\n `$flow.${flowName}${path ? `.${path}` : ''} cannot be resolved without a flow resolver`,\n );\n }\n\n // resolveFlow may throw on cycle — that always propagates (cycles are bugs).\n const targetConfig = resolveFlow(flowName);\n if (!targetConfig) {\n if (softMode) {\n options?.onWarning?.(\n formatUnresolvedFlowMessage(flowName, path, 'unknown-flow'),\n );\n return value;\n }\n throwError(`Flow \"${flowName}\" not found in $flow.${flowName}`);\n }\n\n let resolved: unknown = targetConfig;\n if (path) {\n if (softMode) {\n // Try to walk; if walk fails OR result is empty/undefined, soft-warn and keep original.\n try {\n resolved = walkPath(resolved, path, `$flow.${flowName}`);\n } catch {\n options?.onWarning?.(\n formatUnresolvedFlowMessage(flowName, path, 'missing-key'),\n );\n return value;\n }\n if (resolved === undefined || resolved === null || resolved === '') {\n options?.onWarning?.(\n formatUnresolvedFlowMessage(flowName, path, 'missing-key'),\n );\n return value;\n }\n } else {\n resolved = walkPath(resolved, path, `$flow.${flowName}`);\n }\n }\n\n return resolved;\n }\n\n // Check if entire string is a $secret reference (whole-string only).\n // Server (deferred) → emit a marker the bundler turns into a runtime\n // process.env read. Web (non-deferred) → hard error: a secret must never\n // be inlined into a browser bundle, and we never read its value here.\n const secretMatch = value.match(REF_SECRET);\n if (secretMatch) {\n const name = secretMatch[1];\n if (options?.deferred) {\n return `${SECRET_MARKER_PREFIX}${name}`;\n }\n throwError(\n `Secret \"$secret.${name}\" cannot be used in a web flow — secrets are never sent to the browser. Use a server flow.`,\n );\n }\n\n // Inline $var: must resolve to scalar\n let result = value.replace(REF_VAR_INLINE, (_match, path: string) => {\n const segments = path.split('.');\n const varName = segments[0];\n const deepPath = segments.slice(1).join('.');\n\n if (variables[varName] === undefined) {\n throwError(`Variable \"${varName}\" not found`);\n }\n\n const visiting = varVisiting ?? new Set<string>();\n if (visiting.has(varName)) {\n const chain = [...visiting, varName].join(' -> ');\n throwError(`Cyclic $var reference: ${chain}`);\n }\n\n visiting.add(varName);\n let resolved: unknown;\n try {\n resolved = resolvePatterns(\n variables[varName],\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n visiting,\n );\n } finally {\n visiting.delete(varName);\n }\n\n if (deepPath) {\n resolved = walkPath(resolved, deepPath, `$var.${varName}`);\n }\n\n if (\n resolved === null ||\n (typeof resolved !== 'string' &&\n typeof resolved !== 'number' &&\n typeof resolved !== 'boolean')\n ) {\n const type = Array.isArray(resolved) ? 'array' : typeof resolved;\n throwError(\n `Variable \"${path}\" resolves to non-scalar (${type}) and cannot be inlined into a string. Use it as a whole-string reference: \"$var.${path}\"`,\n );\n }\n\n return String(resolved);\n });\n\n // Replace $env.NAME or $env.NAME:default patterns\n result = result.replace(REF_ENV, (match, name, defaultValue) => {\n if (options?.deferred) {\n return defaultValue !== undefined\n ? `${ENV_MARKER_PREFIX}${name}:${defaultValue}`\n : `${ENV_MARKER_PREFIX}${name}`;\n }\n if (typeof process !== 'undefined' && process.env?.[name] !== undefined) {\n return process.env[name]!;\n }\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n throwError(\n `Environment variable \"${name}\" not found and no default provided`,\n );\n });\n\n return result;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) =>\n resolvePatterns(\n item,\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n varVisiting,\n ),\n );\n }\n\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = resolvePatterns(\n val,\n variables,\n options,\n resolvedContracts,\n resolveFlow,\n varVisiting,\n );\n }\n return result;\n }\n\n return value;\n}\n\n/**\n * Convert package name to valid JavaScript variable name.\n * Used for deterministic default import naming.\n * @example\n * packageNameToVariable('@walkeros/server-destination-api')\n * // → '_walkerosServerDestinationApi'\n */\nexport function packageNameToVariable(packageName: string): string {\n const hasScope = packageName.startsWith('@');\n const normalized = packageName\n .replace('@', '')\n .replace(/[/-]/g, '_')\n .split('_')\n .filter((part) => part.length > 0)\n .map((part, i) =>\n i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join('');\n\n return hasScope ? '_' + normalized : normalized;\n}\n\n/**\n * Get resolved flow for a named flow.\n *\n * Resolution pass order:\n * 1. `$env` / `$var` resolve per-flow in isolation (no cross-flow context).\n * `$var` resolves recursively (variables may reference other variables,\n * `$env`, `$contract`, or `$flow`); cycles are detected via a visiting set.\n * 2. `$flow.X.Y` resolves against pass-1 outputs of sibling flows (so `$env`/`$var`\n * inside the referenced flow are already resolved when `$flow` reads it).\n * 3. `$contract` resolves last (with `$flow` results available).\n *\n * In practice these passes are interleaved by the resolver: when `$flow.X.Y`\n * is encountered, the sibling flow X's `Flow.Config` block is recursively\n * resolved on demand (with all its own `$env`/`$var`/`$contract` references\n * resolved first), then the deep path is walked. Cycles are detected via a\n * visiting set.\n *\n * @param config - The complete Flow.Json (root multi-flow config)\n * @param flowName - Flow name (auto-selected if only one exists)\n * @param options - Resolution options\n * @returns Resolved {@link Flow} with $var, $env, $contract, and $flow patterns resolved\n * @throws Error if flow selection is required but not specified, or flow not found\n * @throws Error if a `$flow.X.Y` reference forms a cycle\n *\n * @example\n * ```typescript\n * import { getFlowSettings } from '@walkeros/core';\n *\n * const config = JSON.parse(fs.readFileSync('walkeros.config.json', 'utf8'));\n *\n * // Auto-select if only one flow\n * const flow = getFlowSettings(config);\n *\n * // Or specify flow\n * const prodFlow = getFlowSettings(config, 'production');\n * ```\n */\nexport function getFlowSettings(\n config: Flow.Json,\n flowName?: string,\n options?: ResolveOptions,\n): Flow {\n // Per-call shared state for cross-flow resolution.\n const resolvedFlowConfigs = new Map<string, unknown>();\n const visiting = new Set<string>();\n const visitOrder: string[] = [];\n\n /**\n * Recursively resolve a sibling flow's `Flow.Config` block.\n * Used by the resolver when it encounters `$flow.X.Y`.\n * Throws on cycles. Returns undefined if the flow does not exist.\n */\n const resolveFlowConfig: FlowConfigResolver = (targetName): unknown => {\n if (resolvedFlowConfigs.has(targetName)) {\n return resolvedFlowConfigs.get(targetName);\n }\n\n const targetSettings = config.flows[targetName];\n if (!targetSettings) return undefined;\n\n if (visiting.has(targetName)) {\n const chain = [...visitOrder, targetName].join(' -> ');\n throwError(`Cyclic $flow reference: ${chain}`);\n }\n\n visiting.add(targetName);\n visitOrder.push(targetName);\n try {\n const vars = mergeVariables(config.variables, targetSettings.variables);\n // Resolve only the public config block: that is what $flow may read.\n const resolved = resolvePatterns(\n targetSettings.config ?? {},\n vars,\n options,\n undefined, // contracts not consulted inside Flow.Config\n resolveFlowConfig,\n );\n resolvedFlowConfigs.set(targetName, resolved);\n return resolved;\n } finally {\n visiting.delete(targetName);\n visitOrder.pop();\n }\n };\n\n const flowNames = Object.keys(config.flows);\n\n // Auto-select if only one flow\n if (!flowName) {\n if (flowNames.length === 1) {\n flowName = flowNames[0];\n } else {\n throwError(\n `Multiple flows found (${flowNames.join(', ')}). Please specify a flow.`,\n );\n }\n }\n\n // Check flow exists\n const settings = config.flows[flowName];\n if (!settings) {\n throwError(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n // Cycle guard for the top-level flow being resolved as well.\n // Without this, a cycle initiated from the entry flow (a → b → a) would\n // not be detected when control returned to \"a\".\n visiting.add(flowName);\n visitOrder.push(flowName);\n\n try {\n return resolveFlowSettings(config, settings, options, resolveFlowConfig);\n } finally {\n visiting.delete(flowName);\n visitOrder.pop();\n }\n}\n\nfunction resolveFlowSettings(\n config: Flow.Json,\n settings: Flow,\n options: ResolveOptions | undefined,\n resolveFlow: FlowConfigResolver,\n): Flow {\n // Deep clone to avoid mutations\n const result = JSON.parse(JSON.stringify(settings)) as Flow;\n\n // Pre-process contracts: resolve $var/$env inside contracts, then extend + wildcards\n let resolvedContracts: Record<string, Flow.ContractRule> | undefined;\n if (config.contract) {\n // Two-pass: resolve $var/$env inside contract first\n const vars = mergeVariables(config.variables, settings.variables);\n const resolvedContractInput = resolvePatterns(\n config.contract,\n vars,\n options,\n undefined,\n resolveFlow,\n ) as Flow.Contract;\n\n resolvedContracts = resolveContracts(resolvedContractInput);\n }\n\n // Process the flow's own config block so $flow/$env/$var refs inside\n // it (e.g. settings.url = '$flow.server.url') are resolved.\n if (result.config) {\n const vars = mergeVariables(config.variables, settings.variables);\n result.config = resolvePatterns(\n result.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n }\n\n // Process sources with variable cascade\n if (result.sources) {\n for (const [name, source] of Object.entries(result.sources)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n source.variables,\n );\n\n const processedConfig = resolvePatterns(\n source.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n source.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.sources[name] = {\n package: source.package,\n import: source.import,\n config: processedConfig,\n env: processedEnv,\n primary: source.primary,\n variables: source.variables,\n before: source.before,\n next: source.next,\n cache: source.cache,\n code: source.code,\n } as Flow.Source;\n }\n }\n\n // Process destinations with variable cascade\n if (result.destinations) {\n for (const [name, dest] of Object.entries(result.destinations)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n dest.variables,\n );\n\n const processedConfig = resolvePatterns(\n dest.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n dest.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.destinations[name] = {\n package: dest.package,\n import: dest.import,\n config: processedConfig,\n env: processedEnv,\n variables: dest.variables,\n before: dest.before,\n next: dest.next,\n cache: dest.cache,\n code: dest.code,\n } as Flow.Destination;\n }\n }\n\n // Process stores with variable cascade\n if (result.stores) {\n for (const [name, store] of Object.entries(result.stores)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n store.variables,\n );\n\n const processedConfig = resolvePatterns(\n store.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n store.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.stores[name] = {\n package: store.package,\n import: store.import,\n config: processedConfig,\n env: processedEnv,\n cache: store.cache,\n variables: store.variables,\n code: store.code,\n } as Flow.Store;\n }\n }\n\n // Process transformers with variable cascade\n if (result.transformers) {\n for (const [name, transformer] of Object.entries(result.transformers)) {\n const vars = mergeVariables(\n config.variables,\n settings.variables,\n transformer.variables,\n );\n\n const processedConfig = resolvePatterns(\n transformer.config,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n const processedEnv = resolvePatterns(\n transformer.env,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n\n result.transformers[name] = {\n package: transformer.package,\n import: transformer.import,\n config: processedConfig,\n env: processedEnv,\n variables: transformer.variables,\n before: transformer.before,\n next: transformer.next,\n cache: transformer.cache,\n code: transformer.code,\n } as Flow.Transformer;\n }\n }\n\n // Process collector config\n if (result.collector) {\n const vars = mergeVariables(config.variables, settings.variables);\n\n const processedCollector = resolvePatterns(\n result.collector,\n vars,\n options,\n resolvedContracts,\n resolveFlow,\n );\n result.collector = processedCollector as typeof result.collector;\n }\n\n return result;\n}\n\n/**\n * Get the platform of a flow ('web' or 'server').\n *\n * Reads from `flow.config.platform`.\n *\n * @param flow - Resolved flow (output of {@link getFlowSettings})\n * @returns \"web\" or \"server\"\n * @throws Error if `config.platform` is missing\n *\n * @example\n * ```typescript\n * import { getPlatform } from '@walkeros/core';\n *\n * const platform = getPlatform(flow);\n * // Returns \"web\" or \"server\"\n * ```\n */\nexport function getPlatform(flow: Flow): 'web' | 'server' {\n const platform = flow.config?.platform;\n if (platform === 'web' || platform === 'server') return platform;\n throwError('Flow must have config.platform set to \"web\" or \"server\"');\n}\n","/**\n * @interface Assign\n * @description Options for the assign function.\n * @property merge - Merge array properties instead of overriding them.\n * @property shallow - Create a shallow copy instead of updating the target object.\n * @property extend - Extend the target with new properties instead of only updating existing ones.\n */\ninterface Assign {\n merge?: boolean;\n shallow?: boolean;\n extend?: boolean;\n}\n\nconst defaultOptions: Assign = {\n merge: true,\n shallow: true,\n extend: true,\n};\n\n/**\n * Merges objects with advanced options.\n *\n * @template T, U\n * @param target - The target object to merge into.\n * @param obj - The source object to merge from.\n * @param options - Options for merging.\n * @returns The merged object.\n */\nexport function assign<T extends object, U extends object>(\n target: T,\n obj: U = {} as U,\n options: Assign = {},\n): T & U {\n options = { ...defaultOptions, ...options };\n\n const finalObj = Object.entries(obj).reduce((acc, [key, sourceProp]) => {\n const targetProp = target[key as keyof typeof target];\n\n // Only merge arrays\n if (\n options.merge &&\n Array.isArray(targetProp) &&\n Array.isArray(sourceProp)\n ) {\n acc[key as keyof typeof acc] = sourceProp.reduce(\n (acc, item) => {\n // Remove duplicates\n return acc.includes(item) ? acc : [...acc, item];\n },\n [...targetProp],\n );\n } else if (options.extend || key in target) {\n // Extend the target with new properties or update existing ones.\n //\n // With `extend: false` a source key is copied ONLY if it already exists\n // in target; keys absent from target are silently dropped. This is a\n // deliberate narrow-subset filter, not a bug: the sole caller\n // (collector.ts) picks a handful of config fields out of a much larger\n // initConfig and reads the rest (name, release, logger, consent, ...)\n // separately. Do NOT add an always-on \"dropped key\" warning here — it\n // would fire on every collector construction. A field that must survive\n // this filter has to exist in target (or be read directly, as the\n // collector does for name/release).\n acc[key as keyof typeof acc] = sourceProp;\n }\n\n return acc;\n }, {} as U);\n\n // Handle shallow or deep copy based on options\n if (options.shallow) {\n return { ...target, ...finalObj };\n } else {\n Object.assign(target, finalObj);\n return target as T & U;\n }\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Checks if a value is an arguments object.\n *\n * @param value The value to check.\n * @returns True if the value is an arguments object, false otherwise.\n */\nexport function isArguments(value: unknown): value is IArguments {\n return Object.prototype.toString.call(value) === '[object Arguments]';\n}\n\n/**\n * Checks if a value is an array.\n *\n * @param value The value to check.\n * @returns True if the value is an array, false otherwise.\n */\nexport function isArray<T>(value: unknown): value is T[] {\n return Array.isArray(value);\n}\n\n/**\n * Checks if a value is a boolean.\n *\n * @param value The value to check.\n * @returns True if the value is a boolean, false otherwise.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Checks if an entity is a walker command.\n *\n * @param entity The entity to check.\n * @returns True if the entity is a walker command, false otherwise.\n */\nexport function isCommand(entity: string) {\n return entity === 'walker';\n}\n\n/**\n * Checks if a value is defined.\n *\n * @param value The value to check.\n * @returns True if the value is defined, false otherwise.\n */\nexport function isDefined<T>(val: T | undefined): val is T {\n return typeof val !== 'undefined';\n}\n\n/**\n * Checks if a value is an element or the document.\n *\n * @param elem The value to check.\n * @returns True if the value is an element or the document, false otherwise.\n */\nexport function isElementOrDocument(elem: unknown): elem is Element {\n if (!elem || typeof elem !== 'object') return false;\n // Property check: Document has 'body', Element has 'tagName'\n return 'body' in elem || 'tagName' in elem;\n}\n\n/**\n * Checks if a value is a function.\n *\n * @param value The value to check.\n * @returns True if the value is a function, false otherwise.\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Checks if a value is a number.\n *\n * @param value The value to check.\n * @returns True if the value is a number, false otherwise.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Checks if a value is an object.\n *\n * @param value The value to check.\n * @returns True if the value is an object, false otherwise.\n */\nexport function isObject(value: unknown): value is WalkerOS.AnyObject {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Checks if two variables have the same type.\n *\n * @param variable The first variable.\n * @param type The second variable.\n * @returns True if the variables have the same type, false otherwise.\n */\nexport function isSameType<T>(\n variable: unknown,\n type: T,\n): variable is typeof type {\n return typeof variable === typeof type;\n}\n\n/**\n * Checks if a value is a string.\n *\n * @param value The value to check.\n * @returns True if the value is a string, false otherwise.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n","/**\n * Creates a deep clone of a value.\n * Supports primitive values, objects, arrays, dates, and regular expressions.\n * Handles circular references.\n *\n * @template T\n * @param org - The value to clone.\n * @param visited - A map of visited objects to handle circular references.\n * @returns The cloned value.\n */\nexport function clone<T>(\n org: T,\n visited: WeakMap<object, unknown> = new WeakMap(),\n): T {\n // Handle primitive values and functions directly\n if (typeof org !== 'object' || org === null) return org;\n\n // Check for circular references\n if (visited.has(org)) return visited.get(org) as T;\n\n // Allow list of clonable types\n const type = Object.prototype.toString.call(org);\n if (type === '[object Object]') {\n const clonedObj = {} as Record<string | symbol, unknown>;\n visited.set(org as object, clonedObj); // Remember the reference\n\n for (const key in org as Record<string | symbol, unknown>) {\n if (Object.prototype.hasOwnProperty.call(org, key)) {\n clonedObj[key] = clone(\n (org as Record<string | symbol, unknown>)[key],\n visited,\n );\n }\n }\n return clonedObj as T;\n }\n\n if (type === '[object Array]') {\n const clonedArray = [] as unknown[];\n visited.set(org as object, clonedArray); // Remember the reference\n\n (org as unknown[]).forEach((item) => {\n clonedArray.push(clone(item, visited));\n });\n\n return clonedArray as T;\n }\n\n if (type === '[object Date]') {\n return new Date((org as unknown as Date).getTime()) as T;\n }\n\n if (type === '[object RegExp]') {\n const reg = org as unknown as RegExp;\n return new RegExp(reg.source, reg.flags) as T;\n }\n\n // Skip cloning for unsupported types and return reference\n return org;\n}\n","import type { WalkerOS } from './types';\nimport { isArray, isDefined, isObject } from './is';\nimport { clone } from './clone';\n\n/**\n * Gets a value from an object by a dot-notation string.\n * Supports wildcards for arrays.\n *\n * @example\n * getByPath({ data: { id: 1 } }, \"data.id\") // Returns 1\n *\n * @param event - The object to get the value from.\n * @param key - The dot-notation string.\n * @param defaultValue - The default value to return if the key is not found.\n * @returns The value from the object or the default value.\n */\nexport function getByPath(\n event: unknown,\n key: string = '',\n defaultValue?: unknown,\n): unknown {\n const keys = key.split('.');\n let values: unknown = event;\n\n for (let index = 0; index < keys.length; index++) {\n const k = keys[index];\n\n if (k === '*' && isArray(values)) {\n const remainingKeys = keys.slice(index + 1).join('.');\n const result: unknown[] = [];\n\n for (const item of values) {\n const value = getByPath(item, remainingKeys, defaultValue);\n result.push(value);\n }\n\n return result;\n }\n\n values =\n isObject(values) || isArray(values)\n ? values[k as keyof typeof values]\n : undefined;\n\n if (values === undefined) break;\n }\n\n return isDefined(values) ? values : defaultValue;\n}\n\n/**\n * Sets a value in an object by a dot-notation string.\n *\n * @param obj - The object to set the value in.\n * @param key - The dot-notation string.\n * @param value - The value to set.\n * @returns A new object with the updated value.\n */\nexport function setByPath<T = unknown>(obj: T, key: string, value: unknown): T {\n if (!isObject(obj)) return obj;\n\n const clonedObj = clone(obj);\n const keys = key.split('.');\n let current: WalkerOS.AnyObject = clonedObj;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as keyof typeof current;\n\n // Set the value if it's the last key\n if (i === keys.length - 1) {\n current[k] = value;\n } else {\n // Traverse to the next level\n if (\n !(k in current) ||\n typeof current[k] !== 'object' ||\n current[k] === null\n ) {\n current[k] = {};\n }\n\n // Move deeper into the object\n current = current[k] as WalkerOS.AnyObject;\n }\n }\n\n return clonedObj as T;\n}\n\n/**\n * Deletes a value in an object by a dot-notation string.\n * Returns a new object; the input is not mutated. No-op when the path is\n * absent or the target is neither an object nor an array. Numeric segments\n * index into arrays; a final numeric segment splices the element out so no\n * empty slot is left behind.\n */\nexport function deleteByPath<T = unknown>(obj: T, key: string): T {\n if (!isObject(obj) && !isArray(obj)) return obj;\n const clonedObj = clone(obj);\n const keys = key.split('.');\n let current: WalkerOS.AnyObject | unknown[] = clonedObj;\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n const isLast = i === keys.length - 1;\n\n if (isArray(current)) {\n const index = Number(k);\n if (!Number.isInteger(index) || index < 0 || index >= current.length)\n return clonedObj;\n if (isLast) {\n current.splice(index, 1);\n } else {\n const next = current[index];\n if (!isObject(next) && !isArray(next)) return clonedObj;\n current = next;\n }\n } else if (isLast) {\n delete current[k];\n } else {\n const next = current[k];\n if (!isObject(next) && !isArray(next)) return clonedObj;\n current = next;\n }\n }\n return clonedObj as T;\n}\n","import type { WalkerOS } from './types';\nimport { isObject } from './is';\n\nconst SECTIONS: Record<string, (e: WalkerOS.DeepPartialEvent) => unknown> = {\n data: (e) => e.data,\n globals: (e) => e.globals,\n context: (e) => e.context,\n user: (e) => e.user,\n source: (e) => e.source,\n event: (e) => ({\n entity: e.entity,\n action: e.action,\n id: e.id,\n timestamp: e.timestamp,\n name: e.name,\n trigger: e.trigger,\n timing: (e as WalkerOS.Event).timing,\n }),\n};\n\n// Recurse into plain objects (maps), joining keys with an underscore, so a\n// nested map becomes fully flattened leaf keys. Arrays are leaves and kept\n// as-is; only plain objects recurse.\nfunction flattenInto(\n out: Record<string, unknown>,\n prefix: string,\n value: unknown,\n): void {\n if (isObject(value)) {\n for (const [k, v] of Object.entries(value)) {\n if (v === undefined) continue;\n flattenInto(out, `${prefix}_${k}`, v);\n }\n } else {\n // Leaf. Arrays land here intentionally (isObject is false for arrays): they\n // are kept whole, NOT index-flattened into `${prefix}_0`, `${prefix}_1`.\n // GA4-style vendors can't consume indexed array params meaningfully and\n // list-heavy `data` would explode into hundreds of keys. Do not \"fix\" this\n // to recurse arrays without a concrete destination that needs it.\n out[prefix] = value;\n }\n}\n\nexport function flattenIncludeSections(\n event: WalkerOS.DeepPartialEvent,\n sections: string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const effective = sections.includes('all') ? Object.keys(SECTIONS) : sections;\n\n for (const section of effective) {\n const picker = SECTIONS[section];\n if (!picker) continue;\n const bag = picker(event);\n if (!isObject(bag)) continue;\n\n for (const [key, raw] of Object.entries(bag as Record<string, unknown>)) {\n if (raw === undefined) continue;\n // Context values are OrderedProperties tuples - extract the label first,\n // then flatten (the label is usually a string leaf).\n const value = section === 'context' && Array.isArray(raw) ? raw[0] : raw;\n flattenInto(out, `${section}_${key}`, value);\n }\n }\n\n return out;\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Casts a value to a specific type.\n *\n * @param value The value to cast.\n * @returns The casted value.\n */\nexport function castValue(value: unknown): WalkerOS.PropertyType {\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n const number = Number(value); // Converts \"\" to 0\n if (value == number && value !== '') return number;\n\n return String(value);\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Checks if the required consent is granted.\n *\n * @param required - The required consent states.\n * @param state - The current consent states.\n * @param individual - Individual consent states to prioritize.\n * @returns The granted consent states or false if not granted.\n */\nexport function getGrantedConsent(\n required: WalkerOS.Consent | undefined,\n state: WalkerOS.Consent = {},\n individual: WalkerOS.Consent = {},\n): false | WalkerOS.Consent {\n // Merge state and individual, prioritizing individual states\n const states: WalkerOS.Consent = { ...state, ...individual };\n\n const grantedStates: WalkerOS.Consent = {};\n let hasRequiredConsent = !required || Object.keys(required).length === 0;\n\n Object.keys(states).forEach((name) => {\n if (states[name]) {\n // consent granted\n grantedStates[name] = true;\n\n // Check if it's required and granted consent\n if (required && required[name]) hasRequiredConsent = true;\n }\n });\n\n return hasRequiredConsent ? grantedStates : false;\n}\n","import type { Destination } from './types';\nimport type { TypesOf, Config } from './types/destination';\nimport { assign } from './assign';\n\n/**\n * Creates a new destination instance by merging a base destination with additional configuration.\n *\n * This utility enables elegant destination configuration while avoiding config side-effects\n * that could occur when reusing destination objects across multiple collector instances.\n *\n * @param baseDestination - The base destination to extend\n * @param config - Additional configuration to merge with the base destination's config\n * @returns A new destination instance with merged configuration\n *\n * @example\n * ```typescript\n * // Types are inferred automatically from destinationGtag\n * elb('walker destination', createDestination(destinationGtag, {\n * settings: { ga4: { measurementId: 'G-123' } }\n * }));\n * ```\n */\nexport function createDestination<I extends Destination.Instance>(\n baseDestination: I,\n config: Partial<Config<TypesOf<I>>>,\n): I {\n // Create a shallow copy of the base destination to avoid mutations\n const newDestination = { ...baseDestination };\n\n // Deep merge the config, handling nested objects like settings and mapping\n newDestination.config = assign(baseDestination.config, config, {\n shallow: true, // Create new object, don't mutate original\n merge: true, // Merge arrays\n extend: true, // Allow new properties\n });\n\n // Handle nested settings merging if both have settings\n if (baseDestination.config.settings && config.settings) {\n newDestination.config.settings = assign(\n baseDestination.config.settings as object,\n config.settings as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.settings;\n }\n\n // Handle nested mapping merging if both have mapping\n if (baseDestination.config.mapping && config.mapping) {\n newDestination.config.mapping = assign(\n baseDestination.config.mapping as object,\n config.mapping as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.mapping;\n }\n\n return newDestination;\n}\n","import { isObject } from './is';\n\n/**\n * Deep merges source into target, mutating target in-place.\n * Recurses into plain objects; everything else is a leaf (replaced).\n * Skips undefined source values; null overwrites.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Record<string, unknown>,\n): T {\n if (!isObject(source)) return target;\n\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === undefined) continue;\n\n if (isObject(val) && isObject(target[key])) {\n deepMerge(target[key] as Record<string, unknown>, val);\n } else {\n (target as Record<string, unknown>)[key] = val;\n }\n }\n\n return target;\n}\n","/**\n * Generates a random string of a given length.\n *\n * Draws from the platform CSPRNG (`crypto.getRandomValues`) when available,\n * with rejection sampling to keep the character distribution unbiased. Falls\n * back to `Math.random` only when no secure source is reachable.\n *\n * @param length - The length of the random string.\n * @param charset - Optional custom charset. Defaults to base-36 (0-9a-z).\n * @returns The random string.\n */\nconst defaultCharset = '0123456789abcdefghijklmnopqrstuvwxyz';\n\nexport function getId(length = 6, charset: string = defaultCharset): string {\n const n = charset.length;\n if (length <= 0 || n === 0) return '';\n\n let str = '';\n\n // Single-byte charsets can be sampled from the CSPRNG. Reject bytes above the\n // largest multiple of n that fits in a byte so every character is equally likely.\n if (n <= 256) {\n const limit = 256 - (256 % n);\n while (str.length < length) {\n const need = length - str.length;\n const buffer = new Uint8Array(Math.ceil(need * 1.3) + 4);\n if (!secureBytes(buffer)) break; // No secure source, drop to fallback below\n for (let i = 0; i < buffer.length && str.length < length; i++) {\n if (buffer[i] < limit) str += charset[buffer[i] % n];\n }\n }\n }\n\n // Fallback for a missing CSPRNG or an oversized charset.\n while (str.length < length) str += charset[(Math.random() * n) | 0];\n\n return str;\n}\n\nfunction secureBytes(buffer: Uint8Array): boolean {\n try {\n const cryptoObj: Crypto | undefined = globalThis.crypto;\n if (cryptoObj && typeof cryptoObj.getRandomValues === 'function') {\n cryptoObj.getRandomValues(buffer);\n return true;\n }\n } catch {\n // Secure source unavailable, signal the caller to use the fallback.\n }\n return false;\n}\n","import { getId } from './getId';\n\nconst hexCharset = '0123456789abcdef';\n\n/**\n * Random lowercase-hex id of `length` characters via the CSPRNG-backed getId.\n * Regenerates on the all-zero value, which W3C Trace Context forbids for\n * trace-id and span-id (astronomically rare, but kept spec-correct).\n */\nexport function hexId(length: number): string {\n let id = getId(length, hexCharset);\n while (/^0+$/.test(id)) id = getId(length, hexCharset);\n return id;\n}\n","import { hexId } from './hexId';\n\n/**\n * W3C span_id: 8 random bytes encoded as 16 lowercase hex characters.\n * Reference: W3C Trace Context (W3C Recommendation, January 2020).\n */\nexport function getSpanId(): string {\n return hexId(16);\n}\n","import type { WalkerOS } from './types';\nimport { assign } from './assign';\nimport { getSpanId } from './getSpanId';\n\n/**\n * Creates a complete event with default values.\n * Used for testing and debugging.\n *\n * Models a post-collector event: `source` always carries the run-stamped\n * `count` and `trace`, so a generated event matches one that has been pushed\n * through the collector. Override via `props.source` if needed.\n *\n * @param props - Properties to override the default values.\n * @returns A complete event.\n */\nexport function createEvent(\n props: WalkerOS.DeepPartialEvent = {},\n): WalkerOS.Event {\n const timestamp = props.timestamp || new Date().setHours(0, 13, 37, 0);\n const id = props.id || getSpanId();\n\n const defaultEvent: WalkerOS.Event = {\n name: 'entity action',\n data: {\n string: 'foo',\n number: 1,\n boolean: true,\n array: [0, 'text', false],\n not: undefined,\n },\n context: { dev: ['test', 1] },\n globals: { lang: 'elb' },\n custom: { completely: 'random' },\n user: { id: 'us3r', device: 'c00k13', session: 's3ss10n' },\n nested: [\n {\n entity: 'child',\n data: { is: 'subordinated' },\n },\n ],\n consent: { functional: true },\n id,\n trigger: 'test',\n entity: 'entity',\n action: 'action',\n timestamp,\n timing: 3.14,\n source: {\n type: 'collector',\n schema: '4',\n },\n };\n\n // Note: Always prefer the props over the defaults\n\n // Merge properties\n const event = assign(defaultEvent, props, { merge: false });\n\n // Mirror collector output: generated events always carry the run-stamped\n // source fields (per-run count and a fixed, deterministic trace) so an event\n // built from this helper matches a pushed event without tests having to\n // assert them, and two generator calls produce equal events. Any source\n // fields provided via props still win.\n event.source = {\n count: 1,\n trace: '0a1b2c3d4e5f60718293a4b5c6d7e8f9',\n ...event.source,\n };\n\n // Update conditions\n\n // Entity and action from event\n if (props.name) {\n const [entity, action] = props.name.split(' ') ?? [];\n\n if (entity && action) {\n event.entity = entity;\n event.action = action;\n }\n }\n\n return event;\n}\n\n/**\n * Creates a complete event with default values based on the event name.\n * Used for testing and debugging.\n *\n * @param name - The name of the event to create.\n * @param props - Properties to override the default values.\n * @returns A complete event.\n */\nexport function getEvent(\n name: string = 'entity action',\n props: WalkerOS.DeepPartialEvent = {},\n): WalkerOS.Event {\n const timestamp = props.timestamp || new Date().setHours(0, 13, 37, 0);\n\n const quantity = 2;\n const product1 = {\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n color: 'black',\n size: 'l',\n price: 420,\n },\n };\n const product2 = {\n data: {\n id: 'cc',\n name: 'Cool Cap',\n size: 'one size',\n price: 42,\n },\n };\n\n const defaultEvents: Record<string, WalkerOS.PartialEvent> = {\n 'cart view': {\n data: {\n currency: 'EUR',\n value: product1.data.price * quantity,\n },\n context: { shopping: ['cart', 0] },\n globals: { pagegroup: 'shop' },\n nested: [\n {\n entity: 'product',\n data: { ...product1.data, quantity },\n context: { shopping: ['cart', 0] },\n nested: [],\n },\n ],\n trigger: 'load',\n },\n 'checkout view': {\n data: {\n step: 'payment',\n currency: 'EUR',\n value: product1.data.price + product2.data.price,\n },\n context: { shopping: ['checkout', 0] },\n globals: { pagegroup: 'shop' },\n nested: [\n {\n entity: 'product',\n ...product1,\n context: { shopping: ['checkout', 0] },\n nested: [],\n },\n {\n entity: 'product',\n ...product2,\n context: { shopping: ['checkout', 0] },\n nested: [],\n },\n ],\n trigger: 'load',\n },\n 'order complete': {\n data: {\n id: '0rd3r1d',\n currency: 'EUR',\n shipping: 5.22,\n taxes: 73.76,\n total: 555,\n },\n context: { shopping: ['complete', 0] },\n globals: { pagegroup: 'shop' },\n nested: [\n {\n entity: 'product',\n ...product1,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: 'product',\n ...product2,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: 'gift',\n data: {\n name: 'Surprise',\n },\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n ],\n trigger: 'load',\n },\n 'page view': {\n data: {\n domain: 'www.example.com',\n title: 'walkerOS documentation',\n referrer: 'https://www.walkeros.io/',\n search: '?foo=bar',\n hash: '#hash',\n id: '/docs/',\n },\n globals: { pagegroup: 'docs' },\n trigger: 'load',\n },\n 'product add': {\n ...product1,\n context: { shopping: ['intent', 0] },\n globals: { pagegroup: 'shop' },\n nested: [],\n trigger: 'click',\n },\n 'product view': {\n ...product1,\n context: { shopping: ['detail', 0] },\n globals: { pagegroup: 'shop' },\n nested: [],\n trigger: 'load',\n },\n 'product visible': {\n data: { ...product1.data, position: 3, promo: true },\n context: { shopping: ['discover', 0] },\n globals: { pagegroup: 'shop' },\n nested: [],\n trigger: 'load',\n },\n 'promotion visible': {\n data: {\n name: 'Setting up tracking easily',\n position: 'hero',\n },\n context: { ab_test: ['engagement', 0] },\n globals: { pagegroup: 'homepage' },\n trigger: 'visible',\n },\n 'session start': {\n data: {\n id: 's3ss10n',\n start: timestamp,\n isNew: true,\n count: 1,\n runs: 1,\n isStart: true,\n storage: true,\n referrer: '',\n device: 'c00k13',\n },\n user: {\n id: 'us3r',\n device: 'c00k13',\n session: 's3ss10n',\n hash: 'h4sh',\n address: 'street number',\n email: 'user@example.com',\n phone: '+49 123 456 789',\n userAgent: 'Mozilla...',\n browser: 'Chrome',\n browserVersion: '90',\n deviceType: 'desktop',\n language: 'de-DE',\n country: 'DE',\n region: 'HH',\n city: 'Hamburg',\n zip: '20354',\n timezone: 'Berlin',\n os: 'walkerOS',\n osVersion: '1.0',\n screenSize: '1337x420',\n ip: '127.0.0.0',\n internal: true,\n custom: 'value',\n },\n },\n };\n\n return createEvent({ ...defaultEvents[name], ...props, name: name });\n}\n","import { hexId } from './hexId';\n\n/**\n * W3C trace_id: 16 random bytes encoded as 32 lowercase hex characters.\n * Shared by every event of a collector run. Reference: W3C Trace Context.\n */\nexport function getTraceId(): string {\n return hexId(32);\n}\n","export interface ParsedTraceparent {\n /** W3C 32-hex trace id. */\n trace: string;\n /** W3C 16-hex parent span id (upstream event id). */\n parentSpan: string;\n}\n\n// Exactly four dash-separated segments: 2-hex version, 32-hex trace,\n// 16-hex span, 2-hex flags. Lowercase only, per the W3C Trace Context spec.\nconst TRACEPARENT =\n /^(?<version>[0-9a-f]{2})-(?<trace>[0-9a-f]{32})-(?<span>[0-9a-f]{16})-[0-9a-f]{2}$/;\n\n/**\n * Parse a W3C `traceparent` header value (`00-<32hex>-<16hex>-<2hex>`).\n * Returns undefined on any mismatch, and never throws. Rejects a non-string\n * input, wrong segment count, malformed segment lengths, uppercase hex, the\n * reserved `ff` version, an all-zero trace, and an all-zero span. Any other\n * 2-hex version is accepted for forward compatibility with future spec\n * revisions.\n */\nexport function parseTraceparent(\n value: unknown,\n): ParsedTraceparent | undefined {\n if (typeof value !== 'string') return undefined;\n\n const groups = TRACEPARENT.exec(value)?.groups;\n if (!groups) return undefined;\n\n const { version, trace, span } = groups;\n if (version === undefined || trace === undefined || span === undefined)\n return undefined;\n\n // Reserved/invalid values the regex cannot express directly.\n if (version === 'ff') return undefined;\n if (/^0+$/.test(trace) || /^0+$/.test(span)) return undefined;\n\n return { trace, parentSpan: span };\n}\n","import type { WalkerOS } from './types';\nimport { assign } from './assign';\n\nexport interface MarketingParameters {\n [key: string]: string;\n}\n\n/**\n * Click-ID registry entry — maps a URL parameter name to a canonical platform.\n *\n * Runtime shape only; the corresponding Zod schema lives in\n * `@walkeros/core/dev` (schemas/marketing.ts) for dev tooling that needs\n * validation or JSON Schema generation.\n */\nexport interface ClickIdEntry {\n param: string;\n platform: string;\n}\n\n/**\n * Default click-ID registry.\n *\n * Ordered by priority: when a URL contains multiple click IDs, the entry\n * appearing earlier wins as the resolved `clickId` / `platform`. All matched\n * raw values are still preserved on the result.\n *\n * Extend via the third argument to {@link getMarketingParameters} or the\n * `clickIds` field in the session source settings.\n */\nexport const defaultClickIds: ClickIdEntry[] = [\n // Google family — highest priority (most common globally)\n { param: 'gclid', platform: 'google' },\n { param: 'wbraid', platform: 'google' },\n { param: 'gbraid', platform: 'google' },\n { param: 'dclid', platform: 'google' },\n { param: 'gclsrc', platform: 'google' },\n\n // Meta\n { param: 'fbclid', platform: 'meta' },\n { param: 'igshid', platform: 'meta' },\n\n // Microsoft / Bing\n { param: 'msclkid', platform: 'microsoft' },\n\n // TikTok\n { param: 'ttclid', platform: 'tiktok' },\n\n // X / Twitter\n { param: 'twclid', platform: 'twitter' },\n\n // LinkedIn\n { param: 'li_fat_id', platform: 'linkedin' },\n\n // Pinterest\n { param: 'epik', platform: 'pinterest' },\n\n // Snapchat — both spellings seen in the wild\n { param: 'sclid', platform: 'snapchat' },\n { param: 'sccid', platform: 'snapchat' },\n\n // Reddit\n { param: 'rdt_cid', platform: 'reddit' },\n\n // Quora\n { param: 'qclid', platform: 'quora' },\n\n // Yandex (yclid collides with Yahoo Japan; Yandex chosen as default)\n { param: 'yclid', platform: 'yandex' },\n { param: 'ymclid', platform: 'yandex' },\n { param: 'ysclid', platform: 'yandex' },\n\n // Content discovery\n { param: 'dicbo', platform: 'outbrain' },\n { param: 'obclid', platform: 'outbrain' },\n { param: 'tblci', platform: 'taboola' },\n\n // Email service providers\n { param: 'mc_cid', platform: 'mailchimp' },\n { param: 'mc_eid', platform: 'mailchimp' },\n { param: '_kx', platform: 'klaviyo' },\n { param: '_hsenc', platform: 'hubspot' },\n { param: '_hsmi', platform: 'hubspot' },\n\n // Adobe / Marketo\n { param: 's_kwcid', platform: 'adobe' },\n { param: 'ef_id', platform: 'adobe' },\n { param: 'mkt_tok', platform: 'adobe' },\n\n // Affiliate\n { param: 'irclickid', platform: 'impact' },\n { param: 'cjevent', platform: 'cj' },\n\n // Deep linking\n { param: '_branch_match_id', platform: 'branch' },\n];\n\n/**\n * Extracts marketing parameters from a URL.\n *\n * - UTM and custom params are mapped to friendly names (`utm_source` → `source`).\n * - Known click IDs are detected case-insensitively; each raw value is stored\n * under its canonical lowercase param name.\n * - `clickId` and `platform` reference the highest-priority match (first entry\n * in the registry present in the URL).\n * - Custom `clickIds` override default platforms by `param` in place and\n * append new params at the end of the priority list.\n */\nexport function getMarketingParameters(\n url: URL,\n custom: MarketingParameters = {},\n clickIds: ClickIdEntry[] = [],\n): WalkerOS.Properties {\n const data: WalkerOS.Properties = {};\n\n // UTMs and custom mapped params\n const utmParams: MarketingParameters = {\n utm_campaign: 'campaign',\n utm_content: 'content',\n utm_medium: 'medium',\n utm_source: 'source',\n utm_term: 'term',\n };\n Object.entries(assign(utmParams, custom)).forEach(([key, name]) => {\n const value = url.searchParams.get(key);\n if (value) data[name] = value;\n });\n\n // Effective registry: defaults with user overrides applied in place,\n // plus brand-new user params appended at the end. Reuses the defaults\n // array when no customization is requested.\n const registry = clickIds.length ? mergeRegistry(clickIds) : defaultClickIds;\n\n // Lowercase URL params once for case-insensitive lookup\n const lower = new Map<string, string>();\n url.searchParams.forEach((value, key) => {\n if (value) lower.set(key.toLowerCase(), value);\n });\n\n // Walk registry in priority order; first match wins as clickId/platform\n for (const entry of registry) {\n const value = lower.get(entry.param);\n if (!value) continue;\n data[entry.param] = value;\n if (!data.clickId) {\n data.clickId = entry.param;\n data.platform = entry.platform;\n }\n }\n\n return data;\n}\n\nfunction mergeRegistry(user: ClickIdEntry[]): ClickIdEntry[] {\n const overrides = new Map(user.map((e) => [e.param, e.platform]));\n const defaultParams = new Set(defaultClickIds.map((e) => e.param));\n return [\n ...defaultClickIds.map((e) =>\n overrides.has(e.param)\n ? { param: e.param, platform: overrides.get(e.param)! }\n : e,\n ),\n ...user.filter((e) => !defaultParams.has(e.param)),\n ];\n}\n","/**\n * Options for scheduling primitives ({@link debounce}, {@link throttle}).\n *\n * - `wait`: Debounce window in ms. Timer resets on every call.\n * - `size`: Hard call-count cap per window. Flush immediately when call\n * count reaches this number. Useful for batch buffers that must not\n * grow unbounded.\n * - `age`: Hard age cap in ms since the first call of the current window.\n * Forces a flush even if calls keep arriving and reset the debounce.\n * Prevents debounce starvation under sustained load.\n */\nexport interface ScheduleOptions {\n wait?: number;\n size?: number;\n age?: number;\n}\n\n/**\n * Returned by {@link debounce}: a callable that schedules `fn` plus\n * deterministic `flush` / `cancel` controls.\n */\nexport interface Debounced<P extends unknown[], R> {\n (...args: P): Promise<R | undefined>;\n /** Force an immediate flush with the most recent args. Resolves after `fn` settles. */\n flush(): Promise<R | undefined>;\n /** Cancel any pending invocation. No `fn` call, pending promises resolve to undefined. */\n cancel(): void;\n /** Number of scheduled calls since the current window opened. */\n size(): number;\n}\n\nfunction normalizeScheduleOptions(\n opts: number | ScheduleOptions | undefined,\n defaultWait: number,\n): { wait: number; size?: number; age?: number } {\n if (typeof opts === 'number') return { wait: opts };\n if (!opts) return { wait: defaultWait };\n return {\n wait: opts.wait ?? defaultWait,\n size: opts.size,\n age: opts.age,\n };\n}\n\n/**\n * Creates a debounced function that delays invoking `fn` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `fn` invocations and a `flush` method to immediately invoke them.\n *\n * The second argument is either a `wait` number (legacy form) or a\n * {@link ScheduleOptions} object. The object form adds `size` (hard count\n * cap) and `age` (hard window-age cap) so the function flushes deterministically\n * under sustained load instead of letting the debounce reset forever.\n *\n * @template P, R\n * @param fn The function to debounce.\n * @param opts Either a wait-ms number or a {@link ScheduleOptions} object.\n * @param immediate Trigger the function on the leading edge, instead of the trailing.\n * @returns A {@link Debounced} callable with `flush`, `cancel`, and `size` methods.\n */\nexport function debounce<P extends unknown[], R>(\n fn: (...args: P) => R,\n opts: number | ScheduleOptions = 1000,\n immediate = false,\n): Debounced<P, R> {\n const {\n wait,\n size: maxSize,\n age: maxAge,\n } = normalizeScheduleOptions(opts, 1000);\n\n let waitTimer: ReturnType<typeof setTimeout> | null = null;\n let ageTimer: ReturnType<typeof setTimeout> | null = null;\n let result: R | undefined;\n let hasCalledImmediately = false;\n let lastArgs: P | undefined;\n let pending: Array<(value: R | undefined) => void> = [];\n let count = 0;\n\n const reset = (): void => {\n if (waitTimer) {\n clearTimeout(waitTimer);\n waitTimer = null;\n }\n if (ageTimer) {\n clearTimeout(ageTimer);\n ageTimer = null;\n }\n count = 0;\n lastArgs = undefined;\n };\n\n const fire = (): R | undefined => {\n const args = lastArgs;\n const settle = pending;\n reset();\n pending = [];\n if (!args) {\n // Nothing scheduled. Resolve waiters with undefined.\n settle.forEach((r) => r(undefined));\n return undefined;\n }\n result = fn(...args);\n settle.forEach((r) => r(result));\n return result;\n };\n\n const debounced = ((...args: P): Promise<R | undefined> => {\n return new Promise<R | undefined>((resolve) => {\n const callNow = immediate && !hasCalledImmediately;\n\n lastArgs = args;\n count += 1;\n pending.push(resolve);\n\n // Reset debounce timer on every call.\n if (waitTimer) clearTimeout(waitTimer);\n waitTimer = setTimeout(() => {\n waitTimer = null;\n if (!immediate || hasCalledImmediately) {\n fire();\n }\n }, wait);\n\n // Arm the age timer once per window (on first call).\n if (maxAge !== undefined && !ageTimer) {\n ageTimer = setTimeout(() => {\n ageTimer = null;\n fire();\n }, maxAge);\n }\n\n // Size cap: flush synchronously when reached.\n if (maxSize !== undefined && count >= maxSize) {\n fire();\n return;\n }\n\n if (callNow) {\n hasCalledImmediately = true;\n result = fn(...args);\n // Drain pending promises (only this caller is pending at the\n // immediate edge, but be safe).\n const settle = pending;\n pending = [];\n settle.forEach((r) => r(result));\n }\n });\n }) as Debounced<P, R>;\n\n debounced.flush = (): Promise<R | undefined> => {\n if (!lastArgs && pending.length === 0) {\n // Nothing buffered, but an autonomous fire (wait/age/size cap) may have\n // already drained the window and left its `fn` return in `result`. For a\n // batch flush whose `fn` is async, that promise can still be in flight.\n // Return it so a caller like graceful shutdown awaits the in-flight work\n // instead of racing teardown (e.g. closing a writer mid-append). When\n // the last fire was sync/settled, awaiting a resolved value is a no-op.\n return Promise.resolve(result);\n }\n return new Promise<R | undefined>((resolve) => {\n pending.push(resolve);\n fire();\n });\n };\n\n debounced.cancel = (): void => {\n const settle = pending;\n pending = [];\n reset();\n // Drop the last fire's retained return so a later empty flush() cannot\n // surface a stale, cancelled-context result instead of undefined.\n result = undefined;\n settle.forEach((r) => r(undefined));\n };\n\n debounced.size = (): number => count;\n\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `fn` at most once per\n * every `delay` milliseconds.\n *\n * The second argument is either a delay-ms number (legacy form) or a\n * {@link ScheduleOptions} object. The object form is accepted for\n * symmetry with {@link debounce}; the `wait` field is used as the\n * inter-invocation interval. `size` and `age` are accepted but have no\n * semantic role in throttle (no buffer is held) — they exist so the\n * primitive can be swapped with `debounce` behind a single config shape.\n *\n * @template P, R\n * @param fn The function to throttle.\n * @param opts Either a delay-ms number or a {@link ScheduleOptions} object.\n * @returns The new throttled function.\n */\n\ntype Timeout = ReturnType<typeof setTimeout>;\nexport function throttle<P extends unknown[], R>(\n fn: (...args: P) => R | undefined,\n opts: number | ScheduleOptions = 1000,\n): (...args: P) => R | undefined {\n const { wait } = normalizeScheduleOptions(opts, 1000);\n let isBlocked: Timeout | null = null;\n\n return function (...args: P): R | undefined {\n // Skip since function is still blocked by previous call\n if (isBlocked !== null) return;\n\n // Set a blocking timeout\n isBlocked = setTimeout(() => {\n // Unblock function\n isBlocked = null;\n }, wait) as Timeout;\n\n // Call the function\n return fn(...args);\n };\n}\n","import type {\n Config,\n DefaultHandler,\n ErrorContext,\n Handler,\n Instance,\n InternalConfig,\n LogContext,\n} from './types/logger';\nimport { Level } from './types/logger';\n\n/**\n * Normalize an Error object into ErrorContext\n */\nfunction normalizeError(err: Error): ErrorContext {\n return {\n message: err.message,\n name: err.name,\n stack: err.stack,\n cause: (err as Error & { cause?: unknown }).cause,\n };\n}\n\n/**\n * Normalize message and context parameters\n * Handles Error objects passed as message or context\n */\nfunction normalizeParams(\n message: string | Error,\n context?: unknown | Error,\n): { message: string; context: LogContext } {\n let normalizedMessage: string;\n let normalizedContext: LogContext = {};\n\n // Handle message\n if (message instanceof Error) {\n normalizedMessage = message.message;\n normalizedContext.error = normalizeError(message);\n } else {\n normalizedMessage = message;\n }\n\n // Handle context\n if (context !== undefined) {\n if (context instanceof Error) {\n normalizedContext.error = normalizeError(context);\n } else if (typeof context === 'object' && context !== null) {\n normalizedContext = { ...normalizedContext, ...(context as object) };\n // If context has an error property that's an Error, normalize it\n if (\n 'error' in normalizedContext &&\n normalizedContext.error instanceof Error\n ) {\n normalizedContext.error = normalizeError(\n normalizedContext.error as unknown as Error,\n );\n }\n } else {\n normalizedContext.value = context;\n }\n }\n\n return { message: normalizedMessage, context: normalizedContext };\n}\n\n/**\n * Default console-based log handler\n */\nconst defaultHandler: DefaultHandler = (level, message, context, scope) => {\n const levelName = Level[level];\n const scopePath = scope.length > 0 ? ` [${scope.join(':')}]` : '';\n const prefix = `${levelName}${scopePath}`;\n\n const hasContext = Object.keys(context).length > 0;\n\n const consoleFn =\n level === Level.ERROR\n ? console.error\n : level === Level.WARN\n ? console.warn\n : console.log;\n\n if (hasContext) {\n consoleFn(prefix, message, context);\n } else {\n consoleFn(prefix, message);\n }\n};\n\n/**\n * Normalize log level from string or enum to enum value\n */\nfunction normalizeLevel(level: Level | keyof typeof Level): Level {\n if (typeof level === 'string') {\n return Level[level as keyof typeof Level];\n }\n return level;\n}\n\n/**\n * Create a logger instance\n *\n * @param config - Logger configuration\n * @returns Logger instance with all log methods and scoping support\n *\n * @example\n * ```typescript\n * // Basic usage\n * const logger = createLogger({ level: 'DEBUG' });\n * logger.info('Hello world');\n *\n * // With scoping\n * const destLogger = logger.scope('gtag').scope('myInstance');\n * destLogger.debug('Processing event'); // DEBUG [gtag:myInstance] Processing event\n *\n * // With custom handler\n * const logger = createLogger({\n * handler: (level, message, context, scope, originalHandler) => {\n * // Custom logic (e.g., send to Sentry)\n * originalHandler(level, message, context, scope);\n * }\n * });\n * ```\n *\n * // TODO: Consider compile-time stripping of debug logs in production builds\n * // e.g., if (__DEV__) { logger.debug(...) }\n */\nexport function createLogger(config: Config = {}): Instance {\n const level =\n config.level !== undefined ? normalizeLevel(config.level) : Level.ERROR;\n const customHandler = config.handler;\n const jsonHandler = config.jsonHandler;\n const scope: string[] = [];\n\n return createLoggerInternal({\n level,\n handler: customHandler,\n jsonHandler,\n scope,\n });\n}\n\n/**\n * Internal logger creation with resolved config\n */\nfunction createLoggerInternal(config: InternalConfig): Instance {\n const { level, handler, jsonHandler, scope } = config;\n\n /**\n * Internal log function that checks level and delegates to handler\n */\n const log = (\n logLevel: Level,\n message: string | Error,\n context?: unknown | Error,\n ): void => {\n if (logLevel <= level) {\n const normalized = normalizeParams(message, context);\n\n if (handler) {\n // Custom handler with access to default handler\n handler(\n logLevel,\n normalized.message,\n normalized.context,\n scope,\n defaultHandler,\n );\n } else {\n defaultHandler(logLevel, normalized.message, normalized.context, scope);\n }\n }\n };\n\n /**\n * Log and throw - combines logging and throwing\n */\n const logAndThrow = (message: string | Error, context?: unknown): never => {\n // Always log errors regardless of level\n const normalized = normalizeParams(message, context);\n\n if (handler) {\n handler(\n Level.ERROR,\n normalized.message,\n normalized.context,\n scope,\n defaultHandler,\n );\n } else {\n defaultHandler(\n Level.ERROR,\n normalized.message,\n normalized.context,\n scope,\n );\n }\n\n // Throw with the message\n throw new Error(normalized.message);\n };\n\n return {\n error: (message, context) => log(Level.ERROR, message, context),\n warn: (message, context) => log(Level.WARN, message, context),\n info: (message, context) => log(Level.INFO, message, context),\n debug: (message, context) => log(Level.DEBUG, message, context),\n throw: logAndThrow,\n json: (data: unknown) => {\n if (jsonHandler) {\n jsonHandler(data);\n } else {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data, null, 2));\n }\n },\n scope: (name: string) =>\n createLoggerInternal({\n level,\n handler,\n jsonHandler,\n scope: [...scope, name],\n }),\n };\n}\n\n// Re-export Level enum for convenience\nexport { Level };\n","import type { WalkerOS } from './types';\nimport {\n isArguments,\n isArray,\n isBoolean,\n isDefined,\n isNumber,\n isObject,\n isString,\n} from './is';\n\n/**\n * Checks if a value is a valid property type.\n *\n * @param value The value to check.\n * @returns True if the value is a valid property type, false otherwise.\n */\nexport function isPropertyType(value: unknown): value is WalkerOS.PropertyType {\n return (\n isBoolean(value) ||\n isString(value) ||\n isNumber(value) ||\n !isDefined(value) ||\n (isArray(value) && value.every(isPropertyType)) ||\n (isObject(value) && Object.values(value).every(isPropertyType))\n );\n}\n\n/**\n * Filters a value to only include valid property types.\n *\n * @param value The value to filter.\n * @returns The filtered value or undefined.\n */\nexport function filterValues(value: unknown): WalkerOS.Property | undefined {\n if (isBoolean(value) || isString(value) || isNumber(value)) return value;\n\n if (isArguments(value)) return filterValues(Array.from(value));\n\n if (isArray(value)) {\n return value\n .map((item) => filterValues(item))\n .filter((item): item is WalkerOS.PropertyType => item !== undefined);\n }\n\n if (isObject(value)) {\n return Object.entries(value).reduce<Record<string, WalkerOS.Property>>(\n (acc, [key, val]) => {\n const filteredValue = filterValues(val);\n if (filteredValue !== undefined) acc[key] = filteredValue;\n return acc;\n },\n {},\n );\n }\n\n return;\n}\n\n/**\n * Casts a value to a valid property type.\n *\n * @param value The value to cast.\n * @returns The casted value or undefined.\n */\nexport function castToProperty(value: unknown): WalkerOS.Property | undefined {\n return isPropertyType(value) ? value : undefined;\n}\n","/**\n * A utility function that wraps a function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped function.\n */\n// Use function overload to support different return type depending on onError\n// Types\nexport function tryCatch<P extends unknown[], R, S>(\n fn: (...args: P) => R | undefined,\n onError: (err: unknown) => S,\n onFinally?: () => void,\n): (...args: P) => R | S;\nexport function tryCatch<P extends unknown[], R>(\n fn: (...args: P) => R | undefined,\n onError?: undefined,\n onFinally?: () => void,\n): (...args: P) => R | undefined;\n// Implementation\nexport function tryCatch<P extends unknown[], R, S>(\n fn: (...args: P) => R | undefined,\n onError?: (err: unknown) => S,\n onFinally?: () => void,\n): (...args: P) => R | S | undefined {\n return function (...args: P): R | S | undefined {\n try {\n return fn(...args);\n } catch (err) {\n if (!onError) return;\n return onError(err);\n } finally {\n onFinally?.();\n }\n };\n}\n\n/**\n * A utility function that wraps an async function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The async function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped async function.\n */\n// Use function overload to support different return type depending on onError\n// Types\nexport function tryCatchAsync<P extends unknown[], R, S>(\n fn: (...args: P) => R,\n onError: (err: unknown) => S,\n onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | S>;\nexport function tryCatchAsync<P extends unknown[], R>(\n fn: (...args: P) => R,\n onError?: undefined,\n onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | undefined>;\n// Implementation\nexport function tryCatchAsync<P extends unknown[], R, S>(\n fn: (...args: P) => R,\n onError?: (err: unknown) => S,\n onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | S | undefined> {\n return async function (...args: P): Promise<R | S | undefined> {\n try {\n return await fn(...args);\n } catch (err) {\n if (!onError) return;\n return await onError(err);\n } finally {\n await onFinally?.();\n }\n };\n}\n","/**\n * Error subclass for invariant violations or operator-initiated aborts\n * that must escape the top-level boundary catches in `collector.push`\n * and `collector.command`.\n *\n * Standard `Error` instances are absorbed by the boundary, logged, and\n * counted on `collector.status.failed`. A `FatalError` rethrows so a\n * runtime supervisor (CLI runner, Express server, container orchestrator)\n * can terminate the process cleanly.\n *\n * Use sparingly. Most operational failures are recoverable and should\n * be plain `Error`. Reserve `FatalError` for programmer-error invariant\n * violations or explicit fail-stop signals.\n */\nexport class FatalError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'FatalError';\n\n // Preserve prototype chain for `instanceof` checks across realms.\n Object.setPrototypeOf(this, FatalError.prototype);\n }\n}\n","import type { Mapping, WalkerOS, Collector } from './types';\nimport { deleteByPath, getByPath, setByPath } from './byPath';\nimport { isArray, isDefined, isString, isObject } from './is';\nimport { castToProperty } from './property';\nimport { tryCatchAsync } from './tryCatch';\nimport { FatalError } from './fatalError';\nimport { getGrantedConsent } from './consent';\nimport { assign } from './assign';\nimport { flattenIncludeSections } from './include';\n\n/**\n * Gets the mapping for an event.\n *\n * @param event The event to get the mapping for (can be partial or full).\n * @param mapping The mapping rules.\n * @param collector Required to evaluate rule-level conditions against the unified Context. Legacy callers may omit; rule-level conditions then run with `undefined as never` (defensive).\n * @returns The mapping result.\n */\nexport async function getMappingEvent(\n event: WalkerOS.DeepPartialEvent | WalkerOS.PartialEvent | WalkerOS.Event,\n mapping?: Mapping.Rules,\n collector?: Collector.Instance,\n): Promise<Mapping.Result> {\n const [entity, action] = (event.name || '').split(' ');\n if (!mapping || !entity || !action) return {};\n\n let eventMapping: Mapping.Rule | undefined;\n let mappingKey = '';\n let entityKey = entity;\n let actionKey = action;\n\n const resolveEventMapping = (\n rules?: Mapping.Rule | Mapping.Rule[],\n ): Mapping.Rule | undefined => {\n if (!rules) return;\n const list = isArray(rules) ? rules : [rules];\n return list.find((rule) => {\n if (!rule.condition) return true;\n if (!collector) {\n // Rule-level condition without a collector cannot be evaluated against\n // the unified Context. Treat as match (legacy behavior) — internal\n // callers should always pass collector; this branch is defensive.\n return Boolean(rule.condition(event, undefined as never));\n }\n const ctx: Mapping.Context = {\n event,\n mapping: rule,\n collector,\n logger: collector.logger,\n consent: ((isObject(event) &&\n (event as WalkerOS.PartialEvent).consent) ||\n collector.consent) as WalkerOS.Consent,\n };\n return Boolean(rule.condition(event, ctx));\n });\n };\n\n if (!mapping[entityKey]) entityKey = '*';\n const entityMapping = mapping[entityKey];\n\n if (entityMapping) {\n if (!entityMapping[actionKey]) actionKey = '*';\n eventMapping = resolveEventMapping(entityMapping[actionKey]);\n }\n\n if (!eventMapping) {\n entityKey = '*';\n actionKey = '*';\n eventMapping = resolveEventMapping(mapping[entityKey]?.[actionKey]);\n }\n\n if (eventMapping) mappingKey = `${entityKey} ${actionKey}`;\n\n return { eventMapping, mappingKey };\n}\n\n/**\n * Gets a value from a mapping.\n *\n * @param value The value to get the mapping from.\n * @param data The mapping data.\n * @param options The mapping options.\n * @returns The mapped value.\n */\nexport async function getMappingValue(\n value: WalkerOS.DeepPartialEvent | unknown | undefined,\n data: Mapping.Data = {},\n context: Partial<Mapping.Context> = {},\n): Promise<WalkerOS.Property | undefined> {\n if (!isDefined(value)) return;\n\n // Resolve consent in priority order: value.consent > context.consent > collector.consent\n const consent =\n ((isObject(value) && value.consent) as WalkerOS.Consent) ||\n context.consent ||\n context.collector?.consent;\n\n // Resolve event: explicit context.event wins; else infer from value when it is an event-shaped object.\n const event = (context.event ??\n (isObject(value) ? value : {})) as WalkerOS.DeepPartialEvent;\n\n if (!context.collector) {\n // Internal sites (cache.ts, top-level callers) MUST pass a collector.\n // This guard catches plumbing bugs early instead of silent type-narrowing.\n throw new Error('getMappingValue: context.collector is required');\n }\n\n const baseContext: Mapping.Context = {\n event,\n mapping: data as Mapping.Value,\n collector: context.collector,\n logger: context.collector.logger,\n consent,\n };\n\n const mappings = isArray(data) ? data : [data];\n for (const mapping of mappings) {\n const result = await tryCatchAsync(\n processMappingValue,\n (err: unknown): undefined => {\n if (err instanceof FatalError) throw err;\n if (context.collector) context.collector.status.failed++;\n baseContext.logger.error('mapping processing failed', {\n event,\n error: err,\n });\n return undefined;\n },\n )(value, mapping, {\n ...baseContext,\n mapping,\n });\n if (isDefined(result)) return result;\n }\n return;\n}\n\nasync function processMappingValue(\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Mapping.Value,\n context: Mapping.Context,\n): Promise<WalkerOS.Property | undefined> {\n const mappings = isArray(mapping) ? mapping : [mapping];\n\n return mappings.reduce(\n async (accPromise, mappingItem) => {\n const acc = await accPromise;\n if (acc) return acc;\n\n const mapping = isString(mappingItem)\n ? { key: mappingItem }\n : mappingItem;\n\n if (!Object.keys(mapping).length) return;\n\n const {\n condition,\n consent,\n fn,\n key,\n loop,\n map,\n set,\n validate,\n value: staticValue,\n } = mapping;\n\n // Per-mapping context — `mapping` reflects the current item.\n const cbContext: Mapping.Context = { ...context, mapping: mappingItem };\n\n if (\n condition &&\n !(await tryCatchAsync(condition, (err: unknown): boolean => {\n if (err instanceof FatalError) throw err;\n cbContext.logger.error('mapping condition failed', {\n event: cbContext.event,\n error: err,\n });\n return false; // Preserve \"skip this rule\" semantic on throw.\n })(value, cbContext))\n )\n return;\n\n if (consent && !getGrantedConsent(consent, cbContext.consent))\n return staticValue;\n\n let mappingValue: unknown = isDefined(staticValue) ? staticValue : value;\n\n if (fn) {\n mappingValue = await tryCatchAsync(fn, (err: unknown): undefined => {\n if (err instanceof FatalError) throw err;\n cbContext.logger.error('mapping fn failed', {\n event: cbContext.event,\n error: err,\n });\n return undefined; // No transform on error.\n })(value, cbContext);\n }\n\n if (key) {\n mappingValue = getByPath(value, key, staticValue);\n }\n\n if (loop) {\n const [scope, itemMapping] = loop;\n const data =\n scope === 'this'\n ? [value]\n : await getMappingValue(value, scope, cbContext);\n\n if (isArray(data)) {\n mappingValue = (\n await Promise.all(\n data.map((item) => getMappingValue(item, itemMapping, cbContext)),\n )\n ).filter(isDefined);\n }\n } else if (map) {\n mappingValue = await Object.entries(map).reduce(\n async (mappedObjPromise, [mapKey, mapValue]) => {\n const mappedObj = await mappedObjPromise;\n const result = await getMappingValue(value, mapValue, cbContext);\n if (isDefined(result)) mappedObj[mapKey] = result;\n return mappedObj;\n },\n Promise.resolve({} as WalkerOS.AnyObject),\n );\n } else if (set) {\n mappingValue = await Promise.all(\n set.map((item) => processMappingValue(value, item, cbContext)),\n );\n }\n\n if (\n validate &&\n !(await tryCatchAsync(validate, (err: unknown): boolean => {\n if (err instanceof FatalError) throw err;\n cbContext.logger.error('mapping validate failed', {\n event: cbContext.event,\n error: err,\n });\n return false; // Preserve \"validation failed\" semantic on throw.\n })(mappingValue, cbContext))\n )\n mappingValue = undefined;\n\n const property = castToProperty(mappingValue);\n return isDefined(property) ? property : castToProperty(staticValue);\n },\n Promise.resolve(undefined as WalkerOS.Property | undefined),\n );\n}\n\n/**\n * Processes an event through mapping configuration.\n *\n * This is the unified mapping logic used by both sources and destinations.\n * It applies transformations in this order:\n * 1. Config-level policy - modifies the event itself (global rules)\n * 2. Mapping rules - finds matching rule based on entity-action\n * 3. Event-level policy - modifies the event based on specific mapping rule\n * 4. Data transformation - creates context data\n * 5. Ignore check and name override\n *\n * Sources can pass partial events, destinations pass full events.\n * getMappingValue works with both partial and full events.\n *\n * @param event - The event to process (can be partial or full, will be mutated by policies)\n * @param config - Mapping configuration (mapping, data, policy, consent)\n * @param collector - Collector instance for context\n * @returns Object with transformed event, data, mapping rule, and ignore flag\n */\nexport async function processEventMapping<\n T extends WalkerOS.DeepPartialEvent | WalkerOS.Event,\n>(\n event: T,\n config: Mapping.Config,\n collector: Collector.Instance,\n): Promise<{\n event: T;\n data?: WalkerOS.Property;\n mapping?: Mapping.Rule;\n mappingKey?: string;\n ignore: boolean;\n silent: boolean;\n}> {\n // Step 1: Apply config-level policy (modifies event)\n if (config.policy) {\n await Promise.all(\n Object.entries(config.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, {\n collector,\n event,\n });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 2: Get event mapping rule\n const { eventMapping, mappingKey } = await getMappingEvent(\n event,\n config.mapping,\n collector,\n );\n\n // Step 2.5: Apply event-level policy (modifies event)\n if (eventMapping?.policy) {\n await Promise.all(\n Object.entries(eventMapping.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, {\n collector,\n event,\n });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 3: Transform global data\n let data =\n config.data &&\n (await getMappingValue(event, config.data, { collector, event }));\n\n const silent = Boolean(eventMapping?.silent);\n\n if (eventMapping) {\n // Check if event should be ignored\n if (eventMapping.ignore) {\n return {\n event,\n data,\n mapping: eventMapping,\n mappingKey,\n ignore: true,\n silent,\n };\n }\n\n // Override event name if specified\n if (eventMapping.name) event.name = eventMapping.name;\n\n // Transform event-specific data\n if (eventMapping.data) {\n const dataEvent =\n eventMapping.data &&\n (await getMappingValue(event, eventMapping.data, {\n collector,\n event,\n }));\n data =\n isObject(data) && isObject(dataEvent) // Only merge objects\n ? assign(data, dataEvent)\n : dataEvent;\n }\n }\n\n // Include: flatten event sections into data. Rule-level replaces config-level.\n const effectiveInclude = eventMapping?.include ?? config.include;\n if (effectiveInclude && effectiveInclude.length > 0) {\n const includeData = flattenIncludeSections(event, effectiveInclude);\n if (Object.keys(includeData).length > 0) {\n // Include is the bottom layer - data wins on key conflict.\n data = isObject(data)\n ? (assign(\n includeData,\n data as Record<string, unknown>,\n ) as unknown as WalkerOS.Property)\n : (data ?? (includeData as unknown as WalkerOS.Property));\n }\n }\n\n // Output layer: strip removed paths from the produced data. Applied last,\n // after include, so remove always wins. Rooted at the produced payload.\n if (eventMapping?.remove && isObject(data)) {\n for (const path of eventMapping.remove) {\n data = deleteByPath(data, path);\n }\n }\n\n return {\n event,\n data,\n mapping: eventMapping,\n mappingKey,\n ignore: false,\n silent,\n };\n}\n","import type { Mapping } from './types';\nimport { isObject } from './is';\nimport { clone } from './clone';\n\nfunction mergePatch(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === undefined) continue;\n if (val === null) {\n delete target[key];\n continue;\n }\n const cur = target[key];\n if (isObject(val) && isObject(cur)) {\n mergePatch(cur, val);\n } else {\n target[key] = val;\n }\n }\n return target;\n}\n\n/**\n * Resolve a user mapping rule against a package-shipped default rule.\n * - No extend/remove → replace (clone of override; today's behavior).\n * - extend → partial rule deep-merged onto base (null clears a field).\n * - remove → carried onto the merged rule for eval-time output stripping.\n * The returned rule never contains `extend`.\n */\nexport function mergeMappingRule(\n base: Mapping.Rule,\n override: Mapping.Rule,\n): Mapping.Rule {\n if (override.extend === undefined && override.remove === undefined) {\n return clone(override);\n }\n const merged: Record<string, unknown> = { ...clone(base) };\n if (override.extend) {\n const patch: Record<string, unknown> = { ...override.extend };\n mergePatch(merged, patch);\n }\n delete merged.extend;\n if (override.remove) merged.remove = [...override.remove];\n else delete merged.remove;\n return merged as Mapping.Rule;\n}\n","/**\n * Environment mocking utilities for walkerOS destinations\n *\n * Provides standardized tools for intercepting function calls in environment objects,\n * enabling consistent testing patterns across all destinations.\n */\n\ntype InterceptorFn = (\n path: string[],\n args: unknown[],\n original?: Function,\n) => unknown;\n\n/**\n * Creates a proxied environment that intercepts function calls\n *\n * Uses Proxy to wrap environment objects and capture all function calls,\n * allowing for call recording, mocking, or simulation.\n *\n * @param env - The environment object to wrap\n * @param interceptor - Function called for each intercepted call\n * @returns Proxied environment with interceptor applied\n *\n * @example\n * ```typescript\n * const calls: Array<{ path: string[]; args: unknown[] }> = [];\n *\n * const testEnv = mockEnv(env.push, (path, args) => {\n * calls.push({ path, args });\n * });\n *\n * // Use testEnv with destination\n * await destination.push(event, { env: testEnv });\n *\n * // Analyze captured calls\n * expect(calls).toContainEqual({\n * path: ['window', 'gtag'],\n * args: ['event', 'purchase', { value: 99.99 }]\n * });\n * ```\n */\nexport function mockEnv<T extends object>(\n env: T,\n interceptor: InterceptorFn,\n): T {\n const createProxy = (obj: object, path: string[] = []): object => {\n return new Proxy(obj, {\n get(target, prop: string) {\n const value = (target as Record<string, unknown>)[prop];\n const currentPath = [...path, prop];\n\n if (typeof value === 'function') {\n // Preserve constructors (classes) so `new amp.Identify()` works\n if (value.prototype && value.prototype.constructor === value) {\n return value;\n }\n return (...args: unknown[]) => {\n const result = interceptor(currentPath, args, value);\n // If the function returns an object, proxy it so chained calls are intercepted\n if (result && typeof result === 'object') {\n return createProxy(result as object, currentPath);\n }\n // Fall back to calling the original and proxying its return if it's an object\n const original = (value as Function)(...args);\n if (original && typeof original === 'object') {\n return createProxy(original as object, currentPath);\n }\n return result;\n };\n }\n\n if (value && typeof value === 'object') {\n return createProxy(value as object, currentPath);\n }\n\n return value;\n },\n });\n };\n\n return createProxy(env) as T;\n}\n\n/**\n * Traverses environment object and replaces values using a replacer function\n *\n * Alternative to mockEnv for environments where Proxy is not suitable.\n * Performs deep traversal and allows value transformation at each level.\n *\n * @param env - The environment object to traverse\n * @param replacer - Function to transform values during traversal\n * @returns New environment object with transformed values\n *\n * @example\n * ```typescript\n * const recordedCalls: APICall[] = [];\n *\n * const recordingEnv = traverseEnv(originalEnv, (value, path) => {\n * if (typeof value === 'function') {\n * return (...args: unknown[]) => {\n * recordedCalls.push({\n * path: path.join('.'),\n * args: structuredClone(args)\n * });\n * return value(...args);\n * };\n * }\n * return value;\n * });\n * ```\n */\nexport function traverseEnv<T extends object>(\n env: T,\n replacer: (value: unknown, path: string[]) => unknown,\n): T {\n const traverse = (obj: unknown, path: string[] = []): unknown => {\n if (!obj || typeof obj !== 'object') return obj;\n\n const result: Record<string, unknown> | unknown[] = Array.isArray(obj)\n ? []\n : {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n if (Array.isArray(result)) {\n result[Number(key)] = replacer(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = replacer(value, currentPath);\n }\n\n if (value && typeof value === 'object' && typeof value !== 'function') {\n if (Array.isArray(result)) {\n result[Number(key)] = traverse(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = traverse(\n value,\n currentPath,\n );\n }\n }\n }\n\n return result;\n };\n\n return traverse(env) as T;\n}\n","import type { Instance } from './types/logger';\n\n/**\n * Mock logger instance for testing\n * Includes all logger methods as jest.fn() plus tracking of scoped loggers\n * Extends Instance to ensure type compatibility\n */\nexport interface MockLogger extends Instance {\n error: jest.Mock;\n warn: jest.Mock;\n info: jest.Mock;\n debug: jest.Mock;\n throw: jest.Mock<never, [string | Error, unknown?]>;\n json: jest.Mock;\n scope: jest.Mock<MockLogger, [string]>;\n\n /**\n * Array of all scoped loggers created by this logger\n * Useful for asserting on scoped logger calls in tests\n */\n scopedLoggers: MockLogger[];\n}\n\n/**\n * Create a mock logger for testing\n * All methods are jest.fn() that can be used for assertions\n *\n * @example\n * ```typescript\n * const mockLogger = createMockLogger();\n *\n * // Use in code under test\n * someFunction(mockLogger);\n *\n * // Assert on calls\n * expect(mockLogger.error).toHaveBeenCalledWith('error message');\n *\n * // Assert on scoped logger\n * const scoped = mockLogger.scopedLoggers[0];\n * expect(scoped.debug).toHaveBeenCalledWith('debug in scope');\n * ```\n */\nexport function createMockLogger(): MockLogger {\n const scopedLoggers: MockLogger[] = [];\n\n const mockThrow = jest.fn((message: string | Error): never => {\n const msg = message instanceof Error ? message.message : message;\n throw new Error(msg);\n }) as jest.Mock<never, [string | Error, unknown?]>;\n\n const mockScope = jest.fn((_name: string): MockLogger => {\n const scoped = createMockLogger();\n scopedLoggers.push(scoped);\n return scoped;\n }) as jest.Mock<MockLogger, [string]>;\n\n const mockLogger: MockLogger = {\n error: jest.fn(),\n warn: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n throw: mockThrow,\n json: jest.fn(),\n scope: mockScope,\n scopedLoggers,\n };\n\n return mockLogger;\n}\n","import type { Collector, Transformer, Destination, Ingest } from './types';\nimport { createIngest } from './types/ingest';\nimport { createMockLogger } from './mockLogger';\n\n/**\n * Create a mock context for testing transformers and destinations.\n *\n * Provides sensible defaults for all required fields. Override only\n * what the test cares about. When context signatures change, only\n * this factory needs updating — not every test file.\n *\n * @example\n * ```typescript\n * // Transformer test — only specify config\n * const ctx = createMockContext({ config: { settings: { strict: true } } });\n * const result = await transformer.push(event, ctx);\n *\n * // Destination test — specify config and custom env\n * const ctx = createMockContext({ config: { settings: { url } }, env: { sendWeb } });\n * await destination.push(event, ctx);\n *\n * // With custom ingest data\n * const ctx = createMockContext({ ingest: { ...createIngest('test'), path: '/api' } });\n * ```\n */\nexport function createMockContext<\n T extends Transformer.TypesGeneric = Transformer.Types,\n>(\n overrides: Partial<\n Omit<Transformer.Context<T>, 'config' | 'ingest'> & {\n config?: Transformer.Config<T> | Destination.Config<Destination.TypesGeneric>;\n ingest?: Ingest | (Record<string, unknown> & { _meta: Ingest['_meta'] });\n data?: unknown;\n rule?: unknown;\n }\n > = {},\n): Transformer.Context<T> & Destination.PushContext<Destination.TypesGeneric> {\n return {\n collector: {} as Collector.Instance,\n config: {} as Transformer.Config<T>,\n env: {} as Transformer.Env<T>,\n logger: createMockLogger(),\n id: 'test',\n ingest: createIngest('test'),\n ...overrides,\n } as Transformer.Context<T> & Destination.PushContext<Destination.TypesGeneric>;\n}\n","import type { WalkerOS } from './types';\nimport { tryCatch } from './tryCatch';\nimport { castValue } from './castValue';\nimport { isArray, isObject } from './is';\n\n/**\n * Converts a request string to a data object.\n *\n * @param parameter The request string to convert.\n * @returns The data object or undefined.\n */\nexport function requestToData(\n parameter: unknown,\n): WalkerOS.AnyObject | undefined {\n const str = String(parameter);\n const queryString = str.split('?')[1] || str;\n\n return tryCatch(() => {\n const params = new URLSearchParams(queryString);\n const result: WalkerOS.AnyObject = {};\n\n params.forEach((value, key) => {\n const keys = key.split(/[[\\]]+/).filter(Boolean);\n let current: unknown = result;\n\n keys.forEach((k, i) => {\n const isLast = i === keys.length - 1;\n\n if (isArray(current)) {\n const index = parseInt(k, 10);\n if (isLast) {\n (current as Array<unknown>)[index] = castValue(value);\n } else {\n (current as Array<unknown>)[index] =\n (current as Array<unknown>)[index] ||\n (isNaN(parseInt(keys[i + 1], 10)) ? {} : []);\n current = (current as Array<unknown>)[index];\n }\n } else if (isObject(current)) {\n if (isLast) {\n (current as WalkerOS.AnyObject)[k] = castValue(value);\n } else {\n (current as WalkerOS.AnyObject)[k] =\n (current as WalkerOS.AnyObject)[k] ||\n (isNaN(parseInt(keys[i + 1], 10)) ? {} : []);\n current = (current as WalkerOS.AnyObject)[k];\n }\n }\n });\n });\n\n return result;\n })();\n}\n\n/**\n * Converts a data object to a request string.\n *\n * @param data The data object to convert.\n * @returns The request string.\n */\nexport function requestToParameter(\n data: WalkerOS.AnyObject | WalkerOS.PropertyType,\n): string {\n if (!data) return '';\n\n const params: string[] = [];\n const encode = encodeURIComponent;\n\n function addParam(key: string, value: unknown) {\n if (value === undefined || value === null) return;\n\n if (isArray(value)) {\n value.forEach((item, index) => addParam(`${key}[${index}]`, item));\n } else if (isObject(value)) {\n Object.entries(value).forEach(([subKey, subValue]) =>\n addParam(`${key}[${subKey}]`, subValue),\n );\n } else {\n params.push(`${encode(key)}=${encode(String(value))}`);\n }\n }\n\n if (typeof data === 'object') {\n Object.entries(data).forEach(([key, value]) => addParam(key, value));\n } else {\n return encode(data);\n }\n\n return params.join('&');\n}\n","import type { SendDataValue, SendHeaders } from './types/send';\nimport { isSameType } from './is';\nimport { assign } from './assign';\n\nexport type { SendDataValue, SendHeaders, SendResponse } from './types/send';\n\n/**\n * Transforms data to a string.\n *\n * @param data The data to transform.\n * @returns The transformed data.\n */\nexport function transformData(data?: SendDataValue): string | undefined {\n if (data === undefined) return data;\n\n return isSameType(data, '' as string) ? data : JSON.stringify(data);\n}\n\n/**\n * Gets the headers for a request.\n *\n * @param headers The headers to merge with the default headers.\n * @returns The merged headers.\n */\nexport function getHeaders(headers: SendHeaders = {}): SendHeaders {\n return assign(\n {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n headers,\n );\n}\n","// packages/core/src/setup.ts\n\n/**\n * Normalize `config.setup` into a concrete options object, or null when disabled.\n *\n * - `false` / `undefined` → null (no setup)\n * - `true` → `defaults` as-is\n * - object → shallow merge of defaults and overrides (overrides win)\n */\nexport function resolveSetup<T extends object>(\n value: boolean | T | undefined,\n defaults: T,\n): T | null {\n if (value === false || value === undefined) return null;\n if (value === true) return defaults;\n return { ...defaults, ...value };\n}\n","/**\n * Trims quotes and whitespaces from a string.\n *\n * @param str The string to trim.\n * @returns The trimmed string.\n */\nexport function trim(str: string): string {\n // Remove quotes and whitespaces\n return str ? str.trim().replace(/^'|'$/g, '').trim() : '';\n}\n","import type { Hooks, Logger } from './types';\n\n/**\n * A utility function that wraps a function with hooks.\n *\n * Pre/post hooks are user-supplied and may throw. A throwing hook must not\n * crash the surrounding pipeline. On failure, fall back to calling the\n * original function (pre-hook) or keep the original result (post-hook).\n *\n * The generic `F` preserves the exact call shape of `fn`, including named\n * parameters and overloaded interfaces, so call sites can assign the result\n * to the same interface slot without a cast.\n *\n * @template F The exact function type being wrapped.\n * @param fn The function to wrap.\n * @param name The name of the function.\n * @param hooks The hooks to use.\n * @param logger Optional logger for hook failure warnings. Falls back to\n * `console.warn` when not provided.\n * @returns The wrapped function with the same call shape as `fn`.\n */\nexport function useHooks<F extends Hooks.AnyFunction>(\n fn: F,\n name: string,\n hooks: Hooks.Functions,\n logger?: Logger.Instance,\n): F {\n // Re-anchor `fn` to its structural call shape. The generic constraint\n // `Hooks.AnyFunction` widens calls to `unknown`, so a locally-typed alias\n // restores precise argument and return types inside the closure. Same\n // bridging concern as the two hook-lookup casts below.\n const inner = fn as (...args: Parameters<F>) => ReturnType<F>;\n const wrapped = function (this: unknown, ...args: Parameters<F>) {\n let result: ReturnType<F>;\n const preHook = ('pre' + name) as keyof Hooks.Functions;\n const postHook = ('post' + name) as keyof Hooks.Functions;\n const preHookFn = hooks[preHook] as unknown as Hooks.HookFn<typeof inner>;\n const postHookFn = hooks[postHook] as unknown as Hooks.HookFn<typeof inner>;\n\n const warn = (message: string, error: unknown) => {\n if (logger) {\n logger.warn(message, { error });\n } else {\n console.warn(message, error);\n }\n };\n\n if (preHookFn) {\n try {\n result = preHookFn({ fn: inner }, ...args);\n } catch (error) {\n warn(\n `Hook ${String(preHook)} failed, falling back to original function`,\n error,\n );\n result = inner(...args);\n }\n } else {\n result = inner(...args);\n }\n\n if (postHookFn) {\n try {\n result = postHookFn({ fn: inner, result }, ...args);\n } catch (error) {\n warn(`Hook ${String(postHook)} failed, keeping original result`, error);\n }\n }\n\n return result;\n };\n return wrapped as F;\n}\n","import type { FlowState } from './types/telemetry';\nimport type { ObserverFn } from './types/observer';\n\n/**\n * Telemetry level. Off disables emission entirely. Standard projects\n * structural state without inEvent or outEvent payloads (unless explicitly\n * opted in). Trace emits full payloads on every hop.\n */\nexport type TelemetryLevel = 'off' | 'standard' | 'trace';\n\n/**\n * Options that shape the telemetry projection strategy. Defaults are chosen\n * so a caller can pass `{ flowId }` and get sensible behavior.\n */\nexport interface TelemetryOptions {\n /** Required flow identifier; observers may use this for cross-flow correlation. */\n flowId: string;\n /** Verbosity. Defaults to 'standard'. */\n level?: TelemetryLevel;\n /** Force-include the inbound event regardless of level. */\n includeIn?: boolean;\n /** Force-include the outbound event regardless of level. */\n includeOut?: boolean;\n /** Force-include the matched mapping key (only meaningful for transformers/destinations). */\n includeMappingKey?: boolean;\n /**\n * Fraction of events to emit, between 0 and 1. Deterministic by eventId:\n * the same eventId always falls on the same side of the threshold so\n * paired in/out states either both emit or both drop.\n */\n sample?: number;\n}\n\nexport type EmitFn = (state: FlowState) => void;\n\n/**\n * Optional supplier form. When passed instead of static `TelemetryOptions`,\n * the observer evaluates the supplier on every emit so toggle-style runtime\n * overrides (e.g. `WALKEROS_TRACE_UNTIL`) reach the projection without\n * rebuilding the observer.\n */\nexport type TelemetryOptionsSupplier = () => TelemetryOptions | null;\n\n/**\n * Deterministic 32-bit FNV-1a hash of a string. Used for sampling so\n * identical eventIds always map to the same numeric bucket.\n */\nfunction fnv1a(input: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash =\n (hash +\n ((hash << 1) +\n (hash << 4) +\n (hash << 7) +\n (hash << 8) +\n (hash << 24))) >>>\n 0;\n }\n return hash >>> 0;\n}\n\n/**\n * Returns true when the eventId passes the sample gate. Sample of 1 always\n * passes; sample of 0 always fails. Anything in between buckets the eventId\n * deterministically so the in/out pair is consistent.\n */\nfunction passesSample(eventId: string, sample: number): boolean {\n if (sample >= 1) return true;\n if (sample <= 0) return false;\n const hashed = fnv1a(eventId);\n const ratio = hashed / 0xffffffff;\n return ratio < sample;\n}\n\n/**\n * Build a telemetry observer that projects FlowState records according to\n * level/sample/include flags and forwards them to `emit`. The observer is\n * synchronous, never throws (a throwing emit is swallowed), and does no\n * IO of its own. Designed to be added to `collector.observers` so the\n * runtime self-emission loop drives it.\n *\n * Accepts either a static `TelemetryOptions` value or a supplier\n * `() => TelemetryOptions | null`. With a supplier, every emit reads the\n * current opts so toggles such as `WALKEROS_TRACE_UNTIL` reach the\n * projection without rebuilding the observer. A supplier returning `null`\n * suppresses the emit (telemetry off).\n */\nexport function createTelemetryObserver(\n emit: EmitFn,\n optsOrSupplier: TelemetryOptions | TelemetryOptionsSupplier,\n): ObserverFn {\n const supply: TelemetryOptionsSupplier =\n typeof optsOrSupplier === 'function'\n ? optsOrSupplier\n : () => optsOrSupplier;\n\n return function project(state: FlowState): void {\n const opts = supply();\n if (!opts) return;\n\n const level: TelemetryLevel = opts.level ?? 'standard';\n if (level === 'off') return;\n\n const rawSample = opts.sample;\n const sample =\n typeof rawSample === 'number' && Number.isFinite(rawSample)\n ? rawSample\n : 1;\n if (state.eventId && !passesSample(state.eventId, sample)) return;\n\n const includeIn = opts.includeIn ?? level === 'trace';\n const includeOut = opts.includeOut ?? level === 'trace';\n const includeMappingKey = opts.includeMappingKey ?? level === 'trace';\n\n const projected: FlowState = { ...state };\n if (!includeIn) delete projected.inEvent;\n if (!includeOut) {\n delete projected.outEvent;\n delete projected.calls;\n }\n if (!includeMappingKey) delete projected.mappingKey;\n\n // Error message truncation: limit to 256 chars outside trace so stack\n // fragments or echoed payloads do not leak verbosely. Trace keeps the\n // full message.\n if (\n level !== 'trace' &&\n projected.error?.message &&\n projected.error.message.length > 256\n ) {\n projected.error = {\n ...projected.error,\n message: projected.error.message.slice(0, 256) + '…',\n };\n }\n\n try {\n emit(projected);\n } catch {\n // Downstream emit must not crash the pipeline. Logging would itself\n // be observer-shaped, so swallow defensively.\n }\n };\n}\n\n/**\n * Convenience export: the internal sampling predicate so callers (and\n * tests) can verify the deterministic bucketing without importing the\n * private FNV-1a helper.\n */\nexport function isSampled(eventId: string, sample: number): boolean {\n return passesSample(eventId, sample);\n}\n","/**\n * Runtime telemetry resolver.\n *\n * Converts a flow-side `Flow.Config.observe` block plus a runtime `traceUntil`\n * override into a concrete `TelemetryOptions` the collector hooks installer can\n * consume. Pure function of its inputs: it reads no environment.\n *\n * Resolution order (highest priority first):\n * 1. `traceUntil`, if a string that parses to a future ISO timestamp ->\n * force level=trace, sample=1, include in/out payloads.\n * 2. The `observe` block.\n * 3. A tier default of `{ level: 'standard' }`.\n *\n * The `traceUntil` value can flip between emits, so trace turns on and off as\n * the timestamp comes and goes. The platform-specific caller owns the value\n * and supplies it per emit.\n */\nimport type { TelemetryLevel, TelemetryOptions } from './telemetry';\n\ninterface ResolveTelemetryInput {\n flowId: string;\n /** From `flow.config?.observe`. May be undefined. */\n observe?: { level?: 'off' | 'standard' | 'trace'; sample?: number };\n /** Runtime trace override. ISO timestamp parsing to a future time forces trace. */\n traceUntil?: string | null;\n /** Clock seam for tests. Defaults to `Date.now()`. */\n now?: () => number;\n}\n\n/**\n * Returns `TelemetryOptions` ready to pass to `createTelemetryObserver`,\n * or `null` if telemetry is disabled (`level === 'off'` with no trace\n * override). Callers should skip observer installation when this returns\n * null.\n */\nexport function resolveTelemetryOptions(\n input: ResolveTelemetryInput,\n): TelemetryOptions | null {\n const now = input.now ?? (() => Date.now());\n\n const { traceUntil } = input;\n if (typeof traceUntil === 'string' && traceUntil.length > 0) {\n const parsed = Date.parse(traceUntil);\n if (!Number.isNaN(parsed) && parsed > now()) {\n return {\n flowId: input.flowId,\n level: 'trace',\n includeIn: true,\n includeOut: true,\n sample: 1,\n };\n }\n }\n\n const level: TelemetryLevel = input.observe?.level ?? 'standard';\n if (level === 'off') return null;\n\n const sample = input.observe?.sample ?? 1;\n return {\n flowId: input.flowId,\n level,\n sample,\n };\n}\n","/** Claims carried by an activation grant. See the preview-sessions design spec. */\nexport interface ActivationGrant {\n /** Issuing environment, e.g. 'app:stage'. Verifier rejects a foreign issuer. */\n iss: string;\n /** Exact origins this grant may activate on. Exact-membership match only. */\n aud: string[];\n /** Issue time, epoch seconds. The URL window is enforced against this. */\n iat: number;\n /** Session expiry, epoch seconds. Storage-sourced grants are rejected after it. */\n sxp: number;\n /** Opaque artifact id: the preview bundle is `preview/<art>.js`. */\n art: string;\n /** Subresource integrity of the artifact bytes, e.g. 'sha384-…'. */\n sri: string;\n /** Opaque per-project binding. Must equal the value baked into the host bundle. */\n pb: string;\n /** Capability. Only 'activate' exists today. */\n cap: 'activate';\n /** Per-grant unique id, for audit and revocation. */\n jti: string;\n /** Preview id, for correlation. Never a project id. */\n pid: string;\n /** Session id, present only on cross-part (web+server) grants. */\n ses?: string;\n /** Opaque per-session binding. Present iff `ses` is. */\n sb?: string;\n}\n\nexport type PreviewFailure =\n | 'no-grant'\n | 'malformed'\n | 'kid-mismatch'\n | 'bad-signature'\n | 'foreign-issuer'\n | 'expired'\n | 'aud-mismatch'\n | 'pb-mismatch'\n | 'sb-mismatch'\n | 'cap-mismatch'\n | 'no-subtle'\n | 'swap-failed';\n\nexport interface ParsedGrant {\n grant: ActivationGrant;\n kid: string;\n /** The exact bytes covered by the signature: `${header}.${payload}` as UTF-8. */\n signed: Uint8Array;\n /** Raw r‖s signature, 64 bytes. */\n signature: Uint8Array;\n}\n\nexport type VerifyResult =\n | { ok: true; grant: ActivationGrant }\n | { ok: false; reason: PreviewFailure };\n\n// Base64url alphabet, no padding: shared by every JWS segment decode below\n// and by isGrant's `art` check, since `art` is interpolated into a URL path\n// and must never carry '.', '/' or other path-traversal characters even\n// though it is not itself base64url-decoded.\nconst JWS_SEGMENT_CHARSET = /^[A-Za-z0-9_-]+$/;\n\nfunction decodeSegment(segment: string): Uint8Array | null {\n if (!JWS_SEGMENT_CHARSET.test(segment)) return null;\n const pad =\n segment.length % 4 === 0 ? '' : '='.repeat(4 - (segment.length % 4));\n const base64 = segment.replace(/-/g, '+').replace(/_/g, '/') + pad;\n // atob is untyped in core (no DOM lib, no own @types/node) but present in\n // every runtime we target (browsers, Node >=16, jsdom): structural access.\n const atobFn = (globalThis as { atob?: (data: string) => string }).atob;\n if (!atobFn) return null;\n try {\n const binary = atobFn(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n } catch {\n return null;\n }\n}\n\n// Core ships without TextEncoder/TextDecoder (no DOM lib, jsdom lacks them,\n// see batchedPoster.ts). The grant protocol is ASCII by contract: mint\n// \\u-escapes non-ASCII in the JSON payload, so any byte >0x7F is malformed.\nfunction bytesToAscii(bytes: Uint8Array): string | null {\n let out = '';\n for (let i = 0; i < bytes.length; i++) {\n const c = bytes[i];\n if (c === undefined || c > 0x7f) return null;\n out += String.fromCharCode(c);\n }\n return out;\n}\n\n// The JWS signing input (`base64url.base64url`) is inherently ASCII.\nfunction asciiToBytes(text: string): Uint8Array {\n const bytes = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) bytes[i] = text.charCodeAt(i);\n return bytes;\n}\n\nfunction decodeJson(segment: string): unknown {\n const bytes = decodeSegment(segment);\n if (!bytes) return null;\n const text = bytesToAscii(bytes);\n if (text === null) return null;\n try {\n const parsed: unknown = JSON.parse(text);\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isGrant(value: unknown): value is ActivationGrant {\n if (!isRecord(value)) return false;\n const g = value;\n return (\n typeof g.iss === 'string' &&\n Array.isArray(g.aud) &&\n g.aud.every((a) => typeof a === 'string') &&\n typeof g.iat === 'number' &&\n typeof g.sxp === 'number' &&\n typeof g.art === 'string' &&\n // Same-origin path traversal guard: `art` is interpolated into\n // `/preview/${art}.js`. The fixed `previewOrigin` authority already stops\n // a hostile `art` from leaving this origin, but without this charset\n // check a signed grant could still smuggle '../' into the request path.\n JWS_SEGMENT_CHARSET.test(g.art) &&\n typeof g.sri === 'string' &&\n typeof g.pb === 'string' &&\n g.cap === 'activate' &&\n typeof g.jti === 'string' &&\n typeof g.pid === 'string' &&\n (g.ses === undefined || typeof g.ses === 'string') &&\n (g.sb === undefined || typeof g.sb === 'string')\n );\n}\n\n/**\n * Parse a compact JWS activation grant. Pure and synchronous: this is the cheap\n * gate that runs before any crypto is touched. Returns null on anything\n * malformed: callers treat null as \"ignore, do not clear existing state\".\n */\nexport function parseGrant(raw: string): ParsedGrant | null {\n if (!raw) return null;\n const parts = raw.split('.');\n const [headerSeg, payloadSeg, sigSeg] = parts;\n if (parts.length !== 3 || !headerSeg || !payloadSeg || !sigSeg) return null;\n\n const header = decodeJson(headerSeg);\n if (!isRecord(header)) return null;\n const kid = header.kid;\n const alg = header.alg;\n if (typeof kid !== 'string' || alg !== 'ES256') return null;\n\n const payload = decodeJson(payloadSeg);\n if (!isGrant(payload)) return null;\n\n const signature = decodeSegment(sigSeg);\n if (!signature || signature.byteLength !== 64) return null;\n\n return {\n grant: payload,\n kid,\n signed: asciiToBytes(`${headerSeg}.${payloadSeg}`),\n signature,\n };\n}\n\n/** A public key a bundle or container will accept grants from. */\nexport interface PreviewKey {\n kid: string;\n /** base64url-encoded P-256 SPKI. */\n spki: string;\n}\n\n// Node's real SubtleCrypto splits importKey into a 'jwk' overload and a\n// non-'jwk' one, each with its own keyData type. A plain `Uint8Array`\n// parameter here makes TS's overload matching pick the incompatible 'jwk'\n// overload and report a false mismatch; this wider union (matching the\n// shape of Node's own BufferSource) resolves against the right overload\n// while still accepting a plain Uint8Array at every call site.\ntype PreviewBinary = ArrayBuffer | ArrayBufferView;\n\n/**\n * Structural slice of WebCrypto used by the verifier. Core compiles without\n * the DOM lib, so the ambient `Crypto` type is unavailable here: a structural\n * type also lets tests inject `node:crypto`'s webcrypto without casts and lets\n * `{}` model a subtle-less environment (same pattern as batchedPoster's\n * PosterFetch).\n */\nexport interface PreviewSubtle {\n importKey(\n format: 'spki',\n keyData: PreviewBinary,\n algorithm: { name: string; namedCurve: string },\n extractable: boolean,\n keyUsages: string[],\n ): Promise<unknown>;\n verify(\n algorithm: { name: string; hash: string },\n key: unknown,\n signature: PreviewBinary,\n data: PreviewBinary,\n ): Promise<boolean>;\n}\n\nexport interface PreviewCrypto {\n subtle?: PreviewSubtle;\n}\n\n/**\n * The two real callers of `verifyActivation` bind audience differently: the\n * web loader always has a page origin and checks `aud` against it, while a\n * container has no origin at all and is bound to one session instead. A\n * discriminated union (rather than an optional `origin`) turns \"the caller\n * forgot `origin`\" from a silent aud-check skip into a compile error on the\n * web arm; `expectSession` is forced on the container arm for the same\n * reason, since that arm's whole job is proving it checked *something*.\n */\ntype VerifyAudience =\n | { origin: string; expectSession?: undefined }\n | { origin?: undefined; expectSession: { ses: string; sb: string } };\n\nexport type VerifyParams = VerifyAudience & {\n /** Keys this host accepts. Current + previous, so rotation is non-disruptive. */\n keyring: PreviewKey[];\n /** Expected issuer, e.g. 'app:stage'. */\n iss: string;\n /** This host's baked project binding. Required unless `acceptForeign`. */\n pb?: string;\n /** Demo hosts only: skip the pb match, require aud to be a single allowlisted origin. */\n acceptForeign?: boolean;\n demoAllowlist?: string[];\n /** Which clock applies: the URL handover window, or the session expiry. */\n source: 'url' | 'storage';\n /** Epoch milliseconds. Injected so tests and the server control the clock. */\n now: number;\n /** Defaults to globalThis.crypto. Injectable for jsdom/node tests. */\n crypto?: PreviewCrypto;\n};\n\n/** A grant handed over in a URL is only accepted this long after `iat`. */\nexport const URL_WINDOW_MS = 15 * 60 * 1000;\n\n/**\n * How far a grant's `iat` may sit in the future and still count as ordinary\n * clock skew rather than a broken or hostile mint clock (RFC 7519 §4.1.5\n * iat/nbf practice: reject a token issued in the future, with tolerance).\n */\nexport const CLOCK_SKEW_MS = 60 * 1000;\n\n/**\n * Verifier-side ceiling on `sxp - iat`, independent of whatever the mint's\n * clock claims. The design spec's session TTL is a 60-minute ceiling\n * (`sxp = min(iat + 60 min, session remaining)`); this adds a modest margin\n * above that so a legitimate boundary-exact grant is never rejected by\n * rounding, while still bounding how long a leaked grant stays usable if a\n * mint clock is skewed or wrong.\n */\nexport const MAX_SESSION_MS = 65 * 60 * 1000;\n\nfunction spkiToBytes(spki: string): Uint8Array | null {\n return decodeSegment(spki);\n}\n\n/**\n * Verify an activation grant locally: no network, no DB, the signature plus\n * the baked bindings carry the whole decision.\n *\n * Claim checks run before the signature check so a hostile or malformed\n * value costs almost nothing, but `ok: true` is only ever reached after the\n * ES256 verify succeeds: no unsigned claim value is trusted on its own, it\n * only ever decides which rejection reason comes back.\n */\nexport async function verifyActivation(\n raw: string,\n params: VerifyParams,\n): Promise<VerifyResult> {\n const parsed = parseGrant(raw);\n if (!parsed) return { ok: false, reason: 'malformed' };\n const { grant, kid, signed, signature } = parsed;\n\n if (grant.iss !== params.iss) return { ok: false, reason: 'foreign-issuer' };\n // cap is already constrained to the 'activate' literal by parseGrant's\n // isGrant guard: kept as defense in depth in case that guard ever widens.\n if (grant.cap !== 'activate') return { ok: false, reason: 'cap-mismatch' };\n\n // A grant minted noticeably in the future means the mint's clock cannot be\n // trusted, and both clocks below are computed from iat: a skewed or buggy\n // mint clock would otherwise nullify them both. Tolerance, not zero,\n // because real clocks drift.\n if (grant.iat * 1000 > params.now + CLOCK_SKEW_MS) {\n return { ok: false, reason: 'expired' };\n }\n // The verifier's own bound on how long a grant may claim to live, so a\n // mint clock error can't stretch a session past what this host allows\n // regardless of what iat/sxp themselves say.\n if (grant.sxp * 1000 - grant.iat * 1000 > MAX_SESSION_MS) {\n return { ok: false, reason: 'expired' };\n }\n\n // URL grants respect BOTH clocks: the 15-minute handover window and the\n // session expiry (a re-mint near session end must not outlive the session).\n const deadline =\n params.source === 'url'\n ? Math.min(grant.iat * 1000 + URL_WINDOW_MS, grant.sxp * 1000)\n : grant.sxp * 1000;\n if (params.now >= deadline) return { ok: false, reason: 'expired' };\n\n // Exact membership only: no prefix/suffix/substring matching, so a lookalike\n // origin (an evil.com path containing the real origin, or a subdomain of it)\n // can never satisfy this.\n if (params.origin !== undefined && !grant.aud.includes(params.origin)) {\n return { ok: false, reason: 'aud-mismatch' };\n }\n if (params.acceptForeign) {\n // Demo grants are single-origin by contract: enforced verifier-side too,\n // and independent of whether an origin was supplied, so a container-side\n // caller (no `origin`) can't skip this gate.\n const allow = params.demoAllowlist ?? [];\n if (grant.aud.length !== 1 || !grant.aud.every((a) => allow.includes(a))) {\n return { ok: false, reason: 'aud-mismatch' };\n }\n }\n\n // pb binds a grant to the tenant whose bundle is running. Demo hosts opt out\n // (that is the whole point of the demo shop) and rely on the aud allowlist above.\n if (!params.acceptForeign) {\n if (!params.pb || grant.pb !== params.pb) {\n return { ok: false, reason: 'pb-mismatch' };\n }\n }\n\n // sb binds a grant to one session's container: without it, \"valid signature\"\n // would prove nothing about which tenant minted the grant, since one key\n // signs for the whole environment. Symmetric in both directions: a\n // session-scoped grant presented where no session is expected must not\n // silently pass either, or a grant minted for one session could activate at\n // a host that never asked to be bound to it.\n const grantIsSessionScoped =\n grant.ses !== undefined || grant.sb !== undefined;\n if (params.expectSession) {\n if (grant.ses !== params.expectSession.ses) {\n return { ok: false, reason: 'sb-mismatch' };\n }\n if (!grant.sb || grant.sb !== params.expectSession.sb) {\n return { ok: false, reason: 'sb-mismatch' };\n }\n } else if (grantIsSessionScoped) {\n return { ok: false, reason: 'sb-mismatch' };\n }\n\n const key = params.keyring.find((k) => k.kid === kid);\n if (!key) return { ok: false, reason: 'kid-mismatch' };\n\n // globalThis.crypto is untyped without the DOM lib: structural access is\n // the batchedPoster precedent (`globalThis.fetch as PosterFetch`).\n const cryptoImpl =\n params.crypto ?? (globalThis as { crypto?: PreviewCrypto }).crypto;\n const subtle = cryptoImpl?.subtle;\n if (!subtle) return { ok: false, reason: 'no-subtle' };\n\n const spki = spkiToBytes(key.spki);\n if (!spki) return { ok: false, reason: 'kid-mismatch' };\n\n try {\n const publicKey = await subtle.importKey(\n 'spki',\n spki,\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['verify'],\n );\n const valid = await subtle.verify(\n { name: 'ECDSA', hash: 'SHA-256' },\n publicKey,\n signature,\n signed,\n );\n if (!valid) return { ok: false, reason: 'bad-signature' };\n } catch {\n return { ok: false, reason: 'bad-signature' };\n }\n\n return { ok: true, grant };\n}\n\nexport interface SwapActivatorConfig {\n keyring: PreviewKey[];\n iss: string;\n /** This bundle's project binding. Absent on demo hosts (see acceptForeign). */\n pb?: string;\n acceptForeign?: boolean;\n demoAllowlist?: string[];\n /** Bare CDN hostname, e.g. 'cdn.walkeros.io'. */\n previewOrigin: string;\n /** Injectable for tests. */\n now?: () => number;\n crypto?: PreviewCrypto;\n}\n\nconst STORAGE_KEY = 'elbPreview';\n/**\n * Storage slot for the session-forwarding companion grant. The web arm never\n * verifies it (it is session-bound by design; the session container is its\n * verifier) — the activator only ferries it from the activation URL into\n * storage, where the seamed preview artifact reads it to stamp the\n * `X-Walkeros-Preview` header. It lives and dies with the activation state:\n * set (or cleared) whenever a URL activation succeeds, cleared whenever the\n * stored activation clears.\n */\nexport const SESSION_STORAGE_KEY = 'elbPreviewSession';\nconst LOG = '[walkerOS:preview]';\nconst SWAP_TIMEOUT_MS = 5000;\n\n// Structural slices of the browser globals the activator touches. Core\n// compiles without the DOM lib, so window/document/URLSearchParams/console/\n// setTimeout are all untyped here; reading them off globalThis behind guards\n// is the batchedPoster precedent. Runtime behavior is identical.\ninterface ScriptEl {\n onload: (() => void) | null;\n onerror: (() => void) | null;\n src: string;\n setAttribute(name: string, value: string): void;\n parentNode: { removeChild(el: ScriptEl): void } | null;\n}\n\ninterface BrowserGlobals {\n window?: {\n location: { href: string; origin: string; search: string };\n history: { replaceState(data: unknown, title: string, url: string): void };\n localStorage: {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n };\n };\n document?: {\n head: { appendChild(el: ScriptEl): void };\n createElement(tag: 'script'): ScriptEl;\n };\n URLSearchParams?: new (init: string) => {\n getAll(name: string): string[];\n delete(name: string): void;\n toString(): string;\n };\n console?: { warn(msg: string): void; info(msg: string): void };\n setTimeout?: (fn: () => void, ms: number) => number;\n clearTimeout?: (id: number) => void;\n}\n\nconst G = globalThis as BrowserGlobals;\n\ninterface PreviewStore {\n get(): string | null;\n set(value: string): void;\n clear(): void;\n}\n\n/** localStorage under `key`, with an in-memory fallback for Safari private mode. */\nfunction createStore(key: string): PreviewStore {\n let memory: string | null = null;\n return {\n get() {\n try {\n return G.window?.localStorage.getItem(key) ?? memory;\n } catch {\n return memory;\n }\n },\n set(value) {\n try {\n G.window?.localStorage.setItem(key, value);\n } catch {\n memory = value;\n }\n },\n clear() {\n memory = null;\n try {\n G.window?.localStorage.removeItem(key);\n } catch {\n // in-memory copy already cleared\n }\n },\n };\n}\n\nfunction stripParam(): void {\n const win = G.window;\n const USP = G.URLSearchParams;\n if (!win || !USP) return;\n try {\n const href = win.location.href;\n const hashIdx = href.indexOf('#');\n const hash = hashIdx >= 0 ? href.slice(hashIdx) : '';\n const withoutHash = hashIdx >= 0 ? href.slice(0, hashIdx) : href;\n const qIdx = withoutHash.indexOf('?');\n const path = qIdx >= 0 ? withoutHash.slice(0, qIdx) : withoutHash;\n const params = new USP(qIdx >= 0 ? withoutHash.slice(qIdx + 1) : '');\n params.delete('elbPreview');\n params.delete('elbPreviewSession');\n const query = params.toString();\n win.history.replaceState(\n {},\n '',\n `${path}${query ? `?${query}` : ''}${hash}`,\n );\n } catch {\n // A page that forbids history writes still previews; the param just stays.\n }\n}\n\nfunction injectArtifact(src: string, sri: string): Promise<boolean> {\n return new Promise((resolve) => {\n const doc = G.document;\n if (!doc) {\n resolve(false);\n return;\n }\n const script = doc.createElement('script');\n let settled = false;\n let timer: number | undefined;\n const done = (ok: boolean) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) G.clearTimeout?.(timer);\n if (!ok && script.parentNode) script.parentNode.removeChild(script);\n resolve(ok);\n };\n timer = G.setTimeout?.(() => done(false), SWAP_TIMEOUT_MS);\n script.onload = () => done(true);\n script.onerror = () => done(false);\n script.setAttribute('integrity', sri);\n script.setAttribute('crossorigin', 'anonymous');\n script.src = src;\n doc.head.appendChild(script);\n });\n}\n\n/**\n * Decide whether a preview bundle should boot in place of this bundle's own flow.\n *\n * Returns true iff a preview took over, in which case the caller must not boot\n * the production flow. Every failure path deterministically returns false: the\n * loader never throws, never retries, and never leaves a page without a walker.\n *\n * Anti-griefing invariant: a rejected URL grant never touches stored state,\n * the activator falls back to the stored grant instead. Only a failing stored\n * grant clears storage (self-heal), plus `off` and `swap-failed`.\n */\nexport async function browserSwapActivator(\n cfg: SwapActivatorConfig,\n): Promise<boolean> {\n const win = G.window;\n if (!win || !G.document) return false;\n\n const store = createStore(STORAGE_KEY);\n const sessionStore = createStore(SESSION_STORAGE_KEY);\n const now = cfg.now ?? (() => Date.now());\n const warn = (reason: string) => G.console?.warn(`${LOG} ${reason}`);\n\n let param: string | null = null;\n let companion: string | null = null;\n const USP = G.URLSearchParams;\n if (USP) {\n try {\n const search = new USP(win.location.search.replace(/^\\?/, ''));\n const values = search.getAll('elbPreview');\n param = values.length > 0 ? (values[values.length - 1] ?? null) : null;\n const companions = search.getAll('elbPreviewSession');\n companion =\n companions.length > 0\n ? (companions[companions.length - 1] ?? null)\n : null;\n } catch {\n param = null;\n companion = null;\n }\n }\n\n if (param === 'off') {\n store.clear();\n sessionStore.clear();\n stripParam();\n return false;\n }\n\n const stored = store.get();\n\n // Zero-work fast path: the overwhelmingly common case on a production page.\n // No crypto, no storage writes, no DOM work.\n if (!param && !stored) return false;\n\n const verify = (raw: string, source: 'url' | 'storage') =>\n verifyActivation(raw, {\n keyring: cfg.keyring,\n iss: cfg.iss,\n origin: win.location.origin,\n pb: cfg.pb,\n acceptForeign: cfg.acceptForeign,\n demoAllowlist: cfg.demoAllowlist,\n source,\n now: now(),\n crypto: cfg.crypto,\n });\n\n let grant: ActivationGrant | null = null;\n\n // 1) URL grant first. Rejection for any reason (malformed, unsigned, bad\n // signature, expired, wrong aud) is warned and ignored, and must never\n // clear stored state: verification runs cheap checks before crypto, so\n // at rejection time we cannot know whether the value was even one of\n // ours, and a crafted link must not end someone's active session.\n if (param) {\n const result = await verify(param, 'url');\n if (result.ok) {\n grant = result.grant;\n store.set(param);\n // The URL activation defines the session context: carry its companion\n // forwarding grant into storage, or clear a stale one from an earlier\n // session. Never verified here — the session container is its verifier.\n if (companion) sessionStore.set(companion);\n else sessionStore.clear();\n } else {\n warn(result.reason);\n }\n stripParam();\n }\n\n // 2) Fall back to the stored grant. This one clears on failure: it came\n // from our own storage, so clearing is self-healing, not griefable.\n // (Except `no-subtle`: that is the environment's fault, not the grant's.)\n if (!grant && stored) {\n const result = await verify(stored, 'storage');\n if (result.ok) {\n grant = result.grant;\n } else {\n warn(result.reason);\n if (result.reason !== 'no-subtle') {\n store.clear();\n sessionStore.clear();\n }\n }\n }\n\n if (!grant) return false;\n\n const src = `https://${cfg.previewOrigin}/preview/${grant.art}.js`;\n const loaded = await injectArtifact(src, grant.sri);\n\n if (!loaded) {\n warn('swap-failed');\n store.clear();\n sessionStore.clear();\n return false;\n }\n\n G.console?.info(\n `${LOG} active ${grant.art} ends ${new Date(grant.sxp * 1000).toISOString()}`,\n );\n return true;\n}\n","import type { FlowState, FlowStatePhase } from './types/telemetry';\nimport type {\n AssembleJourneysOptions,\n Journey,\n JourneyAssembly,\n JourneyBranch,\n JourneyCorrelation,\n JourneyEntry,\n JourneyGap,\n JourneyHop,\n JourneyHopStatus,\n JourneyPlatform,\n JourneyStatus,\n JourneyTopology,\n JourneyTopologyNode,\n} from './types/journey';\n\n/** Default settle window: a journey may still change until its last record is this old. */\nconst DEFAULT_SETTLE_MS = 15000;\n\n/** Terminal precedence: error beats skip beats out beats in beats init beats flush. */\nconst PHASE_RANK: Record<FlowStatePhase, number> = {\n error: 5,\n skip: 4,\n out: 3,\n in: 2,\n init: 1,\n flush: 0,\n};\n\n/** Segment key for a platform-less hop; distinct from any real platform value. */\nconst NO_PLATFORM = '\\0none';\n\n/** Field separator for composite string keys; cannot occur in the values. */\nconst SEP = '\\0';\n\n/** Composite `(platform, stepId)` key; the file's one identity for hops and topology nodes. */\nfunction keyOf(platform: JourneyPlatform | undefined, stepId: string): string {\n return `${platform ?? NO_PLATFORM}${SEP}${stepId}`;\n}\n\n/** Parse an ISO timestamp to epoch ms, treating an unparseable value as 0. */\nfunction toEpoch(iso: string): number {\n const ms = Date.parse(iso);\n return Number.isNaN(ms) ? 0 : ms;\n}\n\n/**\n * Total order over records so every downstream reduction (terminal selection,\n * tie-breaks, entry choice) is independent of input order.\n */\nfunction compareRecords(a: FlowState, b: FlowState): number {\n const pa = a.platform ?? '';\n const pb = b.platform ?? '';\n if (pa !== pb) return pa < pb ? -1 : 1;\n if (a.stepId !== b.stepId) return a.stepId < b.stepId ? -1 : 1;\n if (a.phase !== b.phase) return PHASE_RANK[a.phase] - PHASE_RANK[b.phase];\n if (a.eventId !== b.eventId) return a.eventId < b.eventId ? -1 : 1;\n const ba = a.branchId ?? '';\n const bb = b.branchId ?? '';\n if (ba !== bb) return ba < bb ? -1 : 1;\n if (a.elapsedMs !== b.elapsedMs) return a.elapsedMs - b.elapsedMs;\n const sa = a.seq ?? -1;\n const sb = b.seq ?? -1;\n if (sa !== sb) return sa - sb;\n if (a.timestamp !== b.timestamp) return a.timestamp < b.timestamp ? -1 : 1;\n return 0;\n}\n\n/**\n * Drop replayed duplicates. Prefer the poster's `(platform, seq)` identity when\n * `seq` is present; otherwise fall back to the structural tuple. First\n * occurrence wins.\n */\nfunction dedupe(records: FlowState[]): FlowState[] {\n const seen = new Set<string>();\n const out: FlowState[] = [];\n for (const r of records) {\n const key =\n r.seq !== undefined\n ? `seq${SEP}${r.platform ?? ''}${SEP}${r.seq}`\n : `tuple${SEP}${r.platform ?? ''}${SEP}${r.stepId}${SEP}${r.phase}${SEP}${\n r.eventId\n }${SEP}${r.branchId ?? ''}${SEP}${r.elapsedMs}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(r);\n }\n return out;\n}\n\n/** Read a `name` string off an inbound event without loosening the type. */\nfunction readEventName(inEvent: unknown): string | undefined {\n if (\n typeof inEvent === 'object' &&\n inEvent !== null &&\n 'name' in inEvent &&\n typeof inEvent.name === 'string'\n ) {\n return inEvent.name;\n }\n return undefined;\n}\n\n/** Map a hop's terminal phase to its collapsed status. */\nfunction hopStatusFor(phase: FlowStatePhase): JourneyHopStatus {\n switch (phase) {\n case 'error':\n return 'error';\n case 'skip':\n return 'skipped';\n case 'out':\n return 'done';\n case 'in':\n case 'init':\n case 'flush':\n return 'pending';\n }\n}\n\n/** A hop has reached a settled outcome: delivered, errored, skipped, or batch-enqueued. */\nfunction isHopTerminal(hop: JourneyHop): boolean {\n return (\n hop.terminalPhase === 'out' ||\n hop.terminalPhase === 'error' ||\n hop.terminalPhase === 'skip' ||\n hop.batched === true\n );\n}\n\n/**\n * Whether a done hop propagates expectation to its downstream steps. Only `done`\n * hops expand (`skipped`/`error`/`pending` stop the frontier); a transformer\n * that produced no output (`out` null or absent) dropped the event, so nothing\n * flows on.\n */\nfunction hopExpands(hop: JourneyHop): boolean {\n if (hop.status !== 'done') return false;\n if (\n hop.stepType === 'transformer' &&\n (hop.out === null || hop.out === undefined)\n )\n return false;\n return true;\n}\n\n/** One topology node with its rank (index in `nodes`) and composite identity. */\ninterface TopoNode {\n node: JourneyTopologyNode;\n rank: number;\n key: string;\n}\n\n/**\n * Topology precomputed once per `assembleJourneys` call: composite\n * `(platform, stepId)` keying throughout, resolved downstream edges, and the\n * root set (nodes no resolved edge targets).\n */\ninterface TopologyIndex {\n /** Node by composite key; on duplicate keys the first (lowest-rank) node wins. */\n byKey: Map<string, TopoNode>;\n /** All nodes sharing a bare stepId, for unique-match fallbacks. */\n byStepId: Map<string, TopoNode[]>;\n /** Resolved downstream targets per source node key. */\n edges: Map<string, TopoNode[]>;\n /** Nodes that are not the resolved target of any edge, in rank order. */\n roots: TopoNode[];\n}\n\n/**\n * Resolve one downstream entry of `source`: the node with that stepId AND the\n * source's platform; if none, the unique node with that stepId regardless of\n * platform (the $flow crossing case); if still ambiguous, the edge is ignored.\n */\nfunction resolveEdgeTarget(\n source: TopoNode,\n stepId: string,\n byKey: Map<string, TopoNode>,\n byStepId: Map<string, TopoNode[]>,\n): TopoNode | undefined {\n const samePlatform = byKey.get(keyOf(source.node.platform, stepId));\n if (samePlatform !== undefined) return samePlatform;\n const candidates = byStepId.get(stepId);\n if (candidates !== undefined && candidates.length === 1) return candidates[0];\n return undefined;\n}\n\n/** Build the per-call topology index. */\nfunction indexTopology(topology: JourneyTopology): TopologyIndex {\n const byKey = new Map<string, TopoNode>();\n const byStepId = new Map<string, TopoNode[]>();\n topology.nodes.forEach((node, rank) => {\n const info: TopoNode = {\n node,\n rank,\n key: keyOf(node.platform, node.stepId),\n };\n if (!byKey.has(info.key)) byKey.set(info.key, info);\n const list = byStepId.get(node.stepId);\n if (list) list.push(info);\n else byStepId.set(node.stepId, [info]);\n });\n\n const edges = new Map<string, TopoNode[]>();\n const targeted = new Set<string>();\n for (const info of byKey.values()) {\n const resolved: TopoNode[] = [];\n for (const d of info.node.downstream) {\n const target = resolveEdgeTarget(info, d, byKey, byStepId);\n if (target !== undefined) {\n resolved.push(target);\n targeted.add(target.key);\n }\n }\n edges.set(info.key, resolved);\n }\n\n const roots: TopoNode[] = [];\n for (const info of byKey.values())\n if (!targeted.has(info.key)) roots.push(info);\n roots.sort((a, b) => a.rank - b.rank);\n\n return { byKey, byStepId, edges, roots };\n}\n\n/**\n * Node an observed hop belongs to: exact `(platform, stepId)` match first, then\n * the platform-less node with that stepId, then the unique stepId match.\n */\nfunction nodeForHop(\n topo: TopologyIndex,\n stepId: string,\n platform: JourneyPlatform | undefined,\n): TopoNode | undefined {\n const exact = topo.byKey.get(keyOf(platform, stepId));\n if (exact !== undefined) return exact;\n const platformless = topo.byKey.get(keyOf(undefined, stepId));\n if (platformless !== undefined) return platformless;\n const candidates = topo.byStepId.get(stepId);\n if (candidates !== undefined && candidates.length === 1) return candidates[0];\n return undefined;\n}\n\n/**\n * Topology frontier walk. Seeding is platform-scoped: only roots whose platform\n * the journey touched (platform-less roots always) — a root on an untouched\n * platform is a sibling entry point, not missing work, so disjoint per-platform\n * sub-graphs are safe. Downstream expansion stays edge-driven and crosses\n * platforms (a done crossing hop still expects the far side's chain). When\n * seeding yields no roots (e.g. a server-only journey whose platform's entry is\n * only ever edge-targeted by a crossing), an empty walk would be vacuously\n * complete, so the no-topology rule applies instead: complete iff every\n * observed hop is terminal. Otherwise every expected step must be observed and\n * terminal for `complete`, else `partial`.\n */\nfunction frontierStatus(\n hops: JourneyHop[],\n platforms: JourneyPlatform[],\n topo: TopologyIndex,\n): JourneyStatus {\n const findHop = (info: TopoNode): JourneyHop | undefined =>\n hops.find(\n (h) =>\n h.stepId === info.node.stepId &&\n (info.node.platform === undefined || h.platform === info.node.platform),\n );\n\n const seeded = topo.roots.filter(\n (r) => r.node.platform === undefined || platforms.includes(r.node.platform),\n );\n if (seeded.length === 0)\n return hops.every(isHopTerminal) ? 'complete' : 'partial';\n\n const expected = new Map<string, TopoNode>();\n const queue: TopoNode[] = seeded;\n while (queue.length > 0) {\n const info = queue.shift();\n if (info === undefined) break;\n if (expected.has(info.key)) continue;\n expected.set(info.key, info);\n const hop = findHop(info);\n if (hop !== undefined && hopExpands(hop)) {\n const targets = topo.edges.get(info.key);\n if (targets !== undefined)\n for (const t of targets) if (!expected.has(t.key)) queue.push(t);\n }\n }\n\n for (const info of expected.values()) {\n const hop = findHop(info);\n if (hop === undefined || !isHopTerminal(hop)) return 'partial';\n }\n return 'complete';\n}\n\n/**\n * Journey completeness. `pending` until the settle window elapses (more records\n * may still arrive; `lastTimestamp` is the max over all records, so a single\n * fresh hop keeps the whole journey pending). After settle: with a topology,\n * the frontier walk decides; without one, `complete` iff every observed hop is\n * terminal, else `partial`.\n */\nfunction resolveStatus(\n hops: JourneyHop[],\n platforms: JourneyPlatform[],\n lastTimestamp: number,\n topo: TopologyIndex | undefined,\n settleMs: number,\n now: number,\n): JourneyStatus {\n if (now - lastTimestamp < settleMs) return 'pending';\n if (topo !== undefined) return frontierStatus(hops, platforms, topo);\n return hops.every(isHopTerminal) ? 'complete' : 'partial';\n}\n\n/**\n * Per-platform loss windows from the monotonic `seq` counter. Records are walked\n * in wall-clock order within each platform (`seq` is stamped per poster): a jump\n * of more than one is a gap (records dropped); a backward jump is a counter\n * reset (a new poster generation, e.g. a page reload) and never a loss. Bounds\n * come from the records adjacent to the gap.\n */\nfunction detectGaps(records: FlowState[]): JourneyGap[] {\n const byPlatform = new Map<string, FlowState[]>();\n for (const r of records) {\n if (r.seq === undefined) continue;\n const key = r.platform ?? NO_PLATFORM;\n const list = byPlatform.get(key);\n if (list) list.push(r);\n else byPlatform.set(key, [r]);\n }\n\n const gaps: JourneyGap[] = [];\n for (const key of [...byPlatform.keys()].sort()) {\n const list = byPlatform.get(key);\n if (list === undefined) continue;\n const ordered = [...list].sort((a, b) => {\n const ta = toEpoch(a.timestamp);\n const tb = toEpoch(b.timestamp);\n if (ta !== tb) return ta - tb;\n return (a.seq ?? 0) - (b.seq ?? 0);\n });\n\n let prev: FlowState | undefined;\n let prevSeq = 0;\n for (const cur of ordered) {\n const seq = cur.seq;\n if (seq === undefined) continue;\n if (prev === undefined) {\n prev = cur;\n prevSeq = seq;\n continue;\n }\n if (seq === prevSeq) continue; // duplicate (deduped upstream); ignore\n if (seq === prevSeq + 1) {\n prev = cur;\n prevSeq = seq;\n continue;\n }\n if (seq > prevSeq + 1) {\n const platform = cur.platform;\n gaps.push({\n ...(platform !== undefined ? { platform } : {}),\n fromMs: toEpoch(prev.timestamp),\n toMs: toEpoch(cur.timestamp),\n afterSeq: prevSeq,\n beforeSeq: seq,\n });\n }\n // seq > prevSeq+1 (gap, recorded above) or seq < prevSeq (reset): the new\n // record starts the ongoing run either way.\n prev = cur;\n prevSeq = seq;\n }\n }\n return gaps;\n}\n\n/**\n * A journey is lossy when its wall-clock window overlaps a gap on a platform it\n * touches. A platform-less gap (records the observer never stamped) is treated\n * conservatively as touching any journey, so loss is surfaced rather than hidden.\n */\nfunction isLossy(\n platforms: JourneyPlatform[],\n firstTimestamp: number,\n lastTimestamp: number,\n gaps: JourneyGap[],\n): boolean {\n for (const gap of gaps) {\n const touches =\n gap.platform === undefined || platforms.includes(gap.platform);\n if (!touches) continue;\n if (firstTimestamp <= gap.toMs && gap.fromMs <= lastTimestamp) return true;\n }\n return false;\n}\n\n/** Collapse one branch's records (branch-scoped, non-flush) into a JourneyBranch. */\nfunction collapseBranch(branchId: string, records: FlowState[]): JourneyBranch {\n let terminal = records[0];\n let outRecord: FlowState | undefined;\n let outPayload: unknown;\n for (const r of records) {\n if (PHASE_RANK[r.phase] > PHASE_RANK[terminal.phase]) terminal = r;\n if (r.phase === 'out') outRecord = r;\n if (r.outEvent !== undefined) outPayload = r.outEvent;\n }\n\n const terminalPhase = terminal.phase;\n const durationMs = outRecord?.durationMs;\n const skipReason = terminalPhase === 'skip' ? terminal.skipReason : undefined;\n const error = terminalPhase === 'error' ? terminal.error : undefined;\n const calls = outRecord?.calls;\n\n return {\n branchId,\n status: hopStatusFor(terminalPhase),\n terminalPhase,\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(skipReason !== undefined ? { skipReason } : {}),\n ...(error !== undefined ? { error } : {}),\n ...(outPayload !== undefined ? { out: outPayload } : {}),\n ...(calls !== undefined ? { calls } : {}),\n };\n}\n\n/**\n * Collapse all records for one `(platform, stepId)` pair into a single hop.\n * `flush` frames are excluded from identity, terminal selection, and field\n * harvest (their empty eventId must not become the hop's), but still fold in as\n * batch confirmation and still count toward `startedAtMs` (port parity).\n * `branchId` records fan out into `branches` rather than colouring the parent.\n */\nfunction collapseHop(group: FlowState[]): JourneyHop {\n // startedAtMs/timestamp anchor over ALL records incl. flush (port parity).\n let anchor = group[0];\n for (const r of group) if (r.elapsedMs < anchor.elapsedMs) anchor = r;\n\n const parentRecords: FlowState[] = [];\n const branchGroups = new Map<string, FlowState[]>();\n let hasFlush = false;\n for (const r of group) {\n if (r.phase === 'flush') {\n hasFlush = true;\n continue;\n }\n if (r.branchId !== undefined) {\n const list = branchGroups.get(r.branchId);\n if (list) list.push(r);\n else branchGroups.set(r.branchId, [r]);\n continue;\n }\n parentRecords.push(r);\n }\n\n // Parent collapse source: own (non-branch) records; a branch-only hop falls\n // back to its branch records, a flush-only hop to the flush frames, so the\n // hop still resolves identity and a (non-terminal) outcome.\n const branchRecords = [...branchGroups.values()].flat();\n const source =\n parentRecords.length > 0\n ? parentRecords\n : branchRecords.length > 0\n ? branchRecords\n : group;\n\n let identity = source[0];\n let terminal = source[0];\n let outRecord: FlowState | undefined;\n let inPayload: unknown;\n let outPayload: unknown;\n let mappingKey: string | undefined;\n let contractRule: string | undefined;\n let consent: Record<string, boolean> | undefined;\n let consentApplied: Record<string, boolean> | undefined;\n let meta: Record<string, unknown> | undefined;\n let parentEventId: string | undefined;\n\n for (const r of source) {\n if (r.elapsedMs < identity.elapsedMs) identity = r;\n if (PHASE_RANK[r.phase] > PHASE_RANK[terminal.phase]) terminal = r;\n if (r.phase === 'out') outRecord = r;\n if (r.inEvent !== undefined && inPayload === undefined)\n inPayload = r.inEvent;\n if (r.outEvent !== undefined) outPayload = r.outEvent;\n if (r.mappingKey !== undefined) mappingKey = r.mappingKey;\n if (r.contractRule !== undefined) contractRule = r.contractRule;\n if (r.consent !== undefined) consent = r.consent;\n if (r.consentApplied !== undefined) consentApplied = r.consentApplied;\n if (r.meta !== undefined) meta = r.meta;\n if (r.parentEventId !== undefined && parentEventId === undefined)\n parentEventId = r.parentEventId;\n }\n\n const terminalPhase = terminal.phase;\n const durationMs = outRecord?.durationMs;\n const error = terminalPhase === 'error' ? terminal.error : undefined;\n const skipReason = terminalPhase === 'skip' ? terminal.skipReason : undefined;\n const calls = outRecord?.calls;\n // batched requires the TERMINAL record to be a batch-stamped out: an\n // error/skip terminal over a batched out is not a successful enqueue, a\n // flush terminal's batch field describes the flush (not this hop's enqueue),\n // and an in/init terminal (batched out record lost) proves nothing.\n const batched =\n terminal.phase === 'out' && terminal.batch !== undefined ? true : undefined;\n // A flush frame confirms the batch was flushed, but only on a batched hop; a\n // pre-wire flush-only frame leaves the hop non-terminal and unconfirmed.\n const flushConfirmed = hasFlush && batched === true ? true : undefined;\n\n const branches =\n branchGroups.size > 0\n ? [...branchGroups.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([branchId, recs]) => collapseBranch(branchId, recs))\n : undefined;\n\n return {\n stepId: identity.stepId,\n stepType: identity.stepType,\n eventId: identity.eventId,\n status: hopStatusFor(terminalPhase),\n terminalPhase,\n startedAtMs: anchor.elapsedMs,\n timestamp: anchor.timestamp,\n ...(identity.platform !== undefined ? { platform: identity.platform } : {}),\n ...(parentEventId !== undefined ? { parentEventId } : {}),\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(inPayload !== undefined ? { in: inPayload } : {}),\n ...(outPayload !== undefined ? { out: outPayload } : {}),\n ...(error !== undefined ? { error } : {}),\n ...(skipReason !== undefined ? { skipReason } : {}),\n ...(mappingKey !== undefined ? { mappingKey } : {}),\n ...(contractRule !== undefined ? { contractRule } : {}),\n ...(consent !== undefined ? { consent } : {}),\n ...(consentApplied !== undefined ? { consentApplied } : {}),\n ...(calls !== undefined ? { calls } : {}),\n ...(branches !== undefined ? { branches } : {}),\n ...(batched !== undefined ? { batched } : {}),\n ...(flushConfirmed !== undefined ? { flushConfirmed } : {}),\n ...(meta !== undefined ? { meta } : {}),\n };\n}\n\n/** A platform segment: the hops of one runtime, ordered within the segment. */\ninterface Segment {\n platform?: JourneyPlatform;\n hops: JourneyHop[];\n ownedEventIds: Set<string>;\n parentEventIds: Set<string>;\n minEpoch: number;\n}\n\n/** Order the hops within one platform segment; ranks precomputed, not per comparison. */\nfunction orderWithinSegment(\n hops: JourneyHop[],\n topo: TopologyIndex | undefined,\n): JourneyHop[] {\n const entries = hops.map((hop) => ({\n hop,\n rank:\n topo !== undefined\n ? (nodeForHop(topo, hop.stepId, hop.platform)?.rank ??\n Number.MAX_SAFE_INTEGER)\n : 0,\n }));\n entries.sort((a, b) => {\n if (a.rank !== b.rank) return a.rank - b.rank;\n if (a.hop.startedAtMs !== b.hop.startedAtMs)\n return a.hop.startedAtMs - b.hop.startedAtMs;\n return a.hop.stepId < b.hop.stepId\n ? -1\n : a.hop.stepId > b.hop.stepId\n ? 1\n : 0;\n });\n return entries.map((e) => e.hop);\n}\n\n/**\n * Order platform segments by the `parentEventId` chain (a segment referencing\n * another segment's event id comes after it), then wall-clock, then platform.\n */\nfunction orderSegments(segments: Segment[]): Segment[] {\n const parentOf = new Map<number, number>();\n const stableIndexOrder = segments\n .map((_, i) => i)\n .sort((i, j) => {\n const pi = segments[i].platform ?? NO_PLATFORM;\n const pj = segments[j].platform ?? NO_PLATFORM;\n return pi < pj ? -1 : pi > pj ? 1 : 0;\n });\n\n segments.forEach((seg, i) => {\n if (seg.parentEventIds.size === 0) return;\n for (const j of stableIndexOrder) {\n if (j === i) continue;\n let hit = false;\n for (const owned of segments[j].ownedEventIds) {\n if (seg.parentEventIds.has(owned)) {\n hit = true;\n break;\n }\n }\n if (hit) {\n parentOf.set(i, j);\n break;\n }\n }\n });\n\n const depth = (start: number): number => {\n let d = 0;\n let cur = start;\n const seen = new Set<number>();\n for (;;) {\n if (seen.has(cur)) break;\n seen.add(cur);\n const p = parentOf.get(cur);\n if (p === undefined) break;\n cur = p;\n d += 1;\n }\n return d;\n };\n\n return segments\n .map((seg, i) => ({ seg, i, depth: depth(i) }))\n .sort((a, b) => {\n if (a.depth !== b.depth) return a.depth - b.depth;\n if (a.seg.minEpoch !== b.seg.minEpoch)\n return a.seg.minEpoch - b.seg.minEpoch;\n const pa = a.seg.platform ?? NO_PLATFORM;\n const pb = b.seg.platform ?? NO_PLATFORM;\n return pa < pb ? -1 : pa > pb ? 1 : 0;\n })\n .map((x) => x.seg);\n}\n\n/** Pick the originating entry record: earliest collector-in by wall-clock, else earliest record. */\nfunction pickEntry(records: FlowState[]): JourneyEntry {\n const collectorIns = records.filter(\n (r) => r.stepType === 'collector' && r.phase === 'in',\n );\n const pool = collectorIns.length > 0 ? collectorIns : records;\n\n let entryRec = pool[0];\n let best = toEpoch(entryRec.timestamp);\n for (const r of pool) {\n const ms = toEpoch(r.timestamp);\n if (ms < best) {\n best = ms;\n entryRec = r;\n }\n }\n\n const name = readEventName(entryRec.inEvent);\n return {\n eventId: entryRec.eventId,\n timestamp: entryRec.timestamp,\n ...(name !== undefined ? { name } : {}),\n ...(entryRec.sourceId !== undefined ? { sourceId: entryRec.sourceId } : {}),\n ...(entryRec.platform !== undefined ? { platform: entryRec.platform } : {}),\n };\n}\n\n/** Shared, journey-independent inputs threaded into each journey's assembly. */\ninterface AssembleContext {\n topo?: TopologyIndex;\n settleMs: number;\n now: number;\n gaps: JourneyGap[];\n}\n\n/** Assemble one correlation group (already sorted) into a Journey. */\nfunction assembleJourney(\n id: string,\n correlation: JourneyCorrelation,\n traceId: string | undefined,\n records: FlowState[],\n ctx: AssembleContext,\n): Journey {\n const { topo } = ctx;\n // Collapse per (platform, stepId).\n const hopGroups = new Map<string, FlowState[]>();\n for (const r of records) {\n const key = keyOf(r.platform, r.stepId);\n const group = hopGroups.get(key);\n if (group) group.push(r);\n else hopGroups.set(key, [r]);\n }\n const hops = [...hopGroups.values()].map(collapseHop);\n\n // Group hops into platform segments.\n const segmentMap = new Map<string, Segment>();\n for (const hop of hops) {\n const key = hop.platform ?? NO_PLATFORM;\n let seg = segmentMap.get(key);\n if (!seg) {\n seg = {\n ...(hop.platform !== undefined ? { platform: hop.platform } : {}),\n hops: [],\n ownedEventIds: new Set<string>(),\n parentEventIds: new Set<string>(),\n minEpoch: Number.POSITIVE_INFINITY,\n };\n segmentMap.set(key, seg);\n }\n seg.hops.push(hop);\n seg.ownedEventIds.add(hop.eventId);\n if (hop.parentEventId !== undefined)\n seg.parentEventIds.add(hop.parentEventId);\n seg.minEpoch = Math.min(seg.minEpoch, toEpoch(hop.timestamp));\n }\n\n const orderedSegments = orderSegments([...segmentMap.values()]);\n const orderedHops: JourneyHop[] = [];\n const platforms: JourneyPlatform[] = [];\n for (const seg of orderedSegments) {\n if (seg.platform !== undefined && !platforms.includes(seg.platform))\n platforms.push(seg.platform);\n for (const hop of orderWithinSegment(seg.hops, topo)) orderedHops.push(hop);\n }\n\n let firstTimestamp = Number.POSITIVE_INFINITY;\n let lastTimestamp = Number.NEGATIVE_INFINITY;\n for (const r of records) {\n const ms = toEpoch(r.timestamp);\n if (ms < firstTimestamp) firstTimestamp = ms;\n if (ms > lastTimestamp) lastTimestamp = ms;\n }\n\n const status = resolveStatus(\n orderedHops,\n platforms,\n lastTimestamp,\n topo,\n ctx.settleMs,\n ctx.now,\n );\n const lossy = isLossy(platforms, firstTimestamp, lastTimestamp, ctx.gaps);\n\n return {\n id,\n correlation,\n ...(traceId !== undefined ? { traceId } : {}),\n entry: pickEntry(records),\n hops: orderedHops,\n platforms,\n status,\n lossy,\n firstTimestamp,\n lastTimestamp,\n totalMs: lastTimestamp - firstTimestamp,\n };\n}\n\n/**\n * Pure assembly of raw `FlowState` records into cross-runtime journeys. The\n * function is idempotent (duplicate records are deduped first) and\n * deterministic (output does not depend on input order; `options.now` supplies\n * the settle reference so tests never depend on the wall clock). It resolves\n * completeness (`pending`/`complete`/`partial`) against the settle window and,\n * when supplied, the topology frontier; loss is detected from per-platform\n * `seq` gaps and surfaced both session-level (`gaps`) and per journey (`lossy`).\n * Journeys are returned oldest-first by `firstTimestamp`; presenters re-sort as\n * needed. Each call recomputes everything from the raw records (there is no\n * incremental mode), so callers that re-resolve status on a settle tick re-run\n * the whole pipeline and should memoize on their inputs.\n */\nexport function assembleJourneys(\n records: FlowState[],\n options?: AssembleJourneysOptions,\n): JourneyAssembly {\n const ctx: AssembleContext = {\n ...(options?.topology !== undefined\n ? { topo: indexTopology(options.topology) }\n : {}),\n settleMs: options?.settleMs ?? DEFAULT_SETTLE_MS,\n now: options?.now ?? Date.now(),\n gaps: [],\n };\n\n const deduped = dedupe(records);\n const sorted = [...deduped].sort(compareRecords);\n\n // Gaps are detected over all records (flush frames carry `seq` too, so keep\n // them here to preserve the poster's monotonic run) before any grouping.\n ctx.gaps = detectGaps(deduped);\n\n // Drop unusable traceless flush frames (empty eventId AND no traceId) so they\n // never spawn a junk `event:` journey. A flush frame WITH a traceId still\n // folds into its trace-matched journey; a traceless one carries nothing.\n const groupable = sorted.filter((r) => !(r.eventId === '' && !r.traceId));\n\n // Group into correlation groups: by traceId, else by eventId (legacy).\n interface Group {\n id: string;\n correlation: JourneyCorrelation;\n traceId?: string;\n records: FlowState[];\n }\n const groups = new Map<string, Group>();\n for (const r of groupable) {\n const trace = r.traceId ? r.traceId : undefined;\n const key = trace ? `trace${SEP}${trace}` : `event${SEP}${r.eventId}`;\n let group = groups.get(key);\n if (!group) {\n group = trace\n ? { id: trace, correlation: 'trace', traceId: trace, records: [] }\n : { id: `event:${r.eventId}`, correlation: 'legacy', records: [] };\n groups.set(key, group);\n }\n group.records.push(r);\n }\n\n const journeys = [...groups.values()].map((g) =>\n assembleJourney(g.id, g.correlation, g.traceId, g.records, ctx),\n );\n\n journeys.sort((a, b) => {\n if (a.firstTimestamp !== b.firstTimestamp)\n return a.firstTimestamp - b.firstTimestamp;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n });\n\n return { journeys, gaps: ctx.gaps };\n}\n","/**\n * Shared server-runtime holder for the active `traceUntil` value.\n *\n * The server trace-poller writes via `setTraceUntil`; the per-emit telemetry\n * supplier reads via `getTraceUntil` and passes the result to\n * `resolveTelemetryOptions`. The browser bundle does NOT use this module: it\n * keeps its own `traceUntil` variable inside its IIFE. Only\n * `resolveTelemetryOptions` is shared across platforms.\n */\nlet value: string | null = null;\n\nexport function getTraceUntil(): string | null {\n return value;\n}\n\nexport function setTraceUntil(v: string | null): void {\n value = v;\n}\n","import type { Collector } from './types';\nimport type { FlowState } from './types/telemetry';\n\n/**\n * Synchronously fans out a FlowState record to every registered observer\n * on the collector. Each call is wrapped in try/catch so a misbehaving\n * observer cannot crash the runtime; observers are advisory and must not\n * affect pipeline outcomes.\n *\n * Iterates a snapshot of the observer set so an observer adding or removing\n * another observer during the emit does not re-enter or skip in the same\n * pass. The early return on an empty set keeps the zero-observer hot path\n * allocation-free.\n */\nexport function emitStep(\n collector: Collector.Instance,\n state: FlowState,\n): void {\n if (collector.observers.size === 0) return;\n const snapshot = Array.from(collector.observers);\n for (const observer of snapshot) {\n try {\n observer(state);\n } catch {\n // Observers must never crash the pipeline.\n }\n }\n}\n","/**\n * Batched FlowState poster.\n *\n * Buffers FlowState records and flushes them to an HTTP endpoint either when\n * `batchMs` elapses since the first queued record, or when `batchSize` is\n * reached. Returns the emit callback that `createTelemetryObserver` consumes.\n *\n * Errors from the underlying fetch are swallowed (or routed through the\n * optional `onError` callback) so a transient observer outage cannot crash\n * the runtime.\n *\n * Uses the global `fetch` so the same primitive works in Node 18+, browsers,\n * and Edge runtimes. Tests may inject a stub via `opts.fetch`.\n */\nimport type { FlowState } from './types/telemetry';\n\n/**\n * Minimum HTTP response surface the poster touches. Anything that exposes\n * `ok` and `status` works. Decoupling from the DOM `Response` type lets the\n * helper run in Edge, browser, and Node-only test environments without\n * requiring `lib: dom` or a polyfill.\n */\nexport interface PosterResponse {\n ok: boolean;\n status: number;\n}\n\n/**\n * Minimum fetch surface the poster needs. A subset of `typeof fetch` that\n * lets test harnesses pass a plain async function without dragging in the\n * Response/Request DOM types.\n */\nexport type PosterFetch = (\n url: string,\n init: { method: string; headers: Record<string, string>; body: string },\n) => Promise<PosterResponse>;\n\n/**\n * UTF-8 byte length of a string. `String.length` counts UTF-16 code units,\n * which under-measures multi-byte content (CJK, emoji) against byte-based\n * body caps. Counted arithmetically rather than via TextEncoder because\n * jsdom-style sandboxes lack a TextEncoder global; the arithmetic matches\n * `TextEncoder().encode(str).length` exactly (unpaired surrogates count as\n * the 3-byte U+FFFD replacement, per WHATWG encoding).\n */\nfunction utf8ByteLength(str: string): number {\n let bytes = 0;\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code < 0x80) {\n bytes += 1;\n } else if (code < 0x800) {\n bytes += 2;\n } else if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n // Valid surrogate pair: one astral code point, 4 UTF-8 bytes.\n bytes += 4;\n i++;\n } else {\n bytes += 3;\n }\n } else {\n bytes += 3;\n }\n }\n return bytes;\n}\n\nexport interface BatchedPosterOptions {\n /** Absolute HTTP endpoint URL. POST with JSON array body. */\n url: string;\n /** Bearer token sent in the `Authorization` header. */\n token: string;\n /** Max time to wait before flushing the current batch. Default 50 ms. */\n batchMs?: number;\n /** Max records per batch. When reached, flushes immediately. Default 50. */\n batchSize?: number;\n /**\n * Max serialized body size in UTF-8 bytes (the wire size body caps are\n * enforced in). A batch whose JSON exceeds this is split in half\n * recursively until each chunk fits. Default 60000.\n */\n maxBodyBytes?: number;\n /** Test seam. Defaults to the global `fetch`. */\n fetch?: PosterFetch;\n /** Called when the underlying POST rejects. Defaults to swallowing. */\n onError?: (err: unknown) => void;\n}\n\n/**\n * Build a batched emit callback. The returned function is synchronous, never\n * throws, and schedules an async flush in the background.\n *\n * Concurrency model: a single in-memory buffer plus a single pending timer.\n * When the timer fires (or `batchSize` is hit) the buffer is moved into a\n * local variable and reset, then POSTed. New records arriving during the in-\n * flight POST land in the next batch.\n */\nexport function createBatchedPoster(\n opts: BatchedPosterOptions,\n): (state: FlowState) => void {\n // Narrow before use: nullish coalescing alone lets NaN, Infinity, 0, and\n // negatives through, all of which break setTimeout or starve the flush.\n // A garbage value falls back to the documented default rather than\n // clamping to the smallest legal step.\n const rawBatchMs = opts.batchMs;\n const batchMs =\n typeof rawBatchMs === 'number' &&\n Number.isFinite(rawBatchMs) &&\n rawBatchMs > 0\n ? Math.floor(rawBatchMs)\n : 50;\n\n const rawBatchSize = opts.batchSize;\n const batchSize =\n typeof rawBatchSize === 'number' &&\n Number.isFinite(rawBatchSize) &&\n rawBatchSize >= 1\n ? Math.floor(rawBatchSize)\n : 50;\n\n const rawMaxBodyBytes = opts.maxBodyBytes;\n const maxBodyBytes =\n typeof rawMaxBodyBytes === 'number' &&\n Number.isFinite(rawMaxBodyBytes) &&\n rawMaxBodyBytes >= 1\n ? Math.floor(rawMaxBodyBytes)\n : 60000;\n // Lazy lookup of the global `fetch` so the helper imports cleanly even in\n // environments without one (it only fails when actually used). The cast\n // is to the narrowed PosterFetch surface, not to a broader type.\n const fetchImpl: PosterFetch =\n opts.fetch ?? ((url, init) => (globalThis.fetch as PosterFetch)(url, init));\n const onError =\n opts.onError ??\n (() => {\n // swallow\n });\n\n let buffer: FlowState[] = [];\n let timer: ReturnType<typeof setTimeout> | null = null;\n let seq = 0;\n\n /**\n * Serialize a batch into byte-bounded JSON bodies, preserving order. Each\n * posted body is serialized exactly once: a batch that fits (or a single-\n * record leaf) returns its own probe serialization; only oversized parents\n * discard theirs before recursing into halves. A single record that alone\n * exceeds the limit is emitted as its own body anyway: the server rejects\n * it (413) and the resulting seq gap makes the loss visible, which is\n * preferable to silently dropping it here.\n */\n function splitToBodies(batch: FlowState[]): string[] {\n const body = JSON.stringify(batch);\n if (batch.length <= 1) return [body];\n if (utf8ByteLength(body) <= maxBodyBytes) return [body];\n const mid = Math.floor(batch.length / 2);\n return [\n ...splitToBodies(batch.slice(0, mid)),\n ...splitToBodies(batch.slice(mid)),\n ];\n }\n\n /**\n * POST one pre-serialized chunk body. Always resolves: non-2xx and\n * rejections are routed to onError so the sequential flush loop can\n * proceed to the next chunk.\n */\n function postChunk(body: string): Promise<void> {\n return Promise.resolve()\n .then(() =>\n fetchImpl(opts.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.token}`,\n },\n body,\n }),\n )\n .then((res) => {\n // 4xx/5xx is not an exception per fetch contract. Surface non-2xx\n // through onError so callers can record telemetry-of-telemetry,\n // but never throw out of this helper.\n if (res && typeof res === 'object' && 'ok' in res && !res.ok) {\n onError(new Error(`Observer responded ${res.status}`));\n }\n })\n .catch((err) => {\n onError(err);\n });\n }\n\n function flush(): void {\n if (buffer.length === 0) return;\n const batch = buffer;\n buffer = [];\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n const bodies = splitToBodies(batch);\n // Fire-and-forget. We deliberately do not await; the emit caller is\n // synchronous and a slow observer must not block the pipeline. Chunks\n // are POSTed sequentially (await previous before next) to preserve\n // arrival order at the observer.\n void (async () => {\n for (const body of bodies) {\n await postChunk(body);\n }\n })();\n }\n\n return (state: FlowState): void => {\n // Stamp a monotonic seq for gap detection. Spread-copy rather than mutate:\n // the emit callback is public and a caller may hand over a shared object.\n // Failed POSTs are never re-sequenced, so a lost record leaves a seq gap.\n buffer.push({ ...state, seq: ++seq });\n if (buffer.length >= batchSize) {\n flush();\n return;\n }\n if (timer === null) {\n timer = setTimeout(flush, batchMs);\n }\n };\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Parses a user agent string to extract browser, OS, and device information.\n *\n * @param userAgent The user agent string to parse.\n * @returns An object containing the parsed user agent information.\n */\nexport function parseUserAgent(userAgent?: string): WalkerOS.User {\n if (!userAgent) return {};\n\n return {\n userAgent,\n browser: getBrowser(userAgent),\n browserVersion: getBrowserVersion(userAgent),\n os: getOS(userAgent),\n osVersion: getOSVersion(userAgent),\n deviceType: getDeviceType(userAgent),\n };\n}\n\n/**\n * Gets the browser name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser name or undefined.\n */\nexport function getBrowser(userAgent: string): string | undefined {\n const browsers = [\n { name: 'Edge', substr: 'Edg' },\n { name: 'Chrome', substr: 'Chrome' },\n { name: 'Safari', substr: 'Safari', exclude: 'Chrome' },\n { name: 'Firefox', substr: 'Firefox' },\n { name: 'IE', substr: 'MSIE' },\n { name: 'IE', substr: 'Trident' },\n ];\n\n for (const browser of browsers) {\n if (\n userAgent.includes(browser.substr) &&\n (!browser.exclude || !userAgent.includes(browser.exclude))\n ) {\n return browser.name;\n }\n }\n\n return;\n}\n\n/**\n * Gets the browser version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser version or undefined.\n */\nexport function getBrowserVersion(userAgent: string): string | undefined {\n const rules = [\n /Edg\\/([0-9]+)/, // Edge\n /Chrome\\/([0-9]+)/, // Chrome\n /Version\\/([0-9]+).*Safari/, // Safari\n /Firefox\\/([0-9]+)/, // Firefox\n /MSIE ([0-9]+)/, // IE 10 and older\n /rv:([0-9]+).*Trident/, // IE 11\n ];\n\n for (const regex of rules) {\n const match = userAgent.match(regex);\n if (match) {\n return match[1];\n }\n }\n\n return;\n}\n\n/**\n * Gets the OS name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS name or undefined.\n */\nexport function getOS(userAgent: string): string | undefined {\n const osList = [\n { name: 'Windows', substr: 'Windows NT' },\n { name: 'macOS', substr: 'Mac OS X' },\n { name: 'Android', substr: 'Android' },\n { name: 'iOS', substr: 'iPhone OS' },\n { name: 'Linux', substr: 'Linux' },\n ];\n\n for (const os of osList) {\n if (userAgent.includes(os.substr)) {\n return os.name;\n }\n }\n\n return;\n}\n\n/**\n * Gets the OS version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS version or undefined.\n */\nexport function getOSVersion(userAgent: string): string | undefined {\n const osVersionRegex = /(?:Windows NT|Mac OS X|Android|iPhone OS) ([0-9._]+)/;\n const match = userAgent.match(osVersionRegex);\n return match ? match[1].replace(/_/g, '.') : undefined;\n}\n\n/**\n * Gets the device type from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The device type or undefined.\n */\nexport function getDeviceType(userAgent: string): string | undefined {\n let deviceType = 'Desktop';\n\n if (/Tablet|iPad/i.test(userAgent)) {\n deviceType = 'Tablet';\n } else if (\n /Mobi|Android|iPhone|iPod|BlackBerry|Opera Mini|IEMobile|WPDesktop/i.test(\n userAgent,\n )\n ) {\n deviceType = 'Mobile';\n }\n\n return deviceType;\n}\n","/**\n * Inline Code Wrapping Utilities\n *\n * Converts inline code strings to executable functions for the three mapping\n * callbacks: condition, fn, validate. All three share a single signature:\n *\n * (value, context) => result\n *\n * Inside the inline body, the available bindings are:\n * - value: unknown - the value being mapped/validated/checked\n * - context: Mapping.Context with these fields:\n * event: WalkerOS.DeepPartialEvent\n * mapping: Mapping.Value | Mapping.Rule\n * collector: Collector.Instance\n * logger: Logger.Instance\n * consent?: WalkerOS.Consent\n *\n * If the body has no explicit `return`, it is auto-wrapped with `return`.\n *\n * @packageDocumentation\n */\n\nimport type { Mapping } from './types';\n\nfunction hasReturn(code: string): boolean {\n return /\\breturn\\b/.test(code);\n}\n\nfunction wrapCode(code: string): string {\n return hasReturn(code) ? code : `return ${code}`;\n}\n\n/**\n * Wrap inline code as a Mapping.Condition.\n *\n * @example\n * ```ts\n * const c = wrapCondition('context.consent?.marketing === true');\n * c(value, context); // boolean\n * ```\n */\nexport function wrapCondition(code: string): Mapping.Condition {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'context', body) as Mapping.Condition;\n}\n\n/**\n * Wrap inline code as a Mapping.Fn.\n *\n * @example\n * ```ts\n * const fn = wrapFn('value.user.email.split(\"@\")[1]');\n * fn(value, context); // domain\n * ```\n */\nexport function wrapFn(code: string): Mapping.Fn {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'context', body) as Mapping.Fn;\n}\n\n/**\n * Wrap inline code as a Mapping.Validate.\n *\n * @example\n * ```ts\n * const v = wrapValidate('typeof value === \"string\" && value.length > 0');\n * v(value, context); // boolean\n * ```\n */\nexport function wrapValidate(code: string): Mapping.Validate {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'context', body) as Mapping.Validate;\n}\n","const JSDELIVR_BASE = 'https://cdn.jsdelivr.net/npm';\nconst DEFAULT_SCHEMA_PATH = 'dist/walkerOS.json';\n\nfunction parsePlatform(value: unknown): string | string[] | undefined {\n if (typeof value === 'string') return value;\n if (Array.isArray(value) && value.every((v) => typeof v === 'string'))\n return value as string[];\n return undefined;\n}\n\nexport interface ExampleSummary {\n name: string;\n description?: string;\n}\n\nexport interface WalkerOSPackageMeta {\n packageName: string;\n version: string;\n description?: string;\n type?: string;\n platform?: string | string[];\n}\n\nexport interface WalkerOSPackageInfo {\n packageName: string;\n version: string;\n type?: string;\n platform?: string | string[];\n schemas: Record<string, unknown>;\n examples: Record<string, unknown>;\n hints?: Record<string, unknown>;\n}\n\nexport interface WalkerOSPackage extends WalkerOSPackageInfo {\n description?: string;\n docs?: string;\n source?: string;\n hintKeys: string[];\n exampleSummaries: ExampleSummary[];\n}\n\n/**\n * Local mirror of the app's `PackageDetailResult` shape for `expand=all`\n * responses. Decoupled from the app intentionally — `core` does not import\n * from `app`. Only the fields read by `shapeFromDetail` are typed.\n */\ninterface UnifiedPackageResponse {\n package: string;\n version: string;\n description?: string;\n type?: string;\n platform?: string[];\n docs?: string;\n source?: string;\n schemas?: Record<string, unknown>;\n hints?: Record<string, unknown>;\n hintKeys?: string[];\n exampleSummaries?: ExampleSummary[];\n examples?: Record<string, unknown>;\n}\n\nexport async function fetchPackage(\n packageName: string,\n options?: {\n version?: string;\n timeout?: number;\n baseUrl?: string;\n client?: string;\n },\n): Promise<WalkerOSPackage> {\n const ver = options?.version || 'latest';\n const timeoutMs = options?.timeout || 10000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const signal = controller.signal;\n const headers = options?.client\n ? { 'X-Walkeros-Client': options.client }\n : undefined;\n\n try {\n if (options?.baseUrl) {\n // Single round-trip via the unified detail endpoint\n // (`expand=all` returns hints + examples in one shot).\n const url = `${options.baseUrl}/api/packages/${encodeURIComponent(packageName)}?version=${encodeURIComponent(ver)}&expand=all`;\n const res = await fetch(url, { signal, ...(headers && { headers }) });\n if (!res.ok)\n throw new Error(`Failed to fetch ${url} (HTTP ${res.status})`);\n const detail = (await res.json()) as UnifiedPackageResponse;\n return shapeFromDetail(packageName, ver, detail);\n }\n\n // Direct jsdelivr fallback (offline-safe path) — keep two-fetch.\n const base = `${JSDELIVR_BASE}/${packageName}@${ver}`;\n const pkg = await fetchJson(`${base}/package.json`, signal, headers);\n const walkerOSJson = await fetchJson(\n `${base}/${DEFAULT_SCHEMA_PATH}`,\n signal,\n headers,\n );\n return parsePackage(packageName, ver, pkg, walkerOSJson);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction shapeFromDetail(\n packageName: string,\n ver: string,\n detail: UnifiedPackageResponse,\n): WalkerOSPackage {\n const schemas = (detail.schemas as Record<string, unknown> | undefined) || {};\n const examples =\n (detail.examples as Record<string, unknown> | undefined) || {};\n const hints = detail.hints;\n const hintKeys = detail.hintKeys ?? (hints ? Object.keys(hints) : []);\n const exampleSummaries = detail.exampleSummaries ?? [];\n const platform = detail.platform;\n\n return {\n packageName: detail.package || packageName,\n version: typeof detail.version === 'string' ? detail.version : ver,\n ...(detail.description !== undefined && {\n description: detail.description,\n }),\n ...(detail.type !== undefined && { type: detail.type }),\n ...(platform !== undefined && { platform }),\n schemas,\n examples,\n ...(detail.docs !== undefined && { docs: detail.docs }),\n ...(detail.source !== undefined && { source: detail.source }),\n ...(hints && Object.keys(hints).length > 0 ? { hints } : {}),\n hintKeys,\n exampleSummaries,\n };\n}\n\nasync function fetchJson(\n url: string,\n signal: AbortSignal,\n headers?: Record<string, string>,\n): Promise<Record<string, unknown>> {\n const res = await fetch(url, { signal, ...(headers && { headers }) });\n if (!res.ok) throw new Error(`Failed to fetch ${url} (HTTP ${res.status})`);\n return (await res.json()) as Record<string, unknown>;\n}\n\nfunction parsePackage(\n packageName: string,\n ver: string,\n pkg: Record<string, unknown>,\n walkerOSJson: Record<string, unknown>,\n): WalkerOSPackage {\n const meta = (walkerOSJson.$meta as Record<string, unknown>) || {};\n const schemas = (walkerOSJson.schemas as Record<string, unknown>) || {};\n const examples = (walkerOSJson.examples as Record<string, unknown>) || {};\n const hints = walkerOSJson.hints as Record<string, unknown> | undefined;\n const hintKeys = hints ? Object.keys(hints) : [];\n\n const exampleSummaries: ExampleSummary[] = [];\n const stepExamples = (examples.step || {}) as Record<string, unknown>;\n for (const [name, example] of Object.entries(stepExamples)) {\n const ex = example as Record<string, unknown> | undefined;\n const summary: ExampleSummary = { name };\n if (typeof ex?.description === 'string')\n summary.description = ex.description;\n exampleSummaries.push(summary);\n }\n\n const docs = typeof meta.docs === 'string' ? meta.docs : undefined;\n const source = typeof meta.source === 'string' ? meta.source : undefined;\n\n return {\n packageName,\n version: typeof pkg.version === 'string' ? pkg.version : ver,\n description:\n typeof pkg.description === 'string' ? pkg.description : undefined,\n type: typeof meta.type === 'string' ? meta.type : undefined,\n platform: parsePlatform(meta.platform),\n schemas,\n examples,\n ...(docs ? { docs } : {}),\n ...(source ? { source } : {}),\n ...(hints && Object.keys(hints).length > 0 ? { hints } : {}),\n hintKeys,\n exampleSummaries,\n };\n}\n\n/**\n * @deprecated Use fetchPackage instead.\n * Still used by: entry.ts (validator), package-schemas.ts (MCP resource).\n */\nexport async function fetchPackageSchema(\n packageName: string,\n options?: {\n version?: string;\n timeout?: number;\n baseUrl?: string;\n client?: string;\n },\n): Promise<WalkerOSPackageInfo> {\n const pkg = await fetchPackage(packageName, options);\n return {\n packageName: pkg.packageName,\n version: pkg.version,\n type: pkg.type,\n platform: pkg.platform,\n schemas: pkg.schemas,\n examples: pkg.examples,\n ...(pkg.hints ? { hints: pkg.hints } : {}),\n };\n}\n","import type { Destination } from './types';\n\n/**\n * Env key under which the collector injects the observe-mode call recorder\n * (`Destination.EnvObserve`) into a per-push env. The resolution-point wrapper\n * strips this key before handing the env to the destination.\n */\nexport const OBSERVE_ENV_KEY = 'observe' as const;\n\n/**\n * Structural guard for `Destination.EnvObserve`: an object whose `paths` is a\n * string array and whose `record` is a function. Extra keys are tolerated.\n */\nexport function isEnvObserve(value: unknown): value is Destination.EnvObserve {\n if (typeof value !== 'object' || value === null) return false;\n if (!('paths' in value) || !('record' in value)) return false;\n const { paths, record } = value;\n return (\n Array.isArray(paths) &&\n paths.every((path) => typeof path === 'string') &&\n typeof record === 'function'\n );\n}\n\n/**\n * Prefix marking a dot-path as a recordable call. Only this literal prefix is\n * stripped; a `<word>:` that is not `call:` stays part of the path (`wrapEnv`\n * parity).\n */\nconst CALL_PREFIX = 'call:';\n\n/**\n * Parse a `simulation`/`calls` dot-path into segments, sharing one grammar with\n * `wrapEnv` so the two capture layers cannot drift. Strips a single leading\n * `call:` prefix (only the literal `call:`, never any other `<word>:`), then\n * splits on `.`. An empty path or any empty segment (leading, trailing, or\n * consecutive dots) is unresolvable and yields `[]`.\n */\nexport function parseCallPath(raw: string): string[] {\n const path = raw.startsWith(CALL_PREFIX)\n ? raw.slice(CALL_PREFIX.length)\n : raw;\n const segments = path.split('.');\n if (segments.some((segment) => segment === '')) return [];\n return segments;\n}\n","export function mcpResult(\n result: unknown,\n hints?: { next?: string[]; warnings?: string[] },\n) {\n const enriched = hints\n ? { ...(result as Record<string, unknown>), _hints: hints }\n : result;\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(enriched, null, 2),\n },\n ],\n structuredContent: enriched as Record<string, unknown>,\n };\n}\n\nexport function mcpError(error: unknown, hint?: string) {\n let message: string;\n let path: string | undefined;\n let code: string | undefined;\n let details: unknown[] | undefined;\n\n if (error instanceof Error) {\n message = error.message;\n // Detect ApiError (has code and/or details properties)\n const err = error as Error & { code?: string; details?: unknown[] };\n if (err.code) code = err.code;\n if (Array.isArray(err.details)) details = err.details;\n } else if (typeof error === 'string') {\n message = error;\n } else if (\n error &&\n typeof error === 'object' &&\n 'issues' in error &&\n Array.isArray((error as { issues: unknown[] }).issues)\n ) {\n const issues = (\n error as { issues: Array<{ path?: unknown[]; message: string }> }\n ).issues;\n message = issues.map((i) => i.message).join('; ');\n path = issues[0]?.path?.join('.') || undefined;\n } else if (error && typeof error === 'object' && 'message' in error) {\n message = String((error as { message: unknown }).message);\n } else {\n message = 'Unknown error';\n }\n\n const structured: Record<string, unknown> = { error: message };\n if (hint) structured.hint = hint;\n if (path) structured.path = path;\n if (code) structured.code = code;\n if (details) structured.details = details;\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(structured),\n },\n ],\n structuredContent: structured,\n isError: true as const,\n };\n}\n","/**\n * Options for responding to an HTTP request.\n * Same interface for web and server — sources implement the handler.\n */\nexport interface RespondOptions {\n /** Response body. Objects are JSON-serialized by source. */\n body?: unknown;\n /** HTTP status code (default: 200). Server-only, ignored by web sources. */\n status?: number;\n /** HTTP response headers. Server-only, ignored by web sources. */\n headers?: Record<string, string>;\n}\n\n/**\n * Standardized response function available on env for every step.\n * Idempotent: first call wins, subsequent calls are no-ops.\n * Created by sources via createRespond(), consumed by any step.\n */\nexport type RespondFn = (options?: RespondOptions) => void;\n\n/**\n * Creates an idempotent respond function.\n * The sender callback is source-specific (Express wraps res, Fetch wraps Response, etc.).\n *\n * @param sender - Platform-specific function that actually sends the response\n * @returns Idempotent respond function (first call wins)\n */\nexport function createRespond(\n sender: (options: RespondOptions) => void,\n): RespondFn {\n let called = false;\n return (options: RespondOptions = {}) => {\n if (called) return;\n called = true;\n sender(options);\n };\n}\n","import type {\n MatchExpression,\n MatchCondition,\n MatchOperator,\n CompiledMatcher,\n} from './types/matcher';\nimport { getByPath } from './byPath';\n\n/**\n * Compiles a match expression into a closure for fast runtime evaluation.\n * Regex patterns are compiled once. Numeric comparisons are parsed once.\n * Runtime evaluation is pure function calls with short-circuit logic.\n */\nexport function compileMatcher(\n expr: MatchExpression | '*' | undefined,\n): CompiledMatcher {\n if (expr === undefined || expr === '*') return () => true;\n\n if ('and' in expr) {\n const fns = expr.and.map(compileMatcher);\n return (ingest) => fns.every((fn) => fn(ingest));\n }\n\n if ('or' in expr) {\n const fns = expr.or.map(compileMatcher);\n return (ingest) => fns.some((fn) => fn(ingest));\n }\n\n // Leaf condition\n return compileCondition(expr);\n}\n\nfunction compileCondition(condition: MatchCondition): CompiledMatcher {\n const { key, operator, value, not } = condition;\n const test = compileOperator(operator, value);\n\n return (context) => {\n const raw = getByPath(context, key);\n const result = test(raw);\n return not ? !result : result;\n };\n}\n\nfunction compileOperator(\n operator: MatchOperator,\n value: string,\n): (input: unknown) => boolean {\n switch (operator) {\n case 'eq':\n return (input) => String(input ?? '') === value;\n case 'contains':\n return (input) => String(input ?? '').includes(value);\n case 'prefix':\n return (input) => String(input ?? '').startsWith(value);\n case 'suffix':\n return (input) => String(input ?? '').endsWith(value);\n case 'regex': {\n const re = new RegExp(value);\n return (input) => re.test(String(input ?? ''));\n }\n case 'gt': {\n const num = Number(value);\n return (input) => Number(input) > num;\n }\n case 'lt': {\n const num = Number(value);\n return (input) => Number(input) < num;\n }\n case 'exists':\n return (input) => input !== undefined && input !== null;\n }\n}\n","import type { Route, RouteConfig } from './types/transformer';\nimport type { CompiledMatcher } from './types/matcher';\nimport { compileMatcher } from './matcher';\n\n/**\n * Internal: compiled route data. Not exported from the package's public\n * surface (`@walkeros/core`), but exported here so adjacent test files\n * inside the core package can probe compilation.\n */\nexport interface CompiledRoute {\n match: CompiledMatcher;\n next: CompiledNext;\n}\n\nexport type CompiledNext =\n | { type: 'static'; value: string }\n | { type: 'chain'; value: string[] }\n | { type: 'one'; routes: CompiledRoute[] }\n | { type: 'many'; routes: CompiledRoute[] }\n | { type: 'gate'; match: CompiledMatcher; next?: CompiledNext }\n | { type: 'sequence'; value: CompiledNext[] };\n\nexport function isRouteConfigEntry(entry: unknown): boolean {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n !Array.isArray(entry) &&\n ('match' in entry || 'next' in entry || 'one' in entry || 'many' in entry)\n );\n}\n\n/**\n * Pure RouteConfig array — every element is a RouteConfig object.\n * Used to detect the legacy first-match shape (treated as implicit `one`).\n */\nexport function isRouteArray(next: Route): next is RouteConfig[] {\n return (\n Array.isArray(next) &&\n next.length > 0 &&\n next.every((entry) => isRouteConfigEntry(entry))\n );\n}\n\nfunction compileRoutes(entries: Route[]): CompiledRoute[] {\n return entries.map((entry) => {\n if (typeof entry === 'string') {\n return { match: () => true, next: { type: 'static', value: entry } };\n }\n if (Array.isArray(entry)) {\n return {\n match: () => true,\n next: compileNext(entry) ?? { type: 'chain', value: [] },\n };\n }\n const e = entry as RouteConfig;\n return {\n match: e.match ? compileMatcher(e.match) : () => true,\n next: compileNext(e) ?? { type: 'chain', value: [] },\n };\n });\n}\n\nexport function compileNext(next: Route | undefined): CompiledNext | undefined {\n if (next === undefined || next === null) return undefined;\n if (typeof next === 'string') return { type: 'static', value: next };\n\n if (Array.isArray(next)) {\n if (next.length === 0) return undefined;\n if (isRouteArray(next)) {\n // Pure RouteConfig[] — legacy first-match shape, treat as implicit { one: [...] }\n return compileNext({ one: next as RouteConfig[] });\n }\n if (next.every((entry) => typeof entry === 'string')) {\n // Pure string[] — static chain\n return { type: 'chain', value: next as string[] };\n }\n // Mixed array (strings + RouteConfig objects, possibly nested arrays) —\n // sequence form: each segment resolves independently, results concatenated.\n const segments: CompiledNext[] = [];\n for (const entry of next) {\n const compiled = compileNext(entry);\n if (compiled !== undefined) segments.push(compiled);\n }\n if (segments.length === 0) return undefined;\n return { type: 'sequence', value: segments };\n }\n\n // RouteConfig\n const cfg = next as RouteConfig;\n if ('next' in cfg && cfg.next !== undefined) {\n // next operator (optionally gated)\n if (cfg.match) {\n return {\n type: 'gate',\n match: compileMatcher(cfg.match),\n next: compileNext(cfg.next),\n };\n }\n return compileNext(cfg.next);\n }\n if ('one' in cfg && cfg.one) {\n const routes = compileRoutes(cfg.one);\n if (cfg.match) {\n // outer gate around the one\n return {\n type: 'gate',\n match: compileMatcher(cfg.match),\n next: { type: 'one', routes },\n };\n }\n return { type: 'one', routes };\n }\n if ('many' in cfg && cfg.many) {\n const routes = compileRoutes(cfg.many);\n if (cfg.match) {\n // outer gate around the many\n return {\n type: 'gate',\n match: compileMatcher(cfg.match),\n next: { type: 'many', routes },\n };\n }\n return { type: 'many', routes };\n }\n // Bare gate { match } — no next/one/many\n if (cfg.match) {\n return { type: 'gate', match: compileMatcher(cfg.match) };\n }\n\n return undefined;\n}\n\nconst compileCache = new WeakMap<object, CompiledNext>();\n\n/**\n * Resolve a Route spec against a matcher context. Returns the immediate\n * next transformer IDs.\n *\n * Return shape:\n * [] → terminate (gate failed, empty many, all matchers failed,\n * undefined spec).\n * [\"x\"] → continue main chain at x.\n * [\"a\",\"b\",…] → fan-out, only produced by `many`. Main chain terminates\n * at this dispatch point; each branch is an independent\n * flow running to its own exit.\n *\n * Reachability vs prediction: `match` rules read arbitrary event fields.\n * `getNextSteps` is deterministic for the SUPPLIED context only. Static\n * analyzers without a real event must over-approximate by treating each\n * match as \"may pass or fail\" — see `flattenRouteTargets` in the CLI\n * validator. This function does NOT predict the path a future event will\n * take; it computes the path for the event you give it.\n */\nexport function getNextSteps(\n spec: Route | undefined,\n context: Record<string, unknown> = {},\n): string[] {\n if (spec === undefined || spec === null) return [];\n let compiled: CompiledNext | undefined;\n if (typeof spec === 'object') {\n const cached = compileCache.get(spec);\n if (cached) {\n compiled = cached;\n } else {\n compiled = compileNext(spec);\n if (compiled) compileCache.set(spec, compiled);\n }\n } else {\n compiled = compileNext(spec);\n }\n if (!compiled) return [];\n const resolved = resolveNext(compiled, context);\n if (resolved === undefined) return [];\n return Array.isArray(resolved) ? resolved : [resolved];\n}\n\nexport function resolveNext(\n compiled: CompiledNext | undefined,\n context: Record<string, unknown> = {},\n): string | string[] | undefined {\n if (!compiled) return undefined;\n if (compiled.type === 'static') return compiled.value;\n if (compiled.type === 'chain') return compiled.value;\n if (compiled.type === 'gate') {\n if (!compiled.match(context)) return undefined; // gate failed → fall through\n return resolveNext(compiled.next, context);\n }\n if (compiled.type === 'sequence') {\n const ids: string[] = [];\n for (const segment of compiled.value) {\n const resolved = resolveNext(segment, context);\n if (resolved === undefined) continue;\n if (Array.isArray(resolved)) ids.push(...resolved);\n else ids.push(resolved);\n }\n return ids.length > 0 ? ids : undefined;\n }\n if (compiled.type === 'many') {\n const ids: string[] = [];\n for (const route of compiled.routes) {\n if (!route.match(context)) continue;\n const inner = resolveNext(route.next, context);\n if (inner === undefined) continue;\n if (Array.isArray(inner)) ids.push(...inner);\n else ids.push(inner);\n }\n return ids.length > 0 ? ids : undefined;\n }\n // one: first-match dispatch\n for (const route of compiled.routes) {\n if (route.match(context)) {\n return resolveNext(route.next, context);\n }\n }\n return undefined;\n}\n","import type { StoreValue } from './types/store';\n\n/**\n * Shared cache envelope used by BOTH cache mechanisms (the event cache in\n * `./cache.ts` and the store-cache wrapper in\n * `@walkeros/collector/store-cache-wrapper`). A cached value is wrapped in a\n * plain `{value, exp}` structured object, not a Buffer: the backing store\n * serializes it through the shared store codec (`./store/codec`), so any\n * structured store can persist it byte-exact, and a TTL-native tier\n * (in-memory `__cache`, Redis) can additionally evict via the `ttl` arg.\n *\n * The envelope owns expiry interpretation, not the store contract:\n * `StoreValue` carries no TTL field. The physical envelope keys are\n * namespaced (`__walkeros_cache_v__` / `__walkeros_cache_exp__`) so a user\n * value that happens to be shaped `{ value, exp }` is never mistaken for an\n * envelope, and conversely a wrapped envelope is unambiguous on read.\n */\n\nconst ENVELOPE_VALUE = '__walkeros_cache_v__';\nconst ENVELOPE_EXP = '__walkeros_cache_exp__';\n\n/** A wrapped cache envelope as it is persisted into the backing store. */\nexport type CacheEnvelope = {\n [ENVELOPE_VALUE]: StoreValue;\n [ENVELOPE_EXP]?: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, StoreValue> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Wrap a value in a `{value, exp}` envelope. When `ttlMs` is given, `exp` is\n * `now() + ttlMs`; when omitted, `exp` is left off entirely (no expiry).\n *\n * `now` is injectable so tests do not depend on ambient wall-clock time;\n * production callers omit it and the helper falls back to `Date.now`.\n */\nexport function wrapCacheEnvelope(\n value: StoreValue,\n ttlMs?: number,\n now: () => number = Date.now,\n): CacheEnvelope {\n const envelope: CacheEnvelope = { [ENVELOPE_VALUE]: value };\n if (ttlMs !== undefined) envelope[ENVELOPE_EXP] = now() + ttlMs;\n return envelope;\n}\n\n/**\n * Read a stored envelope. Returns:\n * - `undefined` when the key is absent (`stored === undefined`).\n * - `{ expired: true }` when the envelope's `exp` has elapsed (caller should\n * best-effort purge and treat as a MISS).\n * - `{ value }` otherwise.\n *\n * A stored value that is not a recognizable envelope (a raw live value, e.g.\n * a TTL-native tier that holds the value by reference, or a legacy entry) is\n * returned verbatim as `{ value: stored }`, so a non-enveloped HIT degrades\n * gracefully rather than being dropped.\n */\nexport function readCacheEnvelope(\n stored: StoreValue | undefined,\n now: () => number = Date.now,\n): { value: StoreValue } | { expired: true } | undefined {\n if (stored === undefined) return undefined;\n if (!isRecord(stored) || !(ENVELOPE_VALUE in stored))\n return { value: stored };\n\n const exp = stored[ENVELOPE_EXP];\n if (typeof exp === 'number' && now() > exp) return { expired: true };\n return { value: stored[ENVELOPE_VALUE] };\n}\n","import type { StoreValue } from '../types/store';\n\n/**\n * Shared structured codec for store values.\n *\n * Stateless, format-only: serializes a `StoreValue` to a UTF-8 JSON byte\n * payload and restores it, with no store-type branches. Binary leaves are\n * tagged base64 behind a reserved marker; user objects that happen to carry\n * the marker are escaped, so NO payload can be corrupted. On the store path\n * binary always decodes back to a platform-neutral `Uint8Array`, never a Node\n * `Buffer`.\n */\n\nconst CACHE_MARKER = '__walkeros_cache__';\n\n/**\n * Thrown when a value cannot be serialized (e.g. a cyclic structure that\n * `JSON.stringify` rejects). Catchable and distinguishable from a raw\n * `TypeError` leaking out of the platform JSON implementation.\n */\nexport class StoreCodecError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'StoreCodecError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// Precondition: the input is acyclic JSON-shaped data; binary leaves are the\n// only non-JSON values handled. A Node `Buffer`, any `Uint8Array` (e.g. a\n// Fetch-sourced body), and a raw `ArrayBuffer` all normalize to the same\n// base64 'buffer' tag and decode back through the caller-supplied binary\n// factory (see fromSerializableWith). A `Buffer` IS a `Uint8Array`, but under\n// split realms (jsdom test env) a Node `Buffer` fails the `instanceof\n// Uint8Array` check against the realm's `Uint8Array`, so the realm-independent\n// `Buffer.isBuffer` check stays FIRST. The `Uint8Array` branch then handles\n// typed-array views by slicing on byteOffset/byteLength so a subarray view\n// contributes only its own bytes.\nfunction toSerializable(value: unknown): unknown {\n if (Buffer.isBuffer(value))\n return { [CACHE_MARKER]: 'buffer', d: value.toString('base64') };\n if (value instanceof Uint8Array)\n return {\n [CACHE_MARKER]: 'buffer',\n d: Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\n 'base64',\n ),\n };\n if (value instanceof ArrayBuffer)\n return {\n [CACHE_MARKER]: 'buffer',\n d: Buffer.from(value).toString('base64'),\n };\n if (Array.isArray(value)) return value.map(toSerializable);\n if (isRecord(value)) {\n if (CACHE_MARKER in value) {\n const inner: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) inner[k] = toSerializable(v);\n return { [CACHE_MARKER]: 'escape', d: inner };\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) out[k] = toSerializable(v);\n return out;\n }\n return value;\n}\n\n/**\n * Single traversal that restores the serialized form. The binary-leaf type is\n * supplied by the caller via `toBinary`; the store path constructs a plain\n * `Uint8Array`. Parametrizing the leaf factory keeps one implementation of the\n * walk while leaving the binary representation to the caller.\n */\nfunction fromSerializableWith(\n value: unknown,\n toBinary: (buf: Buffer) => Uint8Array,\n): unknown {\n if (isRecord(value)) {\n if (CACHE_MARKER in value) {\n const tag = value[CACHE_MARKER];\n const data = value.d;\n if (tag === 'buffer' && typeof data === 'string')\n return toBinary(Buffer.from(data, 'base64'));\n if (tag === 'escape' && isRecord(data)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data))\n out[k] = fromSerializableWith(v, toBinary);\n return out;\n }\n // Unrecognized tag (not 'buffer'/'escape'): fall through to default\n // object traversal so a user object that merely carries the marker key,\n // or a value from a future tag version, is preserved verbatim rather\n // than coerced.\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value))\n out[k] = fromSerializableWith(v, toBinary);\n return out;\n }\n if (Array.isArray(value))\n return value.map((v) => fromSerializableWith(v, toBinary));\n return value;\n}\n\n// Store path: binary leaves become a plain, platform-neutral Uint8Array (a\n// standalone view over the exact decoded bytes), never a Node Buffer.\nfunction toStoreBinary(buf: Buffer): Uint8Array {\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n}\n\n/**\n * Recursive type guard: the restored value is structurally a `StoreValue`.\n * The single restore walk (`fromSerializableWith`) is JSON-derived plus\n * `Uint8Array` binary leaves, so this always holds; the guard makes the\n * narrowing explicit and cast-free at the public boundary.\n *\n * The guard accepts exactly what the serializer can encode. An `undefined`\n * object property is dropped and an `undefined` array element becomes `null`\n * on `JSON.stringify`, so an `undefined` nested value does NOT disqualify the\n * containing value (matching the serializer's runtime tolerance at the\n * `unknown -> StoreValue` boundary). The `StoreValue` TYPE still excludes\n * `undefined`; this only mirrors what survives serialization.\n */\nfunction isStoreValue(value: unknown): value is StoreValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value instanceof Uint8Array\n )\n return true;\n if (Array.isArray(value))\n return value.every((v) => v === undefined || isStoreValue(v));\n if (isRecord(value))\n return Object.values(value).every(\n (v) => v === undefined || isStoreValue(v),\n );\n return false;\n}\n\n/**\n * Serialize a `StoreValue` to its UTF-8 JSON byte payload. Throws\n * `StoreCodecError` if the value cannot be encoded (e.g. a cyclic structure).\n */\nexport function serializeStoreValue(value: StoreValue): Uint8Array {\n let json: string;\n try {\n json = JSON.stringify(toSerializable(value));\n } catch (cause) {\n throw new StoreCodecError(\n 'Failed to serialize store value (likely a cyclic structure).',\n { cause },\n );\n }\n return new Uint8Array(Buffer.from(json, 'utf8'));\n}\n\n/**\n * Restore a `StoreValue` from its UTF-8 JSON byte payload (or a JSON string).\n */\nexport function deserializeStoreValue(raw: Uint8Array | string): StoreValue {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n const restored = fromSerializableWith(JSON.parse(text), toStoreBinary);\n if (!isStoreValue(restored))\n throw new StoreCodecError('Restored value is not a valid StoreValue.');\n return restored;\n}\n\n// Internal format helpers shared with the cache envelope codec (cache.ts) so\n// there is exactly one implementation of the structured transform.\n// `isStoreValue` lets boundary callers (the event cache) narrow a wide\n// `unknown` payload to `StoreValue` without a cast before wrapping it.\nexport {\n toSerializable,\n fromSerializableWith,\n CACHE_MARKER,\n isRecord,\n isStoreValue,\n};\n","import type { Cache, EventCacheRule } from './types/cache';\nimport type { Collector, Mapping, Store } from './types';\nimport type { StoreValue } from './types/store';\nimport type { CompiledMatcher } from './types/matcher';\nimport { compileMatcher } from './matcher';\nimport { getByPath, setByPath } from './byPath';\nimport { getMappingValue } from './mapping';\nimport { wrapCacheEnvelope, readCacheEnvelope } from './cache-envelope';\nimport { isStoreValue } from './store/codec';\n\ninterface CompiledCacheRule {\n match: CompiledMatcher;\n key: string[];\n ttl: number;\n update?: EventCacheRule['update'];\n}\n\nexport interface CompiledCache {\n stop: boolean;\n storeId?: string;\n namespace?: string;\n rules: CompiledCacheRule[];\n}\n\nexport interface CacheResult {\n status: 'HIT' | 'MISS';\n key: string;\n value?: StoreValue;\n rule: CompiledCacheRule;\n}\n\n/**\n * Builds a structured context object for cache and routing operations.\n * Normalizes ingest (defaulting to {}) and optionally includes event.\n */\nexport function buildCacheContext(\n ingest?: unknown,\n event?: unknown,\n): Record<string, unknown> {\n const ctx: Record<string, unknown> = {\n ingest: (ingest ?? {}) as Record<string, unknown>,\n };\n if (event !== undefined) {\n ctx.event = event as Record<string, unknown>;\n }\n return ctx;\n}\n\nexport function compileCache(cache: Cache<EventCacheRule>): CompiledCache {\n return {\n stop: cache.stop ?? false,\n storeId: cache.store,\n namespace: cache.namespace,\n rules: cache.rules.map((rule) => ({\n match: rule.match ? compileMatcher(rule.match) : () => true,\n key: rule.key,\n ttl: rule.ttl,\n update: rule.update,\n })),\n };\n}\n\nexport async function checkCache(\n compiled: CompiledCache,\n store: Store.Instance,\n context: Record<string, unknown>,\n namespace?: string,\n): Promise<CacheResult | null> {\n const rule = compiled.rules.find((r) => r.match(context));\n if (!rule) return null;\n\n const keyParts = rule.key.map((field) =>\n String(getByPath(context, field) ?? ''),\n );\n\n if (keyParts.every((p) => p === '')) return null;\n\n const keyValue = keyParts.join(':');\n const ns = namespace ?? compiled.namespace;\n const namespacedKey = ns ? `${ns}:${keyValue}` : keyValue;\n\n // `Store.GetFn` permits sync or async returns (`T | undefined |\n // Promise<T | undefined>`). Always await so a Promise return from an\n // async store (Redis, fs, the cache wrapper) never lands in the HIT\n // path as the cached \"value\".\n const decoded = readCacheEnvelope(await store.get(namespacedKey));\n\n if (decoded === undefined)\n return { status: 'MISS', key: namespacedKey, rule };\n if ('expired' in decoded) {\n try {\n await store.delete(namespacedKey);\n } catch {\n /* best-effort purge; degrade to MISS rather than throw into the request */\n }\n return { status: 'MISS', key: namespacedKey, rule };\n }\n return { status: 'HIT', key: namespacedKey, value: decoded.value, rule };\n}\n\nexport function storeCache(\n store: Store.Instance,\n key: string,\n value: unknown,\n ttlSeconds: number,\n): void {\n // Callers (source RespondOptions, destination push result, transformer\n // processed event) hold values typed wider than `StoreValue` but that are\n // structurally a `StoreValue` at runtime (JSON-shaped + binary leaves). The\n // guard narrows cast-free; a value that is genuinely not a `StoreValue` is\n // not cacheable, and the cache is advisory, so silently skip rather than\n // throw into the request path.\n if (!isStoreValue(value)) return;\n\n const ttlMs = ttlSeconds * 1000;\n // Store the plain {value, exp} envelope, not a pre-serialized Buffer: the\n // backing store serializes it through the shared store codec, so binary\n // leaves come back as Uint8Array. `exp` inside the envelope gives\n // uniform expiry for stores that ignore the ttl arg (fs/s3/gcs); the ttl\n // arg lets TTL-native stores (in-memory) evict instead of retaining until\n // read.\n // `Store.SetFn` returns `void | Promise<void>`. The write is fire-and-forget\n // (the HTTP response is sent before it lands), so an async store that rejects\n // (network error, EACCES) would otherwise surface as an unhandled rejection\n // and crash the process. Swallow it: a failed cache persist must never crash\n // the request path. Matches the best-effort silent catch on the checkCache purge.\n const result = store.set(key, wrapCacheEnvelope(value, ttlMs), ttlMs);\n if (result instanceof Promise) result.catch(() => {});\n}\n\nexport async function applyUpdate(\n value: unknown,\n update: Record<string, unknown> | undefined,\n context: Record<string, unknown>,\n collector: Collector.Instance,\n): Promise<unknown> {\n if (!update) return value;\n\n let result = value;\n for (const [path, valueConfig] of Object.entries(update)) {\n const resolved = await getMappingValue(\n context,\n valueConfig as Mapping.Data,\n { collector },\n );\n result = setByPath(result, path, resolved);\n }\n return result;\n}\n","import type { Collector, Mapping, State, Store, WalkerOS } from './types';\nimport { getMappingValue } from './mapping';\nimport { FatalError } from './fatalError';\nimport { setByPath } from './byPath';\nimport { isArray, isDefined, isObject, isString } from './is';\nimport { tryCatchAsync } from './tryCatch';\n\n/**\n * Resolve a store by id. An `undefined` id falls back to the default\n * in-memory `__cache` store. Returns `undefined` when the id is unknown.\n */\nexport type GetStore = (id: string | undefined) => Store.Instance | undefined;\n\n/** Normalize a single State or an array of States to an array. */\nexport function compileState(state: State | State[]): State[] {\n return isArray(state) ? state : [state];\n}\n\n/** Extract the event write-target path for a `get`. */\nfunction resolveTargetPath(\n value: Mapping.Value | undefined,\n): string | undefined {\n if (isString(value)) return value;\n if (isObject(value) && isString(value.key)) return value.key;\n return undefined;\n}\n\n/**\n * Apply declarative store operations against an event, in array order,\n * sequentially. `get` reads from the store and writes the fetched value to\n * the event's value path; `set` writes the resolved value to the store. Each\n * entry is fail-open: a store or resolution error is logged and the event is\n * left unmutated, the chain continues. Only `FatalError` rethrows (via\n * `getMappingValue`).\n */\nexport async function applyState<E extends WalkerOS.DeepPartialEvent>(\n states: State[],\n getStore: GetStore,\n event: E,\n collector: Collector.Instance,\n): Promise<E> {\n let result = event;\n for (const entry of states) {\n await tryCatchAsync(\n async () => {\n const store = getStore(entry.store);\n if (!store) return; // unknown store is rejected at validation; guard anyway\n\n const rawKey = await getMappingValue(result, entry.key, {\n collector,\n event: result,\n });\n if (!isString(rawKey)) return;\n // namespace state keys on the shared default store to avoid cache collisions\n const key = entry.store ? rawKey : `state:${rawKey}`;\n\n if (entry.mode === 'set') {\n const payload = await getMappingValue(result, entry.value, {\n collector,\n event: result,\n });\n if (!isDefined(payload)) return; // skip writing undefined\n await store.set(key, payload);\n } else {\n const targetPath = resolveTargetPath(entry.value);\n if (!targetPath) return; // validation already rejects this\n const fetched = await store.get(key);\n if (!isDefined(fetched)) return; // miss: leave event unchanged\n result = setByPath(result, targetPath, fetched);\n }\n },\n (error) => {\n if (error instanceof FatalError) throw error;\n collector.logger?.error?.('[state] operation failed', error);\n },\n )();\n }\n return result;\n}\n","import type { Flow } from './types/flow';\n\n/**\n * Single source of truth for step-entry validation across all four kinds.\n *\n * An empty entry (no `code`, no `package`, no `import`) is a valid no-op\n * step for all four kinds. The bundler emits no code; the runtime skips\n * registration. No error is raised for empty steps.\n *\n * Error codes:\n * - UNKNOWN_KEY unknown top-level key on a step entry\n * - CONFLICT two of {code, package, import} together, or other mutually exclusive pairs\n * - MISSING_PACKAGE `import` set without `package`\n * - OBSOLETE_CODE_STRING `code` is a string (legacy named-export shape; use `import` instead)\n * - INVALID_IMPORT `import` is set but is not a valid JS identifier\n * - INVALID_CODE_SHAPE `code` is present but is neither an object nor a string\n */\n\nexport const STEP_OPERATIVE_FIELDS: Record<Flow.StepKind, readonly string[]> = {\n Source: ['code', 'package', 'import', 'before', 'next', 'cache', 'state'],\n Transformer: [\n 'code',\n 'package',\n 'import',\n 'before',\n 'next',\n 'cache',\n 'state',\n 'mapping',\n ],\n Destination: [\n 'code',\n 'package',\n 'import',\n 'before',\n 'next',\n 'cache',\n 'state',\n ],\n Store: ['code', 'package', 'import', 'cache'],\n} as const;\n\nconst COMMON_NON_OPERATIVE = [\n 'config',\n 'env',\n 'variables',\n 'examples',\n 'disabled',\n 'id',\n 'logger',\n 'mock',\n 'chainMocks',\n] as const;\n\nconst KIND_EXTRA: Record<Flow.StepKind, readonly string[]> = {\n Source: ['primary'],\n Transformer: [],\n Destination: [],\n Store: [],\n};\n\nconst IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nexport type StepEntryErrorCode =\n | 'UNKNOWN_KEY'\n | 'CONFLICT'\n | 'MISSING_PACKAGE'\n | 'OBSOLETE_CODE_STRING'\n | 'INVALID_IMPORT'\n | 'INVALID_CODE_SHAPE';\n\nexport interface StepEntryValidation {\n ok: boolean;\n reason?: string;\n code?: StepEntryErrorCode;\n key?: string;\n}\n\nfunction allowedKeys(kind: Flow.StepKind): Set<string> {\n return new Set<string>([\n ...STEP_OPERATIVE_FIELDS[kind],\n ...COMMON_NON_OPERATIVE,\n ...KIND_EXTRA[kind],\n ]);\n}\n\nexport function validateStepEntry(\n entry: Record<string, unknown>,\n kind: Flow.StepKind,\n): StepEntryValidation {\n const allowed = allowedKeys(kind);\n\n for (const key of Object.keys(entry)) {\n if (!allowed.has(key)) {\n return {\n ok: false,\n code: 'UNKNOWN_KEY',\n key,\n reason: `Unknown key \"${key}\" on ${kind}. Allowed: ${[...allowed].sort().join(', ')}.`,\n };\n }\n }\n\n const hasPackage = entry.package !== undefined;\n const hasImport = entry.import !== undefined;\n const hasCode = entry.code !== undefined;\n\n if (hasCode && typeof entry.code === 'string') {\n return {\n ok: false,\n code: 'OBSOLETE_CODE_STRING',\n key: 'code',\n reason: `code: \"<name>\" is no longer supported. Use import: \"${entry.code}\" with the package field instead.`,\n };\n }\n\n if (\n hasCode &&\n ((typeof entry.code !== 'object' && typeof entry.code !== 'function') ||\n entry.code === null ||\n Array.isArray(entry.code))\n ) {\n return {\n ok: false,\n code: 'INVALID_CODE_SHAPE',\n key: 'code',\n reason: `code must be an object ({ push, type?, init? }) or a resolved function value.`,\n };\n }\n\n if (hasCode && hasPackage) {\n return {\n ok: false,\n code: 'CONFLICT',\n key: 'package',\n reason: 'Cannot specify both `code` and `package`. Use one or the other.',\n };\n }\n if (hasCode && hasImport) {\n return {\n ok: false,\n code: 'CONFLICT',\n key: 'import',\n reason: 'Cannot specify both `code` and `import`.',\n };\n }\n if (hasImport && !hasPackage) {\n return {\n ok: false,\n code: 'MISSING_PACKAGE',\n key: 'import',\n reason: '`import` requires `package` to be set.',\n };\n }\n if (hasImport) {\n if (typeof entry.import !== 'string' || !IDENT_RE.test(entry.import)) {\n return {\n ok: false,\n code: 'INVALID_IMPORT',\n key: 'import',\n reason: `import must match ${IDENT_RE.source}. Got: ${JSON.stringify(entry.import)}.`,\n };\n }\n }\n\n // Empty entry (no code, no package, no import) is a valid no-op step\n // for all four kinds. Bundler emits nothing, runtime skips registration.\n\n return { ok: true };\n}\n\nexport function isPathStepEntry(\n entry: Record<string, unknown>,\n kind: Flow.StepKind,\n): boolean {\n if (kind !== 'Transformer') return false;\n if (\n entry.code !== undefined ||\n entry.package !== undefined ||\n entry.import !== undefined\n ) {\n return false;\n }\n return (\n entry.before !== undefined ||\n entry.next !== undefined ||\n entry.cache !== undefined ||\n entry.state !== undefined ||\n entry.mapping !== undefined\n );\n}\n","import type { Flow } from '../types/flow';\n\ntype StepOut = Flow.StepOut;\ntype StepEffect = Flow.StepEffect;\n\n/**\n * Format a step example's `out` as readable code for docs/app rendering.\n *\n * - Empty `out` → `// no output`.\n * - `['return', value]` → `return <value>` (no parentheses).\n * - `[callable, ...args]` → `callable(<args>)`.\n * - Primitive args render as JSON (strings quoted, numbers/booleans/null bare).\n * - `undefined` renders as the literal token `undefined`.\n * - Objects/arrays render as `JSON.stringify(v, null, 2)`.\n * - Functions render as `[Function]` (rare in outs; safe fallback).\n *\n * Pure function. No runtime dependencies. Used by the website\n * `<StepExample>` renderer and the app `OutputPanel` for a single source of truth.\n */\nexport function formatOut(out: StepOut): string {\n if (out.length === 0) return '// no output';\n return out.map(formatEffect).join(';\\n\\n');\n}\n\nfunction formatEffect(effect: StepEffect): string {\n const [callable, ...args] = effect;\n const argStr = args.map(formatValue).join(', ');\n if (callable === 'return') return argStr ? `return ${argStr}` : 'return';\n return `${callable}(${argStr})`;\n}\n\nfunction formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (v === null) return 'null';\n if (typeof v === 'function') return '[Function]';\n return JSON.stringify(v, null, 2);\n}\n"],"mappings":"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","names":["compileCache","Level","value","value","value","acc","value","value","value","value","value","value","value","value","mapping","value","value","value","value","stepId","value","value","value","isRecord","value","isRecord","value","out","compileCache","value","value","getStore"]}
|