import { promises as fs } from "node:fs"; import path from "node:path"; export type SerenaSettingsStore = { loadBlockedTools: () => Promise; saveBlockedTools: (tools: string[]) => Promise; }; export const createSerenaSettingsStore = ( getProjectRoot: () => string, defaultBlockedToolNames: string[], ): SerenaSettingsStore => { const settingsPath = () => path.join(getProjectRoot(), ".pi", "settings.json"); const loadBlockedTools = async () => { try { const raw = await fs.readFile(settingsPath(), "utf8"); const json = JSON.parse(raw) as Record; const next = json?.serena?.blockedTools; if (Array.isArray(next) && next.every((name) => typeof name === "string")) { return next; } } catch (err: any) { if (err?.code !== "ENOENT") throw err; } return [...defaultBlockedToolNames]; }; const saveBlockedTools = async (tools: string[]) => { const settingsFile = settingsPath(); const dir = path.dirname(settingsFile); await fs.mkdir(dir, { recursive: true }); let json: Record = {}; try { const raw = await fs.readFile(settingsFile, "utf8"); json = JSON.parse(raw) as Record; } catch (err: any) { if (err?.code !== "ENOENT") throw err; } json.serena = { ...(json.serena ?? {}), blockedTools: tools }; await fs.writeFile(settingsFile, `${JSON.stringify(json, null, 2)}\n`, "utf8"); }; return { loadBlockedTools, saveBlockedTools }; };