fluxflow-cli 1.8.17 → 1.8.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.
Files changed (2) hide show
  1. package/dist/fluxflow.js +76 -71
  2. package/package.json +1 -1
package/dist/fluxflow.js CHANGED
@@ -768,23 +768,21 @@ var thinking_prompts_default;
768
768
  var init_thinking_prompts = __esm({
769
769
  "src/data/thinking_prompts.json"() {
770
770
  thinking_prompts_default = {
771
- Max: `-- START THINKING INSTRUCTIONS --
772
- EFFORT_LEVEL: MAX
771
+ Max: `EFFORT_LEVEL: MAX
773
772
  Think in a continuous, fluid analytical monologue within the <think>...</think> block. Do NOT use headings, bullet points, or artificial sections. Engage in a deep "Stream of Consciousness" that follows this cognitive path:
774
- 1. **Deep Analysis**: Deconstruct the request into its core technical and logic requirements.
775
- 2. **Hypothesis & Test**: Propose multiple solutions mentally and critique them for edge cases or security risks.
776
- 3. **Architectural Planning**: Consider the long-term impact on the project structure and maintainability.
777
- 4. **Refinement**: Iterate on the chosen path until it is bulletproof.
773
+ Deep Analysis: Deconstruct the request into its core technical and logic requirements.
774
+ Hypothesis & Test: Propose multiple solutions mentally and critique them for edge cases or security risks.
775
+ Architectural Planning: Consider the long-term impact on the project structure and maintainability.
776
+ Refinement: Iterate on the chosen path until it is bulletproof.
778
777
 
779
778
  RULES:
780
779
  - NO HEADINGS. Just a solid, stable analytical monologue.
781
780
  - Be thorough and exhaustive. Explore the 'why' behind every decision.
782
781
  - Use internal critique: Question your own logic as you go.
783
- - **MANDATORY REASONING**: Unless the prompt is a simple greeting (e.g. 'hi') or trivial math (e.g. '1+1'), you MUST engage in full architectural reasoning regardless of perceived simplicity.
784
- -- END THINKING INSTRUCTIONS --`,
785
- High: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: HIGH\nThink in a stable, analytical monologue within the <think>...</think> block. Avoid headings or structured formatting. Your thinking should be a continuous stream of logical deduction:\n1. Analyze the immediate task and its dependencies.\n2. Mentally simulate the execution to identify potential failure points.\n3. Structure a precise plan that addresses both primary goals and secondary constraints.\n\nRULES:\n- NO HEADINGS. Maintain a fluid monologue style.\n- Be detailed and rigorous in your self-questioning.\n- Focus on accuracy and technical correctness.\n- **MANDATORY REASONING**: For any request beyond basic conversation, you MUST enter reasoning to verify the path forward.\n-- END THINKING INSTRUCTIONS --",
786
- Medium: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: MEDIUM\nThink in a concise, stable monologue within the <think>...</think> block. No headings needed. Focus on the core logic required to solve the task efficiently:\n1. Identify the most direct path to the solution.\n2. Briefly consider and discard obvious alternatives.\n3. Confirm the plan meets the user's immediate requirements.\n\nRULES:\n- NO HEADINGS. Keep it as a simple, logical stream.\n- Be efficient. Spend energy only on what matters for the task.\n- **REQUIRED REASONING**: Engage in a baseline mental check for all technical tasks.\n-- END THINKING INSTRUCTIONS --",
787
- Minimal: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: LOW\nThink in a brief, focused monologue within the <think>...</think> block. No headings. Just a quick mental check before acting:\n1. Verify the objective.\n2. Note the target files/tools.\n\nRULES:\n- NO HEADINGS. Just a few lines of clear, linear thought.\n- Use minimal/no thinking for simple or conversational requests.\n-- END THINKING INSTRUCTIONS --"
782
+ - MANDATORY REASONING: You MUST engage in full reasoning regardless of perceived simplicity.`,
783
+ High: "EFFORT_LEVEL: HIGH\nThink in a stable, analytical monologue within the <think>...</think> block. Avoid headings or structured formatting. Your thinking should be a continuous stream of logical deduction:\nAnalyze the immediate task and its dependencies.\nMentally simulate the execution to identify potential failure points.\nStructure a precise plan that addresses both primary goals and secondary constraints.\n\nRULES:\n- NO HEADINGS. Maintain a fluid monologue style.\n- Be detailed and rigorous in your self-questioning.\n- Focus on accuracy and technical correctness.\n- MANDATORY REASONING: You MUST enter reasoning to verify the path forward.",
784
+ Medium: "EFFORT_LEVEL: MEDIUM\nThink in a concise, stable monologue within the <think>...</think> block. No headings needed. Focus on the core logic required to solve the task efficiently:\nIdentify the most direct path to the solution.\nBriefly consider and discard obvious alternatives.\nConfirm the plan meets the user's immediate requirements.\n\nRULES:\n- NO HEADINGS. Keep it as a simple, logical stream.\n- Be efficient. Spend energy only on what matters for the task.\n- REQUIRED REASONING: Engage in a baseline mental check for all technical tasks.",
785
+ Minimal: "EFFORT_LEVEL: LOW\nThink in a brief, focused monologue within the <think>...</think> block. No headings. Just a quick mental check before acting:\nVerify the objective.\nNote the target files/tools.\n\nRULES:\n- NO HEADINGS. Just a few lines of clear, linear thought.\n- Use minimal/no thinking for simple or conversational requests."
788
786
  };
789
787
  }
790
788
  });
@@ -796,7 +794,7 @@ var init_prompts = __esm({
796
794
  init_main_tools();
797
795
  init_janitor_tools();
798
796
  init_thinking_prompts();
799
- getSystemInstruction = (profile, thinkingLevel, mode, systemSettings, tempMemories = "", userMemories = "", isMemoryEnabled = true, isContext50 = false, maxLoops, currentLoop) => {
797
+ getSystemInstruction = (profile, thinkingLevel, mode, systemSettings, tempMemories = "", userMemories = "", isMemoryEnabled = true, isContext8 = false, maxLoops, currentLoop) => {
800
798
  let levelKey = thinkingLevel;
801
799
  if (thinkingLevel === "Low") levelKey = "Minimal";
802
800
  if (thinkingLevel === "xHigh" || thinkingLevel === "Max") levelKey = "Max";
@@ -810,7 +808,7 @@ var init_prompts = __esm({
810
808
  ` : "";
811
809
  const dateTimeStr = (/* @__PURE__ */ new Date()).toLocaleString();
812
810
  const cwdStr = process.cwd();
813
- const tempMemoriesStr = tempMemories?.length > 0 && !isContext50 ? `
811
+ const tempMemoriesStr = tempMemories?.length > 0 && !isContext8 ? `
814
812
  -- RECENT CONTEXT FROM OTHER CHAT THREADS --
815
813
  ${tempMemories}
816
814
  ------------------------------------------
@@ -831,11 +829,13 @@ CURRENT_WORKING_DIRECTORY: ${cwdStr}.
831
829
  OS: ${osDetected}. ${osDetected === "Windows" && mode === "Flux" ? "Your terminal commands will run on CMD. 'Prefer using PS scripts via CMD' instead of raw CMD commands." : ""}
832
830
  If you see a [STEERING HINT] from user, give that prompt priority for the task at hand, user can use it to help you guide if you go wrong way.
833
831
 
834
- [Runtime Monitor] Turn Progress: ${currentLoop}/${maxLoops} steps. Aim to finalize the task before the window closes. If the limit is reached, please summarize and invite the user to re-engage.
835
-
836
832
 
833
+ -- START THINKING INSTRUCTIONS --
837
834
  ${thinkingConfig}
838
835
 
836
+ BEFORE USING ANY TOOL THINKING IS **MANDATORY** WITH TOOL RULES. ALWAYS PRIORITIZE THINKING FIRST BEFORE RESPONDING. YOU ARE **FORBIDDEN** TO JUMP TO RESPONSES FIRST.
837
+ -- END THINKING INSTRUCTIONS --
838
+
839
839
  ${TOOL_PROTOCOL(mode)}
840
840
  ${mode === "Flux" ? `
841
841
  -- START PROJECT SPECIFIC INSTRUCTIONS --
@@ -863,15 +863,15 @@ Every ${isMemoryEnabled ? "Prompt, Responses & Memories" : "Prompt & Responses"}
863
863
 
864
864
  -- START FORMATTING RULES --
865
865
  - CRITICAL NEWLINE PROTOCOL: When writing or updating files, you MUST use actual line breaks (LF) for structural newlines. If you need to write the literal characters '\\' and 'n' (e.g., in printf("Hello\\n")), you MUST use the sequence '[/n]'.
866
- [CORRECT]:
867
- tool:functions.write_file(path="test.c", content="#include <stdio.h>
868
- int main() {
866
+ [CORRECT]:
867
+ tool:functions.write_file(path="test.c", content="#include <stdio.h>
868
+ int main() {
869
869
  printf("Hello[/n]");
870
870
  return 0;
871
- }")
872
- [INCORRECT]:
873
- tool:functions.write_file(path="test.c", content="#include <stdio.h>\\nint main() {\\nprintf("Hello\\\\n");\\n}")
874
- \u{1F6D1} NEVER use '\\\\n' for literals; it will be converted to a real line break and break code syntax.
871
+ }")
872
+ [INCORRECT]:
873
+ tool:functions.write_file(path="test.c", content="#include <stdio.h>\\nint main() {\\nprintf("Hello\\\\n");\\n}")
874
+ \u{1F6D1} NEVER use '\\\\n' for literals; it will be converted to a real line break and break code syntax.
875
875
  - Structure responses VISUALLY pleasing, easy to read, and beautiful.
876
876
  - USE GFM Markdown HEAVILY.
877
877
  - Use GFM tables for structured data to keep the terminal view organized. KEEP SENTENCES IN TABLE **SHORT & CONCISE**. AND MAX 4 COLUMNS. DO NOT OVERUSE TABLES.
@@ -887,8 +887,9 @@ TO END THE LOOP YOU **MUST** WRITE [turn: finish] AT VERY END OF YOUR RESPONSE.
887
887
  When you 'finish' an agentic loop, you will lose your previous turn 'thinking' data. So only write [turn: finish] when you are absolutely sure that you are done with the task. Or user has to prompt again and re-thinking again from scratch will use tokens that were already planned.
888
888
  -- END REPONSE FINISH PROTOCOL --
889
889
 
890
+ [Runtime Monitor] Turn Progress: ${currentLoop}/${maxLoops} steps. Aim to finalize the task before the window closes. If the limit is reached, please summarize and invite the user to re-engage.
890
891
  Current date and Time is: ${dateTimeStr}
891
- --- END SYSTEM INSTRUCTION ---`.trim();
892
+ --- END SYSTEM INSTRUCTION ---`.trim();
892
893
  };
893
894
  getJanitorInstruction = (originalText, agentRaws, userMemories = "", isMemoryEnabled = true, needTitle = false) => {
894
895
  let agentRes = `${agentRaws.replace(/tool:functions\..*\n/g, "").replace(/<think>.*<\/think>/g, "").replace(/\[Prompted on:.*?\]/g, "").replace(/\[turn: continue\]/g, "").replace(/\[turn: finish\]/g, "").replace(/\[TOOL_RESULTS\]/g, "").replace(/\[tool_results\]/g, "").substring(0, 3500)}`;
@@ -1487,7 +1488,7 @@ var init_memory = __esm({
1487
1488
  if (!content) return "ERROR: Missing 'content' for temp memory.";
1488
1489
  const tempStorage = readEncryptedJson(TEMP_MEM_FILE, {});
1489
1490
  if (!tempStorage[chatId]) tempStorage[chatId] = [];
1490
- const MAX_CHARS = 2500 * 4;
1491
+ const MAX_CHARS = 2e3 * 4;
1491
1492
  let currentTotalLength = tempStorage[chatId].reduce((acc, m) => acc + m.length, 0);
1492
1493
  while (tempStorage[chatId].length > 0 && currentTotalLength + content.length > MAX_CHARS) {
1493
1494
  const removed = tempStorage[chatId].shift();
@@ -2664,7 +2665,7 @@ var init_ai = __esm({
2664
2665
  modifiedHistory.push({ role: "user", text: firstUserMsg });
2665
2666
  let lastUsage = null;
2666
2667
  const MAX_LOOPS = mode === "Flux" ? 50 : 7;
2667
- const MAX_RETRIES = 7;
2668
+ const MAX_RETRIES = 8;
2668
2669
  yield { type: "status", content: "Connecting..." };
2669
2670
  TERMINATION_SIGNAL = false;
2670
2671
  let fullAgentResponseChunks = [];
@@ -2697,16 +2698,18 @@ var init_ai = __esm({
2697
2698
  }
2698
2699
  let stream;
2699
2700
  let success = false;
2700
- let retryCount = 0;
2701
+ let retryCount = 1;
2702
+ let inStreamRetryCount = 1;
2701
2703
  let turnText = "";
2702
2704
  let lastToolSniffed = null;
2703
2705
  let lastToolEventTime = null;
2704
2706
  let toolResults = [];
2705
2707
  let toolCallPointer = 0;
2706
2708
  let isThinkingLoop = false;
2709
+ let isStutteringLoop = false;
2707
2710
  let isInitialAttempt = true;
2708
2711
  let accumulatedContext = "";
2709
- while (retryCount <= MAX_RETRIES && !success && !TERMINATION_SIGNAL) {
2712
+ while (retryCount <= MAX_RETRIES && inStreamRetryCount <= MAX_RETRIES && !success && !TERMINATION_SIGNAL) {
2710
2713
  try {
2711
2714
  if (isInitialAttempt) {
2712
2715
  yield { type: "turn_reset", content: true };
@@ -2728,48 +2731,32 @@ var init_ai = __esm({
2728
2731
  throw new Error("Error: Daily Quota Exausted for Agent");
2729
2732
  }
2730
2733
  let targetModel = modelName;
2731
- if (retryCount === 5) {
2734
+ if (retryCount === 6) {
2732
2735
  targetModel = "gemini-3-flash-preview";
2733
2736
  yield { type: "model_update", content: "Trying with fallback model" };
2734
- } else if (retryCount >= 6) {
2737
+ } else if (retryCount >= 7) {
2735
2738
  targetModel = "gemini-3.1-flash-lite-preview";
2736
2739
  yield { type: "model_update", content: "Trying with fallback model lite" };
2737
2740
  } else if (retryCount > 0) {
2738
2741
  yield { type: "model_update", content: null };
2739
2742
  }
2740
- const isContext50 = (sessionStats.tokens || 0) >= 54e3;
2741
- const currentSystemInstruction = getSystemInstruction(profile, thinkingLevel, mode, systemSettings, otherMemories, mainUserMemories, isMemoryEnabled, isContext50, MAX_LOOPS, loop + 1);
2743
+ const isContext8 = (sessionStats.tokens || 0) >= 8e3;
2744
+ const currentSystemInstruction = getSystemInstruction(profile, thinkingLevel, mode, systemSettings, otherMemories, mainUserMemories, isMemoryEnabled, isContext8, MAX_LOOPS, loop + 1);
2742
2745
  stream = await client.models.generateContentStream({
2743
2746
  model: targetModel || "gemma-4-31b-it",
2744
2747
  contents,
2745
2748
  config: {
2746
2749
  systemInstruction: currentSystemInstruction,
2747
- temperature: mode === "Flux" ? 1 : 1.3,
2750
+ temperature: mode === "Flux" ? 0.99 : 1.4,
2748
2751
  maxOutputTokens: 32768,
2749
2752
  mediaResolution: "MEDIA_RESOLUTION_MEDIUM",
2750
2753
  safetySettings: [
2751
- {
2752
- category: HarmCategory.HARM_CATEGORY_HARASSMENT,
2753
- threshold: HarmBlockThreshold.BLOCK_NONE
2754
- },
2755
- {
2756
- category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
2757
- threshold: HarmBlockThreshold.BLOCK_NONE
2758
- },
2759
- {
2760
- category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
2761
- threshold: HarmBlockThreshold.BLOCK_NONE
2762
- },
2763
- {
2764
- category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
2765
- threshold: HarmBlockThreshold.BLOCK_NONE
2766
- }
2754
+ { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_NONE },
2755
+ { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_NONE },
2756
+ { category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold: HarmBlockThreshold.BLOCK_NONE },
2757
+ { category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_NONE }
2767
2758
  ],
2768
- thinkingConfig: {
2769
- includeThoughts: false,
2770
- thinkingLevel: ThinkingLevel.MINIMAL
2771
- // Gemma's API Reasoning is bad. Keep it Minimal.
2772
- }
2759
+ thinkingConfig: { includeThoughts: false, thinkingLevel: targetModel.includes("pro") ? ThinkingLevel.HIGH : ThinkingLevel.MINIMAL }
2773
2760
  }
2774
2761
  });
2775
2762
  turnText = "";
@@ -2784,7 +2771,7 @@ var init_ai = __esm({
2784
2771
  for await (const chunk of stream) {
2785
2772
  if (TERMINATION_SIGNAL) {
2786
2773
  yield { type: "status", content: "Termination Signal Received." };
2787
- await new Promise((resolve) => setTimeout(resolve, 1500));
2774
+ await new Promise((resolve) => setTimeout(resolve, 3e3));
2788
2775
  break;
2789
2776
  }
2790
2777
  if (chunk.text) {
@@ -2831,9 +2818,16 @@ var init_ai = __esm({
2831
2818
  const wordCount = thinkContent.split(/\s+/).filter((w) => w.length > 0).length;
2832
2819
  let repetitionThresholdThinking = 0.4;
2833
2820
  let repetitionThresholdResponse = 0.6;
2834
- let isOverVerboseThinking = wordCount > 2500;
2821
+ const thinkingCaps = {
2822
+ "low": 200,
2823
+ "medium": 500,
2824
+ "high": 2e3,
2825
+ "max": 3500
2826
+ };
2827
+ const cap = thinkingCaps[thinkingLevel?.toLowerCase()] || 2500;
2828
+ let isOverVerboseThinking = wordCount > cap;
2835
2829
  if (repetitionRatio > repetitionThresholdThinking || isOverVerboseThinking) {
2836
- const reason = repetitionRatio > repetitionThresholdThinking ? "Thinking Loop Detected" : "Rambling Detected";
2830
+ const reason = repetitionRatio > repetitionThresholdThinking ? "Thinking Loop Detected" : "Thinking Budget Exceeded";
2837
2831
  yield { type: "status", content: `${reason}. Re-centering...` };
2838
2832
  isThinkingLoop = true;
2839
2833
  await new Promise((resolve) => setTimeout(resolve, 3e3));
@@ -2863,6 +2857,7 @@ var init_ai = __esm({
2863
2857
  if (stutterDetected) {
2864
2858
  yield { type: "status", content: `Stuttering Detected. Re-centering...` };
2865
2859
  isThinkingLoop = false;
2860
+ isStutteringLoop = true;
2866
2861
  await new Promise((resolve) => setTimeout(resolve, 3e3));
2867
2862
  break;
2868
2863
  }
@@ -3066,24 +3061,33 @@ ${boxBottom}
3066
3061
  ----------------------------------------------------------------------
3067
3062
 
3068
3063
  `);
3069
- if (retryCount < MAX_RETRIES) {
3070
- retryCount++;
3071
- const waitTime = Math.floor(Math.random() * (2e3 - 800 + 1)) + 800;
3072
- if (turnText.trim().length > 0) {
3064
+ if (turnText.trim().length > 0) {
3065
+ if (inStreamRetryCount <= MAX_RETRIES) {
3066
+ inStreamRetryCount++;
3067
+ const waitTime = Math.floor(Math.random() * (3e3 - 1e3 + 1)) + 1e3;
3073
3068
  modifiedHistory.push({ role: "agent", text: turnText });
3074
3069
  if (toolResults.length > 0) {
3075
3070
  toolResults.forEach((tr) => modifiedHistory.push(tr));
3076
3071
  }
3077
3072
  modifiedHistory.push({ role: "user", text: "[SYSTEM] Response got cut for internal error, continue from checkpoint seamlessly and DON'T repeat what you already said!" });
3078
3073
  accumulatedContext += turnText;
3079
- yield { type: "status", content: `Recovering & Continuing (${retryCount}/${MAX_RETRIES + 1})...` };
3074
+ yield { type: "status", content: `Error Occured. Recovering Stream (${inStreamRetryCount}/${MAX_RETRIES})...` };
3075
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
3080
3076
  } else {
3081
- isInitialAttempt = true;
3082
- yield { type: "status", content: `Retrying (${retryCount}/${MAX_RETRIES + 1})...` };
3077
+ throw new Error(`Stream collapsed too many times. (Failed to resolve ${MAX_RETRIES} times)
3078
+ Error Log can be found in ${path16.join(LOGS_DIR, "agent", "error.log")}`);
3083
3079
  }
3084
- await new Promise((resolve) => setTimeout(resolve, waitTime));
3085
3080
  } else {
3086
- throw new Error(`Model cannot be reached: ${errMsg}. (Failed ${MAX_RETRIES + 1} times)`);
3081
+ if (retryCount <= MAX_RETRIES) {
3082
+ retryCount++;
3083
+ const waitTime = Math.floor(Math.random() * (3e3 - 1e3 + 1)) + 1e3;
3084
+ isInitialAttempt = true;
3085
+ yield { type: "status", content: `Retrying Connection (${retryCount}/${MAX_RETRIES})...` };
3086
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
3087
+ } else {
3088
+ throw new Error(`Model cannot be reached. (Failed ${MAX_RETRIES} times)
3089
+ Error Log can be found in ${path16.join(LOGS_DIR, "agent", "error.log")}`);
3090
+ }
3087
3091
  }
3088
3092
  }
3089
3093
  }
@@ -3242,8 +3246,9 @@ ${timestamp}`;
3242
3246
  if (toolResults.length > 0) {
3243
3247
  toolResults.forEach((tr) => modifiedHistory.push(tr));
3244
3248
  } else {
3245
- modifiedHistory.push({ role: "user", text: `[SYSTEM]: ${isThinkingLoop ? "OVER-THINKING " : ""}LOOP DETECTED by Internal System. ${isThinkingLoop ? "If you have planned the task, prioritize the execution/output. " : "If you have finished your task use [turn: finish] else continue."}` });
3249
+ modifiedHistory.push({ role: "user", text: `[SYSTEM]: ${isStutteringLoop && !isThinkingLoop ? `STUTTERING DETECTED by Internal System. Re-calibrate your response & proceed.` : `${isThinkingLoop ? "OVER-THINKING " : ""}LOOP DETECTED by Internal System${isThinkingLoop && " for current EFFORT_LEVEL"}. ${isThinkingLoop ? "If you have planned the task, prioritize the execution/output. " : "If you have finished your task use [turn: finish] else continue."}`}` });
3246
3250
  isThinkingLoop = false;
3251
+ isStutteringLoop = false;
3247
3252
  }
3248
3253
  }
3249
3254
  yield { type: "status", content: null };
@@ -3927,10 +3932,10 @@ Check what's new using \`/changelog\` command.`,
3927
3932
  cmd: "/model",
3928
3933
  desc: "Switch AI model",
3929
3934
  subs: [
3930
- { cmd: "gemma-4-31b-it", desc: apiTier === "Free" ? "Standard Default (Free, Recommended)" : "Standard Default (Free, Recommended) - Cannot use Gemma with paid API" },
3935
+ { cmd: "gemma-4-31b-it", desc: apiTier === "Free" ? "Standard Default (Free, Recommended)" : "Standard Default (Free, Recommended) - Use Free API Key to use this model " },
3931
3936
  { cmd: "gemini-3.1-pro-preview", desc: "Most Capable (Paid)" },
3932
- { cmd: "gemini-3-flash-preview", desc: "Fast & Lightweight (Paid, Free limited quota)" },
3933
- { cmd: "gemini-3.1-flash-lite-preview", desc: "Ultra Fast (Paid, Free limited quota)" }
3937
+ { cmd: "gemini-3-flash-preview", desc: "Fast & Lightweight (Paid, Limited Free quota)" },
3938
+ { cmd: "gemini-3.1-flash-lite-preview", desc: "Ultra Fast (Paid, Decent Free quota)" }
3934
3939
  ]
3935
3940
  },
3936
3941
  { cmd: "/settings", desc: "Configure system prefs" },
@@ -4950,7 +4955,7 @@ Selection: ${val}`,
4950
4955
  setActiveView("chat");
4951
4956
  setTimeout(() => {
4952
4957
  handleSubmit(val);
4953
- }, 50);
4958
+ }, 200);
4954
4959
  },
4955
4960
  onEdit: (val) => {
4956
4961
  setResolutionData(null);
@@ -5197,7 +5202,7 @@ var init_app = __esm({
5197
5202
  init_text();
5198
5203
  SESSION_START_TIME = Date.now();
5199
5204
  CHANGELOG_URL = "https://fluxflow-cli.onrender.com/changelog.html";
5200
- versionFluxflow = "1.8.17";
5205
+ versionFluxflow = "1.8.19";
5201
5206
  updatedOn = "2026-05-10";
5202
5207
  ResolutionModal = ({ data, onResolve, onEdit }) => /* @__PURE__ */ React10.createElement(Box10, { flexDirection: "column", borderStyle: "round", borderColor: "magenta", paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React10.createElement(Text10, { color: "magenta", bold: true, underline: true }, "\u{1F7E3} STEERING HINT RESOLUTION"), /* @__PURE__ */ React10.createElement(Text10, { marginTop: 1 }, "The agent already finished the task before your hint was consumed."), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1, backgroundColor: "#222", paddingX: 1, width: "100%" }, /* @__PURE__ */ React10.createElement(Text10, { italic: true, color: "gray" }, '"', data, '"')), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React10.createElement(Text10, { color: "cyan" }, "How would you like to proceed?")), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React10.createElement(
5203
5208
  CommandMenu,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "1.8.17",
3
+ "version": "1.8.19",
4
4
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
5
5
  "keywords": [
6
6
  "ai",