claude-scionos 4.3.3 → 4.3.5

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/README.fr.md CHANGED
@@ -56,6 +56,8 @@ npx claude-scionos auth test
56
56
  npx claude-scionos --strategy aws
57
57
  npx claude-scionos --service llm --strategy claude
58
58
  npx claude-scionos --service llm --strategy claude-gpt
59
+ npx claude-scionos --service llm --strategy claude-gpt-special
60
+ npx claude-scionos --service llm --strategy deepseek-v4-beta
59
61
  npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
60
62
  ```
61
63
 
@@ -65,7 +67,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
65
67
  - `--service llm` bascule le lanceur vers `https://llm.routerlab.ch`
66
68
  - `llm` est prévu pour un accès sur invitation
67
69
  - les tokens enregistrés avec `auth login --service llm` sont stockés séparément du token RouterLab par défaut
68
- - `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-qwen3.6-plus`, `claude-minimax-m2.7` et `claude-glm-5.1`
70
+ - `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-gpt-special` et `deepseek-v4-beta`
69
71
  - `routerlab` expose aussi `claude-gpt`, `claude-minimax-m2.7` et `claude-glm-5.1`
70
72
 
71
73
  ## Stratégies
@@ -75,6 +77,8 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
75
77
  - `claude` : remappe les familles de modèles Claude sur `--service llm` vers les variantes Claude standard `claude-haiku-4-5-20251001`, `claude-sonnet-4-6` et `claude-opus-4-6`
76
78
  - `claude-gpt` : mappe les requêtes Claude vers la famille `claude-gpt`
77
79
  `claude-gpt-5.5 ==> claude-opus-4.7`, `claude-gpt-5.4 ==> claude-sonnet-4.6`, `claude-gpt-5.4-mini ==> claude-gpt-5.4-mini`
80
+ - `claude-gpt-special` : sur `--service llm`, force toutes les requêtes vers `claude-gpt-5.4-sp`
81
+ - `deepseek-v4-beta` : sur `--service llm`, mappe les requêtes Claude vers `claude-deepseek-v4-pro` pour opus et `claude-deepseek-v4-flash` pour sonnet ou haiku
78
82
  - `claude-qwen3.6-plus` : force toutes les requêtes vers `claude-qwen3.6-plus`
79
83
  - `claude-minimax-m2.7` : force toutes les requêtes vers `claude-minimax-m2.7`
80
84
  - `claude-glm-5.1` : force toutes les requêtes vers `claude-glm-5.1`
package/README.md CHANGED
@@ -56,6 +56,8 @@ npx claude-scionos auth test
56
56
  npx claude-scionos --strategy aws
57
57
  npx claude-scionos --service llm --strategy claude
58
58
  npx claude-scionos --service llm --strategy claude-gpt
59
+ npx claude-scionos --service llm --strategy claude-gpt-special
60
+ npx claude-scionos --service llm --strategy deepseek-v4-beta
59
61
  npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
60
62
  ```
61
63
 
@@ -65,7 +67,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
65
67
  - `--service llm` switches the launcher to `https://llm.routerlab.ch`
66
68
  - `llm` is intended for invitation-only access
67
69
  - Tokens stored with `auth login --service llm` are kept separate from the default RouterLab token
68
- - `llm` currently exposes `claude`, `claude-gpt`, `claude-qwen3.6-plus`, `claude-minimax-m2.7`, and `claude-glm-5.1`
70
+ - `llm` currently exposes `claude`, `claude-gpt`, `claude-gpt-special`, and `deepseek-v4-beta`
69
71
  - `routerlab` also exposes `claude-gpt`, `claude-minimax-m2.7`, and `claude-glm-5.1`
70
72
 
71
73
  ## Strategies
@@ -75,6 +77,8 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
75
77
  - `claude`: remap Claude model families on `--service llm` to the standard Claude variants `claude-haiku-4-5-20251001`, `claude-sonnet-4-6`, and `claude-opus-4-6`
76
78
  - `claude-gpt`: map Claude requests to the `claude-gpt` family
77
79
  `claude-gpt-5.5 ==> claude-opus-4.7`, `claude-gpt-5.4 ==> claude-sonnet-4.6`, `claude-gpt-5.4-mini ==> claude-gpt-5.4-mini`
80
+ - `claude-gpt-special`: on `--service llm`, force all requests to `claude-gpt-5.4-sp`
81
+ - `deepseek-v4-beta`: on `--service llm`, map Claude requests to `claude-deepseek-v4-pro` for opus and `claude-deepseek-v4-flash` for sonnet or haiku
78
82
  - `claude-qwen3.6-plus`: force all requests to `claude-qwen3.6-plus`
79
83
  - `claude-minimax-m2.7`: force all requests to `claude-minimax-m2.7`
80
84
  - `claude-glm-5.1`: force all requests to `claude-glm-5.1`
package/index.js CHANGED
@@ -562,11 +562,16 @@ async function runDoctor(serviceConfig) {
562
562
  showStatus('Env token', getEnvironmentToken() ? 'ok' : 'warn', getEnvironmentToken() ? 'available' : 'not set');
563
563
  console.log('');
564
564
 
565
- const candidate = getAvailableTokenCandidate(serviceConfig.value);
565
+ const envToken = getEnvironmentToken();
566
+ const candidate = envToken
567
+ ? { token: envToken, source: 'environment' }
568
+ : { token: null, source: storedStatus.stored ? 'secure-store' : 'none' };
566
569
  let validation = null;
567
570
 
568
571
  if (!candidate.token) {
569
- showStatus(`${serviceConfig.tokenPromptLabel} auth`, 'warn', 'Skipped: no environment or stored token available');
572
+ showStatus(`${serviceConfig.tokenPromptLabel} auth`, 'warn', storedStatus.stored
573
+ ? 'Skipped: stored token available but not validated during doctor on Windows'
574
+ : 'Skipped: no environment or stored token available');
570
575
  } else {
571
576
  validation = await validateToken(candidate.token, {
572
577
  baseUrl: resolveServiceBaseUrl(serviceConfig.value),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-scionos",
3
- "version": "4.3.3",
3
+ "version": "4.3.5",
4
4
  "description": "RouterLab launcher, strategy proxy and secure token wrapper for Claude Code CLI",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/src/proxy.js CHANGED
@@ -76,6 +76,14 @@ function getPreferredClaudeModel(requestedModel = '') {
76
76
  return 'claude-sonnet-4-6';
77
77
  }
78
78
 
79
+ function getPreferredDeepseekV4Model(requestedModel = '') {
80
+ if (requestedModel.includes('opus')) {
81
+ return 'claude-deepseek-v4-pro';
82
+ }
83
+
84
+ return 'claude-deepseek-v4-flash';
85
+ }
86
+
79
87
  function resolveMappedModel(targetModel, requestedModel = '', availableModels = []) {
80
88
  if (targetModel === 'claude') {
81
89
  const preferredModel = getPreferredClaudeModel(requestedModel);
@@ -98,6 +106,31 @@ function resolveMappedModel(targetModel, requestedModel = '', availableModels =
98
106
  );
99
107
  }
100
108
 
109
+ if (targetModel === 'claude-gpt-special') {
110
+ return 'claude-gpt-5.4-sp';
111
+ }
112
+
113
+ if (targetModel === 'deepseek-v4-beta') {
114
+ const preferredModel = getPreferredDeepseekV4Model(requestedModel);
115
+ const availableDeepseekModels = Array.isArray(availableModels)
116
+ ? availableModels.filter((model) => model === 'claude-deepseek-v4-pro' || model === 'claude-deepseek-v4-flash')
117
+ : [];
118
+
119
+ if (availableDeepseekModels.length === 0) {
120
+ return preferredModel;
121
+ }
122
+
123
+ if (availableDeepseekModels.includes(preferredModel)) {
124
+ return preferredModel;
125
+ }
126
+
127
+ return (
128
+ availableDeepseekModels.find((model) => model === 'claude-deepseek-v4-flash')
129
+ ?? availableDeepseekModels[0]
130
+ ?? preferredModel
131
+ );
132
+ }
133
+
101
134
  if (targetModel !== 'aws') {
102
135
  if (targetModel !== 'claude-gpt') {
103
136
  return targetModel;
package/src/routerlab.js CHANGED
@@ -28,7 +28,7 @@ const SERVICES = {
28
28
  secureStorageAccount: 'routerlab-llm-token',
29
29
  secureStorageLabel: 'RouterLab LLM Token',
30
30
  secureStorageFileName: 'routerlab-llm-token.secure.txt',
31
- strategyValues: ['claude', 'claude-gpt', 'claude-qwen3.6-plus', 'claude-minimax-m2.7', 'claude-glm-5.1'],
31
+ strategyValues: ['claude', 'claude-gpt', 'claude-gpt-special', 'deepseek-v4-beta'],
32
32
  },
33
33
  };
34
34
  const DEFAULT_SERVICE = 'routerlab';
@@ -102,6 +102,22 @@ const STRATEGIES = [
102
102
  aliases: ['claude-gpt-5.4'],
103
103
  verificationModels: ['claude-gpt-5.4'],
104
104
  },
105
+ {
106
+ value: 'claude-gpt-special',
107
+ name: 'OpenAI GPT special',
108
+ selectionName: 'OpenAI GPT special (only gpt-5.4)',
109
+ description: 'Forces all requests to claude-gpt-5.4-sp.',
110
+ selectionDescription: 'Forces all requests to claude-gpt-5.4-sp.',
111
+ mappedModels: ['claude-gpt-5.4-sp'],
112
+ },
113
+ {
114
+ value: 'deepseek-v4-beta',
115
+ name: 'deepseek-v4 beta',
116
+ selectionName: 'deepseek-v4 beta',
117
+ description: 'Maps Claude requests to the deepseek-v4 family. Opus 4.7 => claude-deepseek-v4-pro, Sonnet 4.6 => claude-deepseek-v4-flash, Haiku => claude-deepseek-v4-flash.',
118
+ selectionDescription: 'Opus 4.7 => claude-deepseek-v4-pro, Sonnet 4.6 => claude-deepseek-v4-flash, Haiku => claude-deepseek-v4-flash.',
119
+ verificationModels: ['claude-deepseek-v4-pro', 'claude-deepseek-v4-flash'],
120
+ },
105
121
  {
106
122
  value: 'claude-qwen3.6-plus',
107
123
  name: 'Qwen3.6 Plus',
@@ -271,7 +287,15 @@ function getServiceStrategies(serviceValue = DEFAULT_SERVICE) {
271
287
  }
272
288
 
273
289
  function normalizeStrategyValue(strategyValue) {
274
- return strategyValue === 'claude-gpt-5.4' ? 'claude-gpt' : strategyValue;
290
+ if (strategyValue === 'claude-gpt-5.4') {
291
+ return 'claude-gpt';
292
+ }
293
+
294
+ if (strategyValue === 'claude-gpt-5.4-sp') {
295
+ return 'claude-gpt-special';
296
+ }
297
+
298
+ return strategyValue;
275
299
  }
276
300
 
277
301
  function findStrategy(strategyValue, serviceValue = DEFAULT_SERVICE) {
@@ -671,6 +695,15 @@ function deleteStoredToken(serviceValue = DEFAULT_SERVICE) {
671
695
 
672
696
  function getStoredTokenStatus(serviceValue = DEFAULT_SERVICE) {
673
697
  const storage = getSecureStorageBackend();
698
+
699
+ if (process.platform === 'win32') {
700
+ const tokenFile = getWindowsTokenFile(serviceValue);
701
+ return {
702
+ ...storage,
703
+ stored: fs.existsSync(tokenFile) && hasNonEmptyWindowsTokenFile(tokenFile),
704
+ };
705
+ }
706
+
674
707
  const storedToken = getStoredToken(serviceValue);
675
708
  return {
676
709
  ...storage,