{"version":3,"file":"orchestrator.mjs","names":[],"sources":["../../src/compaction/orchestrator.ts"],"sourcesContent":["import {\n\tconvertToLlm,\n\ttype SessionBeforeCompactEvent,\n\tserializeConversation,\n} from '@earendil-works/pi-coding-agent';\n\nimport { appendCompactionAttemptEntry } from '@live-compaction/attempt-entry';\nimport { collectKeptTailMessages } from '@live-compaction/compaction/result';\nimport { CompactionAbortedError } from '@live-compaction/errors';\nimport { sha256 } from '@live-compaction/preset';\nimport {\n\tbuildSummaryOptions,\n\tbuildSummaryRequestMessage,\n\tcompleteWithResolvedSummarizer,\n\tgetTextFromAssistantResponse,\n\tSYSTEM_PROMPT,\n\tstripLeakedInternals,\n} from '@live-compaction/summary';\nimport {\n\tbuildRenderVars,\n\ttype CompactionTemplate,\n\tgetBuiltInCompactionTemplate,\n} from '@live-compaction/template';\nimport type {\n\tNotifyLevel,\n\tPreparedMessages,\n\tResolvedSummarizer,\n\tRunDeps,\n\tSummaryProgress,\n} from '@live-compaction/types';\n\nexport async function executeSummaryCall(\n\tparams: {\n\t\tsummarizer: ResolvedSummarizer;\n\t\ttemplate: CompactionTemplate | null;\n\t\tpromptContract: string;\n\t\tdiscardedMessages: PreparedMessages;\n\t\tkeptTailMessages: PreparedMessages;\n\t\tpreviousSummary?: string;\n\t\tfocusText?: string;\n\t\tfocusInput?: string;\n\t\tfilesTouchedBlock?: string;\n\t\ttaskStateBlock?: string;\n\t\treserveTokens: number;\n\t\ttokensBefore: number;\n\t\tsignal: AbortSignal;\n\t\tattemptId?: string;\n\t\tnotify?: (message: string, level: NotifyLevel) => void;\n\t\tprogress?: SummaryProgress;\n\t},\n\tdeps: RunDeps,\n): Promise<string> {\n\tif (params.signal.aborted) {\n\t\tthrow new CompactionAbortedError();\n\t}\n\n\tconst discardedText =\n\t\tparams.discardedMessages.length > 0\n\t\t\t? serializeConversation(convertToLlm(params.discardedMessages))\n\t\t\t: '';\n\tconst keptTailText =\n\t\tparams.keptTailMessages.length > 0\n\t\t\t? serializeConversation(convertToLlm(params.keptTailMessages))\n\t\t\t: '';\n\n\tlet promptText: string | undefined;\n\n\tif (params.template) {\n\t\tconst vars = buildRenderVars({\n\t\t\tpreviousSummary: params.previousSummary,\n\t\t\tdiscardedText,\n\t\t\tkeptTailText,\n\t\t\ttaskStateBlock: params.taskStateBlock,\n\t\t\tfilesTouchedBlock: params.filesTouchedBlock,\n\t\t\tfocusText: params.focusText,\n\t\t\tfocusInput: params.focusInput,\n\t\t\tdiscardedMessages: convertToLlm(params.discardedMessages),\n\t\t\tkeptTailMessages: convertToLlm(params.keptTailMessages),\n\t\t\tfrontmatter: params.template.frontmatter,\n\t\t});\n\t\ttry {\n\t\t\tpromptText = params.template.render(vars as unknown as Record<string, unknown>);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tparams.notify?.(\n\t\t\t\t`Compaction template failed (${message}). Falling back to default block layout.`,\n\t\t\t\t'warning',\n\t\t\t);\n\t\t\tpromptText = undefined;\n\t\t}\n\t}\n\n\tif (!promptText) {\n\t\tconst fallback = getBuiltInCompactionTemplate();\n\t\tconst vars = buildRenderVars({\n\t\t\tpreviousSummary: params.previousSummary,\n\t\t\tdiscardedText,\n\t\t\tkeptTailText,\n\t\t\ttaskStateBlock: params.taskStateBlock,\n\t\t\tfilesTouchedBlock: params.filesTouchedBlock,\n\t\t\tfocusText: params.focusText,\n\t\t\tfocusInput: params.focusInput,\n\t\t\tdiscardedMessages: convertToLlm(params.discardedMessages),\n\t\t\tkeptTailMessages: convertToLlm(params.keptTailMessages),\n\t\t\tfrontmatter: fallback.frontmatter,\n\t\t});\n\t\tpromptText = fallback.render(vars as unknown as Record<string, unknown>);\n\t}\n\n\tconst options = buildSummaryOptions({\n\t\tsummarizer: params.summarizer,\n\t\treserveTokens: params.reserveTokens,\n\t\tsignal: params.signal,\n\t});\n\n\tappendCompactionAttemptEntry(deps.appendEntry, params.attemptId, {\n\t\tevent: 'request_rendered',\n\t\tmodel: `${params.summarizer.model.provider}/${params.summarizer.model.id}`,\n\t\tthinkingLevel: params.summarizer.reasoningLevel,\n\t\tfocusInput: params.focusInput,\n\t\tfocusText: params.focusText,\n\t\tpromptChars: promptText.length,\n\t\trenderedPromptChars: promptText.length,\n\t\tsystemPromptChars: SYSTEM_PROMPT.length,\n\t\trenderedPromptSha256: sha256(promptText),\n\t\tsystemPromptSha256: sha256(SYSTEM_PROMPT),\n\t\trenderedPrompt: promptText,\n\t\tsystemPrompt: SYSTEM_PROMPT,\n\t\tdiscardedMessages: params.discardedMessages.length,\n\t\tkeptTailMessages: params.keptTailMessages.length,\n\t\ttaskStateChars: params.taskStateBlock?.length ?? 0,\n\t\ttokensBefore: params.tokensBefore,\n\t\ttransport: options.transport,\n\t});\n\n\tconst response = await completeWithResolvedSummarizer(\n\t\tparams.summarizer,\n\t\t{\n\t\t\tsystemPrompt: SYSTEM_PROMPT,\n\t\t\tmessages: [buildSummaryRequestMessage(promptText)],\n\t\t},\n\t\toptions,\n\t\tdeps,\n\t\tparams.progress,\n\t\tparams.tokensBefore,\n\t);\n\n\tif (params.signal.aborted || response.stopReason === 'aborted') {\n\t\tthrow new CompactionAbortedError();\n\t}\n\n\tconst recoveredDiagnostic = response.diagnostics?.find(\n\t\t(diagnostic) => diagnostic.type === 'live-compaction-stream-recovered',\n\t);\n\tif (recoveredDiagnostic) {\n\t\tappendCompactionAttemptEntry(deps.appendEntry, params.attemptId, {\n\t\t\tevent: 'stream_recovered',\n\t\t\terror: recoveredDiagnostic.error,\n\t\t\trecoveredChars: getTextFromAssistantResponse(response).length,\n\t\t});\n\t}\n\n\tif (response.stopReason === 'error') {\n\t\tthrow new Error(response.errorMessage || 'Summarization failed');\n\t}\n\n\tconst text = getTextFromAssistantResponse(response);\n\tif (!text) {\n\t\tthrow new Error('Summarization returned empty output');\n\t}\n\n\treturn stripLeakedInternals(text);\n}\n\nexport async function summarizeWithResolvedModel(\n\tparams: {\n\t\tevent: SessionBeforeCompactEvent;\n\t\ttemplate: CompactionTemplate | null;\n\t\tpromptContract: string;\n\t\tsummarizer: ResolvedSummarizer;\n\t\tfocusText?: string;\n\t\tfocusInput?: string;\n\t\tpreviousSummary?: string;\n\t\tfilesTouchedBlock?: string;\n\t\ttaskStateBlock?: string;\n\t\tattemptId?: string;\n\t\tnotify?: (message: string, level: NotifyLevel) => void;\n\t\tprogress?: SummaryProgress;\n\t},\n\tdeps: RunDeps,\n): Promise<string> {\n\tconst {\n\t\tevent,\n\t\ttemplate,\n\t\tpromptContract,\n\t\tsummarizer,\n\t\tfocusText,\n\t\tfocusInput,\n\t\tpreviousSummary,\n\t\tfilesTouchedBlock,\n\t\ttaskStateBlock,\n\t} = params;\n\n\tconst discardedMessages: PreparedMessages = [\n\t\t...event.preparation.messagesToSummarize,\n\t\t...event.preparation.turnPrefixMessages,\n\t];\n\n\tconst keptTailMessages = collectKeptTailMessages(\n\t\tevent.branchEntries,\n\t\tevent.preparation.firstKeptEntryId,\n\t);\n\n\treturn executeSummaryCall(\n\t\t{\n\t\t\tsummarizer,\n\t\t\ttemplate,\n\t\t\tpromptContract,\n\t\t\tdiscardedMessages,\n\t\t\tkeptTailMessages,\n\t\t\tpreviousSummary,\n\t\t\tfocusText,\n\t\t\tfocusInput,\n\t\t\tfilesTouchedBlock,\n\t\t\ttaskStateBlock,\n\t\t\treserveTokens: event.preparation.settings.reserveTokens,\n\t\t\ttokensBefore: event.preparation.tokensBefore,\n\t\t\tsignal: event.signal,\n\t\t\tattemptId: params.attemptId,\n\t\t\tnotify: params.notify,\n\t\t\tprogress: params.progress,\n\t\t},\n\t\tdeps,\n\t);\n}\n"],"mappings":"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"}