/** Closed action types a spec may declare. Catalog metadata may list more. */
export declare const SPEC_ACTIONS: readonly ["hover", "resize", "select", "submit", "approve", "reject"];
export type SpecAction = (typeof SPEC_ACTIONS)[number];
export declare const SPEC_ACTION_SET: ReadonlySet<string>;
export type SpecBindValue = string | {
    field: string;
};
export type SpecBindMap = Record<string, SpecBindValue>;
export type SpecBindItem = {
    role: string;
    field: string;
};
export type SpecTool = {
    name: string;
};
export type SpecField = string | {
    name?: string;
    id?: string;
    label?: string;
};
/**
 * Workspace spec. No `data: row[]` — rows arrive through the data-channel handle.
 * `allowedActions` is the closed Stage 3 set only — catalog extras (pan/zoom) stay off the spec.
 * `binds` require `fields` so a missing column is detectable.
 */
export type WorkspaceSpec = {
    component: string;
    props?: Record<string, unknown>;
    binds?: SpecBindMap | readonly SpecBindItem[];
    fields?: readonly SpecField[];
    allowedActions?: readonly string[];
    actions?: readonly string[];
    tools?: readonly {
        name?: string;
        [key: string]: unknown;
    }[];
    children?: readonly unknown[];
    label?: string;
    /** Signed data-link. Widget fetches rows here — never from the MCP tool result. */
    dataUrl?: string;
    /** Host tool the widget calls to read the signed payload. Not a model-facing tool. */
    callServerTool?: string;
};
