@machina.ai/cell-cli-core 1.13.0-rc4 → 1.16.0-rc1
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 +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +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 +3 -0
- package/dist/src/agents/executor.js +21 -0
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js +358 -3
- package/dist/src/agents/executor.test.js.map +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/experiments/client_metadata.js +2 -1
- package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
- 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.js +2 -2
- package/dist/src/code_assist/experiments/experiments.js.map +1 -1
- 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 +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js +49 -0
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/server.js +5 -8
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +109 -28
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.d.ts +34 -2
- package/dist/src/config/config.js +147 -26
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +436 -19
- 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 +158 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -0
- package/dist/src/config/models.d.ts +22 -1
- package/dist/src/config/models.js +49 -6
- 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/confirmation-bus/message-bus.d.ts +1 -1
- package/dist/src/confirmation-bus/message-bus.js +2 -2
- 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 +1 -0
- package/dist/src/core/baseLlmClient.d.ts +4 -8
- package/dist/src/core/baseLlmClient.js +3 -8
- 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 +6 -5
- package/dist/src/core/client.js +33 -33
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +40 -22
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +7 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +151 -357
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +6 -4
- package/dist/src/core/geminiChat.js +106 -29
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +317 -16
- 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 +15 -9
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +31 -16
- package/dist/src/core/logger.test.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.test.js +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +8 -11
- package/dist/src/core/prompts.js.map +1 -1
- 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/fallback/handler.js +52 -7
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +69 -16
- 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/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/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 +3 -3
- package/dist/src/hooks/types.js +1 -1
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/hooks/types.test.js +280 -2
- package/dist/src/hooks/types.test.js.map +1 -1
- 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 +5 -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 +9 -8
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.js +159 -0
- package/dist/src/ide/ide-client.test.js.map +1 -1
- package/dist/src/ide/ide-installer.js +65 -20
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +41 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/ide/types.d.ts +1 -1
- package/dist/src/ide/types.js +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.js +1 -1
- package/dist/src/mcp/google-auth-provider.js.map +1 -1
- package/dist/src/mcp/mcpLauncher.js +6 -2
- package/dist/src/mcp/mcpLauncher.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +2 -2
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +177 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/sa-impersonation-provider.js +1 -1
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
- package/dist/src/policy/config.js +3 -1
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +135 -1
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/policies/discovered.toml +8 -0
- package/dist/src/policy/policies/write.toml +10 -0
- package/dist/src/policy/policy-engine.d.ts +12 -3
- package/dist/src/policy/policy-engine.js +71 -9
- 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 +2 -1
- package/dist/src/policy/toml-loader.js +103 -6
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +222 -368
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +65 -0
- package/dist/src/policy/types.js +4 -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 +40 -0
- package/dist/src/prompts/mcp-prompts.test.js.map +1 -0
- package/dist/src/prompts/prompt-registry.test.d.ts +6 -0
- package/dist/src/prompts/prompt-registry.test.js +111 -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 +6 -14
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +13 -10
- 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.test.js +1 -0
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/gitService.js +1 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +1 -1
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +3 -0
- package/dist/src/services/loopDetectionService.js +81 -42
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +101 -1
- 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 +213 -0
- package/dist/src/services/modelConfig.integration.test.js.map +1 -0
- package/dist/src/services/modelConfigService.d.ts +46 -0
- package/dist/src/services/modelConfigService.js +146 -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 +509 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +169 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +11 -9
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +174 -150
- 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 +76 -20
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +6 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +18 -5
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +7 -7
- package/dist/src/telemetry/loggers.js +23 -23
- 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 +72 -18
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +8 -4
- package/dist/src/telemetry/metrics.js +10 -4
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +42 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/telemetryAttributes.js +1 -0
- package/dist/src/telemetry/telemetryAttributes.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +17 -11
- package/dist/src/telemetry/types.js +53 -28
- package/dist/src/telemetry/types.js.map +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 +1 -1
- package/dist/src/tools/edit.js +31 -33
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +31 -20
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +1 -1
- package/dist/src/tools/glob.js +7 -7
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +20 -17
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +1 -1
- package/dist/src/tools/grep.js +9 -9
- 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 +1 -1
- package/dist/src/tools/ls.js +14 -15
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +32 -33
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +24 -52
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +18 -0
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +1 -0
- package/dist/src/tools/mcp-tool.js +5 -2
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/memoryTool.js +1 -1
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +1 -1
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +5 -1
- package/dist/src/tools/modifiable-tool.js +34 -13
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +56 -22
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +2 -2
- package/dist/src/tools/read-file.js +20 -24
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +63 -51
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +2 -9
- package/dist/src/tools/read-many-files.js +10 -21
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +37 -35
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +25 -8
- package/dist/src/tools/ripGrep.js +148 -176
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +383 -58
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +1 -1
- package/dist/src/tools/shell.js +17 -15
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +66 -36
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/smart-edit.d.ts +6 -1
- package/dist/src/tools/smart-edit.js +18 -17
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +49 -24
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +29 -4
- package/dist/src/tools/tool-registry.js +108 -29
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +134 -4
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +2 -1
- package/dist/src/tools/tools.js +5 -2
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +2 -4
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +11 -4
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.js +1 -2
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +11 -5
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.js +31 -31
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +24 -5
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +29 -0
- package/dist/src/tools/write-todos.js +34 -1
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/utils/editCorrector.js +4 -15
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +16 -0
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +3 -1
- package/dist/src/utils/editor.js +18 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +11 -0
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/environmentContext.js +3 -1
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +6 -0
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +14 -11
- package/dist/src/utils/events.js +1 -14
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +8 -0
- package/dist/src/utils/extensionLoader.js +61 -15
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.js +83 -19
- package/dist/src/utils/extensionLoader.test.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +75 -60
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +2 -2
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
- package/dist/src/utils/googleQuotaErrors.js +20 -12
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- 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/llm-edit-fixer.js +1 -2
- package/dist/src/utils/llm-edit-fixer.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.test.js +16 -1
- package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +8 -0
- package/dist/src/utils/memoryDiscovery.js +24 -0
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +43 -1
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.js +1 -2
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.test.js +10 -4
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
- 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 +5 -3
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/retry.d.ts +0 -9
- package/dist/src/utils/retry.js +24 -28
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +51 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/shell-utils.js +5 -3
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +9 -9
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/summarizer.d.ts +4 -2
- package/dist/src/utils/summarizer.js +6 -8
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/summarizer.test.js +32 -11
- package/dist/src/utils/summarizer.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +4 -3
- package/dist/src/utils/workspaceContext.js +10 -11
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +1 -1
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { Config,
|
|
7
|
+
import { Config, DEFAULT_FILE_FILTERING_OPTIONS } from './config.js';
|
|
8
|
+
import { ExperimentFlags } from '../code_assist/experiments/flagNames.js';
|
|
9
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
10
|
+
import { ApprovalMode } from '../policy/types.js';
|
|
11
|
+
import { HookType, HookEventName } from '../hooks/types.js';
|
|
8
12
|
import * as path from 'node:path';
|
|
9
13
|
import { setGeminiMdFilename as mockSetGeminiMdFilename } from '../tools/memoryTool.js';
|
|
10
14
|
import { DEFAULT_TELEMETRY_TARGET, DEFAULT_OTLP_ENDPOINT, } from '../telemetry/index.js';
|
|
@@ -19,6 +23,15 @@ import { RipGrepTool, canUseRipgrep } from '../tools/ripGrep.js';
|
|
|
19
23
|
import { logRipgrepFallback } from '../telemetry/loggers.js';
|
|
20
24
|
import { RipgrepFallbackEvent } from '../telemetry/types.js';
|
|
21
25
|
import { ToolRegistry } from '../tools/tool-registry.js';
|
|
26
|
+
import { DEFAULT_MODEL_CONFIGS } from './defaultModelConfigs.js';
|
|
27
|
+
const mockCoreEvents = vi.hoisted(() => ({
|
|
28
|
+
emit: vi.fn(),
|
|
29
|
+
emitFeedback: vi.fn(),
|
|
30
|
+
emitModelChanged: vi.fn(),
|
|
31
|
+
}));
|
|
32
|
+
vi.mock('../utils/events.js', () => ({
|
|
33
|
+
coreEvents: mockCoreEvents,
|
|
34
|
+
}));
|
|
22
35
|
vi.mock('fs', async (importOriginal) => {
|
|
23
36
|
const actual = await importOriginal();
|
|
24
37
|
return {
|
|
@@ -35,6 +48,7 @@ vi.mock('../tools/tool-registry', () => {
|
|
|
35
48
|
const ToolRegistryMock = vi.fn();
|
|
36
49
|
ToolRegistryMock.prototype.registerTool = vi.fn();
|
|
37
50
|
ToolRegistryMock.prototype.discoverAllTools = vi.fn();
|
|
51
|
+
ToolRegistryMock.prototype.sortTools = vi.fn();
|
|
38
52
|
ToolRegistryMock.prototype.getAllTools = vi.fn(() => []); // Mock methods if needed
|
|
39
53
|
ToolRegistryMock.prototype.getTool = vi.fn();
|
|
40
54
|
ToolRegistryMock.prototype.getFunctionDeclarations = vi.fn(() => []);
|
|
@@ -121,10 +135,14 @@ vi.mock('../agents/subagent-tool-wrapper.js', () => ({
|
|
|
121
135
|
import { BaseLlmClient } from '../core/baseLlmClient.js';
|
|
122
136
|
import { tokenLimit } from '../core/tokenLimits.js';
|
|
123
137
|
import { uiTelemetryService } from '../telemetry/index.js';
|
|
138
|
+
import { getCodeAssistServer } from '../code_assist/codeAssist.js';
|
|
139
|
+
import { getExperiments } from '../code_assist/experiments/experiments.js';
|
|
124
140
|
vi.mock('../core/baseLlmClient.js');
|
|
125
141
|
vi.mock('../core/tokenLimits.js', () => ({
|
|
126
142
|
tokenLimit: vi.fn(),
|
|
127
143
|
}));
|
|
144
|
+
vi.mock('../code_assist/codeAssist.js');
|
|
145
|
+
vi.mock('../code_assist/experiments/experiments.js');
|
|
128
146
|
describe('Server Config (config.ts)', () => {
|
|
129
147
|
const MODEL = 'gemini-pro';
|
|
130
148
|
const SANDBOX = {
|
|
@@ -197,7 +215,7 @@ describe('Server Config (config.ts)', () => {
|
|
|
197
215
|
...baseParams,
|
|
198
216
|
experiments: {
|
|
199
217
|
flags: {
|
|
200
|
-
|
|
218
|
+
[ExperimentFlags.CONTEXT_COMPRESSION_THRESHOLD]: {
|
|
201
219
|
floatValue: 0.8,
|
|
202
220
|
},
|
|
203
221
|
},
|
|
@@ -210,7 +228,7 @@ describe('Server Config (config.ts)', () => {
|
|
|
210
228
|
...baseParams,
|
|
211
229
|
experiments: {
|
|
212
230
|
flags: {
|
|
213
|
-
|
|
231
|
+
[ExperimentFlags.CONTEXT_COMPRESSION_THRESHOLD]: {
|
|
214
232
|
floatValue: 0.0,
|
|
215
233
|
},
|
|
216
234
|
},
|
|
@@ -222,6 +240,40 @@ describe('Server Config (config.ts)', () => {
|
|
|
222
240
|
const config = new Config(baseParams);
|
|
223
241
|
expect(await config.getCompressionThreshold()).toBeUndefined();
|
|
224
242
|
});
|
|
243
|
+
describe('getUserCaching', () => {
|
|
244
|
+
it('should return the remote experiment flag when available', async () => {
|
|
245
|
+
const config = new Config({
|
|
246
|
+
...baseParams,
|
|
247
|
+
experiments: {
|
|
248
|
+
flags: {
|
|
249
|
+
[ExperimentFlags.USER_CACHING]: {
|
|
250
|
+
boolValue: true,
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
experimentIds: [],
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
expect(await config.getUserCaching()).toBe(true);
|
|
257
|
+
});
|
|
258
|
+
it('should return false when the remote flag is false', async () => {
|
|
259
|
+
const config = new Config({
|
|
260
|
+
...baseParams,
|
|
261
|
+
experiments: {
|
|
262
|
+
flags: {
|
|
263
|
+
[ExperimentFlags.USER_CACHING]: {
|
|
264
|
+
boolValue: false,
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
experimentIds: [],
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
expect(await config.getUserCaching()).toBe(false);
|
|
271
|
+
});
|
|
272
|
+
it('should return undefined if there are no experiments', async () => {
|
|
273
|
+
const config = new Config(baseParams);
|
|
274
|
+
expect(await config.getUserCaching()).toBeUndefined();
|
|
275
|
+
});
|
|
276
|
+
});
|
|
225
277
|
});
|
|
226
278
|
describe('refreshAuth', () => {
|
|
227
279
|
it('should refresh auth and update config', async () => {
|
|
@@ -255,6 +307,13 @@ describe('Server Config (config.ts)', () => {
|
|
|
255
307
|
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE, vi.fn());
|
|
256
308
|
expect(config.getGeminiClient().stripThoughtsFromHistory).toHaveBeenCalledWith();
|
|
257
309
|
});
|
|
310
|
+
it('should strip thoughts when switching from GenAI to Vertex AI', async () => {
|
|
311
|
+
const config = new Config(baseParams);
|
|
312
|
+
vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => ({ authType }));
|
|
313
|
+
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
314
|
+
await config.refreshAuth(AuthType.USE_VERTEX_AI);
|
|
315
|
+
expect(config.getGeminiClient().stripThoughtsFromHistory).toHaveBeenCalledWith();
|
|
316
|
+
});
|
|
258
317
|
it('should not strip thoughts when switching from Vertex to GenAI', async () => {
|
|
259
318
|
const config = new Config(baseParams);
|
|
260
319
|
vi.mocked(createContentGeneratorConfig).mockImplementation(async (_, authType) => Promise.resolve({
|
|
@@ -265,6 +324,72 @@ describe('Server Config (config.ts)', () => {
|
|
|
265
324
|
expect(config.getGeminiClient().stripThoughtsFromHistory).not.toHaveBeenCalledWith();
|
|
266
325
|
});
|
|
267
326
|
});
|
|
327
|
+
describe('Preview Features Logic in refreshAuth', () => {
|
|
328
|
+
beforeEach(() => {
|
|
329
|
+
// Set up default mock behavior for these functions before each test
|
|
330
|
+
vi.mocked(getCodeAssistServer).mockReturnValue(undefined);
|
|
331
|
+
vi.mocked(getExperiments).mockResolvedValue({
|
|
332
|
+
flags: {},
|
|
333
|
+
experimentIds: [],
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
it('should enable preview features for Google auth when remote flag is true', async () => {
|
|
337
|
+
// Override the default mock for this specific test
|
|
338
|
+
vi.mocked(getCodeAssistServer).mockReturnValue({}); // Simulate Google auth by returning a truthy value
|
|
339
|
+
vi.mocked(getExperiments).mockResolvedValue({
|
|
340
|
+
flags: {
|
|
341
|
+
[ExperimentFlags.ENABLE_PREVIEW]: { boolValue: true },
|
|
342
|
+
},
|
|
343
|
+
experimentIds: [],
|
|
344
|
+
});
|
|
345
|
+
const config = new Config({ ...baseParams, previewFeatures: undefined });
|
|
346
|
+
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
|
347
|
+
expect(config.getPreviewFeatures()).toBe(true);
|
|
348
|
+
});
|
|
349
|
+
it('should disable preview features for Google auth when remote flag is false', async () => {
|
|
350
|
+
// Override the default mock
|
|
351
|
+
vi.mocked(getCodeAssistServer).mockReturnValue({});
|
|
352
|
+
vi.mocked(getExperiments).mockResolvedValue({
|
|
353
|
+
flags: {
|
|
354
|
+
[ExperimentFlags.ENABLE_PREVIEW]: { boolValue: false },
|
|
355
|
+
},
|
|
356
|
+
experimentIds: [],
|
|
357
|
+
});
|
|
358
|
+
const config = new Config({ ...baseParams, previewFeatures: undefined });
|
|
359
|
+
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
|
360
|
+
expect(config.getPreviewFeatures()).toBe(undefined);
|
|
361
|
+
});
|
|
362
|
+
it('should disable preview features for Google auth when remote flag is missing', async () => {
|
|
363
|
+
// Override the default mock for getCodeAssistServer, the getExperiments mock is already correct
|
|
364
|
+
vi.mocked(getCodeAssistServer).mockReturnValue({});
|
|
365
|
+
const config = new Config({ ...baseParams, previewFeatures: undefined });
|
|
366
|
+
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
|
367
|
+
expect(config.getPreviewFeatures()).toBe(undefined);
|
|
368
|
+
});
|
|
369
|
+
it('should not change preview features or model if it is already set to true', async () => {
|
|
370
|
+
const initialModel = 'some-other-model';
|
|
371
|
+
const config = new Config({
|
|
372
|
+
...baseParams,
|
|
373
|
+
previewFeatures: true,
|
|
374
|
+
model: initialModel,
|
|
375
|
+
});
|
|
376
|
+
// It doesn't matter which auth method we use here, the logic should exit early
|
|
377
|
+
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
378
|
+
expect(config.getPreviewFeatures()).toBe(true);
|
|
379
|
+
expect(config.getModel()).toBe(initialModel);
|
|
380
|
+
});
|
|
381
|
+
it('should not change preview features or model if it is already set to false', async () => {
|
|
382
|
+
const initialModel = 'some-other-model';
|
|
383
|
+
const config = new Config({
|
|
384
|
+
...baseParams,
|
|
385
|
+
previewFeatures: false,
|
|
386
|
+
model: initialModel,
|
|
387
|
+
});
|
|
388
|
+
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
389
|
+
expect(config.getPreviewFeatures()).toBe(false);
|
|
390
|
+
expect(config.getModel()).toBe(initialModel);
|
|
391
|
+
});
|
|
392
|
+
});
|
|
268
393
|
it('Config constructor should store userMemory correctly', () => {
|
|
269
394
|
const config = new Config(baseParams);
|
|
270
395
|
expect(config.getUserMemory()).toBe(USER_MEMORY);
|
|
@@ -305,7 +430,8 @@ describe('Server Config (config.ts)', () => {
|
|
|
305
430
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(false);
|
|
306
431
|
});
|
|
307
432
|
it('should initialize WorkspaceContext with includeDirectories', () => {
|
|
308
|
-
const
|
|
433
|
+
const resolved = path.resolve(baseParams.targetDir);
|
|
434
|
+
const includeDirectories = ['dir1', 'dir2'];
|
|
309
435
|
const paramsWithIncludeDirs = {
|
|
310
436
|
...baseParams,
|
|
311
437
|
includeDirectories,
|
|
@@ -315,9 +441,9 @@ describe('Server Config (config.ts)', () => {
|
|
|
315
441
|
const directories = workspaceContext.getDirectories();
|
|
316
442
|
// Should include the target directory plus the included directories
|
|
317
443
|
expect(directories).toHaveLength(3);
|
|
318
|
-
expect(directories).toContain(
|
|
319
|
-
expect(directories).toContain('
|
|
320
|
-
expect(directories).toContain('
|
|
444
|
+
expect(directories).toContain(resolved);
|
|
445
|
+
expect(directories).toContain(path.join(resolved, 'dir1'));
|
|
446
|
+
expect(directories).toContain(path.join(resolved, 'dir2'));
|
|
321
447
|
});
|
|
322
448
|
it('Config constructor should set telemetry to true when provided as true', () => {
|
|
323
449
|
const paramsWithTelemetry = {
|
|
@@ -674,18 +800,6 @@ describe('Server Config (config.ts)', () => {
|
|
|
674
800
|
const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
|
|
675
801
|
expect(wasShellToolRegistered).toBe(true);
|
|
676
802
|
});
|
|
677
|
-
it('should not register a tool if excludeTools contains the non-minified class name', async () => {
|
|
678
|
-
const params = {
|
|
679
|
-
...baseParams,
|
|
680
|
-
coreTools: undefined, // all tools enabled by default
|
|
681
|
-
excludeTools: ['ShellTool'],
|
|
682
|
-
};
|
|
683
|
-
const config = new Config(params);
|
|
684
|
-
await config.initialize();
|
|
685
|
-
const registerToolMock = (await vi.importMock('../tools/tool-registry')).ToolRegistry.prototype.registerTool;
|
|
686
|
-
const wasShellToolRegistered = registerToolMock.mock.calls.some((call) => call[0] instanceof vi.mocked(ShellTool));
|
|
687
|
-
expect(wasShellToolRegistered).toBe(false);
|
|
688
|
-
});
|
|
689
803
|
it('should register a tool if coreTools contains an argument-specific pattern with the non-minified class name', async () => {
|
|
690
804
|
const params = {
|
|
691
805
|
...baseParams,
|
|
@@ -872,4 +986,307 @@ describe('BaseLlmClient Lifecycle', () => {
|
|
|
872
986
|
expect(BaseLlmClient).toHaveBeenCalledWith(config.getContentGenerator(), config);
|
|
873
987
|
});
|
|
874
988
|
});
|
|
989
|
+
describe('Generation Config Merging (HACK)', () => {
|
|
990
|
+
const MODEL = 'gemini-pro';
|
|
991
|
+
const SANDBOX = {
|
|
992
|
+
command: 'docker',
|
|
993
|
+
image: 'gemini-cli-sandbox',
|
|
994
|
+
};
|
|
995
|
+
const TARGET_DIR = '/path/to/target';
|
|
996
|
+
const DEBUG_MODE = false;
|
|
997
|
+
const QUESTION = 'test question';
|
|
998
|
+
const USER_MEMORY = 'Test User Memory';
|
|
999
|
+
const TELEMETRY_SETTINGS = { enabled: false };
|
|
1000
|
+
const EMBEDDING_MODEL = 'gemini-embedding';
|
|
1001
|
+
const SESSION_ID = 'test-session-id';
|
|
1002
|
+
const baseParams = {
|
|
1003
|
+
cwd: '/tmp',
|
|
1004
|
+
embeddingModel: EMBEDDING_MODEL,
|
|
1005
|
+
sandbox: SANDBOX,
|
|
1006
|
+
targetDir: TARGET_DIR,
|
|
1007
|
+
debugMode: DEBUG_MODE,
|
|
1008
|
+
question: QUESTION,
|
|
1009
|
+
userMemory: USER_MEMORY,
|
|
1010
|
+
telemetry: TELEMETRY_SETTINGS,
|
|
1011
|
+
sessionId: SESSION_ID,
|
|
1012
|
+
model: MODEL,
|
|
1013
|
+
usageStatisticsEnabled: false,
|
|
1014
|
+
};
|
|
1015
|
+
it('should merge default aliases when user provides only overrides', () => {
|
|
1016
|
+
const userOverrides = [
|
|
1017
|
+
{
|
|
1018
|
+
match: { model: 'test-model' },
|
|
1019
|
+
modelConfig: { generateContentConfig: { temperature: 0.1 } },
|
|
1020
|
+
},
|
|
1021
|
+
];
|
|
1022
|
+
const params = {
|
|
1023
|
+
...baseParams,
|
|
1024
|
+
modelConfigServiceConfig: {
|
|
1025
|
+
overrides: userOverrides,
|
|
1026
|
+
},
|
|
1027
|
+
};
|
|
1028
|
+
const config = new Config(params);
|
|
1029
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1030
|
+
const serviceConfig = config.modelConfigService.config;
|
|
1031
|
+
// Assert that the default aliases are present
|
|
1032
|
+
expect(serviceConfig.aliases).toEqual(DEFAULT_MODEL_CONFIGS.aliases);
|
|
1033
|
+
// Assert that the user's overrides are present
|
|
1034
|
+
expect(serviceConfig.overrides).toEqual(userOverrides);
|
|
1035
|
+
});
|
|
1036
|
+
it('should use user-provided aliases if they exist', () => {
|
|
1037
|
+
const userAliases = {
|
|
1038
|
+
'my-alias': {
|
|
1039
|
+
modelConfig: { model: 'my-model' },
|
|
1040
|
+
},
|
|
1041
|
+
};
|
|
1042
|
+
const params = {
|
|
1043
|
+
...baseParams,
|
|
1044
|
+
modelConfigServiceConfig: {
|
|
1045
|
+
aliases: userAliases,
|
|
1046
|
+
},
|
|
1047
|
+
};
|
|
1048
|
+
const config = new Config(params);
|
|
1049
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1050
|
+
const serviceConfig = config.modelConfigService.config;
|
|
1051
|
+
// Assert that the user's aliases are used, not the defaults
|
|
1052
|
+
expect(serviceConfig.aliases).toEqual(userAliases);
|
|
1053
|
+
});
|
|
1054
|
+
it('should use default generation config if none is provided', () => {
|
|
1055
|
+
const params = { ...baseParams };
|
|
1056
|
+
const config = new Config(params);
|
|
1057
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1058
|
+
const serviceConfig = config.modelConfigService.config;
|
|
1059
|
+
// Assert that the full default config is used
|
|
1060
|
+
expect(serviceConfig).toEqual(DEFAULT_MODEL_CONFIGS);
|
|
1061
|
+
});
|
|
1062
|
+
});
|
|
1063
|
+
describe('Config getHooks', () => {
|
|
1064
|
+
const baseParams = {
|
|
1065
|
+
cwd: '/tmp',
|
|
1066
|
+
targetDir: '/path/to/target',
|
|
1067
|
+
debugMode: false,
|
|
1068
|
+
sessionId: 'test-session-id',
|
|
1069
|
+
model: 'gemini-pro',
|
|
1070
|
+
usageStatisticsEnabled: false,
|
|
1071
|
+
};
|
|
1072
|
+
it('should return undefined when no hooks are provided', () => {
|
|
1073
|
+
const config = new Config(baseParams);
|
|
1074
|
+
expect(config.getHooks()).toBeUndefined();
|
|
1075
|
+
});
|
|
1076
|
+
it('should return empty object when empty hooks are provided', () => {
|
|
1077
|
+
const configWithEmptyHooks = new Config({
|
|
1078
|
+
...baseParams,
|
|
1079
|
+
hooks: {},
|
|
1080
|
+
});
|
|
1081
|
+
expect(configWithEmptyHooks.getHooks()).toEqual({});
|
|
1082
|
+
});
|
|
1083
|
+
it('should return the hooks configuration when provided', () => {
|
|
1084
|
+
const mockHooks = {
|
|
1085
|
+
[HookEventName.BeforeTool]: [
|
|
1086
|
+
{
|
|
1087
|
+
matcher: 'write_file',
|
|
1088
|
+
hooks: [
|
|
1089
|
+
{
|
|
1090
|
+
type: HookType.Command,
|
|
1091
|
+
command: 'echo "test hook"',
|
|
1092
|
+
timeout: 5000,
|
|
1093
|
+
},
|
|
1094
|
+
],
|
|
1095
|
+
},
|
|
1096
|
+
],
|
|
1097
|
+
[HookEventName.AfterTool]: [
|
|
1098
|
+
{
|
|
1099
|
+
hooks: [
|
|
1100
|
+
{
|
|
1101
|
+
type: HookType.Command,
|
|
1102
|
+
command: './hooks/after-tool.sh',
|
|
1103
|
+
timeout: 10000,
|
|
1104
|
+
},
|
|
1105
|
+
],
|
|
1106
|
+
},
|
|
1107
|
+
],
|
|
1108
|
+
};
|
|
1109
|
+
const config = new Config({
|
|
1110
|
+
...baseParams,
|
|
1111
|
+
hooks: mockHooks,
|
|
1112
|
+
});
|
|
1113
|
+
const retrievedHooks = config.getHooks();
|
|
1114
|
+
expect(retrievedHooks).toEqual(mockHooks);
|
|
1115
|
+
expect(retrievedHooks).toBe(mockHooks); // Should return the same reference
|
|
1116
|
+
});
|
|
1117
|
+
it('should return hooks with all supported event types', () => {
|
|
1118
|
+
const allEventHooks = {
|
|
1119
|
+
[HookEventName.BeforeAgent]: [
|
|
1120
|
+
{ hooks: [{ type: HookType.Command, command: 'test1' }] },
|
|
1121
|
+
],
|
|
1122
|
+
[HookEventName.AfterAgent]: [
|
|
1123
|
+
{ hooks: [{ type: HookType.Command, command: 'test2' }] },
|
|
1124
|
+
],
|
|
1125
|
+
[HookEventName.BeforeTool]: [
|
|
1126
|
+
{ hooks: [{ type: HookType.Command, command: 'test3' }] },
|
|
1127
|
+
],
|
|
1128
|
+
[HookEventName.AfterTool]: [
|
|
1129
|
+
{ hooks: [{ type: HookType.Command, command: 'test4' }] },
|
|
1130
|
+
],
|
|
1131
|
+
[HookEventName.BeforeModel]: [
|
|
1132
|
+
{ hooks: [{ type: HookType.Command, command: 'test5' }] },
|
|
1133
|
+
],
|
|
1134
|
+
[HookEventName.AfterModel]: [
|
|
1135
|
+
{ hooks: [{ type: HookType.Command, command: 'test6' }] },
|
|
1136
|
+
],
|
|
1137
|
+
[HookEventName.BeforeToolSelection]: [
|
|
1138
|
+
{ hooks: [{ type: HookType.Command, command: 'test7' }] },
|
|
1139
|
+
],
|
|
1140
|
+
[HookEventName.Notification]: [
|
|
1141
|
+
{ hooks: [{ type: HookType.Command, command: 'test8' }] },
|
|
1142
|
+
],
|
|
1143
|
+
[HookEventName.SessionStart]: [
|
|
1144
|
+
{ hooks: [{ type: HookType.Command, command: 'test9' }] },
|
|
1145
|
+
],
|
|
1146
|
+
[HookEventName.SessionEnd]: [
|
|
1147
|
+
{ hooks: [{ type: HookType.Command, command: 'test10' }] },
|
|
1148
|
+
],
|
|
1149
|
+
[HookEventName.PreCompress]: [
|
|
1150
|
+
{ hooks: [{ type: HookType.Command, command: 'test11' }] },
|
|
1151
|
+
],
|
|
1152
|
+
};
|
|
1153
|
+
const config = new Config({
|
|
1154
|
+
...baseParams,
|
|
1155
|
+
hooks: allEventHooks,
|
|
1156
|
+
});
|
|
1157
|
+
const retrievedHooks = config.getHooks();
|
|
1158
|
+
expect(retrievedHooks).toEqual(allEventHooks);
|
|
1159
|
+
expect(Object.keys(retrievedHooks)).toHaveLength(11); // All hook event types
|
|
1160
|
+
});
|
|
1161
|
+
describe('setModel', () => {
|
|
1162
|
+
it('should allow setting a pro (any) model and disable fallback mode', () => {
|
|
1163
|
+
const config = new Config(baseParams);
|
|
1164
|
+
config.setFallbackMode(true);
|
|
1165
|
+
expect(config.isInFallbackMode()).toBe(true);
|
|
1166
|
+
const proModel = 'gemini-2.5-pro';
|
|
1167
|
+
config.setModel(proModel);
|
|
1168
|
+
expect(config.getModel()).toBe(proModel);
|
|
1169
|
+
expect(config.isInFallbackMode()).toBe(false);
|
|
1170
|
+
expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith(proModel);
|
|
1171
|
+
});
|
|
1172
|
+
it('should allow setting auto model from non-auto model and disable fallback mode', () => {
|
|
1173
|
+
const config = new Config(baseParams);
|
|
1174
|
+
config.setFallbackMode(true);
|
|
1175
|
+
expect(config.isInFallbackMode()).toBe(true);
|
|
1176
|
+
config.setModel('auto');
|
|
1177
|
+
expect(config.getModel()).toBe('auto');
|
|
1178
|
+
expect(config.isInFallbackMode()).toBe(false);
|
|
1179
|
+
expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
|
|
1180
|
+
});
|
|
1181
|
+
it('should allow setting auto model from auto model if it is in the fallback mode', () => {
|
|
1182
|
+
const config = new Config({
|
|
1183
|
+
cwd: '/tmp',
|
|
1184
|
+
targetDir: '/path/to/target',
|
|
1185
|
+
debugMode: false,
|
|
1186
|
+
sessionId: 'test-session-id',
|
|
1187
|
+
model: 'auto',
|
|
1188
|
+
usageStatisticsEnabled: false,
|
|
1189
|
+
});
|
|
1190
|
+
config.setFallbackMode(true);
|
|
1191
|
+
expect(config.isInFallbackMode()).toBe(true);
|
|
1192
|
+
config.setModel('auto');
|
|
1193
|
+
expect(config.getModel()).toBe('auto');
|
|
1194
|
+
expect(config.isInFallbackMode()).toBe(false);
|
|
1195
|
+
expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
|
|
1196
|
+
});
|
|
1197
|
+
});
|
|
1198
|
+
});
|
|
1199
|
+
describe('Config getExperiments', () => {
|
|
1200
|
+
const baseParams = {
|
|
1201
|
+
cwd: '/tmp',
|
|
1202
|
+
targetDir: '/path/to/target',
|
|
1203
|
+
debugMode: false,
|
|
1204
|
+
sessionId: 'test-session-id',
|
|
1205
|
+
model: 'gemini-pro',
|
|
1206
|
+
usageStatisticsEnabled: false,
|
|
1207
|
+
};
|
|
1208
|
+
it('should return undefined when no experiments are provided', () => {
|
|
1209
|
+
const config = new Config(baseParams);
|
|
1210
|
+
expect(config.getExperiments()).toBeUndefined();
|
|
1211
|
+
});
|
|
1212
|
+
it('should return empty object when empty experiments are provided', () => {
|
|
1213
|
+
const configWithEmptyExps = new Config({
|
|
1214
|
+
...baseParams,
|
|
1215
|
+
experiments: { flags: {}, experimentIds: [] },
|
|
1216
|
+
});
|
|
1217
|
+
expect(configWithEmptyExps.getExperiments()).toEqual({
|
|
1218
|
+
flags: {},
|
|
1219
|
+
experimentIds: [],
|
|
1220
|
+
});
|
|
1221
|
+
});
|
|
1222
|
+
it('should return the experiments configuration when provided', () => {
|
|
1223
|
+
const mockExps = {
|
|
1224
|
+
flags: {
|
|
1225
|
+
testFlag: { boolValue: true },
|
|
1226
|
+
},
|
|
1227
|
+
experimentIds: [],
|
|
1228
|
+
};
|
|
1229
|
+
const config = new Config({
|
|
1230
|
+
...baseParams,
|
|
1231
|
+
experiments: mockExps,
|
|
1232
|
+
});
|
|
1233
|
+
const retrievedExps = config.getExperiments();
|
|
1234
|
+
expect(retrievedExps).toEqual(mockExps);
|
|
1235
|
+
expect(retrievedExps).toBe(mockExps); // Should return the same reference
|
|
1236
|
+
});
|
|
1237
|
+
});
|
|
1238
|
+
describe('Config setExperiments logging', () => {
|
|
1239
|
+
const baseParams = {
|
|
1240
|
+
cwd: '/tmp',
|
|
1241
|
+
targetDir: '/path/to/target',
|
|
1242
|
+
debugMode: false,
|
|
1243
|
+
sessionId: 'test-session-id',
|
|
1244
|
+
model: 'gemini-pro',
|
|
1245
|
+
usageStatisticsEnabled: false,
|
|
1246
|
+
};
|
|
1247
|
+
it('logs a sorted, non-truncated summary of experiments when they are set', () => {
|
|
1248
|
+
const config = new Config(baseParams);
|
|
1249
|
+
const debugSpy = vi
|
|
1250
|
+
.spyOn(debugLogger, 'debug')
|
|
1251
|
+
.mockImplementation(() => { });
|
|
1252
|
+
const experiments = {
|
|
1253
|
+
flags: {
|
|
1254
|
+
ZetaFlag: {
|
|
1255
|
+
boolValue: true,
|
|
1256
|
+
stringValue: 'zeta',
|
|
1257
|
+
int32ListValue: { values: [1, 2] },
|
|
1258
|
+
},
|
|
1259
|
+
AlphaFlag: {
|
|
1260
|
+
boolValue: false,
|
|
1261
|
+
stringValue: 'alpha',
|
|
1262
|
+
stringListValue: { values: ['a', 'b', 'c'] },
|
|
1263
|
+
},
|
|
1264
|
+
MiddleFlag: {
|
|
1265
|
+
// Intentionally sparse to ensure undefined values are omitted
|
|
1266
|
+
floatValue: 0.42,
|
|
1267
|
+
int32ListValue: { values: [] },
|
|
1268
|
+
},
|
|
1269
|
+
},
|
|
1270
|
+
experimentIds: [101, 99],
|
|
1271
|
+
};
|
|
1272
|
+
config.setExperiments(experiments);
|
|
1273
|
+
const logCall = debugSpy.mock.calls.find(([message]) => message === 'Experiments loaded');
|
|
1274
|
+
expect(logCall).toBeDefined();
|
|
1275
|
+
const loggedSummary = logCall?.[1];
|
|
1276
|
+
expect(typeof loggedSummary).toBe('string');
|
|
1277
|
+
expect(loggedSummary).toContain('experimentIds');
|
|
1278
|
+
expect(loggedSummary).toContain('101');
|
|
1279
|
+
expect(loggedSummary).toContain('AlphaFlag');
|
|
1280
|
+
expect(loggedSummary).toContain('ZetaFlag');
|
|
1281
|
+
const alphaIndex = loggedSummary.indexOf('AlphaFlag');
|
|
1282
|
+
const zetaIndex = loggedSummary.indexOf('ZetaFlag');
|
|
1283
|
+
expect(alphaIndex).toBeGreaterThan(-1);
|
|
1284
|
+
expect(zetaIndex).toBeGreaterThan(-1);
|
|
1285
|
+
expect(alphaIndex).toBeLessThan(zetaIndex);
|
|
1286
|
+
expect(loggedSummary).toContain('\n');
|
|
1287
|
+
expect(loggedSummary).not.toContain('stringListLength: 0');
|
|
1288
|
+
expect(loggedSummary).not.toContain('int32ListLength: 0');
|
|
1289
|
+
debugSpy.mockRestore();
|
|
1290
|
+
});
|
|
1291
|
+
});
|
|
875
1292
|
//# sourceMappingURL=config.test.js.map
|