yymaxapi 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/yymaxapi.js +127 -24
  2. package/package.json +3 -4
package/bin/yymaxapi.js CHANGED
@@ -56,44 +56,77 @@ function safeExec(cmd, options = {}) {
56
56
  }
57
57
  }
58
58
 
59
- // ============ 预设 (默认值, 可由 API节点设置.md 覆盖) ============
59
+ // ============ 预设 ( build.js provider config 生成) ============
60
60
  const DEFAULT_ENDPOINTS = [
61
- { name: '国内主节点', url: 'https://yunyi.rdzhvip.com' },
62
- { name: 'CF国外节点1', url: 'https://yunyi.cfd' },
63
- { name: 'CF国外节点2', url: 'https://cdn1.yunyi.cfd' },
64
- { name: 'CF国外节点3', url: 'https://cdn2.yunyi.cfd' }
61
+ {
62
+ "name": "国内主节点",
63
+ "url": "https://yunyi.rdzhvip.com"
64
+ },
65
+ {
66
+ "name": "CF国外节点1",
67
+ "url": "https://yunyi.cfd"
68
+ },
69
+ {
70
+ "name": "CF国外节点2",
71
+ "url": "https://cdn1.yunyi.cfd"
72
+ },
73
+ {
74
+ "name": "CF国外节点3",
75
+ "url": "https://cdn2.yunyi.cfd"
76
+ }
65
77
  ];
66
78
 
67
79
  const FALLBACK_ENDPOINTS = [
68
- { name: '备用节点1', url: 'http://47.99.42.193' },
69
- { name: '备用节点2', url: 'http://47.97.100.10' }
80
+ {
81
+ "name": "备用节点1",
82
+ "url": "http://47.99.42.193"
83
+ },
84
+ {
85
+ "name": "备用节点2",
86
+ "url": "http://47.97.100.10"
87
+ }
70
88
  ];
71
89
 
72
90
  const DEFAULT_CLAUDE_MODELS = [
73
- { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },
74
- { id: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' },
75
- { id: 'claude-haiku-4-5', name: 'Claude Haiku 4.5' }
91
+ {
92
+ "id": "claude-opus-4-6",
93
+ "name": "Claude Opus 4.6"
94
+ },
95
+ {
96
+ "id": "claude-sonnet-4-5",
97
+ "name": "Claude Sonnet 4.5"
98
+ },
99
+ {
100
+ "id": "claude-haiku-4-5",
101
+ "name": "Claude Haiku 4.5"
102
+ }
76
103
  ];
77
104
 
78
105
  const DEFAULT_CODEX_MODELS = [
79
- { id: 'gpt-5.3-codex', name: 'GPT 5.3 Codex' },
80
- { id: 'gpt-5.2', name: 'GPT 5.2' }
106
+ {
107
+ "id": "gpt-5.3-codex",
108
+ "name": "GPT 5.3 Codex"
109
+ },
110
+ {
111
+ "id": "gpt-5.2",
112
+ "name": "GPT 5.2"
113
+ }
81
114
  ];
82
115
 
83
116
  const DEFAULT_API_CONFIG = {
84
- claude: {
85
- urlSuffix: '/claude',
86
- api: 'anthropic-messages',
87
- contextWindow: 200000,
88
- maxTokens: 8192,
89
- providerName: 'claude-yunyi'
117
+ "claude": {
118
+ "urlSuffix": "/claude",
119
+ "api": "anthropic-messages",
120
+ "contextWindow": 200000,
121
+ "maxTokens": 8192,
122
+ "providerName": "claude-yunyi"
90
123
  },
91
- codex: {
92
- urlSuffix: '/codex',
93
- api: 'openai-responses',
94
- contextWindow: 128000,
95
- maxTokens: 32768,
96
- providerName: 'yunyi'
124
+ "codex": {
125
+ "urlSuffix": "/codex",
126
+ "api": "openai-responses",
127
+ "contextWindow": 128000,
128
+ "maxTokens": 32768,
129
+ "providerName": "yunyi"
97
130
  }
98
131
  };
99
132
 
@@ -436,6 +469,19 @@ function getConfigPath() {
436
469
  candidates.push(...openclawCandidates, ...moltbotCandidates);
437
470
  }
438
471
 
472
+ // Fallback: 当前用户非 root 时,也检查 /root 下的配置(OpenClaw 常以 root 安装)
473
+ if (process.platform !== 'win32' && homeDir !== '/root') {
474
+ const rootOpenclawDir = '/root/.openclaw';
475
+ const rootClawdbotDir = '/root/.clawdbot';
476
+ candidates.push(
477
+ path.join(rootOpenclawDir, 'openclaw.json'),
478
+ path.join(rootOpenclawDir, 'moltbot.json'),
479
+ path.join(rootClawdbotDir, 'openclaw.json'),
480
+ path.join(rootClawdbotDir, 'clawdbot.json'),
481
+ path.join(rootClawdbotDir, 'moltbot.json')
482
+ );
483
+ }
484
+
439
485
  const defaultConfig = preferMoltbot
440
486
  ? path.join(moltbotPrimaryDir, 'moltbot.json')
441
487
  : path.join(openclawStateDir, 'openclaw.json');
@@ -1878,6 +1924,8 @@ async function main() {
1878
1924
  { name: '→ 测试连接', value: 'test_connection' },
1879
1925
  { name: '→ 查看配置', value: 'view_config' },
1880
1926
  { name: '→ 恢复默认', value: 'restore' },
1927
+ new inquirer.Separator(chalk.gray('── 安装 ──')),
1928
+ { name: '📦 安装/更新 OpenClaw', value: 'install_openclaw' },
1881
1929
  new inquirer.Separator(''),
1882
1930
  { name: chalk.gray('退出'), value: 'exit' }
1883
1931
  ]
@@ -1907,6 +1955,9 @@ async function main() {
1907
1955
  case 'restore':
1908
1956
  await restore(paths);
1909
1957
  break;
1958
+ case 'install_openclaw':
1959
+ await installOrUpdateOpenClaw();
1960
+ break;
1910
1961
  }
1911
1962
  } catch (error) {
1912
1963
  console.log(chalk.red(`\n错误: ${error.message}\n`));
@@ -2747,6 +2798,58 @@ async function viewConfig(paths) {
2747
2798
  console.log(` ${fs.existsSync(backupPath) ? chalk.green('✓ 已备份') : chalk.gray('未备份')}`);
2748
2799
  }
2749
2800
 
2801
+ // ============ 安装/更新 OpenClaw ============
2802
+ async function installOrUpdateOpenClaw() {
2803
+ // 检测当前版本
2804
+ const { cliBinary } = getCliMeta();
2805
+ let currentVersion = null;
2806
+ if (cliBinary) {
2807
+ const vResult = safeExec(`"${cliBinary}" --version`);
2808
+ if (vResult.ok) currentVersion = vResult.output.trim();
2809
+ }
2810
+
2811
+ if (currentVersion) {
2812
+ console.log(chalk.cyan(`当前版本: ${currentVersion}`));
2813
+ } else {
2814
+ console.log(chalk.yellow('未检测到 OpenClaw 安装'));
2815
+ }
2816
+
2817
+ const actionLabel = currentVersion ? '更新到最新版' : '安装最新版';
2818
+ const { confirm } = await inquirer.prompt([{
2819
+ type: 'confirm',
2820
+ name: 'confirm',
2821
+ message: `${actionLabel} OpenClaw?`,
2822
+ default: true
2823
+ }]);
2824
+
2825
+ if (!confirm) {
2826
+ console.log(chalk.gray('已取消'));
2827
+ return;
2828
+ }
2829
+
2830
+ const spinner = ora({ text: `正在${actionLabel} OpenClaw...`, spinner: 'dots' }).start();
2831
+
2832
+ const isWin = process.platform === 'win32';
2833
+ const cmd = isWin
2834
+ ? 'npm install -g openclaw@latest'
2835
+ : 'sudo npm install -g openclaw@latest 2>/dev/null || npm install -g openclaw@latest';
2836
+
2837
+ try {
2838
+ execSync(cmd, { stdio: 'pipe', timeout: 120000 });
2839
+ spinner.succeed(`OpenClaw ${actionLabel}完成`);
2840
+
2841
+ // 显示新版本
2842
+ const newV = safeExec(`${cliBinary || 'openclaw'} --version`);
2843
+ if (newV.ok) {
2844
+ console.log(chalk.green(` 版本: ${newV.output.trim()}`));
2845
+ }
2846
+ } catch (error) {
2847
+ spinner.fail(`${actionLabel}失败`);
2848
+ console.log(chalk.red(` 错误: ${error.message}`));
2849
+ console.log(chalk.gray(' 请手动运行: npm install -g openclaw@latest'));
2850
+ }
2851
+ }
2852
+
2750
2853
  // ============ 恢复默认配置 ============
2751
2854
  async function restore(paths) {
2752
2855
  const backupPath = path.join(paths.configDir, BACKUP_FILENAME);
package/package.json CHANGED
@@ -1,15 +1,14 @@
1
1
  {
2
2
  "name": "yymaxapi",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "跨平台 OpenClaw/Clawdbot 配置管理工具 - 管理中转地址、模型切换、API Keys、测速优化",
5
5
  "main": "bin/yymaxapi.js",
6
6
  "bin": {
7
7
  "yymaxapi": "bin/yymaxapi.js"
8
8
  },
9
9
  "scripts": {
10
- "start": "node cli.js",
11
- "test": "node bin/yymaxapi.js test",
12
- "feishu:publish": "node scripts/feishu-docx-publish.js"
10
+ "start": "node bin/yymaxapi.js",
11
+ "test": "node bin/yymaxapi.js test"
13
12
  },
14
13
  "keywords": [
15
14
  "openclaw",