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
+6 -2
View File
@@ -35,8 +35,12 @@ export function notifyReinjectDiag(
phase: ReinjectDiagPhase,
snapshot: ReinjectDiagSnapshot,
): void {
if (!settings.debug || !ctx?.hasUI) {
if (!settings.debug) {
return;
}
ctx.ui.notify(`skill-reinject [${phase}]: ${JSON.stringify(snapshot)}`, "info");
const message = `skill-reinject [${phase}]: ${JSON.stringify(snapshot)}`;
console.error(message);
if (ctx?.hasUI) {
ctx.ui.notify(message, "info");
}
}
+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> {