/**
 * @fileoverview Lint rules for the `enrichment` block on tool definitions.
 * Validates the block's shape, guards against `output`-key collisions (which
 * `output.extend(enrichment)` would silently override), requires a markdown
 * renderer for non-scalar fields that would otherwise JSON-blob in the content[]
 * trailer, validates the `enrichmentTrailer` config, and — when no block is
 * declared — nudges meta-looking `output` fields toward enrichment.
 *
 * Every check here is a static shape check on the declaration, not a
 * handler-source scan: enrichment is populated via `ctx.enrich(...)`, which is
 * callable from the service layer and therefore invisible to a handler-body
 * scan. "Declared but never populated" is caught at runtime instead — a required
 * enrichment field that goes unpopulated fails the effective-output parse.
 * @module src/linter/rules/enrichment-rules
 */
import type { LintDefinitionType, LintDiagnostic } from '../types.js';
/**
 * Validates the `enrichment` block and its `enrichmentTrailer` config on a tool
 * definition.
 *
 * When `enrichment` is declared:
 *   - it must be an object mapping field names to Zod schemas (a `ZodRawShape`)
 *   - each field value must be a Zod schema
 *   - keys must be disjoint from `output` keys (`.extend` silently overrides
 *     collisions — this one is an error)
 *   - a non-scalar (object/array) field must declare an `enrichmentTrailer.render`
 *     (or be the `delta` shape) so it renders as markdown, not a JSON blob, in
 *     `content[]`
 *   - `enrichmentTrailer` keys must reference declared enrichment fields
 *
 * When `enrichment` is absent: emits an advisory nudge for any `output` field
 * whose name strongly signals agent-facing context (e.g. `notice`,
 * `effectiveQuery`) that would be better expressed as enrichment — and errors if
 * an `enrichmentTrailer` is declared with no block to attach to.
 */
export declare function lintEnrichmentContract(def: {
    enrichment?: unknown;
    output?: unknown;
    enrichmentTrailer?: unknown;
}, definitionType: LintDefinitionType, definitionName: string): LintDiagnostic[];
/** Options for the capped-list-no-truncation rule. */
export interface TruncationOptions {
    /** Tool names exempt from the rule. `false` disables the rule entirely. */
    truncationAllowlist?: ReadonlyArray<string> | false;
}
/**
 * Warns when a tool takes a cap-like input field (e.g. `limit`, `per_page`) and
 * returns an array output, but declares no truncation disclosure — neither a
 * `truncated` key in its declared `enrichment` shape, nor `totalCount` in enrichment,
 * nor `truncated` or `totalCount` as top-level `output` keys.
 *
 * The established `enrich.total()` convention (`totalCount`) and bespoke output fields
 * count as honest disclosure — the rule fires only on a genuinely silent cap.
 */
export declare function lintCappedListTruncation(def: {
    name?: unknown;
    input?: unknown;
    output?: unknown;
    enrichment?: unknown;
}, truncationOptions?: TruncationOptions): LintDiagnostic[];
//# sourceMappingURL=enrichment-rules.d.ts.map