diff --git a/src/agents/pi-embedded-runner/compact.ts b/src/agents/pi-embedded-runner/compact.ts index 2daafd086..206e32728 100644 --- a/src/agents/pi-embedded-runner/compact.ts +++ b/src/agents/pi-embedded-runner/compact.ts @@ -69,6 +69,7 @@ import type { EmbeddedPiCompactResult } from "./types.js"; import { formatUserTime, resolveUserTimeFormat, resolveUserTimezone } from "../date-time.js"; import { describeUnknownError, mapThinkingLevel, resolveExecToolDefaults } from "./utils.js"; import { buildTtsSystemPromptHint } from "../../tts/tts.js"; +import { getGlobalHookRunner } from "../../plugins/hook-runner-global.js"; export type CompactEmbeddedPiSessionParams = { sessionId: string; @@ -424,6 +425,22 @@ export async function compactEmbeddedPiSessionDirect( if (limited.length > 0) { session.agent.replaceMessages(limited); } + + // Run before_compaction hooks + const hookRunner = getGlobalHookRunner(); + const messageCountBefore = session.messages.length; + if (hookRunner?.hasHooks("before_compaction")) { + await hookRunner.runBeforeCompaction( + { messageCount: messageCountBefore, tokenCount: undefined }, + { + agentId: sessionAgentId, + sessionKey: params.sessionKey, + workspaceDir: effectiveWorkspace, + messageProvider: runtimeChannel, + }, + ); + } + const result = await session.compact(params.customInstructions); // Estimate tokens after compaction by summing token estimates for remaining messages let tokensAfter: number | undefined; @@ -440,6 +457,27 @@ export async function compactEmbeddedPiSessionDirect( // If estimation fails, leave tokensAfter undefined tokensAfter = undefined; } + + // Run after_compaction hooks (fire-and-forget) + if (hookRunner?.hasHooks("after_compaction")) { + void hookRunner.runAfterCompaction( + { + messageCount: session.messages.length, + tokenCount: tokensAfter, + compactedCount: messageCountBefore - session.messages.length, + summary: result.summary, + sessionId: params.sessionId, + sessionKey: params.sessionKey, + }, + { + agentId: sessionAgentId, + sessionKey: params.sessionKey, + workspaceDir: effectiveWorkspace, + messageProvider: runtimeChannel, + }, + ); + } + return { ok: true, compacted: true, diff --git a/src/plugins/types.ts b/src/plugins/types.ts index 1ce9731ea..64c2b3b92 100644 --- a/src/plugins/types.ts +++ b/src/plugins/types.ts @@ -339,6 +339,12 @@ export type PluginHookAfterCompactionEvent = { messageCount: number; tokenCount?: number; compactedCount: number; + /** Compacted summary text - essential for memory plugins */ + summary: string; + /** Session identifier */ + sessionId?: string; + /** Session key for context */ + sessionKey?: string; }; // Message context