@halilertekin/claude-code-router-config 2.0.4 → 2.0.6

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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ## 2.0.4
3
+ ## 2.0.6
4
+ - UI sürüm etiketi artık paket versiyonunu gösteriyor.
5
+ - Dashboard dil dosyalarındaki hatalı virgüller düzeltildi (dil seçimi ve sağlayıcı listesi geri geldi).
6
+ - `ccr activate` artık yapılandırılan env dosyasını (`CCR_ENV_PATH`) export ediyor.
7
+ - GLM wrapper: z.ai için doğru auth/timeout/model eşlemeleri ve python3 fallback.
8
+
9
+ ## 2.0.5
4
10
  - UI üzerinden `.env` anahtarları ekleme/güncelleme eklendi.
5
11
  - API tarafına `GET/POST /api/env` eklendi.
6
12
 
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Claude Code Router Config - Advanced Multi-Provider Setup
2
2
 
3
- 🚀 **v2.0.4** - Unified router + config package with z.ai (GLM 4.7) support, advanced CLI tools, analytics, smart routing, and configuration templates!
3
+ 🚀 **v2.0.6** - Unified router + config package with z.ai (GLM 4.7) support, advanced CLI tools, analytics, smart routing, and configuration templates!
4
4
 
5
5
  Use Claude Code as a single interface to access multiple AI providers with intelligent routing for optimal performance, cost, and quality.
6
6
 
7
- ## ✨ New in v2.0.4
7
+ ## ✨ New in v2.0.6
8
8
  - UI üzerinden `.env` anahtarları ekleme/güncelleme (TR/NL).
9
9
  - `~/.env` otomatik yükleme ile API anahtarlarının bulunması (CLI + health monitor).
10
10
  - **z.ai Support**: Native integration for GLM-4.7 via z.ai (PPInfra).
package/cli/commands.js CHANGED
@@ -5,7 +5,7 @@ const os = require('os');
5
5
  const path = require('path');
6
6
  const { spawn } = require('child_process');
7
7
  const chalk = require('./chalk-safe');
8
- const { resolveProviderKey } = require('../router/config');
8
+ const { resolveProviderKey, readEnvFile } = require('../router/config');
9
9
  const configPath = path.join(os.homedir(), '.claude-code-router');
10
10
  const pidFile = path.join(configPath, 'router.pid');
11
11
  const serverScript = path.join(__dirname, '..', 'router', 'server.js');
@@ -20,6 +20,12 @@ function loadConfig() {
20
20
  }
21
21
  }
22
22
 
23
+ function formatEnvValue(value) {
24
+ const safe = /^[A-Za-z0-9_./:@-]+$/.test(value);
25
+ if (safe) return value;
26
+ return JSON.stringify(value);
27
+ }
28
+
23
29
  function readPid() {
24
30
  if (!fs.existsSync(pidFile)) return null;
25
31
  const pid = parseInt(fs.readFileSync(pidFile, 'utf8'), 10);
@@ -392,7 +398,11 @@ async function main() {
392
398
  case 'activate': {
393
399
  const config = loadConfig();
394
400
  const port = config.PORT || 3456;
395
- console.log('export $(cat ~/.env | xargs)');
401
+ const { entries } = readEnvFile();
402
+ Object.entries(entries).forEach(([key, value]) => {
403
+ if (value === undefined) return;
404
+ console.log(`export ${key}=${formatEnvValue(String(value))}`);
405
+ });
396
406
  console.log(`export ANTHROPIC_BASE_URL="http://127.0.0.1:${port}"`);
397
407
  console.log('export NO_PROXY="127.0.0.1"');
398
408
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@halilertekin/claude-code-router-config",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Multi-provider configuration for Claude Code Router with intent-based routing, advanced CLI tools, analytics, and smart routing. Setup OpenAI, Anthropic, Gemini, Qwen, GLM, OpenRouter, and GitHub Copilot with intelligent routing.",
5
5
  "main": "install.js",
6
6
  "bin": {
package/router/server.js CHANGED
@@ -518,6 +518,22 @@ function setupApi(app) {
518
518
 
519
519
  function setupUi(app) {
520
520
  const uiRoot = path.join(__dirname, '..', 'web-dashboard', 'public');
521
+ const indexPath = path.join(uiRoot, 'index.html');
522
+
523
+ const renderIndex = () => {
524
+ const version = require('../package.json').version;
525
+ const html = fs.readFileSync(indexPath, 'utf8');
526
+ return html.replace(/__CCR_VERSION__/g, version);
527
+ };
528
+
529
+ app.get(['/ui', '/ui/', '/ui/index.html'], (req, res, next) => {
530
+ try {
531
+ res.type('html').send(renderIndex());
532
+ } catch (error) {
533
+ next(error);
534
+ }
535
+ });
536
+
521
537
  app.use('/ui', express.static(uiRoot));
522
538
  app.get('/', (req, res) => res.redirect('/ui'));
523
539
  }
package/setup-glm.sh CHANGED
@@ -6,6 +6,10 @@ CONFIG_DIR="$HOME/.claude-code-router"
6
6
  BIN_DIR="$HOME/.local/bin"
7
7
  KEYS_FILE="$CONFIG_DIR/keys.env"
8
8
  ZSHRC="${HOME}/.zshrc"
9
+ PYTHON_BIN="python"
10
+ if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
11
+ PYTHON_BIN="python3"
12
+ fi
9
13
 
10
14
  GLM_KEY="${GLM_API_KEY:-}"
11
15
  SKIP_INSTALL=0
@@ -188,14 +192,23 @@ if ! port_open; then
188
192
  exit 1
189
193
  fi
190
194
 
195
+ export CCR_ENV_PATH="$KEYS_FILE"
191
196
  eval "$(ccr activate)"
192
197
 
193
- export ANTHROPIC_MODEL="glm,glm-4.7"
194
- export ANTHROPIC_DEFAULT_SONNET_MODEL="glm,glm-4.7"
195
- export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm,glm-4.7"
196
- export ANTHROPIC_DEFAULT_OPUS_MODEL="glm,glm-4.7"
197
- export CLAUDE_CODE_SUBAGENT_MODEL="glm,glm-4.7"
198
- export ANTHROPIC_SMALL_FAST_MODEL="glm,glm-4.7"
198
+ # Ensure Claude Code doesn't fall back to Claude Pro when glm is requested.
199
+ export ANTHROPIC_AUTH_TOKEN="${GLM_API_KEY}"
200
+ export ANTHROPIC_API_KEY="${GLM_API_KEY}"
201
+
202
+ export ANTHROPIC_BASE_URL="http://127.0.0.1:3456"
203
+ export NO_PROXY="127.0.0.1"
204
+ export API_TIMEOUT_MS="${API_TIMEOUT_MS:-3000000}"
205
+
206
+ export ANTHROPIC_MODEL="${ANTHROPIC_MODEL:-glm,glm-4.7}"
207
+ export ANTHROPIC_DEFAULT_OPUS_MODEL="${ANTHROPIC_DEFAULT_OPUS_MODEL:-glm,glm-4.7}"
208
+ export ANTHROPIC_DEFAULT_SONNET_MODEL="${ANTHROPIC_DEFAULT_SONNET_MODEL:-glm,glm-4.7}"
209
+ export ANTHROPIC_DEFAULT_HAIKU_MODEL="${ANTHROPIC_DEFAULT_HAIKU_MODEL:-glm,glm-4.5-air}"
210
+ export ANTHROPIC_SMALL_FAST_MODEL="${ANTHROPIC_SMALL_FAST_MODEL:-glm,glm-4.5-air}"
211
+ export CLAUDE_CODE_SUBAGENT_MODEL="${CLAUDE_CODE_SUBAGENT_MODEL:-glm,glm-4.7}"
199
212
 
200
213
  CLAUDE_BIN="$HOME/.claude/local/claude"
201
214
  if [[ ! -x "$CLAUDE_BIN" ]]; then
@@ -235,7 +248,7 @@ backup_file "$CONFIG_DIR/config.json"
235
248
  cp "$SCRIPT_DIR/config/glm-only.json" "$CONFIG_DIR/config.json"
236
249
  backup_file "$CONFIG_DIR/intent-router-glm.js"
237
250
  cp "$SCRIPT_DIR/config/intent-router-glm.js" "$CONFIG_DIR/intent-router-glm.js"
238
- python - <<'PY'
251
+ "$PYTHON_BIN" - <<'PY'
239
252
  import json
240
253
  import os
241
254
 
@@ -224,7 +224,7 @@
224
224
  </main>
225
225
 
226
226
  <footer class="footer">
227
- <span id="version">v2</span>
227
+ <span id="version">v__CCR_VERSION__</span>
228
228
  </footer>
229
229
  </div>
230
230
 
@@ -63,7 +63,7 @@ class Dashboard {
63
63
  envSet: 'Tanımlı',
64
64
  envMissing: 'Eksik',
65
65
  envPath: 'Dosya',
66
- envSelect: 'Anahtar seç'
66
+ envSelect: 'Anahtar seç',
67
67
  logOn: 'Açık',
68
68
  logOff: 'Kapalı',
69
69
  statusHealthy: 'Sağlıklı',
@@ -122,7 +122,7 @@ class Dashboard {
122
122
  envSet: 'Ingesteld',
123
123
  envMissing: 'Ontbreekt',
124
124
  envPath: 'Bestand',
125
- envSelect: 'Sleutel kiezen'
125
+ envSelect: 'Sleutel kiezen',
126
126
  logOn: 'Aan',
127
127
  logOff: 'Uit',
128
128
  statusHealthy: 'Gezond',