snow-ai 0.4.15 → 0.4.17
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/bundle/cli.mjs +477445 -0
- package/bundle/sql-wasm.wasm +0 -0
- package/package.json +31 -26
- package/dist/agents/codebaseIndexAgent.d.ts +0 -102
- package/dist/agents/codebaseIndexAgent.js +0 -641
- package/dist/agents/codebaseReviewAgent.d.ts +0 -61
- package/dist/agents/codebaseReviewAgent.js +0 -301
- package/dist/agents/compactAgent.d.ts +0 -55
- package/dist/agents/compactAgent.js +0 -306
- package/dist/agents/promptOptimizeAgent.d.ts +0 -54
- package/dist/agents/promptOptimizeAgent.js +0 -268
- package/dist/agents/reviewAgent.d.ts +0 -50
- package/dist/agents/reviewAgent.js +0 -265
- package/dist/agents/summaryAgent.d.ts +0 -57
- package/dist/agents/summaryAgent.js +0 -260
- package/dist/api/anthropic.d.ts +0 -44
- package/dist/api/anthropic.js +0 -598
- package/dist/api/chat.d.ts +0 -73
- package/dist/api/chat.js +0 -386
- package/dist/api/embedding.d.ts +0 -34
- package/dist/api/embedding.js +0 -80
- package/dist/api/gemini.d.ts +0 -31
- package/dist/api/gemini.js +0 -445
- package/dist/api/models.d.ts +0 -15
- package/dist/api/models.js +0 -139
- package/dist/api/responses.d.ts +0 -38
- package/dist/api/responses.js +0 -515
- package/dist/api/systemPrompt.d.ts +0 -4
- package/dist/api/systemPrompt.js +0 -408
- package/dist/api/types.d.ts +0 -53
- package/dist/api/types.js +0 -4
- package/dist/app.d.ts +0 -8
- package/dist/app.js +0 -112
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -199
- package/dist/hooks/useAgentPicker.d.ts +0 -14
- package/dist/hooks/useAgentPicker.js +0 -119
- package/dist/hooks/useClipboard.d.ts +0 -4
- package/dist/hooks/useClipboard.js +0 -175
- package/dist/hooks/useCommandHandler.d.ts +0 -35
- package/dist/hooks/useCommandHandler.js +0 -346
- package/dist/hooks/useCommandPanel.d.ts +0 -17
- package/dist/hooks/useCommandPanel.js +0 -114
- package/dist/hooks/useConversation.d.ts +0 -49
- package/dist/hooks/useConversation.js +0 -1052
- package/dist/hooks/useFilePicker.d.ts +0 -18
- package/dist/hooks/useFilePicker.js +0 -224
- package/dist/hooks/useGlobalExit.d.ts +0 -5
- package/dist/hooks/useGlobalExit.js +0 -34
- package/dist/hooks/useGlobalNavigation.d.ts +0 -6
- package/dist/hooks/useGlobalNavigation.js +0 -17
- package/dist/hooks/useHistoryNavigation.d.ts +0 -35
- package/dist/hooks/useHistoryNavigation.js +0 -133
- package/dist/hooks/useInputBuffer.d.ts +0 -6
- package/dist/hooks/useInputBuffer.js +0 -45
- package/dist/hooks/useKeyboardInput.d.ts +0 -80
- package/dist/hooks/useKeyboardInput.js +0 -608
- package/dist/hooks/useSessionManagement.d.ts +0 -10
- package/dist/hooks/useSessionManagement.js +0 -43
- package/dist/hooks/useSessionSave.d.ts +0 -8
- package/dist/hooks/useSessionSave.js +0 -63
- package/dist/hooks/useSnapshotState.d.ts +0 -26
- package/dist/hooks/useSnapshotState.js +0 -28
- package/dist/hooks/useStreamingState.d.ts +0 -33
- package/dist/hooks/useStreamingState.js +0 -105
- package/dist/hooks/useTerminalFocus.d.ts +0 -28
- package/dist/hooks/useTerminalFocus.js +0 -87
- package/dist/hooks/useTerminalSize.d.ts +0 -4
- package/dist/hooks/useTerminalSize.js +0 -20
- package/dist/hooks/useTodoPicker.d.ts +0 -16
- package/dist/hooks/useTodoPicker.js +0 -94
- package/dist/hooks/useToolConfirmation.d.ts +0 -19
- package/dist/hooks/useToolConfirmation.js +0 -61
- package/dist/hooks/useVSCodeState.d.ts +0 -8
- package/dist/hooks/useVSCodeState.js +0 -81
- package/dist/i18n/I18nContext.d.ts +0 -14
- package/dist/i18n/I18nContext.js +0 -24
- package/dist/i18n/index.d.ts +0 -3
- package/dist/i18n/index.js +0 -2
- package/dist/i18n/lang/en.d.ts +0 -2
- package/dist/i18n/lang/en.js +0 -502
- package/dist/i18n/lang/es.d.ts +0 -2
- package/dist/i18n/lang/es.js +0 -502
- package/dist/i18n/lang/ja.d.ts +0 -2
- package/dist/i18n/lang/ja.js +0 -502
- package/dist/i18n/lang/ko.d.ts +0 -2
- package/dist/i18n/lang/ko.js +0 -502
- package/dist/i18n/lang/zh-TW.d.ts +0 -2
- package/dist/i18n/lang/zh-TW.js +0 -502
- package/dist/i18n/lang/zh.d.ts +0 -2
- package/dist/i18n/lang/zh.js +0 -502
- package/dist/i18n/translations.d.ts +0 -2
- package/dist/i18n/translations.js +0 -14
- package/dist/i18n/types.d.ts +0 -478
- package/dist/i18n/types.js +0 -1
- package/dist/mcp/aceCodeSearch.d.ts +0 -247
- package/dist/mcp/aceCodeSearch.js +0 -1058
- package/dist/mcp/bash.d.ts +0 -50
- package/dist/mcp/bash.js +0 -153
- package/dist/mcp/codebaseSearch.d.ts +0 -44
- package/dist/mcp/codebaseSearch.js +0 -275
- package/dist/mcp/filesystem.d.ts +0 -392
- package/dist/mcp/filesystem.js +0 -1445
- package/dist/mcp/ideDiagnostics.d.ts +0 -36
- package/dist/mcp/ideDiagnostics.js +0 -90
- package/dist/mcp/notebook.d.ts +0 -10
- package/dist/mcp/notebook.js +0 -367
- package/dist/mcp/subagent.d.ts +0 -37
- package/dist/mcp/subagent.js +0 -113
- package/dist/mcp/todo.d.ts +0 -46
- package/dist/mcp/todo.js +0 -511
- package/dist/mcp/types/aceCodeSearch.types.d.ts +0 -92
- package/dist/mcp/types/aceCodeSearch.types.js +0 -4
- package/dist/mcp/types/bash.types.d.ts +0 -13
- package/dist/mcp/types/bash.types.js +0 -4
- package/dist/mcp/types/filesystem.types.d.ts +0 -210
- package/dist/mcp/types/filesystem.types.js +0 -27
- package/dist/mcp/types/todo.types.d.ts +0 -27
- package/dist/mcp/types/todo.types.js +0 -4
- package/dist/mcp/types/websearch.types.d.ts +0 -30
- package/dist/mcp/types/websearch.types.js +0 -4
- package/dist/mcp/utils/aceCodeSearch/filesystem.utils.d.ts +0 -34
- package/dist/mcp/utils/aceCodeSearch/filesystem.utils.js +0 -146
- package/dist/mcp/utils/aceCodeSearch/language.utils.d.ts +0 -14
- package/dist/mcp/utils/aceCodeSearch/language.utils.js +0 -418
- package/dist/mcp/utils/aceCodeSearch/search.utils.d.ts +0 -31
- package/dist/mcp/utils/aceCodeSearch/search.utils.js +0 -136
- package/dist/mcp/utils/aceCodeSearch/symbol.utils.d.ts +0 -20
- package/dist/mcp/utils/aceCodeSearch/symbol.utils.js +0 -141
- package/dist/mcp/utils/bash/security.utils.d.ts +0 -20
- package/dist/mcp/utils/bash/security.utils.js +0 -34
- package/dist/mcp/utils/filesystem/batch-operations.utils.d.ts +0 -39
- package/dist/mcp/utils/filesystem/batch-operations.utils.js +0 -182
- package/dist/mcp/utils/filesystem/code-analysis.utils.d.ts +0 -18
- package/dist/mcp/utils/filesystem/code-analysis.utils.js +0 -165
- package/dist/mcp/utils/filesystem/match-finder.utils.d.ts +0 -16
- package/dist/mcp/utils/filesystem/match-finder.utils.js +0 -85
- package/dist/mcp/utils/filesystem/office-parser.utils.d.ts +0 -43
- package/dist/mcp/utils/filesystem/office-parser.utils.js +0 -163
- package/dist/mcp/utils/filesystem/path-fixer.utils.d.ts +0 -7
- package/dist/mcp/utils/filesystem/path-fixer.utils.js +0 -60
- package/dist/mcp/utils/filesystem/similarity.utils.d.ts +0 -22
- package/dist/mcp/utils/filesystem/similarity.utils.js +0 -75
- package/dist/mcp/utils/todo/date.utils.d.ts +0 -9
- package/dist/mcp/utils/todo/date.utils.js +0 -14
- package/dist/mcp/utils/websearch/browser.utils.d.ts +0 -8
- package/dist/mcp/utils/websearch/browser.utils.js +0 -58
- package/dist/mcp/utils/websearch/text.utils.d.ts +0 -16
- package/dist/mcp/utils/websearch/text.utils.js +0 -39
- package/dist/mcp/websearch.d.ts +0 -88
- package/dist/mcp/websearch.js +0 -375
- package/dist/test/logger-test.d.ts +0 -1
- package/dist/test/logger-test.js +0 -7
- package/dist/types/index.d.ts +0 -15
- package/dist/types/index.js +0 -1
- package/dist/ui/components/AgentPickerPanel.d.ts +0 -10
- package/dist/ui/components/AgentPickerPanel.js +0 -74
- package/dist/ui/components/ChatInput.d.ts +0 -46
- package/dist/ui/components/ChatInput.js +0 -379
- package/dist/ui/components/CommandPanel.d.ts +0 -15
- package/dist/ui/components/CommandPanel.js +0 -80
- package/dist/ui/components/DiffViewer.d.ts +0 -11
- package/dist/ui/components/DiffViewer.js +0 -178
- package/dist/ui/components/FileList.d.ts +0 -15
- package/dist/ui/components/FileList.js +0 -360
- package/dist/ui/components/FileRollbackConfirmation.d.ts +0 -8
- package/dist/ui/components/FileRollbackConfirmation.js +0 -108
- package/dist/ui/components/HelpPanel.d.ts +0 -2
- package/dist/ui/components/HelpPanel.js +0 -67
- package/dist/ui/components/MCPInfoPanel.d.ts +0 -2
- package/dist/ui/components/MCPInfoPanel.js +0 -108
- package/dist/ui/components/MCPInfoScreen.d.ts +0 -7
- package/dist/ui/components/MCPInfoScreen.js +0 -115
- package/dist/ui/components/MarkdownRenderer.d.ts +0 -6
- package/dist/ui/components/MarkdownRenderer.js +0 -70
- package/dist/ui/components/Menu.d.ts +0 -17
- package/dist/ui/components/Menu.js +0 -88
- package/dist/ui/components/MessageList.d.ts +0 -56
- package/dist/ui/components/MessageList.js +0 -97
- package/dist/ui/components/PendingMessages.d.ts +0 -13
- package/dist/ui/components/PendingMessages.js +0 -29
- package/dist/ui/components/PendingToolCalls.d.ts +0 -11
- package/dist/ui/components/PendingToolCalls.js +0 -35
- package/dist/ui/components/ScrollableSelectInput.d.ts +0 -29
- package/dist/ui/components/ScrollableSelectInput.js +0 -157
- package/dist/ui/components/SessionListPanel.d.ts +0 -7
- package/dist/ui/components/SessionListPanel.js +0 -175
- package/dist/ui/components/SessionListScreen.d.ts +0 -7
- package/dist/ui/components/SessionListScreen.js +0 -217
- package/dist/ui/components/SessionListScreenWrapper.d.ts +0 -7
- package/dist/ui/components/SessionListScreenWrapper.js +0 -14
- package/dist/ui/components/ShimmerText.d.ts +0 -9
- package/dist/ui/components/ShimmerText.js +0 -30
- package/dist/ui/components/TodoPickerPanel.d.ts +0 -14
- package/dist/ui/components/TodoPickerPanel.js +0 -119
- package/dist/ui/components/TodoTree.d.ts +0 -15
- package/dist/ui/components/TodoTree.js +0 -60
- package/dist/ui/components/ToolConfirmation.d.ts +0 -21
- package/dist/ui/components/ToolConfirmation.js +0 -204
- package/dist/ui/components/ToolResultPreview.d.ts +0 -13
- package/dist/ui/components/ToolResultPreview.js +0 -337
- package/dist/ui/components/UsagePanel.d.ts +0 -2
- package/dist/ui/components/UsagePanel.js +0 -394
- package/dist/ui/contexts/ThemeContext.d.ts +0 -13
- package/dist/ui/contexts/ThemeContext.js +0 -28
- package/dist/ui/pages/ChatScreen.d.ts +0 -6
- package/dist/ui/pages/ChatScreen.js +0 -1495
- package/dist/ui/pages/CodeBaseConfigScreen.d.ts +0 -8
- package/dist/ui/pages/CodeBaseConfigScreen.js +0 -350
- package/dist/ui/pages/ConfigScreen.d.ts +0 -8
- package/dist/ui/pages/ConfigScreen.js +0 -1101
- package/dist/ui/pages/CustomHeadersScreen.d.ts +0 -6
- package/dist/ui/pages/CustomHeadersScreen.js +0 -502
- package/dist/ui/pages/HeadlessModeScreen.d.ts +0 -7
- package/dist/ui/pages/HeadlessModeScreen.js +0 -381
- package/dist/ui/pages/LanguageSettingsScreen.d.ts +0 -7
- package/dist/ui/pages/LanguageSettingsScreen.js +0 -91
- package/dist/ui/pages/MCPConfigScreen.d.ts +0 -6
- package/dist/ui/pages/MCPConfigScreen.js +0 -55
- package/dist/ui/pages/ProxyConfigScreen.d.ts +0 -8
- package/dist/ui/pages/ProxyConfigScreen.js +0 -149
- package/dist/ui/pages/SensitiveCommandConfigScreen.d.ts +0 -7
- package/dist/ui/pages/SensitiveCommandConfigScreen.js +0 -271
- package/dist/ui/pages/SubAgentConfigScreen.d.ts +0 -9
- package/dist/ui/pages/SubAgentConfigScreen.js +0 -435
- package/dist/ui/pages/SubAgentListScreen.d.ts +0 -9
- package/dist/ui/pages/SubAgentListScreen.js +0 -131
- package/dist/ui/pages/SystemPromptConfigScreen.d.ts +0 -6
- package/dist/ui/pages/SystemPromptConfigScreen.js +0 -326
- package/dist/ui/pages/ThemeSettingsScreen.d.ts +0 -7
- package/dist/ui/pages/ThemeSettingsScreen.js +0 -106
- package/dist/ui/pages/WelcomeScreen.d.ts +0 -7
- package/dist/ui/pages/WelcomeScreen.js +0 -217
- package/dist/ui/themes/index.d.ts +0 -23
- package/dist/ui/themes/index.js +0 -140
- package/dist/utils/apiConfig.d.ts +0 -126
- package/dist/utils/apiConfig.js +0 -423
- package/dist/utils/autoCompress.d.ts +0 -15
- package/dist/utils/autoCompress.js +0 -24
- package/dist/utils/chatExporter.d.ts +0 -9
- package/dist/utils/chatExporter.js +0 -118
- package/dist/utils/checkpointManager.d.ts +0 -74
- package/dist/utils/checkpointManager.js +0 -181
- package/dist/utils/codebaseConfig.d.ts +0 -16
- package/dist/utils/codebaseConfig.js +0 -67
- package/dist/utils/codebaseDatabase.d.ts +0 -102
- package/dist/utils/codebaseDatabase.js +0 -333
- package/dist/utils/codebaseSearchEvents.d.ts +0 -16
- package/dist/utils/codebaseSearchEvents.js +0 -13
- package/dist/utils/commandExecutor.d.ts +0 -13
- package/dist/utils/commandExecutor.js +0 -26
- package/dist/utils/commands/agent.d.ts +0 -2
- package/dist/utils/commands/agent.js +0 -12
- package/dist/utils/commands/clear.d.ts +0 -2
- package/dist/utils/commands/clear.js +0 -12
- package/dist/utils/commands/compact.d.ts +0 -2
- package/dist/utils/commands/compact.js +0 -12
- package/dist/utils/commands/export.d.ts +0 -2
- package/dist/utils/commands/export.js +0 -12
- package/dist/utils/commands/help.d.ts +0 -2
- package/dist/utils/commands/help.js +0 -11
- package/dist/utils/commands/home.d.ts +0 -2
- package/dist/utils/commands/home.js +0 -34
- package/dist/utils/commands/ide.d.ts +0 -2
- package/dist/utils/commands/ide.js +0 -32
- package/dist/utils/commands/init.d.ts +0 -2
- package/dist/utils/commands/init.js +0 -93
- package/dist/utils/commands/mcp.d.ts +0 -2
- package/dist/utils/commands/mcp.js +0 -12
- package/dist/utils/commands/resume.d.ts +0 -2
- package/dist/utils/commands/resume.js +0 -12
- package/dist/utils/commands/review.d.ts +0 -2
- package/dist/utils/commands/review.js +0 -81
- package/dist/utils/commands/role.d.ts +0 -2
- package/dist/utils/commands/role.js +0 -37
- package/dist/utils/commands/todoPicker.d.ts +0 -2
- package/dist/utils/commands/todoPicker.js +0 -12
- package/dist/utils/commands/usage.d.ts +0 -2
- package/dist/utils/commands/usage.js +0 -12
- package/dist/utils/commands/yolo.d.ts +0 -2
- package/dist/utils/commands/yolo.js +0 -12
- package/dist/utils/configManager.d.ts +0 -45
- package/dist/utils/configManager.js +0 -303
- package/dist/utils/contextCompressor.d.ts +0 -16
- package/dist/utils/contextCompressor.js +0 -334
- package/dist/utils/devMode.d.ts +0 -13
- package/dist/utils/devMode.js +0 -54
- package/dist/utils/escapeHandler.d.ts +0 -79
- package/dist/utils/escapeHandler.js +0 -153
- package/dist/utils/fileDialog.d.ts +0 -9
- package/dist/utils/fileDialog.js +0 -74
- package/dist/utils/fileUtils.d.ts +0 -40
- package/dist/utils/fileUtils.js +0 -185
- package/dist/utils/historyManager.d.ts +0 -45
- package/dist/utils/historyManager.js +0 -159
- package/dist/utils/incrementalSnapshot.d.ts +0 -109
- package/dist/utils/incrementalSnapshot.js +0 -383
- package/dist/utils/index.d.ts +0 -11
- package/dist/utils/index.js +0 -18
- package/dist/utils/languageConfig.d.ts +0 -21
- package/dist/utils/languageConfig.js +0 -61
- package/dist/utils/logger.d.ts +0 -37
- package/dist/utils/logger.js +0 -122
- package/dist/utils/mcpToolsManager.d.ts +0 -52
- package/dist/utils/mcpToolsManager.js +0 -878
- package/dist/utils/messageFormatter.d.ts +0 -12
- package/dist/utils/messageFormatter.js +0 -115
- package/dist/utils/notebookManager.d.ts +0 -59
- package/dist/utils/notebookManager.js +0 -213
- package/dist/utils/patch-highlight.d.ts +0 -5
- package/dist/utils/patch-highlight.js +0 -23
- package/dist/utils/processManager.d.ts +0 -27
- package/dist/utils/processManager.js +0 -75
- package/dist/utils/proxyUtils.d.ts +0 -15
- package/dist/utils/proxyUtils.js +0 -50
- package/dist/utils/resourceMonitor.d.ts +0 -65
- package/dist/utils/resourceMonitor.js +0 -175
- package/dist/utils/retryUtils.d.ts +0 -49
- package/dist/utils/retryUtils.js +0 -303
- package/dist/utils/sensitiveCommandManager.d.ts +0 -53
- package/dist/utils/sensitiveCommandManager.js +0 -308
- package/dist/utils/sessionConverter.d.ts +0 -7
- package/dist/utils/sessionConverter.js +0 -306
- package/dist/utils/sessionManager.d.ts +0 -53
- package/dist/utils/sessionManager.js +0 -371
- package/dist/utils/subAgentConfig.d.ts +0 -50
- package/dist/utils/subAgentConfig.js +0 -221
- package/dist/utils/subAgentExecutor.d.ts +0 -40
- package/dist/utils/subAgentExecutor.js +0 -434
- package/dist/utils/terminal.d.ts +0 -5
- package/dist/utils/terminal.js +0 -13
- package/dist/utils/textBuffer.d.ts +0 -99
- package/dist/utils/textBuffer.js +0 -547
- package/dist/utils/textUtils.d.ts +0 -37
- package/dist/utils/textUtils.js +0 -102
- package/dist/utils/themeConfig.d.ts +0 -21
- package/dist/utils/themeConfig.js +0 -61
- package/dist/utils/todoPreprocessor.d.ts +0 -5
- package/dist/utils/todoPreprocessor.js +0 -18
- package/dist/utils/todoScanner.d.ts +0 -8
- package/dist/utils/todoScanner.js +0 -148
- package/dist/utils/toolDisplayConfig.d.ts +0 -16
- package/dist/utils/toolDisplayConfig.js +0 -47
- package/dist/utils/toolExecutor.d.ts +0 -37
- package/dist/utils/toolExecutor.js +0 -224
- package/dist/utils/usageLogger.d.ts +0 -11
- package/dist/utils/usageLogger.js +0 -114
- package/dist/utils/vscodeConnection.d.ts +0 -76
- package/dist/utils/vscodeConnection.js +0 -430
- package/dist/utils/workspaceSnapshot.d.ts +0 -63
- package/dist/utils/workspaceSnapshot.js +0 -300
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
|
|
5
|
-
// 队列来避免并发写入冲突
|
|
6
|
-
let writeQueue = Promise.resolve();
|
|
7
|
-
async function getActiveProfile() {
|
|
8
|
-
try {
|
|
9
|
-
const homeDir = os.homedir();
|
|
10
|
-
const jsonPath = path.join(homeDir, '.snow', 'active-profile.json');
|
|
11
|
-
const legacyPath = path.join(homeDir, '.snow', 'active-profile.txt');
|
|
12
|
-
// Try JSON format first
|
|
13
|
-
try {
|
|
14
|
-
const fileContent = await fs.readFile(jsonPath, 'utf-8');
|
|
15
|
-
const data = JSON.parse(fileContent.trim());
|
|
16
|
-
return data.activeProfile || 'default';
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
// Fallback to legacy .txt format if JSON doesn't exist
|
|
20
|
-
try {
|
|
21
|
-
const profileName = await fs.readFile(legacyPath, 'utf-8');
|
|
22
|
-
return profileName.trim() || 'default';
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
return 'default';
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
return 'default';
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
async function getUsageDir() {
|
|
34
|
-
const homeDir = os.homedir();
|
|
35
|
-
const snowDir = path.join(homeDir, '.snow', 'usage');
|
|
36
|
-
const today = new Date().toISOString().split('T')[0] || ''; // YYYY-MM-DD
|
|
37
|
-
const dateDir = path.join(snowDir, today);
|
|
38
|
-
// 确保目录存在
|
|
39
|
-
try {
|
|
40
|
-
await fs.mkdir(dateDir, { recursive: true });
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
// 目录可能已存在,忽略错误
|
|
44
|
-
}
|
|
45
|
-
return dateDir;
|
|
46
|
-
}
|
|
47
|
-
async function getCurrentLogFile(dateDir) {
|
|
48
|
-
try {
|
|
49
|
-
const files = (await fs.readdir(dateDir)).filter(f => f.startsWith('usage-') && f.endsWith('.jsonl'));
|
|
50
|
-
if (files.length === 0) {
|
|
51
|
-
return path.join(dateDir, 'usage-001.jsonl');
|
|
52
|
-
}
|
|
53
|
-
// 按文件名排序,获取最新的文件
|
|
54
|
-
files.sort();
|
|
55
|
-
const latestFileName = files[files.length - 1];
|
|
56
|
-
if (!latestFileName) {
|
|
57
|
-
return path.join(dateDir, 'usage-001.jsonl');
|
|
58
|
-
}
|
|
59
|
-
const latestFile = path.join(dateDir, latestFileName);
|
|
60
|
-
// 检查文件大小
|
|
61
|
-
const stats = await fs.stat(latestFile);
|
|
62
|
-
if (stats.size >= MAX_FILE_SIZE) {
|
|
63
|
-
// 创建新文件
|
|
64
|
-
const match = latestFileName.match(/usage-(\d+)\.jsonl/);
|
|
65
|
-
const nextNum = match && match[1] ? parseInt(match[1]) + 1 : 1;
|
|
66
|
-
return path.join(dateDir, `usage-${String(nextNum).padStart(3, '0')}.jsonl`);
|
|
67
|
-
}
|
|
68
|
-
return latestFile;
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
// 如果目录不存在或读取失败,返回默认文件名
|
|
72
|
-
return path.join(dateDir, 'usage-001.jsonl');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Save usage data to file system
|
|
77
|
-
* This is called directly from API layers to ensure all usage is tracked
|
|
78
|
-
*/
|
|
79
|
-
export function saveUsageToFile(model, usage) {
|
|
80
|
-
// Add to write queue to avoid concurrent writes
|
|
81
|
-
writeQueue = writeQueue
|
|
82
|
-
.then(async () => {
|
|
83
|
-
try {
|
|
84
|
-
const profileName = await getActiveProfile();
|
|
85
|
-
const dateDir = await getUsageDir();
|
|
86
|
-
const logFile = await getCurrentLogFile(dateDir);
|
|
87
|
-
// Extract cache tokens (different API formats)
|
|
88
|
-
const cacheReadTokens = usage.cache_read_input_tokens ?? usage.cached_tokens;
|
|
89
|
-
// Only save non-sensitive data: model name, profile, and token counts
|
|
90
|
-
const record = {
|
|
91
|
-
model,
|
|
92
|
-
profileName,
|
|
93
|
-
inputTokens: usage.prompt_tokens || 0,
|
|
94
|
-
outputTokens: usage.completion_tokens || 0,
|
|
95
|
-
...(usage.cache_creation_input_tokens !== undefined && {
|
|
96
|
-
cacheCreationInputTokens: usage.cache_creation_input_tokens,
|
|
97
|
-
}),
|
|
98
|
-
...(cacheReadTokens !== undefined && {
|
|
99
|
-
cacheReadInputTokens: cacheReadTokens,
|
|
100
|
-
}),
|
|
101
|
-
timestamp: new Date().toISOString(),
|
|
102
|
-
};
|
|
103
|
-
// Append to file (JSONL format: one JSON object per line)
|
|
104
|
-
const line = JSON.stringify(record) + '\n';
|
|
105
|
-
await fs.appendFile(logFile, line, 'utf-8');
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
console.error('Failed to save usage data:', error);
|
|
109
|
-
}
|
|
110
|
-
})
|
|
111
|
-
.catch(error => {
|
|
112
|
-
console.error('Usage persistence queue error:', error);
|
|
113
|
-
});
|
|
114
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
interface EditorContext {
|
|
2
|
-
activeFile?: string;
|
|
3
|
-
selectedText?: string;
|
|
4
|
-
cursorPosition?: {
|
|
5
|
-
line: number;
|
|
6
|
-
character: number;
|
|
7
|
-
};
|
|
8
|
-
workspaceFolder?: string;
|
|
9
|
-
}
|
|
10
|
-
interface Diagnostic {
|
|
11
|
-
message: string;
|
|
12
|
-
severity: 'error' | 'warning' | 'info' | 'hint';
|
|
13
|
-
line: number;
|
|
14
|
-
character: number;
|
|
15
|
-
source?: string;
|
|
16
|
-
code?: string | number;
|
|
17
|
-
}
|
|
18
|
-
declare class VSCodeConnectionManager {
|
|
19
|
-
private client;
|
|
20
|
-
private reconnectTimer;
|
|
21
|
-
private reconnectAttempts;
|
|
22
|
-
private readonly MAX_RECONNECT_ATTEMPTS;
|
|
23
|
-
private readonly BASE_RECONNECT_DELAY;
|
|
24
|
-
private readonly MAX_RECONNECT_DELAY;
|
|
25
|
-
private readonly VSCODE_BASE_PORT;
|
|
26
|
-
private readonly VSCODE_MAX_PORT;
|
|
27
|
-
private readonly JETBRAINS_BASE_PORT;
|
|
28
|
-
private readonly JETBRAINS_MAX_PORT;
|
|
29
|
-
private port;
|
|
30
|
-
private editorContext;
|
|
31
|
-
private listeners;
|
|
32
|
-
private currentWorkingDirectory;
|
|
33
|
-
private connectingPromise;
|
|
34
|
-
private connectionTimeout;
|
|
35
|
-
private readonly CONNECTION_TIMEOUT;
|
|
36
|
-
start(): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Clean up connection state and resources
|
|
39
|
-
*/
|
|
40
|
-
private cleanupConnection;
|
|
41
|
-
/**
|
|
42
|
-
* Normalize path for cross-platform compatibility
|
|
43
|
-
* - Converts Windows backslashes to forward slashes
|
|
44
|
-
* - Converts drive letters to lowercase for consistent comparison
|
|
45
|
-
*/
|
|
46
|
-
private normalizePath;
|
|
47
|
-
/**
|
|
48
|
-
* Find the correct port for the current workspace
|
|
49
|
-
*/
|
|
50
|
-
private findPortForWorkspace;
|
|
51
|
-
/**
|
|
52
|
-
* Check if we should handle this message based on workspace folder
|
|
53
|
-
*/
|
|
54
|
-
private shouldHandleMessage;
|
|
55
|
-
private scheduleReconnect;
|
|
56
|
-
stop(): void;
|
|
57
|
-
isConnected(): boolean;
|
|
58
|
-
isClientRunning(): boolean;
|
|
59
|
-
getContext(): EditorContext;
|
|
60
|
-
onContextUpdate(listener: (context: EditorContext) => void): () => void;
|
|
61
|
-
private handleMessage;
|
|
62
|
-
private notifyListeners;
|
|
63
|
-
getPort(): number;
|
|
64
|
-
/**
|
|
65
|
-
* Request diagnostics for a specific file from IDE
|
|
66
|
-
* @param filePath - The file path to get diagnostics for
|
|
67
|
-
* @returns Promise that resolves with diagnostics array
|
|
68
|
-
*/
|
|
69
|
-
requestDiagnostics(filePath: string): Promise<Diagnostic[]>;
|
|
70
|
-
/**
|
|
71
|
-
* Reset reconnection attempts (e.g., when user manually triggers reconnect)
|
|
72
|
-
*/
|
|
73
|
-
resetReconnectAttempts(): void;
|
|
74
|
-
}
|
|
75
|
-
export declare const vscodeConnection: VSCodeConnectionManager;
|
|
76
|
-
export type { EditorContext, Diagnostic };
|
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
import { WebSocket } from 'ws';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import * as os from 'os';
|
|
5
|
-
class VSCodeConnectionManager {
|
|
6
|
-
constructor() {
|
|
7
|
-
Object.defineProperty(this, "client", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
configurable: true,
|
|
10
|
-
writable: true,
|
|
11
|
-
value: null
|
|
12
|
-
});
|
|
13
|
-
Object.defineProperty(this, "reconnectTimer", {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
configurable: true,
|
|
16
|
-
writable: true,
|
|
17
|
-
value: null
|
|
18
|
-
});
|
|
19
|
-
Object.defineProperty(this, "reconnectAttempts", {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true,
|
|
23
|
-
value: 0
|
|
24
|
-
});
|
|
25
|
-
Object.defineProperty(this, "MAX_RECONNECT_ATTEMPTS", {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
configurable: true,
|
|
28
|
-
writable: true,
|
|
29
|
-
value: 10
|
|
30
|
-
});
|
|
31
|
-
Object.defineProperty(this, "BASE_RECONNECT_DELAY", {
|
|
32
|
-
enumerable: true,
|
|
33
|
-
configurable: true,
|
|
34
|
-
writable: true,
|
|
35
|
-
value: 2000
|
|
36
|
-
}); // 2 seconds
|
|
37
|
-
Object.defineProperty(this, "MAX_RECONNECT_DELAY", {
|
|
38
|
-
enumerable: true,
|
|
39
|
-
configurable: true,
|
|
40
|
-
writable: true,
|
|
41
|
-
value: 30000
|
|
42
|
-
}); // 30 seconds
|
|
43
|
-
// Port ranges: VSCode uses 9527-9537, JetBrains uses 9538-9548
|
|
44
|
-
Object.defineProperty(this, "VSCODE_BASE_PORT", {
|
|
45
|
-
enumerable: true,
|
|
46
|
-
configurable: true,
|
|
47
|
-
writable: true,
|
|
48
|
-
value: 9527
|
|
49
|
-
});
|
|
50
|
-
Object.defineProperty(this, "VSCODE_MAX_PORT", {
|
|
51
|
-
enumerable: true,
|
|
52
|
-
configurable: true,
|
|
53
|
-
writable: true,
|
|
54
|
-
value: 9537
|
|
55
|
-
});
|
|
56
|
-
Object.defineProperty(this, "JETBRAINS_BASE_PORT", {
|
|
57
|
-
enumerable: true,
|
|
58
|
-
configurable: true,
|
|
59
|
-
writable: true,
|
|
60
|
-
value: 9538
|
|
61
|
-
});
|
|
62
|
-
Object.defineProperty(this, "JETBRAINS_MAX_PORT", {
|
|
63
|
-
enumerable: true,
|
|
64
|
-
configurable: true,
|
|
65
|
-
writable: true,
|
|
66
|
-
value: 9548
|
|
67
|
-
});
|
|
68
|
-
Object.defineProperty(this, "port", {
|
|
69
|
-
enumerable: true,
|
|
70
|
-
configurable: true,
|
|
71
|
-
writable: true,
|
|
72
|
-
value: 9527
|
|
73
|
-
});
|
|
74
|
-
Object.defineProperty(this, "editorContext", {
|
|
75
|
-
enumerable: true,
|
|
76
|
-
configurable: true,
|
|
77
|
-
writable: true,
|
|
78
|
-
value: {}
|
|
79
|
-
});
|
|
80
|
-
Object.defineProperty(this, "listeners", {
|
|
81
|
-
enumerable: true,
|
|
82
|
-
configurable: true,
|
|
83
|
-
writable: true,
|
|
84
|
-
value: []
|
|
85
|
-
});
|
|
86
|
-
Object.defineProperty(this, "currentWorkingDirectory", {
|
|
87
|
-
enumerable: true,
|
|
88
|
-
configurable: true,
|
|
89
|
-
writable: true,
|
|
90
|
-
value: process.cwd()
|
|
91
|
-
});
|
|
92
|
-
// Connection state management
|
|
93
|
-
Object.defineProperty(this, "connectingPromise", {
|
|
94
|
-
enumerable: true,
|
|
95
|
-
configurable: true,
|
|
96
|
-
writable: true,
|
|
97
|
-
value: null
|
|
98
|
-
});
|
|
99
|
-
Object.defineProperty(this, "connectionTimeout", {
|
|
100
|
-
enumerable: true,
|
|
101
|
-
configurable: true,
|
|
102
|
-
writable: true,
|
|
103
|
-
value: null
|
|
104
|
-
});
|
|
105
|
-
Object.defineProperty(this, "CONNECTION_TIMEOUT", {
|
|
106
|
-
enumerable: true,
|
|
107
|
-
configurable: true,
|
|
108
|
-
writable: true,
|
|
109
|
-
value: 10000
|
|
110
|
-
}); // 10 seconds timeout for initial connection
|
|
111
|
-
}
|
|
112
|
-
async start() {
|
|
113
|
-
// If already connected, just return success
|
|
114
|
-
if (this.client?.readyState === WebSocket.OPEN) {
|
|
115
|
-
return Promise.resolve();
|
|
116
|
-
}
|
|
117
|
-
// If already connecting, return the existing promise to avoid duplicate connections
|
|
118
|
-
if (this.connectingPromise) {
|
|
119
|
-
return this.connectingPromise;
|
|
120
|
-
}
|
|
121
|
-
// Try to find the correct port for this workspace
|
|
122
|
-
const targetPort = this.findPortForWorkspace();
|
|
123
|
-
// Create a new connection promise and store it
|
|
124
|
-
this.connectingPromise = new Promise((resolve, reject) => {
|
|
125
|
-
let isSettled = false; // Prevent double resolve/reject
|
|
126
|
-
// Set connection timeout
|
|
127
|
-
this.connectionTimeout = setTimeout(() => {
|
|
128
|
-
if (!isSettled) {
|
|
129
|
-
isSettled = true;
|
|
130
|
-
this.cleanupConnection();
|
|
131
|
-
reject(new Error('Connection timeout after 10 seconds'));
|
|
132
|
-
}
|
|
133
|
-
}, this.CONNECTION_TIMEOUT);
|
|
134
|
-
const tryConnect = (port) => {
|
|
135
|
-
// If already settled (resolved or rejected), stop trying
|
|
136
|
-
if (isSettled) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
// Check both VSCode and JetBrains port ranges
|
|
140
|
-
if (port > this.VSCODE_MAX_PORT && port < this.JETBRAINS_BASE_PORT) {
|
|
141
|
-
// Jump from VSCode range to JetBrains range
|
|
142
|
-
tryConnect(this.JETBRAINS_BASE_PORT);
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
if (port > this.JETBRAINS_MAX_PORT) {
|
|
146
|
-
if (!isSettled) {
|
|
147
|
-
isSettled = true;
|
|
148
|
-
this.cleanupConnection();
|
|
149
|
-
reject(new Error(`Failed to connect: no IDE server found on ports ${this.VSCODE_BASE_PORT}-${this.VSCODE_MAX_PORT} or ${this.JETBRAINS_BASE_PORT}-${this.JETBRAINS_MAX_PORT}`));
|
|
150
|
-
}
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
try {
|
|
154
|
-
this.client = new WebSocket(`ws://localhost:${port}`);
|
|
155
|
-
this.client.on('open', () => {
|
|
156
|
-
if (!isSettled) {
|
|
157
|
-
isSettled = true;
|
|
158
|
-
// Reset reconnect attempts on successful connection
|
|
159
|
-
this.reconnectAttempts = 0;
|
|
160
|
-
this.port = port;
|
|
161
|
-
// Clear connection state
|
|
162
|
-
if (this.connectionTimeout) {
|
|
163
|
-
clearTimeout(this.connectionTimeout);
|
|
164
|
-
this.connectionTimeout = null;
|
|
165
|
-
}
|
|
166
|
-
this.connectingPromise = null;
|
|
167
|
-
resolve();
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
this.client.on('message', message => {
|
|
171
|
-
try {
|
|
172
|
-
const data = JSON.parse(message.toString());
|
|
173
|
-
// Filter messages by workspace folder
|
|
174
|
-
if (this.shouldHandleMessage(data)) {
|
|
175
|
-
this.handleMessage(data);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
catch (error) {
|
|
179
|
-
// Ignore invalid JSON
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
this.client.on('close', () => {
|
|
183
|
-
this.client = null;
|
|
184
|
-
// Only schedule reconnect if this was an established connection (not initial scan)
|
|
185
|
-
if (this.reconnectAttempts > 0 || isSettled) {
|
|
186
|
-
this.scheduleReconnect();
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
this.client.on('error', _error => {
|
|
190
|
-
// On initial connection, try next port
|
|
191
|
-
if (this.reconnectAttempts === 0 && !isSettled) {
|
|
192
|
-
this.client = null;
|
|
193
|
-
// Small delay before trying next port to avoid rapid fire
|
|
194
|
-
setTimeout(() => tryConnect(port + 1), 50);
|
|
195
|
-
}
|
|
196
|
-
// For reconnections, silently handle and let close event trigger reconnect
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
if (!isSettled) {
|
|
201
|
-
setTimeout(() => tryConnect(port + 1), 50);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
tryConnect(targetPort);
|
|
206
|
-
});
|
|
207
|
-
// Return the promise and clean up state when it completes or fails
|
|
208
|
-
return this.connectingPromise.finally(() => {
|
|
209
|
-
this.connectingPromise = null;
|
|
210
|
-
if (this.connectionTimeout) {
|
|
211
|
-
clearTimeout(this.connectionTimeout);
|
|
212
|
-
this.connectionTimeout = null;
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Clean up connection state and resources
|
|
218
|
-
*/
|
|
219
|
-
cleanupConnection() {
|
|
220
|
-
this.connectingPromise = null;
|
|
221
|
-
if (this.connectionTimeout) {
|
|
222
|
-
clearTimeout(this.connectionTimeout);
|
|
223
|
-
this.connectionTimeout = null;
|
|
224
|
-
}
|
|
225
|
-
if (this.client) {
|
|
226
|
-
try {
|
|
227
|
-
this.client.removeAllListeners();
|
|
228
|
-
this.client.close();
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
// Ignore errors during cleanup
|
|
232
|
-
}
|
|
233
|
-
this.client = null;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Normalize path for cross-platform compatibility
|
|
238
|
-
* - Converts Windows backslashes to forward slashes
|
|
239
|
-
* - Converts drive letters to lowercase for consistent comparison
|
|
240
|
-
*/
|
|
241
|
-
normalizePath(filePath) {
|
|
242
|
-
let normalized = filePath.replace(/\\/g, '/');
|
|
243
|
-
// Convert Windows drive letter to lowercase (C: -> c:)
|
|
244
|
-
if (/^[A-Z]:/.test(normalized)) {
|
|
245
|
-
normalized = normalized.charAt(0).toLowerCase() + normalized.slice(1);
|
|
246
|
-
}
|
|
247
|
-
return normalized;
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Find the correct port for the current workspace
|
|
251
|
-
*/
|
|
252
|
-
findPortForWorkspace() {
|
|
253
|
-
try {
|
|
254
|
-
const portInfoPath = path.join(os.tmpdir(), 'snow-cli-ports.json');
|
|
255
|
-
if (fs.existsSync(portInfoPath)) {
|
|
256
|
-
const portInfo = JSON.parse(fs.readFileSync(portInfoPath, 'utf8'));
|
|
257
|
-
// Normalize cwd for consistent comparison
|
|
258
|
-
const cwd = this.normalizePath(this.currentWorkingDirectory);
|
|
259
|
-
// Direct match
|
|
260
|
-
if (portInfo[cwd]) {
|
|
261
|
-
return portInfo[cwd];
|
|
262
|
-
}
|
|
263
|
-
// Check if cwd is within any of the workspace folders
|
|
264
|
-
for (const [workspace, port] of Object.entries(portInfo)) {
|
|
265
|
-
const normalizedWorkspace = this.normalizePath(workspace);
|
|
266
|
-
if (cwd.startsWith(normalizedWorkspace)) {
|
|
267
|
-
return port;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
// Ignore errors, will fall back to VSCODE_BASE_PORT
|
|
274
|
-
}
|
|
275
|
-
// Start with VSCode port range by default
|
|
276
|
-
return this.VSCODE_BASE_PORT;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Check if we should handle this message based on workspace folder
|
|
280
|
-
*/
|
|
281
|
-
shouldHandleMessage(data) {
|
|
282
|
-
// If no workspace folder in message, accept it (backwards compatibility)
|
|
283
|
-
if (!data.workspaceFolder) {
|
|
284
|
-
return true;
|
|
285
|
-
}
|
|
286
|
-
// Normalize paths for consistent comparison across platforms
|
|
287
|
-
const cwd = this.normalizePath(this.currentWorkingDirectory);
|
|
288
|
-
const workspaceFolder = this.normalizePath(data.workspaceFolder);
|
|
289
|
-
// Bidirectional check: either cwd is within IDE workspace, or IDE workspace is within cwd
|
|
290
|
-
const cwdInWorkspace = cwd.startsWith(workspaceFolder);
|
|
291
|
-
const workspaceInCwd = workspaceFolder.startsWith(cwd);
|
|
292
|
-
const matches = cwdInWorkspace || workspaceInCwd;
|
|
293
|
-
return matches;
|
|
294
|
-
}
|
|
295
|
-
scheduleReconnect() {
|
|
296
|
-
if (this.reconnectTimer) {
|
|
297
|
-
clearTimeout(this.reconnectTimer);
|
|
298
|
-
}
|
|
299
|
-
this.reconnectAttempts++;
|
|
300
|
-
if (this.reconnectAttempts >= this.MAX_RECONNECT_ATTEMPTS) {
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
const delay = Math.min(this.BASE_RECONNECT_DELAY * Math.pow(1.5, this.reconnectAttempts - 1), this.MAX_RECONNECT_DELAY);
|
|
304
|
-
this.reconnectTimer = setTimeout(() => {
|
|
305
|
-
this.start().catch(() => {
|
|
306
|
-
// Silently handle reconnection failures
|
|
307
|
-
});
|
|
308
|
-
}, delay);
|
|
309
|
-
}
|
|
310
|
-
stop() {
|
|
311
|
-
if (this.reconnectTimer) {
|
|
312
|
-
clearTimeout(this.reconnectTimer);
|
|
313
|
-
this.reconnectTimer = null;
|
|
314
|
-
}
|
|
315
|
-
// Clear connection timeout
|
|
316
|
-
if (this.connectionTimeout) {
|
|
317
|
-
clearTimeout(this.connectionTimeout);
|
|
318
|
-
this.connectionTimeout = null;
|
|
319
|
-
}
|
|
320
|
-
// Clear connecting promise - this is critical for restart
|
|
321
|
-
this.connectingPromise = null;
|
|
322
|
-
if (this.client) {
|
|
323
|
-
try {
|
|
324
|
-
this.client.removeAllListeners();
|
|
325
|
-
this.client.close();
|
|
326
|
-
}
|
|
327
|
-
catch (error) {
|
|
328
|
-
// Ignore errors during cleanup
|
|
329
|
-
}
|
|
330
|
-
this.client = null;
|
|
331
|
-
}
|
|
332
|
-
this.reconnectAttempts = 0;
|
|
333
|
-
}
|
|
334
|
-
isConnected() {
|
|
335
|
-
return this.client?.readyState === WebSocket.OPEN;
|
|
336
|
-
}
|
|
337
|
-
isClientRunning() {
|
|
338
|
-
return this.client !== null;
|
|
339
|
-
}
|
|
340
|
-
getContext() {
|
|
341
|
-
return { ...this.editorContext };
|
|
342
|
-
}
|
|
343
|
-
onContextUpdate(listener) {
|
|
344
|
-
this.listeners.push(listener);
|
|
345
|
-
return () => {
|
|
346
|
-
this.listeners = this.listeners.filter(l => l !== listener);
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
handleMessage(data) {
|
|
350
|
-
if (data.type === 'context') {
|
|
351
|
-
this.editorContext = {
|
|
352
|
-
activeFile: data.activeFile,
|
|
353
|
-
selectedText: data.selectedText,
|
|
354
|
-
cursorPosition: data.cursorPosition,
|
|
355
|
-
workspaceFolder: data.workspaceFolder,
|
|
356
|
-
};
|
|
357
|
-
this.notifyListeners();
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
notifyListeners() {
|
|
361
|
-
for (const listener of this.listeners) {
|
|
362
|
-
listener(this.editorContext);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
getPort() {
|
|
366
|
-
return this.port;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Request diagnostics for a specific file from IDE
|
|
370
|
-
* @param filePath - The file path to get diagnostics for
|
|
371
|
-
* @returns Promise that resolves with diagnostics array
|
|
372
|
-
*/
|
|
373
|
-
async requestDiagnostics(filePath) {
|
|
374
|
-
return new Promise(resolve => {
|
|
375
|
-
if (!this.client || this.client.readyState !== WebSocket.OPEN) {
|
|
376
|
-
resolve([]); // Return empty array if not connected
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
const requestId = Math.random().toString(36).substring(7);
|
|
380
|
-
let isResolved = false;
|
|
381
|
-
const timeout = setTimeout(() => {
|
|
382
|
-
if (!isResolved) {
|
|
383
|
-
cleanup();
|
|
384
|
-
resolve([]); // Timeout, return empty array
|
|
385
|
-
}
|
|
386
|
-
}, 2000); // Reduce timeout from 5s to 2s to avoid long blocking
|
|
387
|
-
const handler = (message) => {
|
|
388
|
-
try {
|
|
389
|
-
const data = JSON.parse(message.toString());
|
|
390
|
-
if (data.type === 'diagnostics' && data.requestId === requestId) {
|
|
391
|
-
if (!isResolved) {
|
|
392
|
-
cleanup();
|
|
393
|
-
resolve(data.diagnostics || []);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
catch (error) {
|
|
398
|
-
// Ignore invalid JSON
|
|
399
|
-
}
|
|
400
|
-
};
|
|
401
|
-
const cleanup = () => {
|
|
402
|
-
isResolved = true;
|
|
403
|
-
clearTimeout(timeout);
|
|
404
|
-
if (this.client) {
|
|
405
|
-
this.client.off('message', handler);
|
|
406
|
-
}
|
|
407
|
-
};
|
|
408
|
-
this.client.on('message', handler);
|
|
409
|
-
// Add error handling for send operation
|
|
410
|
-
try {
|
|
411
|
-
this.client.send(JSON.stringify({
|
|
412
|
-
type: 'getDiagnostics',
|
|
413
|
-
requestId,
|
|
414
|
-
filePath,
|
|
415
|
-
}));
|
|
416
|
-
}
|
|
417
|
-
catch (error) {
|
|
418
|
-
cleanup();
|
|
419
|
-
resolve([]); // If send fails, return empty array
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Reset reconnection attempts (e.g., when user manually triggers reconnect)
|
|
425
|
-
*/
|
|
426
|
-
resetReconnectAttempts() {
|
|
427
|
-
this.reconnectAttempts = 0;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
export const vscodeConnection = new VSCodeConnectionManager();
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace Snapshot Manager
|
|
3
|
-
* Provides git-like version control for workspace files
|
|
4
|
-
*/
|
|
5
|
-
declare class WorkspaceSnapshotManager {
|
|
6
|
-
private readonly snapshotsDir;
|
|
7
|
-
private activeSnapshot;
|
|
8
|
-
private readonly ignorePatterns;
|
|
9
|
-
constructor();
|
|
10
|
-
/**
|
|
11
|
-
* Ensure snapshots directory exists
|
|
12
|
-
*/
|
|
13
|
-
private ensureSnapshotsDir;
|
|
14
|
-
/**
|
|
15
|
-
* Calculate SHA256 hash of file content
|
|
16
|
-
*/
|
|
17
|
-
private calculateFileHash;
|
|
18
|
-
/**
|
|
19
|
-
* Recursively scan directory and collect files
|
|
20
|
-
*/
|
|
21
|
-
private scanDirectory;
|
|
22
|
-
/**
|
|
23
|
-
* Scan workspace and build file state map
|
|
24
|
-
*/
|
|
25
|
-
private scanWorkspace;
|
|
26
|
-
/**
|
|
27
|
-
* Create a snapshot of current workspace state
|
|
28
|
-
*/
|
|
29
|
-
createSnapshot(sessionId: string, messageCount: number, workspaceRoot?: string): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Get snapshot metadata path
|
|
32
|
-
*/
|
|
33
|
-
private getSnapshotPath;
|
|
34
|
-
/**
|
|
35
|
-
* Get snapshot content directory
|
|
36
|
-
*/
|
|
37
|
-
private getSnapshotContentDir;
|
|
38
|
-
/**
|
|
39
|
-
* Create snapshot when user sends message
|
|
40
|
-
*/
|
|
41
|
-
createSnapshotForMessage(sessionId: string, messageIndex: number, workspaceRoot?: string): Promise<void>;
|
|
42
|
-
/**
|
|
43
|
-
* List all snapshots for a session
|
|
44
|
-
*/
|
|
45
|
-
listSnapshots(sessionId: string): Promise<Array<{
|
|
46
|
-
messageIndex: number;
|
|
47
|
-
timestamp: number;
|
|
48
|
-
}>>;
|
|
49
|
-
/**
|
|
50
|
-
* Rollback workspace to specific snapshot
|
|
51
|
-
*/
|
|
52
|
-
rollbackToSnapshot(sessionId: string, messageIndex: number): Promise<number | null>;
|
|
53
|
-
/**
|
|
54
|
-
* Clear snapshot for a session
|
|
55
|
-
*/
|
|
56
|
-
clearSnapshot(sessionId: string): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* Clear all snapshots for a session
|
|
59
|
-
*/
|
|
60
|
-
clearAllSnapshots(sessionId: string): Promise<void>;
|
|
61
|
-
}
|
|
62
|
-
export declare const workspaceSnapshotManager: WorkspaceSnapshotManager;
|
|
63
|
-
export {};
|