import { readFileSync } from 'fs' import { join } from 'path' import type { SpendingTier } from './types' import { updateSpendingTiers } from './types' export interface TriageConfig { scoreBands?: Array<{ name: string min: number dailyLimit: number perTxLimit: number color?: string }> warningThreshold?: number xmtp?: { enabled: boolean } worldId?: { enabled: boolean } webBotAuth?: { enabled: boolean } networkScore?: { enabled: boolean } scoring?: { overrideBoost?: number maxFrequencyPenalty?: number inactivityDecayRate?: number } port?: number dashboardEnabled?: boolean } const DEFAULT_CONFIG: Required = { scoreBands: [ { name: 'Sovereign', min: 80, dailyLimit: 1000, perTxLimit: 500, color: '#fff8e1' }, { name: 'Trusted', min: 60, dailyLimit: 200, perTxLimit: 100, color: '#ffd700' }, { name: 'Building', min: 40, dailyLimit: 50, perTxLimit: 25, color: '#4caf50' }, { name: 'Cautious', min: 20, dailyLimit: 10, perTxLimit: 5, color: '#00bcd4' }, { name: 'Restricted', min: 1, dailyLimit: 2, perTxLimit: 1, color: '#2196f3' }, { name: 'Frozen', min: 0, dailyLimit: 0, perTxLimit: 0, color: '#1a1a4e' }, ], warningThreshold: 0.8, xmtp: { enabled: true }, worldId: { enabled: true }, webBotAuth: { enabled: true }, networkScore: { enabled: true }, scoring: { overrideBoost: 3, maxFrequencyPenalty: 10, inactivityDecayRate: 0.5 }, port: 4021, dashboardEnabled: true, } let _config: Required = { ...DEFAULT_CONFIG } export function loadConfig(configPath?: string): Required { const path = configPath || process.env.TRIAGE_CONFIG_PATH || join(process.cwd(), 'triage.config.json') try { const raw = readFileSync(path, 'utf-8') const parsed = JSON.parse(raw) as TriageConfig _config = { ...DEFAULT_CONFIG, ...parsed, xmtp: { ...DEFAULT_CONFIG.xmtp, ...parsed.xmtp }, worldId: { ...DEFAULT_CONFIG.worldId, ...parsed.worldId }, webBotAuth: { ...DEFAULT_CONFIG.webBotAuth, ...parsed.webBotAuth }, networkScore: { ...DEFAULT_CONFIG.networkScore, ...parsed.networkScore }, scoring: { ...DEFAULT_CONFIG.scoring, ...parsed.scoring }, } if (parsed.scoreBands) { _config.scoreBands = parsed.scoreBands updateSpendingTiers(parsed.scoreBands.map(b => ({ name: b.name as SpendingTier['name'], color: b.color || '#666', dailyLimit: b.dailyLimit, perTxLimit: b.perTxLimit, minScore: b.min, }))) } console.log(`[Config] Loaded from ${path}`) } catch { console.log('[Config] No triage.config.json found — using defaults') } return _config } export function getConfig(): Required { return _config }