{"version":3,"file":"handler.mjs","names":["streamSimpleDefault"],"sources":["../../src/compaction/handler.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { completeSimple, streamSimple as streamSimpleDefault } from '@earendil-works/pi-ai';\nimport type { SessionBeforeCompactEvent } from '@earendil-works/pi-coding-agent';\n\nimport { appendCompactionAttemptEntry } from '@live-compaction/attempt-entry';\nimport { summarizeWithResolvedModel } from '@live-compaction/compaction/orchestrator';\nimport {\n\tboundTaskStateBlock,\n\tmakeSummaryProgress,\n\tnotify,\n} from '@live-compaction/compaction/progress';\nimport { buildSuccessResult } from '@live-compaction/compaction/result';\nimport {\n\tCURRENT_PRESET_SENTINEL,\n\tloadEffectiveBranchSummaryPromptContract,\n\tloadEffectiveCompactionPromptContract,\n\tloadEffectiveConfig,\n\tnormalizeOptionalText,\n\tresolveLiveCompactionPaths,\n} from '@live-compaction/config';\nimport { isAbortError } from '@live-compaction/errors';\nimport {\n\tcollectFilesTouched,\n\trenderFilesTouchedManifestBlock,\n} from '@live-compaction/files-touched';\nimport {\n\tdescribeConfiguredFallback,\n\tdescribePresetFallback,\n\tparseCompactInstructions,\n\tresolveConfiguredFallbackSummarizer,\n\tresolveDefaultSummarizer,\n\tresolvePresetSummarizer,\n} from '@live-compaction/preset';\nimport { loadCompactionTemplate } from '@live-compaction/template';\nimport type {\n\tHookContext,\n\tLiveCompactionDetails,\n\tResolvedSummarizer,\n\tRunDeps,\n} from '@live-compaction/types';\nimport { safeUI } from '@live-compaction/types';\n\nexport const DEFAULT_DEPS: RunDeps = {\n\tcomplete: completeSimple,\n\tstreamSimple: streamSimpleDefault,\n\tcollectFilesTouched,\n\tloadConfig: loadEffectiveConfig,\n\tloadCompactionPrompt: loadEffectiveCompactionPromptContract,\n\tloadBranchSummaryPrompt: loadEffectiveBranchSummaryPromptContract,\n\tloadCompactionTemplate,\n\tresolvePaths: resolveLiveCompactionPaths,\n};\n\n// Re-export for external consumers (index.ts, tests)\nexport { fetchTaskStateSnapshot } from '@live-compaction/compaction/progress';\n\nexport async function runLiveCompaction(\n\tevent: SessionBeforeCompactEvent,\n\tctx: HookContext,\n\tdeps: RunDeps = DEFAULT_DEPS,\n): Promise<\n\t| {\n\t\t\tcompaction: {\n\t\t\t\tsummary: string;\n\t\t\t\tfirstKeptEntryId: string;\n\t\t\t\ttokensBefore: number;\n\t\t\t\tdetails: LiveCompactionDetails;\n\t\t\t};\n\t  }\n\t| { cancel: true }\n\t| undefined\n> {\n\tconst safeCtx: HookContext = { ...ctx, ui: safeUI(ctx) };\n\ttry {\n\t\tconst config = await deps.loadConfig(safeCtx.cwd);\n\t\tconst promptContract = await deps.loadCompactionPrompt(safeCtx.cwd);\n\t\tconst parsedInstructions = parseCompactInstructions(event.customInstructions);\n\n\t\tconst paths = deps.resolvePaths(safeCtx.cwd);\n\t\tconst attemptId = randomUUID();\n\t\tconst attemptMetadata = {\n\t\t\tfocusInput: event.customInstructions,\n\t\t\tfocusText: parsedInstructions.focusText,\n\t\t\tpresetQuery: parsedInstructions.presetQuery,\n\t\t\tattemptId,\n\t\t};\n\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, {\n\t\t\tevent: 'start',\n\t\t\tfocusInput: event.customInstructions,\n\t\t\tfocusText: parsedInstructions.focusText,\n\t\t\tpresetQuery: parsedInstructions.presetQuery,\n\t\t\ttokensBefore: event.preparation.tokensBefore,\n\t\t\tfirstKeptEntryId: event.preparation.firstKeptEntryId,\n\t\t});\n\t\tconst templatePath = paths.project?.compactionPromptPath ?? paths.global.compactionPromptPath;\n\t\tlet template = null;\n\t\ttry {\n\t\t\ttemplate = await deps.loadCompactionTemplate(templatePath);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tnotify(\n\t\t\t\tsafeCtx,\n\t\t\t\t`Failed to load compaction template ${templatePath}: ${message}. Falling back to default block layout.`,\n\t\t\t\t'warning',\n\t\t\t);\n\t\t\ttemplate = null;\n\t\t}\n\t\tconst notifyHook = (message: string, level: Parameters<typeof notify>[2]) =>\n\t\t\tnotify(safeCtx, message, level);\n\t\tconst progress = deps.makeProgress?.(safeCtx) ?? makeSummaryProgress(safeCtx);\n\n\t\tif (template?.frontmatter.preset && !parsedInstructions.usesPresetDirective) {\n\t\t\tparsedInstructions.usesPresetDirective = true;\n\t\t\tparsedInstructions.presetQuery = template.frontmatter.preset;\n\t\t}\n\n\t\tlet effectiveConfig = config;\n\t\tif (config.inheritSessionModel && !parsedInstructions.usesPresetDirective) {\n\t\t\teffectiveConfig = { ...config, defaultPreset: CURRENT_PRESET_SENTINEL };\n\t\t}\n\n\t\tconst filesTouchedBlock = config.includeFilesTouched.inCompactionSummary\n\t\t\t? renderFilesTouchedManifestBlock(\n\t\t\t\t\tdeps.collectFilesTouched(event.branchEntries, safeCtx.cwd),\n\t\t\t\t) || undefined\n\t\t\t: undefined;\n\n\t\tconst taskStateBlock = boundTaskStateBlock(await deps.fetchTaskState?.());\n\t\tconst previousSummary = normalizeOptionalText(event.preparation.previousSummary);\n\n\t\t// --- Preset path: explicit --preset in /compact args ---\n\t\tlet skipDefaultPreset = false;\n\t\tif (parsedInstructions.usesPresetDirective && parsedInstructions.presetQuery) {\n\t\t\ttry {\n\t\t\t\tconst summarizer: ResolvedSummarizer =\n\t\t\t\t\tparsedInstructions.presetQuery === CURRENT_PRESET_SENTINEL\n\t\t\t\t\t\t? await resolveDefaultSummarizer(safeCtx, event.branchEntries)\n\t\t\t\t\t\t: await resolvePresetSummarizer(safeCtx, config, parsedInstructions.presetQuery);\n\t\t\t\tconst summary = await summarizeWithResolvedModel(\n\t\t\t\t\t{\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\ttemplate,\n\t\t\t\t\t\tpromptContract,\n\t\t\t\t\t\tsummarizer,\n\t\t\t\t\t\tfocusText: parsedInstructions.focusText,\n\t\t\t\t\t\tfocusInput: event.customInstructions,\n\t\t\t\t\t\tpreviousSummary,\n\t\t\t\t\t\tfilesTouchedBlock,\n\t\t\t\t\t\ttaskStateBlock,\n\t\t\t\t\t\tattemptId,\n\t\t\t\t\t\tnotify: notifyHook,\n\t\t\t\t\t\tprogress,\n\t\t\t\t\t},\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprogress?.finish();\n\t\t\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, {\n\t\t\t\t\tevent: 'success',\n\t\t\t\t\tsummaryChars: summary.length,\n\t\t\t\t});\n\t\t\t\treturn buildSuccessResult(event, summary, summarizer, attemptMetadata);\n\t\t\t} catch (error) {\n\t\t\t\tprogress?.finish();\n\t\t\t\tif (isAbortError(error)) {\n\t\t\t\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, { event: 'aborted' });\n\t\t\t\t\treturn { cancel: true };\n\t\t\t\t}\n\t\t\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, {\n\t\t\t\t\tevent: 'preset_failed',\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\tnotify(\n\t\t\t\t\tsafeCtx,\n\t\t\t\t\t`Preset compaction failed (${describePresetFallback(error)}). Falling back to ${describeConfiguredFallback(config)}.`,\n\t\t\t\t\t'warning',\n\t\t\t\t);\n\t\t\t\tskipDefaultPreset = true;\n\t\t\t}\n\t\t} else if (parsedInstructions.usesPresetDirective) {\n\t\t\tnotify(\n\t\t\t\tsafeCtx,\n\t\t\t\t`Malformed preset directive. Falling back to ${describeConfiguredFallback(config)}.`,\n\t\t\t\t'warning',\n\t\t\t);\n\t\t\tskipDefaultPreset = true;\n\t\t}\n\n\t\t// --- Default path: configured default preset or session model ---\n\t\ttry {\n\t\t\tlet summarizer: ResolvedSummarizer;\n\n\t\t\tif (skipDefaultPreset) {\n\t\t\t\tsummarizer = await resolveConfiguredFallbackSummarizer(\n\t\t\t\t\tsafeCtx,\n\t\t\t\t\teffectiveConfig,\n\t\t\t\t\tevent.branchEntries,\n\t\t\t\t\tparsedInstructions.presetQuery,\n\t\t\t\t);\n\t\t\t} else if (effectiveConfig.defaultPreset === CURRENT_PRESET_SENTINEL) {\n\t\t\t\tsummarizer = await resolveDefaultSummarizer(safeCtx, event.branchEntries);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tsummarizer = await resolvePresetSummarizer(\n\t\t\t\t\t\tsafeCtx,\n\t\t\t\t\t\teffectiveConfig,\n\t\t\t\t\t\teffectiveConfig.defaultPreset,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (isAbortError(error)) return { cancel: true };\n\t\t\t\t\tnotify(\n\t\t\t\t\t\tsafeCtx,\n\t\t\t\t\t\t`Default preset '${effectiveConfig.defaultPreset}' failed (${describePresetFallback(error)}). Falling back to ${describeConfiguredFallback(effectiveConfig)}.`,\n\t\t\t\t\t\t'warning',\n\t\t\t\t\t);\n\t\t\t\t\tsummarizer = await resolveConfiguredFallbackSummarizer(\n\t\t\t\t\t\tsafeCtx,\n\t\t\t\t\t\teffectiveConfig,\n\t\t\t\t\t\tevent.branchEntries,\n\t\t\t\t\t\teffectiveConfig.defaultPreset,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst summary = await summarizeWithResolvedModel(\n\t\t\t\t{\n\t\t\t\t\tevent,\n\t\t\t\t\ttemplate,\n\t\t\t\t\tpromptContract,\n\t\t\t\t\tsummarizer,\n\t\t\t\t\tfocusText: parsedInstructions.focusText,\n\t\t\t\t\tfocusInput: event.customInstructions,\n\t\t\t\t\tpreviousSummary,\n\t\t\t\t\tfilesTouchedBlock,\n\t\t\t\t\ttaskStateBlock,\n\t\t\t\t\tattemptId,\n\t\t\t\t\tnotify: notifyHook,\n\t\t\t\t\tprogress,\n\t\t\t\t},\n\t\t\t\tdeps,\n\t\t\t);\n\t\t\tprogress?.finish();\n\t\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, {\n\t\t\t\tevent: 'success',\n\t\t\t\tsummaryChars: summary.length,\n\t\t\t});\n\t\t\treturn buildSuccessResult(event, summary, summarizer, attemptMetadata);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error)) {\n\t\t\t\tprogress?.finish();\n\t\t\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, { event: 'aborted' });\n\t\t\t\treturn { cancel: true };\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tprogress?.fail(message);\n\t\t\tappendCompactionAttemptEntry(deps.appendEntry, attemptId, {\n\t\t\t\tevent: 'failed',\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\tnotify(safeCtx, `Grounded compaction failed: ${message}`, 'warning');\n\t\t\treturn parsedInstructions.usesPresetDirective ? { cancel: true } : undefined;\n\t\t}\n\t} catch (error) {\n\t\tif (isAbortError(error) || event.signal.aborted) return { cancel: true };\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tnotify(safeCtx, `Grounded compaction failed: ${message}`, 'warning');\n\t\tconst parsedInstructions = parseCompactInstructions(event.customInstructions);\n\t\treturn parsedInstructions.usesPresetDirective ? { cancel: true } : undefined;\n\t}\n}\n"],"mappings":"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"}