From 8817f6706d4648dc04f7d2a62f84958c07d0b01f Mon Sep 17 00:00:00 2001 From: Shahil kadia <66136088+nexiouscaliver@users.noreply.github.com> Date: Thu, 29 Jan 2026 09:56:11 +0000 Subject: [PATCH] feat: add onCompactionStart callback to handle context compaction notifications --- src/agents/pi-embedded-runner/run.ts | 1 + src/agents/pi-embedded-runner/run/params.ts | 1 + src/auto-reply/reply/agent-runner-execution.ts | 7 +++++++ 3 files changed, 9 insertions(+) diff --git a/src/agents/pi-embedded-runner/run.ts b/src/agents/pi-embedded-runner/run.ts index 870453f38..a3ea34154 100644 --- a/src/agents/pi-embedded-runner/run.ts +++ b/src/agents/pi-embedded-runner/run.ts @@ -367,6 +367,7 @@ export async function runEmbeddedPiAgent( log.warn( `context overflow detected; attempting auto-compaction for ${provider}/${modelId}`, ); + await params.onCompactionStart?.(); overflowCompactionAttempted = true; const compactResult = await compactEmbeddedPiSessionDirect({ sessionId: params.sessionId, diff --git a/src/agents/pi-embedded-runner/run/params.ts b/src/agents/pi-embedded-runner/run/params.ts index b21a5e3fc..4151075e3 100644 --- a/src/agents/pi-embedded-runner/run/params.ts +++ b/src/agents/pi-embedded-runner/run/params.ts @@ -86,6 +86,7 @@ export type RunEmbeddedPiAgentParams = { onBlockReplyFlush?: () => void | Promise; blockReplyBreak?: "text_end" | "message_end"; blockReplyChunking?: BlockReplyChunking; + onCompactionStart?: () => void | Promise; onReasoningStream?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise; onToolResult?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise; onAgentEvent?: (evt: { stream: string; data: Record }) => void; diff --git a/src/auto-reply/reply/agent-runner-execution.ts b/src/auto-reply/reply/agent-runner-execution.ts index f86ecb8a9..c7a2b86ff 100644 --- a/src/auto-reply/reply/agent-runner-execution.ts +++ b/src/auto-reply/reply/agent-runner-execution.ts @@ -276,6 +276,13 @@ export async function runAgentTurnWithFallback(params: { abortSignal: params.opts?.abortSignal, blockReplyBreak: params.resolvedBlockStreamingBreak, blockReplyChunking: params.blockReplyChunking, + onCompactionStart: async () => { + if (params.opts?.onPartialReply) { + await params.opts.onPartialReply({ + text: "🧹 Compacting context, please wait...", + }); + } + }, onPartialReply: allowPartialStream ? async (payload) => { const textForTyping = await handlePartialForTyping(payload);