/** * SettingsDefaultsManager * * Single source of truth for all default configuration values. * Provides methods to get defaults with optional environment variable overrides. */ import { readFileSync, existsSync } from 'fs'; import { DEFAULT_OBSERVATION_TYPES_STRING, DEFAULT_OBSERVATION_CONCEPTS_STRING } from '../../../constants/observation-metadata.js'; export interface SettingsDefaults { CLAUDE_MEM_MODEL: string; CLAUDE_MEM_CONTEXT_OBSERVATIONS: string; CLAUDE_MEM_WORKER_PORT: string; // Token Economics CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS: string; CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS: string; CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT: string; CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT: string; // Observation Filtering CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES: string; CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS: string; // Display Configuration CLAUDE_MEM_CONTEXT_FULL_COUNT: string; CLAUDE_MEM_CONTEXT_FULL_FIELD: string; CLAUDE_MEM_CONTEXT_SESSION_COUNT: string; // Feature Toggles CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY: string; CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE: string; } export class SettingsDefaultsManager { /** * Default values for all settings */ private static readonly DEFAULTS: SettingsDefaults = { CLAUDE_MEM_MODEL: 'claude-haiku-4-5', CLAUDE_MEM_CONTEXT_OBSERVATIONS: '50', CLAUDE_MEM_WORKER_PORT: '37777', // Token Economics CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS: 'true', CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS: 'true', CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT: 'true', CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT: 'true', // Observation Filtering CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES: DEFAULT_OBSERVATION_TYPES_STRING, CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS: DEFAULT_OBSERVATION_CONCEPTS_STRING, // Display Configuration CLAUDE_MEM_CONTEXT_FULL_COUNT: '5', CLAUDE_MEM_CONTEXT_FULL_FIELD: 'narrative', CLAUDE_MEM_CONTEXT_SESSION_COUNT: '10', // Feature Toggles CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY: 'true', CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE: 'false', }; /** * Get all defaults as an object */ static getAllDefaults(): SettingsDefaults { return { ...this.DEFAULTS }; } /** * Get a default value with optional environment variable override */ static get(key: keyof SettingsDefaults): string { return process.env[key] || this.DEFAULTS[key]; } /** * Get an integer default value with optional environment variable override */ static getInt(key: keyof SettingsDefaults): number { const value = this.get(key); return parseInt(value, 10); } /** * Get a boolean default value with optional environment variable override */ static getBool(key: keyof SettingsDefaults): boolean { const value = this.get(key); return value === 'true'; } /** * Load settings from file with fallback to defaults * Returns merged settings with defaults as fallback */ static loadFromFile(settingsPath: string): SettingsDefaults { if (!existsSync(settingsPath)) { return this.getAllDefaults(); } const settingsData = readFileSync(settingsPath, 'utf-8'); const settings = JSON.parse(settingsData); const env = settings.env || {}; // Merge file settings with defaults const result: SettingsDefaults = { ...this.DEFAULTS }; for (const key of Object.keys(this.DEFAULTS) as Array) { if (env[key] !== undefined) { result[key] = env[key]; } } return result; } }