(() => { const lineStyleSolid = window.LightweightCharts?.LineStyle?.Solid ?? 0; const modelOrder = Object.freeze(['kronos', 'timesfm', 'chronos']); const defaultLineWidth = 1; const modelLabels = Object.freeze({ kronos: 'Kronos', timesfm: 'TimesFM', chronos: 'Chronos', }); const defaultSelection = Object.freeze( Object.fromEntries(modelOrder.map((modelKey) => [modelKey, true])) ); const modelTonePalette = Object.freeze({ kronos: Object.freeze({ up: '#2563eb', flat: '#c2410c', down: '#b91c1c', }), timesfm: Object.freeze({ up: '#16a34a', flat: '#eab308', down: '#ef4444', }), chronos: Object.freeze({ up: '#166534', flat: '#a39b6b', down: '#be185d', }), }); const modelSeriesStyle = Object.freeze( Object.fromEntries( modelOrder.map((modelKey) => [ modelKey, Object.freeze({ lineWidth: defaultLineWidth, lineStyle: lineStyleSolid, }), ]) ) ); function normalizeSelection(selection = null) { const requested = selection && typeof selection === 'object' ? selection : defaultSelection; const normalized = Object.fromEntries( modelOrder.map((modelKey) => [ modelKey, Boolean( Object.prototype.hasOwnProperty.call(requested, modelKey) ? requested[modelKey] : defaultSelection[modelKey] ), ]) ); if (!Object.values(normalized).some(Boolean)) { normalized[modelOrder[0]] = true; } return normalized; } function signature(selection = null) { const normalized = normalizeSelection(selection); return modelOrder .map((modelKey) => `${modelKey[0]}${normalized[modelKey] ? 1 : 0}`) .join(''); } function createEmptyLines() { return Object.fromEntries(modelOrder.map((modelKey) => [modelKey, []])); } window.AIFORECAST_MODEL_CONFIG = Object.freeze({ modelOrder, modelLabels, defaultSelection, defaultLineWidth, modelTonePalette, modelSeriesStyle, normalizeSelection, signature, createEmptyLines, }); })();