@google/gemini-cli-core 0.35.0-preview.2 → 0.36.0-nightly.20260321.fc03891a1
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/README.md +0 -1
- package/dist/docs/CONTRIBUTING.md +0 -15
- package/dist/docs/admin/enterprise-controls.md +61 -0
- package/dist/docs/changelogs/index.md +11 -0
- package/dist/docs/changelogs/latest.md +459 -209
- package/dist/docs/changelogs/preview.md +355 -454
- package/dist/docs/cli/checkpointing.md +3 -1
- package/dist/docs/cli/cli-reference.md +1 -0
- package/dist/docs/cli/custom-commands.md +7 -5
- package/dist/docs/cli/enterprise.md +15 -9
- package/dist/docs/cli/git-worktrees.md +107 -0
- package/dist/docs/cli/model-steering.md +4 -3
- package/dist/docs/cli/model.md +3 -1
- package/dist/docs/cli/notifications.md +4 -3
- package/dist/docs/cli/plan-mode.md +28 -8
- package/dist/docs/cli/sandbox.md +24 -4
- package/dist/docs/cli/session-management.md +6 -0
- package/dist/docs/cli/settings.md +14 -1
- package/dist/docs/cli/skills.md +4 -2
- package/dist/docs/cli/system-prompt.md +3 -1
- package/dist/docs/cli/telemetry.md +6 -3
- package/dist/docs/cli/themes.md +12 -8
- package/dist/docs/cli/tutorials/file-management.md +8 -6
- package/dist/docs/cli/tutorials/mcp-setup.md +5 -3
- package/dist/docs/cli/tutorials/memory-management.md +6 -6
- package/dist/docs/cli/tutorials/plan-mode-steering.md +4 -3
- package/dist/docs/cli/tutorials/shell-commands.md +3 -3
- package/dist/docs/core/remote-agents.md +8 -3
- package/dist/docs/core/subagents.md +21 -13
- package/dist/docs/extensions/reference.md +8 -3
- package/dist/docs/get-started/authentication.md +60 -50
- package/dist/docs/get-started/examples.md +3 -1
- package/dist/docs/get-started/gemini-3.md +11 -5
- package/dist/docs/hooks/index.md +3 -1
- package/dist/docs/hooks/writing-hooks.md +2 -2
- package/dist/docs/ide-integration/ide-companion-spec.md +5 -3
- package/dist/docs/ide-integration/index.md +8 -4
- package/dist/docs/issue-and-pr-automation.md +3 -1
- package/dist/docs/local-development.md +3 -1
- package/dist/docs/reference/commands.md +2 -2
- package/dist/docs/reference/configuration.md +410 -16
- package/dist/docs/reference/policy-engine.md +47 -19
- package/dist/docs/reference/tools.md +3 -1
- package/dist/docs/release-confidence.md +7 -3
- package/dist/docs/releases.md +11 -7
- package/dist/docs/resources/faq.md +13 -0
- package/dist/docs/resources/tos-privacy.md +4 -2
- package/dist/docs/resources/troubleshooting.md +3 -1
- package/dist/docs/sidebar.json +5 -0
- package/dist/docs/tools/mcp-server.md +17 -9
- package/dist/docs/tools/planning.md +3 -1
- package/dist/docs/tools/shell.md +4 -4
- package/dist/docs/tools/todos.md +2 -1
- package/dist/{google-gemini-cli-core-0.35.0-preview.1.tgz → google-gemini-cli-core-0.36.0-nightly.20260317.2f90b4653.tgz} +0 -0
- package/dist/src/agent/agent-session.d.ts +37 -0
- package/dist/src/agent/agent-session.js +168 -0
- package/dist/src/agent/agent-session.js.map +1 -0
- package/dist/src/agent/agent-session.test.d.ts +6 -0
- package/dist/src/agent/agent-session.test.js +217 -0
- package/dist/src/agent/agent-session.test.js.map +1 -0
- package/dist/src/agent/content-utils.d.ts +33 -0
- package/dist/src/agent/content-utils.js +135 -0
- package/dist/src/agent/content-utils.js.map +1 -0
- package/dist/src/agent/content-utils.test.d.ts +6 -0
- package/dist/src/agent/content-utils.test.js +223 -0
- package/dist/src/agent/content-utils.test.js.map +1 -0
- package/dist/src/agent/mock.d.ts +9 -12
- package/dist/src/agent/mock.js +88 -129
- package/dist/src/agent/mock.js.map +1 -1
- package/dist/src/agent/mock.test.js +114 -144
- package/dist/src/agent/mock.test.js.map +1 -1
- package/dist/src/agent/types.d.ts +21 -21
- package/dist/src/agents/a2a-client-manager.d.ts +2 -11
- package/dist/src/agents/a2a-client-manager.js +3 -19
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/a2a-client-manager.test.js +6 -10
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
- package/dist/src/agents/agent-scheduler.d.ts +6 -0
- package/dist/src/agents/agent-scheduler.js +3 -2
- package/dist/src/agents/agent-scheduler.js.map +1 -1
- package/dist/src/agents/agent-scheduler.test.js +6 -0
- package/dist/src/agents/agent-scheduler.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentDefinition.js +10 -1
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.js +62 -1
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.test.js +73 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.js +2 -97
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +30 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/browserManager.js +11 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -1
- package/dist/src/agents/browser/browserManager.test.js +37 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +4 -2
- package/dist/src/agents/browser/mcpToolWrapper.js +30 -8
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.test.js +30 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +3 -3
- package/dist/src/agents/codebase-investigator.js +3 -3
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +3 -1
- package/dist/src/agents/local-executor.js +138 -39
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +305 -12
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.js +43 -24
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +89 -14
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.d.ts +25 -0
- package/dist/src/agents/memory-manager-agent.js +137 -0
- package/dist/src/agents/memory-manager-agent.js.map +1 -0
- package/dist/src/agents/memory-manager-agent.test.d.ts +6 -0
- package/dist/src/agents/memory-manager-agent.test.js +117 -0
- package/dist/src/agents/memory-manager-agent.test.js.map +1 -0
- package/dist/src/agents/registry.js +21 -3
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +23 -24
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +3 -1
- package/dist/src/agents/remote-invocation.js +10 -5
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +64 -41
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.js +1 -1
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/types.d.ts +12 -0
- package/dist/src/agents/types.js +14 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +41 -1
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +47 -0
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +11 -0
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.test.js +68 -0
- package/dist/src/code_assist/admin/admin_controls.test.js.map +1 -1
- package/dist/src/code_assist/admin/mcpUtils.d.ts +16 -1
- package/dist/src/code_assist/admin/mcpUtils.js +43 -0
- package/dist/src/code_assist/admin/mcpUtils.js.map +1 -1
- package/dist/src/code_assist/admin/mcpUtils.test.js +130 -1
- package/dist/src/code_assist/admin/mcpUtils.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +458 -0
- package/dist/src/code_assist/types.js +26 -0
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/config/agent-loop-context.d.ts +6 -0
- package/dist/src/config/config.d.ts +41 -10
- package/dist/src/config/config.js +96 -19
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +29 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +265 -9
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/models.d.ts +13 -2
- package/dist/src/config/models.js +31 -3
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +52 -7
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/path-validation.test.d.ts +6 -0
- package/dist/src/config/path-validation.test.js +59 -0
- package/dist/src/config/path-validation.test.js.map +1 -0
- package/dist/src/core/client.d.ts +1 -0
- package/dist/src/core/client.js +6 -1
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +9 -1
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +36 -6
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +97 -3
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +2 -2
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/prompts.test.js +10 -0
- package/dist/src/core/prompts.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/generated/git-commit.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +2 -7
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.test.js +7 -0
- package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/config.js +2 -0
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +15 -0
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/memory-manager-policy.test.d.ts +6 -0
- package/dist/src/policy/memory-manager-policy.test.js +80 -0
- package/dist/src/policy/memory-manager-policy.test.js.map +1 -0
- package/dist/src/policy/policies/memory-manager.toml +10 -0
- package/dist/src/policy/policies/plan.toml +14 -0
- package/dist/src/policy/policies/yolo.toml +1 -0
- package/dist/src/policy/policy-engine.js +33 -6
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +85 -3
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/policy-updater.test.js +44 -0
- package/dist/src/policy/policy-updater.test.js.map +1 -1
- package/dist/src/policy/toml-loader.js +2 -0
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/types.d.ts +11 -0
- package/dist/src/policy/types.js +5 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/promptProvider.js +5 -3
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +1 -0
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory-manager.test.d.ts +6 -0
- package/dist/src/prompts/snippets-memory-manager.test.js +31 -0
- package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +2 -0
- package/dist/src/prompts/snippets.js +7 -3
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +5 -0
- package/dist/src/prompts/snippets.legacy.js +30 -2
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +1 -1
- package/dist/src/routing/strategies/classifierStrategy.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/numericalClassifierStrategy.js +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.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/macos/MacOsSandboxManager.d.ts +28 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.d.ts +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +160 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +33 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.d.ts +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +87 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -0
- package/dist/src/sandbox/macos/baseProfile.d.ts +20 -0
- package/dist/src/sandbox/macos/baseProfile.js +93 -0
- package/dist/src/sandbox/macos/baseProfile.js.map +1 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +25 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +58 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.d.ts +1 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +80 -0
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -0
- package/dist/src/scheduler/scheduler.js +2 -0
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/services/contextManager.js +2 -3
- package/dist/src/services/contextManager.js.map +1 -1
- package/dist/src/services/contextManager.test.js +1 -1
- package/dist/src/services/contextManager.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +36 -1
- package/dist/src/services/modelConfigService.js +66 -0
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/sandboxManager.d.ts +3 -4
- package/dist/src/services/sandboxManager.js +1 -14
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +13 -16
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxManagerFactory.d.ts +11 -0
- package/dist/src/services/sandboxManagerFactory.js +31 -0
- package/dist/src/services/sandboxManagerFactory.js.map +1 -0
- package/dist/src/services/sandboxedFileSystemService.d.ts +17 -0
- package/dist/src/services/sandboxedFileSystemService.js +95 -0
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -0
- package/dist/src/services/sandboxedFileSystemService.test.d.ts +6 -0
- package/dist/src/services/sandboxedFileSystemService.test.js +87 -0
- package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -0
- package/dist/src/services/scripts/GeminiSandbox.cs +370 -0
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +79 -75
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/trackerTypes.d.ts +1 -0
- package/dist/src/services/trackerTypes.js +1 -0
- package/dist/src/services/trackerTypes.js.map +1 -1
- package/dist/src/services/windowsSandboxManager.d.ts +27 -0
- package/dist/src/services/windowsSandboxManager.js +148 -0
- package/dist/src/services/windowsSandboxManager.js.map +1 -0
- package/dist/src/services/windowsSandboxManager.test.d.ts +6 -0
- package/dist/src/services/windowsSandboxManager.test.js +59 -0
- package/dist/src/services/windowsSandboxManager.test.js.map +1 -0
- package/dist/src/services/worktreeService.d.ts +33 -0
- package/dist/src/services/worktreeService.js +174 -0
- package/dist/src/services/worktreeService.js.map +1 -0
- package/dist/src/services/worktreeService.test.d.ts +6 -0
- package/dist/src/services/worktreeService.test.js +200 -0
- package/dist/src/services/worktreeService.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +4 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +62 -40
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +1 -0
- package/dist/src/telemetry/types.js +3 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +8 -1
- 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 +8 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.d.ts +6 -1
- package/dist/src/tools/exit-plan-mode.js +17 -6
- package/dist/src/tools/exit-plan-mode.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.test.js +22 -1
- package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +22 -3
- package/dist/src/tools/mcp-client-manager.js +84 -32
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +76 -56
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +15 -6
- package/dist/src/tools/mcp-client.js +85 -71
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +195 -88
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +2 -1
- package/dist/src/tools/tool-registry.js +12 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +15 -0
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -1
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/trackerTools.js +6 -1
- package/dist/src/tools/trackerTools.js.map +1 -1
- package/dist/src/tools/trackerTools.test.js +9 -1
- package/dist/src/tools/trackerTools.test.js.map +1 -1
- package/dist/src/tools/write-todos.js +1 -0
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +4 -1
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/agent-sanitization-utils.d.ts +23 -0
- package/dist/src/utils/agent-sanitization-utils.js +123 -0
- package/dist/src/utils/agent-sanitization-utils.js.map +1 -0
- package/dist/src/utils/agent-sanitization-utils.test.d.ts +6 -0
- package/dist/src/utils/agent-sanitization-utils.test.js +83 -0
- package/dist/src/utils/agent-sanitization-utils.test.js.map +1 -0
- package/dist/src/utils/browserConsent.d.ts +17 -0
- package/dist/src/utils/browserConsent.js +78 -0
- package/dist/src/utils/browserConsent.js.map +1 -0
- package/dist/src/utils/browserConsent.test.d.ts +6 -0
- package/dist/src/utils/browserConsent.test.js +93 -0
- package/dist/src/utils/browserConsent.test.js.map +1 -0
- package/dist/src/utils/compatibility.d.ts +16 -0
- package/dist/src/utils/compatibility.js +58 -9
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +127 -29
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -2
- package/dist/src/utils/memoryDiscovery.js +5 -10
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +37 -37
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +5 -5
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/surface.js +4 -3
- package/dist/src/utils/surface.js.map +1 -1
- package/dist/src/utils/toolCallContext.d.ts +2 -0
- package/dist/src/utils/toolCallContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
|
@@ -4,10 +4,33 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
|
|
7
|
+
const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction, mockCompress, mockMaybeDiscoverMcpServer, mockStopMcp, } = vi.hoisted(() => ({
|
|
8
|
+
mockSendMessageStream: vi.fn().mockResolvedValue({
|
|
9
|
+
async *[Symbol.asyncIterator]() {
|
|
10
|
+
yield {
|
|
11
|
+
type: 'chunk',
|
|
12
|
+
value: { candidates: [] },
|
|
13
|
+
};
|
|
14
|
+
},
|
|
15
|
+
}),
|
|
16
|
+
mockScheduleAgentTools: vi.fn(),
|
|
17
|
+
mockSetSystemInstruction: vi.fn(),
|
|
18
|
+
mockCompress: vi.fn(),
|
|
19
|
+
mockMaybeDiscoverMcpServer: vi.fn().mockResolvedValue(undefined),
|
|
20
|
+
mockStopMcp: vi.fn().mockResolvedValue(undefined),
|
|
21
|
+
}));
|
|
22
|
+
vi.mock('../tools/mcp-client-manager.js', () => ({
|
|
23
|
+
McpClientManager: class {
|
|
24
|
+
maybeDiscoverMcpServer = mockMaybeDiscoverMcpServer;
|
|
25
|
+
stop = mockStopMcp;
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
7
28
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
8
29
|
import { LocalAgentExecutor } from './local-executor.js';
|
|
9
30
|
import { makeFakeConfig } from '../test-utils/config.js';
|
|
10
31
|
import { ToolRegistry } from '../tools/tool-registry.js';
|
|
32
|
+
import { PromptRegistry } from '../prompts/prompt-registry.js';
|
|
33
|
+
import { ResourceRegistry } from '../resources/resource-registry.js';
|
|
11
34
|
import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
|
|
12
35
|
import { LSTool } from '../tools/ls.js';
|
|
13
36
|
import { LS_TOOL_NAME, READ_FILE_TOOL_NAME } from '../tools/tool-names.js';
|
|
@@ -20,16 +43,12 @@ import { getErrorMessage } from '../utils/errors.js';
|
|
|
20
43
|
import { promptIdContext } from '../utils/promptIdContext.js';
|
|
21
44
|
import { logAgentStart, logAgentFinish, logRecoveryAttempt, } from '../telemetry/loggers.js';
|
|
22
45
|
import { LlmRole, AgentStartEvent, AgentFinishEvent, RecoveryAttemptEvent, } from '../telemetry/types.js';
|
|
23
|
-
import { AgentTerminateMode, } from './types.js';
|
|
46
|
+
import { AgentTerminateMode, SubagentActivityErrorType, } from './types.js';
|
|
47
|
+
import { ToolConfirmationOutcome, } from '../tools/tools.js';
|
|
48
|
+
import { CoreToolCallStatus, } from '../scheduler/types.js';
|
|
24
49
|
import { CompressionStatus } from '../core/turn.js';
|
|
25
50
|
import { ChatCompressionService } from '../services/chatCompressionService.js';
|
|
26
51
|
import { getModelConfigAlias } from './registry.js';
|
|
27
|
-
const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction, mockCompress, } = vi.hoisted(() => ({
|
|
28
|
-
mockSendMessageStream: vi.fn(),
|
|
29
|
-
mockScheduleAgentTools: vi.fn(),
|
|
30
|
-
mockSetSystemInstruction: vi.fn(),
|
|
31
|
-
mockCompress: vi.fn(),
|
|
32
|
-
}));
|
|
33
52
|
let mockChatHistory = [];
|
|
34
53
|
const mockSetHistory = vi.fn((newHistory) => {
|
|
35
54
|
mockChatHistory = newHistory;
|
|
@@ -233,6 +252,51 @@ describe('LocalAgentExecutor', () => {
|
|
|
233
252
|
vi.useRealTimers();
|
|
234
253
|
});
|
|
235
254
|
describe('create (Initialization and Validation)', () => {
|
|
255
|
+
it('should explicitly map execution context properties to prevent unintended propagation', async () => {
|
|
256
|
+
const definition = createTestDefinition([LS_TOOL_NAME]);
|
|
257
|
+
const mockGeminiClient = {};
|
|
258
|
+
const mockSandboxManager = {};
|
|
259
|
+
const extendedContext = {
|
|
260
|
+
config: mockConfig,
|
|
261
|
+
promptId: mockConfig.promptId,
|
|
262
|
+
toolRegistry: parentToolRegistry,
|
|
263
|
+
promptRegistry: mockConfig.promptRegistry,
|
|
264
|
+
resourceRegistry: mockConfig.resourceRegistry,
|
|
265
|
+
messageBus: mockConfig.messageBus,
|
|
266
|
+
geminiClient: mockGeminiClient,
|
|
267
|
+
sandboxManager: mockSandboxManager,
|
|
268
|
+
unintendedProperty: 'should not be here',
|
|
269
|
+
};
|
|
270
|
+
const executor = await LocalAgentExecutor.create(definition, extendedContext, onActivity);
|
|
271
|
+
mockModelResponse([
|
|
272
|
+
{
|
|
273
|
+
name: TASK_COMPLETE_TOOL_NAME,
|
|
274
|
+
args: { finalResult: 'done' },
|
|
275
|
+
id: 'call1',
|
|
276
|
+
},
|
|
277
|
+
]);
|
|
278
|
+
await executor.run({ goal: 'test' }, signal);
|
|
279
|
+
const chatConstructorArgs = MockedGeminiChat.mock.calls[0];
|
|
280
|
+
const executionContext = chatConstructorArgs[0];
|
|
281
|
+
expect(executionContext).toBeDefined();
|
|
282
|
+
expect(executionContext.config).toBe(extendedContext.config);
|
|
283
|
+
expect(executionContext.promptId).toBe(extendedContext.promptId);
|
|
284
|
+
expect(executionContext.geminiClient).toBe(extendedContext.geminiClient);
|
|
285
|
+
expect(executionContext.sandboxManager).toBe(extendedContext.sandboxManager);
|
|
286
|
+
const agentToolRegistry = executor['toolRegistry'];
|
|
287
|
+
const agentPromptRegistry = executor['promptRegistry'];
|
|
288
|
+
const agentResourceRegistry = executor['resourceRegistry'];
|
|
289
|
+
expect(executionContext.toolRegistry).toBe(agentToolRegistry);
|
|
290
|
+
expect(executionContext.promptRegistry).toBe(agentPromptRegistry);
|
|
291
|
+
expect(executionContext.resourceRegistry).toBe(agentResourceRegistry);
|
|
292
|
+
expect(executionContext.messageBus).toBe(agentToolRegistry.getMessageBus());
|
|
293
|
+
// Ensure the unintended property was not spread
|
|
294
|
+
expect(executionContext
|
|
295
|
+
.unintendedProperty).toBeUndefined();
|
|
296
|
+
// Ensure registries and message bus are not the parent's
|
|
297
|
+
expect(executionContext.toolRegistry).not.toBe(extendedContext.toolRegistry);
|
|
298
|
+
expect(executionContext.messageBus).not.toBe(extendedContext.messageBus);
|
|
299
|
+
});
|
|
236
300
|
it('should create successfully with allowed tools', async () => {
|
|
237
301
|
const definition = createTestDefinition([LS_TOOL_NAME]);
|
|
238
302
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
@@ -611,6 +675,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
611
675
|
data: expect.objectContaining({
|
|
612
676
|
context: 'protocol_violation',
|
|
613
677
|
error: expectedError,
|
|
678
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
614
679
|
}),
|
|
615
680
|
}));
|
|
616
681
|
});
|
|
@@ -642,6 +707,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
642
707
|
context: 'tool_call',
|
|
643
708
|
name: TASK_COMPLETE_TOOL_NAME,
|
|
644
709
|
error: expectedError,
|
|
710
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
645
711
|
}),
|
|
646
712
|
}));
|
|
647
713
|
const turn2Params = getMockMessageParams(1);
|
|
@@ -712,7 +778,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
712
778
|
resolveCalls();
|
|
713
779
|
await vi.advanceTimersByTimeAsync(100);
|
|
714
780
|
return {
|
|
715
|
-
status:
|
|
781
|
+
status: CoreToolCallStatus.Success,
|
|
716
782
|
request: reqInfo,
|
|
717
783
|
tool: {},
|
|
718
784
|
invocation: {},
|
|
@@ -730,7 +796,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
730
796
|
],
|
|
731
797
|
error: undefined,
|
|
732
798
|
errorType: undefined,
|
|
733
|
-
contentLength:
|
|
799
|
+
contentLength: 0,
|
|
734
800
|
},
|
|
735
801
|
};
|
|
736
802
|
}));
|
|
@@ -759,10 +825,10 @@ describe('LocalAgentExecutor', () => {
|
|
|
759
825
|
expect(parts).toHaveLength(2);
|
|
760
826
|
expect(parts).toEqual(expect.arrayContaining([
|
|
761
827
|
expect.objectContaining({
|
|
762
|
-
functionResponse: expect.objectContaining({
|
|
828
|
+
functionResponse: expect.objectContaining({ name: LS_TOOL_NAME }),
|
|
763
829
|
}),
|
|
764
830
|
expect.objectContaining({
|
|
765
|
-
functionResponse: expect.objectContaining({
|
|
831
|
+
functionResponse: expect.objectContaining({ name: LS_TOOL_NAME }),
|
|
766
832
|
}),
|
|
767
833
|
]));
|
|
768
834
|
});
|
|
@@ -814,6 +880,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
814
880
|
data: expect.objectContaining({
|
|
815
881
|
context: 'tool_call_unauthorized',
|
|
816
882
|
name: READ_FILE_TOOL_NAME,
|
|
883
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
817
884
|
}),
|
|
818
885
|
}));
|
|
819
886
|
});
|
|
@@ -848,6 +915,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
848
915
|
context: 'tool_call',
|
|
849
916
|
name: TASK_COMPLETE_TOOL_NAME,
|
|
850
917
|
error: expect.stringContaining('Output validation failed'),
|
|
918
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
851
919
|
}),
|
|
852
920
|
}));
|
|
853
921
|
// Check that the error was sent back to the model for the next turn
|
|
@@ -880,6 +948,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
880
948
|
type: 'ERROR',
|
|
881
949
|
data: expect.objectContaining({
|
|
882
950
|
error: `Error: Failed to create chat object: ${getErrorMessage(initError)}`,
|
|
951
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
883
952
|
}),
|
|
884
953
|
}));
|
|
885
954
|
// Ensure the agent run was logged as a failure
|
|
@@ -897,7 +966,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
897
966
|
]);
|
|
898
967
|
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
899
968
|
{
|
|
900
|
-
status:
|
|
969
|
+
status: CoreToolCallStatus.Error,
|
|
901
970
|
request: {
|
|
902
971
|
callId: 'call1',
|
|
903
972
|
name: LS_TOOL_NAME,
|
|
@@ -943,6 +1012,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
943
1012
|
context: 'tool_call',
|
|
944
1013
|
name: LS_TOOL_NAME,
|
|
945
1014
|
error: toolErrorMessage,
|
|
1015
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
946
1016
|
}),
|
|
947
1017
|
}));
|
|
948
1018
|
// Verify the error was sent back to the model
|
|
@@ -962,6 +1032,129 @@ describe('LocalAgentExecutor', () => {
|
|
|
962
1032
|
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
963
1033
|
expect(output.result).toBe('Aborted due to tool failure.');
|
|
964
1034
|
});
|
|
1035
|
+
it('should handle a soft tool rejection (outcome: Cancel) and provide direct instructions to the model', async () => {
|
|
1036
|
+
const definition = createTestDefinition([LS_TOOL_NAME]);
|
|
1037
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
1038
|
+
// Turn 1: Model calls a tool that will be rejected
|
|
1039
|
+
mockModelResponse([
|
|
1040
|
+
{ name: LS_TOOL_NAME, args: { path: '/secret' }, id: 'call1' },
|
|
1041
|
+
]);
|
|
1042
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
1043
|
+
{
|
|
1044
|
+
status: 'cancelled',
|
|
1045
|
+
request: {
|
|
1046
|
+
callId: 'call1',
|
|
1047
|
+
name: LS_TOOL_NAME,
|
|
1048
|
+
args: { path: '/secret' },
|
|
1049
|
+
isClientInitiated: false,
|
|
1050
|
+
prompt_id: 'test-prompt',
|
|
1051
|
+
},
|
|
1052
|
+
tool: {},
|
|
1053
|
+
invocation: {},
|
|
1054
|
+
outcome: ToolConfirmationOutcome.Cancel, // Soft rejection
|
|
1055
|
+
response: {
|
|
1056
|
+
callId: 'call1',
|
|
1057
|
+
resultDisplay: '',
|
|
1058
|
+
responseParts: [
|
|
1059
|
+
{
|
|
1060
|
+
functionResponse: {
|
|
1061
|
+
name: LS_TOOL_NAME,
|
|
1062
|
+
response: {
|
|
1063
|
+
error: '[Operation Cancelled] Reason: User denied execution.',
|
|
1064
|
+
},
|
|
1065
|
+
id: 'call1',
|
|
1066
|
+
},
|
|
1067
|
+
},
|
|
1068
|
+
],
|
|
1069
|
+
error: undefined,
|
|
1070
|
+
errorType: undefined,
|
|
1071
|
+
contentLength: 0,
|
|
1072
|
+
},
|
|
1073
|
+
},
|
|
1074
|
+
]);
|
|
1075
|
+
// Turn 2: Model sees the rejection + consolidated instructions and completes
|
|
1076
|
+
mockModelResponse([
|
|
1077
|
+
{
|
|
1078
|
+
name: TASK_COMPLETE_TOOL_NAME,
|
|
1079
|
+
args: { finalResult: 'User rejected access to /secret.' },
|
|
1080
|
+
id: 'call2',
|
|
1081
|
+
},
|
|
1082
|
+
]);
|
|
1083
|
+
const output = await executor.run({ goal: 'Soft rejection test' }, signal);
|
|
1084
|
+
// Verify the activity stream reported the consolidated instruction
|
|
1085
|
+
expect(activities).toContainEqual(expect.objectContaining({
|
|
1086
|
+
type: 'ERROR',
|
|
1087
|
+
data: expect.objectContaining({
|
|
1088
|
+
context: 'tool_call',
|
|
1089
|
+
name: LS_TOOL_NAME,
|
|
1090
|
+
error: expect.stringContaining('User rejected this operation'),
|
|
1091
|
+
errorType: SubagentActivityErrorType.REJECTED,
|
|
1092
|
+
}),
|
|
1093
|
+
}));
|
|
1094
|
+
// Verify the instruction was sent back to the model as the tool error
|
|
1095
|
+
const turn2Params = getMockMessageParams(1);
|
|
1096
|
+
const parts = turn2Params.message;
|
|
1097
|
+
const errorMsg = parts[0].functionResponse?.response?.['error'];
|
|
1098
|
+
expect(typeof errorMsg).toBe('string');
|
|
1099
|
+
if (typeof errorMsg === 'string') {
|
|
1100
|
+
expect(errorMsg).toContain('User rejected this operation');
|
|
1101
|
+
expect(errorMsg).toContain('acknowledge this, rethink your strategy');
|
|
1102
|
+
}
|
|
1103
|
+
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
1104
|
+
expect(output.result).toBe('User rejected access to /secret.');
|
|
1105
|
+
});
|
|
1106
|
+
it('should handle a hard tool abort (cancelled with no outcome) and terminate the agent', async () => {
|
|
1107
|
+
const definition = createTestDefinition([LS_TOOL_NAME]);
|
|
1108
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
1109
|
+
// Turn 1: Model calls a tool that will be aborted (e.g. Ctrl+C)
|
|
1110
|
+
mockModelResponse([
|
|
1111
|
+
{ name: LS_TOOL_NAME, args: { path: '/secret' }, id: 'call1' },
|
|
1112
|
+
]);
|
|
1113
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
1114
|
+
{
|
|
1115
|
+
status: 'cancelled',
|
|
1116
|
+
request: {
|
|
1117
|
+
callId: 'call1',
|
|
1118
|
+
name: LS_TOOL_NAME,
|
|
1119
|
+
args: { path: '/secret' },
|
|
1120
|
+
isClientInitiated: false,
|
|
1121
|
+
prompt_id: 'test-prompt',
|
|
1122
|
+
},
|
|
1123
|
+
tool: {},
|
|
1124
|
+
invocation: {},
|
|
1125
|
+
outcome: undefined, // Hard abort
|
|
1126
|
+
response: {
|
|
1127
|
+
callId: 'call1',
|
|
1128
|
+
resultDisplay: '',
|
|
1129
|
+
responseParts: [
|
|
1130
|
+
{
|
|
1131
|
+
functionResponse: {
|
|
1132
|
+
name: LS_TOOL_NAME,
|
|
1133
|
+
response: { error: 'Request cancelled.' },
|
|
1134
|
+
id: 'call1',
|
|
1135
|
+
},
|
|
1136
|
+
},
|
|
1137
|
+
],
|
|
1138
|
+
error: undefined,
|
|
1139
|
+
errorType: undefined,
|
|
1140
|
+
contentLength: 0,
|
|
1141
|
+
},
|
|
1142
|
+
},
|
|
1143
|
+
]);
|
|
1144
|
+
const output = await executor.run({ goal: 'Hard abort test' }, signal);
|
|
1145
|
+
// Verify the activity stream reported the cancellation
|
|
1146
|
+
expect(activities).toContainEqual(expect.objectContaining({
|
|
1147
|
+
type: 'ERROR',
|
|
1148
|
+
data: expect.objectContaining({
|
|
1149
|
+
context: 'tool_call',
|
|
1150
|
+
name: LS_TOOL_NAME,
|
|
1151
|
+
error: 'Request cancelled.',
|
|
1152
|
+
errorType: SubagentActivityErrorType.CANCELLED,
|
|
1153
|
+
}),
|
|
1154
|
+
}));
|
|
1155
|
+
// Agent should terminate with ABORTED status
|
|
1156
|
+
expect(output.terminate_reason).toBe(AgentTerminateMode.ABORTED);
|
|
1157
|
+
});
|
|
965
1158
|
});
|
|
966
1159
|
describe('Model Routing', () => {
|
|
967
1160
|
it('should use model routing when the agent model is "auto"', async () => {
|
|
@@ -1089,6 +1282,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1089
1282
|
data: expect.objectContaining({
|
|
1090
1283
|
context: 'timeout',
|
|
1091
1284
|
error: 'Agent timed out after 0.5 minutes.',
|
|
1285
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
1092
1286
|
}),
|
|
1093
1287
|
}));
|
|
1094
1288
|
// Verify telemetry
|
|
@@ -1226,6 +1420,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1226
1420
|
data: expect.objectContaining({
|
|
1227
1421
|
context: 'recovery_turn',
|
|
1228
1422
|
error: 'Graceful recovery attempt failed. Reason: stop',
|
|
1423
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
1229
1424
|
}),
|
|
1230
1425
|
}));
|
|
1231
1426
|
});
|
|
@@ -1273,6 +1468,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1273
1468
|
data: expect.objectContaining({
|
|
1274
1469
|
context: 'recovery_turn',
|
|
1275
1470
|
error: 'Graceful recovery attempt failed. Reason: stop',
|
|
1471
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
1276
1472
|
}),
|
|
1277
1473
|
}));
|
|
1278
1474
|
});
|
|
@@ -1350,6 +1546,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1350
1546
|
data: expect.objectContaining({
|
|
1351
1547
|
context: 'recovery_turn',
|
|
1352
1548
|
error: 'Graceful recovery attempt failed. Reason: stop',
|
|
1549
|
+
errorType: SubagentActivityErrorType.GENERIC,
|
|
1353
1550
|
}),
|
|
1354
1551
|
}));
|
|
1355
1552
|
});
|
|
@@ -1876,6 +2073,40 @@ describe('LocalAgentExecutor', () => {
|
|
|
1876
2073
|
expect(mockSetHistory).toHaveBeenCalledWith(compressedHistory);
|
|
1877
2074
|
});
|
|
1878
2075
|
});
|
|
2076
|
+
describe('MCP Isolation', () => {
|
|
2077
|
+
it('should initialize McpClientManager when mcpServers are defined', async () => {
|
|
2078
|
+
const { MCPServerConfig } = await import('../config/config.js');
|
|
2079
|
+
const mcpServers = {
|
|
2080
|
+
'test-server': new MCPServerConfig('node', ['server.js']),
|
|
2081
|
+
};
|
|
2082
|
+
const definition = {
|
|
2083
|
+
...createTestDefinition(),
|
|
2084
|
+
mcpServers,
|
|
2085
|
+
};
|
|
2086
|
+
vi.spyOn(mockConfig, 'getMcpClientManager').mockReturnValue({
|
|
2087
|
+
maybeDiscoverMcpServer: mockMaybeDiscoverMcpServer,
|
|
2088
|
+
});
|
|
2089
|
+
await LocalAgentExecutor.create(definition, mockConfig);
|
|
2090
|
+
const mcpManager = mockConfig.getMcpClientManager();
|
|
2091
|
+
expect(mcpManager?.maybeDiscoverMcpServer).toHaveBeenCalledWith('test-server', mcpServers['test-server'], expect.objectContaining({
|
|
2092
|
+
toolRegistry: expect.any(ToolRegistry),
|
|
2093
|
+
promptRegistry: expect.any(PromptRegistry),
|
|
2094
|
+
resourceRegistry: expect.any(ResourceRegistry),
|
|
2095
|
+
}));
|
|
2096
|
+
});
|
|
2097
|
+
it('should inherit main registry tools', async () => {
|
|
2098
|
+
const parentMcpTool = new DiscoveredMCPTool({}, 'main-server', 'tool1', 'desc1', {}, mockConfig.getMessageBus());
|
|
2099
|
+
parentToolRegistry.registerTool(parentMcpTool);
|
|
2100
|
+
const definition = createTestDefinition();
|
|
2101
|
+
definition.toolConfig = undefined; // trigger inheritance
|
|
2102
|
+
vi.spyOn(mockConfig, 'getMcpClientManager').mockReturnValue({
|
|
2103
|
+
maybeDiscoverMcpServer: vi.fn(),
|
|
2104
|
+
});
|
|
2105
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
2106
|
+
const agentTools = executor.toolRegistry.getAllToolNames();
|
|
2107
|
+
expect(agentTools).toContain(parentMcpTool.name);
|
|
2108
|
+
});
|
|
2109
|
+
});
|
|
1879
2110
|
describe('DeclarativeTool instance tools (browser agent pattern)', () => {
|
|
1880
2111
|
/**
|
|
1881
2112
|
* The browser agent passes DeclarativeTool instances (not string names) in
|
|
@@ -2133,6 +2364,68 @@ describe('LocalAgentExecutor', () => {
|
|
|
2133
2364
|
const uniqueNames = new Set(names);
|
|
2134
2365
|
expect(uniqueNames.size).toBe(names.length);
|
|
2135
2366
|
});
|
|
2367
|
+
describe('Memory Injection', () => {
|
|
2368
|
+
it('should inject system instruction memory into system prompt', async () => {
|
|
2369
|
+
const definition = createTestDefinition();
|
|
2370
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
2371
|
+
const mockMemory = 'Global memory constraint';
|
|
2372
|
+
vi.spyOn(mockConfig, 'getSystemInstructionMemory').mockReturnValue(mockMemory);
|
|
2373
|
+
mockModelResponse([
|
|
2374
|
+
{
|
|
2375
|
+
name: TASK_COMPLETE_TOOL_NAME,
|
|
2376
|
+
args: { finalResult: 'done' },
|
|
2377
|
+
id: 'call1',
|
|
2378
|
+
},
|
|
2379
|
+
]);
|
|
2380
|
+
await executor.run({ goal: 'test' }, signal);
|
|
2381
|
+
const chatConstructorArgs = MockedGeminiChat.mock.calls[0];
|
|
2382
|
+
const systemInstruction = chatConstructorArgs[1];
|
|
2383
|
+
expect(systemInstruction).toContain(mockMemory);
|
|
2384
|
+
expect(systemInstruction).toContain('<loaded_context>');
|
|
2385
|
+
});
|
|
2386
|
+
it('should inject environment memory into the first message when JIT is disabled', async () => {
|
|
2387
|
+
const definition = createTestDefinition();
|
|
2388
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
2389
|
+
const mockMemory = 'Project memory rule';
|
|
2390
|
+
vi.spyOn(mockConfig, 'getEnvironmentMemory').mockReturnValue(mockMemory);
|
|
2391
|
+
vi.spyOn(mockConfig, 'isJitContextEnabled').mockReturnValue(false);
|
|
2392
|
+
mockModelResponse([
|
|
2393
|
+
{
|
|
2394
|
+
name: TASK_COMPLETE_TOOL_NAME,
|
|
2395
|
+
args: { finalResult: 'done' },
|
|
2396
|
+
id: 'call1',
|
|
2397
|
+
},
|
|
2398
|
+
]);
|
|
2399
|
+
await executor.run({ goal: 'test' }, signal);
|
|
2400
|
+
const { message } = getMockMessageParams(0);
|
|
2401
|
+
const parts = message;
|
|
2402
|
+
expect(parts).toBeDefined();
|
|
2403
|
+
const memoryPart = parts.find((p) => p.text?.includes(mockMemory));
|
|
2404
|
+
expect(memoryPart).toBeDefined();
|
|
2405
|
+
expect(memoryPart?.text).toBe(mockMemory);
|
|
2406
|
+
});
|
|
2407
|
+
it('should inject session memory into the first message when JIT is enabled', async () => {
|
|
2408
|
+
const definition = createTestDefinition();
|
|
2409
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
2410
|
+
const mockMemory = '<loaded_context>\nExtension memory rule\n</loaded_context>';
|
|
2411
|
+
vi.spyOn(mockConfig, 'getSessionMemory').mockReturnValue(mockMemory);
|
|
2412
|
+
vi.spyOn(mockConfig, 'isJitContextEnabled').mockReturnValue(true);
|
|
2413
|
+
mockModelResponse([
|
|
2414
|
+
{
|
|
2415
|
+
name: TASK_COMPLETE_TOOL_NAME,
|
|
2416
|
+
args: { finalResult: 'done' },
|
|
2417
|
+
id: 'call1',
|
|
2418
|
+
},
|
|
2419
|
+
]);
|
|
2420
|
+
await executor.run({ goal: 'test' }, signal);
|
|
2421
|
+
const { message } = getMockMessageParams(0);
|
|
2422
|
+
const parts = message;
|
|
2423
|
+
expect(parts).toBeDefined();
|
|
2424
|
+
const memoryPart = parts.find((p) => p.text?.includes('Extension memory rule'));
|
|
2425
|
+
expect(memoryPart).toBeDefined();
|
|
2426
|
+
expect(memoryPart?.text).toContain(mockMemory);
|
|
2427
|
+
});
|
|
2428
|
+
});
|
|
2136
2429
|
});
|
|
2137
2430
|
});
|
|
2138
2431
|
//# sourceMappingURL=local-executor.test.js.map
|