@machina.ai/cell-cli-core 1.38.1-rc2 → 1.40.1-rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/AFTER_MERGE_PROMPT.md +1 -1
- package/dist/docs/admin/enterprise-controls.md +1 -1
- package/dist/docs/changelogs/index.md +42 -0
- package/dist/docs/changelogs/latest.md +254 -361
- package/dist/docs/changelogs/preview.md +237 -406
- package/dist/docs/cli/acp-mode.md +6 -6
- package/dist/docs/cli/auto-memory.md +143 -0
- package/dist/docs/cli/checkpointing.md +5 -5
- package/dist/docs/cli/cli-reference.md +12 -11
- package/dist/docs/cli/creating-skills.md +2 -2
- package/dist/docs/cli/custom-commands.md +15 -14
- package/dist/docs/cli/enterprise.md +17 -14
- package/dist/docs/cli/gemini-ignore.md +2 -2
- package/dist/docs/cli/generation-settings.md +21 -20
- package/dist/docs/cli/model-routing.md +2 -2
- package/dist/docs/cli/model-steering.md +1 -1
- package/dist/docs/cli/plan-mode.md +11 -6
- package/dist/docs/cli/sandbox.md +7 -5
- package/dist/docs/cli/settings.md +32 -28
- package/dist/docs/cli/system-prompt.md +8 -8
- package/dist/docs/cli/telemetry.md +18 -11
- package/dist/docs/cli/themes.md +2 -2
- package/dist/docs/cli/trusted-folders.md +41 -13
- package/dist/docs/cli/tutorials/mcp-setup.md +1 -1
- package/dist/docs/cli/tutorials/memory-management.md +3 -1
- package/dist/docs/cli/tutorials/plan-mode-steering.md +2 -2
- package/dist/docs/cli/tutorials/session-management.md +1 -1
- package/dist/docs/cli/tutorials/shell-commands.md +1 -1
- package/dist/docs/cli/tutorials/task-planning.md +3 -3
- package/dist/docs/core/index.md +5 -6
- package/dist/docs/core/local-model-routing.md +1 -1
- package/dist/docs/core/remote-agents.md +1 -1
- package/dist/docs/core/subagents.md +38 -8
- package/dist/docs/extensions/best-practices.md +5 -4
- package/dist/docs/extensions/reference.md +6 -5
- package/dist/docs/extensions/releasing.md +6 -5
- package/dist/docs/extensions/writing-extensions.md +11 -11
- package/dist/docs/get-started/{authentication.md → authentication.mdx} +139 -93
- package/dist/docs/get-started/gemini-3.md +1 -1
- package/dist/docs/get-started/index.md +4 -4
- package/dist/docs/get-started/installation.mdx +201 -0
- package/dist/docs/hooks/best-practices.md +18 -17
- package/dist/docs/hooks/index.md +10 -8
- package/dist/docs/hooks/reference.md +10 -10
- package/dist/docs/ide-integration/ide-companion-spec.md +14 -14
- package/dist/docs/ide-integration/index.md +4 -4
- package/dist/docs/index.md +2 -2
- package/dist/docs/integration-tests.md +84 -2
- package/dist/docs/issue-and-pr-automation.md +8 -7
- package/dist/docs/npm.md +2 -2
- package/dist/docs/reference/commands.md +11 -11
- package/dist/docs/reference/configuration.md +150 -47
- package/dist/docs/reference/keyboard-shortcuts.md +79 -2
- package/dist/docs/reference/memport.md +2 -3
- package/dist/docs/reference/policy-engine.md +60 -26
- package/dist/docs/reference/tools.md +38 -4
- package/dist/docs/release-confidence.md +1 -1
- package/dist/docs/releases.md +19 -19
- package/dist/docs/resources/faq.md +5 -5
- package/dist/docs/resources/tos-privacy.md +10 -9
- package/dist/docs/resources/troubleshooting.md +17 -16
- package/dist/docs/resources/uninstall.md +5 -4
- package/dist/docs/sidebar.json +13 -1
- package/dist/docs/tools/ask-user.md +3 -3
- package/dist/docs/tools/file-system.md +7 -7
- package/dist/docs/tools/mcp-resources.md +44 -0
- package/dist/docs/tools/mcp-server.md +42 -39
- package/dist/docs/tools/shell.md +5 -5
- package/dist/docs/tools/tracker.md +61 -0
- package/dist/package.json +5 -4
- package/dist/src/agent/content-utils.d.ts +0 -6
- package/dist/src/agent/content-utils.js +0 -14
- package/dist/src/agent/content-utils.js.map +1 -1
- package/dist/src/agent/content-utils.test.js +1 -18
- package/dist/src/agent/content-utils.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +8 -3
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +14 -9
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.js +9 -3
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +4 -3
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/tool-display-utils.d.ts +30 -0
- package/dist/src/agent/tool-display-utils.js +69 -0
- package/dist/src/agent/tool-display-utils.js.map +1 -0
- package/dist/src/agent/tool-display-utils.test.js +101 -0
- package/dist/src/agent/tool-display-utils.test.js.map +1 -0
- package/dist/src/agent/types.d.ts +25 -5
- package/dist/src/agents/a2aUtils.js +28 -15
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/a2aUtils.test.js +43 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -1
- package/dist/src/agents/agent-tool.d.ts +31 -0
- package/dist/src/agents/agent-tool.js +155 -0
- package/dist/src/agents/agent-tool.js.map +1 -0
- package/dist/src/agents/agent-tool.test.js +110 -0
- package/dist/src/agents/agent-tool.test.js.map +1 -0
- package/dist/src/agents/agentLoader.d.ts +79 -4
- package/dist/src/agents/agentLoader.js +40 -2
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/agentLoader.test.js +32 -0
- package/dist/src/agents/agentLoader.test.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.test.js +19 -7
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +2 -2
- package/dist/src/agents/browser/browserAgentInvocation.js +2 -1
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +61 -17
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.js +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.test.js +22 -10
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
- package/dist/src/agents/codebase-investigator.js +2 -2
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/generalist-agent.js +3 -2
- package/dist/src/agents/generalist-agent.js.map +1 -1
- package/dist/src/agents/generalist-agent.test.js +1 -0
- package/dist/src/agents/generalist-agent.test.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +1 -1
- package/dist/src/agents/local-executor.js +10 -7
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +5 -3
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +2 -2
- package/dist/src/agents/local-invocation.js +8 -2
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +29 -13
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +2 -0
- package/dist/src/agents/registry.js +20 -19
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +19 -30
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +3 -4
- package/dist/src/agents/remote-invocation.js +2 -1
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +45 -18
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.d.ts +3 -2
- package/dist/src/agents/skill-extraction-agent.js +99 -56
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +54 -0
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -0
- package/dist/src/availability/policyCatalog.js +1 -1
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +1 -1
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +14 -4
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/commands/memory.d.ts +77 -0
- package/dist/src/commands/memory.js +494 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/memory.test.js +720 -1
- package/dist/src/commands/memory.test.js.map +1 -1
- package/dist/src/config/config-agents-reload.test.js +26 -31
- package/dist/src/config/config-agents-reload.test.js.map +1 -1
- package/dist/src/config/config.d.ts +24 -10
- package/dist/src/config/config.js +148 -82
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +373 -10
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/constants.d.ts +1 -0
- package/dist/src/config/constants.js +2 -0
- package/dist/src/config/constants.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +7 -7
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/memory.js +1 -1
- package/dist/src/config/memory.js.map +1 -1
- package/dist/src/config/path-validation.test.js +15 -6
- package/dist/src/config/path-validation.test.js.map +1 -1
- package/dist/src/config/projectRegistry.js +113 -32
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/projectRegistry.test.js +51 -0
- package/dist/src/config/projectRegistry.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +5 -1
- package/dist/src/config/storage.js +14 -1
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +12 -0
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +4 -1
- package/dist/src/confirmation-bus/message-bus.js +39 -1
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.test.js +43 -0
- package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
- package/dist/src/context/config/configLoader.d.ts +13 -0
- package/dist/src/context/config/configLoader.js +65 -0
- package/dist/src/context/config/configLoader.js.map +1 -0
- package/dist/src/context/config/configLoader.test.d.ts +6 -0
- package/dist/src/context/config/configLoader.test.js +79 -0
- package/dist/src/context/config/configLoader.test.js.map +1 -0
- package/dist/src/context/config/profiles.d.ts +17 -0
- package/dist/src/context/config/profiles.js +93 -0
- package/dist/src/context/config/profiles.js.map +1 -0
- package/dist/src/context/config/registry.d.ts +21 -0
- package/dist/src/context/config/registry.js +32 -0
- package/dist/src/context/config/registry.js.map +1 -0
- package/dist/src/context/config/schema.d.ts +45 -0
- package/dist/src/context/config/schema.js +47 -0
- package/dist/src/context/config/schema.js.map +1 -0
- package/dist/src/context/config/types.d.ts +39 -0
- package/dist/src/context/config/types.js +7 -0
- package/dist/src/context/config/types.js.map +1 -0
- package/dist/src/context/contextManager.barrier.test.d.ts +6 -0
- package/dist/src/context/contextManager.barrier.test.js +56 -0
- package/dist/src/context/contextManager.barrier.test.js.map +1 -0
- package/dist/src/context/contextManager.d.ts +49 -0
- package/dist/src/context/contextManager.js +120 -0
- package/dist/src/context/contextManager.js.map +1 -0
- package/dist/src/context/eventBus.d.ts +28 -0
- package/dist/src/context/eventBus.js +27 -0
- package/dist/src/context/eventBus.js.map +1 -0
- package/dist/src/context/graph/behaviorRegistry.d.ts +28 -0
- package/dist/src/context/graph/behaviorRegistry.js +14 -0
- package/dist/src/context/graph/behaviorRegistry.js.map +1 -0
- package/dist/src/context/graph/builtinBehaviors.d.ts +11 -0
- package/dist/src/context/graph/builtinBehaviors.js +145 -0
- package/dist/src/context/graph/builtinBehaviors.js.map +1 -0
- package/dist/src/context/graph/fromGraph.d.ts +9 -0
- package/dist/src/context/graph/fromGraph.js +34 -0
- package/dist/src/context/graph/fromGraph.js.map +1 -0
- package/dist/src/context/graph/mapper.d.ts +16 -0
- package/dist/src/context/graph/mapper.js +16 -0
- package/dist/src/context/graph/mapper.js.map +1 -0
- package/dist/src/context/graph/render.d.ts +15 -0
- package/dist/src/context/graph/render.js +72 -0
- package/dist/src/context/graph/render.js.map +1 -0
- package/dist/src/context/graph/toGraph.d.ts +10 -0
- package/dist/src/context/graph/toGraph.js +172 -0
- package/dist/src/context/graph/toGraph.js.map +1 -0
- package/dist/src/context/graph/types.d.ts +139 -0
- package/dist/src/context/graph/types.js +36 -0
- package/dist/src/context/graph/types.js.map +1 -0
- package/dist/src/context/historyObserver.d.ts +27 -0
- package/dist/src/context/historyObserver.js +64 -0
- package/dist/src/context/historyObserver.js.map +1 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +33 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.js +197 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.test.d.ts +6 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +89 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -0
- package/dist/src/context/pipeline/environment.d.ts +27 -0
- package/dist/src/context/pipeline/environment.js +2 -0
- package/dist/src/context/pipeline/environment.js.map +1 -0
- package/dist/src/context/pipeline/environmentImpl.d.ts +28 -0
- package/dist/src/context/pipeline/environmentImpl.js +40 -0
- package/dist/src/context/pipeline/environmentImpl.js.map +1 -0
- package/dist/src/context/pipeline/environmentImpl.test.d.ts +1 -0
- package/dist/src/context/pipeline/environmentImpl.test.js +32 -0
- package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -0
- package/dist/src/context/pipeline/inbox.d.ts +15 -0
- package/dist/src/context/pipeline/inbox.js +52 -0
- package/dist/src/context/pipeline/inbox.js.map +1 -0
- package/dist/src/context/pipeline/inbox.test.d.ts +1 -0
- package/dist/src/context/pipeline/inbox.test.js +36 -0
- package/dist/src/context/pipeline/inbox.test.js.map +1 -0
- package/dist/src/context/pipeline/orchestrator.d.ts +22 -0
- package/dist/src/context/pipeline/orchestrator.js +126 -0
- package/dist/src/context/pipeline/orchestrator.js.map +1 -0
- package/dist/src/context/pipeline/orchestrator.test.d.ts +6 -0
- package/dist/src/context/pipeline/orchestrator.test.js +154 -0
- package/dist/src/context/pipeline/orchestrator.test.js.map +1 -0
- package/dist/src/context/pipeline.d.ts +52 -0
- package/dist/src/context/pipeline.js +7 -0
- package/dist/src/context/pipeline.js.map +1 -0
- package/dist/src/context/processors/blobDegradationProcessor.d.ts +6 -0
- package/dist/src/context/processors/blobDegradationProcessor.js +127 -0
- package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -0
- package/dist/src/context/processors/blobDegradationProcessor.test.d.ts +6 -0
- package/dist/src/context/processors/blobDegradationProcessor.test.js +72 -0
- package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -0
- package/dist/src/context/processors/historyTruncationProcessor.d.ts +11 -0
- package/dist/src/context/processors/historyTruncationProcessor.js +61 -0
- package/dist/src/context/processors/historyTruncationProcessor.js.map +1 -0
- package/dist/src/context/processors/nodeDistillationProcessor.d.ts +8 -0
- package/dist/src/context/processors/nodeDistillationProcessor.js +167 -0
- package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -0
- package/dist/src/context/processors/nodeDistillationProcessor.test.d.ts +6 -0
- package/dist/src/context/processors/nodeDistillationProcessor.test.js +77 -0
- package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -0
- package/dist/src/context/processors/nodeTruncationProcessor.d.ts +8 -0
- package/dist/src/context/processors/nodeTruncationProcessor.js +109 -0
- package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -0
- package/dist/src/context/processors/nodeTruncationProcessor.test.d.ts +6 -0
- package/dist/src/context/processors/nodeTruncationProcessor.test.js +71 -0
- package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -0
- package/dist/src/context/processors/rollingSummaryProcessor.d.ts +8 -0
- package/dist/src/context/processors/rollingSummaryProcessor.js +129 -0
- package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -0
- package/dist/src/context/processors/rollingSummaryProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/rollingSummaryProcessor.test.js +60 -0
- package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +9 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +75 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +80 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotProcessor.d.ts +9 -0
- package/dist/src/context/processors/stateSnapshotProcessor.js +130 -0
- package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/stateSnapshotProcessor.test.js +91 -0
- package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -0
- package/dist/src/context/processors/toolMaskingProcessor.d.ts +8 -0
- package/dist/src/context/processors/toolMaskingProcessor.js +194 -0
- package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.d.ts +6 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js +195 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -0
- package/dist/src/context/system-tests/simulationHarness.d.ts +41 -0
- package/dist/src/context/system-tests/simulationHarness.js +88 -0
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -0
- package/dist/src/context/testing/contextTestUtils.d.ts +44 -0
- package/dist/src/context/testing/contextTestUtils.js +176 -0
- package/dist/src/context/testing/contextTestUtils.js.map +1 -0
- package/dist/src/context/testing/testProfile.d.ts +7 -0
- package/dist/src/context/testing/testProfile.js +20 -0
- package/dist/src/context/testing/testProfile.js.map +1 -0
- package/dist/src/context/tracer.d.ts +19 -0
- package/dist/src/context/tracer.js +79 -0
- package/dist/src/context/tracer.js.map +1 -0
- package/dist/src/context/tracer.test.d.ts +6 -0
- package/dist/src/context/tracer.test.js +71 -0
- package/dist/src/context/tracer.test.js.map +1 -0
- package/dist/src/context/utils/contextTokenCalculator.d.ts +53 -0
- package/dist/src/context/utils/contextTokenCalculator.js +97 -0
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -0
- package/dist/src/context/utils/snapshotGenerator.d.ts +12 -0
- package/dist/src/context/utils/snapshotGenerator.js +43 -0
- package/dist/src/context/utils/snapshotGenerator.js.map +1 -0
- package/dist/src/core/agentChatHistory.d.ts +26 -0
- package/dist/src/core/agentChatHistory.js +50 -0
- package/dist/src/core/agentChatHistory.js.map +1 -0
- package/dist/src/core/client.js +3 -1
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +4 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +8 -1
- package/dist/src/core/contentGenerator.js +46 -4
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +174 -8
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.d.ts +1 -1
- package/dist/src/core/coreToolHookTriggers.js +5 -1
- package/dist/src/core/coreToolHookTriggers.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +2 -1
- package/dist/src/core/geminiChat.js +7 -2
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +19 -6
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +42 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.js +2 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.test.js +7 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +19 -6
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +55 -0
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/prompts-substitution.test.js +1 -0
- package/dist/src/core/prompts-substitution.test.js.map +1 -1
- package/dist/src/core/prompts.d.ts +1 -1
- package/dist/src/core/prompts.js +2 -2
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +39 -8
- 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/hookRunner.js +8 -0
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +23 -0
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/ide/ide-client.js +3 -4
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +7 -3
- package/dist/src/index.js +7 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/mcpLauncher.js +1 -1
- package/dist/src/mcp/mcpLauncher.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +24 -17
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/policy/config.d.ts +2 -0
- package/dist/src/policy/config.js +67 -12
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/core-tools-mapping.test.d.ts +6 -0
- package/dist/src/policy/core-tools-mapping.test.js +44 -0
- package/dist/src/policy/core-tools-mapping.test.js.map +1 -0
- package/dist/src/policy/policies/agents.toml +10 -0
- package/dist/src/policy/policies/plan.toml +17 -43
- package/dist/src/policy/policies/read-only.toml +24 -38
- package/dist/src/policy/policy-engine.d.ts +1 -1
- package/dist/src/policy/policy-engine.js +72 -67
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +71 -4
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.js +4 -4
- package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
- package/dist/src/policy/shell-safety-regression.test.d.ts +6 -0
- package/dist/src/policy/shell-safety-regression.test.js +86 -0
- package/dist/src/policy/shell-safety-regression.test.js.map +1 -0
- package/dist/src/policy/shell-safety.test.js +24 -0
- package/dist/src/policy/shell-safety.test.js.map +1 -1
- package/dist/src/policy/shell-substitution.test.d.ts +6 -0
- package/dist/src/policy/shell-substitution.test.js +75 -0
- package/dist/src/policy/shell-substitution.test.js.map +1 -0
- package/dist/src/policy/toml-loader.test.js +25 -11
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +6 -2
- package/dist/src/policy/types.js +4 -2
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/promptProvider.d.ts +1 -1
- package/dist/src/prompts/promptProvider.js +41 -24
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +36 -2
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory-v2.test.d.ts +6 -0
- package/dist/src/prompts/snippets-memory-v2.test.js +94 -0
- package/dist/src/prompts/snippets-memory-v2.test.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +19 -1
- package/dist/src/prompts/snippets.js +33 -6
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +6 -1
- package/dist/src/prompts/snippets.legacy.js +14 -7
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/prompts/utils.test.js +1 -0
- package/dist/src/prompts/utils.test.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +1 -1
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +2 -0
- package/dist/src/sandbox/linux/LinuxSandboxManager.js +43 -19
- package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +16 -0
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +3 -7
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js +96 -105
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +144 -41
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +19 -10
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +24 -37
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +3 -9
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +129 -96
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +78 -77
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/utils/fsUtils.d.ts +2 -3
- package/dist/src/sandbox/utils/fsUtils.js +12 -27
- package/dist/src/sandbox/utils/fsUtils.js.map +1 -1
- package/dist/src/sandbox/utils/fsUtils.test.js +87 -29
- package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -1
- package/dist/src/sandbox/windows/GeminiSandbox.cs +186 -77
- package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +4 -16
- package/dist/src/sandbox/windows/WindowsSandboxManager.js +138 -204
- package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +105 -122
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
- package/dist/src/scheduler/policy.js +1 -2
- package/dist/src/scheduler/policy.js.map +1 -1
- package/dist/src/scheduler/policy.test.js +58 -2
- package/dist/src/scheduler/policy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.d.ts +2 -1
- package/dist/src/scheduler/scheduler.js +13 -14
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +66 -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/scheduler_parallel.test.js +2 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +2 -0
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +12 -153
- package/dist/src/services/chatRecordingService.js +444 -350
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +174 -128
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/chatRecordingTypes.d.ts +111 -0
- package/dist/src/services/chatRecordingTypes.js +10 -0
- package/dist/src/services/chatRecordingTypes.js.map +1 -0
- package/dist/src/services/gitService.d.ts +2 -0
- package/dist/src/services/gitService.js +10 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +6 -2
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/keychainService.d.ts +2 -2
- package/dist/src/services/keychainService.js +9 -9
- package/dist/src/services/keychainService.js.map +1 -1
- package/dist/src/services/keychainService.test.js +7 -7
- package/dist/src/services/keychainService.test.js.map +1 -1
- package/dist/src/services/keychainTypes.d.ts +1 -1
- package/dist/src/services/memoryPatchUtils.d.ts +42 -0
- package/dist/src/services/memoryPatchUtils.js +216 -0
- package/dist/src/services/memoryPatchUtils.js.map +1 -0
- package/dist/src/services/memoryService.d.ts +21 -1
- package/dist/src/services/memoryService.js +405 -64
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +686 -2
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/sandboxManager.d.ts +33 -19
- package/dist/src/services/sandboxManager.integration.test.js +728 -266
- package/dist/src/services/sandboxManager.integration.test.js.map +1 -1
- package/dist/src/services/sandboxManager.js +65 -62
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +17 -114
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.js +72 -62
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.d.ts +1 -1
- package/dist/src/services/sessionSummaryUtils.js +111 -38
- package/dist/src/services/sessionSummaryUtils.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.test.js +204 -51
- package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +19 -0
- package/dist/src/services/shellExecutionService.js +88 -34
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +38 -4
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/activity-monitor.js +1 -0
- package/dist/src/telemetry/activity-monitor.js.map +1 -1
- package/dist/src/telemetry/config.js +3 -0
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/conseca-logger.js +18 -20
- package/dist/src/telemetry/conseca-logger.js.map +1 -1
- package/dist/src/telemetry/conseca-logger.test.js +100 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -1
- package/dist/src/telemetry/event-loop-monitor.d.ts +17 -0
- package/dist/src/telemetry/event-loop-monitor.js +76 -0
- package/dist/src/telemetry/event-loop-monitor.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.js +2 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/llmRole.d.ts +2 -1
- package/dist/src/telemetry/llmRole.js +1 -0
- package/dist/src/telemetry/llmRole.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +184 -8
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.d.ts +1 -0
- package/dist/src/telemetry/memory-monitor.js +8 -1
- package/dist/src/telemetry/memory-monitor.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.test.js +6 -1
- package/dist/src/telemetry/memory-monitor.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +12 -0
- package/dist/src/telemetry/metrics.js +19 -0
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/sdk.js +20 -1
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/trace.d.ts +23 -6
- package/dist/src/telemetry/trace.js +71 -22
- package/dist/src/telemetry/trace.js.map +1 -1
- package/dist/src/telemetry/trace.test.js +79 -15
- package/dist/src/telemetry/trace.test.js.map +1 -1
- package/dist/src/telemetry/types.js +61 -15
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +3 -2
- package/dist/src/test-utils/mock-tool.js +4 -3
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/activate-skill.js +1 -1
- package/dist/src/tools/activate-skill.js.map +1 -1
- package/dist/src/tools/activate-skill.test.js +6 -2
- package/dist/src/tools/activate-skill.test.js.map +1 -1
- package/dist/src/tools/ask-user.d.ts +2 -2
- package/dist/src/tools/ask-user.js +1 -1
- package/dist/src/tools/ask-user.js.map +1 -1
- package/dist/src/tools/ask-user.test.js +9 -3
- package/dist/src/tools/ask-user.test.js.map +1 -1
- package/dist/src/tools/complete-task.d.ts +2 -2
- package/dist/src/tools/complete-task.js +1 -1
- package/dist/src/tools/complete-task.js.map +1 -1
- package/dist/src/tools/complete-task.test.js +9 -3
- package/dist/src/tools/complete-task.test.js.map +1 -1
- package/dist/src/tools/definitions/base-declarations.d.ts +2 -0
- package/dist/src/tools/definitions/base-declarations.js +3 -0
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +3 -1
- package/dist/src/tools/definitions/coreTools.js +13 -1
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +29 -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 +29 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/definitions/types.d.ts +2 -0
- package/dist/src/tools/edit.js +20 -4
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +41 -18
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/enter-plan-mode.d.ts +2 -2
- package/dist/src/tools/enter-plan-mode.js +1 -1
- package/dist/src/tools/enter-plan-mode.js.map +1 -1
- package/dist/src/tools/enter-plan-mode.test.js +10 -4
- package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.d.ts +2 -2
- package/dist/src/tools/exit-plan-mode.js +9 -12
- package/dist/src/tools/exit-plan-mode.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.test.js +44 -17
- package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
- package/dist/src/tools/get-internal-docs.js +6 -3
- package/dist/src/tools/get-internal-docs.js.map +1 -1
- package/dist/src/tools/get-internal-docs.test.js +4 -4
- package/dist/src/tools/get-internal-docs.test.js.map +1 -1
- package/dist/src/tools/glob.js +1 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +16 -16
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.js +21 -12
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +18 -18
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/line-endings.test.js +3 -3
- package/dist/src/tools/line-endings.test.js.map +1 -1
- package/dist/src/tools/list-mcp-resources.d.ts +24 -0
- package/dist/src/tools/list-mcp-resources.js +74 -0
- package/dist/src/tools/list-mcp-resources.js.map +1 -0
- package/dist/src/tools/list-mcp-resources.test.d.ts +6 -0
- package/dist/src/tools/list-mcp-resources.test.js +79 -0
- package/dist/src/tools/list-mcp-resources.test.js.map +1 -0
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +21 -21
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +3 -1
- package/dist/src/tools/mcp-client-manager.js +24 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +43 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +10 -12
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +14 -2
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +2 -2
- package/dist/src/tools/mcp-tool.js +1 -1
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +51 -21
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +4 -3
- package/dist/src/tools/memoryTool.js +43 -14
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +29 -9
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +1 -1
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +17 -17
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +4 -4
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +70 -24
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/read-mcp-resource.d.ts +25 -0
- package/dist/src/tools/read-mcp-resource.js +120 -0
- package/dist/src/tools/read-mcp-resource.js.map +1 -0
- package/dist/src/tools/read-mcp-resource.test.d.ts +6 -0
- package/dist/src/tools/read-mcp-resource.test.js +110 -0
- package/dist/src/tools/read-mcp-resource.test.js.map +1 -0
- package/dist/src/tools/ripGrep.d.ts +3 -2
- package/dist/src/tools/ripGrep.js +26 -55
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +113 -167
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +2 -2
- package/dist/src/tools/shell.js +51 -21
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +479 -76
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.d.ts +3 -3
- package/dist/src/tools/shellBackgroundTools.integration.test.js +6 -2
- package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.js +2 -2
- package/dist/src/tools/shellBackgroundTools.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.test.js +30 -10
- package/dist/src/tools/shellBackgroundTools.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +5 -4
- package/dist/src/tools/tool-names.js +8 -2
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.js +137 -114
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +3 -1
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +6 -6
- package/dist/src/tools/tools.js +6 -2
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/topicTool.d.ts +2 -2
- package/dist/src/tools/topicTool.js +1 -1
- package/dist/src/tools/topicTool.js.map +1 -1
- package/dist/src/tools/topicTool.test.js +6 -2
- package/dist/src/tools/topicTool.test.js.map +1 -1
- package/dist/src/tools/trackerTools.d.ts +7 -7
- package/dist/src/tools/trackerTools.js +6 -6
- package/dist/src/tools/trackerTools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +1 -1
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +59 -23
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.js +1 -1
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +5 -5
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.js +22 -4
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +29 -11
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.js +1 -1
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/utils/compatibility.js +6 -1
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +23 -0
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +6 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +1 -2
- package/dist/src/utils/fileUtils.js +80 -40
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +61 -0
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
- package/dist/src/utils/filesearch/fileSearch.js +97 -6
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +54 -0
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileWatcher.d.ts +25 -0
- package/dist/src/utils/filesearch/fileWatcher.js +86 -0
- package/dist/src/utils/filesearch/fileWatcher.js.map +1 -0
- package/dist/src/utils/filesearch/fileWatcher.test.js +142 -0
- package/dist/src/utils/filesearch/fileWatcher.test.js.map +1 -0
- package/dist/src/utils/getFolderStructure.js +4 -2
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +1 -1
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
- package/dist/src/utils/googleQuotaErrors.js +30 -35
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.test.js +24 -0
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.js +1 -1
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +15 -5
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/oauth-flow.js +17 -5
- package/dist/src/utils/oauth-flow.js.map +1 -1
- package/dist/src/utils/oauth-flow.test.js +20 -0
- package/dist/src/utils/oauth-flow.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +9 -0
- package/dist/src/utils/paths.js +37 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +45 -1
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/planUtils.d.ts +11 -2
- package/dist/src/utils/planUtils.js +43 -11
- package/dist/src/utils/planUtils.js.map +1 -1
- package/dist/src/utils/planUtils.test.js +10 -9
- package/dist/src/utils/planUtils.test.js.map +1 -1
- package/dist/src/utils/process-utils.d.ts +2 -1
- package/dist/src/utils/process-utils.js +64 -33
- package/dist/src/utils/process-utils.js.map +1 -1
- package/dist/src/utils/process-utils.test.js +9 -0
- package/dist/src/utils/process-utils.test.js.map +1 -1
- package/dist/src/utils/retry.js +18 -6
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +30 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/sessionOperations.js +3 -2
- package/dist/src/utils/sessionOperations.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +2 -0
- package/dist/src/utils/shell-utils.js +237 -107
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +1 -29
- package/dist/src/utils/tool-utils.js +0 -39
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +2 -76
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/src/utils/tool-visibility.d.ts +40 -0
- package/dist/src/utils/tool-visibility.js +111 -0
- package/dist/src/utils/tool-visibility.js.map +1 -0
- package/dist/src/utils/tool-visibility.test.d.ts +6 -0
- package/dist/src/utils/tool-visibility.test.js +96 -0
- package/dist/src/utils/tool-visibility.test.js.map +1 -0
- package/dist/src/utils/trust.d.ts +64 -0
- package/dist/src/utils/trust.js +276 -0
- package/dist/src/utils/trust.js.map +1 -0
- package/dist/src/utils/trust.test.d.ts +6 -0
- package/dist/src/utils/trust.test.js +159 -0
- package/dist/src/utils/trust.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/dist/docs/get-started/installation.md +0 -181
- package/dist/src/agents/memory-manager-agent.d.ts +0 -25
- package/dist/src/agents/memory-manager-agent.js +0 -138
- package/dist/src/agents/memory-manager-agent.js.map +0 -1
- package/dist/src/agents/memory-manager-agent.test.js +0 -123
- package/dist/src/agents/memory-manager-agent.test.js.map +0 -1
- package/dist/src/agents/subagent-tool-wrapper.d.ts +0 -38
- package/dist/src/agents/subagent-tool-wrapper.js +0 -58
- package/dist/src/agents/subagent-tool-wrapper.js.map +0 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +0 -123
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +0 -1
- package/dist/src/agents/subagent-tool.d.ts +0 -18
- package/dist/src/agents/subagent-tool.js +0 -134
- package/dist/src/agents/subagent-tool.js.map +0 -1
- package/dist/src/agents/subagent-tool.test.js +0 -287
- package/dist/src/agents/subagent-tool.test.js.map +0 -1
- package/dist/src/policy/policies/tracker.toml +0 -34
- package/dist/src/prompts/snippets-memory-manager.test.js +0 -31
- package/dist/src/prompts/snippets-memory-manager.test.js.map +0 -1
- /package/dist/src/{agents/memory-manager-agent.test.d.ts → agent/tool-display-utils.test.d.ts} +0 -0
- /package/dist/src/agents/{subagent-tool.test.d.ts → agent-tool.test.d.ts} +0 -0
- /package/dist/src/{prompts/snippets-memory-manager.test.d.ts → agents/skill-extraction-agent.test.d.ts} +0 -0
- /package/dist/src/{agents/subagent-tool-wrapper.test.d.ts → utils/filesearch/fileWatcher.test.d.ts} +0 -0
|
@@ -61,6 +61,7 @@ describe('ShellTool', () => {
|
|
|
61
61
|
let mockShellOutputCallback;
|
|
62
62
|
let resolveExecutionPromise;
|
|
63
63
|
let tempRootDir;
|
|
64
|
+
let extractedTmpFile;
|
|
64
65
|
beforeEach(() => {
|
|
65
66
|
vi.clearAllMocks();
|
|
66
67
|
tempRootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'shell-test-'));
|
|
@@ -146,9 +147,14 @@ describe('ShellTool', () => {
|
|
|
146
147
|
vi.mocked(crypto.randomBytes).mockReturnValue(Buffer.from('abcdef', 'hex'));
|
|
147
148
|
process.env['ComSpec'] =
|
|
148
149
|
'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe';
|
|
150
|
+
extractedTmpFile = '';
|
|
149
151
|
// Capture the output callback to simulate streaming events from the service
|
|
150
|
-
mockShellExecutionService.mockImplementation((
|
|
152
|
+
mockShellExecutionService.mockImplementation((cmd, _cwd, callback) => {
|
|
151
153
|
mockShellOutputCallback = callback;
|
|
154
|
+
const match = cmd.match(/pgrep -g 0 >([^ ]+)/);
|
|
155
|
+
if (match) {
|
|
156
|
+
extractedTmpFile = match[1].replace(/['"]/g, '');
|
|
157
|
+
}
|
|
152
158
|
return {
|
|
153
159
|
pid: 12345,
|
|
154
160
|
result: new Promise((resolve) => {
|
|
@@ -226,39 +232,33 @@ describe('ShellTool', () => {
|
|
|
226
232
|
};
|
|
227
233
|
it('should wrap command on linux and parse pgrep output', async () => {
|
|
228
234
|
const invocation = shellTool.build({ command: 'my-command &' });
|
|
229
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
230
|
-
resolveShellExecution({ pid: 54321 });
|
|
235
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
231
236
|
// Simulate pgrep output file creation by the shell command
|
|
232
|
-
|
|
233
|
-
|
|
237
|
+
fs.writeFileSync(extractedTmpFile, `54321${os.EOL}54322${os.EOL}`);
|
|
238
|
+
resolveShellExecution({ pid: 54321 });
|
|
234
239
|
const result = await promise;
|
|
235
|
-
|
|
236
|
-
expect(mockShellExecutionService).toHaveBeenCalledWith(wrappedCommand, tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.objectContaining({
|
|
240
|
+
expect(mockShellExecutionService).toHaveBeenCalledWith(expect.stringMatching(/pgrep -g 0 >.*gemini-shell-.*[/\\]pgrep\.tmp/), tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.objectContaining({
|
|
237
241
|
pager: 'cat',
|
|
238
242
|
sanitizationConfig: {},
|
|
239
243
|
sandboxManager: expect.any(Object),
|
|
240
244
|
}));
|
|
241
245
|
expect(result.llmContent).toContain('Background PIDs: 54322');
|
|
242
246
|
// The file should be deleted by the tool
|
|
243
|
-
expect(fs.existsSync(
|
|
247
|
+
expect(fs.existsSync(extractedTmpFile)).toBe(false);
|
|
244
248
|
});
|
|
245
249
|
it('should add a space when command ends with a backslash to prevent escaping newline', async () => {
|
|
246
250
|
const invocation = shellTool.build({ command: 'ls\\' });
|
|
247
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
251
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
248
252
|
resolveShellExecution();
|
|
249
253
|
await promise;
|
|
250
|
-
|
|
251
|
-
const wrappedCommand = `(\nls\\ \n); __code=$?; pgrep -g 0 >${tmpFile} 2>&1; exit $__code;`;
|
|
252
|
-
expect(mockShellExecutionService).toHaveBeenCalledWith(wrappedCommand, tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.any(Object));
|
|
254
|
+
expect(mockShellExecutionService).toHaveBeenCalledWith(expect.stringMatching(/pgrep -g 0 >.*gemini-shell-.*[/\\]pgrep\.tmp/), tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.any(Object));
|
|
253
255
|
});
|
|
254
256
|
it('should handle trailing comments correctly by placing them on their own line', async () => {
|
|
255
257
|
const invocation = shellTool.build({ command: 'ls # comment' });
|
|
256
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
258
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
257
259
|
resolveShellExecution();
|
|
258
260
|
await promise;
|
|
259
|
-
|
|
260
|
-
const wrappedCommand = `(\nls # comment\n); __code=$?; pgrep -g 0 >${tmpFile} 2>&1; exit $__code;`;
|
|
261
|
-
expect(mockShellExecutionService).toHaveBeenCalledWith(wrappedCommand, tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.any(Object));
|
|
261
|
+
expect(mockShellExecutionService).toHaveBeenCalledWith(expect.stringMatching(/pgrep -g 0 >.*gemini-shell-.*[/\\]pgrep\.tmp/), tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.any(Object));
|
|
262
262
|
});
|
|
263
263
|
it('should use the provided absolute directory as cwd', async () => {
|
|
264
264
|
const subdir = path.join(tempRootDir, 'subdir');
|
|
@@ -266,12 +266,10 @@ describe('ShellTool', () => {
|
|
|
266
266
|
command: 'ls',
|
|
267
267
|
dir_path: subdir,
|
|
268
268
|
});
|
|
269
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
269
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
270
270
|
resolveShellExecution();
|
|
271
271
|
await promise;
|
|
272
|
-
|
|
273
|
-
const wrappedCommand = `(\n${'ls'}\n); __code=$?; pgrep -g 0 >${tmpFile} 2>&1; exit $__code;`;
|
|
274
|
-
expect(mockShellExecutionService).toHaveBeenCalledWith(wrappedCommand, subdir, expect.any(Function), expect.any(AbortSignal), false, expect.objectContaining({
|
|
272
|
+
expect(mockShellExecutionService).toHaveBeenCalledWith(expect.stringMatching(/pgrep -g 0 >.*gemini-shell-.*[/\\]pgrep\.tmp/), subdir, expect.any(Function), expect.any(AbortSignal), false, expect.objectContaining({
|
|
275
273
|
pager: 'cat',
|
|
276
274
|
sanitizationConfig: {},
|
|
277
275
|
sandboxManager: expect.any(Object),
|
|
@@ -282,12 +280,10 @@ describe('ShellTool', () => {
|
|
|
282
280
|
command: 'ls',
|
|
283
281
|
dir_path: 'subdir',
|
|
284
282
|
});
|
|
285
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
283
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
286
284
|
resolveShellExecution();
|
|
287
285
|
await promise;
|
|
288
|
-
|
|
289
|
-
const wrappedCommand = `(\n${'ls'}\n); __code=$?; pgrep -g 0 >${tmpFile} 2>&1; exit $__code;`;
|
|
290
|
-
expect(mockShellExecutionService).toHaveBeenCalledWith(wrappedCommand, path.join(tempRootDir, 'subdir'), expect.any(Function), expect.any(AbortSignal), false, expect.objectContaining({
|
|
286
|
+
expect(mockShellExecutionService).toHaveBeenCalledWith(expect.stringMatching(/pgrep -g 0 >.*gemini-shell-.*[/\\]pgrep\.tmp/), path.join(tempRootDir, 'subdir'), expect.any(Function), expect.any(AbortSignal), false, expect.objectContaining({
|
|
291
287
|
pager: 'cat',
|
|
292
288
|
sanitizationConfig: {},
|
|
293
289
|
sandboxManager: expect.any(Object),
|
|
@@ -299,7 +295,7 @@ describe('ShellTool', () => {
|
|
|
299
295
|
command: 'sleep 10',
|
|
300
296
|
is_background: true,
|
|
301
297
|
});
|
|
302
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
298
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
303
299
|
// We need to provide a PID for the background logic to trigger
|
|
304
300
|
resolveShellExecution({ pid: 12345 });
|
|
305
301
|
// Advance time to trigger the background timeout
|
|
@@ -310,7 +306,7 @@ describe('ShellTool', () => {
|
|
|
310
306
|
itWindowsOnly('should not wrap command on windows', async () => {
|
|
311
307
|
mockPlatform.mockReturnValue('win32');
|
|
312
308
|
const invocation = shellTool.build({ command: 'dir' });
|
|
313
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
309
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
314
310
|
resolveShellExecution({
|
|
315
311
|
rawOutput: Buffer.from(''),
|
|
316
312
|
output: '',
|
|
@@ -328,10 +324,21 @@ describe('ShellTool', () => {
|
|
|
328
324
|
sandboxManager: expect.any(NoopSandboxManager),
|
|
329
325
|
}));
|
|
330
326
|
}, 20000);
|
|
327
|
+
it('should correctly wrap heredoc commands', async () => {
|
|
328
|
+
const command = `cat << 'EOF'
|
|
329
|
+
hello world
|
|
330
|
+
EOF`;
|
|
331
|
+
const invocation = shellTool.build({ command });
|
|
332
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
333
|
+
resolveShellExecution();
|
|
334
|
+
await promise;
|
|
335
|
+
expect(mockShellExecutionService).toHaveBeenCalledWith(expect.stringMatching(/pgrep -g 0 >.*gemini-shell-.*[/\\]pgrep\.tmp/), tempRootDir, expect.any(Function), expect.any(AbortSignal), false, expect.any(Object));
|
|
336
|
+
expect(mockShellExecutionService.mock.calls[0][0]).toMatch(/\nEOF\n\)\n/);
|
|
337
|
+
});
|
|
331
338
|
it('should format error messages correctly', async () => {
|
|
332
339
|
const error = new Error('wrapped command failed');
|
|
333
340
|
const invocation = shellTool.build({ command: 'user-command' });
|
|
334
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
341
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
335
342
|
resolveShellExecution({
|
|
336
343
|
error,
|
|
337
344
|
exitCode: 1,
|
|
@@ -349,7 +356,7 @@ describe('ShellTool', () => {
|
|
|
349
356
|
it('should return a SHELL_EXECUTE_ERROR for a command failure', async () => {
|
|
350
357
|
const error = new Error('command failed');
|
|
351
358
|
const invocation = shellTool.build({ command: 'user-command' });
|
|
352
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
359
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
353
360
|
resolveShellExecution({
|
|
354
361
|
error,
|
|
355
362
|
exitCode: 1,
|
|
@@ -368,7 +375,7 @@ describe('ShellTool', () => {
|
|
|
368
375
|
});
|
|
369
376
|
vi.mocked(summarizer.summarizeToolOutput).mockResolvedValue('summarized output');
|
|
370
377
|
const invocation = shellTool.build({ command: 'ls' });
|
|
371
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
378
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
372
379
|
resolveExecutionPromise({
|
|
373
380
|
output: 'long output',
|
|
374
381
|
rawOutput: Buffer.from('long output'),
|
|
@@ -389,7 +396,7 @@ describe('ShellTool', () => {
|
|
|
389
396
|
mockConfig.getShellToolInactivityTimeout.mockReturnValue(0);
|
|
390
397
|
vi.useFakeTimers();
|
|
391
398
|
const invocation = shellTool.build({ command: 'sleep 10' });
|
|
392
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
399
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
393
400
|
// Verify no timeout logic is triggered even after a long time
|
|
394
401
|
resolveShellExecution({
|
|
395
402
|
output: 'finished',
|
|
@@ -403,16 +410,18 @@ describe('ShellTool', () => {
|
|
|
403
410
|
});
|
|
404
411
|
it('should clean up the temp file on synchronous execution error', async () => {
|
|
405
412
|
const error = new Error('sync spawn error');
|
|
406
|
-
mockShellExecutionService.mockImplementation(() => {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
413
|
+
mockShellExecutionService.mockImplementation((cmd) => {
|
|
414
|
+
const match = cmd.match(/pgrep -g 0 >([^ ]+)/);
|
|
415
|
+
if (match) {
|
|
416
|
+
extractedTmpFile = match[1].replace(/['"]/g, ''); // remove any quotes if present
|
|
417
|
+
// Create the temp file before throwing to simulate it being left behind
|
|
418
|
+
fs.writeFileSync(extractedTmpFile, '');
|
|
419
|
+
}
|
|
410
420
|
throw error;
|
|
411
421
|
});
|
|
412
422
|
const invocation = shellTool.build({ command: 'a-command' });
|
|
413
|
-
await expect(invocation.execute(mockAbortSignal)).rejects.toThrow(error);
|
|
414
|
-
|
|
415
|
-
expect(fs.existsSync(tmpFile)).toBe(false);
|
|
423
|
+
await expect(invocation.execute({ abortSignal: mockAbortSignal })).rejects.toThrow(error);
|
|
424
|
+
expect(fs.existsSync(extractedTmpFile)).toBe(false);
|
|
416
425
|
});
|
|
417
426
|
it('should not log "missing pgrep output" when process is backgrounded', async () => {
|
|
418
427
|
vi.useFakeTimers();
|
|
@@ -421,7 +430,7 @@ describe('ShellTool', () => {
|
|
|
421
430
|
command: 'sleep 10',
|
|
422
431
|
is_background: true,
|
|
423
432
|
});
|
|
424
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
433
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
425
434
|
// Advance time to trigger backgrounding
|
|
426
435
|
await vi.advanceTimersByTimeAsync(200);
|
|
427
436
|
await promise;
|
|
@@ -438,7 +447,10 @@ describe('ShellTool', () => {
|
|
|
438
447
|
});
|
|
439
448
|
it('should immediately show binary detection message and throttle progress', async () => {
|
|
440
449
|
const invocation = shellTool.build({ command: 'cat img' });
|
|
441
|
-
const promise = invocation.execute(
|
|
450
|
+
const promise = invocation.execute({
|
|
451
|
+
abortSignal: mockAbortSignal,
|
|
452
|
+
updateOutput: updateOutputMock,
|
|
453
|
+
});
|
|
442
454
|
mockShellOutputCallback({ type: 'binary_detected' });
|
|
443
455
|
expect(updateOutputMock).toHaveBeenCalledOnce();
|
|
444
456
|
expect(updateOutputMock).toHaveBeenCalledWith('[Binary output detected. Halting stream...]');
|
|
@@ -474,7 +486,10 @@ describe('ShellTool', () => {
|
|
|
474
486
|
command: 'sleep 10',
|
|
475
487
|
is_background: true,
|
|
476
488
|
});
|
|
477
|
-
const promise = invocation.execute(
|
|
489
|
+
const promise = invocation.execute({
|
|
490
|
+
abortSignal: mockAbortSignal,
|
|
491
|
+
updateOutput: updateOutputMock,
|
|
492
|
+
});
|
|
478
493
|
mockShellOutputCallback({ type: 'data', chunk: 'some output' });
|
|
479
494
|
expect(updateOutputMock).not.toHaveBeenCalled();
|
|
480
495
|
// We need to provide a PID for the background logic to trigger
|
|
@@ -549,6 +564,41 @@ describe('ShellTool', () => {
|
|
|
549
564
|
const shellTool = new ShellTool(mockConfig, createMockMessageBus());
|
|
550
565
|
expect(shellTool.description).not.toContain('Efficiency Guidelines:');
|
|
551
566
|
});
|
|
567
|
+
it('should return the command if description is not provided', () => {
|
|
568
|
+
const invocation = shellTool.build({
|
|
569
|
+
command: 'echo "hello"',
|
|
570
|
+
});
|
|
571
|
+
expect(invocation.getDescription()).toBe('echo "hello"');
|
|
572
|
+
});
|
|
573
|
+
it('should return the command if it is short (<= 150 chars), even if description is provided', () => {
|
|
574
|
+
const invocation = shellTool.build({
|
|
575
|
+
command: 'echo "hello"',
|
|
576
|
+
description: 'Prints a friendly greeting.',
|
|
577
|
+
});
|
|
578
|
+
expect(invocation.getDescription()).toBe('echo "hello"');
|
|
579
|
+
});
|
|
580
|
+
it('should return the description if the command is long (> 150 chars)', () => {
|
|
581
|
+
const longCommand = 'echo "hello" && '.repeat(15) + 'echo "world"'; // Length > 150
|
|
582
|
+
const invocation = shellTool.build({
|
|
583
|
+
command: longCommand,
|
|
584
|
+
description: 'Prints multiple greetings.',
|
|
585
|
+
});
|
|
586
|
+
expect(invocation.getDescription()).toBe('Prints multiple greetings.');
|
|
587
|
+
});
|
|
588
|
+
it('should return the raw command if description is an empty string', () => {
|
|
589
|
+
const invocation = shellTool.build({
|
|
590
|
+
command: 'echo hello',
|
|
591
|
+
description: '',
|
|
592
|
+
});
|
|
593
|
+
expect(invocation.getDescription()).toBe('echo hello');
|
|
594
|
+
});
|
|
595
|
+
it('should return the raw command if description is just whitespace', () => {
|
|
596
|
+
const invocation = shellTool.build({
|
|
597
|
+
command: 'echo hello',
|
|
598
|
+
description: ' ',
|
|
599
|
+
});
|
|
600
|
+
expect(invocation.getDescription()).toBe('echo hello');
|
|
601
|
+
});
|
|
552
602
|
});
|
|
553
603
|
describe('getDisplayTitle and getExplanation', () => {
|
|
554
604
|
it('should return only the command for getDisplayTitle', () => {
|
|
@@ -576,29 +626,6 @@ describe('ShellTool', () => {
|
|
|
576
626
|
expect(invocation.getExplanation?.()).toBe(`[current working directory ${process.cwd()}]`);
|
|
577
627
|
});
|
|
578
628
|
});
|
|
579
|
-
describe('invocation getDescription', () => {
|
|
580
|
-
it('should return the description if it is present and not empty whitespace', () => {
|
|
581
|
-
const invocation = shellTool.build({
|
|
582
|
-
command: 'echo hello',
|
|
583
|
-
description: 'prints hello',
|
|
584
|
-
});
|
|
585
|
-
expect(invocation.getDescription()).toBe('prints hello');
|
|
586
|
-
});
|
|
587
|
-
it('should return the raw command if description is an empty string', () => {
|
|
588
|
-
const invocation = shellTool.build({
|
|
589
|
-
command: 'echo hello',
|
|
590
|
-
description: '',
|
|
591
|
-
});
|
|
592
|
-
expect(invocation.getDescription()).toBe('echo hello');
|
|
593
|
-
});
|
|
594
|
-
it('should return the raw command if description is just whitespace', () => {
|
|
595
|
-
const invocation = shellTool.build({
|
|
596
|
-
command: 'echo hello',
|
|
597
|
-
description: ' ',
|
|
598
|
-
});
|
|
599
|
-
expect(invocation.getDescription()).toBe('echo hello');
|
|
600
|
-
});
|
|
601
|
-
});
|
|
602
629
|
describe('llmContent output format', () => {
|
|
603
630
|
const mockAbortSignal = new AbortController().signal;
|
|
604
631
|
const resolveShellExecution = (result = {}) => {
|
|
@@ -617,42 +644,42 @@ describe('ShellTool', () => {
|
|
|
617
644
|
};
|
|
618
645
|
it('should not include Command in output', async () => {
|
|
619
646
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
620
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
647
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
621
648
|
resolveShellExecution({ output: 'hello', exitCode: 0 });
|
|
622
649
|
const result = await promise;
|
|
623
650
|
expect(result.llmContent).not.toContain('Command:');
|
|
624
651
|
});
|
|
625
652
|
it('should not include Directory in output', async () => {
|
|
626
653
|
const invocation = shellTool.build({ command: 'ls', dir_path: 'subdir' });
|
|
627
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
654
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
628
655
|
resolveShellExecution({ output: 'file.txt', exitCode: 0 });
|
|
629
656
|
const result = await promise;
|
|
630
657
|
expect(result.llmContent).not.toContain('Directory:');
|
|
631
658
|
});
|
|
632
659
|
it('should not include Exit Code when command succeeds (exit code 0)', async () => {
|
|
633
660
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
634
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
661
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
635
662
|
resolveShellExecution({ output: 'hello', exitCode: 0 });
|
|
636
663
|
const result = await promise;
|
|
637
664
|
expect(result.llmContent).not.toContain('Exit Code:');
|
|
638
665
|
});
|
|
639
666
|
it('should include Exit Code when command fails (non-zero exit code)', async () => {
|
|
640
667
|
const invocation = shellTool.build({ command: 'false' });
|
|
641
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
668
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
642
669
|
resolveShellExecution({ output: '', exitCode: 1 });
|
|
643
670
|
const result = await promise;
|
|
644
671
|
expect(result.llmContent).toContain('Exit Code: 1');
|
|
645
672
|
});
|
|
646
673
|
it('should not include Error when there is no process error', async () => {
|
|
647
674
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
648
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
675
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
649
676
|
resolveShellExecution({ output: 'hello', exitCode: 0, error: null });
|
|
650
677
|
const result = await promise;
|
|
651
678
|
expect(result.llmContent).not.toContain('Error:');
|
|
652
679
|
});
|
|
653
680
|
it('should include Error when there is a process error', async () => {
|
|
654
681
|
const invocation = shellTool.build({ command: 'bad-command' });
|
|
655
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
682
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
656
683
|
resolveShellExecution({
|
|
657
684
|
output: '',
|
|
658
685
|
exitCode: 1,
|
|
@@ -663,14 +690,14 @@ describe('ShellTool', () => {
|
|
|
663
690
|
});
|
|
664
691
|
it('should not include Signal when there is no signal', async () => {
|
|
665
692
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
666
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
693
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
667
694
|
resolveShellExecution({ output: 'hello', exitCode: 0, signal: null });
|
|
668
695
|
const result = await promise;
|
|
669
696
|
expect(result.llmContent).not.toContain('Signal:');
|
|
670
697
|
});
|
|
671
698
|
it('should include Signal when process was killed by signal', async () => {
|
|
672
699
|
const invocation = shellTool.build({ command: 'sleep 100' });
|
|
673
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
700
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
674
701
|
resolveShellExecution({
|
|
675
702
|
output: '',
|
|
676
703
|
exitCode: null,
|
|
@@ -681,21 +708,21 @@ describe('ShellTool', () => {
|
|
|
681
708
|
});
|
|
682
709
|
it('should not include Background PIDs when there are none', async () => {
|
|
683
710
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
684
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
711
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
685
712
|
resolveShellExecution({ output: 'hello', exitCode: 0 });
|
|
686
713
|
const result = await promise;
|
|
687
714
|
expect(result.llmContent).not.toContain('Background PIDs:');
|
|
688
715
|
});
|
|
689
716
|
it('should not include Process Group PGID when pid is not set', async () => {
|
|
690
717
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
691
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
718
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
692
719
|
resolveShellExecution({ output: 'hello', exitCode: 0, pid: undefined });
|
|
693
720
|
const result = await promise;
|
|
694
721
|
expect(result.llmContent).not.toContain('Process Group PGID:');
|
|
695
722
|
});
|
|
696
723
|
it('should have minimal output for successful command', async () => {
|
|
697
724
|
const invocation = shellTool.build({ command: 'echo hello' });
|
|
698
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
725
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
699
726
|
resolveShellExecution({ output: 'hello', exitCode: 0, pid: undefined });
|
|
700
727
|
const result = await promise;
|
|
701
728
|
// Should only contain Output field
|
|
@@ -759,7 +786,7 @@ describe('ShellTool', () => {
|
|
|
759
786
|
};
|
|
760
787
|
mockSandboxManager = sandboxManager;
|
|
761
788
|
const invocation = shellTool.build({ command: 'npm install' });
|
|
762
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
789
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
763
790
|
resolveExecutionPromise({
|
|
764
791
|
exitCode: 1,
|
|
765
792
|
output: 'npm error code EPERM',
|
|
@@ -809,7 +836,7 @@ describe('ShellTool', () => {
|
|
|
809
836
|
};
|
|
810
837
|
mockSandboxManager = sandboxManager;
|
|
811
838
|
const invocation = shellTool.build({ command: `ls ${homeDir}` });
|
|
812
|
-
const promise = invocation.execute(mockAbortSignal);
|
|
839
|
+
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
|
813
840
|
resolveExecutionPromise({
|
|
814
841
|
exitCode: 1,
|
|
815
842
|
output: 'Permission denied',
|
|
@@ -863,5 +890,381 @@ describe('ShellTool', () => {
|
|
|
863
890
|
expect(schema.description).toMatchSnapshot();
|
|
864
891
|
});
|
|
865
892
|
});
|
|
893
|
+
describe('command injection detection', () => {
|
|
894
|
+
it('should block $() command substitution', async () => {
|
|
895
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
896
|
+
const invocation = tool.build({ command: 'echo $(whoami)' });
|
|
897
|
+
const result = await invocation.execute({
|
|
898
|
+
abortSignal: new AbortController().signal,
|
|
899
|
+
});
|
|
900
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
901
|
+
});
|
|
902
|
+
it('should block backtick command substitution', async () => {
|
|
903
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
904
|
+
const invocation = tool.build({ command: 'echo `whoami`' });
|
|
905
|
+
const result = await invocation.execute({
|
|
906
|
+
abortSignal: new AbortController().signal,
|
|
907
|
+
});
|
|
908
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
909
|
+
});
|
|
910
|
+
it('should allow normal commands without substitution', async () => {
|
|
911
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
912
|
+
pid: 12345,
|
|
913
|
+
result: Promise.resolve({
|
|
914
|
+
output: 'hello',
|
|
915
|
+
rawOutput: Buffer.from('hello'),
|
|
916
|
+
exitCode: 0,
|
|
917
|
+
signal: null,
|
|
918
|
+
error: null,
|
|
919
|
+
aborted: false,
|
|
920
|
+
pid: 12345,
|
|
921
|
+
executionMethod: 'child_process',
|
|
922
|
+
backgrounded: false,
|
|
923
|
+
}),
|
|
924
|
+
}));
|
|
925
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
926
|
+
const invocation = tool.build({ command: 'echo hello' });
|
|
927
|
+
const result = await invocation.execute({
|
|
928
|
+
abortSignal: new AbortController().signal,
|
|
929
|
+
});
|
|
930
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
931
|
+
});
|
|
932
|
+
it('should allow single quoted strings with special chars', async () => {
|
|
933
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
934
|
+
pid: 12345,
|
|
935
|
+
result: Promise.resolve({
|
|
936
|
+
output: '$(not substituted)',
|
|
937
|
+
rawOutput: Buffer.from('$(not substituted)'),
|
|
938
|
+
exitCode: 0,
|
|
939
|
+
signal: null,
|
|
940
|
+
error: null,
|
|
941
|
+
aborted: false,
|
|
942
|
+
pid: 12345,
|
|
943
|
+
executionMethod: 'child_process',
|
|
944
|
+
backgrounded: false,
|
|
945
|
+
}),
|
|
946
|
+
}));
|
|
947
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
948
|
+
const invocation = tool.build({
|
|
949
|
+
command: "echo '$(not substituted)'",
|
|
950
|
+
});
|
|
951
|
+
const result = await invocation.execute({
|
|
952
|
+
abortSignal: new AbortController().signal,
|
|
953
|
+
});
|
|
954
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
955
|
+
});
|
|
956
|
+
it('should allow escaped backtick outside double quotes', async () => {
|
|
957
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
958
|
+
pid: 12345,
|
|
959
|
+
result: Promise.resolve({
|
|
960
|
+
output: 'hello',
|
|
961
|
+
rawOutput: Buffer.from('hello'),
|
|
962
|
+
exitCode: 0,
|
|
963
|
+
signal: null,
|
|
964
|
+
error: null,
|
|
965
|
+
aborted: false,
|
|
966
|
+
pid: 12345,
|
|
967
|
+
executionMethod: 'child_process',
|
|
968
|
+
backgrounded: false,
|
|
969
|
+
}),
|
|
970
|
+
}));
|
|
971
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
972
|
+
const invocation = tool.build({ command: 'echo \\`hello\\`' });
|
|
973
|
+
const result = await invocation.execute({
|
|
974
|
+
abortSignal: new AbortController().signal,
|
|
975
|
+
});
|
|
976
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
977
|
+
});
|
|
978
|
+
it('should block $() inside double quotes', async () => {
|
|
979
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
980
|
+
const invocation = tool.build({ command: 'echo "$(whoami)"' });
|
|
981
|
+
const result = await invocation.execute({
|
|
982
|
+
abortSignal: new AbortController().signal,
|
|
983
|
+
});
|
|
984
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
985
|
+
});
|
|
986
|
+
it('should block >() process substitution', async () => {
|
|
987
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
988
|
+
const invocation = tool.build({ command: 'echo >(whoami)' });
|
|
989
|
+
const result = await invocation.execute({
|
|
990
|
+
abortSignal: new AbortController().signal,
|
|
991
|
+
});
|
|
992
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
993
|
+
});
|
|
994
|
+
it('should allow $() inside single quotes', async () => {
|
|
995
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
996
|
+
pid: 12345,
|
|
997
|
+
result: Promise.resolve({
|
|
998
|
+
output: '$(whoami)',
|
|
999
|
+
rawOutput: Buffer.from('$(whoami)'),
|
|
1000
|
+
exitCode: 0,
|
|
1001
|
+
signal: null,
|
|
1002
|
+
error: null,
|
|
1003
|
+
aborted: false,
|
|
1004
|
+
pid: 12345,
|
|
1005
|
+
executionMethod: 'child_process',
|
|
1006
|
+
backgrounded: false,
|
|
1007
|
+
}),
|
|
1008
|
+
}));
|
|
1009
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1010
|
+
const invocation = tool.build({
|
|
1011
|
+
command: "echo '$(whoami)'",
|
|
1012
|
+
});
|
|
1013
|
+
const result = await invocation.execute({
|
|
1014
|
+
abortSignal: new AbortController().signal,
|
|
1015
|
+
});
|
|
1016
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1017
|
+
});
|
|
1018
|
+
it('should block PowerShell @() array subexpression', async () => {
|
|
1019
|
+
mockPlatform.mockReturnValue('win32');
|
|
1020
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1021
|
+
const invocation = tool.build({ command: 'echo @(whoami)' });
|
|
1022
|
+
const result = await invocation.execute({
|
|
1023
|
+
abortSignal: new AbortController().signal,
|
|
1024
|
+
});
|
|
1025
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
1026
|
+
});
|
|
1027
|
+
it('should block PowerShell $() subexpression', async () => {
|
|
1028
|
+
mockPlatform.mockReturnValue('win32');
|
|
1029
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1030
|
+
const invocation = tool.build({ command: 'echo $(whoami)' });
|
|
1031
|
+
const result = await invocation.execute({
|
|
1032
|
+
abortSignal: new AbortController().signal,
|
|
1033
|
+
});
|
|
1034
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
1035
|
+
});
|
|
1036
|
+
it('should allow PowerShell single quoted strings', async () => {
|
|
1037
|
+
mockPlatform.mockReturnValue('win32');
|
|
1038
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1039
|
+
pid: 12345,
|
|
1040
|
+
result: Promise.resolve({
|
|
1041
|
+
output: '$(whoami)',
|
|
1042
|
+
rawOutput: Buffer.from('$(whoami)'),
|
|
1043
|
+
exitCode: 0,
|
|
1044
|
+
signal: null,
|
|
1045
|
+
error: null,
|
|
1046
|
+
aborted: false,
|
|
1047
|
+
pid: 12345,
|
|
1048
|
+
executionMethod: 'child_process',
|
|
1049
|
+
backgrounded: false,
|
|
1050
|
+
}),
|
|
1051
|
+
}));
|
|
1052
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1053
|
+
const invocation = tool.build({
|
|
1054
|
+
command: "echo '$(whoami)'",
|
|
1055
|
+
});
|
|
1056
|
+
const result = await invocation.execute({
|
|
1057
|
+
abortSignal: new AbortController().signal,
|
|
1058
|
+
});
|
|
1059
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1060
|
+
});
|
|
1061
|
+
it('should allow escaped substitution outside quotes', async () => {
|
|
1062
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1063
|
+
pid: 12345,
|
|
1064
|
+
result: Promise.resolve({
|
|
1065
|
+
output: '$(whoami)',
|
|
1066
|
+
rawOutput: Buffer.from('$(whoami)'),
|
|
1067
|
+
exitCode: 0,
|
|
1068
|
+
signal: null,
|
|
1069
|
+
error: null,
|
|
1070
|
+
aborted: false,
|
|
1071
|
+
pid: 12345,
|
|
1072
|
+
executionMethod: 'child_process',
|
|
1073
|
+
backgrounded: false,
|
|
1074
|
+
}),
|
|
1075
|
+
}));
|
|
1076
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1077
|
+
const invocation = tool.build({ command: 'echo \\$(whoami)' });
|
|
1078
|
+
const result = await invocation.execute({
|
|
1079
|
+
abortSignal: new AbortController().signal,
|
|
1080
|
+
});
|
|
1081
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1082
|
+
});
|
|
1083
|
+
it('should allow process substitution inside double quotes', async () => {
|
|
1084
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1085
|
+
pid: 12345,
|
|
1086
|
+
result: Promise.resolve({
|
|
1087
|
+
output: '<(whoami)',
|
|
1088
|
+
rawOutput: Buffer.from('<(whoami)'),
|
|
1089
|
+
exitCode: 0,
|
|
1090
|
+
signal: null,
|
|
1091
|
+
error: null,
|
|
1092
|
+
aborted: false,
|
|
1093
|
+
pid: 12345,
|
|
1094
|
+
executionMethod: 'child_process',
|
|
1095
|
+
backgrounded: false,
|
|
1096
|
+
}),
|
|
1097
|
+
}));
|
|
1098
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1099
|
+
const invocation = tool.build({ command: 'echo "<(whoami)"' });
|
|
1100
|
+
const result = await invocation.execute({
|
|
1101
|
+
abortSignal: new AbortController().signal,
|
|
1102
|
+
});
|
|
1103
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1104
|
+
});
|
|
1105
|
+
it('should block process substitution without quotes', async () => {
|
|
1106
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1107
|
+
const invocation = tool.build({ command: 'echo <(whoami)' });
|
|
1108
|
+
const result = await invocation.execute({
|
|
1109
|
+
abortSignal: new AbortController().signal,
|
|
1110
|
+
});
|
|
1111
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
1112
|
+
});
|
|
1113
|
+
it('should allow escaped $() outside double quotes', async () => {
|
|
1114
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1115
|
+
pid: 12345,
|
|
1116
|
+
result: Promise.resolve({
|
|
1117
|
+
output: '$(whoami)',
|
|
1118
|
+
rawOutput: Buffer.from('$(whoami)'),
|
|
1119
|
+
exitCode: 0,
|
|
1120
|
+
signal: null,
|
|
1121
|
+
error: null,
|
|
1122
|
+
aborted: false,
|
|
1123
|
+
pid: 12345,
|
|
1124
|
+
executionMethod: 'child_process',
|
|
1125
|
+
backgrounded: false,
|
|
1126
|
+
}),
|
|
1127
|
+
}));
|
|
1128
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1129
|
+
const invocation = tool.build({ command: 'echo \\$(whoami)' });
|
|
1130
|
+
const result = await invocation.execute({
|
|
1131
|
+
abortSignal: new AbortController().signal,
|
|
1132
|
+
});
|
|
1133
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1134
|
+
});
|
|
1135
|
+
it('should allow output process substitution inside double quotes', async () => {
|
|
1136
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1137
|
+
pid: 12345,
|
|
1138
|
+
result: Promise.resolve({
|
|
1139
|
+
output: '<(whoami)',
|
|
1140
|
+
rawOutput: Buffer.from('<(whoami)'),
|
|
1141
|
+
exitCode: 0,
|
|
1142
|
+
signal: null,
|
|
1143
|
+
error: null,
|
|
1144
|
+
aborted: false,
|
|
1145
|
+
pid: 12345,
|
|
1146
|
+
executionMethod: 'child_process',
|
|
1147
|
+
backgrounded: false,
|
|
1148
|
+
}),
|
|
1149
|
+
}));
|
|
1150
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1151
|
+
const invocation = tool.build({ command: 'echo "<(whoami)"' });
|
|
1152
|
+
const result = await invocation.execute({
|
|
1153
|
+
abortSignal: new AbortController().signal,
|
|
1154
|
+
});
|
|
1155
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1156
|
+
});
|
|
1157
|
+
it('should block <() process substitution without quotes', async () => {
|
|
1158
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1159
|
+
const invocation = tool.build({ command: 'echo <(whoami)' });
|
|
1160
|
+
const result = await invocation.execute({
|
|
1161
|
+
abortSignal: new AbortController().signal,
|
|
1162
|
+
});
|
|
1163
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
1164
|
+
});
|
|
1165
|
+
it('should block PowerShell bare () grouping operator', async () => {
|
|
1166
|
+
mockPlatform.mockReturnValue('win32');
|
|
1167
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1168
|
+
const invocation = tool.build({ command: 'echo (whoami)' });
|
|
1169
|
+
const result = await invocation.execute({
|
|
1170
|
+
abortSignal: new AbortController().signal,
|
|
1171
|
+
});
|
|
1172
|
+
expect(result.returnDisplay).toContain('Blocked');
|
|
1173
|
+
});
|
|
1174
|
+
it('should allow escaped $() inside double quotes', async () => {
|
|
1175
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1176
|
+
pid: 12345,
|
|
1177
|
+
result: Promise.resolve({
|
|
1178
|
+
output: '$(whoami)',
|
|
1179
|
+
rawOutput: Buffer.from('$(whoami)'),
|
|
1180
|
+
exitCode: 0,
|
|
1181
|
+
signal: null,
|
|
1182
|
+
error: null,
|
|
1183
|
+
aborted: false,
|
|
1184
|
+
pid: 12345,
|
|
1185
|
+
executionMethod: 'child_process',
|
|
1186
|
+
backgrounded: false,
|
|
1187
|
+
}),
|
|
1188
|
+
}));
|
|
1189
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1190
|
+
const invocation = tool.build({ command: 'echo "\\$(whoami)"' });
|
|
1191
|
+
const result = await invocation.execute({
|
|
1192
|
+
abortSignal: new AbortController().signal,
|
|
1193
|
+
});
|
|
1194
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1195
|
+
});
|
|
1196
|
+
it('should allow escaped substitution inside double quotes', async () => {
|
|
1197
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1198
|
+
pid: 12345,
|
|
1199
|
+
result: Promise.resolve({
|
|
1200
|
+
output: '$(whoami)',
|
|
1201
|
+
rawOutput: Buffer.from('$(whoami)'),
|
|
1202
|
+
exitCode: 0,
|
|
1203
|
+
signal: null,
|
|
1204
|
+
error: null,
|
|
1205
|
+
aborted: false,
|
|
1206
|
+
pid: 12345,
|
|
1207
|
+
executionMethod: 'child_process',
|
|
1208
|
+
backgrounded: false,
|
|
1209
|
+
}),
|
|
1210
|
+
}));
|
|
1211
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1212
|
+
const invocation = tool.build({ command: 'echo "\\$(whoami)"' });
|
|
1213
|
+
const result = await invocation.execute({
|
|
1214
|
+
abortSignal: new AbortController().signal,
|
|
1215
|
+
});
|
|
1216
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1217
|
+
});
|
|
1218
|
+
it('should allow PowerShell keyword with flag e.g. switch -regex ($x)', async () => {
|
|
1219
|
+
mockPlatform.mockReturnValue('win32');
|
|
1220
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1221
|
+
pid: 12345,
|
|
1222
|
+
result: Promise.resolve({
|
|
1223
|
+
output: 'result',
|
|
1224
|
+
rawOutput: Buffer.from('result'),
|
|
1225
|
+
exitCode: 0,
|
|
1226
|
+
signal: null,
|
|
1227
|
+
error: null,
|
|
1228
|
+
aborted: false,
|
|
1229
|
+
pid: 12345,
|
|
1230
|
+
executionMethod: 'child_process',
|
|
1231
|
+
backgrounded: false,
|
|
1232
|
+
}),
|
|
1233
|
+
}));
|
|
1234
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1235
|
+
const invocation = tool.build({
|
|
1236
|
+
command: 'switch -regex ($x) { "a" { 1 } }',
|
|
1237
|
+
});
|
|
1238
|
+
const result = await invocation.execute({
|
|
1239
|
+
abortSignal: new AbortController().signal,
|
|
1240
|
+
});
|
|
1241
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1242
|
+
});
|
|
1243
|
+
it('should allow PowerShell nested parentheses e.g. if ((condition))', async () => {
|
|
1244
|
+
mockPlatform.mockReturnValue('win32');
|
|
1245
|
+
mockShellExecutionService.mockImplementation((_cmd, _cwd, _callback) => ({
|
|
1246
|
+
pid: 12345,
|
|
1247
|
+
result: Promise.resolve({
|
|
1248
|
+
output: 'result',
|
|
1249
|
+
rawOutput: Buffer.from('result'),
|
|
1250
|
+
exitCode: 0,
|
|
1251
|
+
signal: null,
|
|
1252
|
+
error: null,
|
|
1253
|
+
aborted: false,
|
|
1254
|
+
pid: 12345,
|
|
1255
|
+
executionMethod: 'child_process',
|
|
1256
|
+
backgrounded: false,
|
|
1257
|
+
}),
|
|
1258
|
+
}));
|
|
1259
|
+
const tool = new ShellTool(mockConfig, createMockMessageBus());
|
|
1260
|
+
const invocation = tool.build({
|
|
1261
|
+
command: 'if ((condition)) { Write-Host ok }',
|
|
1262
|
+
});
|
|
1263
|
+
const result = await invocation.execute({
|
|
1264
|
+
abortSignal: new AbortController().signal,
|
|
1265
|
+
});
|
|
1266
|
+
expect(result.returnDisplay).not.toContain('Blocked');
|
|
1267
|
+
});
|
|
1268
|
+
});
|
|
866
1269
|
});
|
|
867
1270
|
//# sourceMappingURL=shell.test.js.map
|