#!/usr/bin/env node const fs = require('fs'); const os = require('os'); const path = require('path'); const args = process.argv.slice(2); const tokenArg = args.find(arg => !arg.startsWith('--')); const token = tokenArg || (args.find(arg => arg.startsWith('--token=')) || '').slice(8); if (!token) { console.log('用法: node scripts/tools/set-voc-token.js '); console.log('示例: node scripts/tools/set-voc-token.js r:1234567890abcdef1234567890abcdef'); process.exit(1); } if (!/^r:[0-9a-f]{32}$/i.test(token)) { console.error('无效 token:应为 Parse session token,格式示例 r:1234567890abcdef1234567890abcdef'); process.exit(1); } const configDir = path.join(os.homedir(), '.openclaw'); const configPath = path.join(configDir, 'voc-credentials.json'); let config = {}; if (fs.existsSync(configPath)) { try { const raw = fs.readFileSync(configPath, 'utf-8').trim(); config = raw ? JSON.parse(raw) : {}; } catch (error) { console.error(`读取现有配置失败: ${error.message}`); process.exit(1); } } config.vocToken = token; try { fs.mkdirSync(configDir, { recursive: true }); fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`, 'utf-8'); } catch (error) { console.error(`写入配置失败: ${error.message}`); process.exit(1); } const masked = `${token.slice(0, 6)}...${token.slice(-4)}`; console.log(`已写入 vocToken: ${masked}`); console.log(`配置文件: ${configPath}`);