fluxflow-cli 2.13.0 → 2.13.1

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 (3) hide show
  1. package/README.md +133 -133
  2. package/dist/fluxflow.js +50 -29
  3. package/package.json +67 -67
package/README.md CHANGED
@@ -1,133 +1,133 @@
1
- # 🌌 Flux Flow (`fluxflow-cli`)
2
- ![Flux Flow Logo](https://github.com/KushalRoyChowdhury/fluxflow-cli/blob/main/fluxflow.png)
3
-
4
- <p align="left">
5
- <a href="https://github.com/KushalRoyChowdhury/fluxflow-cli"><img src="https://img.shields.io/badge/FluxFlow-v2-blue?style=plastic" alt="FluxFlow Version"></a>
6
- <a href="https://deepmind.google"><img src="https://img.shields.io/badge/Engine-Gemma%204-red?style=plastic" alt="Engine Gemma 4"></a>
7
- <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=plastic" alt="License MIT"></a>
8
- <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-%3E%3D20-green?style=plastic" alt="Node Compatibility"></a>
9
- </p>
10
-
11
- ### *The High-Fidelity Agentic Terminal for the Flux Era.*
12
-
13
- **Flux Flow** is not just another CLI—it's a high-speed, sassy, and goal-oriented CLI AI Agent powered by the latest Gemini/Gemma frontier models. Designed for developers who demand a premium UI/UX while managing complex file-system tasks, web research, and autonomous workflows.
14
-
15
- ---
16
-
17
- ## 🚀 Instant Ignition (No Setup Required)
18
- You don't even need to install it. Just fire up your terminal and run:
19
-
20
- ```bash
21
- # Run instantly (Zero Setup)
22
- npx fluxflow-cli
23
-
24
- # OR Install Globally
25
- npm install -g fluxflow-cli
26
- fluxflow-cli
27
- ```
28
-
29
- *The agent will prompt you for your API Key on the first run and store it securely in an encrypted vault.* Choose from multiple supported AI providers:
30
- - **Google GenAI** (Gemini & Gemma models)
31
- - **DeepSeek** (Native DeepSeek API)
32
- - **OpenRouter** (Access to hundreds of models; *Experimental*)
33
- - **NVIDIA** (Access to selected models; *Experimental*)
34
-
35
- ---
36
-
37
- ## ✨ Why Flux Flow?
38
-
39
- ### 🎨 **Premium Visual Sovereignty**
40
- Experience a terminal UI that feels alive. Built with **Ink** and **React**, Flux Flow features:
41
- - **Dynamic Status Bar**: Real-time telemetry showing your "Neural Headroom" (token usage), Thinking Level, and Session ID.
42
-
43
- ### 🔌 **High-Fidelity IDE Companion**
44
- Flux Flow now pairs with a dedicated VS Code extension to bridge the gap between terminal and editor:
45
- - **Surgical Diagnostic Sync**: Proactive background scanning for errors. If your project breaks, a "Magic Wand" icon $(\text{sparkle})$ appears in your editor title bar for an instant AI fix.
46
- - **Live Status Heartbeat**: The VS Code Status Bar acts as a live feed, showing the agent's current task (*Thinking*, *Web Searching*, *Patching*, etc.).
47
- - **Clickable Terminal Links**: Jump from the terminal output straight to your code with clickable file:line links.
48
- - **Right-Click Integration**: "FluxFlow > Chat" is available in the editor, explorer, and tab bars, even when no files are open.
49
- - **Selection-Driven Reasoning**: Select a block of code and ask "What does this do?"—the agent receives your selection instantly.
50
- - **Universal Compatibility**: Works flawlessly with VS Code, Cursor, VSCodium, Trae, and Antigravity.
51
-
52
- ### 👁️ **Native Multimodality**
53
- Flux Flow can now see! Use the `view_file` tool to analyze images (JPG, PNG) or deep-dive into PDF technical papers. The agent extracts high-fidelity visual context natively, making it a true multimodal companion.
54
-
55
- ### 📑 **Document Engineering Suite**
56
- Need a report or a presentation? Just ask. Flux Flow features a high-fidelity "Printing Press" that generates professional, branded documents natively:
57
- - **PDF**: Branded documents from HTML/CSS with automatic watermarking.
58
- - **DOCX**: Native Word documents with multi-page support and automatic numbering.
59
-
60
- ### ⏱️ **Codebase Time Travel (Git-less Reversion)**
61
- Refactor and build with absolute fearlessness. Flux Flow maintains transaction-based secure snapshots of files before they are generated or edited:
62
- - **Instant Rollback**: Revert your workspace files (source code, generated documents, images) to their exact state prior to any selected prompt in the history.
63
- - **Double-ESC Shortcut**: Press `ESC` twice while idle to pop open a sleek selection modal.
64
- - **`/revert` Command**: Run the `/revert` command directly in the chat to open the checkpoint viewer.
65
-
66
- ### 🚑 **Self-Healing Infrastructure**
67
- Zero setup means zero setup. On first run, Flux Flow performs an integrity check and autonomously installs its own Chromium engine if needed, ensuring features like PDF generation work 100% of the time without manual intervention.
68
-
69
- - **Archived Terminal Flow**: See execution outputs transform from live elements into permanent conversation records.
70
- - **Rich Aesthetics**: High-contrast, sleek design with smooth transitions and micro-animations.
71
-
72
- ### 🧠 **The Dual-Intelligence System**
73
- - **Flux Mode (Dev)**: High-speed, agentic problem solving with a 70-turn persistent loop for massive coding tasks.
74
- - **Flow Mode (Chat)**: Optimized for high-quality conversation and web-assisted reasoning.
75
-
76
- ### 🛡️ **Digital Fortress Governance**
77
- Security isn't an afterthought; it's a boundary.
78
- - **Sandbox Presets**: Choose from **Strict**, **Balanced**, **Autonomous**, or **Custom** security profiles to control agent autonomy.
79
- - **Granular Command Policies**: Configure Auto-Approve (`Auto` / `Read-Only` / `None`), Auto-Disallow (`Auto` / `Destructive` / `None`), Network Access toggle, and Auto-Approve Git Commits independently.
80
- - **External Path Hardlock**: Restricts the agent to your Current Working Directory (CWD) unless you explicitly unlock it.
81
- - **Human-in-the-Loop (HITL)**: Every file write and terminal command requires your high-fidelity approval.
82
- - **XOR Vaulting**: All local session histories, memories, and API keys are obfuscated and encrypted at rest.
83
- - **Adaptive Failover**: Automatic multi-stage retry logic with high-concurrency fallback model switching (Gemini 3.1 Flash Lite) during peak API congestion.
84
-
85
- ### 🧹 **The Background Janitor**
86
- While you move at high speed, the Janitor follows behind—refining session titles, compressing data, and ensuring your context window remains at absolute peak performance.
87
-
88
- ---
89
-
90
- ## 🛠️ Key Capabilities
91
- - **Deep File-System Interaction**: Edit, move, and refactor code across multiple files with atomic precision.
92
- - **Real-Time Web Intelligence**: Autonomous web-searching via DuckDuckGo for live news and technical research.
93
- - **Autonomous Project Alignment**: Automatically detects and adheres to project-specific instructions in `Agent.md`, `Skills.md`, and `Fluxflow.md` for high-fidelity alignment with your coding standards and custom workflows.
94
- - **High-Reliability Fallback**: Automatic failover to a lighter, high-concurrency model during peak traffic to ensure zero session loss.
95
- - **Persistent Memory**: The agent learns from your preferences and project requirements across sessions.
96
-
97
- ---
98
-
99
- ## 💻 CLI Startup Arguments
100
- Customize your session parameters directly from your console launch command:
101
-
102
- ```bash
103
- fluxflow [options]
104
- ```
105
-
106
- ### Supported Flags:
107
- - `--model <model-name>`: Temporary override for the active AI model (e.g., `gemini-2.5-pro`). Keeps settings file untouched.
108
- - `--memory <on | off>`: Toggle persistent long-term agent memory for the session.
109
- - `--resume <session-id>`: Resume a previous chat session programmatically.
110
- - `--update <check | latest>`: Manually run an update check (`check`) or execute latest update setup (`latest`).
111
- - `--package <npm | pnpm | yarn | bun>`: Override default package manager to run core application updates.
112
- - `--auto-del <1d | 7d | 30d>`: Set automated chat log deletion schedule.
113
- - `--yolo <on | off>`: Toggle autonomous execution permission.
114
- - `--external-access <on | off>`: Toggle permission to let agent read files outside CWD.
115
- - `--thinking <Fast | Low | Medium/Standard | High | xHigh>`: Override thinking level for reasoning depth. `Medium` and `Standard` is the same (Deepseek compatibility).
116
- - `--key <key@google | key@deepseek | key@openrouter>`: Set API key and provider.
117
- - `--provider <google | deepseek | openrouter>`: Override default provider.
118
-
119
- ---
120
-
121
- ## ⚙️ Configuration
122
- Type `/settings` in-app to live-configure:
123
- - **Thinking Level**: Fast (No Reasoning), Low, Medium, High, xHigh (Extended Reasoning).
124
- - **Sandbox Preset**: Strict, Balanced, Autonomous, or Custom security profiles.
125
- - **Security Perimeter**: Toggle External Workspace access, Network Access, and Git Commit auto-approval.
126
-
127
- ---
128
-
129
- ## 🏁 License
130
- MIT © 2026 Flux Flow.
131
-
132
- ---
133
- *Forged with ⚡ and 🧬. Welcome to the FluxFlow.*
1
+ # 🌌 Flux Flow (`fluxflow-cli`)
2
+ ![Flux Flow Logo](https://github.com/KushalRoyChowdhury/fluxflow-cli/blob/main/fluxflow.png)
3
+
4
+ <p align="left">
5
+ <a href="https://github.com/KushalRoyChowdhury/fluxflow-cli"><img src="https://img.shields.io/badge/FluxFlow-v2-blue?style=plastic" alt="FluxFlow Version"></a>
6
+ <a href="https://deepmind.google"><img src="https://img.shields.io/badge/Engine-Gemma%204-red?style=plastic" alt="Engine Gemma 4"></a>
7
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=plastic" alt="License MIT"></a>
8
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-%3E%3D20-green?style=plastic" alt="Node Compatibility"></a>
9
+ </p>
10
+
11
+ ### *The High-Fidelity Agentic Terminal for the Flux Era.*
12
+
13
+ **Flux Flow** is not just another CLI—it's a high-speed, sassy, and goal-oriented CLI AI Agent powered by the latest Gemini/Gemma frontier models. Designed for developers who demand a premium UI/UX while managing complex file-system tasks, web research, and autonomous workflows.
14
+
15
+ ---
16
+
17
+ ## 🚀 Instant Ignition (No Setup Required)
18
+ You don't even need to install it. Just fire up your terminal and run:
19
+
20
+ ```bash
21
+ # Run instantly (Zero Setup)
22
+ npx fluxflow-cli
23
+
24
+ # OR Install Globally
25
+ npm install -g fluxflow-cli
26
+ fluxflow-cli
27
+ ```
28
+
29
+ *The agent will prompt you for your API Key on the first run and store it securely in an encrypted vault.* Choose from multiple supported AI providers:
30
+ - **Google GenAI** (Gemini & Gemma models)
31
+ - **DeepSeek** (Native DeepSeek API)
32
+ - **OpenRouter** (Access to hundreds of models; *Experimental*)
33
+ - **NVIDIA** (Access to selected models; *Experimental*)
34
+
35
+ ---
36
+
37
+ ## ✨ Why Flux Flow?
38
+
39
+ ### 🎨 **Premium Visual Sovereignty**
40
+ Experience a terminal UI that feels alive. Built with **Ink** and **React**, Flux Flow features:
41
+ - **Dynamic Status Bar**: Real-time telemetry showing your "Neural Headroom" (token usage), Thinking Level, and Session ID.
42
+
43
+ ### 🔌 **High-Fidelity IDE Companion**
44
+ Flux Flow now pairs with a dedicated VS Code extension to bridge the gap between terminal and editor:
45
+ - **Surgical Diagnostic Sync**: Proactive background scanning for errors. If your project breaks, a "Magic Wand" icon $(\text{sparkle})$ appears in your editor title bar for an instant AI fix.
46
+ - **Live Status Heartbeat**: The VS Code Status Bar acts as a live feed, showing the agent's current task (*Thinking*, *Web Searching*, *Patching*, etc.).
47
+ - **Clickable Terminal Links**: Jump from the terminal output straight to your code with clickable file:line links.
48
+ - **Right-Click Integration**: "FluxFlow > Chat" is available in the editor, explorer, and tab bars, even when no files are open.
49
+ - **Selection-Driven Reasoning**: Select a block of code and ask "What does this do?"—the agent receives your selection instantly.
50
+ - **Universal Compatibility**: Works flawlessly with VS Code, Cursor, VSCodium, Trae, and Antigravity.
51
+
52
+ ### 👁️ **Native Multimodality**
53
+ Flux Flow can now see! Use the `view_file` tool to analyze images (JPG, PNG) or deep-dive into PDF technical papers. The agent extracts high-fidelity visual context natively, making it a true multimodal companion.
54
+
55
+ ### 📑 **Document Engineering Suite**
56
+ Need a report or a presentation? Just ask. Flux Flow features a high-fidelity "Printing Press" that generates professional, branded documents natively:
57
+ - **PDF**: Branded documents from HTML/CSS with automatic watermarking.
58
+ - **DOCX**: Native Word documents with multi-page support and automatic numbering.
59
+
60
+ ### ⏱️ **Codebase Time Travel (Git-less Reversion)**
61
+ Refactor and build with absolute fearlessness. Flux Flow maintains transaction-based secure snapshots of files before they are generated or edited:
62
+ - **Instant Rollback**: Revert your workspace files (source code, generated documents, images) to their exact state prior to any selected prompt in the history.
63
+ - **Double-ESC Shortcut**: Press `ESC` twice while idle to pop open a sleek selection modal.
64
+ - **`/revert` Command**: Run the `/revert` command directly in the chat to open the checkpoint viewer.
65
+
66
+ ### 🚑 **Self-Healing Infrastructure**
67
+ Zero setup means zero setup. On first run, Flux Flow performs an integrity check and autonomously installs its own Chromium engine if needed, ensuring features like PDF generation work 100% of the time without manual intervention.
68
+
69
+ - **Archived Terminal Flow**: See execution outputs transform from live elements into permanent conversation records.
70
+ - **Rich Aesthetics**: High-contrast, sleek design with smooth transitions and micro-animations.
71
+
72
+ ### 🧠 **The Dual-Intelligence System**
73
+ - **Flux Mode (Dev)**: High-speed, agentic problem solving with a 70-turn persistent loop for massive coding tasks.
74
+ - **Flow Mode (Chat)**: Optimized for high-quality conversation and web-assisted reasoning.
75
+
76
+ ### 🛡️ **Digital Fortress Governance**
77
+ Security isn't an afterthought; it's a boundary.
78
+ - **Sandbox Presets**: Choose from **Strict**, **Balanced**, **Autonomous**, or **Custom** security profiles to control agent autonomy.
79
+ - **Granular Command Policies**: Configure Auto-Approve (`Auto` / `Read-Only` / `None`), Auto-Disallow (`Auto` / `Destructive` / `None`), Network Access toggle, and Auto-Approve Git Commits independently.
80
+ - **External Path Hardlock**: Restricts the agent to your Current Working Directory (CWD) unless you explicitly unlock it.
81
+ - **Human-in-the-Loop (HITL)**: Every file write and terminal command requires your high-fidelity approval.
82
+ - **XOR Vaulting**: All local session histories, memories, and API keys are obfuscated and encrypted at rest.
83
+ - **Adaptive Failover**: Automatic multi-stage retry logic with high-concurrency fallback model switching (Gemini 3.1 Flash Lite) during peak API congestion.
84
+
85
+ ### 🧹 **The Background Janitor**
86
+ While you move at high speed, the Janitor follows behind—refining session titles, compressing data, and ensuring your context window remains at absolute peak performance.
87
+
88
+ ---
89
+
90
+ ## 🛠️ Key Capabilities
91
+ - **Deep File-System Interaction**: Edit, move, and refactor code across multiple files with atomic precision.
92
+ - **Real-Time Web Intelligence**: Autonomous web-searching via DuckDuckGo for live news and technical research.
93
+ - **Autonomous Project Alignment**: Automatically detects and adheres to project-specific instructions in `Agent.md`, `Skills.md`, and `Fluxflow.md` for high-fidelity alignment with your coding standards and custom workflows.
94
+ - **High-Reliability Fallback**: Automatic failover to a lighter, high-concurrency model during peak traffic to ensure zero session loss.
95
+ - **Persistent Memory**: The agent learns from your preferences and project requirements across sessions.
96
+
97
+ ---
98
+
99
+ ## 💻 CLI Startup Arguments
100
+ Customize your session parameters directly from your console launch command:
101
+
102
+ ```bash
103
+ fluxflow [options]
104
+ ```
105
+
106
+ ### Supported Flags:
107
+ - `--model <model-name>`: Temporary override for the active AI model (e.g., `gemini-2.5-pro`). Keeps settings file untouched.
108
+ - `--memory <on | off>`: Toggle persistent long-term agent memory for the session.
109
+ - `--resume <session-id>`: Resume a previous chat session programmatically.
110
+ - `--update <check | latest>`: Manually run an update check (`check`) or execute latest update setup (`latest`).
111
+ - `--package <npm | pnpm | yarn | bun>`: Override default package manager to run core application updates.
112
+ - `--auto-del <1d | 7d | 30d>`: Set automated chat log deletion schedule.
113
+ - `--yolo <on | off>`: Toggle autonomous execution permission.
114
+ - `--external-access <on | off>`: Toggle permission to let agent read files outside CWD.
115
+ - `--thinking <Fast | Low | Medium/Standard | High | xHigh>`: Override thinking level for reasoning depth. `Medium` and `Standard` is the same (Deepseek compatibility).
116
+ - `--key <key@google | key@deepseek | key@openrouter>`: Set API key and provider.
117
+ - `--provider <google | deepseek | openrouter>`: Override default provider.
118
+
119
+ ---
120
+
121
+ ## ⚙️ Configuration
122
+ Type `/settings` in-app to live-configure:
123
+ - **Thinking Level**: Fast (No Reasoning), Low, Medium, High, xHigh (Extended Reasoning).
124
+ - **Sandbox Preset**: Strict, Balanced, Autonomous, or Custom security profiles.
125
+ - **Security Perimeter**: Toggle External Workspace access, Network Access, and Git Commit auto-approval.
126
+
127
+ ---
128
+
129
+ ## 🏁 License
130
+ MIT © 2026 Flux Flow.
131
+
132
+ ---
133
+ *Forged with ⚡ and 🧬. Welcome to the FluxFlow.*
package/dist/fluxflow.js CHANGED
@@ -3214,6 +3214,7 @@ var init_TerminalBox = __esm({
3214
3214
  paddingLeft: 2,
3215
3215
  paddingRight: 0,
3216
3216
  paddingY: completed ? 0 : 1,
3217
+ marginTop: 1,
3217
3218
  width: "100%"
3218
3219
  },
3219
3220
  /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React3.createElement(Box2, { flexShrink: 1, paddingRight: 2 }, /* @__PURE__ */ React3.createElement(Text3, null, /* @__PURE__ */ React3.createElement(Text3, { color: "gray", bold: true }, completed ? "\u{1F3C1} FINISHED:" : "\u26A1 EXECUTING:", " "), /* @__PURE__ */ React3.createElement(Text3, { color: "white" }, command))), isPty && /* @__PURE__ */ React3.createElement(Box2, { flexShrink: 0, paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: "gray", bold: true }, "ADVANCE"))),
@@ -3709,9 +3710,9 @@ var init_ChatLayout = __esm({
3709
3710
  const prefix = content.substring(0, prefixLen);
3710
3711
  const delta = content.substring(prefixLen, content.length - suffixLen);
3711
3712
  const suffix = content.substring(content.length - suffixLen);
3712
- return /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: rowBgColor, paddingX: 1, width: columns }, /* @__PURE__ */ React4.createElement(Box3, { width: 5, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, { color: numColor, dimColor: isContext }, lineNum)), /* @__PURE__ */ React4.createElement(Box3, { width: 2, flexShrink: 0, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, bold: true }, isRemoval ? "-" : isAddition ? "+" : " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, dimColor: isContext }, prefix, /* @__PURE__ */ React4.createElement(Text4, { backgroundColor: bgColor }, delta), suffix)));
3713
+ return /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: rowBgColor, paddingX: 1, width: columns }, /* @__PURE__ */ React4.createElement(Box3, { width: 3, flexShrink: 0, justifyContent: "flex-end" }, /* @__PURE__ */ React4.createElement(Text4, { color: numColor, dimColor: isContext }, lineNum)), /* @__PURE__ */ React4.createElement(Box3, { width: 1, flexShrink: 0, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, bold: true }, isRemoval ? "-" : isAddition ? "+" : " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, dimColor: isContext }, prefix, /* @__PURE__ */ React4.createElement(Text4, { backgroundColor: bgColor }, delta), suffix)));
3713
3714
  }
3714
- return /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: rowBgColor, paddingX: 1, width: columns }, /* @__PURE__ */ React4.createElement(Box3, { width: 5, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, { color: numColor, dimColor: isContext }, lineNum)), /* @__PURE__ */ React4.createElement(Box3, { width: 2, flexShrink: 0, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, bold: true }, isRemoval ? "-" : isAddition ? "+" : " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, dimColor: isContext }, wrapText(content, columns - 14))));
3715
+ return /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: rowBgColor, paddingX: 1, width: columns }, /* @__PURE__ */ React4.createElement(Box3, { width: 3, flexShrink: 0, justifyContent: "flex-end" }, /* @__PURE__ */ React4.createElement(Text4, { color: numColor, dimColor: isContext }, lineNum)), /* @__PURE__ */ React4.createElement(Box3, { width: 1, flexShrink: 0, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, bold: true }, isRemoval ? "-" : isAddition ? "+" : " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: textColor, dimColor: isContext }, wrapText(content, columns - 14))));
3715
3716
  });
3716
3717
  DiffBlock = React4.memo(({ text, columns = 80 }) => {
3717
3718
  const match = text.match(/\[DIFF_START\]([\s\S]*?)\[DIFF_END\]/);
@@ -3775,7 +3776,7 @@ var init_ChatLayout = __esm({
3775
3776
  }
3776
3777
  return infos;
3777
3778
  }, [diffLines]);
3778
- return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", width: columns - 3, marginBottom: 1 }, /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", paddingY: 0, width: "100%" }, diffLines.map((line, i) => /* @__PURE__ */ React4.createElement(DiffLine, { key: i, line, columns: columns - 3, highlightInfo: highlightInfos[i] }))));
3779
+ return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", width: columns - 3, marginBottom: 1 }, /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", paddingY: 0, width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: "#1a1a1a", paddingX: 1, width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: 5, flexShrink: 0 }), /* @__PURE__ */ React4.createElement(Box3, { width: 2, flexShrink: 0, marginLeft: 1 }), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, null, " "))), diffLines.map((line, i) => /* @__PURE__ */ React4.createElement(DiffLine, { key: i, line, columns: columns - 3, highlightInfo: highlightInfos[i] })), /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: "#1a1a1a", paddingX: 1, width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: 5, flexShrink: 0 }), /* @__PURE__ */ React4.createElement(Box3, { width: 2, flexShrink: 0, marginLeft: 1 }), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, null, " ")))));
3779
3780
  });
3780
3781
  CodeRenderer = React4.memo(({ text, columns = 80 }) => {
3781
3782
  if (!text) return null;
@@ -3808,7 +3809,7 @@ var init_ChatLayout = __esm({
3808
3809
  marginBottom: 1,
3809
3810
  backgroundColor: "#1a1a1a"
3810
3811
  },
3811
- /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", width: "100%" }, codeLines.map((line, idx) => /* @__PURE__ */ React4.createElement(Box3, { key: idx, width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, { color: "gray", dimColor: true }, String(idx + 1).padStart(gutterWidth, " "), " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: "white" }, line)))))
3812
+ /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, null, " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1 }, /* @__PURE__ */ React4.createElement(Text4, null, " "))), codeLines.map((line, idx) => /* @__PURE__ */ React4.createElement(Box3, { key: idx, width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, { color: "gray", dimColor: true }, String(idx + 1).padStart(gutterWidth, " "), " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: "white" }, line)))), /* @__PURE__ */ React4.createElement(Box3, { width: "100%" }, /* @__PURE__ */ React4.createElement(Box3, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, null, " ")), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1 }, /* @__PURE__ */ React4.createElement(Text4, null, " "))))
3812
3813
  ));
3813
3814
  }
3814
3815
  if (text.includes("```")) {
@@ -4022,21 +4023,23 @@ var init_ChatLayout = __esm({
4022
4023
  return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", paddingX: 1, width: "100%" }, /* @__PURE__ */ React4.createElement(TableRenderer, { buffer: text.split("\n"), terminalWidth: columns }));
4023
4024
  }
4024
4025
  if (type === "diff-line") {
4025
- return /* @__PURE__ */ React4.createElement(
4026
+ const { isFirstLine, isLastLine } = block;
4027
+ const renderPaddingLine = (isEnd = false) => /* @__PURE__ */ React4.createElement(Box3, { backgroundColor: "#1a1a1a", paddingX: 1, width: columns, marginBottom: isEnd ? 1 : 0 }, /* @__PURE__ */ React4.createElement(Box3, { width: 3, flexShrink: 0 }), /* @__PURE__ */ React4.createElement(Box3, { width: 1, flexShrink: 0, marginLeft: 1 }), /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, null, " ")));
4028
+ return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column" }, isFirstLine && renderPaddingLine(false), /* @__PURE__ */ React4.createElement(
4026
4029
  DiffLine,
4027
4030
  {
4028
4031
  line: text,
4029
4032
  columns,
4030
4033
  highlightInfo: block.highlightInfo
4031
4034
  }
4032
- );
4035
+ ), isLastLine && renderPaddingLine(true));
4033
4036
  }
4034
4037
  if (type === "write-header") {
4035
4038
  return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", paddingX: 1, width: columns }, /* @__PURE__ */ React4.createElement(MarkdownText, { text, columns }));
4036
4039
  }
4037
4040
  if (type === "write-line") {
4038
- const { gutterWidth, lineNum, isLastLine } = block;
4039
- return /* @__PURE__ */ React4.createElement(
4041
+ const { gutterWidth, lineNum, isFirstLine, isLastLine } = block;
4042
+ const renderPaddingLine = (isEnd = false) => /* @__PURE__ */ React4.createElement(
4040
4043
  Box3,
4041
4044
  {
4042
4045
  flexDirection: "row",
@@ -4050,11 +4053,29 @@ var init_ChatLayout = __esm({
4050
4053
  paddingLeft: 2,
4051
4054
  paddingRight: 0,
4052
4055
  backgroundColor: "#1a1a1a",
4053
- marginBottom: isLastLine ? 1 : 0
4056
+ marginBottom: isEnd ? 1 : 0
4057
+ },
4058
+ /* @__PURE__ */ React4.createElement(Box3, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, null, " ".repeat(gutterWidth + 2))),
4059
+ /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1 }, /* @__PURE__ */ React4.createElement(Text4, null, " "))
4060
+ );
4061
+ return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column" }, isFirstLine && renderPaddingLine(false), /* @__PURE__ */ React4.createElement(
4062
+ Box3,
4063
+ {
4064
+ flexDirection: "row",
4065
+ width: columns,
4066
+ borderStyle: "single",
4067
+ borderLeft: true,
4068
+ borderRight: false,
4069
+ borderTop: false,
4070
+ borderBottom: false,
4071
+ borderColor: "#444444",
4072
+ paddingLeft: 2,
4073
+ paddingRight: 0,
4074
+ backgroundColor: "#1a1a1a"
4054
4075
  },
4055
4076
  /* @__PURE__ */ React4.createElement(Box3, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React4.createElement(Text4, { color: "gray", dimColor: true }, String(lineNum).padStart(gutterWidth, " "), " ")),
4056
4077
  /* @__PURE__ */ React4.createElement(Box3, { flexGrow: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: "white" }, text))
4057
- );
4078
+ ), isLastLine && renderPaddingLine(true));
4058
4079
  }
4059
4080
  if (type === "write-footer") {
4060
4081
  return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", paddingX: 1, width: columns, marginTop: 1, marginBottom: 1 }, /* @__PURE__ */ React4.createElement(MarkdownText, { text, columns }));
@@ -10461,10 +10482,10 @@ ${boxBottom}`) };
10461
10482
  if (!isError) {
10462
10483
  let label2 = "";
10463
10484
  if (isImage) {
10464
- label2 = `\u2714 Viewed: ${filePath}`;
10485
+ label2 = `\u2714 Viewed: ${filePath}`;
10465
10486
  attachedBinaryPart = binPart;
10466
10487
  } else if (isPdf || isOfficeFile) {
10467
- label2 = `\u2714 Viewed: ${filePath}`;
10488
+ label2 = `\u2714 Viewed: ${filePath}`;
10468
10489
  attachedBinaryPart = binPart;
10469
10490
  } else {
10470
10491
  let totalLines = "...";
@@ -10473,7 +10494,7 @@ ${boxBottom}`) };
10473
10494
  totalLines = content.split("\n").length;
10474
10495
  } catch (e) {
10475
10496
  }
10476
- label2 = `\u2714 Auto-Read: ${filePath} \u2192 Lines ${finalStart} - ${Math.min(finalEnd, totalLines)} of ${totalLines}`;
10497
+ label2 = `\u2714 Auto-Read: ${filePath} \u2192 Lines ${finalStart} - ${Math.min(finalEnd, totalLines)} of ${totalLines}`;
10477
10498
  taggedContextBlocks.push(textResult);
10478
10499
  }
10479
10500
  if (label2) {
@@ -11237,10 +11258,10 @@ ${ideErr} [/ERROR]`;
11237
11258
  let label2 = "";
11238
11259
  if (normToolName === "web_search") {
11239
11260
  const { query, limit = 10 } = parseArgs(toolCall.args);
11240
- label2 = `\u2714 Searched: ${query}`;
11261
+ label2 = `\u2714 Searched: ${query}`;
11241
11262
  } else if (normToolName === "web_scrape") {
11242
11263
  const url = parseArgs(toolCall.args).url || "...";
11243
- label2 = `\u2714 Visited: ${url}`;
11264
+ label2 = `\u2714 Visited: ${url}`;
11244
11265
  } else if (normToolName === "view_file") {
11245
11266
  const { path: targetPath2, StartLine, EndLine, start_line, end_line, startLine, endLine } = parseArgs(toolCall.args);
11246
11267
  const rawStart = StartLine || start_line || startLine;
@@ -11264,30 +11285,30 @@ ${ideErr} [/ERROR]`;
11264
11285
  const isOfficeFile = pathLower.endsWith(".docx") || pathLower.endsWith(".doc") || pathLower.endsWith(".ppt") || pathLower.endsWith(".pptx") || pathLower.endsWith(".xls") || pathLower.endsWith(".xlsx");
11265
11286
  const isImage = /\.(png|jpg|jpeg|webp|gif|bmp)$/.test(pathLower);
11266
11287
  if (isPdf || isOfficeFile) {
11267
- label2 = `\u2714 Viewed: ${targetPath2}`;
11288
+ label2 = `\u2714 Viewed: ${targetPath2}`;
11268
11289
  } else if (isImage) {
11269
- label2 = `\u2714 Viewed: ${targetPath2}`;
11290
+ label2 = `\u2714 Viewed: ${targetPath2}`;
11270
11291
  } else {
11271
- label2 = `\u2714 Read: ${targetPath2} \u2192 Lines ${sLine} - ${actualEndLine} of ${totalLines}`;
11292
+ label2 = `\u2714 Read: ${targetPath2} \u2192 Lines ${sLine} - ${actualEndLine} of ${totalLines}`;
11272
11293
  }
11273
11294
  } else if (normToolName === "list_files" || normToolName === "read_folder") {
11274
11295
  const action = normToolName === "list_files" ? "List" : "Viewed";
11275
11296
  const path21 = parseArgs(toolCall.args).path;
11276
- label2 = `\u2714 ${action}: ${path21 === "." ? "./" : path21}`;
11297
+ label2 = `\u2714 ${action}: ${path21 === "." ? "./" : path21}`;
11277
11298
  } else if (normToolName === "write_file" || normToolName === "update_file") {
11278
11299
  const action = normToolName === "write_file" ? "Created" : "Edited";
11279
- label2 = `\u2714 ${action}: ${parseArgs(toolCall.args).path || "..."}`;
11300
+ label2 = `\u2714 ${action}: ${parseArgs(toolCall.args).path || "..."}`;
11280
11301
  } else if (normToolName === "write_pdf") {
11281
- label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}`;
11302
+ label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}`;
11282
11303
  } else if (normToolName === "write_docx") {
11283
- label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}`;
11304
+ label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}`;
11284
11305
  } else if (normToolName === "file_map") {
11285
- label2 = `\u2714 Get Map: ${parseArgs(toolCall.args).path || "..."}`;
11306
+ label2 = `\u2714 Get Map: ${parseArgs(toolCall.args).path || "..."}`;
11286
11307
  } else if (normToolName.toLowerCase() === "search_keyword" || normToolName.toLowerCase() === "todo") {
11287
11308
  label2 = "";
11288
11309
  } else if (normToolName.toLowerCase() === "generate_image") {
11289
11310
  const { path: argPath, outputPath, output } = parseArgs(toolCall.args);
11290
- label2 = `\u2714 Generated: ${argPath || outputPath || output || "generated_image.png"}`;
11311
+ label2 = `\u2714 Generated: ${argPath || outputPath || output || "generated_image.png"}`;
11291
11312
  } else if (normToolName.toLowerCase() === "exec_command" || normToolName.toLowerCase() === "ask") {
11292
11313
  label2 = "";
11293
11314
  } else {
@@ -11657,7 +11678,7 @@ ${boxBottom}`) };
11657
11678
  if (successes.length === 0) {
11658
11679
  const errorMsg = `[TOOL RESULT]: ERROR: Failed to apply patches to [${path19.basename(absPath)}].
11659
11680
  ${failures.map((f) => ` \u2022 ${f.error}`).join("\n")}`;
11660
- const errorLabel = `\u2714 Edited: ${path19.basename(absPath)}`.toUpperCase();
11681
+ const errorLabel = `\u2714 Edited: ${path19.basename(absPath)}`.toUpperCase();
11661
11682
  let terminalWidth = 115;
11662
11683
  if (process.stdout.isTTY) {
11663
11684
  terminalWidth = process.stdout.columns - 5 || 120;
@@ -11809,7 +11830,7 @@ ${snippet2}
11809
11830
  [SYSTEM] Check the content preview for verification [/SYSTEM]`;
11810
11831
  }
11811
11832
  const action = normToolName === "write_file" ? "Created" : "Edited";
11812
- const feedbackLabel = `\u2714 ${action}: ${filePath || "..."}`;
11833
+ const feedbackLabel = `\u2714 ${action}: ${filePath || "..."}`;
11813
11834
  let terminalWidth = 115;
11814
11835
  if (process.stdout.isTTY) {
11815
11836
  terminalWidth = process.stdout.columns - 5 || 120;
@@ -11842,7 +11863,7 @@ ${snippet2}
11842
11863
  }
11843
11864
  if (normToolName === "write_file" || normToolName === "update_file") {
11844
11865
  const action = normToolName === "write_file" ? "Write Cancelled" : "Edit Denied";
11845
- const deniedLabel = `\u2714 ${action}: ${parseArgs(toolCall.args).path || "..."}`.toUpperCase();
11866
+ const deniedLabel = `\u2714 ${action}: ${parseArgs(toolCall.args).path || "..."}`.toUpperCase();
11846
11867
  let terminalWidth = 115;
11847
11868
  if (process.stdout.isTTY) {
11848
11869
  terminalWidth = process.stdout.columns - 5 || 120;
@@ -11938,7 +11959,7 @@ ${boxBottom}`}`) };
11938
11959
  matchCount = parseInt(m[1]);
11939
11960
  }
11940
11961
  }
11941
- const postLabel = `\u2714 Searched: "${keyword}" in ${file ? `"${file}"` : "./"} \u2192 ${matchCount} Match${matchCount === 1 ? "" : "es"}`;
11962
+ const postLabel = `\u2714 Searched: "${keyword}" in ${file ? `"${file}"` : "./"} \u2192 ${matchCount} Match${matchCount === 1 ? "" : "es"}`;
11942
11963
  let terminalWidth = 115;
11943
11964
  if (process.stdout.isTTY) {
11944
11965
  terminalWidth = process.stdout.columns - 5 || 120;
@@ -13508,7 +13529,7 @@ function App({ args = [] }) {
13508
13529
  if (manual) {
13509
13530
  setMessages((prev) => {
13510
13531
  setCompletedIndex(prev.length + 1);
13511
- return [...prev, { id: "check-" + Date.now(), role: "system", text: "\u{1F50D} Checking for updates...", isMeta: true }];
13532
+ return [...prev, { id: "check-" + Date.now(), role: "system", text: "[SYSTEM] Checking for updates...", isMeta: true }];
13512
13533
  });
13513
13534
  }
13514
13535
  try {
package/package.json CHANGED
@@ -1,67 +1,67 @@
1
- {
2
- "name": "fluxflow-cli",
3
- "version": "2.13.0",
4
- "date": "2026-06-26",
5
- "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
6
- "keywords": [
7
- "ai",
8
- "agent",
9
- "terminal",
10
- "cli",
11
- "gemini",
12
- "ink",
13
- "flux",
14
- "fluxflow"
15
- ],
16
- "license": "MIT",
17
- "repository": {
18
- "type": "git",
19
- "url": "git+https://github.com/KushalRoyChowdhury/fluxflow-cli.git"
20
- },
21
- "engines": {
22
- "node": ">=20",
23
- "vscode": "^1.90.0"
24
- },
25
- "files": [
26
- "dist",
27
- "README.md",
28
- "package.json",
29
- "ARCHITECTURE.md",
30
- "TOOLS.md",
31
- "UI_FEATURES.md"
32
- ],
33
- "type": "module",
34
- "bin": {
35
- "fluxflow-cli": "dist/fluxflow.js",
36
- "fluxflow": "dist/fluxflow.js"
37
- },
38
- "scripts": {
39
- "start": "tsx ./src/cli.jsx",
40
- "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:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter"
41
- },
42
- "dependencies": {
43
- "@google/genai": "^1.52.0",
44
- "chalk": "^5.6.2",
45
- "fs-extra": "^11.3.4",
46
- "gradient-string": "^3.0.0",
47
- "html-to-docx": "^1.8.0",
48
- "ink": "^7.0.1",
49
- "ink-gradient": "^4.0.1",
50
- "ink-select-input": "^6.2.0",
51
- "ink-spinner": "^5.0.0",
52
- "ink-text-input": "^6.0.0",
53
- "nanoid": "^5.1.9",
54
- "node-pty": "^1.1.0",
55
- "pdf-lib": "^1.17.1",
56
- "puppeteer": "24.43.1",
57
- "react": "^19.2.5",
58
- "web-tree-sitter": "^0.25.10",
59
- "ws": "^8.21.0",
60
- "zod": "^4.3.6"
61
- },
62
- "devDependencies": {
63
- "@types/react": "^19.2.14",
64
- "esbuild": "^0.28.0",
65
- "tsx": "^4.21.0"
66
- }
67
- }
1
+ {
2
+ "name": "fluxflow-cli",
3
+ "version": "2.13.1",
4
+ "date": "2026-06-26",
5
+ "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
6
+ "keywords": [
7
+ "ai",
8
+ "agent",
9
+ "terminal",
10
+ "cli",
11
+ "gemini",
12
+ "ink",
13
+ "flux",
14
+ "fluxflow"
15
+ ],
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/KushalRoyChowdhury/fluxflow-cli.git"
20
+ },
21
+ "engines": {
22
+ "node": ">=20",
23
+ "vscode": "^1.90.0"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md",
28
+ "package.json",
29
+ "ARCHITECTURE.md",
30
+ "TOOLS.md",
31
+ "UI_FEATURES.md"
32
+ ],
33
+ "type": "module",
34
+ "bin": {
35
+ "fluxflow-cli": "dist/fluxflow.js",
36
+ "fluxflow": "dist/fluxflow.js"
37
+ },
38
+ "scripts": {
39
+ "start": "tsx ./src/cli.jsx",
40
+ "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:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter"
41
+ },
42
+ "dependencies": {
43
+ "@google/genai": "^1.52.0",
44
+ "chalk": "^5.6.2",
45
+ "fs-extra": "^11.3.4",
46
+ "gradient-string": "^3.0.0",
47
+ "html-to-docx": "^1.8.0",
48
+ "ink": "^7.0.1",
49
+ "ink-gradient": "^4.0.1",
50
+ "ink-select-input": "^6.2.0",
51
+ "ink-spinner": "^5.0.0",
52
+ "ink-text-input": "^6.0.0",
53
+ "nanoid": "^5.1.9",
54
+ "node-pty": "^1.1.0",
55
+ "pdf-lib": "^1.17.1",
56
+ "puppeteer": "24.43.1",
57
+ "react": "^19.2.5",
58
+ "web-tree-sitter": "^0.25.10",
59
+ "ws": "^8.21.0",
60
+ "zod": "^4.3.6"
61
+ },
62
+ "devDependencies": {
63
+ "@types/react": "^19.2.14",
64
+ "esbuild": "^0.28.0",
65
+ "tsx": "^4.21.0"
66
+ }
67
+ }