claude-scionos 4.5.0 → 5.0.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,19 +1,20 @@
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
 
7
7
  ## Points clés
8
8
 
9
- - lancement guidé pour les nouveaux utilisateurs
10
- - `--strategy` pour choisir une stratégie sans menu
11
- - `--service llm` pour l'accès RouterLab LLM sur invitation
9
+ - lancement guidé pour les nouveaux utilisateurs
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
12
+ - `--service llm` pour l'accès RouterLab LLM sur invitation
12
13
  - `--no-prompt` pour l'automatisation et la CI
13
- - `--list-strategies` pour voir les routes disponibles
14
- - `doctor` pour diagnostiquer rapidement un poste client
15
- - `auth login|status|change|logout|test` pour gérer le token
16
- - proxy local lancé uniquement si une stratégie mappée est choisie
14
+ - `--list-strategies` pour voir les routes disponibles
15
+ - `doctor` pour diagnostiquer rapidement un poste client
16
+ - `auth login|status|change|logout|test` pour gérer le token
17
+ - appels directs de Claude Code vers RouterLab via les variables de modèles natives
17
18
 
18
19
  ## Prérequis
19
20
 
@@ -55,11 +56,14 @@ npx claude-scionos auth login --service llm
55
56
  npx claude-scionos auth test
56
57
  npx claude-scionos --strategy aws
57
58
  npx claude-scionos --service llm --strategy claude
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
61
- npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
62
- ```
59
+ npx claude-scionos --service llm --strategy claude-gpt
60
+ npx claude-scionos --service llm --strategy claude-gpt-special
61
+ npx claude-scionos --service llm --strategy deepseek-v4
62
+ npx claude-scionos --service llm --strategy claude-minimax-m2.7
63
+ npx claude-scionos --service llm --strategy claude-qwen3.6-plus
64
+ npx claude-scionos --strategy deepseek-v4 --subagent-model haiku
65
+ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
66
+ ```
63
67
 
64
68
  ## Services
65
69
 
@@ -67,23 +71,34 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
67
71
  - `--service llm` bascule le lanceur vers `https://llm.routerlab.ch`
68
72
  - `llm` est prévu pour un accès sur invitation
69
73
  - 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-minimax-m2.7`
71
- - `routerlab` expose aussi `claude-gpt`, `claude-kimi-k2.6`, `claude-minimax-m2.7` et `claude-glm-5.1`
74
+ - `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-gpt-special`, `deepseek-v4`, `claude-minimax-m2.7`, `claude-qwen3.6-plus` et `claude-glm-5.1`
75
+ - `routerlab` expose aussi `aws`, `claude-gpt`, `deepseek-v4`, `claude-kimi-k2.6` et `claude-glm-5.1`
72
76
 
73
77
  ## Stratégies
74
78
 
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-6`
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` : sur `--service llm`, 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-minimax-m2.7` : force toutes les requêtes vers `claude-minimax-m2.7`
84
- - `claude-glm-5.1` : force toutes les requêtes vers `claude-glm-5.1`
85
-
86
- Utilise `--list-strategies` pour voir les stratégies disponibles pour le service choisi et leur disponibilité réelle quand un token est disponible.
79
+ - `default` : utilise Claude Code normalement sans forcer de variables de modèles
80
+ - `aws` : configure les variables de modèles Claude Code vers les variantes Claude AWS de RouterLab
81
+ - `claude` : sur `--service llm`, configure les variables vers `claude-haiku-4-5-20251001`, `claude-sonnet-4-6` et `claude-opus-4-7`
82
+ - `claude-gpt` : configure les variables vers la famille GPT
83
+ Opus utilise `gpt-5.5`, Sonnet utilise `gpt-5.4`, Haiku et les sous-agents utilisent `gpt-5.4-mini`
84
+ - `claude-gpt-special` : sur `--service llm`, utilise `claude-gpt-5.4-sp` pour Opus, Sonnet, Haiku et les sous-agents
85
+ - `deepseek-v4` : utilise `claude-deepseek-v4-pro` pour Opus/Sonnet et `claude-deepseek-v4-flash` pour Haiku/sous-agents
86
+ - `claude-minimax-m2.7` : sur `--service llm`, affiche `minimax-m2.7 beta` et utilise `claude-minimax-m2.7` pour Opus, Sonnet, Haiku et les sous-agents
87
+ - `claude-qwen3.6-plus` : sur `--service llm`, affiche `qwen3.6-plus beta` et utilise `claude-qwen3.6-plus` pour Opus, Sonnet, Haiku et les sous-agents
88
+ - `claude-kimi-k2.6` : utilise `claude-kimi-k2.6` pour Opus, Sonnet, Haiku et les sous-agents
89
+ - `claude-glm-5.1` : utilise `claude-glm-5.1` pour Opus, Sonnet, Haiku et les sous-agents
90
+
91
+ Utilise `--list-strategies` pour voir les stratégies disponibles pour le service choisi et leur disponibilité réelle quand un token est disponible.
92
+
93
+ ## Modèle de sous-agent
94
+
95
+ Par défaut, chaque stratégie garde son propre modèle de sous-agent. Tu peux surcharger uniquement les sous-agents Claude Code sans changer les variables principales Opus, Sonnet et Haiku :
96
+
97
+ - `--subagent-model default` : garde le défaut de la stratégie
98
+ - `--subagent-model haiku` : force les sous-agents vers `claude-haiku-4-5-20251001`
99
+ - `--subagent-model gpt-5.4-mini` : force les sous-agents vers `gpt-5.4-mini`
100
+
101
+ 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`.
87
102
 
88
103
  ## Gestion du token
89
104
 
@@ -114,9 +129,10 @@ claude-scionos auth test
114
129
 
115
130
  ## Ce que veulent dire `--strategy` et `--no-prompt`
116
131
 
117
- - `--strategy <value>` évite le menu interactif et choisit directement la route
118
- - `--service <value>` change la cible RouterLab. `routerlab` reste le défaut et `llm` est réservé à l'accès sur invitation
119
- - `--no-prompt` désactive toutes les questions interactives
132
+ - `--strategy <value>` évite le menu interactif et choisit directement la route
133
+ - `--service <value>` change la cible RouterLab. `routerlab` reste le défaut et `llm` est réservé à l'accès sur invitation
134
+ - `--subagent-model <default|haiku|gpt-5.4-mini>` choisit seulement le modèle de sous-agent Claude Code
135
+ - `--no-prompt` désactive toutes les questions interactives
120
136
 
121
137
  Quand `--no-prompt` est utilisé, le lanceur doit déjà avoir un token via `ANTHROPIC_AUTH_TOKEN` ou via le stockage sécurisé.
122
138
 
@@ -133,7 +149,7 @@ Quand `--no-prompt` est utilisé, le lanceur doit déjà avoir un token via `ANT
133
149
 
134
150
  ## Compatibilité
135
151
 
136
- 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.
152
+ 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`.
137
153
 
138
154
  ## Dépannage
139
155
 
package/README.md CHANGED
@@ -1,19 +1,20 @@
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
 
7
7
  ## Highlights
8
8
 
9
9
  - Guided launch for first-time users
10
- - `--strategy` to preselect a routing strategy
11
- - `--service llm` for invitation-only RouterLab LLM access
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
12
+ - `--service llm` for invitation-only RouterLab LLM access
12
13
  - `--no-prompt` for automation and CI
13
- - `--list-strategies` to inspect available routes
14
- - `doctor` to diagnose local setup quickly
15
- - `auth login|status|change|logout|test` for secure token management
16
- - Local proxy only when a mapped strategy is selected
14
+ - `--list-strategies` to inspect available routes
15
+ - `doctor` to diagnose local setup quickly
16
+ - `auth login|status|change|logout|test` for secure token management
17
+ - Direct Claude Code calls to RouterLab with native model environment variables
17
18
 
18
19
  ## Requirements
19
20
 
@@ -55,11 +56,14 @@ npx claude-scionos auth login --service llm
55
56
  npx claude-scionos auth test
56
57
  npx claude-scionos --strategy aws
57
58
  npx claude-scionos --service llm --strategy claude
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
61
- npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
62
- ```
59
+ npx claude-scionos --service llm --strategy claude-gpt
60
+ npx claude-scionos --service llm --strategy claude-gpt-special
61
+ npx claude-scionos --service llm --strategy deepseek-v4
62
+ npx claude-scionos --service llm --strategy claude-minimax-m2.7
63
+ npx claude-scionos --service llm --strategy claude-qwen3.6-plus
64
+ npx claude-scionos --strategy deepseek-v4 --subagent-model haiku
65
+ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
66
+ ```
63
67
 
64
68
  ## Services
65
69
 
@@ -67,23 +71,34 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
67
71
  - `--service llm` switches the launcher to `https://llm.routerlab.ch`
68
72
  - `llm` is intended for invitation-only access
69
73
  - 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-minimax-m2.7`
71
- - `routerlab` also exposes `claude-gpt`, `claude-kimi-k2.6`, `claude-minimax-m2.7`, and `claude-glm-5.1`
74
+ - `llm` currently exposes `claude`, `claude-gpt`, `claude-gpt-special`, `deepseek-v4`, `claude-minimax-m2.7`, `claude-qwen3.6-plus`, and `claude-glm-5.1`
75
+ - `routerlab` also exposes `aws`, `claude-gpt`, `deepseek-v4`, `claude-kimi-k2.6`, and `claude-glm-5.1`
72
76
 
73
77
  ## Strategies
74
78
 
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-6`
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`: on `--service llm`, 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-minimax-m2.7`: force all requests to `claude-minimax-m2.7`
84
- - `claude-glm-5.1`: force all requests to `claude-glm-5.1`
85
-
86
- Use `--list-strategies` to see the strategies available for the selected service and their live availability when a token is available.
79
+ - `default`: use Claude Code normally without forcing model environment variables
80
+ - `aws`: sets Claude Code model variables to RouterLab AWS-backed Claude variants
81
+ - `claude`: on `--service llm`, sets model variables to `claude-haiku-4-5-20251001`, `claude-sonnet-4-6`, and `claude-opus-4-7`
82
+ - `claude-gpt`: sets model variables to the GPT family
83
+ Opus uses `gpt-5.5`, Sonnet uses `gpt-5.4`, Haiku and subagents use `gpt-5.4-mini`
84
+ - `claude-gpt-special`: on `--service llm`, uses `claude-gpt-5.4-sp` for Opus, Sonnet, Haiku, and subagents
85
+ - `deepseek-v4`: uses `claude-deepseek-v4-pro` for Opus/Sonnet and `claude-deepseek-v4-flash` for Haiku/subagents
86
+ - `claude-minimax-m2.7`: on `--service llm`, shown as `minimax-m2.7 beta` and uses `claude-minimax-m2.7` for Opus, Sonnet, Haiku, and subagents
87
+ - `claude-qwen3.6-plus`: on `--service llm`, shown as `qwen3.6-plus beta` and uses `claude-qwen3.6-plus` for Opus, Sonnet, Haiku, and subagents
88
+ - `claude-kimi-k2.6`: uses `claude-kimi-k2.6` for Opus, Sonnet, Haiku, and subagents
89
+ - `claude-glm-5.1`: uses `claude-glm-5.1` for Opus, Sonnet, Haiku, and subagents
90
+
91
+ Use `--list-strategies` to see the strategies available for the selected service and their live availability when a token is available.
92
+
93
+ ## Subagent model
94
+
95
+ By default, each strategy keeps its own subagent model. You can override only Claude Code subagents without changing the main Opus, Sonnet, and Haiku model variables:
96
+
97
+ - `--subagent-model default`: keep the strategy default
98
+ - `--subagent-model haiku`: force subagents to `claude-haiku-4-5-20251001`
99
+ - `--subagent-model gpt-5.4-mini`: force subagents to `gpt-5.4-mini`
100
+
101
+ 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`.
87
102
 
88
103
  ## Token Handling
89
104
 
@@ -114,9 +129,10 @@ claude-scionos auth test
114
129
 
115
130
  ## What `--strategy` and `--no-prompt` mean
116
131
 
117
- - `--strategy <value>` skips the interactive strategy menu and selects the route directly
118
- - `--service <value>` switches between RouterLab targets. `routerlab` is the default and `llm` is invitation-only
119
- - `--no-prompt` disables every interactive question
132
+ - `--strategy <value>` skips the interactive strategy menu and selects the route directly
133
+ - `--service <value>` switches between RouterLab targets. `routerlab` is the default and `llm` is invitation-only
134
+ - `--subagent-model <default|haiku|gpt-5.4-mini>` selects only the Claude Code subagent model
135
+ - `--no-prompt` disables every interactive question
120
136
 
121
137
  When `--no-prompt` is used, the launcher must already have a token from `ANTHROPIC_AUTH_TOKEN` or secure storage.
122
138
 
@@ -133,7 +149,7 @@ When `--no-prompt` is used, the launcher must already have a token from `ANTHROP
133
149
 
134
150
  ## Compatibility
135
151
 
136
- 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.
152
+ 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`.
137
153
 
138
154
  ## Troubleshooting
139
155
 
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,38 @@ async function resolveStrategyChoice(parsed, modelIds, serviceConfig) {
547
564
  return finalizeChoice(selected);
548
565
  }
549
566
 
567
+ async function resolveSubagentModelChoice(parsed) {
568
+ if (parsed.subagentModel !== 'default') {
569
+ getSubagentModelOverride(parsed.subagentModel);
570
+ return parsed.subagentModel;
571
+ }
572
+
573
+ if (parsed.noPrompt) {
574
+ return 'default';
575
+ }
576
+
577
+ return select({
578
+ message: 'Select Subagent Model:',
579
+ choices: [
580
+ {
581
+ name: 'Strategy default',
582
+ value: 'default',
583
+ description: 'Use the subagent model defined by the selected strategy.',
584
+ },
585
+ {
586
+ name: 'Claude Haiku',
587
+ value: 'haiku',
588
+ description: 'Force Claude Code subagents to claude-haiku-4-5-20251001.',
589
+ },
590
+ {
591
+ name: 'GPT 5.4 mini',
592
+ value: 'gpt-5.4-mini',
593
+ description: 'Force Claude Code subagents to gpt-5.4-mini.',
594
+ },
595
+ ],
596
+ });
597
+ }
598
+
550
599
  function showStrategies(modelIds = null, serviceConfig) {
551
600
  const strategies = listStrategies(modelIds, serviceConfig.value);
552
601
  showSection('Strategies', strategies.map((strategy) => {
@@ -766,41 +815,18 @@ async function main() {
766
815
  }
767
816
 
768
817
  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
- };
818
+ const subagentModelChoice = await resolveSubagentModelChoice(parsed);
819
+ const finalBaseUrl = resolveServiceBaseUrl(serviceConfig.value);
820
+ const env = buildClaudeLaunchEnvironment(token, serviceConfig, modelChoice, {
821
+ subagentModel: subagentModelChoice
822
+ });
798
823
 
799
824
  if (interactive) {
800
825
  showSection('Launch Summary', [
801
826
  `${chalk.white('Service:')} ${serviceConfig.label}`,
802
827
  `${chalk.white('Token source:')} ${formatTokenSource(source)}`,
803
828
  `${chalk.white('Strategy:')} ${modelChoice}`,
829
+ `${chalk.white('Subagent model:')} ${subagentModelChoice}`,
804
830
  `${chalk.white('Endpoint:')} ${finalBaseUrl}`,
805
831
  `${chalk.white('Mode:')} ${parsed.noPrompt ? 'non-interactive' : 'guided'}`
806
832
  ]);
@@ -813,20 +839,11 @@ async function main() {
813
839
  shell: shouldSpawnWithShell(claudeStatus.cliPath)
814
840
  });
815
841
 
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
842
  child.on('exit', (code, signal) => {
824
- cleanup();
825
843
  process.exit(resolveProcessExitCode(code, signal));
826
844
  });
827
845
 
828
846
  child.on('error', (err) => {
829
- cleanup();
830
847
  console.error(chalk.red(`\n❌ Error launching Claude CLI:`));
831
848
  if (err.code === 'ENOENT') {
832
849
  console.error(chalk.yellow(` Executable not found. Try 'npm install -g @anthropic-ai/claude-code'`));
@@ -839,12 +856,11 @@ async function main() {
839
856
  });
840
857
 
841
858
  process.on('SIGINT', () => {
842
- // Claude handles SIGINT; we keep the wrapper alive for cleanup on child exit.
859
+ // Claude handles SIGINT; the wrapper stays alive until the child exits.
843
860
  });
844
861
 
845
862
  process.on('SIGTERM', () => {
846
863
  if (child) child.kill('SIGTERM');
847
- cleanup();
848
864
  process.exit(resolveProcessExitCode(null, 'SIGTERM'));
849
865
  });
850
866
  }
@@ -859,8 +875,8 @@ if (isEntrypoint) {
859
875
  }
860
876
 
861
877
  export {
878
+ buildClaudeLaunchEnvironment,
862
879
  canProceedWithValidation,
863
- createCleanupOnce,
864
880
  installClaudeCode,
865
881
  main,
866
882
  normalizeEntrypointPath,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-scionos",
3
- "version": "4.5.0",
4
- "description": "RouterLab launcher, strategy proxy and secure token wrapper for Claude Code CLI",
3
+ "version": "5.0.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.6"
53
53
  }
54
54
  }