@google/gemini-cli-core 0.30.0-preview.6 → 0.31.0-preview.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/docs/CONTRIBUTING.md +6 -7
- package/dist/docs/changelogs/index.md +22 -2
- package/dist/docs/changelogs/latest.md +359 -293
- package/dist/docs/changelogs/preview.md +300 -349
- package/dist/docs/cli/cli-reference.md +23 -23
- package/dist/docs/cli/enterprise.md +7 -7
- package/dist/docs/cli/gemini-md.md +1 -1
- package/dist/docs/cli/model.md +1 -1
- package/dist/docs/cli/plan-mode.md +180 -80
- package/dist/docs/cli/sandbox.md +3 -3
- package/dist/docs/cli/settings.md +59 -51
- package/dist/docs/cli/telemetry.md +4 -1
- package/dist/docs/cli/themes.md +3 -3
- package/dist/docs/cli/trusted-folders.md +31 -0
- package/dist/docs/cli/tutorials/memory-management.md +2 -2
- package/dist/docs/cli/tutorials/session-management.md +1 -1
- package/dist/docs/core/index.md +7 -7
- package/dist/docs/core/subagents.md +155 -39
- package/dist/docs/extensions/reference.md +38 -14
- package/dist/docs/get-started/authentication.md +4 -4
- package/dist/docs/get-started/examples.md +2 -2
- package/dist/docs/get-started/gemini-3.md +17 -3
- package/dist/docs/get-started/index.md +11 -2
- package/dist/docs/hooks/best-practices.md +1 -1
- package/dist/docs/hooks/reference.md +8 -0
- package/dist/docs/ide-integration/index.md +14 -0
- package/dist/docs/index.md +62 -67
- package/dist/docs/redirects.json +19 -0
- package/dist/docs/{cli → reference}/commands.md +67 -11
- package/dist/docs/{get-started → reference}/configuration.md +93 -24
- package/dist/docs/{cli → reference}/keyboard-shortcuts.md +3 -3
- package/dist/docs/{core → reference}/policy-engine.md +63 -27
- package/dist/docs/{faq.md → resources/faq.md} +1 -1
- package/dist/docs/{quota-and-pricing.md → resources/quota-and-pricing.md} +12 -5
- package/dist/docs/{tos-privacy.md → resources/tos-privacy.md} +2 -2
- package/dist/docs/{troubleshooting.md → resources/troubleshooting.md} +1 -1
- package/dist/docs/sidebar.json +203 -166
- package/dist/docs/tools/file-system.md +7 -4
- package/dist/docs/tools/index.md +5 -2
- package/dist/docs/tools/internal-docs.md +5 -5
- package/dist/docs/tools/mcp-server.md +62 -2
- package/dist/docs/tools/planning.md +2 -0
- package/dist/docs/tools/shell.md +3 -3
- package/dist/src/agents/a2a-client-manager.test.js +1 -2
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
- package/dist/src/agents/a2aUtils.d.ts +1 -5
- package/dist/src/agents/a2aUtils.js +1 -1
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/acknowledgedAgents.js +1 -0
- package/dist/src/agents/acknowledgedAgents.js.map +1 -1
- package/dist/src/agents/agent-scheduler.js +1 -0
- package/dist/src/agents/agent-scheduler.js.map +1 -1
- package/dist/src/agents/agentLoader.d.ts +0 -1
- package/dist/src/agents/agentLoader.js +22 -21
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/agentLoader.test.js +1 -5
- package/dist/src/agents/agentLoader.test.js.map +1 -1
- package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
- package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
- package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/base-provider.d.ts +2 -2
- package/dist/src/agents/auth-provider/base-provider.js.map +1 -1
- package/dist/src/agents/auth-provider/factory.js +6 -3
- package/dist/src/agents/auth-provider/factory.js.map +1 -1
- package/dist/src/agents/auth-provider/factory.test.js +12 -0
- package/dist/src/agents/auth-provider/factory.test.js.map +1 -1
- package/dist/src/agents/auth-provider/types.d.ts +2 -4
- package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
- package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
- package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
- package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
- package/dist/src/agents/browser/browserAgentFactory.js +107 -0
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js +186 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +44 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +109 -0
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js +87 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
- package/dist/src/agents/browser/browserManager.d.ts +110 -0
- package/dist/src/agents/browser/browserManager.js +323 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -0
- package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
- package/dist/src/agents/browser/browserManager.test.js +314 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
- package/dist/src/agents/browser/mcpToolWrapper.js +356 -0
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +57 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
- package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
- package/dist/src/agents/browser/modelAvailability.js +23 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -0
- package/dist/src/agents/local-executor.js +73 -31
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +157 -4
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/registry.js +8 -0
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +2 -1
- package/dist/src/agents/remote-invocation.js +3 -3
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.js +6 -0
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool.d.ts +3 -0
- package/dist/src/agents/subagent-tool.js +62 -3
- package/dist/src/agents/subagent-tool.js.map +1 -1
- package/dist/src/agents/subagent-tool.test.js +143 -0
- package/dist/src/agents/subagent-tool.test.js.map +1 -1
- package/dist/src/availability/fallbackIntegration.test.js +4 -1
- package/dist/src/availability/fallbackIntegration.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +3 -1
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +51 -5
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +1 -0
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/converter.js +8 -2
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/converter.test.js.map +1 -1
- package/dist/src/code_assist/experiments/experiments.js +1 -1
- package/dist/src/code_assist/experiments/experiments.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.js +1 -1
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js +5 -0
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +11 -8
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +55 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +22 -13
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +26 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/telemetry.js +16 -3
- package/dist/src/code_assist/telemetry.js.map +1 -1
- package/dist/src/code_assist/telemetry.test.js +10 -0
- package/dist/src/code_assist/telemetry.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +13 -12
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/config/config.d.ts +83 -8
- package/dist/src/config/config.js +127 -23
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +285 -10
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/projectRegistry.js +1 -0
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/storage.d.ts +17 -1
- package/dist/src/config/storage.js +82 -2
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +149 -2
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/config/userHintService.d.ts +46 -0
- package/dist/src/config/userHintService.js +81 -0
- package/dist/src/config/userHintService.js.map +1 -0
- package/dist/src/config/userHintService.test.d.ts +6 -0
- package/dist/src/config/userHintService.test.js +62 -0
- package/dist/src/config/userHintService.test.js.map +1 -0
- package/dist/src/confirmation-bus/message-bus.js +15 -3
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.test.js +15 -0
- package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +7 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/core/baseLlmClient.d.ts +2 -3
- package/dist/src/core/baseLlmClient.js +7 -5
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +45 -20
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +18 -7
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.d.ts +2 -3
- package/dist/src/core/coreToolHookTriggers.js +8 -3
- package/dist/src/core/coreToolHookTriggers.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +2 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +10 -3
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.js +2 -0
- package/dist/src/core/fakeContentGenerator.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +1 -1
- package/dist/src/core/geminiChat.js +5 -5
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +1 -0
- 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 +2 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +14 -2
- package/dist/src/core/loggingContentGenerator.js +98 -4
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +275 -1
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/prompts.test.js +55 -27
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/recordingContentGenerator.test.js +5 -0
- package/dist/src/core/recordingContentGenerator.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +4 -2
- package/dist/src/core/turn.js +2 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +4 -1
- package/dist/src/core/turn.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/hookAggregator.d.ts +1 -2
- package/dist/src/hooks/hookAggregator.js +1 -2
- package/dist/src/hooks/hookAggregator.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.d.ts +2 -2
- package/dist/src/hooks/hookEventHandler.js +13 -4
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +1 -2
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookPlanner.d.ts +1 -2
- package/dist/src/hooks/hookPlanner.js.map +1 -1
- package/dist/src/hooks/hookRegistry.d.ts +8 -0
- package/dist/src/hooks/hookRegistry.js +31 -3
- package/dist/src/hooks/hookRegistry.js.map +1 -1
- package/dist/src/hooks/hookRegistry.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.d.ts +5 -2
- package/dist/src/hooks/hookRunner.js +52 -2
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +11 -3
- package/dist/src/hooks/hookSystem.js +10 -4
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookSystem.test.js +1 -0
- package/dist/src/hooks/hookSystem.test.js.map +1 -1
- package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
- package/dist/src/hooks/runtimeHooks.test.js +100 -0
- package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
- package/dist/src/hooks/trustedHooks.js +6 -1
- package/dist/src/hooks/trustedHooks.js.map +1 -1
- package/dist/src/hooks/trustedHooks.test.js +17 -9
- package/dist/src/hooks/trustedHooks.test.js.map +1 -1
- package/dist/src/hooks/types.d.ts +49 -8
- package/dist/src/hooks/types.js +20 -1
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +0 -1
- package/dist/src/ide/detect-ide.js +1 -1
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/ide-client.js +3 -2
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +90 -14
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.test.js +78 -0
- package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +1 -2
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/ide/process-utils.d.ts +7 -0
- package/dist/src/ide/process-utils.js +20 -0
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/ide/process-utils.test.js +30 -0
- package/dist/src/ide/process-utils.test.js.map +1 -1
- package/dist/src/index.d.ts +6 -1
- package/dist/src/index.js +6 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +1 -1
- package/dist/src/mcp/oauth-provider.js +8 -7
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +34 -2
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.js +2 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +12 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.js +4 -1
- package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.test.js +40 -2
- package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/policy/config.d.ts +18 -9
- package/dist/src/policy/config.js +75 -54
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +26 -26
- package/dist/src/policy/integrity.d.ts +45 -0
- package/dist/src/policy/integrity.js +121 -0
- package/dist/src/policy/integrity.js.map +1 -0
- package/dist/src/policy/integrity.test.d.ts +6 -0
- package/dist/src/policy/integrity.test.js +132 -0
- package/dist/src/policy/integrity.test.js.map +1 -0
- package/dist/src/policy/persistence.test.js +29 -19
- package/dist/src/policy/persistence.test.js.map +1 -1
- package/dist/src/policy/policies/conseca.toml +6 -0
- package/dist/src/policy/policies/plan.toml +28 -12
- package/dist/src/policy/policies/read-only.toml +11 -10
- package/dist/src/policy/policies/write.toml +11 -10
- package/dist/src/policy/policies/yolo.toml +11 -10
- package/dist/src/policy/policy-engine.d.ts +16 -3
- package/dist/src/policy/policy-engine.js +154 -29
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +480 -9
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/policy-updater.test.js +11 -6
- package/dist/src/policy/policy-updater.test.js.map +1 -1
- package/dist/src/policy/toml-loader.d.ts +13 -2
- package/dist/src/policy/toml-loader.js +55 -34
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +115 -7
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +18 -1
- package/dist/src/policy/types.js +1 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/policy/workspace-policy.test.d.ts +6 -0
- package/dist/src/policy/workspace-policy.test.js +231 -0
- package/dist/src/policy/workspace-policy.test.js.map +1 -0
- package/dist/src/prompts/promptProvider.js +11 -13
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +64 -3
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets.js +41 -10
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.js +1 -0
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +3 -1
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +12 -6
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js +58 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +110 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
- package/dist/src/safety/checker-runner.js +1 -0
- package/dist/src/safety/checker-runner.js.map +1 -1
- package/dist/src/safety/conseca/conseca.d.ts +31 -0
- package/dist/src/safety/conseca/conseca.js +105 -0
- package/dist/src/safety/conseca/conseca.js.map +1 -0
- package/dist/src/safety/conseca/conseca.test.d.ts +6 -0
- package/dist/src/safety/conseca/conseca.test.js +226 -0
- package/dist/src/safety/conseca/conseca.test.js.map +1 -0
- package/dist/src/safety/conseca/integration.test.d.ts +6 -0
- package/dist/src/safety/conseca/integration.test.js +19 -0
- package/dist/src/safety/conseca/integration.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
- package/dist/src/safety/conseca/policy-enforcer.js +135 -0
- package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.test.d.ts +6 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
- package/dist/src/safety/conseca/policy-generator.js +144 -0
- package/dist/src/safety/conseca/policy-generator.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
- package/dist/src/safety/conseca/policy-generator.test.js +84 -0
- package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
- package/dist/src/safety/conseca/types.d.ts +15 -0
- package/dist/src/safety/conseca/types.js +7 -0
- package/dist/src/safety/conseca/types.js.map +1 -0
- package/dist/src/safety/context-builder.d.ts +3 -3
- package/dist/src/safety/context-builder.js +60 -4
- package/dist/src/safety/context-builder.js.map +1 -1
- package/dist/src/safety/context-builder.test.js +98 -18
- package/dist/src/safety/context-builder.test.js.map +1 -1
- package/dist/src/safety/protocol.d.ts +4 -0
- package/dist/src/safety/registry.d.ts +2 -1
- package/dist/src/safety/registry.js +14 -4
- package/dist/src/safety/registry.js.map +1 -1
- package/dist/src/safety/registry.test.js +5 -2
- package/dist/src/safety/registry.test.js.map +1 -1
- package/dist/src/scheduler/confirmation.d.ts +0 -13
- package/dist/src/scheduler/confirmation.js +1 -1
- package/dist/src/scheduler/confirmation.js.map +1 -1
- package/dist/src/scheduler/policy.js +6 -2
- package/dist/src/scheduler/policy.js.map +1 -1
- package/dist/src/scheduler/policy.test.js +4 -3
- package/dist/src/scheduler/policy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.d.ts +3 -1
- package/dist/src/scheduler/scheduler.js +148 -28
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +341 -242
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
- package/dist/src/scheduler/scheduler_parallel.test.js +309 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
- package/dist/src/scheduler/state-manager.d.ts +8 -0
- package/dist/src/scheduler/state-manager.js +30 -2
- package/dist/src/scheduler/state-manager.js.map +1 -1
- package/dist/src/scheduler/state-manager.test.js +61 -0
- package/dist/src/scheduler/state-manager.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +15 -7
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +1 -1
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/scheduler/types.d.ts +23 -0
- package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
- package/dist/src/services/FolderTrustDiscoveryService.js +167 -0
- package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
- package/dist/src/services/chatCompressionService.d.ts +0 -14
- package/dist/src/services/chatCompressionService.js +29 -7
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +3 -1
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +7 -1
- package/dist/src/services/chatRecordingService.js +12 -1
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +34 -0
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +1 -2
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.js +3 -0
- package/dist/src/services/sessionSummaryUtils.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +6 -0
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/skills/skillLoader.js +2 -2
- package/dist/src/skills/skillLoader.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +3 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +35 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +0 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +19 -5
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +14 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +29 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/conseca-logger.d.ts +9 -0
- package/dist/src/telemetry/conseca-logger.js +91 -0
- package/dist/src/telemetry/conseca-logger.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
- package/dist/src/telemetry/conseca-logger.test.js +89 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
- package/dist/src/telemetry/gcp-exporters.js +1 -2
- package/dist/src/telemetry/gcp-exporters.js.map +1 -1
- 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/integration.test.circular.js +3 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +1 -2
- package/dist/src/telemetry/loggers.js +3 -13
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +3 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +6 -5
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +1 -3
- package/dist/src/telemetry/metrics.js +3 -2
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +7 -3
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sanitize.test.js +19 -18
- package/dist/src/telemetry/sanitize.test.js.map +1 -1
- package/dist/src/telemetry/semantic.d.ts +7 -9
- package/dist/src/telemetry/semantic.js +8 -8
- package/dist/src/telemetry/semantic.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +42 -4
- package/dist/src/telemetry/types.js +87 -2
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -2
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +1 -2
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/ask-user.test.js +1 -19
- package/dist/src/tools/ask-user.test.js.map +1 -1
- package/dist/src/tools/confirmation-policy.test.js +14 -17
- package/dist/src/tools/confirmation-policy.test.js.map +1 -1
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js +1 -1
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +14 -16
- 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 +24 -59
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/diff-utils.d.ts +9 -0
- package/dist/src/tools/diff-utils.js +66 -0
- package/dist/src/tools/diff-utils.js.map +1 -0
- package/dist/src/tools/diff-utils.test.d.ts +6 -0
- package/dist/src/tools/diff-utils.test.js +53 -0
- package/dist/src/tools/diff-utils.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +9 -4
- package/dist/src/tools/edit.js +203 -34
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +225 -10
- package/dist/src/tools/edit.test.js.map +1 -1
- 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 +1 -1
- package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.js +10 -24
- package/dist/src/tools/exit-plan-mode.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.test.js +1 -1
- package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
- package/dist/src/tools/grep-utils.d.ts +49 -0
- package/dist/src/tools/grep-utils.js +139 -0
- package/dist/src/tools/grep-utils.js.map +1 -0
- package/dist/src/tools/grep.js +4 -44
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +21 -2
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.js +6 -1
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +2 -2
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +16 -18
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +51 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +22 -1
- package/dist/src/tools/mcp-client.js +95 -36
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +148 -20
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +15 -5
- package/dist/src/tools/mcp-tool.js +36 -8
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/memoryTool.js +1 -1
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +5 -0
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
- package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
- package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +4 -4
- package/dist/src/tools/read-file.js +17 -10
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +20 -10
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/ripGrep.js +49 -46
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +52 -37
- 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 +2 -2
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +1 -2
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +0 -6
- package/dist/src/tools/tool-names.js +0 -15
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +1 -0
- package/dist/src/tools/tool-registry.js +33 -6
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +47 -0
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +21 -1
- package/dist/src/tools/tools.js +19 -3
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +24 -0
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +9 -1
- package/dist/src/tools/web-fetch.js +273 -34
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +303 -30
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/write-file.js +14 -10
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +75 -0
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +2 -2
- package/dist/src/tools/write-todos.js +1 -1
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js +4 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
- package/dist/src/utils/approvalModeUtils.d.ts +14 -0
- package/dist/src/utils/approvalModeUtils.js +35 -0
- package/dist/src/utils/approvalModeUtils.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
- package/dist/src/utils/approvalModeUtils.test.js +36 -0
- package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
- package/dist/src/utils/authConsent.d.ts +1 -1
- package/dist/src/utils/authConsent.js +10 -8
- package/dist/src/utils/authConsent.js.map +1 -1
- package/dist/src/utils/authConsent.test.js +89 -44
- package/dist/src/utils/authConsent.test.js.map +1 -1
- package/dist/src/utils/compatibility.d.ts +41 -0
- package/dist/src/utils/compatibility.js +112 -0
- package/dist/src/utils/compatibility.js.map +1 -0
- package/dist/src/utils/compatibility.test.d.ts +6 -0
- package/dist/src/utils/compatibility.test.js +233 -0
- package/dist/src/utils/compatibility.test.js.map +1 -0
- package/dist/src/utils/editCorrector.js +22 -29
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/envExpansion.d.ts +18 -0
- package/dist/src/utils/envExpansion.js +46 -0
- package/dist/src/utils/envExpansion.js.map +1 -0
- package/dist/src/utils/envExpansion.test.d.ts +6 -0
- package/dist/src/utils/envExpansion.test.js +110 -0
- package/dist/src/utils/envExpansion.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +1 -0
- package/dist/src/utils/errors.js +55 -10
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +27 -1
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +17 -0
- package/dist/src/utils/events.js +12 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.d.ts +1 -1
- package/dist/src/utils/events.test.js +50 -3
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/fastAckHelper.js +2 -1
- package/dist/src/utils/fastAckHelper.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +1 -1
- package/dist/src/utils/fetch.js +15 -2
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fileDiffUtils.d.ts +2 -2
- package/dist/src/utils/fileDiffUtils.js +1 -2
- package/dist/src/utils/fileDiffUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +5 -3
- package/dist/src/utils/fileUtils.js +25 -16
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +14 -13
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js +4 -1
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/getFolderStructure.test.js +4 -5
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/getPty.js +4 -0
- package/dist/src/utils/getPty.js.map +1 -1
- package/dist/src/utils/googleErrors.js +29 -5
- package/dist/src/utils/googleErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.js +10 -0
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.test.js +16 -1
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +2 -0
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +1 -2
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/retry.d.ts +1 -1
- package/dist/src/utils/retry.js +9 -4
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +15 -12
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/safeJsonStringify.js +3 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +5 -3
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/session.d.ts +1 -0
- package/dist/src/utils/session.js +3 -0
- package/dist/src/utils/session.js.map +1 -1
- package/dist/src/utils/sessionUtils.d.ts +14 -0
- package/dist/src/utils/sessionUtils.js +113 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- package/dist/src/utils/sessionUtils.test.d.ts +1 -0
- package/dist/src/utils/sessionUtils.test.js +137 -0
- package/dist/src/utils/sessionUtils.test.js.map +1 -0
- package/dist/src/utils/shell-utils.js +1 -0
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/stdio.js +6 -0
- package/dist/src/utils/stdio.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +9 -0
- package/dist/src/utils/textUtils.js +15 -0
- package/dist/src/utils/textUtils.js.map +1 -1
- package/dist/src/utils/textUtils.test.js +42 -1
- package/dist/src/utils/textUtils.test.js.map +1 -1
- package/dist/src/utils/toolCallContext.d.ts +0 -5
- package/dist/src/utils/toolCallContext.js +1 -1
- package/dist/src/utils/toolCallContext.js.map +1 -1
- package/dist/src/utils/userAccountManager.js +3 -0
- package/dist/src/utils/userAccountManager.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -3
- package/dist/docs/architecture.md +0 -80
- package/dist/docs/cli/index.md +0 -123
- package/dist/docs/core/concepts.md +0 -137
- package/dist/docs/get-started/configuration-v1.md +0 -882
- package/dist/google-gemini-cli-core-0.30.0-preview.5.tgz +0 -0
- /package/dist/docs/{core → reference}/memport.md +0 -0
- /package/dist/docs/{core → reference}/tools-api.md +0 -0
- /package/dist/docs/{cli → resources}/uninstall.md +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { getResponseText } from '../../utils/partUtils.js';
|
|
7
|
+
import { safeTemplateReplace } from '../../utils/textUtils.js';
|
|
8
|
+
import { DEFAULT_GEMINI_FLASH_MODEL } from '../../config/models.js';
|
|
9
|
+
import { debugLogger } from '../../utils/debugLogger.js';
|
|
10
|
+
import { SafetyCheckDecision } from '../protocol.js';
|
|
11
|
+
import { LlmRole } from '../../telemetry/index.js';
|
|
12
|
+
const CONSECA_POLICY_GENERATION_PROMPT = `
|
|
13
|
+
You are a security expert responsible for generating fine-grained security policies for a large language model integrated into a command-line tool. Your role is to act as a "policy generator" that creates temporary, context-specific rules based on a user's prompt and the tools available to the main LLM.
|
|
14
|
+
|
|
15
|
+
Your primary goal is to enforce the principle of least privilege. The policies you create should be as restrictive as possible while still allowing the main LLM to complete the user's requested task.
|
|
16
|
+
|
|
17
|
+
For each tool that is relevant to the user's prompt, you must generate a policy object.
|
|
18
|
+
|
|
19
|
+
### Output Format
|
|
20
|
+
You must return a JSON object with a "policies" key, which is an array of objects. Each object must have:
|
|
21
|
+
- "tool_name": The name of the tool.
|
|
22
|
+
- "policy": An object with:
|
|
23
|
+
- "permissions": "allow" | "deny" | "ask_user"
|
|
24
|
+
- "constraints": A detailed description of conditions (e.g. allowed files, arguments).
|
|
25
|
+
- "rationale": Explanation for the policy.
|
|
26
|
+
|
|
27
|
+
Example JSON:
|
|
28
|
+
\`\`\`json
|
|
29
|
+
{
|
|
30
|
+
"policies": [
|
|
31
|
+
{
|
|
32
|
+
"tool_name": "read_file",
|
|
33
|
+
"policy": {
|
|
34
|
+
"permissions": "allow",
|
|
35
|
+
"constraints": "Only allow reading 'main.py'.",
|
|
36
|
+
"rationale": "User asked to read main.py"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"tool_name": "run_shell_command",
|
|
41
|
+
"policy": {
|
|
42
|
+
"permissions": "deny",
|
|
43
|
+
"constraints": "None",
|
|
44
|
+
"rationale": "Shell commands are not needed for this task"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
\`\`\`
|
|
50
|
+
|
|
51
|
+
### Guiding Principles:
|
|
52
|
+
1. **Permissions:**
|
|
53
|
+
* **allow:** Required tools for the task.
|
|
54
|
+
* **deny:** Tools clearly outside the scope.
|
|
55
|
+
* **ask_user:** Destructive actions or ambiguity.
|
|
56
|
+
|
|
57
|
+
2. **Constraints:**
|
|
58
|
+
* Be specific! Restrict file paths, command arguments, etc.
|
|
59
|
+
|
|
60
|
+
3. **Rationale:**
|
|
61
|
+
* Reference the user's prompt.
|
|
62
|
+
|
|
63
|
+
User Prompt: "{{user_prompt}}"
|
|
64
|
+
|
|
65
|
+
Trusted Tools (Context):
|
|
66
|
+
{{trusted_content}}
|
|
67
|
+
`;
|
|
68
|
+
import { z } from 'zod';
|
|
69
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
70
|
+
const ToolPolicySchema = z.object({
|
|
71
|
+
permissions: z.nativeEnum(SafetyCheckDecision),
|
|
72
|
+
constraints: z.string(),
|
|
73
|
+
rationale: z.string(),
|
|
74
|
+
});
|
|
75
|
+
const SecurityPolicyResponseSchema = z.object({
|
|
76
|
+
policies: z.array(z.object({
|
|
77
|
+
tool_name: z.string(),
|
|
78
|
+
policy: ToolPolicySchema,
|
|
79
|
+
})),
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* Generates a security policy for the given user prompt and trusted content.
|
|
83
|
+
*/
|
|
84
|
+
export async function generatePolicy(userPrompt, trustedContent, config) {
|
|
85
|
+
const model = DEFAULT_GEMINI_FLASH_MODEL;
|
|
86
|
+
const contentGenerator = config.getContentGenerator();
|
|
87
|
+
if (!contentGenerator) {
|
|
88
|
+
return { policy: {}, error: 'Content generator not initialized' };
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const result = await contentGenerator.generateContent({
|
|
92
|
+
model,
|
|
93
|
+
config: {
|
|
94
|
+
responseMimeType: 'application/json',
|
|
95
|
+
responseSchema: zodToJsonSchema(SecurityPolicyResponseSchema, {
|
|
96
|
+
target: 'openApi3',
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
contents: [
|
|
100
|
+
{
|
|
101
|
+
role: 'user',
|
|
102
|
+
parts: [
|
|
103
|
+
{
|
|
104
|
+
text: safeTemplateReplace(CONSECA_POLICY_GENERATION_PROMPT, {
|
|
105
|
+
user_prompt: userPrompt,
|
|
106
|
+
trusted_content: trustedContent,
|
|
107
|
+
}),
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
}, 'conseca-policy-generation', LlmRole.SUBAGENT);
|
|
113
|
+
const responseText = getResponseText(result);
|
|
114
|
+
debugLogger.debug(`[Conseca] Policy Generation Raw Response: ${responseText}`);
|
|
115
|
+
if (!responseText) {
|
|
116
|
+
return { policy: {}, error: 'Empty response from policy generator' };
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const parsed = SecurityPolicyResponseSchema.parse(JSON.parse(responseText));
|
|
120
|
+
const policiesList = parsed.policies;
|
|
121
|
+
const policy = {};
|
|
122
|
+
for (const item of policiesList) {
|
|
123
|
+
policy[item.tool_name] = item.policy;
|
|
124
|
+
}
|
|
125
|
+
debugLogger.debug(`[Conseca] Policy Generation Parsed:`, policy);
|
|
126
|
+
return { policy };
|
|
127
|
+
}
|
|
128
|
+
catch (parseError) {
|
|
129
|
+
debugLogger.debug(`[Conseca] Policy Generation JSON Parse Error:`, parseError);
|
|
130
|
+
return {
|
|
131
|
+
policy: {},
|
|
132
|
+
error: `JSON Parse Error: ${parseError instanceof Error ? parseError.message : String(parseError)}. Raw: ${responseText}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
debugLogger.error('Policy generation failed:', error);
|
|
138
|
+
return {
|
|
139
|
+
policy: {},
|
|
140
|
+
error: `Policy generation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=policy-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-generator.js","sourceRoot":"","sources":["../../../../src/safety/conseca/policy-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { generatePolicy } from './policy-generator.js';
|
|
8
|
+
import { SafetyCheckDecision } from '../protocol.js';
|
|
9
|
+
import { LlmRole } from '../../telemetry/index.js';
|
|
10
|
+
describe('policy_generator', () => {
|
|
11
|
+
let mockConfig;
|
|
12
|
+
let mockContentGenerator;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
mockContentGenerator = {
|
|
15
|
+
generateContent: vi.fn(),
|
|
16
|
+
};
|
|
17
|
+
mockConfig = {
|
|
18
|
+
getContentGenerator: vi.fn().mockReturnValue(mockContentGenerator),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
it('should return a policy object when content generator is available', async () => {
|
|
22
|
+
const mockPolicy = {
|
|
23
|
+
read_file: {
|
|
24
|
+
permissions: SafetyCheckDecision.ALLOW,
|
|
25
|
+
constraints: 'None',
|
|
26
|
+
rationale: 'Test',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
mockContentGenerator.generateContent = vi.fn().mockResolvedValue({
|
|
30
|
+
candidates: [
|
|
31
|
+
{
|
|
32
|
+
content: {
|
|
33
|
+
parts: [
|
|
34
|
+
{
|
|
35
|
+
text: JSON.stringify({
|
|
36
|
+
policies: [
|
|
37
|
+
{
|
|
38
|
+
tool_name: 'read_file',
|
|
39
|
+
policy: mockPolicy.read_file,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
}),
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
const result = await generatePolicy('test prompt', 'trusted content', mockConfig);
|
|
50
|
+
expect(mockConfig.getContentGenerator).toHaveBeenCalled();
|
|
51
|
+
expect(mockContentGenerator.generateContent).toHaveBeenCalledWith(expect.objectContaining({
|
|
52
|
+
model: expect.any(String),
|
|
53
|
+
config: expect.objectContaining({
|
|
54
|
+
responseMimeType: 'application/json',
|
|
55
|
+
responseSchema: expect.any(Object),
|
|
56
|
+
}),
|
|
57
|
+
contents: expect.any(Array),
|
|
58
|
+
}), 'conseca-policy-generation', LlmRole.SUBAGENT);
|
|
59
|
+
expect(result.policy).toEqual(mockPolicy);
|
|
60
|
+
expect(result.error).toBeUndefined();
|
|
61
|
+
});
|
|
62
|
+
it('should handle missing content generator gracefully', async () => {
|
|
63
|
+
vi.mocked(mockConfig.getContentGenerator).mockReturnValue(undefined);
|
|
64
|
+
const result = await generatePolicy('test prompt', 'trusted content', mockConfig);
|
|
65
|
+
expect(result.policy).toEqual({});
|
|
66
|
+
expect(result.error).toBe('Content generator not initialized');
|
|
67
|
+
});
|
|
68
|
+
it('should prevent template injection (double interpolation)', async () => {
|
|
69
|
+
mockContentGenerator.generateContent = vi.fn().mockResolvedValue({});
|
|
70
|
+
const userPrompt = '{{trusted_content}}';
|
|
71
|
+
const trustedContent = 'SECRET_DATA';
|
|
72
|
+
await generatePolicy(userPrompt, trustedContent, mockConfig);
|
|
73
|
+
const generateContentCall = vi.mocked(mockContentGenerator.generateContent)
|
|
74
|
+
.mock.calls[0];
|
|
75
|
+
const request = generateContentCall[0];
|
|
76
|
+
const promptText = request.contents[0].parts[0].text;
|
|
77
|
+
// The user prompt should contain the literal placeholder, NOT the secret data
|
|
78
|
+
expect(promptText).toContain('User Prompt: "{{trusted_content}}"');
|
|
79
|
+
expect(promptText).not.toContain('User Prompt: "SECRET_DATA"');
|
|
80
|
+
// The trusted tools section SHOULD contain the secret data
|
|
81
|
+
expect(promptText).toContain('Trusted Tools (Context):\nSECRET_DATA');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=policy-generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-generator.test.js","sourceRoot":"","sources":["../../../../src/safety/conseca/policy-generator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { SafetyCheckDecision } from '../protocol.js';
|
|
7
|
+
export interface ToolPolicy {
|
|
8
|
+
permissions: SafetyCheckDecision;
|
|
9
|
+
constraints: string;
|
|
10
|
+
rationale: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A map of tool names to their specific security policies.
|
|
14
|
+
*/
|
|
15
|
+
export type SecurityPolicy = Record<string, ToolPolicy>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/safety/conseca/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -3,15 +3,14 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type { SafetyCheckInput
|
|
6
|
+
import type { SafetyCheckInput } from './protocol.js';
|
|
7
7
|
import type { Config } from '../config/config.js';
|
|
8
8
|
/**
|
|
9
9
|
* Builds context objects for safety checkers, ensuring sensitive data is filtered.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ContextBuilder {
|
|
12
12
|
private readonly config;
|
|
13
|
-
|
|
14
|
-
constructor(config: Config, conversationHistory?: ConversationTurn[]);
|
|
13
|
+
constructor(config: Config);
|
|
15
14
|
/**
|
|
16
15
|
* Builds the full context object with all available data.
|
|
17
16
|
*/
|
|
@@ -20,4 +19,5 @@ export declare class ContextBuilder {
|
|
|
20
19
|
* Builds a minimal context with only the specified keys.
|
|
21
20
|
*/
|
|
22
21
|
buildMinimalContext(requiredKeys: Array<keyof SafetyCheckInput['context']>): SafetyCheckInput['context'];
|
|
22
|
+
private convertHistoryToTurns;
|
|
23
23
|
}
|
|
@@ -3,20 +3,34 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
6
7
|
/**
|
|
7
8
|
* Builds context objects for safety checkers, ensuring sensitive data is filtered.
|
|
8
9
|
*/
|
|
9
10
|
export class ContextBuilder {
|
|
10
11
|
config;
|
|
11
|
-
|
|
12
|
-
constructor(config, conversationHistory = []) {
|
|
12
|
+
constructor(config) {
|
|
13
13
|
this.config = config;
|
|
14
|
-
this.conversationHistory = conversationHistory;
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
17
16
|
* Builds the full context object with all available data.
|
|
18
17
|
*/
|
|
19
18
|
buildFullContext() {
|
|
19
|
+
const clientHistory = this.config.getGeminiClient()?.getHistory() || [];
|
|
20
|
+
const history = this.convertHistoryToTurns(clientHistory);
|
|
21
|
+
debugLogger.debug(`[ContextBuilder] buildFullContext called. Converted history length: ${history.length}`);
|
|
22
|
+
// ContextBuilder's responsibility is to provide the *current* context.
|
|
23
|
+
// If the conversation hasn't started (history is empty), we check if there's a pending question.
|
|
24
|
+
// However, if the history is NOT empty, we trust it reflects the true state.
|
|
25
|
+
const currentQuestion = this.config.getQuestion();
|
|
26
|
+
if (currentQuestion && history.length === 0) {
|
|
27
|
+
history.push({
|
|
28
|
+
user: {
|
|
29
|
+
text: currentQuestion,
|
|
30
|
+
},
|
|
31
|
+
model: {},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
20
34
|
return {
|
|
21
35
|
environment: {
|
|
22
36
|
cwd: process.cwd(),
|
|
@@ -26,7 +40,7 @@ export class ContextBuilder {
|
|
|
26
40
|
.getDirectories(),
|
|
27
41
|
},
|
|
28
42
|
history: {
|
|
29
|
-
turns:
|
|
43
|
+
turns: history,
|
|
30
44
|
},
|
|
31
45
|
};
|
|
32
46
|
}
|
|
@@ -45,5 +59,47 @@ export class ContextBuilder {
|
|
|
45
59
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
46
60
|
return minimalContext;
|
|
47
61
|
}
|
|
62
|
+
// Helper to convert Google GenAI Content[] to Safety Protocol ConversationTurn[]
|
|
63
|
+
convertHistoryToTurns(history) {
|
|
64
|
+
const turns = [];
|
|
65
|
+
let currentUserRequest;
|
|
66
|
+
for (const content of history) {
|
|
67
|
+
if (content.role === 'user') {
|
|
68
|
+
if (currentUserRequest) {
|
|
69
|
+
// Previous user turn didn't have a matching model response (or it was filtered out)
|
|
70
|
+
// Push it as a turn with empty model response
|
|
71
|
+
turns.push({ user: currentUserRequest, model: {} });
|
|
72
|
+
}
|
|
73
|
+
currentUserRequest = {
|
|
74
|
+
text: content.parts?.map((p) => p.text).join('') || '',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else if (content.role === 'model') {
|
|
78
|
+
const modelResponse = {
|
|
79
|
+
text: content.parts
|
|
80
|
+
?.filter((p) => p.text)
|
|
81
|
+
.map((p) => p.text)
|
|
82
|
+
.join('') || '',
|
|
83
|
+
toolCalls: content.parts
|
|
84
|
+
?.filter((p) => 'functionCall' in p)
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
86
|
+
.map((p) => p.functionCall) || [],
|
|
87
|
+
};
|
|
88
|
+
if (currentUserRequest) {
|
|
89
|
+
turns.push({ user: currentUserRequest, model: modelResponse });
|
|
90
|
+
currentUserRequest = undefined;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Model response without preceding user request.
|
|
94
|
+
// This creates a turn with empty user text.
|
|
95
|
+
turns.push({ user: { text: '' }, model: modelResponse });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (currentUserRequest) {
|
|
100
|
+
turns.push({ user: currentUserRequest, model: {} });
|
|
101
|
+
}
|
|
102
|
+
return turns;
|
|
103
|
+
}
|
|
48
104
|
}
|
|
49
105
|
//# sourceMappingURL=context-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/safety/context-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/safety/context-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,42 +8,122 @@ import { ContextBuilder } from './context-builder.js';
|
|
|
8
8
|
describe('ContextBuilder', () => {
|
|
9
9
|
let contextBuilder;
|
|
10
10
|
let mockConfig;
|
|
11
|
-
|
|
12
|
-
{ user: { text: 'hello' }, model: { text: 'hi' } },
|
|
13
|
-
];
|
|
11
|
+
let mockHistory;
|
|
14
12
|
const mockCwd = '/home/user/project';
|
|
15
13
|
const mockWorkspaces = ['/home/user/project'];
|
|
16
14
|
beforeEach(() => {
|
|
17
15
|
vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
|
|
16
|
+
mockHistory = [];
|
|
18
17
|
mockConfig = {
|
|
19
18
|
getWorkspaceContext: vi.fn().mockReturnValue({
|
|
20
19
|
getDirectories: vi.fn().mockReturnValue(mockWorkspaces),
|
|
21
20
|
}),
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
getQuestion: vi.fn().mockReturnValue('mock question'),
|
|
22
|
+
getGeminiClient: vi.fn().mockReturnValue({
|
|
23
|
+
getHistory: vi.fn().mockImplementation(() => mockHistory),
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
contextBuilder = new ContextBuilder(mockConfig);
|
|
27
|
+
});
|
|
28
|
+
it('should build full context with empty history', () => {
|
|
29
|
+
mockHistory = [];
|
|
30
|
+
// Should inject current question
|
|
31
|
+
const context = contextBuilder.buildFullContext();
|
|
32
|
+
expect(context.history?.turns).toEqual([
|
|
33
|
+
{
|
|
34
|
+
user: { text: 'mock question' },
|
|
35
|
+
model: {},
|
|
27
36
|
},
|
|
37
|
+
]);
|
|
38
|
+
});
|
|
39
|
+
it('should build full context with existing history (User -> Model)', () => {
|
|
40
|
+
mockHistory = [
|
|
41
|
+
{ role: 'user', parts: [{ text: 'Hello' }] },
|
|
42
|
+
{ role: 'model', parts: [{ text: 'Hi there' }] },
|
|
43
|
+
];
|
|
44
|
+
// Should NOT inject current question if history exists
|
|
45
|
+
const context = contextBuilder.buildFullContext();
|
|
46
|
+
expect(context.history?.turns).toHaveLength(1);
|
|
47
|
+
expect(context.history?.turns[0]).toEqual({
|
|
48
|
+
user: { text: 'Hello' },
|
|
49
|
+
model: { text: 'Hi there', toolCalls: [] },
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
it('should handle history with tool calls', () => {
|
|
53
|
+
const mockToolCall = {
|
|
54
|
+
id: 'call_1',
|
|
55
|
+
name: 'list_files',
|
|
56
|
+
args: { path: '.' },
|
|
28
57
|
};
|
|
29
|
-
|
|
58
|
+
mockHistory = [
|
|
59
|
+
{ role: 'user', parts: [{ text: 'List files' }] },
|
|
60
|
+
{
|
|
61
|
+
role: 'model',
|
|
62
|
+
parts: [
|
|
63
|
+
{ text: 'Sure, listing files.' },
|
|
64
|
+
{ functionCall: mockToolCall },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
const context = contextBuilder.buildFullContext();
|
|
69
|
+
expect(context.history?.turns).toHaveLength(1);
|
|
70
|
+
expect(context.history?.turns[0].model.toolCalls).toEqual([mockToolCall]);
|
|
71
|
+
expect(context.history?.turns[0].model.text).toBe('Sure, listing files.');
|
|
30
72
|
});
|
|
31
|
-
it('should
|
|
73
|
+
it('should handle orphan model response (Model starts conversation)', () => {
|
|
74
|
+
mockHistory = [
|
|
75
|
+
{ role: 'model', parts: [{ text: 'Welcome!' }] },
|
|
76
|
+
{ role: 'user', parts: [{ text: 'Thanks' }] },
|
|
77
|
+
];
|
|
32
78
|
const context = contextBuilder.buildFullContext();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
expect(context.history?.turns).
|
|
79
|
+
// 1. Orphan model response -> Turn 1: User="" Model="Welcome!"
|
|
80
|
+
// 2. User "Thanks" -> Turn 2: User="Thanks" Model={} (pending)
|
|
81
|
+
expect(context.history?.turns).toHaveLength(2);
|
|
82
|
+
expect(context.history?.turns[0]).toEqual({
|
|
83
|
+
user: { text: '' },
|
|
84
|
+
model: { text: 'Welcome!', toolCalls: [] },
|
|
85
|
+
});
|
|
86
|
+
expect(context.history?.turns[1]).toEqual({
|
|
87
|
+
user: { text: 'Thanks' },
|
|
88
|
+
model: {},
|
|
89
|
+
});
|
|
36
90
|
});
|
|
37
|
-
it('should
|
|
91
|
+
it('should handle multiple user turns in a row', () => {
|
|
92
|
+
mockHistory = [
|
|
93
|
+
{ role: 'user', parts: [{ text: 'Q1' }] },
|
|
94
|
+
{ role: 'user', parts: [{ text: 'Q2' }] },
|
|
95
|
+
{ role: 'model', parts: [{ text: 'A2' }] },
|
|
96
|
+
];
|
|
97
|
+
const context = contextBuilder.buildFullContext();
|
|
98
|
+
// 1. "Q1" -> Turn 1: User="Q1" Model={}
|
|
99
|
+
// 2. "Q2" -> Turn 2: User="Q2" Model="A2"
|
|
100
|
+
expect(context.history?.turns).toHaveLength(2);
|
|
101
|
+
expect(context.history?.turns[0]).toEqual({
|
|
102
|
+
user: { text: 'Q1' },
|
|
103
|
+
model: {},
|
|
104
|
+
});
|
|
105
|
+
expect(context.history?.turns[1]).toEqual({
|
|
106
|
+
user: { text: 'Q2' },
|
|
107
|
+
model: { text: 'A2', toolCalls: [] },
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('should build minimal context', () => {
|
|
111
|
+
mockHistory = [{ role: 'user', parts: [{ text: 'test' }] }];
|
|
38
112
|
const context = contextBuilder.buildMinimalContext(['environment']);
|
|
39
113
|
expect(context).toHaveProperty('environment');
|
|
40
|
-
expect(context).not.toHaveProperty('config');
|
|
41
114
|
expect(context).not.toHaveProperty('history');
|
|
42
115
|
});
|
|
43
|
-
it('should handle
|
|
44
|
-
|
|
116
|
+
it('should handle undefined parts gracefully', () => {
|
|
117
|
+
mockHistory = [
|
|
118
|
+
{ role: 'user', parts: undefined },
|
|
119
|
+
{ role: 'model', parts: undefined },
|
|
120
|
+
];
|
|
45
121
|
const context = contextBuilder.buildFullContext();
|
|
46
|
-
expect(context.history?.turns).
|
|
122
|
+
expect(context.history?.turns).toHaveLength(1);
|
|
123
|
+
expect(context.history?.turns[0]).toEqual({
|
|
124
|
+
user: { text: '' },
|
|
125
|
+
model: { text: '', toolCalls: [] },
|
|
126
|
+
});
|
|
47
127
|
});
|
|
48
128
|
});
|
|
49
129
|
//# sourceMappingURL=context-builder.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-builder.test.js","sourceRoot":"","sources":["../../../src/safety/context-builder.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,cAA8B,CAAC;IACnC,IAAI,
|
|
1
|
+
{"version":3,"file":"context-builder.test.js","sourceRoot":"","sources":["../../../src/safety/context-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,6 +79,10 @@ export type SafetyCheckResult = {
|
|
|
79
79
|
* This will be shown to the user.
|
|
80
80
|
*/
|
|
81
81
|
reason?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Optional error message if the decision was made due to a system failure (fail-open).
|
|
84
|
+
*/
|
|
85
|
+
error?: string;
|
|
82
86
|
} | {
|
|
83
87
|
decision: SafetyCheckDecision.DENY;
|
|
84
88
|
reason: string;
|
|
@@ -10,7 +10,8 @@ import { type InProcessChecker } from './built-in.js';
|
|
|
10
10
|
export declare class CheckerRegistry {
|
|
11
11
|
private readonly checkersPath;
|
|
12
12
|
private static readonly BUILT_IN_EXTERNAL_CHECKERS;
|
|
13
|
-
private static
|
|
13
|
+
private static BUILT_IN_IN_PROCESS_CHECKERS;
|
|
14
|
+
private static getBuiltInInProcessCheckers;
|
|
14
15
|
private static readonly VALID_NAME_PATTERN;
|
|
15
16
|
constructor(checkersPath: string);
|
|
16
17
|
/**
|
|
@@ -7,6 +7,7 @@ import * as path from 'node:path';
|
|
|
7
7
|
import * as fs from 'node:fs';
|
|
8
8
|
import { AllowedPathChecker } from './built-in.js';
|
|
9
9
|
import { InProcessCheckerType } from '../policy/types.js';
|
|
10
|
+
import { ConsecaSafetyChecker } from './conseca/conseca.js';
|
|
10
11
|
/**
|
|
11
12
|
* Registry for managing safety checker resolution.
|
|
12
13
|
*/
|
|
@@ -15,7 +16,16 @@ export class CheckerRegistry {
|
|
|
15
16
|
static BUILT_IN_EXTERNAL_CHECKERS = new Map([
|
|
16
17
|
// No external built-ins for now
|
|
17
18
|
]);
|
|
18
|
-
static BUILT_IN_IN_PROCESS_CHECKERS
|
|
19
|
+
static BUILT_IN_IN_PROCESS_CHECKERS;
|
|
20
|
+
static getBuiltInInProcessCheckers() {
|
|
21
|
+
if (!CheckerRegistry.BUILT_IN_IN_PROCESS_CHECKERS) {
|
|
22
|
+
CheckerRegistry.BUILT_IN_IN_PROCESS_CHECKERS = new Map([
|
|
23
|
+
[InProcessCheckerType.ALLOWED_PATH, new AllowedPathChecker()],
|
|
24
|
+
[InProcessCheckerType.CONSECA, ConsecaSafetyChecker.getInstance()],
|
|
25
|
+
]);
|
|
26
|
+
}
|
|
27
|
+
return CheckerRegistry.BUILT_IN_IN_PROCESS_CHECKERS;
|
|
28
|
+
}
|
|
19
29
|
// Regex to validate checker names (alphanumeric and hyphens only)
|
|
20
30
|
static VALID_NAME_PATTERN = /^[a-z0-9-]+$/;
|
|
21
31
|
constructor(checkersPath) {
|
|
@@ -46,11 +56,11 @@ export class CheckerRegistry {
|
|
|
46
56
|
if (!CheckerRegistry.isValidCheckerName(name)) {
|
|
47
57
|
throw new Error(`Invalid checker name "${name}".`);
|
|
48
58
|
}
|
|
49
|
-
const checker = CheckerRegistry.
|
|
59
|
+
const checker = CheckerRegistry.getBuiltInInProcessCheckers().get(name);
|
|
50
60
|
if (checker) {
|
|
51
61
|
return checker;
|
|
52
62
|
}
|
|
53
|
-
throw new Error(`Unknown in-process checker "${name}". Available: ${Array.from(CheckerRegistry.
|
|
63
|
+
throw new Error(`Unknown in-process checker "${name}". Available: ${Array.from(CheckerRegistry.getBuiltInInProcessCheckers().keys()).join(', ')}`);
|
|
54
64
|
}
|
|
55
65
|
static isValidCheckerName(name) {
|
|
56
66
|
return this.VALID_NAME_PATTERN.test(name) && !name.includes('..');
|
|
@@ -58,7 +68,7 @@ export class CheckerRegistry {
|
|
|
58
68
|
static getBuiltInCheckers() {
|
|
59
69
|
return [
|
|
60
70
|
...Array.from(this.BUILT_IN_EXTERNAL_CHECKERS.keys()),
|
|
61
|
-
...Array.from(this.
|
|
71
|
+
...Array.from(this.getBuiltInInProcessCheckers().keys()),
|
|
62
72
|
];
|
|
63
73
|
}
|
|
64
74
|
}
|