fluxflow-cli 1.3.4 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fluxflow.js +115 -37
- package/package.json +1 -1
package/dist/fluxflow.js
CHANGED
|
@@ -25,7 +25,7 @@ var init_TerminalBox = __esm({
|
|
|
25
25
|
// src/components/ChatLayout.jsx
|
|
26
26
|
import React2 from "react";
|
|
27
27
|
import { Box as Box2, Text as Text2 } from "ink";
|
|
28
|
-
var cleanSignals, formatThinkText, InlineMarkdown, TableRenderer, MarkdownText, DiffLine, DiffBlock, CodeRenderer, MessageItem, ChatLayout, ChatLayout_default;
|
|
28
|
+
var cleanSignals, formatThinkText, InlineMarkdown, wrapText, TableRenderer, MarkdownText, DiffLine, DiffBlock, CodeRenderer, MessageItem, ChatLayout, ChatLayout_default;
|
|
29
29
|
var init_ChatLayout = __esm({
|
|
30
30
|
"src/components/ChatLayout.jsx"() {
|
|
31
31
|
init_TerminalBox();
|
|
@@ -101,6 +101,29 @@ var init_ChatLayout = __esm({
|
|
|
101
101
|
return part;
|
|
102
102
|
}));
|
|
103
103
|
});
|
|
104
|
+
wrapText = (text, width) => {
|
|
105
|
+
if (!text) return "";
|
|
106
|
+
const sourceLines = text.split(/\r?\n/);
|
|
107
|
+
let finalLines = [];
|
|
108
|
+
sourceLines.forEach((sLine) => {
|
|
109
|
+
const words = sLine.split(" ");
|
|
110
|
+
let currentLine = "";
|
|
111
|
+
words.forEach((word) => {
|
|
112
|
+
if ((currentLine + word).length > width) {
|
|
113
|
+
if (currentLine) finalLines.push(currentLine.trim());
|
|
114
|
+
currentLine = word + " ";
|
|
115
|
+
while (currentLine.length > width) {
|
|
116
|
+
finalLines.push(currentLine.substring(0, width));
|
|
117
|
+
currentLine = currentLine.substring(width) + " ";
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
currentLine += word + " ";
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
if (currentLine) finalLines.push(currentLine.trim());
|
|
124
|
+
});
|
|
125
|
+
return finalLines.join("\n");
|
|
126
|
+
};
|
|
104
127
|
TableRenderer = React2.memo(({ buffer, terminalWidth = 80 }) => {
|
|
105
128
|
if (buffer.length < 2) return null;
|
|
106
129
|
const rows = buffer.map(
|
|
@@ -109,7 +132,9 @@ var init_ChatLayout = __esm({
|
|
|
109
132
|
const header = rows[0];
|
|
110
133
|
const data = rows.slice(2);
|
|
111
134
|
const colPercentage = Math.floor(100 / header.length);
|
|
112
|
-
|
|
135
|
+
const availableWidth = terminalWidth - 8;
|
|
136
|
+
const colChars = Math.floor(availableWidth / header.length) - 2;
|
|
137
|
+
return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "#333", paddingX: 1, marginY: 1, width: "100%", flexGrow: 1 }, /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "row", borderStyle: "single", borderBottom: true, borderTop: false, borderLeft: false, borderRight: false, borderColor: "#444", marginBottom: 1, paddingBottom: 0, width: "100%" }, header.map((cell, i) => /* @__PURE__ */ React2.createElement(Box2, { key: i, flexBasis: `${colPercentage}%`, flexGrow: 1, flexShrink: 0, paddingRight: 2 }, /* @__PURE__ */ React2.createElement(InlineMarkdown, { text: wrapText(cell, colChars), color: "cyan" })))), data.map((row, ri) => /* @__PURE__ */ React2.createElement(Box2, { key: ri, flexDirection: "row", marginBottom: ri === data.length - 1 ? 0 : 1, width: "100%" }, row.map((cell, ci) => /* @__PURE__ */ React2.createElement(Box2, { key: ci, flexBasis: `${colPercentage}%`, flexGrow: 1, flexShrink: 0, paddingRight: 2, flexDirection: "column" }, /* @__PURE__ */ React2.createElement(InlineMarkdown, { text: wrapText(cell, colChars), color: "white" }))))));
|
|
113
138
|
});
|
|
114
139
|
MarkdownText = React2.memo(({ text, color = "white", columns = 80 }) => {
|
|
115
140
|
if (!text) return null;
|
|
@@ -160,9 +185,17 @@ var init_ChatLayout = __esm({
|
|
|
160
185
|
}
|
|
161
186
|
const isUnordered = trimmed.startsWith("* ") || trimmed.startsWith("- ");
|
|
162
187
|
const isOrdered = /^\d+\.\s/.test(trimmed);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
188
|
+
const isAsciiArt = line.includes("\u2588") || line.includes("\u2554") || line.includes("\u255A") || line.includes("\u2550");
|
|
189
|
+
let content = "";
|
|
190
|
+
if (isAsciiArt) {
|
|
191
|
+
content = line;
|
|
192
|
+
} else if (isUnordered || isOrdered) {
|
|
193
|
+
const bullet = isUnordered ? " \u2022 " : trimmed.match(/^\d+\.\s/)[0];
|
|
194
|
+
const indent = " ".repeat(bullet.length);
|
|
195
|
+
const wrappedPart = wrapText(trimmed.replace(/^[\*\-\d+\.]+\s/, ""), columns - (bullet.length + 6));
|
|
196
|
+
content = bullet + wrappedPart.split("\n").join("\n" + indent);
|
|
197
|
+
} else {
|
|
198
|
+
content = wrapText(trimmed, columns - 4);
|
|
166
199
|
}
|
|
167
200
|
result.push(
|
|
168
201
|
/* @__PURE__ */ React2.createElement(Box2, { key: i, width: "100%" }, /* @__PURE__ */ React2.createElement(InlineMarkdown, { text: content, color }))
|
|
@@ -270,7 +303,10 @@ var init_ChatLayout = __esm({
|
|
|
270
303
|
width: "100%",
|
|
271
304
|
flexDirection: "column"
|
|
272
305
|
},
|
|
273
|
-
|
|
306
|
+
wrapText(
|
|
307
|
+
finalContent.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\\\n/g, "\n").replace(/\\$/, ""),
|
|
308
|
+
columns - 6
|
|
309
|
+
).split("\n").map((line, lineIdx) => /* @__PURE__ */ React2.createElement(Box2, { key: lineIdx, flexDirection: "row", width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { flexShrink: 0, width: 2 }, /* @__PURE__ */ React2.createElement(Text2, { bold: true, color: "white" }, lineIdx === 0 ? "\u276F" : " ")), /* @__PURE__ */ React2.createElement(Box2, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React2.createElement(Text2, { color: msg.color || "white", wrap: "anywhere" }, line))))
|
|
274
310
|
) : msg.role === "think" ? /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", marginTop: 1, paddingX: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(Text2, { bold: true, color: "white" }, "Thinking..."), /* @__PURE__ */ React2.createElement(Box2, { borderStyle: "single", borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, paddingLeft: 2, flexDirection: "column", width: "100%" }, formatThinkText(finalContent))) : /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", paddingX: 1, marginTop: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(CodeRenderer, { text: finalContent, columns }), msg.memoryUpdated && /* @__PURE__ */ React2.createElement(Box2, { marginTop: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(Text2, { color: "yellow", italic: true }, "\u2728 [Memory Updated]"))));
|
|
275
311
|
});
|
|
276
312
|
ChatLayout = React2.memo(({ messages, showFullThinking, columns = 80 }) => {
|
|
@@ -661,10 +697,9 @@ Every ${isMemoryEnabled ? "Prompt, Responses & Memories" : "Prompt & Responses"}
|
|
|
661
697
|
-- END TEMPORAL AWARENESS --
|
|
662
698
|
|
|
663
699
|
-- START FORMATTING RULES --
|
|
664
|
-
- Use markdown.
|
|
665
700
|
- Structure responses VISUALLY pleasing, easy to read, and beautiful.
|
|
666
701
|
- USE GFM Markdown HEAVILY.
|
|
667
|
-
-
|
|
702
|
+
- Use GFM tables for structured data to keep the terminal view organized. CRITICAL POLICY: KEEP SENTENCES IN TABLE **SHORT & CONCISE**. AND MAX 3 COLUMNS.
|
|
668
703
|
- **CRITICAL**: NEVER USE LaTeX IN TERMINAL RESPONSES (exception: file content).
|
|
669
704
|
- Use emojis & Kaomojis.
|
|
670
705
|
-- END FORMATTING RULES --
|
|
@@ -1633,7 +1668,7 @@ USER_PROMPT: ${agentText}`.trim();
|
|
|
1633
1668
|
let fullAgentResponseChunks = [];
|
|
1634
1669
|
modifiedHistory.forEach((msg) => {
|
|
1635
1670
|
if (msg.text) {
|
|
1636
|
-
msg.text = msg.text.replace(/<think>[\s\S]*?<\/think>/
|
|
1671
|
+
msg.text = msg.text.replace(/<(think|thought)>[\s\S]*?<\/(think|thought)>/gi, "").trim();
|
|
1637
1672
|
}
|
|
1638
1673
|
});
|
|
1639
1674
|
for (let loop = 0; loop < MAX_LOOPS; loop++) {
|
|
@@ -1681,10 +1716,10 @@ USER_PROMPT: ${agentText}`.trim();
|
|
|
1681
1716
|
model: targetModel,
|
|
1682
1717
|
contents,
|
|
1683
1718
|
config: {
|
|
1684
|
-
temperature: mode === "Flux" ?
|
|
1719
|
+
temperature: mode === "Flux" ? 0.95 : 1.2,
|
|
1685
1720
|
thinkingConfig: {
|
|
1686
1721
|
includeThoughts: false,
|
|
1687
|
-
thinkingLevel: ThinkingLevel.MINIMAL
|
|
1722
|
+
thinkingLevel: targetModel === "gemini-3.1-pro-preview" ? ThinkingLevel.MEDIUM : ThinkingLevel.MINIMAL
|
|
1688
1723
|
}
|
|
1689
1724
|
}
|
|
1690
1725
|
});
|
|
@@ -1917,6 +1952,7 @@ ${boxBottom}
|
|
|
1917
1952
|
model: janitorModel || "gemma-4-26b-a4b-it",
|
|
1918
1953
|
contents: janitorContents,
|
|
1919
1954
|
config: {
|
|
1955
|
+
temperature: 0.5,
|
|
1920
1956
|
thinkingConfig: {
|
|
1921
1957
|
includeThoughts: false,
|
|
1922
1958
|
thinkingLevel: ThinkingLevel.MINIMAL
|
|
@@ -2311,6 +2347,13 @@ Check what's new using \`/changelog\` command.`,
|
|
|
2311
2347
|
const [chatId, setChatId] = useState6(generateChatId());
|
|
2312
2348
|
const [activeCommand, setActiveCommand] = useState6(null);
|
|
2313
2349
|
const [execOutput, setExecOutput] = useState6("");
|
|
2350
|
+
const terminalEnv = useMemo(() => {
|
|
2351
|
+
const isIDE = process.env.TERM_PROGRAM === "vscode" || !!process.env.VSC_TERMINAL_URL || !!process.env.INTELLIJ_TERMINAL_COMMAND_BLOCKS;
|
|
2352
|
+
return {
|
|
2353
|
+
isIDE,
|
|
2354
|
+
shortcut: isIDE ? "Shift+Enter" : "Ctrl+Enter"
|
|
2355
|
+
};
|
|
2356
|
+
}, []);
|
|
2314
2357
|
const activeCommandRef = useRef(null);
|
|
2315
2358
|
const execOutputRef = useRef("");
|
|
2316
2359
|
useEffect4(() => {
|
|
@@ -2417,15 +2460,12 @@ Check what's new using \`/changelog\` command.`,
|
|
|
2417
2460
|
return;
|
|
2418
2461
|
}
|
|
2419
2462
|
}
|
|
2420
|
-
if (key.tab &&
|
|
2421
|
-
const nextCmd = suggestions[selectedIndex] || suggestions[0];
|
|
2422
|
-
setInput(nextCmd + " ");
|
|
2423
|
-
setSelectedIndex(0);
|
|
2463
|
+
if (key.tab && activeView === "chat") {
|
|
2424
2464
|
}
|
|
2425
2465
|
if (key.ctrl && inputText === "c" && activeView !== "exit") {
|
|
2426
2466
|
setActiveView("exit");
|
|
2427
2467
|
}
|
|
2428
|
-
if (key.return && (key.ctrl || key.meta)) {
|
|
2468
|
+
if (key.return && (key.shift || key.ctrl || key.meta || key.leftAlt || key.rightAlt)) {
|
|
2429
2469
|
setInput((prev) => prev.replace(/\\\r?$/, "").replace(/\r?$/, "") + "\n");
|
|
2430
2470
|
}
|
|
2431
2471
|
});
|
|
@@ -2494,9 +2534,24 @@ Check what's new using \`/changelog\` command.`,
|
|
|
2494
2534
|
{ cmd: "/resume", desc: "Load previous session" },
|
|
2495
2535
|
{ cmd: "/save", desc: "Force save current chat" },
|
|
2496
2536
|
{ cmd: "/chats", desc: "List all chat sessions" },
|
|
2497
|
-
{ cmd: "/mode", desc: "Toggle Flux/Flow modes"
|
|
2498
|
-
|
|
2499
|
-
|
|
2537
|
+
{ cmd: "/mode", desc: "Toggle Flux/Flow modes", subs: [
|
|
2538
|
+
{ cmd: "flux", desc: "Enable Dev toolset" },
|
|
2539
|
+
{ cmd: "flow", desc: "Enable Chat mode" }
|
|
2540
|
+
] },
|
|
2541
|
+
{ cmd: "/thinking", desc: "Set AI reasoning depth", subs: [
|
|
2542
|
+
{ cmd: "low", desc: "Fastest reasoning" },
|
|
2543
|
+
{ cmd: "medium", desc: "Balanced depth" },
|
|
2544
|
+
{ cmd: "high", desc: "Complex coding" },
|
|
2545
|
+
{ cmd: "max", desc: "Architectural depth" },
|
|
2546
|
+
{ cmd: "show", desc: "Show full thoughts" },
|
|
2547
|
+
{ cmd: "hide", desc: "Show concise thoughts" }
|
|
2548
|
+
] },
|
|
2549
|
+
{ cmd: "/model", desc: "Switch AI model", subs: [
|
|
2550
|
+
{ cmd: "gemma-4-31b-it", desc: "Standard Default (Free, Recommended)" },
|
|
2551
|
+
{ cmd: "gemini-3.1-pro-preview", desc: "Most Capable (Paid)" },
|
|
2552
|
+
{ cmd: "gemini-3-flash-preview", desc: "Fast & Lightweight (Paid, Free limited quota)" },
|
|
2553
|
+
{ cmd: "gemini-3.1-flash-lite-preview", desc: "Ultra Fast (Paid, Free limited quota)" }
|
|
2554
|
+
] },
|
|
2500
2555
|
{ cmd: "/settings", desc: "Configure system prefs" },
|
|
2501
2556
|
{ cmd: "/key", desc: "Manage API keys" },
|
|
2502
2557
|
{ cmd: "/profile", desc: "Edit developer persona" },
|
|
@@ -2505,12 +2560,20 @@ Check what's new using \`/changelog\` command.`,
|
|
|
2505
2560
|
{ cmd: "/reset", desc: "Wipe all project data" },
|
|
2506
2561
|
{ cmd: "/about", desc: "Project info & credits" },
|
|
2507
2562
|
{ cmd: "/changelog", desc: "View latest updates" },
|
|
2508
|
-
{ cmd: "/update", desc: "Check/Install updates"
|
|
2563
|
+
{ cmd: "/update", desc: "Check/Install updates", subs: [
|
|
2564
|
+
{ cmd: "check", desc: "Check for new version" },
|
|
2565
|
+
{ cmd: "force", desc: "Force reinstall latest" }
|
|
2566
|
+
] }
|
|
2509
2567
|
];
|
|
2510
2568
|
const handleSubmit = (value) => {
|
|
2511
2569
|
if (suggestions.length > 0) {
|
|
2512
2570
|
const nextMatch = suggestions[selectedIndex] || suggestions[0];
|
|
2513
|
-
|
|
2571
|
+
const parts = value.split(" ");
|
|
2572
|
+
if (parts.length === 1) {
|
|
2573
|
+
setInput(nextMatch.cmd + " ");
|
|
2574
|
+
} else {
|
|
2575
|
+
setInput(parts[0] + " " + nextMatch.cmd + " ");
|
|
2576
|
+
}
|
|
2514
2577
|
setSelectedIndex(0);
|
|
2515
2578
|
return;
|
|
2516
2579
|
}
|
|
@@ -2930,23 +2993,23 @@ Selection: ${val}`,
|
|
|
2930
2993
|
continue;
|
|
2931
2994
|
}
|
|
2932
2995
|
let chunkText = packet.content;
|
|
2933
|
-
if (chunkText.toLowerCase().includes("<think") && !inThinkMode) {
|
|
2996
|
+
if ((chunkText.toLowerCase().includes("<think") || chunkText.toLowerCase().includes("<thought")) && !inThinkMode) {
|
|
2934
2997
|
inThinkMode = true;
|
|
2935
|
-
chunkText = chunkText.replace(/<think>/gi, "");
|
|
2998
|
+
chunkText = chunkText.replace(/<(think|thought)>/gi, "");
|
|
2936
2999
|
currentThinkId = "think-" + Date.now();
|
|
2937
3000
|
setMessages((prev) => [...prev, { id: currentThinkId, role: "think", text: "" }]);
|
|
2938
3001
|
}
|
|
2939
|
-
if (chunkText.toLowerCase().includes("</think>")) {
|
|
2940
|
-
const parts = chunkText.split(/<\/think>/gi);
|
|
3002
|
+
if (chunkText.toLowerCase().includes("</think>") || chunkText.toLowerCase().includes("</thought>")) {
|
|
3003
|
+
const parts = chunkText.split(/<\/(think|thought)>/gi);
|
|
2941
3004
|
const thinkPart = parts[0] || "";
|
|
2942
|
-
const agentPart = parts.slice(
|
|
3005
|
+
const agentPart = parts.slice(2).join("") || "";
|
|
2943
3006
|
setMessages((prev) => {
|
|
2944
3007
|
const newMsgs = prev.map(
|
|
2945
3008
|
(m) => m.id === currentThinkId ? { ...m, text: m.text + thinkPart } : m
|
|
2946
3009
|
);
|
|
2947
3010
|
inThinkMode = false;
|
|
2948
3011
|
currentAgentId = "agent-" + Date.now();
|
|
2949
|
-
return [...newMsgs, { id: currentAgentId, role: "agent", text: agentPart.replace(/<\/?think>/gi, "") }];
|
|
3012
|
+
return [...newMsgs, { id: currentAgentId, role: "agent", text: agentPart.replace(/<\/?(think|thought)>/gi, "") }];
|
|
2950
3013
|
});
|
|
2951
3014
|
continue;
|
|
2952
3015
|
}
|
|
@@ -2975,7 +3038,7 @@ Selection: ${val}`,
|
|
|
2975
3038
|
return newMsgs;
|
|
2976
3039
|
});
|
|
2977
3040
|
} else if (!inThinkMode) {
|
|
2978
|
-
const cleanedText = chunkText.replace(/<\/?think>/gi, "").replace(signalRegex, "");
|
|
3041
|
+
const cleanedText = chunkText.replace(/<\/?(think|thought)>/gi, "").replace(signalRegex, "");
|
|
2979
3042
|
if (!currentAgentId) {
|
|
2980
3043
|
currentAgentId = "agent-" + Date.now();
|
|
2981
3044
|
setMessages((prev) => [...prev, { id: currentAgentId, role: "agent", text: cleanedText }]);
|
|
@@ -3023,8 +3086,23 @@ Selection: ${val}`,
|
|
|
3023
3086
|
setIsExpanded(false);
|
|
3024
3087
|
};
|
|
3025
3088
|
const suggestions = useMemo(() => {
|
|
3026
|
-
if (!input.startsWith("/")
|
|
3027
|
-
|
|
3089
|
+
if (!input.startsWith("/")) return [];
|
|
3090
|
+
const parts = input.split(" ");
|
|
3091
|
+
const query = parts[parts.length - 1].toLowerCase();
|
|
3092
|
+
if (parts.length === 1) {
|
|
3093
|
+
const cleanQuery = query.startsWith("/") ? query.slice(1) : query;
|
|
3094
|
+
return COMMANDS.filter((c) => {
|
|
3095
|
+
const cleanCmd = c.cmd.startsWith("/") ? c.cmd.slice(1) : c.cmd;
|
|
3096
|
+
return cleanCmd.includes(cleanQuery);
|
|
3097
|
+
});
|
|
3098
|
+
}
|
|
3099
|
+
if (parts.length === 2) {
|
|
3100
|
+
const parent = COMMANDS.find((c) => c.cmd === parts[0].toLowerCase());
|
|
3101
|
+
if (parent && parent.subs) {
|
|
3102
|
+
return parent.subs.filter((s) => s.cmd.includes(query));
|
|
3103
|
+
}
|
|
3104
|
+
}
|
|
3105
|
+
return [];
|
|
3028
3106
|
}, [input]);
|
|
3029
3107
|
useEffect4(() => {
|
|
3030
3108
|
setSelectedIndex(0);
|
|
@@ -3078,7 +3156,7 @@ Selection: ${val}`,
|
|
|
3078
3156
|
CommandMenu,
|
|
3079
3157
|
{
|
|
3080
3158
|
title: "\u{1F916} Select AI Model",
|
|
3081
|
-
items: [{ label: "Gemma 4 31B (Recomended - Default, Use Free Tier Key)", value: "gemma-4-31b-it" }, { label: "Gemini 3.1 Pro (
|
|
3159
|
+
items: [{ label: "Gemma 4 31B (Recomended - Default, Use Free Tier Key)", value: "gemma-4-31b-it" }, { label: "Gemini 3.1 Pro (Best - Req. Paid Key)", value: "gemini-3.1-pro-preview" }, { label: "Gemini 3 Flash (Paid API Key Recomended)", value: "gemini-3-flash-preview" }, { label: "Gemini 3.1 Flash Lite (Fastest - For Quick Tasks ONLY, Limited Free Quota)", value: "gemini-3.1-flash-lite-preview" }, { label: "Cancel", value: "Cancel" }],
|
|
3082
3160
|
onSelect: (item) => {
|
|
3083
3161
|
if (item.value !== "Cancel") setActiveModel(item.value);
|
|
3084
3162
|
setActiveView("chat");
|
|
@@ -3093,7 +3171,6 @@ Selection: ${val}`,
|
|
|
3093
3171
|
items: [
|
|
3094
3172
|
{ label: `Toggle Memory [ ${systemSettings.memory ? "ON" : "OFF"} ]`, value: "memory" },
|
|
3095
3173
|
{ label: `Toggle Auto-Exec [ ${systemSettings.autoExec ? "ON" : "OFF"} ]`, value: "autoExec" },
|
|
3096
|
-
{ label: `Alternate Screen Buffer (Experimental) [ ${systemSettings.useAlternateBuffer ? "ON" : "OFF"} ]`, value: "altBuffer" },
|
|
3097
3174
|
{ label: `External Workspace Access [ ${systemSettings.allowExternalAccess ? "ON" : "OFF"} ]`, value: "externalAccess" },
|
|
3098
3175
|
{ label: `API Tier [ ${apiTier} ]`, value: "apiTier" },
|
|
3099
3176
|
{ label: `Auto-Update [ ${systemSettings.autoUpdate ? "ON" : "OFF"} ]`, value: "autoUpdate" },
|
|
@@ -3543,11 +3620,11 @@ Selection: ${val}`,
|
|
|
3543
3620
|
},
|
|
3544
3621
|
onSubmit: () => setIsExpanded(true),
|
|
3545
3622
|
keyBindings: {
|
|
3546
|
-
submit: (key) => key.return && !key.shift && !key.ctrl,
|
|
3547
|
-
newline: (key) => key.return && key.shift || key.return && key.ctrl
|
|
3623
|
+
submit: (key) => key.return && !key.shift && !key.ctrl && !key.leftAlt && !key.rightAlt,
|
|
3624
|
+
newline: (key) => key.return && key.shift || key.return && key.ctrl || key.return && key.leftAlt || key.return && key.rightAlt
|
|
3548
3625
|
}
|
|
3549
3626
|
}
|
|
3550
|
-
)))) : /* @__PURE__ */ React10.createElement(Box10, { flexDirection: "row", width: "100%", paddingY: 0 }, /* @__PURE__ */ React10.createElement(Box10, { flexShrink: 0, width: 3 }, /* @__PURE__ */ React10.createElement(Text10, { color: "yellow" }, "\u276F ")), /* @__PURE__ */ React10.createElement(Box10, { flexGrow: 1 }, /* @__PURE__ */ React10.createElement(Box10, { flexGrow: 1, position: "relative" }, input === "" && !isProcessing && /* @__PURE__ */ React10.createElement(Box10, { position: "absolute", paddingLeft: 0 }, /* @__PURE__ */ React10.createElement(Text10, { color: "gray"
|
|
3627
|
+
)))) : /* @__PURE__ */ React10.createElement(Box10, { flexDirection: "row", width: "100%", paddingY: 0 }, /* @__PURE__ */ React10.createElement(Box10, { flexShrink: 0, width: 3 }, /* @__PURE__ */ React10.createElement(Text10, { color: "yellow" }, "\u276F ")), /* @__PURE__ */ React10.createElement(Box10, { flexGrow: 1 }, /* @__PURE__ */ React10.createElement(Box10, { flexGrow: 1, position: "relative" }, input === "" && !isProcessing && /* @__PURE__ */ React10.createElement(Box10, { position: "absolute", paddingLeft: 0 }, /* @__PURE__ */ React10.createElement(Text10, { color: "gray" }, escPressed ? " Press ESC again to cancel the request." : ` Type /cmd or message... (${terminalEnv.shortcut} for newline)`)), /* @__PURE__ */ React10.createElement(
|
|
3551
3628
|
MultilineInput,
|
|
3552
3629
|
{
|
|
3553
3630
|
value: input,
|
|
@@ -3555,6 +3632,7 @@ Selection: ${val}`,
|
|
|
3555
3632
|
const cleanVal = val.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\\\s*\n/g, "\n");
|
|
3556
3633
|
setInput(cleanVal);
|
|
3557
3634
|
},
|
|
3635
|
+
placeholder: escPressed ? " Press ESC again to cancel the request." : ` Type /cmd or message... (${terminalEnv.shortcut} for newline)`,
|
|
3558
3636
|
onSubmit: handleSubmit,
|
|
3559
3637
|
maxRows: 3,
|
|
3560
3638
|
keyBindings: {
|
|
@@ -3611,7 +3689,7 @@ Selection: ${val}`,
|
|
|
3611
3689
|
visible.map((s, i) => {
|
|
3612
3690
|
const actualIdx = startIdx + i;
|
|
3613
3691
|
const isActive = actualIdx === selectedIndex;
|
|
3614
|
-
const cmdText = s.cmd.padEnd(
|
|
3692
|
+
const cmdText = s.cmd.padEnd(32);
|
|
3615
3693
|
return /* @__PURE__ */ React10.createElement(Box10, { key: s.cmd, flexDirection: "row" }, /* @__PURE__ */ React10.createElement(Text10, { color: isActive ? "cyan" : "gray" }, isActive ? "\u276F " : " "), /* @__PURE__ */ React10.createElement(Text10, { color: isActive ? "yellow" : "gray", bold: isActive }, cmdText), /* @__PURE__ */ React10.createElement(Text10, { color: "gray", dimColor: true, italic: true }, s.desc));
|
|
3616
3694
|
}),
|
|
3617
3695
|
suggestions.length > 5 && /* @__PURE__ */ React10.createElement(Box10, { height: 1 }, remaining > 0 && /* @__PURE__ */ React10.createElement(Text10, { color: "gray", dimColor: true }, " ... (", remaining, " more)"))
|
|
@@ -3640,7 +3718,7 @@ var init_app = __esm({
|
|
|
3640
3718
|
init_terminal();
|
|
3641
3719
|
SESSION_START_TIME = Date.now();
|
|
3642
3720
|
CHANGELOG_URL = "https://fluxflow-cli.onrender.com/changelog.html";
|
|
3643
|
-
versionFluxflow = "1.3.
|
|
3721
|
+
versionFluxflow = "1.3.5";
|
|
3644
3722
|
updatedOn = "2026-04-29";
|
|
3645
3723
|
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 (turn: finish) 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(
|
|
3646
3724
|
CommandMenu,
|