/** * Skill-body ↔ tool-contract consistency check (Proposal 009, Tier 1). * * A skill's `body` (prose injected into the system prompt) can quietly contradict * the tools it actually unlocks, and the model then **refuses a tool that is right * there** — or is told about one it can't call. The library already knows each * skill's real tool set (`inject.tools`), so it can flag the mismatch at authoring * time instead of at run time. * * Tier 1 is DETERMINISTIC (no LLM): pure string + schema checks. The semantic * contradictions it can't see — e.g. "the body calls an OPTIONAL arg required" — * are Tier 2 (LLM-advisory, opt-in). Both checks here are WARNINGS, never errors: * a body naming a foreign tool is often an intentional `read_skill` handoff hint. */ import type { Injection } from './types.js'; import type { GraphProblem } from './skillGraphCheckup.js'; /** The tool names a skill unlocks (`inject.tools[].schema.name`). */ export declare function skillToolNames(skill: Injection): readonly string[]; /** * Tools that are callable from EVERY skill — the agent's baseline (`.tool()` / * `.tools()` registrations, an always-on `ToolProvider`). Both checks below need * them, and need them differently, which is why they are a third set rather than * more entries in `knownToolNames` (8.7.0): * * • `body-unknown-tool` must treat them as KNOWN — `lookup_order(id)` in a body is * not a typo when the agent really registers `lookup_order`; * • `body-foreign-tool` must EXCLUDE them — that check means "a tool that belongs * to another skill and is therefore not callable here", and a baseline tool is * callable here. Folding them into `knownToolNames` alone would have swapped one * false warning for another. */ export interface SkillContractOptions { /** * Tool names the agent exposes to every skill (`.tool()`, `.tools()`, a baseline * provider). Pass `agent`-level names when checking a graph whose skills rely on * them: `graph.checkup({ knownTools: ['lookup_order'] })`. */ readonly knownTools?: readonly string[]; } /** * Check ONE skill's body against its tool contract. Pure + side-effect-free. * * @param skill the skill to check * @param knownToolNames every tool name reachable in the wider graph/agent (lets * the check tell a cross-skill HANDOFF from a typo). Omit to * check a skill in isolation (only its own tools are "known"). * @param options `knownTools` — baseline tools callable from every skill. * See {@link SkillContractOptions}. */ export declare function checkSkillContract(skill: Injection, knownToolNames?: ReadonlySet, options?: SkillContractOptions): GraphProblem[]; /** Run the contract check across many skills with a shared known-tool set. Pure. */ export declare function checkSkillContracts(skills: readonly Injection[], options?: SkillContractOptions): GraphProblem[];