snow-ai 0.3.36 → 0.4.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.
Files changed (97) hide show
  1. package/dist/agents/codebaseIndexAgent.js +1 -0
  2. package/dist/agents/codebaseReviewAgent.d.ts +61 -0
  3. package/dist/agents/codebaseReviewAgent.js +301 -0
  4. package/dist/agents/promptOptimizeAgent.d.ts +54 -0
  5. package/dist/agents/promptOptimizeAgent.js +268 -0
  6. package/dist/api/anthropic.js +1 -0
  7. package/dist/api/chat.js +1 -0
  8. package/dist/api/embedding.js +1 -0
  9. package/dist/api/gemini.js +2 -1
  10. package/dist/api/responses.js +1 -0
  11. package/dist/api/systemPrompt.d.ts +1 -5
  12. package/dist/api/systemPrompt.js +168 -100
  13. package/dist/app.js +14 -6
  14. package/dist/cli.js +1 -1
  15. package/dist/hooks/useCommandPanel.js +48 -46
  16. package/dist/hooks/useConversation.d.ts +2 -1
  17. package/dist/hooks/useConversation.js +116 -30
  18. package/dist/hooks/useGlobalExit.js +4 -2
  19. package/dist/hooks/useStreamingState.d.ts +9 -0
  20. package/dist/hooks/useStreamingState.js +3 -0
  21. package/dist/i18n/I18nContext.d.ts +14 -0
  22. package/dist/i18n/I18nContext.js +24 -0
  23. package/dist/i18n/index.d.ts +3 -0
  24. package/dist/i18n/index.js +2 -0
  25. package/dist/i18n/lang/en.d.ts +2 -0
  26. package/dist/i18n/lang/en.js +483 -0
  27. package/dist/i18n/lang/es.d.ts +2 -0
  28. package/dist/i18n/lang/es.js +483 -0
  29. package/dist/i18n/lang/ja.d.ts +2 -0
  30. package/dist/i18n/lang/ja.js +483 -0
  31. package/dist/i18n/lang/ko.d.ts +2 -0
  32. package/dist/i18n/lang/ko.js +483 -0
  33. package/dist/i18n/lang/zh-TW.d.ts +2 -0
  34. package/dist/i18n/lang/zh-TW.js +483 -0
  35. package/dist/i18n/lang/zh.d.ts +2 -0
  36. package/dist/i18n/lang/zh.js +483 -0
  37. package/dist/i18n/translations.d.ts +2 -0
  38. package/dist/i18n/translations.js +14 -0
  39. package/dist/i18n/types.d.ts +459 -0
  40. package/dist/i18n/types.js +1 -0
  41. package/dist/mcp/aceCodeSearch.d.ts +17 -48
  42. package/dist/mcp/aceCodeSearch.js +24 -56
  43. package/dist/mcp/bash.js +8 -1
  44. package/dist/mcp/codebaseSearch.d.ts +1 -1
  45. package/dist/mcp/codebaseSearch.js +159 -30
  46. package/dist/mcp/filesystem.d.ts +3 -80
  47. package/dist/mcp/filesystem.js +23 -103
  48. package/dist/mcp/subagent.d.ts +2 -1
  49. package/dist/mcp/subagent.js +54 -5
  50. package/dist/ui/components/ChatInput.js +22 -25
  51. package/dist/ui/components/CommandPanel.d.ts +1 -1
  52. package/dist/ui/components/CommandPanel.js +20 -13
  53. package/dist/ui/components/DiffViewer.d.ts +1 -1
  54. package/dist/ui/components/DiffViewer.js +101 -91
  55. package/dist/ui/components/FileList.js +22 -11
  56. package/dist/ui/components/HelpPanel.js +47 -21
  57. package/dist/ui/components/Menu.js +6 -2
  58. package/dist/ui/components/MessageList.d.ts +6 -0
  59. package/dist/ui/components/MessageList.js +1 -1
  60. package/dist/ui/components/ToolConfirmation.d.ts +4 -1
  61. package/dist/ui/components/ToolConfirmation.js +28 -2
  62. package/dist/ui/components/ToolResultPreview.d.ts +2 -1
  63. package/dist/ui/components/ToolResultPreview.js +41 -25
  64. package/dist/ui/pages/ChatScreen.js +177 -56
  65. package/dist/ui/pages/CodeBaseConfigScreen.js +54 -30
  66. package/dist/ui/pages/ConfigScreen.js +138 -98
  67. package/dist/ui/pages/CustomHeadersScreen.js +75 -69
  68. package/dist/ui/pages/LanguageSettingsScreen.d.ts +7 -0
  69. package/dist/ui/pages/LanguageSettingsScreen.js +89 -0
  70. package/dist/ui/pages/ProxyConfigScreen.js +27 -23
  71. package/dist/ui/pages/SensitiveCommandConfigScreen.js +32 -25
  72. package/dist/ui/pages/SubAgentConfigScreen.js +88 -75
  73. package/dist/ui/pages/SystemPromptConfigScreen.js +31 -26
  74. package/dist/ui/pages/WelcomeScreen.js +40 -26
  75. package/dist/utils/apiConfig.d.ts +2 -0
  76. package/dist/utils/codebaseConfig.d.ts +1 -5
  77. package/dist/utils/codebaseConfig.js +2 -10
  78. package/dist/utils/codebaseSearchEvents.d.ts +16 -0
  79. package/dist/utils/codebaseSearchEvents.js +13 -0
  80. package/dist/utils/commands/agent.js +2 -2
  81. package/dist/utils/commands/init.js +1 -1
  82. package/dist/utils/configManager.js +26 -5
  83. package/dist/utils/contextCompressor.js +1 -1
  84. package/dist/utils/languageConfig.d.ts +21 -0
  85. package/dist/utils/languageConfig.js +61 -0
  86. package/dist/utils/mcpToolsManager.js +0 -9
  87. package/dist/utils/notebookManager.js +11 -4
  88. package/dist/utils/sessionConverter.js +13 -3
  89. package/dist/utils/sessionManager.d.ts +1 -0
  90. package/dist/utils/subAgentConfig.d.ts +10 -5
  91. package/dist/utils/subAgentConfig.js +112 -19
  92. package/dist/utils/subAgentExecutor.d.ts +9 -1
  93. package/dist/utils/subAgentExecutor.js +122 -9
  94. package/dist/utils/toolExecutor.d.ts +2 -1
  95. package/dist/utils/toolExecutor.js +1 -2
  96. package/dist/utils/usageLogger.js +18 -3
  97. package/package.json +2 -1
@@ -4,6 +4,7 @@ import Gradient from 'ink-gradient';
4
4
  import { Alert } from '@inkjs/ui';
5
5
  import TextInput from 'ink-text-input';
6
6
  import { loadCodebaseConfig, saveCodebaseConfig, } from '../../utils/codebaseConfig.js';
7
+ import { useI18n } from '../../i18n/index.js';
7
8
  const focusEventTokenRegex = /(?:\x1b)?\[[0-9;]*[IO]/g;
8
9
  const isFocusEventInput = (value) => {
9
10
  if (!value) {
@@ -37,8 +38,10 @@ const stripFocusArtifacts = (value) => {
37
38
  .replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
38
39
  };
39
40
  export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = false, }) {
41
+ const { t } = useI18n();
40
42
  // Configuration state
41
43
  const [enabled, setEnabled] = useState(false);
44
+ const [enableAgentReview, setEnableAgentReview] = useState(true);
42
45
  const [embeddingModelName, setEmbeddingModelName] = useState('');
43
46
  const [embeddingBaseUrl, setEmbeddingBaseUrl] = useState('');
44
47
  const [embeddingApiKey, setEmbeddingApiKey] = useState('');
@@ -53,6 +56,7 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
53
56
  const MAX_VISIBLE_FIELDS = 8;
54
57
  const allFields = [
55
58
  'enabled',
59
+ 'enableAgentReview',
56
60
  'embeddingModelName',
57
61
  'embeddingBaseUrl',
58
62
  'embeddingApiKey',
@@ -68,6 +72,7 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
68
72
  const loadConfiguration = () => {
69
73
  const config = loadCodebaseConfig();
70
74
  setEnabled(config.enabled);
75
+ setEnableAgentReview(config.enableAgentReview);
71
76
  setEmbeddingModelName(config.embedding.modelName);
72
77
  setEmbeddingBaseUrl(config.embedding.baseUrl);
73
78
  setEmbeddingApiKey(config.embedding.apiKey);
@@ -81,24 +86,24 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
81
86
  if (enabled) {
82
87
  // Embedding configuration is required
83
88
  if (!embeddingModelName.trim()) {
84
- validationErrors.push('Embedding model name is required when enabled');
89
+ validationErrors.push(t.codebaseConfig.validationModelNameRequired);
85
90
  }
86
91
  if (!embeddingBaseUrl.trim()) {
87
- validationErrors.push('Embedding base URL is required when enabled');
92
+ validationErrors.push(t.codebaseConfig.validationBaseUrlRequired);
88
93
  // Embedding API key is optional (for local deployments like Ollama)
89
94
  // if (!embeddingApiKey.trim()) {
90
95
  // validationErrors.push('Embedding API key is required when enabled');
91
96
  // }
92
97
  }
93
98
  if (embeddingDimensions <= 0) {
94
- validationErrors.push('Embedding dimensions must be greater than 0');
99
+ validationErrors.push(t.codebaseConfig.validationDimensionsPositive);
95
100
  }
96
101
  // Batch configuration validation
97
102
  if (batchMaxLines <= 0) {
98
- validationErrors.push('Batch max lines must be greater than 0');
103
+ validationErrors.push(t.codebaseConfig.validationMaxLinesPositive);
99
104
  }
100
105
  if (batchConcurrency <= 0) {
101
- validationErrors.push('Batch concurrency must be greater than 0');
106
+ validationErrors.push(t.codebaseConfig.validationConcurrencyPositive);
102
107
  }
103
108
  // LLM is optional - no validation needed
104
109
  }
@@ -109,17 +114,13 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
109
114
  try {
110
115
  const config = {
111
116
  enabled,
117
+ enableAgentReview,
112
118
  embedding: {
113
119
  modelName: embeddingModelName,
114
120
  baseUrl: embeddingBaseUrl,
115
121
  apiKey: embeddingApiKey,
116
122
  dimensions: embeddingDimensions,
117
123
  },
118
- llm: {
119
- modelName: '',
120
- baseUrl: '',
121
- apiKey: '',
122
- },
123
124
  batch: {
124
125
  maxLines: batchMaxLines,
125
126
  concurrency: batchConcurrency,
@@ -135,7 +136,7 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
135
136
  }
136
137
  catch (error) {
137
138
  setErrors([
138
- error instanceof Error ? error.message : 'Failed to save configuration',
139
+ error instanceof Error ? error.message : t.codebaseConfig.saveError,
139
140
  ]);
140
141
  }
141
142
  };
@@ -147,46 +148,61 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
147
148
  return (React.createElement(Box, { key: field, flexDirection: "column" },
148
149
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
149
150
  isActive ? '❯ ' : ' ',
150
- "CodeBase Enabled:"),
151
+ t.codebaseConfig.codebaseEnabled),
152
+ React.createElement(Box, { marginLeft: 3 },
153
+ React.createElement(Text, { color: "gray" },
154
+ enabled ? t.codebaseConfig.enabled : t.codebaseConfig.disabled,
155
+ ' ',
156
+ t.codebaseConfig.toggleHint))));
157
+ case 'enableAgentReview':
158
+ return (React.createElement(Box, { key: field, flexDirection: "column" },
159
+ React.createElement(Text, { color: isActive ? 'green' : 'white' },
160
+ isActive ? '❯ ' : ' ',
161
+ t.codebaseConfig.agentReview),
151
162
  React.createElement(Box, { marginLeft: 3 },
152
163
  React.createElement(Text, { color: "gray" },
153
- enabled ? '[✓] Enabled' : '[ ] Disabled',
154
- " (Press Enter to toggle)"))));
164
+ enableAgentReview
165
+ ? t.codebaseConfig.enabled
166
+ : t.codebaseConfig.disabled,
167
+ ' ',
168
+ t.codebaseConfig.toggleHint))));
155
169
  case 'embeddingModelName':
156
170
  return (React.createElement(Box, { key: field, flexDirection: "column" },
157
171
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
158
172
  isActive ? '❯ ' : ' ',
159
- "Embedding Model Name:"),
173
+ t.codebaseConfig.embeddingModelName),
160
174
  isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
161
175
  React.createElement(Text, { color: "cyan" },
162
176
  React.createElement(TextInput, { value: embeddingModelName, onChange: value => setEmbeddingModelName(stripFocusArtifacts(value)), onSubmit: () => setIsEditing(false) })))),
163
177
  !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
164
- React.createElement(Text, { color: "gray" }, embeddingModelName || 'Not set')))));
178
+ React.createElement(Text, { color: "gray" }, embeddingModelName || t.codebaseConfig.notSet)))));
165
179
  case 'embeddingBaseUrl':
166
180
  return (React.createElement(Box, { key: field, flexDirection: "column" },
167
181
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
168
182
  isActive ? '❯ ' : ' ',
169
- "Embedding Base URL:"),
183
+ t.codebaseConfig.embeddingBaseUrl),
170
184
  isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
171
185
  React.createElement(Text, { color: "cyan" },
172
186
  React.createElement(TextInput, { value: embeddingBaseUrl, onChange: value => setEmbeddingBaseUrl(stripFocusArtifacts(value)), onSubmit: () => setIsEditing(false) })))),
173
187
  !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
174
- React.createElement(Text, { color: "gray" }, embeddingBaseUrl || 'Not set')))));
188
+ React.createElement(Text, { color: "gray" }, embeddingBaseUrl || t.codebaseConfig.notSet)))));
175
189
  case 'embeddingApiKey':
176
190
  return (React.createElement(Box, { key: field, flexDirection: "column" },
177
191
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
178
192
  isActive ? '❯ ' : ' ',
179
- "Embedding API Key (Optional for local):"),
193
+ t.codebaseConfig.embeddingApiKeyOptional),
180
194
  isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
181
195
  React.createElement(Text, { color: "cyan" },
182
196
  React.createElement(TextInput, { value: embeddingApiKey, onChange: value => setEmbeddingApiKey(stripFocusArtifacts(value)), onSubmit: () => setIsEditing(false), mask: "*" })))),
183
197
  !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
184
- React.createElement(Text, { color: "gray" }, embeddingApiKey ? '••••••••' : 'Not set')))));
198
+ React.createElement(Text, { color: "gray" }, embeddingApiKey
199
+ ? t.codebaseConfig.masked
200
+ : t.codebaseConfig.notSet)))));
185
201
  case 'embeddingDimensions':
186
202
  return (React.createElement(Box, { key: field, flexDirection: "column" },
187
203
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
188
204
  isActive ? '❯ ' : ' ',
189
- "Embedding Dimensions:"),
205
+ t.codebaseConfig.embeddingDimensions),
190
206
  isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
191
207
  React.createElement(Text, { color: "cyan" },
192
208
  React.createElement(TextInput, { value: embeddingDimensions.toString(), onChange: value => {
@@ -201,7 +217,7 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
201
217
  return (React.createElement(Box, { key: field, flexDirection: "column" },
202
218
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
203
219
  isActive ? '❯ ' : ' ',
204
- "Batch Max Lines:"),
220
+ t.codebaseConfig.batchMaxLines),
205
221
  isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
206
222
  React.createElement(Text, { color: "cyan" },
207
223
  React.createElement(TextInput, { value: batchMaxLines.toString(), onChange: value => {
@@ -216,7 +232,7 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
216
232
  return (React.createElement(Box, { key: field, flexDirection: "column" },
217
233
  React.createElement(Text, { color: isActive ? 'green' : 'white' },
218
234
  isActive ? '❯ ' : ' ',
219
- "Batch Concurrency:"),
235
+ t.codebaseConfig.batchConcurrency),
220
236
  isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
221
237
  React.createElement(Text, { color: "cyan" },
222
238
  React.createElement(TextInput, { value: batchConcurrency.toString(), onChange: value => {
@@ -269,8 +285,15 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
269
285
  setEnabled(!enabled);
270
286
  return;
271
287
  }
288
+ // Toggle enableAgentReview field
289
+ if (key.return && currentField === 'enableAgentReview') {
290
+ setEnableAgentReview(!enableAgentReview);
291
+ return;
292
+ }
272
293
  // Enter editing mode for text fields
273
- if (key.return && currentField !== 'enabled') {
294
+ if (key.return &&
295
+ currentField !== 'enabled' &&
296
+ currentField !== 'enableAgentReview') {
274
297
  setIsEditing(true);
275
298
  return;
276
299
  }
@@ -286,18 +309,19 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
286
309
  return (React.createElement(Box, { flexDirection: "column", padding: 1 },
287
310
  !inlineMode && (React.createElement(Box, { marginBottom: 1, borderStyle: "double", borderColor: 'cyan', paddingX: 2 },
288
311
  React.createElement(Box, { flexDirection: "column" },
289
- React.createElement(Gradient, { name: "rainbow" }, "CodeBase Configuration"),
290
- React.createElement(Text, { color: "gray", dimColor: true }, "Configure codebase indexing and search settings")))),
312
+ React.createElement(Gradient, { name: "rainbow" }, t.codebaseConfig.title),
313
+ React.createElement(Text, { color: "gray", dimColor: true }, t.codebaseConfig.subtitle)))),
291
314
  React.createElement(Box, { marginBottom: 1 },
292
315
  React.createElement(Text, { color: "yellow", bold: true },
293
- "Settings (",
316
+ t.codebaseConfig.settingsPosition,
317
+ " (",
294
318
  currentFieldIndex + 1,
295
319
  "/",
296
320
  totalFields,
297
321
  ")"),
298
322
  totalFields > MAX_VISIBLE_FIELDS && (React.createElement(Text, { color: "gray", dimColor: true },
299
323
  ' ',
300
- "\u00B7 \u2191\u2193 to scroll"))),
324
+ t.codebaseConfig.scrollHint))),
301
325
  React.createElement(Box, { flexDirection: "column" }, (() => {
302
326
  // Calculate visible window
303
327
  if (allFields.length <= MAX_VISIBLE_FIELDS) {
@@ -316,9 +340,9 @@ export default function CodeBaseConfigScreen({ onBack, onSave, inlineMode = fals
316
340
  return visibleFields.map(field => renderField(field));
317
341
  })()),
318
342
  errors.length > 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
319
- React.createElement(Text, { color: "red", bold: true }, "Errors:"),
343
+ React.createElement(Text, { color: "red", bold: true }, t.codebaseConfig.errors),
320
344
  errors.map((error, index) => (React.createElement(Text, { key: index, color: "red" },
321
345
  "\u2022 ",
322
346
  error))))),
323
- React.createElement(Box, { flexDirection: "column", marginTop: 1 }, isEditing ? (React.createElement(Alert, { variant: "info" }, "Editing mode: Type to edit, Enter to save, Esc to cancel")) : (React.createElement(Alert, { variant: "info" }, "Use \u2191\u2193 to navigate, Enter to edit/toggle, Ctrl+S or Esc to save")))));
347
+ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, isEditing ? (React.createElement(Alert, { variant: "info" }, t.codebaseConfig.editingHint)) : (React.createElement(Alert, { variant: "info" }, t.codebaseConfig.navigationHint)))));
324
348
  }