/** * artifacts/present — the hand-to-the-screen verb (Phase 2, Leg 2). * * `present({ ref, as, label? })` is how the model finishes an analytics * answer WITHOUT serializing what the screen will show: it names the ticket * (`ref`), the consumer vocabulary for how to render it (`as: 'bar-chart'`, * `'table'`, …), and optionally the human title. The framework `head`s the * ref under the run's own scope and the RESULT carries a DESCRIPTION * SNAPSHOT — `{ kind, mediaType, bytes, label }` — so the claim ticket * describes the parcel: a conversation reloaded after the artifact expired * can still render an honest placeholder from history alone ("Chart — * 'Q3 sales by region' (bar-chart, 41 KB) — expired; re-run to regenerate"), * because the snapshot lives INSIDE the tool result, the one thing provider * message history keeps typed and durable. Never a blank pane. * * `as` is deliberately NOT validated against a component registry — that * registry is a later phase (the frontend leg); until then the value is * stored as data and travels on the `artifacts.presented` event exactly as * spoken. * * This module is the PURE half — the tool's name/schema constants, the * snapshot shape, and the resolution over the five-verb port. The tool SHELL * (a placeholder whose result the agent loop overwrites — the `skip_step` * pattern) lives in core, which is also where the typed * `agentfootprint.artifacts.presented` event is emitted. Core wires * artifacts; never the reverse. */ import type { ArtifactRef, ArtifactScope, ArtifactStore } from './types.js'; /** * The reserved name of the auto-attached tool. Reserved ONLY when a store is * attached (the `read_skill` seam): a storeless agent may keep its own * `present`, because the framework attaches nothing there. */ export declare const PRESENT_TOOL_NAME = "present"; /** * The description snapshot — what the `present` result carries about the * parcel at speak time, so an expired artifact can still render an honest * placeholder from history. Meta only, never the payload. */ export interface PresentSnapshot { /** The artifact's own consumer vocabulary (`meta.kind`). */ readonly kind: string; readonly mediaType: string; readonly bytes: number; /** The human title — the call's `label` when given, else the mint's. */ readonly label?: string; } /** The one result shape a successful `present` returns (stringified onto the * `role: 'tool'` message — a reload walks history for exactly this). */ export interface PresentedResult { /** Always `true`. The field a transcript walker branches on. */ readonly presented: true; readonly ref: ArtifactRef; /** The consumer vocabulary the model chose — stored as data (the component * registry that would validate it is a later phase). */ readonly as: string; readonly snapshot: PresentSnapshot; } /** What presenting resolved to. Exactly one arm. */ export type PresentOutcome = { readonly ok: true; readonly result: PresentedResult; } | { readonly ok: false; /** The teaching refusal the model reads, listing what CAN resolve. */ readonly refusal: string; /** Present iff the miss was a ref that did not resolve — the caller * (the stage) puts `artifacts.refused` on the record for it. Absent * for malformed args, which never reached the store. */ readonly missedRef?: ArtifactRef; }; /** * Resolve one `present` call over the port — ONE law for every dispatch * door. `head`, never `get`: presenting is the render-by-ref decision, and * the screen pays for the bytes later, under its own identity. */ export declare function presentArtifact(store: ArtifactStore, scope: ArtifactScope, args: Readonly>): Promise;