import type { ToolSurface } from './tool-surface.js'; /** Claude Code-native tools an agent can call without any MCP server. * Listed exhaustively rather than guessed — a new CC-native tool added * upstream forces an explicit ledger update here. Exported so the admin * operator spawn can union this set into its `--allowed-tools` argv at * spawn time; Task 579 — without that union, the admin's explicit * plugin-tool allowlist silently excluded built-in `LS` / `Glob` and * the seat could not enumerate its own disk. */ export declare const CC_NATIVE_TOOLS: Set; export interface SpecialistDriftDefect { specialistPath: string; specialistName: string; tool: string; reason: 'unknown-plugin-namespace' | 'unknown-tool-in-plugin' | 'malformed-name' | 'brand-excluded-plugin'; } export interface SpecialistDriftResult { /** True when no defect refuses boot. `brand-excluded-plugin` defects do * not refuse boot — they populate `stripList` and the manager removes * those tools from the specialist's allowlist at spawn time. Any other * defect class makes this false. */ ok: boolean; /** Defects found, by specialist file. Includes brand-excluded entries * even though they do not refuse boot — they are the audit trail for * what the strip-list took out. */ defects: SpecialistDriftDefect[]; /** Total specialist `.md` files inspected (those with a `tools:` line). */ inspected: number; /** Per-specialist set of tool names to remove from `--allowed-tools` at * spawn time. Keyed by specialist name (the `.md` basename without the * extension). Populated exclusively by `brand-excluded-plugin` defects; * any other defect class refuses boot and the manager never reaches a * spawn that would consult this map. */ stripList: ReadonlyMap>; /** Per-specialist resolved tool surface — keyed by specialist name (the * `.md` basename), value is the sorted set of tool names declared on the * specialist's `tools:` line (before any strip-list removal). Populated * for every specialist with a `tools:` line, regardless of drift outcome. * Consumed by the manager-boot `[specialist-surface]` standing log so a * payload-twin or bundle drift that drops a tool from a specialist's * resolved surface is greppable from server.log without re-running a * failing brief (Task 565 observability item 1). */ surfaces: ReadonlyMap>; } /** Extract the value of the `tools:` line from a YAML frontmatter block. * Returns the raw value (whitespace-trimmed) or null when no `tools:` * key appears. The value is the comma-separated tool list Claude Code * resolves; this module is the single parser of that grammar. */ export declare function parseSpecialistToolsLine(frontmatter: string): string | null; /** Walk one or more directories, classify every specialist `.md` file's * `tools:` frontmatter, and return drift defects. * * `excludedPlugins` carries the brand's `plugins.excluded` set (the * plugin directory names brand.json excludes from this bundle). A tool * whose namespace appears in that set is classified as * `brand-excluded-plugin`: it does not refuse boot and lands in * `stripList` for the spawn path to remove from `--allowed-tools`. * Defaulted to the empty set so call-sites that don't know about brand * exclusions keep the legacy strict-boot semantics. */ export declare function assertSpecialistDrift(agentDirs: readonly string[], toolSurface: ToolSurface, excludedPlugins?: ReadonlySet): SpecialistDriftResult; //# sourceMappingURL=specialist-drift.d.ts.map