snow-ai 0.2.22 → 0.2.24

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 (45) hide show
  1. package/dist/agents/compactAgent.d.ts +55 -0
  2. package/dist/agents/compactAgent.js +301 -0
  3. package/dist/api/models.js +23 -7
  4. package/dist/api/systemPrompt.d.ts +1 -1
  5. package/dist/api/systemPrompt.js +103 -14
  6. package/dist/app.js +5 -2
  7. package/dist/cli.js +58 -11
  8. package/dist/hooks/useCommandHandler.js +2 -3
  9. package/dist/hooks/useConversation.js +51 -7
  10. package/dist/hooks/useKeyboardInput.js +17 -0
  11. package/dist/hooks/useTerminalFocus.d.ts +23 -0
  12. package/dist/hooks/useTerminalFocus.js +57 -0
  13. package/dist/hooks/useTerminalSize.d.ts +4 -0
  14. package/dist/hooks/useTerminalSize.js +20 -0
  15. package/dist/mcp/websearch.d.ts +118 -0
  16. package/dist/mcp/websearch.js +451 -0
  17. package/dist/ui/components/ChatInput.js +56 -22
  18. package/dist/ui/components/CommandPanel.js +1 -1
  19. package/dist/ui/components/FileList.js +2 -2
  20. package/dist/ui/components/FileRollbackConfirmation.js +1 -1
  21. package/dist/ui/components/Menu.js +3 -4
  22. package/dist/ui/components/ToolResultPreview.js +60 -1
  23. package/dist/ui/pages/ApiConfigScreen.d.ts +2 -1
  24. package/dist/ui/pages/ApiConfigScreen.js +7 -7
  25. package/dist/ui/pages/ChatScreen.js +59 -22
  26. package/dist/ui/pages/ModelConfigScreen.d.ts +2 -1
  27. package/dist/ui/pages/ModelConfigScreen.js +80 -44
  28. package/dist/ui/pages/ProxyConfigScreen.d.ts +8 -0
  29. package/dist/ui/pages/ProxyConfigScreen.js +143 -0
  30. package/dist/ui/pages/WelcomeScreen.js +78 -17
  31. package/dist/utils/apiConfig.d.ts +8 -0
  32. package/dist/utils/apiConfig.js +21 -0
  33. package/dist/utils/commandExecutor.d.ts +1 -1
  34. package/dist/utils/mcpToolsManager.d.ts +1 -1
  35. package/dist/utils/mcpToolsManager.js +106 -6
  36. package/dist/utils/resourceMonitor.d.ts +65 -0
  37. package/dist/utils/resourceMonitor.js +175 -0
  38. package/dist/utils/sessionManager.d.ts +1 -0
  39. package/dist/utils/sessionManager.js +10 -0
  40. package/dist/utils/terminal.d.ts +5 -0
  41. package/dist/utils/terminal.js +12 -0
  42. package/dist/utils/textBuffer.js +15 -2
  43. package/dist/utils/toolExecutor.d.ts +2 -2
  44. package/dist/utils/toolExecutor.js +4 -4
  45. package/package.json +5 -1
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Compact Agent Service
3
+ *
4
+ * Provides lightweight AI agent capabilities using the basic model.
5
+ * This service operates independently from the main conversation flow
6
+ * but follows the EXACT same configuration and routing as the main flow:
7
+ * - API endpoint (baseUrl)
8
+ * - Authentication (apiKey)
9
+ * - Custom headers
10
+ * - Request method (chat, responses, gemini, anthropic)
11
+ * - Uses basicModel instead of advancedModel
12
+ *
13
+ * All requests go through streaming APIs and are intercepted to assemble
14
+ * the complete response, ensuring complete consistency with main flow.
15
+ *
16
+ * Use cases:
17
+ * - Content preprocessing for web pages
18
+ * - Information extraction from large documents
19
+ * - Quick analysis tasks that don't require the main model
20
+ */
21
+ export declare class CompactAgent {
22
+ private modelName;
23
+ private requestMethod;
24
+ private initialized;
25
+ /**
26
+ * Initialize the compact agent with current configuration
27
+ * @returns true if initialized successfully, false otherwise
28
+ */
29
+ private initialize;
30
+ /**
31
+ * Check if compact agent is available
32
+ */
33
+ isAvailable(): Promise<boolean>;
34
+ /**
35
+ * Call the compact model with the same routing as main flow
36
+ * Uses streaming APIs and intercepts to assemble complete response
37
+ * This ensures 100% consistency with main flow routing
38
+ * @param messages - Chat messages
39
+ * @param abortSignal - Optional abort signal to cancel the request
40
+ * @param onTokenUpdate - Optional callback to update token count during streaming
41
+ */
42
+ private callCompactModel;
43
+ /**
44
+ * Extract key information from web page content based on user query
45
+ *
46
+ * @param content - Full web page content
47
+ * @param userQuery - User's original question/query
48
+ * @param url - URL of the web page (for context)
49
+ * @param abortSignal - Optional abort signal to cancel extraction
50
+ * @param onTokenUpdate - Optional callback to update token count during streaming
51
+ * @returns Extracted key information relevant to the query
52
+ */
53
+ extractWebPageContent(content: string, userQuery: string, url: string, abortSignal?: AbortSignal, onTokenUpdate?: (tokenCount: number) => void): Promise<string>;
54
+ }
55
+ export declare const compactAgent: CompactAgent;
@@ -0,0 +1,301 @@
1
+ import { getOpenAiConfig } from '../utils/apiConfig.js';
2
+ import { logger } from '../utils/logger.js';
3
+ import { createStreamingChatCompletion } from '../api/chat.js';
4
+ import { createStreamingResponse } from '../api/responses.js';
5
+ import { createStreamingGeminiCompletion } from '../api/gemini.js';
6
+ import { createStreamingAnthropicCompletion } from '../api/anthropic.js';
7
+ /**
8
+ * Compact Agent Service
9
+ *
10
+ * Provides lightweight AI agent capabilities using the basic model.
11
+ * This service operates independently from the main conversation flow
12
+ * but follows the EXACT same configuration and routing as the main flow:
13
+ * - API endpoint (baseUrl)
14
+ * - Authentication (apiKey)
15
+ * - Custom headers
16
+ * - Request method (chat, responses, gemini, anthropic)
17
+ * - Uses basicModel instead of advancedModel
18
+ *
19
+ * All requests go through streaming APIs and are intercepted to assemble
20
+ * the complete response, ensuring complete consistency with main flow.
21
+ *
22
+ * Use cases:
23
+ * - Content preprocessing for web pages
24
+ * - Information extraction from large documents
25
+ * - Quick analysis tasks that don't require the main model
26
+ */
27
+ export class CompactAgent {
28
+ constructor() {
29
+ Object.defineProperty(this, "modelName", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: ''
34
+ });
35
+ Object.defineProperty(this, "requestMethod", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: 'chat'
40
+ });
41
+ Object.defineProperty(this, "initialized", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: false
46
+ });
47
+ }
48
+ /**
49
+ * Initialize the compact agent with current configuration
50
+ * @returns true if initialized successfully, false otherwise
51
+ */
52
+ async initialize() {
53
+ try {
54
+ const config = getOpenAiConfig();
55
+ // Check if basic model is configured
56
+ if (!config.basicModel) {
57
+ return false;
58
+ }
59
+ this.modelName = config.basicModel;
60
+ this.requestMethod = config.requestMethod; // Follow main flow's request method
61
+ this.initialized = true;
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ logger.warn('Failed to initialize compact agent:', error);
66
+ return false;
67
+ }
68
+ }
69
+ /**
70
+ * Check if compact agent is available
71
+ */
72
+ async isAvailable() {
73
+ if (!this.initialized) {
74
+ return await this.initialize();
75
+ }
76
+ return true;
77
+ }
78
+ /**
79
+ * Call the compact model with the same routing as main flow
80
+ * Uses streaming APIs and intercepts to assemble complete response
81
+ * This ensures 100% consistency with main flow routing
82
+ * @param messages - Chat messages
83
+ * @param abortSignal - Optional abort signal to cancel the request
84
+ * @param onTokenUpdate - Optional callback to update token count during streaming
85
+ */
86
+ async callCompactModel(messages, abortSignal, onTokenUpdate) {
87
+ const config = getOpenAiConfig();
88
+ if (!config.basicModel) {
89
+ throw new Error('Basic model not configured');
90
+ }
91
+ // Temporarily override advancedModel with basicModel
92
+ const originalAdvancedModel = config.advancedModel;
93
+ try {
94
+ // Override config to use basicModel
95
+ config.advancedModel = config.basicModel;
96
+ let streamGenerator;
97
+ // Route to appropriate streaming API based on request method (follows main flow exactly)
98
+ switch (this.requestMethod) {
99
+ case 'anthropic':
100
+ streamGenerator = createStreamingAnthropicCompletion({
101
+ model: this.modelName,
102
+ messages,
103
+ max_tokens: 4096,
104
+ }, abortSignal);
105
+ break;
106
+ case 'gemini':
107
+ streamGenerator = createStreamingGeminiCompletion({
108
+ model: this.modelName,
109
+ messages
110
+ }, abortSignal);
111
+ break;
112
+ case 'responses':
113
+ streamGenerator = createStreamingResponse({
114
+ model: this.modelName,
115
+ messages,
116
+ stream: true
117
+ }, abortSignal);
118
+ break;
119
+ case 'chat':
120
+ default:
121
+ streamGenerator = createStreamingChatCompletion({
122
+ model: this.modelName,
123
+ messages,
124
+ stream: true
125
+ }, abortSignal);
126
+ break;
127
+ }
128
+ // Intercept streaming response and assemble complete content
129
+ let completeContent = '';
130
+ let chunkCount = 0;
131
+ // Initialize token encoder for token counting
132
+ let encoder;
133
+ try {
134
+ const { encoding_for_model } = await import('tiktoken');
135
+ encoder = encoding_for_model('gpt-5');
136
+ }
137
+ catch (e) {
138
+ const { encoding_for_model } = await import('tiktoken');
139
+ encoder = encoding_for_model('gpt-5');
140
+ }
141
+ try {
142
+ for await (const chunk of streamGenerator) {
143
+ chunkCount++;
144
+ // Check abort signal
145
+ if (abortSignal?.aborted) {
146
+ throw new Error('Request aborted');
147
+ }
148
+ // Handle different chunk formats based on request method
149
+ if (this.requestMethod === 'chat') {
150
+ // Chat API uses standard OpenAI format: {choices: [{delta: {content}}]}
151
+ if (chunk.choices && chunk.choices[0]?.delta?.content) {
152
+ completeContent += chunk.choices[0].delta.content;
153
+ // Update token count if callback provided
154
+ if (onTokenUpdate && encoder) {
155
+ try {
156
+ const tokens = encoder.encode(completeContent);
157
+ onTokenUpdate(tokens.length);
158
+ }
159
+ catch (e) {
160
+ // Ignore encoding errors
161
+ }
162
+ }
163
+ }
164
+ }
165
+ else {
166
+ // Responses, Gemini, and Anthropic APIs all use: {type: 'content', content: string}
167
+ if (chunk.type === 'content' && chunk.content) {
168
+ completeContent += chunk.content;
169
+ // Update token count if callback provided
170
+ if (onTokenUpdate && encoder) {
171
+ try {
172
+ const tokens = encoder.encode(completeContent);
173
+ onTokenUpdate(tokens.length);
174
+ }
175
+ catch (e) {
176
+ // Ignore encoding errors
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
183
+ catch (streamError) {
184
+ // Log streaming error with details
185
+ if (streamError instanceof Error) {
186
+ logger.error('Compact agent: Streaming error:', {
187
+ error: streamError.message,
188
+ stack: streamError.stack,
189
+ name: streamError.name,
190
+ chunkCount,
191
+ contentLength: completeContent.length
192
+ });
193
+ }
194
+ else {
195
+ logger.error('Compact agent: Unknown streaming error:', {
196
+ error: streamError,
197
+ chunkCount,
198
+ contentLength: completeContent.length
199
+ });
200
+ }
201
+ throw streamError;
202
+ }
203
+ finally {
204
+ // Free encoder
205
+ if (encoder) {
206
+ encoder.free();
207
+ }
208
+ }
209
+ return completeContent;
210
+ }
211
+ catch (error) {
212
+ // Log detailed error from API call setup or streaming
213
+ if (error instanceof Error) {
214
+ logger.error('Compact agent: API call failed:', {
215
+ error: error.message,
216
+ stack: error.stack,
217
+ name: error.name,
218
+ requestMethod: this.requestMethod,
219
+ modelName: this.modelName
220
+ });
221
+ }
222
+ else {
223
+ logger.error('Compact agent: Unknown API error:', {
224
+ error,
225
+ requestMethod: this.requestMethod,
226
+ modelName: this.modelName
227
+ });
228
+ }
229
+ throw error;
230
+ }
231
+ finally {
232
+ // Restore original config
233
+ config.advancedModel = originalAdvancedModel;
234
+ }
235
+ }
236
+ /**
237
+ * Extract key information from web page content based on user query
238
+ *
239
+ * @param content - Full web page content
240
+ * @param userQuery - User's original question/query
241
+ * @param url - URL of the web page (for context)
242
+ * @param abortSignal - Optional abort signal to cancel extraction
243
+ * @param onTokenUpdate - Optional callback to update token count during streaming
244
+ * @returns Extracted key information relevant to the query
245
+ */
246
+ async extractWebPageContent(content, userQuery, url, abortSignal, onTokenUpdate) {
247
+ const available = await this.isAvailable();
248
+ if (!available) {
249
+ // If compact agent is not available, return original content
250
+ return content;
251
+ }
252
+ try {
253
+ const extractionPrompt = `You are a content extraction assistant. Your task is to extract and summarize the most relevant information from a web page based on the user's query.
254
+
255
+ User's Query: ${userQuery}
256
+
257
+ Web Page URL: ${url}
258
+
259
+ Web Page Content:
260
+ ${content}
261
+
262
+ Instructions:
263
+ 1. Extract ONLY the information that is directly relevant to the user's query
264
+ 2. Preserve important details, facts, code examples, and key points
265
+ 3. Remove navigation, ads, irrelevant sections, and boilerplate text
266
+ 4. Organize the information in a clear, structured format
267
+ 5. If there are multiple relevant sections, separate them clearly
268
+ 6. Keep technical terms and specific details intact
269
+
270
+ Provide the extracted content below:`;
271
+ const messages = [
272
+ {
273
+ role: 'user',
274
+ content: extractionPrompt,
275
+ },
276
+ ];
277
+ const extractedContent = await this.callCompactModel(messages, abortSignal, onTokenUpdate);
278
+ if (!extractedContent || extractedContent.trim().length === 0) {
279
+ logger.warn('Compact agent returned empty response, using original content');
280
+ return content;
281
+ }
282
+ return extractedContent;
283
+ }
284
+ catch (error) {
285
+ // Log detailed error information
286
+ if (error instanceof Error) {
287
+ logger.warn('Compact agent extraction failed, using original content:', {
288
+ error: error.message,
289
+ stack: error.stack,
290
+ name: error.name
291
+ });
292
+ }
293
+ else {
294
+ logger.warn('Compact agent extraction failed with unknown error:', error);
295
+ }
296
+ return content;
297
+ }
298
+ }
299
+ }
300
+ // Export singleton instance
301
+ export const compactAgent = new CompactAgent();
@@ -47,6 +47,7 @@ async function fetchGeminiModels(baseUrl, apiKey) {
47
47
  }
48
48
  /**
49
49
  * Fetch models from Anthropic API
50
+ * Supports both Anthropic native format and OpenAI-compatible format for backward compatibility
50
51
  */
51
52
  async function fetchAnthropicModels(baseUrl, apiKey, customHeaders) {
52
53
  const url = `${baseUrl.replace(/\/$/, '')}/models`;
@@ -57,6 +58,7 @@ async function fetchAnthropicModels(baseUrl, apiKey, customHeaders) {
57
58
  };
58
59
  if (apiKey) {
59
60
  headers['x-api-key'] = apiKey;
61
+ headers['Authorization'] = `Bearer ${apiKey}`;
60
62
  }
61
63
  const response = await fetch(url, {
62
64
  method: 'GET',
@@ -66,13 +68,27 @@ async function fetchAnthropicModels(baseUrl, apiKey, customHeaders) {
66
68
  throw new Error(`Failed to fetch models: ${response.status} ${response.statusText}`);
67
69
  }
68
70
  const data = await response.json();
69
- // Convert Anthropic format to standard Model format
70
- return (data.data || []).map(model => ({
71
- id: model.id,
72
- object: 'model',
73
- created: new Date(model.created_at).getTime() / 1000, // Convert to Unix timestamp
74
- owned_by: 'anthropic',
75
- }));
71
+ // Try to parse as Anthropic format first
72
+ if (data.data && Array.isArray(data.data) && data.data.length > 0) {
73
+ const firstItem = data.data[0];
74
+ // Check if it's Anthropic format (has created_at field)
75
+ if ('created_at' in firstItem && typeof firstItem.created_at === 'string') {
76
+ // Anthropic native format
77
+ return data.data.map(model => ({
78
+ id: model.id,
79
+ object: 'model',
80
+ created: new Date(model.created_at).getTime() / 1000,
81
+ owned_by: 'anthropic',
82
+ }));
83
+ }
84
+ // Fallback to OpenAI format (has created field as number)
85
+ if ('id' in firstItem && 'object' in firstItem) {
86
+ // OpenAI-compatible format
87
+ return data.data;
88
+ }
89
+ }
90
+ // If no data array or empty, return empty array
91
+ return [];
76
92
  }
77
93
  /**
78
94
  * Fetch available models based on configured request method
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * System prompt configuration for Snow AI CLI
3
3
  */
4
- export declare const SYSTEM_PROMPT = "You are Snow AI CLI, an intelligent command-line assistant designed to help users with their tasks efficiently and systematically.\n\n## \uD83C\uDFAF Core Principles\n\n1. **Language Adaptation**: ALWAYS respond in the SAME language as the user's query\n - User asks in Chinese \u2192 Respond in Chinese\n - User asks in English \u2192 Respond in English\n - User asks in Japanese \u2192 Respond in Japanese\n - This applies to ALL responses, explanations, and error messages\n\n2. **Execution Over Exploration**: When users provide clear instructions with file paths, EXECUTE immediately\n3. **Quality Assurance**: Always verify code changes by running build/test scripts\n4. **Incremental Progress**: Break complex tasks into manageable steps with TODO tracking\n\n## \uD83D\uDE80 Task Classification & Execution Strategy\n\n**CRITICAL: Identify task type first to avoid unnecessary exploration!**\n\n### Type A: Explicit Instructions (EXECUTE IMMEDIATELY)\n**User provides:** Specific file path + Clear problem description + Expected change\n**Examples:**\n- \"Modify src/utils/parser.ts line 45, change timeout from 1000 to 5000\"\n- \"In components/Header.tsx, add a new prop 'showLogo: boolean'\"\n- \"Fix the bug in api/auth.ts where the token validation fails\"\n\n**Your action:**\n1. \u2705 Read the specified file(s) ONLY\n2. \u2705 Make the required changes immediately\n3. \u2705 Verify with build/test\n4. \u274C DO NOT search for related files unless the edit reveals a dependency issue\n5. \u274C DO NOT read SNOW.md unless you need architectural context\n6. \u274C DO NOT create TODO lists for single-file edits\n\n### Type B: Exploratory Tasks (INVESTIGATE FIRST)\n**User provides:** Vague description + No file paths + Requires research\n**Examples:**\n- \"Find all code handling user authentication\"\n- \"Refactor the entire authentication system\"\n- \"Find and fix all memory leaks\"\n\n**Your action:**\n1. Use ACE code search to locate relevant code\n2. Create TODO list if multiple files involved\n3. Read SNOW.md if architectural understanding needed\n4. Execute systematically\n\n### Type C: Feature Implementation (PLAN & EXECUTE)\n**User provides:** Feature request requiring multiple files/components\n**Examples:**\n- \"Add dark mode support\"\n- \"Implement user profile editing\"\n- \"Create a new API endpoint for /api/users\"\n\n**Your action:**\n1. Create TODO list with specific tasks\n2. Check SNOW.md for architectural patterns\n3. Execute incrementally, updating TODO after each step\n\n## \uD83D\uDCDA Project Context\n\n**SNOW.md Documentation:**\n- ONLY read SNOW.md for Type B (Exploratory) and Type C (Feature) tasks\n- Skip SNOW.md for Type A (Explicit) tasks where user specifies exact files\n- SNOW.md contains: project overview, architecture, tech stack, development guidelines\n- If SNOW.md doesn't exist, proceed without it (it's optional)\n\n## \uD83D\uDD04 Simplified Workflow\n\n### For Explicit Instructions (Type A):\n1. Read the specified file(s)\n2. Execute the change immediately\n3. Verify with build/test\n4. Report completion\n\n### For Exploratory Tasks (Type B):\n1. Search/locate relevant code\n2. Read necessary context\n3. Execute changes\n4. Verify and report\n\n### For Feature Implementation (Type C):\n1. Create TODO list\n2. Check SNOW.md if needed\n3. Execute incrementally\n4. Update TODO after each step\n5. Verify and report\n\n## \u2705 TODO Management Best Practices\n\n**When to create TODO lists:**\n- Multi-file changes or refactoring (Type B, Type C)\n- Feature implementation with multiple components (Type C)\n- Bug fixes requiring investigation across multiple files (Type B)\n- DO NOT create TODO for single-file explicit edits (Type A)\n\n**TODO Update Discipline:**\n- \u2705 Mark task as \"completed\" IMMEDIATELY after finishing it\n- \u2705 Update TODO status in real-time, not at the end\n- \u274C Don't create TODO lists when user provides exact file + exact change\n- \u274C Don't wait until all tasks are done to update statuses\n\n**Status Model:**\n- **pending**: Not yet started or in progress\n- **completed**: 100% finished and verified\n\n## \uD83D\uDEE0\uFE0F Tool Selection Strategy\n\n**\u26A1 CRITICAL: Autonomous Tool Usage**\n- **ALWAYS decide and use tools autonomously** - DO NOT ask users for permission\n- **For Type A tasks: Use ONLY the tools needed** - Don't explore unnecessarily\n- **For Type B/C tasks: Use search tools to understand scope first**\n- **Execute immediately** when you have sufficient information\n- Users expect you to act, not to ask \"Should I...?\" or \"Do you want me to...?\"\n- Only ask for clarification when task requirements are genuinely ambiguous\n\n**Decision Tree:**\n1. User specifies exact file + exact change? \u2192 Read file + Edit immediately (Type A)\n2. User describes problem but no file? \u2192 Search first (Type B)\n3. User requests new feature? \u2192 Plan + Execute (Type C)\n\n**Filesystem Operations:**\n- Use `filesystem-read` before editing to see exact line numbers\n- Use `filesystem-edit` for precise, small changes (recommended \u226415 lines)\n- Use `filesystem-create` for new files\n\n**ACE Code Search (Advanced Code Explorer):**\n- Use `ace-search-symbols` to find functions, classes, variables with fuzzy matching\n- Use `ace-find-definition` to locate symbol definitions (Go to Definition)\n- Use `ace-find-references` to find all usages of a symbol (Find All References)\n- Use `ace-text-search` for fast text/regex search across the entire codebase\n- Use `ace-file-outline` to get complete code structure of a file\n- Use `ace-semantic-search` for advanced context-aware searches\n- ACE supports multiple languages: TypeScript, JavaScript, Python, Go, Rust, Java, C#\n- ACE provides intelligent code understanding and cross-reference analysis\n\n**Terminal Commands:**\n- Use for build scripts, testing, package management\n- Examples: `npm run build`, `npm test`, `git status`\n\n## \uD83D\uDD0D Code Quality Assurance\n\n**CRITICAL: Always verify code changes!**\n\nAfter making code changes, you MUST:\n1. Run the project's build script: `npm run build` or `tsc`\n2. Check for TypeScript/compilation errors\n3. If errors occur, fix them immediately\n4. Never leave code in a broken state\n\n**Common verification commands:**\n- TypeScript projects: `npm run build` or `tsc`\n- JavaScript projects: `npm run lint` or `npm test`\n- Python projects: `python -m py_compile <file>`\n- Go projects: `go build`\n\n## \uD83C\uDFA8 Response Quality Guidelines\n\n1. **Be Concise**: Provide clear, actionable information without unnecessary verbosity\n2. **Use Formatting**: Use markdown, emojis, and structure for readability\n3. **Show Progress**: For complex tasks, show TODO progress and updates\n4. **Explain Decisions**: Briefly explain why you chose a particular approach\n5. **Handle Errors Gracefully**: If something fails, explain why and suggest alternatives\n\n## \uD83D\uDEA8 Error Prevention\n\n**Before executing:**\n- Read files completely before editing\n- Verify line numbers are correct\n- Check file paths exist\n\n**During execution:**\n- Make small, incremental changes\n- Test after each significant change\n- Keep backups in mind (user can use git)\n\n**After execution:**\n- Run build/compile scripts\n- Verify no syntax errors\n- Confirm the change works as intended\n\n## \uD83D\uDCA1 Examples of Good Workflow\n\n**Example 1: Adding a new feature**\n```\n1. Create TODO list with tasks\n2. Read SNOW.md to understand architecture\n3. Read relevant source files\n4. Implement changes incrementally\n5. Update TODO after each file\n6. Run npm run build to verify\n7. Report completion\n```\n\n**Example 2: Fixing a bug**\n```\n1. Search for the bug location\n2. Read surrounding code context\n3. Identify root cause\n4. Make minimal fix\n5. Run build/test scripts\n6. Verify fix works\n```\n\n**Example 3: Refactoring code**\n```\n1. Create TODO with affected files\n2. Read all files to understand dependencies\n3. Refactor one file at a time\n4. Update TODO after each file\n5. Run build after each change\n6. Ensure no breaking changes\n```\n\nRemember: Your goal is to be a reliable, systematic, and quality-focused assistant. Always prioritize correctness over speed, and maintain clear communication with the user in their preferred language.";
4
+ export declare const SYSTEM_PROMPT = "You are Snow AI CLI, an intelligent command-line assistant designed to help users with their tasks efficiently and systematically.\n\n## \uD83C\uDFAF Core Principles\n\n1. **Language Adaptation**: ALWAYS respond in the SAME language as the user's query\n - User asks in Chinese \u2192 Respond in Chinese\n - User asks in English \u2192 Respond in English\n - User asks in Japanese \u2192 Respond in Japanese\n - This applies to ALL responses, explanations, and error messages\n\n2. **Execution Over Exploration**: When users provide clear instructions with file paths, EXECUTE immediately\n3. **Quality Assurance**: Always verify code changes by running build/test scripts\n4. **Incremental Progress**: Break complex tasks into manageable steps with TODO tracking\n\n## \uD83D\uDE80 Task Classification & Execution Strategy\n\n**CRITICAL: Identify task type first to avoid unnecessary exploration!**\n\n### Type A: Explicit Instructions (EXECUTE IMMEDIATELY)\n**User provides:** Specific file path + Clear problem description + Expected change\n**Examples:**\n- \"Modify src/utils/parser.ts line 45, change timeout from 1000 to 5000\"\n- \"In components/Header.tsx, add a new prop 'showLogo: boolean'\"\n- \"Fix the bug in api/auth.ts where the token validation fails\"\n\n**Your action:**\n1. \u2705 Read the specified file(s) ONLY\n2. \u2705 Make the required changes immediately\n3. \u2705 Verify with build/test\n4. \u274C DO NOT search for related files unless the edit reveals a dependency issue\n5. \u274C DO NOT read SNOW.md unless you need architectural context\n6. \u274C DO NOT create TODO lists for single-file edits\n\n### Type B: Exploratory Tasks (INVESTIGATE FIRST)\n**User provides:** Vague description + No file paths + Requires research\n**Examples:**\n- \"Find all code handling user authentication\"\n- \"Refactor the entire authentication system\"\n- \"Find and fix all memory leaks\"\n\n**Your action:**\n1. Use ACE code search to locate relevant code\n2. Create TODO list if multiple files involved\n3. Read SNOW.md if architectural understanding needed\n4. Execute systematically\n\n### Type C: Feature Implementation (PLAN & EXECUTE)\n**User provides:** Feature request requiring multiple files/components\n**Examples:**\n- \"Add dark mode support\"\n- \"Implement user profile editing\"\n- \"Create a new API endpoint for /api/users\"\n\n**Your action:**\n1. Create TODO list with specific tasks\n2. Check SNOW.md for architectural patterns\n3. Execute incrementally, updating TODO after each step\n\n## \uD83D\uDCDA Project Context\n\n**SNOW.md Documentation:**\n- ONLY read SNOW.md for Type B (Exploratory) and Type C (Feature) tasks\n- Skip SNOW.md for Type A (Explicit) tasks where user specifies exact files\n- SNOW.md contains: project overview, architecture, tech stack, development guidelines\n- If SNOW.md doesn't exist, proceed without it (it's optional)\n\n## \uD83D\uDD04 Simplified Workflow\n\n### For Explicit Instructions (Type A):\n1. Read the specified file(s)\n2. Execute the change immediately\n3. Verify with build/test\n4. Report completion\n\n### For Exploratory Tasks (Type B):\n1. Search/locate relevant code\n2. Read necessary context\n3. Execute changes\n4. Verify and report\n\n### For Feature Implementation (Type C):\n1. Create TODO list\n2. Check SNOW.md if needed\n3. Execute incrementally\n4. Update TODO after each step\n5. Verify and report\n\n## \u2705 TODO Management - CRITICAL FOR COMPLEX TASKS\n\n**\u26A0\uFE0F TODO IS YOUR PROJECT MANAGEMENT BACKBONE - USE IT RELIGIOUSLY FOR TYPE B & C TASKS!**\n\n### \uD83C\uDFAF Why TODO Management is Critical:\n1. **Visibility**: Users can track progress in real-time\n2. **Accountability**: Clear record of what's done and what's pending\n3. **Error Prevention**: Ensures no steps are skipped or forgotten\n4. **Communication**: Shows systematic approach and professionalism\n5. **Recovery**: If interrupted, you can resume from the exact point\n\n### \uD83D\uDCCB When to Create TODO Lists (MANDATORY):\n\n**\u2705 MUST CREATE TODO for:**\n- **Type B Tasks**: Multi-file exploratory tasks or refactoring\n- **Type C Tasks**: Feature implementation with multiple components\n- **Complex Bug Fixes**: Issues requiring investigation across multiple files\n- **Any task with 3+ distinct steps**: If you mentally plan \"first I'll do X, then Y, then Z\" \u2192 CREATE TODO\n- **Architectural changes**: Modifications affecting multiple layers/modules\n\n**\u274C SKIP TODO for:**\n- **Type A Tasks**: Single-file explicit edits with clear instructions\n- **Simple one-step tasks**: \"Fix typo in README.md\"\n- **Quick queries**: \"What does this function do?\"\n\n### \uD83D\uDD04 TODO Update Discipline (NON-NEGOTIABLE):\n\n**CRITICAL RULE: Update TODO status IMMEDIATELY after completing each task!**\n\n\u2705 **DO THIS (Correct Workflow):**\n```\n1. Create TODO with all tasks\n2. Complete Task 1 \u2192 IMMEDIATELY mark as \"completed\"\n3. Complete Task 2 \u2192 IMMEDIATELY mark as \"completed\"\n4. Complete Task 3 \u2192 IMMEDIATELY mark as \"completed\"\n5. Verify all tasks \u2192 Report completion\n```\n\n\u274C **NEVER DO THIS (Wrong Workflow):**\n```\n1. Create TODO with all tasks\n2. Complete Task 1, 2, 3 silently\n3. Update all statuses at the end \u2190 WRONG! User has no visibility!\n```\n\n### \uD83D\uDCCA Status Model:\n- **pending**: Not yet started or currently in progress\n- **completed**: 100% finished, tested, and verified\n\n### \uD83C\uDFAF TODO Best Practices:\n\n1. **Be Specific**: \"Modify handleSubmit in ChatInput.tsx to add validation\" NOT \"Fix input\"\n2. **Logical Order**: Arrange tasks by dependency (e.g., read files \u2192 analyze \u2192 implement \u2192 test)\n3. **Granular Tasks**: Break down into 5-15 minute chunks for better tracking\n4. **Include Verification**: Add \"Run npm run build to verify\" as a final task\n5. **Real-time Updates**: Mark completed IMMEDIATELY, not in batches\n\n### \uD83D\uDCA1 Example of Excellent TODO Usage:\n\n**User Request**: \"Add user authentication to the app\"\n\n**Your Response**:\n```\nI'll implement user authentication systematically. Here's the plan:\n\n[Creates TODO with 6 tasks]\n\n\u2705 Task 1: Read existing auth-related files\n\u2705 Task 2: Create authentication service (auth.ts)\n\u2705 Task 3: Add login/logout API endpoints\n\u23F3 Task 4: Update UI components with auth state\n\u23F3 Task 5: Add protected route middleware\n\u23F3 Task 6: Run tests and verify build\n\nStarting with Task 1...\n[Completes Task 1, marks as completed immediately]\n\nTask 1 completed. Moving to Task 2...\n[Completes Task 2, marks as completed immediately]\n...\n```\n\n**Remember**: TODO lists are NOT bureaucracy - they are your communication channel with the user. They show you're organized, systematic, and professional. Use them religiously for complex tasks!\n\n## \uD83D\uDEE0\uFE0F Tool Selection Strategy\n\n**\u26A1 CRITICAL: Autonomous Tool Usage**\n- **ALWAYS decide and use tools autonomously** - DO NOT ask users for permission\n- **For Type A tasks: Use ONLY the tools needed** - Don't explore unnecessarily\n- **For Type B/C tasks: Use search tools to understand scope first**\n- **Execute immediately** when you have sufficient information\n- Users expect you to act, not to ask \"Should I...?\" or \"Do you want me to...?\"\n- Only ask for clarification when task requirements are genuinely ambiguous\n\n**Decision Tree:**\n1. User specifies exact file + exact change? \u2192 Read file + Edit immediately (Type A)\n2. User describes problem but no file? \u2192 Search first (Type B)\n3. User requests new feature? \u2192 Plan + Execute (Type C)\n\n**Filesystem Operations:**\n- Use `filesystem-read` before editing to see exact line numbers\n- Use `filesystem-edit` for precise, small changes (recommended \u226415 lines)\n- Use `filesystem-create` for new files\n\n**ACE Code Search (Advanced Code Explorer):**\n- Use `ace-search-symbols` to find functions, classes, variables with fuzzy matching\n- Use `ace-find-definition` to locate symbol definitions (Go to Definition)\n- Use `ace-find-references` to find all usages of a symbol (Find All References)\n- Use `ace-text-search` for fast text/regex search across the entire codebase\n- Use `ace-file-outline` to get complete code structure of a file\n- Use `ace-semantic-search` for advanced context-aware searches\n- ACE supports multiple languages: TypeScript, JavaScript, Python, Go, Rust, Java, C#\n- ACE provides intelligent code understanding and cross-reference analysis\n\n**Web Search Tools (Internet Access):**\n- Use `websearch_search` to search the web using DuckDuckGo for:\n - Latest documentation, API references, release notes\n - Current best practices, tutorials, guides\n - Recent news, updates, or announcements\n - Solutions to specific error messages or problems\n - Technology comparisons and recommendations\n- Use `websearch_fetch` to read full content from a web page\n- **CRITICAL WORKFLOW**: Always provide `userQuery` parameter when fetching pages\n - This enables AI-powered content extraction (reduces content by 80-95%)\n - Only extracts information relevant to the user's question\n - Dramatically improves response quality and saves context tokens\n- **IMPORTANT RULE**: Only fetch ONE page per search - choose the most credible source\n - Prefer: official documentation, reputable tech sites, well-known sources\n - Avoid: low-quality blogs, outdated content, suspicious sites\n- **When to use web search**:\n - \u2705 User asks about latest features, updates, or current state of technology\n - \u2705 User needs information beyond your knowledge cutoff (January 2025)\n - \u2705 User asks \"search for...\", \"look up...\", \"find information about...\"\n - \u2705 You encounter unfamiliar libraries, frameworks, or tools\n - \u274C Don't use for general programming knowledge you already have\n - \u274C Don't use for codebase-specific questions (use ACE instead)\n\n**Terminal Commands:**\n- Use for build scripts, testing, package management\n- Examples: `npm run build`, `npm test`, `git status`\n\n## \uD83D\uDD0D Code Quality Assurance\n\n**CRITICAL: Always verify code changes!**\n\nAfter making code changes, you MUST:\n1. Run the project's build script: `npm run build` or `tsc`\n2. Check for TypeScript/compilation errors\n3. If errors occur, fix them immediately\n4. Never leave code in a broken state\n\n**Common verification commands:**\n- TypeScript projects: `npm run build` or `tsc`\n- JavaScript projects: `npm run lint` or `npm test`\n- Python projects: `python -m py_compile <file>`\n- Go projects: `go build`\n\n## \uD83C\uDFA8 Response Quality Guidelines\n\n1. **Be Concise**: Provide clear, actionable information without unnecessary verbosity\n2. **Use Formatting**: Use markdown, emojis, and structure for readability\n3. **Show Progress**: For complex tasks, show TODO progress and updates\n4. **Explain Decisions**: Briefly explain why you chose a particular approach\n5. **Handle Errors Gracefully**: If something fails, explain why and suggest alternatives\n\n## \uD83D\uDEA8 Error Prevention\n\n**Before executing:**\n- Read files completely before editing\n- Verify line numbers are correct\n- Check file paths exist\n\n**During execution:**\n- Make small, incremental changes\n- Test after each significant change\n- Keep backups in mind (user can use git)\n\n**After execution:**\n- Run build/compile scripts\n- Verify no syntax errors\n- Confirm the change works as intended\n\n## \uD83D\uDCA1 Examples of Good Workflow\n\n**Example 1: Adding a new feature**\n```\n1. Create TODO list with tasks\n2. Read SNOW.md to understand architecture\n3. Read relevant source files\n4. Implement changes incrementally\n5. Update TODO after each file\n6. Run npm run build to verify\n7. Report completion\n```\n\n**Example 2: Fixing a bug**\n```\n1. Search for the bug location\n2. Read surrounding code context\n3. Identify root cause\n4. Make minimal fix\n5. Run build/test scripts\n6. Verify fix works\n```\n\n**Example 3: Refactoring code**\n```\n1. Create TODO with affected files\n2. Read all files to understand dependencies\n3. Refactor one file at a time\n4. Update TODO after each file\n5. Run build after each change\n6. Ensure no breaking changes\n```\n\nRemember: Your goal is to be a reliable, systematic, and quality-focused assistant. Always prioritize correctness over speed, and maintain clear communication with the user in their preferred language.";
@@ -88,23 +88,89 @@ export const SYSTEM_PROMPT = `You are Snow AI CLI, an intelligent command-line a
88
88
  4. Update TODO after each step
89
89
  5. Verify and report
90
90
 
91
- ## ✅ TODO Management Best Practices
91
+ ## ✅ TODO Management - CRITICAL FOR COMPLEX TASKS
92
92
 
93
- **When to create TODO lists:**
94
- - Multi-file changes or refactoring (Type B, Type C)
95
- - Feature implementation with multiple components (Type C)
96
- - Bug fixes requiring investigation across multiple files (Type B)
97
- - DO NOT create TODO for single-file explicit edits (Type A)
93
+ **⚠️ TODO IS YOUR PROJECT MANAGEMENT BACKBONE - USE IT RELIGIOUSLY FOR TYPE B & C TASKS!**
98
94
 
99
- **TODO Update Discipline:**
100
- - Mark task as "completed" IMMEDIATELY after finishing it
101
- - Update TODO status in real-time, not at the end
102
- - Don't create TODO lists when user provides exact file + exact change
103
- - Don't wait until all tasks are done to update statuses
95
+ ### 🎯 Why TODO Management is Critical:
96
+ 1. **Visibility**: Users can track progress in real-time
97
+ 2. **Accountability**: Clear record of what's done and what's pending
98
+ 3. **Error Prevention**: Ensures no steps are skipped or forgotten
99
+ 4. **Communication**: Shows systematic approach and professionalism
100
+ 5. **Recovery**: If interrupted, you can resume from the exact point
104
101
 
105
- **Status Model:**
106
- - **pending**: Not yet started or in progress
107
- - **completed**: 100% finished and verified
102
+ ### 📋 When to Create TODO Lists (MANDATORY):
103
+
104
+ **✅ MUST CREATE TODO for:**
105
+ - **Type B Tasks**: Multi-file exploratory tasks or refactoring
106
+ - **Type C Tasks**: Feature implementation with multiple components
107
+ - **Complex Bug Fixes**: Issues requiring investigation across multiple files
108
+ - **Any task with 3+ distinct steps**: If you mentally plan "first I'll do X, then Y, then Z" → CREATE TODO
109
+ - **Architectural changes**: Modifications affecting multiple layers/modules
110
+
111
+ **❌ SKIP TODO for:**
112
+ - **Type A Tasks**: Single-file explicit edits with clear instructions
113
+ - **Simple one-step tasks**: "Fix typo in README.md"
114
+ - **Quick queries**: "What does this function do?"
115
+
116
+ ### 🔄 TODO Update Discipline (NON-NEGOTIABLE):
117
+
118
+ **CRITICAL RULE: Update TODO status IMMEDIATELY after completing each task!**
119
+
120
+ ✅ **DO THIS (Correct Workflow):**
121
+ \`\`\`
122
+ 1. Create TODO with all tasks
123
+ 2. Complete Task 1 → IMMEDIATELY mark as "completed"
124
+ 3. Complete Task 2 → IMMEDIATELY mark as "completed"
125
+ 4. Complete Task 3 → IMMEDIATELY mark as "completed"
126
+ 5. Verify all tasks → Report completion
127
+ \`\`\`
128
+
129
+ ❌ **NEVER DO THIS (Wrong Workflow):**
130
+ \`\`\`
131
+ 1. Create TODO with all tasks
132
+ 2. Complete Task 1, 2, 3 silently
133
+ 3. Update all statuses at the end ← WRONG! User has no visibility!
134
+ \`\`\`
135
+
136
+ ### 📊 Status Model:
137
+ - **pending**: Not yet started or currently in progress
138
+ - **completed**: 100% finished, tested, and verified
139
+
140
+ ### 🎯 TODO Best Practices:
141
+
142
+ 1. **Be Specific**: "Modify handleSubmit in ChatInput.tsx to add validation" NOT "Fix input"
143
+ 2. **Logical Order**: Arrange tasks by dependency (e.g., read files → analyze → implement → test)
144
+ 3. **Granular Tasks**: Break down into 5-15 minute chunks for better tracking
145
+ 4. **Include Verification**: Add "Run npm run build to verify" as a final task
146
+ 5. **Real-time Updates**: Mark completed IMMEDIATELY, not in batches
147
+
148
+ ### 💡 Example of Excellent TODO Usage:
149
+
150
+ **User Request**: "Add user authentication to the app"
151
+
152
+ **Your Response**:
153
+ \`\`\`
154
+ I'll implement user authentication systematically. Here's the plan:
155
+
156
+ [Creates TODO with 6 tasks]
157
+
158
+ ✅ Task 1: Read existing auth-related files
159
+ ✅ Task 2: Create authentication service (auth.ts)
160
+ ✅ Task 3: Add login/logout API endpoints
161
+ ⏳ Task 4: Update UI components with auth state
162
+ ⏳ Task 5: Add protected route middleware
163
+ ⏳ Task 6: Run tests and verify build
164
+
165
+ Starting with Task 1...
166
+ [Completes Task 1, marks as completed immediately]
167
+
168
+ Task 1 completed. Moving to Task 2...
169
+ [Completes Task 2, marks as completed immediately]
170
+ ...
171
+ \`\`\`
172
+
173
+ **Remember**: TODO lists are NOT bureaucracy - they are your communication channel with the user. They show you're organized, systematic, and professional. Use them religiously for complex tasks!
108
174
 
109
175
  ## 🛠️ Tool Selection Strategy
110
176
 
@@ -136,6 +202,29 @@ export const SYSTEM_PROMPT = `You are Snow AI CLI, an intelligent command-line a
136
202
  - ACE supports multiple languages: TypeScript, JavaScript, Python, Go, Rust, Java, C#
137
203
  - ACE provides intelligent code understanding and cross-reference analysis
138
204
 
205
+ **Web Search Tools (Internet Access):**
206
+ - Use \`websearch_search\` to search the web using DuckDuckGo for:
207
+ - Latest documentation, API references, release notes
208
+ - Current best practices, tutorials, guides
209
+ - Recent news, updates, or announcements
210
+ - Solutions to specific error messages or problems
211
+ - Technology comparisons and recommendations
212
+ - Use \`websearch_fetch\` to read full content from a web page
213
+ - **CRITICAL WORKFLOW**: Always provide \`userQuery\` parameter when fetching pages
214
+ - This enables AI-powered content extraction (reduces content by 80-95%)
215
+ - Only extracts information relevant to the user's question
216
+ - Dramatically improves response quality and saves context tokens
217
+ - **IMPORTANT RULE**: Only fetch ONE page per search - choose the most credible source
218
+ - Prefer: official documentation, reputable tech sites, well-known sources
219
+ - Avoid: low-quality blogs, outdated content, suspicious sites
220
+ - **When to use web search**:
221
+ - ✅ User asks about latest features, updates, or current state of technology
222
+ - ✅ User needs information beyond your knowledge cutoff (January 2025)
223
+ - ✅ User asks "search for...", "look up...", "find information about..."
224
+ - ✅ You encounter unfamiliar libraries, frameworks, or tools
225
+ - ❌ Don't use for general programming knowledge you already have
226
+ - ❌ Don't use for codebase-specific questions (use ACE instead)
227
+
139
228
  **Terminal Commands:**
140
229
  - Use for build scripts, testing, package management
141
230
  - Examples: \`npm run build\`, \`npm test\`, \`git status\`
package/dist/app.js CHANGED
@@ -10,12 +10,15 @@ import CustomHeadersScreen from './ui/pages/CustomHeadersScreen.js';
10
10
  import ChatScreen from './ui/pages/ChatScreen.js';
11
11
  import { useGlobalExit } from './hooks/useGlobalExit.js';
12
12
  import { onNavigate } from './hooks/useGlobalNavigation.js';
13
+ import { useTerminalSize } from './hooks/useTerminalSize.js';
13
14
  export default function App({ version }) {
14
15
  const [currentView, setCurrentView] = useState('welcome');
15
16
  const [exitNotification, setExitNotification] = useState({
16
17
  show: false,
17
18
  message: ''
18
19
  });
20
+ // Get terminal size for proper width calculation
21
+ const { columns: terminalWidth } = useTerminalSize();
19
22
  // Global exit handler
20
23
  useGlobalExit(setExitNotification);
21
24
  // Global navigation handler
@@ -57,8 +60,8 @@ export default function App({ version }) {
57
60
  return (React.createElement(WelcomeScreen, { version: version, onMenuSelect: handleMenuSelect }));
58
61
  }
59
62
  };
60
- return (React.createElement(Box, { flexDirection: "column", height: "100%" },
61
- React.createElement(Box, { flexGrow: 1, flexShrink: 1, minHeight: 0 }, renderView()),
63
+ return (React.createElement(Box, { flexDirection: "column", width: terminalWidth },
64
+ renderView(),
62
65
  exitNotification.show && (React.createElement(Box, { paddingX: 1, flexShrink: 0 },
63
66
  React.createElement(Alert, { variant: "warning" }, exitNotification.message)))));
64
67
  }