@blackbox_ai/blackbox-cli-core 0.0.4
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/LICENSE +203 -0
- package/README.md +420 -0
- package/dist/.last_build +0 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/src/__mocks__/fs/promises.d.ts +11 -0
- package/dist/src/__mocks__/fs/promises.js +17 -0
- package/dist/src/__mocks__/fs/promises.js.map +1 -0
- package/dist/src/blackbox/blackboxContentGenerator.d.ts +70 -0
- package/dist/src/blackbox/blackboxContentGenerator.js +180 -0
- package/dist/src/blackbox/blackboxContentGenerator.js.map +1 -0
- package/dist/src/blackbox/blackboxContentGenerator.test.d.ts +6 -0
- package/dist/src/blackbox/blackboxContentGenerator.test.js +1178 -0
- package/dist/src/blackbox/blackboxContentGenerator.test.js.map +1 -0
- package/dist/src/blackbox/blackboxOAuth2.d.ts +191 -0
- package/dist/src/blackbox/blackboxOAuth2.js +566 -0
- package/dist/src/blackbox/blackboxOAuth2.js.map +1 -0
- package/dist/src/blackbox/blackboxOAuth2.test.d.ts +6 -0
- package/dist/src/blackbox/blackboxOAuth2.test.js +1718 -0
- package/dist/src/blackbox/blackboxOAuth2.test.js.map +1 -0
- package/dist/src/blackbox/sharedTokenManager.d.ts +196 -0
- package/dist/src/blackbox/sharedTokenManager.js +647 -0
- package/dist/src/blackbox/sharedTokenManager.js.map +1 -0
- package/dist/src/blackbox/sharedTokenManager.test.d.ts +7 -0
- package/dist/src/blackbox/sharedTokenManager.test.js +662 -0
- package/dist/src/blackbox/sharedTokenManager.test.js.map +1 -0
- package/dist/src/code_assist/codeAssist.d.ts +10 -0
- package/dist/src/code_assist/codeAssist.js +19 -0
- package/dist/src/code_assist/codeAssist.js.map +1 -0
- package/dist/src/code_assist/converter.d.ts +72 -0
- package/dist/src/code_assist/converter.js +159 -0
- package/dist/src/code_assist/converter.js.map +1 -0
- package/dist/src/code_assist/converter.test.d.ts +6 -0
- package/dist/src/code_assist/converter.test.js +362 -0
- package/dist/src/code_assist/converter.test.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +22 -0
- package/dist/src/code_assist/oauth2.js +368 -0
- package/dist/src/code_assist/oauth2.js.map +1 -0
- package/dist/src/code_assist/oauth2.test.d.ts +6 -0
- package/dist/src/code_assist/oauth2.test.js +436 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -0
- package/dist/src/code_assist/server.d.ts +37 -0
- package/dist/src/code_assist/server.js +125 -0
- package/dist/src/code_assist/server.js.map +1 -0
- package/dist/src/code_assist/server.test.d.ts +6 -0
- package/dist/src/code_assist/server.test.js +134 -0
- package/dist/src/code_assist/server.test.js.map +1 -0
- package/dist/src/code_assist/setup.d.ts +20 -0
- package/dist/src/code_assist/setup.js +101 -0
- package/dist/src/code_assist/setup.js.map +1 -0
- package/dist/src/code_assist/setup.test.d.ts +6 -0
- package/dist/src/code_assist/setup.test.js +171 -0
- package/dist/src/code_assist/setup.test.js.map +1 -0
- package/dist/src/code_assist/types.d.ts +148 -0
- package/dist/src/code_assist/types.js +46 -0
- package/dist/src/code_assist/types.js.map +1 -0
- package/dist/src/config/blackboxModels.d.ts +28 -0
- package/dist/src/config/blackboxModels.js +148 -0
- package/dist/src/config/blackboxModels.js.map +1 -0
- package/dist/src/config/config.d.ts +381 -0
- package/dist/src/config/config.js +753 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/config.test.d.ts +6 -0
- package/dist/src/config/config.test.js +674 -0
- package/dist/src/config/config.test.js.map +1 -0
- package/dist/src/config/flashFallback.test.d.ts +6 -0
- package/dist/src/config/flashFallback.test.js +87 -0
- package/dist/src/config/flashFallback.test.js.map +1 -0
- package/dist/src/config/models.d.ts +12 -0
- package/dist/src/config/models.js +13 -0
- package/dist/src/config/models.js.map +1 -0
- package/dist/src/config/storage.d.ts +32 -0
- package/dist/src/config/storage.js +90 -0
- package/dist/src/config/storage.js.map +1 -0
- package/dist/src/config/storage.test.d.ts +6 -0
- package/dist/src/config/storage.test.js +43 -0
- package/dist/src/config/storage.test.js.map +1 -0
- package/dist/src/core/__tests__/openaiTimeoutHandling.test.d.ts +6 -0
- package/dist/src/core/__tests__/openaiTimeoutHandling.test.js +292 -0
- package/dist/src/core/__tests__/openaiTimeoutHandling.test.js.map +1 -0
- package/dist/src/core/__tests__/orphanedToolCallsTest.d.ts +64 -0
- package/dist/src/core/__tests__/orphanedToolCallsTest.js +122 -0
- package/dist/src/core/__tests__/orphanedToolCallsTest.js.map +1 -0
- package/dist/src/core/client.d.ts +75 -0
- package/dist/src/core/client.js +826 -0
- package/dist/src/core/client.js.map +1 -0
- package/dist/src/core/client.test.d.ts +6 -0
- package/dist/src/core/client.test.js +2059 -0
- package/dist/src/core/client.test.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +51 -0
- package/dist/src/core/contentGenerator.js +149 -0
- package/dist/src/core/contentGenerator.js.map +1 -0
- package/dist/src/core/contentGenerator.test.d.ts +6 -0
- package/dist/src/core/contentGenerator.test.js +133 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -0
- package/dist/src/core/coreToolScheduler.d.ts +126 -0
- package/dist/src/core/coreToolScheduler.js +630 -0
- package/dist/src/core/coreToolScheduler.js.map +1 -0
- package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
- package/dist/src/core/coreToolScheduler.test.js +1228 -0
- package/dist/src/core/coreToolScheduler.test.js.map +1 -0
- package/dist/src/core/geminiChat.d.ts +139 -0
- package/dist/src/core/geminiChat.js +636 -0
- package/dist/src/core/geminiChat.js.map +1 -0
- package/dist/src/core/geminiChat.test.d.ts +6 -0
- package/dist/src/core/geminiChat.test.js +1178 -0
- package/dist/src/core/geminiChat.test.js.map +1 -0
- package/dist/src/core/geminiRequest.d.ts +13 -0
- package/dist/src/core/geminiRequest.js +11 -0
- package/dist/src/core/geminiRequest.js.map +1 -0
- package/dist/src/core/geminiRequest.test.d.ts +6 -0
- package/dist/src/core/geminiRequest.test.js +73 -0
- package/dist/src/core/geminiRequest.test.js.map +1 -0
- package/dist/src/core/logger.d.ts +68 -0
- package/dist/src/core/logger.js +370 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/logger.test.d.ts +6 -0
- package/dist/src/core/logger.test.js +591 -0
- package/dist/src/core/logger.test.js.map +1 -0
- package/dist/src/core/loggingContentGenerator.d.ts +25 -0
- package/dist/src/core/loggingContentGenerator.js +97 -0
- package/dist/src/core/loggingContentGenerator.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.d.ts +10 -0
- package/dist/src/core/nonInteractiveToolExecutor.js +24 -0
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js +236 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/constants.d.ts +2 -0
- package/dist/src/core/openaiContentGenerator/constants.js +3 -0
- package/dist/src/core/openaiContentGenerator/constants.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/converter.d.ts +107 -0
- package/dist/src/core/openaiContentGenerator/converter.js +802 -0
- package/dist/src/core/openaiContentGenerator/converter.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/converter.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/converter.test.js +47 -0
- package/dist/src/core/openaiContentGenerator/converter.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.d.ts +20 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.js +82 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.test.js +287 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/index.d.ts +22 -0
- package/dist/src/core/openaiContentGenerator/index.js +41 -0
- package/dist/src/core/openaiContentGenerator/index.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/openaiContentGenerator.d.ts +21 -0
- package/dist/src/core/openaiContentGenerator/openaiContentGenerator.js +105 -0
- package/dist/src/core/openaiContentGenerator/openaiContentGenerator.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/openaiContentGenerator.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/openaiContentGenerator.test.js +230 -0
- package/dist/src/core/openaiContentGenerator/openaiContentGenerator.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/pipeline.d.ts +66 -0
- package/dist/src/core/openaiContentGenerator/pipeline.js +256 -0
- package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/pipeline.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/pipeline.test.js +977 -0
- package/dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/README.md +61 -0
- package/dist/src/core/openaiContentGenerator/provider/dashscope.d.ts +63 -0
- package/dist/src/core/openaiContentGenerator/provider/dashscope.js +241 -0
- package/dist/src/core/openaiContentGenerator/provider/dashscope.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/dashscope.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/provider/dashscope.test.js +707 -0
- package/dist/src/core/openaiContentGenerator/provider/dashscope.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/deepseek.d.ts +14 -0
- package/dist/src/core/openaiContentGenerator/provider/deepseek.js +52 -0
- package/dist/src/core/openaiContentGenerator/provider/deepseek.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/deepseek.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/provider/deepseek.test.js +103 -0
- package/dist/src/core/openaiContentGenerator/provider/deepseek.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/default.d.ts +15 -0
- package/dist/src/core/openaiContentGenerator/provider/default.js +38 -0
- package/dist/src/core/openaiContentGenerator/provider/default.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/default.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/provider/default.test.js +176 -0
- package/dist/src/core/openaiContentGenerator/provider/default.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/index.d.ts +5 -0
- package/dist/src/core/openaiContentGenerator/provider/index.js +5 -0
- package/dist/src/core/openaiContentGenerator/provider/index.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/openrouter.d.ts +8 -0
- package/dist/src/core/openaiContentGenerator/provider/openrouter.js +21 -0
- package/dist/src/core/openaiContentGenerator/provider/openrouter.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/openrouter.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js +152 -0
- package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/provider/types.d.ts +23 -0
- package/dist/src/core/openaiContentGenerator/provider/types.js +2 -0
- package/dist/src/core/openaiContentGenerator/provider/types.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.d.ts +142 -0
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js +363 -0
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.test.js +537 -0
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/telemetryService.d.ts +35 -0
- package/dist/src/core/openaiContentGenerator/telemetryService.js +146 -0
- package/dist/src/core/openaiContentGenerator/telemetryService.js.map +1 -0
- package/dist/src/core/openaiContentGenerator/telemetryService.test.d.ts +6 -0
- package/dist/src/core/openaiContentGenerator/telemetryService.test.js +978 -0
- package/dist/src/core/openaiContentGenerator/telemetryService.test.js.map +1 -0
- package/dist/src/core/prompts.d.ts +76 -0
- package/dist/src/core/prompts.js +860 -0
- package/dist/src/core/prompts.js.map +1 -0
- package/dist/src/core/prompts.test.d.ts +6 -0
- package/dist/src/core/prompts.test.js +436 -0
- package/dist/src/core/prompts.test.js.map +1 -0
- package/dist/src/core/tokenLimits.d.ts +25 -0
- package/dist/src/core/tokenLimits.js +175 -0
- package/dist/src/core/tokenLimits.js.map +1 -0
- package/dist/src/core/tokenLimits.test.d.ts +1 -0
- package/dist/src/core/tokenLimits.test.js +261 -0
- package/dist/src/core/tokenLimits.test.js.map +1 -0
- package/dist/src/core/turn.d.ts +140 -0
- package/dist/src/core/turn.js +168 -0
- package/dist/src/core/turn.js.map +1 -0
- package/dist/src/core/turn.test.d.ts +6 -0
- package/dist/src/core/turn.test.js +450 -0
- package/dist/src/core/turn.test.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.d.ts +25 -0
- package/dist/src/ide/detect-ide.js +104 -0
- package/dist/src/ide/detect-ide.js.map +1 -0
- package/dist/src/ide/detect-ide.test.d.ts +6 -0
- package/dist/src/ide/detect-ide.test.js +120 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +67 -0
- package/dist/src/ide/ide-client.js +424 -0
- package/dist/src/ide/ide-client.js.map +1 -0
- package/dist/src/ide/ide-client.test.d.ts +6 -0
- package/dist/src/ide/ide-client.test.js +165 -0
- package/dist/src/ide/ide-client.test.js.map +1 -0
- package/dist/src/ide/ide-installer.d.ts +14 -0
- package/dist/src/ide/ide-installer.js +107 -0
- package/dist/src/ide/ide-installer.js.map +1 -0
- package/dist/src/ide/ide-installer.test.d.ts +6 -0
- package/dist/src/ide/ide-installer.test.js +113 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +374 -0
- package/dist/src/ide/ideContext.js +147 -0
- package/dist/src/ide/ideContext.js.map +1 -0
- package/dist/src/ide/ideContext.test.d.ts +6 -0
- package/dist/src/ide/ideContext.test.js +265 -0
- package/dist/src/ide/ideContext.test.js.map +1 -0
- package/dist/src/ide/process-utils.d.ts +21 -0
- package/dist/src/ide/process-utils.js +164 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/ide/process-utils.test.d.ts +6 -0
- package/dist/src/ide/process-utils.test.js +158 -0
- package/dist/src/ide/process-utils.test.js.map +1 -0
- package/dist/src/index.d.ts +86 -0
- package/dist/src/index.js +97 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +6 -0
- package/dist/src/index.test.js +12 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.d.ts +23 -0
- package/dist/src/mcp/google-auth-provider.js +72 -0
- package/dist/src/mcp/google-auth-provider.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
- package/dist/src/mcp/google-auth-provider.test.js +89 -0
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-provider.d.ts +146 -0
- package/dist/src/mcp/oauth-provider.js +601 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
- package/dist/src/mcp/oauth-provider.test.js +672 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.d.ts +61 -0
- package/dist/src/mcp/oauth-token-storage.js +148 -0
- package/dist/src/mcp/oauth-token-storage.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
- package/dist/src/mcp/oauth-token-storage.test.js +208 -0
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
- package/dist/src/mcp/oauth-utils.d.ts +119 -0
- package/dist/src/mcp/oauth-utils.js +235 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -0
- package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
- package/dist/src/mcp/oauth-utils.test.js +199 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -0
- package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
- package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
- package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
- package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
- package/dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
- package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
- package/dist/src/mcp/token-storage/types.d.ts +34 -0
- package/dist/src/mcp/token-storage/types.js +7 -0
- package/dist/src/mcp/token-storage/types.js.map +1 -0
- package/dist/src/mocks/msw.d.ts +6 -0
- package/dist/src/mocks/msw.js +8 -0
- package/dist/src/mocks/msw.js.map +1 -0
- package/dist/src/prompts/mcp-prompts.d.ts +8 -0
- package/dist/src/prompts/mcp-prompts.js +13 -0
- package/dist/src/prompts/mcp-prompts.js.map +1 -0
- package/dist/src/prompts/prompt-registry.d.ts +34 -0
- package/dist/src/prompts/prompt-registry.js +63 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -0
- package/dist/src/services/chatRecordingService.d.ts +150 -0
- package/dist/src/services/chatRecordingService.js +321 -0
- package/dist/src/services/chatRecordingService.js.map +1 -0
- package/dist/src/services/chatRecordingService.test.d.ts +6 -0
- package/dist/src/services/chatRecordingService.test.js +290 -0
- package/dist/src/services/chatRecordingService.test.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.d.ts +35 -0
- package/dist/src/services/fileDiscoveryService.js +91 -0
- package/dist/src/services/fileDiscoveryService.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/fileDiscoveryService.test.js +143 -0
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
- package/dist/src/services/fileSystemService.d.ts +31 -0
- package/dist/src/services/fileSystemService.js +18 -0
- package/dist/src/services/fileSystemService.js.map +1 -0
- package/dist/src/services/fileSystemService.test.d.ts +6 -0
- package/dist/src/services/fileSystemService.test.js +41 -0
- package/dist/src/services/fileSystemService.test.js.map +1 -0
- package/dist/src/services/gitService.d.ts +23 -0
- package/dist/src/services/gitService.js +110 -0
- package/dist/src/services/gitService.js.map +1 -0
- package/dist/src/services/gitService.test.d.ts +6 -0
- package/dist/src/services/gitService.test.js +212 -0
- package/dist/src/services/gitService.test.js.map +1 -0
- package/dist/src/services/loopDetectionService.d.ts +98 -0
- package/dist/src/services/loopDetectionService.js +363 -0
- package/dist/src/services/loopDetectionService.js.map +1 -0
- package/dist/src/services/loopDetectionService.test.d.ts +6 -0
- package/dist/src/services/loopDetectionService.test.js +560 -0
- package/dist/src/services/loopDetectionService.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.d.ts +68 -0
- package/dist/src/services/shellExecutionService.js +332 -0
- package/dist/src/services/shellExecutionService.js.map +1 -0
- package/dist/src/services/shellExecutionService.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.test.js +517 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -0
- package/dist/src/subagents/builtin-agents.d.ts +35 -0
- package/dist/src/subagents/builtin-agents.js +85 -0
- package/dist/src/subagents/builtin-agents.js.map +1 -0
- package/dist/src/subagents/builtin-agents.test.d.ts +6 -0
- package/dist/src/subagents/builtin-agents.test.js +78 -0
- package/dist/src/subagents/builtin-agents.test.js.map +1 -0
- package/dist/src/subagents/index.d.ts +29 -0
- package/dist/src/subagents/index.js +15 -0
- package/dist/src/subagents/index.js.map +1 -0
- package/dist/src/subagents/subagent-events.d.ts +93 -0
- package/dist/src/subagents/subagent-events.js +31 -0
- package/dist/src/subagents/subagent-events.js.map +1 -0
- package/dist/src/subagents/subagent-hooks.d.ts +29 -0
- package/dist/src/subagents/subagent-hooks.js +7 -0
- package/dist/src/subagents/subagent-hooks.js.map +1 -0
- package/dist/src/subagents/subagent-manager.d.ts +170 -0
- package/dist/src/subagents/subagent-manager.js +593 -0
- package/dist/src/subagents/subagent-manager.js.map +1 -0
- package/dist/src/subagents/subagent-manager.test.d.ts +6 -0
- package/dist/src/subagents/subagent-manager.test.js +822 -0
- package/dist/src/subagents/subagent-manager.test.js.map +1 -0
- package/dist/src/subagents/subagent-statistics.d.ts +46 -0
- package/dist/src/subagents/subagent-statistics.js +193 -0
- package/dist/src/subagents/subagent-statistics.js.map +1 -0
- package/dist/src/subagents/subagent-statistics.test.d.ts +6 -0
- package/dist/src/subagents/subagent-statistics.test.js +231 -0
- package/dist/src/subagents/subagent-statistics.test.js.map +1 -0
- package/dist/src/subagents/subagent.d.ts +161 -0
- package/dist/src/subagents/subagent.js +667 -0
- package/dist/src/subagents/subagent.js.map +1 -0
- package/dist/src/subagents/subagent.test.d.ts +6 -0
- package/dist/src/subagents/subagent.test.js +487 -0
- package/dist/src/subagents/subagent.test.js.map +1 -0
- package/dist/src/subagents/types.d.ts +218 -0
- package/dist/src/subagents/types.js +58 -0
- package/dist/src/subagents/types.js.map +1 -0
- package/dist/src/subagents/types.test.d.ts +6 -0
- package/dist/src/subagents/types.test.js +31 -0
- package/dist/src/subagents/types.test.js.map +1 -0
- package/dist/src/subagents/validation.d.ts +63 -0
- package/dist/src/subagents/validation.js +293 -0
- package/dist/src/subagents/validation.js.map +1 -0
- package/dist/src/subagents/validation.test.d.ts +6 -0
- package/dist/src/subagents/validation.test.js +330 -0
- package/dist/src/subagents/validation.test.js.map +1 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.d.ts +80 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.js +583 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.js.map +1 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.d.ts +6 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js +301 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js.map +1 -0
- package/dist/src/telemetry/blackbox-logger/event-types.d.ts +73 -0
- package/dist/src/telemetry/blackbox-logger/event-types.js +2 -0
- package/dist/src/telemetry/blackbox-logger/event-types.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +121 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +773 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +17 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +420 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +90 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +229 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
- package/dist/src/telemetry/constants.d.ts +34 -0
- package/dist/src/telemetry/constants.js +35 -0
- package/dist/src/telemetry/constants.js.map +1 -0
- package/dist/src/telemetry/file-exporters.d.ts +29 -0
- package/dist/src/telemetry/file-exporters.js +62 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +20 -0
- package/dist/src/telemetry/index.js +21 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
- package/dist/src/telemetry/integration.test.circular.js +95 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -0
- package/dist/src/telemetry/loggers.d.ts +26 -0
- package/dist/src/telemetry/loggers.js +406 -0
- package/dist/src/telemetry/loggers.js.map +1 -0
- package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
- package/dist/src/telemetry/loggers.test.circular.js +107 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
- package/dist/src/telemetry/loggers.test.d.ts +6 -0
- package/dist/src/telemetry/loggers.test.js +638 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +40 -0
- package/dist/src/telemetry/metrics.js +229 -0
- package/dist/src/telemetry/metrics.js.map +1 -0
- package/dist/src/telemetry/metrics.test.d.ts +6 -0
- package/dist/src/telemetry/metrics.test.js +242 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -0
- package/dist/src/telemetry/sdk.d.ts +9 -0
- package/dist/src/telemetry/sdk.js +161 -0
- package/dist/src/telemetry/sdk.js.map +1 -0
- package/dist/src/telemetry/sdk.test.d.ts +6 -0
- package/dist/src/telemetry/sdk.test.js +82 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -0
- package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
- package/dist/src/telemetry/telemetry-utils.js +14 -0
- package/dist/src/telemetry/telemetry-utils.js.map +1 -0
- package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
- package/dist/src/telemetry/telemetry-utils.test.js +40 -0
- package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
- package/dist/src/telemetry/telemetry.test.d.ts +6 -0
- package/dist/src/telemetry/telemetry.test.js +50 -0
- package/dist/src/telemetry/telemetry.test.js.map +1 -0
- package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
- package/dist/src/telemetry/tool-call-decision.js +29 -0
- package/dist/src/telemetry/tool-call-decision.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +236 -0
- package/dist/src/telemetry/types.js +405 -0
- package/dist/src/telemetry/types.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.d.ts +75 -0
- package/dist/src/telemetry/uiTelemetry.js +153 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
- package/dist/src/telemetry/uiTelemetry.test.js +558 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
- package/dist/src/test-utils/config.d.ts +17 -0
- package/dist/src/test-utils/config.js +32 -0
- package/dist/src/test-utils/config.js.map +1 -0
- package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
- package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
- package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
- package/dist/src/test-utils/tools.d.ts +45 -0
- package/dist/src/test-utils/tools.js +105 -0
- package/dist/src/test-utils/tools.js.map +1 -0
- package/dist/src/tools/diffOptions.d.ts +9 -0
- package/dist/src/tools/diffOptions.js +38 -0
- package/dist/src/tools/diffOptions.js.map +1 -0
- package/dist/src/tools/diffOptions.test.d.ts +6 -0
- package/dist/src/tools/diffOptions.test.js +119 -0
- package/dist/src/tools/diffOptions.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +56 -0
- package/dist/src/tools/edit.js +434 -0
- package/dist/src/tools/edit.js.map +1 -0
- package/dist/src/tools/edit.test.d.ts +6 -0
- package/dist/src/tools/edit.test.js +569 -0
- package/dist/src/tools/edit.test.js.map +1 -0
- package/dist/src/tools/exitPlanMode.d.ts +28 -0
- package/dist/src/tools/exitPlanMode.js +137 -0
- package/dist/src/tools/exitPlanMode.js.map +1 -0
- package/dist/src/tools/exitPlanMode.test.d.ts +6 -0
- package/dist/src/tools/exitPlanMode.test.js +219 -0
- package/dist/src/tools/exitPlanMode.test.js.map +1 -0
- package/dist/src/tools/glob.d.ts +52 -0
- package/dist/src/tools/glob.js +237 -0
- package/dist/src/tools/glob.js.map +1 -0
- package/dist/src/tools/glob.test.d.ts +6 -0
- package/dist/src/tools/glob.test.js +375 -0
- package/dist/src/tools/glob.test.js.map +1 -0
- package/dist/src/tools/grep.d.ts +51 -0
- package/dist/src/tools/grep.js +566 -0
- package/dist/src/tools/grep.js.map +1 -0
- package/dist/src/tools/grep.test.d.ts +6 -0
- package/dist/src/tools/grep.test.js +356 -0
- package/dist/src/tools/grep.test.js.map +1 -0
- package/dist/src/tools/ls.d.ts +68 -0
- package/dist/src/tools/ls.js +227 -0
- package/dist/src/tools/ls.js.map +1 -0
- package/dist/src/tools/ls.test.d.ts +6 -0
- package/dist/src/tools/ls.test.js +389 -0
- package/dist/src/tools/ls.test.js.map +1 -0
- package/dist/src/tools/mcp-client-manager.d.ts +38 -0
- package/dist/src/tools/mcp-client-manager.js +74 -0
- package/dist/src/tools/mcp-client-manager.js.map +1 -0
- package/dist/src/tools/mcp-client-manager.test.d.ts +6 -0
- package/dist/src/tools/mcp-client-manager.test.js +39 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -0
- package/dist/src/tools/mcp-client.d.ts +199 -0
- package/dist/src/tools/mcp-client.js +995 -0
- package/dist/src/tools/mcp-client.js.map +1 -0
- package/dist/src/tools/mcp-client.test.d.ts +6 -0
- package/dist/src/tools/mcp-client.test.js +454 -0
- package/dist/src/tools/mcp-client.test.js.map +1 -0
- package/dist/src/tools/mcp-tool.d.ts +23 -0
- package/dist/src/tools/mcp-tool.js +240 -0
- package/dist/src/tools/mcp-tool.js.map +1 -0
- package/dist/src/tools/mcp-tool.test.d.ts +6 -0
- package/dist/src/tools/mcp-tool.test.js +576 -0
- package/dist/src/tools/mcp-tool.test.js.map +1 -0
- package/dist/src/tools/memoryTool.d.ts +41 -0
- package/dist/src/tools/memoryTool.js +435 -0
- package/dist/src/tools/memoryTool.js.map +1 -0
- package/dist/src/tools/memoryTool.test.d.ts +6 -0
- package/dist/src/tools/memoryTool.test.js +420 -0
- package/dist/src/tools/memoryTool.test.js.map +1 -0
- package/dist/src/tools/modifiable-tool.d.ts +32 -0
- package/dist/src/tools/modifiable-tool.js +88 -0
- package/dist/src/tools/modifiable-tool.js.map +1 -0
- package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
- package/dist/src/tools/modifiable-tool.test.js +193 -0
- package/dist/src/tools/modifiable-tool.test.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +35 -0
- package/dist/src/tools/read-file.js +128 -0
- package/dist/src/tools/read-file.js.map +1 -0
- package/dist/src/tools/read-file.test.d.ts +6 -0
- package/dist/src/tools/read-file.test.js +311 -0
- package/dist/src/tools/read-file.test.js.map +1 -0
- package/dist/src/tools/read-many-files.d.ts +60 -0
- package/dist/src/tools/read-many-files.js +416 -0
- package/dist/src/tools/read-many-files.js.map +1 -0
- package/dist/src/tools/read-many-files.test.d.ts +6 -0
- package/dist/src/tools/read-many-files.test.js +565 -0
- package/dist/src/tools/read-many-files.test.js.map +1 -0
- package/dist/src/tools/ripGrep.d.ts +47 -0
- package/dist/src/tools/ripGrep.js +375 -0
- package/dist/src/tools/ripGrep.js.map +1 -0
- package/dist/src/tools/ripGrep.test.d.ts +6 -0
- package/dist/src/tools/ripGrep.test.js +874 -0
- package/dist/src/tools/ripGrep.test.js.map +1 -0
- package/dist/src/tools/shell.d.ts +23 -0
- package/dist/src/tools/shell.js +387 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/shell.test.d.ts +6 -0
- package/dist/src/tools/shell.test.js +632 -0
- package/dist/src/tools/shell.test.js.map +1 -0
- package/dist/src/tools/task.d.ts +59 -0
- package/dist/src/tools/task.js +412 -0
- package/dist/src/tools/task.js.map +1 -0
- package/dist/src/tools/task.test.d.ts +6 -0
- package/dist/src/tools/task.test.js +369 -0
- package/dist/src/tools/task.test.js.map +1 -0
- package/dist/src/tools/todoWrite.d.ts +42 -0
- package/dist/src/tools/todoWrite.js +385 -0
- package/dist/src/tools/todoWrite.js.map +1 -0
- package/dist/src/tools/todoWrite.test.d.ts +6 -0
- package/dist/src/tools/todoWrite.test.js +222 -0
- package/dist/src/tools/todoWrite.test.js.map +1 -0
- package/dist/src/tools/tool-error.d.ts +43 -0
- package/dist/src/tools/tool-error.js +58 -0
- package/dist/src/tools/tool-error.js.map +1 -0
- package/dist/src/tools/tool-names.d.ts +23 -0
- package/dist/src/tools/tool-names.js +24 -0
- package/dist/src/tools/tool-names.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +86 -0
- package/dist/src/tools/tool-registry.js +369 -0
- package/dist/src/tools/tool-registry.js.map +1 -0
- package/dist/src/tools/tool-registry.test.d.ts +6 -0
- package/dist/src/tools/tool-registry.test.js +332 -0
- package/dist/src/tools/tool-registry.test.js.map +1 -0
- package/dist/src/tools/tools.d.ts +316 -0
- package/dist/src/tools/tools.js +251 -0
- package/dist/src/tools/tools.js.map +1 -0
- package/dist/src/tools/tools.test.d.ts +6 -0
- package/dist/src/tools/tools.test.js +205 -0
- package/dist/src/tools/tools.test.js.map +1 -0
- package/dist/src/tools/web-fetch.d.ts +31 -0
- package/dist/src/tools/web-fetch.js +161 -0
- package/dist/src/tools/web-fetch.js.map +1 -0
- package/dist/src/tools/web-fetch.test.d.ts +6 -0
- package/dist/src/tools/web-fetch.test.js +133 -0
- package/dist/src/tools/web-fetch.test.js.map +1 -0
- package/dist/src/tools/web-search.d.ts +40 -0
- package/dist/src/tools/web-search.js +134 -0
- package/dist/src/tools/web-search.js.map +1 -0
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +125 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +52 -0
- package/dist/src/tools/write-file.js +298 -0
- package/dist/src/tools/write-file.js.map +1 -0
- package/dist/src/tools/write-file.test.d.ts +6 -0
- package/dist/src/tools/write-file.test.js +436 -0
- package/dist/src/tools/write-file.test.js.map +1 -0
- package/dist/src/utils/LruCache.d.ts +13 -0
- package/dist/src/utils/LruCache.js +38 -0
- package/dist/src/utils/LruCache.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.d.ts +24 -0
- package/dist/src/utils/bfsFileSearch.js +89 -0
- package/dist/src/utils/bfsFileSearch.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
- package/dist/src/utils/bfsFileSearch.test.js +163 -0
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
- package/dist/src/utils/browser.d.ts +13 -0
- package/dist/src/utils/browser.js +50 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/editor.d.ts +28 -0
- package/dist/src/utils/editor.js +186 -0
- package/dist/src/utils/editor.js.map +1 -0
- package/dist/src/utils/editor.test.d.ts +6 -0
- package/dist/src/utils/editor.test.js +445 -0
- package/dist/src/utils/editor.test.js.map +1 -0
- package/dist/src/utils/environmentContext.d.ts +21 -0
- package/dist/src/utils/environmentContext.js +90 -0
- package/dist/src/utils/environmentContext.js.map +1 -0
- package/dist/src/utils/environmentContext.test.d.ts +6 -0
- package/dist/src/utils/environmentContext.test.js +148 -0
- package/dist/src/utils/environmentContext.test.js.map +1 -0
- package/dist/src/utils/errorParsing.d.ts +8 -0
- package/dist/src/utils/errorParsing.js +93 -0
- package/dist/src/utils/errorParsing.js.map +1 -0
- package/dist/src/utils/errorParsing.test.d.ts +6 -0
- package/dist/src/utils/errorParsing.test.js +172 -0
- package/dist/src/utils/errorParsing.test.js.map +1 -0
- package/dist/src/utils/errorReporting.d.ts +14 -0
- package/dist/src/utils/errorReporting.js +88 -0
- package/dist/src/utils/errorReporting.js.map +1 -0
- package/dist/src/utils/errorReporting.test.d.ts +6 -0
- package/dist/src/utils/errorReporting.test.js +130 -0
- package/dist/src/utils/errorReporting.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +33 -0
- package/dist/src/utils/errors.js +86 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +11 -0
- package/dist/src/utils/fetch.js +51 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/fileUtils.d.ts +53 -0
- package/dist/src/utils/fileUtils.js +283 -0
- package/dist/src/utils/fileUtils.js.map +1 -0
- package/dist/src/utils/fileUtils.test.d.ts +6 -0
- package/dist/src/utils/fileUtils.test.js +364 -0
- package/dist/src/utils/fileUtils.test.js.map +1 -0
- package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
- package/dist/src/utils/filesearch/crawlCache.js +57 -0
- package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
- package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawlCache.test.js +103 -0
- package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawler.test.js +468 -0
- package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +38 -0
- package/dist/src/utils/filesearch/fileSearch.js +191 -0
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
- package/dist/src/utils/filesearch/fileSearch.test.js +642 -0
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.d.ts +42 -0
- package/dist/src/utils/filesearch/ignore.js +106 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
- package/dist/src/utils/filesearch/ignore.test.js +144 -0
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.d.ts +33 -0
- package/dist/src/utils/filesearch/result-cache.js +59 -0
- package/dist/src/utils/filesearch/result-cache.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
- package/dist/src/utils/filesearch/result-cache.test.js +46 -0
- package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
- package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
- package/dist/src/utils/flashFallback.integration.test.js +119 -0
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
- package/dist/src/utils/formatters.d.ts +6 -0
- package/dist/src/utils/formatters.js +16 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/generateContentResponseUtilities.d.ts +13 -0
- package/dist/src/utils/generateContentResponseUtilities.js +80 -0
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
- package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
- package/dist/src/utils/generateContentResponseUtilities.test.js +235 -0
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
- package/dist/src/utils/getFolderStructure.d.ts +31 -0
- package/dist/src/utils/getFolderStructure.js +246 -0
- package/dist/src/utils/getFolderStructure.js.map +1 -0
- package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
- package/dist/src/utils/getFolderStructure.test.js +282 -0
- package/dist/src/utils/getFolderStructure.test.js.map +1 -0
- package/dist/src/utils/getPty.d.ts +19 -0
- package/dist/src/utils/getPty.js +23 -0
- package/dist/src/utils/getPty.js.map +1 -0
- package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
- package/dist/src/utils/gitIgnoreParser.js +61 -0
- package/dist/src/utils/gitIgnoreParser.js.map +1 -0
- package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
- package/dist/src/utils/gitIgnoreParser.test.js +154 -0
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
- package/dist/src/utils/gitUtils.d.ts +17 -0
- package/dist/src/utils/gitUtils.js +61 -0
- package/dist/src/utils/gitUtils.js.map +1 -0
- package/dist/src/utils/ignorePatterns.d.ts +103 -0
- package/dist/src/utils/ignorePatterns.js +220 -0
- package/dist/src/utils/ignorePatterns.js.map +1 -0
- package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
- package/dist/src/utils/ignorePatterns.test.js +250 -0
- package/dist/src/utils/ignorePatterns.test.js.map +1 -0
- package/dist/src/utils/installationManager.d.ts +16 -0
- package/dist/src/utils/installationManager.js +50 -0
- package/dist/src/utils/installationManager.js.map +1 -0
- package/dist/src/utils/installationManager.test.d.ts +6 -0
- package/dist/src/utils/installationManager.test.js +83 -0
- package/dist/src/utils/installationManager.test.js.map +1 -0
- package/dist/src/utils/language-detection.d.ts +6 -0
- package/dist/src/utils/language-detection.js +101 -0
- package/dist/src/utils/language-detection.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +15 -0
- package/dist/src/utils/memoryDiscovery.js +271 -0
- package/dist/src/utils/memoryDiscovery.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
- package/dist/src/utils/memoryDiscovery.test.js +219 -0
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
- package/dist/src/utils/memoryImportProcessor.d.ts +42 -0
- package/dist/src/utils/memoryImportProcessor.js +296 -0
- package/dist/src/utils/memoryImportProcessor.js.map +1 -0
- package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
- package/dist/src/utils/memoryImportProcessor.test.js +573 -0
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
- package/dist/src/utils/messageInspectors.d.ts +8 -0
- package/dist/src/utils/messageInspectors.js +16 -0
- package/dist/src/utils/messageInspectors.js.map +1 -0
- package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
- package/dist/src/utils/nextSpeakerChecker.js +91 -0
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
- package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
- package/dist/src/utils/nextSpeakerChecker.test.js +168 -0
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
- package/dist/src/utils/openaiLogger.d.ts +42 -0
- package/dist/src/utils/openaiLogger.js +123 -0
- package/dist/src/utils/openaiLogger.js.map +1 -0
- package/dist/src/utils/partUtils.d.ts +35 -0
- package/dist/src/utils/partUtils.js +133 -0
- package/dist/src/utils/partUtils.js.map +1 -0
- package/dist/src/utils/partUtils.test.d.ts +6 -0
- package/dist/src/utils/partUtils.test.js +241 -0
- package/dist/src/utils/partUtils.test.js.map +1 -0
- package/dist/src/utils/pathReader.d.ts +17 -0
- package/dist/src/utils/pathReader.js +92 -0
- package/dist/src/utils/pathReader.js.map +1 -0
- package/dist/src/utils/pathReader.test.d.ts +6 -0
- package/dist/src/utils/pathReader.test.js +363 -0
- package/dist/src/utils/pathReader.test.js.map +1 -0
- package/dist/src/utils/paths.d.ts +58 -0
- package/dist/src/utils/paths.js +159 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/paths.test.d.ts +6 -0
- package/dist/src/utils/paths.test.js +225 -0
- package/dist/src/utils/paths.test.js.map +1 -0
- package/dist/src/utils/projectSummary.d.ts +22 -0
- package/dist/src/utils/projectSummary.js +86 -0
- package/dist/src/utils/projectSummary.js.map +1 -0
- package/dist/src/utils/quotaErrorDetection.d.ts +20 -0
- package/dist/src/utils/quotaErrorDetection.js +114 -0
- package/dist/src/utils/quotaErrorDetection.js.map +1 -0
- package/dist/src/utils/quotaErrorDetection.test.d.ts +6 -0
- package/dist/src/utils/quotaErrorDetection.test.js +153 -0
- package/dist/src/utils/quotaErrorDetection.test.js.map +1 -0
- package/dist/src/utils/request-tokenizer/imageTokenizer.d.ts +112 -0
- package/dist/src/utils/request-tokenizer/imageTokenizer.js +401 -0
- package/dist/src/utils/request-tokenizer/imageTokenizer.js.map +1 -0
- package/dist/src/utils/request-tokenizer/imageTokenizer.test.d.ts +6 -0
- package/dist/src/utils/request-tokenizer/imageTokenizer.test.js +114 -0
- package/dist/src/utils/request-tokenizer/imageTokenizer.test.js.map +1 -0
- package/dist/src/utils/request-tokenizer/index.d.ts +18 -0
- package/dist/src/utils/request-tokenizer/index.js +30 -0
- package/dist/src/utils/request-tokenizer/index.js.map +1 -0
- package/dist/src/utils/request-tokenizer/requestTokenizer.d.ts +56 -0
- package/dist/src/utils/request-tokenizer/requestTokenizer.js +263 -0
- package/dist/src/utils/request-tokenizer/requestTokenizer.js.map +1 -0
- package/dist/src/utils/request-tokenizer/requestTokenizer.test.d.ts +6 -0
- package/dist/src/utils/request-tokenizer/requestTokenizer.test.js +245 -0
- package/dist/src/utils/request-tokenizer/requestTokenizer.test.js.map +1 -0
- package/dist/src/utils/request-tokenizer/supportedImageFormats.d.ts +30 -0
- package/dist/src/utils/request-tokenizer/supportedImageFormats.js +41 -0
- package/dist/src/utils/request-tokenizer/supportedImageFormats.js.map +1 -0
- package/dist/src/utils/request-tokenizer/textTokenizer.d.ts +29 -0
- package/dist/src/utils/request-tokenizer/textTokenizer.js +88 -0
- package/dist/src/utils/request-tokenizer/textTokenizer.js.map +1 -0
- package/dist/src/utils/request-tokenizer/textTokenizer.test.d.ts +6 -0
- package/dist/src/utils/request-tokenizer/textTokenizer.test.js +253 -0
- package/dist/src/utils/request-tokenizer/textTokenizer.test.js.map +1 -0
- package/dist/src/utils/request-tokenizer/types.d.ts +55 -0
- package/dist/src/utils/request-tokenizer/types.js +7 -0
- package/dist/src/utils/request-tokenizer/types.js.map +1 -0
- package/dist/src/utils/retry.d.ts +30 -0
- package/dist/src/utils/retry.js +288 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/retry.test.d.ts +6 -0
- package/dist/src/utils/retry.test.js +452 -0
- package/dist/src/utils/retry.test.js.map +1 -0
- package/dist/src/utils/safeJsonParse.d.ts +15 -0
- package/dist/src/utils/safeJsonParse.js +41 -0
- package/dist/src/utils/safeJsonParse.js.map +1 -0
- package/dist/src/utils/safeJsonParse.test.d.ts +6 -0
- package/dist/src/utils/safeJsonParse.test.js +112 -0
- package/dist/src/utils/safeJsonParse.test.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.d.ts +13 -0
- package/dist/src/utils/safeJsonStringify.js +25 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
- package/dist/src/utils/safeJsonStringify.test.js +61 -0
- package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
- package/dist/src/utils/schemaValidator.d.ts +15 -0
- package/dist/src/utils/schemaValidator.js +57 -0
- package/dist/src/utils/schemaValidator.js.map +1 -0
- package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
- package/dist/src/utils/secure-browser-launcher.js +165 -0
- package/dist/src/utils/secure-browser-launcher.js.map +1 -0
- package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
- package/dist/src/utils/secure-browser-launcher.test.js +149 -0
- package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
- package/dist/src/utils/session.d.ts +6 -0
- package/dist/src/utils/session.js +8 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +121 -0
- package/dist/src/utils/shell-utils.js +381 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/shell-utils.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.test.js +346 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -0
- package/dist/src/utils/shellReadOnlyChecker.d.ts +6 -0
- package/dist/src/utils/shellReadOnlyChecker.js +247 -0
- package/dist/src/utils/shellReadOnlyChecker.js.map +1 -0
- package/dist/src/utils/shellReadOnlyChecker.test.d.ts +6 -0
- package/dist/src/utils/shellReadOnlyChecker.test.js +47 -0
- package/dist/src/utils/shellReadOnlyChecker.test.js.map +1 -0
- package/dist/src/utils/subagentGenerator.d.ts +20 -0
- package/dist/src/utils/subagentGenerator.js +116 -0
- package/dist/src/utils/subagentGenerator.js.map +1 -0
- package/dist/src/utils/subagentGenerator.test.d.ts +6 -0
- package/dist/src/utils/subagentGenerator.test.js +158 -0
- package/dist/src/utils/subagentGenerator.test.js.map +1 -0
- package/dist/src/utils/summarizer.d.ts +25 -0
- package/dist/src/utils/summarizer.js +51 -0
- package/dist/src/utils/summarizer.js.map +1 -0
- package/dist/src/utils/summarizer.test.d.ts +6 -0
- package/dist/src/utils/summarizer.test.js +131 -0
- package/dist/src/utils/summarizer.test.js.map +1 -0
- package/dist/src/utils/systemEncoding.d.ts +40 -0
- package/dist/src/utils/systemEncoding.js +149 -0
- package/dist/src/utils/systemEncoding.js.map +1 -0
- package/dist/src/utils/systemEncoding.test.d.ts +6 -0
- package/dist/src/utils/systemEncoding.test.js +368 -0
- package/dist/src/utils/systemEncoding.test.js.map +1 -0
- package/dist/src/utils/testUtils.d.ts +29 -0
- package/dist/src/utils/testUtils.js +70 -0
- package/dist/src/utils/testUtils.js.map +1 -0
- package/dist/src/utils/textUtils.d.ts +13 -0
- package/dist/src/utils/textUtils.js +28 -0
- package/dist/src/utils/textUtils.js.map +1 -0
- package/dist/src/utils/tool-utils.d.ts +19 -0
- package/dist/src/utils/tool-utils.js +58 -0
- package/dist/src/utils/tool-utils.js.map +1 -0
- package/dist/src/utils/tool-utils.test.d.ts +6 -0
- package/dist/src/utils/tool-utils.test.js +61 -0
- package/dist/src/utils/tool-utils.test.js.map +1 -0
- package/dist/src/utils/userAccountManager.d.ts +20 -0
- package/dist/src/utils/userAccountManager.js +114 -0
- package/dist/src/utils/userAccountManager.js.map +1 -0
- package/dist/src/utils/userAccountManager.test.d.ts +6 -0
- package/dist/src/utils/userAccountManager.test.js +223 -0
- package/dist/src/utils/userAccountManager.test.js.map +1 -0
- package/dist/src/utils/workspaceContext.d.ts +66 -0
- package/dist/src/utils/workspaceContext.js +171 -0
- package/dist/src/utils/workspaceContext.js.map +1 -0
- package/dist/src/utils/workspaceContext.test.d.ts +6 -0
- package/dist/src/utils/workspaceContext.test.js +318 -0
- package/dist/src/utils/workspaceContext.test.js.map +1 -0
- package/dist/src/utils/yaml-parser.d.ts +29 -0
- package/dist/src/utils/yaml-parser.js +172 -0
- package/dist/src/utils/yaml-parser.js.map +1 -0
- package/dist/src/utils/yaml-parser.test.d.ts +6 -0
- package/dist/src/utils/yaml-parser.test.js +170 -0
- package/dist/src/utils/yaml-parser.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,826 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { ProxyAgent, setGlobalDispatcher } from 'undici';
|
|
7
|
+
import { ApprovalMode } from '../config/config.js';
|
|
8
|
+
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
9
|
+
import { ideContext } from '../ide/ideContext.js';
|
|
10
|
+
import { LoopDetectionService } from '../services/loopDetectionService.js';
|
|
11
|
+
import { logChatCompression, logNextSpeakerCheck, } from '../telemetry/loggers.js';
|
|
12
|
+
import { makeChatCompressionEvent, NextSpeakerCheckEvent, } from '../telemetry/types.js';
|
|
13
|
+
import { TaskTool } from '../tools/task.js';
|
|
14
|
+
import { getDirectoryContextString, getEnvironmentContext, } from '../utils/environmentContext.js';
|
|
15
|
+
import { reportError } from '../utils/errorReporting.js';
|
|
16
|
+
import { getErrorMessage } from '../utils/errors.js';
|
|
17
|
+
import { getFunctionCalls } from '../utils/generateContentResponseUtilities.js';
|
|
18
|
+
import { isFunctionResponse } from '../utils/messageInspectors.js';
|
|
19
|
+
import { checkNextSpeaker } from '../utils/nextSpeakerChecker.js';
|
|
20
|
+
import { retryWithBackoff } from '../utils/retry.js';
|
|
21
|
+
import { flatMapTextParts } from '../utils/partUtils.js';
|
|
22
|
+
import { AuthType, createContentGenerator } from './contentGenerator.js';
|
|
23
|
+
import { GeminiChat } from './geminiChat.js';
|
|
24
|
+
import { getCompressionPrompt, getCoreSystemPrompt, getCustomSystemPrompt, getPlanModeSystemReminder, getSubagentSystemReminder, } from './prompts.js';
|
|
25
|
+
import { tokenLimit } from './tokenLimits.js';
|
|
26
|
+
import { CompressionStatus, GeminiEventType, Turn } from './turn.js';
|
|
27
|
+
function isThinkingSupported(model) {
|
|
28
|
+
if (model.startsWith('gemini-2.5'))
|
|
29
|
+
return true;
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the index of the content after the fraction of the total characters in the history.
|
|
34
|
+
*
|
|
35
|
+
* Exported for testing purposes.
|
|
36
|
+
*/
|
|
37
|
+
export function findIndexAfterFraction(history, fraction) {
|
|
38
|
+
if (fraction <= 0 || fraction >= 1) {
|
|
39
|
+
throw new Error('Fraction must be between 0 and 1');
|
|
40
|
+
}
|
|
41
|
+
const contentLengths = history.map((content) => JSON.stringify(content).length);
|
|
42
|
+
const totalCharacters = contentLengths.reduce((sum, length) => sum + length, 0);
|
|
43
|
+
const targetCharacters = totalCharacters * fraction;
|
|
44
|
+
let charactersSoFar = 0;
|
|
45
|
+
for (let i = 0; i < contentLengths.length; i++) {
|
|
46
|
+
charactersSoFar += contentLengths[i];
|
|
47
|
+
if (charactersSoFar >= targetCharacters) {
|
|
48
|
+
return i;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return contentLengths.length;
|
|
52
|
+
}
|
|
53
|
+
const MAX_TURNS = 100;
|
|
54
|
+
/**
|
|
55
|
+
* Threshold for compression token count as a fraction of the model's token limit.
|
|
56
|
+
* If the chat history exceeds this threshold, it will be compressed.
|
|
57
|
+
*/
|
|
58
|
+
const COMPRESSION_TOKEN_THRESHOLD = 0.7;
|
|
59
|
+
/**
|
|
60
|
+
* The fraction of the latest chat history to keep. A value of 0.3
|
|
61
|
+
* means that only the last 30% of the chat history will be kept after compression.
|
|
62
|
+
*/
|
|
63
|
+
const COMPRESSION_PRESERVE_THRESHOLD = 0.3;
|
|
64
|
+
export class GeminiClient {
|
|
65
|
+
config;
|
|
66
|
+
chat;
|
|
67
|
+
contentGenerator;
|
|
68
|
+
embeddingModel;
|
|
69
|
+
generateContentConfig = {
|
|
70
|
+
temperature: 0,
|
|
71
|
+
topP: 1,
|
|
72
|
+
};
|
|
73
|
+
sessionTurnCount = 0;
|
|
74
|
+
loopDetector;
|
|
75
|
+
lastPromptId;
|
|
76
|
+
lastSentIdeContext;
|
|
77
|
+
forceFullIdeContext = true;
|
|
78
|
+
/**
|
|
79
|
+
* At any point in this conversation, was compression triggered without
|
|
80
|
+
* being forced and did it fail?
|
|
81
|
+
*/
|
|
82
|
+
hasFailedCompressionAttempt = false;
|
|
83
|
+
constructor(config) {
|
|
84
|
+
this.config = config;
|
|
85
|
+
if (config.getProxy()) {
|
|
86
|
+
setGlobalDispatcher(new ProxyAgent(config.getProxy()));
|
|
87
|
+
}
|
|
88
|
+
this.embeddingModel = config.getEmbeddingModel();
|
|
89
|
+
this.loopDetector = new LoopDetectionService(config);
|
|
90
|
+
this.lastPromptId = this.config.getSessionId();
|
|
91
|
+
}
|
|
92
|
+
async initialize(contentGeneratorConfig, extraHistory) {
|
|
93
|
+
this.contentGenerator = await createContentGenerator(contentGeneratorConfig, this.config, this.config.getSessionId());
|
|
94
|
+
/**
|
|
95
|
+
* Always take the model from contentGeneratorConfig to initialize,
|
|
96
|
+
* despite the `this.config.contentGeneratorConfig` is not updated yet because in
|
|
97
|
+
* `Config` it will not be updated until the initialization is successful.
|
|
98
|
+
*/
|
|
99
|
+
this.chat = await this.startChat(extraHistory || [], contentGeneratorConfig.model);
|
|
100
|
+
}
|
|
101
|
+
getContentGenerator() {
|
|
102
|
+
if (!this.contentGenerator) {
|
|
103
|
+
throw new Error('Content generator not initialized');
|
|
104
|
+
}
|
|
105
|
+
return this.contentGenerator;
|
|
106
|
+
}
|
|
107
|
+
getUserTier() {
|
|
108
|
+
return this.contentGenerator?.userTier;
|
|
109
|
+
}
|
|
110
|
+
async addHistory(content) {
|
|
111
|
+
this.getChat().addHistory(content);
|
|
112
|
+
}
|
|
113
|
+
getChat() {
|
|
114
|
+
if (!this.chat) {
|
|
115
|
+
throw new Error('Chat not initialized');
|
|
116
|
+
}
|
|
117
|
+
return this.chat;
|
|
118
|
+
}
|
|
119
|
+
isInitialized() {
|
|
120
|
+
return this.chat !== undefined && this.contentGenerator !== undefined;
|
|
121
|
+
}
|
|
122
|
+
getHistory() {
|
|
123
|
+
return this.getChat().getHistory();
|
|
124
|
+
}
|
|
125
|
+
setHistory(history, { stripThoughts = false } = {}) {
|
|
126
|
+
const historyToSet = stripThoughts
|
|
127
|
+
? history.map((content) => {
|
|
128
|
+
const newContent = { ...content };
|
|
129
|
+
if (newContent.parts) {
|
|
130
|
+
newContent.parts = newContent.parts.map((part) => {
|
|
131
|
+
if (part &&
|
|
132
|
+
typeof part === 'object' &&
|
|
133
|
+
'thoughtSignature' in part) {
|
|
134
|
+
const newPart = { ...part };
|
|
135
|
+
delete newPart
|
|
136
|
+
.thoughtSignature;
|
|
137
|
+
return newPart;
|
|
138
|
+
}
|
|
139
|
+
return part;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return newContent;
|
|
143
|
+
})
|
|
144
|
+
: history;
|
|
145
|
+
this.getChat().setHistory(historyToSet);
|
|
146
|
+
this.forceFullIdeContext = true;
|
|
147
|
+
}
|
|
148
|
+
async setTools() {
|
|
149
|
+
const toolRegistry = this.config.getToolRegistry();
|
|
150
|
+
const toolDeclarations = toolRegistry.getFunctionDeclarations();
|
|
151
|
+
const tools = [{ functionDeclarations: toolDeclarations }];
|
|
152
|
+
this.getChat().setTools(tools);
|
|
153
|
+
}
|
|
154
|
+
async resetChat() {
|
|
155
|
+
this.chat = await this.startChat();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Reinitializes the chat with the current contentGeneratorConfig while preserving chat history.
|
|
159
|
+
* This creates a new chat object using the existing history and updated configuration.
|
|
160
|
+
* Should be called when configuration changes (model, auth, etc.) to ensure consistency.
|
|
161
|
+
*/
|
|
162
|
+
async reinitialize() {
|
|
163
|
+
if (!this.chat) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Preserve the current chat history (excluding environment context)
|
|
167
|
+
const currentHistory = this.getHistory();
|
|
168
|
+
// Remove the initial environment context (first 2 messages: user env + model acknowledgment)
|
|
169
|
+
const userHistory = currentHistory.slice(2);
|
|
170
|
+
// Get current content generator config and reinitialize with preserved history
|
|
171
|
+
const contentGeneratorConfig = this.config.getContentGeneratorConfig();
|
|
172
|
+
if (contentGeneratorConfig) {
|
|
173
|
+
await this.initialize(contentGeneratorConfig, userHistory);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async addDirectoryContext() {
|
|
177
|
+
if (!this.chat) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
this.getChat().addHistory({
|
|
181
|
+
role: 'user',
|
|
182
|
+
parts: [{ text: await getDirectoryContextString(this.config) }],
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async startChat(extraHistory, model) {
|
|
186
|
+
this.forceFullIdeContext = true;
|
|
187
|
+
this.hasFailedCompressionAttempt = false;
|
|
188
|
+
const envParts = await getEnvironmentContext(this.config);
|
|
189
|
+
const toolRegistry = this.config.getToolRegistry();
|
|
190
|
+
const toolDeclarations = toolRegistry.getFunctionDeclarations();
|
|
191
|
+
const tools = [{ functionDeclarations: toolDeclarations }];
|
|
192
|
+
const history = [
|
|
193
|
+
{
|
|
194
|
+
role: 'user',
|
|
195
|
+
parts: envParts,
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
role: 'model',
|
|
199
|
+
parts: [{ text: 'Got it. Thanks for the context!' }],
|
|
200
|
+
},
|
|
201
|
+
...(extraHistory ?? []),
|
|
202
|
+
];
|
|
203
|
+
try {
|
|
204
|
+
const userMemory = this.config.getUserMemory();
|
|
205
|
+
const systemInstruction = getCoreSystemPrompt(userMemory, {}, model || this.config.getModel());
|
|
206
|
+
const generateContentConfigWithThinking = isThinkingSupported(model || this.config.getModel())
|
|
207
|
+
? {
|
|
208
|
+
...this.generateContentConfig,
|
|
209
|
+
thinkingConfig: {
|
|
210
|
+
thinkingBudget: -1,
|
|
211
|
+
includeThoughts: true,
|
|
212
|
+
},
|
|
213
|
+
}
|
|
214
|
+
: this.generateContentConfig;
|
|
215
|
+
return new GeminiChat(this.config, this.getContentGenerator(), {
|
|
216
|
+
systemInstruction,
|
|
217
|
+
...generateContentConfigWithThinking,
|
|
218
|
+
tools,
|
|
219
|
+
}, history);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
await reportError(error, 'Error initializing Gemini chat session.', history, 'startChat');
|
|
223
|
+
throw new Error(`Failed to initialize chat: ${getErrorMessage(error)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
getIdeContextParts(forceFullContext) {
|
|
227
|
+
const currentIdeContext = ideContext.getIdeContext();
|
|
228
|
+
if (!currentIdeContext) {
|
|
229
|
+
return { contextParts: [], newIdeContext: undefined };
|
|
230
|
+
}
|
|
231
|
+
if (forceFullContext || !this.lastSentIdeContext) {
|
|
232
|
+
// Send full context as JSON
|
|
233
|
+
const openFiles = currentIdeContext.workspaceState?.openFiles || [];
|
|
234
|
+
const activeFile = openFiles.find((f) => f.isActive);
|
|
235
|
+
const otherOpenFiles = openFiles
|
|
236
|
+
.filter((f) => !f.isActive)
|
|
237
|
+
.map((f) => f.path);
|
|
238
|
+
const contextData = {};
|
|
239
|
+
if (activeFile) {
|
|
240
|
+
contextData['activeFile'] = {
|
|
241
|
+
path: activeFile.path,
|
|
242
|
+
cursor: activeFile.cursor
|
|
243
|
+
? {
|
|
244
|
+
line: activeFile.cursor.line,
|
|
245
|
+
character: activeFile.cursor.character,
|
|
246
|
+
}
|
|
247
|
+
: undefined,
|
|
248
|
+
selectedText: activeFile.selectedText || undefined,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
if (otherOpenFiles.length > 0) {
|
|
252
|
+
contextData['otherOpenFiles'] = otherOpenFiles;
|
|
253
|
+
}
|
|
254
|
+
if (Object.keys(contextData).length === 0) {
|
|
255
|
+
return { contextParts: [], newIdeContext: currentIdeContext };
|
|
256
|
+
}
|
|
257
|
+
const jsonString = JSON.stringify(contextData, null, 2);
|
|
258
|
+
const contextParts = [
|
|
259
|
+
"Here is the user's editor context as a JSON object. This is for your information only.",
|
|
260
|
+
'```json',
|
|
261
|
+
jsonString,
|
|
262
|
+
'```',
|
|
263
|
+
];
|
|
264
|
+
if (this.config.getDebugMode()) {
|
|
265
|
+
console.log(contextParts.join('\n'));
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
contextParts,
|
|
269
|
+
newIdeContext: currentIdeContext,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
// Calculate and send delta as JSON
|
|
274
|
+
const delta = {};
|
|
275
|
+
const changes = {};
|
|
276
|
+
const lastFiles = new Map((this.lastSentIdeContext.workspaceState?.openFiles || []).map((f) => [f.path, f]));
|
|
277
|
+
const currentFiles = new Map((currentIdeContext.workspaceState?.openFiles || []).map((f) => [
|
|
278
|
+
f.path,
|
|
279
|
+
f,
|
|
280
|
+
]));
|
|
281
|
+
const openedFiles = [];
|
|
282
|
+
for (const [path] of currentFiles.entries()) {
|
|
283
|
+
if (!lastFiles.has(path)) {
|
|
284
|
+
openedFiles.push(path);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (openedFiles.length > 0) {
|
|
288
|
+
changes['filesOpened'] = openedFiles;
|
|
289
|
+
}
|
|
290
|
+
const closedFiles = [];
|
|
291
|
+
for (const [path] of lastFiles.entries()) {
|
|
292
|
+
if (!currentFiles.has(path)) {
|
|
293
|
+
closedFiles.push(path);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (closedFiles.length > 0) {
|
|
297
|
+
changes['filesClosed'] = closedFiles;
|
|
298
|
+
}
|
|
299
|
+
const lastActiveFile = (this.lastSentIdeContext.workspaceState?.openFiles || []).find((f) => f.isActive);
|
|
300
|
+
const currentActiveFile = (currentIdeContext.workspaceState?.openFiles || []).find((f) => f.isActive);
|
|
301
|
+
if (currentActiveFile) {
|
|
302
|
+
if (!lastActiveFile || lastActiveFile.path !== currentActiveFile.path) {
|
|
303
|
+
changes['activeFileChanged'] = {
|
|
304
|
+
path: currentActiveFile.path,
|
|
305
|
+
cursor: currentActiveFile.cursor
|
|
306
|
+
? {
|
|
307
|
+
line: currentActiveFile.cursor.line,
|
|
308
|
+
character: currentActiveFile.cursor.character,
|
|
309
|
+
}
|
|
310
|
+
: undefined,
|
|
311
|
+
selectedText: currentActiveFile.selectedText || undefined,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const lastCursor = lastActiveFile.cursor;
|
|
316
|
+
const currentCursor = currentActiveFile.cursor;
|
|
317
|
+
if (currentCursor &&
|
|
318
|
+
(!lastCursor ||
|
|
319
|
+
lastCursor.line !== currentCursor.line ||
|
|
320
|
+
lastCursor.character !== currentCursor.character)) {
|
|
321
|
+
changes['cursorMoved'] = {
|
|
322
|
+
path: currentActiveFile.path,
|
|
323
|
+
cursor: {
|
|
324
|
+
line: currentCursor.line,
|
|
325
|
+
character: currentCursor.character,
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const lastSelectedText = lastActiveFile.selectedText || '';
|
|
330
|
+
const currentSelectedText = currentActiveFile.selectedText || '';
|
|
331
|
+
if (lastSelectedText !== currentSelectedText) {
|
|
332
|
+
changes['selectionChanged'] = {
|
|
333
|
+
path: currentActiveFile.path,
|
|
334
|
+
selectedText: currentSelectedText,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else if (lastActiveFile) {
|
|
340
|
+
changes['activeFileChanged'] = {
|
|
341
|
+
path: null,
|
|
342
|
+
previousPath: lastActiveFile.path,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
if (Object.keys(changes).length === 0) {
|
|
346
|
+
return { contextParts: [], newIdeContext: currentIdeContext };
|
|
347
|
+
}
|
|
348
|
+
delta['changes'] = changes;
|
|
349
|
+
const jsonString = JSON.stringify(delta, null, 2);
|
|
350
|
+
const contextParts = [
|
|
351
|
+
"Here is a summary of changes in the user's editor context, in JSON format. This is for your information only.",
|
|
352
|
+
'```json',
|
|
353
|
+
jsonString,
|
|
354
|
+
'```',
|
|
355
|
+
];
|
|
356
|
+
if (this.config.getDebugMode()) {
|
|
357
|
+
console.log(contextParts.join('\n'));
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
contextParts,
|
|
361
|
+
newIdeContext: currentIdeContext,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async *sendMessageStream(request, signal, prompt_id, turns = MAX_TURNS, originalModel) {
|
|
366
|
+
const isNewPrompt = this.lastPromptId !== prompt_id;
|
|
367
|
+
if (isNewPrompt) {
|
|
368
|
+
this.loopDetector.reset(prompt_id);
|
|
369
|
+
this.lastPromptId = prompt_id;
|
|
370
|
+
}
|
|
371
|
+
this.sessionTurnCount++;
|
|
372
|
+
if (this.config.getMaxSessionTurns() > 0 &&
|
|
373
|
+
this.sessionTurnCount > this.config.getMaxSessionTurns()) {
|
|
374
|
+
yield { type: GeminiEventType.MaxSessionTurns };
|
|
375
|
+
return new Turn(this.getChat(), prompt_id);
|
|
376
|
+
}
|
|
377
|
+
// Ensure turns never exceeds MAX_TURNS to prevent infinite loops
|
|
378
|
+
const boundedTurns = Math.min(turns, MAX_TURNS);
|
|
379
|
+
if (!boundedTurns) {
|
|
380
|
+
return new Turn(this.getChat(), prompt_id);
|
|
381
|
+
}
|
|
382
|
+
// Track the original model from the first call to detect model switching
|
|
383
|
+
const initialModel = originalModel || this.config.getModel();
|
|
384
|
+
const compressed = await this.tryCompressChat(prompt_id);
|
|
385
|
+
if (compressed.compressionStatus === CompressionStatus.COMPRESSED) {
|
|
386
|
+
yield { type: GeminiEventType.ChatCompressed, value: compressed };
|
|
387
|
+
}
|
|
388
|
+
// Check session token limit after compression using accurate token counting
|
|
389
|
+
const sessionTokenLimit = this.config.getSessionTokenLimit();
|
|
390
|
+
if (sessionTokenLimit > 0) {
|
|
391
|
+
// Get all the content that would be sent in an API call
|
|
392
|
+
const currentHistory = this.getChat().getHistory(true);
|
|
393
|
+
const userMemory = this.config.getUserMemory();
|
|
394
|
+
const systemPrompt = getCoreSystemPrompt(userMemory, {}, this.config.getModel());
|
|
395
|
+
const environment = await getEnvironmentContext(this.config);
|
|
396
|
+
// Create a mock request content to count total tokens
|
|
397
|
+
const mockRequestContent = [
|
|
398
|
+
{
|
|
399
|
+
role: 'system',
|
|
400
|
+
parts: [{ text: systemPrompt }, ...environment],
|
|
401
|
+
},
|
|
402
|
+
...currentHistory,
|
|
403
|
+
];
|
|
404
|
+
// Use the improved countTokens method for accurate counting
|
|
405
|
+
const { totalTokens: totalRequestTokens } = await this.getContentGenerator().countTokens({
|
|
406
|
+
model: this.config.getModel(),
|
|
407
|
+
contents: mockRequestContent,
|
|
408
|
+
});
|
|
409
|
+
if (totalRequestTokens !== undefined &&
|
|
410
|
+
totalRequestTokens > sessionTokenLimit) {
|
|
411
|
+
yield {
|
|
412
|
+
type: GeminiEventType.SessionTokenLimitExceeded,
|
|
413
|
+
value: {
|
|
414
|
+
currentTokens: totalRequestTokens,
|
|
415
|
+
limit: sessionTokenLimit,
|
|
416
|
+
message: `Session token limit exceeded: ${totalRequestTokens} tokens > ${sessionTokenLimit} limit. ` +
|
|
417
|
+
'Please start a new session or increase the sessionTokenLimit in your settings.json.',
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
return new Turn(this.getChat(), prompt_id);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// Prevent context updates from being sent while a tool call is
|
|
424
|
+
// waiting for a response. The Blackbox API requires that a functionResponse
|
|
425
|
+
// part from the user immediately follows a functionCall part from the model
|
|
426
|
+
// in the conversation history . The IDE context is not discarded; it will
|
|
427
|
+
// be included in the next regular message sent to the model.
|
|
428
|
+
const history = this.getHistory();
|
|
429
|
+
const lastMessage = history.length > 0 ? history[history.length - 1] : undefined;
|
|
430
|
+
const hasPendingToolCall = !!lastMessage &&
|
|
431
|
+
lastMessage.role === 'model' &&
|
|
432
|
+
(lastMessage.parts?.some((p) => 'functionCall' in p) || false);
|
|
433
|
+
if (this.config.getIdeMode() && !hasPendingToolCall) {
|
|
434
|
+
const { contextParts, newIdeContext } = this.getIdeContextParts(this.forceFullIdeContext || history.length === 0);
|
|
435
|
+
if (contextParts.length > 0) {
|
|
436
|
+
this.getChat().addHistory({
|
|
437
|
+
role: 'user',
|
|
438
|
+
parts: [{ text: contextParts.join('\n') }],
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
this.lastSentIdeContext = newIdeContext;
|
|
442
|
+
this.forceFullIdeContext = false;
|
|
443
|
+
}
|
|
444
|
+
const turn = new Turn(this.getChat(), prompt_id);
|
|
445
|
+
if (!this.config.getSkipLoopDetection()) {
|
|
446
|
+
const loopDetected = await this.loopDetector.turnStarted(signal);
|
|
447
|
+
if (loopDetected) {
|
|
448
|
+
yield { type: GeminiEventType.LoopDetected };
|
|
449
|
+
return turn;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
// append system reminders to the request
|
|
453
|
+
let requestToSent = await flatMapTextParts(request, async (text) => [text]);
|
|
454
|
+
if (isNewPrompt) {
|
|
455
|
+
const systemReminders = [];
|
|
456
|
+
// add subagent system reminder if there are subagents
|
|
457
|
+
const hasTaskTool = this.config.getToolRegistry().getTool(TaskTool.Name);
|
|
458
|
+
const subagents = (await this.config.getSubagentManager().listSubagents())
|
|
459
|
+
.filter((subagent) => subagent.level !== 'builtin')
|
|
460
|
+
.map((subagent) => subagent.name);
|
|
461
|
+
if (hasTaskTool && subagents.length > 0) {
|
|
462
|
+
systemReminders.push(getSubagentSystemReminder(subagents));
|
|
463
|
+
}
|
|
464
|
+
// add plan mode system reminder if approval mode is plan
|
|
465
|
+
if (this.config.getApprovalMode() === ApprovalMode.PLAN) {
|
|
466
|
+
systemReminders.push(getPlanModeSystemReminder());
|
|
467
|
+
}
|
|
468
|
+
requestToSent = [...systemReminders, ...requestToSent];
|
|
469
|
+
}
|
|
470
|
+
const resultStream = turn.run(requestToSent, signal);
|
|
471
|
+
for await (const event of resultStream) {
|
|
472
|
+
if (!this.config.getSkipLoopDetection()) {
|
|
473
|
+
if (this.loopDetector.addAndCheck(event)) {
|
|
474
|
+
yield { type: GeminiEventType.LoopDetected };
|
|
475
|
+
return turn;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
yield event;
|
|
479
|
+
if (event.type === GeminiEventType.Error) {
|
|
480
|
+
return turn;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if (!turn.pendingToolCalls.length && signal && !signal.aborted) {
|
|
484
|
+
// Check if model was switched during the call (likely due to quota error)
|
|
485
|
+
const currentModel = this.config.getModel();
|
|
486
|
+
if (currentModel !== initialModel) {
|
|
487
|
+
// Model was switched (likely due to quota error fallback)
|
|
488
|
+
// Don't continue with recursive call to prevent unwanted Flash execution
|
|
489
|
+
return turn;
|
|
490
|
+
}
|
|
491
|
+
if (this.config.getSkipNextSpeakerCheck()) {
|
|
492
|
+
return turn;
|
|
493
|
+
}
|
|
494
|
+
const nextSpeakerCheck = await checkNextSpeaker(this.getChat(), this, signal);
|
|
495
|
+
logNextSpeakerCheck(this.config, new NextSpeakerCheckEvent(prompt_id, turn.finishReason?.toString() || '', nextSpeakerCheck?.next_speaker || ''));
|
|
496
|
+
if (nextSpeakerCheck?.next_speaker === 'model') {
|
|
497
|
+
const nextRequest = [{ text: 'Please continue.' }];
|
|
498
|
+
// This recursive call's events will be yielded out, but the final
|
|
499
|
+
// turn object will be from the top-level call.
|
|
500
|
+
yield* this.sendMessageStream(nextRequest, signal, prompt_id, boundedTurns - 1, initialModel);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return turn;
|
|
504
|
+
}
|
|
505
|
+
async generateJson(contents, schema, abortSignal, model, config = {}) {
|
|
506
|
+
/**
|
|
507
|
+
* TODO: ensure `model` consistency among GeminiClient, GeminiChat, and ContentGenerator
|
|
508
|
+
* `model` passed to generateContent is not respected as we always use contentGenerator
|
|
509
|
+
* We should ignore model for now because some calls use `DEFAULT_GEMINI_FLASH_MODEL`
|
|
510
|
+
* which is not available as `blackbox3-coder-flash`
|
|
511
|
+
*/
|
|
512
|
+
const modelToUse = this.config.getModel() || DEFAULT_GEMINI_FLASH_MODEL;
|
|
513
|
+
try {
|
|
514
|
+
const userMemory = this.config.getUserMemory();
|
|
515
|
+
const finalSystemInstruction = config.systemInstruction
|
|
516
|
+
? getCustomSystemPrompt(config.systemInstruction, userMemory)
|
|
517
|
+
: getCoreSystemPrompt(userMemory, {}, modelToUse);
|
|
518
|
+
const requestConfig = {
|
|
519
|
+
abortSignal,
|
|
520
|
+
...this.generateContentConfig,
|
|
521
|
+
...config,
|
|
522
|
+
systemInstruction: finalSystemInstruction,
|
|
523
|
+
};
|
|
524
|
+
// Convert schema to function declaration
|
|
525
|
+
const functionDeclaration = {
|
|
526
|
+
name: 'respond_in_schema',
|
|
527
|
+
description: 'Provide the response in provided schema',
|
|
528
|
+
parameters: schema,
|
|
529
|
+
};
|
|
530
|
+
const tools = [
|
|
531
|
+
{
|
|
532
|
+
functionDeclarations: [functionDeclaration],
|
|
533
|
+
},
|
|
534
|
+
];
|
|
535
|
+
const apiCall = () => this.getContentGenerator().generateContent({
|
|
536
|
+
model: modelToUse,
|
|
537
|
+
config: {
|
|
538
|
+
...requestConfig,
|
|
539
|
+
tools,
|
|
540
|
+
},
|
|
541
|
+
contents,
|
|
542
|
+
}, this.lastPromptId);
|
|
543
|
+
const result = await retryWithBackoff(apiCall, {
|
|
544
|
+
onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
|
|
545
|
+
authType: this.config.getContentGeneratorConfig()?.authType,
|
|
546
|
+
});
|
|
547
|
+
const functionCalls = getFunctionCalls(result);
|
|
548
|
+
if (functionCalls && functionCalls.length > 0) {
|
|
549
|
+
const functionCall = functionCalls.find((call) => call.name === 'respond_in_schema');
|
|
550
|
+
if (functionCall && functionCall.args) {
|
|
551
|
+
return functionCall.args;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
return {};
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
if (abortSignal.aborted) {
|
|
558
|
+
throw error;
|
|
559
|
+
}
|
|
560
|
+
// Avoid double reporting for the empty response case handled above
|
|
561
|
+
if (error instanceof Error &&
|
|
562
|
+
error.message === 'API returned an empty response for generateJson.') {
|
|
563
|
+
throw error;
|
|
564
|
+
}
|
|
565
|
+
await reportError(error, 'Error generating JSON content via API.', contents, 'generateJson-api');
|
|
566
|
+
throw new Error(`Failed to generate JSON content: ${getErrorMessage(error)}`);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
async generateContent(contents, generationConfig, abortSignal, model) {
|
|
570
|
+
const modelToUse = model ?? this.config.getModel();
|
|
571
|
+
const configToUse = {
|
|
572
|
+
...this.generateContentConfig,
|
|
573
|
+
...generationConfig,
|
|
574
|
+
};
|
|
575
|
+
try {
|
|
576
|
+
const userMemory = this.config.getUserMemory();
|
|
577
|
+
const finalSystemInstruction = generationConfig.systemInstruction
|
|
578
|
+
? getCustomSystemPrompt(generationConfig.systemInstruction, userMemory)
|
|
579
|
+
: getCoreSystemPrompt(userMemory, {}, this.config.getModel());
|
|
580
|
+
const requestConfig = {
|
|
581
|
+
abortSignal,
|
|
582
|
+
...configToUse,
|
|
583
|
+
systemInstruction: finalSystemInstruction,
|
|
584
|
+
};
|
|
585
|
+
const apiCall = () => this.getContentGenerator().generateContent({
|
|
586
|
+
model: modelToUse,
|
|
587
|
+
config: requestConfig,
|
|
588
|
+
contents,
|
|
589
|
+
}, this.lastPromptId);
|
|
590
|
+
const result = await retryWithBackoff(apiCall, {
|
|
591
|
+
onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
|
|
592
|
+
authType: this.config.getContentGeneratorConfig()?.authType,
|
|
593
|
+
});
|
|
594
|
+
return result;
|
|
595
|
+
}
|
|
596
|
+
catch (error) {
|
|
597
|
+
if (abortSignal.aborted) {
|
|
598
|
+
throw error;
|
|
599
|
+
}
|
|
600
|
+
await reportError(error, `Error generating content via API with model ${modelToUse}.`, {
|
|
601
|
+
requestContents: contents,
|
|
602
|
+
requestConfig: configToUse,
|
|
603
|
+
}, 'generateContent-api');
|
|
604
|
+
throw new Error(`Failed to generate content with model ${modelToUse}: ${getErrorMessage(error)}`);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
async generateEmbedding(texts) {
|
|
608
|
+
if (!texts || texts.length === 0) {
|
|
609
|
+
return [];
|
|
610
|
+
}
|
|
611
|
+
const embedModelParams = {
|
|
612
|
+
model: this.embeddingModel,
|
|
613
|
+
contents: texts,
|
|
614
|
+
};
|
|
615
|
+
const embedContentResponse = await this.getContentGenerator().embedContent(embedModelParams);
|
|
616
|
+
if (!embedContentResponse.embeddings ||
|
|
617
|
+
embedContentResponse.embeddings.length === 0) {
|
|
618
|
+
throw new Error('No embeddings found in API response.');
|
|
619
|
+
}
|
|
620
|
+
if (embedContentResponse.embeddings.length !== texts.length) {
|
|
621
|
+
throw new Error(`API returned a mismatched number of embeddings. Expected ${texts.length}, got ${embedContentResponse.embeddings.length}.`);
|
|
622
|
+
}
|
|
623
|
+
return embedContentResponse.embeddings.map((embedding, index) => {
|
|
624
|
+
const values = embedding.values;
|
|
625
|
+
if (!values || values.length === 0) {
|
|
626
|
+
throw new Error(`API returned an empty embedding for input text at index ${index}: "${texts[index]}"`);
|
|
627
|
+
}
|
|
628
|
+
return values;
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
async tryCompressChat(prompt_id, force = false) {
|
|
632
|
+
const curatedHistory = this.getChat().getHistory(true);
|
|
633
|
+
// Regardless of `force`, don't do anything if the history is empty.
|
|
634
|
+
if (curatedHistory.length === 0 ||
|
|
635
|
+
(this.hasFailedCompressionAttempt && !force)) {
|
|
636
|
+
return {
|
|
637
|
+
originalTokenCount: 0,
|
|
638
|
+
newTokenCount: 0,
|
|
639
|
+
compressionStatus: CompressionStatus.NOOP,
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
const model = this.config.getModel();
|
|
643
|
+
const { totalTokens: originalTokenCount } = await this.getContentGenerator().countTokens({
|
|
644
|
+
model,
|
|
645
|
+
contents: curatedHistory,
|
|
646
|
+
});
|
|
647
|
+
if (originalTokenCount === undefined) {
|
|
648
|
+
console.warn(`Could not determine token count for model ${model}.`);
|
|
649
|
+
this.hasFailedCompressionAttempt = !force && true;
|
|
650
|
+
return {
|
|
651
|
+
originalTokenCount: 0,
|
|
652
|
+
newTokenCount: 0,
|
|
653
|
+
compressionStatus: CompressionStatus.COMPRESSION_FAILED_TOKEN_COUNT_ERROR,
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
const contextPercentageThreshold = this.config.getChatCompression()?.contextPercentageThreshold;
|
|
657
|
+
// Don't compress if not forced and we are under the limit.
|
|
658
|
+
if (!force) {
|
|
659
|
+
const threshold = contextPercentageThreshold ?? COMPRESSION_TOKEN_THRESHOLD;
|
|
660
|
+
if (originalTokenCount < threshold * tokenLimit(model)) {
|
|
661
|
+
return {
|
|
662
|
+
originalTokenCount,
|
|
663
|
+
newTokenCount: originalTokenCount,
|
|
664
|
+
compressionStatus: CompressionStatus.NOOP,
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
let compressBeforeIndex = findIndexAfterFraction(curatedHistory, 1 - COMPRESSION_PRESERVE_THRESHOLD);
|
|
669
|
+
// Find the first user message after the index. This is the start of the next turn.
|
|
670
|
+
while (compressBeforeIndex < curatedHistory.length &&
|
|
671
|
+
(curatedHistory[compressBeforeIndex]?.role === 'model' ||
|
|
672
|
+
isFunctionResponse(curatedHistory[compressBeforeIndex]))) {
|
|
673
|
+
compressBeforeIndex++;
|
|
674
|
+
}
|
|
675
|
+
const historyToCompress = curatedHistory.slice(0, compressBeforeIndex);
|
|
676
|
+
const historyToKeep = curatedHistory.slice(compressBeforeIndex);
|
|
677
|
+
this.getChat().setHistory(historyToCompress);
|
|
678
|
+
const { text: summary } = await this.getChat().sendMessage({
|
|
679
|
+
message: {
|
|
680
|
+
text: 'First, reason in your scratchpad. Then, generate the <state_snapshot>.',
|
|
681
|
+
},
|
|
682
|
+
config: {
|
|
683
|
+
systemInstruction: { text: getCompressionPrompt() },
|
|
684
|
+
maxOutputTokens: originalTokenCount,
|
|
685
|
+
},
|
|
686
|
+
}, prompt_id);
|
|
687
|
+
const chat = await this.startChat([
|
|
688
|
+
{
|
|
689
|
+
role: 'user',
|
|
690
|
+
parts: [{ text: summary }],
|
|
691
|
+
},
|
|
692
|
+
{
|
|
693
|
+
role: 'model',
|
|
694
|
+
parts: [{ text: 'Got it. Thanks for the additional context!' }],
|
|
695
|
+
},
|
|
696
|
+
...historyToKeep,
|
|
697
|
+
]);
|
|
698
|
+
this.forceFullIdeContext = true;
|
|
699
|
+
const { totalTokens: newTokenCount } = await this.getContentGenerator().countTokens({
|
|
700
|
+
// model might change after calling `sendMessage`, so we get the newest value from config
|
|
701
|
+
model: this.config.getModel(),
|
|
702
|
+
contents: chat.getHistory(),
|
|
703
|
+
});
|
|
704
|
+
if (newTokenCount === undefined) {
|
|
705
|
+
console.warn('Could not determine compressed history token count.');
|
|
706
|
+
this.hasFailedCompressionAttempt = !force && true;
|
|
707
|
+
return {
|
|
708
|
+
originalTokenCount,
|
|
709
|
+
newTokenCount: originalTokenCount,
|
|
710
|
+
compressionStatus: CompressionStatus.COMPRESSION_FAILED_TOKEN_COUNT_ERROR,
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
logChatCompression(this.config, makeChatCompressionEvent({
|
|
714
|
+
tokens_before: originalTokenCount,
|
|
715
|
+
tokens_after: newTokenCount,
|
|
716
|
+
}));
|
|
717
|
+
if (newTokenCount > originalTokenCount) {
|
|
718
|
+
this.getChat().setHistory(curatedHistory);
|
|
719
|
+
this.hasFailedCompressionAttempt = !force && true;
|
|
720
|
+
return {
|
|
721
|
+
originalTokenCount,
|
|
722
|
+
newTokenCount,
|
|
723
|
+
compressionStatus: CompressionStatus.COMPRESSION_FAILED_INFLATED_TOKEN_COUNT,
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
else {
|
|
727
|
+
this.chat = chat; // Chat compression successful, set new state.
|
|
728
|
+
}
|
|
729
|
+
logChatCompression(this.config, makeChatCompressionEvent({
|
|
730
|
+
tokens_before: originalTokenCount,
|
|
731
|
+
tokens_after: newTokenCount,
|
|
732
|
+
}));
|
|
733
|
+
return {
|
|
734
|
+
originalTokenCount,
|
|
735
|
+
newTokenCount,
|
|
736
|
+
compressionStatus: CompressionStatus.COMPRESSED,
|
|
737
|
+
};
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
|
|
741
|
+
* Uses a fallback handler if provided by the config; otherwise, returns null.
|
|
742
|
+
*/
|
|
743
|
+
async handleFlashFallback(authType, error) {
|
|
744
|
+
// Handle different auth types
|
|
745
|
+
if (authType === AuthType.BLACKBOX_OAUTH) {
|
|
746
|
+
return this.handleBlackboxOAuthError(error);
|
|
747
|
+
}
|
|
748
|
+
// Only handle fallback for OAuth users
|
|
749
|
+
if (authType !== AuthType.LOGIN_WITH_GOOGLE) {
|
|
750
|
+
return null;
|
|
751
|
+
}
|
|
752
|
+
const currentModel = this.config.getModel();
|
|
753
|
+
const fallbackModel = DEFAULT_GEMINI_FLASH_MODEL;
|
|
754
|
+
// Don't fallback if already using Flash model
|
|
755
|
+
if (currentModel === fallbackModel) {
|
|
756
|
+
return null;
|
|
757
|
+
}
|
|
758
|
+
// Check if config has a fallback handler (set by CLI package)
|
|
759
|
+
const fallbackHandler = this.config.flashFallbackHandler;
|
|
760
|
+
if (typeof fallbackHandler === 'function') {
|
|
761
|
+
try {
|
|
762
|
+
const accepted = await fallbackHandler(currentModel, fallbackModel, error);
|
|
763
|
+
if (accepted !== false && accepted !== null) {
|
|
764
|
+
await this.config.setModel(fallbackModel);
|
|
765
|
+
this.config.setFallbackMode(true);
|
|
766
|
+
return fallbackModel;
|
|
767
|
+
}
|
|
768
|
+
// Check if the model was switched manually in the handler
|
|
769
|
+
if (this.config.getModel() === fallbackModel) {
|
|
770
|
+
return null; // Model was switched but don't continue with current prompt
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
catch (error) {
|
|
774
|
+
console.warn('Flash fallback handler failed:', error);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
return null;
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Handles Blackbox OAuth authentication errors and rate limiting
|
|
781
|
+
*/
|
|
782
|
+
async handleBlackboxOAuthError(error) {
|
|
783
|
+
if (!error) {
|
|
784
|
+
return null;
|
|
785
|
+
}
|
|
786
|
+
const errorMessage = error instanceof Error
|
|
787
|
+
? error.message.toLowerCase()
|
|
788
|
+
: String(error).toLowerCase();
|
|
789
|
+
const errorCode = error?.status ||
|
|
790
|
+
error?.code;
|
|
791
|
+
// Check if this is an authentication/authorization error
|
|
792
|
+
const isAuthError = errorCode === 401 ||
|
|
793
|
+
errorCode === 403 ||
|
|
794
|
+
errorMessage.includes('unauthorized') ||
|
|
795
|
+
errorMessage.includes('forbidden') ||
|
|
796
|
+
errorMessage.includes('invalid api key') ||
|
|
797
|
+
errorMessage.includes('authentication') ||
|
|
798
|
+
errorMessage.includes('access denied') ||
|
|
799
|
+
(errorMessage.includes('token') && errorMessage.includes('expired'));
|
|
800
|
+
// Check if this is a rate limiting error
|
|
801
|
+
const isRateLimitError = errorCode === 429 ||
|
|
802
|
+
errorMessage.includes('429') ||
|
|
803
|
+
errorMessage.includes('rate limit') ||
|
|
804
|
+
errorMessage.includes('too many requests');
|
|
805
|
+
if (isAuthError) {
|
|
806
|
+
console.warn('Blackbox OAuth authentication error detected:', errorMessage);
|
|
807
|
+
// The BlackboxContentGenerator should automatically handle token refresh
|
|
808
|
+
// If it still fails, it likely means the refresh token is also expired
|
|
809
|
+
console.log('Note: If this persists, you may need to re-authenticate with Blackbox OAuth');
|
|
810
|
+
return null;
|
|
811
|
+
}
|
|
812
|
+
if (isRateLimitError) {
|
|
813
|
+
console.warn('Blackbox API rate limit encountered:', errorMessage);
|
|
814
|
+
// For rate limiting, we don't need to do anything special
|
|
815
|
+
// The retry mechanism will handle the backoff
|
|
816
|
+
return null;
|
|
817
|
+
}
|
|
818
|
+
// For other errors, don't handle them specially
|
|
819
|
+
return null;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
export const TEST_ONLY = {
|
|
823
|
+
COMPRESSION_PRESERVE_THRESHOLD,
|
|
824
|
+
COMPRESSION_TOKEN_THRESHOLD,
|
|
825
|
+
};
|
|
826
|
+
//# sourceMappingURL=client.js.map
|