import type { SkillIndexEntry, SkillIndexSummary } from './types.js'; /** * `READ_SKILL_GUIDANCE`'s "not already present" test is the only brake on * re-loading a skill, and the index is re-sent every turn with no way for the * model to tell a live transcript from a replayed one — so it re-reads. Said * ONLY on a confirmed warm session, where an earlier turn's `ReadSkill` result * may still be in context; a cold reseed replays history as bounded, explicitly * untrusted text, and claiming otherwise there would make the agent improvise * instructions it does not have. * * Deliberately hedged rather than categorical. A warm session can still be * compacted mid-conversation, which can summarize an earlier skill body away — * so this points the agent at what it can actually see instead of asserting * what must be there. */ export declare const WARM_SESSION_SKILL_GUIDANCE = "This session is continuous, so earlier turns in this conversation \u2014 including any skill body you loaded with `ReadSkill` \u2014 may still be in context above. Check before loading: do not reload a skill whose complete instructions you can already see."; export interface LoadedSkillFile { readonly entry: SkillIndexEntry; readonly markdown: string; } export declare function buildSkillIndex(entries: readonly SkillIndexEntry[]): readonly SkillIndexEntry[]; export declare function loadSkillIndexFromDirectory(root: string): Promise; export declare function loadSkillFilesFromDirectory(root: string): Promise; /** Matches the conservative name grammar accepted by the runtime's shared-root ReadSkill tool. */ export declare function isReadSkillCompatibleName(name: unknown): name is string; export declare function renderSkillIndex(entries: readonly SkillIndexEntry[], skillDisclosure?: 'index' | 'full'): string; /** * Takes `SkillIndexSummary` rather than `SkillIndexEntry` because rendering only * ever reads `name` and `description`. Widening the parameter is what lets a * caller holding runtime-options entries (which carry no `mainFile`) render the * same index the context builder does. Existing callers passing full entries are * unaffected. */ export declare function renderSkillIndexEntries(entries: readonly SkillIndexSummary[], skillDisclosure?: 'index' | 'full', warmSession?: boolean): string; /** * The whole `## Skill Index` section, heading included. * * Exists so a caller outside the context builder — the subagent path in * agent-app, which composes a child prompt without going through the harness — * cannot drift from the section heading `buildAgentContext` emits. Disclosure is * fixed to `index`: inlining bodies into a child is the cost this exists to * avoid, so `ReadSkill` guidance always belongs with it. */ export declare function renderSkillIndexSection(entries: readonly SkillIndexSummary[]): string; //# sourceMappingURL=skill-index.d.ts.map