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.
Files changed (43) hide show
  1. package/dist/agents/compactAgent.d.ts +55 -0
  2. package/dist/agents/compactAgent.js +301 -0
  3. package/dist/api/chat.d.ts +0 -8
  4. package/dist/api/chat.js +1 -144
  5. package/dist/api/responses.d.ts +0 -11
  6. package/dist/api/responses.js +1 -189
  7. package/dist/api/systemPrompt.d.ts +1 -1
  8. package/dist/api/systemPrompt.js +80 -206
  9. package/dist/app.d.ts +2 -1
  10. package/dist/app.js +11 -13
  11. package/dist/cli.js +23 -3
  12. package/dist/hooks/useConversation.js +51 -7
  13. package/dist/hooks/useGlobalNavigation.d.ts +1 -1
  14. package/dist/hooks/useKeyboardInput.js +14 -8
  15. package/dist/mcp/filesystem.d.ts +49 -6
  16. package/dist/mcp/filesystem.js +243 -86
  17. package/dist/mcp/websearch.d.ts +118 -0
  18. package/dist/mcp/websearch.js +451 -0
  19. package/dist/ui/components/ToolResultPreview.js +60 -1
  20. package/dist/ui/pages/ChatScreen.d.ts +4 -2
  21. package/dist/ui/pages/ChatScreen.js +62 -14
  22. package/dist/ui/pages/{ApiConfigScreen.d.ts → ConfigScreen.d.ts} +1 -1
  23. package/dist/ui/pages/ConfigScreen.js +549 -0
  24. package/dist/ui/pages/{ModelConfigScreen.d.ts → ProxyConfigScreen.d.ts} +1 -1
  25. package/dist/ui/pages/ProxyConfigScreen.js +143 -0
  26. package/dist/ui/pages/WelcomeScreen.js +15 -15
  27. package/dist/utils/apiConfig.d.ts +8 -2
  28. package/dist/utils/apiConfig.js +21 -0
  29. package/dist/utils/commandExecutor.d.ts +1 -1
  30. package/dist/utils/contextCompressor.js +363 -49
  31. package/dist/utils/mcpToolsManager.d.ts +1 -1
  32. package/dist/utils/mcpToolsManager.js +106 -6
  33. package/dist/utils/resourceMonitor.d.ts +65 -0
  34. package/dist/utils/resourceMonitor.js +175 -0
  35. package/dist/utils/retryUtils.js +6 -0
  36. package/dist/utils/sessionManager.d.ts +1 -0
  37. package/dist/utils/sessionManager.js +10 -0
  38. package/dist/utils/textBuffer.js +7 -2
  39. package/dist/utils/toolExecutor.d.ts +2 -2
  40. package/dist/utils/toolExecutor.js +4 -4
  41. package/package.json +5 -1
  42. package/dist/ui/pages/ApiConfigScreen.js +0 -161
  43. 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
- // Add user message to chat
391
- const userMessage = { role: 'user', content: combinedMessage };
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
- // Use the same conversation handler (no file references for pending messages)
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: combinedMessage,
409
- imageContents: undefined,
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 ApiConfigScreen({ onBack, onSave, inlineMode }: Props): React.JSX.Element;
7
+ export default function ConfigScreen({ onBack, onSave, inlineMode, }: Props): React.JSX.Element;
8
8
  export {};