{"version":3,"file":"summarizer.mjs","names":[],"sources":["../../src/preset/summarizer.ts"],"sourcesContent":["import type { SessionEntry } from '@earendil-works/pi-coding-agent';\n\nimport {\n\tCURRENT_PRESET_SENTINEL,\n\ttype LiveCompactionConfig,\n\tnormalizeThinkingLevel,\n\ttype ThinkingLevel,\n} from '@live-compaction/config';\nimport { CompactionAbortedError } from '@live-compaction/errors';\nimport { resolvePresetMatch } from '@live-compaction/preset/matching';\nimport type { HookContext, ResolvedSummarizer, StreamSimple } from '@live-compaction/types';\n\nexport function getEffectiveThinkingLevel(branchEntries: SessionEntry[]): ThinkingLevel {\n\tfor (let i = branchEntries.length - 1; i >= 0; i--) {\n\t\tconst entry = branchEntries[i];\n\t\tif (entry.type === 'thinking_level_change') {\n\t\t\tconst level = normalizeThinkingLevel(entry.thinkingLevel);\n\t\t\tif (level) {\n\t\t\t\treturn level;\n\t\t\t}\n\t\t}\n\t}\n\treturn 'off';\n}\n\nfunction parseProviderModel(value: string): { provider: string; modelId: string } {\n\tconst slashIndex = value.indexOf('/');\n\tif (slashIndex < 0) {\n\t\tthrow new Error(`Invalid model format '${value}': expected 'provider/model-id'`);\n\t}\n\treturn {\n\t\tprovider: value.slice(0, slashIndex),\n\t\tmodelId: value.slice(slashIndex + 1),\n\t};\n}\n\nfunction getRegisteredStreamSimple(\n\tctx: HookContext,\n\tmodel: ResolvedSummarizer['model'],\n): StreamSimple | undefined {\n\tconst registry = ctx.modelRegistry as unknown as {\n\t\tregisteredProviders?: Map<string, { streamSimple?: StreamSimple }>;\n\t};\n\treturn registry.registeredProviders?.get(model.provider)?.streamSimple;\n}\n\nexport async function resolveDefaultSummarizer(\n\tctx: HookContext,\n\tbranchEntries: SessionEntry[],\n): Promise<ResolvedSummarizer> {\n\tconst model = ctx.model;\n\tif (!model) {\n\t\tthrow new CompactionAbortedError();\n\t}\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\tif (!auth.ok) {\n\t\tthrow new Error(`Auth failed for session model: ${auth.error}`);\n\t}\n\treturn {\n\t\tmodel,\n\t\tapiKey: auth.apiKey,\n\t\theaders: auth.headers,\n\t\treasoningLevel: getEffectiveThinkingLevel(branchEntries),\n\t\tstreamSimple: getRegisteredStreamSimple(ctx, model),\n\t};\n}\n\nexport async function resolvePresetSummarizer(\n\tctx: HookContext,\n\tconfig: LiveCompactionConfig,\n\tpresetQuery: string,\n): Promise<ResolvedSummarizer> {\n\tconst match = resolvePresetMatch(config, presetQuery);\n\n\tswitch (match.kind) {\n\t\tcase 'ambiguous':\n\t\t\tthrow new Error(`Ambiguous preset query '${presetQuery}': matches multiple presets`);\n\t\tcase 'unmatched':\n\t\t\tthrow new Error(`No preset matches '${presetQuery}'`);\n\t\tcase 'matched':\n\t\t\tbreak;\n\t}\n\n\tif (match.name === CURRENT_PRESET_SENTINEL || !match.preset) {\n\t\tconst model = ctx.model;\n\t\tif (!model) {\n\t\t\tthrow new CompactionAbortedError();\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) {\n\t\t\tthrow new Error(`Auth failed for session model: ${auth.error}`);\n\t\t}\n\t\treturn {\n\t\t\tmodel,\n\t\t\tapiKey: auth.apiKey,\n\t\t\theaders: auth.headers,\n\t\t\treasoningLevel: match.preset?.thinkingLevel,\n\t\t\tstreamSimple: getRegisteredStreamSimple(ctx, model),\n\t\t};\n\t}\n\n\tconst { provider, modelId } = parseProviderModel(match.preset.model);\n\tconst model = ctx.modelRegistry\n\t\t.getAll()\n\t\t.find(\n\t\t\t(m) =>\n\t\t\t\tm.provider.toLowerCase() === provider.toLowerCase() &&\n\t\t\t\tm.id.toLowerCase() === modelId.toLowerCase(),\n\t\t);\n\tif (!model) {\n\t\tthrow new Error(`Model '${match.preset.model}' not found in model registry`);\n\t}\n\n\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\tif (!auth.ok) {\n\t\tthrow new Error(`Auth failed for preset model '${match.preset.model}': ${auth.error}`);\n\t}\n\n\treturn {\n\t\tmodel,\n\t\tapiKey: auth.apiKey,\n\t\theaders: auth.headers,\n\t\treasoningLevel: match.preset.thinkingLevel,\n\t\tstreamSimple: getRegisteredStreamSimple(ctx, model),\n\t};\n}\n\nexport function describeConfiguredFallback(config: LiveCompactionConfig): string {\n\tif (config.fallbackPreset && config.fallbackPreset !== CURRENT_PRESET_SENTINEL) {\n\t\treturn `preset '${config.fallbackPreset}'`;\n\t}\n\treturn 'the current session model';\n}\n\nexport function describePresetFallback(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nexport async function resolveConfiguredFallbackSummarizer(\n\tctx: HookContext,\n\tconfig: LiveCompactionConfig,\n\tbranchEntries: SessionEntry[],\n\texcludedPreset?: string,\n): Promise<ResolvedSummarizer> {\n\tif (\n\t\tconfig.fallbackPreset &&\n\t\tconfig.fallbackPreset !== CURRENT_PRESET_SENTINEL &&\n\t\tconfig.fallbackPreset !== excludedPreset\n\t) {\n\t\treturn resolvePresetSummarizer(ctx, config, config.fallbackPreset);\n\t}\n\treturn resolveDefaultSummarizer(ctx, branchEntries);\n}\n"],"mappings":"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"}