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,301 +0,0 @@
|
|
|
1
|
-
import { getOpenAiConfig } from '../utils/apiConfig.js';
|
|
2
|
-
import { logger } from '../utils/logger.js';
|
|
3
|
-
import { createStreamingChatCompletion } from '../api/chat.js';
|
|
4
|
-
import { createStreamingResponse } from '../api/responses.js';
|
|
5
|
-
import { createStreamingGeminiCompletion } from '../api/gemini.js';
|
|
6
|
-
import { createStreamingAnthropicCompletion } from '../api/anthropic.js';
|
|
7
|
-
/**
|
|
8
|
-
* Codebase Review Agent Service
|
|
9
|
-
*
|
|
10
|
-
* Reviews codebase search results to filter out irrelevant items.
|
|
11
|
-
* Uses basicModel for efficient, low-cost relevance checking.
|
|
12
|
-
* Can also suggest better search keywords if results are not relevant.
|
|
13
|
-
*/
|
|
14
|
-
export class CodebaseReviewAgent {
|
|
15
|
-
constructor() {
|
|
16
|
-
Object.defineProperty(this, "modelName", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
configurable: true,
|
|
19
|
-
writable: true,
|
|
20
|
-
value: ''
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(this, "requestMethod", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
configurable: true,
|
|
25
|
-
writable: true,
|
|
26
|
-
value: 'chat'
|
|
27
|
-
});
|
|
28
|
-
Object.defineProperty(this, "initialized", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
configurable: true,
|
|
31
|
-
writable: true,
|
|
32
|
-
value: false
|
|
33
|
-
});
|
|
34
|
-
Object.defineProperty(this, "MAX_RETRIES", {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
configurable: true,
|
|
37
|
-
writable: true,
|
|
38
|
-
value: 3
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Initialize the review agent with current configuration
|
|
43
|
-
*/
|
|
44
|
-
async initialize() {
|
|
45
|
-
try {
|
|
46
|
-
const config = getOpenAiConfig();
|
|
47
|
-
if (!config.basicModel) {
|
|
48
|
-
logger.warn('Codebase review agent: Basic model not configured, using advanced model as fallback');
|
|
49
|
-
if (!config.advancedModel) {
|
|
50
|
-
logger.warn('Codebase review agent: No model configured');
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
this.modelName = config.advancedModel;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
this.modelName = config.basicModel;
|
|
57
|
-
}
|
|
58
|
-
this.requestMethod = config.requestMethod;
|
|
59
|
-
this.initialized = true;
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
logger.warn('Codebase review agent: Failed to initialize:', error);
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Check if review agent is available
|
|
69
|
-
*/
|
|
70
|
-
async isAvailable() {
|
|
71
|
-
if (!this.initialized) {
|
|
72
|
-
return await this.initialize();
|
|
73
|
-
}
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Call the model with streaming API and assemble complete response
|
|
78
|
-
*/
|
|
79
|
-
async callModel(messages, abortSignal) {
|
|
80
|
-
let streamGenerator;
|
|
81
|
-
switch (this.requestMethod) {
|
|
82
|
-
case 'anthropic':
|
|
83
|
-
streamGenerator = createStreamingAnthropicCompletion({
|
|
84
|
-
model: this.modelName,
|
|
85
|
-
messages,
|
|
86
|
-
includeBuiltinSystemPrompt: false,
|
|
87
|
-
disableThinking: true,
|
|
88
|
-
}, abortSignal);
|
|
89
|
-
break;
|
|
90
|
-
case 'gemini':
|
|
91
|
-
streamGenerator = createStreamingGeminiCompletion({
|
|
92
|
-
model: this.modelName,
|
|
93
|
-
messages,
|
|
94
|
-
includeBuiltinSystemPrompt: false,
|
|
95
|
-
}, abortSignal);
|
|
96
|
-
break;
|
|
97
|
-
case 'responses':
|
|
98
|
-
streamGenerator = createStreamingResponse({
|
|
99
|
-
model: this.modelName,
|
|
100
|
-
messages,
|
|
101
|
-
stream: true,
|
|
102
|
-
includeBuiltinSystemPrompt: false,
|
|
103
|
-
}, abortSignal);
|
|
104
|
-
break;
|
|
105
|
-
case 'chat':
|
|
106
|
-
default:
|
|
107
|
-
streamGenerator = createStreamingChatCompletion({
|
|
108
|
-
model: this.modelName,
|
|
109
|
-
messages,
|
|
110
|
-
stream: true,
|
|
111
|
-
includeBuiltinSystemPrompt: false,
|
|
112
|
-
}, abortSignal);
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
let completeContent = '';
|
|
116
|
-
try {
|
|
117
|
-
for await (const chunk of streamGenerator) {
|
|
118
|
-
if (abortSignal?.aborted) {
|
|
119
|
-
throw new Error('Request aborted');
|
|
120
|
-
}
|
|
121
|
-
if (this.requestMethod === 'chat') {
|
|
122
|
-
if (chunk.choices && chunk.choices[0]?.delta?.content) {
|
|
123
|
-
completeContent += chunk.choices[0].delta.content;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
if (chunk.type === 'content' && chunk.content) {
|
|
128
|
-
completeContent += chunk.content;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (streamError) {
|
|
134
|
-
logger.error('Codebase review agent: Streaming error:', streamError);
|
|
135
|
-
throw streamError;
|
|
136
|
-
}
|
|
137
|
-
return completeContent;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Try to parse JSON response with retry logic
|
|
141
|
-
*/
|
|
142
|
-
tryParseJSON(response) {
|
|
143
|
-
try {
|
|
144
|
-
// Extract JSON from markdown code blocks if present
|
|
145
|
-
let jsonStr = response.trim();
|
|
146
|
-
const jsonMatch = jsonStr.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
|
|
147
|
-
if (jsonMatch) {
|
|
148
|
-
jsonStr = jsonMatch[1].trim();
|
|
149
|
-
}
|
|
150
|
-
const parsed = JSON.parse(jsonStr);
|
|
151
|
-
// Validate structure
|
|
152
|
-
if (!Array.isArray(parsed.relevantIndices)) {
|
|
153
|
-
logger.warn('Codebase review agent: Invalid JSON structure - missing relevantIndices array');
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
return parsed;
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
logger.warn('Codebase review agent: JSON parse error:', error);
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Review search results with retry mechanism
|
|
165
|
-
*/
|
|
166
|
-
async reviewWithRetry(query, results, abortSignal) {
|
|
167
|
-
const reviewPrompt = `You are a code search result reviewer. Your task is to analyze search results and determine which ones are truly relevant to the user's query.
|
|
168
|
-
|
|
169
|
-
Search Query: "${query}"
|
|
170
|
-
|
|
171
|
-
Search Results (${results.length} items):
|
|
172
|
-
${results
|
|
173
|
-
.map((r, idx) => `\n[Result ${idx + 1}]
|
|
174
|
-
File: ${r.filePath}
|
|
175
|
-
Lines: ${r.startLine}-${r.endLine}
|
|
176
|
-
Similarity Score: ${r.similarityScore}%
|
|
177
|
-
Code:
|
|
178
|
-
\`\`\`
|
|
179
|
-
${r.content}
|
|
180
|
-
\`\`\``)
|
|
181
|
-
.join('\n---')}
|
|
182
|
-
|
|
183
|
-
Your Tasks:
|
|
184
|
-
1. Identify which results are RELEVANT to the search query
|
|
185
|
-
2. Mark irrelevant results for removal
|
|
186
|
-
3. If most results are irrelevant, suggest better search keywords
|
|
187
|
-
|
|
188
|
-
Output in JSON format:
|
|
189
|
-
{
|
|
190
|
-
"relevantIndices": [1, 3, 5],
|
|
191
|
-
"removedIndices": [2, 4],
|
|
192
|
-
"suggestions": ["keyword1", "keyword2"]
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
Guidelines:
|
|
196
|
-
- Be strict but fair: code doesn't need to match exactly, but should be semantically related
|
|
197
|
-
- Consider file paths, code content, and context
|
|
198
|
-
- If a result is marginally relevant, keep it
|
|
199
|
-
- Only suggest new keywords if >50% of results are irrelevant
|
|
200
|
-
- Return ONLY valid JSON, no other text or explanation`;
|
|
201
|
-
const messages = [
|
|
202
|
-
{
|
|
203
|
-
role: 'user',
|
|
204
|
-
content: reviewPrompt,
|
|
205
|
-
},
|
|
206
|
-
];
|
|
207
|
-
// Retry loop
|
|
208
|
-
for (let attempt = 1; attempt <= this.MAX_RETRIES; attempt++) {
|
|
209
|
-
try {
|
|
210
|
-
logger.info(`Codebase review agent: Attempt ${attempt}/${this.MAX_RETRIES}`);
|
|
211
|
-
const response = await this.callModel(messages, abortSignal);
|
|
212
|
-
if (!response || response.trim().length === 0) {
|
|
213
|
-
logger.warn(`Codebase review agent: Empty response on attempt ${attempt}`);
|
|
214
|
-
if (attempt < this.MAX_RETRIES) {
|
|
215
|
-
await this.sleep(500 * attempt); // Exponential backoff
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
// Try to parse JSON
|
|
221
|
-
const parsed = this.tryParseJSON(response);
|
|
222
|
-
if (parsed) {
|
|
223
|
-
logger.info(`Codebase review agent: Successfully parsed on attempt ${attempt}`);
|
|
224
|
-
return { parsed, attempt };
|
|
225
|
-
}
|
|
226
|
-
// If parse failed and we have retries left
|
|
227
|
-
if (attempt < this.MAX_RETRIES) {
|
|
228
|
-
logger.warn(`Codebase review agent: Parse failed on attempt ${attempt}, retrying...`);
|
|
229
|
-
await this.sleep(500 * attempt); // Exponential backoff
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
logger.error(`Codebase review agent: Error on attempt ${attempt}:`, error);
|
|
236
|
-
if (attempt < this.MAX_RETRIES) {
|
|
237
|
-
await this.sleep(500 * attempt); // Exponential backoff
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
return null;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Sleep utility for retry backoff
|
|
247
|
-
*/
|
|
248
|
-
sleep(ms) {
|
|
249
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Review search results and filter out irrelevant ones
|
|
253
|
-
* With retry mechanism and graceful degradation
|
|
254
|
-
*
|
|
255
|
-
* @param query - Original search query
|
|
256
|
-
* @param results - Search results to review
|
|
257
|
-
* @param abortSignal - Optional abort signal
|
|
258
|
-
* @returns Object with filtered results and optional suggestions
|
|
259
|
-
*/
|
|
260
|
-
async reviewResults(query, results, abortSignal) {
|
|
261
|
-
const available = await this.isAvailable();
|
|
262
|
-
if (!available) {
|
|
263
|
-
logger.warn('Codebase review agent: Not available, returning original results');
|
|
264
|
-
return {
|
|
265
|
-
filteredResults: results,
|
|
266
|
-
removedCount: 0,
|
|
267
|
-
reviewFailed: true,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
// Attempt review with retry
|
|
271
|
-
const reviewResult = await this.reviewWithRetry(query, results, abortSignal);
|
|
272
|
-
// If all retries failed, gracefully degrade
|
|
273
|
-
if (!reviewResult) {
|
|
274
|
-
logger.warn('Codebase review agent: All retry attempts failed, returning original results');
|
|
275
|
-
return {
|
|
276
|
-
filteredResults: results,
|
|
277
|
-
removedCount: 0,
|
|
278
|
-
reviewFailed: true,
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
// Success - filter results
|
|
282
|
-
const { parsed, attempt } = reviewResult;
|
|
283
|
-
const filteredResults = results.filter((_, idx) => parsed.relevantIndices.includes(idx + 1));
|
|
284
|
-
const removedCount = results.length - filteredResults.length;
|
|
285
|
-
logger.info('Codebase review agent: Review completed', {
|
|
286
|
-
originalCount: results.length,
|
|
287
|
-
filteredCount: filteredResults.length,
|
|
288
|
-
removedCount,
|
|
289
|
-
attempts: attempt,
|
|
290
|
-
hasSuggestions: !!parsed.suggestions?.length,
|
|
291
|
-
});
|
|
292
|
-
return {
|
|
293
|
-
filteredResults,
|
|
294
|
-
removedCount,
|
|
295
|
-
suggestions: parsed.suggestions || undefined,
|
|
296
|
-
reviewFailed: false,
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
// Export singleton instance
|
|
301
|
-
export const codebaseReviewAgent = new CodebaseReviewAgent();
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compact Agent Service
|
|
3
|
-
*
|
|
4
|
-
* Provides lightweight AI agent capabilities using the basic model.
|
|
5
|
-
* This service operates independently from the main conversation flow
|
|
6
|
-
* but follows the EXACT same configuration and routing as the main flow:
|
|
7
|
-
* - API endpoint (baseUrl)
|
|
8
|
-
* - Authentication (apiKey)
|
|
9
|
-
* - Custom headers
|
|
10
|
-
* - Request method (chat, responses, gemini, anthropic)
|
|
11
|
-
* - Uses basicModel instead of advancedModel
|
|
12
|
-
*
|
|
13
|
-
* All requests go through streaming APIs and are intercepted to assemble
|
|
14
|
-
* the complete response, ensuring complete consistency with main flow.
|
|
15
|
-
*
|
|
16
|
-
* Use cases:
|
|
17
|
-
* - Content preprocessing for web pages
|
|
18
|
-
* - Information extraction from large documents
|
|
19
|
-
* - Quick analysis tasks that don't require the main model
|
|
20
|
-
*/
|
|
21
|
-
export declare class CompactAgent {
|
|
22
|
-
private modelName;
|
|
23
|
-
private requestMethod;
|
|
24
|
-
private initialized;
|
|
25
|
-
/**
|
|
26
|
-
* Initialize the compact agent with current configuration
|
|
27
|
-
* @returns true if initialized successfully, false otherwise
|
|
28
|
-
*/
|
|
29
|
-
private initialize;
|
|
30
|
-
/**
|
|
31
|
-
* Check if compact agent is available
|
|
32
|
-
*/
|
|
33
|
-
isAvailable(): Promise<boolean>;
|
|
34
|
-
/**
|
|
35
|
-
* Call the compact model with the same routing as main flow
|
|
36
|
-
* Uses streaming APIs and intercepts to assemble complete response
|
|
37
|
-
* This ensures 100% consistency with main flow routing
|
|
38
|
-
* @param messages - Chat messages
|
|
39
|
-
* @param abortSignal - Optional abort signal to cancel the request
|
|
40
|
-
* @param onTokenUpdate - Optional callback to update token count during streaming
|
|
41
|
-
*/
|
|
42
|
-
private callCompactModel;
|
|
43
|
-
/**
|
|
44
|
-
* Extract key information from web page content based on user query
|
|
45
|
-
*
|
|
46
|
-
* @param content - Full web page content
|
|
47
|
-
* @param userQuery - User's original question/query
|
|
48
|
-
* @param url - URL of the web page (for context)
|
|
49
|
-
* @param abortSignal - Optional abort signal to cancel extraction
|
|
50
|
-
* @param onTokenUpdate - Optional callback to update token count during streaming
|
|
51
|
-
* @returns Extracted key information relevant to the query
|
|
52
|
-
*/
|
|
53
|
-
extractWebPageContent(content: string, userQuery: string, url: string, abortSignal?: AbortSignal, onTokenUpdate?: (tokenCount: number) => void): Promise<string>;
|
|
54
|
-
}
|
|
55
|
-
export declare const compactAgent: CompactAgent;
|
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
import { getOpenAiConfig } from '../utils/apiConfig.js';
|
|
2
|
-
import { logger } from '../utils/logger.js';
|
|
3
|
-
import { createStreamingChatCompletion } from '../api/chat.js';
|
|
4
|
-
import { createStreamingResponse } from '../api/responses.js';
|
|
5
|
-
import { createStreamingGeminiCompletion } from '../api/gemini.js';
|
|
6
|
-
import { createStreamingAnthropicCompletion } from '../api/anthropic.js';
|
|
7
|
-
/**
|
|
8
|
-
* Compact Agent Service
|
|
9
|
-
*
|
|
10
|
-
* Provides lightweight AI agent capabilities using the basic model.
|
|
11
|
-
* This service operates independently from the main conversation flow
|
|
12
|
-
* but follows the EXACT same configuration and routing as the main flow:
|
|
13
|
-
* - API endpoint (baseUrl)
|
|
14
|
-
* - Authentication (apiKey)
|
|
15
|
-
* - Custom headers
|
|
16
|
-
* - Request method (chat, responses, gemini, anthropic)
|
|
17
|
-
* - Uses basicModel instead of advancedModel
|
|
18
|
-
*
|
|
19
|
-
* All requests go through streaming APIs and are intercepted to assemble
|
|
20
|
-
* the complete response, ensuring complete consistency with main flow.
|
|
21
|
-
*
|
|
22
|
-
* Use cases:
|
|
23
|
-
* - Content preprocessing for web pages
|
|
24
|
-
* - Information extraction from large documents
|
|
25
|
-
* - Quick analysis tasks that don't require the main model
|
|
26
|
-
*/
|
|
27
|
-
export class CompactAgent {
|
|
28
|
-
constructor() {
|
|
29
|
-
Object.defineProperty(this, "modelName", {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
configurable: true,
|
|
32
|
-
writable: true,
|
|
33
|
-
value: ''
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(this, "requestMethod", {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
configurable: true,
|
|
38
|
-
writable: true,
|
|
39
|
-
value: 'chat'
|
|
40
|
-
});
|
|
41
|
-
Object.defineProperty(this, "initialized", {
|
|
42
|
-
enumerable: true,
|
|
43
|
-
configurable: true,
|
|
44
|
-
writable: true,
|
|
45
|
-
value: false
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Initialize the compact agent with current configuration
|
|
50
|
-
* @returns true if initialized successfully, false otherwise
|
|
51
|
-
*/
|
|
52
|
-
async initialize() {
|
|
53
|
-
try {
|
|
54
|
-
const config = getOpenAiConfig();
|
|
55
|
-
// Check if basic model is configured
|
|
56
|
-
if (!config.basicModel) {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
this.modelName = config.basicModel;
|
|
60
|
-
this.requestMethod = config.requestMethod; // Follow main flow's request method
|
|
61
|
-
this.initialized = true;
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
logger.warn('Failed to initialize compact agent:', error);
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Check if compact agent is available
|
|
71
|
-
*/
|
|
72
|
-
async isAvailable() {
|
|
73
|
-
if (!this.initialized) {
|
|
74
|
-
return await this.initialize();
|
|
75
|
-
}
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Call the compact model with the same routing as main flow
|
|
80
|
-
* Uses streaming APIs and intercepts to assemble complete response
|
|
81
|
-
* This ensures 100% consistency with main flow routing
|
|
82
|
-
* @param messages - Chat messages
|
|
83
|
-
* @param abortSignal - Optional abort signal to cancel the request
|
|
84
|
-
* @param onTokenUpdate - Optional callback to update token count during streaming
|
|
85
|
-
*/
|
|
86
|
-
async callCompactModel(messages, abortSignal, onTokenUpdate) {
|
|
87
|
-
const config = getOpenAiConfig();
|
|
88
|
-
if (!config.basicModel) {
|
|
89
|
-
throw new Error('Basic model not configured');
|
|
90
|
-
}
|
|
91
|
-
// Temporarily override advancedModel with basicModel
|
|
92
|
-
const originalAdvancedModel = config.advancedModel;
|
|
93
|
-
try {
|
|
94
|
-
// Override config to use basicModel
|
|
95
|
-
config.advancedModel = config.basicModel;
|
|
96
|
-
let streamGenerator;
|
|
97
|
-
// Route to appropriate streaming API based on request method (follows main flow exactly)
|
|
98
|
-
switch (this.requestMethod) {
|
|
99
|
-
case 'anthropic':
|
|
100
|
-
streamGenerator = createStreamingAnthropicCompletion({
|
|
101
|
-
model: this.modelName,
|
|
102
|
-
messages,
|
|
103
|
-
max_tokens: 4096,
|
|
104
|
-
includeBuiltinSystemPrompt: false, // 不需要内置系统提示词
|
|
105
|
-
disableThinking: true, // Agents 不使用 Extended Thinking
|
|
106
|
-
}, abortSignal);
|
|
107
|
-
break;
|
|
108
|
-
case 'gemini':
|
|
109
|
-
streamGenerator = createStreamingGeminiCompletion({
|
|
110
|
-
model: this.modelName,
|
|
111
|
-
messages,
|
|
112
|
-
includeBuiltinSystemPrompt: false, // 不需要内置系统提示词
|
|
113
|
-
}, abortSignal);
|
|
114
|
-
break;
|
|
115
|
-
case 'responses':
|
|
116
|
-
streamGenerator = createStreamingResponse({
|
|
117
|
-
model: this.modelName,
|
|
118
|
-
messages,
|
|
119
|
-
stream: true,
|
|
120
|
-
includeBuiltinSystemPrompt: false, // 不需要内置系统提示词
|
|
121
|
-
}, abortSignal);
|
|
122
|
-
break;
|
|
123
|
-
case 'chat':
|
|
124
|
-
default:
|
|
125
|
-
streamGenerator = createStreamingChatCompletion({
|
|
126
|
-
model: this.modelName,
|
|
127
|
-
messages,
|
|
128
|
-
stream: true,
|
|
129
|
-
includeBuiltinSystemPrompt: false, // 不需要内置系统提示词
|
|
130
|
-
}, abortSignal);
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
// Intercept streaming response and assemble complete content
|
|
134
|
-
let completeContent = '';
|
|
135
|
-
let chunkCount = 0;
|
|
136
|
-
// Initialize token encoder for token counting
|
|
137
|
-
let encoder;
|
|
138
|
-
try {
|
|
139
|
-
const { encoding_for_model } = await import('tiktoken');
|
|
140
|
-
encoder = encoding_for_model('gpt-5');
|
|
141
|
-
}
|
|
142
|
-
catch (e) {
|
|
143
|
-
const { encoding_for_model } = await import('tiktoken');
|
|
144
|
-
encoder = encoding_for_model('gpt-5');
|
|
145
|
-
}
|
|
146
|
-
try {
|
|
147
|
-
for await (const chunk of streamGenerator) {
|
|
148
|
-
chunkCount++;
|
|
149
|
-
// Check abort signal
|
|
150
|
-
if (abortSignal?.aborted) {
|
|
151
|
-
throw new Error('Request aborted');
|
|
152
|
-
}
|
|
153
|
-
// Handle different chunk formats based on request method
|
|
154
|
-
if (this.requestMethod === 'chat') {
|
|
155
|
-
// Chat API uses standard OpenAI format: {choices: [{delta: {content}}]}
|
|
156
|
-
if (chunk.choices && chunk.choices[0]?.delta?.content) {
|
|
157
|
-
completeContent += chunk.choices[0].delta.content;
|
|
158
|
-
// Update token count if callback provided
|
|
159
|
-
if (onTokenUpdate && encoder) {
|
|
160
|
-
try {
|
|
161
|
-
const tokens = encoder.encode(completeContent);
|
|
162
|
-
onTokenUpdate(tokens.length);
|
|
163
|
-
}
|
|
164
|
-
catch (e) {
|
|
165
|
-
// Ignore encoding errors
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
// Responses, Gemini, and Anthropic APIs all use: {type: 'content', content: string}
|
|
172
|
-
if (chunk.type === 'content' && chunk.content) {
|
|
173
|
-
completeContent += chunk.content;
|
|
174
|
-
// Update token count if callback provided
|
|
175
|
-
if (onTokenUpdate && encoder) {
|
|
176
|
-
try {
|
|
177
|
-
const tokens = encoder.encode(completeContent);
|
|
178
|
-
onTokenUpdate(tokens.length);
|
|
179
|
-
}
|
|
180
|
-
catch (e) {
|
|
181
|
-
// Ignore encoding errors
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
catch (streamError) {
|
|
189
|
-
// Log streaming error with details
|
|
190
|
-
if (streamError instanceof Error) {
|
|
191
|
-
logger.error('Compact agent: Streaming error:', {
|
|
192
|
-
error: streamError.message,
|
|
193
|
-
stack: streamError.stack,
|
|
194
|
-
name: streamError.name,
|
|
195
|
-
chunkCount,
|
|
196
|
-
contentLength: completeContent.length,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
logger.error('Compact agent: Unknown streaming error:', {
|
|
201
|
-
error: streamError,
|
|
202
|
-
chunkCount,
|
|
203
|
-
contentLength: completeContent.length,
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
throw streamError;
|
|
207
|
-
}
|
|
208
|
-
finally {
|
|
209
|
-
// Free encoder
|
|
210
|
-
if (encoder) {
|
|
211
|
-
encoder.free();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return completeContent;
|
|
215
|
-
}
|
|
216
|
-
catch (error) {
|
|
217
|
-
// Log detailed error from API call setup or streaming
|
|
218
|
-
if (error instanceof Error) {
|
|
219
|
-
logger.error('Compact agent: API call failed:', {
|
|
220
|
-
error: error.message,
|
|
221
|
-
stack: error.stack,
|
|
222
|
-
name: error.name,
|
|
223
|
-
requestMethod: this.requestMethod,
|
|
224
|
-
modelName: this.modelName,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
logger.error('Compact agent: Unknown API error:', {
|
|
229
|
-
error,
|
|
230
|
-
requestMethod: this.requestMethod,
|
|
231
|
-
modelName: this.modelName,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
throw error;
|
|
235
|
-
}
|
|
236
|
-
finally {
|
|
237
|
-
// Restore original config
|
|
238
|
-
config.advancedModel = originalAdvancedModel;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Extract key information from web page content based on user query
|
|
243
|
-
*
|
|
244
|
-
* @param content - Full web page content
|
|
245
|
-
* @param userQuery - User's original question/query
|
|
246
|
-
* @param url - URL of the web page (for context)
|
|
247
|
-
* @param abortSignal - Optional abort signal to cancel extraction
|
|
248
|
-
* @param onTokenUpdate - Optional callback to update token count during streaming
|
|
249
|
-
* @returns Extracted key information relevant to the query
|
|
250
|
-
*/
|
|
251
|
-
async extractWebPageContent(content, userQuery, url, abortSignal, onTokenUpdate) {
|
|
252
|
-
const available = await this.isAvailable();
|
|
253
|
-
if (!available) {
|
|
254
|
-
// If compact agent is not available, return original content
|
|
255
|
-
return content;
|
|
256
|
-
}
|
|
257
|
-
try {
|
|
258
|
-
const extractionPrompt = `You are a content extraction assistant. Your task is to extract and summarize the most relevant information from a web page based on the user's query.
|
|
259
|
-
|
|
260
|
-
User's Query: ${userQuery}
|
|
261
|
-
|
|
262
|
-
Web Page URL: ${url}
|
|
263
|
-
|
|
264
|
-
Web Page Content:
|
|
265
|
-
${content}
|
|
266
|
-
|
|
267
|
-
Instructions:
|
|
268
|
-
1. Extract ONLY the information that is directly relevant to the user's query
|
|
269
|
-
2. Preserve important details, facts, code examples, and key points
|
|
270
|
-
3. Remove navigation, ads, irrelevant sections, and boilerplate text
|
|
271
|
-
4. Organize the information in a clear, structured format
|
|
272
|
-
5. If there are multiple relevant sections, separate them clearly
|
|
273
|
-
6. Keep technical terms and specific details intact
|
|
274
|
-
|
|
275
|
-
Provide the extracted content below:`;
|
|
276
|
-
const messages = [
|
|
277
|
-
{
|
|
278
|
-
role: 'user',
|
|
279
|
-
content: extractionPrompt,
|
|
280
|
-
},
|
|
281
|
-
];
|
|
282
|
-
const extractedContent = await this.callCompactModel(messages, abortSignal, onTokenUpdate);
|
|
283
|
-
if (!extractedContent || extractedContent.trim().length === 0) {
|
|
284
|
-
logger.warn('Compact agent returned empty response, using original content');
|
|
285
|
-
return content;
|
|
286
|
-
}
|
|
287
|
-
return extractedContent;
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
// Log detailed error information
|
|
291
|
-
if (error instanceof Error) {
|
|
292
|
-
logger.warn('Compact agent extraction failed, using original content:', {
|
|
293
|
-
error: error.message,
|
|
294
|
-
stack: error.stack,
|
|
295
|
-
name: error.name,
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
logger.warn('Compact agent extraction failed with unknown error:', error);
|
|
300
|
-
}
|
|
301
|
-
return content;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
// Export singleton instance
|
|
306
|
-
export const compactAgent = new CompactAgent();
|