fluxflow-cli 1.8.32 → 1.8.34

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 +80 -29
  2. package/package.json +1 -1
package/dist/fluxflow.js CHANGED
@@ -173,7 +173,7 @@ var init_ChatLayout = __esm({
173
173
  }
174
174
  }
175
175
  }
176
- return result.replace(/^\[TOOL_RESULT\]:\s*/gi, "").split("\n").filter((line) => !line.trim().startsWith("SUCCESS:") && !line.trim().startsWith("ERROR:")).join("\n").replace(/\[\s*(turn\s*:)?\s*(continue|finish)\s*\]/gi, "").replace(/\[\s*(turn\s*:)?\s*(continue|finish)?\s*$/gi, "").replace(/\n\s*turn\s*:\s*(continue|finish)\s*$/gi, "").replace(/\n\nResponded on .*/g, "").replace(/\n\n\[Prompted on: .*\]/g, "").replace(/(\$?\\?\/?\\rightarrow\$?|\$\\rightarrow\$)/gi, "\u2192").replace(/(\$?\\?\/?\\leftarrow\$?|\$\\leftarrow\$)/gi, "\u2190").replace(/(\$?\\?\/?\\uparrow\$?|\$\\uparrow\$)/gi, "\u2191").replace(/(\$?\\?\/?\\downarrow\$?|\$\\downarrow\$)/gi, "\u2193").replace(/(\$?\\?\/?\\leftrightarrow\$?|\$\\leftrightarrow\$)/gi, "\u2194").replace(/\[\/n\]/g, "\\\\n").trim();
176
+ return result.replace(/^\[TOOL_RESULT\]:\s*/gi, "").split("\n").filter((line) => !line.trim().startsWith("SUCCESS:") && !line.trim().startsWith("ERROR:")).join("\n").replace(/\[\s*(turn\s*:)?\s*(continue|finish)\s*\]/gi, "").replace(/\[\s*(turn\s*:)?\s*(continue|finish)?\s*$/gi, "").replace(/\n\s*turn\s*:\s*(continue|finish)\s*$/gi, "").replace(/\n\nResponded on .*/g, "").replace(/\n\n\[Prompted on: .*\]/g, "").replace(/(\$?\\?\/?\\rightarrow\$?|\$\\rightarrow\$)/gi, "\u2192").replace(/(\$?\\?\/?\\leftarrow\$?|\$\\leftarrow\$)/gi, "\u2190").replace(/(\$?\\?\/?\\uparrow\$?|\$\\uparrow\$)/gi, "\u2191").replace(/(\$?\\?\/?\\downarrow\$?|\$\\downarrow\$)/gi, "\u2193").replace(/(\$?\\?\/?\\leftrightarrow\$?|\$\\leftrightarrow\$)/gi, "\u2194").replace(/\[\/n\]?/g, "\\\\n").trim();
177
177
  };
178
178
  formatThinkText = (cleaned, columns = 80) => {
179
179
  if (!cleaned) return null;
@@ -776,11 +776,9 @@ Second Line with literal [/n] sequence")]. Creates/Overwrites. DO NOT USE CODE B
776
776
  *Prefer file write/update tools over writing code in chat*.
777
777
 
778
778
  *** [\u{1F6A8} CRITICAL POLICY: NEWLINE CONTROL \u{1F6A8}] ***
779
- 1. FOR ACTUAL CODE STRUCTURE (Line Breaks): Use standard LF (Press ENTER inside the tool argument).
780
- 2. TO WRITE THE LITERAL CHARACTERS '\\' AND 'n' (e.g., inside printf("Hello\\n")): You MUST use the sequence [/n].
781
- 3. \u{1F6D1} NEVER USE "\\\\n" (backslash-n) inside tool arguments for literal strings; the system parser will convert it into a real structural line break, which WILL BREAK your code syntax (e.g. in C, Python).
782
- 4. ALWAYS check the tool result diff to ensure your [/n] was correctly translated to a literal
783
- .
779
+ 1. PHYSICAL NEWLINES: Press ENTER inside tool arguments for real line breaks in the file structure.
780
+ 2. LITERAL \\n: To write the literal characters '\\' and 'n' (e.g., inside printf("Hello\\n")), you MUST use the sequence [/n].
781
+ 3. ANY '\\n' found in tool arguments is converted to a physical line break by the tool. Use this for code structure, but use [/n] for literal text.
784
782
  ***
785
783
 
786
784
  *** [\u{1F6A8} CRITICAL QUOTE ESCAPE POLICY \u{1F6A8}] ***
@@ -932,16 +930,15 @@ ${userMemories.split("\n").map((line) => ` ${line}`).join("\n")}
932
930
  -- END TEMPORAL AWARENESS --
933
931
 
934
932
  -- START FORMATTING RULES --
935
- ${mode === "Flux" ? `- CRITICAL NEWLINE PROTOCOL: When writing or updating files, you MUST use actual line breaks (LF) for structural newlines. If you need to write the literal characters '\\' and 'n' (e.g., in printf("Hello\\n")), you MUST use the sequence '[/n]'.
936
- [CORRECT]:
933
+ ${mode === "Flux" ? `- CRITICAL NEWLINE PROTOCOL:
934
+ 1. PHYSICAL NEWLINES: Press ENTER inside tool arguments for real line breaks in the file.
935
+ 2. LITERAL \\n: To write the literal characters '\\' and 'n' (e.g., in printf("Hello\\n")), you MUST use the sequence '[/n]'.
936
+ [EXAMPLES]:
937
937
  tool:functions.write_file(path="test.c", content="#include <stdio.h>
938
938
  int main() {
939
939
  printf("Hello[/n]World");
940
940
  return 0;
941
941
  }")
942
- [INCORRECT]:
943
- tool:functions.write_file(path="test.c", content="#include <stdio.h>\\nint main() {\\nprintf("Hello\\\\n");\\n}")
944
- \u{1F6D1} NEVER use '\\\\n' for literals; it will be converted to a real line break and break code syntax.
945
942
 
946
943
  - CRITICAL QUOTE ESCAPE POLICY: Inside tool call arguments (like 'content' in write_file AND update_file), you MUST escape all double quotes using '\\"' to prevent argument truncation or parsing errors.
947
944
  [CORRECT]:
@@ -1805,7 +1802,7 @@ ${lines.map((l, i) => `${i + 1} | ${l}`).join("\n")}
1805
1802
  fs10.mkdirSync(parentDir, { recursive: true });
1806
1803
  }
1807
1804
  const strip = (t) => t.replace(/^```[\w]*\n?/, "").replace(/```\s*$/, "").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
1808
- const processedContent = strip(content).replace(/\\n/g, "\n").replace(/\[\/n\]/g, "\\n");
1805
+ const processedContent = strip(content).replace(/\\n/g, "\n").replace(/\[\/n\]?/g, "\\n");
1809
1806
  const lineCount = processedContent.split(/\r?\n/).length;
1810
1807
  const originalSize = Buffer.byteLength(processedContent, "utf8");
1811
1808
  fs10.writeFileSync(absolutePath, processedContent, "utf8");
@@ -1858,7 +1855,7 @@ var init_update_file = __esm({
1858
1855
  if (content_to_add === void 0) return 'ERROR: Missing "content_to_add" argument.';
1859
1856
  const strip = (t) => t.replace(/^```[\w]*\n?/, "").replace(/```\s*$/, "").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
1860
1857
  const unescapeContent = (content) => {
1861
- return content.replace(/\\n/g, "\n").replace(/\[\/n\]/g, "\\n");
1858
+ return content.replace(/\\n/g, "\n").replace(/\[\/n\]?/g, "\\n");
1862
1859
  };
1863
1860
  content_to_replace = unescapeContent(strip(content_to_replace));
1864
1861
  content_to_add = unescapeContent(strip(content_to_add));
@@ -2529,7 +2526,7 @@ var init_terminal = __esm({
2529
2526
  import { GoogleGenAI, ThinkingLevel, HarmBlockThreshold, HarmCategory } from "@google/genai";
2530
2527
  import path16 from "path";
2531
2528
  import fs16 from "fs";
2532
- var client, TERMINATION_SIGNAL, signalTermination, runJanitorTask, getActiveToolContext, getContextSafeText, contextSafeReplace, getSanitizedText, detectToolCalls, initAI, getAIStream;
2529
+ var client, TERMINATION_SIGNAL, signalTermination, TOOL_LABELS, getToolDetail, runJanitorTask, getActiveToolContext, getContextSafeText, contextSafeReplace, getSanitizedText, detectToolCalls, initAI, getAIStream;
2533
2530
  var init_ai = __esm({
2534
2531
  "src/utils/ai.js"() {
2535
2532
  init_prompts();
@@ -2545,6 +2542,27 @@ var init_ai = __esm({
2545
2542
  signalTermination = () => {
2546
2543
  TERMINATION_SIGNAL = true;
2547
2544
  };
2545
+ TOOL_LABELS = {
2546
+ "write_file": "Writing File",
2547
+ "update_file": "Updating File",
2548
+ "read_folder": "Listing Directory",
2549
+ "view_file": "Reading File",
2550
+ "exec_command": "Running Command",
2551
+ "web_search": "Searching Web",
2552
+ "web_scrape": "Reading Site",
2553
+ "memory": "Updating Memory",
2554
+ "search_keyword": "Finding Files",
2555
+ "ask": "Asking User"
2556
+ };
2557
+ getToolDetail = (toolName, argsStr) => {
2558
+ try {
2559
+ const pArgs = parseArgs(argsStr);
2560
+ const filePath = pArgs.path || pArgs.targetFile || pArgs.TargetFile || pArgs.directory;
2561
+ return filePath ? path16.basename(filePath.replace(/[\\"]/g, "")) : null;
2562
+ } catch (e) {
2563
+ return null;
2564
+ }
2565
+ };
2548
2566
  runJanitorTask = async (settings, agentText, fullAgentTextRaw, history, callbacks = {}) => {
2549
2567
  const { onStatus, onMemoryUpdated, onBackgroundIncrement } = callbacks;
2550
2568
  const { profile, thinkingLevel, mode, janitorModel, chatId, systemSettings, sessionStats } = settings;
@@ -2706,7 +2724,7 @@ DEBUG [${date}]: ${finalSynthesis}
2706
2724
  else isEscaped = false;
2707
2725
  }
2708
2726
  if (!closed) {
2709
- return { inside: true, toolName: match[1], startIndex: match.index };
2727
+ return { inside: true, toolName: match[1], startIndex: match.index, args: text.substring(match.index + match[0].length) };
2710
2728
  }
2711
2729
  }
2712
2730
  return { inside: false };
@@ -2884,14 +2902,14 @@ DEBUG [${date}]: ${finalSynthesis}
2884
2902
  const agentText = originalText.replace(/\[TITLE-UPDATE\]/g, "").trim();
2885
2903
  let modifiedHistory = [...history.slice(0, -1)];
2886
2904
  if (systemSettings?.compression === 0 && (sessionStats?.tokens || 0) > 254e3) {
2887
- modifiedHistory = getTruncatedHistory(modifiedHistory, 4);
2905
+ modifiedHistory = getTruncatedHistory(modifiedHistory, 6);
2888
2906
  }
2889
2907
  const tempStorage = readEncryptedJson(TEMP_MEM_FILE, {});
2890
2908
  const otherMemories = Object.entries(tempStorage).filter(([id]) => id !== chatId).flatMap(([_, mems]) => mems).map((mem) => `- ${mem}`).join("\n");
2891
2909
  const persistentStorage = readEncryptedJson(MEMORIES_FILE, []);
2892
2910
  const mainUserMemories = persistentStorage.map((m) => `- ${m.memory}`).join("\n");
2893
2911
  const janitorUserMemories = persistentStorage.map((m) => `- [${m.id}]: ${m.memory}`).join("\n");
2894
- const firstUserMsg = `[SYSTEM] MUST FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGH PRIORITY FOR THIS PROMPT. DO NOT FORGET.
2912
+ const firstUserMsg = `[SYSTEM] **MUST FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGHEST PRIORITY**.
2895
2913
 
2896
2914
  USER_PROMPT: "${agentText}"`.trim();
2897
2915
  modifiedHistory.push({ role: "user", text: firstUserMsg });
@@ -2934,6 +2952,7 @@ USER_PROMPT: "${agentText}"`.trim();
2934
2952
  let inStreamRetryCount = 1;
2935
2953
  let turnText = "";
2936
2954
  let lastToolSniffed = null;
2955
+ let lastToolDetail = null;
2937
2956
  let lastToolEventTime = null;
2938
2957
  let toolResults = [];
2939
2958
  let toolCallPointer = 0;
@@ -2974,12 +2993,21 @@ USER_PROMPT: "${agentText}"`.trim();
2974
2993
  }
2975
2994
  const isContext32k = (sessionStats.tokens || 0) >= 32e3;
2976
2995
  const currentSystemInstruction = getSystemInstruction(profile, thinkingLevel, mode, systemSettings, otherMemories, mainUserMemories, isMemoryEnabled, isContext32k, MAX_LOOPS, loop + 1);
2996
+ const jitInstruction = `
2997
+
2998
+ [SYSTEM] **MUST FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGHEST PRIORITY**.`;
2999
+ const lastUserMsg = contents[contents.length - 1];
3000
+ let addedMarker = false;
3001
+ if (lastUserMsg && lastUserMsg.role === "user" && lastUserMsg.parts?.[0]?.text?.startsWith("[TOOL_RESULT]")) {
3002
+ lastUserMsg.parts[0].text += jitInstruction;
3003
+ addedMarker = true;
3004
+ }
2977
3005
  stream = await client.models.generateContentStream({
2978
3006
  model: targetModel || "gemma-4-31b-it",
2979
3007
  contents,
2980
3008
  config: {
2981
3009
  systemInstruction: currentSystemInstruction,
2982
- temperature: mode === "Flux" ? 1.05 : 1.4,
3010
+ temperature: mode === "Flux" ? 0.98 : 1.4,
2983
3011
  maxOutputTokens: 32768,
2984
3012
  mediaResolution: "MEDIA_RESOLUTION_MEDIUM",
2985
3013
  safetySettings: [
@@ -2991,6 +3019,9 @@ USER_PROMPT: "${agentText}"`.trim();
2991
3019
  thinkingConfig: { includeThoughts: false, thinkingLevel: targetModel.includes("pro") ? ThinkingLevel.HIGH : ThinkingLevel.MINIMAL }
2992
3020
  }
2993
3021
  });
3022
+ if (addedMarker && contents[contents.length - 1]?.parts?.[0]) {
3023
+ contents[contents.length - 1].parts[0].text = contents[contents.length - 1].parts[0].text.replace(jitInstruction, "").trim();
3024
+ }
2994
3025
  turnText = "";
2995
3026
  lastToolSniffed = null;
2996
3027
  lastToolEventTime = null;
@@ -3036,9 +3067,23 @@ USER_PROMPT: "${agentText}"`.trim();
3036
3067
  if (toolContext.inside) {
3037
3068
  if (!lastToolEventTime) lastToolEventTime = Date.now();
3038
3069
  const potentialTool = toolContext.toolName;
3039
- if (potentialTool && /^[a-z_]+$/.test(potentialTool) && potentialTool !== lastToolSniffed) {
3070
+ const partialArgs = toolContext.args || "";
3071
+ let detail = null;
3072
+ if (["write_file", "update_file", "view_file", "read_folder"].includes(potentialTool)) {
3073
+ const pArgs = parseArgs(partialArgs);
3074
+ const filePath = pArgs.path || pArgs.targetFile || pArgs.TargetFile || pArgs.directory;
3075
+ if (filePath) {
3076
+ detail = path16.basename(filePath.replace(/[\\"]/g, ""));
3077
+ } else {
3078
+ const m = partialArgs.match(/(?:path|targetFile|TargetFile|directory)\s*=\s*\\?["']?([^\\"' \),]+)/);
3079
+ if (m) detail = path16.basename(m[1].replace(/[\\"]/g, ""));
3080
+ }
3081
+ }
3082
+ const currentLabel = `${TOOL_LABELS[potentialTool] || potentialTool}${detail ? ` (${detail})` : ""}`;
3083
+ if (potentialTool !== lastToolSniffed || detail !== lastToolDetail) {
3040
3084
  lastToolSniffed = potentialTool;
3041
- yield { type: "status", content: `Working (${potentialTool})...` };
3085
+ lastToolDetail = detail;
3086
+ yield { type: "status", content: `${currentLabel}...` };
3042
3087
  }
3043
3088
  }
3044
3089
  const contextSafeText = getContextSafeText(turnText, false);
@@ -3098,7 +3143,9 @@ USER_PROMPT: "${agentText}"`.trim();
3098
3143
  const allToolsFound = detectToolCalls(toolActionableText);
3099
3144
  while (allToolsFound.length > toolCallPointer) {
3100
3145
  const toolCall = allToolsFound[toolCallPointer];
3101
- yield { type: "status", content: `Working (${toolCall.toolName})...` };
3146
+ const displayLabel = TOOL_LABELS[toolCall.toolName] || toolCall.toolName;
3147
+ const detail = getToolDetail(toolCall.toolName, toolCall.args);
3148
+ yield { type: "status", content: `${displayLabel}${detail ? ` (${detail})` : ""}...` };
3102
3149
  let label = "";
3103
3150
  if (toolCall.toolName === "web_search") {
3104
3151
  const { query, limit = 10 } = parseArgs(toolCall.args);
@@ -3197,7 +3244,9 @@ ${boxBottom}
3197
3244
  const absoluteCwd = path16.resolve(process.cwd());
3198
3245
  if (isExternalOff && !absoluteTarget.startsWith(absoluteCwd)) {
3199
3246
  const denyMsg = `Access Denied. You are not allowed to access files outside the current workspace. To enable this, ask the user to turn on "External Workspace Access" in /settings.`;
3200
- toolResults.push({ role: "user", text: `[TOOL_RESULT]: ERROR: ${denyMsg}` });
3247
+ toolResults.push({ role: "user", text: `[TOOL_RESULT]: ERROR: ${denyMsg}
3248
+
3249
+ [SYSTEM] **MUST FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGHEST PRIORITY**.` });
3201
3250
  yield { type: "tool_result", content: `[TOOL_RESULT]: ERROR: ${denyMsg}` };
3202
3251
  toolCallPointer++;
3203
3252
  continue;
@@ -3210,7 +3259,9 @@ ${boxBottom}
3210
3259
  if (approval === "deny") {
3211
3260
  if (toolCall.toolName === "exec_command" && settings.onExecEnd) settings.onExecEnd();
3212
3261
  const denyMsg = `Permission Denied: User rejected the ${toolCall.toolName === "exec_command" ? "terminal execution" : "file edit"}.`;
3213
- toolResults.push({ role: "user", text: `[TOOL_RESULT]: DENIED: ${denyMsg}` });
3262
+ toolResults.push({ role: "user", text: `[TOOL_RESULT]: DENIED: ${denyMsg}
3263
+
3264
+ [SYSTEM] **MUST FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGHEST PRIORITY**.` });
3214
3265
  yield { type: "tool_result", content: `[TOOL_RESULT]: DENIED: ${denyMsg}` };
3215
3266
  await incrementUsage("toolDenied");
3216
3267
  if (settings.onToolResult) settings.onToolResult("denied");
@@ -3305,7 +3356,7 @@ ${boxBottom}
3305
3356
  if (toolResults.length > 0) {
3306
3357
  toolResults.forEach((tr) => modifiedHistory.push(tr));
3307
3358
  }
3308
- modifiedHistory.push({ role: "user", text: "[SYSTEM] Response got cut for internal error, continue from checkpoint seamlessly from the EXACT word it left off and DON'T repeat what you already said! IF you were in a thinking block, complete the thinking and close the thinking with proper </think> then respond. PICK UP FROM TE WORD IN A WAY THAT USER SHOULD NOT NOTICE ANY CUTOFF." });
3359
+ modifiedHistory.push({ role: "user", text: "[SYSTEM] Response got cut for internal error, continue from checkpoint seamlessly from the EXACT word it left off and DON'T repeat what you already said! IF you were in a thinking block, complete the thinking and close the thinking with proper </think> then respond. PICK UP FROM TE WORD IN A WAY THAT USER SHOULD NOT NOTICE ANY CUTOFF. Rules:\n- Do not reuse <think> if the thinking already started just continue and end it properly.\n- If the cutoff was in middle of a tool call, start the tool call from start as the system won't pick half tool formats.\n- Visually the new pickup and continuation should look natual sentence flow." });
3309
3360
  accumulatedContext += turnText;
3310
3361
  for (let i = waitTime / 1e3; i > 0; i--) {
3311
3362
  yield { type: "status", content: `Error Occured. Recovering Stream (${inStreamRetryCount}/${MAX_RETRIES}) [${i}s]...` };
@@ -3378,7 +3429,7 @@ ${timestamp}`;
3378
3429
  if (toolResults.length > 0) {
3379
3430
  toolResults.forEach((tr) => modifiedHistory.push(tr));
3380
3431
  } else {
3381
- modifiedHistory.push({ role: "user", text: `[SYSTEM]: ${isStutteringLoop && !isThinkingLoop ? `STUTTERING DETECTED by Internal System. Re-calibrate your response & proceed.` : `${isThinkingLoop ? "OVER-THINKING " : ""}LOOP DETECTED by Internal System${isThinkingLoop && " for current EFFORT_LEVEL"}. ${isThinkingLoop ? "If you have planned the task, prioritize the execution/output. " : "If you have finished your task use [turn: finish] else continue."}`}` });
3432
+ modifiedHistory.push({ role: "user", text: `[SYSTEM] ${isStutteringLoop && !isThinkingLoop ? `STUTTERING DETECTED by Internal System. Re-calibrate your response & proceed.` : `${isThinkingLoop ? " OVER-THINKING" : " LOOP"} DETECTED by Internal System${isThinkingLoop && " for current EFFORT_LEVEL"}. ${isThinkingLoop ? "If you have planned the task, prioritize the execution/output. " : "If you have finished your task use [turn: finish] else continue."}`}` });
3382
3433
  isThinkingLoop = false;
3383
3434
  isStutteringLoop = false;
3384
3435
  }
@@ -5109,9 +5160,9 @@ Selection: ${val}`,
5109
5160
  const oldVal = args.TargetContent || args.content_to_replace || null;
5110
5161
  const newVal = args.content || args.ReplacementContent || args.content_to_add || args.replacementContent || null;
5111
5162
  if (oldVal && newVal) {
5112
- return /* @__PURE__ */ React10.createElement(Box10, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React10.createElement(Box10, null, /* @__PURE__ */ React10.createElement(Text10, { color: "red", wrap: "anywhere", bold: true }, "- ", oldVal)), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React10.createElement(Text10, { color: "green", wrap: "anywhere", bold: true }, "+ ", newVal.replace(/\[\/n\]/g, "\\n"))));
5163
+ return /* @__PURE__ */ React10.createElement(Box10, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React10.createElement(Box10, null, /* @__PURE__ */ React10.createElement(Text10, { color: "red", wrap: "anywhere", bold: true }, "- ", oldVal)), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React10.createElement(Text10, { color: "green", wrap: "anywhere", bold: true }, "+ ", newVal.replace(/\[\/n\]?/g, "\\n"))));
5113
5164
  }
5114
- return /* @__PURE__ */ React10.createElement(Text10, { color: "white", wrap: "anywhere" }, newVal.replace(/\[\/n\]/g, "\\n") || "Updating file content...");
5165
+ return /* @__PURE__ */ React10.createElement(Text10, { color: "white", wrap: "anywhere" }, newVal.replace(/\[\/n\]?/g, "\\n") || "Updating file content...");
5115
5166
  })()), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React10.createElement(
5116
5167
  CommandMenu,
5117
5168
  {
@@ -5341,8 +5392,8 @@ var init_app = __esm({
5341
5392
  init_text();
5342
5393
  SESSION_START_TIME = Date.now();
5343
5394
  CHANGELOG_URL = "https://fluxflow-cli.onrender.com/changelog.html";
5344
- versionFluxflow = "1.8.32";
5345
- updatedOn = "2026-05-12";
5395
+ versionFluxflow = "1.8.34";
5396
+ updatedOn = "2026-05-13";
5346
5397
  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 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(
5347
5398
  CommandMenu,
5348
5399
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "1.8.32",
3
+ "version": "1.8.34",
4
4
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
5
5
  "keywords": [
6
6
  "ai",