@machina.ai/cell-cli-core 1.41.1-rc2 → 1.45.1-rc2
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/docs/AFTER_MERGE_PROMPT.md +1 -1
- package/dist/docs/changelogs/index.md +63 -0
- package/dist/docs/changelogs/latest.md +200 -244
- package/dist/docs/changelogs/preview.md +198 -385
- package/dist/docs/cli/auto-memory.md +61 -40
- package/dist/docs/cli/cli-reference.md +2 -1
- package/dist/docs/cli/creating-skills.md +165 -38
- package/dist/docs/cli/custom-commands.md +1 -0
- package/dist/docs/cli/gemini-md.md +0 -3
- package/dist/docs/cli/model-routing.md +3 -3
- package/dist/docs/cli/plan-mode.md +2 -2
- package/dist/docs/cli/settings.md +20 -19
- package/dist/docs/cli/skills-best-practices.md +78 -0
- package/dist/docs/cli/skills.md +98 -176
- package/dist/docs/cli/tutorials/memory-management.md +3 -3
- package/dist/docs/cli/tutorials/session-management.md +13 -0
- package/dist/docs/cli/tutorials/skills-getting-started.md +140 -92
- package/dist/docs/cli/using-agent-skills.md +90 -0
- package/dist/docs/core/gemma-setup.md +83 -0
- package/dist/docs/core/index.md +3 -2
- package/dist/docs/core/local-model-routing.md +14 -7
- package/dist/docs/extensions/reference.md +16 -0
- package/dist/docs/extensions/releasing.md +58 -24
- package/dist/docs/extensions/writing-extensions.md +7 -0
- package/dist/docs/get-started/installation.mdx +2 -2
- package/dist/docs/model-routing-spec.md +683 -0
- package/dist/docs/reference/commands.md +14 -7
- package/dist/docs/reference/configuration.md +264 -88
- package/dist/docs/reference/keyboard-shortcuts.md +24 -1
- package/dist/docs/reference/policy-engine.md +14 -3
- package/dist/docs/reference/tools.md +48 -1
- package/dist/docs/releases.md +2 -2
- package/dist/docs/sidebar.json +24 -2
- package/dist/docs/tools/activate-skill.md +1 -1
- package/dist/docs/tools/mcp-server.md +24 -3
- package/dist/docs/tools/memory.md +10 -13
- package/dist/docs/tools/shell.md +17 -0
- package/dist/package.json +18 -18
- package/dist/src/agent/content-utils.js +6 -1
- package/dist/src/agent/content-utils.js.map +1 -1
- package/dist/src/agent/content-utils.test.js +5 -1
- package/dist/src/agent/content-utils.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +8 -7
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +2 -2
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.js +5 -1
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +11 -3
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/tool-display-utils.d.ts +3 -2
- package/dist/src/agent/tool-display-utils.js +3 -2
- package/dist/src/agent/tool-display-utils.js.map +1 -1
- package/dist/src/agent/types.d.ts +33 -3
- package/dist/src/agents/a2aUtils.d.ts +1 -1
- package/dist/src/agents/a2aUtils.js +5 -4
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/a2aUtils.test.js +18 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -1
- package/dist/src/agents/agent-tool.d.ts +3 -1
- package/dist/src/agents/agent-tool.js +19 -3
- package/dist/src/agents/agent-tool.js.map +1 -1
- package/dist/src/agents/agent-tool.test.js +76 -0
- package/dist/src/agents/agent-tool.test.js.map +1 -1
- package/dist/src/agents/agentLoader.d.ts +127 -22
- package/dist/src/agents/agentLoader.js +20 -0
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/agentLoader.test.js +60 -0
- package/dist/src/agents/agentLoader.test.js.map +1 -1
- package/dist/src/agents/auth-provider/types.d.ts +5 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +24 -19
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/snapshotSuperseder.js +11 -8
- package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -1
- package/dist/src/agents/browser/snapshotSuperseder.test.js +6 -1
- package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -1
- package/dist/src/agents/generalist-agent.js +8 -1
- package/dist/src/agents/generalist-agent.js.map +1 -1
- package/dist/src/agents/generalist-agent.test.js +24 -0
- package/dist/src/agents/generalist-agent.test.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +1 -0
- package/dist/src/agents/local-executor.js +76 -45
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +199 -27
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +1 -1
- package/dist/src/agents/local-invocation.js +47 -48
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +13 -15
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/local-session-invocation.d.ts +51 -0
- package/dist/src/agents/local-session-invocation.js +320 -0
- package/dist/src/agents/local-session-invocation.js.map +1 -0
- package/dist/src/agents/local-session-invocation.test.js +512 -0
- package/dist/src/agents/local-session-invocation.test.js.map +1 -0
- package/dist/src/agents/local-subagent-protocol.d.ts +18 -0
- package/dist/src/agents/local-subagent-protocol.js +357 -0
- package/dist/src/agents/local-subagent-protocol.js.map +1 -0
- package/dist/src/agents/local-subagent-protocol.test.js +676 -0
- package/dist/src/agents/local-subagent-protocol.test.js.map +1 -0
- package/dist/src/agents/registry.d.ts +8 -4
- package/dist/src/agents/registry.js +112 -47
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +9 -20
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.js +6 -6
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +23 -12
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/remote-session-invocation.d.ts +48 -0
- package/dist/src/agents/remote-session-invocation.js +193 -0
- package/dist/src/agents/remote-session-invocation.js.map +1 -0
- package/dist/src/agents/remote-session-invocation.test.d.ts +6 -0
- package/dist/src/agents/remote-session-invocation.test.js +405 -0
- package/dist/src/agents/remote-session-invocation.test.js.map +1 -0
- package/dist/src/agents/remote-subagent-protocol.d.ts +42 -0
- package/dist/src/agents/remote-subagent-protocol.js +348 -0
- package/dist/src/agents/remote-subagent-protocol.js.map +1 -0
- package/dist/src/agents/remote-subagent-protocol.test.d.ts +6 -0
- package/dist/src/agents/remote-subagent-protocol.test.js +652 -0
- package/dist/src/agents/remote-subagent-protocol.test.js.map +1 -0
- package/dist/src/agents/skill-extraction-agent.d.ts +8 -1
- package/dist/src/agents/skill-extraction-agent.js +171 -21
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +66 -2
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +38 -2
- package/dist/src/agents/types.js +7 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/autoRoutingFallback.integration.test.d.ts +6 -0
- package/dist/src/availability/autoRoutingFallback.integration.test.js +288 -0
- package/dist/src/availability/autoRoutingFallback.integration.test.js.map +1 -0
- package/dist/src/availability/fallbackIntegration.test.js +29 -0
- package/dist/src/availability/fallbackIntegration.test.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.d.ts +6 -6
- package/dist/src/availability/modelAvailabilityService.js +16 -8
- package/dist/src/availability/modelAvailabilityService.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.test.js +39 -0
- package/dist/src/availability/modelAvailabilityService.test.js.map +1 -1
- package/dist/src/availability/modelPolicy.d.ts +1 -0
- package/dist/src/availability/policyCatalog.d.ts +2 -0
- package/dist/src/availability/policyCatalog.js +38 -9
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +5 -4
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +42 -27
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +47 -7
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/availability/testUtils.js +1 -1
- package/dist/src/availability/testUtils.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +3 -1
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/experiments/flagNames.d.ts +1 -1
- package/dist/src/code_assist/experiments/flagNames.js +1 -1
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.js +12 -3
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js +29 -2
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +12 -3
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +38 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +3 -0
- package/dist/src/code_assist/setup.js +9 -0
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +10 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/commands/memory.d.ts +83 -2
- package/dist/src/commands/memory.js +479 -28
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/memory.test.js +414 -58
- package/dist/src/commands/memory.test.js.map +1 -1
- package/dist/src/config/config.d.ts +61 -37
- package/dist/src/config/config.js +294 -101
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +365 -113
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +185 -61
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +31 -0
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +20 -10
- package/dist/src/config/models.js +105 -34
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +204 -47
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/projectRegistry.d.ts +1 -0
- package/dist/src/config/projectRegistry.js +14 -3
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/projectRegistry.test.js +43 -0
- package/dist/src/config/projectRegistry.test.js.map +1 -1
- package/dist/src/config/scoped-config.d.ts +22 -0
- package/dist/src/config/scoped-config.js +32 -0
- package/dist/src/config/scoped-config.js.map +1 -1
- package/dist/src/config/storage.d.ts +0 -1
- package/dist/src/config/storage.js +0 -3
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +3 -1
- package/dist/src/confirmation-bus/message-bus.js +14 -5
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.test.js +34 -0
- package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
- package/dist/src/context/chatCompressionService.js +7 -5
- package/dist/src/context/chatCompressionService.js.map +1 -1
- package/dist/src/context/chatCompressionService.test.js +1 -1
- package/dist/src/context/chatCompressionService.test.js.map +1 -1
- package/dist/src/context/config/configLoader.js +4 -1
- package/dist/src/context/config/configLoader.js.map +1 -1
- package/dist/src/context/config/profiles.d.ts +10 -0
- package/dist/src/context/config/profiles.js +98 -3
- package/dist/src/context/config/profiles.js.map +1 -1
- package/dist/src/context/config/schema.d.ts +4 -0
- package/dist/src/context/config/schema.js +4 -0
- package/dist/src/context/config/schema.js.map +1 -1
- package/dist/src/context/config/types.d.ts +13 -1
- package/dist/src/context/contextCompressionService.test.js +7 -3
- package/dist/src/context/contextCompressionService.test.js.map +1 -1
- package/dist/src/context/contextManager.barrier.test.js +39 -16
- package/dist/src/context/contextManager.barrier.test.js.map +1 -1
- package/dist/src/context/contextManager.d.ts +25 -28
- package/dist/src/context/contextManager.hotstart.test.d.ts +6 -0
- package/dist/src/context/contextManager.hotstart.test.js +65 -0
- package/dist/src/context/contextManager.hotstart.test.js.map +1 -0
- package/dist/src/context/contextManager.incremental.test.d.ts +6 -0
- package/dist/src/context/contextManager.incremental.test.js +101 -0
- package/dist/src/context/contextManager.incremental.test.js.map +1 -0
- package/dist/src/context/contextManager.js +276 -79
- package/dist/src/context/contextManager.js.map +1 -1
- package/dist/src/context/contextManager.test.d.ts +6 -0
- package/dist/src/context/contextManager.test.js +142 -0
- package/dist/src/context/contextManager.test.js.map +1 -0
- package/dist/src/context/eventBus.d.ts +13 -0
- package/dist/src/context/eventBus.js +12 -0
- package/dist/src/context/eventBus.js.map +1 -1
- package/dist/src/context/graph/behaviorRegistry.d.ts +4 -12
- package/dist/src/context/graph/behaviorRegistry.js.map +1 -1
- package/dist/src/context/graph/builtinBehaviors.d.ts +6 -1
- package/dist/src/context/graph/builtinBehaviors.js +23 -108
- package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
- package/dist/src/context/graph/fromGraph.d.ts +8 -3
- package/dist/src/context/graph/fromGraph.js +46 -30
- package/dist/src/context/graph/fromGraph.js.map +1 -1
- package/dist/src/context/graph/fromGraph.test.d.ts +6 -0
- package/dist/src/context/graph/fromGraph.test.js +186 -0
- package/dist/src/context/graph/fromGraph.test.js.map +1 -0
- package/dist/src/context/graph/mapper.d.ts +8 -10
- package/dist/src/context/graph/mapper.js +11 -19
- package/dist/src/context/graph/mapper.js.map +1 -1
- package/dist/src/context/graph/mapper.test.d.ts +6 -0
- package/dist/src/context/graph/mapper.test.js +101 -0
- package/dist/src/context/graph/mapper.test.js.map +1 -0
- package/dist/src/context/graph/nodeIdService.d.ts +17 -0
- package/dist/src/context/graph/nodeIdService.js +24 -0
- package/dist/src/context/graph/nodeIdService.js.map +1 -0
- package/dist/src/context/graph/render.d.ts +24 -5
- package/dist/src/context/graph/render.js +129 -34
- package/dist/src/context/graph/render.js.map +1 -1
- package/dist/src/context/graph/render.test.d.ts +6 -0
- package/dist/src/context/graph/render.test.js +280 -0
- package/dist/src/context/graph/render.test.js.map +1 -0
- package/dist/src/context/graph/toGraph.d.ts +16 -14
- package/dist/src/context/graph/toGraph.js +180 -202
- package/dist/src/context/graph/toGraph.js.map +1 -1
- package/dist/src/context/graph/toGraph.test.d.ts +6 -0
- package/dist/src/context/graph/toGraph.test.js +116 -0
- package/dist/src/context/graph/toGraph.test.js.map +1 -0
- package/dist/src/context/graph/types.d.ts +36 -73
- package/dist/src/context/graph/types.js +23 -14
- package/dist/src/context/graph/types.js.map +1 -1
- package/dist/src/context/initializer.js +26 -5
- package/dist/src/context/initializer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +5 -8
- package/dist/src/context/pipeline/contextWorkingBuffer.js +105 -35
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +81 -13
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -1
- package/dist/src/context/pipeline/environment.d.ts +4 -0
- package/dist/src/context/pipeline/environmentImpl.d.ts +6 -5
- package/dist/src/context/pipeline/environmentImpl.js +7 -9
- package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
- package/dist/src/context/pipeline/environmentImpl.test.js +5 -1
- package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
- package/dist/src/context/pipeline/orchestrator.d.ts +20 -6
- package/dist/src/context/pipeline/orchestrator.js +97 -80
- package/dist/src/context/pipeline/orchestrator.js.map +1 -1
- package/dist/src/context/pipeline/orchestrator.test.js +33 -36
- package/dist/src/context/pipeline/orchestrator.test.js.map +1 -1
- package/dist/src/context/pipeline.d.ts +0 -1
- package/dist/src/context/processors/blobDegradationProcessor.js +43 -84
- package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -1
- package/dist/src/context/processors/blobDegradationProcessor.test.js +33 -37
- package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -1
- package/dist/src/context/processors/nodeDistillationProcessor.js +58 -80
- package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -1
- package/dist/src/context/processors/nodeDistillationProcessor.test.js +21 -15
- package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -1
- package/dist/src/context/processors/nodeTruncationProcessor.js +16 -60
- package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -1
- package/dist/src/context/processors/nodeTruncationProcessor.test.js +16 -19
- package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -1
- package/dist/src/context/processors/rollingSummaryProcessor.js +12 -25
- package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -1
- package/dist/src/context/processors/rollingSummaryProcessor.test.js +10 -9
- package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +7 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +37 -19
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +35 -10
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotProcessor.d.ts +2 -0
- package/dist/src/context/processors/stateSnapshotProcessor.js +53 -21
- package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotProcessor.test.js +52 -12
- package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.js +96 -117
- package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -17
- package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
- package/dist/src/context/system-tests/hysteresis.test.d.ts +6 -0
- package/dist/src/context/system-tests/hysteresis.test.js +100 -0
- package/dist/src/context/system-tests/hysteresis.test.js.map +1 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js +107 -72
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
- package/dist/src/context/system-tests/powerUserLifecycle.test.d.ts +6 -0
- package/dist/src/context/system-tests/powerUserLifecycle.test.js +91 -0
- package/dist/src/context/system-tests/powerUserLifecycle.test.js.map +1 -0
- package/dist/src/context/system-tests/simulationHarness.d.ts +2 -5
- package/dist/src/context/system-tests/simulationHarness.js +34 -35
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
- package/dist/src/context/testing/contextTestUtils.d.ts +5 -3
- package/dist/src/context/testing/contextTestUtils.js +74 -53
- package/dist/src/context/testing/contextTestUtils.js.map +1 -1
- package/dist/src/context/testing/testProfile.js +1 -0
- package/dist/src/context/testing/testProfile.js.map +1 -1
- package/dist/src/context/toolOutputMaskingService.js +1 -2
- package/dist/src/context/toolOutputMaskingService.js.map +1 -1
- package/dist/src/context/toolOutputMaskingService.test.js +5 -20
- package/dist/src/context/toolOutputMaskingService.test.js.map +1 -1
- package/dist/src/context/utils/adaptiveTokenCalculator.d.ts +70 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.js +138 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.js.map +1 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.d.ts +6 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.js +129 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.js.map +1 -0
- package/dist/src/context/utils/contextTokenCalculator.d.ts +63 -2
- package/dist/src/context/utils/contextTokenCalculator.js +80 -5
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
- package/dist/src/context/utils/contextTokenCalculator.test.d.ts +6 -0
- package/dist/src/context/utils/contextTokenCalculator.test.js +54 -0
- package/dist/src/context/utils/contextTokenCalculator.test.js.map +1 -0
- package/dist/src/context/utils/formatNodesForLlm.d.ts +21 -0
- package/dist/src/context/utils/formatNodesForLlm.js +69 -0
- package/dist/src/context/utils/formatNodesForLlm.js.map +1 -0
- package/dist/src/context/utils/formatNodesForLlm.test.d.ts +6 -0
- package/dist/src/context/utils/formatNodesForLlm.test.js +110 -0
- package/dist/src/context/utils/formatNodesForLlm.test.js.map +1 -0
- package/dist/src/context/utils/invariantChecker.d.ts +11 -0
- package/dist/src/context/utils/invariantChecker.js +36 -0
- package/dist/src/context/utils/invariantChecker.js.map +1 -0
- package/dist/src/context/utils/snapshotGenerator.d.ts +43 -1
- package/dist/src/context/utils/snapshotGenerator.js +332 -33
- package/dist/src/context/utils/snapshotGenerator.js.map +1 -1
- package/dist/src/context/utils/snapshotGenerator.test.d.ts +6 -0
- package/dist/src/context/utils/snapshotGenerator.test.js +362 -0
- package/dist/src/context/utils/snapshotGenerator.test.js.map +1 -0
- package/dist/src/context/utils/tokenCalibration.d.ts +9 -0
- package/dist/src/context/utils/tokenCalibration.js +30 -0
- package/dist/src/context/utils/tokenCalibration.js.map +1 -0
- package/dist/src/core/agentChatHistory.d.ts +29 -14
- package/dist/src/core/agentChatHistory.js +27 -27
- package/dist/src/core/agentChatHistory.js.map +1 -1
- package/dist/src/core/baseLlmClient.d.ts +8 -0
- package/dist/src/core/baseLlmClient.js +23 -3
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +27 -23
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +7 -5
- package/dist/src/core/client.js +65 -40
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +35 -131
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +46 -21
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +191 -13
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +15 -3
- package/dist/src/core/fakeContentGenerator.js +29 -9
- package/dist/src/core/fakeContentGenerator.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +18 -7
- package/dist/src/core/geminiChat.js +312 -54
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +448 -54
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +39 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.js +6 -2
- package/dist/src/core/localLiteRtLmClient.js.map +1 -1
- package/dist/src/core/prompts.test.js +12 -7
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +7 -2
- package/dist/src/core/turn.js +61 -4
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +19 -10
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/fallback/handler.js +16 -6
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +8 -2
- package/dist/src/fallback/handler.test.js.map +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/hookEventHandler.js +3 -2
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +80 -0
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +3 -3
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +95 -5
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/hookTranslator.test.js +171 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -1
- package/dist/src/ide/ide-client.js +5 -3
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +12 -10
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.test.js +25 -2
- package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
- package/dist/src/ide/types.d.ts +16 -16
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +8 -0
- package/dist/src/mcp/oauth-provider.js +41 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.js +7 -1
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.test.js +55 -0
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
- package/dist/src/mcp/stored-token-provider.d.ts +27 -0
- package/dist/src/mcp/stored-token-provider.js +76 -0
- package/dist/src/mcp/stored-token-provider.js.map +1 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js +14 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
- package/dist/src/output/json-formatter.d.ts +1 -1
- package/dist/src/output/json-formatter.js +4 -1
- package/dist/src/output/json-formatter.js.map +1 -1
- package/dist/src/output/json-formatter.test.js +7 -0
- package/dist/src/output/json-formatter.test.js.map +1 -1
- package/dist/src/output/types.d.ts +1 -0
- package/dist/src/output/types.js.map +1 -1
- package/dist/src/policy/config.js +25 -0
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +80 -0
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/core-tools-mapping.test.js +9 -1
- package/dist/src/policy/core-tools-mapping.test.js.map +1 -1
- package/dist/src/policy/policies/plan.toml +1 -1
- package/dist/src/policy/policies/write.toml +0 -7
- package/dist/src/policy/policy-engine.test.js +0 -8
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.d.ts +20 -20
- package/dist/src/policy/stable-stringify.js +10 -6
- package/dist/src/policy/stable-stringify.js.map +1 -1
- package/dist/src/policy/stable-stringify.test.js +157 -0
- package/dist/src/policy/stable-stringify.test.js.map +1 -0
- package/dist/src/policy/types.d.ts +1 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/promptProvider.js +8 -9
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +3 -1
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory.test.d.ts +6 -0
- package/dist/src/prompts/{snippets-memory-v2.test.js → snippets-memory.test.js} +5 -23
- package/dist/src/prompts/snippets-memory.test.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +6 -11
- package/dist/src/prompts/snippets.js +28 -30
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +0 -1
- package/dist/src/prompts/snippets.legacy.js +8 -15
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/routing/strategies/approvalModeStrategy.js +5 -3
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -1
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +9 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +18 -4
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +77 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/defaultStrategy.js +1 -1
- package/dist/src/routing/strategies/defaultStrategy.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/gemmaClassifierStrategy.js +7 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +15 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.d.ts +1 -0
- package/dist/src/routing/strategies/numericalClassifierStrategy.js +32 -5
- package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js +247 -25
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/sandbox/utils/commandSafety.js +22 -2
- package/dist/src/sandbox/utils/commandSafety.js.map +1 -1
- package/dist/src/sandbox/utils/commandSafety.test.d.ts +6 -0
- package/dist/src/sandbox/utils/commandSafety.test.js +85 -0
- package/dist/src/sandbox/utils/commandSafety.test.js.map +1 -0
- package/dist/src/scheduler/confirmation.test.js +29 -0
- package/dist/src/scheduler/confirmation.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.js +15 -0
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +1 -1
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_parallel.test.js +37 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
- package/dist/src/scheduler/state-manager.js +5 -1
- package/dist/src/scheduler/state-manager.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +7 -4
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/types.d.ts +5 -1
- package/dist/src/scheduler/types.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +14 -7
- package/dist/src/services/chatRecordingService.js +157 -133
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +189 -52
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.js +2 -1
- package/dist/src/services/fileDiscoveryService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.test.js +36 -0
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.js +43 -4
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +105 -1
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/keychainService.js +14 -5
- package/dist/src/services/keychainService.js.map +1 -1
- package/dist/src/services/memoryPatchUtils.d.ts +93 -0
- package/dist/src/services/memoryPatchUtils.js +310 -2
- package/dist/src/services/memoryPatchUtils.js.map +1 -1
- package/dist/src/services/memoryService.d.ts +2 -0
- package/dist/src/services/memoryService.js +214 -9
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +133 -0
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +3 -0
- package/dist/src/services/modelConfigService.js +22 -13
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +73 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +88 -41
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +22 -9
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.windows.integration.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.windows.integration.test.js +63 -0
- package/dist/src/services/shellExecutionService.windows.integration.test.js.map +1 -0
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +85 -7
- package/dist/src/services/test-data/resolved-aliases.golden.json +85 -7
- package/dist/src/services/trackerTypes.d.ts +4 -4
- package/dist/src/skills/skillManager.d.ts +4 -0
- package/dist/src/skills/skillManager.js +6 -0
- package/dist/src/skills/skillManager.js.map +1 -1
- package/dist/src/skills/skillManager.test.js +10 -0
- package/dist/src/skills/skillManager.test.js.map +1 -1
- package/dist/src/telemetry/file-exporters.d.ts +4 -1
- package/dist/src/telemetry/file-exporters.js +21 -3
- package/dist/src/telemetry/file-exporters.js.map +1 -1
- package/dist/src/telemetry/file-exporters.test.js +32 -2
- package/dist/src/telemetry/file-exporters.test.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.d.ts +3 -0
- package/dist/src/telemetry/gcp-exporters.js +72 -5
- package/dist/src/telemetry/gcp-exporters.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.test.js +52 -0
- package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
- package/dist/src/telemetry/heap-snapshot.d.ts +12 -0
- package/dist/src/telemetry/heap-snapshot.js +35 -0
- package/dist/src/telemetry/heap-snapshot.js.map +1 -0
- package/dist/src/telemetry/heap-snapshot.test.d.ts +6 -0
- package/dist/src/telemetry/heap-snapshot.test.js +38 -0
- package/dist/src/telemetry/heap-snapshot.test.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.js +1 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +1 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.d.ts +5 -0
- package/dist/src/telemetry/memory-monitor.js +8 -0
- package/dist/src/telemetry/memory-monitor.js.map +1 -1
- package/dist/src/telemetry/metrics.js +13 -2
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +61 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/test-utils/config.js +10 -1
- package/dist/src/test-utils/config.js.map +1 -1
- package/dist/src/tools/ask-user.js +25 -1
- package/dist/src/tools/ask-user.js.map +1 -1
- package/dist/src/tools/ask-user.test.js +46 -1
- package/dist/src/tools/ask-user.test.js.map +1 -1
- package/dist/src/tools/definitions/base-declarations.d.ts +0 -3
- package/dist/src/tools/definitions/base-declarations.js +0 -4
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +1 -2
- package/dist/src/tools/definitions/coreTools.js +2 -8
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js +1 -2
- package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +7 -31
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js +9 -26
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/definitions/types.d.ts +0 -1
- package/dist/src/tools/edit.js +27 -5
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +37 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/grep.js +14 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +17 -0
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/jit-context.d.ts +1 -1
- package/dist/src/tools/jit-context.js +1 -4
- package/dist/src/tools/jit-context.js.map +1 -1
- package/dist/src/tools/jit-context.test.js +1 -13
- package/dist/src/tools/jit-context.test.js.map +1 -1
- package/dist/src/tools/ls.js +5 -0
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +2 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +29 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +89 -50
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +353 -59
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/{xcode-mcp-fix-transport.d.ts → mcp-compliance-transport.d.ts} +6 -6
- package/dist/src/tools/{xcode-mcp-fix-transport.js → mcp-compliance-transport.js} +6 -6
- package/dist/src/tools/mcp-compliance-transport.js.map +1 -0
- package/dist/src/tools/mcp-compliance-transport.test.d.ts +6 -0
- package/dist/src/tools/mcp-compliance-transport.test.js +162 -0
- package/dist/src/tools/mcp-compliance-transport.test.js.map +1 -0
- package/dist/src/tools/memoryTool.d.ts +9 -31
- package/dist/src/tools/memoryTool.js +47 -262
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +41 -312
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +11 -6
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +20 -8
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +2 -2
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +3 -7
- package/dist/src/tools/ripGrep.js +57 -35
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +197 -276
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +5 -3
- package/dist/src/tools/shell.js +130 -36
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +186 -14
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shell_proactive.test.js +1 -0
- package/dist/src/tools/shell_proactive.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +3 -3
- package/dist/src/tools/tool-names.js +4 -5
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.js +1 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +6 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/topicTool.js +5 -0
- package/dist/src/tools/topicTool.js.map +1 -1
- package/dist/src/tools/write-file.js +13 -0
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +8 -0
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/atCommandUtils.d.ts +35 -0
- package/dist/src/utils/atCommandUtils.js +163 -0
- package/dist/src/utils/atCommandUtils.js.map +1 -0
- package/dist/src/utils/atCommandUtils.test.d.ts +6 -0
- package/dist/src/utils/atCommandUtils.test.js +292 -0
- package/dist/src/utils/atCommandUtils.test.js.map +1 -0
- package/dist/src/utils/channel.d.ts +8 -0
- package/dist/src/utils/channel.js +21 -10
- package/dist/src/utils/channel.js.map +1 -1
- package/dist/src/utils/cryptoUtils.d.ts +11 -0
- package/dist/src/utils/cryptoUtils.js +19 -0
- package/dist/src/utils/cryptoUtils.js.map +1 -0
- package/dist/src/utils/cryptoUtils.test.d.ts +6 -0
- package/dist/src/utils/cryptoUtils.test.js +31 -0
- package/dist/src/utils/cryptoUtils.test.js.map +1 -0
- package/dist/src/utils/editor.d.ts +29 -3
- package/dist/src/utils/editor.js +94 -3
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +176 -2
- 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 +15 -8
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +4 -14
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/errors.js +3 -8
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/events.d.ts +26 -1
- package/dist/src/utils/events.js +21 -2
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +39 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/extensionLoader.js +2 -2
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.js +22 -15
- package/dist/src/utils/extensionLoader.test.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +3 -3
- package/dist/src/utils/fetch.js +44 -20
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fetch.test.js +93 -17
- package/dist/src/utils/fetch.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +4 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js +20 -9
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.js +4 -1
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -0
- package/dist/src/utils/generateContentResponseUtilities.js +37 -7
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.test.js +33 -0
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
- package/dist/src/utils/gitUtils.d.ts +5 -0
- package/dist/src/utils/gitUtils.js +11 -0
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/historyHardening.d.ts +37 -0
- package/dist/src/utils/historyHardening.js +332 -0
- package/dist/src/utils/historyHardening.js.map +1 -0
- package/dist/src/utils/historyHardening.test.d.ts +6 -0
- package/dist/src/utils/historyHardening.test.js +317 -0
- package/dist/src/utils/historyHardening.test.js.map +1 -0
- package/dist/src/utils/ignoreFileParser.js +1 -1
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/ignorePatterns.js +2 -0
- package/dist/src/utils/ignorePatterns.js.map +1 -1
- package/dist/src/utils/ignorePatterns.test.js +1 -0
- package/dist/src/utils/ignorePatterns.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +0 -20
- package/dist/src/utils/memoryDiscovery.js +57 -220
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +112 -403
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/modelUtils.d.ts +14 -0
- package/dist/src/utils/modelUtils.js +17 -0
- package/dist/src/utils/modelUtils.js.map +1 -0
- package/dist/src/utils/modelUtils.test.d.ts +6 -0
- package/dist/src/utils/modelUtils.test.js +23 -0
- package/dist/src/utils/modelUtils.test.js.map +1 -0
- package/dist/src/utils/partUtils.d.ts +26 -1
- package/dist/src/utils/partUtils.js +37 -0
- package/dist/src/utils/partUtils.js.map +1 -1
- package/dist/src/utils/path-validator.d.ts +17 -0
- package/dist/src/utils/path-validator.js +76 -0
- package/dist/src/utils/path-validator.js.map +1 -0
- package/dist/src/utils/path-validator.test.d.ts +6 -0
- package/dist/src/utils/path-validator.test.js +91 -0
- package/dist/src/utils/path-validator.test.js.map +1 -0
- package/dist/src/utils/pathReader.js +12 -0
- package/dist/src/utils/pathReader.js.map +1 -1
- package/dist/src/utils/pathReader.test.js +95 -0
- package/dist/src/utils/pathReader.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +19 -1
- package/dist/src/utils/paths.js +74 -9
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +111 -1
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js +23 -12
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/ragLogger.d.ts +32 -0
- package/dist/src/utils/ragLogger.js +56 -0
- package/dist/src/utils/ragLogger.js.map +1 -0
- package/dist/src/utils/ragLogger.test.d.ts +6 -0
- package/dist/src/utils/ragLogger.test.js +97 -0
- package/dist/src/utils/ragLogger.test.js.map +1 -0
- package/dist/src/utils/retry.js +8 -3
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +17 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/safeJsonStringify.js +0 -2
- package/dist/src/utils/safeJsonStringify.js.map +1 -1
- package/dist/src/utils/sessionOperations.d.ts +26 -0
- package/dist/src/utils/sessionOperations.js +177 -8
- package/dist/src/utils/sessionOperations.js.map +1 -1
- package/dist/src/utils/sessionUtils.d.ts +11 -5
- package/dist/src/utils/sessionUtils.js +139 -68
- package/dist/src/utils/sessionUtils.js.map +1 -1
- package/dist/src/utils/sessionUtils.test.js +31 -5
- package/dist/src/utils/sessionUtils.test.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +9 -1
- package/dist/src/utils/shell-utils.js +51 -20
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +87 -46
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +12 -2
- package/dist/src/utils/textUtils.js +30 -3
- package/dist/src/utils/textUtils.js.map +1 -1
- package/dist/src/utils/textUtils.test.js +96 -1
- package/dist/src/utils/textUtils.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.d.ts +3 -2
- package/dist/src/utils/tokenCalculation.js +9 -5
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/tokenCalculation.test.js +15 -0
- package/dist/src/utils/tokenCalculation.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -18
- package/dist/src/context/historyObserver.d.ts +0 -28
- package/dist/src/context/historyObserver.js +0 -63
- package/dist/src/context/historyObserver.js.map +0 -1
- package/dist/src/policy/memory-manager-policy.test.js +0 -80
- package/dist/src/policy/memory-manager-policy.test.js.map +0 -1
- package/dist/src/policy/policies/memory-manager.toml +0 -20
- package/dist/src/prompts/snippets-memory-v2.test.js.map +0 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js.map +0 -1
- package/dist/src/tools/xcode-mcp-fix-transport.test.d.ts +0 -1
- package/dist/src/tools/xcode-mcp-fix-transport.test.js +0 -98
- package/dist/src/tools/xcode-mcp-fix-transport.test.js.map +0 -1
- package/dist/src/utils/systemEncoding.d.ts +0 -40
- package/dist/src/utils/systemEncoding.js +0 -150
- package/dist/src/utils/systemEncoding.js.map +0 -1
- package/dist/src/utils/systemEncoding.test.js +0 -369
- package/dist/src/utils/systemEncoding.test.js.map +0 -1
- /package/dist/src/{policy/memory-manager-policy.test.d.ts → agents/local-session-invocation.test.d.ts} +0 -0
- /package/dist/src/{prompts/snippets-memory-v2.test.d.ts → agents/local-subagent-protocol.test.d.ts} +0 -0
- /package/dist/src/{utils/systemEncoding.test.d.ts → policy/stable-stringify.test.d.ts} +0 -0
|
@@ -9,6 +9,7 @@ import { createMockSandboxConfig } from '@google/gemini-cli-test-utils';
|
|
|
9
9
|
import { DEFAULT_MAX_ATTEMPTS } from '../utils/retry.js';
|
|
10
10
|
import { ExperimentFlags } from '../code_assist/experiments/flagNames.js';
|
|
11
11
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
12
|
+
import { coreEvents } from '../utils/events.js';
|
|
12
13
|
import { ApprovalMode } from '../policy/types.js';
|
|
13
14
|
import { HookType, HookEventName, } from '../hooks/types.js';
|
|
14
15
|
import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
|
|
@@ -23,14 +24,15 @@ import { ShellTool } from '../tools/shell.js';
|
|
|
23
24
|
import { AgentTool } from '../agents/agent-tool.js';
|
|
24
25
|
import { ReadFileTool } from '../tools/read-file.js';
|
|
25
26
|
import { GrepTool } from '../tools/grep.js';
|
|
26
|
-
import { RipGrepTool,
|
|
27
|
+
import { RipGrepTool, resolveRipgrepPath } from '../tools/ripGrep.js';
|
|
27
28
|
import { logRipgrepFallback, logApprovalModeDuration, } from '../telemetry/loggers.js';
|
|
28
29
|
import { RipgrepFallbackEvent } from '../telemetry/types.js';
|
|
29
30
|
import { ToolRegistry } from '../tools/tool-registry.js';
|
|
30
31
|
import { ACTIVATE_SKILL_TOOL_NAME } from '../tools/tool-names.js';
|
|
31
32
|
import { DEFAULT_MODEL_CONFIGS } from './defaultModelConfigs.js';
|
|
32
|
-
import { DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_3_1_MODEL, DEFAULT_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_FLASH_MODEL, } from './models.js';
|
|
33
|
+
import { DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_3_1_MODEL, DEFAULT_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_MODEL, } from './models.js';
|
|
33
34
|
import { Storage } from './storage.js';
|
|
35
|
+
import { runWithScopedAutoMemoryExtractionWriteAccess, runWithScopedMemoryInboxAccess, } from './scoped-config.js';
|
|
34
36
|
vi.mock('fs', async (importOriginal) => {
|
|
35
37
|
const actual = await importOriginal();
|
|
36
38
|
return {
|
|
@@ -42,6 +44,19 @@ vi.mock('fs', async (importOriginal) => {
|
|
|
42
44
|
realpathSync: vi.fn((path) => path),
|
|
43
45
|
};
|
|
44
46
|
});
|
|
47
|
+
vi.mock('../utils/paths.js', async (importOriginal) => {
|
|
48
|
+
const actual = await importOriginal();
|
|
49
|
+
return {
|
|
50
|
+
...actual,
|
|
51
|
+
resolveToRealPath: vi.fn((p) => p),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
vi.mock('../utils/fileUtils.js', () => ({
|
|
55
|
+
fileExists: vi.fn(),
|
|
56
|
+
}));
|
|
57
|
+
vi.mock('../utils/shell-utils.js', () => ({
|
|
58
|
+
resolveExecutable: vi.fn(),
|
|
59
|
+
}));
|
|
45
60
|
// Mock dependencies that might be called during Config construction or createServerConfig
|
|
46
61
|
vi.mock('../tools/tool-registry', () => {
|
|
47
62
|
const ToolRegistryMock = vi.fn();
|
|
@@ -62,15 +77,12 @@ vi.mock('../tools/mcp-client-manager.js', () => ({
|
|
|
62
77
|
setMainRegistries: vi.fn(),
|
|
63
78
|
})),
|
|
64
79
|
}));
|
|
65
|
-
vi.mock('../utils/memoryDiscovery.js', () => ({
|
|
66
|
-
loadServerHierarchicalMemory: vi.fn(),
|
|
67
|
-
}));
|
|
68
80
|
// Mock individual tools if their constructors are complex or have side effects
|
|
69
81
|
vi.mock('../tools/ls');
|
|
70
82
|
vi.mock('../tools/read-file');
|
|
71
83
|
vi.mock('../tools/grep.js');
|
|
72
84
|
vi.mock('../tools/ripGrep.js', () => ({
|
|
73
|
-
|
|
85
|
+
resolveRipgrepPath: vi.fn(),
|
|
74
86
|
RipGrepTool: class MockRipGrepTool {
|
|
75
87
|
},
|
|
76
88
|
}));
|
|
@@ -80,13 +92,14 @@ vi.mock('../tools/shell');
|
|
|
80
92
|
vi.mock('../tools/write-file');
|
|
81
93
|
vi.mock('../tools/web-fetch');
|
|
82
94
|
vi.mock('../tools/read-many-files');
|
|
83
|
-
vi.mock('../tools/memoryTool', () =>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
95
|
+
vi.mock('../tools/memoryTool', async (importOriginal) => {
|
|
96
|
+
const actual = await importOriginal();
|
|
97
|
+
return {
|
|
98
|
+
...actual,
|
|
99
|
+
setGeminiMdFilename: vi.fn(),
|
|
100
|
+
getCurrentGeminiMdFilename: vi.fn(() => 'GEMINI.md'),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
90
103
|
vi.mock('../core/contentGenerator.js');
|
|
91
104
|
vi.mock('../core/client.js', () => ({
|
|
92
105
|
GeminiClient: vi.fn().mockImplementation(() => ({
|
|
@@ -148,6 +161,7 @@ const mockCoreEvents = vi.hoisted(() => ({
|
|
|
148
161
|
emitConsoleLog: vi.fn(),
|
|
149
162
|
emitQuotaChanged: vi.fn(),
|
|
150
163
|
on: vi.fn(),
|
|
164
|
+
emit: vi.fn(),
|
|
151
165
|
}));
|
|
152
166
|
const mockSetGlobalProxy = vi.hoisted(() => vi.fn());
|
|
153
167
|
vi.mock('../utils/events.js', async (importOriginal) => {
|
|
@@ -532,7 +546,13 @@ describe('Server Config (config.ts)', () => {
|
|
|
532
546
|
});
|
|
533
547
|
});
|
|
534
548
|
describe('getGemini31LaunchedSync', () => {
|
|
535
|
-
it.each([
|
|
549
|
+
it.each([
|
|
550
|
+
AuthType.USE_GEMINI,
|
|
551
|
+
AuthType.USE_VERTEX_AI,
|
|
552
|
+
AuthType.GATEWAY,
|
|
553
|
+
AuthType.LOGIN_WITH_GOOGLE,
|
|
554
|
+
AuthType.KEYCLOAK,
|
|
555
|
+
])('should return true for %s', async (authType) => {
|
|
536
556
|
const config = new Config(baseParams);
|
|
537
557
|
vi.mocked(createContentGeneratorConfig).mockResolvedValue({
|
|
538
558
|
authType,
|
|
@@ -558,16 +578,6 @@ describe('Server Config (config.ts)', () => {
|
|
|
558
578
|
expect(config.getGemini31LaunchedSync()).toBe(true);
|
|
559
579
|
});
|
|
560
580
|
});
|
|
561
|
-
describe('getGemini31FlashLiteLaunchedSync', () => {
|
|
562
|
-
it.each([AuthType.USE_GEMINI, AuthType.USE_VERTEX_AI, AuthType.GATEWAY])('should return true for %s', async (authType) => {
|
|
563
|
-
const config = new Config(baseParams);
|
|
564
|
-
vi.mocked(createContentGeneratorConfig).mockResolvedValue({
|
|
565
|
-
authType,
|
|
566
|
-
});
|
|
567
|
-
await config.refreshAuth(authType);
|
|
568
|
-
expect(config.getGemini31FlashLiteLaunchedSync()).toBe(true);
|
|
569
|
-
});
|
|
570
|
-
});
|
|
571
581
|
describe('getProModelNoAccessSync', () => {
|
|
572
582
|
it('should return experiment value for AuthType.LOGIN_WITH_GOOGLE', async () => {
|
|
573
583
|
vi.mocked(getExperiments).mockResolvedValue({
|
|
@@ -685,6 +695,13 @@ describe('Server Config (config.ts)', () => {
|
|
|
685
695
|
expect(config.getContentGeneratorConfig()).toEqual(mockContentConfig);
|
|
686
696
|
expect(GeminiClient).toHaveBeenCalledWith(config);
|
|
687
697
|
});
|
|
698
|
+
it('should clear fallback overrides when refreshing auth', async () => {
|
|
699
|
+
const config = new Config(baseParams);
|
|
700
|
+
config.activateFallbackMode('fallback-model', 'failed-model');
|
|
701
|
+
expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
|
|
702
|
+
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
703
|
+
expect(config.getFallbackOverride('failed-model')).toBeUndefined();
|
|
704
|
+
});
|
|
688
705
|
it('should pass Vertex AI routing settings when refreshing auth', async () => {
|
|
689
706
|
const vertexAiRouting = {
|
|
690
707
|
requestType: 'shared',
|
|
@@ -1173,28 +1190,6 @@ describe('Server Config (config.ts)', () => {
|
|
|
1173
1190
|
expect(config.getShellToolInactivityTimeout()).toBe(10000);
|
|
1174
1191
|
});
|
|
1175
1192
|
});
|
|
1176
|
-
describe('ContinueOnFailedApiCall Configuration', () => {
|
|
1177
|
-
it('should default continueOnFailedApiCall to false when not provided', () => {
|
|
1178
|
-
const config = new Config(baseParams);
|
|
1179
|
-
expect(config.getContinueOnFailedApiCall()).toBe(true);
|
|
1180
|
-
});
|
|
1181
|
-
it('should set continueOnFailedApiCall to true when provided as true', () => {
|
|
1182
|
-
const paramsWithContinueOnFailedApiCall = {
|
|
1183
|
-
...baseParams,
|
|
1184
|
-
continueOnFailedApiCall: true,
|
|
1185
|
-
};
|
|
1186
|
-
const config = new Config(paramsWithContinueOnFailedApiCall);
|
|
1187
|
-
expect(config.getContinueOnFailedApiCall()).toBe(true);
|
|
1188
|
-
});
|
|
1189
|
-
it('should set continueOnFailedApiCall to false when explicitly provided as false', () => {
|
|
1190
|
-
const paramsWithContinueOnFailedApiCall = {
|
|
1191
|
-
...baseParams,
|
|
1192
|
-
continueOnFailedApiCall: false,
|
|
1193
|
-
};
|
|
1194
|
-
const config = new Config(paramsWithContinueOnFailedApiCall);
|
|
1195
|
-
expect(config.getContinueOnFailedApiCall()).toBe(false);
|
|
1196
|
-
});
|
|
1197
|
-
});
|
|
1198
1193
|
describe('createToolRegistry', () => {
|
|
1199
1194
|
it('should register a tool if coreTools contains an argument-specific pattern', async () => {
|
|
1200
1195
|
const params = {
|
|
@@ -1512,6 +1507,17 @@ describe('Server Config (config.ts)', () => {
|
|
|
1512
1507
|
expect(config.getTrackerService().trackerDir).toBe(path.join(tempDir, 'session-two', 'tracker'));
|
|
1513
1508
|
expect(config.getWorkspaceContext().getDirectories()).not.toContain(oldPlansDir);
|
|
1514
1509
|
});
|
|
1510
|
+
it('clears fallback overrides when session changes', async () => {
|
|
1511
|
+
const config = new Config({
|
|
1512
|
+
...baseParams,
|
|
1513
|
+
sessionId: 'session-one',
|
|
1514
|
+
});
|
|
1515
|
+
await config.initialize();
|
|
1516
|
+
config.activateFallbackMode('fallback-model', 'failed-model');
|
|
1517
|
+
expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
|
|
1518
|
+
config.setSessionId('session-two');
|
|
1519
|
+
expect(config.getFallbackOverride('failed-model')).toBeUndefined();
|
|
1520
|
+
});
|
|
1515
1521
|
it('does not throw when changing sessions before the previous plans dir exists', async () => {
|
|
1516
1522
|
const config = new Config({
|
|
1517
1523
|
...baseParams,
|
|
@@ -1563,6 +1569,49 @@ describe('Server Config (config.ts)', () => {
|
|
|
1563
1569
|
expect(config.getSessionId()).toBe('session-two');
|
|
1564
1570
|
expect(config.getApprovedPlanPath()).toBeUndefined();
|
|
1565
1571
|
});
|
|
1572
|
+
it('performs a comprehensive reset of all session-scoped state when sessionId changes', async () => {
|
|
1573
|
+
const config = new Config({
|
|
1574
|
+
...baseParams,
|
|
1575
|
+
sessionId: 'session-one',
|
|
1576
|
+
plan: true,
|
|
1577
|
+
tracker: true,
|
|
1578
|
+
});
|
|
1579
|
+
await config.initialize();
|
|
1580
|
+
// 1. "Dirty" the session state
|
|
1581
|
+
const oldTrackerService = config.getTrackerService();
|
|
1582
|
+
config.setApprovedPlanPath('/tmp/plan.md');
|
|
1583
|
+
config.topicState.setTopic('Old Topic', 'Old Intent');
|
|
1584
|
+
config.getSkillManager().activateSkill('old-skill');
|
|
1585
|
+
config.getModelAvailabilityService().markTerminal('model-1', 'quota');
|
|
1586
|
+
config.setLatestApiRequest({});
|
|
1587
|
+
const configInternal = config;
|
|
1588
|
+
// Mock internal quota state
|
|
1589
|
+
configInternal.modelQuotas.set('model-1', { remaining: 0, limit: 100 });
|
|
1590
|
+
configInternal.lastEmittedQuotaRemaining = 0;
|
|
1591
|
+
configInternal.lastEmittedQuotaLimit = 100;
|
|
1592
|
+
configInternal.lastQuotaFetchTime = 12345;
|
|
1593
|
+
configInternal.hasAccessToPreviewModel = true;
|
|
1594
|
+
// Listen for quota event
|
|
1595
|
+
const emitQuotaSpy = vi.spyOn(coreEvents, 'emitQuotaChanged');
|
|
1596
|
+
// 2. Trigger session change
|
|
1597
|
+
config.setSessionId('session-two');
|
|
1598
|
+
// 3. Verify EVERYTHING is reset
|
|
1599
|
+
expect(config.getSessionId()).toBe('session-two');
|
|
1600
|
+
expect(config.getApprovedPlanPath()).toBeUndefined();
|
|
1601
|
+
expect(config.topicState.getTopic()).toBeUndefined();
|
|
1602
|
+
expect(config.topicState.getIntent()).toBeUndefined();
|
|
1603
|
+
expect(config.getSkillManager().isSkillActive('old-skill')).toBe(false);
|
|
1604
|
+
expect(config.getTrackerService()).not.toBe(oldTrackerService);
|
|
1605
|
+
expect(config.getModelAvailabilityService().snapshot('model-1').available).toBe(true);
|
|
1606
|
+
expect(config.getLatestApiRequest()).toBeUndefined();
|
|
1607
|
+
// Quota resets
|
|
1608
|
+
expect(configInternal.modelQuotas.size).toBe(0);
|
|
1609
|
+
expect(configInternal.lastEmittedQuotaRemaining).toBeUndefined();
|
|
1610
|
+
expect(configInternal.lastEmittedQuotaLimit).toBeUndefined();
|
|
1611
|
+
expect(configInternal.lastQuotaFetchTime).toBe(0);
|
|
1612
|
+
// Event emission
|
|
1613
|
+
expect(emitQuotaSpy).toHaveBeenCalledWith(undefined, undefined, undefined);
|
|
1614
|
+
});
|
|
1566
1615
|
});
|
|
1567
1616
|
describe('GemmaModelRouterSettings', () => {
|
|
1568
1617
|
const MODEL = DEFAULT_GEMINI_MODEL;
|
|
@@ -1788,7 +1837,7 @@ describe('setApprovalMode with folder trust', () => {
|
|
|
1788
1837
|
vi.clearAllMocks();
|
|
1789
1838
|
});
|
|
1790
1839
|
it('should register RipGrepTool when useRipgrep is true and it is available', async () => {
|
|
1791
|
-
vi.mocked(
|
|
1840
|
+
vi.mocked(resolveRipgrepPath).mockResolvedValue('/mock/rg');
|
|
1792
1841
|
const config = new Config({ ...baseParams, useRipgrep: true });
|
|
1793
1842
|
await config.initialize();
|
|
1794
1843
|
const calls = vi.mocked(ToolRegistry.prototype.registerTool).mock.calls;
|
|
@@ -1799,7 +1848,7 @@ describe('setApprovalMode with folder trust', () => {
|
|
|
1799
1848
|
expect(logRipgrepFallback).not.toHaveBeenCalled();
|
|
1800
1849
|
});
|
|
1801
1850
|
it('should register GrepTool as a fallback when useRipgrep is true but it is not available', async () => {
|
|
1802
|
-
vi.mocked(
|
|
1851
|
+
vi.mocked(resolveRipgrepPath).mockResolvedValue(null);
|
|
1803
1852
|
const config = new Config({ ...baseParams, useRipgrep: true });
|
|
1804
1853
|
await config.initialize();
|
|
1805
1854
|
const calls = vi.mocked(ToolRegistry.prototype.registerTool).mock.calls;
|
|
@@ -1813,7 +1862,7 @@ describe('setApprovalMode with folder trust', () => {
|
|
|
1813
1862
|
});
|
|
1814
1863
|
it('should register GrepTool as a fallback when canUseRipgrep throws an error', async () => {
|
|
1815
1864
|
const error = new Error('ripGrep check failed');
|
|
1816
|
-
vi.mocked(
|
|
1865
|
+
vi.mocked(resolveRipgrepPath).mockRejectedValue(error);
|
|
1817
1866
|
const config = new Config({ ...baseParams, useRipgrep: true });
|
|
1818
1867
|
await config.initialize();
|
|
1819
1868
|
const calls = vi.mocked(ToolRegistry.prototype.registerTool).mock.calls;
|
|
@@ -1833,7 +1882,7 @@ describe('setApprovalMode with folder trust', () => {
|
|
|
1833
1882
|
const wasGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(GrepTool));
|
|
1834
1883
|
expect(wasRipGrepRegistered).toBe(false);
|
|
1835
1884
|
expect(wasGrepRegistered).toBe(true);
|
|
1836
|
-
expect(
|
|
1885
|
+
expect(resolveRipgrepPath).not.toHaveBeenCalled();
|
|
1837
1886
|
expect(logRipgrepFallback).not.toHaveBeenCalled();
|
|
1838
1887
|
});
|
|
1839
1888
|
});
|
|
@@ -2102,6 +2151,13 @@ describe('Config getHooks', () => {
|
|
|
2102
2151
|
expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
|
|
2103
2152
|
expect(spy).toHaveBeenCalled();
|
|
2104
2153
|
});
|
|
2154
|
+
it('should preserve fallback overrides when setting a new model', () => {
|
|
2155
|
+
const config = new Config(baseParams);
|
|
2156
|
+
config.activateFallbackMode('fallback-model', 'failed-model');
|
|
2157
|
+
expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
|
|
2158
|
+
config.setModel('new-model');
|
|
2159
|
+
expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
|
|
2160
|
+
});
|
|
2105
2161
|
it('should allow setting auto model from auto model and reset availability', () => {
|
|
2106
2162
|
const config = new Config({
|
|
2107
2163
|
cwd: '/tmp',
|
|
@@ -2534,15 +2590,15 @@ describe('Config Quota & Preview Model Access', () => {
|
|
|
2534
2590
|
vi.mocked(getCodeAssistServer).mockReturnValue(undefined);
|
|
2535
2591
|
const result = await config.refreshUserQuota();
|
|
2536
2592
|
expect(result).toBeUndefined();
|
|
2537
|
-
// Never set => stays null (unknown); getter returns
|
|
2538
|
-
expect(config.getHasAccessToPreviewModel()).toBe(
|
|
2593
|
+
// Never set => stays null (unknown); getter returns false by default
|
|
2594
|
+
expect(config.getHasAccessToPreviewModel()).toBe(false);
|
|
2539
2595
|
});
|
|
2540
2596
|
it('should return undefined if retrieveUserQuota fails', async () => {
|
|
2541
2597
|
mockCodeAssistServer.retrieveUserQuota.mockRejectedValue(new Error('Network error'));
|
|
2542
2598
|
const result = await config.refreshUserQuota();
|
|
2543
2599
|
expect(result).toBeUndefined();
|
|
2544
|
-
// Never set => stays null (unknown); getter returns
|
|
2545
|
-
expect(config.getHasAccessToPreviewModel()).toBe(
|
|
2600
|
+
// Never set => stays null (unknown); getter returns false by default
|
|
2601
|
+
expect(config.getHasAccessToPreviewModel()).toBe(false);
|
|
2546
2602
|
});
|
|
2547
2603
|
it('should derive quota from remainingFraction when remainingAmount is missing', async () => {
|
|
2548
2604
|
mockCodeAssistServer.retrieveUserQuota.mockResolvedValue({
|
|
@@ -2714,6 +2770,39 @@ describe('Config Quota & Preview Model Access', () => {
|
|
|
2714
2770
|
expect(await config.getPlanModeRoutingEnabled()).toBe(false);
|
|
2715
2771
|
});
|
|
2716
2772
|
});
|
|
2773
|
+
describe('validatePathAccess (PathValidator integration)', () => {
|
|
2774
|
+
it('should reject pathologically long paths', () => {
|
|
2775
|
+
const config = new Config(baseParams);
|
|
2776
|
+
const longPath = path.join(baseParams.targetDir, 'a'.repeat(5000));
|
|
2777
|
+
const result = config.validatePathAccess(longPath, 'read');
|
|
2778
|
+
expect(result).toContain('Invalid path: Path is too long');
|
|
2779
|
+
});
|
|
2780
|
+
it('should reject paths with log markers', () => {
|
|
2781
|
+
const config = new Config(baseParams);
|
|
2782
|
+
const logPath = path.join(baseParams.targetDir, 'AssertionError: expected true to be false');
|
|
2783
|
+
const result = config.validatePathAccess(logPath, 'read');
|
|
2784
|
+
expect(result).toContain('Invalid path: Path appears to be a misinterpreted log fragment');
|
|
2785
|
+
});
|
|
2786
|
+
it('should reject paths with control characters', () => {
|
|
2787
|
+
const config = new Config(baseParams);
|
|
2788
|
+
const malformedPath = path.join(baseParams.targetDir, 'file\nwith\nnewline.txt');
|
|
2789
|
+
const result = config.validatePathAccess(malformedPath, 'read');
|
|
2790
|
+
expect(result).toContain('Invalid path: Path contains invalid characters');
|
|
2791
|
+
});
|
|
2792
|
+
it('should allow normal paths', () => {
|
|
2793
|
+
const config = new Config(baseParams);
|
|
2794
|
+
const normalPath = path.resolve(baseParams.targetDir, 'src/index.ts');
|
|
2795
|
+
const result = config.validatePathAccess(normalPath, 'read');
|
|
2796
|
+
// It might return "Path not in workspace" or similar if not authorized,
|
|
2797
|
+
// but it should NOT return the "Invalid path" prefix from PathValidator.
|
|
2798
|
+
if (result) {
|
|
2799
|
+
expect(result).not.toContain('Invalid path:');
|
|
2800
|
+
}
|
|
2801
|
+
else {
|
|
2802
|
+
expect(result).toBeNull();
|
|
2803
|
+
}
|
|
2804
|
+
});
|
|
2805
|
+
});
|
|
2717
2806
|
});
|
|
2718
2807
|
describe('Config JIT Initialization', () => {
|
|
2719
2808
|
let config;
|
|
@@ -2732,13 +2821,12 @@ describe('Config JIT Initialization', () => {
|
|
|
2732
2821
|
};
|
|
2733
2822
|
MemoryContextManager.mockImplementation(() => mockMemoryContextManager);
|
|
2734
2823
|
});
|
|
2735
|
-
it('should initialize MemoryContextManager, load memory, and delegate to it
|
|
2824
|
+
it('should initialize MemoryContextManager, load memory, and delegate to it', async () => {
|
|
2736
2825
|
const params = {
|
|
2737
2826
|
sessionId: 'test-session',
|
|
2738
2827
|
targetDir: '/tmp/test',
|
|
2739
2828
|
debugMode: false,
|
|
2740
2829
|
model: 'test-model',
|
|
2741
|
-
experimentalJitContext: true,
|
|
2742
2830
|
userMemory: 'Initial Memory',
|
|
2743
2831
|
cwd: '/tmp/test',
|
|
2744
2832
|
};
|
|
@@ -2765,27 +2853,24 @@ describe('Config JIT Initialization', () => {
|
|
|
2765
2853
|
expect(sessionMemory).toContain('MCP Instructions');
|
|
2766
2854
|
expect(sessionMemory).toContain('</project_context>');
|
|
2767
2855
|
expect(sessionMemory).toContain('</loaded_context>');
|
|
2856
|
+
const sessionMemoryWithoutExtension = config.getSessionMemory({
|
|
2857
|
+
includeExtensionContext: false,
|
|
2858
|
+
});
|
|
2859
|
+
expect(sessionMemoryWithoutExtension).toContain('<loaded_context>');
|
|
2860
|
+
expect(sessionMemoryWithoutExtension).not.toContain('<extension_context>');
|
|
2861
|
+
expect(sessionMemoryWithoutExtension).not.toContain('Extension Memory');
|
|
2862
|
+
expect(sessionMemoryWithoutExtension).toContain('<project_context>');
|
|
2863
|
+
expect(sessionMemoryWithoutExtension).toContain('Environment Memory');
|
|
2864
|
+
expect(sessionMemoryWithoutExtension).toContain('</loaded_context>');
|
|
2768
2865
|
// Verify state update (delegated to MemoryContextManager)
|
|
2769
2866
|
expect(config.getGeminiMdFileCount()).toBe(1);
|
|
2770
2867
|
expect(config.getGeminiMdFilePaths()).toEqual(['/path/to/GEMINI.md']);
|
|
2771
2868
|
});
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
model: 'test-model',
|
|
2778
|
-
experimentalJitContext: false,
|
|
2779
|
-
userMemory: 'Initial Memory',
|
|
2780
|
-
cwd: '/tmp/test',
|
|
2781
|
-
};
|
|
2782
|
-
config = new Config(params);
|
|
2783
|
-
await config.initialize();
|
|
2784
|
-
expect(MemoryContextManager).not.toHaveBeenCalled();
|
|
2785
|
-
expect(config.getUserMemory()).toBe('Initial Memory');
|
|
2786
|
-
});
|
|
2787
|
-
describe('isMemoryV2Enabled', () => {
|
|
2788
|
-
it('should default to true', () => {
|
|
2869
|
+
describe('memory path access', () => {
|
|
2870
|
+
it('should NOT add the global ~/.cell-cli directory to the workspace', async () => {
|
|
2871
|
+
// Memory does not broaden the workspace to include the global ~/.cell-cli/
|
|
2872
|
+
// directory. Cross-project personal preferences are routed to
|
|
2873
|
+
// ~/.cell-cli/GEMINI.md via the surgical isPathAllowed allowlist instead.
|
|
2789
2874
|
const params = {
|
|
2790
2875
|
sessionId: 'test-session',
|
|
2791
2876
|
targetDir: '/tmp/test',
|
|
@@ -2794,84 +2879,151 @@ describe('Config JIT Initialization', () => {
|
|
|
2794
2879
|
cwd: '/tmp/test',
|
|
2795
2880
|
};
|
|
2796
2881
|
config = new Config(params);
|
|
2797
|
-
|
|
2882
|
+
await config.initialize();
|
|
2883
|
+
const directories = config.getWorkspaceContext().getDirectories();
|
|
2884
|
+
expect(directories).not.toContain(Storage.getGlobalGeminiDir());
|
|
2798
2885
|
});
|
|
2799
|
-
it('should
|
|
2886
|
+
it('should allow isPathAllowed to write the global ~/.cell-cli/GEMINI.md file', async () => {
|
|
2887
|
+
// Surgical allowlist: the prompt routes cross-project personal
|
|
2888
|
+
// preferences to ~/.cell-cli/GEMINI.md, so the agent must be able to edit
|
|
2889
|
+
// that exact file via edit/write_file.
|
|
2800
2890
|
const params = {
|
|
2801
2891
|
sessionId: 'test-session',
|
|
2802
2892
|
targetDir: '/tmp/test',
|
|
2803
2893
|
debugMode: false,
|
|
2804
2894
|
model: 'test-model',
|
|
2805
2895
|
cwd: '/tmp/test',
|
|
2806
|
-
experimentalMemoryV2: false,
|
|
2807
2896
|
};
|
|
2808
2897
|
config = new Config(params);
|
|
2809
|
-
|
|
2898
|
+
await config.initialize();
|
|
2899
|
+
const globalGeminiMdPath = path.join(Storage.getGlobalGeminiDir(), 'GEMINI.md');
|
|
2900
|
+
expect(config.isPathAllowed(globalGeminiMdPath)).toBe(true);
|
|
2810
2901
|
});
|
|
2811
|
-
it('should
|
|
2902
|
+
it('should NOT allow isPathAllowed to write other files under ~/.cell-cli/ (least privilege)', async () => {
|
|
2903
|
+
// The allowlist is surgical: only ~/.cell-cli/GEMINI.md is reachable.
|
|
2904
|
+
// settings.json, keybindings.json, credentials, etc. remain disallowed.
|
|
2812
2905
|
const params = {
|
|
2813
2906
|
sessionId: 'test-session',
|
|
2814
2907
|
targetDir: '/tmp/test',
|
|
2815
2908
|
debugMode: false,
|
|
2816
2909
|
model: 'test-model',
|
|
2817
2910
|
cwd: '/tmp/test',
|
|
2818
|
-
experimentalMemoryV2: true,
|
|
2819
2911
|
};
|
|
2820
2912
|
config = new Config(params);
|
|
2821
|
-
|
|
2913
|
+
await config.initialize();
|
|
2914
|
+
const globalDir = Storage.getGlobalGeminiDir();
|
|
2915
|
+
expect(config.isPathAllowed(path.join(globalDir, 'settings.json'))).toBe(false);
|
|
2916
|
+
expect(config.isPathAllowed(path.join(globalDir, 'keybindings.json'))).toBe(false);
|
|
2917
|
+
expect(config.isPathAllowed(path.join(globalDir, 'oauth_creds.json'))).toBe(false);
|
|
2822
2918
|
});
|
|
2823
|
-
it('should NOT
|
|
2824
|
-
//
|
|
2825
|
-
//
|
|
2826
|
-
//
|
|
2827
|
-
//
|
|
2919
|
+
it('should NOT allow isPathAllowed to write into the auto-memory inbox', () => {
|
|
2920
|
+
// <projectMemoryDir>/.inbox/ is owned by the extraction agent and the
|
|
2921
|
+
// /memory inbox review flow. The main agent must not be able to drop
|
|
2922
|
+
// patches in there directly, even though it falls inside <projectTempDir>.
|
|
2923
|
+
// We bypass Config.initialize() (the GitService init path is independently
|
|
2924
|
+
// flaky in this suite) by spying on the storage methods isPathAllowed
|
|
2925
|
+
// actually consults.
|
|
2828
2926
|
const params = {
|
|
2829
2927
|
sessionId: 'test-session',
|
|
2830
2928
|
targetDir: '/tmp/test',
|
|
2831
2929
|
debugMode: false,
|
|
2832
2930
|
model: 'test-model',
|
|
2833
2931
|
cwd: '/tmp/test',
|
|
2834
|
-
experimentalMemoryV2: true,
|
|
2835
2932
|
};
|
|
2836
2933
|
config = new Config(params);
|
|
2837
|
-
|
|
2838
|
-
const
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
//
|
|
2843
|
-
|
|
2844
|
-
|
|
2934
|
+
const fakeMemoryTempDir = '/tmp/test-fake-temp/memory';
|
|
2935
|
+
const fakeProjectTempDir = '/tmp/test-fake-temp';
|
|
2936
|
+
vi.spyOn(config.storage, 'getProjectMemoryTempDir').mockReturnValue(fakeMemoryTempDir);
|
|
2937
|
+
vi.spyOn(config.storage, 'getProjectTempDir').mockReturnValue(fakeProjectTempDir);
|
|
2938
|
+
const inboxRoot = path.join(fakeMemoryTempDir, '.inbox');
|
|
2939
|
+
// The inbox directory itself and any path under it are denied.
|
|
2940
|
+
expect(config.isPathAllowed(inboxRoot)).toBe(false);
|
|
2941
|
+
expect(config.isPathAllowed(path.join(inboxRoot, 'private', 'foo.patch'))).toBe(false);
|
|
2942
|
+
expect(config.isPathAllowed(path.join(inboxRoot, 'global', 'bar.patch'))).toBe(false);
|
|
2943
|
+
// Sibling files under <projectMemoryDir> stay reachable so the main
|
|
2944
|
+
// agent can edit MEMORY.md and topic notes directly.
|
|
2945
|
+
expect(config.isPathAllowed(path.join(fakeMemoryTempDir, 'MEMORY.md'))).toBe(true);
|
|
2946
|
+
expect(config.isPathAllowed(path.join(fakeMemoryTempDir, 'some-topic.md'))).toBe(true);
|
|
2947
|
+
});
|
|
2948
|
+
it('should allow scoped extraction access only to canonical inbox patches', () => {
|
|
2845
2949
|
const params = {
|
|
2846
2950
|
sessionId: 'test-session',
|
|
2847
2951
|
targetDir: '/tmp/test',
|
|
2848
2952
|
debugMode: false,
|
|
2849
2953
|
model: 'test-model',
|
|
2850
2954
|
cwd: '/tmp/test',
|
|
2851
|
-
experimentalMemoryV2: true,
|
|
2852
2955
|
};
|
|
2853
2956
|
config = new Config(params);
|
|
2854
|
-
|
|
2855
|
-
const
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2957
|
+
const fakeMemoryTempDir = '/tmp/test-fake-temp/memory';
|
|
2958
|
+
const fakeProjectTempDir = '/tmp/test-fake-temp';
|
|
2959
|
+
vi.spyOn(config.storage, 'getProjectMemoryTempDir').mockReturnValue(fakeMemoryTempDir);
|
|
2960
|
+
vi.spyOn(config.storage, 'getProjectTempDir').mockReturnValue(fakeProjectTempDir);
|
|
2961
|
+
const inboxRoot = path.join(fakeMemoryTempDir, '.inbox');
|
|
2962
|
+
const privateExtractionPatch = path.join(inboxRoot, 'private', 'extraction.patch');
|
|
2963
|
+
const globalExtractionPatch = path.join(inboxRoot, 'global', 'extraction.patch');
|
|
2964
|
+
expect(config.isPathAllowed(privateExtractionPatch)).toBe(false);
|
|
2965
|
+
runWithScopedMemoryInboxAccess(() => {
|
|
2966
|
+
expect(config.isPathAllowed(privateExtractionPatch)).toBe(true);
|
|
2967
|
+
expect(config.validatePathAccess(privateExtractionPatch)).toBeNull();
|
|
2968
|
+
expect(config.isPathAllowed(globalExtractionPatch)).toBe(true);
|
|
2969
|
+
// Writes (the default checkType for isPathAllowed) remain restricted
|
|
2970
|
+
// to the canonical extraction.patch filenames.
|
|
2971
|
+
expect(config.isPathAllowed(path.join(inboxRoot, 'private', 'other.patch'))).toBe(false);
|
|
2972
|
+
expect(config.isPathAllowed(path.join(inboxRoot, 'private', 'nested', 'extraction.patch'))).toBe(false);
|
|
2973
|
+
// Reads are broadened to the .inbox/{private,global}/ subtree so the
|
|
2974
|
+
// extractor can list and inspect prior patches before consolidating.
|
|
2975
|
+
const privateOtherPatch = path.join(inboxRoot, 'private', 'other.patch');
|
|
2976
|
+
const globalLeftover = path.join(inboxRoot, 'global', 'topic-a.patch');
|
|
2977
|
+
const nestedReadPath = path.join(inboxRoot, 'private', 'nested', 'extraction.patch');
|
|
2978
|
+
expect(config.validatePathAccess(privateOtherPatch, 'read')).toBeNull();
|
|
2979
|
+
expect(config.validatePathAccess(globalLeftover, 'read')).toBeNull();
|
|
2980
|
+
expect(config.validatePathAccess(nestedReadPath, 'read')).toBeNull();
|
|
2981
|
+
expect(config.validatePathAccess(inboxRoot, 'read')).toBeNull();
|
|
2982
|
+
expect(config.validatePathAccess(path.join(inboxRoot, 'private'), 'read')).toBeNull();
|
|
2983
|
+
expect(config.validatePathAccess(path.join(inboxRoot, 'global'), 'read')).toBeNull();
|
|
2984
|
+
// Writes to the same broadened paths are still rejected.
|
|
2985
|
+
expect(config.validatePathAccess(privateOtherPatch)).toContain('Path not in workspace');
|
|
2986
|
+
expect(config.validatePathAccess(nestedReadPath)).toContain('Path not in workspace');
|
|
2987
|
+
});
|
|
2988
|
+
expect(config.isPathAllowed(privateExtractionPatch)).toBe(false);
|
|
2989
|
+
// Outside the scope, reads of inbox files are denied again.
|
|
2990
|
+
expect(config.validatePathAccess(path.join(inboxRoot, 'private', 'other.patch'), 'read')).toContain('Path not in workspace');
|
|
2991
|
+
});
|
|
2992
|
+
it('should restrict scoped auto-memory extraction writes to generated artifacts', () => {
|
|
2861
2993
|
const params = {
|
|
2862
2994
|
sessionId: 'test-session',
|
|
2863
2995
|
targetDir: '/tmp/test',
|
|
2864
2996
|
debugMode: false,
|
|
2865
2997
|
model: 'test-model',
|
|
2866
2998
|
cwd: '/tmp/test',
|
|
2867
|
-
experimentalMemoryV2: true,
|
|
2868
2999
|
};
|
|
2869
3000
|
config = new Config(params);
|
|
2870
|
-
|
|
2871
|
-
const
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
3001
|
+
const fakeMemoryTempDir = '/tmp/test-fake-temp/memory';
|
|
3002
|
+
const fakeProjectTempDir = '/tmp/test-fake-temp';
|
|
3003
|
+
const fakeSkillsMemoryDir = path.join(fakeMemoryTempDir, 'skills');
|
|
3004
|
+
vi.spyOn(config.storage, 'getProjectMemoryTempDir').mockReturnValue(fakeMemoryTempDir);
|
|
3005
|
+
vi.spyOn(config.storage, 'getProjectTempDir').mockReturnValue(fakeProjectTempDir);
|
|
3006
|
+
vi.spyOn(config.storage, 'getProjectSkillsMemoryDir').mockReturnValue(fakeSkillsMemoryDir);
|
|
3007
|
+
const inboxRoot = path.join(fakeMemoryTempDir, '.inbox');
|
|
3008
|
+
const privateExtractionPatch = path.join(inboxRoot, 'private', 'extraction.patch');
|
|
3009
|
+
const skillArtifact = path.join(fakeSkillsMemoryDir, 'my-skill', 'SKILL.md');
|
|
3010
|
+
const activeMemoryPath = path.join(fakeMemoryTempDir, 'MEMORY.md');
|
|
3011
|
+
const projectTempPath = path.join(fakeProjectTempDir, 'logs', 'run.log');
|
|
3012
|
+
const workspaceMemoryPath = path.join('/tmp/test', 'GEMINI.md');
|
|
3013
|
+
expect(config.validatePathAccess(activeMemoryPath)).toBeNull();
|
|
3014
|
+
runWithScopedAutoMemoryExtractionWriteAccess(() => {
|
|
3015
|
+
expect(config.validatePathAccess(skillArtifact)).toBeNull();
|
|
3016
|
+
expect(config.validatePathAccess(activeMemoryPath)).toContain('Auto-memory extraction write denied');
|
|
3017
|
+
expect(config.validatePathAccess(projectTempPath)).toContain('Auto-memory extraction write denied');
|
|
3018
|
+
expect(config.validatePathAccess(workspaceMemoryPath)).toContain('Auto-memory extraction write denied');
|
|
3019
|
+
// Reads still use the normal workspace/temp allowlists.
|
|
3020
|
+
expect(config.validatePathAccess(activeMemoryPath, 'read')).toBeNull();
|
|
3021
|
+
});
|
|
3022
|
+
runWithScopedMemoryInboxAccess(() => {
|
|
3023
|
+
runWithScopedAutoMemoryExtractionWriteAccess(() => {
|
|
3024
|
+
expect(config.validatePathAccess(privateExtractionPatch)).toBeNull();
|
|
3025
|
+
});
|
|
3026
|
+
});
|
|
2875
3027
|
});
|
|
2876
3028
|
});
|
|
2877
3029
|
describe('isAutoMemoryEnabled', () => {
|
|
@@ -2922,7 +3074,7 @@ describe('Config JIT Initialization', () => {
|
|
|
2922
3074
|
config = new Config(params);
|
|
2923
3075
|
expect(config.getExperimentalGemma()).toBe(false);
|
|
2924
3076
|
});
|
|
2925
|
-
it('should return
|
|
3077
|
+
it('should return true when experimentalGemma is not provided', () => {
|
|
2926
3078
|
const params = {
|
|
2927
3079
|
sessionId: 'test-session',
|
|
2928
3080
|
targetDir: '/tmp/test',
|
|
@@ -2931,19 +3083,17 @@ describe('Config JIT Initialization', () => {
|
|
|
2931
3083
|
cwd: '/tmp/test',
|
|
2932
3084
|
};
|
|
2933
3085
|
config = new Config(params);
|
|
2934
|
-
expect(config.getExperimentalGemma()).toBe(
|
|
3086
|
+
expect(config.getExperimentalGemma()).toBe(true);
|
|
2935
3087
|
});
|
|
2936
|
-
it('should
|
|
3088
|
+
it('should default to disabled', () => {
|
|
2937
3089
|
const params = {
|
|
2938
3090
|
sessionId: 'test-session',
|
|
2939
3091
|
targetDir: '/tmp/test',
|
|
2940
3092
|
debugMode: false,
|
|
2941
3093
|
model: 'test-model',
|
|
2942
3094
|
cwd: '/tmp/test',
|
|
2943
|
-
experimentalMemoryV2: true,
|
|
2944
3095
|
};
|
|
2945
3096
|
config = new Config(params);
|
|
2946
|
-
expect(config.isMemoryV2Enabled()).toBe(true);
|
|
2947
3097
|
expect(config.isAutoMemoryEnabled()).toBe(false);
|
|
2948
3098
|
});
|
|
2949
3099
|
});
|
|
@@ -3088,6 +3238,27 @@ describe('Plans Directory Initialization', () => {
|
|
|
3088
3238
|
const context = config.getWorkspaceContext();
|
|
3089
3239
|
expect(context.getDirectories()).not.toContain(plansDir);
|
|
3090
3240
|
});
|
|
3241
|
+
it('should gracefully fallback to default plans directory if retrieving custom directory throw an error', async () => {
|
|
3242
|
+
vi.spyOn(coreEvents, 'emitFeedback');
|
|
3243
|
+
vi.spyOn(fs.promises, 'access').mockResolvedValue(undefined);
|
|
3244
|
+
const config = new Config({
|
|
3245
|
+
...baseParams,
|
|
3246
|
+
plan: true,
|
|
3247
|
+
planSettings: {
|
|
3248
|
+
directory: '/outside/project/root',
|
|
3249
|
+
},
|
|
3250
|
+
});
|
|
3251
|
+
await config.initialize();
|
|
3252
|
+
const plansDir = config.storage.getPlansDir();
|
|
3253
|
+
// Should fallback to default project temp plans dir
|
|
3254
|
+
expect(plansDir).toContain('plans');
|
|
3255
|
+
expect(plansDir).not.toContain('/outside/project/root');
|
|
3256
|
+
// Should emit a warning feedback
|
|
3257
|
+
expect(coreEvents.emitFeedback).toHaveBeenCalledWith('warning', expect.stringContaining('Invalid custom plans directory'), expect.any(Error));
|
|
3258
|
+
// Should still add the fallback plans directory to workspace context if it exists
|
|
3259
|
+
const context = config.getWorkspaceContext();
|
|
3260
|
+
expect(context.getDirectories()).toContain(plansDir);
|
|
3261
|
+
});
|
|
3091
3262
|
it('should NOT create plans directory or add it to workspace context when plan is disabled', async () => {
|
|
3092
3263
|
const config = new Config({
|
|
3093
3264
|
...baseParams,
|
|
@@ -3216,4 +3387,85 @@ describe('ADKSettings', () => {
|
|
|
3216
3387
|
expect(config.getAgentSessionNoninteractiveEnabled()).toBe(true);
|
|
3217
3388
|
});
|
|
3218
3389
|
});
|
|
3390
|
+
describe('hasGemini35FlashGAAccess model setting', () => {
|
|
3391
|
+
const baseParams = {
|
|
3392
|
+
sessionId: 'test',
|
|
3393
|
+
targetDir: '.',
|
|
3394
|
+
debugMode: false,
|
|
3395
|
+
model: 'test-model',
|
|
3396
|
+
cwd: '.',
|
|
3397
|
+
};
|
|
3398
|
+
it('should set DEFAULT_GEMINI_FLASH_MODEL to gemini-3.5-flash and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash-preview if hasGemini35FlashGAAccess returns true and authType is USE_GEMINI', () => {
|
|
3399
|
+
const config = new Config(baseParams);
|
|
3400
|
+
config['contentGeneratorConfig'] = { authType: AuthType.USE_GEMINI };
|
|
3401
|
+
// Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
|
|
3402
|
+
config.setExperiments({
|
|
3403
|
+
experimentIds: [],
|
|
3404
|
+
flags: {
|
|
3405
|
+
[ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
|
|
3406
|
+
boolValue: true,
|
|
3407
|
+
},
|
|
3408
|
+
},
|
|
3409
|
+
});
|
|
3410
|
+
// Call the method
|
|
3411
|
+
const result = config.hasGemini35FlashGAAccess();
|
|
3412
|
+
expect(result).toBe(true);
|
|
3413
|
+
expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3.5-flash');
|
|
3414
|
+
expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash-preview');
|
|
3415
|
+
});
|
|
3416
|
+
it('should set DEFAULT_GEMINI_FLASH_MODEL to gemini-3.5-flash and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash-preview if hasGemini35FlashGAAccess returns true and authType is LOGIN_WITH_GOOGLE', () => {
|
|
3417
|
+
const config = new Config(baseParams);
|
|
3418
|
+
config['contentGeneratorConfig'] = { authType: AuthType.LOGIN_WITH_GOOGLE };
|
|
3419
|
+
// Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
|
|
3420
|
+
config.setExperiments({
|
|
3421
|
+
experimentIds: [],
|
|
3422
|
+
flags: {
|
|
3423
|
+
[ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
|
|
3424
|
+
boolValue: true,
|
|
3425
|
+
},
|
|
3426
|
+
},
|
|
3427
|
+
});
|
|
3428
|
+
// Call the method
|
|
3429
|
+
const result = config.hasGemini35FlashGAAccess();
|
|
3430
|
+
expect(result).toBe(true);
|
|
3431
|
+
expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3.5-flash');
|
|
3432
|
+
expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash-preview');
|
|
3433
|
+
});
|
|
3434
|
+
it('should set DEFAULT_GEMINI_FLASH_MODEL to gemini-3.5-flash and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash-preview if hasGemini35FlashGAAccess returns true and authType is KEYCLOAK', () => {
|
|
3435
|
+
const config = new Config(baseParams);
|
|
3436
|
+
config['contentGeneratorConfig'] = { authType: AuthType.KEYCLOAK };
|
|
3437
|
+
// Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
|
|
3438
|
+
config.setExperiments({
|
|
3439
|
+
experimentIds: [],
|
|
3440
|
+
flags: {
|
|
3441
|
+
[ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
|
|
3442
|
+
boolValue: true,
|
|
3443
|
+
},
|
|
3444
|
+
},
|
|
3445
|
+
});
|
|
3446
|
+
// Call the method
|
|
3447
|
+
const result = config.hasGemini35FlashGAAccess();
|
|
3448
|
+
expect(result).toBe(true);
|
|
3449
|
+
expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3.5-flash');
|
|
3450
|
+
expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash-preview');
|
|
3451
|
+
});
|
|
3452
|
+
it('should set DEFAULT_GEMINI_FLASH_MODEL and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash if hasGemini35FlashGAAccess returns true and authType is USE_VERTEX_AI', () => {
|
|
3453
|
+
const config = new Config(baseParams);
|
|
3454
|
+
config['contentGeneratorConfig'] = { authType: AuthType.USE_VERTEX_AI };
|
|
3455
|
+
// Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
|
|
3456
|
+
config.setExperiments({
|
|
3457
|
+
experimentIds: [],
|
|
3458
|
+
flags: {
|
|
3459
|
+
[ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
|
|
3460
|
+
boolValue: true,
|
|
3461
|
+
},
|
|
3462
|
+
},
|
|
3463
|
+
});
|
|
3464
|
+
// Call the method
|
|
3465
|
+
const result = config.hasGemini35FlashGAAccess();
|
|
3466
|
+
expect(result).toBe(true);
|
|
3467
|
+
expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3-flash');
|
|
3468
|
+
expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash');
|
|
3469
|
+
});
|
|
3470
|
+
});
|
|
3219
3471
|
//# sourceMappingURL=config.test.js.map
|