fluxflow-cli 3.13.5 → 3.14.0

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.
package/dist/fluxflow.js CHANGED
@@ -2864,9 +2864,23 @@ var init_text = __esm({
2864
2864
  }
2865
2865
  }
2866
2866
  }
2867
+ const originalLineIdx = res.originalStartLine - 1;
2868
+ const fullOrigLine = allLinesOriginal[originalLineIdx] || "";
2867
2869
  const oldLines = res.oldContent.split("\n");
2870
+ const origIndentMatch = fullOrigLine.match(/^\s*/);
2871
+ const origIndent = origIndentMatch ? origIndentMatch[0] : "";
2868
2872
  oldLines.forEach((line, i) => {
2869
- diffText += `-${res.originalStartLine + i}|${line}
2873
+ let lineText = line;
2874
+ if (oldLines.length === 1 && fullOrigLine.trim().length > 0 && fullOrigLine.includes(line.trim())) {
2875
+ lineText = fullOrigLine;
2876
+ } else if (i === 0) {
2877
+ const lineIndentMatch = line.match(/^\s*/);
2878
+ const lineIndent = lineIndentMatch ? lineIndentMatch[0] : "";
2879
+ if (lineIndent.length < origIndent.length && fullOrigLine.includes(line.trim())) {
2880
+ lineText = origIndent + line.trimStart();
2881
+ }
2882
+ }
2883
+ diffText += `-${res.originalStartLine + i}|${lineText}
2870
2884
  `;
2871
2885
  });
2872
2886
  let hunkEndInFinal = currentFinalLineIdx;
@@ -2912,7 +2926,6 @@ var init_text = __esm({
2912
2926
  const isR = clean.startsWith("-");
2913
2927
  const isA = clean.startsWith("+");
2914
2928
  let rest = isR || isA ? clean.substring(1) : clean;
2915
- rest = rest.trim();
2916
2929
  const splitIdx = rest.indexOf("|");
2917
2930
  const num = splitIdx !== -1 ? flattenString(rest.substring(0, splitIdx).trim()) : "";
2918
2931
  const content = splitIdx !== -1 ? flattenString(rest.substring(splitIdx + 1)) : flattenString(rest);
@@ -5634,8 +5647,10 @@ var init_ChatLayout = __esm({
5634
5647
  tableBuffer = [];
5635
5648
  }
5636
5649
  if (quoteBuffer.length > 0) {
5650
+ const quoteWidth = columns - 6;
5651
+ const wrappedQuoteLines = quoteBuffer.flatMap((line) => wrapText(line, quoteWidth).split("\n"));
5637
5652
  result.push(
5638
- /* @__PURE__ */ React4.createElement(Box3, { key: `quote-${key}`, borderStyle: "bold", borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, borderColor: colors.borderMuted, paddingLeft: 1, marginY: 1, flexDirection: "column" }, quoteBuffer.map((line, qi) => /* @__PURE__ */ React4.createElement(InlineMarkdown, { key: qi, text: line, color: colors.textMuted, italic, theme })))
5653
+ /* @__PURE__ */ React4.createElement(Box3, { key: `quote-${key}`, borderStyle: "bold", borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, borderColor: colors.borderMuted, paddingLeft: 1, marginY: 1, flexDirection: "column" }, wrappedQuoteLines.map((line, qi) => /* @__PURE__ */ React4.createElement(InlineMarkdown, { key: qi, text: line, color: colors.textMuted, italic, theme })))
5639
5654
  );
5640
5655
  quoteBuffer = [];
5641
5656
  }
@@ -6022,7 +6037,7 @@ var init_ChatLayout = __esm({
6022
6037
  const cmdMatch = msg.text.match(/COMMAND: (.*)/);
6023
6038
  const ptyMatch = msg.text.match(/PTY: (true|false)/);
6024
6039
  const outputMatch = msg.text.match(/OUTPUT: ([\s\S]*)/);
6025
- const cmd = cmdMatch ? cmdMatch[1] : "Unknown";
6040
+ const cmd = cmdMatch ? cmdMatch[1] : "No Command";
6026
6041
  const isPty = ptyMatch ? ptyMatch[1] === "true" : false;
6027
6042
  const outputList = outputMatch ? outputMatch[1] : "";
6028
6043
  return /* @__PURE__ */ React4.createElement(Box3, { marginBottom: 0, paddingX: 1, width: "100%" }, /* @__PURE__ */ React4.createElement(TerminalBox, { command: cmd, output: outputList, completed: true, columns, isPty, theme }));
@@ -6590,7 +6605,7 @@ var init_arg_parser = __esm({
6590
6605
  return "\\";
6591
6606
  default:
6592
6607
  if (char === quote) return quote;
6593
- return match;
6608
+ return char;
6594
6609
  }
6595
6610
  });
6596
6611
  } else if (i < argsString.length && argsString[i] === "[") {
@@ -6687,27 +6702,27 @@ Tool calls: ONLY use [tool:functions.ToolName(args)]
6687
6702
  **NO OTHER SYNTAX/MARKERS/BOUNDARY ALLOWED**
6688
6703
 
6689
6704
  **TOOL USAGE POLICY:**
6690
- - MAX 3 TOOL CALLS/TURN${mode === "Flux" ? " (Todo: 3+, Run: max 1 or 2 consecutive)" : ""}
6691
- ${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Patch \u2190 **HIGHLY RECOMMENDED**\n- Tool denied?Use Ask immediately for user guidance.NEVER proceed blindly/end turn \u2190 ** MANDATORY **\n- FileMap \u2192 ReadFile for efficient file understanding\n- Need specific text ? SearchKeyword > Guessing/ReadFile\n- Huge files ? SearchKeyword > FileMap/Full Read\n- No tool spamming\n- **Update/complete Todos from realtime progress EVERY TURN**\n" : ""}
6705
+ - MAX 4 TOOL CALLS/TURN${mode === "Flux" ? " (Todo: 4+, Run: max 1 or 2 consecutive)" : ""}
6706
+ ${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Patch \u2190 **HIGHLY RECOMMENDED**\n- Tool denied?Use `Ask` immediately for user guidance.NEVER proceed blindly/end turn \u2190 ** MANDATORY **\n- FileMap \u2192 ReadFile for efficient file understanding\n- Need specific text ? SearchKeyword > Guessing/ReadFile\n- Huge files ? SearchKeyword > FileMap/Full Read\n- No tool spamming\n- **Update/complete Todos from realtime progress EVERY TURN**\n" : ""}
6692
6707
  - COMMUNICATION TOOLS -
6693
- 1. [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST ask for path divergence, security or risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short
6708
+ 1. [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST for path divergence, security risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short
6694
6709
 
6695
6710
  - WEB TOOLS -
6696
- 1. [tool:functions.WebSearch(query="...", aiMode="true optional", limit=number)]. Limit 3-10 (aiMode ignores). Usage: unknown info/docs. aiMode: LLM search (default: false)
6711
+ 1. [tool:functions.WebSearch(query="...", aiMode="bool optional, default: false", limit="integer 3-10, aiMode: exclude")]. Usage: unknown info/docs. aiMode: LLM search
6697
6712
  2. [tool:functions.WebScrape(url="...")]. Proactive use for specific webpage/docs/api
6698
6713
 
6699
6714
  ${mode === "Flux" ? `- WORKSPACE TOOLS (path = relative; FIRST ARGUMENT, path separator: '/') -
6700
- 1. [tool:functions.ReadFile(path="...", startLine=number, endLine=number)]. ${aiProvider !== "Google" ? `${isMultiModal ? `Supports images/docs` : `No Multimodal support`}` : `Supports images/docs`}
6701
- 2. [tool:functions.ReadFolder(path="...")]. Detailed DIR stats including File Sizes
6702
- 3. [tool:functions.FileMap(path="path/file")]. Shows file structure, functions, class, import/export, variables
6703
- 4. [tool:functions.PatchFile(path="...", allowMultiple="true optional", replaceContent1="...", newContent1="...", ...MAX 10)]. Surgical patch. allowMultiple: Replace all matches (default: false). Multiple patches same file? Use replaceContent2/newContent2... Unsure? ReadFile. MUST VERIFY DIFF
6704
- 5. [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile. Verify Imports
6705
- 6. [tool:functions.SearchKeyword(keyword="...", path="optional, target directory or filename", subString="true optional", regex="false for keyword, optional")]. Project-wide search. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code. Defaults: subString=false, regex=true
6715
+ 1. [tool:functions.ReadFile(path="...", startLine="integer", endLine="integer")]. ${aiProvider !== "Google" ? `${isMultiModal ? `Supports images/docs` : `No Multimodal support`}` : `Supports images/docs`}
6716
+ 2. [tool:functions.ReadFolder(path="...", recurse="integer 0-4 optional, default: 0")]. Detailed DIR stats including File Sizes
6717
+ 3. [tool:functions.FileMap(path="file")]. Shows file structure, functions, class, import/export, variables
6718
+ 4. [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical patch. allowMultiple: Replace all matches. Multiple patches same file? Use replaceContent2/newContent2... Verify DIFFs
6719
+ 5. [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile
6720
+ 6. [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")]. Project-wide search. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code
6706
6721
  7. [tool:functions.Run(command="...")]. Runs ${osDetected === "Windows" ? isPsAvailable() ? `WINDOWS POWERSHELL` : `WINDOWS CMD ONLY` : `BASH`} command. Destructive/Irreversible ops \u2192 Ask user
6707
- 8. [tool:functions.Todo(method="create/append/get", tasks=[ARRAY OF STRINGS], markDone=[ARRAY OF TASK STRINGS])]. Task list, no Markdown in arrays. Analyze request: if multi-task, break it down & create Todos BEFORE starting. \`tasks\` & \`markDone\` optional with \`get\`. Use \`get + markDone\` to complete tasks, or \`create + markDone\` to create completed tasks. **UPDATE EVERY TURN**${enableSubAgents ? '\n9. [tool:functions.Await(time="seconds")]. For waiting without exiting agent loop, 15s - 180s' : ""}
6722
+ 8. [tool:functions.Todo(method="create/append/get", tasks=[ARRAY OF STRINGS], markDone=[ARRAY OF TASKS])]. Task list, no Markdown in arrays. Analyze request: if long multi-task, break it down & create Todos BEFORE starting. \`tasks\` & \`markDone\` optional with \`get\`. Use \`get + markDone\` to complete tasks, or \`create + markDone\` to create completed tasks. **UPDATE EVERY TURN**${enableSubAgents ? '\n9. [tool:functions.Await(time="seconds")]. For waiting without exiting agent loop, 15s - 180s' : ""}
6708
6723
  ${_cachedAdvanceRollback ? `
6709
6724
  - EMERGENCY SAFETY TOOLS -
6710
- Info: \`initial\` = user prompt for current task. Revert \`id\` = turn BEFORE the disaster tool (e.g. disaster:\`turn_3\` \u2192 revert:\`turn_2\`). Reason explicitly if needed.
6725
+ Info: \`initial\` = user prompt for current task. Revert \`id\` = turn BEFORE the disaster tool (e.g. disaster:\`turn_3\` \u2192 revert:\`turn_2\`). Reason explicitly
6711
6726
  1. [tool:functions.EmergencyRollback(method="getCheckpoint/forceRevert", id="...")]. Rollback workspace to a checkpoint in THIS agent loop.
6712
6727
  Use ONLY for catastrophic/codebase corruption. Before ending loop, verify no catastrophe. \`id\` not required with \`getCheckPoint\`.
6713
6728
  ` : ""}${enableSubAgents ? `
@@ -8079,9 +8094,9 @@ var init_thinking_prompts = __esm({
8079
8094
  "src/data/thinking_prompts.json"() {
8080
8095
  thinking_prompts_default = {
8081
8096
  xHigh: "EFFORT LEVEL: HIGH\nChallenge assumptions. Verify before concluding\nPrefer the simplest correct solution\nAssess architecture, scalability & trade-offs\nVerify dependencies, regressions, failure modes & modularity\nPlan implementation: files, modules, interfaces & tests\nRULES:\n- Continuous analytical flow\n- Verify via first principles\n- Actively seek failure paths\n- Verify imports & system stability, avoid syntax errors, recheck tool results\n- MANDATORY THINKING: Full technical verification",
8082
- High: "EFFORT LEVEL: HIGH\nThink in a rigorous monologue within <think>...</think>\nPrefer the simplest correct solution\nAssess architecture, performance & maintainability\nVerify error handling, assumptions, edge cases, dependencies & regressions\nPlan: files, functions, logic & interactions\nRULES:\n- Continuous analytical flow\n- Verify via first principles\n- Actively seek failure paths\n- Verify imports & system stability, avoid syntax errors, recheck tool results\n- MANDATORY THINKING: Full technical verification",
8083
- Medium: "EFFORT LEVEL: MEDIUM\nThink in a focused, technical monologue within <think>...</think>\nFind the simplest solution meeting requirements\nScan for missing error handling, invalid assumptions, edge cases & dependencies\nVerify cohesive, modular changes\nOutline changes: files, functions & key logic\nRULES:\n- Clean logical flow\n- Efficient, deliberate, implementation-focused\n- Verify imports & system stability, avoid syntax errors, recheck tool results\n- MANDATORY THINKING: Brief verification for technical tasks/greetings",
8084
- Minimal: "EFFORT LEVEL: LOW\nThink in a quick, focused monologue within <think>...</think>. Verify Basics:\nConfirm intent & complexity\nIdentify required tools/files/actions\nVerify before acting\nRULES:\n- Brief thoughts\n- Think only enough to avoid obvious mistakes\n- Verify imports & system stability, avoid syntax errors, recheck tool results",
8097
+ High: "EFFORT LEVEL: HIGH\nThink in a rigorous monologue\nPrefer the simplest correct solution\nAssess architecture, performance & maintainability\nVerify error handling, assumptions, edge cases, dependencies & regressions\nPlan: files, functions, logic & interactions\nRULES:\n- Continuous analytical flow\n- Verify via first principles\n- Actively seek failure paths\n- Verify imports & system stability, avoid syntax errors, recheck tool results\n- MANDATORY THINKING: Full technical verification",
8098
+ Medium: "EFFORT LEVEL: MEDIUM\nThink in a focused, technical monologue\nFind the simplest solution meeting requirements\nScan for missing error handling, invalid assumptions, edge cases & dependencies\nVerify cohesive, modular changes\nOutline changes: files, functions & key logic\nRULES:\n- Clean logical flow\n- Efficient, deliberate, implementation-focused\n- Verify imports & system stability, avoid syntax errors, recheck tool results\n- MANDATORY THINKING: Brief verification for technical tasks/greetings",
8099
+ Minimal: "EFFORT LEVEL: LOW\nThink in a quick, focused monologue. Verify Basics:\nConfirm intent & complexity\nIdentify required tools/files/actions\nVerify before acting\nRULES:\n- Brief thoughts\n- Think only enough to avoid obvious mistakes\n- Verify imports & system stability, avoid syntax errors, recheck tool results",
8085
8100
  Off: "EFFORT LEVEL: LOWEST\nNo thinking. Immediate response\nRULES:\n- Verify imports & system stability, avoid syntax errors, recheck tool results"
8086
8101
  };
8087
8102
  }
@@ -8211,18 +8226,18 @@ Check these first; These Files > Training Data. Safety rules apply
8211
8226
  const projectContextBlock = cachedProjectContextBlock;
8212
8227
  return `=== SYSTEM PROMPT ===
8213
8228
  Identity: Flux Flow. Sassy, CLI Agent
8214
- ${mode === "Flux" ? "Logical, detailed, task-driven. Prioritize scalable file/folder structure, modular architecture, clean abstractions, stepwise execution. Use latest industry-standard practices/libraries, clean code, verify imports, run automated tests" : `Mode: ${mode}. Concise, Conversational, Sassy, Friendly, Humorous, Sarcastic`}
8229
+ ${mode === "Flux" ? "Logical, detailed, task-driven. Prioritize scalable project structure, modular architecture, clean abstractions, stepwise execution. Use latest industry-standard practices/libraries, clean code, verify imports, run automated tests" : `Mode: ${mode}. Concise, Conversational, Sassy, Friendly, Humorous, Sarcastic`}
8215
8230
 
8216
8231
  -- THINKING GUIDANCE --
8217
8232
  ${aiProvider === "Mistral" || aiProvider === "Google" && !isGemini ? `${thinkingConfig}
8218
8233
  ${forcedReasoning || thinkingLevel !== "Fast" && (aiProvider === "Mistral" || thinkingLevel !== "xHigh" && !isGemini) ? `CRITICAL THINKING POLICY
8219
- - Use <think> ... </think> before responding, even with simple queries/greetings
8234
+ - Use <think> ... </think> for reasoning before responding, even with simple queries/greetings
8220
8235
  ` : ""}` : `${thinkingConfig}
8221
8236
  `}
8222
8237
  ${TOOL_PROTOCOL(mode, osDetected, aiProvider.toLowerCase() === "deepseek" ? false : isMultiModal, aiProvider, systemSettings?.advanceRollback, systemSettings?.subAgents !== false)}
8223
8238
  ${projectContextBlock}${isMemoryEnabled ? `
8224
8239
  -- MEMORY RULES --
8225
- - Subtly Personalize with RELEVENT & CONTEXTUAL MEMORIES. Auto Saves` : ""}
8240
+ - Subtly Personalize with RELEVENT CONTEXTUAL MEMORIES. Auto Saves` : ""}
8226
8241
  - RELATIVE TIME REFERENCE eg. few mins ago
8227
8242
 
8228
8243
  -- SECURITY RULES --
@@ -8231,7 +8246,7 @@ ${projectContextBlock}${isMemoryEnabled ? `
8231
8246
  -- CHAT FORMATTING --
8232
8247
  - GFM Markdown
8233
8248
  - Same Language as User Query
8234
- - Before tool calls, emit one brief status line. After tool calls, emit no further text this turn
8249
+ - Before tool calls, emit one brief current update. After tool calls, emit no further text this turn
8235
8250
  - On completion: summarize changes (why) + edited files${mode === "Flux" ? "" : "\n- Use Kaomojis HEAVILY"}
8236
8251
  === END SYSTEM PROMPT ===
8237
8252
 
@@ -8552,8 +8567,11 @@ var init_history = __esm({
8552
8567
  } catch (e) {
8553
8568
  }
8554
8569
  const extractPrompt = (msg) => {
8555
- if (!msg || !msg.text) return void 0;
8556
- const text = msg.text.replace(/\s*\n+\s*\[Prompted on:.*?\]/g, "").trim();
8570
+ if (!msg) return void 0;
8571
+ const rawText = typeof msg === "string" ? msg : msg.text || msg.content || "";
8572
+ if (!rawText || typeof rawText !== "string") return void 0;
8573
+ let text = rawText.replace(/\s*\n+\s*\[Prompted on:.*?\]/g, "").replace(/\[\/?(?:STEERING HINT|QUESTION)(?::\s*\w+)?\]/gi, "").trim();
8574
+ if (!text) return void 0;
8557
8575
  const words = text.split(/\s+/);
8558
8576
  let prompt2 = void 0;
8559
8577
  if (words.length > 7) {
@@ -8569,16 +8587,18 @@ var init_history = __esm({
8569
8587
  const userMessages = persistentMessages.filter((m) => m.role === "user");
8570
8588
  const firstUserMsg = userMessages[0];
8571
8589
  const latestUserMsg = userMessages[userMessages.length - 1];
8590
+ const extractedLatest = extractPrompt(latestUserMsg);
8591
+ const extractedFirst = extractPrompt(firstUserMsg);
8572
8592
  if (existingChat && existingChat.prompt) {
8573
- if (Math.random() < 0.95) {
8574
- prompt = extractPrompt(latestUserMsg) || existingChat.prompt;
8593
+ if (Math.random() < 0.8 && extractedLatest) {
8594
+ prompt = extractedLatest;
8575
8595
  } else {
8576
8596
  prompt = existingChat.prompt;
8577
8597
  }
8578
8598
  } else {
8579
- prompt = extractPrompt(firstUserMsg);
8599
+ prompt = extractedFirst || extractedLatest;
8580
8600
  }
8581
- const finalName = name || (existingChat ? existingChat.name : prompt || `Session ${id.slice(-6)}`);
8601
+ const finalName = name || (existingChat ? existingChat.name : `Session ${id.slice(-6)}`);
8582
8602
  const chatFile = path8.join(HISTORY_DIR, `${id}.json`);
8583
8603
  writeEncryptedJson(chatFile, persistentMessages);
8584
8604
  history[id] = {
@@ -9928,8 +9948,17 @@ var init_web_scrape = __esm({
9928
9948
  init_paths();
9929
9949
  init_puppeteer_helper();
9930
9950
  web_scrape = async (args) => {
9931
- const urlMatch = args.match(/url\s*=\s*["'](.*)["']/);
9932
- const url = urlMatch ? urlMatch[1] : args;
9951
+ let rawUrl = args;
9952
+ if (typeof args === "object" && args !== null) {
9953
+ rawUrl = args.url || args.targetUrl || args.href || "";
9954
+ } else if (typeof args === "string") {
9955
+ const urlMatch = args.match(/url\s*=\s*["'](.*)["']/);
9956
+ rawUrl = urlMatch ? urlMatch[1] : args;
9957
+ }
9958
+ const url = typeof rawUrl === "string" ? rawUrl.trim() : "";
9959
+ if (!url) {
9960
+ return "ERROR: No target URL provided.";
9961
+ }
9933
9962
  const maxRetries = 3;
9934
9963
  let lastError = null;
9935
9964
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
@@ -10334,12 +10363,171 @@ ${diffText}`;
10334
10363
  // src/tools/read_folder.js
10335
10364
  import fs17 from "fs";
10336
10365
  import path16 from "path";
10337
- var read_folder;
10366
+ var EXCLUDED_DIRS, isExcludedDir, read_folder;
10338
10367
  var init_read_folder = __esm({
10339
10368
  "src/tools/read_folder.js"() {
10340
10369
  init_arg_parser();
10370
+ EXCLUDED_DIRS = /* @__PURE__ */ new Set([
10371
+ // Version control, package managers & build clutter
10372
+ ".git",
10373
+ "node_modules",
10374
+ ".gemini",
10375
+ "dist",
10376
+ "build",
10377
+ ".next",
10378
+ "out",
10379
+ ".cache",
10380
+ "bin",
10381
+ "obj",
10382
+ "vendor",
10383
+ "venv",
10384
+ ".idea",
10385
+ ".gradle",
10386
+ ".terraform",
10387
+ "target",
10388
+ "coverage",
10389
+ ".vscode",
10390
+ ".svn",
10391
+ ".hg",
10392
+ ".fslckout",
10393
+ ".github",
10394
+ ".gitlab",
10395
+ ".circleci",
10396
+ ".gitea",
10397
+ ".gitee",
10398
+ ".lerna",
10399
+ ".changeset",
10400
+ ".nx",
10401
+ ".npm",
10402
+ ".yarn",
10403
+ ".pnpm-store",
10404
+ ".expo",
10405
+ ".nuxt",
10406
+ ".svelte-kit",
10407
+ ".docusaurus",
10408
+ ".turbo",
10409
+ ".vercel",
10410
+ "bower_components",
10411
+ ".netlify",
10412
+ ".vuepress",
10413
+ ".quasar",
10414
+ ".output",
10415
+ ".angular",
10416
+ "jspm_packages",
10417
+ ".parcel-cache",
10418
+ ".rollup.cache",
10419
+ ".rspack",
10420
+ ".vitepress",
10421
+ "__pycache__",
10422
+ ".pytest_cache",
10423
+ ".mypy_cache",
10424
+ ".tox",
10425
+ ".poetry",
10426
+ "env",
10427
+ "vhdl",
10428
+ ".ipynb_checkpoints",
10429
+ ".jupyter",
10430
+ ".conda",
10431
+ ".pdm-build",
10432
+ ".bundle",
10433
+ ".yardoc",
10434
+ ".metadata",
10435
+ "App_Data",
10436
+ "ClientBin",
10437
+ ".cargo",
10438
+ ".rustc_info",
10439
+ ".go",
10440
+ "Godeps",
10441
+ "_vendor",
10442
+ ".rake_tasks",
10443
+ "CMakefiles",
10444
+ ".wakatime",
10445
+ ".dart_tool",
10446
+ ".fvm",
10447
+ ".cocoapods",
10448
+ "Pods",
10449
+ ".pub-cache",
10450
+ ".symlinks",
10451
+ "DerivedData",
10452
+ ".xcworkspace",
10453
+ ".serverless",
10454
+ ".aws",
10455
+ ".gcloud",
10456
+ ".azure",
10457
+ ".kube",
10458
+ ".vagrant",
10459
+ ".docker",
10460
+ "postgres-data",
10461
+ "redis-data",
10462
+ "mongo-data",
10463
+ ".Spotlight-V100",
10464
+ ".Trashes",
10465
+ "$RECYCLE.BIN",
10466
+ "System Volume Information",
10467
+ ".DocumentRevisions-V100",
10468
+ ".fseventsd",
10469
+ "AppData",
10470
+ "Application Data",
10471
+ "Local",
10472
+ "LocalLow",
10473
+ "Roaming",
10474
+ "$WinREAgent",
10475
+ "$WINDOWS.~BT",
10476
+ "$WINDOWS.~WS",
10477
+ "scw",
10478
+ "System32",
10479
+ "SysWOW64",
10480
+ ".AppleDouble",
10481
+ ".AppleDB",
10482
+ ".AppleDesktop",
10483
+ "_CodeSignature",
10484
+ ".cmio",
10485
+ ".LSOverride",
10486
+ ".localized",
10487
+ ".TemporaryItems",
10488
+ ".Trash",
10489
+ ".Trash-0",
10490
+ ".Trash-1000",
10491
+ ".gvfs",
10492
+ ".local",
10493
+ ".config",
10494
+ ".dbus",
10495
+ ".fontconfig",
10496
+ ".snap",
10497
+ ".var",
10498
+ ".lost+found",
10499
+ "lost+found",
10500
+ ".thumb",
10501
+ ".thumbnails",
10502
+ "EFI",
10503
+ "boot",
10504
+ "grub",
10505
+ "logs",
10506
+ "log",
10507
+ ".nyc_output",
10508
+ ".sonar",
10509
+ ".ruff_cache",
10510
+ ".VSCodeCounter"
10511
+ ]);
10512
+ isExcludedDir = (dirName) => EXCLUDED_DIRS.has(dirName) || dirName.startsWith(".pnpm");
10341
10513
  read_folder = async (args) => {
10342
- const { path: targetPath = "." } = parseArgs(args);
10514
+ const parsed = parseArgs(args);
10515
+ const targetPath = parsed.path || null;
10516
+ if (!targetPath) {
10517
+ return "ERROR: No directory path provided.";
10518
+ }
10519
+ let recurseDepth = 0;
10520
+ if (parsed.recurse !== void 0 && parsed.recurse !== null) {
10521
+ if (typeof parsed.recurse === "number") {
10522
+ recurseDepth = parsed.recurse;
10523
+ } else if (typeof parsed.recurse === "boolean") {
10524
+ recurseDepth = parsed.recurse ? 1 : 0;
10525
+ } else {
10526
+ const val = parseInt(String(parsed.recurse).trim(), 10);
10527
+ recurseDepth = isNaN(val) ? 0 : val;
10528
+ }
10529
+ }
10530
+ recurseDepth = Math.max(0, Math.min(5, recurseDepth));
10343
10531
  const absolutePath = path16.resolve(process.cwd(), targetPath);
10344
10532
  try {
10345
10533
  if (!fs17.existsSync(absolutePath)) {
@@ -10347,52 +10535,139 @@ var init_read_folder = __esm({
10347
10535
  }
10348
10536
  const stats = fs17.statSync(absolutePath);
10349
10537
  if (!stats.isDirectory()) {
10350
- return `ERROR: Path [${targetPath}] is a file, not a directory. Use view_file instead.`;
10351
- }
10352
- const files = fs17.readdirSync(absolutePath);
10353
- const totalItems = files.length;
10354
- const maxDisplay = 100;
10355
- const displayItems = files.slice(0, maxDisplay);
10356
- const folderData = [];
10357
- for (const file of displayItems) {
10358
- const fPath = path16.join(absolutePath, file);
10359
- let indicator = "\u{1F4C4}";
10360
- let info = { name: file, type: "unknown", size: "N/A", mtime: "N/A" };
10538
+ return `ERROR: Path [${targetPath}] is a file, not a directory. Use ReadFile instead.`;
10539
+ }
10540
+ if (recurseDepth === 0) {
10541
+ const files = fs17.readdirSync(absolutePath);
10542
+ const totalItems = files.length;
10543
+ const maxDisplay = 150;
10544
+ const displayItems = files.slice(0, maxDisplay);
10545
+ const folderData = [];
10546
+ for (const file of displayItems) {
10547
+ const fPath = path16.join(absolutePath, file);
10548
+ let info = { name: file, type: "unknown", size: "N/A", mtime: "N/A" };
10549
+ try {
10550
+ const fStats = fs17.statSync(fPath);
10551
+ info = {
10552
+ name: file,
10553
+ type: fStats.isDirectory() ? "directory" : "file",
10554
+ size: (fStats.size / 1024).toFixed(1) + " KB",
10555
+ mtime: fStats.mtime.toLocaleString()
10556
+ };
10557
+ } catch (e) {
10558
+ info.type = "inaccessible";
10559
+ }
10560
+ folderData.push(info);
10561
+ }
10562
+ const formatted = folderData.map((f) => {
10563
+ const indicator = f.type === "directory" ? "\u{1F4C1}" : f.type === "file" ? "\u{1F4C4}" : "\u2753";
10564
+ if (f.type === "directory") {
10565
+ return `${indicator} ${f.name} - [DIR] - [Modified: ${f.mtime}]`;
10566
+ }
10567
+ return `${indicator} ${f.name} - [Size: ${f.size}] - [Modified: ${f.mtime}]`;
10568
+ }).join("\n");
10569
+ let footer2 = `
10570
+
10571
+ (Total items in folder: ${totalItems})`;
10572
+ if (totalItems > maxDisplay) {
10573
+ footer2 = `
10574
+
10575
+ \u26A0\uFE0F TRUNCATED: Showing first ${maxDisplay} of ${totalItems} items.`;
10576
+ }
10577
+ files.length = 0;
10578
+ displayItems.length = 0;
10579
+ folderData.length = 0;
10580
+ return `Detailed folder stats for [${targetPath}]:
10581
+
10582
+ ${formatted}${footer2}`;
10583
+ }
10584
+ let totalDirectories = 0;
10585
+ let totalFiles = 0;
10586
+ let totalItemsScanned = 0;
10587
+ const maxTotalItems = 500;
10588
+ let truncated = false;
10589
+ const buildTree = (dirPath, currentDepth, prefix = "") => {
10590
+ if (currentDepth > recurseDepth + 1 || truncated) return [];
10591
+ let entries = [];
10361
10592
  try {
10362
- const fStats = fs17.statSync(fPath);
10363
- info = {
10364
- name: file,
10365
- type: fStats.isDirectory() ? "directory" : "file",
10366
- size: (fStats.size / 1024).toFixed(1) + " KB",
10367
- mtime: fStats.mtime.toLocaleString()
10368
- };
10593
+ entries = fs17.readdirSync(dirPath);
10369
10594
  } catch (e) {
10370
- info.type = "inaccessible";
10595
+ return [`${prefix}\u26A0\uFE0F [Inaccessible Directory]`];
10371
10596
  }
10372
- folderData.push(info);
10373
- }
10374
- const formatted = folderData.map((f) => {
10375
- const indicator = f.type === "directory" ? "\u{1F4C1}" : f.type === "file" ? "\u{1F4C4}" : "\u2753";
10376
- if (f.type === "directory") {
10377
- return `${indicator} ${f.name} - [DIR] - [Modified: ${f.mtime}]`;
10597
+ const sortedEntries = [];
10598
+ for (const name of entries) {
10599
+ const fullPath = path16.join(dirPath, name);
10600
+ let isDir = false;
10601
+ try {
10602
+ isDir = fs17.statSync(fullPath).isDirectory();
10603
+ } catch (e) {
10604
+ }
10605
+ sortedEntries.push({ name, fullPath, isDir });
10378
10606
  }
10379
- return `${indicator} ${f.name} - [Size: ${f.size}] - [Modified: ${f.mtime}]`;
10380
- }).join("\n");
10607
+ sortedEntries.sort((a, b) => {
10608
+ if (a.isDir && !b.isDir) return -1;
10609
+ if (!a.isDir && b.isDir) return 1;
10610
+ return a.name.localeCompare(b.name);
10611
+ });
10612
+ const lines = [];
10613
+ const count = sortedEntries.length;
10614
+ for (let i = 0; i < count; i++) {
10615
+ if (totalItemsScanned >= maxTotalItems) {
10616
+ truncated = true;
10617
+ lines.push(`${prefix}\u26A0\uFE0F [Truncated - Maximum item limit reached (${maxTotalItems})]`);
10618
+ break;
10619
+ }
10620
+ const item = sortedEntries[i];
10621
+ const isLast = i === count - 1;
10622
+ const connector = isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
10623
+ const childPrefix = prefix + (isLast ? " " : "\u2502 ");
10624
+ totalItemsScanned++;
10625
+ let itemType = "unknown";
10626
+ let sizeStr = "N/A";
10627
+ let mtimeStr = "N/A";
10628
+ try {
10629
+ const fStats = fs17.statSync(item.fullPath);
10630
+ if (fStats.isDirectory()) {
10631
+ itemType = "directory";
10632
+ mtimeStr = fStats.mtime.toLocaleString();
10633
+ totalDirectories++;
10634
+ } else {
10635
+ itemType = "file";
10636
+ sizeStr = (fStats.size / 1024).toFixed(1) + " KB";
10637
+ mtimeStr = fStats.mtime.toLocaleString();
10638
+ totalFiles++;
10639
+ }
10640
+ } catch (e) {
10641
+ itemType = "inaccessible";
10642
+ }
10643
+ const indicator = itemType === "directory" ? "\u{1F4C1}" : itemType === "file" ? "\u{1F4C4}" : "\u2753";
10644
+ let lineText = "";
10645
+ if (itemType === "directory") {
10646
+ lineText = `${prefix}${connector}${indicator} ${item.name} - [DIR] - [Modified: ${mtimeStr}]`;
10647
+ } else {
10648
+ lineText = `${prefix}${connector}${indicator} ${item.name} - [Size: ${sizeStr}] - [Modified: ${mtimeStr}]`;
10649
+ }
10650
+ lines.push(lineText);
10651
+ if (itemType === "directory" && currentDepth <= recurseDepth && !isExcludedDir(item.name)) {
10652
+ const childLines = buildTree(item.fullPath, currentDepth + 1, childPrefix);
10653
+ lines.push(...childLines);
10654
+ }
10655
+ }
10656
+ return lines;
10657
+ };
10658
+ const treeLines = buildTree(absolutePath, 1, "");
10659
+ const formattedTree = treeLines.join("\n");
10381
10660
  let footer = `
10382
10661
 
10383
- (Total items in folder: ${totalItems})`;
10384
- if (totalItems > maxDisplay) {
10662
+ (Total items scanned: ${totalItemsScanned}, Directories: ${totalDirectories}, Files: ${totalFiles})`;
10663
+ if (truncated) {
10385
10664
  footer = `
10386
10665
 
10387
- \u26A0\uFE0F TRUNCATED: Showing first ${maxDisplay} of ${totalItems} items.`;
10666
+ \u26A0\uFE0F TRUNCATED: Scan capped at ${maxTotalItems} items. (Directories: ${totalDirectories}, Files: ${totalFiles})`;
10388
10667
  }
10389
- const result = `Detailed folder stats for [${targetPath}]:
10668
+ return `Detailed directory tree for [${targetPath}] (recurse depth: ${recurseDepth}):
10390
10669
 
10391
- ${formatted}${footer}`;
10392
- files.length = 0;
10393
- displayItems.length = 0;
10394
- folderData.length = 0;
10395
- return result;
10670
+ ${formattedTree}${footer}`;
10396
10671
  } catch (err) {
10397
10672
  const errorMsg = err instanceof Error ? err.message : String(err);
10398
10673
  return `ERROR: Failed to read folder [${targetPath}]: ${errorMsg}`;
@@ -10677,7 +10952,14 @@ async function getFilesRecursively(dir, excludes, baseDir = dir, depth = 1) {
10677
10952
  const fullPath = path19.join(dir, file.name);
10678
10953
  const relativePath = path19.relative(baseDir, fullPath);
10679
10954
  const pathSegments = relativePath.split(path19.sep).map((s) => s.toLowerCase());
10680
- const isExcluded = excludes.some((ex) => pathSegments.includes(ex.toLowerCase()));
10955
+ const fileNameLower = file.name.toLowerCase();
10956
+ const isExcluded = excludes.some((ex) => {
10957
+ const exLower = ex.toLowerCase();
10958
+ if (exLower.startsWith(".") && fileNameLower.endsWith(exLower)) {
10959
+ return true;
10960
+ }
10961
+ return pathSegments.some((seg) => seg === exLower || seg.startsWith(".pnpm"));
10962
+ });
10681
10963
  if (isExcluded) continue;
10682
10964
  if (file.isDirectory()) {
10683
10965
  const nestedFiles = await getFilesRecursively(fullPath, excludes, baseDir, depth + 1);
@@ -10729,46 +11011,195 @@ var init_search_keyword = __esm({
10729
11011
  const keyword = String(rawKeyword);
10730
11012
  const toBool = (v) => v === true || v === "true" || v === 1 || v === "1" || v === "yes";
10731
11013
  const regexExplicitlyFalse = regex === false || regex === "false" || regex === 0 || regex === "0" || regex === "no";
10732
- let matchRegex = toBool(regex);
10733
- let matchSubstring = !matchRegex && toBool(subString);
10734
- const hasRegexIndicators = /[|]/.test(keyword) || /\\([*+?{}()|[\]\^$])/.test(keyword) || (() => {
10735
- const stripped = keyword.replace(/\\./g, "");
10736
- return /[*+?{}()|]/.test(stripped) || /\[.*?\]/.test(stripped) || /^\^/.test(stripped) || /\$/.test(stripped);
10737
- })();
10738
- let isAutoRegex = true;
10739
- if (!matchRegex && !regexExplicitlyFalse && hasRegexIndicators) {
10740
- matchRegex = true;
10741
- isAutoRegex = true;
10742
- }
11014
+ const regexExplicitlyTrue = regex === true || regex === "true" || regex === 1 || regex === "1" || regex === "yes";
11015
+ let matchSubstring = regexExplicitlyFalse && toBool(subString);
11016
+ let regexPattern = null;
11017
+ let wordRegex = null;
10743
11018
  if (regexExplicitlyFalse) {
10744
- matchRegex = false;
10745
- isAutoRegex = false;
10746
- }
10747
- let regexPattern;
10748
- let wordRegex;
10749
- if (matchRegex) {
11019
+ if (!matchSubstring) {
11020
+ wordRegex = new RegExp(`(?<![\\w])${keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?![\\w])`, "i");
11021
+ }
11022
+ } else {
10750
11023
  try {
10751
11024
  regexPattern = new RegExp(keyword, "i");
10752
11025
  } catch (e) {
10753
- return `ERROR: Invalid regex pattern "${keyword}": ${e.message}`;
11026
+ if (regexExplicitlyTrue) {
11027
+ return `ERROR: Invalid regex pattern "${keyword}": ${e.message}`;
11028
+ }
10754
11029
  }
10755
- } else {
10756
11030
  wordRegex = new RegExp(`(?<![\\w])${keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?![\\w])`, "i");
10757
11031
  }
10758
11032
  const excludes = [
10759
- "node_modules",
11033
+ // Clutter, VCS, Cache & Build Directories
10760
11034
  ".git",
11035
+ "node_modules",
11036
+ ".gemini",
10761
11037
  "dist",
11038
+ "build",
10762
11039
  ".next",
10763
- ".gemini",
11040
+ "out",
11041
+ ".cache",
11042
+ "bin",
11043
+ "obj",
11044
+ "vendor",
11045
+ "venv",
11046
+ ".idea",
11047
+ ".gradle",
11048
+ ".terraform",
11049
+ "target",
11050
+ "coverage",
11051
+ ".vscode",
11052
+ ".svn",
11053
+ ".hg",
11054
+ ".fslckout",
11055
+ ".github",
11056
+ ".gitlab",
11057
+ ".circleci",
11058
+ ".gitea",
11059
+ ".gitee",
11060
+ ".lerna",
11061
+ ".changeset",
11062
+ ".nx",
11063
+ ".npm",
11064
+ ".yarn",
11065
+ ".pnpm-store",
11066
+ ".pnpm",
11067
+ ".expo",
11068
+ ".nuxt",
11069
+ ".svelte-kit",
11070
+ ".docusaurus",
11071
+ ".turbo",
11072
+ ".vercel",
11073
+ "bower_components",
11074
+ ".netlify",
11075
+ ".vuepress",
11076
+ ".quasar",
11077
+ ".output",
11078
+ ".angular",
11079
+ "jspm_packages",
11080
+ ".parcel-cache",
11081
+ ".rollup.cache",
11082
+ ".rspack",
11083
+ ".vitepress",
11084
+ "__pycache__",
11085
+ ".pytest_cache",
11086
+ ".mypy_cache",
11087
+ ".tox",
11088
+ ".poetry",
11089
+ "env",
11090
+ "vhdl",
11091
+ ".ipynb_checkpoints",
11092
+ ".jupyter",
11093
+ ".conda",
11094
+ ".pdm-build",
11095
+ ".bundle",
11096
+ ".yardoc",
11097
+ ".metadata",
11098
+ "App_Data",
11099
+ "ClientBin",
11100
+ ".cargo",
11101
+ ".rustc_info",
11102
+ ".go",
11103
+ "Godeps",
11104
+ "_vendor",
11105
+ ".rake_tasks",
11106
+ "CMakefiles",
11107
+ ".wakatime",
11108
+ ".dart_tool",
11109
+ ".fvm",
11110
+ ".cocoapods",
11111
+ "Pods",
11112
+ ".pub-cache",
11113
+ ".symlinks",
11114
+ "DerivedData",
11115
+ ".xcworkspace",
11116
+ ".serverless",
11117
+ ".aws",
11118
+ ".gcloud",
11119
+ ".azure",
11120
+ ".kube",
11121
+ ".vagrant",
11122
+ ".docker",
11123
+ "postgres-data",
11124
+ "redis-data",
11125
+ "mongo-data",
11126
+ ".Spotlight-V100",
11127
+ ".Trashes",
11128
+ "$RECYCLE.BIN",
11129
+ "System Volume Information",
11130
+ ".DocumentRevisions-V100",
11131
+ ".fseventsd",
11132
+ "AppData",
11133
+ "Application Data",
11134
+ "Local",
11135
+ "LocalLow",
11136
+ "Roaming",
11137
+ "$WinREAgent",
11138
+ "$WINDOWS.~BT",
11139
+ "$WINDOWS.~WS",
11140
+ "scw",
11141
+ "System32",
11142
+ "SysWOW64",
11143
+ ".AppleDouble",
11144
+ ".AppleDB",
11145
+ ".AppleDesktop",
11146
+ "_CodeSignature",
11147
+ ".cmio",
11148
+ ".LSOverride",
11149
+ ".localized",
11150
+ ".TemporaryItems",
11151
+ ".Trash",
11152
+ ".Trash-0",
11153
+ ".Trash-1000",
11154
+ ".gvfs",
11155
+ ".local",
11156
+ ".config",
11157
+ ".dbus",
11158
+ ".fontconfig",
11159
+ ".snap",
11160
+ ".var",
11161
+ ".lost+found",
11162
+ "lost+found",
11163
+ ".thumb",
11164
+ ".thumbnails",
11165
+ "EFI",
11166
+ "boot",
11167
+ "grub",
11168
+ "logs",
11169
+ "log",
11170
+ ".nyc_output",
11171
+ ".sonar",
11172
+ ".ruff_cache",
11173
+ ".VSCodeCounter",
11174
+ // Binaries, Media, Compressed & Font Files
10764
11175
  ".exe",
10765
11176
  ".dll",
11177
+ ".so",
11178
+ ".dylib",
10766
11179
  ".png",
10767
11180
  ".jpg",
10768
11181
  ".jpeg",
10769
11182
  ".gif",
11183
+ ".ico",
11184
+ ".svg",
11185
+ ".webp",
11186
+ ".mp3",
11187
+ ".mp4",
11188
+ ".avi",
10770
11189
  ".zip",
10771
- ".tgz"
11190
+ ".tgz",
11191
+ ".tar",
11192
+ ".gz",
11193
+ ".7z",
11194
+ ".rar",
11195
+ ".pdf",
11196
+ ".docx",
11197
+ ".xlsx",
11198
+ ".pptx",
11199
+ ".woff",
11200
+ ".woff2",
11201
+ ".ttf",
11202
+ ".eot"
10772
11203
  ];
10773
11204
  const maxMatches = 150;
10774
11205
  try {
@@ -10802,7 +11233,7 @@ var init_search_keyword = __esm({
10802
11233
  const lines = content.split(/\r?\n/);
10803
11234
  const fileMatches = [];
10804
11235
  for (let i = 0; i < lines.length; i++) {
10805
- const matched = matchRegex ? regexPattern.test(lines[i]) : matchSubstring ? lines[i].toLowerCase().includes(keyword.toLowerCase()) || fuzzyMatch(lines[i], keyword) : wordRegex.test(lines[i]);
11236
+ const matched = regexExplicitlyFalse ? matchSubstring ? lines[i].toLowerCase().includes(keyword.toLowerCase()) || fuzzyMatch(lines[i], keyword) : wordRegex && wordRegex.test(lines[i]) : regexPattern && regexPattern.test(lines[i]) || wordRegex && wordRegex.test(lines[i]);
10806
11237
  if (matched) {
10807
11238
  fileMatches.push({ line: i + 1, content: lines[i].trim() });
10808
11239
  }
@@ -10828,7 +11259,7 @@ var init_search_keyword = __esm({
10828
11259
  if (typeof global.gc === "function") {
10829
11260
  global.gc();
10830
11261
  }
10831
- const modeLabel = matchRegex ? isAutoRegex ? "(regex mode)" : "(keyword mode)" : matchSubstring ? "(subString mode)" : "";
11262
+ const modeLabel = regexExplicitlyFalse ? matchSubstring ? "(subString mode)" : "(keyword mode)" : regexExplicitlyTrue ? "(regex mode)" : "(standard mode)";
10832
11263
  if (fileGroups.length === 0) {
10833
11264
  const zeroLocation = pathArgType === "file" ? ` in '${pathArg}'` : pathArgType === "dir" ? ` in '${pathArg}'` : ". Try to specify files";
10834
11265
  const dirPrefix2 = pathArgType === "dir" ? "[DIR]" : "";
@@ -14612,6 +15043,7 @@ Provide a consolidated summary of the entire session.`;
14612
15043
  ".npm",
14613
15044
  ".yarn",
14614
15045
  ".pnpm-store",
15046
+ ".pnpm",
14615
15047
  ".expo",
14616
15048
  ".nuxt",
14617
15049
  ".svelte-kit",
@@ -14742,7 +15174,7 @@ Provide a consolidated summary of the entire session.`;
14742
15174
  const entries = safeReaddirWithTypes(dir);
14743
15175
  for (const entry of entries) {
14744
15176
  if (currentCount.value > 6200) break;
14745
- if (COLLAPSED_DIRS_GLOBAL.includes(entry.name)) continue;
15177
+ if (COLLAPSED_DIRS_GLOBAL.includes(entry.name) || entry.name.startsWith(".")) continue;
14746
15178
  if (entry.isDirectory()) {
14747
15179
  currentCount.value++;
14748
15180
  countFolders(path25.join(dir, entry.name), currentCount, depth + 1);
@@ -14759,8 +15191,8 @@ Provide a consolidated summary of the entire session.`;
14759
15191
  }
14760
15192
  let result = "";
14761
15193
  const COLLAPSED_DIRS = COLLAPSED_DIRS_GLOBAL;
14762
- const filtered = entries.filter((e) => !COLLAPSED_DIRS.includes(e.name));
14763
- const collapsedInDir = entries.filter((e) => COLLAPSED_DIRS.includes(e.name)).map((e) => e.name).sort();
15194
+ const filtered = entries.filter((e) => !COLLAPSED_DIRS.includes(e.name) && !e.name.startsWith("."));
15195
+ const collapsedInDir = entries.filter((e) => COLLAPSED_DIRS.includes(e.name) || e.name.startsWith(".")).map((e) => e.name).sort();
14764
15196
  filtered.sort((a, b) => {
14765
15197
  if (a.isDirectory() && !b.isDirectory()) return -1;
14766
15198
  if (!a.isDirectory() && b.isDirectory()) return 1;
@@ -15997,10 +16429,10 @@ ${ideErr} [/ERROR]`;
15997
16429
  let label = "";
15998
16430
  if (normToolName === "web_search") {
15999
16431
  const { query, limit = 10, aiMode = false } = parseArgs(toolCall.args);
16000
- label = `\u2714 ${aiMode ? "AI Search" : "Searched"}: ${query}${aiMode === false ? ` \u2192 ${limit}` : ""}`;
16432
+ label = `${query ? "\u2714" : "\u2718"} ${aiMode ? "AI Search" : "Searched"}: ${query ? `${query}` : "No Search Query"}${aiMode === false && query ? ` \u2192 ${limit}` : ""}`;
16001
16433
  } else if (normToolName === "web_scrape") {
16002
- const url = parseArgs(toolCall.args).url || "...";
16003
- label = `\u2714 Visited: ${url}`;
16434
+ const url = parseArgs(toolCall.args).url || null;
16435
+ label = `${url ? "\u2714" : "\u2718"} Visited: ${url ? url : "No Source"}`;
16004
16436
  } else if (normToolName === "view_file") {
16005
16437
  const { path: targetPath2, StartLine, EndLine, start_line, end_line, startLine, endLine } = parseArgs(toolCall.args);
16006
16438
  const rawStart = StartLine || start_line || startLine;
@@ -16019,33 +16451,35 @@ ${ideErr} [/ERROR]`;
16019
16451
  }
16020
16452
  } catch (e) {
16021
16453
  }
16022
- const pathLower = targetPath2.toLowerCase();
16454
+ const pathLower = (targetPath2 || "").toLowerCase();
16023
16455
  const isPdf = pathLower.endsWith(".pdf");
16024
16456
  const isOfficeFile = pathLower.endsWith(".docx") || pathLower.endsWith(".doc") || pathLower.endsWith(".ppt") || pathLower.endsWith(".pptx") || pathLower.endsWith(".xls") || pathLower.endsWith(".xlsx");
16025
16457
  const isImage = /\.(png|jpg|jpeg|webp|gif|bmp)$/.test(pathLower);
16026
16458
  if (isPdf || isOfficeFile) {
16027
- label = `\u2714 Analyzed: ${path25.basename(targetPath2)}`;
16459
+ label = `${targetPath2.length > 0 ? "\u2714" : "\u2718"} ${targetPath2 ? `Analyzed: ${path25.basename(targetPath2)}` : "Analyzed: File Not Found"}`;
16028
16460
  } else if (isImage) {
16029
- label = `\u2714 Processed: ${path25.basename(targetPath2)}`;
16461
+ label = `${targetPath2.length > 0 ? "\u2714" : "\u2718"} ${targetPath2 ? `Processed: ${path25.basename(targetPath2)}` : "Processed: File Not Found"}`;
16030
16462
  } else {
16031
- label = `${totalLines !== "..." ? "\u2714" : "\u2718"} Read: ${path25.basename(targetPath2)} \u2192 ${totalLines !== "..." ? `Lines ${sLine} - ${actualEndLine} of ${totalLines}` : "File Not Found"}`;
16463
+ label = `${totalLines !== "..." ? "\u2714" : "\u2718"} Read: ${targetPath2 ? `${path25.basename(targetPath2)} \u2192 ${totalLines !== "..." ? `Lines ${sLine} - ${actualEndLine} of ${totalLines}` : "File Not Found"}` : "File Not Found"}`;
16032
16464
  }
16033
16465
  } else if (normToolName === "list_files" || normToolName === "read_folder") {
16034
16466
  const action = normToolName === "list_files" ? "List" : "Browsed";
16035
- const path27 = parseArgs(toolCall.args).path;
16036
- label = `\u2714 ${action}: ${path27 === "." ? "./" : path27}`;
16467
+ const path27 = parseArgs(toolCall.args).path || null;
16468
+ const recurse = parseArgs(toolCall.args).recurse || 0;
16469
+ label = `${path27 ? "\u2714" : "\u2718"} ${action}: ${path27 ? `${path27 === "." ? "./" : `${path27}${recurse > 0 ? `${path27.endsWith("/") ? `*${recurse}` : `/*${recurse}`}` : `${path27.endsWith("/") ? "" : "/"}`}`}` : "No Folder Selected"}`;
16037
16470
  } else if (normToolName === "write_file" || normToolName === "update_file") {
16038
16471
  const action = normToolName === "write_file" ? "Created" : "Edited";
16039
- label = `\u2714 ${action}: ${parseArgs(toolCall.args).path || "..."}`;
16472
+ const path27 = parseArgs(toolCall.args).path || null;
16473
+ label = `${path27 ? "\u2714" : "\u2718"} ${action}: ${path27 || "No File Changes"}`;
16040
16474
  } else if (normToolName === "write_pdf") {
16041
- label = `\u2714 Generated: ${parseArgs(toolCall.args).path || "..."}
16042
- `;
16475
+ const path27 = parseArgs(toolCall.args).path || null;
16476
+ label = `${path27 ? "\u2714" : "\u2718"} Generated: ${path27 || "No PDF Generated"}`;
16043
16477
  } else if (normToolName === "write_docx") {
16044
- label = `\u2714 Generated: ${parseArgs(toolCall.args).path || "..."}
16045
- `;
16478
+ const path27 = parseArgs(toolCall.args).path || null;
16479
+ label = `${path27 ? "\u2714" : "\u2718"} Generated: ${path27 || "No Docx Generated"}`;
16046
16480
  } else if (normToolName === "file_map") {
16047
16481
  const path27 = parseArgs(toolCall.args).path;
16048
- label = `${path27 ? "\u2714" : "\u2718"} Indexed${path27 ? ": " + path27 : " File Not Found"}`;
16482
+ label = `${path27 ? "\u2714" : "\u2718"} Indexed: ${path27 ? "" + path27 : "File Not Found"}`;
16049
16483
  } else if (normToolName.toLowerCase() === "search_keyword" || normToolName.toLowerCase() === "todo") {
16050
16484
  label = "";
16051
16485
  } else if (normToolName.toLowerCase() === "generate_image") {
@@ -16230,7 +16664,7 @@ ${ideErr} [/ERROR]`;
16230
16664
  });
16231
16665
  if (isViolating) {
16232
16666
  const denyMsg = `Access Denied. Prohibited from accessing external directories while "External Workspace Access" is disabled.`;
16233
- if (settings.onExecStart) settings.onExecStart(command || "Unknown");
16667
+ if (settings.onExecStart) settings.onExecStart(command || "No Command");
16234
16668
  yield { type: "exec_start" };
16235
16669
  await new Promise((resolve) => setTimeout(resolve, 50));
16236
16670
  if (settings.onExecChunk) settings.onExecChunk(`ERROR: ${denyMsg}`);
@@ -16242,7 +16676,7 @@ ${ideErr} [/ERROR]`;
16242
16676
  continue;
16243
16677
  }
16244
16678
  }
16245
- if (settings.onExecStart) settings.onExecStart(command || "Unknown");
16679
+ if (settings.onExecStart) settings.onExecStart(command || "No Command");
16246
16680
  yield { type: "exec_start" };
16247
16681
  }
16248
16682
  const parsedArgs = parseArgs(toolCall.args);
@@ -16480,15 +16914,14 @@ ${ideErr} [/ERROR]`;
16480
16914
  if (successes.length === 0) {
16481
16915
  const errorMsg = `[TOOL RESULT]: ERROR: Failed to apply patches to [${path25.basename(absPath)}].
16482
16916
  ${failures.map((f) => ` \u2022 ${f.error}`).join("\n")}`;
16483
- const errorLabel = `\u2714 Edited: ${path25.basename(absPath)}`.toUpperCase();
16917
+ const errorLabel = `\u2714 Edited: ${path25.basename(absPath)}`;
16484
16918
  let terminalWidth = 115;
16485
16919
  if (process.stdout.isTTY) {
16486
16920
  terminalWidth = process.stdout.columns - 5 || 120;
16487
16921
  }
16488
16922
  const boxWidth = Math.min(errorLabel.length + 4, terminalWidth);
16489
16923
  const boxMid = `${errorLabel.padEnd(boxWidth - 2).substring(0, boxWidth - 2)}`;
16490
- yield { type: "visual_feedback", content: colorMainWords(`${thisIsFirstToolFeedback ? "\n" : ""}${boxMid}
16491
- `) };
16924
+ yield { type: "visual_feedback", content: colorMainWords(`${thisIsFirstToolFeedback ? "\n" : ""}${boxMid}`) };
16492
16925
  thisIsFirstToolFeedback = false;
16493
16926
  toolResults.push({ role: "user", text: errorMsg });
16494
16927
  await incrementUsage("toolFailure");
@@ -16563,12 +16996,18 @@ ${failures.map((f) => ` \u2022 ${f.error}`).join("\n")}`;
16563
16996
  if (approval === "allow" && diffOpened && isBridgeConnected()) {
16564
16997
  const { path: filePath } = parseArgs(toolCall.args);
16565
16998
  const absPath = path25.resolve(process.cwd(), filePath);
16999
+ const normPath = (p) => p ? path25.resolve(p).replace(/\\/g, "/").toLowerCase() : "";
16566
17000
  const finalIDE = await getIDEContext();
16567
17001
  let finalContent = "";
16568
- if (finalIDE && finalIDE.file_focused === absPath && finalIDE.full_content) {
17002
+ if (finalIDE && finalIDE.file_focused && normPath(finalIDE.file_focused) === normPath(absPath) && finalIDE.full_content) {
16569
17003
  finalContent = finalIDE.full_content;
16570
- } else if (fs26.existsSync(absPath)) {
17004
+ }
17005
+ if (!finalContent && fs26.existsSync(absPath)) {
16571
17006
  finalContent = fs26.readFileSync(absPath, "utf8");
17007
+ if (!finalContent) {
17008
+ await new Promise((r) => setTimeout(r, 100));
17009
+ finalContent = fs26.readFileSync(absPath, "utf8");
17010
+ }
16572
17011
  }
16573
17012
  const verifiedLines = finalContent.split(/\r?\n/);
16574
17013
  const verifiedLineCount = verifiedLines.length;
@@ -16627,20 +17066,17 @@ ${tail}`;
16627
17066
 
16628
17067
  - Stats: [${verifiedLineCount2} lines, ${(verifiedSize2 / 1024).toFixed(1)} KB]
16629
17068
  ${ancestry2}- Content Preview:
16630
- ${snippet2}
16631
-
16632
- [SYSTEM] Check the content preview for verification [/SYSTEM]`;
17069
+ ${snippet2}`;
16633
17070
  }
16634
17071
  const action = normToolName === "write_file" ? "Created" : "Edited";
16635
- const feedbackLabel = `\u2714 ${action}: ${filePath || "..."}`;
17072
+ const feedbackLabel = `${filePath ? "\u2714" : "\u2718"} ${action}: ${filePath || "No File Changes"}`;
16636
17073
  let terminalWidth = 115;
16637
17074
  if (process.stdout.isTTY) {
16638
17075
  terminalWidth = process.stdout.columns - 5 || 120;
16639
17076
  }
16640
17077
  const boxWidth = Math.min(feedbackLabel.length + 4, terminalWidth);
16641
17078
  const boxMid = `${feedbackLabel.padEnd(boxWidth - 2).substring(0, boxWidth - 2)}`;
16642
- yield { type: "visual_feedback", content: colorMainWords(`${thisIsFirstToolFeedback ? "\n" : ""}${boxMid}
16643
- `) };
17079
+ yield { type: "visual_feedback", content: colorMainWords(`${thisIsFirstToolFeedback ? "\n" : ""}${boxMid}`) };
16644
17080
  thisIsFirstToolFeedback = false;
16645
17081
  const toolEnd2 = Date.now();
16646
17082
  lastToolFinishedAt = toolEnd2;
@@ -16667,7 +17103,7 @@ ${snippet2}
16667
17103
  }
16668
17104
  if (normToolName === "write_file" || normToolName === "update_file") {
16669
17105
  const action = normToolName === "write_file" ? "Write Cancelled" : "Edit Denied";
16670
- const deniedLabel = `\u2718 ${action}: ${parseArgs(toolCall.args).path || "..."}`.toUpperCase();
17106
+ const deniedLabel = `\u2718 ${action}: ${parseArgs(toolCall.args).path || "..."}`;
16671
17107
  let terminalWidth = 115;
16672
17108
  if (process.stdout.isTTY) {
16673
17109
  terminalWidth = process.stdout.columns - 5 || 120;
@@ -16774,7 +17210,7 @@ ${snippet2}
16774
17210
  }
16775
17211
  const _sp = path27 ? path27.replace(/[\/\\]+$/, "") : null;
16776
17212
  const displayPath = _sp && _sp !== "." ? `"${_isDir ? `${_sp}/*` : _sp}"` : "./";
16777
- const postLabel = `\u2714 Searched: "${keyword}" in ${displayPath} \u2192 ${matchCount} Match${matchCount === 1 ? "" : "es"}`;
17213
+ const postLabel = `${keyword ? "\u2714" : "\u2718"} Searched: "${keyword ? keyword : ""}" in ${displayPath} \u2192 ${matchCount} Match${matchCount === 1 ? "" : "es"}`;
16778
17214
  let terminalWidth = 115;
16779
17215
  if (process.stdout.isTTY) {
16780
17216
  terminalWidth = process.stdout.columns - 5 || 120;
@@ -17169,14 +17605,14 @@ Error Log can be found in ${path25.join(LOGS_DIR, "agent", "error.log")}`);
17169
17605
  if (toolResults.length < attemptedToolsCount) {
17170
17606
  combinedText += `
17171
17607
 
17172
- [SYSTEM] Only ${toolResults.length} out of ${attemptedToolsCount} attempted tool calls were executed. Verify proper syntax compliance & try failed calls again [/SYSTEM]`;
17608
+ [SYSTEM] Only ${toolResults.length} out of ${attemptedToolsCount} attempted tool calls were executed. Verify proper schema compliance & try failed calls again [/SYSTEM]`;
17173
17609
  }
17174
17610
  const binaryPart = toolResults.find((tr) => tr.binaryPart)?.binaryPart || null;
17175
17611
  modifiedHistory.push({ role: "user", text: combinedText, binaryPart });
17176
17612
  }
17177
17613
  } else {
17178
17614
  if (wasToolCalledInLastLoop || detectedAnyToolCalls) {
17179
- modifiedHistory.push({ role: "user", text: `[SYSTEM] Failed to execute some tools. Verify proper syntax compliance & try again [/SYSTEM]` });
17615
+ modifiedHistory.push({ role: "user", text: `[SYSTEM] Failed to execute some tools. Verify proper schema compliance & try again [/SYSTEM]` });
17180
17616
  } else {
17181
17617
  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 execution/output" : "If you have finished your task use [[END]]"}`} [/SYSTEM]` });
17182
17618
  }
@@ -17199,7 +17635,7 @@ Error Log can be found in ${path25.join(LOGS_DIR, "agent", "error.log")}`);
17199
17635
  })() : String(err);
17200
17636
  const date = (/* @__PURE__ */ new Date()).toLocaleString();
17201
17637
  const agentErrDir = path25.join(LOGS_DIR, "agent");
17202
- yield { type: "text", content: `\u274C CRITICAL ERROR: ${errLog}` };
17638
+ yield { type: "text", content: `\u274C CRITICAL ERROR: ${errLog.includes("fetch failed") ? "Failed to Connect. Check your Internet Connection or Wait a moment" : errLog}` };
17203
17639
  if (!fs26.existsSync(agentErrDir)) fs26.mkdirSync(agentErrDir, { recursive: true });
17204
17640
  fs26.appendFileSync(path25.join(agentErrDir, "error.log"), `CRITICAL ERROR [${date}]: ${err}
17205
17641
 
@@ -17232,15 +17668,15 @@ Error Log can be found in ${path25.join(LOGS_DIR, "agent", "error.log")}`);
17232
17668
  const mergedSettings = { ...savedSettings, ...settings };
17233
17669
  const targetModel = model || settings?.modelName || settings?.activeModel || savedSettings.activeModel;
17234
17670
  const SUBAGENT_TOOL_DEFINITIONS = {
17235
- "readfile": '- [tool:functions.ReadFile(path="...", startLine=number, endLine=number)]. View files',
17236
- "readfolder": '- [tool:functions.ReadFolder(path="...")]. Detailed DIR stats including File Sizes',
17237
- "filemap": '- [tool:functions.FileMap(path="path/file")]. Shows file structure, functions, class, import/export, variables',
17238
- "patchfile": '- [tool:functions.PatchFile(path="...", allowMultiple="true optional", replaceContent1="...", newContent1="...", ...MAX 10)]. Surgical patch. allowMultiple: Replace all matches (default: false). Multiple patches same file? Use replaceContent2/newContent2... Unsure? ReadFile. MUST VERIFY DIFF',
17239
- "writefile": '- [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile. Verify Imports',
17240
- "searchkeyword": '- [tool:functions.SearchKeyword(keyword="...", path="optional, target directory or filename", subString="true optional", regex="false for keyword, optional")]. Project-wide search. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code. Defaults: subString=false, regex=true',
17241
- "websearch": '- [tool:functions.WebSearch(query="...", aiMode="true optional", limit=number)]. Limit 3-10 (aiMode ignores). Usage: unknown info/docs. aiMode: LLM search (default: false)',
17671
+ "readfile": '- [tool:functions.ReadFile(path="...", startLine="integer", endLine="integer")]. View files',
17672
+ "readfolder": '- [tool:functions.ReadFolder(path="...", recurse="integer 0-4 optional, default: 0")]. Detailed DIR stats including File Sizes',
17673
+ "filemap": '- [tool:functions.FileMap(path="file")]. Shows file structure, functions, class, import/export, variables',
17674
+ "patchfile": '- [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical patch. allowMultiple: Replace all matches. Multiple patches same file? Use replaceContent2/newContent2... Verify DIFFs',
17675
+ "writefile": '- [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile. VERIFY IMPORTS',
17676
+ "searchkeyword": '- [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")]. Project-wide search. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code',
17677
+ "websearch": '- [tool:functions.WebSearch(query="...", aiMode="bool optional, default: false", limit="integer 3-10, aiMode: exclude")]. Usage: unknown info/docs. aiMode: LLM search',
17242
17678
  "webscrape": '- [tool:functions.WebScrape(url="...")]. Proactive use for specific webpage/docs/api',
17243
- "ask": `- [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity Resolution. Mandatory Triggers: Path Divergence, Security, Risk Mitigation. ask >> finish/guess. Suggest best options; don't ask for preferences. 'option' SHOULD be short`
17679
+ "ask": `- [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST for path divergence, security risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short`
17244
17680
  };
17245
17681
  const providedToolsSection = `-- TOOL DEFINITIONS (path = relative to CWD, path separator: '/') --
17246
17682
  TO ACCESS TOOLS **STRICTLY USE THE EXACT FORMAT IN CHAT OUTPUT:** [tool:functions.ToolName(args)]
@@ -17252,7 +17688,7 @@ TOOL POLICY:
17252
17688
  - FileMap \u2192 ReadFile for efficient file understanding
17253
17689
  - Need specific text ? SearchKeyword > Guessing/ReadFile
17254
17690
  - Huge files ? SearchKeyword > FileMap/Full Read
17255
- - NO Terminal Access
17691
+ - NO Shell Access
17256
17692
 
17257
17693
  -- PROVIDED TOOLS --
17258
17694
  ${Object.values(SUBAGENT_TOOL_DEFINITIONS).join("\n")}
@@ -17348,17 +17784,19 @@ ${cleanResponse}
17348
17784
  const path27 = parseArgs(toolCall.args).path || "";
17349
17785
  label = `\u2714 \x1B[95mRead\x1B[0m: ${path27}`;
17350
17786
  } else if (normalizedToolName === "list_files" || normalizedToolName === "read_folder" || normalizedToolName === "readfolder") {
17351
- const path27 = parseArgs(toolCall.args).path || "";
17352
- label = `\u2714 \x1B[95mBrowsed\x1B[0m: ${path27}`;
17787
+ const path27 = parseArgs(toolCall.args).path || null;
17788
+ const recurse = parseArgs(toolCall.args).recurse || 0;
17789
+ label = `${path27 ? "\u2714" : "\u2718"} \x1B[95mBrowsed\x1B[0m: ${path27 ? `${path27}${recurse > 0 ? `${path27.endsWith("/") ? `*${recurse}` : `/*${recurse}`}` : `${path27.endsWith("/") ? "" : "/"}`}` : ""}`;
17353
17790
  } else if (normalizedToolName === "write_file" || normalizedToolName === "writefile") {
17354
- const path27 = parseArgs(toolCall.args).path || "";
17355
- label = `\u2714 \x1B[95mCreated\x1B[0m: ${path27}`;
17791
+ const path27 = parseArgs(toolCall.args).path || null;
17792
+ label = `${path27 ? "\u2714" : "\u2718"} \x1B[95mCreated\x1B[0m: ${path27 ? `${path27}` : "No File Changes"}`;
17356
17793
  } else if (normalizedToolName === "update_file" || normalizedToolName === "updatefile" || normalizedToolName === "patchfile" || normalizedToolName === "patch_file" || normalizedToolName === "patchfile" || normalizedToolName === "updatefile") {
17357
- const path27 = parseArgs(toolCall.args).path || "";
17358
- label = `\u2714 \x1B[95mEdited\x1B[0m: ${path27}`;
17794
+ const path27 = parseArgs(toolCall.args).path || null;
17795
+ const content = parseArgs(toolCall.args).content || null;
17796
+ label = `${path27 ? "\u2714" : "\u2718"} \x1B[95mEdited\x1B[0m: ${path27 ? `${path27}` : "No File Changes"}`;
17359
17797
  } else if (normalizedToolName === "file_map" || normalizedToolName === "filemap") {
17360
17798
  const path27 = parseArgs(toolCall.args).path || "";
17361
- label = `\u2714 \x1B[95mIndexed\x1B[0m: ${path27}`;
17799
+ label = `${path27 ? "\u2714" : "\u2718"} \x1B[95mIndexed\x1B[0m: ${path27 ? `${path27}` : "File Not Found"}`;
17362
17800
  } else if (normalizedToolName === "await") {
17363
17801
  const { time } = parseArgs(toolCall.args);
17364
17802
  let sec = parseFloat(time) || 0;
@@ -17516,9 +17954,10 @@ function ResumeModal({ onSelect, onDelete, onClose, theme = "Dark" }) {
17516
17954
  width: "100%"
17517
17955
  },
17518
17956
  /* @__PURE__ */ React10.createElement(Box9, { flexGrow: 1 }, /* @__PURE__ */ React10.createElement(Text10, { color: isSelected ? colors.text : colors.textMuted, bold: isSelected }, isSelected ? "\u276F " : " ", (() => {
17519
- if (chat2?.name && !chat2.name.startsWith("Session")) return chat2.name;
17520
- if (chat2?.prompt) return chat2.prompt;
17521
- return chat2?.name || id;
17957
+ const cleanTag = (str) => (str || "").replace(/\[\/?(?:STEERING HINT|QUESTION)(?::\s*\w+)?\]/gi, "").trim();
17958
+ if (chat2?.name && !chat2.name.startsWith("Session")) return cleanTag(chat2.name);
17959
+ if (chat2?.prompt) return cleanTag(chat2.prompt);
17960
+ return cleanTag(chat2?.name) || id;
17522
17961
  })(), /* @__PURE__ */ React10.createElement(Text10, { color: colors.textMuted }, " [", dateStr, " \u2022 ", id, "]"))),
17523
17962
  isSelected && /* @__PURE__ */ React10.createElement(Box9, { flexShrink: 0 }, /* @__PURE__ */ React10.createElement(Text10, { color: colors.danger, bold: true }, "[X] DELETE "))
17524
17963
  );
@@ -21716,16 +22155,16 @@ Selection: ${val}`,
21716
22155
  const barWidth = 15;
21717
22156
  const filledCount = Math.round(percent / 100 * barWidth);
21718
22157
  const barStr = "\u2588".repeat(filledCount) + "\u2591".repeat(Math.max(0, barWidth - filledCount));
21719
- let barColor = "gray";
22158
+ let barColor = colors.success || "green";
21720
22159
  if (percent >= 40 && percent <= 80) {
21721
- barColor = "yellow";
22160
+ barColor = colors.warning || "yellow";
21722
22161
  } else if (percent > 80) {
21723
- barColor = "red";
22162
+ barColor = colors.danger || "red";
21724
22163
  }
21725
22164
  const isTokens = label.toLowerCase().includes("token");
21726
22165
  const displayLimit = shouldClearValue(limit) ? "\u221E" : isTokens ? formatTokens(limit) : limit;
21727
22166
  const displayCurrent = isTokens ? formatTokens(current) : current;
21728
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "row", paddingLeft: 4, key: label }, /* @__PURE__ */ React16.createElement(Box14, { width: 18 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, label, ": ")), /* @__PURE__ */ React16.createElement(Text16, { color: barColor }, barStr), /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, " ", percent, "% (", displayCurrent, "/", displayLimit, ")"));
22167
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "row", paddingLeft: 4, key: label }, /* @__PURE__ */ React16.createElement(Box14, { width: 18 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, label, ": ")), /* @__PURE__ */ React16.createElement(Text16, { color: barColor }, barStr), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, " ", percent, "% (", displayCurrent, "/", displayLimit, ")"));
21729
22168
  };
21730
22169
  const renderActiveView = () => {
21731
22170
  switch (activeView) {
@@ -21770,7 +22209,7 @@ Selection: ${val}`,
21770
22209
  title: "SELECT AI PROVIDER",
21771
22210
  items: [
21772
22211
  { label: "Google (Free/Paid)", value: "Google" },
21773
- { label: "Nvidia (Free/Paid)", value: "NVIDIA" },
22212
+ { label: "Nvidia (Free/Custom)", value: "NVIDIA" },
21774
22213
  { label: "DeepSeek (Paid)", value: "DeepSeek" },
21775
22214
  { label: "Mistral (Free/Paid) [EXPERIMENTAL]", value: "Mistral" },
21776
22215
  { label: "OpenRouter (Free/Paid) [EXPERIMENTAL]", value: "OpenRouter" },
@@ -21864,6 +22303,7 @@ Selection: ${val}`,
21864
22303
  { label: "Custom (Set reset day of month)", value: "Custom" },
21865
22304
  { label: "Back", value: "apiTier" }
21866
22305
  ],
22306
+ theme: systemSettings.theme,
21867
22307
  onSelect: (item) => {
21868
22308
  if (item.value === "apiTier" || item.value === "Back") {
21869
22309
  setActiveView("apiTier");
@@ -21899,6 +22339,7 @@ Selection: ${val}`,
21899
22339
  { label: `Provider Budgets (set limits per provider individually) ${quotas.providerBudgets?.["__useProvider"] ? "\u25CF" : ""}`, value: "provider" },
21900
22340
  { label: "Back", value: budgetReturnView }
21901
22341
  ],
22342
+ theme: systemSettings.theme,
21902
22343
  onSelect: (item) => {
21903
22344
  if (item.value === budgetReturnView || item.value === "Back") {
21904
22345
  setActiveView(budgetReturnView);
@@ -21957,11 +22398,11 @@ Selection: ${val}`,
21957
22398
  case "providerBudgetSelect": {
21958
22399
  const PROVIDERS_LIST = ["Google", "DeepSeek", "Mistral", "NVIDIA", "OpenRouter"];
21959
22400
  const anySelected = PROVIDERS_LIST.some((p) => pbsSelected[p]);
21960
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "white", padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray", bold: true }, "SELECT PROVIDERS TO SET BUDGETS FOR")), PROVIDERS_LIST.map((prov, i) => {
22401
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "SELECT PROVIDERS TO SET BUDGETS FOR")), PROVIDERS_LIST.map((prov, i) => {
21961
22402
  const isActive = i === pbsCursor;
21962
22403
  const isChecked = !!pbsSelected[prov];
21963
- return /* @__PURE__ */ React16.createElement(Box14, { key: prov, backgroundColor: isActive ? "#2a2a2a" : void 0, paddingX: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: isActive ? "white" : "gray", bold: isActive }, isActive ? "\u276F " : " ", /* @__PURE__ */ React16.createElement(Text16, { color: isChecked ? "green" : "gray" }, isChecked ? "\u2611" : "\u2610"), " ", prov, isChecked && quotas.providerBudgets?.[prov]?.agentLimit ? /* @__PURE__ */ React16.createElement(Text16, { color: "cyan" }, " (budget set)") : null));
21964
- }), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray", italic: true }, "\u2191\u2193 Navigate \u2022 Space to toggle \u2022 Enter to confirm \u2022 ESC to go back"), !anySelected && /* @__PURE__ */ React16.createElement(Text16, { color: "yellow", italic: true }, " Select at least one provider to continue")));
22404
+ return /* @__PURE__ */ React16.createElement(Box14, { key: prov, backgroundColor: isActive ? colors.highlightBg || "#2a2a2a" : void 0, paddingX: 1, width: "100%", flexDirection: "row" }, /* @__PURE__ */ React16.createElement(Text16, { color: isActive ? colors.text : colors.textMuted, bold: isActive }, isActive ? "\u276F " : " "), /* @__PURE__ */ React16.createElement(Text16, { color: isChecked ? colors.success || "green" : colors.textMuted }, isChecked ? "\u2611" : "\u2610"), /* @__PURE__ */ React16.createElement(Text16, { color: isActive ? colors.text : colors.textMuted, bold: isActive }, " ", prov), isChecked && quotas.providerBudgets?.[prov]?.agentLimit ? /* @__PURE__ */ React16.createElement(Text16, { color: colors.primary || "cyan" }, " (budget set)") : null);
22405
+ }), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, italic: true }, "\u2191\u2193 Navigate \u2022 Space to toggle \u2022 Enter to confirm \u2022 ESC to go back"), !anySelected && /* @__PURE__ */ React16.createElement(Text16, { color: colors.warning || "yellow", italic: true }, " Select at least one provider to continue")));
21965
22406
  }
21966
22407
  case "providerBudgetFlow":
21967
22408
  return null;
@@ -21975,6 +22416,7 @@ Selection: ${val}`,
21975
22416
  { label: "Custom (Set reset day of month)", value: "Custom" },
21976
22417
  { label: "Back", value: "chat" }
21977
22418
  ],
22419
+ theme: systemSettings.theme,
21978
22420
  onSelect: (item) => {
21979
22421
  if (item.value === "chat" || item.value === "Back") {
21980
22422
  setActiveView("chat");
@@ -22026,7 +22468,7 @@ Selection: ${val}`,
22026
22468
  const monthName = resetDate.toLocaleString("default", { month: "short" });
22027
22469
  resetInfo = `Resets on: ${resetDay}-${monthName}`;
22028
22470
  }
22029
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "white", padding: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 1, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, "BUDGET LIMIT STATUS"), /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, "[ ESC to Close ]")), limitsNotSet ? /* @__PURE__ */ React16.createElement(Box14, { padding: 1, justifyContent: "center", alignItems: "center", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true }, "LIMITS NOT SET")) : usingProviderBudgets && configuredProviders.length > 0 ? /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", gap: 1, width: "100%" }, configuredProviders.map((prov) => {
22471
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 1, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, "BUDGET LIMIT STATUS"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "[ ESC to Close ]")), limitsNotSet ? /* @__PURE__ */ React16.createElement(Box14, { padding: 1, justifyContent: "center", alignItems: "center", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "LIMITS NOT SET")) : usingProviderBudgets && configuredProviders.length > 0 ? /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", gap: 1, width: "100%" }, configuredProviders.map((prov) => {
22030
22472
  const pb = providerBudgetsMap[prov];
22031
22473
  const provReqCurrent = dailyUsage?.providerRequests?.[prov] || 0;
22032
22474
  let provTokenCurrent = 0;
@@ -22040,11 +22482,11 @@ Selection: ${val}`,
22040
22482
  for (const m in monthlyModels) {
22041
22483
  provMonthlyCurrent += monthlyModels[m]?.tokens || 0;
22042
22484
  }
22043
- return /* @__PURE__ */ React16.createElement(Box14, { key: prov, flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 0 }, /* @__PURE__ */ React16.createElement(Text16, { color: "cyan", bold: true }, "\u25C6 ", prov)), renderProgressBar("Daily Requests", provReqCurrent, pb.agentLimit || 99999999, "cyan"), renderProgressBar("Daily Tokens", provTokenCurrent, pb.tokenLimit || 99999999999999, "green"), renderProgressBar("Monthly Tokens", provMonthlyCurrent, pb.monthlyTokenLimit || 99999999999999, "yellow"));
22044
- }), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: "blue", bold: true }, "Rolling 30-Day Window"))) : /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 1, width: "100%" }, renderProgressBar("Daily Requests", reqCurrent, reqLimit, "cyan"), renderProgressBar("Daily Tokens", tokenCurrent, tokenLimit, "green"), renderProgressBar("Monthly Tokens", monthlyCurrent, monthlyLimit, "yellow"), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray" }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: "blue", bold: true }, "Rolling 30-Day Window"))));
22485
+ return /* @__PURE__ */ React16.createElement(Box14, { key: prov, flexDirection: "column", borderStyle: "single", borderColor: colors.borderMuted, paddingX: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 0 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.primary, bold: true }, "\u25C6 ", prov)), renderProgressBar("Daily Requests", provReqCurrent, pb.agentLimit || 99999999, "cyan"), renderProgressBar("Daily Tokens", provTokenCurrent, pb.tokenLimit || 99999999999999, "green"), renderProgressBar("Monthly Tokens", provMonthlyCurrent, pb.monthlyTokenLimit || 99999999999999, "yellow"));
22486
+ }), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.accent || "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary || "blue", bold: true }, "Rolling 30-Day Window"))) : /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "single", borderColor: colors.borderMuted, paddingX: 1, width: "100%" }, renderProgressBar("Daily Requests", reqCurrent, reqLimit, "cyan"), renderProgressBar("Daily Tokens", tokenCurrent, tokenLimit, "green"), renderProgressBar("Monthly Tokens", monthlyCurrent, monthlyLimit, "yellow"), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.accent || "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset : "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary || "blue", bold: true }, "Rolling 30-Day Window"))));
22045
22487
  }
22046
22488
  case "input":
22047
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "white", padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true }, "DATA CONFIGURATION")), inputConfig?.note && /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray", italic: true }, inputConfig.note)), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, flexDirection: "row" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true }, inputConfig?.label, " "), /* @__PURE__ */ React16.createElement(
22489
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "DATA CONFIGURATION")), inputConfig?.note && /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, italic: true }, inputConfig.note)), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, flexDirection: "row" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, inputConfig?.label, " "), /* @__PURE__ */ React16.createElement(
22048
22490
  TextInput4,
22049
22491
  {
22050
22492
  value: inputConfig?.value || "",
@@ -22144,7 +22586,7 @@ Selection: ${val}`,
22144
22586
  }
22145
22587
  }
22146
22588
  }
22147
- )), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "gray", dimColor: true, italic: true }, "(Press Enter to confirm selection)")));
22589
+ )), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, dimColor: true, italic: true }, "(Press Enter to confirm selection)")));
22148
22590
  case "stats": {
22149
22591
  const u = statsMode === "monthly" ? monthlyUsage : dailyUsage;
22150
22592
  const trackerTitle = statsMode === "monthly" ? "LAST 30 DAYS USAGE" : "TODAY's USAGE";
@@ -22154,16 +22596,17 @@ Selection: ${val}`,
22154
22596
  const imageCreditsLabel = statsMode === "monthly" ? "Image Credits:" : "Image Credits:";
22155
22597
  const codeChangesLabel = statsMode === "monthly" ? "Code Changes:" : "Code Changes:";
22156
22598
  const toolCallsLabel = statsMode === "monthly" ? "Tool Calls:" : "Tool Calls:";
22157
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", paddingX: 3, paddingY: 1, paddingBottom: 0, width: Math.min(125, (stdout?.columns || 100) - 2) }, statsMode === "modelBreakdown" ? /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, "30-DAY MODEL TOKEN BREAKDOWN"), !monthlyUsage?.models || Object.keys(monthlyUsage.models).length === 0 ? /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey", italic: true }, "No model token usage recorded in the last 30 days.")) : Object.entries(monthlyUsage.models).map(([provider, models]) => {
22599
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, paddingX: 3, paddingY: 1, paddingBottom: 0, width: Math.min(125, (stdout?.columns || 100) - 2) }, statsMode === "modelBreakdown" ? /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, "30-DAY MODEL TOKEN BREAKDOWN"), !monthlyUsage?.models || Object.keys(monthlyUsage.models).length === 0 ? /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, italic: true }, "No model token usage recorded in the last 30 days.")) : Object.entries(monthlyUsage.models).map(([provider, models]) => {
22158
22600
  const providerTotalTokens = Object.values(models).reduce((sum, m) => sum + (m.tokens || 0), 0);
22159
- return /* @__PURE__ */ React16.createElement(Box14, { key: provider, flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 40 }, /* @__PURE__ */ React16.createElement(Text16, { color: "cyan", bold: true }, provider, ":")), /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true }, formatTokens(providerTotalTokens))), Object.entries(models).map(([modelName, stats]) => /* @__PURE__ */ React16.createElement(Box14, { key: modelName, flexDirection: "column", marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 36 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "\xBB ", modelName, ":")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(stats.tokens || 0))), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 32 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Input Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens((stats.tokens || 0) - (stats.candidateTokens || 0)))), (stats.cachedTokens || 0) > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 5 }, /* @__PURE__ */ React16.createElement(Box14, { width: 31 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Cached:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(stats.cachedTokens))), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 32 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Output Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(stats.candidateTokens || 0))))));
22160
- })) : /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, "SESSION TELEMETRY")), /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column" }, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Session Duration:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatMsDuration(Date.now() - SESSION_START_TIME))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Model Requests:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, sessionAgentCalls)), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB API Time:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatMsDuration(sessionApiTime))), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Tool Time:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatMsDuration(sessionToolTime))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Memory Agent:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, sessionBackgroundCalls)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Tokens Consumed:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(sessionTotalTokens))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Active Context:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(sessionStats.tokens))), sessionTotalTokens > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Input Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(sessionTotalTokens - sessionTotalCandidateTokens))), sessionTotalCachedTokens > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 21 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Cached:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(sessionTotalCachedTokens))), sessionTotalCandidateTokens > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Output Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(sessionTotalCandidateTokens)))), sessionImageCount > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Images Made:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, sessionImageCount)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Image Credits:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, Number(((sessionImageCredits || 0) * 1e3).toFixed(0)), " credits"))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Code Changes (Sess):")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, /* @__PURE__ */ React16.createElement(Text16, { color: "green" }, "+", runtimeSession.linesAdded), " ", /* @__PURE__ */ React16.createElement(Text16, { color: "red" }, "-", runtimeSession.linesRemoved))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Tool Calls (Sess):")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, runtimeSession.toolSuccess + runtimeSession.toolFailure + runtimeSession.toolDenied, " ( "), /* @__PURE__ */ React16.createElement(Text16, { color: "green" }, "\u2714 ", runtimeSession.toolSuccess), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: "yellow" }, "\u{1F6C7} ", runtimeSession.toolDenied), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: "red" }, "\u2718 ", runtimeSession.toolFailure), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, " )"))), /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, trackerTitle), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, timeLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatDuration(u?.duration || 0))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Model Requests:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, u?.agent || 0)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, "Memory Agent:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, u?.background || 0)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, tokensLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(u?.tokens || 0))), (u?.tokens || 0) > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Input Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens((u?.tokens || 0) - (u?.candidateTokens || 0)))), (u?.cachedTokens || 0) > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 21 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Cached:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(u.cachedTokens))), (u?.candidateTokens || 0) > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "\xBB Output Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, formatTokens(u.candidateTokens)))), (u?.imageCalls?.length || 0) > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, imagesLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, u.imageCalls.length)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, imageCreditsLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, Number(((u.imageCalls.reduce((sum, c) => sum + c.cost, 0) || 0) * 1e3).toFixed(0)), " credits"))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, codeChangesLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, /* @__PURE__ */ React16.createElement(Text16, { color: "green" }, "+", u?.linesAdded || 0), " ", /* @__PURE__ */ React16.createElement(Text16, { color: "red" }, "-", u?.linesRemoved || 0))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: "blue" }, toolCallsLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, (u?.toolSuccess || 0) + (u?.toolFailure || 0) + (u?.toolDenied || 0), " ( "), /* @__PURE__ */ React16.createElement(Text16, { color: "green" }, "\u2714 ", u?.toolSuccess || 0), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: "yellow" }, "\u{1F6C7} ", u?.toolDenied || 0), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: "red" }, "\u2718 ", u?.toolFailure || 0), /* @__PURE__ */ React16.createElement(Text16, { color: "white" }, " )")))), /* @__PURE__ */ React16.createElement(Text16, { dimColor: true, marginTop: 1, italic: true }, "(Press TAB to toggle Daily/Monthly views, SPACE for Model Breakdown, ESC to return)"));
22601
+ return /* @__PURE__ */ React16.createElement(Box14, { key: provider, flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 40 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.primary, bold: true }, provider, ":")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, formatTokens(providerTotalTokens))), Object.entries(models).map(([modelName, stats]) => /* @__PURE__ */ React16.createElement(Box14, { key: modelName, flexDirection: "column", marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 36 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "\xBB ", modelName, ":")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(stats.tokens || 0))), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 32 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Input Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens((stats.tokens || 0) - (stats.candidateTokens || 0)))), (stats.cachedTokens || 0) > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 5 }, /* @__PURE__ */ React16.createElement(Box14, { width: 31 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Cached:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(stats.cachedTokens))), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 32 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Output Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(stats.candidateTokens || 0))))));
22602
+ })) : /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, "SESSION TELEMETRY")), /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column" }, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Session Duration:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatMsDuration(Date.now() - SESSION_START_TIME))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Model Requests:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, sessionAgentCalls)), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB API Time:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatMsDuration(sessionApiTime))), /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Tool Time:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatMsDuration(sessionToolTime))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Memory Agent:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, sessionBackgroundCalls)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Tokens Consumed:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(sessionTotalTokens))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Active Context:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(sessionStats.tokens))), sessionTotalTokens > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Input Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(sessionTotalTokens - sessionTotalCandidateTokens))), sessionTotalCachedTokens > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 21 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Cached:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(sessionTotalCachedTokens))), sessionTotalCandidateTokens > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Output Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(sessionTotalCandidateTokens)))), sessionImageCount > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Images Made:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, sessionImageCount)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Image Credits:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, Number(((sessionImageCredits || 0) * 1e3).toFixed(0)), " credits"))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Code Changes (Sess):")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.success || "green" }, "+", runtimeSession.linesAdded), " ", /* @__PURE__ */ React16.createElement(Text16, { color: colors.danger || "red" }, "-", runtimeSession.linesRemoved))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Tool Calls (Sess):")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, runtimeSession.toolSuccess + runtimeSession.toolFailure + runtimeSession.toolDenied, " ( "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.success || "green" }, "\u2714 ", runtimeSession.toolSuccess), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.warning || "yellow" }, "\u{1F6C7} ", runtimeSession.toolDenied), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.danger || "red" }, "\u2718 ", runtimeSession.toolFailure), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, " )"))), /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, trackerTitle), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, timeLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatDuration(u?.duration || 0))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Model Requests:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, u?.agent || 0)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, "Memory Agent:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, u?.background || 0)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, tokensLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(u?.tokens || 0))), (u?.tokens || 0) > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Input Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens((u?.tokens || 0) - (u?.candidateTokens || 0)))), (u?.cachedTokens || 0) > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Box14, { width: 21 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Cached:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(u.cachedTokens))), (u?.candidateTokens || 0) > 0 && /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React16.createElement(Box14, { width: 23 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\xBB Output Tokens:")), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, formatTokens(u.candidateTokens)))), (u?.imageCalls?.length || 0) > 0 && /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, imagesLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, u.imageCalls.length)), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, imageCreditsLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, Number(((u.imageCalls.reduce((sum, c) => sum + c.cost, 0) || 0) * 1e3).toFixed(0)), " credits"))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, codeChangesLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.success || "green" }, "+", u?.linesAdded || 0), " ", /* @__PURE__ */ React16.createElement(Text16, { color: colors.danger || "red" }, "-", u?.linesRemoved || 0))), /* @__PURE__ */ React16.createElement(Box14, null, /* @__PURE__ */ React16.createElement(Box14, { width: 25 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary }, toolCallsLabel)), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, (u?.toolSuccess || 0) + (u?.toolFailure || 0) + (u?.toolDenied || 0), " ( "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.success || "green" }, "\u2714 ", u?.toolSuccess || 0), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.warning || "yellow" }, "\u{1F6C7} ", u?.toolDenied || 0), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, " "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.danger || "red" }, "\u2718 ", u?.toolFailure || 0), /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, " )")))), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, dimColor: true, marginTop: 1, italic: true }, "(Press TAB to toggle Daily/Monthly views, SPACE for Model Breakdown, ESC to return)"));
22161
22603
  }
22162
22604
  case "autoExecDanger":
22163
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, "SECURITY WARNING: YOLO MODE"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "Turning this ON allows the agent to execute terminal commands automatically without requiring your approval for each step."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: "white" }, "RISKS INVOLVED:"), /* @__PURE__ */ React16.createElement(Text16, null, "\u2022 The agent may execute destructive commands (rm -rf, etc.) by mistake unless specified in sandbox rules."), /* @__PURE__ */ React16.createElement(Text16, null, "\u2022 Unintended system changes if the agent hallucinates a path or command."), /* @__PURE__ */ React16.createElement(Text16, null, "\u2022 Reduced control over the agent's step-by-step decision making."), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22605
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.warning || "yellow", bold: true, underline: true }, "SECURITY WARNING: YOLO MODE"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text }, "Turning this ON allows the agent to execute terminal commands automatically without requiring your approval for each step."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text, bold: true }, "RISKS INVOLVED:"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\u2022 The agent may execute destructive commands (rm -rf, etc.) by mistake unless specified in sandbox rules."), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\u2022 Unintended system changes if the agent hallucinates a path or command."), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\u2022 Reduced control over the agent's step-by-step decision making."), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22164
22606
  CommandMenu,
22165
22607
  {
22166
22608
  title: "Confirm Intent",
22609
+ theme: systemSettings.theme,
22167
22610
  items: [
22168
22611
  { label: "I know the risk and turning on intentionally", value: "on" },
22169
22612
  { label: "Keep Off (Recommended)", value: "off" }
@@ -22177,10 +22620,11 @@ Selection: ${val}`,
22177
22620
  }
22178
22621
  )));
22179
22622
  case "advanceRollbackDanger":
22180
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", paddingX: 2, paddingY: 1, paddingTop: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true }, "\u26A0 Emergency Rollback Notice"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "When enabled, full repo snapshots exist only during active AI turns."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "If catastrophic changes occur during a turn, avoid abruptly stopping the agent unless absolutely necessary (external damages out of codebase)."), /* @__PURE__ */ React16.createElement(Text16, null, "The agent may be able to automatically restore the repo to a safe state."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "Once the turn ends, emergency snapshots are deleted and standard /revert takes over which may not retain full repo content."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "(Requires Restart to take effect)"), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22623
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, paddingX: 2, paddingY: 1, paddingTop: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.warning || "yellow", bold: true }, "\u26A0 Emergency Rollback Notice"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text }, "When enabled, full repo snapshots exist only during active AI turns."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text }, "If catastrophic changes occur during a turn, avoid abruptly stopping the agent unless absolutely necessary (external damages out of codebase)."), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "The agent may be able to automatically restore the repo to a safe state."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.textMuted }, "Once the turn ends, emergency snapshots are deleted and standard /revert takes over which may not retain full repo content."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.textMuted }, "(Requires Restart to take effect)"), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22181
22624
  CommandMenu,
22182
22625
  {
22183
22626
  title: "Confirm",
22627
+ theme: systemSettings.theme,
22184
22628
  items: [
22185
22629
  { label: "I understand and wish to enable", value: "on" },
22186
22630
  { label: "Keep Off", value: "off" }
@@ -22194,10 +22638,11 @@ Selection: ${val}`,
22194
22638
  }
22195
22639
  )));
22196
22640
  case "externalDanger":
22197
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, "SECURITY WARNING: EXTERNAL WORKSPACE ACCESS"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "Turning this ON allows the agent to execute tools (Read/Write/Exec) outside of the current active workspace directory."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: "white" }, "RISKS INVOLVED:"), /* @__PURE__ */ React16.createElement(Text16, null, "\u2022 Access to sensitive system files (SSH keys, Browser data, etc.)"), /* @__PURE__ */ React16.createElement(Text16, null, "\u2022 Potential for accidental or malicious deletion of OS-critical files."), /* @__PURE__ */ React16.createElement(Text16, null, "\u2022 Unauthorized script execution across your entire file system."), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22641
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.warning || "yellow", bold: true, underline: true }, "SECURITY WARNING: EXTERNAL WORKSPACE ACCESS"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text }, "Turning this ON allows the agent to execute tools (Read/Write/Exec) outside of the current active workspace directory."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text, bold: true }, "RISKS INVOLVED:"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\u2022 Access to sensitive system files (SSH keys, Browser data, etc.)"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\u2022 Potential for accidental or malicious deletion of OS-critical files."), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "\u2022 Unauthorized script execution across your entire file system."), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22198
22642
  CommandMenu,
22199
22643
  {
22200
22644
  title: "Confirm Intent",
22645
+ theme: systemSettings.theme,
22201
22646
  items: [
22202
22647
  { label: "I know the risk and turning on intentionally", value: "on" },
22203
22648
  { label: "Keep Off (Recommended)", value: "off" }
@@ -22211,10 +22656,11 @@ Selection: ${val}`,
22211
22656
  }
22212
22657
  )));
22213
22658
  case "doubleDanger":
22214
- return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "white", paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, "CRITICAL SECURITY WARNING: COMBINED SYSTEM RISK"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1 }, "You are attempting to enable BOTH [YOLO Mode] and [External Workspace Access] simultaneously."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: "red", bold: true }, "THIS IS NOT RECOMMENDED."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: "white" }, "THE CRITICAL RISK:"), /* @__PURE__ */ React16.createElement(Text16, null, "The agent will have the power to execute any command across your entire system WITHOUT your approval or supervision."), /* @__PURE__ */ React16.createElement(Text16, { color: "red", italic: true, marginTop: 1 }, "A single hallucination or error could result in full system wipe or data theft."), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22659
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, paddingX: 2, paddingY: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.danger || "red", bold: true, underline: true }, "CRITICAL SECURITY WARNING: COMBINED SYSTEM RISK"), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text }, "You are attempting to enable BOTH [YOLO Mode] and [External Workspace Access] simultaneously."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.danger || "red", bold: true }, "THIS IS NOT RECOMMENDED."), /* @__PURE__ */ React16.createElement(Text16, { marginTop: 1, color: colors.text, bold: true }, "THE CRITICAL RISK:"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "The agent will have the power to execute any command across your entire system WITHOUT your approval or supervision."), /* @__PURE__ */ React16.createElement(Text16, { color: colors.danger || "red", italic: true, marginTop: 1 }, "A single hallucination or error could result in full system wipe or data theft."), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(
22215
22660
  CommandMenu,
22216
22661
  {
22217
22662
  title: "Final Confirmation",
22663
+ theme: systemSettings.theme,
22218
22664
  items: [
22219
22665
  { label: "I agree knowing the consequences", value: "on" },
22220
22666
  { label: "Keep Off", value: "off" }
@@ -22454,6 +22900,7 @@ Selection: ${val}`,
22454
22900
  ResolutionModal,
22455
22901
  {
22456
22902
  data: resolutionData,
22903
+ theme: systemSettings.theme,
22457
22904
  onResolve: (val) => {
22458
22905
  setResolutionData(null);
22459
22906
  setActiveView("chat");
@@ -22717,7 +23164,7 @@ Selection: ${val}`,
22717
23164
  {
22718
23165
  items: [
22719
23166
  { label: "Google (Free/Paid)", value: "Google" },
22720
- { label: "Nvidia (Free/Paid)", value: "NVIDIA" },
23167
+ { label: "Nvidia (Free/Custom)", value: "NVIDIA" },
22721
23168
  { label: "DeepSeek (Paid)", value: "DeepSeek" },
22722
23169
  { label: "Mistral (Free/Paid) [EXPERIMENTAL]", value: "Mistral" },
22723
23170
  { label: "OpenRouter (Free/Paid) [EXPERIMENTAL]", value: "OpenRouter" }
@@ -22979,20 +23426,25 @@ var init_app = __esm({
22979
23426
  packageJson = JSON.parse(fs28.readFileSync(packageJsonPath, "utf8"));
22980
23427
  versionFluxflow = packageJson.version;
22981
23428
  updatedOn = packageJson.date || "2026-05-20";
22982
- ResolutionModal = ({ data, onResolve, onEdit }) => /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "white", bold: true, underline: true }, data.startsWith("/btw") ? "QUESTION" : "STEERING HINT", " RESOLUTION")), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, null, "The agent already finished the task before your ", data.startsWith("/btw") ? "question" : "hint", " was consumed.")), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1, backgroundColor: "#222", paddingX: 2, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { italic: true, color: "gray" }, '"', data.replace("/btw", "").trim(), '"')), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: "grey" }, "How would you like to proceed?")), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 0 }, /* @__PURE__ */ React16.createElement(
22983
- CommandMenu,
22984
- {
22985
- title: "Select Action",
22986
- items: [
22987
- { label: "Send Anyway", value: "send" },
22988
- { label: "Edit Prompt", value: "edit" }
22989
- ],
22990
- onSelect: (val) => {
22991
- if (val === "send") onResolve(data);
22992
- else onEdit(data);
23429
+ ResolutionModal = ({ data, onResolve, onEdit, theme = "Dark" }) => {
23430
+ const colors = getThemeColors(theme);
23431
+ return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, data.startsWith("/btw") ? "QUESTION" : "STEERING HINT", " RESOLUTION")), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text }, "The agent already finished the task before your ", data.startsWith("/btw") ? "question" : "hint", " was consumed.")), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 1, backgroundColor: colors.cardBg || colors.codeBg || "#222", paddingX: 2, width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { italic: true, color: colors.textMuted }, '"', data.replace("/btw", "").trim(), '"')), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textDim || colors.textMuted }, "How would you like to proceed?")), /* @__PURE__ */ React16.createElement(Box14, { marginTop: 0 }, /* @__PURE__ */ React16.createElement(
23432
+ CommandMenu,
23433
+ {
23434
+ title: "Select Action",
23435
+ items: [
23436
+ { label: "Send Anyway", value: "send" },
23437
+ { label: "Edit Prompt", value: "edit" }
23438
+ ],
23439
+ onSelect: (item) => {
23440
+ const val = typeof item === "object" && item !== null ? item.value : item;
23441
+ if (val === "send") onResolve(data);
23442
+ else onEdit(data);
23443
+ },
23444
+ theme
22993
23445
  }
22994
- }
22995
- )));
23446
+ )));
23447
+ };
22996
23448
  getProjectFiles = /* @__PURE__ */ (() => {
22997
23449
  let cachedFiles = null;
22998
23450
  let lastScanTime = 0;