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,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Match finding utilities for fuzzy search
|
|
3
|
-
*/
|
|
4
|
-
import { calculateSimilarity, normalizeForDisplay } from './similarity.utils.js';
|
|
5
|
-
/**
|
|
6
|
-
* Find the closest matching candidates in the file content
|
|
7
|
-
* Returns top N candidates sorted by similarity
|
|
8
|
-
* Optimized with safe pre-filtering and early exit
|
|
9
|
-
* ASYNC to prevent terminal freeze during search
|
|
10
|
-
*/
|
|
11
|
-
export async function findClosestMatches(searchContent, fileLines, topN = 3) {
|
|
12
|
-
const searchLines = searchContent.split('\n');
|
|
13
|
-
const candidates = [];
|
|
14
|
-
// Fast pre-filter: use first line as anchor (only for multi-line searches)
|
|
15
|
-
const searchFirstLine = searchLines[0]?.replace(/\s+/g, ' ').trim() || '';
|
|
16
|
-
const threshold = 0.5;
|
|
17
|
-
const usePreFilter = searchLines.length >= 5; // Only for 5+ line searches
|
|
18
|
-
const preFilterThreshold = 0.2; // Very conservative - only skip completely unrelated lines
|
|
19
|
-
// Try to find candidates by sliding window with optimizations
|
|
20
|
-
const maxCandidates = topN * 3; // Collect more candidates, then pick best
|
|
21
|
-
const YIELD_INTERVAL = 100; // Yield control every 100 iterations
|
|
22
|
-
for (let i = 0; i <= fileLines.length - searchLines.length; i++) {
|
|
23
|
-
// Yield control periodically to prevent UI freeze
|
|
24
|
-
if (i % YIELD_INTERVAL === 0) {
|
|
25
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
26
|
-
}
|
|
27
|
-
// Quick pre-filter: check first line similarity (only for multi-line)
|
|
28
|
-
if (usePreFilter) {
|
|
29
|
-
const firstLineCandidate = fileLines[i]?.replace(/\s+/g, ' ').trim() || '';
|
|
30
|
-
const firstLineSimilarity = calculateSimilarity(searchFirstLine, firstLineCandidate, preFilterThreshold);
|
|
31
|
-
// Skip only if first line is very different
|
|
32
|
-
if (firstLineSimilarity < preFilterThreshold) {
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
// Full candidate check
|
|
37
|
-
const candidateLines = fileLines.slice(i, i + searchLines.length);
|
|
38
|
-
const candidateContent = candidateLines.join('\n');
|
|
39
|
-
const similarity = calculateSimilarity(searchContent, candidateContent, threshold);
|
|
40
|
-
// Only consider candidates with >50% similarity
|
|
41
|
-
if (similarity > threshold) {
|
|
42
|
-
candidates.push({
|
|
43
|
-
startLine: i + 1,
|
|
44
|
-
endLine: i + searchLines.length,
|
|
45
|
-
similarity,
|
|
46
|
-
preview: candidateLines
|
|
47
|
-
.map((line, idx) => `${i + idx + 1}→${normalizeForDisplay(line)}`)
|
|
48
|
-
.join('\n'),
|
|
49
|
-
});
|
|
50
|
-
// Early exit if we found a nearly perfect match
|
|
51
|
-
if (similarity >= 0.95) {
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
// Limit candidates to avoid excessive computation
|
|
55
|
-
if (candidates.length >= maxCandidates) {
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Sort by similarity descending and return top N
|
|
61
|
-
return candidates.sort((a, b) => b.similarity - a.similarity).slice(0, topN);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Generate a helpful diff message showing differences between search and actual content
|
|
65
|
-
* Note: This is ONLY for display purposes. Tabs/spaces are normalized for better readability.
|
|
66
|
-
*/
|
|
67
|
-
export function generateDiffMessage(searchContent, actualContent, maxLines = 10) {
|
|
68
|
-
const searchLines = searchContent.split('\n');
|
|
69
|
-
const actualLines = actualContent.split('\n');
|
|
70
|
-
const diffLines = [];
|
|
71
|
-
const maxLen = Math.max(searchLines.length, actualLines.length);
|
|
72
|
-
for (let i = 0; i < Math.min(maxLen, maxLines); i++) {
|
|
73
|
-
const searchLine = searchLines[i] || '';
|
|
74
|
-
const actualLine = actualLines[i] || '';
|
|
75
|
-
if (searchLine !== actualLine) {
|
|
76
|
-
diffLines.push(`Line ${i + 1}:`);
|
|
77
|
-
diffLines.push(` Search: ${JSON.stringify(normalizeForDisplay(searchLine))}`);
|
|
78
|
-
diffLines.push(` Actual: ${JSON.stringify(normalizeForDisplay(actualLine))}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (maxLen > maxLines) {
|
|
82
|
-
diffLines.push(`... (${maxLen - maxLines} more lines)`);
|
|
83
|
-
}
|
|
84
|
-
return diffLines.join('\n');
|
|
85
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Office file parsing utilities
|
|
3
|
-
* Handles parsing of PDF, Word, Excel, and PowerPoint files
|
|
4
|
-
*/
|
|
5
|
-
import type { DocumentContent } from '../../types/filesystem.types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Parse Word document (.docx, .doc)
|
|
8
|
-
* @param fullPath - Full path to the Word document
|
|
9
|
-
* @returns DocumentContent object with extracted text
|
|
10
|
-
*/
|
|
11
|
-
export declare function parseWordDocument(fullPath: string): Promise<DocumentContent | null>;
|
|
12
|
-
/**
|
|
13
|
-
* Parse PDF document
|
|
14
|
-
* @param fullPath - Full path to the PDF file
|
|
15
|
-
* @returns DocumentContent object with extracted text
|
|
16
|
-
*/
|
|
17
|
-
export declare function parsePDFDocument(fullPath: string): Promise<DocumentContent | null>;
|
|
18
|
-
/**
|
|
19
|
-
* Parse Excel spreadsheet (.xlsx, .xls)
|
|
20
|
-
* @param fullPath - Full path to the Excel file
|
|
21
|
-
* @returns DocumentContent object with extracted text
|
|
22
|
-
*/
|
|
23
|
-
export declare function parseExcelDocument(fullPath: string): Promise<DocumentContent | null>;
|
|
24
|
-
/**
|
|
25
|
-
* Parse PowerPoint presentation (.pptx, .ppt)
|
|
26
|
-
* Note: PowerPoint parsing is complex and requires unzipping the .pptx file
|
|
27
|
-
* This is a placeholder implementation
|
|
28
|
-
* @param fullPath - Full path to the PowerPoint file
|
|
29
|
-
* @returns DocumentContent object with extracted text
|
|
30
|
-
*/
|
|
31
|
-
export declare function parsePowerPointDocument(fullPath: string): Promise<DocumentContent | null>;
|
|
32
|
-
/**
|
|
33
|
-
* Get Office file type based on extension
|
|
34
|
-
* @param filePath - Path to the file
|
|
35
|
-
* @returns File type or undefined
|
|
36
|
-
*/
|
|
37
|
-
export declare function getOfficeFileType(filePath: string): 'pdf' | 'word' | 'excel' | 'powerpoint' | undefined;
|
|
38
|
-
/**
|
|
39
|
-
* Main entry point: Read and parse Office document
|
|
40
|
-
* @param fullPath - Full path to the Office document
|
|
41
|
-
* @returns DocumentContent object with extracted text
|
|
42
|
-
*/
|
|
43
|
-
export declare function readOfficeDocument(fullPath: string): Promise<DocumentContent | null>;
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Office file parsing utilities
|
|
3
|
-
* Handles parsing of PDF, Word, Excel, and PowerPoint files
|
|
4
|
-
*/
|
|
5
|
-
import { promises as fs } from 'fs';
|
|
6
|
-
import mammoth from 'mammoth';
|
|
7
|
-
import * as XLSX from 'xlsx';
|
|
8
|
-
import { OFFICE_FILE_TYPES } from '../../types/filesystem.types.js';
|
|
9
|
-
import * as path from 'path';
|
|
10
|
-
/**
|
|
11
|
-
* Parse Word document (.docx, .doc)
|
|
12
|
-
* @param fullPath - Full path to the Word document
|
|
13
|
-
* @returns DocumentContent object with extracted text
|
|
14
|
-
*/
|
|
15
|
-
export async function parseWordDocument(fullPath) {
|
|
16
|
-
try {
|
|
17
|
-
const buffer = await fs.readFile(fullPath);
|
|
18
|
-
const result = await mammoth.extractRawText({ buffer });
|
|
19
|
-
return {
|
|
20
|
-
type: 'document',
|
|
21
|
-
text: result.value,
|
|
22
|
-
fileType: 'word',
|
|
23
|
-
metadata: {
|
|
24
|
-
messages: result.messages.length > 0 ? result.messages : undefined,
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
console.error(`Failed to parse Word document ${fullPath}:`, error);
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Parse PDF document
|
|
35
|
-
* @param fullPath - Full path to the PDF file
|
|
36
|
-
* @returns DocumentContent object with extracted text
|
|
37
|
-
*/
|
|
38
|
-
export async function parsePDFDocument(fullPath) {
|
|
39
|
-
try {
|
|
40
|
-
// Lazy import pdf-parse to avoid loading pdfjs-dist at startup
|
|
41
|
-
// pdfjs-dist requires browser APIs (DOMMatrix) which causes errors in Node.js
|
|
42
|
-
const { PDFParse } = await import('pdf-parse');
|
|
43
|
-
const buffer = await fs.readFile(fullPath);
|
|
44
|
-
const uint8Array = new Uint8Array(buffer);
|
|
45
|
-
// Create parser instance and parse
|
|
46
|
-
const parser = new PDFParse({ data: uint8Array });
|
|
47
|
-
const data = await parser.getText();
|
|
48
|
-
return {
|
|
49
|
-
type: 'document',
|
|
50
|
-
text: data.text,
|
|
51
|
-
fileType: 'pdf',
|
|
52
|
-
metadata: {
|
|
53
|
-
pages: data.total,
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
console.error(`Failed to parse PDF document ${fullPath}:`, error);
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Parse Excel spreadsheet (.xlsx, .xls)
|
|
64
|
-
* @param fullPath - Full path to the Excel file
|
|
65
|
-
* @returns DocumentContent object with extracted text
|
|
66
|
-
*/
|
|
67
|
-
export async function parseExcelDocument(fullPath) {
|
|
68
|
-
try {
|
|
69
|
-
const buffer = await fs.readFile(fullPath);
|
|
70
|
-
const workbook = XLSX.read(buffer, { type: 'buffer' });
|
|
71
|
-
const sheets = [];
|
|
72
|
-
let allText = '';
|
|
73
|
-
workbook.SheetNames.forEach(sheetName => {
|
|
74
|
-
sheets.push(sheetName);
|
|
75
|
-
const worksheet = workbook.Sheets[sheetName];
|
|
76
|
-
if (worksheet) {
|
|
77
|
-
const sheetText = XLSX.utils.sheet_to_txt(worksheet);
|
|
78
|
-
allText += `\n\n=== Sheet: ${sheetName} ===\n${sheetText}`;
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
return {
|
|
82
|
-
type: 'document',
|
|
83
|
-
text: allText.trim(),
|
|
84
|
-
fileType: 'excel',
|
|
85
|
-
metadata: {
|
|
86
|
-
sheets,
|
|
87
|
-
sheetCount: sheets.length,
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
console.error(`Failed to parse Excel document ${fullPath}:`, error);
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Parse PowerPoint presentation (.pptx, .ppt)
|
|
98
|
-
* Note: PowerPoint parsing is complex and requires unzipping the .pptx file
|
|
99
|
-
* This is a placeholder implementation
|
|
100
|
-
* @param fullPath - Full path to the PowerPoint file
|
|
101
|
-
* @returns DocumentContent object with extracted text
|
|
102
|
-
*/
|
|
103
|
-
export async function parsePowerPointDocument(fullPath) {
|
|
104
|
-
try {
|
|
105
|
-
// PowerPoint parsing requires extracting and parsing XML from the .pptx archive
|
|
106
|
-
// A full implementation would use JSZip to extract slide XML files
|
|
107
|
-
// and parse them to extract text content
|
|
108
|
-
// For now, return a placeholder message
|
|
109
|
-
return {
|
|
110
|
-
type: 'document',
|
|
111
|
-
text: '[PowerPoint parsing not fully implemented yet. Please use a specialized tool to extract text from .pptx files.]',
|
|
112
|
-
fileType: 'powerpoint',
|
|
113
|
-
metadata: {
|
|
114
|
-
note: 'PowerPoint text extraction requires additional implementation',
|
|
115
|
-
suggestion: 'Consider using external tools or libraries like python-pptx for full PowerPoint text extraction',
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
console.error(`Failed to parse PowerPoint document ${fullPath}:`, error);
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Get Office file type based on extension
|
|
126
|
-
* @param filePath - Path to the file
|
|
127
|
-
* @returns File type or undefined
|
|
128
|
-
*/
|
|
129
|
-
export function getOfficeFileType(filePath) {
|
|
130
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
131
|
-
return OFFICE_FILE_TYPES[ext];
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Main entry point: Read and parse Office document
|
|
135
|
-
* @param fullPath - Full path to the Office document
|
|
136
|
-
* @returns DocumentContent object with extracted text
|
|
137
|
-
*/
|
|
138
|
-
export async function readOfficeDocument(fullPath) {
|
|
139
|
-
const fileType = getOfficeFileType(fullPath);
|
|
140
|
-
if (!fileType) {
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
let docContent = null;
|
|
144
|
-
switch (fileType) {
|
|
145
|
-
case 'word': {
|
|
146
|
-
docContent = await parseWordDocument(fullPath);
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
case 'pdf': {
|
|
150
|
-
docContent = await parsePDFDocument(fullPath);
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
case 'excel': {
|
|
154
|
-
docContent = await parseExcelDocument(fullPath);
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
case 'powerpoint': {
|
|
158
|
-
docContent = await parsePowerPointDocument(fullPath);
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return docContent;
|
|
163
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Attempt to fix common path issues when file is not found
|
|
3
|
-
* @param originalPath - The original path that failed
|
|
4
|
-
* @param basePath - Base path for resolving relative paths
|
|
5
|
-
* @returns Fixed path or null if cannot be fixed
|
|
6
|
-
*/
|
|
7
|
-
export declare function tryFixPath(originalPath: string, basePath: string): Promise<string | null>;
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { resolve } from 'node:path';
|
|
3
|
-
/**
|
|
4
|
-
* Attempt to fix common path issues when file is not found
|
|
5
|
-
* @param originalPath - The original path that failed
|
|
6
|
-
* @param basePath - Base path for resolving relative paths
|
|
7
|
-
* @returns Fixed path or null if cannot be fixed
|
|
8
|
-
*/
|
|
9
|
-
export async function tryFixPath(originalPath, basePath) {
|
|
10
|
-
try {
|
|
11
|
-
// Common pattern: "source/mcp/utils/filesystem.ts" should be "source/mcp/filesystem.ts"
|
|
12
|
-
// Remove unnecessary intermediate directories
|
|
13
|
-
const segments = originalPath.split('/');
|
|
14
|
-
// Try removing 'utils' directory if present
|
|
15
|
-
if (segments.includes('utils')) {
|
|
16
|
-
const withoutUtils = segments.filter(s => s !== 'utils').join('/');
|
|
17
|
-
const fixedPath = resolve(basePath, withoutUtils);
|
|
18
|
-
try {
|
|
19
|
-
await fs.access(fixedPath);
|
|
20
|
-
return withoutUtils;
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
// Continue to next attempt
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
// Try parent directories
|
|
27
|
-
for (let i = 0; i < segments.length - 1; i++) {
|
|
28
|
-
const reducedPath = [
|
|
29
|
-
...segments.slice(0, i),
|
|
30
|
-
segments[segments.length - 1],
|
|
31
|
-
].join('/');
|
|
32
|
-
const fixedPath = resolve(basePath, reducedPath);
|
|
33
|
-
try {
|
|
34
|
-
await fs.access(fixedPath);
|
|
35
|
-
return reducedPath;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// Continue to next attempt
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
// Try searching for the file by name in common directories
|
|
42
|
-
const fileName = segments[segments.length - 1];
|
|
43
|
-
const commonDirs = ['source', 'src', 'lib', 'dist'];
|
|
44
|
-
for (const dir of commonDirs) {
|
|
45
|
-
const searchPath = `${dir}/${fileName}`;
|
|
46
|
-
const fixedPath = resolve(basePath, searchPath);
|
|
47
|
-
try {
|
|
48
|
-
await fs.access(fixedPath);
|
|
49
|
-
return searchPath;
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
// Continue to next attempt
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Similarity calculation utilities for fuzzy matching
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Calculate similarity between two strings using a smarter algorithm
|
|
6
|
-
* This normalizes whitespace first to avoid false negatives from spacing differences
|
|
7
|
-
* Returns a value between 0 (completely different) and 1 (identical)
|
|
8
|
-
*/
|
|
9
|
-
export declare function calculateSimilarity(str1: string, str2: string, threshold?: number): number;
|
|
10
|
-
/**
|
|
11
|
-
* Calculate Levenshtein distance between two strings with early termination
|
|
12
|
-
* @param str1 First string
|
|
13
|
-
* @param str2 Second string
|
|
14
|
-
* @param maxDistance Maximum distance to compute (early exit if exceeded)
|
|
15
|
-
* @returns Levenshtein distance, or maxDistance+1 if exceeded
|
|
16
|
-
*/
|
|
17
|
-
export declare function levenshteinDistance(str1: string, str2: string, maxDistance?: number): number;
|
|
18
|
-
/**
|
|
19
|
-
* Normalize whitespace for display purposes
|
|
20
|
-
* Makes preview more readable by collapsing whitespace
|
|
21
|
-
*/
|
|
22
|
-
export declare function normalizeForDisplay(line: string): string;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Similarity calculation utilities for fuzzy matching
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Calculate similarity between two strings using a smarter algorithm
|
|
6
|
-
* This normalizes whitespace first to avoid false negatives from spacing differences
|
|
7
|
-
* Returns a value between 0 (completely different) and 1 (identical)
|
|
8
|
-
*/
|
|
9
|
-
export function calculateSimilarity(str1, str2, threshold = 0) {
|
|
10
|
-
// Normalize whitespace for comparison: collapse all whitespace to single spaces
|
|
11
|
-
const normalize = (s) => s.replace(/\s+/g, ' ').trim();
|
|
12
|
-
const norm1 = normalize(str1);
|
|
13
|
-
const norm2 = normalize(str2);
|
|
14
|
-
const len1 = norm1.length;
|
|
15
|
-
const len2 = norm2.length;
|
|
16
|
-
if (len1 === 0)
|
|
17
|
-
return len2 === 0 ? 1 : 0;
|
|
18
|
-
if (len2 === 0)
|
|
19
|
-
return 0;
|
|
20
|
-
// Quick length check - if lengths differ too much, similarity can't be above threshold
|
|
21
|
-
const maxLen = Math.max(len1, len2);
|
|
22
|
-
const minLen = Math.min(len1, len2);
|
|
23
|
-
const lengthRatio = minLen / maxLen;
|
|
24
|
-
if (threshold > 0 && lengthRatio < threshold) {
|
|
25
|
-
return lengthRatio; // Can't possibly meet threshold
|
|
26
|
-
}
|
|
27
|
-
// Use Levenshtein distance for better similarity calculation
|
|
28
|
-
const distance = levenshteinDistance(norm1, norm2, Math.ceil(maxLen * (1 - threshold)));
|
|
29
|
-
return 1 - distance / maxLen;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Calculate Levenshtein distance between two strings with early termination
|
|
33
|
-
* @param str1 First string
|
|
34
|
-
* @param str2 Second string
|
|
35
|
-
* @param maxDistance Maximum distance to compute (early exit if exceeded)
|
|
36
|
-
* @returns Levenshtein distance, or maxDistance+1 if exceeded
|
|
37
|
-
*/
|
|
38
|
-
export function levenshteinDistance(str1, str2, maxDistance = Infinity) {
|
|
39
|
-
const len1 = str1.length;
|
|
40
|
-
const len2 = str2.length;
|
|
41
|
-
// Quick exit for identical strings
|
|
42
|
-
if (str1 === str2)
|
|
43
|
-
return 0;
|
|
44
|
-
// Quick exit if length difference already exceeds maxDistance
|
|
45
|
-
if (Math.abs(len1 - len2) > maxDistance) {
|
|
46
|
-
return maxDistance + 1;
|
|
47
|
-
}
|
|
48
|
-
// Use single-row algorithm to save memory (only need previous row)
|
|
49
|
-
let prevRow = Array.from({ length: len2 + 1 }, (_, i) => i);
|
|
50
|
-
for (let i = 1; i <= len1; i++) {
|
|
51
|
-
const currRow = [i];
|
|
52
|
-
let minInRow = i; // Track minimum value in current row
|
|
53
|
-
for (let j = 1; j <= len2; j++) {
|
|
54
|
-
const cost = str1[i - 1] === str2[j - 1] ? 0 : 1;
|
|
55
|
-
const val = Math.min(prevRow[j] + 1, // deletion
|
|
56
|
-
currRow[j - 1] + 1, // insertion
|
|
57
|
-
prevRow[j - 1] + cost);
|
|
58
|
-
currRow[j] = val;
|
|
59
|
-
minInRow = Math.min(minInRow, val);
|
|
60
|
-
}
|
|
61
|
-
// Early termination: if minimum in this row exceeds maxDistance, we can stop
|
|
62
|
-
if (minInRow > maxDistance) {
|
|
63
|
-
return maxDistance + 1;
|
|
64
|
-
}
|
|
65
|
-
prevRow = currRow;
|
|
66
|
-
}
|
|
67
|
-
return prevRow[len2];
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Normalize whitespace for display purposes
|
|
71
|
-
* Makes preview more readable by collapsing whitespace
|
|
72
|
-
*/
|
|
73
|
-
export function normalizeForDisplay(line) {
|
|
74
|
-
return line.replace(/\t/g, ' ').replace(/ +/g, ' ');
|
|
75
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Date utilities for TODO service
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Format date for folder name (YYYY-MM-DD)
|
|
6
|
-
* @param date - Date to format
|
|
7
|
-
* @returns Formatted date string
|
|
8
|
-
*/
|
|
9
|
-
export function formatDateForFolder(date) {
|
|
10
|
-
const year = date.getFullYear();
|
|
11
|
-
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
12
|
-
const day = String(date.getDate()).padStart(2, '0');
|
|
13
|
-
return `${year}-${month}-${day}`;
|
|
14
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser detection utilities for web search
|
|
3
|
-
*/
|
|
4
|
-
import { execSync } from 'node:child_process';
|
|
5
|
-
import { existsSync } from 'node:fs';
|
|
6
|
-
import { platform } from 'node:os';
|
|
7
|
-
/**
|
|
8
|
-
* Detect system Chrome/Edge browser executable path
|
|
9
|
-
* @returns Browser executable path or null if not found
|
|
10
|
-
*/
|
|
11
|
-
export function findBrowserExecutable() {
|
|
12
|
-
const os = platform();
|
|
13
|
-
const paths = [];
|
|
14
|
-
if (os === 'win32') {
|
|
15
|
-
// Windows: Prioritize Edge (built-in), then Chrome
|
|
16
|
-
const edgePaths = [
|
|
17
|
-
'C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe',
|
|
18
|
-
'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
|
|
19
|
-
];
|
|
20
|
-
const chromePaths = [
|
|
21
|
-
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
22
|
-
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
|
|
23
|
-
process.env['LOCALAPPDATA'] + '\\Google\\Chrome\\Application\\chrome.exe',
|
|
24
|
-
];
|
|
25
|
-
paths.push(...edgePaths, ...chromePaths);
|
|
26
|
-
}
|
|
27
|
-
else if (os === 'darwin') {
|
|
28
|
-
// macOS
|
|
29
|
-
paths.push('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Chromium.app/Contents/MacOS/Chromium', '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge');
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
// Linux
|
|
33
|
-
const binPaths = [
|
|
34
|
-
'google-chrome',
|
|
35
|
-
'chromium',
|
|
36
|
-
'chromium-browser',
|
|
37
|
-
'microsoft-edge',
|
|
38
|
-
];
|
|
39
|
-
for (const bin of binPaths) {
|
|
40
|
-
try {
|
|
41
|
-
const path = execSync(`which ${bin}`, { encoding: 'utf8' }).trim();
|
|
42
|
-
if (path) {
|
|
43
|
-
return path;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// Continue to next binary
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
// Check if any path exists
|
|
52
|
-
for (const path of paths) {
|
|
53
|
-
if (path && existsSync(path)) {
|
|
54
|
-
return path;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Text processing utilities for web search
|
|
3
|
-
*/
|
|
4
|
-
import type { SearchResponse } from '../../types/websearch.types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Clean text by removing extra whitespace and HTML entities
|
|
7
|
-
* @param text - Raw text to clean
|
|
8
|
-
* @returns Cleaned text
|
|
9
|
-
*/
|
|
10
|
-
export declare function cleanText(text: string): string;
|
|
11
|
-
/**
|
|
12
|
-
* Format search results as readable text for AI consumption
|
|
13
|
-
* @param searchResponse - Search response object
|
|
14
|
-
* @returns Formatted text representation
|
|
15
|
-
*/
|
|
16
|
-
export declare function formatSearchResults(searchResponse: SearchResponse): string;
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Text processing utilities for web search
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Clean text by removing extra whitespace and HTML entities
|
|
6
|
-
* @param text - Raw text to clean
|
|
7
|
-
* @returns Cleaned text
|
|
8
|
-
*/
|
|
9
|
-
export function cleanText(text) {
|
|
10
|
-
return text
|
|
11
|
-
.replace(/\s+/g, ' ') // Replace multiple spaces with single space
|
|
12
|
-
.replace(/"/g, '"')
|
|
13
|
-
.replace(/&/g, '&')
|
|
14
|
-
.replace(/</g, '<')
|
|
15
|
-
.replace(/>/g, '>')
|
|
16
|
-
.replace(/<b>/g, '')
|
|
17
|
-
.replace(/<\/b>/g, '')
|
|
18
|
-
.trim();
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Format search results as readable text for AI consumption
|
|
22
|
-
* @param searchResponse - Search response object
|
|
23
|
-
* @returns Formatted text representation
|
|
24
|
-
*/
|
|
25
|
-
export function formatSearchResults(searchResponse) {
|
|
26
|
-
const { query, results, totalResults } = searchResponse;
|
|
27
|
-
let output = `Search Results for: "${query}"\n`;
|
|
28
|
-
output += `Found ${totalResults} results\n\n`;
|
|
29
|
-
output += '='.repeat(80) + '\n\n';
|
|
30
|
-
results.forEach((result, index) => {
|
|
31
|
-
output += `${index + 1}. ${result.title}\n`;
|
|
32
|
-
output += ` URL: ${result.url}\n`;
|
|
33
|
-
if (result.snippet) {
|
|
34
|
-
output += ` ${result.snippet}\n`;
|
|
35
|
-
}
|
|
36
|
-
output += '\n';
|
|
37
|
-
});
|
|
38
|
-
return output;
|
|
39
|
-
}
|