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 +35 -15
- package/README.md +35 -15
- package/index.js +91 -56
- package/package.json +5 -5
- package/src/routerlab.js +224 -60
- package/src/proxy.js +0 -673
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é,
|
|
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
|
-
-
|
|
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
|
|
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-
|
|
71
|
-
- `routerlab` expose aussi `aws`, `claude-gpt`, `deepseek-v4
|
|
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
|
|
76
|
-
- `aws` :
|
|
77
|
-
- `claude` :
|
|
78
|
-
- `claude-gpt` :
|
|
79
|
-
|
|
80
|
-
- `claude-gpt-special` : sur `--service llm`,
|
|
81
|
-
- `deepseek-v4
|
|
82
|
-
- `
|
|
83
|
-
- `claude-
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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-
|
|
71
|
-
- `routerlab` also exposes `aws`, `claude-gpt`, `deepseek-v4
|
|
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
|
|
76
|
-
- `aws`:
|
|
77
|
-
- `claude`:
|
|
78
|
-
- `claude-gpt`:
|
|
79
|
-
Opus
|
|
80
|
-
- `claude-gpt-special`: on `--service llm`,
|
|
81
|
-
- `deepseek-v4
|
|
82
|
-
- `
|
|
83
|
-
- `claude-
|
|
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.
|
|
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
|
|
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
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
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;
|
|
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
|
-
"description": "RouterLab launcher, strategy
|
|
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.
|
|
46
|
+
"@inquirer/prompts": "^8.4.3"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@eslint/js": "^10.0.1",
|
|
50
|
-
"eslint": "^10.
|
|
50
|
+
"eslint": "^10.4.0",
|
|
51
51
|
"globals": "^17.6.0",
|
|
52
|
-
"vitest": "^4.1.
|
|
52
|
+
"vitest": "^4.1.7"
|
|
53
53
|
}
|
|
54
54
|
}
|