/** * Skill Resolver com Scoring — resolve skills + agentes com pontuação. * * Estende o resolver legacy (aliases → paths) com: * - parsing de frontmatter das skills (Skill Manifest) * - scoring por relevância semântica + histórico (MemoryStore) * - composições do skill-resolver.json (chains por domínio) */ import type { CandidateScore, SkillManifest } from '../types.js'; import { CandidateScorer } from './scorer.js'; import type { MemoryStore } from '../memory/store.js'; export interface ResolvedSkill { alias: string; path: string; manifest: SkillManifest; score: CandidateScore; } export interface ResolverOptions { baseDir: string; memory?: MemoryStore; scorer?: CandidateScorer; } /** * Faz parse do frontmatter YAML simples (scalars + listas inline e de bloco). * Sem dependências. * * A lista de BLOCO (`triggers:` seguido de linhas ` - valor`) foi acrescentada * porque produtor e consumidor deste mesmo repositório estavam em formatos * incompatíveis: a `SkillFactory` escreve exclusivamente lista de bloco * (`factories/skill-factory.ts`), e o parser só entendia escalar ou `[a, b]` * inline. O efeito não era erro: `triggers:` casava com o regex de chave e * gravava string vazia, as linhas ` - valor` não casavam com nada e eram * puladas, e `readSkill` derivava `[]`. Toda skill gerada pela Factory (e toda * skill sintetizada por trajetória, que usa o mesmo escritor) perdia em * silêncio justamente o metadado pelo qual `rankSkills` a encontraria. * * Chave aninhada (`tools:` → ` mcp:` → ` - x`) continua fora de escopo, e * de propósito: o único consumidor é `SkillManifest`, que é plano. Um parser * YAML de verdade aqui seria dependência nova para ler seis campos. */ export declare function parseFrontmatter(content: string): Record; /** Extrai o corpo da skill (remove frontmatter). */ export declare function stripFrontmatter(content: string): string; export declare class SkillResolver { private readonly opts; private aliases; private readonly scorer; /** * Manifesto por alias, memoizado. `rankSkills` varre a biblioteca inteira a * cada chamada; sem cache, ranquear skills por TAREFA (e não por run) faria * a mesma centena de arquivos ser lida do disco uma vez por nó do grafo. * `null` também é cacheado: alias que não resolve não precisa ser tentado de * novo dentro do mesmo processo. */ private readonly manifestCache; constructor(opts: ResolverOptions); /** Carrega aliases de core/skill-resolver.json (procura em baseDir e .agents). */ private loadAliases; get aliasCount(): number; /** Resolve o caminho real do arquivo SKILL.md de um alias. */ resolvePath(alias: string): string | null; /** Lê e parseia uma skill em SkillManifest. */ loadSkill(alias: string): { manifest: SkillManifest; file: string; } | null; /** Invalida o cache de manifestos (ex.: depois da Skill Factory gerar uma skill). */ clearCache(): void; private readSkill; /** * Ranking de skills para uma tarefa: relevância semântica (triggers + * description) + histórico de sucesso da memória. */ rankSkills(query: string, limit?: number): ResolvedSkill[]; /** Busca skills por termo (para `izanagi skill search`). */ search(query: string, limit?: number): SkillManifest[]; /** Lista todas as skills registradas com seus manifests. */ list(): SkillManifest[]; /** Carrega o genome de um agente (JSON) com enriquecimento default. */ loadAgent(agentId: string): { genome: import('../types.js').AgentGenome; file: string; } | null; /** Ranking otimizado com lazy-load e pruning por relevância e custo (Token Economy). */ rankAgents(query: string, agentIds: string[], limit?: number): CandidateScore[]; } /** Normaliza um JSON de agente legacy no formato AgentGenome (compatibilidade total). */ export declare function normalizeGenome(raw: Record, id: string): import('../types.js').AgentGenome; //# sourceMappingURL=resolver.d.ts.map