snow-ai 0.7.36 → 0.7.38

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/bundle/cli.mjs CHANGED
@@ -243668,11 +243668,12 @@ var init_languageConfig = __esm({
243668
243668
  });
243669
243669
 
243670
243670
  // dist/i18n/lang/en.js
243671
- var inputNewlineShortcut, en;
243671
+ var inputNewlineShortcut, pasteImageShortcut, en;
243672
243672
  var init_en = __esm({
243673
243673
  "dist/i18n/lang/en.js"() {
243674
243674
  "use strict";
243675
243675
  inputNewlineShortcut = process.platform === "darwin" ? "Option+Enter" : "Alt+Enter / Ctrl+Enter";
243676
+ pasteImageShortcut = process.platform === "darwin" ? "Ctrl+V" : "Alt+V";
243676
243677
  en = {
243677
243678
  welcome: {
243678
243679
  title: "\u2746 SNOW AI CLI",
@@ -244924,6 +244925,22 @@ var init_en = __esm({
244924
244925
  pressCtrlC: "Ctrl+C to cancel",
244925
244926
  pressCtrlR: "Ctrl+R to regenerate",
244926
244927
  pressCtrlS: "Ctrl+S to save",
244928
+ loadingTips: [
244929
+ "Type / to view all commands",
244930
+ "Use /help to view all shortcuts",
244931
+ "Use @ to reference files, @@ to search file content",
244932
+ `Press ${pasteImageShortcut} to paste images from the clipboard`,
244933
+ `Press ${inputNewlineShortcut} for multi-line input`,
244934
+ "Press ESC to interrupt the current response",
244935
+ "Use Shift+Tab or Ctrl+Y to switch YOLO, Plan, and Team modes",
244936
+ "State your goal and constraints first for steadier results",
244937
+ "For multi-step work, ask for a plan before execution",
244938
+ "Use # to pick a sub-agent for specialized tasks",
244939
+ "Type /todo to view or manage the task list",
244940
+ "Use /add-dir to add a working directory for complex projects",
244941
+ "Type /simple to reduce display noise",
244942
+ "After pasting a screenshot, add text context before sending"
244943
+ ],
244927
244944
  // Context
244928
244945
  contextUsage: "Context usage: {percentage}%",
244929
244946
  contextPercentage: "{percentage}%",
@@ -245552,11 +245569,12 @@ var init_en = __esm({
245552
245569
  });
245553
245570
 
245554
245571
  // dist/i18n/lang/zh.js
245555
- var inputNewlineShortcut2, zh;
245572
+ var inputNewlineShortcut2, pasteImageShortcut2, zh;
245556
245573
  var init_zh = __esm({
245557
245574
  "dist/i18n/lang/zh.js"() {
245558
245575
  "use strict";
245559
245576
  inputNewlineShortcut2 = process.platform === "darwin" ? "Option+Enter" : "Alt+Enter / Ctrl+Enter";
245577
+ pasteImageShortcut2 = process.platform === "darwin" ? "Ctrl+V" : "Alt+V";
245560
245578
  zh = {
245561
245579
  welcome: {
245562
245580
  title: "\u2746 SNOW AI CLI",
@@ -246807,6 +246825,22 @@ var init_zh = __esm({
246807
246825
  pressCtrlC: "Ctrl+C \u53D6\u6D88",
246808
246826
  pressCtrlR: "Ctrl+R \u91CD\u65B0\u751F\u6210",
246809
246827
  pressCtrlS: "Ctrl+S \u4FDD\u5B58",
246828
+ loadingTips: [
246829
+ "\u8F93\u5165 / \u67E5\u770B\u6240\u6709\u547D\u4EE4",
246830
+ "\u4F7F\u7528 /help \u67E5\u770B\u6240\u6709\u5FEB\u6377\u952E",
246831
+ "\u8F93\u5165 @ \u5F15\u7528\u6587\u4EF6\uFF0C\u8F93\u5165 @@ \u641C\u7D22\u6587\u4EF6\u5185\u5BB9",
246832
+ `\u6309 ${pasteImageShortcut2} \u53EF\u4ECE\u526A\u8D34\u677F\u7C98\u8D34\u56FE\u7247`,
246833
+ `\u9700\u8981\u591A\u884C\u8F93\u5165\u65F6\uFF0C\u6309 ${inputNewlineShortcut2} \u6362\u884C`,
246834
+ "\u6309 ESC \u53EF\u4E2D\u65AD\u5F53\u524D\u56DE\u590D",
246835
+ "\u7528 Shift+Tab \u6216 Ctrl+Y \u5207\u6362 YOLO\u3001Plan\u3001Team \u6A21\u5F0F",
246836
+ "\u5148\u8BF4\u76EE\u6807\u548C\u7EA6\u675F\uFF0C\u7ED3\u679C\u4F1A\u66F4\u7A33\u5B9A",
246837
+ "\u9700\u8981\u5206\u6B65\u9AA4\u65F6\uFF0C\u53EF\u4EE5\u8981\u6C42\u5148\u7ED9\u8BA1\u5212\u518D\u6267\u884C",
246838
+ "\u4F7F\u7528 # \u9009\u62E9\u5B50\u4EE3\u7406\u5904\u7406\u4E13\u9879\u4EFB\u52A1",
246839
+ "\u8F93\u5165 /todo \u67E5\u770B\u6216\u7BA1\u7406\u4EFB\u52A1\u6E05\u5355",
246840
+ "\u590D\u6742\u9879\u76EE\u53EF\u7528 /add-dir \u6DFB\u52A0\u5DE5\u4F5C\u76EE\u5F55",
246841
+ "\u60F3\u51CF\u5C11\u663E\u793A\u5E72\u6270\uFF0C\u53EF\u8F93\u5165 /simple",
246842
+ "\u7C98\u8D34\u622A\u56FE\u540E\u53EF\u4EE5\u7EE7\u7EED\u8865\u5145\u6587\u5B57\u8BF4\u660E\uFF0C\u518D\u4E00\u8D77\u53D1\u9001"
246843
+ ],
246810
246844
  // Context
246811
246845
  contextUsage: "\u4E0A\u4E0B\u6587\u4F7F\u7528: {percentage}%",
246812
246846
  contextPercentage: "{percentage}%",
@@ -247435,11 +247469,12 @@ var init_zh = __esm({
247435
247469
  });
247436
247470
 
247437
247471
  // dist/i18n/lang/zh-TW.js
247438
- var inputNewlineShortcut3, zhTW;
247472
+ var inputNewlineShortcut3, pasteImageShortcut3, zhTW;
247439
247473
  var init_zh_TW = __esm({
247440
247474
  "dist/i18n/lang/zh-TW.js"() {
247441
247475
  "use strict";
247442
247476
  inputNewlineShortcut3 = process.platform === "darwin" ? "Option+Enter" : "Alt+Enter / Ctrl+Enter";
247477
+ pasteImageShortcut3 = process.platform === "darwin" ? "Ctrl+V" : "Alt+V";
247443
247478
  zhTW = {
247444
247479
  welcome: {
247445
247480
  title: "\u2746 SNOW AI CLI",
@@ -248690,6 +248725,22 @@ var init_zh_TW = __esm({
248690
248725
  pressCtrlC: "Ctrl+C \u53D6\u6D88",
248691
248726
  pressCtrlR: "Ctrl+R \u91CD\u65B0\u7522\u751F",
248692
248727
  pressCtrlS: "Ctrl+S \u5132\u5B58",
248728
+ loadingTips: [
248729
+ "\u8F38\u5165 / \u67E5\u770B\u6240\u6709\u547D\u4EE4",
248730
+ "\u4F7F\u7528 /help \u67E5\u770B\u6240\u6709\u5FEB\u6377\u9375",
248731
+ "\u8F38\u5165 @ \u5F15\u7528\u6A94\u6848\uFF0C\u8F38\u5165 @@ \u641C\u5C0B\u6A94\u6848\u5167\u5BB9",
248732
+ `\u6309 ${pasteImageShortcut3} \u53EF\u5F9E\u526A\u8CBC\u7C3F\u8CBC\u4E0A\u5716\u7247`,
248733
+ `\u9700\u8981\u591A\u884C\u8F38\u5165\u6642\uFF0C\u6309 ${inputNewlineShortcut3} \u63DB\u884C`,
248734
+ "\u6309 ESC \u53EF\u4E2D\u65B7\u76EE\u524D\u56DE\u61C9",
248735
+ "\u7528 Shift+Tab \u6216 Ctrl+Y \u5207\u63DB YOLO\u3001Plan\u3001Team \u6A21\u5F0F",
248736
+ "\u5148\u8AAA\u660E\u76EE\u6A19\u548C\u9650\u5236\uFF0C\u7D50\u679C\u6703\u66F4\u7A69\u5B9A",
248737
+ "\u9700\u8981\u5206\u6B65\u9A5F\u6642\uFF0C\u53EF\u4EE5\u8981\u6C42\u5148\u7D66\u8A08\u756B\u518D\u57F7\u884C",
248738
+ "\u4F7F\u7528 # \u9078\u64C7\u5B50\u4EE3\u7406\u8655\u7406\u5C08\u9805\u4EFB\u52D9",
248739
+ "\u8F38\u5165 /todo \u67E5\u770B\u6216\u7BA1\u7406\u4EFB\u52D9\u6E05\u55AE",
248740
+ "\u8907\u96DC\u5C08\u6848\u53EF\u7528 /add-dir \u65B0\u589E\u5DE5\u4F5C\u76EE\u9304",
248741
+ "\u60F3\u6E1B\u5C11\u986F\u793A\u5E72\u64FE\uFF0C\u53EF\u8F38\u5165 /simple",
248742
+ "\u8CBC\u4E0A\u622A\u5716\u5F8C\u53EF\u4EE5\u7E7C\u7E8C\u88DC\u5145\u6587\u5B57\u8AAA\u660E\uFF0C\u518D\u4E00\u8D77\u50B3\u9001"
248743
+ ],
248693
248744
  // Context
248694
248745
  contextUsage: "\u4E0A\u4E0B\u6587\u4F7F\u7528: {percentage}%",
248695
248746
  contextPercentage: "{percentage}%",
@@ -517882,7 +517933,7 @@ var init_subAgentMessageHandler = __esm({
517882
517933
  contextStartLine: resultData.contextStartLine
517883
517934
  }
517884
517935
  };
517885
- } else if (resultData.results && Array.isArray(resultData.results)) {
517936
+ } else if (!fileToolData && resultData.results && Array.isArray(resultData.results)) {
517886
517937
  fileToolData = {
517887
517938
  name: msg.tool_name,
517888
517939
  arguments: {
@@ -517890,7 +517941,7 @@ var init_subAgentMessageHandler = __esm({
517890
517941
  batchResults: resultData.results
517891
517942
  }
517892
517943
  };
517893
- } else if (resultData.batchResults && Array.isArray(resultData.batchResults)) {
517944
+ } else if (!fileToolData && resultData.batchResults && Array.isArray(resultData.batchResults)) {
517894
517945
  fileToolData = {
517895
517946
  name: msg.tool_name,
517896
517947
  arguments: {
@@ -533665,7 +533716,7 @@ function convertSessionMessagesToUI(sessionMessages) {
533665
533716
  contextStartLine: resultData.contextStartLine
533666
533717
  }
533667
533718
  };
533668
- } else if (resultData.results && Array.isArray(resultData.results)) {
533719
+ } else if (!fileToolData && resultData.results && Array.isArray(resultData.results)) {
533669
533720
  fileToolData = {
533670
533721
  name: toolName,
533671
533722
  arguments: {
@@ -533799,7 +533850,7 @@ function convertSessionMessagesToUI(sessionMessages) {
533799
533850
  toolArgs.completeOldContent = resultData.completeOldContent;
533800
533851
  toolArgs.completeNewContent = resultData.completeNewContent;
533801
533852
  toolArgs.contextStartLine = resultData.contextStartLine;
533802
- } else if (resultData.results && Array.isArray(resultData.results)) {
533853
+ } else if (!editDiffData && resultData.results && Array.isArray(resultData.results)) {
533803
533854
  editDiffData = {
533804
533855
  batchResults: resultData.results,
533805
533856
  isBatch: true
@@ -535861,7 +535912,7 @@ function saveCustomColors(colors) {
535861
535912
  }
535862
535913
  function getSimpleMode() {
535863
535914
  const config3 = loadThemeConfig();
535864
- return config3.simpleMode ?? false;
535915
+ return config3.simpleMode ?? true;
535865
535916
  }
535866
535917
  function setSimpleMode(simpleMode) {
535867
535918
  const config3 = loadThemeConfig();
@@ -535882,8 +535933,8 @@ var init_themeConfig = __esm({
535882
535933
  CONFIG_DIR7 = join31(homedir17(), ".snow");
535883
535934
  THEME_CONFIG_FILE = join31(CONFIG_DIR7, "theme.json");
535884
535935
  DEFAULT_CONFIG5 = {
535885
- theme: "dark",
535886
- simpleMode: false,
535936
+ theme: "tiffany",
535937
+ simpleMode: true,
535887
535938
  diffOpacity: 1
535888
535939
  };
535889
535940
  }
@@ -545023,9 +545074,11 @@ var init_themes = __esm({
545023
545074
  background: "#1e1e1e",
545024
545075
  text: "#d4d4d4",
545025
545076
  border: "#3e3e3e",
545026
- diffAdded: "#0d4d3d",
545027
- diffRemoved: "#5a1f1f",
545077
+ diffAdded: "#033a16",
545078
+ diffRemoved: "#67060c",
545028
545079
  diffModified: "#dcdcaa",
545080
+ diffAddedForeground: "#7ee787",
545081
+ diffRemovedForeground: "#ff7b72",
545029
545082
  lineNumber: "#858585",
545030
545083
  lineNumberBorder: "#3e3e3e",
545031
545084
  menuSelected: "#5e0691ff",
@@ -545049,9 +545102,11 @@ var init_themes = __esm({
545049
545102
  background: "#1e1e1e",
545050
545103
  text: "#d4d4d4",
545051
545104
  border: "#3e3e3e",
545052
- diffAdded: "#0d4d3d",
545053
- diffRemoved: "#5a1f1f",
545105
+ diffAdded: "#033a16",
545106
+ diffRemoved: "#67060c",
545054
545107
  diffModified: "#dcdcaa",
545108
+ diffAddedForeground: "#3fb950",
545109
+ diffRemovedForeground: "#f85149",
545055
545110
  lineNumber: "#858585",
545056
545111
  lineNumberBorder: "#3e3e3e",
545057
545112
  // Menu colors
@@ -545081,9 +545136,11 @@ var init_themes = __esm({
545081
545136
  background: "#ffffff",
545082
545137
  text: "#000000",
545083
545138
  border: "#e0e0e0",
545084
- diffAdded: "#006400",
545085
- diffRemoved: "#8B0000",
545086
- diffModified: "#0000ff",
545139
+ diffAdded: "#dff7df",
545140
+ diffRemoved: "#ffe2e0",
545141
+ diffModified: "#8250df",
545142
+ diffAddedForeground: "#116329",
545143
+ diffRemovedForeground: "#b42318",
545087
545144
  lineNumber: "#6e6e6e",
545088
545145
  lineNumberBorder: "#e0e0e0",
545089
545146
  // Menu colors - darker for better visibility
@@ -545113,9 +545170,11 @@ var init_themes = __esm({
545113
545170
  background: "#0d1117",
545114
545171
  text: "#c9d1d9",
545115
545172
  border: "#30363d",
545116
- diffAdded: "#1a4d2e",
545117
- diffRemoved: "#6e1a1a",
545118
- diffModified: "#9e6a03",
545173
+ diffAdded: "#033a16",
545174
+ diffRemoved: "#67060c",
545175
+ diffModified: "#d29922",
545176
+ diffAddedForeground: "#3fb950",
545177
+ diffRemovedForeground: "#f85149",
545119
545178
  lineNumber: "#6e7681",
545120
545179
  lineNumberBorder: "#21262d",
545121
545180
  // Menu colors
@@ -545145,9 +545204,11 @@ var init_themes = __esm({
545145
545204
  background: "#1a1a2e",
545146
545205
  text: "#ffffff",
545147
545206
  border: "#ff6b9d",
545148
- diffAdded: "#16697a",
545149
- diffRemoved: "#82204a",
545150
- diffModified: "#5f4b8b",
545207
+ diffAdded: "#063f3c",
545208
+ diffRemoved: "#4a102f",
545209
+ diffModified: "#ffbe0b",
545210
+ diffAddedForeground: "#06ffa5",
545211
+ diffRemovedForeground: "#ff6b9d",
545151
545212
  lineNumber: "#ffa07a",
545152
545213
  lineNumberBorder: "#ff6b9d",
545153
545214
  // Menu colors - vibrant rainbow colors
@@ -545177,9 +545238,11 @@ var init_themes = __esm({
545177
545238
  background: "#002b36",
545178
545239
  text: "#839496",
545179
545240
  border: "#073642",
545180
- diffAdded: "#0a3d2c",
545181
- diffRemoved: "#5c1f1f",
545182
- diffModified: "#5d4f1a",
545241
+ diffAdded: "#123c2e",
545242
+ diffRemoved: "#4d1f26",
545243
+ diffModified: "#b58900",
545244
+ diffAddedForeground: "#859900",
545245
+ diffRemovedForeground: "#dc322f",
545183
545246
  lineNumber: "#586e75",
545184
545247
  lineNumberBorder: "#073642",
545185
545248
  // Menu colors
@@ -545209,9 +545272,11 @@ var init_themes = __esm({
545209
545272
  background: "#2e3440",
545210
545273
  text: "#d8dee9",
545211
545274
  border: "#3b4252",
545212
- diffAdded: "#1d3a2f",
545213
- diffRemoved: "#5c2a2a",
545214
- diffModified: "#5a4d2f",
545275
+ diffAdded: "#033a16",
545276
+ diffRemoved: "#67060c",
545277
+ diffModified: "#ebcb8b",
545278
+ diffAddedForeground: "#116329",
545279
+ diffRemovedForeground: "#b42318",
545215
545280
  lineNumber: "#4c566a",
545216
545281
  lineNumberBorder: "#3b4252",
545217
545282
  // Menu colors
@@ -545241,9 +545306,11 @@ var init_themes = __esm({
545241
545306
  background: "#e8f7f5",
545242
545307
  text: "#0a3a38",
545243
545308
  border: "#0abab5",
545244
- diffAdded: "#a7e8d8",
545245
- diffRemoved: "#f5c2c7",
545246
- diffModified: "#bfe7e3",
545309
+ diffAdded: "#c8f4ee",
545310
+ diffRemoved: "#ffd9d2",
545311
+ diffModified: "#0abab5",
545312
+ diffAddedForeground: "#007f7a",
545313
+ diffRemovedForeground: "#c0392b",
545247
545314
  lineNumber: "#5a8a87",
545248
545315
  lineNumberBorder: "#9bd9d3",
545249
545316
  // Menu colors
@@ -545273,9 +545340,11 @@ var init_themes = __esm({
545273
545340
  background: "#fff0f5",
545274
545341
  text: "#5a2a4a",
545275
545342
  border: "#f7b6d2",
545276
- diffAdded: "#c8e8d4",
545277
- diffRemoved: "#fbc4d0",
545278
- diffModified: "#fde2a7",
545343
+ diffAdded: "#d9f5e8",
545344
+ diffRemoved: "#ffe0ea",
545345
+ diffModified: "#e8a87c",
545346
+ diffAddedForeground: "#4f9b78",
545347
+ diffRemovedForeground: "#e5547d",
545279
545348
  lineNumber: "#b07a96",
545280
545349
  lineNumberBorder: "#f3c6dc",
545281
545350
  // Menu colors - macaron pastel palette
@@ -545305,9 +545374,11 @@ var init_themes = __esm({
545305
545374
  background: "#120d08",
545306
545375
  text: "#f7e6a3",
545307
545376
  border: "#d4af37",
545308
- diffAdded: "#2f3d1b",
545309
- diffRemoved: "#5a2118",
545310
- diffModified: "#7a4f13",
545377
+ diffAdded: "#173d22",
545378
+ diffRemoved: "#5a2217",
545379
+ diffModified: "#ffd700",
545380
+ diffAddedForeground: "#7bd88f",
545381
+ diffRemovedForeground: "#ff6b4a",
545311
545382
  lineNumber: "#b88a2a",
545312
545383
  lineNumberBorder: "#6f4e16",
545313
545384
  // Menu colors - bold presidential gold palette
@@ -545337,9 +545408,11 @@ var init_themes = __esm({
545337
545408
  background: "#1a0a0a",
545338
545409
  text: "#f7d4d4",
545339
545410
  border: "#cc2936",
545340
- diffAdded: "#1d3a1d",
545341
- diffRemoved: "#5a1a1a",
545342
- diffModified: "#7a5a2a",
545411
+ diffAdded: "#17391f",
545412
+ diffRemoved: "#5a1111",
545413
+ diffModified: "#ffd166",
545414
+ diffAddedForeground: "#6fcf6f",
545415
+ diffRemovedForeground: "#ff4d4d",
545343
545416
  lineNumber: "#d47a7a",
545344
545417
  lineNumberBorder: "#8b2222",
545345
545418
  // Menu colors - bold Chinese red palette
@@ -545369,9 +545442,11 @@ var init_themes = __esm({
545369
545442
  background: "#151a2e",
545370
545443
  text: "#e2e4f0",
545371
545444
  border: "#c42828",
545372
- diffAdded: "#1d3a2e",
545373
- diffRemoved: "#5a2020",
545374
- diffModified: "#3d456e",
545445
+ diffAdded: "#193450",
545446
+ diffRemoved: "#4a161d",
545447
+ diffModified: "#b0b8d0",
545448
+ diffAddedForeground: "#5b9bd5",
545449
+ diffRemovedForeground: "#e63946",
545375
545450
  lineNumber: "#8a98b0",
545376
545451
  lineNumberBorder: "#2a355e",
545377
545452
  // Menu colors - Optimus Prime red/blue/silver
@@ -599503,19 +599578,21 @@ function normalizeHexColor(hex) {
599503
599578
  }
599504
599579
  return null;
599505
599580
  }
599506
- function blendHexColors(foreground, background, alpha) {
599507
- const normalizedForeground = normalizeHexColor(foreground);
599508
- const normalizedBackground = normalizeHexColor(background);
599509
- if (!normalizedForeground || !normalizedBackground) {
599510
- return foreground;
599511
- }
599512
- const blendChannel = (foregroundOffset, backgroundOffset) => {
599513
- const foregroundValue = Number.parseInt(normalizedForeground.slice(foregroundOffset, foregroundOffset + 2), 16);
599514
- const backgroundValue = Number.parseInt(normalizedBackground.slice(backgroundOffset, backgroundOffset + 2), 16);
599515
- const blendedValue = Math.round(foregroundValue * alpha + backgroundValue * (1 - alpha));
599516
- return blendedValue.toString(16).padStart(2, "0");
599517
- };
599518
- return `#${blendChannel(0, 0)}${blendChannel(2, 2)}${blendChannel(4, 4)}`;
599581
+ function applyThemeBackground(text2, color) {
599582
+ var _a20;
599583
+ const normalizedHex = normalizeHexColor(color.trim());
599584
+ if (normalizedHex) {
599585
+ return source_default.bgHex(`#${normalizedHex}`)(text2);
599586
+ }
599587
+ return ((_a20 = INK_BACKGROUND_STYLES[color.trim().toLowerCase()]) == null ? void 0 : _a20.call(INK_BACKGROUND_STYLES, text2)) ?? text2;
599588
+ }
599589
+ function applyThemeForeground(text2, color) {
599590
+ var _a20;
599591
+ const normalizedHex = normalizeHexColor(color.trim());
599592
+ if (normalizedHex) {
599593
+ return source_default.hex(`#${normalizedHex}`)(text2);
599594
+ }
599595
+ return ((_a20 = INK_FOREGROUND_STYLES[color.trim().toLowerCase()]) == null ? void 0 : _a20.call(INK_FOREGROUND_STYLES, text2)) ?? text2;
599519
599596
  }
599520
599597
  function computeHunks(diffOldContent, diffNewContent, startLineNumber) {
599521
599598
  var _a20;
@@ -599596,34 +599673,41 @@ function computeHunks(diffOldContent, diffNewContent, startLineNumber) {
599596
599673
  }
599597
599674
  return computedHunks;
599598
599675
  }
599599
- function DiffViewer({ oldContent = "", newContent, filename, completeOldContent, completeNewContent, startLineNumber = 1 }) {
599600
- const { theme: theme14, diffOpacity } = useTheme();
599676
+ function DiffViewer({ oldContent = "", newContent, filename, completeOldContent, completeNewContent, startLineNumber = 1, showFilenameInHeader = true }) {
599677
+ const { theme: theme14 } = useTheme();
599601
599678
  const { columns: terminalColumns } = useTerminalSize();
599602
599679
  const codeLanguage = inferLanguageFromFilename(filename);
599603
599680
  const columns = Math.max(terminalColumns - 6, 40);
599604
- const diffAddedBg = (0, import_react84.useMemo)(() => blendHexColors(theme14.colors.diffAdded, theme14.colors.background, diffOpacity), [diffOpacity, theme14.colors.diffAdded, theme14.colors.background]);
599605
- const diffRemovedBg = (0, import_react84.useMemo)(() => blendHexColors(theme14.colors.diffRemoved, theme14.colors.background, diffOpacity), [diffOpacity, theme14.colors.diffRemoved, theme14.colors.background]);
599606
599681
  const useSideBySide = columns >= MIN_SIDE_BY_SIDE_WIDTH;
599607
599682
  const diffOldContent = stripLineNumbers(completeOldContent && completeNewContent ? completeOldContent : oldContent);
599608
599683
  const diffNewContent = stripLineNumbers(completeOldContent && completeNewContent ? completeNewContent : newContent);
599609
599684
  const renderedOutput = (0, import_react84.useMemo)(() => {
599610
599685
  const hl = (content) => highlightCodeContent(expandTabsForDisplay(content), codeLanguage);
599611
599686
  const cleanContent = (c) => c.replace(/[\r\n]/g, "");
599687
+ const formatHeaderTitle = (fallback) => {
599688
+ const title = showFilenameInHeader ? filename ?? fallback : void 0;
599689
+ return title ? `${source_default.cyan.bold(title)} ` : "";
599690
+ };
599612
599691
  const sideRule = source_default.dim("\u2502");
599613
599692
  const dimStyle = (text2) => source_default.dim(text2);
599614
- const subtleAddedStyle = (text2) => source_default.bgHex(diffAddedBg)(text2);
599615
- const subtleRemovedStyle = (text2) => source_default.bgHex(diffRemovedBg)(text2);
599616
- const addedSignStyle = (text2) => source_default.green.bold(text2);
599617
- const removedSignStyle = (text2) => source_default.red.bold(text2);
599618
- const lineNumStyle = (text2) => source_default.gray.dim(text2);
599619
- const lineNumAddedStyle = (text2) => source_default.bgHex(blendHexColors(diffAddedBg, theme14.colors.background, 0.55)).gray.dim(text2);
599620
- const lineNumRemovedStyle = (text2) => source_default.bgHex(blendHexColors(diffRemovedBg, theme14.colors.background, 0.55)).gray.dim(text2);
599621
- const hunkStyle = (text2) => source_default.cyan.dim(text2);
599693
+ const subtleAddedStyle = (text2) => applyThemeBackground(text2, theme14.colors.diffAdded);
599694
+ const subtleRemovedStyle = (text2) => applyThemeBackground(text2, theme14.colors.diffRemoved);
599695
+ const addedTextStyle = (text2) => applyThemeForeground(text2, theme14.colors.diffAddedForeground);
599696
+ const removedTextStyle = (text2) => applyThemeForeground(text2, theme14.colors.diffRemovedForeground);
599697
+ const addedSignStyle = (text2) => addedTextStyle(source_default.bold(text2));
599698
+ const removedSignStyle = (text2) => removedTextStyle(source_default.bold(text2));
599699
+ const lineNumberTextStyle = normalizeHexColor(theme14.colors.lineNumber) ? source_default.hex(theme14.colors.lineNumber) : source_default.gray;
599700
+ const lineNumStyle = (text2) => lineNumberTextStyle(text2);
599701
+ const lineNumAddedStyle = (text2) => subtleAddedStyle(lineNumberTextStyle(text2));
599702
+ const lineNumRemovedStyle = (text2) => subtleRemovedStyle(lineNumberTextStyle(text2));
599703
+ const hunkStyle = (text2) => applyThemeForeground(source_default.dim(text2), theme14.colors.diffModified);
599622
599704
  const style = {
599623
599705
  sideRule,
599624
599706
  dimStyle,
599625
599707
  subtleAddedStyle,
599626
599708
  subtleRemovedStyle,
599709
+ addedTextStyle,
599710
+ removedTextStyle,
599627
599711
  addedSignStyle,
599628
599712
  removedSignStyle,
599629
599713
  lineNumStyle,
@@ -599635,8 +599719,7 @@ function DiffViewer({ oldContent = "", newContent, filename, completeOldContent,
599635
599719
  if (isNewFile) {
599636
599720
  const allLines = diffNewContent.split("\n");
599637
599721
  const lineNumWidth = Math.max(4, String(allLines.length).length);
599638
- const headerTitle2 = filename ?? "New File";
599639
- const header2 = `${source_default.dim("\u256D\u2500")} ${source_default.cyan.bold(headerTitle2)} ${source_default.green.bold("new file")} ${source_default.green(`+${allLines.length}`)}`;
599722
+ const header2 = `${source_default.dim("\u256D\u2500")} ${formatHeaderTitle("New File")}${addedSignStyle("new file")} ${addedTextStyle(`+${allLines.length}`)}`;
599640
599723
  const body2 = allLines.flatMap((line, index) => {
599641
599724
  const lineNum = String(index + 1).padStart(lineNumWidth, " ");
599642
599725
  const contentRows = wrapAnsiToWidth(hl(line), getUnifiedContentWidth(columns, lineNumWidth));
@@ -599654,9 +599737,8 @@ ${footer2}`;
599654
599737
  const hunks = computeHunks(diffOldContent, diffNewContent, startLineNumber);
599655
599738
  const addedCount = hunks.reduce((count, hunk) => count + hunk.changes.filter((change) => change.type === "added").length, 0);
599656
599739
  const removedCount = hunks.reduce((count, hunk) => count + hunk.changes.filter((change) => change.type === "removed").length, 0);
599657
- const headerTitle = filename ?? "File Modified";
599658
599740
  const modeLabel = useSideBySide ? source_default.dim("side-by-side") : source_default.dim("unified");
599659
- const header = `${source_default.dim("\u256D\u2500")} ${source_default.cyan.bold(headerTitle)} ${source_default.yellow.bold("modified")} ${modeLabel} ${source_default.green(`+${addedCount}`)} ${source_default.red(`-${removedCount}`)}`;
599741
+ const header = `${source_default.dim("\u256D\u2500")} ${formatHeaderTitle("File Modified")}${source_default.yellow.bold("modified")} ${modeLabel} ${addedTextStyle(`+${addedCount}`)} ${removedTextStyle(`-${removedCount}`)}`;
599660
599742
  const hunkStrings = hunks.map((hunk) => {
599661
599743
  const hunkHeader = `${sideRule} ${hunkStyle(`@@ ${hunk.startLine}-${hunk.endLine}`)}`;
599662
599744
  if (useSideBySide) {
@@ -599678,11 +599760,16 @@ ${footer}`;
599678
599760
  diffNewContent,
599679
599761
  startLineNumber,
599680
599762
  filename,
599763
+ showFilenameInHeader,
599681
599764
  codeLanguage,
599682
- diffAddedBg,
599683
- diffRemovedBg,
599684
599765
  useSideBySide,
599685
- columns
599766
+ columns,
599767
+ theme14.colors.diffAdded,
599768
+ theme14.colors.diffRemoved,
599769
+ theme14.colors.diffModified,
599770
+ theme14.colors.diffAddedForeground,
599771
+ theme14.colors.diffRemovedForeground,
599772
+ theme14.colors.lineNumber
599686
599773
  ]);
599687
599774
  return import_react84.default.createElement(
599688
599775
  Box_default,
@@ -599879,8 +599966,8 @@ function formatSideBySide(hunk, hunkHeader, columns, hl, style, cleanContent) {
599879
599966
  }
599880
599967
  return rows.length > 0 ? rows : [" ".repeat(width)];
599881
599968
  };
599882
- const leftHeader = fitToWidth(source_default.red.bold("OLD"), panelWidth);
599883
- const rightHeader = fitToWidth(source_default.green.bold("NEW"), panelWidth);
599969
+ const leftHeader = fitToWidth(style.removedSignStyle("OLD"), panelWidth);
599970
+ const rightHeader = fitToWidth(style.addedSignStyle("NEW"), panelWidth);
599884
599971
  const rule = `${style.sideRule} ${source_default.dim(`${"\u2500".repeat(panelWidth + 1)}\u253C${"\u2500".repeat(panelWidth + 1)}`)}`;
599885
599972
  const lines = [
599886
599973
  hunkHeader,
@@ -599927,7 +600014,7 @@ function formatSideBySide(hunk, hunkHeader, columns, hl, style, cleanContent) {
599927
600014
  }
599928
600015
  return lines.join("\n");
599929
600016
  }
599930
- var import_react84, import_cli_highlight, MIN_SIDE_BY_SIDE_WIDTH, LANGUAGE_BY_EXTENSION;
600017
+ var import_react84, import_cli_highlight, MIN_SIDE_BY_SIDE_WIDTH, LANGUAGE_BY_EXTENSION, INK_BACKGROUND_STYLES, INK_FOREGROUND_STYLES;
599931
600018
  var init_DiffViewer = __esm({
599932
600019
  async "dist/ui/components/tools/DiffViewer.js"() {
599933
600020
  "use strict";
@@ -599970,6 +600057,30 @@ var init_DiffViewer = __esm({
599970
600057
  sql: "sql",
599971
600058
  php: "php"
599972
600059
  };
600060
+ INK_BACKGROUND_STYLES = {
600061
+ black: (text2) => source_default.bgBlack(text2),
600062
+ red: (text2) => source_default.bgRed(text2),
600063
+ green: (text2) => source_default.bgGreen(text2),
600064
+ yellow: (text2) => source_default.bgYellow(text2),
600065
+ blue: (text2) => source_default.bgBlue(text2),
600066
+ magenta: (text2) => source_default.bgMagenta(text2),
600067
+ cyan: (text2) => source_default.bgCyan(text2),
600068
+ white: (text2) => source_default.bgWhite(text2),
600069
+ gray: (text2) => source_default.bgGray(text2),
600070
+ grey: (text2) => source_default.bgGray(text2)
600071
+ };
600072
+ INK_FOREGROUND_STYLES = {
600073
+ black: (text2) => source_default.black(text2),
600074
+ red: (text2) => source_default.red(text2),
600075
+ green: (text2) => source_default.green(text2),
600076
+ yellow: (text2) => source_default.yellow(text2),
600077
+ blue: (text2) => source_default.blue(text2),
600078
+ magenta: (text2) => source_default.magenta(text2),
600079
+ cyan: (text2) => source_default.cyan(text2),
600080
+ white: (text2) => source_default.white(text2),
600081
+ gray: (text2) => source_default.gray(text2),
600082
+ grey: (text2) => source_default.gray(text2)
600083
+ };
599973
600084
  }
599974
600085
  });
599975
600086
 
@@ -632120,7 +632231,7 @@ function MessageRenderer({ message, index, filteredMessages, terminalWidth, show
632120
632231
  Box_default,
632121
632232
  { key: index2, flexDirection: "column", marginBottom: 1 },
632122
632233
  import_react88.default.createElement(Text, { bold: true, color: "cyan" }, `File ${index2 + 1}: ${fileResult.path}`),
632123
- import_react88.default.createElement(DiffViewer, { oldContent: fileResult.oldContent, newContent: fileResult.newContent, filename: fileResult.path, completeOldContent: fileResult.completeOldContent, completeNewContent: fileResult.completeNewContent, startLineNumber: fileResult.contextStartLine })
632234
+ import_react88.default.createElement(DiffViewer, { oldContent: fileResult.oldContent, newContent: fileResult.newContent, filename: fileResult.path, showFilenameInHeader: false, completeOldContent: fileResult.completeOldContent, completeNewContent: fileResult.completeNewContent, startLineNumber: fileResult.contextStartLine })
632124
632235
  );
632125
632236
  }
632126
632237
  return null;
@@ -632405,6 +632516,8 @@ var init_CustomThemeScreen = __esm({
632405
632516
  "diffAdded",
632406
632517
  "diffRemoved",
632407
632518
  "diffModified",
632519
+ "diffAddedForeground",
632520
+ "diffRemovedForeground",
632408
632521
  "lineNumber",
632409
632522
  "lineNumberBorder",
632410
632523
  "menuSelected",
@@ -633940,12 +634053,36 @@ var init_WelcomeScreen = __esm({
633940
634053
  function sanitizeInput2(str2) {
633941
634054
  return str2.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\t/g, " ").replace(/\x1b\[[IO]/g, "").replace(/(^|\s+)\[(?:I|O)(?=(?:\s|$|["'~\\\/]|[A-Za-z]:))/g, "$1").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "");
633942
634055
  }
633943
- function decodeStrictBase64(base64Data) {
634056
+ function isStrictBase64(base64Data) {
633944
634057
  if (base64Data.length <= 100)
633945
- return null;
634058
+ return false;
633946
634059
  if (base64Data.length % 4 !== 0)
633947
- return null;
633948
- if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(base64Data))
634060
+ return false;
634061
+ let paddingStart = base64Data.length;
634062
+ for (let index = 0; index < base64Data.length; index += 1) {
634063
+ const code = base64Data.charCodeAt(index);
634064
+ const isBase64Char = code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 48 && code <= 57 || code === 43 || code === 47;
634065
+ if (isBase64Char) {
634066
+ if (paddingStart !== base64Data.length)
634067
+ return false;
634068
+ continue;
634069
+ }
634070
+ if (code === 61) {
634071
+ if (paddingStart === base64Data.length)
634072
+ paddingStart = index;
634073
+ continue;
634074
+ }
634075
+ return false;
634076
+ }
634077
+ const paddingLength = base64Data.length - paddingStart;
634078
+ if (paddingLength > 2)
634079
+ return false;
634080
+ if (paddingLength > 0 && paddingStart < base64Data.length - 2)
634081
+ return false;
634082
+ return true;
634083
+ }
634084
+ function decodeStrictBase64(base64Data) {
634085
+ if (!isStrictBase64(base64Data))
633949
634086
  return null;
633950
634087
  const decoded = Buffer.from(base64Data, "base64");
633951
634088
  if (decoded.length === 0)
@@ -643356,6 +643493,19 @@ function LoadingIndicator({ isStreaming, isStopping, isSaving, isCompressing, is
643356
643493
  }
643357
643494
  const showTeamTree = teamMode && teammateStream.length > 0 && isStreaming;
643358
643495
  const showSubAgentTree = subAgentStream.length > 0 && isStreaming;
643496
+ const loadingTips = t.chatScreen.loadingTips;
643497
+ const loadingTip = loadingTips.length > 0 ? loadingTips[Math.floor(elapsedSeconds / 6) % loadingTips.length] ?? null : null;
643498
+ const renderLoadingTip = () => {
643499
+ if (!loadingTip || !isStreaming || isStopping) {
643500
+ return null;
643501
+ }
643502
+ return import_react124.default.createElement(
643503
+ Text,
643504
+ { color: theme14.colors.menuSecondary, dimColor: true },
643505
+ import_react124.default.createElement(Text, { color: theme14.colors.menuSecondary }, "\u2514\u2500 tips: "),
643506
+ loadingTip
643507
+ );
643508
+ };
643359
643509
  const renderAgentEntry = (tm, isLast) => {
643360
643510
  var _a20;
643361
643511
  const branch = isLast ? "\u2514\u2500" : "\u251C\u2500";
@@ -643421,24 +643571,51 @@ function LoadingIndicator({ isStreaming, isStopping, isSaving, isCompressing, is
643421
643571
  Box_default,
643422
643572
  { marginBottom: 1, marginTop: 1, paddingX: 1, width: terminalWidth },
643423
643573
  import_react124.default.createElement(Text, { color: loadingIconColor, bold: true }, "\u2746"),
643424
- import_react124.default.createElement(Box_default, { marginLeft: 1, flexDirection: "column" }, isStopping ? import_react124.default.createElement(Text, { color: theme14.colors.menuSecondary, dimColor: true }, t.chatScreen.statusStopping) : isStreaming ? import_react124.default.createElement(import_react124.default.Fragment, null, retryStatus && retryStatus.isRetrying ? import_react124.default.createElement(
643425
- Box_default,
643426
- { flexDirection: "column" },
643427
- retryStatus.errorMessage && import_react124.default.createElement(Text, { color: theme14.colors.error, dimColor: true }, t.chatScreen.retryError.replace("{message}", truncateErrorMessage(retryStatus.errorMessage))),
643428
- retryStatus.remainingSeconds !== void 0 && retryStatus.remainingSeconds > 0 ? import_react124.default.createElement(
643429
- Text,
643430
- { color: theme14.colors.warning, dimColor: true },
643431
- t.chatScreen.retryAttempt.replace("{current}", String(retryStatus.attempt)).replace("{max}", "5"),
643432
- " ",
643433
- t.chatScreen.retryIn.replace("{seconds}", String(retryStatus.remainingSeconds))
643434
- ) : import_react124.default.createElement(Text, { color: theme14.colors.warning, dimColor: true }, t.chatScreen.retryResending.replace("{current}", String(retryStatus.attempt)).replace("{max}", "5"))
643435
- ) : (codebaseSearchStatus == null ? void 0 : codebaseSearchStatus.isSearching) ? import_react124.default.createElement(CodebaseSearchStatus, { status: codebaseSearchStatus }) : showTeamTree ? import_react124.default.createElement(
643436
- Box_default,
643437
- { flexDirection: "column" },
643438
- import_react124.default.createElement(
643574
+ import_react124.default.createElement(Box_default, { marginLeft: 1, flexDirection: "column" }, isStopping ? import_react124.default.createElement(Text, { color: theme14.colors.menuSecondary, dimColor: true }, t.chatScreen.statusStopping) : isStreaming ? import_react124.default.createElement(
643575
+ import_react124.default.Fragment,
643576
+ null,
643577
+ retryStatus && retryStatus.isRetrying ? import_react124.default.createElement(
643578
+ Box_default,
643579
+ { flexDirection: "column" },
643580
+ retryStatus.errorMessage && import_react124.default.createElement(Text, { color: theme14.colors.error, dimColor: true }, t.chatScreen.retryError.replace("{message}", truncateErrorMessage(retryStatus.errorMessage))),
643581
+ retryStatus.remainingSeconds !== void 0 && retryStatus.remainingSeconds > 0 ? import_react124.default.createElement(
643582
+ Text,
643583
+ { color: theme14.colors.warning, dimColor: true },
643584
+ t.chatScreen.retryAttempt.replace("{current}", String(retryStatus.attempt)).replace("{max}", "5"),
643585
+ " ",
643586
+ t.chatScreen.retryIn.replace("{seconds}", String(retryStatus.remainingSeconds))
643587
+ ) : import_react124.default.createElement(Text, { color: theme14.colors.warning, dimColor: true }, t.chatScreen.retryResending.replace("{current}", String(retryStatus.attempt)).replace("{max}", "5"))
643588
+ ) : (codebaseSearchStatus == null ? void 0 : codebaseSearchStatus.isSearching) ? import_react124.default.createElement(CodebaseSearchStatus, { status: codebaseSearchStatus }) : showTeamTree ? import_react124.default.createElement(
643589
+ Box_default,
643590
+ { flexDirection: "column" },
643591
+ import_react124.default.createElement(
643592
+ Text,
643593
+ { color: loadingTextColor, dimColor: true, bold: true },
643594
+ import_react124.default.createElement(ShimmerText, { text: "\u2691 Team Working", baseColor: loadingTextColor, shimmerColor: loadingTokenColor }),
643595
+ "(",
643596
+ " ",
643597
+ currentModel && import_react124.default.createElement(
643598
+ import_react124.default.Fragment,
643599
+ null,
643600
+ currentModel,
643601
+ " \xB7 "
643602
+ ),
643603
+ formatElapsedTime(elapsedSeconds),
643604
+ " \xB7 ",
643605
+ import_react124.default.createElement(
643606
+ Text,
643607
+ { color: loadingTokenColor },
643608
+ "\u2193 ",
643609
+ formatTokens(streamTokenCount),
643610
+ " tokens"
643611
+ ),
643612
+ ")"
643613
+ ),
643614
+ teammateStream.map((tm, idx) => renderAgentEntry(tm, idx === teammateStream.length - 1))
643615
+ ) : showSubAgentTree ? renderAgentTree(subAgentStream, `\u2691 Sub-Agent Working (${formatElapsedTime(elapsedSeconds)})`) : import_react124.default.createElement(
643439
643616
  Text,
643440
643617
  { color: loadingTextColor, dimColor: true, bold: true },
643441
- import_react124.default.createElement(ShimmerText, { text: "\u2691 Team Working", baseColor: loadingTextColor, shimmerColor: loadingTokenColor }),
643618
+ import_react124.default.createElement(ShimmerText, { text: isReasoning ? t.chatScreen.statusDeepThinking : streamTokenCount > 0 ? t.chatScreen.statusWriting : t.chatScreen.statusThinking, baseColor: loadingTextColor, shimmerColor: loadingTokenColor }),
643442
643619
  "(",
643443
643620
  " ",
643444
643621
  currentModel && import_react124.default.createElement(
@@ -643458,30 +643635,8 @@ function LoadingIndicator({ isStreaming, isStopping, isSaving, isCompressing, is
643458
643635
  ),
643459
643636
  ")"
643460
643637
  ),
643461
- teammateStream.map((tm, idx) => renderAgentEntry(tm, idx === teammateStream.length - 1))
643462
- ) : showSubAgentTree ? renderAgentTree(subAgentStream, `\u2691 Sub-Agent Working (${formatElapsedTime(elapsedSeconds)})`) : import_react124.default.createElement(
643463
- Text,
643464
- { color: loadingTextColor, dimColor: true, bold: true },
643465
- import_react124.default.createElement(ShimmerText, { text: isReasoning ? t.chatScreen.statusDeepThinking : streamTokenCount > 0 ? t.chatScreen.statusWriting : t.chatScreen.statusThinking, baseColor: loadingTextColor, shimmerColor: loadingTokenColor }),
643466
- "(",
643467
- " ",
643468
- currentModel && import_react124.default.createElement(
643469
- import_react124.default.Fragment,
643470
- null,
643471
- currentModel,
643472
- " \xB7 "
643473
- ),
643474
- formatElapsedTime(elapsedSeconds),
643475
- " \xB7 ",
643476
- import_react124.default.createElement(
643477
- Text,
643478
- { color: loadingTokenColor },
643479
- "\u2193 ",
643480
- formatTokens(streamTokenCount),
643481
- " tokens"
643482
- ),
643483
- ")"
643484
- )) : import_react124.default.createElement(Text, { color: theme14.colors.menuSecondary, dimColor: true }, t.chatScreen.sessionCreating))
643638
+ renderLoadingTip()
643639
+ ) : import_react124.default.createElement(Text, { color: theme14.colors.menuSecondary, dimColor: true }, t.chatScreen.sessionCreating))
643485
643640
  );
643486
643641
  }
643487
643642
  var import_react124, STREAM_DELAY_STAGE_SECONDS, STREAM_DELAY_SHIMMER_COLORS;
@@ -676594,7 +676749,7 @@ var require_package4 = __commonJS({
676594
676749
  "package.json"(exports2, module2) {
676595
676750
  module2.exports = {
676596
676751
  name: "snow-ai",
676597
- version: "0.7.36",
676752
+ version: "0.7.38",
676598
676753
  description: "Agentic coding in your terminal",
676599
676754
  license: "MIT",
676600
676755
  bin: {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "snow-ai",
3
- "version": "0.7.36",
3
+ "version": "0.7.38",
4
4
  "description": "Agentic coding in your terminal",
5
5
  "license": "MIT",
6
6
  "bin": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "snow-ai",
3
- "version": "0.7.36",
3
+ "version": "0.7.38",
4
4
  "description": "Agentic coding in your terminal",
5
5
  "license": "MIT",
6
6
  "bin": {