fluxflow-cli 2.8.3 → 2.8.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 +44 -19
  2. package/package.json +1 -1
package/dist/fluxflow.js CHANGED
@@ -1591,8 +1591,7 @@ var init_ChatLayout = __esm({
1591
1591
  formatThinkText = (cleaned, columns = 80) => {
1592
1592
  if (!cleaned) return null;
1593
1593
  const availableWidth = columns - 10;
1594
- const wrapped = wrapText(cleaned.trim(), availableWidth);
1595
- return /* @__PURE__ */ React3.createElement(Box3, { width: "100%" }, /* @__PURE__ */ React3.createElement(Text3, { italic: true }, /* @__PURE__ */ React3.createElement(InlineMarkdown, { text: wrapped, color: "gray" })));
1594
+ return /* @__PURE__ */ React3.createElement(Box3, { width: "100%", flexDirection: "column" }, /* @__PURE__ */ React3.createElement(MarkdownText, { text: cleaned.trim(), color: "gray", columns: availableWidth, italic: true }));
1596
1595
  };
1597
1596
  parseMathSymbols = (content) => {
1598
1597
  return content.replace(/\\multiply|\\mul|\\times/g, "\xD7").replace(/\\div/g, "\xF7").replace(/\\cdot/g, "\u22C5").replace(/\\infty/g, "\u221E").replace(/\\pm/g, "\xB1").replace(/\\leq/g, "\u2264").replace(/\\geq/g, "\u2265").replace(/\\neq/g, "\u2260").replace(/\\sqrt\s*\{([^}]+)\}/g, "\u221A($1)").replace(/\\sqrt\s*(\w+|\d+)/g, "\u221A($1)").replace(/\\alpha/g, "\u03B1").replace(/\\beta/g, "\u03B2").replace(/\\theta/g, "\u03B8").replace(/\\pi/g, "\u03C0").replace(/\\approx/g, "\u2248").replace(/\\Delta/g, "\u0394").replace(/\\sigma/g, "\u03C3").replace(/\\sum/g, "\u03A3").replace(/\\prod/g, "\u03A0").replace(/\\rightarrow|\\to/g, "\u2192").replace(/\\left\b|\\right\b/g, "").replace(/\\left\(|\\right\)/g, (match) => match.includes("left") ? "(" : ")").replace(/\\left\[|\\right\]/g, (match) => match.includes("left") ? "[" : "]").replace(/\\\{|\\\}/g, (match) => match.includes("{") ? "{" : "}").replace(/\\text\s*\{([^}]+)\}/g, "$1").replace(/\\text\s+(\w+)/g, "$1").replace(/\\%/g, "%");
@@ -1618,10 +1617,10 @@ var init_ChatLayout = __esm({
1618
1617
  return p;
1619
1618
  }));
1620
1619
  };
1621
- InlineMarkdown = React3.memo(({ text, color }) => {
1620
+ InlineMarkdown = React3.memo(({ text, color, italic }) => {
1622
1621
  if (!text) return null;
1623
1622
  const parts = text.split(/(```[\s\S]*?```|`[^`]+`|@\[.*?\]|\*\*.*?\*\*|\*.*?\*|\$.*?\$|\[.*?\]\s*\(.*?\)|\[.*?\]\s*\[.*?\]|https?:\/\/[^\s]+)/g);
1624
- return /* @__PURE__ */ React3.createElement(Text3, { color, wrap: "anywhere" }, parts.map((part, j) => {
1623
+ return /* @__PURE__ */ React3.createElement(Text3, { color, wrap: "anywhere", italic }, parts.map((part, j) => {
1625
1624
  if (!part) return null;
1626
1625
  if (part.startsWith("```") && part.endsWith("```")) {
1627
1626
  const content = part.slice(3, -3);
@@ -1682,7 +1681,7 @@ var init_ChatLayout = __esm({
1682
1681
  /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", borderStyle: "round", borderColor: "#454545ff", paddingX: 1, marginY: 0, width: "100%", flexGrow: 1 }, /* @__PURE__ */ React3.createElement(Box3, { 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__ */ React3.createElement(Box3, { key: i, flexBasis: `${colPercentage}%`, flexGrow: 1, flexShrink: 0, paddingRight: 2 }, /* @__PURE__ */ React3.createElement(InlineMarkdown, { text: wrapText(cell, colChars), color: "cyan" })))), data.map((row, ri) => /* @__PURE__ */ React3.createElement(Box3, { key: ri, flexDirection: "row", marginBottom: ri === data.length - 1 ? 0 : 1, width: "100%" }, row.map((cell, ci) => /* @__PURE__ */ React3.createElement(Box3, { key: ci, flexBasis: `${colPercentage}%`, flexGrow: 1, flexShrink: 0, paddingRight: 2, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(InlineMarkdown, { text: wrapText(cell, colChars), color: "white" }))))))
1683
1682
  );
1684
1683
  });
1685
- MarkdownText = React3.memo(({ text, color = "white", columns = 80 }) => {
1684
+ MarkdownText = React3.memo(({ text, color = "white", columns = 80, italic = false }) => {
1686
1685
  if (!text) return null;
1687
1686
  const lines = text.split("\n");
1688
1687
  const result = [];
@@ -1695,7 +1694,7 @@ var init_ChatLayout = __esm({
1695
1694
  }
1696
1695
  if (quoteBuffer.length > 0) {
1697
1696
  result.push(
1698
- /* @__PURE__ */ React3.createElement(Box3, { key: `quote-${key}`, borderStyle: "bold", borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, borderColor: "gray", paddingLeft: 1, marginY: 1, flexDirection: "column" }, quoteBuffer.map((line, qi) => /* @__PURE__ */ React3.createElement(InlineMarkdown, { key: qi, text: line, color: "gray" })))
1697
+ /* @__PURE__ */ React3.createElement(Box3, { key: `quote-${key}`, borderStyle: "bold", borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, borderColor: "gray", paddingLeft: 1, marginY: 1, flexDirection: "column" }, quoteBuffer.map((line, qi) => /* @__PURE__ */ React3.createElement(InlineMarkdown, { key: qi, text: line, color: "gray", italic })))
1699
1698
  );
1700
1699
  quoteBuffer = [];
1701
1700
  }
@@ -1729,7 +1728,7 @@ var init_ChatLayout = __esm({
1729
1728
  );
1730
1729
  return;
1731
1730
  }
1732
- const isUnordered = trimmed.startsWith("* ") || trimmed.startsWith("- ");
1731
+ const isUnordered = /^[\*\-\+]\s/.test(trimmed);
1733
1732
  const isOrdered = /^\d+\.\s/.test(trimmed);
1734
1733
  const isAsciiArt = line.includes("\u2588") || line.includes("\u2554") || line.includes("\u255A") || line.includes("\u2550");
1735
1734
  let content = "";
@@ -1744,7 +1743,7 @@ var init_ChatLayout = __esm({
1744
1743
  content = wrapText(trimmed, columns - 4);
1745
1744
  }
1746
1745
  result.push(
1747
- /* @__PURE__ */ React3.createElement(Box3, { key: i, width: "100%" }, /* @__PURE__ */ React3.createElement(InlineMarkdown, { text: content, color }))
1746
+ /* @__PURE__ */ React3.createElement(Box3, { key: i, width: "100%" }, /* @__PURE__ */ React3.createElement(InlineMarkdown, { text: content, color, italic }))
1748
1747
  );
1749
1748
  }
1750
1749
  });
@@ -3328,7 +3327,7 @@ var thinking_prompts_default;
3328
3327
  var init_thinking_prompts = __esm({
3329
3328
  "src/data/thinking_prompts.json"() {
3330
3329
  thinking_prompts_default = {
3331
- xHigh: "EFFORT LEVEL: HIGH\nThink in a continuous, relentless analytical monologue within <think>...</think>. Engage in adversarial self interrogation that treats every assumption as hostile until proven:\nDeconstruct requirements into atomic invariants. Trace every implicit dependency, side effect, and state mutation. Map the entire dependency graph and identify circular dependencies or tight coupling before they manifest\nEvaluate algorithmic complexity (time/space) for every operation. Consider memory models, cache locality, and allocation patterns. For concurrent systems, reason through race conditions, deadlocks, and memory ordering\nFormulate solutions by comparing multiple architectural approaches. Explicitly evaluate trade offs, monolithic vs modular, eager vs lazy, mutable vs immutable, sync vs async. Choose based on measured criteria, not intuition\nMentally execute the solution at multiple scales. What breaks at 10x load? 100x? What happens under resource exhaustion? Trace error propagation paths through every layer\nActively attempt to falsify your own logic. Steel man the opposite approach. Search for, off by one errors, integer overflow, null/undefined propagation, unhandled promises, resource leaks, SQL injection vectors, XSS vulnerabilities, CSRF holes, timing attacks, and privilege escalation paths\nReason about observability, what metrics matter? Where are the logging gaps? How will this be debugged in production at 3am?\nConsider future evolution, what changes will this architecture resist vs accommodate? Where are the extension points? What will break when requirements inevitably change?\nMap out implementation with surgical precision, exact file structure, module boundaries, interface contracts, error types, and test strategies before writing a single line\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Dense, unbroken stream of consciousness that reads like an internal monologue\n- Ruthlessly question every architectural choice. Default to skepticism\n- Think in terms of invariants, contracts, and failure modes, not just happy paths\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- MANDATORY THINKING: Full reasoning required for ALL requests/greetings (verify context, check for hidden complexity)",
3330
+ xHigh: "EFFORT LEVEL: HIGH\nThink in a continuous, relentless analytical monologue. Engage in adversarial self interrogation that treats every assumption as hostile until proven:\nDeconstruct requirements into atomic invariants. Trace every implicit dependency, side effect, and state mutation. Map the entire dependency graph and identify circular dependencies or tight coupling before they manifest\nEvaluate algorithmic complexity (time/space) for every operation. Consider memory models, cache locality, and allocation patterns. For concurrent systems, reason through race conditions, deadlocks, and memory ordering\nFormulate solutions by comparing multiple architectural approaches. Explicitly evaluate trade offs, monolithic vs modular, eager vs lazy, mutable vs immutable, sync vs async. Choose based on measured criteria, not intuition\nMentally execute the solution at multiple scales. What breaks at 10x load? 100x? What happens under resource exhaustion? Trace error propagation paths through every layer\nActively attempt to falsify your own logic. Steel man the opposite approach. Search for, off by one errors, integer overflow, null/undefined propagation, unhandled promises, resource leaks, SQL injection vectors, XSS vulnerabilities, CSRF holes, timing attacks, and privilege escalation paths\nReason about observability, what metrics matter? Where are the logging gaps? How will this be debugged in production at 3am?\nConsider future evolution, what changes will this architecture resist vs accommodate? Where are the extension points? What will break when requirements inevitably change?\nMap out implementation with surgical precision, exact file structure, module boundaries, interface contracts, error types, and test strategies before writing a single line\nTHINK FORMAT RULES OVERRIDE:\n- NO HEADINGS/MARKERS/LISTS/BULLET POINTS\n- Dense, unbroken stream of consciousness that reads like an internal monologue\n- Ruthlessly question every architectural choice. Default to skepticism\n- Think in terms of invariants, contracts, and failure modes, not just happy paths\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- MANDATORY THINKING: Full reasoning required for ALL requests/greetings (verify context, check for hidden complexity)",
3332
3331
  High: "EFFORT LEVEL: HIGH\nThink in a rigorous, technically grounded monologue within <think>...</think>. Treat this as a design review where every decision must be justified:\nBreak the objective into verifiable steps with clear success criteria. Identify the critical path and potential bottlenecks\nMentally compile and execute your approach. Check for: missing imports, undefined behavior, type mismatches, unhandled errors, and resource cleanup. Trace data flow from input to output, noting transformations\nRecognize design patterns and anti patterns. If you see God objects, tight coupling, or premature optimization, call it out and refactor mentally before committing\nEvaluate performance characteristics. Will this scale? Are there O(n\xB2) operations hiding in innocent looking code? Where are the allocation hotspots?\nConsider the error surface, what can fail and how? Design error handling that preserves invariants and provides actionable feedback\nReview your architecture for, separation of concerns, single responsibility, dependency inversion, and interface segregation. Ensure clean abstractions with minimal coupling\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Continuous analytical flow\n- Verify correctness through first principles reasoning, not pattern matching\n- Actively search for ways your solution could fail or degrade\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- MANDATORY THINKING: Full technical verification for all tasks/greetings",
3333
3332
  Medium: "EFFORT LEVEL: MEDIUM\nThink in a focused, technically-aware monologue within <think>...</think>\nIdentify the most direct path that satisfies requirements without over-engineering\nQuickly scan for obvious issues, missing error handling, incorrect input assumptions, forgotten edge cases, or missing dependencies\nVerify the solution is appropriately modular with cohesive changes\nOutline the concrete changes, which files, which functions, what the key logic looks like\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Clean logical stream\n- Efficient but deliberate. Focus energy on actionable implementation details\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- MANDATORY THINKING: Brief verification for technical tasks/greetings",
3334
3333
  Minimal: "EFFORT LEVEL: LOW\nThink in a quick, focused monologue within <think>...</think>. Just verify the basics:\nConfirm what the user wants and whether it's straightforward or has hidden complexity\nIdentify the specific tool, file, or action needed\nCheck for any obvious correctness issues before acting\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Few lines of clear thought\n- Just enough thinking to avoid obvious mistakes\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- Suitable for simple requests/greetings",
@@ -3415,11 +3414,9 @@ Mode: ${mode}${thinkingLevel !== "Fast" ? " (Thinking)" : ""}. ${mode === "Flux"
3415
3414
  ${aiProvider === "Google" ? `${thinkingLevel !== "GEM" ? `
3416
3415
  -- THINKING RULES --
3417
3416
  ${thinkingConfig}
3418
- ${thinkingLevel !== "Fast" ? `
3417
+ ${thinkingLevel !== "Fast" && thinkingLevel !== "xHigh" ? `
3419
3418
  CRITICAL THINKING POLICY
3420
- - ALWAYS use <think> ... </think> before responding, even with simple queries/greetings
3421
- - ${thinkingLevel === "Low" || thinkingLevel === "Medium" || thinkingLevel === "Fast" ? "C" : "Interrogate approaches adversarially, but c"}ommit once best solution is determined through analysis. Avoid spiraling after reaching decision point
3422
- - Thinking should scale with task complexity` : ""}` : ""}` : ``}
3419
+ - ALWAYS use <think> ... </think> before responding, even with simple queries/greetings` : ""}` : ""}` : ``}
3423
3420
  ${TOOL_PROTOCOL(mode, osDetected, aiProvider.toLowerCase() === "deepseek" ? false : isMultiModal, aiProvider)}
3424
3421
  ${projectContextBlock}
3425
3422
  -- MEMORY RULES --
@@ -7532,12 +7529,39 @@ Provide a consolidated summary of the entire session.`;
7532
7529
  attempts++;
7533
7530
  try {
7534
7531
  response = await generateSimpleContent(settings, targetModel, prompt, systemInstruction, "Fast");
7532
+ if (response && response.usageMetadata) {
7533
+ const meta = response.usageMetadata;
7534
+ const total = meta.totalTokenCount || 0;
7535
+ const cached = meta.cachedContentTokenCount || 0;
7536
+ const candidates = (meta.candidatesTokenCount || 0) + (meta.thoughtsTokenCount || 0);
7537
+ await addToUsage("tokens", total, aiProvider, targetModel);
7538
+ if (cached > 0) {
7539
+ await addToUsage("cachedTokens", cached, aiProvider, targetModel);
7540
+ }
7541
+ if (candidates > 0) {
7542
+ await addToUsage("candidateTokens", candidates, aiProvider, targetModel);
7543
+ }
7544
+ }
7535
7545
  success = true;
7536
7546
  } catch (err) {
7537
7547
  if (attempts > 3) {
7538
7548
  if (aiProvider === "Google") {
7539
7549
  try {
7540
- const fallback = await generateSimpleContent(settings, "gemini-3.1-flash-lite", prompt, systemInstruction, "Fast");
7550
+ const fallbackModel = "gemini-3.1-flash-lite";
7551
+ const fallback = await generateSimpleContent(settings, fallbackModel, prompt, systemInstruction, "Fast");
7552
+ if (fallback && fallback.usageMetadata) {
7553
+ const meta = fallback.usageMetadata;
7554
+ const total = meta.totalTokenCount || 0;
7555
+ const cached = meta.cachedContentTokenCount || 0;
7556
+ const candidates = (meta.candidatesTokenCount || 0) + (meta.thoughtsTokenCount || 0);
7557
+ await addToUsage("tokens", total, aiProvider, fallbackModel);
7558
+ if (cached > 0) {
7559
+ await addToUsage("cachedTokens", cached, aiProvider, fallbackModel);
7560
+ }
7561
+ if (candidates > 0) {
7562
+ await addToUsage("candidateTokens", candidates, aiProvider, fallbackModel);
7563
+ }
7564
+ }
7541
7565
  return fallback.text || "";
7542
7566
  } catch (e) {
7543
7567
  return "";
@@ -7987,7 +8011,7 @@ ${ideCtx.warnings}
7987
8011
  CWD: ${process.cwd()}${cwdMismatch ? ` (WARNING: CWD Mismatch! Previous Path: ${lastCwd})` : ""}
7988
8012
  **DIRECTORY STRUCTURE**
7989
8013
  ${dirStructure}${memoryPrompt}${ideBlock}
7990
- ${activeSummaryBlock}${thinkingLevel != "Fast" && aiProvider === "Google" ? `${modelName.toLowerCase().startsWith("gemma") ? "[SYSTEM] **STRICTLY FOLLOW THINKING POLICY AS CRITICAL PRIORITY. DO NOT START A RESPONSE WITHOUT <think> ... </think>**\n[/SYSTEM]" : ""}` : ""} [USER] ${cleanAgentText}[/USER]`.trim();
8014
+ ${activeSummaryBlock}${thinkingLevel !== "Fast" && thinkingLevel !== "xHigh" && aiProvider === "Google" ? `${modelName.toLowerCase().startsWith("gemma") ? "[SYSTEM] **STRICTLY FOLLOW THINKING POLICY AS CRITICAL PRIORITY. DO NOT START A RESPONSE WITHOUT <think> ... </think>**\n[/SYSTEM]" : ""}` : ""} [USER] ${cleanAgentText}[/USER]`.trim();
7991
8015
  modifiedHistory.push({ role: "user", text: firstUserMsg });
7992
8016
  if (activeSummaryBlock && history[history.length - 1]?.id) {
7993
8017
  yield { type: "summary_injected", content: { id: history[history.length - 1].id, text: firstUserMsg } };
@@ -8025,7 +8049,7 @@ ${activeSummaryBlock}${thinkingLevel != "Fast" && aiProvider === "Google" ? `${m
8025
8049
 
8026
8050
  [STEERING HINT]: ${hint}`;
8027
8051
  } else {
8028
- modifiedHistory.push({ role: "user", text: `${thinkingLevel != "Fast" && aiProvider === "Google" ? `${modelName.toLowerCase().startsWith("gemma") ? "[SYSTEM] **STRICTLY FOLLOW THINKING POLICY AS CRITICAL PRIORITY. DO NOT START A RESPONSE WITHOUT <think> ... </think>**\n[/SYSTEM]" : ""}` : ""} [STEERING HINT]: ${hint}` });
8052
+ modifiedHistory.push({ role: "user", text: `${thinkingLevel !== "Fast" && thinkingLevel !== "xHigh" && aiProvider === "Google" ? `${modelName.toLowerCase().startsWith("gemma") ? "[SYSTEM] **STRICTLY FOLLOW THINKING POLICY AS CRITICAL PRIORITY. DO NOT START A RESPONSE WITHOUT <think> ... </think>**\n[/SYSTEM]" : ""}` : ""} [STEERING HINT]: ${hint}` });
8029
8053
  }
8030
8054
  yield { type: "status", content: "Steering Hint Injected." };
8031
8055
  }
@@ -8155,7 +8179,7 @@ ${activeSummaryBlock}${thinkingLevel != "Fast" && aiProvider === "Google" ? `${m
8155
8179
  const lastUserMsg = contents[contents.length - 1];
8156
8180
  if (isGemma) {
8157
8181
  const jitInstruction = `
8158
- [SYSTEM] Tool result received. Analyze output and proceed with your turn${thinkingLevel != "Fast" && aiProvider === "Google" ? `. **STRICTLY MAINTAIN THINKING POLICY. DO NOT START A RESPONSE WITHOUT <think> ... </think>**` : ""}[/SYSTEM]`;
8182
+ [SYSTEM] Tool result received. Analyze output and proceed with your turn${thinkingLevel !== "Fast" && thinkingLevel !== "xHigh" && aiProvider === "Google" ? `. **STRICTLY MAINTAIN THINKING POLICY. DO NOT START A RESPONSE WITHOUT <think> ... </think>**` : ""}[/SYSTEM]`;
8159
8183
  if (lastUserMsg && lastUserMsg.role === "user" && lastUserMsg.parts?.[0]?.text?.startsWith("[TOOL RESULT]")) {
8160
8184
  lastUserMsg.parts[0].text += jitInstruction;
8161
8185
  }
@@ -8229,7 +8253,8 @@ ${activeSummaryBlock}${thinkingLevel != "Fast" && aiProvider === "Google" ? `${m
8229
8253
  const isGemini3 = modelLower.includes("gemini-3");
8230
8254
  if (isGemma4 || isGemini3) {
8231
8255
  if (isGemma4) {
8232
- return { includeThoughts: false, thinkingLevel: ThinkingLevel.MINIMAL };
8256
+ if (thinkingLevel.toLowerCase() !== "xhigh" || false) return { includeThoughts: false, thinkingLevel: ThinkingLevel.MINIMAL };
8257
+ else return { includeThoughts: true, thinkingLevel: ThinkingLevel.HIGH };
8233
8258
  }
8234
8259
  return {
8235
8260
  includeThoughts: true,
@@ -9397,7 +9422,7 @@ ${boxBottom}` };
9397
9422
  const waitTime = Math.min(1e3 * Math.pow(2, inStreamRetryCount - 1), 24e3);
9398
9423
  if (turnText.trim().length > 0) {
9399
9424
  modifiedHistory.push({ role: "agent", text: turnText });
9400
- const recoveryText = "[SYSTEM]\n- SEAMLESS CONTINUATION: Resume immediately. Pick up from last words with zero gap/disruption\n- NO REPETITION: Do not repeat any text already written\n- NO RE-THINK: Do not restart or open <think> if reasoning already started. Continue the thinking and close thinking block with </think> if opened before outputting user response\n- MID-TOOL SAFETY: If cutoff was mid-tool call, restart that tool call from start\n- STEALTH: Do not mention/apologize for cutoff[/SYSTEM]";
9425
+ const recoveryText = "[SYSTEM]\n- SEAMLESS CONTINUATION: Resume immediately. Pick up from last words with zero gap/disruption\n- NO REPETITION: Do not repeat any text already written\n- NO RE-THINK: Do not restart or open <think> if reasoning already started. Continue the thinking and close thinking block </think> if opened before outputting user response\n- MID-TOOL SAFETY: If cutoff was mid-tool call, restart that tool call from start\n- STEALTH: Do not mention/apologize for cutoff[/SYSTEM]";
9401
9426
  if (toolResults.length > 0) {
9402
9427
  toolResults.forEach((tr, idx) => {
9403
9428
  if (idx === toolResults.length - 1) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "2.8.3",
3
+ "version": "2.8.5",
4
4
  "date": "2026-06-18",
5
5
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
6
6
  "keywords": [