/** * provenance — who registered this name. * * Pattern: a small value type + one formatter. Pure, no dependencies beyond * the recipe types. * Role: recipes/ layer. `AgentBuilder` records a {@link RecipeSource} beside * every tool name and injection id it takes, and reads it back when * two registrations collide. * Emits: N/A. * * ## Why provenance at all * * The builder has always refused a duplicate tool name — the model dispatches * by name, so two tools called `search` is a coin flip. What it could not say * was WHERE each one came from. With one recipe in the chain that answer stops * being obvious ("I never registered a `search` tool") and with two it is * unrecoverable without reading both recipes' source. A refusal that names both * sides turns a hunt into a sentence. * * ## Three arms, because three things are true and one of them is "I do not know" * * `local` and `unattributed` are NOT the same fact, and collapsing them would * make the refusal lie. `local` means: this builder watched you call * `.tool()` / `.injection()` yourself. `unattributed` means: the name was * already taken when the ledger was consulted and no source was recorded for * it — the honest answer is that this builder does not know, and saying * "you registered it" would send the reader to look in the one place it is not. * * The arm exists because there is more than one way into the injection list: * `.injection()` is the funnel for the named flavors, and `.outputSchema()` * mounts an instruction of its own. Both record a source today. A third site * added later would not, and this arm is what keeps that omission honest * instead of blaming the caller. */ import type { AppliedRecipe } from './types.js'; /** * Where a registered tool name or injection id came from. * * `stack` is the recipe application chain, OUTERMOST first: a recipe may apply * another recipe, and the innermost one is the code that literally called the * builder method. */ export type RecipeSource = { readonly kind: 'local'; } | { readonly kind: 'recipe'; readonly stack: readonly AppliedRecipe[]; }; /** The one `local` value. A frozen singleton — it carries no data. */ export declare const LOCAL_SOURCE: RecipeSource; /** * Describe a source in a sentence fragment that reads inside a refusal. * * `undefined` is the unattributed case — see the header. It is a separate * answer, never folded into `local`. */ export declare function describeRecipeSource(source: RecipeSource | undefined): string; //# sourceMappingURL=provenance.d.ts.map