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<string>;
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<string, ReadonlySet<string>>;
    /** 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<string, ReadonlySet<string>>;
}
/** 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<string>): SpecialistDriftResult;
//# sourceMappingURL=specialist-drift.d.ts.map