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 +47 -31
- package/README.md +46 -30
- package/index.js +72 -56
- package/package.json +5 -5
- package/src/routerlab.js +144 -66
- package/src/proxy.js +0 -673
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é,
|
|
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
|
-
- `--
|
|
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
|
-
-
|
|
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
|
|
61
|
-
npx claude-scionos --
|
|
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-
|
|
71
|
-
- `routerlab` expose aussi `claude-gpt`, `
|
|
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
|
|
76
|
-
- `aws` :
|
|
77
|
-
- `claude` :
|
|
78
|
-
- `claude-gpt` :
|
|
79
|
-
|
|
80
|
-
- `claude-gpt-special` : sur `--service llm`,
|
|
81
|
-
- `deepseek-v4
|
|
82
|
-
- `claude-
|
|
83
|
-
- `claude-
|
|
84
|
-
- `claude-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
- `--
|
|
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.
|
|
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
|
|
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
|
-
- `--
|
|
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
|
-
-
|
|
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
|
|
61
|
-
npx claude-scionos --
|
|
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
|
|
71
|
-
- `routerlab` also exposes `claude-gpt`, `
|
|
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
|
|
76
|
-
- `aws`:
|
|
77
|
-
- `claude`:
|
|
78
|
-
- `claude-gpt`:
|
|
79
|
-
Opus
|
|
80
|
-
- `claude-gpt-special`: on `--service llm`,
|
|
81
|
-
- `deepseek-v4
|
|
82
|
-
- `claude-
|
|
83
|
-
- `claude-
|
|
84
|
-
- `claude-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
- `--
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
};
|
|
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;
|
|
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
|
-
"description": "RouterLab launcher, strategy
|
|
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.
|
|
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.6"
|
|
53
53
|
}
|
|
54
54
|
}
|