From 0f06e0e45bccbf1c7413a9c26637cd830c496134 Mon Sep 17 00:00:00 2001 From: GRayHook Date: Wed, 17 Jun 2026 12:04:47 +0700 Subject: [PATCH] =?UTF-8?q?Phase=208:=20add=20shouldReinject=20gate=20and?= =?UTF-8?q?=20consume=20on=20session=5Fcompact=20=E2=80=94=20SPEC=20=C2=A7?= =?UTF-8?q?8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Evaluates enabled layer and compaction source, records lastCompactionSource, clears pending flag. Co-authored-by: Cursor --- src/compaction.ts | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/compaction.ts b/src/compaction.ts index 715f2a9..e2a20b2 100644 --- a/src/compaction.ts +++ b/src/compaction.ts @@ -1,4 +1,5 @@ -import type { CompactionSource } from "./state.js"; +import { effectiveEnabled, type SkillReinjectSettings } from "./settings.js"; +import type { CompactionSource, ExtensionState } from "./state.js"; /** Runtime compaction-source detection between input → before_compact → session_compact (SPEC §8). */ export interface CompactionRuntime { @@ -24,3 +25,34 @@ export function markAutoCompactionBeforeCompact(runtime: CompactionRuntime): voi runtime.pendingCompactionSource = "auto"; } } + +/** Gate re-inject on session_compact from enabled layer and compaction source (SPEC §8). */ +export function shouldReinjectAfterCompaction( + sessionOverride: boolean | null, + settings: SkillReinjectSettings, + runtime: CompactionRuntime, +): boolean { + if (!effectiveEnabled(sessionOverride, settings)) { + return false; + } + return ( + runtime.pendingCompactionSource === "auto" || + settings.reinjectOnManualCompaction + ); +} + +/** + * session_compact: evaluate gate, persist lastCompactionSource, clear pending (SPEC §8). + * Call before enqueueing deferred/immediate re-inject. + */ +export function consumeCompactionOnSessionCompact( + runtime: CompactionRuntime, + state: ExtensionState, + sessionOverride: boolean | null, + settings: SkillReinjectSettings, +): boolean { + const shouldReinject = shouldReinjectAfterCompaction(sessionOverride, settings, runtime); + state.lastCompactionSource = runtime.pendingCompactionSource; + runtime.pendingCompactionSource = null; + return shouldReinject; +}