/** * Agent ↔ tool-server contract check (proposal 009, the server-boundary extension). * * When an agent's tools call a remote tool-server (an MCP-ish sidecar, a function * gateway), the agent's `inputSchema` and the server's real contract can drift — * and the model then calls a tool that 404s, or omits an arg the server REQUIRES and * gets a 501/400 "doesn't work." The server usually publishes its own catalog * (e.g. `GET /tools` → `[{ name, inputSchema }]`), so the drift is checkable. * * `toolContractCheckup(agentTools, serverCatalog)` is a PURE diff (no I/O — the * consumer fetches the catalog and passes it). It mirrors the `graph.checkup()` * shape so both feed the same reporting. */ import type { Tool } from './tools.js'; export type ToolContractCode = 'missing-on-server' | 'dead-endpoint' | 'required-divergence' | 'arg-divergence' | 'optional-drift'; /** One contract issue. `kind: 'error'` fails `ok`. */ export interface ToolContractProblem { readonly kind: 'error' | 'warning'; readonly code: ToolContractCode; readonly tool: string; readonly message: string; } export interface ToolContractCheckup { readonly ok: boolean; readonly problems: readonly ToolContractProblem[]; } /** A server-catalog entry — the shape of one item from `GET /tools`. */ export interface ServerToolEntry { readonly name: string; readonly inputSchema?: { readonly required?: readonly string[]; readonly properties?: Readonly>; }; } /** * Diff an agent's tools against a server's tool catalog. Pure + deterministic. * * @param agentTools the agent's tools (`Tool[]` or `{name, inputSchema}[]`) * @param serverCatalog the server's catalog (e.g. `await (await fetch('/tools')).json()`) */ export declare function toolContractCheckup(agentTools: ReadonlyArray, serverCatalog: ReadonlyArray): ToolContractCheckup; /** Format a contract check-up for a thrown error / console warning. */ export declare function formatToolContractCheckup(checkup: ToolContractCheckup): string;