const fs = require('node:fs'); const path = require('node:path'); const crypto = require('node:crypto'); const { getConfigFilePath } = require('../utils/paths.cjs'); const defaultConfig = { api_key: '', base_url: '', model_name: 'gpt-3.5-turbo', image_model: { provider: 'volcengine', base_url: 'https://ark.cn-beijing.volces.com/api/v3', api_key: '', model_name: '', status: 'untested', tested_at: '', last_error: '', }, file_parser: { provider: 'local', mineru_token: '', }, developer_mode: false, real_time_render: true, analytics_client_id: '', analytics_created_at: '', }; function createAnalyticsClientId() { return crypto.randomUUID(); } function createAnalyticsCreatedAt() { return new Date().toISOString().slice(0, 10); } function normalizeConfig(config) { const fileParser = config && config.file_parser ? config.file_parser : {}; return { ...defaultConfig, ...config, image_model: { ...defaultConfig.image_model, ...(config && config.image_model ? config.image_model : {}), }, file_parser: { provider: fileParser.provider || defaultConfig.file_parser.provider, mineru_token: fileParser.mineru_token || defaultConfig.file_parser.mineru_token, }, }; } function createConfigStore(app) { const configFile = getConfigFilePath(app); function persist(config) { fs.mkdirSync(path.dirname(configFile), { recursive: true }); fs.writeFileSync(configFile, JSON.stringify(config, null, 2), 'utf-8'); } function withAnalyticsIdentity(config) { if (config.analytics_client_id && config.analytics_created_at) { return config; } return { ...config, analytics_client_id: config.analytics_client_id || createAnalyticsClientId(), analytics_created_at: config.analytics_created_at || createAnalyticsCreatedAt(), }; } return { getConfigFilePath() { return configFile; }, load() { if (!fs.existsSync(configFile)) { const config = withAnalyticsIdentity(normalizeConfig()); persist(config); return config; } try { const raw = fs.readFileSync(configFile, 'utf-8'); const config = normalizeConfig(JSON.parse(raw)); const nextConfig = withAnalyticsIdentity(config); if (nextConfig !== config) { persist(nextConfig); } return nextConfig; } catch (error) { throw new Error(`配置文件读取失败:${error.message}`); } }, save(config) { try { const currentConfig = fs.existsSync(configFile) ? normalizeConfig(JSON.parse(fs.readFileSync(configFile, 'utf-8'))) : normalizeConfig(); const nextConfig = withAnalyticsIdentity(normalizeConfig({ ...config, analytics_client_id: config?.analytics_client_id || currentConfig.analytics_client_id, analytics_created_at: config?.analytics_created_at || currentConfig.analytics_created_at, })); persist(nextConfig); return { success: true, message: '配置已保存', config_path: configFile }; } catch (error) { throw new Error(`配置文件保存失败:${error.message}`); } }, }; } module.exports = { createConfigStore, };