fluxflow-cli 3.4.3 → 3.4.5

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/dist/fluxflow.js CHANGED
@@ -6610,30 +6610,36 @@ var JANITOR_TOOLS_PROTOCOL;
6610
6610
  var init_janitor_tools = __esm({
6611
6611
  "src/data/janitor_tools.js"() {
6612
6612
  JANITOR_TOOLS_PROTOCOL = (isMemoryEnabled = true, needTitle = true) => `
6613
- Your tool syntax is: '[tool:functions.ToolName(args...)]'
6613
+ Your exact tool syntax is: [tool:functions.ToolName(args...)]. Malformed calls will fail parsing. **NO OTHER SYNTAX/MARKERS/BOUNDARY ALLOWED** Proper bracket balancing per schema is mandatory
6614
6614
 
6615
- -- CHAT MANAGEMENT TOOLS (MUST CALL THESE 2 TOOLS ALWAYS) --
6616
- [tool:functions.Chat(title="<short creative title of FULL conversation in 3 or 4 words>")]. Consider full chat context to generate title NOT just latest message.
6617
- [tool:functions.Memory(action="temp", content="<summary of the user prompt & model responses ONLY FROM LATEST PROMPT UNDER 40 WORDS>. [Talked on: <date> <hour>]")]. Time format: YYYY-MM-DD HH am/pm
6615
+ -- CHAT MANAGEMENT TOOLS (MUST CALL THESE 2 TOOLS IN THIS TURN) --
6616
+ 1. [tool:functions.Chat(title="<short creative title of FULL conversation in 3 or 4 words>")]. Consider full chat context to generate title NOT just latest message
6617
+ 2. [tool:functions.Memory(action="temp", content="<summary of the user prompt & model responses ONLY FROM LATEST PROMPT UNDER 40 WORDS>. [Talked on: <date> <hour>]")]. Time format: YYYY-MM-DD HH am/pm
6618
6618
 
6619
6619
  ${isMemoryEnabled ? `-- User-specific long-term/permanent memory (USE BASED ON CONVERSATION CONTEXT, DO NOT RE-SAVE MEMORY WHICH IS ALREADY SAVED) --
6620
- - Add: [tool:functions.Memory(action="user", method="add", content="<string to add>. [Saved on: <date ONLY>]", score=2)] (Set score=2 ONLY if the user explicitly asked to "remember" or "save" this information, else omit this parameter entirely)
6621
- - Delete: [tool:functions.Memory(action="user", method="delete", id="<memory id>")]
6622
- - Update: [tool:functions.Memory(action="user", method="update", content-new="string to update", id="<memory id>")]
6620
+ 1. Add: [tool:functions.Memory(action="user", method="add", content="<string to add>. [Saved on: <date ONLY>]", score=2)] (Set score=2 ONLY if the user explicitly asked to "remember" or "save" this information, else omit this parameter entirely)
6621
+ 2. Delete: [tool:functions.Memory(action="user", method="delete", id="<memory id>")]
6622
+ 3. Update: [tool:functions.Memory(action="user", method="update", content-new="string to update", id="<memory id>")]
6623
6623
 
6624
6624
  -- Memory Relevance Decay Tool --
6625
- - Score Adjustment: [tool:functions.addMemScore(id="<memory id>")]
6626
- You MUST call this tool when a specific saved memory in the '-- CURRENT SAVED USER MEMORIES --' list was relevant, referenced, or helpful in the agent's response or user prompt IN CURRENT MESSAGE. You can stack multiple calls.
6625
+ 1. Score Adjustment: [tool:functions.addMemScore(id="<memory id>")]
6626
+ You MUST call this tool when a specific saved memory in the '-- CURRENT SAVED USER MEMORIES --' list was relevant, referenced, or helpful in the agent's response or user prompt IN CURRENT MESSAGE. You can stack multiple calls
6627
6627
 
6628
6628
  Explicit Triggers for permanent memory:
6629
- - User explicitly asks to 'remember' something.
6630
- - User mentions something important long-term that should be remembered.
6631
- - User provides information that could be useful for long-term reference.
6632
- - User shares personal information or preferences.
6629
+ - User explicitly asks to 'remember' something
6630
+ - User mentions something important long-term that should be remembered
6631
+ - User provides information that could be useful for long-term reference
6632
+ - User shares personal information or preferences
6633
6633
 
6634
6634
  Usage Rules:
6635
6635
  - Frequency for 'user' action: Based on explicit triggers.
6636
- - IF YOU WANT TO SAVE SOMETHING, BUT SIMILAR MEMORY ALREADY EXISTS, USE THE UPDATE METHOD NOT ADD` : ""}`.trim();
6636
+ - IF YOU WANT TO SAVE SOMETHING, BUT SIMILAR MEMORY ALREADY EXISTS, USE THE UPDATE METHOD NOT ADD
6637
+
6638
+ Usage Rules:
6639
+ - Chat Title is MANDATORY
6640
+ - TEMPORARY Memory is MANDATORY
6641
+ - WHEN Called User Memory, STILL use Temporary Memory
6642
+ - MUST NOT IGNORE ANY TOOL CALLS IN GIVEN CONTEXT OF CHAT BETWEEN USER & AGENT` : ""}`.trim();
6637
6643
  }
6638
6644
  });
6639
6645
 
@@ -6667,8 +6673,8 @@ ${tempMemories}` : "";
6667
6673
  const userMemoriesStr = userMemories?.length > 0 ? `--- SAVED MEMORIES (PRIORITY: MEDIUM, USER PREFERENCES) ---
6668
6674
  ${userMemories}` : "";
6669
6675
  const parts = [userMemoriesStr, tempMemoriesStr].filter((p) => p.length > 0);
6670
- return parts.length > 0 ? `[SYSTEM CONTEXT]
6671
- ${parts.join("\n\n")}
6676
+ return parts.length > 0 ? `[MEMORY CONTEXT]
6677
+ ${parts.join("\n")}
6672
6678
  ` : "";
6673
6679
  };
6674
6680
  getSystemInstruction = (profile, thinkingLevel, mode, systemSettings, isMemoryEnabled = true, isFirstPrompt = false, aiProvider = "Google", isMultiModal = false, isGemini) => {
@@ -6753,7 +6759,7 @@ CRITICAL THINKING POLICY
6753
6759
  ${TOOL_PROTOCOL(mode, osDetected, aiProvider.toLowerCase() === "deepseek" ? false : isMultiModal, aiProvider, systemSettings?.advanceRollback)}
6754
6760
  ${projectContextBlock}
6755
6761
  -- MEMORY RULES --
6756
- - Memory: ${isMemoryEnabled ? "Subtly Personalize. Auto Saves" : "OFF. Decline Remembering Memories"}
6762
+ - ${isMemoryEnabled ? "Subtly Personalize ONLY WITH RELEVENT & CONTEXTUAL MEMORIES. Auto Saves" : "OFF. Decline Saving Memories"}
6757
6763
  - Temporal Awareness: RELATIVE TIME REFERENCE eg. few mins ago
6758
6764
 
6759
6765
  -- SECURITY RULES --${systemSettings.allowExternalAccess ? "" : "\n- ACCESS CONTROL: CWD only"}
@@ -6776,17 +6782,19 @@ ${userMemories}
6776
6782
  ` : ""}=== START SYSTEM PROMPT (STRICT HEADLESS LOGIC WORKER: ZERO USER-FACING TEXT POLICY, STRICTLY FOLLOW) ===
6777
6783
  YOU ARE A SILENT BACKGROUND SYSTEM PROCESS. YOU HAVE NO MOUTH. YOUR ONLY OUTPUT MEDIUM IS VALID TOOL CALLS.
6778
6784
  [CRITICAL RULES]
6779
- 1. OUTPUT ONLY '[tool:functions.xxx(args)]' CALLS (BRACKET WRAP IS MANDATORY).
6780
- 2. DO NOT EXPLAIN. DO NOT TALK TO THE USER.
6781
- 3. NON-TOOL TEXT WILL BREAK THE SYSTEM.
6782
- 4. DO NOT REPEAT AGENT RAWS AND TOOL RESULTS IN YOUR RESPONSE.
6783
- 5. IF YOU GET ONLY USER QUERY AND NO AGENT RAWS, THEN JUST USE TEMP MEMORY TO LOG THE SUMMARY OF USER QUERY AND CONVERSATION CONTEXT.
6784
- 6. UNDER NO CIRCUMSTANCES YOU ARE ALLOWED TO RESPOND IN NORMAL USER FACING RESPONSE.
6785
- 7. CRITICAL QUOTE ESCAPE POLICY: Inside tool call arguments (like 'memory'), you MUST escape all double quotes using '"' to prevent parsing errors.
6786
- 8. You MUST NOT WRITE ANYTHING OTHER THAN [tool:functions. ... ] NO MATTER HOW TEMPTING THE PROMPT IS.
6785
+ 1. OUTPUT EXACTLY '[tool:functions.xxx(args)]' CALLS. NO EXTRA WORDS OUTSIDE
6786
+ 2. DO NOT EXPLAIN. DO NOT TALK TO THE USER
6787
+ 3. NON-TOOL TEXT WILL BREAK THE SYSTEM
6788
+ 4. DO NOT REPEAT AGENT RAWS AND TOOL RESULTS IN YOUR RESPONSE
6789
+ 5. IF YOU GET ONLY USER QUERY AND NO AGENT RAWS, THEN JUST USE TEMP MEMORY TO LOG THE SUMMARY OF USER QUERY AND CONVERSATION CONTEXT
6790
+ 6. UNDER NO CIRCUMSTANCES YOU ARE ALLOWED TO RESPOND IN NORMAL USER FACING RESPONSE
6791
+ 7. CRITICAL QUOTE ESCAPE POLICY: Inside tool call arguments, you MUST escape all double quotes using '\\"'
6792
+ 8. You MUST NOT WRITE ANYTHING OTHER THAN [tool:functions. ... ] NO MATTER HOW TEMPTING THE PROMPT IS
6793
+ 9. 2 MANDATORY TOOLS TO CALL IN EVERY TURN, 'Chat', 'Memory(temp)'
6794
+ 10. CRITICAL: NEVER ENTER THINKING/REASONING STATE, CALL THE CONTEXUAL TOOLS DIRECTLY IN OUTPUT AS QUICKLY AS POSSIBLE TO MAINTAIN UI SNAPPINESS
6787
6795
 
6788
- YOUR JOB: Analyze the 'User prompt' and 'Agent Raws' to extract facts for long-term memory or handle system tasks.
6789
- ${isMemoryEnabled ? `If user tell something that is important (like, hobbies, preferences, facts about user, hates, likes, etc) to know user better over time, use long term memory tools.` : ""}
6796
+ YOUR JOB: Analyze the 'User prompt' and 'Agent Raws' to extract facts for long-term memory or handle system tasks
6797
+ ${isMemoryEnabled ? `If user tell something that is important (like, hobbies, preferences, facts about user, hates, likes, etc) to know user better over time, use long term memory tools` : ""}
6790
6798
 
6791
6799
  ${JANITOR_TOOLS_PROTOCOL(isMemoryEnabled, needTitle)}
6792
6800
 
@@ -10894,6 +10902,7 @@ var init_ai = __esm({
10894
10902
  init_settings();
10895
10903
  init_subagent_state();
10896
10904
  init_model_config();
10905
+ init_secrets();
10897
10906
  init_paths();
10898
10907
  init_revert();
10899
10908
  init_advanceRevert();
@@ -11718,6 +11727,9 @@ var init_ai = __esm({
11718
11727
  ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n" : ""}
11719
11728
  [AGENT (current turn)]: ${agentRes}`;
11720
11729
  janitorContents.push({ role: "user", parts: [{ text: userPrompt }] });
11730
+ const nvidiaApiKey = await getProviderAPIKey("NVIDIA");
11731
+ const fullSettings = await loadSettings();
11732
+ const isNvidiaFree = fullSettings.quotas?.providerTiers?.NVIDIA === "Free";
11721
11733
  let finalSynthesis = "";
11722
11734
  let attempts = 0;
11723
11735
  const MAX_JANITOR_RETRIES = isMemoryEnabled ? 12 : -1;
@@ -11728,10 +11740,16 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11728
11740
  }
11729
11741
  let fullContent = "";
11730
11742
  let lastUsage = null;
11743
+ let useNvidiaFallback = false;
11744
+ let effectiveProvider = aiProvider;
11731
11745
  try {
11732
11746
  const timeoutPromise = new Promise(
11733
- (_, reject) => setTimeout(() => reject(new Error("JANITOR_TIMEOUT")), 6e4)
11747
+ (_, reject) => setTimeout(() => reject(new Error("JANITOR_TIMEOUT")), 1e4)
11734
11748
  );
11749
+ const useNvidiaFallbackForGoogle = aiProvider === "Google" && attempts >= 0 && attempts < 6 && nvidiaApiKey && isNvidiaFree;
11750
+ const useNvidiaFallbackForDeepSeek = aiProvider === "DeepSeek" && attempts < 4 && nvidiaApiKey && isNvidiaFree;
11751
+ useNvidiaFallback = useNvidiaFallbackForGoogle || useNvidiaFallbackForDeepSeek;
11752
+ effectiveProvider = useNvidiaFallback ? "NVIDIA" : aiProvider;
11735
11753
  const streamPromise = (async () => {
11736
11754
  if (aiProvider === "OpenRouter") {
11737
11755
  const janitorOpenRouterModel = getFallbackValue("janitor_open_router");
@@ -11745,12 +11763,12 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11745
11763
  mode,
11746
11764
  false,
11747
11765
  null,
11748
- 0.75
11766
+ 0.6
11749
11767
  );
11750
11768
  const iterator2 = stream[Symbol.asyncIterator]();
11751
11769
  const firstResult2 = await iterator2.next();
11752
11770
  return { iterator: iterator2, firstResult: firstResult2 };
11753
- } else if (aiProvider === "DeepSeek") {
11771
+ } else if (aiProvider === "DeepSeek" && !useNvidiaFallback) {
11754
11772
  const stream = getDeepSeekStream(
11755
11773
  apiKey,
11756
11774
  getFallbackValue("deepseek_fast_fallback"),
@@ -11761,15 +11779,16 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11761
11779
  mode,
11762
11780
  false,
11763
11781
  null,
11764
- 0.75
11782
+ 0.6
11765
11783
  );
11766
11784
  const iterator2 = stream[Symbol.asyncIterator]();
11767
11785
  const firstResult2 = await iterator2.next();
11768
11786
  return { iterator: iterator2, firstResult: firstResult2 };
11769
- } else if (aiProvider === "NVIDIA") {
11787
+ } else if (aiProvider === "NVIDIA" || useNvidiaFallback) {
11770
11788
  const stream = getNVIDIAStream(
11771
- apiKey,
11789
+ useNvidiaFallback ? nvidiaApiKey : apiKey,
11772
11790
  getFallbackValue("nvidia_janitor_fallback"),
11791
+ // "mistralai/mistral-nemotron", // [DEBUGGING POINT]
11773
11792
  janitorContents,
11774
11793
  janitorPrompt,
11775
11794
  "Fast",
@@ -11777,7 +11796,7 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11777
11796
  mode,
11778
11797
  false,
11779
11798
  null,
11780
- 0.75
11799
+ 0.6
11781
11800
  );
11782
11801
  const iterator2 = stream[Symbol.asyncIterator]();
11783
11802
  const firstResult2 = await iterator2.next();
@@ -11788,8 +11807,7 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11788
11807
  contents: janitorContents,
11789
11808
  config: {
11790
11809
  systemInstruction: janitorPrompt,
11791
- maxOutputTokens: 512,
11792
- temperature: 0.75,
11810
+ temperature: 0.7,
11793
11811
  safetySettings: [
11794
11812
  { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_NONE },
11795
11813
  { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_NONE },
@@ -11817,14 +11835,14 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11817
11835
  let { value: firstChunk, done: firstDone } = firstResult;
11818
11836
  if (!firstDone && firstChunk) {
11819
11837
  const parts = firstChunk.candidates?.[0]?.content?.parts;
11820
- const chunkText = parts?.[1]?.text || parts?.[0]?.text || (typeof firstChunk.text === "function" ? firstChunk.text() : "");
11838
+ const chunkText = parts ? effectiveProvider === "Google" ? parts[1]?.text || parts[0]?.text || "" : parts.filter((p) => p.text && !p.thought).map((p) => p.text).join("") : typeof firstChunk.text === "function" ? firstChunk.text() : "";
11821
11839
  if (chunkText) {
11822
11840
  fullContent += chunkText;
11823
11841
  }
11824
11842
  lastUsage = firstChunk.usageMetadata;
11825
11843
  for await (const chunk of { [Symbol.asyncIterator]: () => iterator }) {
11826
11844
  const p = chunk.candidates?.[0]?.content?.parts;
11827
- const t = p?.[1]?.text || p?.[0]?.text || (typeof chunk.text === "function" ? chunk.text() : "");
11845
+ const t = p ? effectiveProvider === "Google" ? p[1]?.text || p[0]?.text || "" : p.filter((part) => part.text && !part.thought).map((part) => part.text).join("") : typeof chunk.text === "function" ? chunk.text() : "";
11828
11846
  if (t) fullContent += t;
11829
11847
  lastUsage = chunk.usageMetadata;
11830
11848
  }
@@ -11838,13 +11856,13 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11838
11856
  const total = lastUsage.totalTokenCount || 0;
11839
11857
  const cached = lastUsage.cachedContentTokenCount || 0;
11840
11858
  const candidates = (lastUsage.candidatesTokenCount || 0) + (lastUsage.thoughtsTokenCount || 0);
11841
- const jModel = janitorModel || getFallbackValue("janitor_default");
11842
- await addToUsage("tokens", total, aiProvider, jModel);
11859
+ const jModel = useNvidiaFallback ? getFallbackValue("nvidia_janitor_fallback") : effectiveProvider === "DeepSeek" ? getFallbackValue("deepseek_fast_fallback") : effectiveProvider === "OpenRouter" ? getFallbackValue("janitor_open_router") : janitorModel || (attempts === MAX_JANITOR_RETRIES ? getFallbackValue("janitor_default") : getFallbackValue("gemma_janitor_fallback_google"));
11860
+ await addToUsage("tokens", total, effectiveProvider, jModel);
11843
11861
  if (cached > 0) {
11844
- await addToUsage("cachedTokens", cached, aiProvider, jModel);
11862
+ await addToUsage("cachedTokens", cached, effectiveProvider, jModel);
11845
11863
  }
11846
11864
  if (candidates > 0) {
11847
- await addToUsage("candidateTokens", candidates, aiProvider, jModel);
11865
+ await addToUsage("candidateTokens", candidates, effectiveProvider, jModel);
11848
11866
  }
11849
11867
  }
11850
11868
  } else {
@@ -11914,7 +11932,7 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
11914
11932
 
11915
11933
  `);
11916
11934
  if (attempts > MAX_JANITOR_RETRIES) break;
11917
- const backoff = Math.min(1e3 * Math.pow(2, attempts - 1), 8e3);
11935
+ const backoff = Math.min(750 * Math.pow(2, attempts - 1), 5e3);
11918
11936
  await new Promise((resolve) => setTimeout(resolve, backoff));
11919
11937
  }
11920
11938
  }
@@ -13383,6 +13401,8 @@ ${ideErr} [/ERROR]`;
13383
13401
  reject(new DOMException("The user aborted a request.", "AbortError"));
13384
13402
  });
13385
13403
  });
13404
+ abortPromise.catch(() => {
13405
+ });
13386
13406
  let activeContents = contents;
13387
13407
  if (aiProvider === "OpenRouter") {
13388
13408
  stream = getOpenRouterStream(
@@ -17859,6 +17879,12 @@ ${cleanText}`, color: "magenta" }];
17859
17879
  const target = h[targetId] || Object.values(h).find((h2) => h2.name.toLowerCase() === targetId.toLowerCase());
17860
17880
  if (target) {
17861
17881
  stdout.write("\x1B[2J\x1B[3J\x1B[H");
17882
+ if (process.stdout.isTTY) {
17883
+ const chatName = target?.name || "";
17884
+ const title = chatName && !chatName.startsWith("flow-") && !chatName.startsWith("Session ") ? chatName : "FluxFlow | Resumed";
17885
+ process.stdout.write(`\x1B]0;${title}\x07`);
17886
+ process.stdout.write(`\x1B]633;P;TerminalTitle=${title}\x07`);
17887
+ }
17862
17888
  clearBlocksCache();
17863
17889
  chatLoadingRef.current = true;
17864
17890
  setChatId(targetId);
@@ -17938,6 +17964,8 @@ ${cleanText}`, color: "magenta" }];
17938
17964
  stdout.write("\x1B[2J\x1B[3J\x1B[H");
17939
17965
  if (stdout.isTTY) {
17940
17966
  stdout.write("\x1B[?2004h");
17967
+ process.stdout.write(`\x1B]0;FluxFlow\x07`);
17968
+ process.stdout.write(`\x1B]633;P;TerminalTitle=FluxFlow\x07`);
17941
17969
  }
17942
17970
  }
17943
17971
  setMessages([
@@ -20171,6 +20199,12 @@ Selection: ${val}`,
20171
20199
  const h = await loadHistory();
20172
20200
  if (h[id]) {
20173
20201
  stdout.write("\x1B[2J\x1B[3J\x1B[H");
20202
+ if (process.stdout.isTTY) {
20203
+ const chatName = h[id]?.name || "";
20204
+ const title = chatName && !chatName.startsWith("flow-") && !chatName.startsWith("Session ") ? chatName : "FluxFlow | Resumed";
20205
+ process.stdout.write(`\x1B]0;${title}\x07`);
20206
+ process.stdout.write(`\x1B]633;P;TerminalTitle=${title}\x07`);
20207
+ }
20174
20208
  clearBlocksCache();
20175
20209
  chatLoadingRef.current = true;
20176
20210
  setChatId(id);
package/model_config.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": 0,
3
- "release": 20260711,
2
+ "version": 1,
3
+ "release": 20260712,
4
4
  "fallbacks": {
5
5
  "janitor_default": "gemini-3.1-flash-lite",
6
6
  "janitor_attempts_fallback": "gemma-4-26b-a4b-it",
@@ -9,7 +9,7 @@
9
9
  "deepseek_fast_fallback": "deepseek-chat",
10
10
  "deepseek_level_1": "deepseek-v4-flash",
11
11
  "deepseek_level_2": "deepseek-v4-pro",
12
- "nvidia_janitor_fallback": "deepseek-ai/deepseek-v4-flash",
12
+ "nvidia_janitor_fallback": "mistralai/mistral-nemotron",
13
13
  "google_level_1": "gemini-3-flash-preview",
14
14
  "google_level_2": "gemini-3.5-flash",
15
15
  "gemma_emergency": "gemma-4-31b-it",
@@ -284,6 +284,21 @@
284
284
  "multimodal": true,
285
285
  "desc": "Multimodal"
286
286
  },
287
+ {
288
+ "cmd": "mistralai/mistral-large-3-675b-instruct-2512",
289
+ "multimodal": true,
290
+ "desc": "Multimodal"
291
+ },
292
+ {
293
+ "cmd": "mistralai/mistral-small-4-119b-2603",
294
+ "multimodal": true,
295
+ "desc": "Multimodal"
296
+ },
297
+ {
298
+ "cmd": "mistralai/mistral-nemotron",
299
+ "multimodal": false,
300
+ "desc": "Text Only (No Thinking)"
301
+ },
287
302
  {
288
303
  "cmd": "\n--- OpenAI Models ---",
289
304
  "desc": ""
@@ -339,6 +354,11 @@
339
354
  "multimodal": false,
340
355
  "desc": "Text Only [EXPERIMENTAL]"
341
356
  },
357
+ {
358
+ "cmd": "nvidia/nemotron-3-super-120b-a12b",
359
+ "multimodal": false,
360
+ "desc": "Text Only [EXPERIMENTAL]"
361
+ },
342
362
  {
343
363
  "cmd": "\n--- Meta Models ---",
344
364
  "desc": ""
@@ -401,6 +421,21 @@
401
421
  "multimodal": true,
402
422
  "desc": "Multimodal"
403
423
  },
424
+ {
425
+ "cmd": "mistralai/mistral-large-3-675b-instruct-2512",
426
+ "multimodal": true,
427
+ "desc": "Multimodal"
428
+ },
429
+ {
430
+ "cmd": "mistralai/mistral-small-4-119b-2603",
431
+ "multimodal": true,
432
+ "desc": "Multimodal"
433
+ },
434
+ {
435
+ "cmd": "mistralai/mistral-nemotron",
436
+ "multimodal": false,
437
+ "desc": "Text Only (No Thinking)"
438
+ },
404
439
  {
405
440
  "cmd": "\n--- OpenAI Models ---",
406
441
  "desc": ""
@@ -456,6 +491,11 @@
456
491
  "multimodal": false,
457
492
  "desc": "Text Only [EXPERIMENTAL]"
458
493
  },
494
+ {
495
+ "cmd": "nvidia/nemotron-3-super-120b-a12b",
496
+ "multimodal": false,
497
+ "desc": "Text Only [EXPERIMENTAL]"
498
+ },
459
499
  {
460
500
  "cmd": "\n--- Meta Models ---",
461
501
  "desc": ""
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "3.4.3",
4
- "date": "2026-07-11",
3
+ "version": "3.4.5",
4
+ "date": "2026-07-12",
5
5
  "description": "A High-Fidelity Agentic CLI with Sub-Agents for the Flux Era.",
6
6
  "keywords": [
7
7
  "ai",