claude-scionos 4.1.2 → 4.1.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.
package/README.fr.md CHANGED
@@ -64,7 +64,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
64
64
  - `--service llm` bascule le lanceur vers `https://llm.routerlab.ch`
65
65
  - `llm` est prévu pour un accès sur invitation
66
66
  - les tokens enregistrés avec `auth login --service llm` sont stockés séparément du token RouterLab par défaut
67
- - `llm` expose pour l'instant `claude-glm-5` et `claude-gpt-5.4`
67
+ - `llm` expose pour l'instant `claude-glm-5`, `claude-gpt-5.4` et `claude-qwen3.6-plus`
68
68
  - `routerlab` expose aussi `claude-gpt-5.4`
69
69
 
70
70
  ## Stratégies
@@ -74,6 +74,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
74
74
  - `claude-glm-5` : force toutes les requêtes vers `claude-glm-5`
75
75
  - `claude-minimax-m2.5` : force toutes les requêtes vers `claude-minimax-m2.5`
76
76
  - `claude-gpt-5.4` : force toutes les requêtes vers `claude-gpt-5.4`
77
+ - `claude-qwen3.6-plus` : force toutes les requêtes vers `claude-qwen3.6-plus`
77
78
 
78
79
  Utilise `--list-strategies` pour voir les stratégies disponibles pour le service choisi et leur disponibilité réelle quand un token est disponible.
79
80
 
package/README.md CHANGED
@@ -64,7 +64,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
64
64
  - `--service llm` switches the launcher to `https://llm.routerlab.ch`
65
65
  - `llm` is intended for invitation-only access
66
66
  - Tokens stored with `auth login --service llm` are kept separate from the default RouterLab token
67
- - `llm` currently exposes `claude-glm-5` and `claude-gpt-5.4`
67
+ - `llm` currently exposes `claude-glm-5`, `claude-gpt-5.4`, and `claude-qwen3.6-plus`
68
68
  - `routerlab` also exposes `claude-gpt-5.4`
69
69
 
70
70
  ## Strategies
@@ -74,6 +74,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
74
74
  - `claude-glm-5`: force all requests to `claude-glm-5`
75
75
  - `claude-minimax-m2.5`: force all requests to `claude-minimax-m2.5`
76
76
  - `claude-gpt-5.4`: force all requests to `claude-gpt-5.4`
77
+ - `claude-qwen3.6-plus`: force all requests to `claude-qwen3.6-plus`
77
78
 
78
79
  Use `--list-strategies` to see the strategies available for the selected service and their live availability when a token is available.
79
80
 
package/index.js CHANGED
@@ -41,6 +41,7 @@ import {
41
41
  getStoredToken,
42
42
  getStoredTokenStatus,
43
43
  getStrategyChoices,
44
+ hasVerifiedModelIds,
44
45
  listStrategies,
45
46
  storeToken,
46
47
  validateToken
@@ -147,7 +148,7 @@ function showStatus(label, level, detail) {
147
148
  }
148
149
 
149
150
  function getStrategyIndicator(strategyValue, modelIds, serviceValue) {
150
- if (!Array.isArray(modelIds)) {
151
+ if (!hasVerifiedModelIds(modelIds)) {
151
152
  return chalk.gray('●');
152
153
  }
153
154
 
@@ -394,7 +395,7 @@ async function resolveStrategyChoice(parsed, modelIds, serviceConfig) {
394
395
  throw new Error(`Strategy "${selected}" cannot support the default Claude Code launch on ${serviceConfig.availabilityLabel}. ${selectedLaunchReadiness.note}`);
395
396
  }
396
397
 
397
- if (Array.isArray(modelIds)) {
398
+ if (hasVerifiedModelIds(modelIds)) {
398
399
  const availability = assessStrategy(selected, modelIds, serviceConfig.value);
399
400
  if (availability.level === 'partial') {
400
401
  console.log(chalk.yellow(`⚠ Strategy "${selected}" is only partially available on ${serviceConfig.availabilityLabel}.`));
@@ -419,7 +420,7 @@ async function resolveStrategyChoice(parsed, modelIds, serviceConfig) {
419
420
 
420
421
  const strategyChoices = getStrategyChoices(modelIds, serviceConfig.value).map((choice) => {
421
422
  const launchReadiness = assessStrategyLaunch(choice.value, modelIds, serviceConfig.value);
422
- const disabled = Array.isArray(modelIds) && !launchReadiness.ready ? launchReadiness.note : false;
423
+ const disabled = hasVerifiedModelIds(modelIds) && !launchReadiness.ready ? launchReadiness.note : false;
423
424
 
424
425
  return {
425
426
  ...choice,
@@ -429,7 +430,7 @@ async function resolveStrategyChoice(parsed, modelIds, serviceConfig) {
429
430
  };
430
431
  });
431
432
 
432
- if (Array.isArray(modelIds) && strategyChoices.every((choice) => choice.disabled)) {
433
+ if (hasVerifiedModelIds(modelIds) && strategyChoices.every((choice) => choice.disabled)) {
433
434
  throw new Error(`No launchable strategy is available on ${serviceConfig.availabilityLabel}.`);
434
435
  }
435
436
 
@@ -450,7 +451,7 @@ function showStrategies(modelIds = null, serviceConfig) {
450
451
  const strategies = listStrategies(modelIds, serviceConfig.value);
451
452
  showSection('Strategies', strategies.map((strategy) => {
452
453
  const indicator = getStrategyIndicator(strategy.value, modelIds, serviceConfig.value);
453
- const state = !Array.isArray(modelIds)
454
+ const state = !hasVerifiedModelIds(modelIds)
454
455
  ? chalk.gray('Unknown')
455
456
  : assessStrategyLaunch(strategy.value, modelIds, serviceConfig.value).ready
456
457
  ? chalk.green('Ready')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-scionos",
3
- "version": "4.1.2",
3
+ "version": "4.1.4",
4
4
  "description": "RouterLab launcher, strategy proxy and secure token wrapper for Claude Code CLI",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -43,12 +43,12 @@
43
43
  },
44
44
  "private": false,
45
45
  "dependencies": {
46
- "@inquirer/prompts": "^8.3.2"
46
+ "@inquirer/prompts": "^8.4.1"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@eslint/js": "^10.0.1",
50
- "eslint": "^10.1.0",
50
+ "eslint": "^10.2.0",
51
51
  "globals": "^17.4.0",
52
- "vitest": "^4.1.2"
52
+ "vitest": "^4.1.4"
53
53
  }
54
54
  }
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-glm-5', 'claude-gpt-5.4'],
31
+ strategyValues: ['claude-glm-5', 'claude-gpt-5.4', 'claude-qwen3.6-plus'],
32
32
  },
33
33
  };
34
34
  const DEFAULT_SERVICE = 'routerlab';
@@ -87,6 +87,13 @@ const STRATEGIES = [
87
87
  selectionDescription: 'Forces all requests to claude-gpt-5.4.',
88
88
  mappedModels: ['claude-gpt-5.4'],
89
89
  },
90
+ {
91
+ value: 'claude-qwen3.6-plus',
92
+ name: 'Qwen3.6 Plus',
93
+ description: 'Forces all requests to claude-qwen3.6-plus.',
94
+ selectionDescription: 'Forces all requests to claude-qwen3.6-plus.',
95
+ mappedModels: ['claude-qwen3.6-plus'],
96
+ },
90
97
  ];
91
98
 
92
99
  async function fetchModels(apiKey, options = {}) {
@@ -211,6 +218,10 @@ function getRequiredModels(strategy) {
211
218
  return strategy?.requiredModels ?? strategy?.mappedModels ?? [];
212
219
  }
213
220
 
221
+ function hasVerifiedModelIds(modelIds) {
222
+ return Array.isArray(modelIds) && modelIds.length > 0;
223
+ }
224
+
214
225
  function assessStrategy(strategyValue, modelIds = [], serviceValue = DEFAULT_SERVICE) {
215
226
  const serviceLabel = getServiceLabel(serviceValue);
216
227
  const strategy = findStrategy(strategyValue, serviceValue);
@@ -230,14 +241,14 @@ function assessStrategy(strategyValue, modelIds = [], serviceValue = DEFAULT_SER
230
241
  level: 'ready',
231
242
  note: 'Always available.',
232
243
  strategy,
233
- };
234
- }
235
-
236
- if (!Array.isArray(modelIds)) {
237
- return {
238
- available: true,
239
- level: 'unknown',
240
- note: 'Availability not verified.',
244
+ };
245
+ }
246
+
247
+ if (!hasVerifiedModelIds(modelIds)) {
248
+ return {
249
+ available: true,
250
+ level: 'unknown',
251
+ note: 'Availability not verified.',
241
252
  strategy,
242
253
  };
243
254
  }
@@ -293,7 +304,7 @@ function assessStrategyLaunch(strategyValue, modelIds = [], serviceValue = DEFAU
293
304
  };
294
305
  }
295
306
 
296
- if (!requiredModels.length || !Array.isArray(modelIds)) {
307
+ if (!requiredModels.length || !hasVerifiedModelIds(modelIds)) {
297
308
  return {
298
309
  ready: availability.level !== 'unavailable',
299
310
  note: availability.note,
@@ -328,7 +339,7 @@ function assessStrategyLaunch(strategyValue, modelIds = [], serviceValue = DEFAU
328
339
  }
329
340
 
330
341
  function getFallbackStrategy(strategyValue, modelIds = [], serviceValue = DEFAULT_SERVICE) {
331
- if (Array.isArray(modelIds)) {
342
+ if (hasVerifiedModelIds(modelIds)) {
332
343
  return assessStrategyLaunch(strategyValue, modelIds, serviceValue).ready ? strategyValue : null;
333
344
  }
334
345
 
@@ -588,7 +599,8 @@ export {
588
599
  getStoredToken,
589
600
  getStoredTokenStatus,
590
601
  getStrategyChoices,
591
- listStrategies,
592
- storeToken,
593
- validateToken,
594
- };
602
+ hasVerifiedModelIds,
603
+ listStrategies,
604
+ storeToken,
605
+ validateToken,
606
+ };