This commit is contained in:
Chad Boyd 2026-01-29 21:53:34 -05:00 committed by GitHub
commit b8b16b3c36
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 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 { formatUserTime, resolveUserTimeFormat, resolveUserTimezone } from "../date-time.js";
import { describeUnknownError, mapThinkingLevel, resolveExecToolDefaults } from "./utils.js"; import { describeUnknownError, mapThinkingLevel, resolveExecToolDefaults } from "./utils.js";
import { buildTtsSystemPromptHint } from "../../tts/tts.js"; import { buildTtsSystemPromptHint } from "../../tts/tts.js";
import { getGlobalHookRunner } from "../../plugins/hook-runner-global.js";
export type CompactEmbeddedPiSessionParams = { export type CompactEmbeddedPiSessionParams = {
sessionId: string; sessionId: string;
@ -424,6 +425,22 @@ export async function compactEmbeddedPiSessionDirect(
if (limited.length > 0) { if (limited.length > 0) {
session.agent.replaceMessages(limited); 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); const result = await session.compact(params.customInstructions);
// Estimate tokens after compaction by summing token estimates for remaining messages // Estimate tokens after compaction by summing token estimates for remaining messages
let tokensAfter: number | undefined; let tokensAfter: number | undefined;
@ -440,6 +457,27 @@ export async function compactEmbeddedPiSessionDirect(
// If estimation fails, leave tokensAfter undefined // If estimation fails, leave tokensAfter undefined
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 { return {
ok: true, ok: true,
compacted: true, compacted: true,

View File

@ -371,3 +371,6 @@ export type { ProcessedLineMessage } from "../line/markdown-to-line.js";
// Media utilities // Media utilities
export { loadWebMedia, type WebMediaResult } from "../web/media.js"; export { loadWebMedia, type WebMediaResult } from "../web/media.js";
// Chat sanitization utilities
export { stripEnvelope } from "../gateway/chat-sanitize.js";

View File

@ -339,6 +339,12 @@ export type PluginHookAfterCompactionEvent = {
messageCount: number; messageCount: number;
tokenCount?: number; tokenCount?: number;
compactedCount: number; compactedCount: number;
/** Compacted summary text - essential for memory plugins */
summary: string;
/** Session identifier */
sessionId?: string;
/** Session key for context */
sessionKey?: string;
}; };
// Message context // Message context