@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,662 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Blackbox
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
*/
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
+
import { promises as fs, unlinkSync } from 'node:fs';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { SharedTokenManager, TokenManagerError, TokenError, } from './sharedTokenManager.js';
|
|
12
|
+
// Mock external dependencies
|
|
13
|
+
vi.mock('node:fs', () => ({
|
|
14
|
+
promises: {
|
|
15
|
+
stat: vi.fn(),
|
|
16
|
+
readFile: vi.fn(),
|
|
17
|
+
writeFile: vi.fn(),
|
|
18
|
+
mkdir: vi.fn(),
|
|
19
|
+
unlink: vi.fn(),
|
|
20
|
+
rename: vi.fn(),
|
|
21
|
+
},
|
|
22
|
+
unlinkSync: vi.fn(),
|
|
23
|
+
}));
|
|
24
|
+
vi.mock('node:os', () => ({
|
|
25
|
+
homedir: vi.fn(),
|
|
26
|
+
}));
|
|
27
|
+
vi.mock('node:path', () => ({
|
|
28
|
+
default: {
|
|
29
|
+
join: vi.fn(),
|
|
30
|
+
dirname: vi.fn(),
|
|
31
|
+
},
|
|
32
|
+
}));
|
|
33
|
+
/**
|
|
34
|
+
* Helper to access private properties for testing
|
|
35
|
+
*/
|
|
36
|
+
function getPrivateProperty(obj, property) {
|
|
37
|
+
return obj[property];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Helper to set private properties for testing
|
|
41
|
+
*/
|
|
42
|
+
function setPrivateProperty(obj, property, value) {
|
|
43
|
+
obj[property] = value;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Creates a mock BlackboxOAuth2Client for testing
|
|
47
|
+
*/
|
|
48
|
+
function createMockBlackboxClient(initialCredentials = {}) {
|
|
49
|
+
let credentials = {
|
|
50
|
+
access_token: 'mock_access_token',
|
|
51
|
+
refresh_token: 'mock_refresh_token',
|
|
52
|
+
token_type: 'Bearer',
|
|
53
|
+
expiry_date: Date.now() + 3600000, // 1 hour from now
|
|
54
|
+
resource_url: 'https://api.example.com',
|
|
55
|
+
...initialCredentials,
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
setCredentials: vi.fn((creds) => {
|
|
59
|
+
credentials = { ...credentials, ...creds };
|
|
60
|
+
}),
|
|
61
|
+
getCredentials: vi.fn(() => credentials),
|
|
62
|
+
getAccessToken: vi.fn(),
|
|
63
|
+
requestDeviceAuthorization: vi.fn(),
|
|
64
|
+
pollDeviceToken: vi.fn(),
|
|
65
|
+
refreshAccessToken: vi.fn(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates valid mock credentials
|
|
70
|
+
*/
|
|
71
|
+
function createValidCredentials(overrides = {}) {
|
|
72
|
+
return {
|
|
73
|
+
access_token: 'valid_access_token',
|
|
74
|
+
refresh_token: 'valid_refresh_token',
|
|
75
|
+
token_type: 'Bearer',
|
|
76
|
+
expiry_date: Date.now() + 3600000, // 1 hour from now
|
|
77
|
+
resource_url: 'https://api.example.com',
|
|
78
|
+
...overrides,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Creates expired mock credentials
|
|
83
|
+
*/
|
|
84
|
+
function createExpiredCredentials(overrides = {}) {
|
|
85
|
+
return {
|
|
86
|
+
access_token: 'expired_access_token',
|
|
87
|
+
refresh_token: 'expired_refresh_token',
|
|
88
|
+
token_type: 'Bearer',
|
|
89
|
+
expiry_date: Date.now() - 3600000, // 1 hour ago
|
|
90
|
+
resource_url: 'https://api.example.com',
|
|
91
|
+
...overrides,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates a successful token refresh response
|
|
96
|
+
*/
|
|
97
|
+
function createSuccessfulRefreshResponse(overrides = {}) {
|
|
98
|
+
return {
|
|
99
|
+
access_token: 'fresh_access_token',
|
|
100
|
+
token_type: 'Bearer',
|
|
101
|
+
expires_in: 3600,
|
|
102
|
+
refresh_token: 'new_refresh_token',
|
|
103
|
+
resource_url: 'https://api.example.com',
|
|
104
|
+
...overrides,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Creates an error response
|
|
109
|
+
*/
|
|
110
|
+
function createErrorResponse(error = 'invalid_grant', description = 'Token expired') {
|
|
111
|
+
return {
|
|
112
|
+
error,
|
|
113
|
+
error_description: description,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
describe('SharedTokenManager', () => {
|
|
117
|
+
let tokenManager;
|
|
118
|
+
// Get mocked modules
|
|
119
|
+
const mockFs = vi.mocked(fs);
|
|
120
|
+
const mockOs = vi.mocked(os);
|
|
121
|
+
const mockPath = vi.mocked(path);
|
|
122
|
+
const mockUnlinkSync = vi.mocked(unlinkSync);
|
|
123
|
+
beforeEach(() => {
|
|
124
|
+
// Clean up any existing instance's listeners first
|
|
125
|
+
const existingInstance = getPrivateProperty(SharedTokenManager, 'instance');
|
|
126
|
+
if (existingInstance) {
|
|
127
|
+
existingInstance.cleanup();
|
|
128
|
+
}
|
|
129
|
+
// Reset all mocks
|
|
130
|
+
vi.clearAllMocks();
|
|
131
|
+
// Setup default mock implementations
|
|
132
|
+
mockOs.homedir.mockReturnValue('/home/user');
|
|
133
|
+
mockPath.join.mockImplementation((...args) => args.join('/'));
|
|
134
|
+
mockPath.dirname.mockImplementation((filePath) => {
|
|
135
|
+
// Handle undefined/null input gracefully
|
|
136
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
137
|
+
return '/home/user/.blackboxcli'; // Return the expected directory path
|
|
138
|
+
}
|
|
139
|
+
const parts = filePath.split('/');
|
|
140
|
+
const result = parts.slice(0, -1).join('/');
|
|
141
|
+
return result || '/';
|
|
142
|
+
});
|
|
143
|
+
// Reset singleton instance for each test
|
|
144
|
+
setPrivateProperty(SharedTokenManager, 'instance', null);
|
|
145
|
+
tokenManager = SharedTokenManager.getInstance();
|
|
146
|
+
});
|
|
147
|
+
afterEach(() => {
|
|
148
|
+
// Clean up listeners after each test
|
|
149
|
+
if (tokenManager) {
|
|
150
|
+
tokenManager.cleanup();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
describe('Singleton Pattern', () => {
|
|
154
|
+
it('should return the same instance when called multiple times', () => {
|
|
155
|
+
const instance1 = SharedTokenManager.getInstance();
|
|
156
|
+
const instance2 = SharedTokenManager.getInstance();
|
|
157
|
+
expect(instance1).toBe(instance2);
|
|
158
|
+
expect(instance1).toBe(tokenManager);
|
|
159
|
+
});
|
|
160
|
+
it('should create a new instance after reset', () => {
|
|
161
|
+
const instance1 = SharedTokenManager.getInstance();
|
|
162
|
+
// Reset singleton for testing
|
|
163
|
+
setPrivateProperty(SharedTokenManager, 'instance', null);
|
|
164
|
+
const instance2 = SharedTokenManager.getInstance();
|
|
165
|
+
expect(instance1).not.toBe(instance2);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe('getValidCredentials', () => {
|
|
169
|
+
it('should return valid cached credentials without refresh', async () => {
|
|
170
|
+
const mockClient = createMockBlackboxClient();
|
|
171
|
+
const validCredentials = createValidCredentials();
|
|
172
|
+
// Mock file operations to indicate no file changes
|
|
173
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
174
|
+
// Manually set cached credentials
|
|
175
|
+
tokenManager.clearCache();
|
|
176
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
177
|
+
memoryCache.credentials = validCredentials;
|
|
178
|
+
memoryCache.fileModTime = 1000;
|
|
179
|
+
memoryCache.lastCheck = Date.now();
|
|
180
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
181
|
+
expect(result).toEqual(validCredentials);
|
|
182
|
+
expect(mockClient.refreshAccessToken).not.toHaveBeenCalled();
|
|
183
|
+
});
|
|
184
|
+
it('should refresh expired credentials', async () => {
|
|
185
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
186
|
+
const refreshResponse = createSuccessfulRefreshResponse();
|
|
187
|
+
mockClient.refreshAccessToken = vi
|
|
188
|
+
.fn()
|
|
189
|
+
.mockResolvedValue(refreshResponse);
|
|
190
|
+
// Mock file operations
|
|
191
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
192
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
193
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
194
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
195
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
196
|
+
expect(result.access_token).toBe(refreshResponse.access_token);
|
|
197
|
+
expect(mockClient.refreshAccessToken).toHaveBeenCalled();
|
|
198
|
+
expect(mockClient.setCredentials).toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
it('should force refresh when forceRefresh is true', async () => {
|
|
201
|
+
const mockClient = createMockBlackboxClient(createValidCredentials());
|
|
202
|
+
const refreshResponse = createSuccessfulRefreshResponse();
|
|
203
|
+
mockClient.refreshAccessToken = vi
|
|
204
|
+
.fn()
|
|
205
|
+
.mockResolvedValue(refreshResponse);
|
|
206
|
+
// Mock file operations
|
|
207
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
208
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
209
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
210
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
211
|
+
const result = await tokenManager.getValidCredentials(mockClient, true);
|
|
212
|
+
expect(result.access_token).toBe(refreshResponse.access_token);
|
|
213
|
+
expect(mockClient.refreshAccessToken).toHaveBeenCalled();
|
|
214
|
+
});
|
|
215
|
+
it('should throw TokenManagerError when refresh token is missing', async () => {
|
|
216
|
+
const mockClient = createMockBlackboxClient({
|
|
217
|
+
access_token: 'expired_token',
|
|
218
|
+
refresh_token: undefined, // No refresh token
|
|
219
|
+
expiry_date: Date.now() - 3600000,
|
|
220
|
+
});
|
|
221
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
222
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow('No refresh token available');
|
|
223
|
+
});
|
|
224
|
+
it('should throw TokenManagerError when refresh fails', async () => {
|
|
225
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
226
|
+
const errorResponse = createErrorResponse();
|
|
227
|
+
mockClient.refreshAccessToken = vi.fn().mockResolvedValue(errorResponse);
|
|
228
|
+
// Mock file operations
|
|
229
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
230
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
231
|
+
});
|
|
232
|
+
it('should handle network errors during refresh', async () => {
|
|
233
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
234
|
+
const networkError = new Error('Network request failed');
|
|
235
|
+
mockClient.refreshAccessToken = vi.fn().mockRejectedValue(networkError);
|
|
236
|
+
// Mock file operations
|
|
237
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
238
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
239
|
+
});
|
|
240
|
+
it('should wait for ongoing refresh and return same result', async () => {
|
|
241
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
242
|
+
const refreshResponse = createSuccessfulRefreshResponse();
|
|
243
|
+
// Create a delayed refresh response
|
|
244
|
+
let resolveRefresh;
|
|
245
|
+
const refreshPromise = new Promise((resolve) => {
|
|
246
|
+
resolveRefresh = resolve;
|
|
247
|
+
});
|
|
248
|
+
mockClient.refreshAccessToken = vi.fn().mockReturnValue(refreshPromise);
|
|
249
|
+
// Mock file operations
|
|
250
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
251
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
252
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
253
|
+
// Start two concurrent refresh operations
|
|
254
|
+
const promise1 = tokenManager.getValidCredentials(mockClient);
|
|
255
|
+
const promise2 = tokenManager.getValidCredentials(mockClient);
|
|
256
|
+
// Resolve the refresh
|
|
257
|
+
resolveRefresh(refreshResponse);
|
|
258
|
+
const [result1, result2] = await Promise.all([promise1, promise2]);
|
|
259
|
+
expect(result1).toEqual(result2);
|
|
260
|
+
expect(mockClient.refreshAccessToken).toHaveBeenCalledTimes(1);
|
|
261
|
+
});
|
|
262
|
+
it('should reload credentials from file when file is modified', async () => {
|
|
263
|
+
const mockClient = createMockBlackboxClient();
|
|
264
|
+
const fileCredentials = createValidCredentials({
|
|
265
|
+
access_token: 'file_access_token',
|
|
266
|
+
});
|
|
267
|
+
// Mock file operations to simulate file modification
|
|
268
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 2000 });
|
|
269
|
+
mockFs.readFile.mockResolvedValue(JSON.stringify(fileCredentials));
|
|
270
|
+
// Set initial cache state
|
|
271
|
+
tokenManager.clearCache();
|
|
272
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
273
|
+
memoryCache.fileModTime = 1000; // Older than file
|
|
274
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
275
|
+
expect(result.access_token).toBe('file_access_token');
|
|
276
|
+
expect(mockFs.readFile).toHaveBeenCalled();
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('Cache Management', () => {
|
|
280
|
+
it('should clear cache', () => {
|
|
281
|
+
// Set some cache data
|
|
282
|
+
tokenManager.clearCache();
|
|
283
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
284
|
+
memoryCache.credentials = createValidCredentials();
|
|
285
|
+
tokenManager.clearCache();
|
|
286
|
+
expect(tokenManager.getCurrentCredentials()).toBeNull();
|
|
287
|
+
});
|
|
288
|
+
it('should return current credentials from cache', () => {
|
|
289
|
+
const credentials = createValidCredentials();
|
|
290
|
+
tokenManager.clearCache();
|
|
291
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
292
|
+
memoryCache.credentials = credentials;
|
|
293
|
+
expect(tokenManager.getCurrentCredentials()).toEqual(credentials);
|
|
294
|
+
});
|
|
295
|
+
it('should return null when no credentials are cached', () => {
|
|
296
|
+
tokenManager.clearCache();
|
|
297
|
+
expect(tokenManager.getCurrentCredentials()).toBeNull();
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
describe('Refresh Status', () => {
|
|
301
|
+
it('should return false when no refresh is in progress', () => {
|
|
302
|
+
expect(tokenManager.isRefreshInProgress()).toBe(false);
|
|
303
|
+
});
|
|
304
|
+
it('should return true when refresh is in progress', async () => {
|
|
305
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
306
|
+
// Clear cache to ensure refresh is triggered
|
|
307
|
+
tokenManager.clearCache();
|
|
308
|
+
// Mock stat for file check to fail (no file initially) - need to mock it twice
|
|
309
|
+
// Once for checkAndReloadIfNeeded, once for forceFileCheck during refresh
|
|
310
|
+
mockFs.stat
|
|
311
|
+
.mockRejectedValueOnce(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }))
|
|
312
|
+
.mockRejectedValueOnce(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
313
|
+
// Create a delayed refresh response
|
|
314
|
+
let resolveRefresh;
|
|
315
|
+
const refreshPromise = new Promise((resolve) => {
|
|
316
|
+
resolveRefresh = resolve;
|
|
317
|
+
});
|
|
318
|
+
mockClient.refreshAccessToken = vi.fn().mockReturnValue(refreshPromise);
|
|
319
|
+
// Mock file operations for lock and save
|
|
320
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
321
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
322
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
323
|
+
// Start refresh
|
|
324
|
+
const refreshOperation = tokenManager.getValidCredentials(mockClient);
|
|
325
|
+
// Wait a tick to ensure the refresh promise is set
|
|
326
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
327
|
+
expect(tokenManager.isRefreshInProgress()).toBe(true);
|
|
328
|
+
// Complete refresh
|
|
329
|
+
resolveRefresh(createSuccessfulRefreshResponse());
|
|
330
|
+
await refreshOperation;
|
|
331
|
+
expect(tokenManager.isRefreshInProgress()).toBe(false);
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
describe('Debug Info', () => {
|
|
335
|
+
it('should return complete debug information', () => {
|
|
336
|
+
const credentials = createValidCredentials();
|
|
337
|
+
tokenManager.clearCache();
|
|
338
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
339
|
+
memoryCache.credentials = credentials;
|
|
340
|
+
const debugInfo = tokenManager.getDebugInfo();
|
|
341
|
+
expect(debugInfo).toHaveProperty('hasCredentials', true);
|
|
342
|
+
expect(debugInfo).toHaveProperty('credentialsExpired', false);
|
|
343
|
+
expect(debugInfo).toHaveProperty('isRefreshing', false);
|
|
344
|
+
expect(debugInfo).toHaveProperty('cacheAge');
|
|
345
|
+
expect(typeof debugInfo.cacheAge).toBe('number');
|
|
346
|
+
});
|
|
347
|
+
it('should indicate expired credentials in debug info', () => {
|
|
348
|
+
const expiredCredentials = createExpiredCredentials();
|
|
349
|
+
tokenManager.clearCache();
|
|
350
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
351
|
+
memoryCache.credentials = expiredCredentials;
|
|
352
|
+
const debugInfo = tokenManager.getDebugInfo();
|
|
353
|
+
expect(debugInfo.hasCredentials).toBe(true);
|
|
354
|
+
expect(debugInfo.credentialsExpired).toBe(true);
|
|
355
|
+
});
|
|
356
|
+
it('should indicate no credentials in debug info', () => {
|
|
357
|
+
tokenManager.clearCache();
|
|
358
|
+
const debugInfo = tokenManager.getDebugInfo();
|
|
359
|
+
expect(debugInfo.hasCredentials).toBe(false);
|
|
360
|
+
expect(debugInfo.credentialsExpired).toBe(false);
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
describe('Error Handling', () => {
|
|
364
|
+
it('should create TokenManagerError with correct type and message', () => {
|
|
365
|
+
const error = new TokenManagerError(TokenError.REFRESH_FAILED, 'Token refresh failed', new Error('Original error'));
|
|
366
|
+
expect(error).toBeInstanceOf(Error);
|
|
367
|
+
expect(error).toBeInstanceOf(TokenManagerError);
|
|
368
|
+
expect(error.type).toBe(TokenError.REFRESH_FAILED);
|
|
369
|
+
expect(error.message).toBe('Token refresh failed');
|
|
370
|
+
expect(error.name).toBe('TokenManagerError');
|
|
371
|
+
expect(error.originalError).toBeInstanceOf(Error);
|
|
372
|
+
});
|
|
373
|
+
it('should handle file access errors gracefully', async () => {
|
|
374
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
375
|
+
// Mock file stat to throw access error
|
|
376
|
+
const accessError = new Error('Permission denied');
|
|
377
|
+
accessError.code = 'EACCES';
|
|
378
|
+
mockFs.stat.mockRejectedValue(accessError);
|
|
379
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
380
|
+
});
|
|
381
|
+
it('should handle missing file gracefully', async () => {
|
|
382
|
+
const mockClient = createMockBlackboxClient();
|
|
383
|
+
const validCredentials = createValidCredentials();
|
|
384
|
+
// Mock file stat to throw file not found error
|
|
385
|
+
const notFoundError = new Error('File not found');
|
|
386
|
+
notFoundError.code = 'ENOENT';
|
|
387
|
+
mockFs.stat.mockRejectedValue(notFoundError);
|
|
388
|
+
// Set valid credentials in cache
|
|
389
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
390
|
+
memoryCache.credentials = validCredentials;
|
|
391
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
392
|
+
expect(result).toEqual(validCredentials);
|
|
393
|
+
});
|
|
394
|
+
it('should handle lock timeout scenarios', async () => {
|
|
395
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
396
|
+
// Configure shorter timeouts for testing
|
|
397
|
+
tokenManager.setLockConfig({
|
|
398
|
+
maxAttempts: 3,
|
|
399
|
+
attemptInterval: 50,
|
|
400
|
+
});
|
|
401
|
+
// Mock stat for file check to pass (no file initially)
|
|
402
|
+
mockFs.stat.mockRejectedValueOnce(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
403
|
+
// Mock writeFile to always throw EEXIST for lock file writes (flag: 'wx')
|
|
404
|
+
// but succeed for regular file writes
|
|
405
|
+
const lockError = new Error('File exists');
|
|
406
|
+
lockError.code = 'EEXIST';
|
|
407
|
+
mockFs.writeFile.mockImplementation((path, data, options) => {
|
|
408
|
+
if (typeof options === 'object' && options?.flag === 'wx') {
|
|
409
|
+
return Promise.reject(lockError);
|
|
410
|
+
}
|
|
411
|
+
return Promise.resolve(undefined);
|
|
412
|
+
});
|
|
413
|
+
// Mock stat to return recent lock file (not stale) when checking lock age
|
|
414
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: Date.now() });
|
|
415
|
+
// Mock unlink to simulate lock file removal attempts
|
|
416
|
+
mockFs.unlink.mockResolvedValue(undefined);
|
|
417
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
418
|
+
}, 500); // 500ms timeout for lock test (3 attempts × 50ms = ~150ms + buffer)
|
|
419
|
+
it('should handle refresh response without access token', async () => {
|
|
420
|
+
// Create a fresh token manager instance to avoid state contamination
|
|
421
|
+
setPrivateProperty(SharedTokenManager, 'instance', null);
|
|
422
|
+
const freshTokenManager = SharedTokenManager.getInstance();
|
|
423
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
424
|
+
const invalidResponse = {
|
|
425
|
+
token_type: 'Bearer',
|
|
426
|
+
expires_in: 3600,
|
|
427
|
+
// access_token is missing, so we use undefined explicitly
|
|
428
|
+
access_token: undefined,
|
|
429
|
+
};
|
|
430
|
+
mockClient.refreshAccessToken = vi
|
|
431
|
+
.fn()
|
|
432
|
+
.mockResolvedValue(invalidResponse);
|
|
433
|
+
// Completely reset all fs mocks to ensure no contamination
|
|
434
|
+
mockFs.stat.mockReset();
|
|
435
|
+
mockFs.readFile.mockReset();
|
|
436
|
+
mockFs.writeFile.mockReset();
|
|
437
|
+
mockFs.mkdir.mockReset();
|
|
438
|
+
mockFs.rename.mockReset();
|
|
439
|
+
mockFs.unlink.mockReset();
|
|
440
|
+
// Mock stat for file check to fail (no file initially) - need to mock it twice
|
|
441
|
+
// Once for checkAndReloadIfNeeded, once for forceFileCheck during refresh
|
|
442
|
+
mockFs.stat
|
|
443
|
+
.mockRejectedValueOnce(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }))
|
|
444
|
+
.mockRejectedValueOnce(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
445
|
+
// Mock file operations for lock acquisition
|
|
446
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
447
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
448
|
+
// Clear cache to force refresh
|
|
449
|
+
freshTokenManager.clearCache();
|
|
450
|
+
await expect(freshTokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
451
|
+
await expect(freshTokenManager.getValidCredentials(mockClient)).rejects.toThrow('no token returned');
|
|
452
|
+
// Clean up the fresh instance
|
|
453
|
+
freshTokenManager.cleanup();
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
describe('File System Operations', () => {
|
|
457
|
+
it('should handle file reload failures gracefully', async () => {
|
|
458
|
+
const mockClient = createMockBlackboxClient();
|
|
459
|
+
// Mock successful refresh for when cache is cleared
|
|
460
|
+
mockClient.refreshAccessToken = vi
|
|
461
|
+
.fn()
|
|
462
|
+
.mockResolvedValue(createSuccessfulRefreshResponse());
|
|
463
|
+
// Mock file operations
|
|
464
|
+
mockFs.stat
|
|
465
|
+
.mockResolvedValueOnce({ mtimeMs: 2000 }) // For checkAndReloadIfNeeded
|
|
466
|
+
.mockResolvedValue({ mtimeMs: 1000 }); // For later operations
|
|
467
|
+
mockFs.readFile.mockRejectedValue(new Error('Read failed'));
|
|
468
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
469
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
470
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
471
|
+
// Set initial cache state to trigger reload
|
|
472
|
+
tokenManager.clearCache();
|
|
473
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
474
|
+
memoryCache.fileModTime = 1000;
|
|
475
|
+
// Should not throw error, should refresh and get new credentials
|
|
476
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
477
|
+
expect(result).toBeDefined();
|
|
478
|
+
expect(result.access_token).toBe('fresh_access_token');
|
|
479
|
+
});
|
|
480
|
+
it('should handle invalid JSON in credentials file', async () => {
|
|
481
|
+
const mockClient = createMockBlackboxClient();
|
|
482
|
+
// Mock successful refresh for when cache is cleared
|
|
483
|
+
mockClient.refreshAccessToken = vi
|
|
484
|
+
.fn()
|
|
485
|
+
.mockResolvedValue(createSuccessfulRefreshResponse());
|
|
486
|
+
// Mock file operations with invalid JSON
|
|
487
|
+
mockFs.stat
|
|
488
|
+
.mockResolvedValueOnce({ mtimeMs: 2000 }) // For checkAndReloadIfNeeded
|
|
489
|
+
.mockResolvedValue({ mtimeMs: 1000 }); // For later operations
|
|
490
|
+
mockFs.readFile.mockResolvedValue('invalid json content');
|
|
491
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
492
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
493
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
494
|
+
// Set initial cache state to trigger reload
|
|
495
|
+
tokenManager.clearCache();
|
|
496
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
497
|
+
memoryCache.fileModTime = 1000;
|
|
498
|
+
// Should handle JSON parse error gracefully, then refresh and get new credentials
|
|
499
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
500
|
+
expect(result).toBeDefined();
|
|
501
|
+
expect(result.access_token).toBe('fresh_access_token');
|
|
502
|
+
});
|
|
503
|
+
it('should handle directory creation during save', async () => {
|
|
504
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
505
|
+
const refreshResponse = createSuccessfulRefreshResponse();
|
|
506
|
+
mockClient.refreshAccessToken = vi
|
|
507
|
+
.fn()
|
|
508
|
+
.mockResolvedValue(refreshResponse);
|
|
509
|
+
// Mock file operations
|
|
510
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 1000 });
|
|
511
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
512
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
513
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
514
|
+
await tokenManager.getValidCredentials(mockClient);
|
|
515
|
+
expect(mockFs.mkdir).toHaveBeenCalledWith(expect.any(String), {
|
|
516
|
+
recursive: true,
|
|
517
|
+
mode: 0o700,
|
|
518
|
+
});
|
|
519
|
+
expect(mockFs.writeFile).toHaveBeenCalled();
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
describe('Lock File Management', () => {
|
|
523
|
+
it('should clean up lock file during process cleanup', () => {
|
|
524
|
+
// Create a new instance to trigger cleanup handler registration
|
|
525
|
+
SharedTokenManager.getInstance();
|
|
526
|
+
// Access the private cleanup method for testing
|
|
527
|
+
const cleanupHandlers = process.listeners('exit');
|
|
528
|
+
const cleanup = cleanupHandlers[cleanupHandlers.length - 1];
|
|
529
|
+
// Should not throw when lock file doesn't exist
|
|
530
|
+
expect(() => cleanup()).not.toThrow();
|
|
531
|
+
expect(mockUnlinkSync).toHaveBeenCalled();
|
|
532
|
+
});
|
|
533
|
+
it('should handle stale lock cleanup', async () => {
|
|
534
|
+
const mockClient = createMockBlackboxClient(createExpiredCredentials());
|
|
535
|
+
const refreshResponse = createSuccessfulRefreshResponse();
|
|
536
|
+
mockClient.refreshAccessToken = vi
|
|
537
|
+
.fn()
|
|
538
|
+
.mockResolvedValue(refreshResponse);
|
|
539
|
+
// First writeFile call throws EEXIST (lock exists)
|
|
540
|
+
// Second writeFile call succeeds (after stale lock cleanup)
|
|
541
|
+
const lockError = new Error('File exists');
|
|
542
|
+
lockError.code = 'EEXIST';
|
|
543
|
+
mockFs.writeFile
|
|
544
|
+
.mockRejectedValueOnce(lockError)
|
|
545
|
+
.mockResolvedValue(undefined);
|
|
546
|
+
// Mock stat to return stale lock (old timestamp)
|
|
547
|
+
mockFs.stat
|
|
548
|
+
.mockResolvedValueOnce({ mtimeMs: Date.now() - 20000 }) // Stale lock
|
|
549
|
+
.mockResolvedValueOnce({ mtimeMs: 1000 }); // Credentials file
|
|
550
|
+
// Mock rename and unlink to succeed (for atomic stale lock removal)
|
|
551
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
552
|
+
mockFs.unlink.mockResolvedValue(undefined);
|
|
553
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
554
|
+
const result = await tokenManager.getValidCredentials(mockClient);
|
|
555
|
+
expect(result.access_token).toBe(refreshResponse.access_token);
|
|
556
|
+
expect(mockFs.rename).toHaveBeenCalled(); // Stale lock moved atomically
|
|
557
|
+
expect(mockFs.unlink).toHaveBeenCalled(); // Temp file cleaned up
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
describe('CredentialsClearRequiredError handling', () => {
|
|
561
|
+
it('should clear memory cache when CredentialsClearRequiredError is thrown during refresh', async () => {
|
|
562
|
+
const { CredentialsClearRequiredError } = await import('./blackboxOAuth2.js');
|
|
563
|
+
const tokenManager = SharedTokenManager.getInstance();
|
|
564
|
+
tokenManager.clearCache();
|
|
565
|
+
// Set up some credentials in memory cache
|
|
566
|
+
const mockCredentials = {
|
|
567
|
+
access_token: 'expired-token',
|
|
568
|
+
refresh_token: 'expired-refresh',
|
|
569
|
+
token_type: 'Bearer',
|
|
570
|
+
expiry_date: Date.now() - 1000, // Expired
|
|
571
|
+
};
|
|
572
|
+
const memoryCache = getPrivateProperty(tokenManager, 'memoryCache');
|
|
573
|
+
memoryCache.credentials = mockCredentials;
|
|
574
|
+
memoryCache.fileModTime = 12345;
|
|
575
|
+
// Mock the client to throw CredentialsClearRequiredError
|
|
576
|
+
const mockClient = {
|
|
577
|
+
getCredentials: vi.fn().mockReturnValue(mockCredentials),
|
|
578
|
+
setCredentials: vi.fn(),
|
|
579
|
+
getAccessToken: vi.fn(),
|
|
580
|
+
requestDeviceAuthorization: vi.fn(),
|
|
581
|
+
pollDeviceToken: vi.fn(),
|
|
582
|
+
refreshAccessToken: vi
|
|
583
|
+
.fn()
|
|
584
|
+
.mockRejectedValue(new CredentialsClearRequiredError('Refresh token expired or invalid', { status: 400, response: 'Bad Request' })),
|
|
585
|
+
};
|
|
586
|
+
// Mock file system operations
|
|
587
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
588
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 12345 });
|
|
589
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
590
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
591
|
+
mockFs.unlink.mockResolvedValue(undefined);
|
|
592
|
+
// Attempt to get valid credentials should fail and clear cache
|
|
593
|
+
await expect(tokenManager.getValidCredentials(mockClient)).rejects.toThrow(TokenManagerError);
|
|
594
|
+
// Verify memory cache was cleared
|
|
595
|
+
expect(tokenManager.getCurrentCredentials()).toBeNull();
|
|
596
|
+
const memoryCacheAfter = getPrivateProperty(tokenManager, 'memoryCache');
|
|
597
|
+
const refreshPromise = getPrivateProperty(tokenManager, 'refreshPromise');
|
|
598
|
+
expect(memoryCacheAfter.fileModTime).toBe(0);
|
|
599
|
+
expect(refreshPromise).toBeNull();
|
|
600
|
+
});
|
|
601
|
+
it('should convert CredentialsClearRequiredError to TokenManagerError', async () => {
|
|
602
|
+
const { CredentialsClearRequiredError } = await import('./blackboxOAuth2.js');
|
|
603
|
+
const tokenManager = SharedTokenManager.getInstance();
|
|
604
|
+
tokenManager.clearCache();
|
|
605
|
+
const mockCredentials = {
|
|
606
|
+
access_token: 'expired-token',
|
|
607
|
+
refresh_token: 'expired-refresh',
|
|
608
|
+
token_type: 'Bearer',
|
|
609
|
+
expiry_date: Date.now() - 1000,
|
|
610
|
+
};
|
|
611
|
+
const mockClient = {
|
|
612
|
+
getCredentials: vi.fn().mockReturnValue(mockCredentials),
|
|
613
|
+
setCredentials: vi.fn(),
|
|
614
|
+
getAccessToken: vi.fn(),
|
|
615
|
+
requestDeviceAuthorization: vi.fn(),
|
|
616
|
+
pollDeviceToken: vi.fn(),
|
|
617
|
+
refreshAccessToken: vi
|
|
618
|
+
.fn()
|
|
619
|
+
.mockRejectedValue(new CredentialsClearRequiredError('Test error message')),
|
|
620
|
+
};
|
|
621
|
+
// Mock file system operations
|
|
622
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
623
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 12345 });
|
|
624
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
625
|
+
mockFs.rename.mockResolvedValue(undefined);
|
|
626
|
+
mockFs.unlink.mockResolvedValue(undefined);
|
|
627
|
+
try {
|
|
628
|
+
await tokenManager.getValidCredentials(mockClient);
|
|
629
|
+
expect.fail('Expected TokenManagerError to be thrown');
|
|
630
|
+
}
|
|
631
|
+
catch (error) {
|
|
632
|
+
expect(error).toBeInstanceOf(TokenManagerError);
|
|
633
|
+
expect(error.type).toBe(TokenError.REFRESH_FAILED);
|
|
634
|
+
expect(error.message).toBe('Test error message');
|
|
635
|
+
expect(error.originalError).toBeInstanceOf(CredentialsClearRequiredError);
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
it('should properly clean up timeout when file operation completes before timeout', async () => {
|
|
639
|
+
const tokenManager = SharedTokenManager.getInstance();
|
|
640
|
+
tokenManager.clearCache();
|
|
641
|
+
const mockClient = {
|
|
642
|
+
getCredentials: vi.fn().mockReturnValue(null),
|
|
643
|
+
setCredentials: vi.fn(),
|
|
644
|
+
getAccessToken: vi.fn(),
|
|
645
|
+
requestDeviceAuthorization: vi.fn(),
|
|
646
|
+
pollDeviceToken: vi.fn(),
|
|
647
|
+
refreshAccessToken: vi.fn(),
|
|
648
|
+
};
|
|
649
|
+
// Mock clearTimeout to verify it's called
|
|
650
|
+
const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout');
|
|
651
|
+
// Mock file stat to resolve quickly (before timeout)
|
|
652
|
+
mockFs.stat.mockResolvedValue({ mtimeMs: 12345 });
|
|
653
|
+
// Call checkAndReloadIfNeeded which uses withTimeout internally
|
|
654
|
+
const checkMethod = getPrivateProperty(tokenManager, 'checkAndReloadIfNeeded');
|
|
655
|
+
await checkMethod.call(tokenManager, mockClient);
|
|
656
|
+
// Verify that clearTimeout was called to clean up the timer
|
|
657
|
+
expect(clearTimeoutSpy).toHaveBeenCalled();
|
|
658
|
+
clearTimeoutSpy.mockRestore();
|
|
659
|
+
});
|
|
660
|
+
});
|
|
661
|
+
});
|
|
662
|
+
//# sourceMappingURL=sharedTokenManager.test.js.map
|