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.
- package/dist/agents/codebaseIndexAgent.js +1 -0
- package/dist/agents/codebaseReviewAgent.d.ts +61 -0
- package/dist/agents/codebaseReviewAgent.js +301 -0
- package/dist/agents/promptOptimizeAgent.d.ts +54 -0
- package/dist/agents/promptOptimizeAgent.js +268 -0
- package/dist/api/anthropic.js +1 -0
- package/dist/api/chat.js +1 -0
- package/dist/api/embedding.js +1 -0
- package/dist/api/gemini.js +2 -1
- package/dist/api/responses.js +1 -0
- package/dist/api/systemPrompt.d.ts +1 -5
- package/dist/api/systemPrompt.js +168 -100
- package/dist/app.js +14 -6
- package/dist/cli.js +1 -1
- package/dist/hooks/useCommandPanel.js +48 -46
- package/dist/hooks/useConversation.d.ts +2 -1
- package/dist/hooks/useConversation.js +116 -30
- package/dist/hooks/useGlobalExit.js +4 -2
- package/dist/hooks/useStreamingState.d.ts +9 -0
- package/dist/hooks/useStreamingState.js +3 -0
- package/dist/i18n/I18nContext.d.ts +14 -0
- package/dist/i18n/I18nContext.js +24 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/lang/en.d.ts +2 -0
- package/dist/i18n/lang/en.js +483 -0
- package/dist/i18n/lang/es.d.ts +2 -0
- package/dist/i18n/lang/es.js +483 -0
- package/dist/i18n/lang/ja.d.ts +2 -0
- package/dist/i18n/lang/ja.js +483 -0
- package/dist/i18n/lang/ko.d.ts +2 -0
- package/dist/i18n/lang/ko.js +483 -0
- package/dist/i18n/lang/zh-TW.d.ts +2 -0
- package/dist/i18n/lang/zh-TW.js +483 -0
- package/dist/i18n/lang/zh.d.ts +2 -0
- package/dist/i18n/lang/zh.js +483 -0
- package/dist/i18n/translations.d.ts +2 -0
- package/dist/i18n/translations.js +14 -0
- package/dist/i18n/types.d.ts +459 -0
- package/dist/i18n/types.js +1 -0
- package/dist/mcp/aceCodeSearch.d.ts +17 -48
- package/dist/mcp/aceCodeSearch.js +24 -56
- package/dist/mcp/bash.js +8 -1
- package/dist/mcp/codebaseSearch.d.ts +1 -1
- package/dist/mcp/codebaseSearch.js +159 -30
- package/dist/mcp/filesystem.d.ts +3 -80
- package/dist/mcp/filesystem.js +23 -103
- package/dist/mcp/subagent.d.ts +2 -1
- package/dist/mcp/subagent.js +54 -5
- package/dist/ui/components/ChatInput.js +22 -25
- package/dist/ui/components/CommandPanel.d.ts +1 -1
- package/dist/ui/components/CommandPanel.js +20 -13
- package/dist/ui/components/DiffViewer.d.ts +1 -1
- package/dist/ui/components/DiffViewer.js +101 -91
- package/dist/ui/components/FileList.js +22 -11
- package/dist/ui/components/HelpPanel.js +47 -21
- package/dist/ui/components/Menu.js +6 -2
- package/dist/ui/components/MessageList.d.ts +6 -0
- package/dist/ui/components/MessageList.js +1 -1
- package/dist/ui/components/ToolConfirmation.d.ts +4 -1
- package/dist/ui/components/ToolConfirmation.js +28 -2
- package/dist/ui/components/ToolResultPreview.d.ts +2 -1
- package/dist/ui/components/ToolResultPreview.js +41 -25
- package/dist/ui/pages/ChatScreen.js +177 -56
- package/dist/ui/pages/CodeBaseConfigScreen.js +54 -30
- package/dist/ui/pages/ConfigScreen.js +138 -98
- package/dist/ui/pages/CustomHeadersScreen.js +75 -69
- package/dist/ui/pages/LanguageSettingsScreen.d.ts +7 -0
- package/dist/ui/pages/LanguageSettingsScreen.js +89 -0
- package/dist/ui/pages/ProxyConfigScreen.js +27 -23
- package/dist/ui/pages/SensitiveCommandConfigScreen.js +32 -25
- package/dist/ui/pages/SubAgentConfigScreen.js +88 -75
- package/dist/ui/pages/SystemPromptConfigScreen.js +31 -26
- package/dist/ui/pages/WelcomeScreen.js +40 -26
- package/dist/utils/apiConfig.d.ts +2 -0
- package/dist/utils/codebaseConfig.d.ts +1 -5
- package/dist/utils/codebaseConfig.js +2 -10
- package/dist/utils/codebaseSearchEvents.d.ts +16 -0
- package/dist/utils/codebaseSearchEvents.js +13 -0
- package/dist/utils/commands/agent.js +2 -2
- package/dist/utils/commands/init.js +1 -1
- package/dist/utils/configManager.js +26 -5
- package/dist/utils/contextCompressor.js +1 -1
- package/dist/utils/languageConfig.d.ts +21 -0
- package/dist/utils/languageConfig.js +61 -0
- package/dist/utils/mcpToolsManager.js +0 -9
- package/dist/utils/notebookManager.js +11 -4
- package/dist/utils/sessionConverter.js +13 -3
- package/dist/utils/sessionManager.d.ts +1 -0
- package/dist/utils/subAgentConfig.d.ts +10 -5
- package/dist/utils/subAgentConfig.js +112 -19
- package/dist/utils/subAgentExecutor.d.ts +9 -1
- package/dist/utils/subAgentExecutor.js +122 -9
- package/dist/utils/toolExecutor.d.ts +2 -1
- package/dist/utils/toolExecutor.js +1 -2
- package/dist/utils/usageLogger.js +18 -3
- 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(
|
|
89
|
+
validationErrors.push(t.codebaseConfig.validationModelNameRequired);
|
|
85
90
|
}
|
|
86
91
|
if (!embeddingBaseUrl.trim()) {
|
|
87
|
-
validationErrors.push(
|
|
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(
|
|
99
|
+
validationErrors.push(t.codebaseConfig.validationDimensionsPositive);
|
|
95
100
|
}
|
|
96
101
|
// Batch configuration validation
|
|
97
102
|
if (batchMaxLines <= 0) {
|
|
98
|
-
validationErrors.push(
|
|
103
|
+
validationErrors.push(t.codebaseConfig.validationMaxLinesPositive);
|
|
99
104
|
}
|
|
100
105
|
if (batchConcurrency <= 0) {
|
|
101
|
-
validationErrors.push(
|
|
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 :
|
|
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
|
-
|
|
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
|
-
|
|
154
|
-
|
|
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
|
-
|
|
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 ||
|
|
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
|
-
|
|
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 ||
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 &&
|
|
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" },
|
|
290
|
-
React.createElement(Text, { color: "gray", dimColor: true },
|
|
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
|
-
|
|
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
|
-
|
|
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 },
|
|
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" },
|
|
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
|
}
|