From 23d580b6d250723def365caeb62d0a58ee7b3fb6 Mon Sep 17 00:00:00 2001 From: GRayHook Date: Wed, 17 Jun 2026 11:54:01 +0700 Subject: [PATCH] =?UTF-8?q?Phase=207:=20add=20planReinject=20=E2=80=94=20k?= =?UTF-8?q?ept-window=20and=20registration=20filter=20for=20post-compactio?= =?UTF-8?q?n=20skills.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Computes which tracked skills need re-inject after compaction by slicing the kept branch and excluding skills still present in kept user messages or unregistered on disk. Co-authored-by: Cursor --- src/reinject.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/reinject.ts diff --git a/src/reinject.ts b/src/reinject.ts new file mode 100644 index 0000000..b99f54a --- /dev/null +++ b/src/reinject.ts @@ -0,0 +1,39 @@ +import type { + ExtensionContext, + SessionCompactEvent, + Skill, +} from "@earendil-works/pi-coding-agent"; +import { + filterSkillsNeedingReinject, + getKeptEntries, + skillsPresentInKeptWindow, +} from "./kept.js"; +import type { SkillReinjectSettings } from "./settings.js"; +import type { ExtensionState } from "./state.js"; + +/** Names still registered in resourceLoader (SPEC §5.2). */ +export function registeredSkillNames(skills: readonly Pick[]): ReadonlySet { + return new Set(skills.map((skill) => skill.name)); +} + +/** + * Skill names to re-inject after compaction: tracked, absent from kept window, still registered (SPEC §5.2). + * `registeredSkills` comes from resourceLoader — ExtensionContext has no getSkills(); wired in index.ts. + */ +export function planReinject( + state: ExtensionState, + _settings: SkillReinjectSettings, + ctx: ExtensionContext, + compactionEvent: SessionCompactEvent, + registeredSkills: readonly Pick[], +): string[] { + const branch = ctx.sessionManager.getBranch(); + const keptEntries = getKeptEntries(branch, compactionEvent.compactionEntry.firstKeptEntryId); + const trackedNames = state.skills.map((skill) => skill.name); + const keptPresent = skillsPresentInKeptWindow(keptEntries, trackedNames); + return filterSkillsNeedingReinject( + state.skills, + keptPresent, + registeredSkillNames(registeredSkills), + ); +}