/** * Converts a verified crystallization draft into a `SkillRow` ready for * insertion via `repos.skills`. * * Structured fields live in `procedureJson` so the viewer can render every * facet without parsing `invocationGuide`. The invocation guide itself is a * deterministic markdown render of the draft โ€” it's what the retrieval * injector hands to the agent's prompt. * * We also compute the skill embedding here (summary + steps + policy * `trigger`) so Tier-1 retrieval is vector-ready. */ import type { Embedder } from "../embedding/types.js"; import type { Logger } from "../logger/types.js"; import type { EpisodeId, PolicyRow, SkillRow, TraceId, WorldModelId } from "../types.js"; import type { SkillConfig, SkillCrystallizationDraft } from "./types.js"; export interface PackagerInput { draft: SkillCrystallizationDraft; policy: PolicyRow; evidenceEpisodeIds: EpisodeId[]; /** * V7 ยง2.1 `evidence_anchors` โ€” the L1 trace ids that justified this * skill at crystallisation time. Persisted onto the skill so the * viewer can render click-through chips back to MemoriesView and * future audits don't have to re-run `gatherEvidence()`. * * Best-first ordering (matches `gatherEvidence` output). Capped to * `EVIDENCE_ANCHORS_CAP` ids in the packager โ€” keeps the column * small and the JSON roundtrip cheap. */ evidenceTraceIds?: TraceId[]; worldModelIds?: WorldModelId[]; /** When rebuilding, we keep the existing skill id + accumulated trials. */ existing?: SkillRow | null; } export interface PackagerDeps { embedder: Embedder | null; log: Logger; config: SkillConfig; } export interface PackagerResult { row: SkillRow; vecSource: string; freshMint: boolean; } /** * Shape the draft + policy into a `SkillRow`. Does not persist. */ export declare function buildSkillRow(input: PackagerInput, deps: PackagerDeps): Promise; //# sourceMappingURL=packager.d.ts.map