@trydecember/cli 0.3.18 → 0.3.19

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.md CHANGED
@@ -10,7 +10,7 @@ December is an AI coding agent that lives in your terminal. It understands your
10
10
 
11
11
  - **Writes code & runs commands:** Ask it to build features, fix bugs, or run tests. It does the work for you.
12
12
  - **Cloud Handoff:** Use _/handoff_ to continue your session on **<a href="https://trydecember.com" target="_blank">trydecember.com</a>**
13
- - **Bring your own AI:** Use API keys for OpenAI, Anthropic, Gemini, and 12+ others, or log in via December to use December credits.
13
+ - **Bring your own AI:** Use API keys for OpenAI, Anthropic, Gemini, and 20+ others, or log in via December to use December credits.
14
14
 
15
15
  ### Get Started
16
16
 
package/dist/december.js CHANGED
@@ -654,21 +654,33 @@ function getModelContextWindow(value) {
654
654
  }
655
655
  if (lower.includes("gemini"))
656
656
  return 1e6;
657
+ if (lower.includes("claude-5") || lower.includes("opus-5") || lower.includes("sonnet-5") || lower.includes("fable-5"))
658
+ return 1e6;
657
659
  if (lower.includes("claude"))
658
660
  return 200000;
659
- if (lower.includes("o3-mini") || lower.includes("o1"))
660
- return 200000;
661
+ if (lower.includes("grok"))
662
+ return 500000;
663
+ if (lower.includes("codestral") || lower.includes("mistral-large") || lower.includes("devstral") || lower.includes("ministral") || lower.includes("mistral-medium") || lower.includes("mistral-small") || lower.includes("command-a"))
664
+ return 262144;
665
+ if (lower.includes("gpt-5.6") || lower.includes("gpt-5.5"))
666
+ return 1050000;
667
+ if (lower.includes("gpt-5.4"))
668
+ return 400000;
661
669
  if (lower.includes("gpt-5"))
662
670
  return 200000;
671
+ if (lower.includes("o4") || lower.includes("o3") || lower.includes("o1"))
672
+ return 200000;
673
+ if (lower.includes("deepseek-v4"))
674
+ return 1e6;
663
675
  if (lower.includes("gpt-4.5"))
664
676
  return 128000;
665
677
  if (lower.includes("gpt-4"))
666
678
  return 128000;
667
679
  if (lower.includes("gpt-3.5"))
668
680
  return 16385;
669
- if (lower.includes("deepseek"))
681
+ if (lower.includes("deepseek") || lower.includes("glm"))
670
682
  return 128000;
671
- if (lower.includes("llama-3.3") || lower.includes("llama-3.1") || lower.includes("llama3.3") || lower.includes("llama3.1") || lower.includes("mistral-nemo")) {
683
+ if (lower.includes("llama-4") || lower.includes("llama-3.3") || lower.includes("llama-3.1") || lower.includes("llama3.3") || lower.includes("llama3.1") || lower.includes("mistral-nemo") || lower.includes("gpt-oss")) {
672
684
  return 128000;
673
685
  }
674
686
  if (lower.includes("qwen2.5-coder") || lower.includes("qwen2.5") || lower.includes("qwen")) {
@@ -700,31 +712,41 @@ var init_models = __esm(() => {
700
712
  "gemini-3.5-flash": 1e6,
701
713
  "gemini-3.5-flash-lite": 1e6,
702
714
  "gemini-3-pro-preview": 1e6,
703
- "gemini-3.1-pro": 1e6,
704
715
  "gemini-2.5-pro": 1e6,
705
716
  "gemini-2.5-flash": 1e6,
706
- "claude-fable-5": 200000,
707
- "claude-opus-5": 200000,
708
- "claude-sonnet-5": 200000,
709
- "claude-haiku-4-5-20251001": 200000,
710
- "claude-3-7-sonnet-latest": 200000,
711
- "claude-3-5-sonnet-20241022": 200000,
712
- "claude-3-5-sonnet-latest": 200000,
713
- "claude-3-5-haiku-latest": 200000,
714
- "claude-3-haiku-20240307": 200000,
715
- "gpt-5.6-sol": 200000,
716
- "gpt-5.6-terra": 200000,
717
- "gpt-5.6-luna": 200000,
718
- "gpt-5.5-instant": 128000,
719
- "gpt-5.4-mini": 128000,
720
- "o3-mini": 200000,
721
- o1: 200000,
722
- "o1-mini": 128000,
717
+ "gemini-1.5-pro": 1e6,
718
+ "gemini-1.5-flash": 1e6,
719
+ "claude-opus-5": 1e6,
720
+ "claude-sonnet-5": 1e6,
721
+ "claude-fable-5": 1e6,
722
+ "claude-haiku-4.5": 200000,
723
+ "claude-opus-4.8": 200000,
724
+ "claude-opus-4.7": 200000,
725
+ "claude-sonnet-4.6": 200000,
726
+ "claude-opus-4.6": 200000,
727
+ "claude-opus-4.5": 200000,
728
+ "claude-sonnet-4.5": 200000,
729
+ "gpt-5.6-sol": 1050000,
730
+ "gpt-5.6-terra": 1050000,
731
+ "gpt-5.6-luna": 1050000,
732
+ "gpt-5.5-pro": 1050000,
733
+ "gpt-5.5": 1050000,
734
+ "gpt-5.4-pro": 400000,
735
+ "gpt-5.4-mini": 400000,
736
+ "o4-mini": 200000,
737
+ "o3-pro": 200000,
738
+ o3: 200000,
739
+ "o1-pro": 200000,
723
740
  "gpt-4o": 128000,
724
741
  "gpt-4o-mini": 128000,
725
- "gpt-4-turbo": 128000,
726
- "deepseek-chat": 128000,
727
- "deepseek-reasoner": 128000
742
+ "deepseek-v4-pro": 1e6,
743
+ "deepseek-v4-flash": 1e6,
744
+ "grok-4.6": 500000,
745
+ "grok-4.5": 500000,
746
+ "grok-4.3": 500000,
747
+ "grok-4.20": 500000,
748
+ "grok-build-0.1": 500000,
749
+ "command-a-03-2025": 256000
728
750
  };
729
751
  });
730
752
 
@@ -9568,11 +9590,48 @@ function resolveOpenAIModel(model) {
9568
9590
  }
9569
9591
  return name;
9570
9592
  }
9593
+ function normalizeErrorResponse(text) {
9594
+ try {
9595
+ const data = JSON.parse(text);
9596
+ if (data && typeof data === "object") {
9597
+ if (typeof data.error === "string") {
9598
+ return JSON.stringify({ error: { message: data.error } });
9599
+ }
9600
+ if (!data.error) {
9601
+ const message = data.message || data.detail || data.msg || data.error_msg || data.title;
9602
+ if (message) {
9603
+ return JSON.stringify({
9604
+ error: {
9605
+ message: typeof message === "string" ? message : JSON.stringify(message),
9606
+ type: data.type || "api_error",
9607
+ code: data.code
9608
+ }
9609
+ });
9610
+ }
9611
+ }
9612
+ }
9613
+ } catch {}
9614
+ return text;
9615
+ }
9616
+ async function providerFetch(url, init) {
9617
+ const res = await fetch(url, init);
9618
+ if (!res.ok) {
9619
+ const text = await res.text();
9620
+ const normalized = normalizeErrorResponse(text);
9621
+ return new Response(normalized, {
9622
+ status: res.status,
9623
+ statusText: res.statusText,
9624
+ headers: res.headers
9625
+ });
9626
+ }
9627
+ return res;
9628
+ }
9571
9629
  function openaiProvider(baseURL, apiKey, defaultHeaders, customClient) {
9572
9630
  const client = customClient || new OpenAI({
9573
9631
  baseURL,
9574
9632
  apiKey: apiKey || process.env.OPENAI_API_KEY || "dummy-key",
9575
- defaultHeaders
9633
+ defaultHeaders,
9634
+ fetch: providerFetch
9576
9635
  });
9577
9636
  return createProvider({
9578
9637
  id: "openai",
@@ -104080,9 +104139,9 @@ var init_gemini = __esm(() => {
104080
104139
  });
104081
104140
 
104082
104141
  // ../../packages/providers/src/providers/openrouter.ts
104083
- function openrouterProvider(apiKey) {
104142
+ function openrouterProvider(apiKey, customBaseProvider) {
104084
104143
  const key = apiKey || process.env.OPENROUTER_API_KEY;
104085
- const baseProvider = openaiProvider("https://openrouter.ai/api/v1", key, {
104144
+ const baseProvider = customBaseProvider || openaiProvider("https://openrouter.ai/api/v1", key, {
104086
104145
  "HTTP-Referer": "https://trydecember.com",
104087
104146
  "X-Title": "December"
104088
104147
  });
@@ -104234,6 +104293,114 @@ var init_zai = __esm(() => {
104234
104293
  };
104235
104294
  });
104236
104295
 
104296
+ // ../../packages/providers/src/providers/nvidia.ts
104297
+ var NvidiaProvider;
104298
+ var init_nvidia = __esm(() => {
104299
+ init_openai2();
104300
+ NvidiaProvider = class NvidiaProvider extends OpenAIProvider {
104301
+ id = "nvidia";
104302
+ constructor(apiKey) {
104303
+ super("https://integrate.api.nvidia.com/v1", apiKey || process.env.NVIDIA_API_KEY);
104304
+ }
104305
+ };
104306
+ });
104307
+
104308
+ // ../../packages/providers/src/providers/sambanova.ts
104309
+ var SambaNovaProvider;
104310
+ var init_sambanova = __esm(() => {
104311
+ init_openai2();
104312
+ SambaNovaProvider = class SambaNovaProvider extends OpenAIProvider {
104313
+ id = "sambanova";
104314
+ constructor(apiKey) {
104315
+ super("https://api.sambanova.ai/v1", apiKey || process.env.SAMBANOVA_API_KEY);
104316
+ }
104317
+ };
104318
+ });
104319
+
104320
+ // ../../packages/providers/src/providers/cerebras.ts
104321
+ var CerebrasProvider;
104322
+ var init_cerebras = __esm(() => {
104323
+ init_openai2();
104324
+ CerebrasProvider = class CerebrasProvider extends OpenAIProvider {
104325
+ id = "cerebras";
104326
+ constructor(apiKey) {
104327
+ super("https://api.cerebras.ai/v1", apiKey || process.env.CEREBRAS_API_KEY);
104328
+ }
104329
+ };
104330
+ });
104331
+
104332
+ // ../../packages/providers/src/providers/siliconflow.ts
104333
+ var SiliconFlowProvider;
104334
+ var init_siliconflow = __esm(() => {
104335
+ init_openai2();
104336
+ SiliconFlowProvider = class SiliconFlowProvider extends OpenAIProvider {
104337
+ id = "siliconflow";
104338
+ constructor(apiKey) {
104339
+ super("https://api.siliconflow.cn/v1", apiKey || process.env.SILICONFLOW_API_KEY);
104340
+ }
104341
+ };
104342
+ });
104343
+
104344
+ // ../../packages/providers/src/providers/together.ts
104345
+ var TogetherProvider;
104346
+ var init_together = __esm(() => {
104347
+ init_openai2();
104348
+ TogetherProvider = class TogetherProvider extends OpenAIProvider {
104349
+ id = "together";
104350
+ constructor(apiKey) {
104351
+ super("https://api.together.xyz/v1", apiKey || process.env.TOGETHER_API_KEY);
104352
+ }
104353
+ };
104354
+ });
104355
+
104356
+ // ../../packages/providers/src/providers/hyperbolic.ts
104357
+ var HyperbolicProvider;
104358
+ var init_hyperbolic = __esm(() => {
104359
+ init_openai2();
104360
+ HyperbolicProvider = class HyperbolicProvider extends OpenAIProvider {
104361
+ id = "hyperbolic";
104362
+ constructor(apiKey) {
104363
+ super("https://api.hyperbolic.xyz/v1", apiKey || process.env.HYPERBOLIC_API_KEY);
104364
+ }
104365
+ };
104366
+ });
104367
+
104368
+ // ../../packages/providers/src/providers/fireworks.ts
104369
+ var FireworksProvider;
104370
+ var init_fireworks = __esm(() => {
104371
+ init_openai2();
104372
+ FireworksProvider = class FireworksProvider extends OpenAIProvider {
104373
+ id = "fireworks";
104374
+ constructor(apiKey) {
104375
+ super("https://api.fireworks.ai/inference/v1", apiKey || process.env.FIREWORKS_API_KEY);
104376
+ }
104377
+ };
104378
+ });
104379
+
104380
+ // ../../packages/providers/src/providers/perplexity.ts
104381
+ var PerplexityProvider;
104382
+ var init_perplexity = __esm(() => {
104383
+ init_openai2();
104384
+ PerplexityProvider = class PerplexityProvider extends OpenAIProvider {
104385
+ id = "perplexity";
104386
+ constructor(apiKey) {
104387
+ super("https://api.perplexity.ai", apiKey || process.env.PERPLEXITY_API_KEY);
104388
+ }
104389
+ };
104390
+ });
104391
+
104392
+ // ../../packages/providers/src/providers/cohere.ts
104393
+ var CohereProvider;
104394
+ var init_cohere = __esm(() => {
104395
+ init_openai2();
104396
+ CohereProvider = class CohereProvider extends OpenAIProvider {
104397
+ id = "cohere";
104398
+ constructor(apiKey) {
104399
+ super("https://api.cohere.com/v2", apiKey || process.env.COHERE_API_KEY);
104400
+ }
104401
+ };
104402
+ });
104403
+
104237
104404
  // ../../packages/providers/src/providers/ollama.ts
104238
104405
  function resolveOllamaModel(model) {
104239
104406
  let name = model || "qwen2.5-coder:7b";
@@ -104375,18 +104542,27 @@ var init_ollama = __esm(() => {
104375
104542
  var exports_src3 = {};
104376
104543
  __export(exports_src3, {
104377
104544
  AnthropicProvider: () => AnthropicProvider,
104545
+ CerebrasProvider: () => CerebrasProvider,
104546
+ CohereProvider: () => CohereProvider,
104378
104547
  DeepSeekProvider: () => DeepSeekProvider,
104548
+ FireworksProvider: () => FireworksProvider,
104379
104549
  GeminiProvider: () => GeminiProvider,
104380
104550
  GroqProvider: () => GroqProvider,
104381
104551
  HuggingFaceProvider: () => HuggingFaceProvider,
104552
+ HyperbolicProvider: () => HyperbolicProvider,
104382
104553
  KimiProvider: () => KimiProvider,
104383
104554
  MODEL_CONTEXT_WINDOWS: () => MODEL_CONTEXT_WINDOWS,
104384
104555
  MistralProvider: () => MistralProvider,
104385
104556
  MoonshotProvider: () => MoonshotProvider,
104557
+ NvidiaProvider: () => NvidiaProvider,
104386
104558
  OPENROUTER_DEFAULT_MAX_TOKENS: () => OPENROUTER_DEFAULT_MAX_TOKENS,
104387
104559
  OPENROUTER_MIN_AFFORDABLE_TOKENS: () => OPENROUTER_MIN_AFFORDABLE_TOKENS,
104388
104560
  OllamaProvider: () => OllamaProvider,
104389
104561
  OpenAIProvider: () => OpenAIProvider,
104562
+ PerplexityProvider: () => PerplexityProvider,
104563
+ SambaNovaProvider: () => SambaNovaProvider,
104564
+ SiliconFlowProvider: () => SiliconFlowProvider,
104565
+ TogetherProvider: () => TogetherProvider,
104390
104566
  XAIProvider: () => XAIProvider,
104391
104567
  ZAIProvider: () => ZAIProvider,
104392
104568
  anthropicProvider: () => anthropicProvider,
@@ -104418,6 +104594,15 @@ var init_src3 = __esm(() => {
104418
104594
  init_moonshot();
104419
104595
  init_xai();
104420
104596
  init_zai();
104597
+ init_nvidia();
104598
+ init_sambanova();
104599
+ init_cerebras();
104600
+ init_siliconflow();
104601
+ init_together();
104602
+ init_hyperbolic();
104603
+ init_fireworks();
104604
+ init_perplexity();
104605
+ init_cohere();
104421
104606
  init_ollama();
104422
104607
  });
104423
104608
 
@@ -108985,6 +109170,9 @@ async function streamAssistantResponse(agent, eventQueue, signal, turnCount = 1)
108985
109170
  });
108986
109171
  }
108987
109172
  const tc = activeToolCalls.get(chunk.id);
109173
+ if (chunk.name && !tc.name) {
109174
+ tc.name = chunk.name;
109175
+ }
108988
109176
  if (chunk.inputDelta) {
108989
109177
  tc.input += chunk.inputDelta;
108990
109178
  }
@@ -179626,13 +179814,35 @@ function instantiateProvider(provider, apiKey) {
179626
179814
  return anthropicProvider("https://api.kimi.com/coding", apiKey);
179627
179815
  case "moonshot":
179628
179816
  case "moonshoot":
179629
- return openaiProvider("https://api.moonshot.cn/v1", apiKey);
179817
+ return openaiProvider("https://api.moonshot.ai/v1", apiKey);
179630
179818
  case "mistral":
179631
179819
  return openaiProvider("https://api.mistral.ai/v1", apiKey);
179632
179820
  case "xai":
179633
179821
  return openaiProvider("https://api.x.ai/v1", apiKey);
179634
179822
  case "zai":
179635
- return openaiProvider("https://api.zai.ai/v1", apiKey);
179823
+ return openaiProvider("https://api.z.ai/api/coding/paas/v4", apiKey);
179824
+ case "nvidia":
179825
+ case "nim":
179826
+ return openaiProvider("https://integrate.api.nvidia.com/v1", apiKey);
179827
+ case "sambanova":
179828
+ return openaiProvider("https://api.sambanova.ai/v1", apiKey);
179829
+ case "cerebras":
179830
+ return openaiProvider("https://api.cerebras.ai/v1", apiKey);
179831
+ case "siliconflow":
179832
+ case "siliconcloud":
179833
+ return openaiProvider("https://api.siliconflow.cn/v1", apiKey);
179834
+ case "together":
179835
+ case "togetherai":
179836
+ return openaiProvider("https://api.together.xyz/v1", apiKey);
179837
+ case "hyperbolic":
179838
+ return openaiProvider("https://api.hyperbolic.xyz/v1", apiKey);
179839
+ case "fireworks":
179840
+ case "fireworksai":
179841
+ return openaiProvider("https://api.fireworks.ai/inference/v1", apiKey);
179842
+ case "perplexity":
179843
+ return openaiProvider("https://api.perplexity.ai", apiKey);
179844
+ case "cohere":
179845
+ return openaiProvider("https://api.cohere.com/v2", apiKey);
179636
179846
  case "ollama": {
179637
179847
  let endpoint = "http://localhost:11434/v1";
179638
179848
  if (apiKey && (apiKey.startsWith("http://") || apiKey.startsWith("https://"))) {
@@ -265964,20 +266174,35 @@ function formatProviderName(provider) {
265964
266174
  function ByokKeyMenu(props) {
265965
266175
  const { selectedProvider, apiKey, setApiKey, handleKeySubmit, isStreaming, authError } = props;
265966
266176
  const formattedProvider = formatProviderName(selectedProvider);
266177
+ const keyUrl = selectedProvider ? PROVIDER_KEY_URLS[selectedProvider] : undefined;
265967
266178
  return /* @__PURE__ */ jsx_runtime21.jsxs(Box_default, {
265968
266179
  flexDirection: "column",
265969
266180
  paddingX: THEME.padding.paddingX,
265970
266181
  children: [
265971
- /* @__PURE__ */ jsx_runtime21.jsx(Box_default, {
266182
+ /* @__PURE__ */ jsx_runtime21.jsxs(Box_default, {
266183
+ flexDirection: "column",
265972
266184
  marginBottom: 1,
265973
- children: /* @__PURE__ */ jsx_runtime21.jsxs(Text3, {
265974
- color: THEME.colors.text,
265975
- children: [
265976
- "Enter API Key for ",
265977
- formattedProvider,
265978
- ":"
265979
- ]
265980
- })
266185
+ children: [
266186
+ /* @__PURE__ */ jsx_runtime21.jsxs(Text3, {
266187
+ color: THEME.colors.text,
266188
+ children: [
266189
+ "Enter API Key for ",
266190
+ formattedProvider,
266191
+ ":"
266192
+ ]
266193
+ }),
266194
+ keyUrl && /* @__PURE__ */ jsx_runtime21.jsxs(Text3, {
266195
+ italic: true,
266196
+ color: THEME.colors.dim,
266197
+ children: [
266198
+ "Don't have an API key? Get one at ",
266199
+ /* @__PURE__ */ jsx_runtime21.jsx(Text3, {
266200
+ color: THEME.colors.brand,
266201
+ children: keyUrl
266202
+ })
266203
+ ]
266204
+ })
266205
+ ]
265981
266206
  }),
265982
266207
  /* @__PURE__ */ jsx_runtime21.jsxs(Box_default, {
265983
266208
  children: [
@@ -266019,7 +266244,7 @@ function ByokKeyMenu(props) {
266019
266244
  ]
266020
266245
  });
266021
266246
  }
266022
- var jsx_runtime21, PROVIDER_NAMES;
266247
+ var jsx_runtime21, PROVIDER_NAMES, PROVIDER_KEY_URLS;
266023
266248
  var init_byok_key_menu = __esm(async () => {
266024
266249
  init_theme();
266025
266250
  await __promiseAll([
@@ -266031,19 +266256,59 @@ var init_byok_key_menu = __esm(async () => {
266031
266256
  jsx_runtime21 = __toESM(require_jsx_runtime(), 1);
266032
266257
  PROVIDER_NAMES = {
266033
266258
  anthropic: "Anthropic",
266259
+ cerebras: "Cerebras",
266260
+ cohere: "Cohere",
266034
266261
  deepseek: "DeepSeek",
266262
+ fireworks: "Fireworks AI",
266035
266263
  google: "Google",
266036
266264
  groq: "Groq",
266037
266265
  huggingface: "Hugging Face",
266266
+ hyperbolic: "Hyperbolic",
266038
266267
  kimi: "Kimi",
266039
266268
  mistral: "Mistral",
266269
+ moonshot: "Moonshot AI",
266040
266270
  moonshoot: "Moonshoot AI",
266271
+ nvidia: "NVIDIA NIM",
266041
266272
  ollama: "Ollama",
266042
266273
  openai: "OpenAI",
266043
266274
  openrouter: "OpenRouter",
266275
+ perplexity: "Perplexity AI",
266276
+ sambanova: "SambaNova Cloud",
266277
+ siliconflow: "SiliconFlow",
266278
+ together: "Together AI",
266044
266279
  xAI: "xAI",
266280
+ xai: "xAI",
266045
266281
  zai: "ZAI"
266046
266282
  };
266283
+ PROVIDER_KEY_URLS = {
266284
+ anthropic: "https://console.anthropic.com/settings/keys",
266285
+ cerebras: "https://cloud.cerebras.ai/",
266286
+ cohere: "https://dashboard.cohere.com/api-keys",
266287
+ deepseek: "https://platform.deepseek.com/api_keys",
266288
+ fireworks: "https://app.fireworks.ai/api-keys",
266289
+ google: "https://aistudio.google.com/app/apikey",
266290
+ gemini: "https://aistudio.google.com/app/apikey",
266291
+ groq: "https://console.groq.com/keys",
266292
+ huggingface: "https://huggingface.co/settings/tokens",
266293
+ hyperbolic: "https://app.hyperbolic.ai/settings",
266294
+ kimi: "https://platform.moonshot.ai/console/api-keys",
266295
+ mistral: "https://console.mistral.ai/api-keys/",
266296
+ moonshot: "https://platform.moonshot.ai/console/api-keys",
266297
+ moonshoot: "https://platform.moonshot.ai/console/api-keys",
266298
+ nvidia: "https://build.nvidia.com/",
266299
+ ollama: "https://ollama.com/download",
266300
+ openai: "https://platform.openai.com/api-keys",
266301
+ openrouter: "https://openrouter.ai/settings/keys",
266302
+ perplexity: "https://www.perplexity.ai/settings/api",
266303
+ sambanova: "https://cloud.sambanova.ai/apis",
266304
+ siliconflow: "https://cloud.siliconflow.cn/account/ak",
266305
+ siliconcloud: "https://cloud.siliconflow.cn/account/ak",
266306
+ together: "https://api.together.ai/settings/api-keys",
266307
+ togetherai: "https://api.together.ai/settings/api-keys",
266308
+ xAI: "https://console.x.ai/",
266309
+ xai: "https://console.x.ai/",
266310
+ zai: "https://open.bigmodel.cn/usercenter/apikeys"
266311
+ };
266047
266312
  });
266048
266313
 
266049
266314
  // ../../node_modules/.bun/is-unicode-supported@2.1.0/node_modules/is-unicode-supported/index.js
@@ -266493,16 +266758,25 @@ function ByokProviderMenu(props) {
266493
266758
  /* @__PURE__ */ jsx_runtime22.jsx(SelectInput_default, {
266494
266759
  items: [
266495
266760
  { label: "Anthropic", value: "anthropic" },
266761
+ { label: "Cerebras", value: "cerebras" },
266762
+ { label: "Cohere", value: "cohere" },
266496
266763
  { label: "DeepSeek", value: "deepseek" },
266764
+ { label: "Fireworks AI", value: "fireworks" },
266497
266765
  { label: "Google", value: "google" },
266498
266766
  { label: "Groq", value: "groq" },
266499
266767
  { label: "Hugging Face", value: "huggingface" },
266768
+ { label: "Hyperbolic", value: "hyperbolic" },
266500
266769
  { label: "Kimi", value: "kimi" },
266501
266770
  { label: "Mistral", value: "mistral" },
266502
266771
  { label: "Moonshot AI", value: "moonshot" },
266772
+ { label: "NVIDIA NIM", value: "nvidia" },
266503
266773
  { label: "Ollama (Local Models)", value: "ollama" },
266504
266774
  { label: "OpenAI", value: "openai" },
266505
266775
  { label: "OpenRouter", value: "openrouter" },
266776
+ { label: "Perplexity AI", value: "perplexity" },
266777
+ { label: "SambaNova Cloud", value: "sambanova" },
266778
+ { label: "SiliconFlow", value: "siliconflow" },
266779
+ { label: "Together AI", value: "together" },
266506
266780
  { label: "xAI", value: "xai" },
266507
266781
  { label: "ZAI", value: "zai" }
266508
266782
  ],
@@ -269623,6 +269897,7 @@ __export(exports_src6, {
269623
269897
  MessageList: () => MessageList,
269624
269898
  ModelSelectMenu: () => ModelSelectMenu,
269625
269899
  OllamaSetupMenu: () => OllamaSetupMenu,
269900
+ PROVIDER_KEY_URLS: () => PROVIDER_KEY_URLS,
269626
269901
  PROVIDER_NAMES: () => PROVIDER_NAMES,
269627
269902
  Pill: () => Pill,
269628
269903
  PlanApproveMenu: () => PlanApproveMenu,
@@ -270450,6 +270725,10 @@ async function fetchOpenRouterModels(apiKey, forceRefresh = false) {
270450
270725
  var FALLBACK_OPENROUTER_MODELS, cachedModels = null, cacheTimestamp = 0, CACHE_TTL_MS;
270451
270726
  var init_openrouter_models = __esm(() => {
270452
270727
  FALLBACK_OPENROUTER_MODELS = [
270728
+ {
270729
+ label: "(free) Google: Gemma 4 26B A4B",
270730
+ value: "google/gemma-4-26b-a4b-it:free"
270731
+ },
270453
270732
  {
270454
270733
  label: "(free) Meta: Llama 3 8B Instruct",
270455
270734
  value: "meta-llama/llama-3-8b-instruct:free"
@@ -270462,19 +270741,23 @@ var init_openrouter_models = __esm(() => {
270462
270741
  label: "(free) DeepSeek: DeepSeek R1",
270463
270742
  value: "deepseek/deepseek-r1:free"
270464
270743
  },
270465
- {
270466
- label: "(free) Google: Gemini 2.0 Flash Experimental",
270467
- value: "google/gemini-2.0-flash-exp:free"
270468
- },
270744
+ { label: "Anthropic: Claude Opus 5", value: "anthropic/claude-opus-5" },
270745
+ { label: "Anthropic: Claude Sonnet 5", value: "anthropic/claude-sonnet-5" },
270469
270746
  { label: "Anthropic: Claude 3.7 Sonnet", value: "anthropic/claude-3.7-sonnet" },
270470
270747
  { label: "Anthropic: Claude 3.5 Sonnet", value: "anthropic/claude-3.5-sonnet" },
270471
270748
  { label: "DeepSeek: DeepSeek R1", value: "deepseek/deepseek-r1" },
270472
270749
  { label: "DeepSeek: DeepSeek V3", value: "deepseek/deepseek-chat" },
270473
270750
  { label: "Google: Gemini 3.7 Flash", value: "google/gemini-3.7-flash" },
270474
270751
  { label: "Google: Gemini 3.6 Flash", value: "google/gemini-3.6-flash" },
270752
+ { label: "Meta: Llama 4 Scout", value: "meta-llama/llama-4-scout" },
270475
270753
  { label: "Meta: Llama 3.3 70B Instruct", value: "meta-llama/llama-3.3-70b-instruct" },
270754
+ { label: "Mistral: Mistral Large", value: "mistralai/mistral-large-2512" },
270755
+ { label: "Mistral: Codestral", value: "mistralai/codestral-2508" },
270756
+ { label: "OpenAI: GPT-5.6 Sol", value: "openai/gpt-5.6-sol" },
270757
+ { label: "OpenAI: GPT-5.4 Mini", value: "openai/gpt-5.4-mini" },
270476
270758
  { label: "OpenAI: GPT-4o", value: "openai/gpt-4o" },
270477
- { label: "OpenAI: o3-mini", value: "openai/o3-mini" }
270759
+ { label: "OpenAI: o3-mini", value: "openai/o3-mini" },
270760
+ { label: "SpaceXAI: Grok 4.6", value: "x-ai/grok-4.6" }
270478
270761
  ];
270479
270762
  CACHE_TTL_MS = 10 * 60 * 1000;
270480
270763
  });
@@ -270554,107 +270837,211 @@ var getProviderModels = (provider) => {
270554
270837
  switch (provider) {
270555
270838
  case "anthropic":
270556
270839
  return [
270557
- { label: "Claude Fable 5", value: "claude-fable-5" },
270558
- { label: "Claude Opus 5", value: "claude-opus-5" },
270840
+ { label: "Claude Opus 5 (Recommended)", value: "claude-opus-5" },
270559
270841
  { label: "Claude Sonnet 5", value: "claude-sonnet-5" },
270560
- { label: "Claude Haiku 4.5", value: "claude-haiku-4-5-20251001" },
270561
- { label: "Claude 3.7 Sonnet", value: "claude-3-7-sonnet-latest" },
270562
- { label: "Claude 3.5 Sonnet", value: "claude-3-5-sonnet-latest" },
270563
- { label: "Claude 3.5 Haiku", value: "claude-3-5-haiku-latest" },
270564
- { label: "Claude 3 Opus", value: "claude-3-opus-latest" },
270565
- { label: "Claude 3 Haiku", value: "claude-3-haiku-20240307" }
270842
+ { label: "Claude Fable 5", value: "claude-fable-5" },
270843
+ { label: "Claude Haiku 4.5", value: "claude-haiku-4.5" },
270844
+ { label: "Claude Opus 4.8", value: "claude-opus-4.8" },
270845
+ { label: "Claude Opus 4.7", value: "claude-opus-4.7" },
270846
+ { label: "Claude Sonnet 4.6", value: "claude-sonnet-4.6" },
270847
+ { label: "Claude Opus 4.6", value: "claude-opus-4.6" },
270848
+ { label: "Claude Opus 4.5", value: "claude-opus-4.5" },
270849
+ { label: "Claude Sonnet 4.5", value: "claude-sonnet-4.5" }
270566
270850
  ];
270567
270851
  case "google":
270568
270852
  case "gemini":
270569
270853
  return [
270854
+ { label: "Gemini 3.7 Flash (Recommended)", value: "gemini-3.7-flash" },
270570
270855
  { label: "Gemini 3.6 Flash", value: "gemini-3.6-flash" },
270571
- { label: "Gemini 3.7 Flash", value: "gemini-3.7-flash" },
270572
- { label: "Gemini 2.5 Flash", value: "gemini-2.5-flash" },
270573
- { label: "Gemini 2.5 Pro", value: "gemini-2.5-pro" },
270574
270856
  { label: "Gemini 3.5 Flash", value: "gemini-3.5-flash" },
270575
270857
  { label: "Gemini 3.5 Flash Lite", value: "gemini-3.5-flash-lite" },
270576
270858
  { label: "Gemini 3 Pro Preview", value: "gemini-3-pro-preview" },
270577
- { label: "Gemini 2.0 Flash", value: "gemini-2.0-flash" },
270578
- { label: "Gemini 2.0 Flash Lite", value: "gemini-2.0-flash-lite" },
270859
+ { label: "Gemini 2.5 Pro", value: "gemini-2.5-pro" },
270860
+ { label: "Gemini 2.5 Flash", value: "gemini-2.5-flash" },
270579
270861
  { label: "Gemini 1.5 Pro", value: "gemini-1.5-pro" },
270580
270862
  { label: "Gemini 1.5 Flash", value: "gemini-1.5-flash" }
270581
270863
  ];
270582
270864
  case "openai":
270583
270865
  return [
270584
- { label: "GPT-5.6 Sol", value: "gpt-5.6-sol" },
270866
+ { label: "GPT-5.6 Sol (Recommended)", value: "gpt-5.6-sol" },
270585
270867
  { label: "GPT-5.6 Terra", value: "gpt-5.6-terra" },
270586
270868
  { label: "GPT-5.6 Luna", value: "gpt-5.6-luna" },
270587
- { label: "GPT-5.5 Instant", value: "gpt-5.5-instant" },
270869
+ { label: "GPT-5.5 Pro", value: "gpt-5.5-pro" },
270870
+ { label: "GPT-5.5", value: "gpt-5.5" },
270871
+ { label: "GPT-5.4 Pro", value: "gpt-5.4-pro" },
270588
270872
  { label: "GPT-5.4 Mini", value: "gpt-5.4-mini" },
270589
- { label: "o3-mini", value: "o3-mini" },
270590
- { label: "o1", value: "o1" },
270591
- { label: "o1-mini", value: "o1-mini" },
270873
+ { label: "o4-mini", value: "o4-mini" },
270874
+ { label: "o3-pro", value: "o3-pro" },
270875
+ { label: "o3", value: "o3" },
270876
+ { label: "o1-pro", value: "o1-pro" },
270592
270877
  { label: "GPT-4o", value: "gpt-4o" },
270593
- { label: "GPT-4o Mini", value: "gpt-4o-mini" },
270594
- { label: "GPT-4 Turbo", value: "gpt-4-turbo" }
270878
+ { label: "GPT-4o Mini", value: "gpt-4o-mini" }
270595
270879
  ];
270596
270880
  case "openrouter":
270597
270881
  return FALLBACK_OPENROUTER_MODELS;
270598
270882
  case "deepseek":
270599
270883
  return [
270600
- { label: "DeepSeek V4 Pro", value: "deepseek-v4-pro" },
270601
- { label: "DeepSeek V4 Flash", value: "deepseek-v4-flash" },
270602
- { label: "DeepSeek Chat (V3)", value: "deepseek-chat" },
270603
- { label: "DeepSeek Reasoner (R1)", value: "deepseek-reasoner" },
270604
- { label: "DeepSeek Coder", value: "deepseek-coder" }
270884
+ { label: "DeepSeek V4 Pro (Recommended)", value: "deepseek-v4-pro" },
270885
+ { label: "DeepSeek V4 Flash", value: "deepseek-v4-flash" }
270605
270886
  ];
270606
270887
  case "groq":
270607
270888
  return [
270608
- { label: "Llama 3.3 70B Versatile", value: "llama-3.3-70b-versatile" },
270609
- { label: "Llama 3.1 8B Instant", value: "llama-3.1-8b-instant" },
270610
- { label: "DeepSeek R1 Distill 70B", value: "deepseek-r1-distill-llama-70b" },
270611
- { label: "Mixtral 8x7B", value: "mixtral-8x7b-32768" }
270889
+ { label: "GPT-OSS 120B (Recommended)", value: "openai/gpt-oss-120b" },
270890
+ { label: "GPT-OSS 20B", value: "openai/gpt-oss-20b" },
270891
+ { label: "Qwen 3.6 27B", value: "qwen/qwen3.6-27b" },
270892
+ { label: "Qwen 3.8 27B", value: "qwen/qwen3.8-27b" },
270893
+ { label: "DeepSeek R1 Distill Llama 70B", value: "deepseek-r1-distill-llama-70b" },
270894
+ { label: "Groq Compound System", value: "groq/compound" }
270612
270895
  ];
270613
270896
  case "huggingface":
270614
270897
  return [
270615
- { label: "Llama 3.3 70B Instruct", value: "meta-llama/Llama-3.3-70B-Instruct" },
270898
+ {
270899
+ label: "Llama 3.3 70B Instruct (Recommended)",
270900
+ value: "meta-llama/Llama-3.3-70B-Instruct"
270901
+ },
270902
+ { label: "Llama 3.1 8B Instruct", value: "meta-llama/Meta-Llama-3.1-8B-Instruct" },
270616
270903
  { label: "Llama 3 8B Instruct", value: "meta-llama/Meta-Llama-3-8B-Instruct" },
270617
- { label: "Qwen 2.5 Coder 32B", value: "Qwen/Qwen2.5-Coder-32B-Instruct" }
270904
+ { label: "Qwen 2.5 Coder 32B", value: "Qwen/Qwen2.5-Coder-32B-Instruct" },
270905
+ { label: "Qwen 2.5 72B", value: "Qwen/Qwen2.5-72B-Instruct" }
270618
270906
  ];
270619
270907
  case "kimi":
270620
270908
  case "moonshot":
270621
270909
  case "moonshoot":
270622
270910
  return [
270623
- { label: "Moonshot v1 8K", value: "moonshot-v1-8k" },
270624
- { label: "Moonshot v1 32K", value: "moonshot-v1-32k" },
270625
- { label: "Moonshot v1 128K", value: "moonshot-v1-128k" },
270626
- { label: "Kimi K1.5", value: "kimi-k1.5" }
270911
+ { label: "Kimi K3 (Recommended)", value: "kimi-k3" },
270912
+ { label: "Kimi K2.7 Code", value: "kimi-k2.7-code" },
270913
+ { label: "Kimi K2.7 Code Highspeed", value: "kimi-k2.7-code-highspeed" },
270914
+ { label: "Kimi K2.6", value: "kimi-k2.6" },
270915
+ { label: "Kimi K2.5", value: "kimi-k2.5" }
270627
270916
  ];
270628
270917
  case "mistral":
270629
270918
  return [
270630
- { label: "Mistral Large", value: "mistral-large-latest" },
270919
+ { label: "Mistral Large (Recommended)", value: "mistral-large-latest" },
270631
270920
  { label: "Mistral Medium", value: "mistral-medium-latest" },
270632
270921
  { label: "Mistral Small", value: "mistral-small-latest" },
270633
270922
  { label: "Codestral", value: "codestral-latest" },
270923
+ { label: "Devstral", value: "devstral-latest" },
270924
+ { label: "Devstral 2", value: "devstral-2512" },
270925
+ { label: "Ministral 14B", value: "ministral-14b-latest" },
270926
+ { label: "Ministral 8B", value: "ministral-8b-latest" },
270927
+ { label: "Ministral 3B", value: "ministral-3b-latest" },
270634
270928
  { label: "Pixtral Large", value: "pixtral-large-latest" }
270635
270929
  ];
270636
270930
  case "xai":
270637
270931
  return [
270932
+ { label: "Grok 4.6 (Recommended)", value: "grok-4.6" },
270638
270933
  { label: "Grok 4.5", value: "grok-4.5" },
270639
- { label: "Grok 2", value: "grok-2-latest" },
270640
- { label: "Grok 2 Vision", value: "grok-2-vision-1212" },
270641
- { label: "Grok Beta", value: "grok-beta" }
270934
+ { label: "Grok 4.3", value: "grok-4.3" },
270935
+ { label: "Grok 4.20", value: "grok-4.20" },
270936
+ { label: "Grok Build 0.1", value: "grok-build-0.1" }
270642
270937
  ];
270643
270938
  case "zai":
270644
270939
  return [
270645
- { label: "ZAI v1", value: "zai-v1" },
270646
- { label: "GLM 4", value: "glm-4" }
270940
+ { label: "GLM 5 (Recommended)", value: "glm-5" },
270941
+ { label: "GLM 5 Turbo", value: "glm-5-turbo" },
270942
+ { label: "GLM 4.7", value: "glm-4.7" },
270943
+ { label: "GLM 4.7 Flash", value: "glm-4.7-flash" },
270944
+ { label: "GLM 4.5 Air", value: "glm-4.5-air" },
270945
+ { label: "GLM 4 Plus", value: "glm-4-plus" },
270946
+ { label: "GLM 4 Flash", value: "glm-4-flash" }
270947
+ ];
270948
+ case "nvidia":
270949
+ case "nim":
270950
+ return [
270951
+ { label: "GPT-OSS 120B (Recommended)", value: "openai/gpt-oss-120b" },
270952
+ { label: "GPT-OSS 20B", value: "openai/gpt-oss-20b" },
270953
+ { label: "Nemotron 3.5 Lightning", value: "nvidia/nemotron-3.5-lightning-30b-a3b" },
270954
+ { label: "Nemotron 3 Super 120B", value: "nvidia/nemotron-3-super-120b-a12b" },
270955
+ { label: "Nemotron 3 Ultra 550B", value: "nvidia/nemotron-3-ultra-550b-a55b" },
270956
+ { label: "Llama 3.2 11B Vision", value: "meta/llama-3.2-11b-vision-instruct" },
270957
+ { label: "Kimi K3", value: "moonshotai/kimi-k3" },
270958
+ { label: "MiniMax M3", value: "minimaxai/minimax-m3" }
270959
+ ];
270960
+ case "sambanova":
270961
+ return [
270962
+ {
270963
+ label: "Llama 3.3 70B Instruct (Recommended)",
270964
+ value: "Meta-Llama-3.3-70B-Instruct"
270965
+ },
270966
+ { label: "DeepSeek R1", value: "DeepSeek-R1" },
270967
+ { label: "DeepSeek V3", value: "DeepSeek-V3" },
270968
+ { label: "Llama 3.1 8B Instruct", value: "Meta-Llama-3.1-8B-Instruct" }
270969
+ ];
270970
+ case "cerebras":
270971
+ return [
270972
+ { label: "GPT-OSS 120B (Recommended)", value: "gpt-oss-120b" },
270973
+ { label: "Gemma 4 31B", value: "gemma-4-31b" }
270974
+ ];
270975
+ case "siliconflow":
270976
+ case "siliconcloud":
270977
+ return [
270978
+ { label: "DeepSeek R1 (Recommended)", value: "deepseek-ai/DeepSeek-R1" },
270979
+ { label: "DeepSeek V3", value: "deepseek-ai/DeepSeek-V3" },
270980
+ { label: "Qwen 2.5 Coder 32B", value: "Qwen/Qwen2.5-Coder-32B-Instruct" },
270981
+ { label: "Qwen 2.5 72B", value: "Qwen/Qwen2.5-72B-Instruct" }
270982
+ ];
270983
+ case "together":
270984
+ case "togetherai":
270985
+ return [
270986
+ {
270987
+ label: "Llama 3.3 70B Turbo (Recommended)",
270988
+ value: "meta-llama/Llama-3.3-70B-Instruct-Turbo"
270989
+ },
270990
+ { label: "DeepSeek R1", value: "deepseek-ai/DeepSeek-R1" },
270991
+ { label: "DeepSeek V3", value: "deepseek-ai/DeepSeek-V3" }
270992
+ ];
270993
+ case "hyperbolic":
270994
+ return [
270995
+ { label: "DeepSeek R1 (Recommended)", value: "deepseek-ai/DeepSeek-R1" },
270996
+ { label: "DeepSeek V3", value: "deepseek-ai/DeepSeek-V3" },
270997
+ { label: "Llama 3.3 70B", value: "meta-llama/Llama-3.3-70B-Instruct" },
270998
+ { label: "Llama 3.1 405B", value: "meta-llama/Meta-Llama-3.1-405B-Instruct" },
270999
+ { label: "Llama 3.1 70B", value: "meta-llama/Meta-Llama-3.1-70B-Instruct" },
271000
+ { label: "Qwen 2.5 Coder 32B", value: "Qwen/Qwen2.5-Coder-32B-Instruct" },
271001
+ { label: "Qwen 2.5 72B", value: "Qwen/Qwen2.5-72B-Instruct" }
271002
+ ];
271003
+ case "fireworks":
271004
+ case "fireworksai":
271005
+ return [
271006
+ {
271007
+ label: "DeepSeek R1 (Recommended)",
271008
+ value: "accounts/fireworks/models/deepseek-r1"
271009
+ },
271010
+ { label: "DeepSeek V3", value: "accounts/fireworks/models/deepseek-v3" },
271011
+ {
271012
+ label: "Llama 3.3 70B",
271013
+ value: "accounts/fireworks/models/llama-v3p3-70b-instruct"
271014
+ },
271015
+ {
271016
+ label: "Llama 3.1 405B",
271017
+ value: "accounts/fireworks/models/llama-v3p1-405b-instruct"
271018
+ },
271019
+ {
271020
+ label: "Qwen 2.5 Coder 32B",
271021
+ value: "accounts/fireworks/models/qwen2p5-coder-32b-instruct"
271022
+ },
271023
+ { label: "Qwen 2.5 72B", value: "accounts/fireworks/models/qwen2p5-72b-instruct" }
271024
+ ];
271025
+ case "perplexity":
271026
+ return [
271027
+ { label: "Sonar Reasoning Pro (Recommended)", value: "sonar-reasoning-pro" },
271028
+ { label: "Sonar Pro", value: "sonar-pro" },
271029
+ { label: "Sonar", value: "sonar" }
271030
+ ];
271031
+ case "cohere":
271032
+ return [
271033
+ { label: "Command A (Recommended)", value: "command-a-03-2025" },
271034
+ { label: "Command R+", value: "command-r-plus-08-2024" },
271035
+ { label: "Command R", value: "command-r-08-2024" }
270647
271036
  ];
270648
271037
  case "december":
270649
271038
  case "december_proxy":
270650
271039
  return [
270651
- { label: "Gemini 3.6 Flash", value: "gemini-3.6-flash" },
270652
271040
  { label: "Gemini 3.7 Flash", value: "gemini-3.7-flash" },
270653
- { label: "Claude 3.7 Sonnet", value: "claude-3-7-sonnet-latest" },
270654
- { label: "Claude 3.5 Sonnet", value: "claude-3-5-sonnet-latest" },
270655
- { label: "o3-mini", value: "o3-mini" },
270656
- { label: "GPT-4o", value: "gpt-4o" },
270657
- { label: "DeepSeek Reasoner (R1)", value: "deepseek-reasoner" }
271041
+ { label: "Claude Sonnet 5", value: "claude-sonnet-5" },
271042
+ { label: "GPT-5.6 Sol", value: "gpt-5.6-sol" },
271043
+ { label: "DeepSeek V4 Pro", value: "deepseek-v4-pro" },
271044
+ { label: "o4-mini", value: "o4-mini" }
270658
271045
  ];
270659
271046
  case "ollama":
270660
271047
  return [
@@ -270699,6 +271086,15 @@ var getProviderModels = (provider) => {
270699
271086
  "mistral",
270700
271087
  "xai",
270701
271088
  "zai",
271089
+ "nvidia",
271090
+ "sambanova",
271091
+ "cerebras",
271092
+ "siliconflow",
271093
+ "together",
271094
+ "hyperbolic",
271095
+ "fireworks",
271096
+ "perplexity",
271097
+ "cohere",
270702
271098
  "ollama",
270703
271099
  "december_proxy"
270704
271100
  ];
@@ -270738,15 +271134,19 @@ function inferProviderFromModel(modelName) {
270738
271134
  const lower2 = (modelName || "").toLowerCase();
270739
271135
  if (lower2.startsWith("claude") || lower2.startsWith("anthropic/"))
270740
271136
  return "anthropic";
270741
- if (lower2.startsWith("gpt") || lower2.startsWith("o1") || lower2.startsWith("o3") || lower2.startsWith("openai/"))
271137
+ if (lower2.startsWith("gpt") || lower2.startsWith("o1") || lower2.startsWith("o3") || lower2.startsWith("o4") || lower2.startsWith("openai/"))
270742
271138
  return "openai";
270743
271139
  if (lower2.startsWith("gemini") || lower2.startsWith("google/"))
270744
271140
  return "google";
271141
+ if (lower2.startsWith("sonar") || lower2.startsWith("perplexity"))
271142
+ return "perplexity";
271143
+ if (lower2.startsWith("command") || lower2.startsWith("cohere"))
271144
+ return "cohere";
270745
271145
  if (lower2.startsWith("deepseek"))
270746
271146
  return "deepseek";
270747
271147
  if (lower2.startsWith("groq") || lower2.includes("llama-3.3-70b-versatile"))
270748
271148
  return "groq";
270749
- if (lower2.startsWith("mistral") || lower2.startsWith("codestral") || lower2.startsWith("pixtral"))
271149
+ if (lower2.startsWith("mistral") || lower2.startsWith("codestral") || lower2.startsWith("pixtral") || lower2.startsWith("ministral") || lower2.startsWith("devstral"))
270750
271150
  return "mistral";
270751
271151
  if (lower2.startsWith("moonshot") || lower2.startsWith("kimi"))
270752
271152
  return "moonshot";
@@ -270754,6 +271154,20 @@ function inferProviderFromModel(modelName) {
270754
271154
  return "xai";
270755
271155
  if (lower2.startsWith("zai") || lower2.startsWith("glm"))
270756
271156
  return "zai";
271157
+ if (lower2.startsWith("nvidia") || lower2.startsWith("nim") || lower2.includes("nemotron"))
271158
+ return "nvidia";
271159
+ if (lower2.startsWith("sambanova"))
271160
+ return "sambanova";
271161
+ if (lower2.startsWith("cerebras"))
271162
+ return "cerebras";
271163
+ if (lower2.startsWith("siliconflow") || lower2.startsWith("siliconcloud"))
271164
+ return "siliconflow";
271165
+ if (lower2.startsWith("together"))
271166
+ return "together";
271167
+ if (lower2.startsWith("hyperbolic"))
271168
+ return "hyperbolic";
271169
+ if (lower2.startsWith("fireworks") || lower2.startsWith("accounts/fireworks/"))
271170
+ return "fireworks";
270757
271171
  if (lower2.includes("meta-llama") || lower2.includes("qwen/"))
270758
271172
  return "huggingface";
270759
271173
  if (lower2.includes("ollama") || lower2.includes("llama") || lower2.includes("qwen"))
@@ -270807,6 +271221,15 @@ var init_usage_rates2 = __esm(() => {
270807
271221
  kimi: "https://platform.moonshot.cn/console/recharge",
270808
271222
  xai: "https://console.x.ai/",
270809
271223
  zai: "https://open.bigmodel.cn/usercenter/apikeys",
271224
+ nvidia: "https://build.nvidia.com/",
271225
+ sambanova: "https://cloud.sambanova.ai/",
271226
+ cerebras: "https://cloud.cerebras.ai/",
271227
+ siliconflow: "https://cloud.siliconflow.cn/account/ak",
271228
+ together: "https://api.together.ai/settings/billing",
271229
+ hyperbolic: "https://app.hyperbolic.ai/settings",
271230
+ fireworks: "https://app.fireworks.ai/settings/billing",
271231
+ perplexity: "https://www.perplexity.ai/settings/api",
271232
+ cohere: "https://dashboard.cohere.com/billing",
270810
271233
  huggingface: "https://huggingface.co/settings/billing",
270811
271234
  ollama: "http://localhost:11434"
270812
271235
  };
@@ -270824,6 +271247,15 @@ var init_usage_rates2 = __esm(() => {
270824
271247
  kimi: "Moonshot AI (Kimi)",
270825
271248
  xai: "xAI Console",
270826
271249
  zai: "Zhipu AI (GLM)",
271250
+ nvidia: "NVIDIA NIM",
271251
+ sambanova: "SambaNova Cloud",
271252
+ cerebras: "Cerebras Inference",
271253
+ siliconflow: "SiliconFlow (SiliconCloud)",
271254
+ together: "Together AI",
271255
+ hyperbolic: "Hyperbolic",
271256
+ fireworks: "Fireworks AI",
271257
+ perplexity: "Perplexity AI",
271258
+ cohere: "Cohere",
270827
271259
  huggingface: "Hugging Face",
270828
271260
  ollama: "Ollama (Local)"
270829
271261
  };
@@ -270896,7 +271328,7 @@ async function processAgentStream({
270896
271328
  return msg;
270897
271329
  const blocks = [...msg.blocks || []];
270898
271330
  let finalMsg = { ...msg };
270899
- const isStatusMessage = (content) => content === "Thinking..." || content === "Searching..." || content === "Reading..." || content === "Planning..." || content === "Coding..." || content === "Executing..." || content === "Testing..." || content === "Verifying..." || content === "Refining..." || content === "Finalizing..." || content === "Working..." || content === "Preparing..." || content === "Compacting..." || content === "Generating..." || content === "Analyzing..." || content === "Analyzing prompt..." || content === "Generating questions..." || content === "Understanding..." || content.startsWith("Rate limit") || content.startsWith("High demand") || content.startsWith("LLM Provider rate limit") || content.startsWith("LLM Provider high demand");
271331
+ const isStatusMessage = (content) => content === "Thinking..." || content === "Searching..." || content === "Reading..." || content === "Planning..." || content === "Coding..." || content === "Executing..." || content === "Testing..." || content === "Verifying..." || content === "Refining..." || content === "Finalizing..." || content === "Working..." || content === "Preparing..." || content === "Compacting..." || content === "Generating..." || content === "Analyzing..." || content === "Analyzing prompt..." || content === "Generating questions..." || content === "Understanding..." || content.startsWith("Preparing") || content.startsWith("Rate limit") || content.startsWith("High demand") || content.startsWith("LLM Provider rate limit") || content.startsWith("LLM Provider high demand");
270900
271332
  for (const event of eventsToProcess) {
270901
271333
  switch (event.type) {
270902
271334
  case "TurnStart":
@@ -270955,7 +271387,11 @@ async function processAgentStream({
270955
271387
  case "ThinkingChunk": {
270956
271388
  break;
270957
271389
  }
270958
- case "ToolCallStart":
271390
+ case "ToolCallStart": {
271391
+ const lastBlock = blocks[blocks.length - 1];
271392
+ if (lastBlock && lastBlock.type === "text" && isStatusMessage(lastBlock.content)) {
271393
+ blocks.pop();
271394
+ }
270959
271395
  blocks.push({
270960
271396
  type: "command",
270961
271397
  toolCallId: event.toolCall.id,
@@ -270966,6 +271402,7 @@ async function processAgentStream({
270966
271402
  output: ""
270967
271403
  });
270968
271404
  break;
271405
+ }
270969
271406
  case "ToolExecutionUpdate": {
270970
271407
  const runningCmd = blocks.find((b2) => b2.type === "command" && b2.toolCallId === event.toolCallId);
270971
271408
  if (runningCmd && runningCmd.status === "running") {
@@ -273044,7 +273481,7 @@ import path22 from "node:path";
273044
273481
  // package.json
273045
273482
  var package_default = {
273046
273483
  name: "@trydecember/cli",
273047
- version: "0.3.18",
273484
+ version: "0.3.19",
273048
273485
  description: "AI coding agent for terminal and cloud.",
273049
273486
  homepage: "https://trydecember.com",
273050
273487
  repository: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trydecember/cli",
3
- "version": "0.3.18",
3
+ "version": "0.3.19",
4
4
  "description": "AI coding agent for terminal and cloud.",
5
5
  "homepage": "https://trydecember.com",
6
6
  "repository": {
@@ -1,15 +1,31 @@
1
1
  #!/usr/bin/env node
2
+ import fs from 'node:fs'
2
3
 
3
4
  // Skip in CI or monorepo development builds
4
5
  if (process.env.CI || process.env.NODE_ENV === 'development') {
5
6
  process.exit(0)
6
7
  }
7
8
 
8
- const BLUE = '\x1b[38;2;135;178;244m'
9
+ const BLUE = '\x1b[38;2;137;180;248m'
9
10
  const WHITE = '\x1b[38;2;244;244;245m'
10
11
  const TRUNK = '\x1b[38;2;63;63;70m'
11
12
  const RESET = '\x1b[0m'
12
13
 
13
- console.log(`\n${BLUE}✱${RESET} ${BLUE}december successfully installed${RESET}`)
14
- console.log(`${TRUNK}│${RESET}`)
15
- console.log(`${BLUE}✱${RESET} run ${WHITE}december${RESET} to start your session\n`)
14
+ const message = `\n${BLUE}✱${RESET} ${WHITE}december successfully installed${RESET}\n${TRUNK}│${RESET}\n${BLUE}✱${RESET} run ${BLUE}december${RESET} to start your session\n\n`
15
+
16
+ try {
17
+ if (process.platform !== 'win32' && fs.existsSync('/dev/tty')) {
18
+ const tty = fs.createWriteStream('/dev/tty')
19
+ tty.write(message)
20
+ tty.end()
21
+ process.exit(0)
22
+ }
23
+ } catch {
24
+ // Intentionally swallowed: fallback to stderr if /dev/tty is unavailable
25
+ }
26
+
27
+ try {
28
+ process.stderr.write(message)
29
+ } catch {
30
+ // Intentionally swallowed: ignore write failure if streams are closed
31
+ }