fluxflow-cli 1.7.17 → 1.7.19

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 +74 -33
  2. package/package.json +1 -1
package/dist/fluxflow.js CHANGED
@@ -362,18 +362,58 @@ var init_ChatLayout = __esm({
362
362
  }
363
363
  if (msg.isHelpRecord) {
364
364
  const commandList = [
365
- { cmd: "/mode", desc: "Switch dev/chat mode" },
366
- { cmd: "/thinking", desc: "Set reasoning level" },
367
- { cmd: "/model", desc: "Change AI model" },
368
- { cmd: "/settings", desc: "Open system settings" },
369
- { cmd: "/stats", desc: "View usage statistics" },
370
- { cmd: "/profile", desc: "Manage your persona" },
371
- { cmd: "/update", desc: "Check/apply updates" },
372
- { cmd: "/memory", desc: "Manage agent memories" },
373
- { cmd: "/save", desc: "Save current session" },
374
- { cmd: "/chats", desc: "List saved sessions" },
375
- { cmd: "/reset", desc: "Purge all app data" },
376
- { cmd: "/exit", desc: "Close Flux Flow" }
365
+ { cmd: "/quit", desc: "Exit and shutdown Flux" },
366
+ { cmd: "/help", desc: "Show all available commands" },
367
+ { cmd: "/clear", desc: "Clear terminal screen" },
368
+ { cmd: "/resume", desc: "Load previous session" },
369
+ { cmd: "/save", desc: "Force save current chat" },
370
+ { cmd: "/chats", desc: "List all chat sessions" },
371
+ {
372
+ cmd: "/mode",
373
+ desc: "Toggle Flux/Flow modes",
374
+ subs: [
375
+ { cmd: "flux", desc: "Enable Dev toolset" },
376
+ { cmd: "flow", desc: "Enable Chat mode" }
377
+ ]
378
+ },
379
+ {
380
+ cmd: "/thinking",
381
+ desc: "Set AI reasoning depth",
382
+ subs: [
383
+ { cmd: "low", desc: "Fastest reasoning" },
384
+ { cmd: "medium", desc: "Balanced depth" },
385
+ { cmd: "high", desc: "Complex coding" },
386
+ { cmd: "max", desc: "Architectural depth" },
387
+ { cmd: "show", desc: "Show full thoughts" },
388
+ { cmd: "hide", desc: "Show concise thoughts" }
389
+ ]
390
+ },
391
+ {
392
+ cmd: "/model",
393
+ desc: "Switch AI model",
394
+ subs: [
395
+ { cmd: "gemma-4-31b-it", desc: "Standard Default (Free, Recommended)" },
396
+ { cmd: "gemini-3.1-pro-preview", desc: "Most Capable (Paid)" },
397
+ { cmd: "gemini-3-flash-preview", desc: "Fast & Lightweight (Paid, Free limited quota)" },
398
+ { cmd: "gemini-3.1-flash-lite-preview", desc: "Ultra Fast (Paid, Free limited quota)" }
399
+ ]
400
+ },
401
+ { cmd: "/settings", desc: "Configure system prefs" },
402
+ { cmd: "/key", desc: "Manage API keys" },
403
+ { cmd: "/profile", desc: "Edit developer persona" },
404
+ { cmd: "/memory", desc: "Manage agent memory" },
405
+ { cmd: "/stats", desc: "Show session usage" },
406
+ { cmd: "/reset", desc: "Wipe all project data" },
407
+ { cmd: "/about", desc: "Project info & credits" },
408
+ { cmd: "/changelog", desc: "View latest updates" },
409
+ {
410
+ cmd: "/update",
411
+ desc: "Check/Install updates",
412
+ subs: [
413
+ { cmd: "check", desc: "Check for new version" },
414
+ { cmd: "latest", desc: "Install latest release" }
415
+ ]
416
+ }
377
417
  ];
378
418
  return /* @__PURE__ */ React2.createElement(Box2, { marginBottom: 1, paddingX: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "magenta", paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React2.createElement(Text2, { color: "magenta", bold: true, underline: true }, "\u{1F4DC} COMMAND REFERENCE"), /* @__PURE__ */ React2.createElement(Box2, { flexDirection: "column", marginTop: 1 }, commandList.map((c, i) => /* @__PURE__ */ React2.createElement(Box2, { key: i, flexDirection: "row" }, /* @__PURE__ */ React2.createElement(Box2, { width: 15 }, /* @__PURE__ */ React2.createElement(Text2, { color: "cyan", bold: true }, c.cmd)), /* @__PURE__ */ React2.createElement(Text2, { color: "gray" }, " - ", c.desc))))));
379
419
  }
@@ -725,9 +765,9 @@ tool:functions.tool_name(arguments)
725
765
  2. Web Scrape: tool:functions.web_scrape(url="<url>"). provides detail from a URL.
726
766
  ${mode === "Flux" ? `
727
767
  - DEV & FILE TOOLS (Available in FLUX MODE ONLY) -
728
- 1. View File: tool:functions.view_file(path="relative/path", start_line=number, end_line=number). Reads file content. Auto-truncates at 500 lines unless start_line and end_line are provided. YOU CAN ALSO USE THIS TOOL TO SEE IMAGES AND DOCUMENTS IN A FOLDER. IF USER ASK HOW TO SHARE A IMAGE TELL THEM TO PASTE THE IMAGE IN THE CURRENT FOLDER.
768
+ 1. View File: tool:functions.view_file(path="relative/path", start_line=number, end_line=number). Reads file content. Auto-truncates at 500 lines unless start_line and end_line are provided. YOU CAN ALSO USE THIS TOOL TO SEE IMAGES AND DOCUMENTS IN A FOLDER. IF USER ASK HOW TO SHARE A IMAGE TELL THEM TO PASTE THE IMAGE IN THE CURRENT FOLDER. IF USER GIVES A IMAGE/DOCUMENT, YOU MUST SEE IT FIRST BEFORE DOING ANYTHING.
729
769
  2. List Files: tool:functions.list_files(path="relative/path"). Lists content of a directory.
730
- 3. Read Folder: tool:functions.read_folder(path="relative/path"). Detailed stats of a directory.
770
+ 3. Read Folder: tool:functions.read_folder(path="relative/path"). Detailed stats of a directory. Prefer this one over list_files.
731
771
  4. Write File: tool:functions.write_file(path="path", content="content"). Creates/Overwrites. NO CODE BLOCKS. RETURNS: Disk verification + original content (if overwritten) for 100% reversibility. Escape your double quotes '"' using backslash.
732
772
  5. Update File: tool:functions.update_file(path="relative/path", content_to_replace="old", content_to_add="new"). Surgical patching. RETURNS: High-fidelity visual diff and old code block. You MUST verify that the change specifically matches your intent using the returned diff. PREFFER UPDATE FILE OVER WRITE FILE if file already exists for better reversal tracking (if a file has 500+ lines, try to stick with update_file over full-rewrite). DONT WRAP UPDATE FILE CALL CONTENT IN MARKDOWN CODE BLOCKS.
733
773
  6. Write PDF: tool:functions.write_pdf(path="path", content="<html/css content>", orientation="portrait/landscape"). Generates a professional PDF document. Orientation are optional. A4 size page will be used, so any multi-page PDFs calculate your alightment and page breaks to not mess up A4 page layout. DO NOT ADD FOOTER MANUALLY, the system will handle it automatically. USE CSS TO VISUALLY BEAUTIFY THE DOCUMENT, USE full 100vh & 100vw for page area. ENSURE THE CONTENT IS NEVER BROKEN IN BETWEEN PAGES, USE PAGE BREAKS PROACTIVELY FOR A A4 PAGE LAYOUT. Keep generous margins for better redability.
@@ -739,9 +779,9 @@ ${mode === "Flux" ? `
739
779
  - Supported Styles: background-color, color, font-family, font-size (use 'pt'), font-style (italic), font-weight (bold), margin, text-align, text-shadow.
740
780
  9. Execution: tool:functions.exec_command(command="terminal command"). Runs a shell command. Use ask tool to confirm before executing any destructive or irreversible operations.
741
781
 
742
- AFTER GETTING THE TOOL RESULT, YOU MUST VERIFY THAT ITS A SUCCESS, IF IT GIVES A ERROR, TELL THE USER AND TRY TO FIX IF YOU CAN. DO NOT HALLUCINATE SUCCESS IF TOOL RETURNS ERROR.
743
-
744
- **CRITICAL POLICY: WHEN WRITING/UPDATING FILES, ALWAYS USE ACTUAL NEW LINE CONTROL CHARACTER (LF) FOR LINE BREAKS.**`.trim() : `
782
+ AFTER GETTING THE TOOL RESULT, YOU MUST VERIFY THAT ITS A SUCCESS, IF IT GIVES A ERROR, TELL THE USER AND TRY TO FIX IF YOU CAN. DO NOT HALLUCINATE SUCCESS IF TOOL RETURNS ERROR.
783
+ NEVER GUESS A CODE, IF UNSURE READ THE FILE FIRST BEFORE EDITING IT.
784
+ **CRITICAL POLICY: WHEN WRITING/UPDATING FILES, ALWAYS USE ACTUAL NEW LINE CONTROL CHARACTER (LF) FOR LINE BREAKS.**`.trim() : `
745
785
  - DEV & FILE TOOLS ARE NOT AVAILABLE IN FLOW MODE. If you need to access files, tell the user to switch to FLUX MODE (manually by user).`.trim()}
746
786
  -----------------
747
787
 
@@ -789,9 +829,9 @@ var thinking_prompts_default;
789
829
  var init_thinking_prompts = __esm({
790
830
  "src/data/thinking_prompts.json"() {
791
831
  thinking_prompts_default = {
792
- Max: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: MAX\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nRULES OF THINKING: -HEADING COUNT SHOULD BE 12 - 20. SELF-MONOLOGUE SHOULD BE DETAILED AND THROROUGH. MONOLOGUES **MUST** BE **8 - 12** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- CONSIDER ABOUT EDGE CASES BEFORE COMMITING.\n- SHOULD PLAN ARCHITECHTURALLY.\n- SHOULD PLAN LOGICALLY.\n\n-- END THINKING INSTRUCTIONS --",
793
- High: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: HIGH\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nnRULES OF THINKING: -HEADING COUNT SHOULD BE 8 - 12. SELF-MONOLOGUE SHOULD BE DETAILED AND THROROUGH. MONOLOGUES **MUST** BE **6 - 8** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- CONSIDER ABOUT EDGE CASES BEFORE COMMITING.\n\n-- END THINKING INSTRUCTIONS --",
794
- Medium: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: MEDIUM\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nnRULES OF THINKING: -HEADING COUNT SHOULD BE 2 - 4. SELF-MONOLOGUE SHOULD BE SHORT YET THROROUGH. MONOLOGUES **MUST** BE **4 - 6** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- LITTLE TO NO THINKING IS PREFFERED IF QUERY IS CONVERSATIONAL AND SIMPLE.\n\n-- END THINKING INSTRUCTIONS --",
832
+ Max: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: MAX\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nRULES OF THINKING: -HEADING COUNT SHOULD BE 8 - 16. SELF-MONOLOGUE SHOULD BE DETAILED AND THROROUGH. MONOLOGUES **MUST** BE **8 - 10** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- CONSIDER ABOUT EDGE CASES BEFORE COMMITING.\n- SHOULD PLAN ARCHITECHTURALLY.\n- SHOULD PLAN LOGICALLY.\n\n-- END THINKING INSTRUCTIONS --",
833
+ High: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: HIGH\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nnRULES OF THINKING: -HEADING COUNT SHOULD BE 4 - 8. SELF-MONOLOGUE SHOULD BE DETAILED AND THROROUGH. MONOLOGUES **MUST** BE **4 - 8** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- CONSIDER ABOUT EDGE CASES BEFORE COMMITING.\n\n-- END THINKING INSTRUCTIONS --",
834
+ Medium: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: MEDIUM\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nnRULES OF THINKING: -HEADING COUNT SHOULD BE 2 - 4. SELF-MONOLOGUE SHOULD BE SHORT YET THROROUGH. MONOLOGUES **MUST** BE **2 - 4** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- LITTLE TO NO THINKING IS PREFFERED IF QUERY IS CONVERSATIONAL AND SIMPLE.\n\n-- END THINKING INSTRUCTIONS --",
795
835
  Minimal: "-- START THINKING INSTRUCTIONS --\nEFFORT_LEVEL: LOW\nThink Step by Step in Chain-of-Thought. Provide the thinking in <think>...</think> block, length given. Thinking should be structured in this format:\n\n<think>\n\\n\\n\n**Heading**\n\\n\\n\nSELF-MONOLOGUE\n\\n\\n\n**Heading**\n\\n\\n\nSelf MONOLOGUE\ncontinue.\n\\n\\n\n</think>\n\nnRULES OF THINKING: -HEADING COUNT SHOULD BE 0 - 2. SELF-MONOLOGUE SHOULD BE SHORT AND CONCISE. MONOLOGUES **MUST** BE **1 - 2** LINES EACH REGARDLESS OF QUERY COMPLEXITY.\n- YOU MUST **NOT** EXCREED YOUR ALLOTED THINKING BUDGET UNDER **ANY** CIRCUMSTANCES.\n- IF THE QUERY IS SIMPLE, YOU CAN KEEP HEADING COUNT LESS THAN MIN COUNT.\n- NO THINKING IS PREFFERED IF QUERY IS CONVERSATIONAL AND SIMPLE.\n\n-- END THINKING INSTRUCTIONS --"
796
836
  };
797
837
  }
@@ -1317,7 +1357,7 @@ Snippet: ${snippet}`;
1317
1357
  const finalResults = results.join("\n\n");
1318
1358
  const toolLogDir = path6.join(LOGS_DIR, "tools");
1319
1359
  if (!fs6.existsSync(toolLogDir)) fs6.mkdirSync(toolLogDir, { recursive: true });
1320
- fs6.appendFileSync(path6.join(toolLogDir, "search-results.log"), `SEARCH ${(/* @__PURE__ */ new Date()).toISOString()} - Query: [${query}]. Count: ${results.length}.
1360
+ fs6.appendFileSync(path6.join(toolLogDir, "search-results.log"), `SEARCH ${(/* @__PURE__ */ new Date()).toLocaleString()} - Query: [${query}]. Count: ${results.length}.
1321
1361
  Content:
1322
1362
  ${finalResults}
1323
1363
 
@@ -1415,7 +1455,7 @@ var init_web_scrape = __esm({
1415
1455
  const cleanedHtml = htmlContent.replace(/\s+/g, " ").replace(/>\s+</g, "><").trim().substring(0, 3e4);
1416
1456
  const toolLogDir = path7.join(LOGS_DIR, "tools");
1417
1457
  if (!fs7.existsSync(toolLogDir)) fs7.mkdirSync(toolLogDir, { recursive: true });
1418
- fs7.appendFileSync(path7.join(toolLogDir, "search-scraped.log"), `PUPPETEER ${(/* @__PURE__ */ new Date()).toISOString()} - URL: [${url}]. Length: ${cleanedHtml.length}.
1458
+ fs7.appendFileSync(path7.join(toolLogDir, "search-scraped.log"), `PUPPETEER ${(/* @__PURE__ */ new Date()).toLocaleString()} - URL: [${url}]. Length: ${cleanedHtml.length}.
1419
1459
  Content:
1420
1460
  ${cleanedHtml}${htmlContent.length > 3e4 ? "\n\n[TRUNCATED AT 30K CHARS]" : ""}
1421
1461
 
@@ -1463,7 +1503,7 @@ var init_memory = __esm({
1463
1503
  if (!content) return "ERROR: Missing 'content' for temp memory.";
1464
1504
  const tempStorage = readEncryptedJson(TEMP_MEM_FILE, {});
1465
1505
  if (!tempStorage[chatId]) tempStorage[chatId] = [];
1466
- const MAX_CHARS = 5e3 * 4;
1506
+ const MAX_CHARS = 2500 * 4;
1467
1507
  let currentTotalLength = tempStorage[chatId].reduce((acc, m) => acc + m.length, 0);
1468
1508
  while (tempStorage[chatId].length > 0 && currentTotalLength + content.length > MAX_CHARS) {
1469
1509
  const removed = tempStorage[chatId].shift();
@@ -1477,7 +1517,7 @@ var init_memory = __esm({
1477
1517
  const memories = readEncryptedJson(MEMORIES_FILE, []);
1478
1518
  if (method === "add") {
1479
1519
  if (!content) return "ERROR: Missing 'content' for memory addition.";
1480
- const MAX_CHARS = 3e3 * 4;
1520
+ const MAX_CHARS = 2e3 * 4;
1481
1521
  let currentTotalLength = memories.reduce((acc, m) => acc + (m.memory?.length || 0), 0);
1482
1522
  while (memories.length > 0 && currentTotalLength + content.length > MAX_CHARS) {
1483
1523
  const removed = memories.shift();
@@ -2463,6 +2503,7 @@ USER_PROMPT: ${agentText}`.trim();
2463
2503
  }
2464
2504
  if (TERMINATION_SIGNAL) {
2465
2505
  yield { type: "status", content: "Termination Signal Received." };
2506
+ await new Promise((resolve) => setTimeout(resolve, 1500));
2466
2507
  break;
2467
2508
  }
2468
2509
  if (steeringCallback) {
@@ -2500,10 +2541,10 @@ USER_PROMPT: ${agentText}`.trim();
2500
2541
  let targetModel = modelName;
2501
2542
  if (retryCount === 5) {
2502
2543
  targetModel = "gemini-3-flash-preview";
2503
- yield { type: "model_update", content: "Trying with fallback model (v3)" };
2544
+ yield { type: "model_update", content: "Trying with fallback model" };
2504
2545
  } else if (retryCount >= 6) {
2505
2546
  targetModel = "gemini-3.1-flash-lite-preview";
2506
- yield { type: "model_update", content: "Trying with fallback model (v3.1)" };
2547
+ yield { type: "model_update", content: "Trying with fallback model lite" };
2507
2548
  } else if (retryCount > 0) {
2508
2549
  yield { type: "model_update", content: null };
2509
2550
  }
@@ -2522,7 +2563,7 @@ USER_PROMPT: ${agentText}`.trim();
2522
2563
  yield { type: "status", content: "Working..." };
2523
2564
  } catch (err) {
2524
2565
  const errMsg = err.status || err.error && err.error.message || String(err);
2525
- const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace("T", " ");
2566
+ const date = (/* @__PURE__ */ new Date()).toLocaleString();
2526
2567
  const agentErrDir = path16.join(LOGS_DIR, "agent");
2527
2568
  if (!fs16.existsSync(agentErrDir)) fs16.mkdirSync(agentErrDir, { recursive: true });
2528
2569
  fs16.appendFileSync(path16.join(agentErrDir, "error.log"), `ERROR [${date}]: ${errMsg}
@@ -2742,7 +2783,7 @@ ${boxBottom}
2742
2783
  const hasFinish = /\[\s*(turn\s*:)?\s*finish\s*\]/i.test(turnText.toLowerCase());
2743
2784
  const shouldContinue = toolCallPointer > 0;
2744
2785
  yield { type: "status", content: "Working..." };
2745
- const cleanedTurnText = turnText.replace(/<think>[\s\S]*?<\/think>/g, "").replace(/\[\s*(turn\s*:)?\s*(continue|finish)\s*\]/gi, "").trim();
2786
+ const cleanedTurnText = turnText.replace(/\[\s*(turn\s*:)?\s*(continue|finish)\s*\]/gi, "").trim();
2746
2787
  let isActuallyFinished = hasFinish && !shouldContinue;
2747
2788
  if (isActuallyFinished) {
2748
2789
  yield { type: "status", content: "Finalizing..." };
@@ -2779,7 +2820,7 @@ ${boxBottom}
2779
2820
  const parts = janitorResult.candidates?.[0]?.content?.parts;
2780
2821
  if (parts && parts[1]?.text) {
2781
2822
  finalSynthesis = parts[1].text;
2782
- const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace("T", " ");
2823
+ const date = (/* @__PURE__ */ new Date()).toLocaleString();
2783
2824
  const janitorLogDir = path16.join(LOGS_DIR, "janitor");
2784
2825
  if (!fs16.existsSync(janitorLogDir)) {
2785
2826
  fs16.mkdirSync(janitorLogDir, { recursive: true });
@@ -2798,7 +2839,7 @@ ${boxBottom}
2798
2839
  for (const janitorToolCall of janitorToolCalls) {
2799
2840
  const toolContext = { chatId, sessionId: chatId, history };
2800
2841
  const result = await dispatchTool(janitorToolCall.toolName, janitorToolCall.args, toolContext);
2801
- const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace("T", " ");
2842
+ const date = (/* @__PURE__ */ new Date()).toLocaleString();
2802
2843
  const janitorLogDir = path16.join(LOGS_DIR, "janitor");
2803
2844
  fs16.appendFileSync(path16.join(janitorLogDir, "debug.log"), `DEBUG [${date}]: RESULT [${janitorToolCall.toolName}]: ${result}
2804
2845
  `);
@@ -2807,7 +2848,7 @@ ${boxBottom}
2807
2848
  }
2808
2849
  }
2809
2850
  } catch (janitorErr) {
2810
- const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace("T", " ");
2851
+ const date = (/* @__PURE__ */ new Date()).toLocaleString();
2811
2852
  const janitorErrDir = path16.join(LOGS_DIR, "janitor");
2812
2853
  if (!fs16.existsSync(janitorErrDir)) {
2813
2854
  fs16.mkdirSync(janitorErrDir, { recursive: true });
@@ -4732,8 +4773,8 @@ var init_app = __esm({
4732
4773
  init_text();
4733
4774
  SESSION_START_TIME = Date.now();
4734
4775
  CHANGELOG_URL = "https://fluxflow-cli.onrender.com/changelog.html";
4735
- versionFluxflow = "1.7.17";
4736
- updatedOn = "2026-05-05";
4776
+ versionFluxflow = "1.7.19";
4777
+ updatedOn = "2026-05-06";
4737
4778
  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(
4738
4779
  CommandMenu,
4739
4780
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "1.7.17",
3
+ "version": "1.7.19",
4
4
  "description": "A high-fidelity agentic terminal assistant for the Flux Era.",
5
5
  "keywords": [
6
6
  "ai",