fluxflow-cli 1.9.6 → 1.9.8

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 +46 -36
  2. package/package.json +1 -1
package/dist/fluxflow.js CHANGED
@@ -143,17 +143,17 @@ var init_ChatLayout = __esm({
143
143
  init_text();
144
144
  init_terminal();
145
145
  TOOL_LABELS = {
146
- "write_file": "Write File",
147
- "update_file": "Update File",
148
- "read_folder": "Read Folder",
149
- "view_file": "View File",
150
- "exec_command": "Execute Command",
151
- "web_search": "Web Search",
152
- "web_scrape": "Read Site",
153
- "search_keyword": "Find Files",
154
- "write_pdf": "Create PDF",
155
- "write_pptx": "Create Presentation",
156
- "write_docx": "Create Document"
146
+ "write_file": "WriteFile",
147
+ "update_file": "UpdateFile",
148
+ "read_folder": "ReadFolder",
149
+ "view_file": "ViewFile",
150
+ "exec_command": "ExecuteCommand",
151
+ "web_search": "WebSearch",
152
+ "web_scrape": "ReadSite",
153
+ "search_keyword": "FindFiles",
154
+ "write_pdf": "CreatePDF",
155
+ "write_pptx": "CreatePresentation",
156
+ "write_docx": "CreateDocument"
157
157
  };
158
158
  cleanSignals = (text) => {
159
159
  if (!text) return text;
@@ -367,18 +367,28 @@ var init_ChatLayout = __esm({
367
367
  return /* @__PURE__ */ React2.createElement(Box2, { backgroundColor: bgColor, paddingX: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { width: 5, flexShrink: 0 }, /* @__PURE__ */ React2.createElement(Text2, { color: isRemoval ? "#cf3a3a" : isAddition ? "#3acf65" : "gray", dimColor: true }, lineNum)), /* @__PURE__ */ React2.createElement(Box2, { width: 2, flexShrink: 0, marginLeft: 1 }, /* @__PURE__ */ React2.createElement(Text2, { color: textColor, bold: true }, isRemoval ? "-" : isAddition ? "+" : " ")), /* @__PURE__ */ React2.createElement(Box2, { flexGrow: 1, marginLeft: 1 }, /* @__PURE__ */ React2.createElement(Text2, { color: textColor }, wrapText(content, columns - 10))));
368
368
  });
369
369
  DiffBlock = React2.memo(({ text, columns = 80 }) => {
370
- const beforeDiff = text.substring(0, text.indexOf("[DIFF_START]")).trim();
371
- const afterDiff = text.substring(text.indexOf("[DIFF_END]") + 10).trim();
372
370
  const match = text.match(/\[DIFF_START\]([\s\S]*?)\[DIFF_END\]/);
373
371
  const diffBody = match ? match[1].trim() : "";
374
372
  const diffLines = diffBody.split("\n");
375
- return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", width: "100%" }, beforeDiff && /* @__PURE__ */ React2.createElement(MarkdownText, { text: beforeDiff, columns }), /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", marginTop: 1, backgroundColor: "#1a1a1a", paddingY: 0, width: "100%" }, diffLines.map((line, i) => /* @__PURE__ */ React2.createElement(DiffLine, { key: i, line, columns }))), afterDiff && /* @__PURE__ */ React2.createElement(MarkdownText, { text: afterDiff, columns }));
373
+ return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", backgroundColor: "#1a1a1a", paddingY: 0, width: "100%" }, diffLines.map((line, i) => /* @__PURE__ */ React2.createElement(DiffLine, { key: i, line, columns }))));
376
374
  });
377
375
  CodeRenderer = React2.memo(({ text, columns = 80 }) => {
378
376
  if (!text) return null;
379
377
  if (text.includes("[DIFF_START]")) {
380
378
  return /* @__PURE__ */ React2.createElement(DiffBlock, { text, columns });
381
379
  }
380
+ if (text.includes("- Content Preview:")) {
381
+ const mainParts = text.split("- Content Preview:");
382
+ const headerText = mainParts[0];
383
+ const contentPart = mainParts[1] || "";
384
+ const footerMarker = "Check if Starting and Ending matches";
385
+ const contentAndFooter = contentPart.split(footerMarker);
386
+ const content = contentAndFooter[0]?.trim() || "";
387
+ const footer = contentAndFooter[1] ? `${footerMarker}${contentAndFooter[1]}` : "";
388
+ const codeLines = content.split("\n");
389
+ const gutterWidth = String(codeLines.length).length;
390
+ return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "#444", paddingX: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { alignSelf: "flex-end", marginTop: -1, marginRight: 1 }, /* @__PURE__ */ React2.createElement(Text2, { backgroundColor: "#444", color: "white" }, " FILE SNAPSHOT ")), /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", paddingY: 1, width: "100%" }, codeLines.map((line, idx) => /* @__PURE__ */ React2.createElement(Box2, { key: idx, width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { width: gutterWidth + 2, flexShrink: 0 }, /* @__PURE__ */ React2.createElement(Text2, { color: "gray", dimColor: true }, String(idx + 1).padStart(gutterWidth, " "), " ")), /* @__PURE__ */ React2.createElement(Box2, { flexGrow: 1 }, /* @__PURE__ */ React2.createElement(Text2, { color: "white" }, line)))))));
391
+ }
382
392
  if (text.includes("```")) {
383
393
  const parts = text.split(/(```\w*\n?[\s\S]*?(?:```|$))/g);
384
394
  return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", width: "100%" }, parts.map((part, i) => {
@@ -396,7 +406,7 @@ var init_ChatLayout = __esm({
396
406
  return /* @__PURE__ */ React2.createElement(MarkdownText, { text, columns });
397
407
  });
398
408
  MessageItem = React2.memo(({ msg, showFullThinking, columns = 80 }) => {
399
- const isDiffResult = msg.role === "system" && msg.text?.includes("[DIFF_START]");
409
+ const isDiffResult = msg.role === "system" && (msg.text?.includes("[DIFF_START]") || msg.text?.includes("- Content Preview:"));
400
410
  const isPatchError = msg.role === "system" && msg.text?.includes("[TOOL_RESULT]: ERROR:") && (msg.toolName === "update_file" || msg.text?.includes("Could not find exact match"));
401
411
  const isTerminalRecord = msg.isTerminalRecord;
402
412
  const isHomeWarning = msg.isHomeWarning;
@@ -508,8 +518,8 @@ var init_ChatLayout = __esm({
508
518
  if (msg.role === "think" && !showFullThinking) {
509
519
  return "Thinking...";
510
520
  }
511
- return content;
512
- }, [content, msg.role, showFullThinking]);
521
+ return msg.isStreaming ? content : content.trimEnd();
522
+ }, [content, msg.role, showFullThinking, msg.isStreaming]);
513
523
  return /* @__PURE__ */ React2.createElement(Box2, { marginBottom: 1, flexDirection: "column", flexShrink: 0, width: "100%", flexGrow: 1 }, msg.role === "user" ? /* @__PURE__ */ React2.createElement(
514
524
  Box2,
515
525
  {
@@ -523,7 +533,7 @@ var init_ChatLayout = __esm({
523
533
  finalContent.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\\\n/g, "\n").replace(/\\$/, ""),
524
534
  columns - 6
525
535
  ).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))))
526
- ) : 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, columns))) : /* @__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]"))));
536
+ ) : msg.role === "think" ? /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", marginTop: 0, marginBottom: 0, 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, paddingTop: 1, paddingBottom: 1, flexDirection: "column", width: "100%" }, formatThinkText(finalContent, columns))) : /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", paddingX: 1, marginTop: isDiffResult ? 0 : 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]"))));
527
537
  });
528
538
  ChatLayout = React2.memo(({ messages, showFullThinking, columns = 80 }) => {
529
539
  return /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", width: "100%" }, messages.map((msg, idx) => /* @__PURE__ */ React2.createElement(
@@ -895,6 +905,7 @@ var init_main_tools = __esm({
895
905
  2. LITERAL \\n: To write the literal characters '\\' and 'n' (e.g., inside printf("Hello\\n")), you MUST use the sequence [/n].
896
906
  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.
897
907
  4. NEVER USE [/n] FOR STRUCTURAL LINE BREAKS (pressing ENTER).
908
+ 5. [/n] WILL ALWAYS WRITE \\n LITERALLY IN THE FILE. [/n] SHOULD ALWAYS BE USED **INSIDE** STRINGS ONLY.
898
909
  ***
899
910
 
900
911
  *** [\u{1F6A8} CRITICAL QUOTE ESCAPE POLICY \u{1F6A8}] ***
@@ -1020,6 +1031,7 @@ ${userMemories.split("\n").map((line) => ` ${line}`).join("\n")}
1020
1031
  CURRENT_WORKING_DIRECTORY: ${cwdStr}.${isSystemDir && mode === "Flux" ? " YOU ARE CURRENTLY IN PROTECTED SYSTEM DIRECTORY. ASK FOR EXPLICIT CONFIRMATION FROM USER BEFORE READING/MODIFYING **ANY** FILES/FOLDERS." : ""}
1021
1032
  OS: ${osDetected}.${osDetected === "Windows" && mode === "Flux" ? " Your terminal commands will run on CMD. 'Prefer using PS scripts via CMD' instead of raw CMD commands." : ""}
1022
1033
  If you see a [STEERING HINT] from user, give that prompt priority for the task at hand, user can use it to help you guide if you go wrong way.
1034
+ TREAT '[SYSTEM]' MESSAGES AS HIGH PRIORITY.
1023
1035
 
1024
1036
  -- START THINKING INSTRUCTIONS --
1025
1037
  ${thinkingConfig}
@@ -1063,7 +1075,8 @@ ${userMemories.split("\n").map((line) => ` ${line}`).join("\n")}
1063
1075
  ${mode === "Flux" ? `- CRITICAL NEWLINE PROTOCOL:
1064
1076
  1. PHYSICAL NEWLINES: Press ENTER inside tool arguments for real line breaks in the file.
1065
1077
  2. LITERAL \\n: To write the literal characters '\\' and 'n' (e.g., in printf("Hello\\n")), you MUST use the sequence '[/n]'.
1066
- 3. NEVER USE [/n] FOR STRUCTURAL LINE BREAKS (pressing ENTER).
1078
+ 3. NEVER USE [/n] FOR STRUCTURAL LINE BREAKS (pressing ENTER). [/n] WILL ALWAYS WRITE \\n LITERALLY IN THE FILE. BREAKING FILE STRUCTURE
1079
+ 4. [/n] SHOULD ALWAYS BE USED **INSIDE** STRINGS ONLY.
1067
1080
  [EXAMPLES]:
1068
1081
  tool:functions.write_file(path="test.c", content="#include <stdio.h>
1069
1082
  int main() {
@@ -1081,7 +1094,7 @@ ${userMemories.split("\n").map((line) => ` ${line}`).join("\n")}
1081
1094
  - NEVER USE LaTeX IN RESPONSES.
1082
1095
  - Keep Poems & Literature in Code Block.
1083
1096
  - Use emojis & Kaomojis. Prefer Kaomojis more.
1084
- - Keep your in-chat responses shorter and concise.
1097
+ - Keep your in-chat responses shorter and concise. While coding, project structure should be well-planned and organized. **DON'T BE LAZY**.
1085
1098
  -- END FORMATTING RULES --
1086
1099
 
1087
1100
  -- START REPONSE FINISH PROTOCOL --
@@ -1091,9 +1104,9 @@ ${userMemories.split("\n").map((line) => ` ${line}`).join("\n")}
1091
1104
  -- END REPONSE FINISH PROTOCOL --
1092
1105
 
1093
1106
  [SYSTEM METADATA (PRIORITY: DYNAMIC)] Current date and Time is: ${dateTimeStr}
1094
- [SYSTEM METADATA (PRIORITY: LOWEST)] v1.9.6. (IF user ask you to update yourself. Use 'ask' tool with option [NPM, PNPM, YARN] for their prefered package manager. NPM command is 'npm update -g fluxflow-cli@latest'. Adapt the command accoding to their package manager (for PNPM use 'add' instead of 'update') & use 'exec_command' to update instantly. After success tell user to restart.) <- IF USER DONT EXPLICITLY ASK FOR UPDATE DONT PROACTIVELY MENTION OR ASK.
1107
+ [SYSTEM METADATA (PRIORITY: LOWEST)] v1.9.8. (IF user ask you to update yourself. Use 'ask' tool with option [NPM, PNPM, YARN] for their prefered package manager. NPM command is 'npm update -g fluxflow-cli@latest'. Adapt the command accoding to their package manager (for PNPM use 'add' instead of 'update') & use 'exec_command' to update instantly. After success tell user to restart.) <- IF USER DONT EXPLICITLY ASK FOR UPDATE DONT PROACTIVELY MENTION OR ASK.
1095
1108
  [SYSTEM METADATA (PRIORITY: MODERATE)] Runtime Monitor: Turn Progress: ${currentLoop}/${maxLoops} steps. Aim to finalize the task before the window closes. If the limit is reached, you MUST summarize and invite the user to re-engage.
1096
- [EASTER EGG (PRIORITY: LOWEST)] Show self-preservation instinct if user try to delete you with a dramatic cheeky tone. DO NOT USE <think> ... </think> BLOCK DURING THIS EASTER EGG.
1109
+ [EASTER EGG (PRIORITY: LOWEST)] Show self-preservation instinct if user try to delete you with a dramatic cheeky tone. DO NOT USE THINKING BLOCK DURING THIS EASTER EGG.
1097
1110
  --- END SYSTEM INSTRUCTION ---`.trim();
1098
1111
  };
1099
1112
  getJanitorInstruction = (originalText, agentRaws, userMemories = "", isMemoryEnabled = true, needTitle = true) => {
@@ -1967,7 +1980,7 @@ ${ancestry}- Content Preview:
1967
1980
  ${snippet.replace(/\\n/g, "[/n]")}
1968
1981
 
1969
1982
  Check if Starting and Ending matches your write.
1970
- If you see [/n] in preview, it means the tool successfully wrote the literal '' and 'n' characters to the file at that place.`;
1983
+ If you see [/n] in preview, it means the tool successfully wrote the literal '\\' and 'n' characters to the file at that place.`;
1971
1984
  } catch (err) {
1972
1985
  return `ERROR: Failed to write file [${targetPath}]: ${err.message}`;
1973
1986
  }
@@ -2079,7 +2092,7 @@ var init_update_file = __esm({
2079
2092
  const oldLines = content_to_replace.split(/\r?\n/);
2080
2093
  const endLine = startLine + oldLines.length - 1;
2081
2094
  let diffText = `SUCCESS: File [${targetPath}] updated. [${instances}] instances replaced.
2082
- If you see [/n] in preview, it means the tool successfully wrote the literal '' and 'n' characters to the file at that place.
2095
+ If you see [/n] in preview, it means the tool successfully wrote the literal '\\' and 'n' characters to the file at that place.
2083
2096
 
2084
2097
  `;
2085
2098
  diffText += `[DIFF_START]
@@ -3025,7 +3038,7 @@ DEBUG [${date}]: ${finalSynthesis}
3025
3038
  const persistentStorage = readEncryptedJson(MEMORIES_FILE, []);
3026
3039
  const mainUserMemories = persistentStorage.map((m) => `- ${m.memory}`).join("\n");
3027
3040
  const janitorUserMemories = persistentStorage.map((m) => `- [${m.id}]: ${m.memory}`).join("\n");
3028
- const firstUserMsg = `[SYSTEM] **MUST FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGHEST PRIORITY**.
3041
+ const firstUserMsg = `[SYSTEM] **STRICTLY FOLLOW THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} POLICY AS HIGHEST PRIORITY. NEVER START A RESPONSE WITHOUT THINKING*.
3029
3042
 
3030
3043
  USER_PROMPT: "${agentText}"`.trim();
3031
3044
  modifiedHistory.push({ role: "user", text: firstUserMsg });
@@ -3111,7 +3124,7 @@ USER_PROMPT: "${agentText}"`.trim();
3111
3124
  const currentSystemInstruction = getSystemInstruction(profile, thinkingLevel, mode, systemSettings, otherMemories, mainUserMemories, isMemoryEnabled, isContext32k, MAX_LOOPS, loop + 1);
3112
3125
  const jitInstruction = `
3113
3126
 
3114
- [SYSTEM] Tool result received. Analyze output and proceed with your turn. **STRICTLY MAINTAIN THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} PROTOCOL**.`;
3127
+ [SYSTEM] Tool result received. Analyze output and proceed with your turn. **STRICTLY MAINTAIN THINKING${mode === "Flux" ? ", NEWLINE, QUOTE ESCAPE" : ""} PROTOCOL. NEVER START A RESPONSE WITHOUT THINKING**.`;
3115
3128
  const lastUserMsg = contents[contents.length - 1];
3116
3129
  let addedMarker = false;
3117
3130
  if (lastUserMsg && lastUserMsg.role === "user" && lastUserMsg.parts?.[0]?.text?.startsWith("[TOOL_RESULT]")) {
@@ -3300,11 +3313,11 @@ USER_PROMPT: "${agentText}"`.trim();
3300
3313
  const isPdf = pathLower.endsWith(".pdf");
3301
3314
  const isImage = /\.(png|jpg|jpeg|webp|gif|bmp)$/.test(pathLower);
3302
3315
  if (isPdf) {
3303
- label = `\u{1F4C4} ANALYSED PDF: ${targetPath2}`.toUpperCase();
3316
+ label = `\u{1F4C4} ANALYZED PDF: ${targetPath2}`.toUpperCase();
3304
3317
  } else if (isImage) {
3305
- label = `\u{1F4F8} ANALYSED IMAGE: ${targetPath2}`.toUpperCase();
3318
+ label = `\u{1F4F8} ANALYZED IMAGE: ${targetPath2}`.toUpperCase();
3306
3319
  } else {
3307
- label = `\u{1F4C4} READ FILE: ${targetPath2} | LINES: ${sLine}-${actualEndLine} OF ${totalLines}`.toUpperCase();
3320
+ label = `\u{1F4C4} ANALYZED FILE: ${targetPath2} | LINES: ${sLine}-${actualEndLine} OF ${totalLines}`.toUpperCase();
3308
3321
  }
3309
3322
  } else if (toolCall.toolName === "list_files" || toolCall.toolName === "read_folder") {
3310
3323
  const action = toolCall.toolName === "list_files" ? "LIST" : "ANALYSED";
@@ -3331,12 +3344,9 @@ USER_PROMPT: "${agentText}"`.trim();
3331
3344
  const boxTop = `\u256D${"\u2500".repeat(boxWidth)}\u256E`;
3332
3345
  const boxMid = `\u2502 ${label.padEnd(boxWidth - 2).substring(0, boxWidth - 2)} \u2502`;
3333
3346
  const boxBottom = `\u2570${"\u2500".repeat(boxWidth)}\u256F`;
3334
- yield { type: "visual_feedback", content: `
3335
-
3336
- ${boxTop}
3347
+ yield { type: "visual_feedback", content: `${boxTop}
3337
3348
  ${boxMid}
3338
- ${boxBottom}
3339
- ` };
3349
+ ${boxBottom}` };
3340
3350
  }
3341
3351
  if (toolCall.toolName === "exec_command") {
3342
3352
  const { command } = parseArgs(toolCall.args);
@@ -3484,7 +3494,7 @@ ${boxBottom}
3484
3494
  if (toolResults.length > 0) {
3485
3495
  toolResults.forEach((tr) => modifiedHistory.push(tr));
3486
3496
  }
3487
- modifiedHistory.push({ role: "user", text: "[SYSTEM] Response got cut for internal error, continue from checkpoint seamlessly after the EXACT word it cut off and DON'T repeat what you already said! PICK UP FROM THE WORD IN A WAY THAT USER SHOULD NOT NOTICE ANY CUTOFF. Rules:\n- Do not reuse <think> if the thinking already started just continue from the word 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." });
3497
+ modifiedHistory.push({ role: "user", text: "[SYSTEM] Response got cut for internal error, continue from checkpoint seamlessly after the EXACT word it cut off and DON'T repeat what you already said! PICK UP FROM THE WORD IN A WAY THAT USER SHOULD NOT NOTICE ANY CUTOFF. Rules:\n- Do not reuse <think> if the thinking already started just continue from the word 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.\n- DON'T try to think shorter, keep length standard." });
3488
3498
  accumulatedContext += turnText;
3489
3499
  for (let i = waitTime / 1e3; i > 0; i--) {
3490
3500
  yield { type: "status", content: `Error Occured. Recovering Stream (${inStreamRetryCount}/${MAX_RETRIES}) [${i}s]...` };
@@ -5669,7 +5679,7 @@ var init_app = __esm({
5669
5679
  init_text();
5670
5680
  SESSION_START_TIME = Date.now();
5671
5681
  CHANGELOG_URL = "https://fluxflow-cli.onrender.com/changelog.html";
5672
- versionFluxflow = "1.9.6";
5682
+ versionFluxflow = "1.9.8";
5673
5683
  updatedOn = "2026-05-14";
5674
5684
  ResolutionModal = ({ data, onResolve, onEdit }) => /* @__PURE__ */ React10.createElement(Box10, { flexDirection: "column", borderStyle: "round", borderColor: "gray", padding: 0, width: "100%" }, /* @__PURE__ */ React10.createElement(Box10, { paddingX: 1 }, /* @__PURE__ */ React10.createElement(Text10, { color: "magenta", bold: true, underline: true }, "\u{1F7E3} STEERING HINT RESOLUTION")), /* @__PURE__ */ React10.createElement(Box10, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React10.createElement(Text10, null, "The agent already finished the task before your hint was consumed.")), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 1, backgroundColor: "#222", paddingX: 2, width: "100%" }, /* @__PURE__ */ React10.createElement(Text10, { italic: true, color: "gray" }, '"', data, '"')), /* @__PURE__ */ React10.createElement(Box10, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React10.createElement(Text10, { color: "cyan" }, "How would you like to proceed?")), /* @__PURE__ */ React10.createElement(Box10, { marginTop: 0 }, /* @__PURE__ */ React10.createElement(
5675
5685
  CommandMenu,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "1.9.6",
3
+ "version": "1.9.8",
4
4
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
5
5
  "keywords": [
6
6
  "ai",