claude-scionos 4.6.0 → 5.1.0

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
@@ -1,6 +1,6 @@
1
1
  # Claude Code pour RouterLab
2
2
 
3
- `claude-scionos` est un lanceur RouterLab pour le CLI officiel Claude Code. Il conserve l'usage normal de Claude Code, tout en ajoutant un onboarding guidé, le routage de stratégies, le stockage sécurisé du token et une commande `doctor` pour le support client.
3
+ `claude-scionos` est un lanceur RouterLab pour le CLI officiel Claude Code. Il conserve l'usage normal de Claude Code, tout en ajoutant un onboarding guidé, la configuration de stratégies de modèles, le stockage sécurisé du token et une commande `doctor` pour le support client.
4
4
 
5
5
  _[🇬🇧 Read in English](./README.md)_
6
6
 
@@ -8,12 +8,13 @@ _[🇬🇧 Read in English](./README.md)_
8
8
 
9
9
  - lancement guidé pour les nouveaux utilisateurs
10
10
  - `--strategy` pour choisir une stratégie sans menu
11
+ - `--subagent-model` pour garder le défaut de stratégie ou forcer les sous-agents vers Haiku ou GPT 5.4 mini sur le service RouterLab par défaut
11
12
  - `--service llm` pour l'accès RouterLab LLM sur invitation
12
13
  - `--no-prompt` pour l'automatisation et la CI
13
14
  - `--list-strategies` pour voir les routes disponibles
14
15
  - `doctor` pour diagnostiquer rapidement un poste client
15
16
  - `auth login|status|change|logout|test` pour gérer le token
16
- - proxy local lancé uniquement si une stratégie mappée est choisie
17
+ - appels directs de Claude Code vers RouterLab via les variables de modèles natives
17
18
 
18
19
  ## Prérequis
19
20
 
@@ -57,7 +58,9 @@ npx claude-scionos --strategy aws
57
58
  npx claude-scionos --service llm --strategy claude
58
59
  npx claude-scionos --service llm --strategy claude-gpt
59
60
  npx claude-scionos --service llm --strategy claude-gpt-special
60
- npx claude-scionos --service llm --strategy deepseek-v4-beta
61
+ npx claude-scionos --service llm --strategy deepseek-v4
62
+ npx claude-scionos --service llm --strategy minimax-m2.7
63
+ npx claude-scionos --strategy deepseek-v4 --subagent-model haiku
61
64
  npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
62
65
  ```
63
66
 
@@ -67,23 +70,39 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
67
70
  - `--service llm` bascule le lanceur vers `https://llm.routerlab.ch`
68
71
  - `llm` est prévu pour un accès sur invitation
69
72
  - les tokens enregistrés avec `auth login --service llm` sont stockés séparément du token RouterLab par défaut
70
- - `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-gpt-special`, `deepseek-v4-beta` et `claude-glm-5.1`
71
- - `routerlab` expose aussi `aws`, `claude-gpt`, `deepseek-v4-beta`, `claude-kimi-k2.6` et `claude-glm-5.1`
73
+ - `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-gpt-special`, `deepseek-v4`, `minimax-m2.7` et `glm-5.1`
74
+ - `routerlab` expose aussi `aws`, `claude-gpt`, `deepseek-v4`, `claude-kimi-k2.6` et `glm-5.1`
72
75
 
73
76
  ## Stratégies
74
77
 
75
- - `default` : utilise Claude Code normalement sans proxy local
76
- - `aws` : remappe les familles de modèles Claude vers les variantes Claude AWS de RouterLab
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-7`
78
- - `claude-gpt` : mappe les requêtes Claude vers la famille `claude-gpt`
79
- les requêtes Opus sont mappées vers `claude-gpt-5.5`, les requêtes Sonnet vers `claude-gpt-5.4` et les requêtes Haiku vers `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` : mappe les requêtes Claude vers `claude-deepseek-v4-pro` pour opus ou sonnet et `claude-deepseek-v4-flash` pour haiku
82
- - `claude-kimi-k2.6` : force toutes les requêtes vers `claude-kimi-k2.6`
83
- - `claude-glm-5.1` : force toutes les requêtes vers `claude-glm-5.1`
78
+ - `default` : utilise Claude Code normalement sans forcer de variables de modèles
79
+ - `aws` : configure les variables de modèles Claude Code vers les variantes Claude AWS de RouterLab
80
+ - `claude` : sur `--service llm`, configure Opus vers `claude-opus-4-7`, Haiku vers `claude-opus-4-6`, Sonnet vers `claude-sonnet-4-6` et les sous-agents vers `claude-sonnet-4-6`
81
+ - `claude-gpt` : configure les variables vers la famille GPT
82
+ Opus utilise `claude-gpt-5.5`, Sonnet utilise `claude-gpt-5.4`, Haiku et les sous-agents utilisent `claude-gpt-5.4-mini`
83
+ - `claude-gpt-special` : sur `--service llm`, utilise `claude-gpt-5.4-sp` pour Opus, Sonnet, Haiku et les sous-agents
84
+ - `deepseek-v4` : utilise `claude-deepseek-v4-pro` pour Opus/Sonnet et `claude-deepseek-v4-flash` pour Haiku/sous-agents
85
+ - `minimax-m2.7` : sur `--service llm`, affiche `minimax-m2.7` et utilise `claude-minimax-m2.7` pour Opus, Sonnet, Haiku et les sous-agents
86
+ - `claude-kimi-k2.6` : utilise `claude-kimi-k2.6` pour Opus, Sonnet, Haiku et les sous-agents
87
+ - `glm-5.1` : utilise `claude-glm-5.1` pour Opus, Sonnet, Haiku et les sous-agents
84
88
 
85
89
  Utilise `--list-strategies` pour voir les stratégies disponibles pour le service choisi et leur disponibilité réelle quand un token est disponible.
86
90
 
91
+ ## Modèle de sous-agent
92
+
93
+ Par défaut, chaque stratégie garde son propre modèle de sous-agent. Sur le service RouterLab par défaut, tu peux surcharger uniquement les sous-agents Claude Code sans changer les variables principales Opus, Sonnet et Haiku :
94
+
95
+ - `--subagent-model default` : garde le défaut de la stratégie
96
+ - `--subagent-model haiku` : force les sous-agents vers `claude-haiku-4-5-20251001`
97
+ - `--subagent-model gpt-5.4-mini` : force les sous-agents vers `claude-gpt-5.4-mini`
98
+
99
+ Par exemple, `--strategy deepseek-v4` utilise `claude-deepseek-v4-flash` pour les sous-agents par défaut. Ajouter `--subagent-model haiku` conserve le routage principal DeepSeek mais définit `CLAUDE_CODE_SUBAGENT_MODEL=claude-haiku-4-5-20251001`.
100
+
101
+ Avec `--service llm --strategy claude`, la question du modèle de sous-agent est ignorée et les sous-agents sont forcés vers `claude-sonnet-4-6`. Les autres stratégies `llm` demandent un de ces modèles de sous-agent :
102
+
103
+ - `gpt-5.4-mini`
104
+ - `claude-deepseek-v4-flash`
105
+
87
106
  ## Gestion du token
88
107
 
89
108
  Ordre de résolution du token :
@@ -115,6 +134,7 @@ claude-scionos auth test
115
134
 
116
135
  - `--strategy <value>` évite le menu interactif et choisit directement la route
117
136
  - `--service <value>` change la cible RouterLab. `routerlab` reste le défaut et `llm` est réservé à l'accès sur invitation
137
+ - `--subagent-model <default|haiku|gpt-5.4-mini>` choisit seulement le modèle de sous-agent Claude Code sur le service RouterLab par défaut ; avec `--service llm`, les valeurs acceptées sont `gpt-5.4-mini` et `claude-deepseek-v4-flash`
118
138
  - `--no-prompt` désactive toutes les questions interactives
119
139
 
120
140
  Quand `--no-prompt` est utilisé, le lanceur doit déjà avoir un token via `ANTHROPIC_AUTH_TOKEN` ou via le stockage sécurisé.
@@ -132,7 +152,7 @@ Quand `--no-prompt` est utilisé, le lanceur doit déjà avoir un token via `ANT
132
152
 
133
153
  ## Compatibilité
134
154
 
135
- Le wrapper transmet les arguments Claude Code habituels. Le proxy local n'est lancé que pour les stratégies mappées. `default` lance Claude Code sans couche proxy.
155
+ Le wrapper transmet les arguments Claude Code habituels. RouterLab est appelé directement par Claude Code ; les stratégies sont appliquées via `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, `ANTHROPIC_DEFAULT_HAIKU_MODEL` et, quand nécessaire, `CLAUDE_CODE_SUBAGENT_MODEL`.
136
156
 
137
157
  ## Dépannage
138
158
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Claude Code for RouterLab
2
2
 
3
- `claude-scionos` is a RouterLab launcher for the official Claude Code CLI. It keeps the normal Claude Code workflow, while adding guided onboarding, strategy routing, secure token storage, and a `doctor` command for client support.
3
+ `claude-scionos` is a RouterLab launcher for the official Claude Code CLI. It keeps the normal Claude Code workflow, while adding guided onboarding, model strategy configuration, secure token storage, and a `doctor` command for client support.
4
4
 
5
5
  _[🇫🇷 Lire en français](./README.fr.md)_
6
6
 
@@ -8,12 +8,13 @@ _[🇫🇷 Lire en français](./README.fr.md)_
8
8
 
9
9
  - Guided launch for first-time users
10
10
  - `--strategy` to preselect a routing strategy
11
+ - `--subagent-model` to keep the strategy default or force subagents to Haiku or GPT 5.4 mini on the default RouterLab service
11
12
  - `--service llm` for invitation-only RouterLab LLM access
12
13
  - `--no-prompt` for automation and CI
13
14
  - `--list-strategies` to inspect available routes
14
15
  - `doctor` to diagnose local setup quickly
15
16
  - `auth login|status|change|logout|test` for secure token management
16
- - Local proxy only when a mapped strategy is selected
17
+ - Direct Claude Code calls to RouterLab with native model environment variables
17
18
 
18
19
  ## Requirements
19
20
 
@@ -57,7 +58,9 @@ npx claude-scionos --strategy aws
57
58
  npx claude-scionos --service llm --strategy claude
58
59
  npx claude-scionos --service llm --strategy claude-gpt
59
60
  npx claude-scionos --service llm --strategy claude-gpt-special
60
- npx claude-scionos --service llm --strategy deepseek-v4-beta
61
+ npx claude-scionos --service llm --strategy deepseek-v4
62
+ npx claude-scionos --service llm --strategy minimax-m2.7
63
+ npx claude-scionos --strategy deepseek-v4 --subagent-model haiku
61
64
  npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
62
65
  ```
63
66
 
@@ -67,23 +70,39 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
67
70
  - `--service llm` switches the launcher to `https://llm.routerlab.ch`
68
71
  - `llm` is intended for invitation-only access
69
72
  - Tokens stored with `auth login --service llm` are kept separate from the default RouterLab token
70
- - `llm` currently exposes `claude`, `claude-gpt`, `claude-gpt-special`, `deepseek-v4-beta`, and `claude-glm-5.1`
71
- - `routerlab` also exposes `aws`, `claude-gpt`, `deepseek-v4-beta`, `claude-kimi-k2.6`, and `claude-glm-5.1`
73
+ - `llm` currently exposes `claude`, `claude-gpt`, `claude-gpt-special`, `deepseek-v4`, `minimax-m2.7`, and `glm-5.1`
74
+ - `routerlab` also exposes `aws`, `claude-gpt`, `deepseek-v4`, `claude-kimi-k2.6`, and `glm-5.1`
72
75
 
73
76
  ## Strategies
74
77
 
75
- - `default`: use Claude Code normally without the local proxy
76
- - `aws`: remap Claude model families to RouterLab AWS-backed Claude variants
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-7`
78
- - `claude-gpt`: map Claude requests to the `claude-gpt` family
79
- Opus requests map to `claude-gpt-5.5`, Sonnet requests map to `claude-gpt-5.4`, and Haiku requests map to `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`: map Claude requests to `claude-deepseek-v4-pro` for opus or sonnet and `claude-deepseek-v4-flash` for haiku
82
- - `claude-kimi-k2.6`: force all requests to `claude-kimi-k2.6`
83
- - `claude-glm-5.1`: force all requests to `claude-glm-5.1`
78
+ - `default`: use Claude Code normally without forcing model environment variables
79
+ - `aws`: sets Claude Code model variables to RouterLab AWS-backed Claude variants
80
+ - `claude`: on `--service llm`, sets Opus to `claude-opus-4-7`, Haiku to `claude-opus-4-6`, Sonnet to `claude-sonnet-4-6`, and subagents to `claude-sonnet-4-6`
81
+ - `claude-gpt`: sets model variables to the GPT family
82
+ Opus uses `claude-gpt-5.5`, Sonnet uses `claude-gpt-5.4`, Haiku and subagents use `claude-gpt-5.4-mini`
83
+ - `claude-gpt-special`: on `--service llm`, uses `claude-gpt-5.4-sp` for Opus, Sonnet, Haiku, and subagents
84
+ - `deepseek-v4`: uses `claude-deepseek-v4-pro` for Opus/Sonnet and `claude-deepseek-v4-flash` for Haiku/subagents
85
+ - `minimax-m2.7`: on `--service llm`, shown as `minimax-m2.7` and uses `claude-minimax-m2.7` for Opus, Sonnet, Haiku, and subagents
86
+ - `claude-kimi-k2.6`: uses `claude-kimi-k2.6` for Opus, Sonnet, Haiku, and subagents
87
+ - `glm-5.1`: uses `claude-glm-5.1` for Opus, Sonnet, Haiku, and subagents
84
88
 
85
89
  Use `--list-strategies` to see the strategies available for the selected service and their live availability when a token is available.
86
90
 
91
+ ## Subagent model
92
+
93
+ By default, each strategy keeps its own subagent model. On the default RouterLab service, you can override only Claude Code subagents without changing the main Opus, Sonnet, and Haiku model variables:
94
+
95
+ - `--subagent-model default`: keep the strategy default
96
+ - `--subagent-model haiku`: force subagents to `claude-haiku-4-5-20251001`
97
+ - `--subagent-model gpt-5.4-mini`: force subagents to `claude-gpt-5.4-mini`
98
+
99
+ For example, `--strategy deepseek-v4` uses `claude-deepseek-v4-flash` for subagents by default. Adding `--subagent-model haiku` keeps the DeepSeek main model routing but sets `CLAUDE_CODE_SUBAGENT_MODEL=claude-haiku-4-5-20251001`.
100
+
101
+ With `--service llm --strategy claude`, the Subagent Model question is skipped and subagents are forced to `claude-sonnet-4-6`. Other `llm` strategies ask for one of these subagent models:
102
+
103
+ - `gpt-5.4-mini`
104
+ - `claude-deepseek-v4-flash`
105
+
87
106
  ## Token Handling
88
107
 
89
108
  Token resolution order:
@@ -115,6 +134,7 @@ claude-scionos auth test
115
134
 
116
135
  - `--strategy <value>` skips the interactive strategy menu and selects the route directly
117
136
  - `--service <value>` switches between RouterLab targets. `routerlab` is the default and `llm` is invitation-only
137
+ - `--subagent-model <default|haiku|gpt-5.4-mini>` selects only the Claude Code subagent model on the default RouterLab service; with `--service llm`, supported values are `gpt-5.4-mini` and `claude-deepseek-v4-flash`
118
138
  - `--no-prompt` disables every interactive question
119
139
 
120
140
  When `--no-prompt` is used, the launcher must already have a token from `ANTHROPIC_AUTH_TOKEN` or secure storage.
@@ -132,7 +152,7 @@ When `--no-prompt` is used, the launcher must already have a token from `ANTHROP
132
152
 
133
153
  ## Compatibility
134
154
 
135
- The wrapper forwards regular Claude Code flags and arguments. The local proxy is only started for mapped strategies. `default` launches Claude Code without the proxy layer.
155
+ The wrapper forwards regular Claude Code flags and arguments. RouterLab is called directly by Claude Code; strategies are applied through `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, `ANTHROPIC_DEFAULT_HAIKU_MODEL`, and, where needed, `CLAUDE_CODE_SUBAGENT_MODEL`.
136
156
 
137
157
  ## Troubleshooting
138
158
 
package/index.js CHANGED
@@ -41,6 +41,8 @@ import {
41
41
  getStoredToken,
42
42
  getStoredTokenStatus,
43
43
  getStrategyChoices,
44
+ getStrategyEnvironment,
45
+ getSubagentModelOverride,
44
46
  hasVerifiedModelIds,
45
47
  listStrategies,
46
48
  resolveServiceBaseUrl,
@@ -48,7 +50,6 @@ import {
48
50
  validateToken,
49
51
  validateTokenFormat
50
52
  } from './src/routerlab.js';
51
- import { startProxyServer } from './src/proxy.js';
52
53
 
53
54
  const require = createRequire(import.meta.url);
54
55
  const pkg = require('./package.json');
@@ -106,19 +107,6 @@ function resolveProcessExitCode(code, signal) {
106
107
  return 1;
107
108
  }
108
109
 
109
- function createCleanupOnce(cleanup) {
110
- let cleaned = false;
111
-
112
- return () => {
113
- if (cleaned) {
114
- return;
115
- }
116
-
117
- cleaned = true;
118
- cleanup();
119
- };
120
- }
121
-
122
110
  // --- UTILS ---
123
111
 
124
112
  function showBanner() {
@@ -162,9 +150,10 @@ function showHelp() {
162
150
  console.log(chalk.gray("Flags"));
163
151
  console.log(` ${chalk.cyan("--strategy <value>")} Preselect a strategy without opening the menu`);
164
152
  console.log(` ${chalk.cyan(`--service <${supportedServices}>`)} Select the RouterLab access target (${chalk.white("llm")} is invitation-only)`);
153
+ console.log(` ${chalk.cyan("--subagent-model <default|haiku|gpt-5.4-mini>")} Override the Claude Code subagent model`);
165
154
  console.log(` ${chalk.cyan("--no-prompt")} Do not ask any interactive question`);
166
155
  console.log(` ${chalk.cyan("--list-strategies")} List strategies and availability`);
167
- console.log(` ${chalk.cyan("--scionos-debug")} Show proxy and launch diagnostics`);
156
+ console.log(` ${chalk.cyan("--scionos-debug")} Show launch diagnostics`);
168
157
  console.log("");
169
158
  console.log(chalk.gray("Examples"));
170
159
  console.log(` ${chalk.cyan("claude-scionos --strategy aws")}`);
@@ -221,6 +210,10 @@ function normalizeStrategyValue(strategy) {
221
210
  return strategy?.trim() || null;
222
211
  }
223
212
 
213
+ function normalizeSubagentModelValue(subagentModel) {
214
+ return subagentModel?.trim()?.toLowerCase() || 'default';
215
+ }
216
+
224
217
  function normalizeServiceValue(service) {
225
218
  return service?.trim()?.toLowerCase() || DEFAULT_SERVICE;
226
219
  }
@@ -263,6 +256,7 @@ function parseWrapperArgs(argv) {
263
256
  noPrompt: false,
264
257
  service: normalizeServiceValue(process.env.SCIONOS_SERVICE),
265
258
  strategy: null,
259
+ subagentModel: normalizeSubagentModelValue(process.env.SCIONOS_SUBAGENT_MODEL),
266
260
  version: false
267
261
  };
268
262
 
@@ -308,6 +302,12 @@ function parseWrapperArgs(argv) {
308
302
  continue;
309
303
  }
310
304
 
305
+ if (arg === '--subagent-model') {
306
+ parsed.subagentModel = normalizeSubagentModelValue(getRequiredOptionValue(argv, index, '--subagent-model'));
307
+ index += 1;
308
+ continue;
309
+ }
310
+
311
311
  if (arg.startsWith('--strategy=')) {
312
312
  parsed.strategy = normalizeStrategyValue(getRequiredInlineOptionValue(arg.slice('--strategy='.length), '--strategy'));
313
313
  continue;
@@ -318,6 +318,11 @@ function parseWrapperArgs(argv) {
318
318
  continue;
319
319
  }
320
320
 
321
+ if (arg.startsWith('--subagent-model=')) {
322
+ parsed.subagentModel = normalizeSubagentModelValue(getRequiredInlineOptionValue(arg.slice('--subagent-model='.length), '--subagent-model'));
323
+ continue;
324
+ }
325
+
321
326
  if (arg === '--no-prompt') {
322
327
  parsed.noPrompt = true;
323
328
  continue;
@@ -480,6 +485,18 @@ async function resolveLaunchToken(noPrompt, serviceConfig) {
480
485
  };
481
486
  }
482
487
 
488
+ function buildClaudeLaunchEnvironment(token, serviceConfig, strategyValue, options = {}) {
489
+ return {
490
+ ...process.env,
491
+ ANTHROPIC_BASE_URL: resolveServiceBaseUrl(serviceConfig.value),
492
+ ANTHROPIC_AUTH_TOKEN: token,
493
+ ANTHROPIC_API_KEY: "",
494
+ ...getStrategyEnvironment(strategyValue, serviceConfig.value, {
495
+ subagentModel: options.subagentModel
496
+ })
497
+ };
498
+ }
499
+
483
500
  async function resolveStrategyChoice(parsed, modelIds, serviceConfig) {
484
501
  const finalizeChoice = (selected) => {
485
502
  const selectedLaunchReadiness = assessStrategyLaunch(selected, modelIds, serviceConfig.value);
@@ -547,6 +564,57 @@ async function resolveStrategyChoice(parsed, modelIds, serviceConfig) {
547
564
  return finalizeChoice(selected);
548
565
  }
549
566
 
567
+ async function resolveSubagentModelChoice(parsed, serviceConfig, strategyValue) {
568
+ if (serviceConfig?.value === 'llm' && strategyValue === 'claude') {
569
+ return 'claude-sonnet-4-6';
570
+ }
571
+
572
+ if (parsed.subagentModel !== 'default') {
573
+ getSubagentModelOverride(parsed.subagentModel, serviceConfig?.value);
574
+ return parsed.subagentModel;
575
+ }
576
+
577
+ if (parsed.noPrompt) {
578
+ return 'default';
579
+ }
580
+
581
+ const choices = serviceConfig?.value === 'llm'
582
+ ? [
583
+ {
584
+ name: 'GPT 5.4 mini',
585
+ value: 'gpt-5.4-mini',
586
+ description: 'Force Claude Code subagents to gpt-5.4-mini.',
587
+ },
588
+ {
589
+ name: 'Claude DeepSeek V4 flash',
590
+ value: 'claude-deepseek-v4-flash',
591
+ description: 'Force Claude Code subagents to claude-deepseek-v4-flash.',
592
+ },
593
+ ]
594
+ : [
595
+ {
596
+ name: 'Strategy default',
597
+ value: 'default',
598
+ description: 'Use the subagent model defined by the selected strategy.',
599
+ },
600
+ {
601
+ name: 'Claude Haiku',
602
+ value: 'haiku',
603
+ description: 'Force Claude Code subagents to claude-haiku-4-5-20251001.',
604
+ },
605
+ {
606
+ name: 'GPT 5.4 mini',
607
+ value: 'gpt-5.4-mini',
608
+ description: 'Force Claude Code subagents to gpt-5.4-mini.',
609
+ },
610
+ ];
611
+
612
+ return select({
613
+ message: 'Select Subagent Model:',
614
+ choices,
615
+ });
616
+ }
617
+
550
618
  function showStrategies(modelIds = null, serviceConfig) {
551
619
  const strategies = listStrategies(modelIds, serviceConfig.value);
552
620
  showSection('Strategies', strategies.map((strategy) => {
@@ -766,41 +834,18 @@ async function main() {
766
834
  }
767
835
 
768
836
  const modelChoice = await resolveStrategyChoice(parsed, validation.models, serviceConfig);
769
- let finalBaseUrl = resolveServiceBaseUrl(serviceConfig.value);
770
- let proxyServer = null;
771
-
772
- if (modelChoice !== 'default') {
773
- if (interactive) {
774
- console.log(chalk.magenta(`\n🔮 Starting Local Proxy to map models to ${chalk.bold(modelChoice)}...`));
775
- }
776
-
777
- const proxyInfo = await startProxyServer(modelChoice, token, {
778
- availableModels: validation.models,
779
- baseUrl: resolveServiceBaseUrl(serviceConfig.value),
780
- debug: isDebug,
781
- onDebug: (message) => console.log(chalk.yellow(message)),
782
- onError: (message) => console.error(chalk.red(message))
783
- });
784
- proxyServer = proxyInfo.server;
785
- finalBaseUrl = proxyInfo.url; // e.g. http://127.0.0.1:54321
786
- if (interactive && isDebug) console.log(chalk.gray(`✓ Proxy listening on ${finalBaseUrl}`));
787
- if (interactive && isDebug && !proxyInfo.authenticated) {
788
- console.log(chalk.yellow('WARN Proxy authentication is not enabled because Claude Code header injection is not verified; binding remains limited to 127.0.0.1.'));
789
- }
790
- }
791
-
792
- const env = {
793
- ...process.env,
794
- ANTHROPIC_BASE_URL: finalBaseUrl,
795
- ANTHROPIC_AUTH_TOKEN: token,
796
- ANTHROPIC_API_KEY: "" // Force empty
797
- };
837
+ const subagentModelChoice = await resolveSubagentModelChoice(parsed, serviceConfig, modelChoice);
838
+ const finalBaseUrl = resolveServiceBaseUrl(serviceConfig.value);
839
+ const env = buildClaudeLaunchEnvironment(token, serviceConfig, modelChoice, {
840
+ subagentModel: subagentModelChoice
841
+ });
798
842
 
799
843
  if (interactive) {
800
844
  showSection('Launch Summary', [
801
845
  `${chalk.white('Service:')} ${serviceConfig.label}`,
802
846
  `${chalk.white('Token source:')} ${formatTokenSource(source)}`,
803
847
  `${chalk.white('Strategy:')} ${modelChoice}`,
848
+ `${chalk.white('Subagent model:')} ${subagentModelChoice}`,
804
849
  `${chalk.white('Endpoint:')} ${finalBaseUrl}`,
805
850
  `${chalk.white('Mode:')} ${parsed.noPrompt ? 'non-interactive' : 'guided'}`
806
851
  ]);
@@ -813,20 +858,11 @@ async function main() {
813
858
  shell: shouldSpawnWithShell(claudeStatus.cliPath)
814
859
  });
815
860
 
816
- const cleanup = createCleanupOnce(() => {
817
- if (proxyServer) {
818
- if (interactive && isDebug) console.log(chalk.gray('\nStopping proxy server...'));
819
- proxyServer.close();
820
- }
821
- });
822
-
823
861
  child.on('exit', (code, signal) => {
824
- cleanup();
825
862
  process.exit(resolveProcessExitCode(code, signal));
826
863
  });
827
864
 
828
865
  child.on('error', (err) => {
829
- cleanup();
830
866
  console.error(chalk.red(`\n❌ Error launching Claude CLI:`));
831
867
  if (err.code === 'ENOENT') {
832
868
  console.error(chalk.yellow(` Executable not found. Try 'npm install -g @anthropic-ai/claude-code'`));
@@ -839,12 +875,11 @@ async function main() {
839
875
  });
840
876
 
841
877
  process.on('SIGINT', () => {
842
- // Claude handles SIGINT; we keep the wrapper alive for cleanup on child exit.
878
+ // Claude handles SIGINT; the wrapper stays alive until the child exits.
843
879
  });
844
880
 
845
881
  process.on('SIGTERM', () => {
846
882
  if (child) child.kill('SIGTERM');
847
- cleanup();
848
883
  process.exit(resolveProcessExitCode(null, 'SIGTERM'));
849
884
  });
850
885
  }
@@ -859,8 +894,8 @@ if (isEntrypoint) {
859
894
  }
860
895
 
861
896
  export {
897
+ buildClaudeLaunchEnvironment,
862
898
  canProceedWithValidation,
863
- createCleanupOnce,
864
899
  installClaudeCode,
865
900
  main,
866
901
  normalizeEntrypointPath,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-scionos",
3
- "version": "4.6.0",
4
- "description": "RouterLab launcher, strategy proxy and secure token wrapper for Claude Code CLI",
3
+ "version": "5.1.0",
4
+ "description": "RouterLab launcher, model strategy configurator and secure token wrapper for Claude Code CLI",
5
5
  "type": "module",
6
6
  "main": "index.js",
7
7
  "bin": {
@@ -43,12 +43,12 @@
43
43
  },
44
44
  "private": false,
45
45
  "dependencies": {
46
- "@inquirer/prompts": "^8.4.2"
46
+ "@inquirer/prompts": "^8.4.3"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@eslint/js": "^10.0.1",
50
- "eslint": "^10.3.0",
50
+ "eslint": "^10.4.0",
51
51
  "globals": "^17.6.0",
52
- "vitest": "^4.1.5"
52
+ "vitest": "^4.1.7"
53
53
  }
54
54
  }