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,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Symbol parsing utilities for ACE Code Search
|
|
3
|
-
*/
|
|
4
|
-
import * as path from 'path';
|
|
5
|
-
import { LANGUAGE_CONFIG, detectLanguage } from './language.utils.js';
|
|
6
|
-
/**
|
|
7
|
-
* Get context lines around a specific line
|
|
8
|
-
* @param lines - All lines in file
|
|
9
|
-
* @param lineIndex - Target line index (0-based)
|
|
10
|
-
* @param contextSize - Number of lines before and after
|
|
11
|
-
* @returns Context string
|
|
12
|
-
*/
|
|
13
|
-
export function getContext(lines, lineIndex, contextSize) {
|
|
14
|
-
const start = Math.max(0, lineIndex - contextSize);
|
|
15
|
-
const end = Math.min(lines.length, lineIndex + contextSize + 1);
|
|
16
|
-
return lines
|
|
17
|
-
.slice(start, end)
|
|
18
|
-
.filter(l => l !== undefined)
|
|
19
|
-
.join('\n')
|
|
20
|
-
.trim();
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Parse file content to extract code symbols using regex patterns
|
|
24
|
-
* @param filePath - Path to file
|
|
25
|
-
* @param content - File content
|
|
26
|
-
* @param basePath - Base path for relative path calculation
|
|
27
|
-
* @returns Array of code symbols
|
|
28
|
-
*/
|
|
29
|
-
export async function parseFileSymbols(filePath, content, basePath) {
|
|
30
|
-
const symbols = [];
|
|
31
|
-
const language = detectLanguage(filePath);
|
|
32
|
-
if (!language || !LANGUAGE_CONFIG[language]) {
|
|
33
|
-
return symbols;
|
|
34
|
-
}
|
|
35
|
-
const config = LANGUAGE_CONFIG[language];
|
|
36
|
-
const lines = content.split('\n');
|
|
37
|
-
// Parse each line for symbols
|
|
38
|
-
for (let i = 0; i < lines.length; i++) {
|
|
39
|
-
const line = lines[i];
|
|
40
|
-
if (!line)
|
|
41
|
-
continue;
|
|
42
|
-
const lineNumber = i + 1;
|
|
43
|
-
// Extract functions
|
|
44
|
-
if (config.symbolPatterns.function) {
|
|
45
|
-
const match = line.match(config.symbolPatterns.function);
|
|
46
|
-
if (match) {
|
|
47
|
-
const name = match[1] || match[2] || match[3];
|
|
48
|
-
if (name) {
|
|
49
|
-
// Get function signature (current line + next few lines)
|
|
50
|
-
const contextLines = lines.slice(i, Math.min(i + 3, lines.length));
|
|
51
|
-
const signature = contextLines.join('\n').trim();
|
|
52
|
-
symbols.push({
|
|
53
|
-
name,
|
|
54
|
-
type: 'function',
|
|
55
|
-
filePath: path.relative(basePath, filePath),
|
|
56
|
-
line: lineNumber,
|
|
57
|
-
column: line.indexOf(name) + 1,
|
|
58
|
-
signature,
|
|
59
|
-
language,
|
|
60
|
-
context: getContext(lines, i, 2),
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Extract classes
|
|
66
|
-
if (config.symbolPatterns.class) {
|
|
67
|
-
const match = line.match(config.symbolPatterns.class);
|
|
68
|
-
if (match) {
|
|
69
|
-
const name = match[1] || match[2] || match[3];
|
|
70
|
-
if (name) {
|
|
71
|
-
symbols.push({
|
|
72
|
-
name,
|
|
73
|
-
type: 'class',
|
|
74
|
-
filePath: path.relative(basePath, filePath),
|
|
75
|
-
line: lineNumber,
|
|
76
|
-
column: line.indexOf(name) + 1,
|
|
77
|
-
signature: line.trim(),
|
|
78
|
-
language,
|
|
79
|
-
context: getContext(lines, i, 2),
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// Extract variables
|
|
85
|
-
if (config.symbolPatterns.variable) {
|
|
86
|
-
const match = line.match(config.symbolPatterns.variable);
|
|
87
|
-
if (match) {
|
|
88
|
-
const name = match[1];
|
|
89
|
-
if (name) {
|
|
90
|
-
symbols.push({
|
|
91
|
-
name,
|
|
92
|
-
type: 'variable',
|
|
93
|
-
filePath: path.relative(basePath, filePath),
|
|
94
|
-
line: lineNumber,
|
|
95
|
-
column: line.indexOf(name) + 1,
|
|
96
|
-
signature: line.trim(),
|
|
97
|
-
language,
|
|
98
|
-
context: getContext(lines, i, 1),
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Extract imports
|
|
104
|
-
if (config.symbolPatterns.import) {
|
|
105
|
-
const match = line.match(config.symbolPatterns.import);
|
|
106
|
-
if (match) {
|
|
107
|
-
const name = match[1] || match[2];
|
|
108
|
-
if (name) {
|
|
109
|
-
symbols.push({
|
|
110
|
-
name,
|
|
111
|
-
type: 'import',
|
|
112
|
-
filePath: path.relative(basePath, filePath),
|
|
113
|
-
line: lineNumber,
|
|
114
|
-
column: line.indexOf(name) + 1,
|
|
115
|
-
signature: line.trim(),
|
|
116
|
-
language,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Extract exports
|
|
122
|
-
if (config.symbolPatterns.export) {
|
|
123
|
-
const match = line.match(config.symbolPatterns.export);
|
|
124
|
-
if (match) {
|
|
125
|
-
const name = match[1];
|
|
126
|
-
if (name) {
|
|
127
|
-
symbols.push({
|
|
128
|
-
name,
|
|
129
|
-
type: 'export',
|
|
130
|
-
filePath: path.relative(basePath, filePath),
|
|
131
|
-
line: lineNumber,
|
|
132
|
-
column: line.indexOf(name) + 1,
|
|
133
|
-
signature: line.trim(),
|
|
134
|
-
language,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return symbols;
|
|
141
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security utilities for terminal command execution
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Dangerous command patterns that should be blocked
|
|
6
|
-
*/
|
|
7
|
-
export declare const DANGEROUS_PATTERNS: RegExp[];
|
|
8
|
-
/**
|
|
9
|
-
* Check if a command contains dangerous patterns
|
|
10
|
-
* @param command - Command to check
|
|
11
|
-
* @returns true if command is dangerous
|
|
12
|
-
*/
|
|
13
|
-
export declare function isDangerousCommand(command: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Truncate output if it exceeds maximum length
|
|
16
|
-
* @param output - Output string to truncate
|
|
17
|
-
* @param maxLength - Maximum allowed length
|
|
18
|
-
* @returns Truncated output with indicator if truncated
|
|
19
|
-
*/
|
|
20
|
-
export declare function truncateOutput(output: string, maxLength: number): string;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security utilities for terminal command execution
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Dangerous command patterns that should be blocked
|
|
6
|
-
*/
|
|
7
|
-
export const DANGEROUS_PATTERNS = [
|
|
8
|
-
/rm\s+-rf\s+\/[^/\s]*/i, // rm -rf / or /path
|
|
9
|
-
/>\s*\/dev\/sda/i, // writing to disk devices
|
|
10
|
-
/mkfs/i, // format filesystem
|
|
11
|
-
/dd\s+if=/i, // disk operations
|
|
12
|
-
];
|
|
13
|
-
/**
|
|
14
|
-
* Check if a command contains dangerous patterns
|
|
15
|
-
* @param command - Command to check
|
|
16
|
-
* @returns true if command is dangerous
|
|
17
|
-
*/
|
|
18
|
-
export function isDangerousCommand(command) {
|
|
19
|
-
return DANGEROUS_PATTERNS.some(pattern => pattern.test(command));
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Truncate output if it exceeds maximum length
|
|
23
|
-
* @param output - Output string to truncate
|
|
24
|
-
* @param maxLength - Maximum allowed length
|
|
25
|
-
* @returns Truncated output with indicator if truncated
|
|
26
|
-
*/
|
|
27
|
-
export function truncateOutput(output, maxLength) {
|
|
28
|
-
if (!output)
|
|
29
|
-
return '';
|
|
30
|
-
if (output.length > maxLength) {
|
|
31
|
-
return output.slice(0, maxLength) + '\n... (output truncated)';
|
|
32
|
-
}
|
|
33
|
-
return output;
|
|
34
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Batch operation utilities for filesystem operations
|
|
3
|
-
*/
|
|
4
|
-
import type { BatchOperationResult, BatchResultItem, EditBySearchConfig, EditByLineConfig } from '../../types/filesystem.types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Parse file path parameter into array format
|
|
7
|
-
* Supports: string, string[], or array of config objects
|
|
8
|
-
*/
|
|
9
|
-
export declare function parseFilePathParameter<T extends {
|
|
10
|
-
path: string;
|
|
11
|
-
}>(filePath: string | string[] | T[]): Array<string | T>;
|
|
12
|
-
/**
|
|
13
|
-
* Extract file path from file item (string or object)
|
|
14
|
-
*/
|
|
15
|
-
export declare function extractFilePath<T extends {
|
|
16
|
-
path: string;
|
|
17
|
-
}>(fileItem: string | T): string;
|
|
18
|
-
/**
|
|
19
|
-
* Parse edit by search parameters
|
|
20
|
-
*/
|
|
21
|
-
export declare function parseEditBySearchParams(fileItem: string | EditBySearchConfig, globalSearchContent?: string, globalReplaceContent?: string, globalOccurrence?: number): {
|
|
22
|
-
path: string;
|
|
23
|
-
searchContent: string;
|
|
24
|
-
replaceContent: string;
|
|
25
|
-
occurrence: number;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Parse edit by line parameters
|
|
29
|
-
*/
|
|
30
|
-
export declare function parseEditByLineParams(fileItem: string | EditByLineConfig, globalStartLine?: number, globalEndLine?: number, globalNewContent?: string): {
|
|
31
|
-
path: string;
|
|
32
|
-
startLine: number;
|
|
33
|
-
endLine: number;
|
|
34
|
-
newContent: string;
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Execute batch operation with error handling
|
|
38
|
-
*/
|
|
39
|
-
export declare function executeBatchOperation<TConfig, TSingleResult, TBatchItem extends BatchResultItem>(fileItems: Array<string | TConfig>, parseParams: (fileItem: string | TConfig) => any, executeSingle: (...params: any[]) => Promise<TSingleResult>, mapResult: (path: string, result: TSingleResult) => Omit<TBatchItem, 'success' | 'error'>): Promise<BatchOperationResult<TBatchItem>>;
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Batch operation utilities for filesystem operations
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Parse file path parameter into array format
|
|
6
|
-
* Supports: string, string[], or array of config objects
|
|
7
|
-
*/
|
|
8
|
-
export function parseFilePathParameter(filePath) {
|
|
9
|
-
if (Array.isArray(filePath)) {
|
|
10
|
-
return filePath;
|
|
11
|
-
}
|
|
12
|
-
return [filePath];
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Extract file path from file item (string or object)
|
|
16
|
-
*/
|
|
17
|
-
export function extractFilePath(fileItem) {
|
|
18
|
-
return typeof fileItem === 'string' ? fileItem : fileItem.path;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Parse edit by search parameters
|
|
22
|
-
*/
|
|
23
|
-
export function parseEditBySearchParams(fileItem, globalSearchContent, globalReplaceContent, globalOccurrence) {
|
|
24
|
-
if (typeof fileItem === 'string') {
|
|
25
|
-
if (!globalSearchContent || !globalReplaceContent) {
|
|
26
|
-
throw new Error('searchContent and replaceContent are required for string array format');
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
29
|
-
path: fileItem,
|
|
30
|
-
searchContent: globalSearchContent,
|
|
31
|
-
replaceContent: globalReplaceContent,
|
|
32
|
-
occurrence: globalOccurrence ?? 1,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
return {
|
|
36
|
-
path: fileItem.path,
|
|
37
|
-
searchContent: fileItem.searchContent,
|
|
38
|
-
replaceContent: fileItem.replaceContent,
|
|
39
|
-
occurrence: fileItem.occurrence ?? globalOccurrence ?? 1,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Parse edit by line parameters
|
|
44
|
-
*/
|
|
45
|
-
export function parseEditByLineParams(fileItem, globalStartLine, globalEndLine, globalNewContent) {
|
|
46
|
-
if (typeof fileItem === 'string') {
|
|
47
|
-
if (globalStartLine === undefined ||
|
|
48
|
-
globalEndLine === undefined ||
|
|
49
|
-
globalNewContent === undefined) {
|
|
50
|
-
throw new Error('startLine, endLine, and newContent are required for string array format');
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
path: fileItem,
|
|
54
|
-
startLine: globalStartLine,
|
|
55
|
-
endLine: globalEndLine,
|
|
56
|
-
newContent: globalNewContent,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
path: fileItem.path,
|
|
61
|
-
startLine: fileItem.startLine,
|
|
62
|
-
endLine: fileItem.endLine,
|
|
63
|
-
newContent: fileItem.newContent,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Execute batch operation with error handling
|
|
68
|
-
*/
|
|
69
|
-
export async function executeBatchOperation(fileItems, parseParams, executeSingle, mapResult) {
|
|
70
|
-
const results = [];
|
|
71
|
-
for (const fileItem of fileItems) {
|
|
72
|
-
try {
|
|
73
|
-
const params = parseParams(fileItem);
|
|
74
|
-
const result = await executeSingle(...Object.values(params));
|
|
75
|
-
results.push({
|
|
76
|
-
success: true,
|
|
77
|
-
...mapResult(params.path, result),
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
const filePath = typeof fileItem === 'string'
|
|
82
|
-
? fileItem
|
|
83
|
-
: fileItem.path;
|
|
84
|
-
results.push({
|
|
85
|
-
path: filePath,
|
|
86
|
-
success: false,
|
|
87
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const successCount = results.filter(r => r.success).length;
|
|
92
|
-
const failureCount = results.filter(r => !r.success).length;
|
|
93
|
-
// Build detailed message with all file diffs
|
|
94
|
-
let detailedMessage = `📊 Batch Edit Summary: ${successCount} succeeded, ${failureCount} failed\n\n`;
|
|
95
|
-
results.forEach((result, index) => {
|
|
96
|
-
const num = index + 1;
|
|
97
|
-
const separator = '─'.repeat(80);
|
|
98
|
-
if (result.success) {
|
|
99
|
-
detailedMessage += `${separator}\n`;
|
|
100
|
-
detailedMessage += `✅ File ${num}/${results.length}: ${result.path}\n`;
|
|
101
|
-
detailedMessage += `${separator}\n\n`;
|
|
102
|
-
// Add individual file full result (including oldContent and newContent for diff)
|
|
103
|
-
const fileResult = result;
|
|
104
|
-
// Extract key metadata from message if available
|
|
105
|
-
if (fileResult.message) {
|
|
106
|
-
const lines = fileResult.message.split('\n');
|
|
107
|
-
const metadataLines = lines.filter((l) => l.trim().startsWith('Matched:') ||
|
|
108
|
-
l.trim().startsWith('Replaced:') ||
|
|
109
|
-
l.trim().startsWith('Result:') ||
|
|
110
|
-
l.trim().startsWith('📍'));
|
|
111
|
-
if (metadataLines.length > 0) {
|
|
112
|
-
metadataLines.forEach((line) => {
|
|
113
|
-
detailedMessage += `${line}\n`;
|
|
114
|
-
});
|
|
115
|
-
detailedMessage += '\n';
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// Add diff display - keep oldContent and newContent in results for UI rendering
|
|
119
|
-
// Don't format as text here, let the UI handle it with DiffViewer
|
|
120
|
-
if (fileResult.oldContent && fileResult.newContent) {
|
|
121
|
-
// Just add a placeholder message, actual diff will be rendered by UI
|
|
122
|
-
detailedMessage += `📊 Changes (lines ${fileResult.contextStartLine ?? '?'}-${fileResult.contextEndLine ?? '?'})\n\n`;
|
|
123
|
-
}
|
|
124
|
-
// Add structure analysis warnings if any
|
|
125
|
-
if (fileResult.structureAnalysis) {
|
|
126
|
-
const warnings = [];
|
|
127
|
-
const sa = fileResult.structureAnalysis;
|
|
128
|
-
if (!sa.bracketBalance?.curly?.balanced) {
|
|
129
|
-
const diff = (sa.bracketBalance.curly.open || 0) -
|
|
130
|
-
(sa.bracketBalance.curly.close || 0);
|
|
131
|
-
warnings.push(`Curly brackets: ${diff > 0 ? `${diff} unclosed {` : `${Math.abs(diff)} extra }`}`);
|
|
132
|
-
}
|
|
133
|
-
if (!sa.bracketBalance?.round?.balanced) {
|
|
134
|
-
const diff = (sa.bracketBalance.round.open || 0) -
|
|
135
|
-
(sa.bracketBalance.round.close || 0);
|
|
136
|
-
warnings.push(`Round brackets: ${diff > 0 ? `${diff} unclosed (` : `${Math.abs(diff)} extra )`}`);
|
|
137
|
-
}
|
|
138
|
-
if (!sa.bracketBalance?.square?.balanced) {
|
|
139
|
-
const diff = (sa.bracketBalance.square.open || 0) -
|
|
140
|
-
(sa.bracketBalance.square.close || 0);
|
|
141
|
-
warnings.push(`Square brackets: ${diff > 0 ? `${diff} unclosed [` : `${Math.abs(diff)} extra ]`}`);
|
|
142
|
-
}
|
|
143
|
-
if (warnings.length > 0) {
|
|
144
|
-
detailedMessage += `⚠️ Structure Warnings:\n`;
|
|
145
|
-
warnings.forEach((w) => {
|
|
146
|
-
detailedMessage += ` • ${w}\n`;
|
|
147
|
-
});
|
|
148
|
-
detailedMessage += '\n';
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// Add diagnostics if any
|
|
152
|
-
if (fileResult.diagnostics && fileResult.diagnostics.length > 0) {
|
|
153
|
-
const errorCount = fileResult.diagnostics.filter((d) => d.severity === 'error').length;
|
|
154
|
-
const warningCount = fileResult.diagnostics.filter((d) => d.severity === 'warning').length;
|
|
155
|
-
if (errorCount > 0 || warningCount > 0) {
|
|
156
|
-
detailedMessage += `🔧 Diagnostics: ${errorCount} error(s), ${warningCount} warning(s)\n`;
|
|
157
|
-
fileResult.diagnostics.slice(0, 3).forEach((d) => {
|
|
158
|
-
const icon = d.severity === 'error' ? '❌' : '⚠️';
|
|
159
|
-
detailedMessage += ` ${icon} Line ${d.line}: ${d.message}\n`;
|
|
160
|
-
});
|
|
161
|
-
if (fileResult.diagnostics.length > 3) {
|
|
162
|
-
detailedMessage += ` ... and ${fileResult.diagnostics.length - 3} more\n`;
|
|
163
|
-
}
|
|
164
|
-
detailedMessage += '\n';
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
detailedMessage += `${separator}\n`;
|
|
170
|
-
detailedMessage += `❌ File ${num}/${results.length}: ${result.path}\n`;
|
|
171
|
-
detailedMessage += `${separator}\n`;
|
|
172
|
-
detailedMessage += `Error: ${result.error}\n\n`;
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
return {
|
|
176
|
-
message: detailedMessage.trim(),
|
|
177
|
-
results,
|
|
178
|
-
totalFiles: fileItems.length,
|
|
179
|
-
successCount,
|
|
180
|
-
failureCount,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code analysis utilities for structure validation
|
|
3
|
-
*/
|
|
4
|
-
import type { StructureAnalysis } from '../../types/filesystem.types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Analyze code structure for balance and completeness
|
|
7
|
-
* Helps AI identify bracket mismatches, unclosed tags, and boundary issues
|
|
8
|
-
*/
|
|
9
|
-
export declare function analyzeCodeStructure(_content: string, filePath: string, editedLines: string[]): StructureAnalysis;
|
|
10
|
-
/**
|
|
11
|
-
* Find smart context boundaries for editing
|
|
12
|
-
* Expands context to include complete code blocks when possible
|
|
13
|
-
*/
|
|
14
|
-
export declare function findSmartContextBoundaries(lines: string[], startLine: number, endLine: number, requestedContext: number): {
|
|
15
|
-
start: number;
|
|
16
|
-
end: number;
|
|
17
|
-
extended: boolean;
|
|
18
|
-
};
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code analysis utilities for structure validation
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Analyze code structure for balance and completeness
|
|
6
|
-
* Helps AI identify bracket mismatches, unclosed tags, and boundary issues
|
|
7
|
-
*/
|
|
8
|
-
export function analyzeCodeStructure(_content, filePath, editedLines) {
|
|
9
|
-
const analysis = {
|
|
10
|
-
bracketBalance: {
|
|
11
|
-
curly: { open: 0, close: 0, balanced: true },
|
|
12
|
-
round: { open: 0, close: 0, balanced: true },
|
|
13
|
-
square: { open: 0, close: 0, balanced: true },
|
|
14
|
-
},
|
|
15
|
-
indentationWarnings: [],
|
|
16
|
-
};
|
|
17
|
-
// Count brackets in the edited content
|
|
18
|
-
const editedContent = editedLines.join('\n');
|
|
19
|
-
// Remove string literals and comments to avoid false positives
|
|
20
|
-
const cleanContent = editedContent
|
|
21
|
-
.replace(/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`/g, '""') // Remove strings
|
|
22
|
-
.replace(/\/\/.*$/gm, '') // Remove single-line comments
|
|
23
|
-
.replace(/\/\*[\s\S]*?\*\//g, ''); // Remove multi-line comments
|
|
24
|
-
// Count brackets
|
|
25
|
-
analysis.bracketBalance.curly.open = (cleanContent.match(/\{/g) || []).length;
|
|
26
|
-
analysis.bracketBalance.curly.close = (cleanContent.match(/\}/g) || []).length;
|
|
27
|
-
analysis.bracketBalance.curly.balanced =
|
|
28
|
-
analysis.bracketBalance.curly.open === analysis.bracketBalance.curly.close;
|
|
29
|
-
analysis.bracketBalance.round.open = (cleanContent.match(/\(/g) || []).length;
|
|
30
|
-
analysis.bracketBalance.round.close = (cleanContent.match(/\)/g) || []).length;
|
|
31
|
-
analysis.bracketBalance.round.balanced =
|
|
32
|
-
analysis.bracketBalance.round.open === analysis.bracketBalance.round.close;
|
|
33
|
-
analysis.bracketBalance.square.open = (cleanContent.match(/\[/g) || []).length;
|
|
34
|
-
analysis.bracketBalance.square.close = (cleanContent.match(/\]/g) || []).length;
|
|
35
|
-
analysis.bracketBalance.square.balanced =
|
|
36
|
-
analysis.bracketBalance.square.open ===
|
|
37
|
-
analysis.bracketBalance.square.close;
|
|
38
|
-
// HTML/JSX tag analysis (for .html, .jsx, .tsx, .vue files)
|
|
39
|
-
const isMarkupFile = /\.(html|jsx|tsx|vue)$/i.test(filePath);
|
|
40
|
-
if (isMarkupFile) {
|
|
41
|
-
const tagPattern = /<\/?([a-zA-Z][a-zA-Z0-9-]*)[^>]*>/g;
|
|
42
|
-
const selfClosingPattern = /<[a-zA-Z][a-zA-Z0-9-]*[^>]*\/>/g;
|
|
43
|
-
// Remove self-closing tags
|
|
44
|
-
const contentWithoutSelfClosing = cleanContent.replace(selfClosingPattern, '');
|
|
45
|
-
const tags = [];
|
|
46
|
-
const unclosedTags = [];
|
|
47
|
-
const unopenedTags = [];
|
|
48
|
-
let match;
|
|
49
|
-
while ((match = tagPattern.exec(contentWithoutSelfClosing)) !== null) {
|
|
50
|
-
const isClosing = match[0]?.startsWith('</');
|
|
51
|
-
const tagName = match[1]?.toLowerCase();
|
|
52
|
-
if (!tagName)
|
|
53
|
-
continue;
|
|
54
|
-
if (isClosing) {
|
|
55
|
-
const lastOpenTag = tags.pop();
|
|
56
|
-
if (!lastOpenTag || lastOpenTag !== tagName) {
|
|
57
|
-
unopenedTags.push(tagName);
|
|
58
|
-
if (lastOpenTag)
|
|
59
|
-
tags.push(lastOpenTag); // Put it back
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
tags.push(tagName);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
unclosedTags.push(...tags);
|
|
67
|
-
analysis.htmlTags = {
|
|
68
|
-
unclosedTags,
|
|
69
|
-
unopenedTags,
|
|
70
|
-
balanced: unclosedTags.length === 0 && unopenedTags.length === 0,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
// Check indentation consistency
|
|
74
|
-
const lines = editedContent.split('\n');
|
|
75
|
-
const indents = lines
|
|
76
|
-
.filter(line => line.trim().length > 0)
|
|
77
|
-
.map(line => {
|
|
78
|
-
const match = line.match(/^(\s*)/);
|
|
79
|
-
return match ? match[1] : '';
|
|
80
|
-
})
|
|
81
|
-
.filter((indent) => indent !== undefined);
|
|
82
|
-
// Detect mixed tabs/spaces
|
|
83
|
-
const hasTabs = indents.some(indent => indent.includes('\t'));
|
|
84
|
-
const hasSpaces = indents.some(indent => indent.includes(' '));
|
|
85
|
-
if (hasTabs && hasSpaces) {
|
|
86
|
-
analysis.indentationWarnings.push('Mixed tabs and spaces detected');
|
|
87
|
-
}
|
|
88
|
-
// Detect inconsistent indentation levels (spaces only)
|
|
89
|
-
if (!hasTabs && hasSpaces) {
|
|
90
|
-
const spaceCounts = indents
|
|
91
|
-
.filter(indent => indent.length > 0)
|
|
92
|
-
.map(indent => indent.length);
|
|
93
|
-
if (spaceCounts.length > 1) {
|
|
94
|
-
const gcd = spaceCounts.reduce((a, b) => {
|
|
95
|
-
while (b !== 0) {
|
|
96
|
-
const temp = b;
|
|
97
|
-
b = a % b;
|
|
98
|
-
a = temp;
|
|
99
|
-
}
|
|
100
|
-
return a;
|
|
101
|
-
});
|
|
102
|
-
const hasInconsistent = spaceCounts.some(count => count % gcd !== 0 && gcd > 1);
|
|
103
|
-
if (hasInconsistent) {
|
|
104
|
-
analysis.indentationWarnings.push(`Inconsistent indentation (expected multiples of ${gcd} spaces)`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// Note: Boundary checking removed - AI should be free to edit partial code blocks
|
|
109
|
-
// The bracket balance check above is sufficient for detecting real issues
|
|
110
|
-
return analysis;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Find smart context boundaries for editing
|
|
114
|
-
* Expands context to include complete code blocks when possible
|
|
115
|
-
*/
|
|
116
|
-
export function findSmartContextBoundaries(lines, startLine, endLine, requestedContext) {
|
|
117
|
-
const totalLines = lines.length;
|
|
118
|
-
let contextStart = Math.max(1, startLine - requestedContext);
|
|
119
|
-
let contextEnd = Math.min(totalLines, endLine + requestedContext);
|
|
120
|
-
let extended = false;
|
|
121
|
-
// Try to find the start of the enclosing block
|
|
122
|
-
let bracketDepth = 0;
|
|
123
|
-
for (let i = startLine - 1; i >= Math.max(0, startLine - 50); i--) {
|
|
124
|
-
const line = lines[i];
|
|
125
|
-
if (!line)
|
|
126
|
-
continue;
|
|
127
|
-
const trimmed = line.trim();
|
|
128
|
-
// Count brackets (simple approach)
|
|
129
|
-
const openBrackets = (line.match(/\{/g) || []).length;
|
|
130
|
-
const closeBrackets = (line.match(/\}/g) || []).length;
|
|
131
|
-
bracketDepth += closeBrackets - openBrackets;
|
|
132
|
-
// If we find a function/class/block definition with balanced brackets
|
|
133
|
-
if (bracketDepth === 0 &&
|
|
134
|
-
(trimmed.match(/^(function|class|const|let|var|if|for|while|async|export)\s/i) ||
|
|
135
|
-
trimmed.match(/=>\s*\{/) ||
|
|
136
|
-
trimmed.match(/^\w+\s*\(/))) {
|
|
137
|
-
if (i + 1 < contextStart) {
|
|
138
|
-
contextStart = i + 1;
|
|
139
|
-
extended = true;
|
|
140
|
-
}
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// Try to find the end of the enclosing block
|
|
145
|
-
bracketDepth = 0;
|
|
146
|
-
for (let i = endLine - 1; i < Math.min(totalLines, endLine + 50); i++) {
|
|
147
|
-
const line = lines[i];
|
|
148
|
-
if (!line)
|
|
149
|
-
continue;
|
|
150
|
-
const trimmed = line.trim();
|
|
151
|
-
// Count brackets
|
|
152
|
-
const openBrackets = (line.match(/\{/g) || []).length;
|
|
153
|
-
const closeBrackets = (line.match(/\}/g) || []).length;
|
|
154
|
-
bracketDepth += openBrackets - closeBrackets;
|
|
155
|
-
// If we find a closing bracket at depth 0
|
|
156
|
-
if (bracketDepth === 0 && trimmed.startsWith('}')) {
|
|
157
|
-
if (i + 1 > contextEnd) {
|
|
158
|
-
contextEnd = i + 1;
|
|
159
|
-
extended = true;
|
|
160
|
-
}
|
|
161
|
-
break;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return { start: contextStart, end: contextEnd, extended };
|
|
165
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Match finding utilities for fuzzy search
|
|
3
|
-
*/
|
|
4
|
-
import type { MatchCandidate } from '../../types/filesystem.types.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 declare function findClosestMatches(searchContent: string, fileLines: string[], topN?: number): Promise<MatchCandidate[]>;
|
|
12
|
-
/**
|
|
13
|
-
* Generate a helpful diff message showing differences between search and actual content
|
|
14
|
-
* Note: This is ONLY for display purposes. Tabs/spaces are normalized for better readability.
|
|
15
|
-
*/
|
|
16
|
-
export declare function generateDiffMessage(searchContent: string, actualContent: string, maxLines?: number): string;
|