pleumrouter 0.5.33 → 0.5.35
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/bin/pleum.mjs +0 -0
- package/package.json +1 -1
- package/src/launch.mjs +3 -0
- package/src/locales/es.mjs +4 -0
- package/src/locales/ja.mjs +4 -0
- package/src/locales/ko.mjs +4 -0
- package/src/locales/zh.mjs +4 -0
- package/src/login.mjs +18 -1
- package/src/menu.mjs +34 -5
- package/src/recipes.mjs +12 -8
- package/src/settings.mjs +2 -2
- package/src/wire.mjs +1 -2
package/bin/pleum.mjs
CHANGED
|
File without changes
|
package/package.json
CHANGED
package/src/launch.mjs
CHANGED
|
@@ -117,6 +117,9 @@ export async function launch(tool, model, passthrough, { exit = true } = {}) {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
const env = { ...process.env, ...r.env(key, model) };
|
|
120
|
+
if (resolved === "claude") {
|
|
121
|
+
delete env.ANTHROPIC_API_KEY;
|
|
122
|
+
}
|
|
120
123
|
|
|
121
124
|
// Codex는 격리 CODEX_HOME에 config.toml을 써서 사용자 ~/.codex를 보존한다.
|
|
122
125
|
if (r.type === "codex-home") {
|
package/src/locales/es.mjs
CHANGED
|
@@ -311,6 +311,10 @@ export const ES = {
|
|
|
311
311
|
"Sonnet model": "Modelo Sonnet",
|
|
312
312
|
"Opus model": "Modelo Opus",
|
|
313
313
|
"Haiku model": "Modelo Haiku",
|
|
314
|
+
"Use existing model configuration?": "¿Continuar con la configuración de modelos existente?",
|
|
315
|
+
"Keep existing configuration": "Continuar con la configuración existente",
|
|
316
|
+
"Reconfigure tiers": "Reconfigurar modelos",
|
|
317
|
+
"Choose Sonnet, Opus, and Haiku models again": "Volver a elegir los modelos Sonnet, Opus y Haiku",
|
|
314
318
|
|
|
315
319
|
// Codex & agy Effort
|
|
316
320
|
"Select reasoning effort": "Seleccionar esfuerzo de razonamiento",
|
package/src/locales/ja.mjs
CHANGED
|
@@ -311,6 +311,10 @@ export const JA = {
|
|
|
311
311
|
"Sonnet model": "Sonnet モデル",
|
|
312
312
|
"Opus model": "Opus モデル",
|
|
313
313
|
"Haiku model": "Haiku モデル",
|
|
314
|
+
"Use existing model configuration?": "既存のモデル設定で続行しますか?",
|
|
315
|
+
"Keep existing configuration": "既存の設定のまま続行",
|
|
316
|
+
"Reconfigure tiers": "モデルを再設定",
|
|
317
|
+
"Choose Sonnet, Opus, and Haiku models again": "Sonnet、Opus、Haiku モデルを再選択",
|
|
314
318
|
|
|
315
319
|
// Codex & agy Effort
|
|
316
320
|
"Select reasoning effort": "推論強度 (effort) の選択",
|
package/src/locales/ko.mjs
CHANGED
|
@@ -374,6 +374,10 @@ export const KO = {
|
|
|
374
374
|
"Sonnet model": "Sonnet 모델",
|
|
375
375
|
"Opus model": "Opus 모델",
|
|
376
376
|
"Haiku model": "Haiku 모델",
|
|
377
|
+
"Use existing model configuration?": "기존 모델 설정대로 진행하시겠습니까?",
|
|
378
|
+
"Keep existing configuration": "기존 설정대로 진행",
|
|
379
|
+
"Reconfigure tiers": "모델 다시 설정",
|
|
380
|
+
"Choose Sonnet, Opus, and Haiku models again": "Sonnet, Opus, Haiku 모델 새로 지정",
|
|
377
381
|
|
|
378
382
|
// Codex & agy Effort
|
|
379
383
|
"Select reasoning effort": "추론 강도(effort) 선택",
|
package/src/locales/zh.mjs
CHANGED
|
@@ -311,6 +311,10 @@ export const ZH = {
|
|
|
311
311
|
"Sonnet model": "Sonnet 模型",
|
|
312
312
|
"Opus model": "Opus 模型",
|
|
313
313
|
"Haiku model": "Haiku 模型",
|
|
314
|
+
"Use existing model configuration?": "使用现有的模型配置继续吗?",
|
|
315
|
+
"Keep existing configuration": "保持现有配置继续",
|
|
316
|
+
"Reconfigure tiers": "重新配置模型",
|
|
317
|
+
"Choose Sonnet, Opus, and Haiku models again": "重新选择 Sonnet、Opus 和 Haiku 模型",
|
|
314
318
|
|
|
315
319
|
// Codex & agy Effort
|
|
316
320
|
"Select reasoning effort": "选择推理强度 (effort)",
|
package/src/login.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
|
-
import { ROOT, SITE_ROOT, V1, readConfig, writeConfig, mergeLoginConfig, clearCredentials } from "./config.mjs";
|
|
4
|
+
import { ROOT, SITE_ROOT, V1, readConfig, writeConfig, mergeLoginConfig, clearCredentials, setActiveContext } from "./config.mjs";
|
|
5
5
|
import { t } from "./i18n.mjs";
|
|
6
6
|
import { sanitizeTerminalText } from "./ansi.mjs";
|
|
7
7
|
|
|
@@ -47,6 +47,21 @@ function saveTokens({ access_token, refresh_token, expires_in }) {
|
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
export async function syncCliContext(accessToken) {
|
|
51
|
+
if (!accessToken) return;
|
|
52
|
+
try {
|
|
53
|
+
const res = await fetch(`${V1}/auth/cli-context`, {
|
|
54
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
55
|
+
});
|
|
56
|
+
if (res.ok) {
|
|
57
|
+
const data = await res.json();
|
|
58
|
+
if (data?.active_context) {
|
|
59
|
+
setActiveContext(data.active_context);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} catch {}
|
|
63
|
+
}
|
|
64
|
+
|
|
50
65
|
// 브라우저 핸드오프: 로컬 콜백 서버를 열고 대시보드 /cli-auth로 보낸다.
|
|
51
66
|
// 프론트가 로그인 확인 후 JWT를 발급해 127.0.0.1:PORT/cb 로 POST 한다.
|
|
52
67
|
export async function login() {
|
|
@@ -110,6 +125,7 @@ export async function login() {
|
|
|
110
125
|
});
|
|
111
126
|
|
|
112
127
|
saveTokens(tokens);
|
|
128
|
+
await syncCliContext(tokens.access_token);
|
|
113
129
|
console.log(`✓ ${t("Logged in. Saved the session to ~/.pleum/config.json.")}`);
|
|
114
130
|
}
|
|
115
131
|
|
|
@@ -157,6 +173,7 @@ export async function loginDevice() {
|
|
|
157
173
|
process.exit(1);
|
|
158
174
|
}
|
|
159
175
|
saveTokens(data);
|
|
176
|
+
await syncCliContext(data.access_token);
|
|
160
177
|
console.log(`✓ ${t("Logged in. Saved the session to ~/.pleum/config.json.")}`);
|
|
161
178
|
return;
|
|
162
179
|
}
|
package/src/menu.mjs
CHANGED
|
@@ -201,20 +201,49 @@ export async function pickModelFor(item, defaultModel) {
|
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
export async function pickClaudeCodeTiers(agentItem) {
|
|
204
|
+
export async function pickClaudeCodeTiers(agentItem, { input = process.stdin, output = process.stdout } = {}) {
|
|
205
205
|
const cfg = readConfig() ?? {};
|
|
206
|
-
const savedTiers = cfg.claude_tiers
|
|
206
|
+
const savedTiers = cfg.claude_tiers;
|
|
207
207
|
const defaultTiers = {
|
|
208
208
|
sonnet: "claude-sonnet-5",
|
|
209
209
|
opus: "claude-opus-5-5",
|
|
210
210
|
haiku: DEFAULT_MODEL,
|
|
211
211
|
};
|
|
212
212
|
const baseTiers = {
|
|
213
|
-
sonnet: savedTiers
|
|
214
|
-
opus: savedTiers
|
|
215
|
-
haiku: savedTiers
|
|
213
|
+
sonnet: savedTiers?.sonnet || defaultTiers.sonnet,
|
|
214
|
+
opus: savedTiers?.opus || defaultTiers.opus,
|
|
215
|
+
haiku: savedTiers?.haiku || defaultTiers.haiku,
|
|
216
216
|
};
|
|
217
217
|
|
|
218
|
+
// 기존 설정이 존재하면 1-클릭 확인 메뉴: Enter 1회로 기존 설정대로 즉시 실행
|
|
219
|
+
if (savedTiers && savedTiers.sonnet && savedTiers.opus && savedTiers.haiku) {
|
|
220
|
+
const keepChoice = await select(
|
|
221
|
+
[
|
|
222
|
+
{
|
|
223
|
+
id: "keep",
|
|
224
|
+
title: t("Keep existing configuration"),
|
|
225
|
+
desc: `Sonnet: ${savedTiers.sonnet} · Opus: ${savedTiers.opus} · Haiku: ${savedTiers.haiku}`,
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
id: "change",
|
|
229
|
+
title: t("Reconfigure tiers"),
|
|
230
|
+
desc: t("Choose Sonnet, Opus, and Haiku models again"),
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
{
|
|
234
|
+
message: `${agentItem.title} — ${t("Use existing model configuration?")}`,
|
|
235
|
+
formatItem: (x) => `${x.title} ${style.dim(x.desc)}`,
|
|
236
|
+
limit: 5,
|
|
237
|
+
input,
|
|
238
|
+
output,
|
|
239
|
+
},
|
|
240
|
+
);
|
|
241
|
+
if (!keepChoice) return null;
|
|
242
|
+
if (keepChoice.id === "keep") {
|
|
243
|
+
return savedTiers;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
218
247
|
// 1/3단계: Sonnet 모델 지정 (10개 핵심 추천 + 200+ 전체 검색 + 프로바이더 라우팅)
|
|
219
248
|
const sonnet = await pickModelFor(
|
|
220
249
|
{ title: `${agentItem.title} (1/3) — ${t("Sonnet model")}` },
|
package/src/recipes.mjs
CHANGED
|
@@ -50,21 +50,25 @@ export const RECIPES = {
|
|
|
50
50
|
const toAnthropic = (x) => (x.startsWith("anthropic/") ? x : `anthropic/${x}`);
|
|
51
51
|
return {
|
|
52
52
|
ANTHROPIC_BASE_URL: ROOT,
|
|
53
|
-
ANTHROPIC_API_KEY: key,
|
|
54
53
|
ANTHROPIC_AUTH_TOKEN: key,
|
|
55
|
-
//
|
|
56
|
-
|
|
54
|
+
// CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY는 의도적으로 설정하지 않는다:
|
|
55
|
+
// 활성화 시 Claude Code가 GET /v1/models를 호출해 카탈로그 200+개 모델을
|
|
56
|
+
// /model 메뉴에 쏟아부어 화면이 난잡해지는 원인이 된다.
|
|
57
57
|
ANTHROPIC_DEFAULT_SONNET_MODEL: toAnthropic(sonnet),
|
|
58
|
+
ANTHROPIC_DEFAULT_SONNET_MODEL_NAME: "Sonnet",
|
|
59
|
+
ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION: "Sonnet 5 · Efficient for routine tasks",
|
|
58
60
|
ANTHROPIC_DEFAULT_OPUS_MODEL: toAnthropic(opus),
|
|
61
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL_NAME: "Opus",
|
|
62
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION: "Opus 5.5 · Best for everyday, complex tasks",
|
|
59
63
|
ANTHROPIC_DEFAULT_HAIKU_MODEL: toAnthropic(haiku),
|
|
64
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME: "Haiku",
|
|
65
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION: "Haiku 4.5 · Fastest for quick answers",
|
|
60
66
|
ANTHROPIC_SMALL_MODEL: toAnthropic(haiku),
|
|
61
67
|
};
|
|
62
68
|
},
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return ["--model", main.startsWith("anthropic/") ? main : `anthropic/${main}`];
|
|
67
|
-
},
|
|
69
|
+
// CLI 인자에 임의의 --model을 넘기지 않고 Claude Code의 내장 티어(Default/Opus)로 기동하게 하여
|
|
70
|
+
// /model 화면에 깨끗한 5개 표준 항목(Default, Opus, Fable, Sonnet, Haiku)만 표시되도록 한다.
|
|
71
|
+
args: () => [],
|
|
68
72
|
},
|
|
69
73
|
codex: {
|
|
70
74
|
label: "Codex CLI",
|
package/src/settings.mjs
CHANGED
|
@@ -30,8 +30,8 @@ export function buildSettingsItems({
|
|
|
30
30
|
autoUpdate = true,
|
|
31
31
|
latestVersion = null,
|
|
32
32
|
}) {
|
|
33
|
-
const contextDesc = activeContext?.type === "team"
|
|
34
|
-
? `${t("Team")}: ${activeContext.org_name}`
|
|
33
|
+
const contextDesc = activeContext?.type === "team"
|
|
34
|
+
? `${t("Team")}: ${activeContext.org_name || activeContext.org_id}`
|
|
35
35
|
: t("Personal Credit");
|
|
36
36
|
const updateDesc = latestVersion && isNewerVersion(version, latestVersion)
|
|
37
37
|
? `${t("Current version: {version}", { version })} → v${latestVersion} (${t("Update available")})`
|
package/src/wire.mjs
CHANGED
|
@@ -87,11 +87,10 @@ export function wireClaudeSettings(existingJson, { root, key }) {
|
|
|
87
87
|
...(obj.env && typeof obj.env === "object" && !Array.isArray(obj.env) ? obj.env : {}),
|
|
88
88
|
ANTHROPIC_BASE_URL: root,
|
|
89
89
|
ANTHROPIC_AUTH_TOKEN: key,
|
|
90
|
-
ANTHROPIC_API_KEY: key,
|
|
91
|
-
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY: "1",
|
|
92
90
|
API_TIMEOUT_MS: "3000000",
|
|
93
91
|
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1",
|
|
94
92
|
};
|
|
93
|
+
delete obj.env.ANTHROPIC_API_KEY;
|
|
95
94
|
return `${JSON.stringify(obj, null, 2)}\n`;
|
|
96
95
|
}
|
|
97
96
|
|