Phase 14: B-002 pre-fix RPC repro — filter snapshots and readSettings fix

RPC E2E with debug shows registered present at session_compact but planned=[]
because kept still contains the skill block; registered=[] still drops skills
absent from kept. Sync file readSettings avoids RPC hook deadlock on
SettingsManager/isProjectTrusted.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-17 15:21:53 +07:00
parent 8f48040eac
commit ef9b7a8c30
6 changed files with 333 additions and 11 deletions
+8 -9
View File
@@ -1,5 +1,5 @@
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
import { SettingsManager, getAgentDir } from "@earendil-works/pi-coding-agent";
import { getAgentDir } from "@earendil-works/pi-coding-agent";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
import { dirname, join } from "path";
import type { AutoCompactIntegration } from "./state";
@@ -104,15 +104,14 @@ function extractSkillReinject(settings: object): PartialSkillReinjectSettings {
);
}
/** Merged global + project settings via Pi SettingsManager (SPEC §7.3). */
/** Merged global + project settings (SPEC §7.3). Sync file read; avoids SettingsManager / isProjectTrusted() blocking in RPC hooks. */
export function readSettings(ctx: ExtensionContext): SkillReinjectSettings {
const manager = SettingsManager.create(ctx.cwd, getAgentDir(), {
projectTrusted: ctx.isProjectTrusted(),
});
return mergeSkillReinjectSettings(
extractSkillReinject(manager.getGlobalSettings()),
extractSkillReinject(manager.getProjectSettings()),
);
const global = extractSkillReinject(readSettingsFile(join(getAgentDir(), "settings.json")));
const projectPath = join(ctx.cwd, ".pi/settings.json");
const project = existsSync(projectPath)
? extractSkillReinject(readSettingsFile(projectPath))
: {};
return mergeSkillReinjectSettings(global, project);
}
function readSettingsFile(settingsPath: string): Record<string, unknown> {