import fs from 'node:fs'; import path from 'node:path'; import os from 'node:os'; import { normalizeSettings } from '../apps/gnome-extension/jarvis@qvac.local/settings-values.js'; export const SETTINGS_FIELDS = JSON.parse(fs.readFileSync(new URL('../apps/gnome-extension/jarvis@qvac.local/settings-catalog.json', import.meta.url).pathname, 'utf8')).fields; export const configPath = () => path.join(process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config'), 'jarvis/config.json'); export function readSettings({ strict = false } = {}) { try { const config = JSON.parse(fs.readFileSync(configPath(), 'utf8')); if (!config || typeof config !== 'object' || Array.isArray(config)) throw new Error('Settings must be a JSON object'); return config; } catch (error) { if (strict && error.code !== 'ENOENT') throw error; return {}; } } export function voiceSettings(source = null, { strict = false } = {}) { const settings = normalizeSettings(source ?? readSettings({ strict }), SETTINGS_FIELDS, { strict }); return { ...settings, command: process.env.JARVIS_WAKE_COMMAND || settings.wakeCommand, phrases: [settings.wakePhrase, ...settings.aliases].map(item => item.trim()).filter(Boolean), asrModel: process.env.JARVIS_ASR_MODEL || settings.asrModel, ttsModel: process.env.JARVIS_TTS_MODEL || settings.ttsModel, }; }