export interface QuietToolsConfig { enabled: boolean; maxChars: number; maxLines: number; headLines: number; tailLines: number; errorHeadLines: number; errorTailLines: number; artifactDir: string; indexFile: string; compactRead: boolean; compactBash: boolean; compactSubagent: boolean; readDefaultLimit: number; } export interface QuietToolsState { enabled: boolean; bypassNext: boolean; } function boolEnv(name: string, fallback: boolean): boolean { const value = process.env[name]; if (value === undefined || value === "") return fallback; return ["1", "true", "yes", "on"].includes(value.toLowerCase()); } function intEnv(name: string, fallback: number): number { const value = process.env[name]; if (value === undefined || value === "") return fallback; const parsed = Number.parseInt(value, 10); return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback; } export function loadConfig(): QuietToolsConfig { return { enabled: boolEnv("QUIET_TOOLS_ENABLED", true), maxChars: intEnv("QUIET_TOOLS_MAX_CHARS", 12000), maxLines: intEnv("QUIET_TOOLS_MAX_LINES", 240), headLines: intEnv("QUIET_TOOLS_HEAD_LINES", 100), tailLines: intEnv("QUIET_TOOLS_TAIL_LINES", 60), errorHeadLines: intEnv("QUIET_TOOLS_ERROR_HEAD_LINES", 160), errorTailLines: intEnv("QUIET_TOOLS_ERROR_TAIL_LINES", 120), artifactDir: process.env.QUIET_TOOLS_ARTIFACT_DIR || ".pi/quiet-tools/outputs", indexFile: process.env.QUIET_TOOLS_INDEX || ".pi/quiet-tools/index.jsonl", compactRead: boolEnv("QUIET_TOOLS_COMPACT_READ", true), compactBash: boolEnv("QUIET_TOOLS_COMPACT_BASH", true), compactSubagent: boolEnv("QUIET_TOOLS_COMPACT_SUBAGENT", true), readDefaultLimit: intEnv("QUIET_TOOLS_READ_DEFAULT_LIMIT", 120), }; }