@machina.ai/cell-cli-core 1.36.0-rc1 → 1.38.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 +3 -10
- package/dist/docs/assets/theme-tokyonight-dark.png +0 -0
- package/dist/docs/changelogs/index.md +49 -0
- package/dist/docs/changelogs/latest.md +355 -458
- package/dist/docs/changelogs/preview.md +402 -363
- package/dist/docs/cli/acp-mode.md +126 -0
- package/dist/docs/cli/cli-reference.md +1 -1
- package/dist/docs/cli/notifications.md +5 -5
- package/dist/docs/cli/plan-mode.md +26 -10
- package/dist/docs/cli/sandbox.md +53 -1
- package/dist/docs/cli/settings.md +52 -48
- package/dist/docs/cli/themes.md +5 -0
- package/dist/docs/core/index.md +2 -2
- package/dist/docs/core/remote-agents.md +14 -18
- package/dist/docs/core/subagents.md +194 -47
- package/dist/docs/get-started/authentication.md +2 -2
- package/dist/docs/get-started/gemini-3.md +1 -1
- package/dist/docs/get-started/index.md +127 -1
- package/dist/docs/get-started/installation.md +7 -0
- package/dist/docs/hooks/index.md +6 -6
- package/dist/docs/ide-integration/index.md +99 -24
- package/dist/docs/index.md +0 -2
- package/dist/docs/redirects.json +1 -0
- package/dist/docs/reference/commands.md +1 -3
- package/dist/docs/reference/configuration.md +220 -99
- package/dist/docs/reference/keyboard-shortcuts.md +21 -8
- package/dist/docs/reference/policy-engine.md +36 -31
- package/dist/docs/reference/tools.md +56 -23
- package/dist/docs/release-confidence.md +0 -6
- package/dist/docs/releases.md +4 -0
- package/dist/docs/resources/quota-and-pricing.md +23 -9
- package/dist/docs/sidebar.json +11 -4
- package/dist/docs/tools/mcp-server.md +3 -3
- package/dist/docs/tools/planning.md +6 -4
- package/dist/docs/tools/web-fetch.md +3 -0
- package/dist/package.json +2 -1
- package/dist/src/agent/agent-session.test.js +14 -6
- package/dist/src/agent/agent-session.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +2 -1
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +1 -0
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.d.ts +47 -4
- package/dist/src/agent/legacy-agent-session.js +38 -15
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +60 -73
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/mock.js +7 -1
- package/dist/src/agent/mock.js.map +1 -1
- package/dist/src/agent/mock.test.js +1 -1
- package/dist/src/agent/mock.test.js.map +1 -1
- package/dist/src/agent/types.d.ts +34 -1
- package/dist/src/agents/a2a-client-manager.js +3 -3
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/agent-scheduler.js +6 -1
- package/dist/src/agents/agent-scheduler.js.map +1 -1
- package/dist/src/agents/agent-scheduler.test.js +38 -0
- package/dist/src/agents/agent-scheduler.test.js.map +1 -1
- package/dist/src/agents/agentLoader.d.ts +12 -12
- package/dist/src/agents/agentLoader.js +1 -0
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/auth-provider/api-key-provider.test.js +18 -2
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -1
- package/dist/src/agents/auth-provider/value-resolver.test.js +30 -0
- package/dist/src/agents/auth-provider/value-resolver.test.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js +36 -6
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.test.js +35 -3
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
- package/dist/src/agents/browser/automationOverlay.js +2 -10
- package/dist/src/agents/browser/automationOverlay.js.map +1 -1
- package/dist/src/agents/browser/browserAgentDefinition.js +10 -3
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.d.ts +11 -3
- package/dist/src/agents/browser/browserAgentFactory.js +171 -129
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.test.js +99 -13
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +87 -27
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +107 -7
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/browserManager.d.ts +89 -8
- package/dist/src/agents/browser/browserManager.js +357 -74
- package/dist/src/agents/browser/browserManager.js.map +1 -1
- package/dist/src/agents/browser/browserManager.test.js +540 -19
- package/dist/src/agents/browser/browserManager.test.js.map +1 -1
- package/dist/src/agents/browser/inputBlocker.d.ts +4 -4
- package/dist/src/agents/browser/inputBlocker.js +8 -18
- package/dist/src/agents/browser/inputBlocker.js.map +1 -1
- package/dist/src/agents/browser/inputBlocker.test.js +31 -3
- package/dist/src/agents/browser/inputBlocker.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.js +9 -6
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.test.js +2 -2
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
- package/dist/src/agents/browser/modelAvailability.d.ts +5 -0
- package/dist/src/agents/browser/modelAvailability.js +12 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -1
- package/dist/src/agents/browser/snapshotSuperseder.d.ts +31 -0
- package/dist/src/agents/browser/snapshotSuperseder.js +101 -0
- package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -0
- package/dist/src/agents/browser/snapshotSuperseder.test.js +158 -0
- package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -0
- package/dist/src/agents/local-executor.d.ts +9 -0
- package/dist/src/agents/local-executor.js +144 -200
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +500 -115
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +1 -0
- package/dist/src/agents/local-invocation.js +19 -9
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +24 -0
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.js +1 -0
- package/dist/src/agents/memory-manager-agent.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.test.js +6 -0
- package/dist/src/agents/memory-manager-agent.test.js.map +1 -1
- package/dist/src/agents/registry.js +19 -11
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +67 -0
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.d.ts +24 -0
- package/dist/src/agents/skill-extraction-agent.js +269 -0
- package/dist/src/agents/skill-extraction-agent.js.map +1 -0
- package/dist/src/agents/types.d.ts +20 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/policyCatalog.d.ts +2 -1
- package/dist/src/availability/policyCatalog.js +1 -1
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +43 -32
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +12 -1
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +1 -1
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/experiments/flagNames.d.ts +1 -0
- package/dist/src/code_assist/experiments/flagNames.js +1 -0
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +8 -3
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +57 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +5 -2
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +27 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +80 -80
- package/dist/src/commands/memory.js +1 -1
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/config/agent-loop-context.d.ts +2 -0
- package/dist/src/config/config.d.ts +91 -23
- package/dist/src/config/config.js +238 -79
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +189 -15
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +9 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/extensions/integrity.js +1 -1
- package/dist/src/config/extensions/integrity.js.map +1 -1
- package/dist/src/config/memory.d.ts +1 -0
- package/dist/src/config/memory.js +6 -0
- package/dist/src/config/memory.js.map +1 -1
- package/dist/src/config/projectRegistry.js +5 -3
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/scoped-config.d.ts +30 -0
- package/dist/src/config/scoped-config.js +69 -0
- package/dist/src/config/scoped-config.js.map +1 -0
- package/dist/src/config/scoped-config.test.d.ts +6 -0
- package/dist/src/config/scoped-config.test.js +161 -0
- package/dist/src/config/scoped-config.test.js.map +1 -0
- package/dist/src/config/storage.d.ts +3 -0
- package/dist/src/config/storage.js +9 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +10 -5
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/config/topicState.d.ts +21 -0
- package/dist/src/config/topicState.js +41 -0
- package/dist/src/config/topicState.js.map +1 -0
- package/dist/src/confirmation-bus/types.d.ts +13 -4
- package/dist/src/confirmation-bus/types.js +2 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/context/agentHistoryProvider.d.ts +45 -0
- package/dist/src/context/agentHistoryProvider.js +294 -0
- package/dist/src/context/agentHistoryProvider.js.map +1 -0
- package/dist/src/context/agentHistoryProvider.test.d.ts +6 -0
- package/dist/src/context/agentHistoryProvider.test.js +357 -0
- package/dist/src/context/agentHistoryProvider.test.js.map +1 -0
- package/dist/src/context/chatCompressionService.js.map +1 -0
- package/dist/src/context/chatCompressionService.test.js.map +1 -0
- package/dist/src/context/contextCompressionService.d.ts +30 -0
- package/dist/src/context/contextCompressionService.js +405 -0
- package/dist/src/context/contextCompressionService.js.map +1 -0
- package/dist/src/context/contextCompressionService.test.js +253 -0
- package/dist/src/context/contextCompressionService.test.js.map +1 -0
- package/dist/src/{services/contextManager.d.ts → context/memoryContextManager.d.ts} +3 -1
- package/dist/src/{services/contextManager.js → context/memoryContextManager.js} +20 -11
- package/dist/src/context/memoryContextManager.js.map +1 -0
- package/dist/src/{services/contextManager.test.js → context/memoryContextManager.test.js} +42 -33
- package/dist/src/context/memoryContextManager.test.js.map +1 -0
- package/dist/src/context/profiles.d.ts +7 -0
- package/dist/src/context/profiles.js +21 -0
- package/dist/src/context/profiles.js.map +1 -0
- package/dist/src/context/toolDistillationService.d.ts +38 -0
- package/dist/src/context/toolDistillationService.js +170 -0
- package/dist/src/context/toolDistillationService.js.map +1 -0
- package/dist/src/context/toolDistillationService.test.d.ts +6 -0
- package/dist/src/context/toolDistillationService.test.js +86 -0
- package/dist/src/context/toolDistillationService.test.js.map +1 -0
- package/dist/src/{services → context}/toolOutputMaskingService.d.ts +2 -2
- package/dist/src/{services → context}/toolOutputMaskingService.js +7 -7
- package/dist/src/context/toolOutputMaskingService.js.map +1 -0
- package/dist/src/context/toolOutputMaskingService.test.d.ts +6 -0
- package/dist/src/{services → context}/toolOutputMaskingService.test.js +4 -5
- package/dist/src/context/toolOutputMaskingService.test.js.map +1 -0
- package/dist/src/context/truncation.d.ts +26 -0
- package/dist/src/context/truncation.js +102 -0
- package/dist/src/context/truncation.js.map +1 -0
- package/dist/src/context/types.d.ts +36 -0
- package/dist/src/context/types.js +7 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/core/AuthenticatedContentGenerator.js +9 -1
- package/dist/src/core/AuthenticatedContentGenerator.js.map +1 -1
- package/dist/src/core/baseLlmClient.js +1 -1
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +1 -0
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +3 -1
- package/dist/src/core/client.js +24 -14
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +36 -40
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +0 -1
- package/dist/src/core/contentGenerator.js +2 -28
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +1 -101
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +12 -5
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +72 -18
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +1 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/logger.js +4 -4
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +1 -1
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/prompts-substitution.test.js +5 -0
- package/dist/src/core/prompts-substitution.test.js.map +1 -1
- package/dist/src/core/prompts.test.js +3 -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/hooks/hookEventHandler.js +8 -0
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookRunner.js +9 -5
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +20 -3
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +2 -0
- package/dist/src/hooks/hookSystem.js +1 -0
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +20 -13
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/hookTranslator.test.js +36 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -1
- package/dist/src/hooks/types.d.ts +2 -0
- package/dist/src/ide/ide-client.js +3 -3
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +1 -1
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.js +3 -3
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/index.d.ts +10 -3
- package/dist/src/index.js +13 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/mcpLauncher.js +1 -1
- package/dist/src/output/json-formatter.js +2 -1
- package/dist/src/output/json-formatter.js.map +1 -1
- package/dist/src/policy/config.d.ts +1 -1
- package/dist/src/policy/config.js +61 -24
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +21 -20
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/persistence.test.js +42 -0
- package/dist/src/policy/persistence.test.js.map +1 -1
- package/dist/src/policy/policies/discovered.toml +7 -0
- package/dist/src/policy/policies/memory-manager.toml +11 -1
- package/dist/src/policy/policies/non-interactive.toml +7 -0
- package/dist/src/policy/policies/plan.toml +36 -2
- package/dist/src/policy/policies/read-only.toml +12 -0
- package/dist/src/policy/policies/sandbox-default.toml +4 -4
- package/dist/src/policy/policies/write.toml +21 -0
- package/dist/src/policy/policies/yolo.toml +1 -1
- package/dist/src/policy/policy-engine.d.ts +2 -4
- package/dist/src/policy/policy-engine.js +47 -37
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +236 -30
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.d.ts +26 -1
- package/dist/src/policy/sandboxPolicyManager.js +41 -12
- package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.test.d.ts +6 -0
- package/dist/src/policy/sandboxPolicyManager.test.js +61 -0
- package/dist/src/policy/sandboxPolicyManager.test.js.map +1 -0
- package/dist/src/policy/topic-policy.test.d.ts +6 -0
- package/dist/src/policy/topic-policy.test.js +48 -0
- package/dist/src/policy/topic-policy.test.js.map +1 -0
- package/dist/src/policy/types.d.ts +9 -6
- package/dist/src/policy/types.js +11 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/policy/workspace-policy.test.js +18 -15
- package/dist/src/policy/workspace-policy.test.js.map +1 -1
- package/dist/src/prompts/promptProvider.js +20 -4
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +84 -1
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory-manager.test.js +1 -1
- package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -1
- package/dist/src/prompts/snippets.d.ts +3 -4
- package/dist/src/prompts/snippets.js +37 -52
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +6 -4
- package/dist/src/prompts/snippets.legacy.js +36 -7
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/prompts/utils.test.js +7 -5
- package/dist/src/prompts/utils.test.js.map +1 -1
- package/dist/src/safety/built-in.js +1 -1
- package/dist/src/safety/built-in.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +11 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.js +131 -41
- package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +82 -139
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +24 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js +200 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.d.ts +6 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +247 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +10 -22
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +67 -59
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +168 -103
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/macos/baseProfile.d.ts +1 -1
- package/dist/src/sandbox/macos/baseProfile.js +26 -8
- package/dist/src/sandbox/macos/baseProfile.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +10 -10
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +81 -93
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +136 -99
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/{macos → utils}/commandSafety.d.ts +11 -0
- package/dist/src/sandbox/{macos → utils}/commandSafety.js +47 -14
- package/dist/src/sandbox/utils/commandSafety.js.map +1 -0
- package/dist/src/sandbox/utils/commandUtils.d.ts +9 -0
- package/dist/src/sandbox/utils/commandUtils.js +57 -0
- package/dist/src/sandbox/utils/commandUtils.js.map +1 -0
- package/dist/src/sandbox/utils/fsUtils.d.ts +11 -0
- package/dist/src/sandbox/utils/fsUtils.js +84 -0
- package/dist/src/sandbox/utils/fsUtils.js.map +1 -0
- package/dist/src/sandbox/utils/fsUtils.test.d.ts +6 -0
- package/dist/src/sandbox/utils/fsUtils.test.js +43 -0
- package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -0
- package/dist/src/sandbox/utils/proactivePermissions.d.ts +19 -0
- package/dist/src/sandbox/utils/proactivePermissions.js +163 -0
- package/dist/src/sandbox/utils/proactivePermissions.js.map +1 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.d.ts +6 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.js +145 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.d.ts +27 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.js +142 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.d.ts +6 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.js +188 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.d.ts +5 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.js +64 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.js.map +1 -0
- package/dist/src/sandbox/windows/GeminiSandbox.cs +312 -223
- package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +16 -2
- package/dist/src/sandbox/windows/WindowsSandboxManager.js +261 -44
- package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +379 -17
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/windows/commandSafety.d.ts +19 -0
- package/dist/src/sandbox/windows/commandSafety.js +128 -0
- package/dist/src/sandbox/windows/commandSafety.js.map +1 -0
- package/dist/src/sandbox/windows/commandSafety.test.d.ts +6 -0
- package/dist/src/sandbox/windows/commandSafety.test.js +42 -0
- package/dist/src/sandbox/windows/commandSafety.test.js.map +1 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.d.ts +13 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js +69 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js.map +1 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.d.ts +6 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js +68 -0
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js.map +1 -0
- package/dist/src/scheduler/policy.js +20 -5
- package/dist/src/scheduler/policy.js.map +1 -1
- package/dist/src/scheduler/policy.test.js +80 -0
- package/dist/src/scheduler/policy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.js +13 -3
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +52 -0
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
- package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
- package/dist/src/scheduler/state-manager.js +1 -1
- package/dist/src/scheduler/state-manager.js.map +1 -1
- package/dist/src/scheduler/state-manager.test.js +10 -0
- package/dist/src/scheduler/state-manager.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +7 -2
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +38 -0
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/scheduler/types.d.ts +4 -2
- package/dist/src/services/chatRecordingService.d.ts +1 -13
- package/dist/src/services/chatRecordingService.js +45 -46
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +79 -10
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/executionLifecycleService.d.ts +44 -6
- package/dist/src/services/executionLifecycleService.js +52 -12
- package/dist/src/services/executionLifecycleService.js.map +1 -1
- package/dist/src/services/executionLifecycleService.test.js +157 -3
- package/dist/src/services/executionLifecycleService.test.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.d.ts +17 -2
- package/dist/src/services/fileDiscoveryService.js +84 -20
- package/dist/src/services/fileDiscoveryService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.test.js +67 -1
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.js +1 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/memoryService.d.ts +65 -0
- package/dist/src/services/memoryService.js +511 -0
- package/dist/src/services/memoryService.js.map +1 -0
- package/dist/src/services/memoryService.test.d.ts +6 -0
- package/dist/src/services/memoryService.test.js +563 -0
- package/dist/src/services/memoryService.test.js.map +1 -0
- package/dist/src/services/modelConfigService.d.ts +11 -0
- package/dist/src/services/modelConfigService.js +67 -0
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +30 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/sandboxManager.d.ts +107 -8
- package/dist/src/services/sandboxManager.integration.test.d.ts +1 -0
- package/dist/src/services/sandboxManager.integration.test.js +445 -0
- package/dist/src/services/sandboxManager.integration.test.js.map +1 -0
- package/dist/src/services/sandboxManager.js +176 -13
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +401 -117
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxManagerFactory.d.ts +2 -3
- package/dist/src/services/sandboxManagerFactory.js +12 -22
- package/dist/src/services/sandboxManagerFactory.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.d.ts +1 -0
- package/dist/src/services/sandboxedFileSystemService.js +43 -3
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.test.js +97 -11
- package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +18 -1
- package/dist/src/services/shellExecutionService.js +115 -26
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +70 -8
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +4 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +4 -0
- package/dist/src/services/worktreeService.test.js +7 -7
- package/dist/src/services/worktreeService.test.js.map +1 -1
- package/dist/src/skills/skillLoader.d.ts +8 -0
- package/dist/src/skills/skillLoader.js +1 -1
- package/dist/src/skills/skillLoader.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +29 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +107 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +172 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +10 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +22 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +22 -0
- package/dist/src/telemetry/loggers.js +41 -2
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +8 -3
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +118 -1
- package/dist/src/telemetry/metrics.js +196 -4
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +298 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +3 -3
- package/dist/src/telemetry/types.js +9 -4
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +1 -1
- package/dist/src/test-utils/mock-message-bus.js +1 -1
- package/dist/src/test-utils/mock-message-bus.js.map +1 -1
- package/dist/src/tools/complete-task.d.ts +29 -0
- package/dist/src/tools/complete-task.js +123 -0
- package/dist/src/tools/complete-task.js.map +1 -0
- package/dist/src/tools/complete-task.test.d.ts +6 -0
- package/dist/src/tools/complete-task.test.js +114 -0
- package/dist/src/tools/complete-task.test.js.map +1 -0
- package/dist/src/tools/definitions/base-declarations.d.ts +8 -0
- package/dist/src/tools/definitions/base-declarations.js +10 -0
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +2 -1
- package/dist/src/tools/definitions/coreTools.js +9 -3
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/dynamic-declaration-helpers.d.ts +4 -0
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js +33 -2
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +14 -9
- 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 +13 -7
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/definitions/trackerTools.js +3 -3
- package/dist/src/tools/definitions/trackerTools.js.map +1 -1
- package/dist/src/tools/definitions/types.d.ts +1 -0
- package/dist/src/tools/enter-plan-mode.js +15 -0
- package/dist/src/tools/enter-plan-mode.js.map +1 -1
- package/dist/src/tools/enter-plan-mode.test.js +25 -0
- package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
- package/dist/src/tools/grep-utils.d.ts +2 -1
- package/dist/src/tools/grep-utils.js +22 -3
- package/dist/src/tools/grep-utils.js.map +1 -1
- package/dist/src/tools/grep.js +16 -3
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +36 -8
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/jit-context.js +3 -3
- package/dist/src/tools/jit-context.js.map +1 -1
- package/dist/src/tools/jit-context.test.js +15 -13
- package/dist/src/tools/jit-context.test.js.map +1 -1
- package/dist/src/tools/ls.js +6 -4
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +22 -7
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +6 -3
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +35 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +1 -1
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +1 -1
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +9 -2
- package/dist/src/tools/memoryTool.js +39 -15
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +61 -2
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +12 -4
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +17 -17
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.js +14 -1
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +10 -10
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +17 -4
- package/dist/src/tools/shell.js +342 -151
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +204 -11
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.d.ts +38 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.d.ts +6 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.js +86 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -0
- package/dist/src/tools/shellBackgroundTools.js +186 -0
- package/dist/src/tools/shellBackgroundTools.js.map +1 -0
- package/dist/src/tools/shellBackgroundTools.test.d.ts +6 -0
- package/dist/src/tools/shellBackgroundTools.test.js +230 -0
- package/dist/src/tools/shellBackgroundTools.test.js.map +1 -0
- package/dist/src/tools/shell_proactive.test.d.ts +6 -0
- package/dist/src/tools/shell_proactive.test.js +122 -0
- package/dist/src/tools/shell_proactive.test.js.map +1 -0
- package/dist/src/tools/tool-names.d.ts +4 -4
- package/dist/src/tools/tool-names.js +6 -3
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.js +11 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +43 -1
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +12 -1
- package/dist/src/tools/tools.js +16 -1
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +42 -1
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/topicTool.d.ts +29 -0
- package/dist/src/tools/topicTool.js +72 -0
- package/dist/src/tools/topicTool.js.map +1 -0
- package/dist/src/tools/topicTool.test.d.ts +6 -0
- package/dist/src/tools/topicTool.test.js +105 -0
- package/dist/src/tools/topicTool.test.js.map +1 -0
- package/dist/src/tools/web-fetch.js +40 -22
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +28 -0
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.js +3 -6
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/checkpointUtils.d.ts +4 -4
- package/dist/src/utils/checkpointUtils.js +11 -8
- package/dist/src/utils/checkpointUtils.js.map +1 -1
- package/dist/src/utils/compatibility.js +0 -7
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +0 -9
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/editor.js +3 -0
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/errorParsing.js +2 -2
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +28 -6
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +23 -0
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +12 -0
- package/dist/src/utils/events.js +7 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +1 -0
- package/dist/src/utils/fetch.js +22 -6
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fetch.test.js +26 -1
- package/dist/src/utils/fetch.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +1 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/crawler.js +1 -1
- package/dist/src/utils/filesearch/crawler.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +7 -2
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/getFolderStructure.js +1 -1
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/getPty.js +2 -2
- package/dist/src/utils/getPty.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.d.ts +2 -2
- package/dist/src/utils/gitIgnoreParser.js +30 -52
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +51 -185
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/gitUtils.js +2 -2
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/googleErrors.js +5 -5
- package/dist/src/utils/googleErrors.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.d.ts +2 -2
- package/dist/src/utils/ignoreFileParser.js +7 -18
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.test.js +40 -132
- package/dist/src/utils/ignoreFileParser.test.js.map +1 -1
- package/dist/src/utils/ignorePathUtils.d.ts +11 -0
- package/dist/src/utils/ignorePathUtils.js +39 -0
- package/dist/src/utils/ignorePathUtils.js.map +1 -0
- package/dist/src/utils/ignorePathUtils.test.d.ts +6 -0
- package/dist/src/utils/ignorePathUtils.test.js +70 -0
- package/dist/src/utils/ignorePathUtils.test.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +6 -4
- package/dist/src/utils/memoryDiscovery.js +69 -48
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +40 -0
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.d.ts +1 -1
- package/dist/src/utils/memoryImportProcessor.js +24 -15
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/paths.d.ts +8 -0
- package/dist/src/utils/paths.js +37 -6
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +61 -3
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/process-utils.js +2 -2
- package/dist/src/utils/process-utils.js.map +1 -1
- package/dist/src/utils/retry.js +7 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +41 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +1 -1
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/sessionOperations.d.ts +19 -0
- package/dist/src/utils/sessionOperations.js +101 -0
- package/dist/src/utils/sessionOperations.js.map +1 -0
- package/dist/src/utils/sessionOperations.test.d.ts +6 -0
- package/dist/src/utils/sessionOperations.test.js +92 -0
- package/dist/src/utils/sessionOperations.test.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +24 -0
- package/dist/src/utils/shell-utils.integration.test.js +1 -1
- package/dist/src/utils/shell-utils.integration.test.js.map +1 -1
- package/dist/src/utils/shell-utils.js +86 -6
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +13 -1
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/terminalSerializer.d.ts +1 -0
- package/dist/src/utils/terminalSerializer.js +31 -8
- package/dist/src/utils/terminalSerializer.js.map +1 -1
- package/dist/src/utils/terminalSerializer.test.js +3 -2
- package/dist/src/utils/terminalSerializer.test.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +8 -0
- package/dist/src/utils/textUtils.js +16 -0
- package/dist/src/utils/textUtils.js.map +1 -1
- package/dist/src/utils/tokenCalculation.d.ts +2 -0
- package/dist/src/utils/tokenCalculation.js +2 -2
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/workspaceContext.js +2 -2
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/dist/docs/CONTRIBUTING.md +0 -566
- package/dist/docs/get-started/examples.md +0 -141
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +0 -164
- package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +0 -1
- package/dist/src/sandbox/macos/commandSafety.js.map +0 -1
- package/dist/src/services/chatCompressionService.js.map +0 -1
- package/dist/src/services/chatCompressionService.test.js.map +0 -1
- package/dist/src/services/contextManager.js.map +0 -1
- package/dist/src/services/contextManager.test.js.map +0 -1
- package/dist/src/services/toolOutputMaskingService.js.map +0 -1
- package/dist/src/services/toolOutputMaskingService.test.js.map +0 -1
- /package/dist/src/{services/toolOutputMaskingService.test.d.ts → agents/browser/snapshotSuperseder.test.d.ts} +0 -0
- /package/dist/src/{services → context}/chatCompressionService.d.ts +0 -0
- /package/dist/src/{services → context}/chatCompressionService.js +0 -0
- /package/dist/src/{services → context}/chatCompressionService.test.d.ts +0 -0
- /package/dist/src/{services → context}/chatCompressionService.test.js +0 -0
- /package/dist/src/{sandbox/macos/MacOsSandboxManager.integration.test.d.ts → context/contextCompressionService.test.d.ts} +0 -0
- /package/dist/src/{services/contextManager.test.d.ts → context/memoryContextManager.test.d.ts} +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
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(() => ({
|
|
7
|
+
const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction, mockRecordCompletedToolCalls, mockSaveSummary, mockCompress, mockMaybeDiscoverMcpServer, mockStopMcp, } = vi.hoisted(() => ({
|
|
8
8
|
mockSendMessageStream: vi.fn().mockResolvedValue({
|
|
9
9
|
async *[Symbol.asyncIterator]() {
|
|
10
10
|
yield {
|
|
@@ -15,6 +15,8 @@ const { mockSendMessageStream, mockScheduleAgentTools, mockSetSystemInstruction,
|
|
|
15
15
|
}),
|
|
16
16
|
mockScheduleAgentTools: vi.fn(),
|
|
17
17
|
mockSetSystemInstruction: vi.fn(),
|
|
18
|
+
mockRecordCompletedToolCalls: vi.fn(),
|
|
19
|
+
mockSaveSummary: vi.fn(),
|
|
18
20
|
mockCompress: vi.fn(),
|
|
19
21
|
mockMaybeDiscoverMcpServer: vi.fn().mockResolvedValue(undefined),
|
|
20
22
|
mockStopMcp: vi.fn().mockResolvedValue(undefined),
|
|
@@ -33,7 +35,7 @@ import { PromptRegistry } from '../prompts/prompt-registry.js';
|
|
|
33
35
|
import { ResourceRegistry } from '../resources/resource-registry.js';
|
|
34
36
|
import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
|
|
35
37
|
import { LSTool } from '../tools/ls.js';
|
|
36
|
-
import { LS_TOOL_NAME, READ_FILE_TOOL_NAME } from '../tools/tool-names.js';
|
|
38
|
+
import { COMPLETE_TASK_TOOL_NAME, LS_TOOL_NAME, READ_FILE_TOOL_NAME, } from '../tools/tool-names.js';
|
|
37
39
|
import { GeminiChat, StreamEventType, } from '../core/geminiChat.js';
|
|
38
40
|
import {} from '@google/genai';
|
|
39
41
|
import { MockTool } from '../test-utils/mock-tool.js';
|
|
@@ -47,29 +49,32 @@ import { AgentTerminateMode, SubagentActivityErrorType, } from './types.js';
|
|
|
47
49
|
import { ToolConfirmationOutcome, } from '../tools/tools.js';
|
|
48
50
|
import { CoreToolCallStatus, } from '../scheduler/types.js';
|
|
49
51
|
import { CompressionStatus } from '../core/turn.js';
|
|
50
|
-
import { ChatCompressionService } from '../
|
|
52
|
+
import { ChatCompressionService } from '../context/chatCompressionService.js';
|
|
51
53
|
import { getModelConfigAlias } from './registry.js';
|
|
52
54
|
let mockChatHistory = [];
|
|
53
55
|
const mockSetHistory = vi.fn((newHistory) => {
|
|
54
56
|
mockChatHistory = newHistory;
|
|
55
57
|
});
|
|
56
|
-
vi.mock('../
|
|
58
|
+
vi.mock('../context/chatCompressionService.js', () => ({
|
|
57
59
|
ChatCompressionService: vi.fn().mockImplementation(() => ({
|
|
58
60
|
compress: mockCompress,
|
|
59
61
|
})),
|
|
60
62
|
}));
|
|
61
|
-
vi.mock('../core/geminiChat.js',
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
vi.mock('../core/geminiChat.js', () => ({
|
|
64
|
+
StreamEventType: {
|
|
65
|
+
CHUNK: 'chunk',
|
|
66
|
+
},
|
|
67
|
+
GeminiChat: vi.fn().mockImplementation(() => ({
|
|
68
|
+
sendMessageStream: mockSendMessageStream,
|
|
69
|
+
getHistory: vi.fn((_curated) => [...mockChatHistory]),
|
|
70
|
+
setHistory: mockSetHistory,
|
|
71
|
+
setSystemInstruction: mockSetSystemInstruction,
|
|
72
|
+
recordCompletedToolCalls: mockRecordCompletedToolCalls,
|
|
73
|
+
getChatRecordingService: vi.fn().mockReturnValue({
|
|
74
|
+
saveSummary: mockSaveSummary,
|
|
75
|
+
}),
|
|
76
|
+
})),
|
|
77
|
+
}));
|
|
73
78
|
vi.mock('./agent-scheduler.js', () => ({
|
|
74
79
|
scheduleAgentTools: mockScheduleAgentTools,
|
|
75
80
|
}));
|
|
@@ -108,6 +113,17 @@ vi.mock('../utils/promptIdContext.js', async (importOriginal) => {
|
|
|
108
113
|
},
|
|
109
114
|
};
|
|
110
115
|
});
|
|
116
|
+
vi.mock('../config/scoped-config.js', async (importOriginal) => {
|
|
117
|
+
const actual = await importOriginal();
|
|
118
|
+
return {
|
|
119
|
+
...actual,
|
|
120
|
+
runWithScopedWorkspaceContext: vi.fn(actual.runWithScopedWorkspaceContext),
|
|
121
|
+
createScopedWorkspaceContext: vi.fn(actual.createScopedWorkspaceContext),
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
import { runWithScopedWorkspaceContext, createScopedWorkspaceContext, } from '../config/scoped-config.js';
|
|
125
|
+
const mockedRunWithScopedWorkspaceContext = vi.mocked(runWithScopedWorkspaceContext);
|
|
126
|
+
const mockedCreateScopedWorkspaceContext = vi.mocked(createScopedWorkspaceContext);
|
|
111
127
|
const MockedGeminiChat = vi.mocked(GeminiChat);
|
|
112
128
|
const mockedGetDirectoryContextString = vi.mocked(getDirectoryContextString);
|
|
113
129
|
const mockedPromptIdContext = vi.mocked(promptIdContext);
|
|
@@ -115,8 +131,31 @@ const mockedLogAgentStart = vi.mocked(logAgentStart);
|
|
|
115
131
|
const mockedLogAgentFinish = vi.mocked(logAgentFinish);
|
|
116
132
|
const mockedLogRecoveryAttempt = vi.mocked(logRecoveryAttempt);
|
|
117
133
|
// Constants for testing
|
|
118
|
-
const TASK_COMPLETE_TOOL_NAME = 'complete_task';
|
|
119
134
|
const MOCK_TOOL_NOT_ALLOWED = new MockTool({ name: 'write_file_interactive' });
|
|
135
|
+
/**
|
|
136
|
+
* Helper to mock a successful completion result from the scheduler.
|
|
137
|
+
*/
|
|
138
|
+
const mockCompletionResult = (callId, submittedOutput, toolName = COMPLETE_TASK_TOOL_NAME) => {
|
|
139
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
140
|
+
{
|
|
141
|
+
status: 'success',
|
|
142
|
+
request: {
|
|
143
|
+
callId,
|
|
144
|
+
name: toolName,
|
|
145
|
+
args: {},
|
|
146
|
+
prompt_id: 'test-prompt',
|
|
147
|
+
},
|
|
148
|
+
response: {
|
|
149
|
+
resultDisplay: 'Task completed.',
|
|
150
|
+
responseParts: [],
|
|
151
|
+
data: {
|
|
152
|
+
taskCompleted: true,
|
|
153
|
+
submittedOutput,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
]);
|
|
158
|
+
};
|
|
120
159
|
/**
|
|
121
160
|
* Helper to create a mock API response chunk.
|
|
122
161
|
* Uses conditional spread to handle readonly functionCalls property safely.
|
|
@@ -207,11 +246,50 @@ describe('LocalAgentExecutor', () => {
|
|
|
207
246
|
vi.resetAllMocks();
|
|
208
247
|
mockCompress.mockClear();
|
|
209
248
|
mockSetHistory.mockClear();
|
|
210
|
-
mockSendMessageStream.mockReset()
|
|
249
|
+
mockSendMessageStream.mockReset().mockResolvedValue({
|
|
250
|
+
async *[Symbol.asyncIterator]() {
|
|
251
|
+
yield {
|
|
252
|
+
type: StreamEventType.CHUNK,
|
|
253
|
+
value: { candidates: [] },
|
|
254
|
+
};
|
|
255
|
+
},
|
|
256
|
+
});
|
|
211
257
|
mockSetSystemInstruction.mockReset();
|
|
212
|
-
mockScheduleAgentTools
|
|
258
|
+
mockScheduleAgentTools
|
|
259
|
+
.mockReset()
|
|
260
|
+
.mockImplementation(async (_config, requests) =>
|
|
261
|
+
// Default mock behavior for scheduleAgentTools
|
|
262
|
+
requests.map((req) => {
|
|
263
|
+
if (req.name === COMPLETE_TASK_TOOL_NAME) {
|
|
264
|
+
return {
|
|
265
|
+
status: 'success',
|
|
266
|
+
request: req,
|
|
267
|
+
response: {
|
|
268
|
+
resultDisplay: 'Task completed.',
|
|
269
|
+
responseParts: [],
|
|
270
|
+
data: {
|
|
271
|
+
taskCompleted: true,
|
|
272
|
+
submittedOutput: req.args['finalResult'] ||
|
|
273
|
+
req.args['result'] ||
|
|
274
|
+
JSON.stringify(req.args),
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
status: 'success',
|
|
281
|
+
request: req,
|
|
282
|
+
response: {
|
|
283
|
+
resultDisplay: 'Mock tool executed',
|
|
284
|
+
responseParts: [],
|
|
285
|
+
data: {},
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}));
|
|
213
289
|
mockedLogAgentStart.mockReset();
|
|
214
290
|
mockedLogAgentFinish.mockReset();
|
|
291
|
+
mockedRunWithScopedWorkspaceContext.mockClear();
|
|
292
|
+
mockedCreateScopedWorkspaceContext.mockClear();
|
|
215
293
|
mockedPromptIdContext.getStore.mockReset();
|
|
216
294
|
mockedPromptIdContext.run.mockImplementation((_id, fn) => fn());
|
|
217
295
|
ChatCompressionService.mockImplementation(() => ({
|
|
@@ -227,6 +305,10 @@ describe('LocalAgentExecutor', () => {
|
|
|
227
305
|
getHistory: vi.fn((_curated) => [...mockChatHistory]),
|
|
228
306
|
getLastPromptTokenCount: vi.fn(() => 100),
|
|
229
307
|
setHistory: mockSetHistory,
|
|
308
|
+
recordCompletedToolCalls: mockRecordCompletedToolCalls,
|
|
309
|
+
getChatRecordingService: vi.fn().mockReturnValue({
|
|
310
|
+
saveSummary: mockSaveSummary,
|
|
311
|
+
}),
|
|
230
312
|
}));
|
|
231
313
|
vi.useFakeTimers();
|
|
232
314
|
mockConfig = makeFakeConfig();
|
|
@@ -272,7 +354,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
272
354
|
const executor = await LocalAgentExecutor.create(definition, extendedContext, onActivity);
|
|
273
355
|
mockModelResponse([
|
|
274
356
|
{
|
|
275
|
-
name:
|
|
357
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
276
358
|
args: { finalResult: 'done' },
|
|
277
359
|
id: 'call1',
|
|
278
360
|
},
|
|
@@ -282,7 +364,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
282
364
|
const executionContext = chatConstructorArgs[0];
|
|
283
365
|
expect(executionContext).toBeDefined();
|
|
284
366
|
expect(executionContext.config).toBe(extendedContext.config);
|
|
285
|
-
expect(executionContext.promptId).
|
|
367
|
+
expect(executionContext.promptId).toBeDefined();
|
|
286
368
|
expect(executionContext.geminiClient).toBe(extendedContext.geminiClient);
|
|
287
369
|
expect(executionContext.sandboxManager).toBe(extendedContext.sandboxManager);
|
|
288
370
|
const agentToolRegistry = executor['toolRegistry'];
|
|
@@ -299,7 +381,84 @@ describe('LocalAgentExecutor', () => {
|
|
|
299
381
|
expect(executionContext.toolRegistry).not.toBe(extendedContext.toolRegistry);
|
|
300
382
|
expect(executionContext.messageBus).not.toBe(extendedContext.messageBus);
|
|
301
383
|
});
|
|
302
|
-
it('should
|
|
384
|
+
it('should propagate parentSessionId from context when creating executionContext', async () => {
|
|
385
|
+
const parentSessionId = 'top-level-session-id';
|
|
386
|
+
const currentPromptId = 'subagent-a-id';
|
|
387
|
+
const mockGeminiClient = {};
|
|
388
|
+
const mockSandboxManager = {};
|
|
389
|
+
const mockMessageBus = {
|
|
390
|
+
derive: () => ({}),
|
|
391
|
+
};
|
|
392
|
+
const mockToolRegistry = {
|
|
393
|
+
getMessageBus: () => mockMessageBus,
|
|
394
|
+
getAllToolNames: () => [],
|
|
395
|
+
sortTools: () => { },
|
|
396
|
+
};
|
|
397
|
+
const context = {
|
|
398
|
+
config: mockConfig,
|
|
399
|
+
promptId: currentPromptId,
|
|
400
|
+
parentSessionId,
|
|
401
|
+
toolRegistry: mockToolRegistry,
|
|
402
|
+
promptRegistry: {},
|
|
403
|
+
resourceRegistry: {},
|
|
404
|
+
geminiClient: mockGeminiClient,
|
|
405
|
+
sandboxManager: mockSandboxManager,
|
|
406
|
+
messageBus: mockMessageBus,
|
|
407
|
+
};
|
|
408
|
+
const definition = createTestDefinition([]);
|
|
409
|
+
const executor = await LocalAgentExecutor.create(definition, context);
|
|
410
|
+
mockModelResponse([
|
|
411
|
+
{
|
|
412
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
413
|
+
args: { finalResult: 'done' },
|
|
414
|
+
id: 'call1',
|
|
415
|
+
},
|
|
416
|
+
]);
|
|
417
|
+
await executor.run({ goal: 'test' }, signal);
|
|
418
|
+
const chatConstructorArgs = MockedGeminiChat.mock.calls[MockedGeminiChat.mock.calls.length - 1];
|
|
419
|
+
const executionContext = chatConstructorArgs[0];
|
|
420
|
+
expect(executionContext.parentSessionId).toBe(parentSessionId);
|
|
421
|
+
expect(executionContext.promptId).toBe(executor['agentId']);
|
|
422
|
+
});
|
|
423
|
+
it('should fall back to promptId if parentSessionId is missing (top-level subagent)', async () => {
|
|
424
|
+
const rootSessionId = 'root-session-id';
|
|
425
|
+
const mockGeminiClient = {};
|
|
426
|
+
const mockSandboxManager = {};
|
|
427
|
+
const mockMessageBus = {
|
|
428
|
+
derive: () => ({}),
|
|
429
|
+
};
|
|
430
|
+
const mockToolRegistry = {
|
|
431
|
+
getMessageBus: () => mockMessageBus,
|
|
432
|
+
getAllToolNames: () => [],
|
|
433
|
+
sortTools: () => { },
|
|
434
|
+
};
|
|
435
|
+
const context = {
|
|
436
|
+
config: mockConfig,
|
|
437
|
+
promptId: rootSessionId,
|
|
438
|
+
// parentSessionId is undefined
|
|
439
|
+
toolRegistry: mockToolRegistry,
|
|
440
|
+
promptRegistry: {},
|
|
441
|
+
resourceRegistry: {},
|
|
442
|
+
geminiClient: mockGeminiClient,
|
|
443
|
+
sandboxManager: mockSandboxManager,
|
|
444
|
+
messageBus: mockMessageBus,
|
|
445
|
+
};
|
|
446
|
+
const definition = createTestDefinition([]);
|
|
447
|
+
const executor = await LocalAgentExecutor.create(definition, context);
|
|
448
|
+
mockModelResponse([
|
|
449
|
+
{
|
|
450
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
451
|
+
args: { finalResult: 'done' },
|
|
452
|
+
id: 'call1',
|
|
453
|
+
},
|
|
454
|
+
]);
|
|
455
|
+
await executor.run({ goal: 'test' }, signal);
|
|
456
|
+
const chatConstructorArgs = MockedGeminiChat.mock.calls[MockedGeminiChat.mock.calls.length - 1];
|
|
457
|
+
const executionContext = chatConstructorArgs[0];
|
|
458
|
+
expect(executionContext.parentSessionId).toBe(rootSessionId);
|
|
459
|
+
expect(executionContext.promptId).toBe(executor['agentId']);
|
|
460
|
+
});
|
|
461
|
+
it('should successfully with allowed tools', async () => {
|
|
303
462
|
const definition = createTestDefinition([LS_TOOL_NAME]);
|
|
304
463
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
305
464
|
expect(executor).toBeInstanceOf(LocalAgentExecutor);
|
|
@@ -317,8 +476,12 @@ describe('LocalAgentExecutor', () => {
|
|
|
317
476
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
318
477
|
const agentRegistry = executor['toolRegistry'];
|
|
319
478
|
expect(agentRegistry).not.toBe(parentToolRegistry);
|
|
320
|
-
expect(agentRegistry.getAllToolNames()).toEqual(expect.arrayContaining([
|
|
321
|
-
|
|
479
|
+
expect(agentRegistry.getAllToolNames()).toEqual(expect.arrayContaining([
|
|
480
|
+
LS_TOOL_NAME,
|
|
481
|
+
READ_FILE_TOOL_NAME,
|
|
482
|
+
COMPLETE_TASK_TOOL_NAME,
|
|
483
|
+
]));
|
|
484
|
+
expect(agentRegistry.getAllToolNames()).toHaveLength(3);
|
|
322
485
|
expect(agentRegistry.getTool(MOCK_TOOL_NOT_ALLOWED.name)).toBeUndefined();
|
|
323
486
|
});
|
|
324
487
|
it('should use parentPromptId from context to create agentId', async () => {
|
|
@@ -329,7 +492,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
329
492
|
});
|
|
330
493
|
const definition = createTestDefinition();
|
|
331
494
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
332
|
-
expect(executor['agentId']).
|
|
495
|
+
expect(executor['agentId']).toBeDefined();
|
|
333
496
|
});
|
|
334
497
|
it('should correctly apply templates to initialMessages', async () => {
|
|
335
498
|
const definition = createTestDefinition();
|
|
@@ -344,7 +507,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
344
507
|
// Mock a response to prevent the loop from running forever
|
|
345
508
|
mockModelResponse([
|
|
346
509
|
{
|
|
347
|
-
name:
|
|
510
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
348
511
|
args: { finalResult: 'done' },
|
|
349
512
|
id: 'call1',
|
|
350
513
|
},
|
|
@@ -450,6 +613,39 @@ describe('LocalAgentExecutor', () => {
|
|
|
450
613
|
expect(toolNames).toContain(LS_TOOL_NAME);
|
|
451
614
|
});
|
|
452
615
|
});
|
|
616
|
+
describe('run (Workspace Scoping)', () => {
|
|
617
|
+
it('should use runWithScopedWorkspaceContext when workspaceDirectories is set', async () => {
|
|
618
|
+
const definition = createTestDefinition();
|
|
619
|
+
definition.workspaceDirectories = ['/tmp/extra-dir'];
|
|
620
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
621
|
+
// Mock a simple complete_task response so run() terminates
|
|
622
|
+
mockModelResponse([
|
|
623
|
+
{
|
|
624
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
625
|
+
args: { finalResult: 'done' },
|
|
626
|
+
id: 'c1',
|
|
627
|
+
},
|
|
628
|
+
]);
|
|
629
|
+
await executor.run({ goal: 'test' }, signal);
|
|
630
|
+
expect(mockedCreateScopedWorkspaceContext).toHaveBeenCalledOnce();
|
|
631
|
+
expect(mockedRunWithScopedWorkspaceContext).toHaveBeenCalledOnce();
|
|
632
|
+
});
|
|
633
|
+
it('should not use runWithScopedWorkspaceContext when workspaceDirectories is not set', async () => {
|
|
634
|
+
const definition = createTestDefinition();
|
|
635
|
+
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
636
|
+
// Mock a simple complete_task response so run() terminates
|
|
637
|
+
mockModelResponse([
|
|
638
|
+
{
|
|
639
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
640
|
+
args: { finalResult: 'done' },
|
|
641
|
+
id: 'c1',
|
|
642
|
+
},
|
|
643
|
+
]);
|
|
644
|
+
await executor.run({ goal: 'test' }, signal);
|
|
645
|
+
expect(mockedCreateScopedWorkspaceContext).not.toHaveBeenCalled();
|
|
646
|
+
expect(mockedRunWithScopedWorkspaceContext).not.toHaveBeenCalled();
|
|
647
|
+
});
|
|
648
|
+
});
|
|
453
649
|
describe('run (Execution Loop and Logic)', () => {
|
|
454
650
|
it('should log AgentFinish with error if run throws', async () => {
|
|
455
651
|
const definition = createTestDefinition();
|
|
@@ -509,15 +705,43 @@ describe('LocalAgentExecutor', () => {
|
|
|
509
705
|
// Turn 2: Model calls complete_task with required output
|
|
510
706
|
mockModelResponse([
|
|
511
707
|
{
|
|
512
|
-
name:
|
|
708
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
513
709
|
args: { finalResult: 'Found file1.txt' },
|
|
514
710
|
id: 'call2',
|
|
515
711
|
},
|
|
516
712
|
], 'T2: Done');
|
|
713
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
714
|
+
{
|
|
715
|
+
status: 'success',
|
|
716
|
+
request: {
|
|
717
|
+
callId: 'call2',
|
|
718
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
719
|
+
args: { finalResult: 'Found file1.txt' },
|
|
720
|
+
prompt_id: 'p1',
|
|
721
|
+
},
|
|
722
|
+
response: {
|
|
723
|
+
resultDisplay: 'Output submitted and task completed.',
|
|
724
|
+
responseParts: [
|
|
725
|
+
{
|
|
726
|
+
functionResponse: {
|
|
727
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
728
|
+
id: 'call2',
|
|
729
|
+
response: { result: 'Output submitted and task completed.' },
|
|
730
|
+
},
|
|
731
|
+
},
|
|
732
|
+
],
|
|
733
|
+
data: {
|
|
734
|
+
taskCompleted: true,
|
|
735
|
+
submittedOutput: 'Found file1.txt',
|
|
736
|
+
},
|
|
737
|
+
},
|
|
738
|
+
},
|
|
739
|
+
]);
|
|
517
740
|
const output = await executor.run(inputs, signal);
|
|
518
741
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
|
|
742
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
|
|
519
743
|
const systemInstruction = MockedGeminiChat.mock.calls[0][1];
|
|
520
|
-
expect(systemInstruction).toContain(`MUST call the \`${
|
|
744
|
+
expect(systemInstruction).toContain(`MUST call the \`${COMPLETE_TASK_TOOL_NAME}\` tool`);
|
|
521
745
|
expect(systemInstruction).toContain('Mocked Environment Context');
|
|
522
746
|
expect(systemInstruction).toContain('You are running in a non-interactive mode');
|
|
523
747
|
expect(systemInstruction).toContain('Always use absolute paths');
|
|
@@ -530,10 +754,11 @@ describe('LocalAgentExecutor', () => {
|
|
|
530
754
|
expect(sentTools).toBeDefined();
|
|
531
755
|
expect(sentTools).toEqual(expect.arrayContaining([
|
|
532
756
|
expect.objectContaining({ name: LS_TOOL_NAME }),
|
|
533
|
-
expect.objectContaining({ name:
|
|
757
|
+
expect.objectContaining({ name: COMPLETE_TASK_TOOL_NAME }),
|
|
534
758
|
]));
|
|
535
|
-
const completeToolDef = sentTools.find((t) => t.name ===
|
|
536
|
-
|
|
759
|
+
const completeToolDef = sentTools.find((t) => t.name === COMPLETE_TASK_TOOL_NAME);
|
|
760
|
+
const completeSchema = completeToolDef?.parametersJsonSchema;
|
|
761
|
+
expect(completeSchema?.['required']).toContain('finalResult');
|
|
537
762
|
expect(output.result).toBe('Found file1.txt');
|
|
538
763
|
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
539
764
|
// Telemetry checks
|
|
@@ -545,6 +770,17 @@ describe('LocalAgentExecutor', () => {
|
|
|
545
770
|
expect(finishEvent.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
546
771
|
// Context checks
|
|
547
772
|
expect(mockedPromptIdContext.run).toHaveBeenCalledTimes(2); // Two turns
|
|
773
|
+
// Recording checks
|
|
774
|
+
expect(mockRecordCompletedToolCalls).toHaveBeenCalledTimes(2);
|
|
775
|
+
expect(mockRecordCompletedToolCalls).toHaveBeenNthCalledWith(1, expect.any(String), // model
|
|
776
|
+
expect.arrayContaining([
|
|
777
|
+
expect.objectContaining({
|
|
778
|
+
status: 'success',
|
|
779
|
+
request: expect.objectContaining({ name: LS_TOOL_NAME }),
|
|
780
|
+
}),
|
|
781
|
+
]));
|
|
782
|
+
expect(mockSaveSummary).toHaveBeenCalledTimes(1);
|
|
783
|
+
expect(mockSaveSummary).toHaveBeenCalledWith('Found file1.txt');
|
|
548
784
|
const agentId = executor['agentId'];
|
|
549
785
|
expect(mockedPromptIdContext.run).toHaveBeenNthCalledWith(1, `${agentId}#0`, expect.any(Function));
|
|
550
786
|
expect(mockedPromptIdContext.run).toHaveBeenNthCalledWith(2, `${agentId}#1`, expect.any(Function));
|
|
@@ -563,14 +799,14 @@ describe('LocalAgentExecutor', () => {
|
|
|
563
799
|
expect.objectContaining({
|
|
564
800
|
type: 'TOOL_CALL_START',
|
|
565
801
|
data: expect.objectContaining({
|
|
566
|
-
name:
|
|
802
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
567
803
|
args: { finalResult: 'Found file1.txt' },
|
|
568
804
|
}),
|
|
569
805
|
}),
|
|
570
806
|
expect.objectContaining({
|
|
571
807
|
type: 'TOOL_CALL_END',
|
|
572
808
|
data: expect.objectContaining({
|
|
573
|
-
name:
|
|
809
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
574
810
|
output: expect.stringContaining('Output submitted'),
|
|
575
811
|
}),
|
|
576
812
|
}),
|
|
@@ -614,11 +850,12 @@ describe('LocalAgentExecutor', () => {
|
|
|
614
850
|
]);
|
|
615
851
|
mockModelResponse([
|
|
616
852
|
{
|
|
617
|
-
name:
|
|
853
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
618
854
|
args: { result: 'All work done' },
|
|
619
855
|
id: 'call2',
|
|
620
856
|
},
|
|
621
857
|
], 'Task finished.');
|
|
858
|
+
mockCompletionResult('call2', 'All work done');
|
|
622
859
|
const output = await executor.run({ goal: 'Do work' }, signal);
|
|
623
860
|
const { modelConfigKey } = getMockMessageParams(0);
|
|
624
861
|
expect(modelConfigKey.model).toBe(getModelConfigAlias(definition));
|
|
@@ -626,11 +863,13 @@ describe('LocalAgentExecutor', () => {
|
|
|
626
863
|
const passedToolsArg = chatConstructorArgs[2];
|
|
627
864
|
const sentTools = passedToolsArg[0].functionDeclarations;
|
|
628
865
|
expect(sentTools).toBeDefined();
|
|
629
|
-
const completeToolDef = sentTools.find((t) => t.name ===
|
|
630
|
-
|
|
866
|
+
const completeToolDef = sentTools.find((t) => t.name === COMPLETE_TASK_TOOL_NAME);
|
|
867
|
+
const schema = completeToolDef?.parametersJsonSchema;
|
|
868
|
+
expect(schema?.['required']).toContain('result');
|
|
631
869
|
expect(completeToolDef?.description).toContain('submit your final findings');
|
|
632
870
|
expect(output.result).toBe('All work done');
|
|
633
871
|
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
872
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
|
|
634
873
|
});
|
|
635
874
|
it('should error immediately if the model stops tools without calling complete_task (Protocol Violation)', async () => {
|
|
636
875
|
const definition = createTestDefinition();
|
|
@@ -674,7 +913,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
674
913
|
mockModelResponse([], 'I still give up.');
|
|
675
914
|
const output = await executor.run({ goal: 'Strict test' }, signal);
|
|
676
915
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(3);
|
|
677
|
-
const expectedError = `Agent stopped calling tools but did not call '${
|
|
916
|
+
const expectedError = `Agent stopped calling tools but did not call '${COMPLETE_TASK_TOOL_NAME}'.`;
|
|
678
917
|
expect(output.terminate_reason).toBe(AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL);
|
|
679
918
|
expect(output.result).toBe(expectedError);
|
|
680
919
|
// Telemetry check for error
|
|
@@ -696,27 +935,59 @@ describe('LocalAgentExecutor', () => {
|
|
|
696
935
|
// Turn 1: Missing arg
|
|
697
936
|
mockModelResponse([
|
|
698
937
|
{
|
|
699
|
-
name:
|
|
938
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
700
939
|
args: { wrongArg: 'oops' },
|
|
701
940
|
id: 'call1',
|
|
702
941
|
},
|
|
703
942
|
]);
|
|
943
|
+
// Mock failure in scheduler for Turn 1
|
|
944
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
945
|
+
{
|
|
946
|
+
status: 'error',
|
|
947
|
+
request: {
|
|
948
|
+
callId: 'call1',
|
|
949
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
950
|
+
args: { wrongArg: 'oops' },
|
|
951
|
+
prompt_id: 'p1',
|
|
952
|
+
},
|
|
953
|
+
response: {
|
|
954
|
+
resultDisplay: 'Error',
|
|
955
|
+
responseParts: [
|
|
956
|
+
{
|
|
957
|
+
functionResponse: {
|
|
958
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
959
|
+
id: 'call1',
|
|
960
|
+
response: {
|
|
961
|
+
error: "Missing required argument 'finalResult' for completion.",
|
|
962
|
+
},
|
|
963
|
+
},
|
|
964
|
+
},
|
|
965
|
+
],
|
|
966
|
+
error: {
|
|
967
|
+
message: "Missing required argument 'finalResult' for completion.",
|
|
968
|
+
type: 'INVALID_TOOL_PARAMS',
|
|
969
|
+
},
|
|
970
|
+
},
|
|
971
|
+
},
|
|
972
|
+
]);
|
|
704
973
|
// Turn 2: Corrected
|
|
705
974
|
mockModelResponse([
|
|
706
975
|
{
|
|
707
|
-
name:
|
|
976
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
708
977
|
args: { finalResult: 'Corrected result' },
|
|
709
978
|
id: 'call2',
|
|
710
979
|
},
|
|
711
980
|
]);
|
|
981
|
+
mockCompletionResult('call2', 'Corrected result');
|
|
712
982
|
const output = await executor.run({ goal: 'Error test' }, signal);
|
|
713
983
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
|
|
984
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
|
|
714
985
|
const expectedError = "Missing required argument 'finalResult' for completion.";
|
|
715
986
|
expect(activities).toContainEqual(expect.objectContaining({
|
|
716
987
|
type: 'ERROR',
|
|
717
988
|
data: expect.objectContaining({
|
|
718
989
|
context: 'tool_call',
|
|
719
|
-
name:
|
|
990
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
720
991
|
error: expectedError,
|
|
721
992
|
errorType: SubagentActivityErrorType.GENERIC,
|
|
722
993
|
}),
|
|
@@ -727,7 +998,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
727
998
|
expect(turn2Parts).toHaveLength(1);
|
|
728
999
|
expect(turn2Parts[0]).toEqual(expect.objectContaining({
|
|
729
1000
|
functionResponse: expect.objectContaining({
|
|
730
|
-
name:
|
|
1001
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
731
1002
|
response: { error: expectedError },
|
|
732
1003
|
id: 'call1',
|
|
733
1004
|
}),
|
|
@@ -735,31 +1006,61 @@ describe('LocalAgentExecutor', () => {
|
|
|
735
1006
|
expect(output.result).toBe('Corrected result');
|
|
736
1007
|
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
737
1008
|
});
|
|
738
|
-
it('should handle multiple calls to complete_task in the same turn
|
|
1009
|
+
it('should handle multiple calls to complete_task in the same turn', async () => {
|
|
739
1010
|
const definition = createTestDefinition([], {}, 'none');
|
|
740
1011
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
741
1012
|
// Turn 1: Duplicate calls
|
|
742
1013
|
mockModelResponse([
|
|
743
1014
|
{
|
|
744
|
-
name:
|
|
745
|
-
args: { result: '
|
|
1015
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1016
|
+
args: { result: 'first' },
|
|
746
1017
|
id: 'call1',
|
|
747
1018
|
},
|
|
748
1019
|
{
|
|
749
|
-
name:
|
|
750
|
-
args: { result: '
|
|
1020
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1021
|
+
args: { result: 'second' },
|
|
751
1022
|
id: 'call2',
|
|
752
1023
|
},
|
|
753
1024
|
]);
|
|
1025
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
1026
|
+
{
|
|
1027
|
+
status: 'success',
|
|
1028
|
+
request: {
|
|
1029
|
+
callId: 'call1',
|
|
1030
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1031
|
+
args: { result: 'first' },
|
|
1032
|
+
prompt_id: 'p1',
|
|
1033
|
+
},
|
|
1034
|
+
response: {
|
|
1035
|
+
resultDisplay: 'ok',
|
|
1036
|
+
responseParts: [],
|
|
1037
|
+
data: { taskCompleted: true, submittedOutput: 'first' },
|
|
1038
|
+
},
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
status: 'success',
|
|
1042
|
+
request: {
|
|
1043
|
+
callId: 'call2',
|
|
1044
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1045
|
+
args: { result: 'second' },
|
|
1046
|
+
prompt_id: 'p1',
|
|
1047
|
+
},
|
|
1048
|
+
response: {
|
|
1049
|
+
resultDisplay: 'ok',
|
|
1050
|
+
responseParts: [],
|
|
1051
|
+
data: { taskCompleted: true, submittedOutput: 'second' },
|
|
1052
|
+
},
|
|
1053
|
+
},
|
|
1054
|
+
]);
|
|
754
1055
|
const output = await executor.run({ goal: 'Dup test' }, signal);
|
|
755
1056
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
|
|
1057
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(1);
|
|
756
1058
|
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
1059
|
+
// In current impl, the first successful complete_task in the batch is respected.
|
|
1060
|
+
expect(output.result).toBe('first');
|
|
757
1061
|
const completions = activities.filter((a) => a.type === 'TOOL_CALL_END' &&
|
|
758
|
-
a.data['name'] ===
|
|
759
|
-
|
|
760
|
-
expect(completions).toHaveLength(1);
|
|
761
|
-
expect(errors).toHaveLength(1);
|
|
762
|
-
expect(errors[0].data['error']).toContain('Task already marked complete in this turn');
|
|
1062
|
+
a.data['name'] === COMPLETE_TASK_TOOL_NAME);
|
|
1063
|
+
expect(completions).toHaveLength(2);
|
|
763
1064
|
});
|
|
764
1065
|
it('should execute parallel tool calls and then complete', async () => {
|
|
765
1066
|
const definition = createTestDefinition([LS_TOOL_NAME]);
|
|
@@ -784,39 +1085,57 @@ describe('LocalAgentExecutor', () => {
|
|
|
784
1085
|
});
|
|
785
1086
|
mockScheduleAgentTools.mockImplementation(async (_ctx, requests) => {
|
|
786
1087
|
const results = await Promise.all(requests.map(async (reqInfo) => {
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
1088
|
+
if (reqInfo.name === LS_TOOL_NAME) {
|
|
1089
|
+
callsStarted++;
|
|
1090
|
+
if (callsStarted === 2)
|
|
1091
|
+
resolveCalls();
|
|
1092
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
1093
|
+
return {
|
|
1094
|
+
status: CoreToolCallStatus.Success,
|
|
1095
|
+
request: reqInfo,
|
|
1096
|
+
tool: {},
|
|
1097
|
+
invocation: {},
|
|
1098
|
+
response: {
|
|
1099
|
+
callId: reqInfo.callId,
|
|
1100
|
+
resultDisplay: 'ok',
|
|
1101
|
+
responseParts: [
|
|
1102
|
+
{
|
|
1103
|
+
functionResponse: {
|
|
1104
|
+
name: reqInfo.name,
|
|
1105
|
+
response: {},
|
|
1106
|
+
id: reqInfo.callId,
|
|
1107
|
+
},
|
|
805
1108
|
},
|
|
1109
|
+
],
|
|
1110
|
+
error: undefined,
|
|
1111
|
+
errorType: undefined,
|
|
1112
|
+
contentLength: 0,
|
|
1113
|
+
},
|
|
1114
|
+
};
|
|
1115
|
+
}
|
|
1116
|
+
else if (reqInfo.name === COMPLETE_TASK_TOOL_NAME) {
|
|
1117
|
+
return {
|
|
1118
|
+
status: CoreToolCallStatus.Success,
|
|
1119
|
+
request: reqInfo,
|
|
1120
|
+
response: {
|
|
1121
|
+
callId: reqInfo.callId,
|
|
1122
|
+
resultDisplay: 'Task completed.',
|
|
1123
|
+
responseParts: [],
|
|
1124
|
+
data: {
|
|
1125
|
+
taskCompleted: true,
|
|
1126
|
+
submittedOutput: reqInfo.args['finalResult'],
|
|
806
1127
|
},
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
},
|
|
812
|
-
};
|
|
1128
|
+
},
|
|
1129
|
+
};
|
|
1130
|
+
}
|
|
1131
|
+
throw new Error(`Unexpected tool: ${reqInfo.name}`);
|
|
813
1132
|
}));
|
|
814
1133
|
return results;
|
|
815
1134
|
});
|
|
816
1135
|
// Turn 2: Completion
|
|
817
1136
|
mockModelResponse([
|
|
818
1137
|
{
|
|
819
|
-
name:
|
|
1138
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
820
1139
|
args: { finalResult: 'done' },
|
|
821
1140
|
id: 'c3',
|
|
822
1141
|
},
|
|
@@ -827,7 +1146,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
827
1146
|
await vi.advanceTimersByTimeAsync(150);
|
|
828
1147
|
await vi.advanceTimersByTimeAsync(1);
|
|
829
1148
|
const output = await runPromise;
|
|
830
|
-
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(
|
|
1149
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
|
|
831
1150
|
expect(output.terminate_reason).toBe(AgentTerminateMode.GOAL);
|
|
832
1151
|
// Safe access to message parts
|
|
833
1152
|
const turn2Params = getMockMessageParams(1);
|
|
@@ -858,7 +1177,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
858
1177
|
// Turn 2: Model gives up and completes
|
|
859
1178
|
mockModelResponse([
|
|
860
1179
|
{
|
|
861
|
-
name:
|
|
1180
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
862
1181
|
args: { finalResult: 'Could not read file.' },
|
|
863
1182
|
id: 'c2',
|
|
864
1183
|
},
|
|
@@ -866,9 +1185,28 @@ describe('LocalAgentExecutor', () => {
|
|
|
866
1185
|
const consoleWarnSpy = vi
|
|
867
1186
|
.spyOn(debugLogger, 'warn')
|
|
868
1187
|
.mockImplementation(() => { });
|
|
1188
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
1189
|
+
{
|
|
1190
|
+
status: 'success',
|
|
1191
|
+
request: {
|
|
1192
|
+
callId: 'c2',
|
|
1193
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1194
|
+
args: { finalResult: 'Could not read file.' },
|
|
1195
|
+
prompt_id: 'p2',
|
|
1196
|
+
},
|
|
1197
|
+
response: {
|
|
1198
|
+
resultDisplay: 'Output submitted and task completed.',
|
|
1199
|
+
responseParts: [],
|
|
1200
|
+
data: {
|
|
1201
|
+
taskCompleted: true,
|
|
1202
|
+
submittedOutput: 'Could not read file.',
|
|
1203
|
+
},
|
|
1204
|
+
},
|
|
1205
|
+
},
|
|
1206
|
+
]);
|
|
869
1207
|
await executor.run({ goal: 'Sec test' }, signal);
|
|
870
|
-
// Verify external executor was
|
|
871
|
-
expect(mockScheduleAgentTools).
|
|
1208
|
+
// Verify external executor was called exactly once (for complete_task)
|
|
1209
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(1);
|
|
872
1210
|
// 2. Verify console warning
|
|
873
1211
|
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining(`[LocalAgentExecutor] Blocked call:`));
|
|
874
1212
|
consoleWarnSpy.mockRestore();
|
|
@@ -903,28 +1241,53 @@ describe('LocalAgentExecutor', () => {
|
|
|
903
1241
|
// Turn 1: Invalid arg (too short)
|
|
904
1242
|
mockModelResponse([
|
|
905
1243
|
{
|
|
906
|
-
name:
|
|
1244
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
907
1245
|
args: { finalResult: 'short' },
|
|
908
1246
|
id: 'call1',
|
|
909
1247
|
},
|
|
910
1248
|
]);
|
|
1249
|
+
const expectedError = 'Output validation failed: {"formErrors":["String must contain at least 10 character(s)"],"fieldErrors":{}}';
|
|
1250
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
1251
|
+
{
|
|
1252
|
+
status: 'error',
|
|
1253
|
+
request: {
|
|
1254
|
+
callId: 'call1',
|
|
1255
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1256
|
+
args: { finalResult: 'short' },
|
|
1257
|
+
prompt_id: 'p1',
|
|
1258
|
+
},
|
|
1259
|
+
response: {
|
|
1260
|
+
resultDisplay: expectedError,
|
|
1261
|
+
responseParts: [
|
|
1262
|
+
{
|
|
1263
|
+
functionResponse: {
|
|
1264
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1265
|
+
id: 'call1',
|
|
1266
|
+
response: { error: expectedError },
|
|
1267
|
+
},
|
|
1268
|
+
},
|
|
1269
|
+
],
|
|
1270
|
+
data: { taskCompleted: false },
|
|
1271
|
+
error: new Error(expectedError),
|
|
1272
|
+
},
|
|
1273
|
+
},
|
|
1274
|
+
]);
|
|
911
1275
|
// Turn 2: Corrected
|
|
912
1276
|
mockModelResponse([
|
|
913
1277
|
{
|
|
914
|
-
name:
|
|
1278
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
915
1279
|
args: { finalResult: 'This is a much longer and valid result' },
|
|
916
1280
|
id: 'call2',
|
|
917
1281
|
},
|
|
918
1282
|
]);
|
|
919
1283
|
const output = await executor.run({ goal: 'Validation test' }, signal);
|
|
920
1284
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
|
|
921
|
-
const expectedError = 'Output validation failed: {"formErrors":["String must contain at least 10 character(s)"],"fieldErrors":{}}';
|
|
922
1285
|
// Check that the error was reported in the activity stream
|
|
923
1286
|
expect(activities).toContainEqual(expect.objectContaining({
|
|
924
1287
|
type: 'ERROR',
|
|
925
1288
|
data: expect.objectContaining({
|
|
926
1289
|
context: 'tool_call',
|
|
927
|
-
name:
|
|
1290
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
928
1291
|
error: expect.stringContaining('Output validation failed'),
|
|
929
1292
|
errorType: SubagentActivityErrorType.GENERIC,
|
|
930
1293
|
}),
|
|
@@ -935,7 +1298,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
935
1298
|
expect(turn2Parts).toEqual([
|
|
936
1299
|
expect.objectContaining({
|
|
937
1300
|
functionResponse: expect.objectContaining({
|
|
938
|
-
name:
|
|
1301
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
939
1302
|
response: { error: expectedError },
|
|
940
1303
|
id: 'call1',
|
|
941
1304
|
}),
|
|
@@ -1008,13 +1371,32 @@ describe('LocalAgentExecutor', () => {
|
|
|
1008
1371
|
// Turn 2: Model sees the error and completes
|
|
1009
1372
|
mockModelResponse([
|
|
1010
1373
|
{
|
|
1011
|
-
name:
|
|
1374
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1012
1375
|
args: { finalResult: 'Aborted due to tool failure.' },
|
|
1013
1376
|
id: 'call2',
|
|
1014
1377
|
},
|
|
1015
1378
|
]);
|
|
1379
|
+
mockScheduleAgentTools.mockResolvedValueOnce([
|
|
1380
|
+
{
|
|
1381
|
+
status: 'success',
|
|
1382
|
+
request: {
|
|
1383
|
+
callId: 'call2',
|
|
1384
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1385
|
+
args: { finalResult: 'Aborted due to tool failure.' },
|
|
1386
|
+
prompt_id: 'p2',
|
|
1387
|
+
},
|
|
1388
|
+
response: {
|
|
1389
|
+
resultDisplay: 'Task completed.',
|
|
1390
|
+
responseParts: [],
|
|
1391
|
+
data: {
|
|
1392
|
+
taskCompleted: true,
|
|
1393
|
+
submittedOutput: 'Aborted due to tool failure.',
|
|
1394
|
+
},
|
|
1395
|
+
},
|
|
1396
|
+
},
|
|
1397
|
+
]);
|
|
1016
1398
|
const output = await executor.run({ goal: 'Tool failure test' }, signal);
|
|
1017
|
-
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(
|
|
1399
|
+
expect(mockScheduleAgentTools).toHaveBeenCalledTimes(2);
|
|
1018
1400
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
|
|
1019
1401
|
// Verify the error was reported in the activity stream
|
|
1020
1402
|
expect(activities).toContainEqual(expect.objectContaining({
|
|
@@ -1086,7 +1468,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1086
1468
|
// Turn 2: Model sees the rejection + consolidated instructions and completes
|
|
1087
1469
|
mockModelResponse([
|
|
1088
1470
|
{
|
|
1089
|
-
name:
|
|
1471
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1090
1472
|
args: { finalResult: 'User rejected access to /secret.' },
|
|
1091
1473
|
id: 'call2',
|
|
1092
1474
|
},
|
|
@@ -1186,7 +1568,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1186
1568
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
1187
1569
|
mockModelResponse([
|
|
1188
1570
|
{
|
|
1189
|
-
name:
|
|
1571
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1190
1572
|
args: { finalResult: 'done' },
|
|
1191
1573
|
id: 'call1',
|
|
1192
1574
|
},
|
|
@@ -1210,7 +1592,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1210
1592
|
const executor = await LocalAgentExecutor.create(definition, mockConfig, onActivity);
|
|
1211
1593
|
mockModelResponse([
|
|
1212
1594
|
{
|
|
1213
|
-
name:
|
|
1595
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1214
1596
|
args: { finalResult: 'done' },
|
|
1215
1597
|
id: 'call1',
|
|
1216
1598
|
},
|
|
@@ -1390,7 +1772,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1390
1772
|
// Recovery Turn (succeeds)
|
|
1391
1773
|
mockModelResponse([
|
|
1392
1774
|
{
|
|
1393
|
-
name:
|
|
1775
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1394
1776
|
args: { finalResult: 'Recovered!' },
|
|
1395
1777
|
id: 't2',
|
|
1396
1778
|
},
|
|
@@ -1445,7 +1827,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1445
1827
|
// Turn 3: Recovery turn (succeeds)
|
|
1446
1828
|
mockModelResponse([
|
|
1447
1829
|
{
|
|
1448
|
-
name:
|
|
1830
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1449
1831
|
args: { finalResult: 'Recovered from violation!' },
|
|
1450
1832
|
id: 't3',
|
|
1451
1833
|
},
|
|
@@ -1473,7 +1855,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1473
1855
|
const output = await executor.run({ goal: 'Violation recovery fail' }, signal);
|
|
1474
1856
|
expect(mockSendMessageStream).toHaveBeenCalledTimes(3);
|
|
1475
1857
|
expect(output.terminate_reason).toBe(AgentTerminateMode.ERROR_NO_COMPLETE_TASK_CALL);
|
|
1476
|
-
expect(output.result).toContain(`Agent stopped calling tools but did not call '${
|
|
1858
|
+
expect(output.result).toContain(`Agent stopped calling tools but did not call '${COMPLETE_TASK_TOOL_NAME}'`);
|
|
1477
1859
|
expect(activities).toContainEqual(expect.objectContaining({
|
|
1478
1860
|
type: 'ERROR',
|
|
1479
1861
|
data: expect.objectContaining({
|
|
@@ -1502,7 +1884,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1502
1884
|
// Recovery turn (succeeds)
|
|
1503
1885
|
mockModelResponse([
|
|
1504
1886
|
{
|
|
1505
|
-
name:
|
|
1887
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1506
1888
|
args: { finalResult: 'Recovered from timeout!' },
|
|
1507
1889
|
id: 't2',
|
|
1508
1890
|
},
|
|
@@ -1624,7 +2006,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1624
2006
|
// Recovery Turn (succeeds)
|
|
1625
2007
|
mockModelResponse([
|
|
1626
2008
|
{
|
|
1627
|
-
name:
|
|
2009
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1628
2010
|
args: { finalResult: 'Recovered!' },
|
|
1629
2011
|
id: 't2',
|
|
1630
2012
|
},
|
|
@@ -1635,6 +2017,9 @@ describe('LocalAgentExecutor', () => {
|
|
|
1635
2017
|
expect(recoveryEvent).toBeInstanceOf(RecoveryAttemptEvent);
|
|
1636
2018
|
expect(recoveryEvent.success).toBe(true);
|
|
1637
2019
|
expect(recoveryEvent.reason).toBe(AgentTerminateMode.MAX_TURNS);
|
|
2020
|
+
// Verify that the summary is saved upon successful recovery
|
|
2021
|
+
expect(mockSaveSummary).toHaveBeenCalledTimes(1);
|
|
2022
|
+
expect(mockSaveSummary).toHaveBeenCalledWith('Recovered!');
|
|
1638
2023
|
});
|
|
1639
2024
|
describe('Model Steering', () => {
|
|
1640
2025
|
let configWithHints;
|
|
@@ -1659,7 +2044,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1659
2044
|
// Turn 2: Model calls complete_task
|
|
1660
2045
|
mockModelResponse([
|
|
1661
2046
|
{
|
|
1662
|
-
name:
|
|
2047
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1663
2048
|
args: { finalResult: 'Done' },
|
|
1664
2049
|
id: 'call2',
|
|
1665
2050
|
},
|
|
@@ -1711,7 +2096,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1711
2096
|
const executor = await LocalAgentExecutor.create(definition, configWithHints);
|
|
1712
2097
|
mockModelResponse([
|
|
1713
2098
|
{
|
|
1714
|
-
name:
|
|
2099
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1715
2100
|
args: { finalResult: 'Done' },
|
|
1716
2101
|
id: 'call1',
|
|
1717
2102
|
},
|
|
@@ -1741,7 +2126,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1741
2126
|
// Turn 2: Model calls complete_task
|
|
1742
2127
|
mockModelResponse([
|
|
1743
2128
|
{
|
|
1744
|
-
name:
|
|
2129
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1745
2130
|
args: { finalResult: 'Done' },
|
|
1746
2131
|
id: 'call2',
|
|
1747
2132
|
},
|
|
@@ -1809,7 +2194,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1809
2194
|
mockScheduleAgentTools.mockReturnValueOnce(toolCallPromise);
|
|
1810
2195
|
mockModelResponse([
|
|
1811
2196
|
{
|
|
1812
|
-
name:
|
|
2197
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1813
2198
|
args: { finalResult: 'Done' },
|
|
1814
2199
|
id: 'call2',
|
|
1815
2200
|
},
|
|
@@ -1864,7 +2249,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1864
2249
|
mockScheduleAgentTools.mockReturnValueOnce(toolCallPromise);
|
|
1865
2250
|
mockModelResponse([
|
|
1866
2251
|
{
|
|
1867
|
-
name:
|
|
2252
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1868
2253
|
args: { finalResult: 'Done' },
|
|
1869
2254
|
id: 'call2',
|
|
1870
2255
|
},
|
|
@@ -1918,7 +2303,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1918
2303
|
expect(configWithHints.injectionService.getInjections('background_completion')).toEqual(['bg output']);
|
|
1919
2304
|
mockModelResponse([
|
|
1920
2305
|
{
|
|
1921
|
-
name:
|
|
2306
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1922
2307
|
args: { finalResult: 'Done' },
|
|
1923
2308
|
id: 'call1',
|
|
1924
2309
|
},
|
|
@@ -1974,7 +2359,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1974
2359
|
// Turn 2: Complete
|
|
1975
2360
|
mockModelResponse([
|
|
1976
2361
|
{
|
|
1977
|
-
name:
|
|
2362
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1978
2363
|
args: { finalResult: 'Done' },
|
|
1979
2364
|
id: 'call2',
|
|
1980
2365
|
},
|
|
@@ -1995,7 +2380,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
1995
2380
|
// Turn 1: Complete
|
|
1996
2381
|
mockModelResponse([
|
|
1997
2382
|
{
|
|
1998
|
-
name:
|
|
2383
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
1999
2384
|
args: { finalResult: 'Done' },
|
|
2000
2385
|
id: 'call1',
|
|
2001
2386
|
},
|
|
@@ -2025,7 +2410,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2025
2410
|
// Turn 2: Complete
|
|
2026
2411
|
mockModelResponse([
|
|
2027
2412
|
{
|
|
2028
|
-
name:
|
|
2413
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2029
2414
|
args: { finalResult: 'Done' },
|
|
2030
2415
|
id: 't2',
|
|
2031
2416
|
},
|
|
@@ -2067,7 +2452,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2067
2452
|
// Turn 3: Complete
|
|
2068
2453
|
mockModelResponse([
|
|
2069
2454
|
{
|
|
2070
|
-
name:
|
|
2455
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2071
2456
|
args: { finalResult: 'Done' },
|
|
2072
2457
|
id: 't3',
|
|
2073
2458
|
},
|
|
@@ -2183,7 +2568,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2183
2568
|
]);
|
|
2184
2569
|
mockModelResponse([
|
|
2185
2570
|
{
|
|
2186
|
-
name:
|
|
2571
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2187
2572
|
args: { finalResult: 'done' },
|
|
2188
2573
|
id: 'c1',
|
|
2189
2574
|
},
|
|
@@ -2242,7 +2627,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2242
2627
|
};
|
|
2243
2628
|
mockModelResponse([
|
|
2244
2629
|
{
|
|
2245
|
-
name:
|
|
2630
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2246
2631
|
args: { finalResult: 'ok' },
|
|
2247
2632
|
id: 'c1',
|
|
2248
2633
|
},
|
|
@@ -2253,7 +2638,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2253
2638
|
const names = declarations.map((d) => d.name);
|
|
2254
2639
|
expect(names.filter((n) => n === LS_TOOL_NAME)).toHaveLength(1);
|
|
2255
2640
|
expect(names.filter((n) => n === 'fill')).toHaveLength(1);
|
|
2256
|
-
expect(names.filter((n) => n ===
|
|
2641
|
+
expect(names.filter((n) => n === COMPLETE_TASK_TOOL_NAME)).toHaveLength(1);
|
|
2257
2642
|
// Total = ls + fill + complete_task
|
|
2258
2643
|
expect(declarations).toHaveLength(3);
|
|
2259
2644
|
});
|
|
@@ -2301,7 +2686,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2301
2686
|
// Turn 2: Model completes
|
|
2302
2687
|
mockModelResponse([
|
|
2303
2688
|
{
|
|
2304
|
-
name:
|
|
2689
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2305
2690
|
args: { finalResult: 'done' },
|
|
2306
2691
|
id: 'call-done',
|
|
2307
2692
|
},
|
|
@@ -2320,7 +2705,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2320
2705
|
const definition = createInstanceToolDefinition([new MockTool({ name: 'take_snapshot' })], 'none');
|
|
2321
2706
|
mockModelResponse([
|
|
2322
2707
|
{
|
|
2323
|
-
name:
|
|
2708
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2324
2709
|
args: { result: 'done' },
|
|
2325
2710
|
id: 'c1',
|
|
2326
2711
|
},
|
|
@@ -2329,7 +2714,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2329
2714
|
await executor.run({ goal: 'Test' }, signal);
|
|
2330
2715
|
const declarations = getSentFunctionDeclarations();
|
|
2331
2716
|
const names = declarations.map((d) => d.name);
|
|
2332
|
-
expect(names).toContain(
|
|
2717
|
+
expect(names).toContain(COMPLETE_TASK_TOOL_NAME);
|
|
2333
2718
|
expect(names).toContain('take_snapshot');
|
|
2334
2719
|
expect(declarations).toHaveLength(2);
|
|
2335
2720
|
});
|
|
@@ -2355,7 +2740,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2355
2740
|
const definition = createInstanceToolDefinition(instanceTools);
|
|
2356
2741
|
mockModelResponse([
|
|
2357
2742
|
{
|
|
2358
|
-
name:
|
|
2743
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2359
2744
|
args: { finalResult: 'done' },
|
|
2360
2745
|
id: 'c1',
|
|
2361
2746
|
},
|
|
@@ -2383,7 +2768,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2383
2768
|
vi.spyOn(mockConfig, 'getSystemInstructionMemory').mockReturnValue(mockMemory);
|
|
2384
2769
|
mockModelResponse([
|
|
2385
2770
|
{
|
|
2386
|
-
name:
|
|
2771
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2387
2772
|
args: { finalResult: 'done' },
|
|
2388
2773
|
id: 'call1',
|
|
2389
2774
|
},
|
|
@@ -2402,7 +2787,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2402
2787
|
vi.spyOn(mockConfig, 'isJitContextEnabled').mockReturnValue(false);
|
|
2403
2788
|
mockModelResponse([
|
|
2404
2789
|
{
|
|
2405
|
-
name:
|
|
2790
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2406
2791
|
args: { finalResult: 'done' },
|
|
2407
2792
|
id: 'call1',
|
|
2408
2793
|
},
|
|
@@ -2423,7 +2808,7 @@ describe('LocalAgentExecutor', () => {
|
|
|
2423
2808
|
vi.spyOn(mockConfig, 'isJitContextEnabled').mockReturnValue(true);
|
|
2424
2809
|
mockModelResponse([
|
|
2425
2810
|
{
|
|
2426
|
-
name:
|
|
2811
|
+
name: COMPLETE_TASK_TOOL_NAME,
|
|
2427
2812
|
args: { finalResult: 'done' },
|
|
2428
2813
|
id: 'call1',
|
|
2429
2814
|
},
|