import type { Message, ToolDefinition } from "./contracts.js"; /** Same shape as `AgentInput`; kept structural here so core's assembler and this module never form a runtime cycle. */ type ToolSearchInput = string | Message | readonly Message[]; export type ToolsDisclosure = "all" | "search"; export interface ToolsSearchOptions { /** Top-k tools disclosed per turn. Default 16; clamped to the hard cap. */ readonly topK?: number; } export declare const SEARCH_TOOLS_TOOL_NAME = "search_tools"; export declare const DEFAULT_TOOLS_SEARCH_TOP_K = 16; export declare const HARD_MAX_TOOLS_SEARCH_TOP_K = 64; /** Frozen index cap; larger registries fail closed to full disclosure. */ export declare const HARD_MAX_TOOLS_INDEX = 1024; export declare const DEFAULT_MAX_TOOLS_SEARCH_QUERY_BYTES = 4096; export declare const HARD_MAX_TOOLS_SEARCH_QUERY_BYTES = 65536; export declare const TOOL_DISCLOSURE_ERROR_CODE: "tool_disclosure_exceeded"; export declare class ToolDisclosureError extends Error { readonly code: "tool_disclosure_exceeded"; constructor(message: string); } export declare function isToolDisclosureError(error: unknown): error is ToolDisclosureError; /** Run options win over agent config (mirrors resolveSkillsDisclosure); default "all". */ export declare function resolveToolsDisclosure(run?: ToolsDisclosure, agent?: ToolsDisclosure): ToolsDisclosure; /** Activation set: same shape as LoadedSkillSet (names-only persistence, per-session instance). */ export interface ActiveToolSet { has(name: string): boolean; add(name: string): void; list(): readonly string[]; clear(): void; } export declare function createActiveToolSet(): ActiveToolSet; interface PostingEntry { readonly toolIndex: number; tf: number; } export interface ToolSearchIndex { readonly tools: readonly ToolDefinition[]; readonly postings: ReadonlyMap; } /** ponytail: O(n·d) lexical index, rebuilt on registry change by the caller — embedder-backed * scoring via the @arnilo/prism-memory/rag seam if accuracy fixtures fall short (plan 041). */ export declare function createToolSearchIndex(tools: readonly ToolDefinition[], skip?: (tool: ToolDefinition) => boolean): ToolSearchIndex; export interface ToolSearchMatch { readonly name: string; readonly description?: string; /** Query terms present in name/description, most significant first. */ readonly matched: readonly string[]; } /** Bounded lexical scoring: BM25-lite (tf × IDF, registry-derived DF). Ties keep registry order. */ export declare function scoreTools(index: ToolSearchIndex, query: string, k: number, queryByteCap?: number): readonly ToolSearchMatch[]; export interface ToolSearchState { readonly index: ToolSearchIndex; readonly activated: ActiveToolSet; readonly topK: number; } export declare function createToolSearchState(options: { readonly tools: readonly ToolDefinition[]; readonly activated: ActiveToolSet; readonly search?: ToolsSearchOptions; }): ToolSearchState; /** Provider-facing narrowing: activated tools ∪ top-k for the turn. Fails closed — any * scoring/index error discloses the full input list (never zero, never wider than input). */ export declare function selectDisclosedTools(options: { readonly tools: readonly ToolDefinition[]; readonly input: ToolSearchInput; readonly queryByteCap?: number; readonly search?: ToolsSearchOptions; readonly activated?: { has(name: string): boolean; }; }): readonly ToolDefinition[]; /** Model-facing activation tool, generated only in search mode. Results are inert * name+description lines — no schemas or bodies — and activation re-checks allow/deny * at dispatch time (blocked-reason matrix unchanged). */ export declare function createSearchToolsTool(state: ToolSearchState, queryByteCap?: number): ToolDefinition; export {};