@office-ai/aioncli-core 0.8.1 → 0.18.5
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/dist/index.d.ts +8 -2
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/src/agents/codebase-investigator.d.ts +36 -1
- package/dist/src/agents/codebase-investigator.js +93 -34
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/codebase-investigator.test.d.ts +6 -0
- package/dist/src/agents/codebase-investigator.test.js +35 -0
- package/dist/src/agents/codebase-investigator.test.js.map +1 -0
- package/dist/src/agents/executor.d.ts +37 -11
- package/dist/src/agents/executor.js +512 -150
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js +1188 -245
- package/dist/src/agents/executor.test.js.map +1 -1
- package/dist/src/agents/invocation.d.ts +5 -2
- package/dist/src/agents/invocation.js +4 -2
- package/dist/src/agents/invocation.js.map +1 -1
- package/dist/src/agents/invocation.test.js +9 -0
- package/dist/src/agents/invocation.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +6 -1
- package/dist/src/agents/registry.js +51 -4
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +30 -16
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.d.ts +3 -1
- package/dist/src/agents/subagent-tool-wrapper.js +4 -3
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +9 -4
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +37 -7
- package/dist/src/agents/types.js +2 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/code_assist/codeAssist.js +1 -1
- package/dist/src/code_assist/codeAssist.test.d.ts +6 -0
- package/dist/src/code_assist/codeAssist.test.js +99 -0
- package/dist/src/code_assist/codeAssist.test.js.map +1 -0
- package/dist/src/code_assist/converter.d.ts +1 -0
- package/dist/src/code_assist/converter.js +1 -0
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/converter.test.js +19 -0
- package/dist/src/code_assist/converter.test.js.map +1 -1
- package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
- package/dist/src/code_assist/experiments/client_metadata.js +50 -0
- package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
- package/dist/src/code_assist/experiments/client_metadata.test.d.ts +6 -0
- package/dist/src/code_assist/experiments/client_metadata.test.js +99 -0
- package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -0
- package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
- package/dist/src/code_assist/experiments/experiments.js +36 -0
- package/dist/src/code_assist/experiments/experiments.js.map +1 -0
- package/dist/src/code_assist/experiments/experiments.test.d.ts +6 -0
- package/dist/src/code_assist/experiments/experiments.test.js +92 -0
- package/dist/src/code_assist/experiments/experiments.test.js.map +1 -0
- package/dist/src/code_assist/experiments/flagNames.d.ts +13 -0
- package/dist/src/code_assist/experiments/flagNames.js +13 -0
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -0
- package/dist/src/code_assist/experiments/types.d.ts +35 -0
- package/dist/src/code_assist/experiments/types.js +7 -0
- package/dist/src/code_assist/experiments/types.js.map +1 -0
- package/dist/src/code_assist/oauth-credential-storage.js +6 -5
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js +65 -3
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +2 -2
- package/dist/src/code_assist/oauth2.js +161 -93
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +103 -57
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +6 -4
- package/dist/src/code_assist/server.js +16 -8
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +126 -28
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +2 -2
- package/dist/src/code_assist/setup.js +4 -2
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +1 -1
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/commands/extensions.d.ts +7 -0
- package/dist/src/commands/extensions.js +9 -0
- package/dist/src/commands/extensions.js.map +1 -0
- package/dist/src/commands/extensions.test.d.ts +6 -0
- package/dist/src/commands/extensions.test.js +19 -0
- package/dist/src/commands/extensions.test.js.map +1 -0
- package/dist/src/config/config.d.ts +169 -43
- package/dist/src/config/config.js +418 -79
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +684 -49
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.d.ts +7 -0
- package/dist/src/config/defaultModelConfigs.js +185 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -0
- package/dist/src/config/models.d.ts +23 -2
- package/dist/src/config/models.js +50 -7
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +71 -10
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +3 -1
- package/dist/src/config/storage.js +22 -2
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +7 -6
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +3 -2
- package/dist/src/confirmation-bus/message-bus.js +9 -3
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.test.js +30 -24
- package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +13 -2
- package/dist/src/confirmation-bus/types.js +1 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/core/apiKeyCredentialStorage.d.ts +17 -0
- package/dist/src/core/apiKeyCredentialStorage.js +64 -0
- package/dist/src/core/apiKeyCredentialStorage.js.map +1 -0
- package/dist/src/core/apiKeyCredentialStorage.test.d.ts +6 -0
- package/dist/src/core/apiKeyCredentialStorage.test.js +71 -0
- package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -0
- package/dist/src/core/baseLlmClient.d.ts +4 -8
- package/dist/src/core/baseLlmClient.js +6 -11
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +22 -27
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +12 -19
- package/dist/src/core/client.js +104 -206
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +329 -452
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +3 -2
- package/dist/src/core/contentGenerator.js +56 -41
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +49 -1
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +8 -4
- package/dist/src/core/coreToolScheduler.js +348 -179
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +575 -219
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +33 -0
- package/dist/src/core/fakeContentGenerator.js +58 -0
- package/dist/src/core/fakeContentGenerator.js.map +1 -0
- package/dist/src/core/fakeContentGenerator.test.d.ts +6 -0
- package/dist/src/core/fakeContentGenerator.test.js +127 -0
- package/dist/src/core/fakeContentGenerator.test.js.map +1 -0
- package/dist/src/core/geminiChat.d.ts +23 -18
- package/dist/src/core/geminiChat.js +186 -108
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +581 -270
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/logger.d.ts +7 -2
- package/dist/src/core/logger.js +35 -27
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +45 -29
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +1 -0
- package/dist/src/core/loggingContentGenerator.js +113 -33
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.d.ts +6 -0
- package/dist/src/core/loggingContentGenerator.test.js +180 -0
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.d.ts +3 -2
- package/dist/src/core/nonInteractiveToolExecutor.js +12 -7
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +12 -8
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/openaiContentGenerator.d.ts +15 -1
- package/dist/src/core/openaiContentGenerator.js +139 -22
- package/dist/src/core/openaiContentGenerator.js.map +1 -1
- package/dist/src/core/prompts.d.ts +2 -1
- package/dist/src/core/prompts.js +135 -154
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +128 -189
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/recordingContentGenerator.d.ts +18 -0
- package/dist/src/core/recordingContentGenerator.js +77 -0
- package/dist/src/core/recordingContentGenerator.js.map +1 -0
- package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
- package/dist/src/core/recordingContentGenerator.test.js +101 -0
- package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
- package/dist/src/core/tokenLimits.test.d.ts +6 -0
- package/dist/src/core/tokenLimits.test.js +26 -0
- package/dist/src/core/tokenLimits.test.js.map +1 -0
- package/dist/src/core/turn.d.ts +23 -3
- package/dist/src/core/turn.js +18 -9
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +98 -104
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/fallback/handler.js +60 -8
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +132 -17
- package/dist/src/fallback/handler.test.js.map +1 -1
- package/dist/src/fallback/types.d.ts +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/hooks/hookAggregator.d.ts +68 -0
- package/dist/src/hooks/hookAggregator.js +262 -0
- package/dist/src/hooks/hookAggregator.js.map +1 -0
- package/dist/src/hooks/hookAggregator.test.d.ts +6 -0
- package/dist/src/hooks/hookAggregator.test.js +387 -0
- package/dist/src/hooks/hookAggregator.test.js.map +1 -0
- package/dist/src/hooks/hookPlanner.d.ts +46 -0
- package/dist/src/hooks/hookPlanner.js +108 -0
- package/dist/src/hooks/hookPlanner.js.map +1 -0
- package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
- package/dist/src/hooks/hookPlanner.test.js +255 -0
- package/dist/src/hooks/hookPlanner.test.js.map +1 -0
- package/dist/src/hooks/hookRegistry.d.ts +87 -0
- package/dist/src/hooks/hookRegistry.js +198 -0
- package/dist/src/hooks/hookRegistry.js.map +1 -0
- package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
- package/dist/src/hooks/hookRegistry.test.js +341 -0
- package/dist/src/hooks/hookRegistry.test.js.map +1 -0
- package/dist/src/hooks/hookRunner.d.ts +42 -0
- package/dist/src/hooks/hookRunner.js +272 -0
- package/dist/src/hooks/hookRunner.js.map +1 -0
- package/dist/src/hooks/hookRunner.test.d.ts +6 -0
- package/dist/src/hooks/hookRunner.test.js +468 -0
- package/dist/src/hooks/hookRunner.test.js.map +1 -0
- package/dist/src/hooks/hookTranslator.d.ts +113 -0
- package/dist/src/hooks/hookTranslator.js +232 -0
- package/dist/src/hooks/hookTranslator.js.map +1 -0
- package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
- package/dist/src/hooks/hookTranslator.test.js +192 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -0
- package/dist/src/hooks/types.d.ts +384 -0
- package/dist/src/hooks/types.js +284 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/hooks/types.test.d.ts +6 -0
- package/dist/src/hooks/types.test.js +313 -0
- package/dist/src/hooks/types.test.js.map +1 -0
- package/dist/src/ide/detect-ide.d.ts +4 -0
- package/dist/src/ide/detect-ide.js +6 -1
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.js +16 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +3 -1
- package/dist/src/ide/ide-client.js +12 -10
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.js +163 -4
- package/dist/src/ide/ide-client.test.js.map +1 -1
- package/dist/src/ide/ide-installer.js +66 -21
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +54 -1
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/ide/process-utils.js +85 -75
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/ide/process-utils.test.js +83 -90
- package/dist/src/ide/process-utils.test.js.map +1 -1
- package/dist/src/ide/types.d.ts +5 -5
- package/dist/src/ide/types.js +1 -1
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +2 -0
- package/dist/src/mcp/google-auth-provider.js +21 -3
- package/dist/src/mcp/google-auth-provider.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.test.js +42 -9
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +8 -5
- package/dist/src/mcp/oauth-provider.js +140 -55
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +369 -2
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.js +5 -4
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.test.js +17 -11
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +7 -0
- package/dist/src/mcp/oauth-utils.js +28 -8
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +45 -2
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/mcp/sa-impersonation-provider.d.ts +0 -6
- package/dist/src/mcp/sa-impersonation-provider.js +6 -23
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
- package/dist/src/mcp/token-storage/base-token-storage.test.js +75 -84
- package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.js +3 -2
- package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.test.js +11 -8
- package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js +63 -7
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js +54 -3
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/types.d.ts +6 -0
- package/dist/src/mcp/token-storage/types.js.map +1 -1
- package/dist/src/output/stream-json-formatter.d.ts +32 -0
- package/dist/src/output/stream-json-formatter.js +52 -0
- package/dist/src/output/stream-json-formatter.js.map +1 -0
- package/dist/src/output/stream-json-formatter.test.d.ts +6 -0
- package/dist/src/output/stream-json-formatter.test.js +479 -0
- package/dist/src/output/stream-json-formatter.test.js.map +1 -0
- package/dist/src/output/types.d.ts +63 -1
- package/dist/src/output/types.js +11 -0
- package/dist/src/output/types.js.map +1 -1
- package/dist/src/policy/config.d.ts +31 -0
- package/dist/src/policy/config.js +199 -0
- package/dist/src/policy/config.js.map +1 -0
- package/dist/src/policy/config.test.d.ts +6 -0
- package/dist/src/policy/config.test.js +538 -0
- package/dist/src/policy/config.test.js.map +1 -0
- package/dist/src/policy/index.d.ts +2 -0
- package/dist/src/policy/index.js +2 -0
- package/dist/src/policy/index.js.map +1 -1
- package/dist/src/policy/policies/discovered.toml +8 -0
- package/dist/src/policy/policies/read-only.toml +56 -0
- package/dist/src/policy/policies/write.toml +73 -0
- package/dist/src/policy/policies/yolo.toml +31 -0
- package/dist/src/policy/policy-engine.d.ts +12 -3
- package/dist/src/policy/policy-engine.js +74 -8
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +460 -76
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/toml-loader.d.ts +47 -0
- package/dist/src/policy/toml-loader.js +411 -0
- package/dist/src/policy/toml-loader.js.map +1 -0
- package/dist/src/policy/toml-loader.test.d.ts +6 -0
- package/dist/src/policy/toml-loader.test.js +376 -0
- package/dist/src/policy/toml-loader.test.js.map +1 -0
- package/dist/src/policy/types.d.ts +83 -0
- package/dist/src/policy/types.js +10 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/mcp-prompts.test.d.ts +6 -0
- package/dist/src/prompts/mcp-prompts.test.js +39 -0
- package/dist/src/prompts/mcp-prompts.test.js.map +1 -0
- package/dist/src/prompts/prompt-registry.js +2 -1
- package/dist/src/prompts/prompt-registry.js.map +1 -1
- package/dist/src/prompts/prompt-registry.test.d.ts +6 -0
- package/dist/src/prompts/prompt-registry.test.js +96 -0
- package/dist/src/prompts/prompt-registry.test.js.map +1 -0
- package/dist/src/routing/modelRouterService.js +15 -0
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +62 -0
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.d.ts +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +9 -16
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +17 -13
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +4 -0
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +2 -2
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.test.js +3 -0
- package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
- package/dist/src/safety/built-in.d.ts +21 -0
- package/dist/src/safety/built-in.js +106 -0
- package/dist/src/safety/built-in.js.map +1 -0
- package/dist/src/safety/built-in.test.d.ts +6 -0
- package/dist/src/safety/built-in.test.js +199 -0
- package/dist/src/safety/built-in.test.js.map +1 -0
- package/dist/src/safety/checker-runner.d.ts +48 -0
- package/dist/src/safety/checker-runner.js +208 -0
- package/dist/src/safety/checker-runner.js.map +1 -0
- package/dist/src/safety/checker-runner.test.d.ts +6 -0
- package/dist/src/safety/checker-runner.test.js +238 -0
- package/dist/src/safety/checker-runner.test.js.map +1 -0
- package/dist/src/safety/context-builder.d.ts +23 -0
- package/dist/src/safety/context-builder.js +47 -0
- package/dist/src/safety/context-builder.js.map +1 -0
- package/dist/src/safety/context-builder.test.d.ts +6 -0
- package/dist/src/safety/context-builder.test.js +49 -0
- package/dist/src/safety/context-builder.test.js.map +1 -0
- package/dist/src/safety/protocol.d.ts +88 -0
- package/dist/src/safety/protocol.js +15 -0
- package/dist/src/safety/protocol.js.map +1 -0
- package/dist/src/safety/registry.d.ts +26 -0
- package/dist/src/safety/registry.js +65 -0
- package/dist/src/safety/registry.js.map +1 -0
- package/dist/src/safety/registry.test.d.ts +6 -0
- package/dist/src/safety/registry.test.js +31 -0
- package/dist/src/safety/registry.test.js.map +1 -0
- package/dist/src/services/chatCompressionService.d.ts +32 -0
- package/dist/src/services/chatCompressionService.js +162 -0
- package/dist/src/services/chatCompressionService.js.map +1 -0
- package/dist/src/services/chatCompressionService.test.d.ts +6 -0
- package/dist/src/services/chatCompressionService.test.js +210 -0
- package/dist/src/services/chatCompressionService.test.js.map +1 -0
- package/dist/src/services/chatRecordingService.d.ts +3 -2
- package/dist/src/services/chatRecordingService.js +11 -9
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.d.ts +2 -14
- package/dist/src/services/fileDiscoveryService.js +19 -55
- package/dist/src/services/fileDiscoveryService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.test.js +91 -11
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +4 -1
- package/dist/src/services/loopDetectionService.js +95 -42
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +220 -12
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/modelConfig.golden.test.d.ts +6 -0
- package/dist/src/services/modelConfig.golden.test.js +42 -0
- package/dist/src/services/modelConfig.golden.test.js.map +1 -0
- package/dist/src/services/modelConfig.integration.test.d.ts +6 -0
- package/dist/src/services/modelConfig.integration.test.js +247 -0
- package/dist/src/services/modelConfig.integration.test.js.map +1 -0
- package/dist/src/services/modelConfigService.d.ts +48 -0
- package/dist/src/services/modelConfigService.js +151 -0
- package/dist/src/services/modelConfigService.js.map +1 -0
- package/dist/src/services/modelConfigService.test.d.ts +6 -0
- package/dist/src/services/modelConfigService.test.js +531 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.d.ts +1 -0
- package/dist/src/services/shellExecutionService.js +195 -92
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +137 -14
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases.golden.json +202 -0
- package/dist/src/telemetry/activity-monitor.d.ts +116 -0
- package/dist/src/telemetry/activity-monitor.js +209 -0
- package/dist/src/telemetry/activity-monitor.js.map +1 -0
- package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
- package/dist/src/telemetry/activity-monitor.test.js +251 -0
- package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +25 -7
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +294 -76
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +192 -66
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +25 -3
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +59 -5
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +0 -28
- package/dist/src/telemetry/constants.js +0 -29
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.js +0 -1
- package/dist/src/telemetry/gcp-exporters.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.test.js +1 -1
- package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +7 -3
- package/dist/src/telemetry/index.js +13 -4
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +14 -7
- package/dist/src/telemetry/loggers.js +197 -320
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +0 -1
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +460 -59
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.d.ts +149 -0
- package/dist/src/telemetry/memory-monitor.js +335 -0
- package/dist/src/telemetry/memory-monitor.js.map +1 -0
- package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
- package/dist/src/telemetry/memory-monitor.test.js +472 -0
- package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +180 -4
- package/dist/src/telemetry/metrics.js +270 -6
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +502 -184
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.js +3 -2
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/semantic.d.ts +82 -0
- package/dist/src/telemetry/semantic.js +269 -0
- package/dist/src/telemetry/semantic.js.map +1 -0
- package/dist/src/telemetry/semantic.test.d.ts +6 -0
- package/dist/src/telemetry/semantic.test.js +387 -0
- package/dist/src/telemetry/semantic.test.js.map +1 -0
- package/dist/src/telemetry/telemetry-utils.test.js +29 -28
- package/dist/src/telemetry/telemetry-utils.test.js.map +1 -1
- package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
- package/dist/src/telemetry/telemetryAttributes.js +19 -0
- package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
- package/dist/src/telemetry/trace.d.ts +46 -0
- package/dist/src/telemetry/trace.js +121 -0
- package/dist/src/telemetry/trace.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +227 -29
- package/dist/src/telemetry/types.js +858 -72
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
- package/dist/src/telemetry/uiTelemetry.js +7 -7
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +89 -67
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/config.d.ts +1 -1
- package/dist/src/test-utils/config.js +1 -1
- package/dist/src/tools/base-tool-invocation.test.d.ts +6 -0
- package/dist/src/tools/base-tool-invocation.test.js +85 -0
- package/dist/src/tools/base-tool-invocation.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +4 -3
- package/dist/src/tools/edit.js +50 -47
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +306 -216
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +4 -3
- package/dist/src/tools/glob.js +24 -27
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +212 -205
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +4 -3
- package/dist/src/tools/grep.js +31 -25
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +15 -12
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +4 -3
- package/dist/src/tools/ls.js +29 -35
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +34 -42
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +49 -11
- package/dist/src/tools/mcp-client-manager.js +191 -31
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +132 -25
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +12 -5
- package/dist/src/tools/mcp-client.js +287 -267
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +352 -45
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +6 -2
- package/dist/src/tools/mcp-tool.js +19 -8
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +186 -273
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +7 -5
- package/dist/src/tools/memoryTool.js +14 -12
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +10 -9
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/message-bus-integration.test.js +14 -1
- package/dist/src/tools/message-bus-integration.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +5 -1
- package/dist/src/tools/modifiable-tool.js +38 -16
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +66 -31
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +6 -5
- package/dist/src/tools/read-file.js +26 -32
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +68 -33
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +6 -12
- package/dist/src/tools/read-many-files.js +28 -57
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +37 -36
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +28 -10
- package/dist/src/tools/ripGrep.js +195 -193
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +533 -204
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +8 -6
- package/dist/src/tools/shell.js +64 -38
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +134 -43
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/smart-edit.d.ts +10 -23
- package/dist/src/tools/smart-edit.js +100 -85
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +229 -179
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +21 -0
- package/dist/src/tools/tool-error.js +27 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +17 -0
- package/dist/src/tools/tool-names.js +21 -0
- package/dist/src/tools/tool-names.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +32 -20
- package/dist/src/tools/tool-registry.js +122 -78
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +167 -90
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +23 -8
- package/dist/src/tools/tools.js +69 -37
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +11 -3
- package/dist/src/tools/web-fetch.js +80 -38
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +338 -9
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +4 -3
- package/dist/src/tools/web-search.js +11 -9
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +6 -0
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +3 -2
- package/dist/src/tools/write-file.js +41 -40
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +130 -123
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +34 -9
- package/dist/src/tools/write-todos.js +54 -11
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +2 -2
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.js +3 -2
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/channel.d.ts +19 -0
- package/dist/src/utils/channel.js +49 -0
- package/dist/src/utils/channel.js.map +1 -0
- package/dist/src/utils/channel.test.d.ts +6 -0
- package/dist/src/utils/channel.test.js +170 -0
- package/dist/src/utils/channel.test.js.map +1 -0
- package/dist/src/utils/debugLogger.d.ts +25 -0
- package/dist/src/utils/debugLogger.js +33 -0
- package/dist/src/utils/debugLogger.js.map +1 -0
- package/dist/src/utils/debugLogger.test.d.ts +6 -0
- package/dist/src/utils/debugLogger.test.js +69 -0
- package/dist/src/utils/debugLogger.test.js.map +1 -0
- package/dist/src/utils/delay.d.ts +16 -0
- package/dist/src/utils/delay.js +43 -0
- package/dist/src/utils/delay.js.map +1 -0
- package/dist/src/utils/delay.test.d.ts +6 -0
- package/dist/src/utils/delay.test.js +88 -0
- package/dist/src/utils/delay.test.js.map +1 -0
- package/dist/src/utils/editCorrector.js +10 -25
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +19 -5
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +4 -2
- package/dist/src/utils/editor.js +53 -39
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +18 -45
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +2 -1
- package/dist/src/utils/environmentContext.js +20 -33
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +6 -34
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/errorParsing.d.ts +1 -1
- package/dist/src/utils/errorParsing.js +5 -33
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/errorParsing.test.js +0 -88
- package/dist/src/utils/errorParsing.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +6 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/events.d.ts +121 -0
- package/dist/src/utils/events.js +84 -0
- package/dist/src/utils/events.js.map +1 -0
- package/dist/src/utils/events.test.d.ts +6 -0
- package/dist/src/utils/events.test.js +212 -0
- package/dist/src/utils/events.test.js.map +1 -0
- package/dist/src/utils/extensionLoader.d.ts +86 -0
- package/dist/src/utils/extensionLoader.js +208 -0
- package/dist/src/utils/extensionLoader.js.map +1 -0
- package/dist/src/utils/extensionLoader.test.d.ts +6 -0
- package/dist/src/utils/extensionLoader.test.js +154 -0
- package/dist/src/utils/extensionLoader.test.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +1 -0
- package/dist/src/utils/fetch.js +4 -0
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +4 -0
- package/dist/src/utils/fileUtils.js +34 -2
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +87 -61
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js +1 -1
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +28 -47
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/formatters.d.ts +1 -0
- package/dist/src/utils/formatters.js +2 -1
- package/dist/src/utils/formatters.js.map +1 -1
- package/dist/src/utils/formatters.test.d.ts +6 -0
- package/dist/src/utils/formatters.test.js +26 -0
- package/dist/src/utils/formatters.test.js.map +1 -0
- package/dist/src/utils/getFolderStructure.js +9 -17
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/getFolderStructure.test.js +7 -6
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.d.ts +4 -1
- package/dist/src/utils/gitIgnoreParser.js +28 -10
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +58 -0
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/googleErrors.d.ts +104 -0
- package/dist/src/utils/googleErrors.js +152 -0
- package/dist/src/utils/googleErrors.js.map +1 -0
- package/dist/src/utils/googleErrors.test.d.ts +6 -0
- package/dist/src/utils/googleErrors.test.js +301 -0
- package/dist/src/utils/googleErrors.test.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.d.ts +37 -0
- package/dist/src/utils/googleQuotaErrors.js +157 -0
- package/dist/src/utils/googleQuotaErrors.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
- package/dist/src/utils/googleQuotaErrors.test.js +311 -0
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
- package/dist/src/utils/httpErrors.d.ts +18 -0
- package/dist/src/utils/httpErrors.js +36 -0
- package/dist/src/utils/httpErrors.js.map +1 -0
- package/dist/src/utils/ignorePatterns.test.js +26 -30
- package/dist/src/utils/ignorePatterns.test.js.map +1 -1
- package/dist/src/utils/installationManager.js +2 -1
- package/dist/src/utils/installationManager.js.map +1 -1
- package/dist/src/utils/installationManager.test.js +6 -4
- package/dist/src/utils/installationManager.test.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.d.ts +1 -1
- package/dist/src/utils/llm-edit-fixer.js +33 -9
- package/dist/src/utils/llm-edit-fixer.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.test.js +38 -1
- package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +20 -1
- package/dist/src/utils/memoryDiscovery.js +176 -12
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +299 -40
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +4 -3
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +8 -14
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.js +3 -3
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.test.js +13 -5
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
- package/dist/src/utils/package.d.ts +12 -0
- package/dist/src/utils/package.js +15 -0
- package/dist/src/utils/package.js.map +1 -0
- package/dist/src/utils/pathCorrector.d.ts +25 -0
- package/dist/src/utils/pathCorrector.js +33 -0
- package/dist/src/utils/pathCorrector.js.map +1 -0
- package/dist/src/utils/pathCorrector.test.d.ts +6 -0
- package/dist/src/utils/pathCorrector.test.js +83 -0
- package/dist/src/utils/pathCorrector.test.js.map +1 -0
- package/dist/src/utils/pathReader.js +4 -4
- package/dist/src/utils/pathReader.js.map +1 -1
- package/dist/src/utils/pathReader.test.js +44 -1
- package/dist/src/utils/pathReader.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +1 -1
- package/dist/src/utils/paths.js +131 -29
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +200 -68
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
- package/dist/src/utils/quotaErrorDetection.js +0 -46
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.d.ts +3 -10
- package/dist/src/utils/retry.js +97 -195
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +179 -145
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/safeJsonStringify.d.ts +4 -4
- package/dist/src/utils/safeJsonStringify.js +31 -7
- package/dist/src/utils/safeJsonStringify.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +15 -2
- package/dist/src/utils/shell-utils.js +387 -140
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +244 -62
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/stdio.d.ts +32 -0
- package/dist/src/utils/stdio.js +85 -0
- package/dist/src/utils/stdio.js.map +1 -0
- package/dist/src/utils/stdio.test.d.ts +6 -0
- package/dist/src/utils/stdio.test.js +47 -0
- package/dist/src/utils/stdio.test.js.map +1 -0
- package/dist/src/utils/summarizer.d.ts +4 -2
- package/dist/src/utils/summarizer.js +8 -9
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/summarizer.test.js +32 -12
- package/dist/src/utils/summarizer.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +5 -4
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/systemEncoding.test.js +2 -1
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/terminal.d.ts +14 -0
- package/dist/src/utils/terminal.js +38 -0
- package/dist/src/utils/terminal.js.map +1 -0
- package/dist/src/utils/tool-utils.d.ts +2 -2
- package/dist/src/utils/tool-utils.js +15 -6
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +8 -0
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/src/utils/userAccountManager.js +5 -4
- package/dist/src/utils/userAccountManager.js.map +1 -1
- package/dist/src/utils/userAccountManager.test.js +9 -7
- package/dist/src/utils/userAccountManager.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +4 -3
- package/dist/src/utils/workspaceContext.js +13 -13
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +8 -7
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -7
|
@@ -7,8 +7,10 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
|
7
7
|
import { CoreToolScheduler, convertToFunctionResponse, truncateAndSaveToFile, } from './coreToolScheduler.js';
|
|
8
8
|
import { DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES, DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD, BaseDeclarativeTool, BaseToolInvocation, ToolConfirmationOutcome, Kind, ApprovalMode, } from '../index.js';
|
|
9
9
|
import { MockModifiableTool, MockTool, MOCK_TOOL_SHOULD_CONFIRM_EXECUTE, } from '../test-utils/mock-tool.js';
|
|
10
|
+
import * as modifiableToolModule from '../tools/modifiable-tool.js';
|
|
10
11
|
import * as fs from 'node:fs/promises';
|
|
11
12
|
import * as path from 'node:path';
|
|
13
|
+
import { isShellInvocationAllowlisted } from '../utils/shell-utils.js';
|
|
12
14
|
vi.mock('fs/promises', () => ({
|
|
13
15
|
writeFile: vi.fn(),
|
|
14
16
|
}));
|
|
@@ -121,6 +123,50 @@ async function waitForStatus(onToolCallsUpdate, status, timeout = 5000) {
|
|
|
121
123
|
check();
|
|
122
124
|
});
|
|
123
125
|
}
|
|
126
|
+
function createMockConfig(overrides = {}) {
|
|
127
|
+
const defaultToolRegistry = {
|
|
128
|
+
getTool: () => undefined,
|
|
129
|
+
getToolByName: () => undefined,
|
|
130
|
+
getFunctionDeclarations: () => [],
|
|
131
|
+
tools: new Map(),
|
|
132
|
+
discovery: {},
|
|
133
|
+
registerTool: () => { },
|
|
134
|
+
getToolByDisplayName: () => undefined,
|
|
135
|
+
getTools: () => [],
|
|
136
|
+
discoverTools: async () => { },
|
|
137
|
+
getAllTools: () => [],
|
|
138
|
+
getToolsByServer: () => [],
|
|
139
|
+
};
|
|
140
|
+
const baseConfig = {
|
|
141
|
+
getSessionId: () => 'test-session-id',
|
|
142
|
+
getUsageStatisticsEnabled: () => true,
|
|
143
|
+
getDebugMode: () => false,
|
|
144
|
+
getApprovalMode: () => ApprovalMode.DEFAULT,
|
|
145
|
+
setApprovalMode: () => { },
|
|
146
|
+
getAllowedTools: () => [],
|
|
147
|
+
getContentGeneratorConfig: () => ({
|
|
148
|
+
model: 'test-model',
|
|
149
|
+
authType: 'oauth-personal',
|
|
150
|
+
}),
|
|
151
|
+
getShellExecutionConfig: () => ({
|
|
152
|
+
terminalWidth: 90,
|
|
153
|
+
terminalHeight: 30,
|
|
154
|
+
}),
|
|
155
|
+
storage: {
|
|
156
|
+
getProjectTempDir: () => '/tmp',
|
|
157
|
+
},
|
|
158
|
+
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
159
|
+
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
160
|
+
getToolRegistry: () => defaultToolRegistry,
|
|
161
|
+
getUseSmartEdit: () => false,
|
|
162
|
+
getUseModelRouter: () => false,
|
|
163
|
+
getGeminiClient: () => null,
|
|
164
|
+
getEnableMessageBusIntegration: () => false,
|
|
165
|
+
getMessageBus: () => null,
|
|
166
|
+
getPolicyEngine: () => null,
|
|
167
|
+
};
|
|
168
|
+
return { ...baseConfig, ...overrides };
|
|
169
|
+
}
|
|
124
170
|
describe('CoreToolScheduler', () => {
|
|
125
171
|
it('should cancel a tool call if the signal is aborted before confirmation', async () => {
|
|
126
172
|
const mockTool = new MockTool({
|
|
@@ -143,36 +189,15 @@ describe('CoreToolScheduler', () => {
|
|
|
143
189
|
};
|
|
144
190
|
const onAllToolCallsComplete = vi.fn();
|
|
145
191
|
const onToolCallsUpdate = vi.fn();
|
|
146
|
-
const mockConfig = {
|
|
147
|
-
getSessionId: () => 'test-session-id',
|
|
148
|
-
getUsageStatisticsEnabled: () => true,
|
|
149
|
-
getDebugMode: () => false,
|
|
150
|
-
getApprovalMode: () => ApprovalMode.DEFAULT,
|
|
151
|
-
getAllowedTools: () => [],
|
|
152
|
-
getContentGeneratorConfig: () => ({
|
|
153
|
-
model: 'test-model',
|
|
154
|
-
authType: 'oauth-personal',
|
|
155
|
-
}),
|
|
156
|
-
getShellExecutionConfig: () => ({
|
|
157
|
-
terminalWidth: 90,
|
|
158
|
-
terminalHeight: 30,
|
|
159
|
-
}),
|
|
160
|
-
storage: {
|
|
161
|
-
getProjectTempDir: () => '/tmp',
|
|
162
|
-
},
|
|
163
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
164
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
192
|
+
const mockConfig = createMockConfig({
|
|
165
193
|
getToolRegistry: () => mockToolRegistry,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
169
|
-
};
|
|
194
|
+
isInteractive: () => false,
|
|
195
|
+
});
|
|
170
196
|
const scheduler = new CoreToolScheduler({
|
|
171
197
|
config: mockConfig,
|
|
172
198
|
onAllToolCallsComplete,
|
|
173
199
|
onToolCallsUpdate,
|
|
174
200
|
getPreferredEditor: () => 'vscode',
|
|
175
|
-
onEditorClose: vi.fn(),
|
|
176
201
|
});
|
|
177
202
|
const abortController = new AbortController();
|
|
178
203
|
const request = {
|
|
@@ -189,6 +214,184 @@ describe('CoreToolScheduler', () => {
|
|
|
189
214
|
.calls[0][0];
|
|
190
215
|
expect(completedCalls[0].status).toBe('cancelled');
|
|
191
216
|
});
|
|
217
|
+
it('should cancel all tools when cancelAll is called', async () => {
|
|
218
|
+
const mockTool1 = new MockTool({
|
|
219
|
+
name: 'mockTool1',
|
|
220
|
+
shouldConfirmExecute: MOCK_TOOL_SHOULD_CONFIRM_EXECUTE,
|
|
221
|
+
});
|
|
222
|
+
const mockTool2 = new MockTool({ name: 'mockTool2' });
|
|
223
|
+
const mockTool3 = new MockTool({ name: 'mockTool3' });
|
|
224
|
+
const mockToolRegistry = {
|
|
225
|
+
getTool: (name) => {
|
|
226
|
+
if (name === 'mockTool1')
|
|
227
|
+
return mockTool1;
|
|
228
|
+
if (name === 'mockTool2')
|
|
229
|
+
return mockTool2;
|
|
230
|
+
if (name === 'mockTool3')
|
|
231
|
+
return mockTool3;
|
|
232
|
+
return undefined;
|
|
233
|
+
},
|
|
234
|
+
getFunctionDeclarations: () => [],
|
|
235
|
+
tools: new Map(),
|
|
236
|
+
discovery: {},
|
|
237
|
+
registerTool: () => { },
|
|
238
|
+
getToolByName: (name) => {
|
|
239
|
+
if (name === 'mockTool1')
|
|
240
|
+
return mockTool1;
|
|
241
|
+
if (name === 'mockTool2')
|
|
242
|
+
return mockTool2;
|
|
243
|
+
if (name === 'mockTool3')
|
|
244
|
+
return mockTool3;
|
|
245
|
+
return undefined;
|
|
246
|
+
},
|
|
247
|
+
getToolByDisplayName: () => undefined,
|
|
248
|
+
getTools: () => [],
|
|
249
|
+
discoverTools: async () => { },
|
|
250
|
+
getAllTools: () => [],
|
|
251
|
+
getToolsByServer: () => [],
|
|
252
|
+
};
|
|
253
|
+
const onAllToolCallsComplete = vi.fn();
|
|
254
|
+
const onToolCallsUpdate = vi.fn();
|
|
255
|
+
const mockConfig = createMockConfig({
|
|
256
|
+
getToolRegistry: () => mockToolRegistry,
|
|
257
|
+
isInteractive: () => false,
|
|
258
|
+
});
|
|
259
|
+
const scheduler = new CoreToolScheduler({
|
|
260
|
+
config: mockConfig,
|
|
261
|
+
onAllToolCallsComplete,
|
|
262
|
+
onToolCallsUpdate,
|
|
263
|
+
getPreferredEditor: () => 'vscode',
|
|
264
|
+
});
|
|
265
|
+
const abortController = new AbortController();
|
|
266
|
+
const requests = [
|
|
267
|
+
{
|
|
268
|
+
callId: '1',
|
|
269
|
+
name: 'mockTool1',
|
|
270
|
+
args: {},
|
|
271
|
+
isClientInitiated: false,
|
|
272
|
+
prompt_id: 'prompt-id-1',
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
callId: '2',
|
|
276
|
+
name: 'mockTool2',
|
|
277
|
+
args: {},
|
|
278
|
+
isClientInitiated: false,
|
|
279
|
+
prompt_id: 'prompt-id-1',
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
callId: '3',
|
|
283
|
+
name: 'mockTool3',
|
|
284
|
+
args: {},
|
|
285
|
+
isClientInitiated: false,
|
|
286
|
+
prompt_id: 'prompt-id-1',
|
|
287
|
+
},
|
|
288
|
+
];
|
|
289
|
+
// Don't await, let it run in the background
|
|
290
|
+
void scheduler.schedule(requests, abortController.signal);
|
|
291
|
+
// Wait for the first tool to be awaiting approval
|
|
292
|
+
await waitForStatus(onToolCallsUpdate, 'awaiting_approval');
|
|
293
|
+
// Cancel all operations
|
|
294
|
+
scheduler.cancelAll(abortController.signal);
|
|
295
|
+
abortController.abort(); // Also fire the signal
|
|
296
|
+
await vi.waitFor(() => {
|
|
297
|
+
expect(onAllToolCallsComplete).toHaveBeenCalled();
|
|
298
|
+
});
|
|
299
|
+
const completedCalls = onAllToolCallsComplete.mock
|
|
300
|
+
.calls[0][0];
|
|
301
|
+
expect(completedCalls).toHaveLength(3);
|
|
302
|
+
expect(completedCalls.find((c) => c.request.callId === '1')?.status).toBe('cancelled');
|
|
303
|
+
expect(completedCalls.find((c) => c.request.callId === '2')?.status).toBe('cancelled');
|
|
304
|
+
expect(completedCalls.find((c) => c.request.callId === '3')?.status).toBe('cancelled');
|
|
305
|
+
});
|
|
306
|
+
it('should cancel all tools in a batch when one is cancelled via confirmation', async () => {
|
|
307
|
+
const mockTool1 = new MockTool({
|
|
308
|
+
name: 'mockTool1',
|
|
309
|
+
shouldConfirmExecute: MOCK_TOOL_SHOULD_CONFIRM_EXECUTE,
|
|
310
|
+
});
|
|
311
|
+
const mockTool2 = new MockTool({ name: 'mockTool2' });
|
|
312
|
+
const mockTool3 = new MockTool({ name: 'mockTool3' });
|
|
313
|
+
const mockToolRegistry = {
|
|
314
|
+
getTool: (name) => {
|
|
315
|
+
if (name === 'mockTool1')
|
|
316
|
+
return mockTool1;
|
|
317
|
+
if (name === 'mockTool2')
|
|
318
|
+
return mockTool2;
|
|
319
|
+
if (name === 'mockTool3')
|
|
320
|
+
return mockTool3;
|
|
321
|
+
return undefined;
|
|
322
|
+
},
|
|
323
|
+
getFunctionDeclarations: () => [],
|
|
324
|
+
tools: new Map(),
|
|
325
|
+
discovery: {},
|
|
326
|
+
registerTool: () => { },
|
|
327
|
+
getToolByName: (name) => {
|
|
328
|
+
if (name === 'mockTool1')
|
|
329
|
+
return mockTool1;
|
|
330
|
+
if (name === 'mockTool2')
|
|
331
|
+
return mockTool2;
|
|
332
|
+
if (name === 'mockTool3')
|
|
333
|
+
return mockTool3;
|
|
334
|
+
return undefined;
|
|
335
|
+
},
|
|
336
|
+
getToolByDisplayName: () => undefined,
|
|
337
|
+
getTools: () => [],
|
|
338
|
+
discoverTools: async () => { },
|
|
339
|
+
getAllTools: () => [],
|
|
340
|
+
getToolsByServer: () => [],
|
|
341
|
+
};
|
|
342
|
+
const onAllToolCallsComplete = vi.fn();
|
|
343
|
+
const onToolCallsUpdate = vi.fn();
|
|
344
|
+
const mockConfig = createMockConfig({
|
|
345
|
+
getToolRegistry: () => mockToolRegistry,
|
|
346
|
+
isInteractive: () => false,
|
|
347
|
+
});
|
|
348
|
+
const scheduler = new CoreToolScheduler({
|
|
349
|
+
config: mockConfig,
|
|
350
|
+
onAllToolCallsComplete,
|
|
351
|
+
onToolCallsUpdate,
|
|
352
|
+
getPreferredEditor: () => 'vscode',
|
|
353
|
+
});
|
|
354
|
+
const abortController = new AbortController();
|
|
355
|
+
const requests = [
|
|
356
|
+
{
|
|
357
|
+
callId: '1',
|
|
358
|
+
name: 'mockTool1',
|
|
359
|
+
args: {},
|
|
360
|
+
isClientInitiated: false,
|
|
361
|
+
prompt_id: 'prompt-id-1',
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
callId: '2',
|
|
365
|
+
name: 'mockTool2',
|
|
366
|
+
args: {},
|
|
367
|
+
isClientInitiated: false,
|
|
368
|
+
prompt_id: 'prompt-id-1',
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
callId: '3',
|
|
372
|
+
name: 'mockTool3',
|
|
373
|
+
args: {},
|
|
374
|
+
isClientInitiated: false,
|
|
375
|
+
prompt_id: 'prompt-id-1',
|
|
376
|
+
},
|
|
377
|
+
];
|
|
378
|
+
// Don't await, let it run in the background
|
|
379
|
+
void scheduler.schedule(requests, abortController.signal);
|
|
380
|
+
// Wait for the first tool to be awaiting approval
|
|
381
|
+
const awaitingCall = (await waitForStatus(onToolCallsUpdate, 'awaiting_approval'));
|
|
382
|
+
// Cancel the first tool via its confirmation handler
|
|
383
|
+
await awaitingCall.confirmationDetails.onConfirm(ToolConfirmationOutcome.Cancel);
|
|
384
|
+
abortController.abort(); // User cancelling often involves an abort signal
|
|
385
|
+
await vi.waitFor(() => {
|
|
386
|
+
expect(onAllToolCallsComplete).toHaveBeenCalled();
|
|
387
|
+
});
|
|
388
|
+
const completedCalls = onAllToolCallsComplete.mock
|
|
389
|
+
.calls[0][0];
|
|
390
|
+
expect(completedCalls).toHaveLength(3);
|
|
391
|
+
expect(completedCalls.find((c) => c.request.callId === '1')?.status).toBe('cancelled');
|
|
392
|
+
expect(completedCalls.find((c) => c.request.callId === '2')?.status).toBe('cancelled');
|
|
393
|
+
expect(completedCalls.find((c) => c.request.callId === '3')?.status).toBe('cancelled');
|
|
394
|
+
});
|
|
192
395
|
it('should mark tool call as cancelled when abort happens during confirmation error', async () => {
|
|
193
396
|
const abortController = new AbortController();
|
|
194
397
|
const abortError = new Error('Abort requested during confirmation');
|
|
@@ -208,36 +411,15 @@ describe('CoreToolScheduler', () => {
|
|
|
208
411
|
};
|
|
209
412
|
const onAllToolCallsComplete = vi.fn();
|
|
210
413
|
const onToolCallsUpdate = vi.fn();
|
|
211
|
-
const mockConfig = {
|
|
212
|
-
getSessionId: () => 'test-session-id',
|
|
213
|
-
getUsageStatisticsEnabled: () => true,
|
|
214
|
-
getDebugMode: () => false,
|
|
215
|
-
getApprovalMode: () => ApprovalMode.DEFAULT,
|
|
216
|
-
getAllowedTools: () => [],
|
|
217
|
-
getContentGeneratorConfig: () => ({
|
|
218
|
-
model: 'test-model',
|
|
219
|
-
authType: 'oauth-personal',
|
|
220
|
-
}),
|
|
221
|
-
getShellExecutionConfig: () => ({
|
|
222
|
-
terminalWidth: 90,
|
|
223
|
-
terminalHeight: 30,
|
|
224
|
-
}),
|
|
225
|
-
storage: {
|
|
226
|
-
getProjectTempDir: () => '/tmp',
|
|
227
|
-
},
|
|
228
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
229
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
414
|
+
const mockConfig = createMockConfig({
|
|
230
415
|
getToolRegistry: () => mockToolRegistry,
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
getGeminiClient: () => null,
|
|
234
|
-
};
|
|
416
|
+
isInteractive: () => false,
|
|
417
|
+
});
|
|
235
418
|
const scheduler = new CoreToolScheduler({
|
|
236
419
|
config: mockConfig,
|
|
237
420
|
onAllToolCallsComplete,
|
|
238
421
|
onToolCallsUpdate,
|
|
239
422
|
getPreferredEditor: () => 'vscode',
|
|
240
|
-
onEditorClose: vi.fn(),
|
|
241
423
|
});
|
|
242
424
|
const request = {
|
|
243
425
|
callId: 'abort-1',
|
|
@@ -257,20 +439,17 @@ describe('CoreToolScheduler', () => {
|
|
|
257
439
|
describe('getToolSuggestion', () => {
|
|
258
440
|
it('should suggest the top N closest tool names for a typo', () => {
|
|
259
441
|
// Create mocked tool registry
|
|
260
|
-
const mockConfig = {
|
|
261
|
-
getToolRegistry: () => mockToolRegistry,
|
|
262
|
-
getUseSmartEdit: () => false,
|
|
263
|
-
getUseModelRouter: () => false,
|
|
264
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
265
|
-
};
|
|
266
442
|
const mockToolRegistry = {
|
|
267
443
|
getAllToolNames: () => ['list_files', 'read_file', 'write_file'],
|
|
268
444
|
};
|
|
445
|
+
const mockConfig = createMockConfig({
|
|
446
|
+
getToolRegistry: () => mockToolRegistry,
|
|
447
|
+
isInteractive: () => false,
|
|
448
|
+
});
|
|
269
449
|
// Create scheduler
|
|
270
450
|
const scheduler = new CoreToolScheduler({
|
|
271
451
|
config: mockConfig,
|
|
272
452
|
getPreferredEditor: () => 'vscode',
|
|
273
|
-
onEditorClose: vi.fn(),
|
|
274
453
|
});
|
|
275
454
|
// Test that the right tool is selected, with only 1 result, for typos
|
|
276
455
|
// @ts-expect-error accessing private method
|
|
@@ -307,36 +486,15 @@ describe('CoreToolScheduler with payload', () => {
|
|
|
307
486
|
};
|
|
308
487
|
const onAllToolCallsComplete = vi.fn();
|
|
309
488
|
const onToolCallsUpdate = vi.fn();
|
|
310
|
-
const mockConfig = {
|
|
311
|
-
getSessionId: () => 'test-session-id',
|
|
312
|
-
getUsageStatisticsEnabled: () => true,
|
|
313
|
-
getDebugMode: () => false,
|
|
314
|
-
getApprovalMode: () => ApprovalMode.DEFAULT,
|
|
315
|
-
getAllowedTools: () => [],
|
|
316
|
-
getContentGeneratorConfig: () => ({
|
|
317
|
-
model: 'test-model',
|
|
318
|
-
authType: 'oauth-personal',
|
|
319
|
-
}),
|
|
320
|
-
getShellExecutionConfig: () => ({
|
|
321
|
-
terminalWidth: 90,
|
|
322
|
-
terminalHeight: 30,
|
|
323
|
-
}),
|
|
324
|
-
storage: {
|
|
325
|
-
getProjectTempDir: () => '/tmp',
|
|
326
|
-
},
|
|
327
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
328
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
489
|
+
const mockConfig = createMockConfig({
|
|
329
490
|
getToolRegistry: () => mockToolRegistry,
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
333
|
-
};
|
|
491
|
+
isInteractive: () => false,
|
|
492
|
+
});
|
|
334
493
|
const scheduler = new CoreToolScheduler({
|
|
335
494
|
config: mockConfig,
|
|
336
495
|
onAllToolCallsComplete,
|
|
337
496
|
onToolCallsUpdate,
|
|
338
497
|
getPreferredEditor: () => 'vscode',
|
|
339
|
-
onEditorClose: vi.fn(),
|
|
340
498
|
});
|
|
341
499
|
const abortController = new AbortController();
|
|
342
500
|
const request = {
|
|
@@ -584,34 +742,15 @@ describe('CoreToolScheduler edit cancellation', () => {
|
|
|
584
742
|
};
|
|
585
743
|
const onAllToolCallsComplete = vi.fn();
|
|
586
744
|
const onToolCallsUpdate = vi.fn();
|
|
587
|
-
const mockConfig = {
|
|
588
|
-
getSessionId: () => 'test-session-id',
|
|
589
|
-
getUsageStatisticsEnabled: () => true,
|
|
590
|
-
getDebugMode: () => false,
|
|
591
|
-
getApprovalMode: () => ApprovalMode.DEFAULT,
|
|
592
|
-
getAllowedTools: () => [],
|
|
593
|
-
getContentGeneratorConfig: () => ({
|
|
594
|
-
model: 'test-model',
|
|
595
|
-
authType: 'oauth-personal',
|
|
596
|
-
}),
|
|
597
|
-
getShellExecutionConfig: () => ({
|
|
598
|
-
terminalWidth: 90,
|
|
599
|
-
terminalHeight: 30,
|
|
600
|
-
}),
|
|
601
|
-
storage: {
|
|
602
|
-
getProjectTempDir: () => '/tmp',
|
|
603
|
-
},
|
|
745
|
+
const mockConfig = createMockConfig({
|
|
604
746
|
getToolRegistry: () => mockToolRegistry,
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
608
|
-
};
|
|
747
|
+
isInteractive: () => false,
|
|
748
|
+
});
|
|
609
749
|
const scheduler = new CoreToolScheduler({
|
|
610
750
|
config: mockConfig,
|
|
611
751
|
onAllToolCallsComplete,
|
|
612
752
|
onToolCallsUpdate,
|
|
613
753
|
getPreferredEditor: () => 'vscode',
|
|
614
|
-
onEditorClose: vi.fn(),
|
|
615
754
|
});
|
|
616
755
|
const abortController = new AbortController();
|
|
617
756
|
const request = {
|
|
@@ -670,36 +809,16 @@ describe('CoreToolScheduler YOLO mode', () => {
|
|
|
670
809
|
const onAllToolCallsComplete = vi.fn();
|
|
671
810
|
const onToolCallsUpdate = vi.fn();
|
|
672
811
|
// Configure the scheduler for YOLO mode.
|
|
673
|
-
const mockConfig = {
|
|
674
|
-
getSessionId: () => 'test-session-id',
|
|
675
|
-
getUsageStatisticsEnabled: () => true,
|
|
676
|
-
getDebugMode: () => false,
|
|
677
|
-
getApprovalMode: () => ApprovalMode.YOLO,
|
|
678
|
-
getAllowedTools: () => [],
|
|
679
|
-
getContentGeneratorConfig: () => ({
|
|
680
|
-
model: 'test-model',
|
|
681
|
-
authType: 'oauth-personal',
|
|
682
|
-
}),
|
|
683
|
-
getShellExecutionConfig: () => ({
|
|
684
|
-
terminalWidth: 90,
|
|
685
|
-
terminalHeight: 30,
|
|
686
|
-
}),
|
|
687
|
-
storage: {
|
|
688
|
-
getProjectTempDir: () => '/tmp',
|
|
689
|
-
},
|
|
812
|
+
const mockConfig = createMockConfig({
|
|
690
813
|
getToolRegistry: () => mockToolRegistry,
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
getUseModelRouter: () => false,
|
|
695
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
696
|
-
};
|
|
814
|
+
getApprovalMode: () => ApprovalMode.YOLO,
|
|
815
|
+
isInteractive: () => false,
|
|
816
|
+
});
|
|
697
817
|
const scheduler = new CoreToolScheduler({
|
|
698
818
|
config: mockConfig,
|
|
699
819
|
onAllToolCallsComplete,
|
|
700
820
|
onToolCallsUpdate,
|
|
701
821
|
getPreferredEditor: () => 'vscode',
|
|
702
|
-
onEditorClose: vi.fn(),
|
|
703
822
|
});
|
|
704
823
|
const abortController = new AbortController();
|
|
705
824
|
const request = {
|
|
@@ -764,36 +883,16 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
764
883
|
};
|
|
765
884
|
const onAllToolCallsComplete = vi.fn();
|
|
766
885
|
const onToolCallsUpdate = vi.fn();
|
|
767
|
-
const mockConfig = {
|
|
768
|
-
getSessionId: () => 'test-session-id',
|
|
769
|
-
getUsageStatisticsEnabled: () => true,
|
|
770
|
-
getDebugMode: () => false,
|
|
771
|
-
getApprovalMode: () => ApprovalMode.YOLO, // Use YOLO to avoid confirmation prompts
|
|
772
|
-
getAllowedTools: () => [],
|
|
773
|
-
getContentGeneratorConfig: () => ({
|
|
774
|
-
model: 'test-model',
|
|
775
|
-
authType: 'oauth-personal',
|
|
776
|
-
}),
|
|
777
|
-
getShellExecutionConfig: () => ({
|
|
778
|
-
terminalWidth: 90,
|
|
779
|
-
terminalHeight: 30,
|
|
780
|
-
}),
|
|
781
|
-
storage: {
|
|
782
|
-
getProjectTempDir: () => '/tmp',
|
|
783
|
-
},
|
|
784
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
785
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
886
|
+
const mockConfig = createMockConfig({
|
|
786
887
|
getToolRegistry: () => mockToolRegistry,
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
};
|
|
888
|
+
getApprovalMode: () => ApprovalMode.YOLO, // Use YOLO to avoid confirmation prompts
|
|
889
|
+
isInteractive: () => false,
|
|
890
|
+
});
|
|
791
891
|
const scheduler = new CoreToolScheduler({
|
|
792
892
|
config: mockConfig,
|
|
793
893
|
onAllToolCallsComplete,
|
|
794
894
|
onToolCallsUpdate,
|
|
795
895
|
getPreferredEditor: () => 'vscode',
|
|
796
|
-
onEditorClose: vi.fn(),
|
|
797
896
|
});
|
|
798
897
|
const abortController = new AbortController();
|
|
799
898
|
const request1 = {
|
|
@@ -874,38 +973,20 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
874
973
|
const onAllToolCallsComplete = vi.fn();
|
|
875
974
|
const onToolCallsUpdate = vi.fn();
|
|
876
975
|
// Configure the scheduler to auto-approve the specific tool call.
|
|
877
|
-
const mockConfig = {
|
|
878
|
-
getSessionId: () => 'test-session-id',
|
|
879
|
-
getUsageStatisticsEnabled: () => true,
|
|
880
|
-
getDebugMode: () => false,
|
|
881
|
-
getApprovalMode: () => ApprovalMode.DEFAULT, // Not YOLO mode
|
|
976
|
+
const mockConfig = createMockConfig({
|
|
882
977
|
getAllowedTools: () => ['mockTool'], // Auto-approve this tool
|
|
883
978
|
getToolRegistry: () => toolRegistry,
|
|
884
|
-
getContentGeneratorConfig: () => ({
|
|
885
|
-
model: 'test-model',
|
|
886
|
-
authType: 'oauth-personal',
|
|
887
|
-
}),
|
|
888
979
|
getShellExecutionConfig: () => ({
|
|
889
980
|
terminalWidth: 80,
|
|
890
981
|
terminalHeight: 24,
|
|
891
982
|
}),
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
storage: {
|
|
895
|
-
getProjectTempDir: () => '/tmp',
|
|
896
|
-
},
|
|
897
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
898
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
899
|
-
getUseSmartEdit: () => false,
|
|
900
|
-
getUseModelRouter: () => false,
|
|
901
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
902
|
-
};
|
|
983
|
+
isInteractive: () => false,
|
|
984
|
+
});
|
|
903
985
|
const scheduler = new CoreToolScheduler({
|
|
904
986
|
config: mockConfig,
|
|
905
987
|
onAllToolCallsComplete,
|
|
906
988
|
onToolCallsUpdate,
|
|
907
989
|
getPreferredEditor: () => 'vscode',
|
|
908
|
-
onEditorClose: vi.fn(),
|
|
909
990
|
});
|
|
910
991
|
const abortController = new AbortController();
|
|
911
992
|
const request = {
|
|
@@ -946,6 +1027,71 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
946
1027
|
expect(completedCall.response.resultDisplay).toBe('Tool executed');
|
|
947
1028
|
}
|
|
948
1029
|
});
|
|
1030
|
+
it('should require approval for a chained shell command even when prefix is allowlisted', async () => {
|
|
1031
|
+
expect(isShellInvocationAllowlisted({
|
|
1032
|
+
params: { command: 'git status && rm -rf /tmp/should-not-run' },
|
|
1033
|
+
}, ['run_shell_command(git)'])).toBe(false);
|
|
1034
|
+
const executeFn = vi.fn().mockResolvedValue({
|
|
1035
|
+
llmContent: 'Shell command executed',
|
|
1036
|
+
returnDisplay: 'Shell command executed',
|
|
1037
|
+
});
|
|
1038
|
+
const mockShellTool = new MockTool({
|
|
1039
|
+
name: 'run_shell_command',
|
|
1040
|
+
shouldConfirmExecute: (params) => Promise.resolve({
|
|
1041
|
+
type: 'exec',
|
|
1042
|
+
title: 'Confirm Shell Command',
|
|
1043
|
+
command: String(params['command'] ?? ''),
|
|
1044
|
+
rootCommand: 'git',
|
|
1045
|
+
onConfirm: async () => { },
|
|
1046
|
+
}),
|
|
1047
|
+
execute: () => executeFn({}),
|
|
1048
|
+
});
|
|
1049
|
+
const toolRegistry = {
|
|
1050
|
+
getTool: () => mockShellTool,
|
|
1051
|
+
getToolByName: () => mockShellTool,
|
|
1052
|
+
getFunctionDeclarations: () => [],
|
|
1053
|
+
tools: new Map(),
|
|
1054
|
+
discovery: {},
|
|
1055
|
+
registerTool: () => { },
|
|
1056
|
+
getToolByDisplayName: () => mockShellTool,
|
|
1057
|
+
getTools: () => [],
|
|
1058
|
+
discoverTools: async () => { },
|
|
1059
|
+
getAllTools: () => [],
|
|
1060
|
+
getToolsByServer: () => [],
|
|
1061
|
+
};
|
|
1062
|
+
const onAllToolCallsComplete = vi.fn();
|
|
1063
|
+
const onToolCallsUpdate = vi.fn();
|
|
1064
|
+
const mockConfig = createMockConfig({
|
|
1065
|
+
getAllowedTools: () => ['run_shell_command(git)'],
|
|
1066
|
+
getShellExecutionConfig: () => ({
|
|
1067
|
+
terminalWidth: 80,
|
|
1068
|
+
terminalHeight: 24,
|
|
1069
|
+
}),
|
|
1070
|
+
getToolRegistry: () => toolRegistry,
|
|
1071
|
+
isInteractive: () => false,
|
|
1072
|
+
});
|
|
1073
|
+
const scheduler = new CoreToolScheduler({
|
|
1074
|
+
config: mockConfig,
|
|
1075
|
+
onAllToolCallsComplete,
|
|
1076
|
+
onToolCallsUpdate,
|
|
1077
|
+
getPreferredEditor: () => 'vscode',
|
|
1078
|
+
});
|
|
1079
|
+
const abortController = new AbortController();
|
|
1080
|
+
const request = {
|
|
1081
|
+
callId: 'shell-1',
|
|
1082
|
+
name: 'run_shell_command',
|
|
1083
|
+
args: { command: 'git status && rm -rf /tmp/should-not-run' },
|
|
1084
|
+
isClientInitiated: false,
|
|
1085
|
+
prompt_id: 'prompt-shell-auto-approved',
|
|
1086
|
+
};
|
|
1087
|
+
await scheduler.schedule([request], abortController.signal);
|
|
1088
|
+
const statusUpdates = onToolCallsUpdate.mock.calls
|
|
1089
|
+
.map((call) => call[0][0]?.status)
|
|
1090
|
+
.filter(Boolean);
|
|
1091
|
+
expect(statusUpdates).toContain('awaiting_approval');
|
|
1092
|
+
expect(executeFn).not.toHaveBeenCalled();
|
|
1093
|
+
expect(onAllToolCallsComplete).not.toHaveBeenCalled();
|
|
1094
|
+
}, 20000);
|
|
949
1095
|
it('should handle two synchronous calls to schedule', async () => {
|
|
950
1096
|
const executeFn = vi.fn().mockResolvedValue({
|
|
951
1097
|
llmContent: 'Tool executed',
|
|
@@ -968,36 +1114,16 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
968
1114
|
};
|
|
969
1115
|
const onAllToolCallsComplete = vi.fn();
|
|
970
1116
|
const onToolCallsUpdate = vi.fn();
|
|
971
|
-
const mockConfig = {
|
|
972
|
-
getSessionId: () => 'test-session-id',
|
|
973
|
-
getUsageStatisticsEnabled: () => true,
|
|
974
|
-
getDebugMode: () => false,
|
|
975
|
-
getApprovalMode: () => ApprovalMode.YOLO,
|
|
976
|
-
getAllowedTools: () => [],
|
|
977
|
-
getContentGeneratorConfig: () => ({
|
|
978
|
-
model: 'test-model',
|
|
979
|
-
authType: 'oauth-personal',
|
|
980
|
-
}),
|
|
981
|
-
getShellExecutionConfig: () => ({
|
|
982
|
-
terminalWidth: 90,
|
|
983
|
-
terminalHeight: 30,
|
|
984
|
-
}),
|
|
985
|
-
storage: {
|
|
986
|
-
getProjectTempDir: () => '/tmp',
|
|
987
|
-
},
|
|
988
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
989
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
1117
|
+
const mockConfig = createMockConfig({
|
|
990
1118
|
getToolRegistry: () => mockToolRegistry,
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
};
|
|
1119
|
+
getApprovalMode: () => ApprovalMode.YOLO,
|
|
1120
|
+
isInteractive: () => false,
|
|
1121
|
+
});
|
|
995
1122
|
const scheduler = new CoreToolScheduler({
|
|
996
1123
|
config: mockConfig,
|
|
997
1124
|
onAllToolCallsComplete,
|
|
998
1125
|
onToolCallsUpdate,
|
|
999
1126
|
getPreferredEditor: () => 'vscode',
|
|
1000
|
-
onEditorClose: vi.fn(),
|
|
1001
1127
|
});
|
|
1002
1128
|
const abortController = new AbortController();
|
|
1003
1129
|
const request1 = {
|
|
@@ -1028,28 +1154,13 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
1028
1154
|
});
|
|
1029
1155
|
it('should auto-approve remaining tool calls when first tool call is approved with ProceedAlways', async () => {
|
|
1030
1156
|
let approvalMode = ApprovalMode.DEFAULT;
|
|
1031
|
-
const mockConfig = {
|
|
1032
|
-
getSessionId: () => 'test-session-id',
|
|
1033
|
-
getUsageStatisticsEnabled: () => true,
|
|
1034
|
-
getDebugMode: () => false,
|
|
1157
|
+
const mockConfig = createMockConfig({
|
|
1035
1158
|
getApprovalMode: () => approvalMode,
|
|
1036
|
-
getAllowedTools: () => [],
|
|
1037
1159
|
setApprovalMode: (mode) => {
|
|
1038
1160
|
approvalMode = mode;
|
|
1039
1161
|
},
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
terminalHeight: 30,
|
|
1043
|
-
}),
|
|
1044
|
-
storage: {
|
|
1045
|
-
getProjectTempDir: () => '/tmp',
|
|
1046
|
-
},
|
|
1047
|
-
getTruncateToolOutputThreshold: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
1048
|
-
getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
1049
|
-
getUseSmartEdit: () => false,
|
|
1050
|
-
getUseModelRouter: () => false,
|
|
1051
|
-
getGeminiClient: () => null, // No client needed for these tests
|
|
1052
|
-
};
|
|
1162
|
+
isInteractive: () => false,
|
|
1163
|
+
});
|
|
1053
1164
|
const testTool = new TestApprovalTool(mockConfig);
|
|
1054
1165
|
const toolRegistry = {
|
|
1055
1166
|
getTool: () => testTool,
|
|
@@ -1094,7 +1205,6 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
1094
1205
|
});
|
|
1095
1206
|
},
|
|
1096
1207
|
getPreferredEditor: () => 'vscode',
|
|
1097
|
-
onEditorClose: vi.fn(),
|
|
1098
1208
|
});
|
|
1099
1209
|
const abortController = new AbortController();
|
|
1100
1210
|
// Schedule multiple tools that need confirmation
|
|
@@ -1122,27 +1232,273 @@ describe('CoreToolScheduler request queueing', () => {
|
|
|
1122
1232
|
},
|
|
1123
1233
|
];
|
|
1124
1234
|
await scheduler.schedule(requests, abortController.signal);
|
|
1125
|
-
// Wait for
|
|
1235
|
+
// Wait for the FIRST tool to be awaiting approval
|
|
1126
1236
|
await vi.waitFor(() => {
|
|
1127
1237
|
const calls = onToolCallsUpdate.mock.calls.at(-1)?.[0];
|
|
1238
|
+
// With the sequential scheduler, the update includes the active call and the queue.
|
|
1128
1239
|
expect(calls?.length).toBe(3);
|
|
1129
|
-
expect(calls?.
|
|
1240
|
+
expect(calls?.[0].status).toBe('awaiting_approval');
|
|
1241
|
+
expect(calls?.[0].request.callId).toBe('1');
|
|
1242
|
+
// Check that the other two are in the queue (still in 'validating' state)
|
|
1243
|
+
expect(calls?.[1].status).toBe('validating');
|
|
1244
|
+
expect(calls?.[2].status).toBe('validating');
|
|
1130
1245
|
});
|
|
1131
|
-
expect(pendingConfirmations.length).toBe(
|
|
1246
|
+
expect(pendingConfirmations.length).toBe(1);
|
|
1132
1247
|
// Approve the first tool with ProceedAlways
|
|
1133
1248
|
const firstConfirmation = pendingConfirmations[0];
|
|
1134
1249
|
firstConfirmation(ToolConfirmationOutcome.ProceedAlways);
|
|
1135
1250
|
// Wait for all tools to be completed
|
|
1136
1251
|
await vi.waitFor(() => {
|
|
1137
1252
|
expect(onAllToolCallsComplete).toHaveBeenCalled();
|
|
1138
|
-
const completedCalls = onAllToolCallsComplete.mock.calls.at(-1)?.[0];
|
|
1139
|
-
expect(completedCalls?.length).toBe(3);
|
|
1140
|
-
expect(completedCalls?.every((call) => call.status === 'success')).toBe(true);
|
|
1141
1253
|
});
|
|
1254
|
+
const completedCalls = onAllToolCallsComplete.mock.calls.at(-1)?.[0];
|
|
1255
|
+
expect(completedCalls?.length).toBe(3);
|
|
1256
|
+
expect(completedCalls?.every((call) => call.status === 'success')).toBe(true);
|
|
1142
1257
|
// Verify approval mode was changed
|
|
1143
1258
|
expect(approvalMode).toBe(ApprovalMode.AUTO_EDIT);
|
|
1144
1259
|
});
|
|
1145
1260
|
});
|
|
1261
|
+
describe('CoreToolScheduler Sequential Execution', () => {
|
|
1262
|
+
it('should execute tool calls in a batch sequentially', async () => {
|
|
1263
|
+
// Arrange
|
|
1264
|
+
let firstCallFinished = false;
|
|
1265
|
+
const executeFn = vi
|
|
1266
|
+
.fn()
|
|
1267
|
+
.mockImplementation(async (args) => {
|
|
1268
|
+
if (args.call === 1) {
|
|
1269
|
+
// First call, wait for a bit to simulate work
|
|
1270
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1271
|
+
firstCallFinished = true;
|
|
1272
|
+
return { llmContent: 'First call done' };
|
|
1273
|
+
}
|
|
1274
|
+
if (args.call === 2) {
|
|
1275
|
+
// Second call, should only happen after the first is finished
|
|
1276
|
+
if (!firstCallFinished) {
|
|
1277
|
+
throw new Error('Second tool call started before the first one finished!');
|
|
1278
|
+
}
|
|
1279
|
+
return { llmContent: 'Second call done' };
|
|
1280
|
+
}
|
|
1281
|
+
return { llmContent: 'default' };
|
|
1282
|
+
});
|
|
1283
|
+
const mockTool = new MockTool({ name: 'mockTool', execute: executeFn });
|
|
1284
|
+
const declarativeTool = mockTool;
|
|
1285
|
+
const mockToolRegistry = {
|
|
1286
|
+
getTool: () => declarativeTool,
|
|
1287
|
+
getToolByName: () => declarativeTool,
|
|
1288
|
+
getFunctionDeclarations: () => [],
|
|
1289
|
+
tools: new Map(),
|
|
1290
|
+
discovery: {},
|
|
1291
|
+
registerTool: () => { },
|
|
1292
|
+
getToolByDisplayName: () => declarativeTool,
|
|
1293
|
+
getTools: () => [],
|
|
1294
|
+
discoverTools: async () => { },
|
|
1295
|
+
getAllTools: () => [],
|
|
1296
|
+
getToolsByServer: () => [],
|
|
1297
|
+
};
|
|
1298
|
+
const onAllToolCallsComplete = vi.fn();
|
|
1299
|
+
const onToolCallsUpdate = vi.fn();
|
|
1300
|
+
const mockConfig = createMockConfig({
|
|
1301
|
+
getToolRegistry: () => mockToolRegistry,
|
|
1302
|
+
getApprovalMode: () => ApprovalMode.YOLO, // Use YOLO to avoid confirmation prompts
|
|
1303
|
+
isInteractive: () => false,
|
|
1304
|
+
});
|
|
1305
|
+
const scheduler = new CoreToolScheduler({
|
|
1306
|
+
config: mockConfig,
|
|
1307
|
+
onAllToolCallsComplete,
|
|
1308
|
+
onToolCallsUpdate,
|
|
1309
|
+
getPreferredEditor: () => 'vscode',
|
|
1310
|
+
});
|
|
1311
|
+
const abortController = new AbortController();
|
|
1312
|
+
const requests = [
|
|
1313
|
+
{
|
|
1314
|
+
callId: '1',
|
|
1315
|
+
name: 'mockTool',
|
|
1316
|
+
args: { call: 1 },
|
|
1317
|
+
isClientInitiated: false,
|
|
1318
|
+
prompt_id: 'prompt-1',
|
|
1319
|
+
},
|
|
1320
|
+
{
|
|
1321
|
+
callId: '2',
|
|
1322
|
+
name: 'mockTool',
|
|
1323
|
+
args: { call: 2 },
|
|
1324
|
+
isClientInitiated: false,
|
|
1325
|
+
prompt_id: 'prompt-1',
|
|
1326
|
+
},
|
|
1327
|
+
];
|
|
1328
|
+
// Act
|
|
1329
|
+
await scheduler.schedule(requests, abortController.signal);
|
|
1330
|
+
// Assert
|
|
1331
|
+
await vi.waitFor(() => {
|
|
1332
|
+
expect(onAllToolCallsComplete).toHaveBeenCalled();
|
|
1333
|
+
});
|
|
1334
|
+
// Check that execute was called twice
|
|
1335
|
+
expect(executeFn).toHaveBeenCalledTimes(2);
|
|
1336
|
+
// Check the order of calls
|
|
1337
|
+
const calls = executeFn.mock.calls;
|
|
1338
|
+
expect(calls[0][0]).toEqual({ call: 1 });
|
|
1339
|
+
expect(calls[1][0]).toEqual({ call: 2 });
|
|
1340
|
+
// The onAllToolCallsComplete should be called once with both results
|
|
1341
|
+
const completedCalls = onAllToolCallsComplete.mock
|
|
1342
|
+
.calls[0][0];
|
|
1343
|
+
expect(completedCalls).toHaveLength(2);
|
|
1344
|
+
expect(completedCalls[0].status).toBe('success');
|
|
1345
|
+
expect(completedCalls[1].status).toBe('success');
|
|
1346
|
+
});
|
|
1347
|
+
it('should cancel subsequent tools when the signal is aborted.', async () => {
|
|
1348
|
+
// Arrange
|
|
1349
|
+
const abortController = new AbortController();
|
|
1350
|
+
let secondCallStarted = false;
|
|
1351
|
+
const executeFn = vi
|
|
1352
|
+
.fn()
|
|
1353
|
+
.mockImplementation(async (args) => {
|
|
1354
|
+
if (args.call === 1) {
|
|
1355
|
+
return { llmContent: 'First call done' };
|
|
1356
|
+
}
|
|
1357
|
+
if (args.call === 2) {
|
|
1358
|
+
secondCallStarted = true;
|
|
1359
|
+
// This call will be cancelled while it's "running".
|
|
1360
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1361
|
+
// It should not return a value because it will be cancelled.
|
|
1362
|
+
return { llmContent: 'Second call should not complete' };
|
|
1363
|
+
}
|
|
1364
|
+
if (args.call === 3) {
|
|
1365
|
+
return { llmContent: 'Third call done' };
|
|
1366
|
+
}
|
|
1367
|
+
return { llmContent: 'default' };
|
|
1368
|
+
});
|
|
1369
|
+
const mockTool = new MockTool({ name: 'mockTool', execute: executeFn });
|
|
1370
|
+
const declarativeTool = mockTool;
|
|
1371
|
+
const mockToolRegistry = {
|
|
1372
|
+
getTool: () => declarativeTool,
|
|
1373
|
+
getToolByName: () => declarativeTool,
|
|
1374
|
+
getFunctionDeclarations: () => [],
|
|
1375
|
+
tools: new Map(),
|
|
1376
|
+
discovery: {},
|
|
1377
|
+
registerTool: () => { },
|
|
1378
|
+
getToolByDisplayName: () => declarativeTool,
|
|
1379
|
+
getTools: () => [],
|
|
1380
|
+
discoverTools: async () => { },
|
|
1381
|
+
getAllTools: () => [],
|
|
1382
|
+
getToolsByServer: () => [],
|
|
1383
|
+
};
|
|
1384
|
+
const onAllToolCallsComplete = vi.fn();
|
|
1385
|
+
const onToolCallsUpdate = vi.fn();
|
|
1386
|
+
const mockConfig = createMockConfig({
|
|
1387
|
+
getToolRegistry: () => mockToolRegistry,
|
|
1388
|
+
getApprovalMode: () => ApprovalMode.YOLO,
|
|
1389
|
+
isInteractive: () => false,
|
|
1390
|
+
});
|
|
1391
|
+
const scheduler = new CoreToolScheduler({
|
|
1392
|
+
config: mockConfig,
|
|
1393
|
+
onAllToolCallsComplete,
|
|
1394
|
+
onToolCallsUpdate,
|
|
1395
|
+
getPreferredEditor: () => 'vscode',
|
|
1396
|
+
});
|
|
1397
|
+
const requests = [
|
|
1398
|
+
{
|
|
1399
|
+
callId: '1',
|
|
1400
|
+
name: 'mockTool',
|
|
1401
|
+
args: { call: 1 },
|
|
1402
|
+
isClientInitiated: false,
|
|
1403
|
+
prompt_id: 'prompt-1',
|
|
1404
|
+
},
|
|
1405
|
+
{
|
|
1406
|
+
callId: '2',
|
|
1407
|
+
name: 'mockTool',
|
|
1408
|
+
args: { call: 2 },
|
|
1409
|
+
isClientInitiated: false,
|
|
1410
|
+
prompt_id: 'prompt-1',
|
|
1411
|
+
},
|
|
1412
|
+
{
|
|
1413
|
+
callId: '3',
|
|
1414
|
+
name: 'mockTool',
|
|
1415
|
+
args: { call: 3 },
|
|
1416
|
+
isClientInitiated: false,
|
|
1417
|
+
prompt_id: 'prompt-1',
|
|
1418
|
+
},
|
|
1419
|
+
];
|
|
1420
|
+
// Act
|
|
1421
|
+
const schedulePromise = scheduler.schedule(requests, abortController.signal);
|
|
1422
|
+
// Wait for the second call to start, then abort.
|
|
1423
|
+
await vi.waitFor(() => {
|
|
1424
|
+
expect(secondCallStarted).toBe(true);
|
|
1425
|
+
});
|
|
1426
|
+
abortController.abort();
|
|
1427
|
+
await schedulePromise;
|
|
1428
|
+
// Assert
|
|
1429
|
+
await vi.waitFor(() => {
|
|
1430
|
+
expect(onAllToolCallsComplete).toHaveBeenCalled();
|
|
1431
|
+
});
|
|
1432
|
+
// Check that execute was called for the first two tools only
|
|
1433
|
+
expect(executeFn).toHaveBeenCalledTimes(2);
|
|
1434
|
+
expect(executeFn).toHaveBeenCalledWith({ call: 1 });
|
|
1435
|
+
expect(executeFn).toHaveBeenCalledWith({ call: 2 });
|
|
1436
|
+
const completedCalls = onAllToolCallsComplete.mock
|
|
1437
|
+
.calls[0][0];
|
|
1438
|
+
expect(completedCalls).toHaveLength(3);
|
|
1439
|
+
const call1 = completedCalls.find((c) => c.request.callId === '1');
|
|
1440
|
+
const call2 = completedCalls.find((c) => c.request.callId === '2');
|
|
1441
|
+
const call3 = completedCalls.find((c) => c.request.callId === '3');
|
|
1442
|
+
expect(call1?.status).toBe('success');
|
|
1443
|
+
expect(call2?.status).toBe('cancelled');
|
|
1444
|
+
expect(call3?.status).toBe('cancelled');
|
|
1445
|
+
});
|
|
1446
|
+
it('should pass confirmation diff data into modifyWithEditor overrides', async () => {
|
|
1447
|
+
const modifyWithEditorSpy = vi
|
|
1448
|
+
.spyOn(modifiableToolModule, 'modifyWithEditor')
|
|
1449
|
+
.mockResolvedValue({
|
|
1450
|
+
updatedParams: { param: 'updated' },
|
|
1451
|
+
updatedDiff: 'updated diff',
|
|
1452
|
+
});
|
|
1453
|
+
const mockModifiableTool = new MockModifiableTool('mockModifiableTool');
|
|
1454
|
+
const mockToolRegistry = {
|
|
1455
|
+
getTool: () => mockModifiableTool,
|
|
1456
|
+
getToolByName: () => mockModifiableTool,
|
|
1457
|
+
getFunctionDeclarations: () => [],
|
|
1458
|
+
tools: new Map(),
|
|
1459
|
+
discovery: {},
|
|
1460
|
+
registerTool: () => { },
|
|
1461
|
+
getToolByDisplayName: () => mockModifiableTool,
|
|
1462
|
+
getTools: () => [],
|
|
1463
|
+
discoverTools: async () => { },
|
|
1464
|
+
getAllTools: () => [],
|
|
1465
|
+
getToolsByServer: () => [],
|
|
1466
|
+
};
|
|
1467
|
+
const onAllToolCallsComplete = vi.fn();
|
|
1468
|
+
const onToolCallsUpdate = vi.fn();
|
|
1469
|
+
const mockConfig = createMockConfig({
|
|
1470
|
+
getToolRegistry: () => mockToolRegistry,
|
|
1471
|
+
});
|
|
1472
|
+
const scheduler = new CoreToolScheduler({
|
|
1473
|
+
config: mockConfig,
|
|
1474
|
+
onAllToolCallsComplete,
|
|
1475
|
+
onToolCallsUpdate,
|
|
1476
|
+
getPreferredEditor: () => 'vscode',
|
|
1477
|
+
});
|
|
1478
|
+
const abortController = new AbortController();
|
|
1479
|
+
await scheduler.schedule([
|
|
1480
|
+
{
|
|
1481
|
+
callId: '1',
|
|
1482
|
+
name: 'mockModifiableTool',
|
|
1483
|
+
args: {},
|
|
1484
|
+
isClientInitiated: false,
|
|
1485
|
+
prompt_id: 'prompt-1',
|
|
1486
|
+
},
|
|
1487
|
+
], abortController.signal);
|
|
1488
|
+
const toolCall = scheduler
|
|
1489
|
+
.toolCalls[0];
|
|
1490
|
+
expect(toolCall.status).toBe('awaiting_approval');
|
|
1491
|
+
const confirmationSignal = new AbortController().signal;
|
|
1492
|
+
await scheduler.handleConfirmationResponse(toolCall.request.callId, async () => { }, ToolConfirmationOutcome.ModifyWithEditor, confirmationSignal);
|
|
1493
|
+
expect(modifyWithEditorSpy).toHaveBeenCalled();
|
|
1494
|
+
const overrides = modifyWithEditorSpy.mock.calls[modifyWithEditorSpy.mock.calls.length - 1][4];
|
|
1495
|
+
expect(overrides).toEqual({
|
|
1496
|
+
currentContent: 'originalContent',
|
|
1497
|
+
proposedContent: 'newContent',
|
|
1498
|
+
});
|
|
1499
|
+
modifyWithEditorSpy.mockRestore();
|
|
1500
|
+
});
|
|
1501
|
+
});
|
|
1146
1502
|
describe('truncateAndSaveToFile', () => {
|
|
1147
1503
|
const mockWriteFile = vi.mocked(fs.writeFile);
|
|
1148
1504
|
const THRESHOLD = 40_000;
|