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,300 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import crypto from 'crypto';
|
|
5
|
-
import { logger } from '../utils/logger.js';
|
|
6
|
-
/**
|
|
7
|
-
* Workspace Snapshot Manager
|
|
8
|
-
* Provides git-like version control for workspace files
|
|
9
|
-
*/
|
|
10
|
-
class WorkspaceSnapshotManager {
|
|
11
|
-
constructor() {
|
|
12
|
-
Object.defineProperty(this, "snapshotsDir", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
configurable: true,
|
|
15
|
-
writable: true,
|
|
16
|
-
value: void 0
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(this, "activeSnapshot", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
configurable: true,
|
|
21
|
-
writable: true,
|
|
22
|
-
value: null
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(this, "ignorePatterns", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
configurable: true,
|
|
27
|
-
writable: true,
|
|
28
|
-
value: [
|
|
29
|
-
'node_modules/**',
|
|
30
|
-
'.git/**',
|
|
31
|
-
'dist/**',
|
|
32
|
-
'build/**',
|
|
33
|
-
'.snow/**',
|
|
34
|
-
'*.log',
|
|
35
|
-
'.DS_Store',
|
|
36
|
-
'*.swp',
|
|
37
|
-
'*.swo',
|
|
38
|
-
'*~',
|
|
39
|
-
'.vscode/**',
|
|
40
|
-
'.idea/**'
|
|
41
|
-
]
|
|
42
|
-
});
|
|
43
|
-
this.snapshotsDir = path.join(os.homedir(), '.snow', 'snapshots');
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Ensure snapshots directory exists
|
|
47
|
-
*/
|
|
48
|
-
async ensureSnapshotsDir() {
|
|
49
|
-
await fs.mkdir(this.snapshotsDir, { recursive: true });
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Calculate SHA256 hash of file content
|
|
53
|
-
*/
|
|
54
|
-
async calculateFileHash(filePath) {
|
|
55
|
-
const content = await fs.readFile(filePath);
|
|
56
|
-
return crypto.createHash('sha256').update(content).digest('hex');
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Recursively scan directory and collect files
|
|
60
|
-
*/
|
|
61
|
-
async scanDirectory(dirPath, basePath, fileStates) {
|
|
62
|
-
try {
|
|
63
|
-
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
64
|
-
for (const entry of entries) {
|
|
65
|
-
// Skip ignored patterns
|
|
66
|
-
if (this.ignorePatterns.some(pattern => {
|
|
67
|
-
const normalized = pattern.replace(/\*\*/g, '.*').replace(/\*/g, '[^/]*');
|
|
68
|
-
return entry.name.match(new RegExp(normalized));
|
|
69
|
-
})) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const fullPath = path.join(dirPath, entry.name);
|
|
73
|
-
const relativePath = path.relative(basePath, fullPath);
|
|
74
|
-
if (entry.isDirectory()) {
|
|
75
|
-
// Recursively scan subdirectory
|
|
76
|
-
await this.scanDirectory(fullPath, basePath, fileStates);
|
|
77
|
-
}
|
|
78
|
-
else if (entry.isFile()) {
|
|
79
|
-
try {
|
|
80
|
-
const stats = await fs.stat(fullPath);
|
|
81
|
-
const hash = await this.calculateFileHash(fullPath);
|
|
82
|
-
fileStates.set(relativePath, {
|
|
83
|
-
path: relativePath,
|
|
84
|
-
hash,
|
|
85
|
-
size: stats.size,
|
|
86
|
-
mtime: stats.mtimeMs
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
// Skip files that can't be read
|
|
91
|
-
console.error(`Failed to process file ${relativePath}:`, error);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
console.error(`Failed to scan directory ${dirPath}:`, error);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Scan workspace and build file state map
|
|
102
|
-
*/
|
|
103
|
-
async scanWorkspace(workspaceRoot) {
|
|
104
|
-
const fileStates = new Map();
|
|
105
|
-
await this.scanDirectory(workspaceRoot, workspaceRoot, fileStates);
|
|
106
|
-
return fileStates;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Create a snapshot of current workspace state
|
|
110
|
-
*/
|
|
111
|
-
async createSnapshot(sessionId, messageCount, workspaceRoot = process.cwd()) {
|
|
112
|
-
await this.ensureSnapshotsDir();
|
|
113
|
-
const files = await this.scanWorkspace(workspaceRoot);
|
|
114
|
-
this.activeSnapshot = {
|
|
115
|
-
sessionId,
|
|
116
|
-
messageCount,
|
|
117
|
-
timestamp: Date.now(),
|
|
118
|
-
workspaceRoot,
|
|
119
|
-
files
|
|
120
|
-
};
|
|
121
|
-
// Note: We don't save the snapshot to disk yet
|
|
122
|
-
// We'll only save changed files when rollback is triggered
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Get snapshot metadata path
|
|
126
|
-
*/
|
|
127
|
-
getSnapshotPath(sessionId) {
|
|
128
|
-
return path.join(this.snapshotsDir, `${sessionId}.json`);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Get snapshot content directory
|
|
132
|
-
*/
|
|
133
|
-
getSnapshotContentDir(sessionId) {
|
|
134
|
-
return path.join(this.snapshotsDir, sessionId);
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Create snapshot when user sends message
|
|
138
|
-
*/
|
|
139
|
-
async createSnapshotForMessage(sessionId, messageIndex, workspaceRoot = process.cwd()) {
|
|
140
|
-
await this.ensureSnapshotsDir();
|
|
141
|
-
const snapshotContentDir = this.getSnapshotContentDir(`${sessionId}_${messageIndex}`);
|
|
142
|
-
await fs.mkdir(snapshotContentDir, { recursive: true });
|
|
143
|
-
// Scan current workspace state
|
|
144
|
-
const files = await this.scanWorkspace(workspaceRoot);
|
|
145
|
-
// Save file contents to snapshot directory
|
|
146
|
-
const fileBackups = [];
|
|
147
|
-
for (const [relativePath, fileState] of files) {
|
|
148
|
-
const fullPath = path.join(workspaceRoot, relativePath);
|
|
149
|
-
const backupPath = path.join(snapshotContentDir, relativePath);
|
|
150
|
-
try {
|
|
151
|
-
// Create directory structure
|
|
152
|
-
await fs.mkdir(path.dirname(backupPath), { recursive: true });
|
|
153
|
-
// Copy file to snapshot directory
|
|
154
|
-
await fs.copyFile(fullPath, backupPath);
|
|
155
|
-
fileBackups.push({
|
|
156
|
-
path: relativePath,
|
|
157
|
-
hash: fileState.hash
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
catch (error) {
|
|
161
|
-
console.error(`Failed to backup file ${relativePath}:`, error);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
// Save snapshot metadata
|
|
165
|
-
const metadata = {
|
|
166
|
-
sessionId: `${sessionId}_${messageIndex}`,
|
|
167
|
-
messageCount: messageIndex,
|
|
168
|
-
timestamp: Date.now(),
|
|
169
|
-
workspaceRoot,
|
|
170
|
-
changedFiles: fileBackups.map(f => ({
|
|
171
|
-
path: f.path,
|
|
172
|
-
content: null, // Content stored separately in snapshot directory
|
|
173
|
-
existed: true
|
|
174
|
-
}))
|
|
175
|
-
};
|
|
176
|
-
const metadataPath = this.getSnapshotPath(`${sessionId}_${messageIndex}`);
|
|
177
|
-
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* List all snapshots for a session
|
|
181
|
-
*/
|
|
182
|
-
async listSnapshots(sessionId) {
|
|
183
|
-
await this.ensureSnapshotsDir();
|
|
184
|
-
const snapshots = [];
|
|
185
|
-
try {
|
|
186
|
-
const files = await fs.readdir(this.snapshotsDir);
|
|
187
|
-
for (const file of files) {
|
|
188
|
-
if (file.startsWith(sessionId) && file.endsWith('.json')) {
|
|
189
|
-
const metadataPath = path.join(this.snapshotsDir, file);
|
|
190
|
-
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
191
|
-
const metadata = JSON.parse(content);
|
|
192
|
-
snapshots.push({
|
|
193
|
-
messageIndex: metadata.messageCount,
|
|
194
|
-
timestamp: metadata.timestamp
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
logger.error('Failed to list snapshots:', error);
|
|
201
|
-
}
|
|
202
|
-
return snapshots.sort((a, b) => b.messageIndex - a.messageIndex);
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Rollback workspace to specific snapshot
|
|
206
|
-
*/
|
|
207
|
-
async rollbackToSnapshot(sessionId, messageIndex) {
|
|
208
|
-
const snapshotId = `${sessionId}_${messageIndex}`;
|
|
209
|
-
const metadataPath = this.getSnapshotPath(snapshotId);
|
|
210
|
-
const snapshotContentDir = this.getSnapshotContentDir(snapshotId);
|
|
211
|
-
try {
|
|
212
|
-
// Load snapshot metadata
|
|
213
|
-
const metadataContent = await fs.readFile(metadataPath, 'utf-8');
|
|
214
|
-
const metadata = JSON.parse(metadataContent);
|
|
215
|
-
// Get current workspace files
|
|
216
|
-
const currentFiles = await this.scanWorkspace(metadata.workspaceRoot);
|
|
217
|
-
// Find files that exist now but didn't exist in snapshot
|
|
218
|
-
// (these should be deleted)
|
|
219
|
-
const snapshotFilePaths = new Set(metadata.changedFiles.map(f => f.path));
|
|
220
|
-
for (const [relativePath] of currentFiles) {
|
|
221
|
-
if (!snapshotFilePaths.has(relativePath)) {
|
|
222
|
-
// This file was created after snapshot, delete it
|
|
223
|
-
const fullPath = path.join(metadata.workspaceRoot, relativePath);
|
|
224
|
-
try {
|
|
225
|
-
await fs.unlink(fullPath);
|
|
226
|
-
}
|
|
227
|
-
catch (error) {
|
|
228
|
-
console.error(`Failed to delete new file ${relativePath}:`, error);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
// Restore all files from snapshot
|
|
233
|
-
for (const fileBackup of metadata.changedFiles) {
|
|
234
|
-
const backupPath = path.join(snapshotContentDir, fileBackup.path);
|
|
235
|
-
const fullPath = path.join(metadata.workspaceRoot, fileBackup.path);
|
|
236
|
-
try {
|
|
237
|
-
// Restore file from backup
|
|
238
|
-
await fs.copyFile(backupPath, fullPath);
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
console.error(`Failed to restore file ${fileBackup.path}:`, error);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
// Don't clean up snapshot - keep for future rollbacks
|
|
245
|
-
return metadata.messageCount;
|
|
246
|
-
}
|
|
247
|
-
catch (error) {
|
|
248
|
-
console.error('Failed to rollback workspace:', error);
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Clear snapshot for a session
|
|
254
|
-
*/
|
|
255
|
-
async clearSnapshot(sessionId) {
|
|
256
|
-
const metadataPath = this.getSnapshotPath(sessionId);
|
|
257
|
-
const snapshotContentDir = this.getSnapshotContentDir(sessionId);
|
|
258
|
-
try {
|
|
259
|
-
// Delete metadata
|
|
260
|
-
await fs.unlink(metadataPath);
|
|
261
|
-
}
|
|
262
|
-
catch (error) {
|
|
263
|
-
// Ignore if doesn't exist
|
|
264
|
-
}
|
|
265
|
-
try {
|
|
266
|
-
// Delete snapshot content directory
|
|
267
|
-
await fs.rm(snapshotContentDir, { recursive: true, force: true });
|
|
268
|
-
}
|
|
269
|
-
catch (error) {
|
|
270
|
-
// Ignore if doesn't exist
|
|
271
|
-
}
|
|
272
|
-
if (this.activeSnapshot?.sessionId === sessionId) {
|
|
273
|
-
this.activeSnapshot = null;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Clear all snapshots for a session
|
|
278
|
-
*/
|
|
279
|
-
async clearAllSnapshots(sessionId) {
|
|
280
|
-
await this.ensureSnapshotsDir();
|
|
281
|
-
try {
|
|
282
|
-
const files = await fs.readdir(this.snapshotsDir);
|
|
283
|
-
for (const file of files) {
|
|
284
|
-
if (file.startsWith(sessionId)) {
|
|
285
|
-
const filePath = path.join(this.snapshotsDir, file);
|
|
286
|
-
if (file.endsWith('.json')) {
|
|
287
|
-
await fs.unlink(filePath);
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
await fs.rm(filePath, { recursive: true, force: true });
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
catch (error) {
|
|
296
|
-
console.error('Failed to clear snapshots:', error);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
export const workspaceSnapshotManager = new WorkspaceSnapshotManager();
|