#!/usr/bin/env node import {readFileSync,statSync} from 'node:fs'; import {homedir} from 'node:os'; import {resolve} from 'node:path'; const file=resolve(process.argv.find(value=>value.startsWith('--file='))?.slice(7)||homedir()+'/.config/xiaoshu/xfyun-word-audio.json'); if((statSync(file).mode&0o077)!==0)throw Error('配置文件须仅限当前用户读取,请执行 chmod 600 后重试'); const input=JSON.parse(readFileSync(file,'utf8')); const gatewayOnly=process.argv.includes('--gateway-only'); const required=gatewayOnly?['XIAOSHU_TTS_WORKER_URL','XIAOSHU_TTS_WORKER_TOKEN','XFYUN_TTS_VCN']:['XFYUN_APP_ID','XFYUN_API_KEY','XFYUN_API_SECRET','XFYUN_TTS_VCN']; const optional=['XIAOSHU_TTS_WORKER_URL','XIAOSHU_TTS_WORKER_TOKEN','XIAOSHU_TTS_ENABLED','XIAOSHU_TTS_DAILY_LIMIT','XIAOSHU_TTS_USER_MINUTE_LIMIT','XIAOSHU_TTS_CONCURRENCY','XIAOSHU_S3_ENDPOINT','XIAOSHU_S3_BUCKET','XIAOSHU_S3_REGION','XIAOSHU_S3_ACCESS_KEY_ID','XIAOSHU_S3_SECRET_ACCESS_KEY','XIAOSHU_S3_PUBLIC_BASE_URL']; const missing=required.filter(key=>!String(input[key]||'').trim()); if(missing.length)throw Error('请填写配置项:'+missing.join('、')); const params=Object.fromEntries([...new Set([...required,...optional])].filter(key=>input[key]!=null).map(key=>[key,String(input[key]).trim()])); params.XIAOSHU_TTS_ENABLED=process.argv.includes('--enable')?'true':'false'; if(!process.argv.includes('--apply')){console.log(JSON.stringify({valid:true,applied:false,enabled:false,message:'配置格式检查通过;--apply 写入服务端私密配置,--enable 另行开启生成。不会调用讯飞。'}));process.exit(0);} const master=process.env.XIAOSHU_MASTER_KEY;if(!master)throw Error('缺少 XIAOSHU_MASTER_KEY'); const url=(process.env.XIAOSHU_PARSE_URL||'https://server.xiaoshu.pro/parse').replace(/\/$/,''); const response=await fetch(url+'/config',{method:'PUT',headers:{'Content-Type':'application/json','X-Parse-Application-Id':process.env.XIAOSHU_PARSE_APP_ID||'7pIbDBJmKx_main','X-Parse-Master-Key':master},body:JSON.stringify({params,masterKeyOnly:Object.fromEntries(Object.keys(params).map(key=>[key,true]))})}); if(!response.ok)throw Error('私密配置保存失败(HTTP '+response.status+')'); const payload=await response.json();if(payload.error)throw Error('私密配置保存失败'); console.log(JSON.stringify({configured:true,enabled:params.XIAOSHU_TTS_ENABLED==='true',secretsPrinted:false}));