feat(plugins): wire up compaction hooks with summary data

- Extend PluginHookAfterCompactionEvent with summary, sessionId, sessionKey
- Call runBeforeCompaction before session.compact()
- Call runAfterCompaction after (fire-and-forget pattern)
- Enables memory plugins like Supermemory to store compacted summaries

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
hoverlover 2026-01-26 20:31:36 -06:00
parent b861a0bd73
commit 787dfa5279
2 changed files with 44 additions and 0 deletions

View File

@ -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,

View File

@ -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