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 CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pleumrouter",
3
- "version": "0.5.33",
3
+ "version": "0.5.35",
4
4
  "description": "Official PleumRouter terminal CLI — launch any coding agent against PleumRouter.",
5
5
  "type": "module",
6
6
  "bin": {
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") {
@@ -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",
@@ -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) の選択",
@@ -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) 선택",
@@ -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.sonnet || defaultTiers.sonnet,
214
- opus: savedTiers.opus || defaultTiers.opus,
215
- haiku: savedTiers.haiku || defaultTiers.haiku,
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
- // /model 이 GET {ANTHROPIC_BASE_URL}/v1/models 를 치게 한다. 기본값은 꺼져 있다.
56
- CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY: "1",
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
- args: (m) => {
64
- const isObj = m && typeof m === "object";
65
- const main = (isObj ? m.sonnet : m) || DEFAULT_MODEL;
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" && activeContext.org_name
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