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 +2 -2
- package/UI_FEATURES.md +2 -2
- package/dist/fluxflow.js +35 -45
- package/package.json +2 -2
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,
|
|
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
|
|
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 **
|
|
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 }, "(",
|
|
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
|
|
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
|
-
|
|
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 = "
|
|
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
|
|
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
|
|
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
|
-
-
|
|
1064
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
4443
|
-
{ cmd: "
|
|
4444
|
-
{ cmd: "
|
|
4445
|
-
{ cmd: "
|
|
4446
|
-
{ cmd: "
|
|
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("
|
|
4577
|
+
setThinkingLevel("Fast");
|
|
4576
4578
|
} else if (newMode === "Flux") {
|
|
4577
|
-
setThinkingLevel("
|
|
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
|
-
|
|
4591
|
-
if (
|
|
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
|
-
|
|
4608
|
-
|
|
4609
|
-
|
|
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
|
|
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.
|
|
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:
|
|
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",
|