snow-ai 0.2.23 → 0.2.25
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/compactAgent.d.ts +55 -0
- package/dist/agents/compactAgent.js +301 -0
- package/dist/api/chat.d.ts +0 -8
- package/dist/api/chat.js +1 -144
- package/dist/api/responses.d.ts +0 -11
- package/dist/api/responses.js +1 -189
- package/dist/api/systemPrompt.d.ts +1 -1
- package/dist/api/systemPrompt.js +80 -206
- package/dist/app.d.ts +2 -1
- package/dist/app.js +11 -13
- package/dist/cli.js +23 -3
- package/dist/hooks/useConversation.js +51 -7
- package/dist/hooks/useGlobalNavigation.d.ts +1 -1
- package/dist/hooks/useKeyboardInput.js +14 -8
- package/dist/mcp/filesystem.d.ts +49 -6
- package/dist/mcp/filesystem.js +243 -86
- package/dist/mcp/websearch.d.ts +118 -0
- package/dist/mcp/websearch.js +451 -0
- package/dist/ui/components/ToolResultPreview.js +60 -1
- package/dist/ui/pages/ChatScreen.d.ts +4 -2
- package/dist/ui/pages/ChatScreen.js +62 -14
- package/dist/ui/pages/{ApiConfigScreen.d.ts → ConfigScreen.d.ts} +1 -1
- package/dist/ui/pages/ConfigScreen.js +549 -0
- package/dist/ui/pages/{ModelConfigScreen.d.ts → ProxyConfigScreen.d.ts} +1 -1
- package/dist/ui/pages/ProxyConfigScreen.js +143 -0
- package/dist/ui/pages/WelcomeScreen.js +15 -15
- package/dist/utils/apiConfig.d.ts +8 -2
- package/dist/utils/apiConfig.js +21 -0
- package/dist/utils/commandExecutor.d.ts +1 -1
- package/dist/utils/contextCompressor.js +363 -49
- package/dist/utils/mcpToolsManager.d.ts +1 -1
- package/dist/utils/mcpToolsManager.js +106 -6
- package/dist/utils/resourceMonitor.d.ts +65 -0
- package/dist/utils/resourceMonitor.js +175 -0
- package/dist/utils/retryUtils.js +6 -0
- package/dist/utils/sessionManager.d.ts +1 -0
- package/dist/utils/sessionManager.js +10 -0
- package/dist/utils/textBuffer.js +7 -2
- package/dist/utils/toolExecutor.d.ts +2 -2
- package/dist/utils/toolExecutor.js +4 -4
- package/package.json +5 -1
- package/dist/ui/pages/ApiConfigScreen.js +0 -161
- package/dist/ui/pages/ModelConfigScreen.js +0 -467
|
@@ -38,7 +38,7 @@ import '../../utils/commands/yolo.js';
|
|
|
38
38
|
import '../../utils/commands/init.js';
|
|
39
39
|
import '../../utils/commands/ide.js';
|
|
40
40
|
import '../../utils/commands/compact.js';
|
|
41
|
-
export default function ChatScreen({}) {
|
|
41
|
+
export default function ChatScreen({ skipWelcome }) {
|
|
42
42
|
const [messages, setMessages] = useState([]);
|
|
43
43
|
const [isSaving] = useState(false);
|
|
44
44
|
const [currentTodos, setCurrentTodos] = useState([]);
|
|
@@ -86,6 +86,35 @@ export default function ChatScreen({}) {
|
|
|
86
86
|
// Ignore localStorage errors
|
|
87
87
|
}
|
|
88
88
|
}, [yoloMode]);
|
|
89
|
+
// Auto-resume last session when skipWelcome is true
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
if (!skipWelcome)
|
|
92
|
+
return;
|
|
93
|
+
const autoResume = async () => {
|
|
94
|
+
try {
|
|
95
|
+
const sessions = await sessionManager.listSessions();
|
|
96
|
+
if (sessions.length > 0) {
|
|
97
|
+
// Get the most recent session (already sorted by updatedAt)
|
|
98
|
+
const latestSession = sessions[0];
|
|
99
|
+
if (latestSession) {
|
|
100
|
+
const session = await sessionManager.loadSession(latestSession.id);
|
|
101
|
+
if (session) {
|
|
102
|
+
// Initialize from session
|
|
103
|
+
const uiMessages = convertSessionMessagesToUI(session.messages);
|
|
104
|
+
setMessages(uiMessages);
|
|
105
|
+
initializeFromSession(session.messages);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// If no sessions exist, just stay in chat screen with empty state
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
// Silently fail - just stay in empty chat screen
|
|
113
|
+
console.error('Failed to auto-resume session:', error);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
autoResume();
|
|
117
|
+
}, [skipWelcome, initializeFromSession]);
|
|
89
118
|
// Clear terminal and remount on terminal width change (like gemini-cli)
|
|
90
119
|
// Use debounce to avoid flickering during continuous resize
|
|
91
120
|
useEffect(() => {
|
|
@@ -192,6 +221,8 @@ export default function ChatScreen({}) {
|
|
|
192
221
|
streamingState.abortController) {
|
|
193
222
|
// Abort the controller
|
|
194
223
|
streamingState.abortController.abort();
|
|
224
|
+
// Remove all pending tool call messages (those with toolPending: true)
|
|
225
|
+
setMessages(prev => prev.filter(msg => !msg.toolPending));
|
|
195
226
|
// Add discontinued message
|
|
196
227
|
setMessages(prev => [
|
|
197
228
|
...prev,
|
|
@@ -216,8 +247,8 @@ export default function ChatScreen({}) {
|
|
|
216
247
|
totalFileCount += count;
|
|
217
248
|
}
|
|
218
249
|
}
|
|
250
|
+
// Show confirmation dialog if there are files to rollback
|
|
219
251
|
if (totalFileCount > 0) {
|
|
220
|
-
// Show confirmation dialog with total file count
|
|
221
252
|
snapshotState.setPendingRollback({
|
|
222
253
|
messageIndex: selectedIndex,
|
|
223
254
|
fileCount: totalFileCount,
|
|
@@ -239,6 +270,8 @@ export default function ChatScreen({}) {
|
|
|
239
270
|
}
|
|
240
271
|
// Truncate messages array to remove the selected user message and everything after it
|
|
241
272
|
setMessages(prev => prev.slice(0, selectedIndex));
|
|
273
|
+
// Truncate session messages to match the UI state
|
|
274
|
+
await sessionManager.truncateMessages(selectedIndex);
|
|
242
275
|
clearSavedMessages();
|
|
243
276
|
setRemountKey(prev => prev + 1);
|
|
244
277
|
// Clear pending rollback dialog
|
|
@@ -387,26 +420,41 @@ export default function ChatScreen({}) {
|
|
|
387
420
|
setPendingMessages([]);
|
|
388
421
|
// Combine multiple pending messages into one
|
|
389
422
|
const combinedMessage = messagesToProcess.join('\n\n');
|
|
390
|
-
//
|
|
391
|
-
const
|
|
423
|
+
// Parse and validate file references (same as processMessage)
|
|
424
|
+
const { cleanContent, validFiles } = await parseAndValidateFileReferences(combinedMessage);
|
|
425
|
+
// Separate image files from regular files
|
|
426
|
+
const imageFiles = validFiles.filter(f => f.isImage && f.imageData && f.mimeType);
|
|
427
|
+
const regularFiles = validFiles.filter(f => !f.isImage);
|
|
428
|
+
// Convert image files to image content format
|
|
429
|
+
const imageContents = imageFiles.length > 0
|
|
430
|
+
? imageFiles.map(f => ({
|
|
431
|
+
type: 'image',
|
|
432
|
+
data: f.imageData,
|
|
433
|
+
mimeType: f.mimeType,
|
|
434
|
+
}))
|
|
435
|
+
: undefined;
|
|
436
|
+
// Get system information (not needed for pending messages - they are follow-ups)
|
|
437
|
+
const systemInfo = undefined;
|
|
438
|
+
// Add user message to chat with file references and images
|
|
439
|
+
const userMessage = {
|
|
440
|
+
role: 'user',
|
|
441
|
+
content: cleanContent,
|
|
442
|
+
files: validFiles.length > 0 ? validFiles : undefined,
|
|
443
|
+
images: imageContents,
|
|
444
|
+
};
|
|
392
445
|
setMessages(prev => [...prev, userMessage]);
|
|
393
446
|
// Start streaming response
|
|
394
447
|
streamingState.setIsStreaming(true);
|
|
395
448
|
// Create new abort controller for this request
|
|
396
449
|
const controller = new AbortController();
|
|
397
450
|
streamingState.setAbortController(controller);
|
|
398
|
-
// Save user message
|
|
399
|
-
saveMessage({
|
|
400
|
-
role: 'user',
|
|
401
|
-
content: combinedMessage,
|
|
402
|
-
}).catch(error => {
|
|
403
|
-
console.error('Failed to save user message:', error);
|
|
404
|
-
});
|
|
405
451
|
try {
|
|
406
|
-
//
|
|
452
|
+
// Create message for AI with file read instructions, and editor context
|
|
453
|
+
const messageForAI = createMessageWithFileInstructions(cleanContent, regularFiles, systemInfo, vscodeState.vscodeConnected ? vscodeState.editorContext : undefined);
|
|
454
|
+
// Use the same conversation handler
|
|
407
455
|
await handleConversationWithTools({
|
|
408
|
-
userContent:
|
|
409
|
-
imageContents
|
|
456
|
+
userContent: messageForAI,
|
|
457
|
+
imageContents,
|
|
410
458
|
controller,
|
|
411
459
|
messages,
|
|
412
460
|
saveMessage,
|
|
@@ -4,5 +4,5 @@ type Props = {
|
|
|
4
4
|
onSave: () => void;
|
|
5
5
|
inlineMode?: boolean;
|
|
6
6
|
};
|
|
7
|
-
export default function
|
|
7
|
+
export default function ConfigScreen({ onBack, onSave, inlineMode, }: Props): React.JSX.Element;
|
|
8
8
|
export {};
|