diff --git a/src/agents/pi-embedded-runner/extensions.ts b/src/agents/pi-embedded-runner/extensions.ts index 331359e84..5c7275ffa 100644 --- a/src/agents/pi-embedded-runner/extensions.ts +++ b/src/agents/pi-embedded-runner/extensions.ts @@ -79,6 +79,9 @@ export function buildEmbeddedExtensionPaths(params: { const compactionCfg = params.cfg?.agents?.defaults?.compaction; setCompactionSafeguardRuntime(params.sessionManager, { maxHistoryShare: compactionCfg?.maxHistoryShare, + // Provide model as fallback for when ctx.model is undefined + // (ExtensionRunner not initialized during direct compaction calls) + model: params.model, }); paths.push(resolvePiExtensionPath("compaction-safeguard")); } diff --git a/src/agents/pi-extensions/compaction-safeguard-runtime.ts b/src/agents/pi-extensions/compaction-safeguard-runtime.ts index f42cf7abe..b21d2b0ce 100644 --- a/src/agents/pi-extensions/compaction-safeguard-runtime.ts +++ b/src/agents/pi-extensions/compaction-safeguard-runtime.ts @@ -1,5 +1,13 @@ +import type { Model } from "@mariozechner/pi-ai"; + export type CompactionSafeguardRuntimeValue = { maxHistoryShare?: number; + /** + * Fallback model for compaction summarization. + * Used when ctx.model is undefined (ExtensionRunner not initialized). + */ + // biome-ignore lint/suspicious/noExplicitAny: Model API type varies by provider + model?: Model; }; // Session-scoped runtime registry keyed by object identity. diff --git a/src/agents/pi-extensions/compaction-safeguard.ts b/src/agents/pi-extensions/compaction-safeguard.ts index b2fe39884..2b9665af1 100644 --- a/src/agents/pi-extensions/compaction-safeguard.ts +++ b/src/agents/pi-extensions/compaction-safeguard.ts @@ -146,8 +146,15 @@ export default function compactionSafeguardExtension(api: ExtensionAPI): void { const toolFailureSection = formatToolFailuresSection(toolFailures); const fallbackSummary = `${FALLBACK_SUMMARY}${toolFailureSection}${fileOpsSummary}`; - const model = ctx.model; + // Use ctx.model if available, otherwise fall back to runtime.model + // (needed when ExtensionRunner is not initialized during direct compaction) + const runtime = getCompactionSafeguardRuntime(ctx.sessionManager); + const model = ctx.model ?? runtime?.model; if (!model) { + console.warn( + "Compaction safeguard: no model available (ctx.model and runtime.model both undefined). " + + "Returning fallback summary.", + ); return { compaction: { summary: fallbackSummary,