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 +77 -43
- package/model_config.json +43 -3
- package/package.json +2 -2
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:
|
|
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
|
|
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
|
-
|
|
6621
|
-
|
|
6622
|
-
|
|
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
|
-
|
|
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
|
|
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 ? `[
|
|
6671
|
-
${parts.join("\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
|
-
-
|
|
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
|
|
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
|
|
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")),
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
11862
|
+
await addToUsage("cachedTokens", cached, effectiveProvider, jModel);
|
|
11845
11863
|
}
|
|
11846
11864
|
if (candidates > 0) {
|
|
11847
|
-
await addToUsage("candidateTokens", candidates,
|
|
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(
|
|
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":
|
|
3
|
-
"release":
|
|
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": "
|
|
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": ""
|