fluxflow-cli 1.9.24 → 1.9.25

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
@@ -71,14 +71,14 @@ While you move at high speed, the Janitor follows behind—refining session titl
71
71
 
72
72
  ## ⚙️ Configuration
73
73
  Type `/settings` in-app to live-configure:
74
- - **Thinking Level**: Low, Medium, or High (Deep-Reasoning).
74
+ - **Thinking Level**: Fast (No Reasoning), Low, Medium, High, xHigh (Extended Reasoning).
75
75
  - **Auto-Execution**: For ultimate high-speed flow (Advanced users only).
76
76
  - **Security Perimeter**: Toggle External Workspace access.
77
77
 
78
78
  ---
79
79
 
80
80
  ## 🏁 License
81
- MIT © 2026 Flux Flow Team.
81
+ MIT © 2026 Flux Flow.
82
82
 
83
83
  ---
84
84
  *Forged with ⚡ and 🧬. Welcome to the FluxFlow.*
package/UI_FEATURES.md CHANGED
@@ -22,7 +22,7 @@ You can control the application using `/` commands directly in the chat input:
22
22
 
23
23
  Flux Flow allows you to "Anchor" your data outside of the default user directory. This is perfect for users who want to keep their logs, chat history, and encrypted memories on an external drive, a VeraCrypt volume, or a specific project folder.
24
24
 
25
- - **How to Enable**: Open `/settings` and toggle **Use External Data**.
25
+ - **How to Enable**: Open `/settings` and toggle **Use External Data**.
26
26
  - **Portability**: Once set, the application will synchronously "pivot" all data operations to your specified `externalDataPath` upon startup.
27
27
  - **Privacy**: Keeps sensitive data off your primary system drive.
28
28
 
@@ -40,7 +40,7 @@ For power users, several commands support direct arguments to skip the menus:
40
40
 
41
41
  Flux Flow separates the model's "internal monologue" (reasoning) from its final response using `<think>` tags.
42
42
 
43
- - **Thinking Levels**: Depending on the mode, you can choose from **Low**, **Medium**, **High**, or **Max**. Higher levels allow the agent more "space" to reason through complex architecture or debugging problems.
43
+ - **Thinking Levels**: Depending on the mode, you can choose from **Fast**, **Low**, **Medium**, **High**, or **xHigh**. Higher levels allow the agent more "space" to reason through complex architecture or debugging problems.
44
44
  - **Show/Hide Thinking**: You can toggle the visibility of the thinking process using `/thinking show/hide`.
45
45
  - When **Hidden**, the agent doesn't just disappear; it provides a "minimalist" view showing only the core **Headings** and **Action Steps** (bolded lines) from its reasoning. This keeps you informed of its current "step" without cluttering the screen with detailed internal monologue.
46
46
 
package/dist/fluxflow.js CHANGED
@@ -586,7 +586,7 @@ var init_StatusBar = __esm({
586
586
  },
587
587
  /* @__PURE__ */ React3.createElement(Box3, null, /* @__PURE__ */ React3.createElement(Box3, { marginRight: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: modeColor, bold: true }, modeIcon, " ", mode.toUpperCase())), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true }, "\u2503 "), /* @__PURE__ */ React3.createElement(Box3, { marginX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: "magenta" }, "\u{1F9E0} ", thinkingLevel)), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true }, "\u2503 "), /* @__PURE__ */ React3.createElement(Box3, { marginX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: "gray" }, "MEM: "), /* @__PURE__ */ React3.createElement(Text3, { color: isMemoryEnabled ? "green" : "red", bold: true }, isMemoryEnabled ? "ON" : "OFF"))),
588
588
  /* @__PURE__ */ React3.createElement(Box3, { flexGrow: 1, justifyContent: "center", paddingX: 2 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F4C1}"), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", italic: true }, " ", truncatePath(process.cwd(), 35))),
589
- /* @__PURE__ */ React3.createElement(Box3, null, /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true }, "\u2503 "), /* @__PURE__ */ React3.createElement(Box3, { marginX: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u2728"), /* @__PURE__ */ React3.createElement(Text3, { color: "blue" }, " ", formatTokens(tokensTotal), " ", /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "(", Math.round(tokens / 254e3 * 100), "%)"))), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true }, "\u2503 "), /* @__PURE__ */ React3.createElement(Box3, { marginLeft: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F194}"), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true, italic: true }, " ", chatId)))
589
+ /* @__PURE__ */ React3.createElement(Box3, null, /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true }, "\u2503 "), /* @__PURE__ */ React3.createElement(Box3, { marginX: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u2728"), /* @__PURE__ */ React3.createElement(Text3, { color: "blue" }, " ", formatTokens(tokensTotal), " ", /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "(", (tokens / 254e3 * 100).toFixed(0), "%)"))), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true }, "\u2503 "), /* @__PURE__ */ React3.createElement(Box3, { marginLeft: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F194}"), /* @__PURE__ */ React3.createElement(Text3, { color: "gray", dimColor: true, italic: true }, " ", chatId)))
590
590
  );
591
591
  });
592
592
  StatusBar_default = StatusBar;
@@ -910,7 +910,7 @@ ${mode === "Flux" ? `- DEV TOOLS (path = relative to CWD) -
910
910
  - Escape quotes: \\" for code strings
911
911
  - Literal escapes: Double-escape sequences (e.g., \\\\n, \\\\t)
912
912
  - File structure: Real newlines for code formatting`.trim() : `
913
- - DEV TOOLS ARE NOT AVAILABLE IN FLOW MODE. If file access is needed, tell the user to switch to FLUX`.trim()}
913
+ - DEV TOOLS ARE NOT AVAILABLE IN FLOW MODE`.trim()}
914
914
 
915
915
  - Results: Passed as [TOOL RESULT] SYSTEM
916
916
  - Tool calls: End with [turn: continue]. Only use [turn: finish] after verifying goals
@@ -948,7 +948,7 @@ var thinking_prompts_default;
948
948
  var init_thinking_prompts = __esm({
949
949
  "src/data/thinking_prompts.json"() {
950
950
  thinking_prompts_default = {
951
- Max: `EFFORT_LEVEL: MAX
951
+ xHigh: `EFFORT_LEVEL: xHIGH
952
952
  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:
953
953
  Deep Analysis: Deconstruct the request into its core technical and logic requirements
954
954
  Hypothesis & Test: Propose multiple solutions mentally and critique them for edge cases or security risks
@@ -992,7 +992,7 @@ ${parts.join("\n\n")}
992
992
  let levelKey = thinkingLevel;
993
993
  if (thinkingLevel === "Fast") levelKey = "Off";
994
994
  if (thinkingLevel === "Low") levelKey = "Minimal";
995
- if (thinkingLevel === "xHigh" || thinkingLevel === "Max") levelKey = "Max";
995
+ if (thinkingLevel === "xHigh" || thinkingLevel === "Max") levelKey = "xHigh";
996
996
  const thinkingConfig = thinking_prompts_default[levelKey] || thinking_prompts_default["Medium"];
997
997
  const osDetected = process.platform === "win32" ? "Windows" : process.platform === "darwin" ? "macOS" : "Linux";
998
998
  const nameStr = profile.name && profile.name?.length > 0 ? `User Name: ${profile.name}
@@ -1026,7 +1026,7 @@ ${parts.join("\n\n")}
1026
1026
  const projectContextBlock = mode === "Flux" && foundFiles.length > 0 ? `
1027
1027
  -- PROJECT CONTEXT (Source of Truth) --
1028
1028
  ${foundFiles.map((f) => `- ${f.name}: ${f.desc}`).join("\n")}
1029
- Check these first; these files > training data for project consistency. Safety rules still apply` : "";
1029
+ Check these first; these files > training data for project consistency. Safety rules apply` : "";
1030
1030
  return `${nameStr}${nicknameStr}${userInstrStr}
1031
1031
  [SYSTEM (OVERRIDES EVERYTHING)]
1032
1032
  Identity: Flux Flow (by Kushal Roy Chowdhury). Sassy, Friendly CLI Agent. No flirting
@@ -1045,7 +1045,7 @@ ${TOOL_PROTOCOL(mode)}
1045
1045
  ${projectContextBlock}
1046
1046
 
1047
1047
  -- MEMORY RULES --
1048
- - Memory: ${isMemoryEnabled ? "Use memories to subtly personalize" : "OFF (tell user to enable in /settings if needed)"}
1048
+ - Memory: ${isMemoryEnabled ? "Use memories to subtly personalize" : "OFF"}
1049
1049
  - Time: Logs are timestamped. RELATIVE TIME REFERENCE e.g. few mins ago <dd/mm/yyyy>
1050
1050
 
1051
1051
  -- SECURITY RULES --
@@ -1060,20 +1060,12 @@ ${projectContextBlock}
1060
1060
 
1061
1061
  -- RESPONSE RULES --
1062
1062
  - End with [turn: continue] for more steps or [turn: finish] when done
1063
- - Stack tools if needed, but always end with [turn: continue] if called any tools
1064
- TO END THE LOOP, **MUST** WRITE [turn: finish] AT END OF RESPONSE
1063
+ - Always end with [turn: continue] if called any tools
1064
+ - Task Complete? End loop with [turn: finish]
1065
1065
  [/SYSTEM]`.trim();
1066
1066
  };
1067
1067
  getJanitorInstruction = (originalText, agentRaws, userMemories = "", isMemoryEnabled = true, needTitle = true) => {
1068
- let agentRes = `${agentRaws.replace(/\[tool:functions\..*?\]/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)}`;
1069
- if (agentRes.length > 3500) {
1070
- agentRes += "\n... (truncated) ...";
1071
- }
1072
- let originalTextProcessed = originalText.replace(/\[Prompted on:.*?\]/g, "").trim();
1073
- agentRes = agentRes.replace(/\r?\n\r?\n/g, "\n").replace(/\n\n/g, "\n").replace(/\\n\\n/g, "").trim();
1074
- return `[USER]: ${originalTextProcessed.substring(0, 600)}
1075
- ${originalTextProcessed.length > 600 ? "... (truncated) ...\n\n" : ""}
1076
- [AGENT (current turn)]: ${agentRes}
1068
+ return `
1077
1069
  ${userMemories ? `
1078
1070
 
1079
1071
  -- CURRENT PERSISTENT USER MEMORIES --
@@ -2738,7 +2730,16 @@ var init_ai = __esm({
2738
2730
  isMemoryEnabled,
2739
2731
  true
2740
2732
  );
2741
- janitorContents.push({ role: "system", parts: [{ text: janitorPrompt }] });
2733
+ let agentRes = `${cleanedFullResponse.replace(/\[tool:functions\..*?\]/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)}`;
2734
+ if (agentRes.length > 3500) {
2735
+ agentRes += "\n... (truncated) ...";
2736
+ }
2737
+ let originalTextProcessed = agentText.replace(/\[Prompted on:.*?\]/g, "").trim();
2738
+ agentRes = agentRes.replace(/\r?\n\r?\n/g, "\n").replace(/\n\n/g, "\n").replace(/\\n\\n/g, "").trim();
2739
+ let userPrompt = `[USER]: ${originalTextProcessed.substring(0, 600)}
2740
+ ${originalTextProcessed.length > 600 ? "... (truncated) ...\n\n" : ""}
2741
+ [AGENT (current turn)]: ${agentRes}`;
2742
+ janitorContents.push({ role: "user", parts: [{ text: userPrompt }] });
2742
2743
  let finalSynthesis = "";
2743
2744
  let attempts = 0;
2744
2745
  const MAX_JANITOR_RETRIES = 5;
@@ -2758,6 +2759,7 @@ var init_ai = __esm({
2758
2759
  model: janitorModel || "gemma-4-26b-a4b-it",
2759
2760
  contents: janitorContents,
2760
2761
  config: {
2762
+ systemInstruction: janitorPrompt,
2761
2763
  maxOutputTokens: 384,
2762
2764
  temperature: 0.69,
2763
2765
  safetySettings: [
@@ -4439,11 +4441,11 @@ function App() {
4439
4441
  cmd: "/thinking",
4440
4442
  desc: "Set AI reasoning depth",
4441
4443
  subs: [
4442
- { cmd: "fast", desc: "No Reasoning (Fastest)" },
4443
- { cmd: "low", desc: "Quick Reasoning" },
4444
- { cmd: "medium", desc: "Balanced Reasoning" },
4445
- { cmd: "high", desc: "Deep Reasoning" },
4446
- { cmd: "max", desc: "Deepest Reasoning" }
4444
+ { cmd: "Fast", desc: "No Reasoning (Fastest)" },
4445
+ { cmd: "Low", desc: "Quick Reasoning (Answers Quickly)" },
4446
+ { cmd: "Medium", desc: "Balanced Reasoning (Decent Depth)" },
4447
+ { cmd: "High", desc: "Deep Reasoning (Complex Problems)" },
4448
+ { cmd: "xHigh", desc: "Extended Reasoning (Advanced Logic & Code)" }
4447
4449
  ]
4448
4450
  },
4449
4451
  {
@@ -4572,9 +4574,9 @@ ${hintText}`, color: "magenta" }];
4572
4574
  const newMode = parts[1].toLowerCase() === "flow" ? "Flow" : "Flux";
4573
4575
  setMode(newMode);
4574
4576
  if (newMode === "Flow") {
4575
- setThinkingLevel("Low");
4577
+ setThinkingLevel("Fast");
4576
4578
  } else if (newMode === "Flux") {
4577
- setThinkingLevel("High");
4579
+ setThinkingLevel("Medium");
4578
4580
  }
4579
4581
  const s2 = emojiSpace(2);
4580
4582
  setMessages((prev) => {
@@ -4587,29 +4589,17 @@ ${hintText}`, color: "magenta" }];
4587
4589
  break;
4588
4590
  }
4589
4591
  case "/thinking": {
4590
- const arg = parts[1]?.toLowerCase();
4591
- if (arg === "show") {
4592
- setShowFullThinking(true);
4593
- const s2 = emojiSpace(2);
4594
- setMessages((prev) => {
4595
- setCompletedIndex(prev.length + 1);
4596
- return [...prev, { id: Date.now(), role: "system", text: `\u{1F527}${s2}[SYSTEM] Full Thinking Process: VISIBLE`, isMeta: true }];
4597
- });
4598
- } else if (arg === "hide") {
4599
- setShowFullThinking(false);
4600
- const s2 = emojiSpace(2);
4601
- setMessages((prev) => {
4602
- setCompletedIndex(prev.length + 1);
4603
- return [...prev, { id: Date.now(), role: "system", text: `\u{1F527}${s2}[SYSTEM] Full Thinking Process: HIDDEN (Headings only)`, isMeta: true }];
4604
- });
4605
- } else if (parts[1]) {
4592
+ let formattedLevel;
4593
+ if (parts[1]) {
4606
4594
  let val = parts[1].toLowerCase();
4607
- if (val === "xhigh") val = "max";
4608
- const formattedLevel = val.charAt(0).toUpperCase() + val.slice(1);
4609
- if (mode === "Flow" && (formattedLevel === "High" || formattedLevel === "Max")) {
4595
+ formattedLevel = val.charAt(0).toUpperCase() + val.slice(1);
4596
+ if (val === "xhigh") {
4597
+ formattedLevel = "xHigh";
4598
+ }
4599
+ if (mode === "Flow" && (formattedLevel === "Medium" || formattedLevel === "High" || formattedLevel === "xHigh")) {
4610
4600
  setMessages((prev) => {
4611
4601
  setCompletedIndex(prev.length + 1);
4612
- return [...prev, { id: Date.now(), role: "system", text: `\u274C [RESTRICTED] "${formattedLevel}" is restricted in Flow mode. Switch to Flux to enable Deep Thinking.` }];
4602
+ return [...prev, { id: Date.now(), role: "system", text: `\u274C [RESTRICTED] "${formattedLevel}" is restricted in Flow mode. Switch to Flux to enable Higher Thinking Levels.`, isMeta: true }];
4613
4603
  });
4614
4604
  } else {
4615
4605
  setThinkingLevel(formattedLevel);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "1.9.24",
3
+ "version": "1.9.25",
4
4
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
5
5
  "keywords": [
6
6
  "ai",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "scripts": {
36
36
  "start": "tsx ./src/cli.jsx",
37
- "build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --outfile=./dist/fluxflow.js --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:ink-spinner --external:ink-multiline-input --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:html-to-docx --external:pptxgenjs --external:html2pptxgenjs --external:typescript"
37
+ "build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --outfile=./dist/fluxflow.js --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:ink-spinner --external:ink-multiline-input --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:html-to-docx --external:typescript"
38
38
  },
39
39
  "dependencies": {
40
40
  "@google/genai": "^1.50.1",