/** A named generator: returns a fresh value each time `${name}` is interpolated. */ export type Generators = Record unknown>; export declare class Scope { private readonly root; private readonly generators; constructor(seed?: Record, generators?: Generators); /** Read a dotted path (`a.b.0.c`); `undefined` if any segment is missing. * Custom generators and reserved dynamic tokens resolve to a fresh value. */ get(path: string): unknown; /** Write a dotted path, creating intermediate objects as needed. */ set(path: string, value: unknown): void; /** Deep-resolve `${...}` references in any value (recurses objects/arrays). * Single-pass on purpose: a `${ref}` resolving to a string that itself * contains `${...}` is left as-is, so a var reused on both sides of a * capture/match (e.g. `"hi ${now}"`) stays IDENTICAL — re-resolving would * re-evaluate generators like `${now}`/`${rand.long}` to different values. */ interpolate(value: unknown): unknown; private interpolateString; } /** Read a dotted path out of an arbitrary decoded value (for `expect`/`capture`). */ export declare function getByPath(obj: unknown, path: string): unknown; /** * A view over `scope` for a recipe run that makes captures referenceable from * another user's steps as `${user.key}`. A capture is written BOTH flat (`${key}`) * and namespaced (`${user}.key`); a key the recipe already namespaced (`${user}.…`) * is written once. Mirrors @mt-tl/studio's builder (which merges recipe captures * both flat and per-user). Two capture styles are accepted, matching studio: * - `scope.set('userId', id)` — the Scope method, and * - `scope.userId = id` — a plain assignment (studio's `ctx.scope` is a * plain object; testing's is a Scope instance, so without this trap a bare * assignment would land on the instance, NOT in the interpolation `root`). * All other methods (get/interpolate) delegate unchanged. */ export declare function userScope(scope: Scope, user: string): Scope; //# sourceMappingURL=scope.d.ts.map