snow-ai 0.4.16 → 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 -384
- 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 -1519
- 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,641 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import crypto from 'node:crypto';
|
|
4
|
-
import ignore from 'ignore';
|
|
5
|
-
import { logger } from '../utils/logger.js';
|
|
6
|
-
import { CodebaseDatabase } from '../utils/codebaseDatabase.js';
|
|
7
|
-
import { createEmbeddings } from '../api/embedding.js';
|
|
8
|
-
import { loadCodebaseConfig, } from '../utils/codebaseConfig.js';
|
|
9
|
-
import { withRetry } from '../utils/retryUtils.js';
|
|
10
|
-
/**
|
|
11
|
-
* Codebase Index Agent
|
|
12
|
-
* Handles automatic code scanning, chunking, and embedding
|
|
13
|
-
*/
|
|
14
|
-
export class CodebaseIndexAgent {
|
|
15
|
-
constructor(projectRoot) {
|
|
16
|
-
Object.defineProperty(this, "db", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
configurable: true,
|
|
19
|
-
writable: true,
|
|
20
|
-
value: void 0
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(this, "config", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
configurable: true,
|
|
25
|
-
writable: true,
|
|
26
|
-
value: void 0
|
|
27
|
-
});
|
|
28
|
-
Object.defineProperty(this, "projectRoot", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
configurable: true,
|
|
31
|
-
writable: true,
|
|
32
|
-
value: void 0
|
|
33
|
-
});
|
|
34
|
-
Object.defineProperty(this, "ignoreFilter", {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
configurable: true,
|
|
37
|
-
writable: true,
|
|
38
|
-
value: void 0
|
|
39
|
-
});
|
|
40
|
-
Object.defineProperty(this, "isRunning", {
|
|
41
|
-
enumerable: true,
|
|
42
|
-
configurable: true,
|
|
43
|
-
writable: true,
|
|
44
|
-
value: false
|
|
45
|
-
});
|
|
46
|
-
Object.defineProperty(this, "shouldStop", {
|
|
47
|
-
enumerable: true,
|
|
48
|
-
configurable: true,
|
|
49
|
-
writable: true,
|
|
50
|
-
value: false
|
|
51
|
-
});
|
|
52
|
-
Object.defineProperty(this, "progressCallback", {
|
|
53
|
-
enumerable: true,
|
|
54
|
-
configurable: true,
|
|
55
|
-
writable: true,
|
|
56
|
-
value: void 0
|
|
57
|
-
});
|
|
58
|
-
Object.defineProperty(this, "consecutiveFailures", {
|
|
59
|
-
enumerable: true,
|
|
60
|
-
configurable: true,
|
|
61
|
-
writable: true,
|
|
62
|
-
value: 0
|
|
63
|
-
});
|
|
64
|
-
Object.defineProperty(this, "MAX_CONSECUTIVE_FAILURES", {
|
|
65
|
-
enumerable: true,
|
|
66
|
-
configurable: true,
|
|
67
|
-
writable: true,
|
|
68
|
-
value: 3
|
|
69
|
-
});
|
|
70
|
-
Object.defineProperty(this, "fileWatcher", {
|
|
71
|
-
enumerable: true,
|
|
72
|
-
configurable: true,
|
|
73
|
-
writable: true,
|
|
74
|
-
value: null
|
|
75
|
-
});
|
|
76
|
-
Object.defineProperty(this, "watchDebounceTimers", {
|
|
77
|
-
enumerable: true,
|
|
78
|
-
configurable: true,
|
|
79
|
-
writable: true,
|
|
80
|
-
value: new Map()
|
|
81
|
-
});
|
|
82
|
-
this.projectRoot = projectRoot;
|
|
83
|
-
this.config = loadCodebaseConfig();
|
|
84
|
-
this.db = new CodebaseDatabase(projectRoot);
|
|
85
|
-
this.ignoreFilter = ignore();
|
|
86
|
-
// Load .gitignore if exists
|
|
87
|
-
this.loadGitignore();
|
|
88
|
-
// Add default ignore patterns
|
|
89
|
-
this.addDefaultIgnorePatterns();
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Start indexing process
|
|
93
|
-
*/
|
|
94
|
-
async start(progressCallback) {
|
|
95
|
-
if (this.isRunning) {
|
|
96
|
-
logger.warn('Indexing already in progress');
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (!this.config.enabled) {
|
|
100
|
-
logger.info('Codebase indexing is disabled');
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
this.isRunning = true;
|
|
104
|
-
this.shouldStop = false;
|
|
105
|
-
this.progressCallback = progressCallback;
|
|
106
|
-
try {
|
|
107
|
-
// Initialize database
|
|
108
|
-
this.db.initialize();
|
|
109
|
-
// Check if stopped before starting
|
|
110
|
-
if (this.shouldStop) {
|
|
111
|
-
logger.info('Indexing cancelled before start');
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
// Check if we should resume or start fresh
|
|
115
|
-
const progress = this.db.getProgress();
|
|
116
|
-
const isResuming = progress.status === 'indexing';
|
|
117
|
-
if (isResuming) {
|
|
118
|
-
logger.info('Resuming previous indexing session');
|
|
119
|
-
}
|
|
120
|
-
// Scan files first
|
|
121
|
-
this.notifyProgress({
|
|
122
|
-
totalFiles: 0,
|
|
123
|
-
processedFiles: 0,
|
|
124
|
-
totalChunks: 0,
|
|
125
|
-
currentFile: '',
|
|
126
|
-
status: 'scanning',
|
|
127
|
-
});
|
|
128
|
-
const files = await this.scanFiles();
|
|
129
|
-
logger.info(`Found ${files.length} code files to index`);
|
|
130
|
-
// Reset progress if file count changed (project structure changed)
|
|
131
|
-
// or if previous session was interrupted abnormally
|
|
132
|
-
const shouldReset = isResuming &&
|
|
133
|
-
(progress.totalFiles !== files.length ||
|
|
134
|
-
progress.processedFiles > files.length);
|
|
135
|
-
if (shouldReset) {
|
|
136
|
-
logger.info('File count changed or progress corrupted, resetting progress');
|
|
137
|
-
this.db.updateProgress({
|
|
138
|
-
totalFiles: files.length,
|
|
139
|
-
processedFiles: 0,
|
|
140
|
-
totalChunks: this.db.getTotalChunks(),
|
|
141
|
-
status: 'indexing',
|
|
142
|
-
startedAt: Date.now(),
|
|
143
|
-
lastProcessedFile: undefined,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
// Update status to indexing
|
|
148
|
-
this.db.updateProgress({
|
|
149
|
-
status: 'indexing',
|
|
150
|
-
totalFiles: files.length,
|
|
151
|
-
startedAt: isResuming ? progress.startedAt : Date.now(),
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
// Check if stopped after initialization
|
|
155
|
-
if (this.shouldStop) {
|
|
156
|
-
logger.info('Indexing cancelled after initialization');
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// Process files with concurrency control
|
|
160
|
-
await this.processFiles(files);
|
|
161
|
-
// Only mark as completed if not stopped by user
|
|
162
|
-
if (!this.shouldStop) {
|
|
163
|
-
// Mark as completed
|
|
164
|
-
this.db.updateProgress({
|
|
165
|
-
status: 'completed',
|
|
166
|
-
completedAt: Date.now(),
|
|
167
|
-
});
|
|
168
|
-
this.notifyProgress({
|
|
169
|
-
totalFiles: files.length,
|
|
170
|
-
processedFiles: files.length,
|
|
171
|
-
totalChunks: this.db.getTotalChunks(),
|
|
172
|
-
currentFile: '',
|
|
173
|
-
status: 'completed',
|
|
174
|
-
});
|
|
175
|
-
logger.info('Indexing completed successfully');
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
logger.info('Indexing paused by user, progress saved');
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
183
|
-
this.db.updateProgress({
|
|
184
|
-
status: 'error',
|
|
185
|
-
lastError: errorMessage,
|
|
186
|
-
});
|
|
187
|
-
this.notifyProgress({
|
|
188
|
-
totalFiles: 0,
|
|
189
|
-
processedFiles: 0,
|
|
190
|
-
totalChunks: 0,
|
|
191
|
-
currentFile: '',
|
|
192
|
-
status: 'error',
|
|
193
|
-
error: errorMessage,
|
|
194
|
-
});
|
|
195
|
-
logger.error('Indexing failed', error);
|
|
196
|
-
throw error;
|
|
197
|
-
}
|
|
198
|
-
finally {
|
|
199
|
-
this.isRunning = false;
|
|
200
|
-
this.shouldStop = false;
|
|
201
|
-
// Don't change status to 'idle' if indexing was stopped
|
|
202
|
-
// This allows resuming when returning to chat screen
|
|
203
|
-
// Status will remain as 'indexing' so it can be resumed
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Stop indexing gracefully
|
|
208
|
-
*/
|
|
209
|
-
async stop() {
|
|
210
|
-
if (!this.isRunning) {
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
logger.info('Stopping indexing...');
|
|
214
|
-
this.shouldStop = true;
|
|
215
|
-
// Wait for current operation to finish
|
|
216
|
-
while (this.isRunning) {
|
|
217
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Check if indexing is in progress
|
|
222
|
-
*/
|
|
223
|
-
isIndexing() {
|
|
224
|
-
return this.isRunning;
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Get current progress
|
|
228
|
-
*/
|
|
229
|
-
getProgress() {
|
|
230
|
-
// Initialize database if not already done
|
|
231
|
-
if (!this.db) {
|
|
232
|
-
this.db = new CodebaseDatabase(this.projectRoot);
|
|
233
|
-
}
|
|
234
|
-
this.db.initialize();
|
|
235
|
-
return this.db.getProgress();
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Clear all indexed data
|
|
239
|
-
*/
|
|
240
|
-
clear() {
|
|
241
|
-
this.db.clear();
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Close database connection
|
|
245
|
-
*/
|
|
246
|
-
close() {
|
|
247
|
-
this.stopWatching();
|
|
248
|
-
this.db.close();
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Check if watcher is enabled in database
|
|
252
|
-
*/
|
|
253
|
-
isWatcherEnabled() {
|
|
254
|
-
try {
|
|
255
|
-
this.db.initialize();
|
|
256
|
-
return this.db.isWatcherEnabled();
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Start watching for file changes
|
|
264
|
-
*/
|
|
265
|
-
startWatching(progressCallback) {
|
|
266
|
-
if (this.fileWatcher) {
|
|
267
|
-
logger.debug('File watcher already running');
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
if (!this.config.enabled) {
|
|
271
|
-
logger.info('Codebase indexing is disabled, not starting watcher');
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
// Save progress callback for file change notifications
|
|
275
|
-
if (progressCallback) {
|
|
276
|
-
this.progressCallback = progressCallback;
|
|
277
|
-
}
|
|
278
|
-
try {
|
|
279
|
-
this.fileWatcher = fs.watch(this.projectRoot, { recursive: true }, (_eventType, filename) => {
|
|
280
|
-
if (!filename)
|
|
281
|
-
return;
|
|
282
|
-
// Convert to absolute path
|
|
283
|
-
const filePath = path.join(this.projectRoot, filename);
|
|
284
|
-
const relativePath = path.relative(this.projectRoot, filePath);
|
|
285
|
-
// Check if file should be ignored
|
|
286
|
-
if (this.ignoreFilter.ignores(relativePath)) {
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
// Check if it's a code file
|
|
290
|
-
const ext = path.extname(filename);
|
|
291
|
-
if (!CodebaseIndexAgent.CODE_EXTENSIONS.has(ext)) {
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
// Check if file exists (might be deleted)
|
|
295
|
-
if (!fs.existsSync(filePath)) {
|
|
296
|
-
logger.debug(`File deleted, removing from index: ${relativePath}`);
|
|
297
|
-
this.db.deleteChunksByFile(relativePath);
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
// Debounce file changes
|
|
301
|
-
this.debounceFileChange(filePath, relativePath);
|
|
302
|
-
});
|
|
303
|
-
// Persist watcher state to database
|
|
304
|
-
this.db.setWatcherEnabled(true);
|
|
305
|
-
logger.info('File watcher started successfully');
|
|
306
|
-
}
|
|
307
|
-
catch (error) {
|
|
308
|
-
logger.error('Failed to start file watcher', error);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Stop watching for file changes
|
|
313
|
-
*/
|
|
314
|
-
stopWatching() {
|
|
315
|
-
if (this.fileWatcher) {
|
|
316
|
-
this.fileWatcher.close();
|
|
317
|
-
this.fileWatcher = null;
|
|
318
|
-
// Persist watcher state to database
|
|
319
|
-
this.db.setWatcherEnabled(false);
|
|
320
|
-
logger.info('File watcher stopped');
|
|
321
|
-
}
|
|
322
|
-
// Clear all pending debounce timers
|
|
323
|
-
for (const timer of this.watchDebounceTimers.values()) {
|
|
324
|
-
clearTimeout(timer);
|
|
325
|
-
}
|
|
326
|
-
this.watchDebounceTimers.clear();
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Debounce file changes to avoid multiple rapid updates
|
|
330
|
-
*/
|
|
331
|
-
debounceFileChange(filePath, relativePath) {
|
|
332
|
-
// Clear existing timer for this file
|
|
333
|
-
const existingTimer = this.watchDebounceTimers.get(relativePath);
|
|
334
|
-
if (existingTimer) {
|
|
335
|
-
clearTimeout(existingTimer);
|
|
336
|
-
}
|
|
337
|
-
// Set new timer
|
|
338
|
-
const timer = setTimeout(() => {
|
|
339
|
-
this.watchDebounceTimers.delete(relativePath);
|
|
340
|
-
this.handleFileChange(filePath, relativePath);
|
|
341
|
-
}, 5000); // 5 second debounce - optimized for AI code editing
|
|
342
|
-
this.watchDebounceTimers.set(relativePath, timer);
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Handle file change event
|
|
346
|
-
*/
|
|
347
|
-
async handleFileChange(filePath, relativePath) {
|
|
348
|
-
try {
|
|
349
|
-
// Notify UI that file is being reindexed
|
|
350
|
-
this.notifyProgress({
|
|
351
|
-
totalFiles: 0,
|
|
352
|
-
processedFiles: 0,
|
|
353
|
-
totalChunks: this.db.getTotalChunks(),
|
|
354
|
-
currentFile: relativePath,
|
|
355
|
-
status: 'indexing',
|
|
356
|
-
});
|
|
357
|
-
await this.processFile(filePath);
|
|
358
|
-
// Notify UI that reindexing is complete
|
|
359
|
-
this.notifyProgress({
|
|
360
|
-
totalFiles: 0,
|
|
361
|
-
processedFiles: 0,
|
|
362
|
-
totalChunks: this.db.getTotalChunks(),
|
|
363
|
-
currentFile: '',
|
|
364
|
-
status: 'completed',
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
catch (error) {
|
|
368
|
-
logger.error(`Failed to reindex file: ${relativePath}`, error);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Load .gitignore file
|
|
373
|
-
*/
|
|
374
|
-
loadGitignore() {
|
|
375
|
-
const gitignorePath = path.join(this.projectRoot, '.gitignore');
|
|
376
|
-
if (fs.existsSync(gitignorePath)) {
|
|
377
|
-
const content = fs.readFileSync(gitignorePath, 'utf-8');
|
|
378
|
-
this.ignoreFilter.add(content);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* Add default ignore patterns
|
|
383
|
-
*/
|
|
384
|
-
addDefaultIgnorePatterns() {
|
|
385
|
-
this.ignoreFilter.add([
|
|
386
|
-
'node_modules',
|
|
387
|
-
'.git',
|
|
388
|
-
'.snow',
|
|
389
|
-
'dist',
|
|
390
|
-
'build',
|
|
391
|
-
'out',
|
|
392
|
-
'coverage',
|
|
393
|
-
'.next',
|
|
394
|
-
'.nuxt',
|
|
395
|
-
'.cache',
|
|
396
|
-
'*.min.js',
|
|
397
|
-
'*.min.css',
|
|
398
|
-
'*.map',
|
|
399
|
-
'package-lock.json',
|
|
400
|
-
'yarn.lock',
|
|
401
|
-
'pnpm-lock.yaml',
|
|
402
|
-
]);
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Scan project directory for code files
|
|
406
|
-
*/
|
|
407
|
-
async scanFiles() {
|
|
408
|
-
const files = [];
|
|
409
|
-
const scanDir = (dir) => {
|
|
410
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
411
|
-
for (const entry of entries) {
|
|
412
|
-
if (this.shouldStop)
|
|
413
|
-
break;
|
|
414
|
-
const fullPath = path.join(dir, entry.name);
|
|
415
|
-
const relativePath = path.relative(this.projectRoot, fullPath);
|
|
416
|
-
// Check if should be ignored
|
|
417
|
-
if (this.ignoreFilter.ignores(relativePath)) {
|
|
418
|
-
continue;
|
|
419
|
-
}
|
|
420
|
-
if (entry.isDirectory()) {
|
|
421
|
-
scanDir(fullPath);
|
|
422
|
-
}
|
|
423
|
-
else if (entry.isFile()) {
|
|
424
|
-
const ext = path.extname(entry.name);
|
|
425
|
-
if (CodebaseIndexAgent.CODE_EXTENSIONS.has(ext)) {
|
|
426
|
-
files.push(fullPath);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
};
|
|
431
|
-
scanDir(this.projectRoot);
|
|
432
|
-
return files;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Process files with concurrency control
|
|
436
|
-
*/
|
|
437
|
-
async processFiles(files) {
|
|
438
|
-
const concurrency = this.config.batch.concurrency;
|
|
439
|
-
// Process files in batches
|
|
440
|
-
for (let i = 0; i < files.length; i += concurrency) {
|
|
441
|
-
if (this.shouldStop) {
|
|
442
|
-
logger.info('Indexing stopped by user');
|
|
443
|
-
break;
|
|
444
|
-
}
|
|
445
|
-
const batch = files.slice(i, i + concurrency);
|
|
446
|
-
const promises = batch.map(file => this.processFile(file));
|
|
447
|
-
await Promise.allSettled(promises);
|
|
448
|
-
// Update processed count accurately (current batch end index)
|
|
449
|
-
const processedCount = Math.min(i + batch.length, files.length);
|
|
450
|
-
this.db.updateProgress({
|
|
451
|
-
processedFiles: processedCount,
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Process single file
|
|
457
|
-
*/
|
|
458
|
-
async processFile(filePath) {
|
|
459
|
-
try {
|
|
460
|
-
const relativePath = path.relative(this.projectRoot, filePath);
|
|
461
|
-
this.notifyProgress({
|
|
462
|
-
totalFiles: this.db.getProgress().totalFiles,
|
|
463
|
-
processedFiles: this.db.getProgress().processedFiles,
|
|
464
|
-
totalChunks: this.db.getTotalChunks(),
|
|
465
|
-
currentFile: relativePath,
|
|
466
|
-
status: 'indexing',
|
|
467
|
-
});
|
|
468
|
-
// Read file content
|
|
469
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
470
|
-
// Calculate file hash for change detection
|
|
471
|
-
const fileHash = crypto
|
|
472
|
-
.createHash('sha256')
|
|
473
|
-
.update(content)
|
|
474
|
-
.digest('hex');
|
|
475
|
-
// Check if file has been indexed and unchanged
|
|
476
|
-
if (this.db.hasFileHash(fileHash)) {
|
|
477
|
-
logger.debug(`File unchanged, skipping: ${relativePath}`);
|
|
478
|
-
return;
|
|
479
|
-
}
|
|
480
|
-
// Delete old chunks for this file
|
|
481
|
-
this.db.deleteChunksByFile(relativePath);
|
|
482
|
-
// Split content into chunks
|
|
483
|
-
const chunks = this.splitIntoChunks(content, relativePath);
|
|
484
|
-
if (chunks.length === 0) {
|
|
485
|
-
logger.debug(`No chunks generated for: ${relativePath}`);
|
|
486
|
-
return;
|
|
487
|
-
}
|
|
488
|
-
// Generate embeddings in batches
|
|
489
|
-
const maxLines = this.config.batch.maxLines;
|
|
490
|
-
const embeddingBatches = [];
|
|
491
|
-
for (let i = 0; i < chunks.length; i += maxLines) {
|
|
492
|
-
const batch = chunks.slice(i, i + maxLines);
|
|
493
|
-
embeddingBatches.push(batch);
|
|
494
|
-
}
|
|
495
|
-
for (const batch of embeddingBatches) {
|
|
496
|
-
if (this.shouldStop)
|
|
497
|
-
break;
|
|
498
|
-
try {
|
|
499
|
-
// Extract text content for embedding
|
|
500
|
-
const texts = batch.map(chunk => chunk.content);
|
|
501
|
-
// Call embedding API with retry
|
|
502
|
-
const response = await withRetry(async () => {
|
|
503
|
-
return await createEmbeddings({
|
|
504
|
-
input: texts,
|
|
505
|
-
});
|
|
506
|
-
}, {
|
|
507
|
-
maxRetries: 3,
|
|
508
|
-
baseDelay: 2000,
|
|
509
|
-
onRetry: (error, attempt, nextDelay) => {
|
|
510
|
-
logger.warn(`Embedding API failed for ${relativePath} (attempt ${attempt}/3), retrying in ${nextDelay}ms...`, error.message);
|
|
511
|
-
},
|
|
512
|
-
});
|
|
513
|
-
// Attach embeddings to chunks
|
|
514
|
-
for (let i = 0; i < batch.length; i++) {
|
|
515
|
-
batch[i].embedding = response.data[i].embedding;
|
|
516
|
-
batch[i].fileHash = fileHash;
|
|
517
|
-
batch[i].createdAt = Date.now();
|
|
518
|
-
batch[i].updatedAt = Date.now();
|
|
519
|
-
}
|
|
520
|
-
// Store chunks to database with retry
|
|
521
|
-
await withRetry(async () => {
|
|
522
|
-
this.db.insertChunks(batch);
|
|
523
|
-
}, {
|
|
524
|
-
maxRetries: 2,
|
|
525
|
-
baseDelay: 500,
|
|
526
|
-
});
|
|
527
|
-
// Update total chunks count
|
|
528
|
-
this.db.updateProgress({
|
|
529
|
-
totalChunks: this.db.getTotalChunks(),
|
|
530
|
-
lastProcessedFile: relativePath,
|
|
531
|
-
});
|
|
532
|
-
// Reset failure counter on success
|
|
533
|
-
this.consecutiveFailures = 0;
|
|
534
|
-
}
|
|
535
|
-
catch (error) {
|
|
536
|
-
this.consecutiveFailures++;
|
|
537
|
-
logger.error(`Failed to process batch for ${relativePath} (consecutive failures: ${this.consecutiveFailures}):`, error);
|
|
538
|
-
// Stop indexing if too many consecutive failures
|
|
539
|
-
if (this.consecutiveFailures >= this.MAX_CONSECUTIVE_FAILURES) {
|
|
540
|
-
logger.error(`Stopping indexing after ${this.MAX_CONSECUTIVE_FAILURES} consecutive failures`);
|
|
541
|
-
this.db.updateProgress({
|
|
542
|
-
status: 'error',
|
|
543
|
-
lastError: `Too many failures: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
544
|
-
});
|
|
545
|
-
throw new Error(`Indexing stopped after ${this.MAX_CONSECUTIVE_FAILURES} consecutive failures`);
|
|
546
|
-
}
|
|
547
|
-
// Skip this batch and continue
|
|
548
|
-
continue;
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
logger.debug(`Indexed ${chunks.length} chunks from: ${relativePath}`);
|
|
552
|
-
}
|
|
553
|
-
catch (error) {
|
|
554
|
-
logger.error(`Failed to process file: ${filePath}`, error);
|
|
555
|
-
// Continue with next file
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
/**
|
|
559
|
-
* Split file content into chunks
|
|
560
|
-
*/
|
|
561
|
-
splitIntoChunks(content, filePath) {
|
|
562
|
-
const lines = content.split('\n');
|
|
563
|
-
const chunks = [];
|
|
564
|
-
const maxLinesPerChunk = 100; // Max lines per chunk
|
|
565
|
-
const overlapLines = 10; // Overlap between chunks for context
|
|
566
|
-
for (let i = 0; i < lines.length; i += maxLinesPerChunk - overlapLines) {
|
|
567
|
-
const startLine = i;
|
|
568
|
-
const endLine = Math.min(i + maxLinesPerChunk, lines.length);
|
|
569
|
-
const chunkLines = lines.slice(startLine, endLine);
|
|
570
|
-
const chunkContent = chunkLines.join('\n');
|
|
571
|
-
// Skip empty chunks
|
|
572
|
-
if (chunkContent.trim().length === 0) {
|
|
573
|
-
continue;
|
|
574
|
-
}
|
|
575
|
-
chunks.push({
|
|
576
|
-
filePath,
|
|
577
|
-
content: chunkContent,
|
|
578
|
-
startLine: startLine + 1, // 1-indexed
|
|
579
|
-
endLine: endLine,
|
|
580
|
-
embedding: [], // Will be filled later
|
|
581
|
-
fileHash: '', // Will be filled later
|
|
582
|
-
createdAt: 0,
|
|
583
|
-
updatedAt: 0,
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
return chunks;
|
|
587
|
-
}
|
|
588
|
-
/**
|
|
589
|
-
* Notify progress to callback
|
|
590
|
-
*/
|
|
591
|
-
notifyProgress(progress) {
|
|
592
|
-
if (this.progressCallback) {
|
|
593
|
-
this.progressCallback(progress);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
// Supported code file extensions
|
|
598
|
-
Object.defineProperty(CodebaseIndexAgent, "CODE_EXTENSIONS", {
|
|
599
|
-
enumerable: true,
|
|
600
|
-
configurable: true,
|
|
601
|
-
writable: true,
|
|
602
|
-
value: new Set([
|
|
603
|
-
'.ts',
|
|
604
|
-
'.tsx',
|
|
605
|
-
'.js',
|
|
606
|
-
'.jsx',
|
|
607
|
-
'.py',
|
|
608
|
-
'.java',
|
|
609
|
-
'.cpp',
|
|
610
|
-
'.c',
|
|
611
|
-
'.h',
|
|
612
|
-
'.hpp',
|
|
613
|
-
'.cs',
|
|
614
|
-
'.go',
|
|
615
|
-
'.rs',
|
|
616
|
-
'.rb',
|
|
617
|
-
'.php',
|
|
618
|
-
'.swift',
|
|
619
|
-
'.kt',
|
|
620
|
-
'.scala',
|
|
621
|
-
'.m',
|
|
622
|
-
'.md',
|
|
623
|
-
'.mm',
|
|
624
|
-
'.sh',
|
|
625
|
-
'.bash',
|
|
626
|
-
'.sql',
|
|
627
|
-
'.graphql',
|
|
628
|
-
'.proto',
|
|
629
|
-
'.json',
|
|
630
|
-
'.yaml',
|
|
631
|
-
'.yml',
|
|
632
|
-
'.toml',
|
|
633
|
-
'.xml',
|
|
634
|
-
'.html',
|
|
635
|
-
'.css',
|
|
636
|
-
'.scss',
|
|
637
|
-
'.less',
|
|
638
|
-
'.vue',
|
|
639
|
-
'.svelte',
|
|
640
|
-
])
|
|
641
|
-
});
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codebase Review Agent Service
|
|
3
|
-
*
|
|
4
|
-
* Reviews codebase search results to filter out irrelevant items.
|
|
5
|
-
* Uses basicModel for efficient, low-cost relevance checking.
|
|
6
|
-
* Can also suggest better search keywords if results are not relevant.
|
|
7
|
-
*/
|
|
8
|
-
export declare class CodebaseReviewAgent {
|
|
9
|
-
private modelName;
|
|
10
|
-
private requestMethod;
|
|
11
|
-
private initialized;
|
|
12
|
-
private readonly MAX_RETRIES;
|
|
13
|
-
/**
|
|
14
|
-
* Initialize the review agent with current configuration
|
|
15
|
-
*/
|
|
16
|
-
private initialize;
|
|
17
|
-
/**
|
|
18
|
-
* Check if review agent is available
|
|
19
|
-
*/
|
|
20
|
-
isAvailable(): Promise<boolean>;
|
|
21
|
-
/**
|
|
22
|
-
* Call the model with streaming API and assemble complete response
|
|
23
|
-
*/
|
|
24
|
-
private callModel;
|
|
25
|
-
/**
|
|
26
|
-
* Try to parse JSON response with retry logic
|
|
27
|
-
*/
|
|
28
|
-
private tryParseJSON;
|
|
29
|
-
/**
|
|
30
|
-
* Review search results with retry mechanism
|
|
31
|
-
*/
|
|
32
|
-
private reviewWithRetry;
|
|
33
|
-
/**
|
|
34
|
-
* Sleep utility for retry backoff
|
|
35
|
-
*/
|
|
36
|
-
private sleep;
|
|
37
|
-
/**
|
|
38
|
-
* Review search results and filter out irrelevant ones
|
|
39
|
-
* With retry mechanism and graceful degradation
|
|
40
|
-
*
|
|
41
|
-
* @param query - Original search query
|
|
42
|
-
* @param results - Search results to review
|
|
43
|
-
* @param abortSignal - Optional abort signal
|
|
44
|
-
* @returns Object with filtered results and optional suggestions
|
|
45
|
-
*/
|
|
46
|
-
reviewResults(query: string, results: Array<{
|
|
47
|
-
rank: number;
|
|
48
|
-
filePath: string;
|
|
49
|
-
startLine: number;
|
|
50
|
-
endLine: number;
|
|
51
|
-
content: string;
|
|
52
|
-
similarityScore: string;
|
|
53
|
-
location: string;
|
|
54
|
-
}>, abortSignal?: AbortSignal): Promise<{
|
|
55
|
-
filteredResults: typeof results;
|
|
56
|
-
removedCount: number;
|
|
57
|
-
suggestions?: string[];
|
|
58
|
-
reviewFailed?: boolean;
|
|
59
|
-
}>;
|
|
60
|
-
}
|
|
61
|
-
export declare const codebaseReviewAgent: CodebaseReviewAgent;
|