/**
* ContextConfigLoader - Loads and validates context configuration
*
* Handles loading settings from file with mode-based filtering for observation types.
*/
import path from 'path';
import { homedir } from 'os';
import { SettingsDefaultsManager } from '../../common/SettingsDefaultsManager.js';
import { ModeManager } from '../domain/ModeManager.js';
import type { ContextConfig } from './types.js';
/**
* Load all context configuration settings
* Priority: ~/.claude-recall/settings.json > env var > defaults
*/
export function loadContextConfig(): ContextConfig {
const settingsPath = path.join(homedir(), '.claude-recall', 'settings.json');
const settings = SettingsDefaultsManager.loadFromFile(settingsPath);
// For non-code modes, use all types/concepts from active mode instead of settings
const modeId = settings.CLAUDE_RECALL_MODE;
const isCodeMode = modeId === 'code' || modeId.startsWith('code--');
let observationTypes: Set<string>;
let observationConcepts: Set<string>;
if (isCodeMode) {
// Code mode: use settings-based filtering
observationTypes = new Set(
settings.CLAUDE_RECALL_CONTEXT_OBSERVATION_TYPES.split(',').map((t: string) => t.trim()).filter(Boolean)
);
observationConcepts = new Set(
settings.CLAUDE_RECALL_CONTEXT_OBSERVATION_CONCEPTS.split(',').map((c: string) => c.trim()).filter(Boolean)
);
} else {
// Non-code modes: use all types/concepts from active mode
const mode = ModeManager.getInstance().getActiveMode();
observationTypes = new Set(mode.observation_types.map(t => t.id));
observationConcepts = new Set(mode.observation_concepts.map(c => c.id));
}
return {
totalObservationCount: parseInt(settings.CLAUDE_RECALL_CONTEXT_OBSERVATIONS, 10),
fullObservationCount: parseInt(settings.CLAUDE_RECALL_CONTEXT_FULL_COUNT, 10),
sessionCount: parseInt(settings.CLAUDE_RECALL_CONTEXT_SESSION_COUNT, 10),
showReadTokens: settings.CLAUDE_RECALL_CONTEXT_SHOW_READ_TOKENS === 'true',
showWorkTokens: settings.CLAUDE_RECALL_CONTEXT_SHOW_WORK_TOKENS === 'true',
showSavingsAmount: settings.CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_AMOUNT === 'true',
showSavingsPercent: settings.CLAUDE_RECALL_CONTEXT_SHOW_SAVINGS_PERCENT === 'true',
observationTypes,
observationConcepts,
fullObservationField: settings.CLAUDE_RECALL_CONTEXT_FULL_FIELD as 'narrative' | 'facts',
showLastSummary: settings.CLAUDE_RECALL_CONTEXT_SHOW_LAST_SUMMARY === 'true',
showLastMessage: settings.CLAUDE_RECALL_CONTEXT_SHOW_LAST_MESSAGE === 'true',
};
}