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.
Files changed (2) hide show
  1. package/dist/fluxflow.js +115 -37
  2. 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
- return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", borderStyle: "single", 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: 1, 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: cell, 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: cell, color: "white" }))))));
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
- let content = trimmed;
164
- if (isUnordered || isOrdered) {
165
- content = (isUnordered ? " \u2022 " : "") + trimmed.replace(/^[\*\-\d+\.]+\s/, "");
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
- finalContent.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\\\n/g, "\n").replace(/\\$/, "").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))))
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
- - **PRO TIP**: Use GFM tables for structured data to keep the terminal view organized. CRITICAL POLICY: KEEP SENTENCES IN TABLE **SHORT & CONCISE**.
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>/g, "").trim();
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" ? 1 : 1.4,
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 && suggestions.length > 0 && activeView === "chat") {
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
- { cmd: "/thinking", desc: "Set AI reasoning depth" },
2499
- { cmd: "/model", desc: "Switch AI brain model" },
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
- setInput(nextMatch.cmd + " ");
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(1).join("</think>") || "";
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("/") || input.includes(" ")) return [];
3027
- return COMMANDS.filter((c) => c.cmd.startsWith(input.toLowerCase()));
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 (Recomended - Req. paid API 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)", value: "gemini-3.1-flash-lite-preview" }, { label: "Cancel", value: "Cancel" }],
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", dimColor: true }, escPressed ? " Press ESC again to cancel the request." : " Type your message or /command...")), /* @__PURE__ */ React10.createElement(
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(12);
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.4";
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "1.3.4",
3
+ "version": "1.3.5",
4
4
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
5
5
  "keywords": [
6
6
  "ai",