@dexto/core 1.7.2 → 1.8.1
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/agent/DextoAgent.cjs +163 -77
- package/dist/agent/DextoAgent.d.ts +73 -19
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +165 -67
- package/dist/agent/agent-options.d.ts +6 -10
- package/dist/agent/agent-options.d.ts.map +1 -1
- package/dist/agent/agentCard.js +1 -1
- package/dist/agent/error-codes.js +1 -1
- package/dist/agent/errors.js +1 -1
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/schemas.d.ts +2 -2
- package/dist/agent/schemas.js +1 -1
- package/dist/agent/state-manager.js +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/approval/error-codes.cjs +1 -1
- package/dist/approval/error-codes.d.ts +1 -1
- package/dist/approval/error-codes.d.ts.map +1 -1
- package/dist/approval/error-codes.js +2 -2
- package/dist/approval/errors.cjs +2 -5
- package/dist/approval/errors.d.ts.map +1 -1
- package/dist/approval/errors.js +3 -6
- package/dist/approval/factory.cjs +19 -4
- package/dist/approval/factory.d.ts +4 -1
- package/dist/approval/factory.d.ts.map +1 -1
- package/dist/approval/factory.js +19 -5
- package/dist/approval/index.d.ts +1 -1
- package/dist/approval/index.d.ts.map +1 -1
- package/dist/approval/index.js +1 -1
- package/dist/approval/manager.cjs +168 -26
- package/dist/approval/manager.d.ts +46 -12
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +177 -29
- package/dist/approval/schemas.cjs +26 -26
- package/dist/approval/schemas.d.ts +29 -29
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +23 -23
- package/dist/approval/types.cjs +5 -5
- package/dist/approval/types.d.ts +18 -18
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/approval/types.js +6 -6
- package/dist/{chunk-PTJYTZNU.js → chunk-C6A6W6XS.js} +1 -44
- package/dist/config/index.cjs +75 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +50 -0
- package/dist/context/compaction/overflow.d.ts +1 -1
- package/dist/context/compaction/overflow.d.ts.map +1 -1
- package/dist/context/compaction/overflow.js +1 -1
- package/dist/context/compaction/strategies/noop.js +1 -1
- package/dist/context/compaction/strategies/reactive-overflow-compaction.js +1 -1
- package/dist/context/content-clone.cjs +131 -0
- package/dist/context/content-clone.d.ts +7 -0
- package/dist/context/content-clone.d.ts.map +1 -0
- package/dist/context/content-clone.js +104 -0
- package/dist/context/error-codes.js +1 -1
- package/dist/context/errors.js +1 -1
- package/dist/context/index.cjs +2 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +2 -1
- package/dist/context/manager.cjs +52 -41
- package/dist/context/manager.d.ts +8 -8
- package/dist/context/manager.d.ts.map +1 -1
- package/dist/context/manager.js +46 -35
- package/dist/context/media-helpers.js +1 -1
- package/dist/context/schemas.cjs +77 -0
- package/dist/context/schemas.d.ts +5 -0
- package/dist/context/schemas.d.ts.map +1 -0
- package/dist/context/schemas.js +53 -0
- package/dist/context/types.d.ts +1 -1
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js +1 -1
- package/dist/context/utils.cjs +73 -72
- package/dist/context/utils.d.ts +4 -4
- package/dist/context/utils.d.ts.map +1 -1
- package/dist/context/utils.js +72 -71
- package/dist/errors/DextoBaseError.js +1 -1
- package/dist/errors/DextoRuntimeError.js +1 -1
- package/dist/errors/DextoValidationError.js +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/errors/result-bridge.js +1 -1
- package/dist/errors/types.js +1 -1
- package/dist/events/index.cjs +9 -1
- package/dist/events/index.d.ts +22 -10
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +10 -2
- package/dist/hooks/builtins/content-policy.js +1 -1
- package/dist/hooks/builtins/response-sanitizer.js +1 -1
- package/dist/hooks/error-codes.js +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/manager.cjs +1 -1
- package/dist/hooks/manager.d.ts +2 -2
- package/dist/hooks/manager.d.ts.map +1 -1
- package/dist/hooks/manager.js +2 -2
- package/dist/hooks/types.d.ts +2 -2
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.browser.cjs +9 -9
- package/dist/index.browser.d.ts +4 -4
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +2 -2
- package/dist/index.cjs +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/llm/curation-config.cjs +3 -3
- package/dist/llm/curation-config.d.ts +1 -1
- package/dist/llm/curation-config.js +4 -4
- package/dist/llm/curation.cjs +2 -2
- package/dist/llm/curation.d.ts +2 -2
- package/dist/llm/curation.d.ts.map +1 -1
- package/dist/llm/curation.js +2 -2
- package/dist/llm/error-codes.js +1 -1
- package/dist/llm/errors.cjs +3 -3
- package/dist/llm/errors.d.ts +1 -1
- package/dist/llm/errors.d.ts.map +1 -1
- package/dist/llm/errors.js +2 -2
- package/dist/llm/{reasoning/anthropic-betas.cjs → executor/index.cjs} +10 -9
- package/dist/llm/executor/index.d.ts +2 -0
- package/dist/llm/executor/index.d.ts.map +1 -0
- package/dist/llm/executor/index.js +11 -0
- package/dist/llm/executor/provider-options.cjs +22 -25
- package/dist/llm/executor/provider-options.d.ts +1 -1
- package/dist/llm/executor/provider-options.d.ts.map +1 -1
- package/dist/llm/executor/provider-options.js +18 -17
- package/dist/llm/executor/stream-processor.cjs +28 -139
- package/dist/llm/executor/stream-processor.d.ts +3 -14
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +29 -140
- package/dist/llm/{reasoning/profiles/openai.cjs → executor/tool-definitions.cjs} +22 -18
- package/dist/llm/executor/tool-definitions.d.ts +4 -0
- package/dist/llm/executor/tool-definitions.d.ts.map +1 -0
- package/dist/llm/executor/tool-definitions.js +22 -0
- package/dist/llm/executor/tool-output-truncator.js +1 -1
- package/dist/llm/executor/turn-executor.cjs +1093 -458
- package/dist/llm/executor/turn-executor.d.ts +269 -43
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +1079 -405
- package/dist/llm/executor/types.d.ts +7 -1
- package/dist/llm/executor/types.d.ts.map +1 -1
- package/dist/llm/formatters/vercel.cjs +2 -2
- package/dist/llm/formatters/vercel.d.ts +1 -1
- package/dist/llm/formatters/vercel.d.ts.map +1 -1
- package/dist/llm/formatters/vercel.js +1 -1
- package/dist/llm/index.cjs +2 -4
- package/dist/llm/index.d.ts +1 -2
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +2 -3
- package/dist/llm/providers/codex-app-server.cjs +22 -2
- package/dist/llm/providers/codex-app-server.d.ts.map +1 -1
- package/dist/llm/providers/codex-app-server.js +23 -3
- package/dist/llm/providers/codex-base-url.js +1 -1
- package/dist/llm/providers/local/ai-sdk-adapter.js +1 -1
- package/dist/llm/providers/local/downloader.js +1 -1
- package/dist/llm/providers/local/error-codes.js +1 -1
- package/dist/llm/providers/local/errors.js +1 -1
- package/dist/llm/providers/local/gpu-detector.js +1 -1
- package/dist/llm/providers/local/index.js +1 -1
- package/dist/llm/providers/local/node-llama-provider.js +1 -1
- package/dist/llm/providers/local/ollama-provider.js +1 -1
- package/dist/llm/providers/local/registry.js +1 -1
- package/dist/llm/providers/local/schemas.js +1 -1
- package/dist/llm/providers/openrouter-model-registry.js +1 -1
- package/dist/llm/registry/auto-update.cjs +5 -5
- package/dist/llm/registry/auto-update.d.ts.map +1 -1
- package/dist/llm/registry/auto-update.js +3 -3
- package/dist/llm/registry/index.cjs +96 -789
- package/dist/llm/registry/index.d.ts +4 -323
- package/dist/llm/registry/index.d.ts.map +1 -1
- package/dist/llm/registry/index.js +100 -763
- package/dist/llm/registry/sync.d.ts +2 -2
- package/dist/llm/registry/sync.d.ts.map +1 -1
- package/dist/llm/registry/sync.js +1 -1
- package/dist/llm/resolver.cjs +7 -6
- package/dist/llm/resolver.d.ts +1 -1
- package/dist/llm/resolver.js +5 -5
- package/dist/llm/schemas.cjs +14 -14
- package/dist/llm/schemas.d.ts +1 -1
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +6 -5
- package/dist/llm/services/factory.cjs +13 -15
- package/dist/llm/services/factory.d.ts +3 -3
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +16 -16
- package/dist/llm/services/types.d.ts +11 -2
- package/dist/llm/services/types.d.ts.map +1 -1
- package/dist/llm/services/vercel.cjs +23 -8
- package/dist/llm/services/vercel.d.ts +11 -7
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +24 -9
- package/dist/llm/usage-metadata.cjs +23 -6
- package/dist/llm/usage-metadata.d.ts +3 -2
- package/dist/llm/usage-metadata.d.ts.map +1 -1
- package/dist/llm/usage-metadata.js +20 -7
- package/dist/llm/usage-scope.js +1 -1
- package/dist/llm/usage-summary.d.ts +1 -1
- package/dist/llm/usage-summary.js +1 -1
- package/dist/llm/validation.cjs +4 -4
- package/dist/llm/validation.d.ts +1 -1
- package/dist/llm/validation.js +2 -2
- package/dist/logger/browser.js +1 -1
- package/dist/logger/default-logger-factory.js +1 -1
- package/dist/logger/factory.js +1 -1
- package/dist/logger/index.js +1 -1
- package/dist/logger/logger.js +1 -1
- package/dist/logger/v2/dexto-logger.js +1 -1
- package/dist/logger/v2/error-codes.js +1 -1
- package/dist/logger/v2/errors.js +1 -1
- package/dist/logger/v2/schemas.js +1 -1
- package/dist/logger/v2/test-utils.js +1 -1
- package/dist/logger/v2/transport-factory.js +1 -1
- package/dist/logger/v2/transports/console-transport.js +1 -1
- package/dist/logger/v2/transports/file-transport.js +1 -1
- package/dist/logger/v2/transports/silent-transport.js +1 -1
- package/dist/logger/v2/types.js +1 -1
- package/dist/mcp/bundled-config.js +1 -1
- package/dist/mcp/error-codes.js +1 -1
- package/dist/mcp/errors.js +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/manager.js +1 -1
- package/dist/mcp/mcp-client.js +1 -1
- package/dist/mcp/resolver.js +1 -1
- package/dist/mcp/schemas.js +1 -1
- package/dist/memory/error-codes.js +1 -1
- package/dist/memory/errors.js +1 -1
- package/dist/memory/index.js +1 -1
- package/dist/memory/manager.cjs +7 -27
- package/dist/memory/manager.d.ts +4 -12
- package/dist/memory/manager.d.ts.map +1 -1
- package/dist/memory/manager.js +8 -28
- package/dist/memory/schemas.js +1 -1
- package/dist/prompts/error-codes.js +1 -1
- package/dist/prompts/errors.js +1 -1
- package/dist/prompts/index.js +1 -1
- package/dist/prompts/name-validation.js +1 -1
- package/dist/prompts/prompt-manager.cjs +9 -38
- package/dist/prompts/prompt-manager.d.ts +2 -10
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.js +10 -39
- package/dist/prompts/providers/config-prompt-provider.cjs +8 -87
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +9 -88
- package/dist/prompts/providers/custom-prompt-provider.cjs +21 -22
- package/dist/prompts/providers/custom-prompt-provider.d.ts +19 -4
- package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/custom-prompt-provider.js +22 -23
- package/dist/prompts/providers/mcp-prompt-provider.js +1 -1
- package/dist/prompts/schemas.cjs +2 -24
- package/dist/prompts/schemas.d.ts +0 -52
- package/dist/prompts/schemas.d.ts.map +1 -1
- package/dist/prompts/schemas.js +3 -25
- package/dist/prompts/types.d.ts +5 -32
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/prompts/utils.js +1 -1
- package/dist/resources/agent-resources-provider.js +1 -1
- package/dist/resources/error-codes.js +1 -1
- package/dist/resources/errors.js +1 -1
- package/dist/resources/handlers/blob-handler.cjs +14 -11
- package/dist/resources/handlers/blob-handler.d.ts +4 -4
- package/dist/resources/handlers/blob-handler.d.ts.map +1 -1
- package/dist/resources/handlers/blob-handler.js +15 -12
- package/dist/resources/handlers/factory.cjs +3 -3
- package/dist/resources/handlers/factory.js +4 -4
- package/dist/resources/handlers/filesystem-handler.js +1 -1
- package/dist/resources/handlers/types.d.ts +2 -2
- package/dist/resources/handlers/types.d.ts.map +1 -1
- package/dist/resources/index.js +1 -1
- package/dist/resources/manager.cjs +10 -7
- package/dist/resources/manager.d.ts +4 -4
- package/dist/resources/manager.d.ts.map +1 -1
- package/dist/resources/manager.js +11 -8
- package/dist/resources/reference-parser.js +1 -1
- package/dist/resources/schemas.cjs +1 -1
- package/dist/resources/schemas.d.ts +2 -2
- package/dist/resources/schemas.js +2 -2
- package/dist/runtime/host-runtime.js +1 -1
- package/dist/runtime/index.cjs +3 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -1
- package/dist/runtime/run-context.js +1 -1
- package/dist/search/index.js +1 -1
- package/dist/search/search-service.cjs +6 -13
- package/dist/search/search-service.d.ts +5 -3
- package/dist/search/search-service.d.ts.map +1 -1
- package/dist/search/search-service.js +7 -14
- package/dist/session/chat-session.cjs +264 -108
- package/dist/session/chat-session.d.ts +75 -21
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +268 -108
- package/dist/session/error-codes.js +1 -1
- package/dist/session/errors.js +1 -1
- package/dist/session/index.cjs +19 -2
- package/dist/session/index.d.ts +4 -3
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +19 -3
- package/dist/session/message-queue.cjs +82 -51
- package/dist/session/message-queue.d.ts +13 -8
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +83 -52
- package/dist/session/queue-clone.cjs +50 -0
- package/dist/session/queue-clone.d.ts +5 -0
- package/dist/session/queue-clone.d.ts.map +1 -0
- package/dist/session/queue-clone.js +25 -0
- package/dist/session/schemas.cjs +74 -2
- package/dist/session/schemas.d.ts +94 -0
- package/dist/session/schemas.d.ts.map +1 -1
- package/dist/session/schemas.js +69 -2
- package/dist/session/session-manager.cjs +107 -123
- package/dist/session/session-manager.d.ts +8 -7
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +108 -124
- package/dist/session/title-generator.cjs +14 -26
- package/dist/session/title-generator.d.ts +4 -6
- package/dist/session/title-generator.d.ts.map +1 -1
- package/dist/session/title-generator.js +16 -28
- package/dist/session/types.cjs +28 -0
- package/dist/session/types.d.ts +5 -1
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js +19 -0
- package/dist/{session/history/factory.cjs → skills/index.cjs} +9 -9
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +7 -0
- package/dist/skills/skill-manager.cjs +76 -0
- package/dist/skills/skill-manager.d.ts +13 -0
- package/dist/skills/skill-manager.d.ts.map +1 -0
- package/dist/skills/skill-manager.js +53 -0
- package/dist/skills/types.d.ts +24 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/workspace-skill-source.cjs +120 -0
- package/dist/skills/workspace-skill-source.d.ts +16 -0
- package/dist/skills/workspace-skill-source.d.ts.map +1 -0
- package/dist/skills/workspace-skill-source.js +97 -0
- package/dist/{llm → storage/approvals}/types.cjs +13 -30
- package/dist/storage/approvals/types.d.ts +54 -0
- package/dist/storage/approvals/types.d.ts.map +1 -0
- package/dist/storage/approvals/types.js +14 -0
- package/dist/storage/artifacts/types.d.ts +73 -0
- package/dist/storage/artifacts/types.d.ts.map +1 -0
- package/dist/storage/conversation/database.cjs +233 -0
- package/dist/storage/conversation/database.d.ts +38 -0
- package/dist/storage/conversation/database.d.ts.map +1 -0
- package/dist/storage/conversation/database.js +210 -0
- package/dist/storage/conversation/types.cjs +16 -0
- package/dist/storage/conversation/types.d.ts +21 -0
- package/dist/storage/conversation/types.d.ts.map +1 -0
- package/dist/storage/conversation/types.js +0 -0
- package/dist/storage/database/types.d.ts +4 -0
- package/dist/storage/database/types.d.ts.map +1 -1
- package/dist/storage/error-codes.js +1 -1
- package/dist/storage/errors.cjs +6 -6
- package/dist/storage/errors.d.ts +2 -2
- package/dist/storage/errors.js +7 -7
- package/dist/storage/index.cjs +42 -5
- package/dist/storage/index.d.ts +19 -8
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +39 -4
- package/dist/storage/memories/types.cjs +16 -0
- package/dist/storage/memories/types.d.ts +17 -0
- package/dist/storage/memories/types.d.ts.map +1 -0
- package/dist/storage/memories/types.js +0 -0
- package/dist/storage/message-queue/types.cjs +16 -0
- package/dist/storage/message-queue/types.d.ts +15 -0
- package/dist/storage/message-queue/types.d.ts.map +1 -0
- package/dist/storage/message-queue/types.js +0 -0
- package/dist/storage/prompts/types.cjs +16 -0
- package/dist/storage/prompts/types.d.ts +14 -0
- package/dist/storage/prompts/types.d.ts.map +1 -0
- package/dist/storage/prompts/types.js +0 -0
- package/dist/storage/runtime-events/types.cjs +16 -0
- package/dist/storage/runtime-events/types.d.ts +19 -0
- package/dist/storage/runtime-events/types.d.ts.map +1 -0
- package/dist/storage/runtime-events/types.js +0 -0
- package/dist/storage/sessions/types.cjs +16 -0
- package/dist/storage/sessions/types.d.ts +19 -0
- package/dist/storage/sessions/types.d.ts.map +1 -0
- package/dist/storage/sessions/types.js +0 -0
- package/dist/storage/stores/backend.cjs +702 -0
- package/dist/storage/stores/backend.d.ts +303 -0
- package/dist/storage/stores/backend.d.ts.map +1 -0
- package/dist/storage/stores/backend.js +677 -0
- package/dist/storage/stores/in-memory.cjs +510 -0
- package/dist/storage/stores/in-memory.d.ts +11 -0
- package/dist/storage/stores/in-memory.d.ts.map +1 -0
- package/dist/storage/stores/in-memory.js +487 -0
- package/dist/storage/stores/types.cjs +16 -0
- package/dist/storage/stores/types.d.ts +36 -0
- package/dist/storage/stores/types.d.ts.map +1 -0
- package/dist/storage/stores/types.js +0 -0
- package/dist/storage/tool-executions/types.cjs +127 -0
- package/dist/storage/tool-executions/types.d.ts +193 -0
- package/dist/storage/tool-executions/types.d.ts.map +1 -0
- package/dist/storage/tool-executions/types.js +96 -0
- package/dist/storage/tool-preferences/types.cjs +16 -0
- package/dist/storage/tool-preferences/types.d.ts +29 -0
- package/dist/storage/tool-preferences/types.d.ts.map +1 -0
- package/dist/storage/tool-preferences/types.js +0 -0
- package/dist/storage/tool-state/types.cjs +16 -0
- package/dist/storage/tool-state/types.d.ts +20 -0
- package/dist/storage/tool-state/types.d.ts.map +1 -0
- package/dist/storage/tool-state/types.js +0 -0
- package/dist/storage/workspaces/types.cjs +16 -0
- package/dist/storage/workspaces/types.d.ts +19 -0
- package/dist/storage/workspaces/types.d.ts.map +1 -0
- package/dist/storage/workspaces/types.js +0 -0
- package/dist/systemPrompt/contributors.cjs +10 -14
- package/dist/systemPrompt/contributors.d.ts +3 -3
- package/dist/systemPrompt/contributors.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.js +11 -15
- package/dist/systemPrompt/error-codes.js +1 -1
- package/dist/systemPrompt/errors.js +1 -1
- package/dist/systemPrompt/in-built-prompts.js +1 -1
- package/dist/systemPrompt/index.js +1 -1
- package/dist/systemPrompt/manager.js +1 -1
- package/dist/systemPrompt/registry.js +1 -1
- package/dist/systemPrompt/schemas.js +1 -1
- package/dist/telemetry/decorators.js +1 -1
- package/dist/telemetry/error-codes.js +1 -1
- package/dist/telemetry/errors.js +1 -1
- package/dist/telemetry/exporters.js +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/schemas.js +1 -1
- package/dist/telemetry/telemetry.js +1 -1
- package/dist/telemetry/utils.js +1 -1
- package/dist/test-utils/in-memory-storage.cjs +9 -17
- package/dist/test-utils/in-memory-storage.js +9 -16
- package/dist/test-utils/session-state-stores.cjs +21 -24
- package/dist/test-utils/session-state-stores.js +22 -24
- package/dist/tools/{confirmation → approval}/allowed-tools-provider/factory.cjs +1 -1
- package/dist/tools/{confirmation → approval}/allowed-tools-provider/factory.d.ts +2 -2
- package/dist/tools/approval/allowed-tools-provider/factory.d.ts.map +1 -0
- package/dist/tools/{confirmation → approval}/allowed-tools-provider/factory.js +2 -2
- package/dist/tools/approval/allowed-tools-provider/in-memory.d.ts.map +1 -0
- package/dist/tools/{confirmation → approval}/allowed-tools-provider/in-memory.js +1 -1
- package/dist/tools/approval/allowed-tools-provider/storage.cjs +66 -0
- package/dist/tools/{confirmation → approval}/allowed-tools-provider/storage.d.ts +4 -10
- package/dist/tools/approval/allowed-tools-provider/storage.d.ts.map +1 -0
- package/dist/tools/approval/allowed-tools-provider/storage.js +43 -0
- package/dist/tools/approval/allowed-tools-provider/types.cjs +16 -0
- package/dist/tools/approval/allowed-tools-provider/types.d.ts.map +1 -0
- package/dist/tools/approval/allowed-tools-provider/types.js +0 -0
- package/dist/tools/approval/session-tool-policy.cjs +269 -0
- package/dist/tools/approval/session-tool-policy.d.ts +43 -0
- package/dist/tools/approval/session-tool-policy.d.ts.map +1 -0
- package/dist/tools/approval/session-tool-policy.js +245 -0
- package/dist/tools/define-tool.js +1 -1
- package/dist/tools/display-types.js +1 -1
- package/dist/tools/error-codes.cjs +3 -3
- package/dist/tools/error-codes.d.ts +4 -4
- package/dist/tools/error-codes.d.ts.map +1 -1
- package/dist/tools/error-codes.js +4 -4
- package/dist/tools/errors.cjs +12 -12
- package/dist/tools/errors.d.ts +6 -6
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +13 -13
- package/dist/tools/index.cjs +3 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/pattern-utils.js +1 -1
- package/dist/tools/presentation/tool-presentation.cjs +182 -0
- package/dist/tools/presentation/tool-presentation.d.ts +51 -0
- package/dist/tools/presentation/tool-presentation.d.ts.map +1 -0
- package/dist/tools/presentation/tool-presentation.js +159 -0
- package/dist/tools/presentation.js +1 -1
- package/dist/tools/schemas.cjs +5 -10
- package/dist/tools/schemas.d.ts +1 -4
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +6 -11
- package/dist/tools/session-tool-preferences-store.cjs +12 -28
- package/dist/tools/session-tool-preferences-store.d.ts +4 -7
- package/dist/tools/session-tool-preferences-store.d.ts.map +1 -1
- package/dist/tools/session-tool-preferences-store.js +12 -29
- package/dist/tools/tool-call-metadata.js +1 -1
- package/dist/tools/tool-manager.cjs +871 -834
- package/dist/tools/tool-manager.d.ts +94 -96
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +876 -833
- package/dist/tools/types.d.ts +10 -14
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.d.ts +1 -1
- package/dist/utils/api-key-resolver.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.js +1 -1
- package/dist/utils/async-context.js +1 -1
- package/dist/utils/debug.js +1 -1
- package/dist/utils/defer.js +1 -1
- package/dist/utils/env.js +1 -1
- package/dist/utils/error-conversion.js +1 -1
- package/dist/utils/execution-context.js +1 -1
- package/dist/utils/fs-walk.js +1 -1
- package/dist/utils/path.js +1 -1
- package/dist/utils/redactor.js +1 -1
- package/dist/utils/result.js +1 -1
- package/dist/utils/safe-stringify.js +1 -1
- package/dist/utils/schema.js +1 -1
- package/dist/utils/service-initializer.cjs +37 -33
- package/dist/utils/service-initializer.d.ts +9 -5
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +38 -34
- package/dist/utils/zod-schema-converter.js +1 -1
- package/dist/workspace/error-codes.cjs +5 -1
- package/dist/workspace/error-codes.d.ts +4 -0
- package/dist/workspace/error-codes.d.ts.map +1 -1
- package/dist/workspace/error-codes.js +6 -2
- package/dist/workspace/errors.cjs +43 -0
- package/dist/workspace/errors.d.ts +9 -0
- package/dist/workspace/errors.d.ts.map +1 -1
- package/dist/workspace/errors.js +44 -1
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/manager.cjs +21 -29
- package/dist/workspace/manager.d.ts +6 -6
- package/dist/workspace/manager.d.ts.map +1 -1
- package/dist/workspace/manager.js +22 -30
- package/dist/workspace/types.d.ts +47 -0
- package/dist/workspace/types.d.ts.map +1 -1
- package/package.json +116 -3
- package/dist/approval/session-approval-store.cjs +0 -91
- package/dist/approval/session-approval-store.d.ts +0 -37
- package/dist/approval/session-approval-store.d.ts.map +0 -1
- package/dist/approval/session-approval-store.js +0 -68
- package/dist/llm/reasoning/anthropic-betas.d.ts +0 -3
- package/dist/llm/reasoning/anthropic-betas.d.ts.map +0 -1
- package/dist/llm/reasoning/anthropic-betas.js +0 -7
- package/dist/llm/reasoning/anthropic-thinking.cjs +0 -79
- package/dist/llm/reasoning/anthropic-thinking.d.ts +0 -15
- package/dist/llm/reasoning/anthropic-thinking.d.ts.map +0 -1
- package/dist/llm/reasoning/anthropic-thinking.js +0 -52
- package/dist/llm/reasoning/openai-reasoning-effort.cjs +0 -86
- package/dist/llm/reasoning/openai-reasoning-effort.d.ts +0 -5
- package/dist/llm/reasoning/openai-reasoning-effort.d.ts.map +0 -1
- package/dist/llm/reasoning/openai-reasoning-effort.js +0 -61
- package/dist/llm/reasoning/profile.cjs +0 -113
- package/dist/llm/reasoning/profile.d.ts +0 -13
- package/dist/llm/reasoning/profile.d.ts.map +0 -1
- package/dist/llm/reasoning/profile.js +0 -92
- package/dist/llm/reasoning/profiles/anthropic.cjs +0 -61
- package/dist/llm/reasoning/profiles/anthropic.d.ts +0 -8
- package/dist/llm/reasoning/profiles/anthropic.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/anthropic.js +0 -45
- package/dist/llm/reasoning/profiles/bedrock.cjs +0 -54
- package/dist/llm/reasoning/profiles/bedrock.d.ts +0 -3
- package/dist/llm/reasoning/profiles/bedrock.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/bedrock.js +0 -36
- package/dist/llm/reasoning/profiles/google.cjs +0 -45
- package/dist/llm/reasoning/profiles/google.d.ts +0 -9
- package/dist/llm/reasoning/profiles/google.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/google.js +0 -21
- package/dist/llm/reasoning/profiles/openai-compatible.cjs +0 -39
- package/dist/llm/reasoning/profiles/openai-compatible.d.ts +0 -3
- package/dist/llm/reasoning/profiles/openai-compatible.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/openai-compatible.js +0 -16
- package/dist/llm/reasoning/profiles/openai.d.ts +0 -3
- package/dist/llm/reasoning/profiles/openai.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/openai.js +0 -18
- package/dist/llm/reasoning/profiles/openrouter.cjs +0 -83
- package/dist/llm/reasoning/profiles/openrouter.d.ts +0 -10
- package/dist/llm/reasoning/profiles/openrouter.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/openrouter.js +0 -59
- package/dist/llm/reasoning/profiles/shared.cjs +0 -80
- package/dist/llm/reasoning/profiles/shared.d.ts +0 -25
- package/dist/llm/reasoning/profiles/shared.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/shared.js +0 -53
- package/dist/llm/reasoning/profiles/vertex.cjs +0 -46
- package/dist/llm/reasoning/profiles/vertex.d.ts +0 -3
- package/dist/llm/reasoning/profiles/vertex.d.ts.map +0 -1
- package/dist/llm/reasoning/profiles/vertex.js +0 -23
- package/dist/llm/registry/models.generated.cjs +0 -10741
- package/dist/llm/registry/models.generated.d.ts +0 -2945
- package/dist/llm/registry/models.generated.d.ts.map +0 -1
- package/dist/llm/registry/models.generated.js +0 -10717
- package/dist/llm/registry/models.manual.cjs +0 -44
- package/dist/llm/registry/models.manual.d.ts +0 -22
- package/dist/llm/registry/models.manual.d.ts.map +0 -1
- package/dist/llm/registry/models.manual.js +0 -21
- package/dist/llm/types.d.ts +0 -39
- package/dist/llm/types.d.ts.map +0 -1
- package/dist/llm/types.js +0 -30
- package/dist/session/history/database.cjs +0 -232
- package/dist/session/history/database.d.ts +0 -41
- package/dist/session/history/database.d.ts.map +0 -1
- package/dist/session/history/database.js +0 -209
- package/dist/session/history/factory.d.ts +0 -11
- package/dist/session/history/factory.d.ts.map +0 -1
- package/dist/session/history/factory.js +0 -8
- package/dist/session/history/memory.cjs +0 -57
- package/dist/session/history/memory.d.ts +0 -22
- package/dist/session/history/memory.d.ts.map +0 -1
- package/dist/session/history/memory.js +0 -34
- package/dist/session/history/types.d.ts +0 -26
- package/dist/session/history/types.d.ts.map +0 -1
- package/dist/session/message-queue-store.cjs +0 -75
- package/dist/session/message-queue-store.d.ts +0 -16
- package/dist/session/message-queue-store.d.ts.map +0 -1
- package/dist/session/message-queue-store.js +0 -52
- package/dist/storage/storage-manager.cjs +0 -209
- package/dist/storage/storage-manager.d.ts +0 -77
- package/dist/storage/storage-manager.d.ts.map +0 -1
- package/dist/storage/storage-manager.js +0 -186
- package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts.map +0 -1
- package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts.map +0 -1
- package/dist/tools/confirmation/allowed-tools-provider/storage.cjs +0 -69
- package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts.map +0 -1
- package/dist/tools/confirmation/allowed-tools-provider/storage.js +0 -46
- package/dist/tools/confirmation/allowed-tools-provider/types.d.ts.map +0 -1
- /package/dist/{session/history → skills}/types.cjs +0 -0
- /package/dist/{session/history → skills}/types.js +0 -0
- /package/dist/{tools/confirmation/allowed-tools-provider → storage/artifacts}/types.cjs +0 -0
- /package/dist/{tools/confirmation/allowed-tools-provider → storage/artifacts}/types.js +0 -0
- /package/dist/tools/{confirmation → approval}/allowed-tools-provider/in-memory.cjs +0 -0
- /package/dist/tools/{confirmation → approval}/allowed-tools-provider/in-memory.d.ts +0 -0
- /package/dist/tools/{confirmation → approval}/allowed-tools-provider/types.d.ts +0 -0
|
@@ -66,23 +66,31 @@ __export(tool_manager_exports, {
|
|
|
66
66
|
ToolManager: () => ToolManager
|
|
67
67
|
});
|
|
68
68
|
module.exports = __toCommonJS(tool_manager_exports);
|
|
69
|
+
var import_node_util = require("node:util");
|
|
69
70
|
var import_errors = require("./errors.js");
|
|
70
|
-
var import_error_codes = require("./error-codes.js");
|
|
71
71
|
var import_errors2 = require("../errors/index.js");
|
|
72
72
|
var import_types2 = require("../logger/v2/types.js");
|
|
73
73
|
var import_schema = require("../utils/schema.js");
|
|
74
74
|
var import_types3 = require("../approval/types.js");
|
|
75
|
+
var import_schemas = require("../approval/schemas.js");
|
|
76
|
+
var import_session_tool_policy = require("./approval/session-tool-policy.js");
|
|
77
|
+
var import_tool_presentation = require("./presentation/tool-presentation.js");
|
|
75
78
|
var import_decorators = require("../telemetry/decorators.js");
|
|
79
|
+
var import_types4 = require("../storage/tool-executions/types.js");
|
|
76
80
|
var import_tool_call_metadata = require("./tool-call-metadata.js");
|
|
77
81
|
var import_env = require("../utils/env.js");
|
|
78
82
|
var _ToolManager_decorators, _init;
|
|
83
|
+
function isRecord(value) {
|
|
84
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
85
|
+
}
|
|
79
86
|
_ToolManager_decorators = [(0, import_decorators.InstrumentClass)({
|
|
80
87
|
prefix: "tool",
|
|
81
88
|
excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
|
|
82
89
|
})];
|
|
83
90
|
let _ToolManager = class _ToolManager {
|
|
84
|
-
constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger, sessionToolPreferencesStore) {
|
|
91
|
+
constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger, sessionToolPreferencesStore, toolExecutionStore) {
|
|
85
92
|
this.sessionToolPreferencesStore = sessionToolPreferencesStore;
|
|
93
|
+
this.toolExecutionStore = toolExecutionStore;
|
|
86
94
|
this.mcpManager = mcpManager;
|
|
87
95
|
this.approvalManager = approvalManager;
|
|
88
96
|
this.allowedToolsProvider = allowedToolsProvider;
|
|
@@ -90,6 +98,17 @@ let _ToolManager = class _ToolManager {
|
|
|
90
98
|
this.agentEventBus = agentEventBus;
|
|
91
99
|
this.toolPolicies = toolPolicies;
|
|
92
100
|
this.logger = logger.createChild(import_types2.DextoLogComponent.TOOLS);
|
|
101
|
+
this.sessionToolPolicy = new import_session_tool_policy.SessionToolPolicy(
|
|
102
|
+
sessionToolPreferencesStore,
|
|
103
|
+
this.logger,
|
|
104
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
105
|
+
);
|
|
106
|
+
this.toolPresentation = new import_tool_presentation.ToolPresentation(
|
|
107
|
+
(toolName) => this.agentTools.get(toolName),
|
|
108
|
+
(toolName, args) => this.validateLocalToolArgs(toolName, args),
|
|
109
|
+
(options) => this.buildToolExecutionContext(options),
|
|
110
|
+
this.logger
|
|
111
|
+
);
|
|
93
112
|
this.setTools(tools);
|
|
94
113
|
this.toolExecutionContextFactory = () => {
|
|
95
114
|
throw import_errors.ToolError.configInvalid(
|
|
@@ -124,16 +143,8 @@ let _ToolManager = class _ToolManager {
|
|
|
124
143
|
toolsCache = {};
|
|
125
144
|
cacheValid = false;
|
|
126
145
|
logger;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow
|
|
130
|
-
sessionAutoApproveTools = /* @__PURE__ */ new Map();
|
|
131
|
-
// Session-level auto-approve tools set by users (UI)
|
|
132
|
-
sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
|
|
133
|
-
sessionDisabledTools = /* @__PURE__ */ new Map();
|
|
134
|
-
restoredSessionPreferences = /* @__PURE__ */ new Set();
|
|
135
|
-
sessionPreferenceLocks = /* @__PURE__ */ new Map();
|
|
136
|
-
globalDisabledTools = [];
|
|
146
|
+
sessionToolPolicy;
|
|
147
|
+
toolPresentation;
|
|
137
148
|
cleanupHandlers = /* @__PURE__ */ new Set();
|
|
138
149
|
cleanupStarted = false;
|
|
139
150
|
resolveLocalToolIdOrAlias(name) {
|
|
@@ -156,76 +167,14 @@ let _ToolManager = class _ToolManager {
|
|
|
156
167
|
}
|
|
157
168
|
return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
|
|
158
169
|
}
|
|
159
|
-
async runWithSessionPreferenceLock(sessionId, fn) {
|
|
160
|
-
const previousLock = this.sessionPreferenceLocks.get(sessionId) ?? Promise.resolve();
|
|
161
|
-
const currentResult = previousLock.catch(() => {
|
|
162
|
-
}).then(() => fn());
|
|
163
|
-
const currentLock = currentResult.then(
|
|
164
|
-
() => void 0,
|
|
165
|
-
() => void 0
|
|
166
|
-
);
|
|
167
|
-
this.sessionPreferenceLocks.set(sessionId, currentLock);
|
|
168
|
-
try {
|
|
169
|
-
return await currentResult;
|
|
170
|
-
} finally {
|
|
171
|
-
if (this.sessionPreferenceLocks.get(sessionId) === currentLock) {
|
|
172
|
-
this.sessionPreferenceLocks.delete(sessionId);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
applySessionToolPreferences(sessionId, preferences) {
|
|
177
|
-
if (preferences.userAutoApproveTools.length > 0) {
|
|
178
|
-
this.sessionUserAutoApproveTools.set(sessionId, [...preferences.userAutoApproveTools]);
|
|
179
|
-
} else {
|
|
180
|
-
this.sessionUserAutoApproveTools.delete(sessionId);
|
|
181
|
-
}
|
|
182
|
-
if (preferences.disabledTools.length > 0) {
|
|
183
|
-
this.sessionDisabledTools.set(sessionId, [...preferences.disabledTools]);
|
|
184
|
-
} else {
|
|
185
|
-
this.sessionDisabledTools.delete(sessionId);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
getSessionToolPreferencesSnapshot(sessionId) {
|
|
189
|
-
return {
|
|
190
|
-
userAutoApproveTools: [...this.sessionUserAutoApproveTools.get(sessionId) ?? []],
|
|
191
|
-
disabledTools: [...this.sessionDisabledTools.get(sessionId) ?? []]
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
170
|
async restoreSessionState(sessionId) {
|
|
195
|
-
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
await this.runWithSessionPreferenceLock(sessionId, async () => {
|
|
199
|
-
if (this.restoredSessionPreferences.has(sessionId)) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
const preferences = await this.sessionToolPreferencesStore.load(sessionId);
|
|
203
|
-
this.applySessionToolPreferences(sessionId, preferences);
|
|
204
|
-
this.restoredSessionPreferences.add(sessionId);
|
|
205
|
-
this.logger.debug("Restored persisted session tool preferences", {
|
|
206
|
-
sessionId,
|
|
207
|
-
autoApproveCount: preferences.userAutoApproveTools.length,
|
|
208
|
-
disabledCount: preferences.disabledTools.length
|
|
209
|
-
});
|
|
210
|
-
});
|
|
171
|
+
await this.sessionToolPolicy.restoreSessionState(sessionId);
|
|
211
172
|
}
|
|
212
173
|
evictSessionState(sessionId) {
|
|
213
|
-
this.
|
|
214
|
-
this.sessionUserAutoApproveTools.delete(sessionId);
|
|
215
|
-
this.sessionDisabledTools.delete(sessionId);
|
|
216
|
-
this.restoredSessionPreferences.delete(sessionId);
|
|
174
|
+
this.sessionToolPolicy.evictSessionState(sessionId);
|
|
217
175
|
}
|
|
218
176
|
async deleteSessionState(sessionId) {
|
|
219
|
-
await this.
|
|
220
|
-
this.evictSessionState(sessionId);
|
|
221
|
-
await this.sessionToolPreferencesStore.delete(sessionId);
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
async persistSessionToolPreferences(sessionId) {
|
|
225
|
-
await this.sessionToolPreferencesStore.save(
|
|
226
|
-
sessionId,
|
|
227
|
-
this.getSessionToolPreferencesSnapshot(sessionId)
|
|
228
|
-
);
|
|
177
|
+
await this.sessionToolPolicy.deleteSessionState(sessionId);
|
|
229
178
|
}
|
|
230
179
|
/**
|
|
231
180
|
* Initialize the ToolManager and its components
|
|
@@ -328,25 +277,14 @@ let _ToolManager = class _ToolManager {
|
|
|
328
277
|
// ============= SESSION AUTO-APPROVE TOOLS =============
|
|
329
278
|
/**
|
|
330
279
|
* Set session-level auto-approve tools.
|
|
331
|
-
* When set, these tools will skip
|
|
280
|
+
* When set, these tools will skip approval prompts for this session.
|
|
332
281
|
* This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
|
|
333
282
|
*
|
|
334
283
|
* @param sessionId The session ID
|
|
335
284
|
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
|
|
336
285
|
*/
|
|
337
286
|
setSessionAutoApproveTools(sessionId, autoApproveTools) {
|
|
338
|
-
|
|
339
|
-
this.clearSessionAutoApproveTools(sessionId);
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
const normalized = autoApproveTools.map(
|
|
343
|
-
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
344
|
-
);
|
|
345
|
-
this.sessionAutoApproveTools.set(sessionId, normalized);
|
|
346
|
-
this.logger.info(
|
|
347
|
-
`Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
348
|
-
);
|
|
349
|
-
this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
|
|
287
|
+
this.sessionToolPolicy.setSessionAutoApproveTools(sessionId, autoApproveTools);
|
|
350
288
|
}
|
|
351
289
|
/**
|
|
352
290
|
* Add session-level auto-approve tools.
|
|
@@ -356,64 +294,19 @@ let _ToolManager = class _ToolManager {
|
|
|
356
294
|
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
|
|
357
295
|
*/
|
|
358
296
|
addSessionAutoApproveTools(sessionId, autoApproveTools) {
|
|
359
|
-
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
const normalized = autoApproveTools.map(
|
|
363
|
-
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
364
|
-
);
|
|
365
|
-
const existing = this.sessionAutoApproveTools.get(sessionId) ?? [];
|
|
366
|
-
const merged = [...existing];
|
|
367
|
-
const seen = new Set(existing);
|
|
368
|
-
for (const toolName of normalized) {
|
|
369
|
-
if (seen.has(toolName)) {
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
merged.push(toolName);
|
|
373
|
-
seen.add(toolName);
|
|
374
|
-
}
|
|
375
|
-
const actuallyAdded = Math.max(0, merged.length - existing.length);
|
|
376
|
-
this.sessionAutoApproveTools.set(sessionId, merged);
|
|
377
|
-
this.logger.info(
|
|
378
|
-
`Session auto-approve tools updated for '${sessionId}': +${actuallyAdded} tools`
|
|
379
|
-
);
|
|
380
|
-
this.logger.debug(`Auto-approve tools: ${merged.join(", ")}`);
|
|
297
|
+
this.sessionToolPolicy.addSessionAutoApproveTools(sessionId, autoApproveTools);
|
|
381
298
|
}
|
|
382
299
|
/**
|
|
383
300
|
* Set session-level auto-approve tools chosen by the user.
|
|
384
301
|
*/
|
|
385
302
|
async setSessionUserAutoApproveTools(sessionId, autoApproveTools) {
|
|
386
|
-
await this.
|
|
387
|
-
if (autoApproveTools.length === 0) {
|
|
388
|
-
await this.clearSessionUserAutoApproveTools(sessionId);
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
const normalized = autoApproveTools.map(
|
|
392
|
-
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
393
|
-
);
|
|
394
|
-
await this.runWithSessionPreferenceLock(sessionId, async () => {
|
|
395
|
-
this.sessionUserAutoApproveTools.set(sessionId, normalized);
|
|
396
|
-
await this.persistSessionToolPreferences(sessionId);
|
|
397
|
-
});
|
|
398
|
-
this.logger.info(
|
|
399
|
-
`Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
400
|
-
);
|
|
401
|
-
this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
|
|
303
|
+
await this.sessionToolPolicy.setSessionUserAutoApproveTools(sessionId, autoApproveTools);
|
|
402
304
|
}
|
|
403
305
|
/**
|
|
404
306
|
* Clear session-level auto-approve tools chosen by the user.
|
|
405
307
|
*/
|
|
406
308
|
async clearSessionUserAutoApproveTools(sessionId) {
|
|
407
|
-
await this.
|
|
408
|
-
let hadAutoApprove = false;
|
|
409
|
-
await this.runWithSessionPreferenceLock(sessionId, async () => {
|
|
410
|
-
hadAutoApprove = this.sessionUserAutoApproveTools.has(sessionId);
|
|
411
|
-
this.sessionUserAutoApproveTools.delete(sessionId);
|
|
412
|
-
await this.persistSessionToolPreferences(sessionId);
|
|
413
|
-
});
|
|
414
|
-
if (hadAutoApprove) {
|
|
415
|
-
this.logger.info(`Session user auto-approve tools cleared for '${sessionId}'`);
|
|
416
|
-
}
|
|
309
|
+
await this.sessionToolPolicy.clearSessionUserAutoApproveTools(sessionId);
|
|
417
310
|
}
|
|
418
311
|
/**
|
|
419
312
|
* Clear session-level auto-approve tools.
|
|
@@ -422,49 +315,30 @@ let _ToolManager = class _ToolManager {
|
|
|
422
315
|
* @param sessionId The session ID to clear auto-approve tools for
|
|
423
316
|
*/
|
|
424
317
|
clearSessionAutoApproveTools(sessionId) {
|
|
425
|
-
|
|
426
|
-
this.sessionAutoApproveTools.delete(sessionId);
|
|
427
|
-
if (hadAutoApprove) {
|
|
428
|
-
this.logger.info(`Session auto-approve tools cleared for '${sessionId}'`);
|
|
429
|
-
}
|
|
318
|
+
this.sessionToolPolicy.clearSessionAutoApproveTools(sessionId);
|
|
430
319
|
}
|
|
431
320
|
hasSessionUserAutoApproveTools(sessionId) {
|
|
432
|
-
return this.
|
|
321
|
+
return this.sessionToolPolicy.hasSessionUserAutoApproveTools(sessionId);
|
|
433
322
|
}
|
|
434
323
|
// ============= ENABLED/DISABLED TOOLS =============
|
|
435
324
|
/**
|
|
436
325
|
* Set global disabled tools (agent-level preferences).
|
|
437
326
|
*/
|
|
438
327
|
setGlobalDisabledTools(toolNames) {
|
|
439
|
-
this.
|
|
440
|
-
this.logger.info("Global disabled tools updated", {
|
|
441
|
-
count: toolNames.length
|
|
442
|
-
});
|
|
328
|
+
this.sessionToolPolicy.setGlobalDisabledTools(toolNames);
|
|
443
329
|
this.agentEventBus.emit("tools:enabled-updated", {
|
|
444
330
|
scope: "global",
|
|
445
|
-
disabledTools:
|
|
331
|
+
disabledTools: this.sessionToolPolicy.getGlobalDisabledTools()
|
|
446
332
|
});
|
|
447
333
|
}
|
|
448
334
|
getGlobalDisabledTools() {
|
|
449
|
-
return
|
|
335
|
+
return this.sessionToolPolicy.getGlobalDisabledTools();
|
|
450
336
|
}
|
|
451
337
|
/**
|
|
452
338
|
* Set session-level disabled tools (overrides global list).
|
|
453
339
|
*/
|
|
454
340
|
async setSessionDisabledTools(sessionId, toolNames) {
|
|
455
|
-
await this.
|
|
456
|
-
if (toolNames.length === 0) {
|
|
457
|
-
await this.clearSessionDisabledTools(sessionId);
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
await this.runWithSessionPreferenceLock(sessionId, async () => {
|
|
461
|
-
this.sessionDisabledTools.set(sessionId, [...toolNames]);
|
|
462
|
-
await this.persistSessionToolPreferences(sessionId);
|
|
463
|
-
});
|
|
464
|
-
this.logger.info("Session disabled tools updated", {
|
|
465
|
-
sessionId,
|
|
466
|
-
count: toolNames.length
|
|
467
|
-
});
|
|
341
|
+
await this.sessionToolPolicy.setSessionDisabledTools(sessionId, toolNames);
|
|
468
342
|
this.agentEventBus.emit("tools:enabled-updated", {
|
|
469
343
|
scope: "session",
|
|
470
344
|
sessionId,
|
|
@@ -475,37 +349,19 @@ let _ToolManager = class _ToolManager {
|
|
|
475
349
|
* Clear session-level disabled tools.
|
|
476
350
|
*/
|
|
477
351
|
async clearSessionDisabledTools(sessionId) {
|
|
478
|
-
await this.
|
|
479
|
-
let hadOverrides = false;
|
|
480
|
-
await this.runWithSessionPreferenceLock(sessionId, async () => {
|
|
481
|
-
hadOverrides = this.sessionDisabledTools.has(sessionId);
|
|
482
|
-
this.sessionDisabledTools.delete(sessionId);
|
|
483
|
-
await this.persistSessionToolPreferences(sessionId);
|
|
484
|
-
});
|
|
485
|
-
if (hadOverrides) {
|
|
486
|
-
this.logger.info("Session disabled tools cleared", { sessionId });
|
|
487
|
-
}
|
|
352
|
+
await this.sessionToolPolicy.clearSessionDisabledTools(sessionId);
|
|
488
353
|
}
|
|
489
354
|
/**
|
|
490
355
|
* Get disabled tools for a session (session override wins).
|
|
491
356
|
*/
|
|
492
357
|
getDisabledTools(sessionId) {
|
|
493
|
-
|
|
494
|
-
return this.sessionDisabledTools.get(sessionId) ?? [];
|
|
495
|
-
}
|
|
496
|
-
return this.globalDisabledTools;
|
|
358
|
+
return this.sessionToolPolicy.getDisabledTools(sessionId);
|
|
497
359
|
}
|
|
498
360
|
/**
|
|
499
361
|
* Filter a tool set based on disabled tools for a session.
|
|
500
362
|
*/
|
|
501
363
|
filterToolsForSession(toolSet, sessionId) {
|
|
502
|
-
|
|
503
|
-
if (disabled.size === 0) {
|
|
504
|
-
return toolSet;
|
|
505
|
-
}
|
|
506
|
-
return Object.fromEntries(
|
|
507
|
-
Object.entries(toolSet).filter(([toolName]) => !disabled.has(toolName))
|
|
508
|
-
);
|
|
364
|
+
return this.sessionToolPolicy.filterToolsForSession(toolSet, sessionId);
|
|
509
365
|
}
|
|
510
366
|
/**
|
|
511
367
|
* Check if a session has auto-approve tools set.
|
|
@@ -514,7 +370,7 @@ let _ToolManager = class _ToolManager {
|
|
|
514
370
|
* @returns true if the session has auto-approve tools
|
|
515
371
|
*/
|
|
516
372
|
hasSessionAutoApproveTools(sessionId) {
|
|
517
|
-
return this.
|
|
373
|
+
return this.sessionToolPolicy.hasSessionAutoApproveTools(sessionId);
|
|
518
374
|
}
|
|
519
375
|
/**
|
|
520
376
|
* Get the auto-approve tools for a session (skill-provided list).
|
|
@@ -523,22 +379,19 @@ let _ToolManager = class _ToolManager {
|
|
|
523
379
|
* @returns Array of auto-approve tool names, or undefined if none set
|
|
524
380
|
*/
|
|
525
381
|
getSessionAutoApproveTools(sessionId) {
|
|
526
|
-
return this.
|
|
382
|
+
return this.sessionToolPolicy.getSessionAutoApproveTools(sessionId);
|
|
527
383
|
}
|
|
528
384
|
/**
|
|
529
385
|
* Get the user auto-approve tools for a session.
|
|
530
386
|
*/
|
|
531
387
|
getSessionUserAutoApproveTools(sessionId) {
|
|
532
|
-
return this.
|
|
388
|
+
return this.sessionToolPolicy.getSessionUserAutoApproveTools(sessionId);
|
|
533
389
|
}
|
|
534
390
|
/**
|
|
535
391
|
* Combined auto-approve list for a session.
|
|
536
392
|
*/
|
|
537
393
|
getCombinedSessionAutoApproveTools(sessionId) {
|
|
538
|
-
return
|
|
539
|
-
...this.sessionAutoApproveTools.get(sessionId) ?? [],
|
|
540
|
-
...this.sessionUserAutoApproveTools.get(sessionId) ?? []
|
|
541
|
-
];
|
|
394
|
+
return this.sessionToolPolicy.getCombinedSessionAutoApproveTools(sessionId);
|
|
542
395
|
}
|
|
543
396
|
/**
|
|
544
397
|
* Check if a tool should be auto-approved for a session.
|
|
@@ -549,11 +402,7 @@ let _ToolManager = class _ToolManager {
|
|
|
549
402
|
* @returns true if the tool should be auto-approved
|
|
550
403
|
*/
|
|
551
404
|
isToolAutoApprovedForSession(sessionId, toolName) {
|
|
552
|
-
|
|
553
|
-
if (autoApproveTools.length === 0) {
|
|
554
|
-
return false;
|
|
555
|
-
}
|
|
556
|
-
return autoApproveTools.some((pattern) => this.matchesToolPolicy(toolName, pattern));
|
|
405
|
+
return this.sessionToolPolicy.isToolAutoApprovedForSession(sessionId, toolName);
|
|
557
406
|
}
|
|
558
407
|
/**
|
|
559
408
|
* Invalidate the tools cache when tool sources change
|
|
@@ -631,149 +480,6 @@ let _ToolManager = class _ToolManager {
|
|
|
631
480
|
const tool = this.agentTools.get(toolName);
|
|
632
481
|
return tool?.approval?.onGranted;
|
|
633
482
|
}
|
|
634
|
-
getToolPreviewFn(toolName) {
|
|
635
|
-
const tool = this.agentTools.get(toolName);
|
|
636
|
-
return tool?.presentation?.preview;
|
|
637
|
-
}
|
|
638
|
-
getToolDescribeHeaderFn(toolName) {
|
|
639
|
-
const tool = this.agentTools.get(toolName);
|
|
640
|
-
return tool?.presentation?.describeHeader;
|
|
641
|
-
}
|
|
642
|
-
getToolDescribeArgsFn(toolName) {
|
|
643
|
-
const tool = this.agentTools.get(toolName);
|
|
644
|
-
return tool?.presentation?.describeArgs;
|
|
645
|
-
}
|
|
646
|
-
getToolDescribeResultFn(toolName) {
|
|
647
|
-
const tool = this.agentTools.get(toolName);
|
|
648
|
-
return tool?.presentation?.describeResult;
|
|
649
|
-
}
|
|
650
|
-
buildGenericToolPresentationSnapshot(toolName) {
|
|
651
|
-
const toTitleCase = (name) => name.replace(/[_-]+/g, " ").split(" ").filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
652
|
-
const isMcp = toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX);
|
|
653
|
-
const fallbackTitle = (() => {
|
|
654
|
-
if (!isMcp) {
|
|
655
|
-
return toTitleCase(toolName);
|
|
656
|
-
}
|
|
657
|
-
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
658
|
-
const parts = actualToolName.split("--");
|
|
659
|
-
const toolPart = parts.length >= 2 ? parts.slice(1).join("--") : actualToolName;
|
|
660
|
-
return toTitleCase(toolPart);
|
|
661
|
-
})();
|
|
662
|
-
const snapshot = {
|
|
663
|
-
version: 1,
|
|
664
|
-
source: {
|
|
665
|
-
type: toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) ? "mcp" : "local"
|
|
666
|
-
},
|
|
667
|
-
header: {
|
|
668
|
-
title: fallbackTitle
|
|
669
|
-
}
|
|
670
|
-
};
|
|
671
|
-
if (snapshot.source?.type === "mcp") {
|
|
672
|
-
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
673
|
-
const parts = actualToolName.split("--");
|
|
674
|
-
if (parts.length >= 2 && parts[0]) {
|
|
675
|
-
snapshot.source.mcpServerName = parts[0];
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
return snapshot;
|
|
679
|
-
}
|
|
680
|
-
getToolPresentationSnapshotForToolCallEvent(toolName, args, toolCallId, sessionId, runContext) {
|
|
681
|
-
const fallback = this.buildGenericToolPresentationSnapshot(toolName);
|
|
682
|
-
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
683
|
-
return fallback;
|
|
684
|
-
}
|
|
685
|
-
const describeHeader = this.getToolDescribeHeaderFn(toolName);
|
|
686
|
-
const describeArgs = this.getToolDescribeArgsFn(toolName);
|
|
687
|
-
if (!describeHeader && !describeArgs) {
|
|
688
|
-
return fallback;
|
|
689
|
-
}
|
|
690
|
-
try {
|
|
691
|
-
const validatedArgs = this.validateLocalToolArgs(toolName, args);
|
|
692
|
-
const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
|
|
693
|
-
const isPromiseLike = (value) => {
|
|
694
|
-
if (typeof value !== "object" || value === null) {
|
|
695
|
-
return false;
|
|
696
|
-
}
|
|
697
|
-
return typeof value.then === "function";
|
|
698
|
-
};
|
|
699
|
-
let nextSnapshot = fallback;
|
|
700
|
-
if (describeHeader) {
|
|
701
|
-
const header = describeHeader(validatedArgs, context);
|
|
702
|
-
if (!isPromiseLike(header) && header) {
|
|
703
|
-
nextSnapshot = {
|
|
704
|
-
...nextSnapshot,
|
|
705
|
-
header: { ...nextSnapshot.header, ...header }
|
|
706
|
-
};
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
if (describeArgs) {
|
|
710
|
-
const argsPresentation = describeArgs(validatedArgs, context);
|
|
711
|
-
if (!isPromiseLike(argsPresentation) && argsPresentation) {
|
|
712
|
-
nextSnapshot = {
|
|
713
|
-
...nextSnapshot,
|
|
714
|
-
args: argsPresentation
|
|
715
|
-
};
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
return nextSnapshot;
|
|
719
|
-
} catch (error) {
|
|
720
|
-
this.logger.debug(
|
|
721
|
-
`Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
722
|
-
);
|
|
723
|
-
return fallback;
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
async getToolPresentationSnapshotForCall(toolName, args, toolCallId, sessionId, runContext) {
|
|
727
|
-
const fallback = this.buildGenericToolPresentationSnapshot(toolName);
|
|
728
|
-
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
729
|
-
return fallback;
|
|
730
|
-
}
|
|
731
|
-
const describeHeader = this.getToolDescribeHeaderFn(toolName);
|
|
732
|
-
const describeArgs = this.getToolDescribeArgsFn(toolName);
|
|
733
|
-
if (!describeHeader && !describeArgs) {
|
|
734
|
-
return fallback;
|
|
735
|
-
}
|
|
736
|
-
try {
|
|
737
|
-
const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
|
|
738
|
-
const describedHeader = describeHeader ? await Promise.resolve(describeHeader(args, context)) : null;
|
|
739
|
-
const describedArgs = describeArgs ? await Promise.resolve(describeArgs(args, context)) : null;
|
|
740
|
-
return {
|
|
741
|
-
...fallback,
|
|
742
|
-
...describedHeader ? { header: { ...fallback.header, ...describedHeader } } : {},
|
|
743
|
-
...describedArgs ? { args: describedArgs } : {}
|
|
744
|
-
};
|
|
745
|
-
} catch (error) {
|
|
746
|
-
this.logger.debug(
|
|
747
|
-
`Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
748
|
-
);
|
|
749
|
-
return fallback;
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
async augmentSnapshotWithResult(toolName, snapshot, result, args, toolCallId, sessionId, runContext) {
|
|
753
|
-
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
754
|
-
return snapshot;
|
|
755
|
-
}
|
|
756
|
-
const describeResult = this.getToolDescribeResultFn(toolName);
|
|
757
|
-
if (!describeResult) {
|
|
758
|
-
return snapshot;
|
|
759
|
-
}
|
|
760
|
-
try {
|
|
761
|
-
const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
|
|
762
|
-
const resultPresentation = await Promise.resolve(describeResult(result, args, context));
|
|
763
|
-
if (!resultPresentation) {
|
|
764
|
-
return snapshot;
|
|
765
|
-
}
|
|
766
|
-
return {
|
|
767
|
-
...snapshot,
|
|
768
|
-
result: resultPresentation
|
|
769
|
-
};
|
|
770
|
-
} catch (error) {
|
|
771
|
-
this.logger.debug(
|
|
772
|
-
`Tool result presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
773
|
-
);
|
|
774
|
-
return snapshot;
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
483
|
getToolPatternKey(toolName, args) {
|
|
778
484
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
779
485
|
return null;
|
|
@@ -866,14 +572,9 @@ let _ToolManager = class _ToolManager {
|
|
|
866
572
|
if (request.metadata.directoryAccess !== void 0) {
|
|
867
573
|
return false;
|
|
868
574
|
}
|
|
869
|
-
const args = request.metadata.args;
|
|
870
|
-
if (typeof args !== "object" || args === null) {
|
|
871
|
-
return false;
|
|
872
|
-
}
|
|
873
|
-
const argsRecord = args;
|
|
874
575
|
let patternKey;
|
|
875
576
|
try {
|
|
876
|
-
patternKey = getPatternKey(
|
|
577
|
+
patternKey = getPatternKey(request.metadata.args);
|
|
877
578
|
} catch (error) {
|
|
878
579
|
this.logger.debug(
|
|
879
580
|
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
@@ -1002,22 +703,52 @@ let _ToolManager = class _ToolManager {
|
|
|
1002
703
|
};
|
|
1003
704
|
return this.toolExecutionContextFactory(baseContext);
|
|
1004
705
|
}
|
|
1005
|
-
resolveToolExecutionInvocation(
|
|
1006
|
-
if (typeof
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
706
|
+
resolveToolExecutionInvocation(invocation) {
|
|
707
|
+
if (typeof invocation !== "object" && invocation !== void 0) {
|
|
708
|
+
throw new TypeError("Tool execution invocation must be an object");
|
|
709
|
+
}
|
|
710
|
+
const options = invocation ?? {};
|
|
711
|
+
const sessionId = options.runContext?.sessionId ?? options.sessionId;
|
|
712
|
+
return { ...options, sessionId, hostRuntime: options.runContext?.hostRuntime };
|
|
713
|
+
}
|
|
714
|
+
resolveToolExecutionIdentity(invocation, toolCallId) {
|
|
715
|
+
if (invocation.executionIdentity !== void 0) {
|
|
716
|
+
return invocation.executionIdentity;
|
|
717
|
+
}
|
|
718
|
+
const ids = invocation.runContext?.hostRuntime?.ids;
|
|
719
|
+
if (!ids) {
|
|
720
|
+
return void 0;
|
|
721
|
+
}
|
|
722
|
+
const runId = ids.runId;
|
|
723
|
+
const turnId = ids.turnId;
|
|
724
|
+
const modelStepId = ids.modelStepId;
|
|
725
|
+
if (runId === void 0 || turnId === void 0 || modelStepId === void 0) {
|
|
726
|
+
return void 0;
|
|
1012
727
|
}
|
|
1013
|
-
const invocation = invocationOrSessionId ?? {};
|
|
1014
|
-
const sessionId = invocation.runContext?.sessionId ?? invocation.sessionId;
|
|
1015
728
|
return {
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
729
|
+
runId,
|
|
730
|
+
turnId,
|
|
731
|
+
modelStepId,
|
|
732
|
+
toolCallId
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
assertToolExecutionRecordMatches(input) {
|
|
736
|
+
const expected = {
|
|
737
|
+
identity: input.identity,
|
|
738
|
+
toolName: input.toolName,
|
|
739
|
+
input: input.toolInput
|
|
740
|
+
};
|
|
741
|
+
const actual = {
|
|
742
|
+
identity: input.record.identity,
|
|
743
|
+
toolName: input.record.toolName,
|
|
744
|
+
input: input.record.input
|
|
1020
745
|
};
|
|
746
|
+
if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
|
|
747
|
+
throw import_errors.ToolError.executionFailed(
|
|
748
|
+
input.toolName,
|
|
749
|
+
"Tool execution record does not match the current tool call"
|
|
750
|
+
);
|
|
751
|
+
}
|
|
1021
752
|
}
|
|
1022
753
|
validateLocalToolArgs(toolName, args) {
|
|
1023
754
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
@@ -1147,205 +878,782 @@ let _ToolManager = class _ToolManager {
|
|
|
1147
878
|
this.cacheValid = true;
|
|
1148
879
|
return this.toolsCache;
|
|
1149
880
|
}
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
881
|
+
async prepareToolCall(input) {
|
|
882
|
+
const sessionId = input.runContext?.sessionId ?? input.sessionId;
|
|
883
|
+
const source = await this.resolveExecutableToolSource(input.toolName);
|
|
884
|
+
if (source === "unknown") {
|
|
885
|
+
return this.createPreparedToolError(
|
|
886
|
+
"unknown-tool",
|
|
887
|
+
input.toolName,
|
|
888
|
+
`Tool '${input.toolName}' not found`
|
|
889
|
+
);
|
|
890
|
+
}
|
|
891
|
+
if (!isRecord(input.input)) {
|
|
892
|
+
return this.createPreparedToolError(
|
|
893
|
+
"invalid-input",
|
|
894
|
+
input.toolName,
|
|
895
|
+
"Invalid arguments: expected an object"
|
|
896
|
+
);
|
|
897
|
+
}
|
|
898
|
+
const { toolArgs: rawToolArgs, meta } = (0, import_tool_call_metadata.extractToolCallMeta)(input.input);
|
|
1165
899
|
const eventMeta = Object.keys(meta).length > 0 ? meta : void 0;
|
|
1166
|
-
let toolArgs = rawToolArgs;
|
|
1167
900
|
const callDescription = typeof meta.callDescription === "string" ? meta.callDescription : typeof rawToolArgs.description === "string" ? rawToolArgs.description : void 0;
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
sessionId,
|
|
1177
|
-
runContext
|
|
901
|
+
let validatedArgs;
|
|
902
|
+
try {
|
|
903
|
+
validatedArgs = this.validateLocalToolArgs(input.toolName, rawToolArgs);
|
|
904
|
+
} catch (error) {
|
|
905
|
+
return this.createPreparedToolError(
|
|
906
|
+
"invalid-input",
|
|
907
|
+
input.toolName,
|
|
908
|
+
error instanceof Error ? error.message : String(error)
|
|
1178
909
|
);
|
|
1179
|
-
this.agentEventBus.emit("llm:tool-call", {
|
|
1180
|
-
toolName,
|
|
1181
|
-
presentationSnapshot,
|
|
1182
|
-
args: toolArgs,
|
|
1183
|
-
...eventMeta !== void 0 ? { meta: eventMeta } : {},
|
|
1184
|
-
...callDescription !== void 0 && { callDescription },
|
|
1185
|
-
callId: toolCallId,
|
|
1186
|
-
sessionId,
|
|
1187
|
-
...hostRuntime !== void 0 && { hostRuntime }
|
|
1188
|
-
});
|
|
1189
910
|
}
|
|
1190
|
-
const {
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
911
|
+
const presentationSnapshot = await this.toolPresentation.snapshotForCall({
|
|
912
|
+
toolName: input.toolName,
|
|
913
|
+
args: validatedArgs,
|
|
914
|
+
toolCallId: input.toolCallId,
|
|
915
|
+
...sessionId !== void 0 ? { sessionId } : {},
|
|
916
|
+
...input.runContext !== void 0 ? { runContext: input.runContext } : {}
|
|
917
|
+
});
|
|
918
|
+
const call = {
|
|
919
|
+
input: validatedArgs,
|
|
920
|
+
presentationSnapshot,
|
|
921
|
+
source,
|
|
922
|
+
toolCallId: input.toolCallId,
|
|
923
|
+
toolName: input.toolName,
|
|
924
|
+
...callDescription !== void 0 ? { callDescription } : {},
|
|
925
|
+
...eventMeta !== void 0 ? { meta: eventMeta } : {}
|
|
926
|
+
};
|
|
927
|
+
const overrideRequest = await this.getToolApprovalOverrideRequest(
|
|
928
|
+
input.toolName,
|
|
929
|
+
validatedArgs,
|
|
930
|
+
input.toolCallId,
|
|
1199
931
|
sessionId,
|
|
1200
|
-
runContext
|
|
1201
|
-
callDescription
|
|
1202
|
-
);
|
|
1203
|
-
toolArgs = validatedToolArgs;
|
|
1204
|
-
this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
|
|
1205
|
-
this.logger.info(
|
|
1206
|
-
`\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
932
|
+
input.runContext
|
|
1207
933
|
);
|
|
1208
|
-
if (
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
934
|
+
if (overrideRequest) {
|
|
935
|
+
if (!overrideRequest.directoryAccess) {
|
|
936
|
+
return {
|
|
937
|
+
kind: "approval-required",
|
|
938
|
+
call,
|
|
939
|
+
onGrantedRequestDetails: overrideRequest.onGrantedRequestDetails,
|
|
940
|
+
requestDetails: overrideRequest.requestDetails
|
|
941
|
+
};
|
|
942
|
+
}
|
|
943
|
+
const quickResult2 = await this.classifyQuickApprovalRequirement(
|
|
944
|
+
input.toolName,
|
|
945
|
+
validatedArgs,
|
|
1212
946
|
sessionId,
|
|
1213
|
-
|
|
947
|
+
overrideRequest.directoryAccess
|
|
948
|
+
);
|
|
949
|
+
if (quickResult2 === "ready") {
|
|
950
|
+
return { kind: "ready", call };
|
|
951
|
+
}
|
|
952
|
+
const displayPreview2 = await this.toolPresentation.preview({
|
|
953
|
+
toolName: input.toolName,
|
|
954
|
+
args: validatedArgs,
|
|
955
|
+
toolCallId: input.toolCallId,
|
|
956
|
+
...sessionId !== void 0 ? { sessionId } : {},
|
|
957
|
+
...input.runContext !== void 0 ? { runContext: input.runContext } : {}
|
|
1214
958
|
});
|
|
959
|
+
const suggestedPatterns2 = this.getToolSuggestedPatterns(input.toolName, validatedArgs);
|
|
960
|
+
return {
|
|
961
|
+
kind: "approval-required",
|
|
962
|
+
call,
|
|
963
|
+
onGrantedRequestDetails: overrideRequest.onGrantedRequestDetails,
|
|
964
|
+
requestDetails: {
|
|
965
|
+
...overrideRequest.requestDetails,
|
|
966
|
+
metadata: {
|
|
967
|
+
...overrideRequest.requestDetails.metadata,
|
|
968
|
+
presentationSnapshot,
|
|
969
|
+
...callDescription !== void 0 ? { description: callDescription } : {},
|
|
970
|
+
...displayPreview2 !== void 0 ? { displayPreview: displayPreview2 } : {},
|
|
971
|
+
...suggestedPatterns2 !== void 0 ? { suggestedPatterns: suggestedPatterns2 } : {}
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
};
|
|
1215
975
|
}
|
|
1216
|
-
const
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
976
|
+
const quickResult = await this.classifyQuickApprovalRequirement(
|
|
977
|
+
input.toolName,
|
|
978
|
+
validatedArgs,
|
|
979
|
+
sessionId
|
|
980
|
+
);
|
|
981
|
+
if (quickResult === "ready") {
|
|
982
|
+
return { kind: "ready", call };
|
|
983
|
+
}
|
|
984
|
+
const displayPreview = await this.toolPresentation.preview({
|
|
985
|
+
toolName: input.toolName,
|
|
986
|
+
args: validatedArgs,
|
|
987
|
+
toolCallId: input.toolCallId,
|
|
988
|
+
...sessionId !== void 0 ? { sessionId } : {},
|
|
989
|
+
...input.runContext !== void 0 ? { runContext: input.runContext } : {}
|
|
990
|
+
});
|
|
991
|
+
const suggestedPatterns = this.getToolSuggestedPatterns(input.toolName, validatedArgs);
|
|
992
|
+
const hostRuntime = input.runContext?.hostRuntime;
|
|
993
|
+
const requestDetails = {
|
|
994
|
+
type: import_types3.ApprovalType.TOOL_APPROVAL,
|
|
995
|
+
...sessionId !== void 0 ? { sessionId } : {},
|
|
996
|
+
...hostRuntime !== void 0 ? { hostRuntime } : {},
|
|
997
|
+
metadata: {
|
|
998
|
+
toolName: input.toolName,
|
|
999
|
+
presentationSnapshot,
|
|
1000
|
+
toolCallId: input.toolCallId,
|
|
1001
|
+
args: validatedArgs,
|
|
1002
|
+
...callDescription !== void 0 ? { description: callDescription } : {},
|
|
1003
|
+
...displayPreview !== void 0 ? { displayPreview } : {},
|
|
1004
|
+
...suggestedPatterns !== void 0 ? { suggestedPatterns } : {}
|
|
1005
|
+
}
|
|
1006
|
+
};
|
|
1007
|
+
return {
|
|
1008
|
+
kind: "approval-required",
|
|
1009
|
+
call,
|
|
1010
|
+
onGrantedRequestDetails: requestDetails,
|
|
1011
|
+
requestDetails
|
|
1012
|
+
};
|
|
1013
|
+
}
|
|
1014
|
+
async recordApprovalRequest(prepared, identity) {
|
|
1015
|
+
this.assertOnGrantedRequestMatchesPreparedCall(prepared);
|
|
1016
|
+
const request = await this.approvalManager.recordApprovalRequest(prepared.requestDetails, {
|
|
1017
|
+
...identity,
|
|
1018
|
+
toolCallId: prepared.call.toolCallId
|
|
1019
|
+
});
|
|
1020
|
+
this.assertRecordedApprovalMatchesPreparedCall(prepared, request);
|
|
1021
|
+
return { prepared, request };
|
|
1022
|
+
}
|
|
1023
|
+
async applyApprovalDecision(recorded, decision, runContext) {
|
|
1024
|
+
if (decision.approvalId !== recorded.request.approvalId) {
|
|
1025
|
+
throw import_errors.ToolError.executionFailed(
|
|
1026
|
+
recorded.prepared.call.toolName,
|
|
1027
|
+
"Approval decision does not match the recorded approval request"
|
|
1028
|
+
);
|
|
1029
|
+
}
|
|
1030
|
+
this.assertOnGrantedRequestMatchesPreparedCall(recorded.prepared);
|
|
1031
|
+
this.assertRecordedApprovalMatchesPreparedCall(recorded.prepared, recorded.request);
|
|
1032
|
+
const record = await this.approvalManager.recordApprovalResponseRecord(
|
|
1033
|
+
decision,
|
|
1034
|
+
recorded.request
|
|
1035
|
+
);
|
|
1036
|
+
if (record.response.status !== import_types3.ApprovalStatus.APPROVED) {
|
|
1037
|
+
return {
|
|
1038
|
+
kind: "terminal",
|
|
1039
|
+
modelVisibleResult: this.createApprovalTerminalResult(
|
|
1040
|
+
recorded.prepared.call,
|
|
1041
|
+
record.response
|
|
1042
|
+
),
|
|
1043
|
+
response: record.response
|
|
1222
1044
|
};
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
...sessionId !== void 0 && { sessionId }
|
|
1045
|
+
}
|
|
1046
|
+
await this.applyApprovalGrantedEffects(recorded.prepared, record.response, runContext);
|
|
1047
|
+
return {
|
|
1048
|
+
kind: "ready",
|
|
1049
|
+
call: {
|
|
1050
|
+
...recorded.prepared.call,
|
|
1051
|
+
approval: {
|
|
1052
|
+
requireApproval: true,
|
|
1053
|
+
approvalStatus: "approved"
|
|
1233
1054
|
}
|
|
1055
|
+
},
|
|
1056
|
+
response: record.response
|
|
1057
|
+
};
|
|
1058
|
+
}
|
|
1059
|
+
async requestApprovalDecision(recorded) {
|
|
1060
|
+
return this.approvalManager.requestApprovalDecision(recorded.request);
|
|
1061
|
+
}
|
|
1062
|
+
assertRecordedApprovalMatchesPreparedCall(prepared, request) {
|
|
1063
|
+
const expected = {
|
|
1064
|
+
type: prepared.requestDetails.type,
|
|
1065
|
+
sessionId: prepared.requestDetails.sessionId,
|
|
1066
|
+
hostRuntime: prepared.requestDetails.hostRuntime,
|
|
1067
|
+
metadata: prepared.requestDetails.metadata
|
|
1068
|
+
};
|
|
1069
|
+
const actual = {
|
|
1070
|
+
type: request.type,
|
|
1071
|
+
sessionId: request.sessionId,
|
|
1072
|
+
hostRuntime: request.hostRuntime,
|
|
1073
|
+
metadata: request.metadata
|
|
1074
|
+
};
|
|
1075
|
+
if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
|
|
1076
|
+
throw import_errors.ToolError.executionFailed(
|
|
1077
|
+
prepared.call.toolName,
|
|
1078
|
+
"Recorded approval request does not match the prepared tool call"
|
|
1234
1079
|
);
|
|
1235
|
-
toolArgs = modifiedPayload.args;
|
|
1236
|
-
try {
|
|
1237
|
-
toolArgs = this.validateLocalToolArgs(toolName, toolArgs);
|
|
1238
|
-
} catch (error) {
|
|
1239
|
-
this.logger.error(
|
|
1240
|
-
`Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
|
|
1241
|
-
);
|
|
1242
|
-
throw error;
|
|
1243
|
-
}
|
|
1244
1080
|
}
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
};
|
|
1081
|
+
}
|
|
1082
|
+
assertOnGrantedRequestMatchesPreparedCall(prepared) {
|
|
1083
|
+
const approvalDetails = prepared.requestDetails;
|
|
1084
|
+
const grantedDetails = prepared.onGrantedRequestDetails;
|
|
1085
|
+
const directoryAccess = approvalDetails.type === import_types3.ApprovalType.TOOL_APPROVAL && "directoryAccess" in approvalDetails.metadata ? import_schemas.DirectoryAccessMetadataSchema.parse(approvalDetails.metadata.directoryAccess) : void 0;
|
|
1086
|
+
if (directoryAccess !== void 0) {
|
|
1087
|
+
const expected = {
|
|
1088
|
+
type: import_types3.ApprovalType.DIRECTORY_ACCESS,
|
|
1089
|
+
sessionId: approvalDetails.sessionId,
|
|
1090
|
+
hostRuntime: approvalDetails.hostRuntime,
|
|
1091
|
+
metadata: directoryAccess
|
|
1257
1092
|
};
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
toolArgs,
|
|
1269
|
-
sessionId,
|
|
1270
|
-
runContext
|
|
1093
|
+
const actual = {
|
|
1094
|
+
type: grantedDetails.type,
|
|
1095
|
+
sessionId: grantedDetails.sessionId,
|
|
1096
|
+
hostRuntime: grantedDetails.hostRuntime,
|
|
1097
|
+
metadata: grantedDetails.metadata
|
|
1098
|
+
};
|
|
1099
|
+
if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
|
|
1100
|
+
throw import_errors.ToolError.executionFailed(
|
|
1101
|
+
prepared.call.toolName,
|
|
1102
|
+
"Approval granted-effects request does not match the prepared tool call"
|
|
1271
1103
|
);
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1104
|
+
}
|
|
1105
|
+
return;
|
|
1106
|
+
}
|
|
1107
|
+
if (!(0, import_node_util.isDeepStrictEqual)(grantedDetails, approvalDetails)) {
|
|
1108
|
+
throw import_errors.ToolError.executionFailed(
|
|
1109
|
+
prepared.call.toolName,
|
|
1110
|
+
"Approval granted-effects request does not match the prepared tool call"
|
|
1111
|
+
);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
async applyApprovalGrantedEffects(prepared, response, runContext) {
|
|
1115
|
+
const requestDetails = prepared.onGrantedRequestDetails;
|
|
1116
|
+
const approvalRequestDetails = prepared.requestDetails;
|
|
1117
|
+
const sessionId = approvalRequestDetails.sessionId;
|
|
1118
|
+
const onGranted = this.getToolApprovalOnGrantedFn(prepared.call.toolName);
|
|
1119
|
+
if (onGranted) {
|
|
1120
|
+
const context = this.buildToolExecutionContext({
|
|
1121
|
+
sessionId,
|
|
1122
|
+
toolCallId: prepared.call.toolCallId,
|
|
1123
|
+
runContext
|
|
1124
|
+
});
|
|
1125
|
+
await Promise.resolve(onGranted(response, context, requestDetails));
|
|
1126
|
+
}
|
|
1127
|
+
if (approvalRequestDetails.type === import_types3.ApprovalType.TOOL_APPROVAL && response.data) {
|
|
1128
|
+
await this.handleRememberChoice(
|
|
1129
|
+
prepared.call.toolName,
|
|
1130
|
+
{
|
|
1131
|
+
data: import_schemas.ToolApprovalResponseDataSchema.parse(response.data),
|
|
1132
|
+
...response.sessionId !== void 0 ? { sessionId: response.sessionId } : {}
|
|
1133
|
+
},
|
|
1134
|
+
sessionId
|
|
1135
|
+
);
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
createApprovalTerminalResult(call, response) {
|
|
1139
|
+
return {
|
|
1140
|
+
result: {
|
|
1141
|
+
error: this.formatApprovalTerminalMessage(call.toolName, response)
|
|
1142
|
+
},
|
|
1143
|
+
presentationSnapshot: call.presentationSnapshot,
|
|
1144
|
+
...call.meta !== void 0 ? { meta: call.meta } : {},
|
|
1145
|
+
requireApproval: true,
|
|
1146
|
+
approvalStatus: "rejected"
|
|
1147
|
+
};
|
|
1148
|
+
}
|
|
1149
|
+
formatApprovalTerminalMessage(toolName, response) {
|
|
1150
|
+
if (response.status === import_types3.ApprovalStatus.CANCELLED && response.reason === import_types3.DenialReason.TIMEOUT) {
|
|
1151
|
+
return `Tool '${toolName}' was not executed because approval timed out${response.timeoutMs !== void 0 ? ` after ${response.timeoutMs}ms` : ""}.`;
|
|
1152
|
+
}
|
|
1153
|
+
const outcome = response.status === import_types3.ApprovalStatus.DENIED ? "approval was denied" : "approval was cancelled";
|
|
1154
|
+
return `Tool '${toolName}' was not executed because ${outcome}${response.message ? `: ${response.message}` : ""}.`;
|
|
1155
|
+
}
|
|
1156
|
+
async resolveExecutableToolSource(toolName) {
|
|
1157
|
+
if (this.agentTools.has(toolName)) {
|
|
1158
|
+
return "local";
|
|
1159
|
+
}
|
|
1160
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
|
|
1161
|
+
return "mcp";
|
|
1162
|
+
}
|
|
1163
|
+
return "unknown";
|
|
1164
|
+
}
|
|
1165
|
+
createPreparedToolError(kind, toolName, error) {
|
|
1166
|
+
return {
|
|
1167
|
+
kind: "terminal",
|
|
1168
|
+
reason: kind,
|
|
1169
|
+
modelVisibleResult: {
|
|
1170
|
+
result: { error },
|
|
1171
|
+
presentationSnapshot: this.toolPresentation.buildGenericSnapshot(toolName)
|
|
1172
|
+
}
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
createPreparedToolTerminal(reason, toolName, call) {
|
|
1176
|
+
return {
|
|
1177
|
+
kind: "terminal",
|
|
1178
|
+
reason,
|
|
1179
|
+
call,
|
|
1180
|
+
modelVisibleResult: {
|
|
1181
|
+
result: {
|
|
1182
|
+
error: `Tool '${toolName}' was not executed because policy denied it.`
|
|
1183
|
+
},
|
|
1184
|
+
presentationSnapshot: call.presentationSnapshot,
|
|
1185
|
+
...call.meta !== void 0 ? { meta: call.meta } : {}
|
|
1186
|
+
}
|
|
1187
|
+
};
|
|
1188
|
+
}
|
|
1189
|
+
async getToolApprovalOverrideRequest(toolName, args, toolCallId, sessionId, runContext) {
|
|
1190
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
1191
|
+
return null;
|
|
1192
|
+
}
|
|
1193
|
+
const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
|
|
1194
|
+
if (!getApprovalOverride) {
|
|
1195
|
+
return null;
|
|
1196
|
+
}
|
|
1197
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
|
|
1198
|
+
const approvalRequest = await getApprovalOverride(args, context);
|
|
1199
|
+
if (!approvalRequest) {
|
|
1200
|
+
return null;
|
|
1201
|
+
}
|
|
1202
|
+
const requestDetails = {
|
|
1203
|
+
...approvalRequest,
|
|
1204
|
+
...sessionId && !approvalRequest.sessionId ? { sessionId } : {},
|
|
1205
|
+
...runContext?.hostRuntime !== void 0 && approvalRequest.hostRuntime === void 0 ? { hostRuntime: runContext.hostRuntime } : {}
|
|
1206
|
+
};
|
|
1207
|
+
if (requestDetails.type !== import_types3.ApprovalType.DIRECTORY_ACCESS) {
|
|
1208
|
+
return { requestDetails, onGrantedRequestDetails: requestDetails };
|
|
1209
|
+
}
|
|
1210
|
+
const parseResult = import_schemas.DirectoryAccessMetadataSchema.safeParse(requestDetails.metadata);
|
|
1211
|
+
if (!parseResult.success) {
|
|
1212
|
+
throw import_errors.ToolError.configInvalid(
|
|
1213
|
+
`Tool '${toolName}' returned invalid directory access metadata`
|
|
1214
|
+
);
|
|
1215
|
+
}
|
|
1216
|
+
const directoryAccess = parseResult.data;
|
|
1217
|
+
return {
|
|
1218
|
+
directoryAccess,
|
|
1219
|
+
onGrantedRequestDetails: requestDetails,
|
|
1220
|
+
requestDetails: {
|
|
1221
|
+
type: import_types3.ApprovalType.TOOL_APPROVAL,
|
|
1222
|
+
...requestDetails.sessionId !== void 0 ? { sessionId: requestDetails.sessionId } : {},
|
|
1223
|
+
...requestDetails.hostRuntime !== void 0 ? { hostRuntime: requestDetails.hostRuntime } : {},
|
|
1224
|
+
metadata: {
|
|
1225
|
+
toolName,
|
|
1226
|
+
toolCallId,
|
|
1227
|
+
args,
|
|
1228
|
+
directoryAccess
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
};
|
|
1232
|
+
}
|
|
1233
|
+
async classifyQuickApprovalRequirement(toolName, args, sessionId, directoryAccess) {
|
|
1234
|
+
if (directoryAccess) {
|
|
1235
|
+
return this.approvalMode === "auto-approve" ? "ready" : "approval-required";
|
|
1236
|
+
}
|
|
1237
|
+
if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
|
|
1238
|
+
return "ready";
|
|
1239
|
+
}
|
|
1240
|
+
if (this.isInAlwaysAllowList(toolName)) {
|
|
1241
|
+
return "ready";
|
|
1242
|
+
}
|
|
1243
|
+
if (await this.allowedToolsProvider.isToolAllowed(toolName, sessionId)) {
|
|
1244
|
+
return "ready";
|
|
1245
|
+
}
|
|
1246
|
+
const patternKey = this.getToolPatternKey(toolName, args);
|
|
1247
|
+
if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey, sessionId)) {
|
|
1248
|
+
return "ready";
|
|
1249
|
+
}
|
|
1250
|
+
if (this.approvalMode === "auto-approve") {
|
|
1251
|
+
return "ready";
|
|
1252
|
+
}
|
|
1253
|
+
return "approval-required";
|
|
1254
|
+
}
|
|
1255
|
+
async executeTool(toolName, args, toolCallId, invocation) {
|
|
1256
|
+
const { sessionId, runContext, hostRuntime } = this.resolveToolExecutionInvocation(invocation);
|
|
1257
|
+
this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
|
|
1258
|
+
this.logger.debug(`Tool args: ${JSON.stringify(args, null, 2)}`);
|
|
1259
|
+
if (toolName === _ToolManager.MCP_TOOL_PREFIX) {
|
|
1260
|
+
throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
1261
|
+
}
|
|
1262
|
+
const prepared = await this.prepareToolCall({
|
|
1263
|
+
toolName,
|
|
1264
|
+
input: args,
|
|
1265
|
+
toolCallId,
|
|
1266
|
+
...sessionId !== void 0 ? { sessionId } : {},
|
|
1267
|
+
...runContext !== void 0 ? { runContext } : {}
|
|
1268
|
+
});
|
|
1269
|
+
if (prepared.kind === "terminal") {
|
|
1270
|
+
this.throwPreparedTerminalResult(toolName, prepared, sessionId);
|
|
1271
|
+
}
|
|
1272
|
+
this.emitPreparedToolCallEvent(prepared.call, sessionId, runContext, hostRuntime);
|
|
1273
|
+
const replayed = await this.replayExistingDirectToolExecution(prepared.call, invocation);
|
|
1274
|
+
if (replayed !== void 0) {
|
|
1275
|
+
return replayed;
|
|
1276
|
+
}
|
|
1277
|
+
if (prepared.kind === "ready") {
|
|
1278
|
+
return this.executePreparedToolCall(prepared.call, invocation, { throwOnError: true });
|
|
1279
|
+
}
|
|
1280
|
+
let applied;
|
|
1281
|
+
try {
|
|
1282
|
+
const recorded = await this.recordApprovalRequest(
|
|
1283
|
+
prepared,
|
|
1284
|
+
this.resolveDirectApprovalIdentity(invocation, toolCallId)
|
|
1285
|
+
);
|
|
1286
|
+
const response = await this.requestApprovalDecision(recorded);
|
|
1287
|
+
applied = await this.applyApprovalDecision(
|
|
1288
|
+
recorded,
|
|
1289
|
+
{
|
|
1290
|
+
approvalId: response.approvalId,
|
|
1291
|
+
status: response.status,
|
|
1292
|
+
...response.reason !== void 0 ? { reason: response.reason } : {},
|
|
1293
|
+
...response.message !== void 0 ? { message: response.message } : {},
|
|
1294
|
+
...response.data !== void 0 ? { data: response.data } : {}
|
|
1295
|
+
},
|
|
1296
|
+
runContext
|
|
1297
|
+
);
|
|
1298
|
+
} catch (error) {
|
|
1299
|
+
await this.recordDirectToolExecutionFailure(prepared.call, invocation, error);
|
|
1300
|
+
throw error;
|
|
1301
|
+
}
|
|
1302
|
+
if (applied.kind === "terminal") {
|
|
1303
|
+
try {
|
|
1304
|
+
this.handleApprovalDenied(toolName, applied.response, sessionId);
|
|
1305
|
+
} catch (error) {
|
|
1306
|
+
await this.recordDirectToolExecutionFailure(prepared.call, invocation, error);
|
|
1307
|
+
throw error;
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
return this.executePreparedToolCall(applied.call, invocation, { throwOnError: true });
|
|
1311
|
+
}
|
|
1312
|
+
emitPreparedToolCallEvent(call, sessionId, runContext, hostRuntime) {
|
|
1313
|
+
if (!sessionId) {
|
|
1314
|
+
return;
|
|
1315
|
+
}
|
|
1316
|
+
this.agentEventBus.emit("llm:tool-call", {
|
|
1317
|
+
toolName: call.toolName,
|
|
1318
|
+
presentationSnapshot: this.toolPresentation.snapshotForToolCallEvent({
|
|
1319
|
+
toolName: call.toolName,
|
|
1320
|
+
args: call.input,
|
|
1321
|
+
toolCallId: call.toolCallId,
|
|
1322
|
+
sessionId,
|
|
1323
|
+
...runContext !== void 0 ? { runContext } : {}
|
|
1324
|
+
}),
|
|
1325
|
+
args: call.input,
|
|
1326
|
+
...call.meta !== void 0 ? { meta: call.meta } : {},
|
|
1327
|
+
...call.callDescription !== void 0 ? { callDescription: call.callDescription } : {},
|
|
1328
|
+
callId: call.toolCallId,
|
|
1329
|
+
sessionId,
|
|
1330
|
+
...hostRuntime !== void 0 && { hostRuntime }
|
|
1331
|
+
});
|
|
1332
|
+
}
|
|
1333
|
+
async replayExistingDirectToolExecution(call, invocation) {
|
|
1334
|
+
const { sessionId } = this.resolveToolExecutionInvocation(invocation);
|
|
1335
|
+
if ((0, import_env.isBackgroundTasksEnabled)() && call.meta?.runInBackground === true && sessionId !== void 0) {
|
|
1336
|
+
return void 0;
|
|
1337
|
+
}
|
|
1338
|
+
const identity = this.resolveToolExecutionIdentity(invocation ?? {}, call.toolCallId);
|
|
1339
|
+
if (identity === void 0) {
|
|
1340
|
+
return void 0;
|
|
1341
|
+
}
|
|
1342
|
+
const executionId = (0, import_types4.createToolExecutionId)(identity);
|
|
1343
|
+
const record = await this.toolExecutionStore.get({ executionId });
|
|
1344
|
+
if (record === void 0) {
|
|
1345
|
+
return void 0;
|
|
1346
|
+
}
|
|
1347
|
+
this.assertToolExecutionRecordMatches({
|
|
1348
|
+
record,
|
|
1349
|
+
identity,
|
|
1350
|
+
toolName: call.toolName,
|
|
1351
|
+
toolInput: call.input
|
|
1352
|
+
});
|
|
1353
|
+
if (record.status === "completed") {
|
|
1354
|
+
this.logger.info("Replaying completed direct tool execution result", {
|
|
1355
|
+
executionId,
|
|
1356
|
+
toolName: call.toolName
|
|
1357
|
+
});
|
|
1358
|
+
return (0, import_types4.completedToolExecutionToResult)(record);
|
|
1359
|
+
}
|
|
1360
|
+
if (record.status === "failed") {
|
|
1361
|
+
throw import_errors.ToolError.executionFailed(
|
|
1362
|
+
call.toolName,
|
|
1363
|
+
`Tool execution already failed: ${executionId}`
|
|
1364
|
+
);
|
|
1365
|
+
}
|
|
1366
|
+
throw import_errors.ToolError.executionFailed(
|
|
1367
|
+
call.toolName,
|
|
1368
|
+
`Tool execution already ${record.status}: ${executionId}`
|
|
1369
|
+
);
|
|
1370
|
+
}
|
|
1371
|
+
async recordDirectToolExecutionFailure(call, invocation, error) {
|
|
1372
|
+
const identity = this.resolveToolExecutionIdentity(invocation ?? {}, call.toolCallId);
|
|
1373
|
+
if (identity === void 0) {
|
|
1374
|
+
return;
|
|
1375
|
+
}
|
|
1376
|
+
const executionId = (0, import_types4.createToolExecutionId)(identity);
|
|
1377
|
+
const started = await this.toolExecutionStore.start({
|
|
1378
|
+
record: {
|
|
1379
|
+
executionId,
|
|
1380
|
+
identity,
|
|
1381
|
+
input: call.input,
|
|
1382
|
+
toolName: call.toolName,
|
|
1383
|
+
status: "running",
|
|
1384
|
+
startedAt: /* @__PURE__ */ new Date(),
|
|
1385
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
1386
|
+
}
|
|
1387
|
+
});
|
|
1388
|
+
if (started.status === "existing") {
|
|
1389
|
+
this.assertToolExecutionRecordMatches({
|
|
1390
|
+
record: started.record,
|
|
1391
|
+
identity,
|
|
1392
|
+
toolName: call.toolName,
|
|
1393
|
+
toolInput: call.input
|
|
1394
|
+
});
|
|
1395
|
+
if (started.record.status !== "running") {
|
|
1396
|
+
return;
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
await this.toolExecutionStore.fail({
|
|
1400
|
+
executionId,
|
|
1401
|
+
completedAt: /* @__PURE__ */ new Date(),
|
|
1402
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1403
|
+
});
|
|
1404
|
+
}
|
|
1405
|
+
resolveDirectApprovalIdentity(invocation, toolCallId) {
|
|
1406
|
+
const executionIdentity = this.resolveToolExecutionIdentity(invocation ?? {}, toolCallId);
|
|
1407
|
+
if (executionIdentity !== void 0) {
|
|
1408
|
+
return {
|
|
1409
|
+
runId: executionIdentity.runId,
|
|
1410
|
+
turnId: executionIdentity.turnId,
|
|
1411
|
+
modelStepId: executionIdentity.modelStepId
|
|
1412
|
+
};
|
|
1413
|
+
}
|
|
1414
|
+
const ids = invocation?.runContext?.hostRuntime?.ids;
|
|
1415
|
+
const runId = ids?.runId;
|
|
1416
|
+
const turnId = ids?.turnId;
|
|
1417
|
+
const modelStepId = ids?.modelStepId;
|
|
1418
|
+
if (runId !== void 0 && turnId !== void 0 && modelStepId !== void 0) {
|
|
1419
|
+
return { runId, turnId, modelStepId };
|
|
1420
|
+
}
|
|
1421
|
+
return {
|
|
1422
|
+
runId: invocation?.sessionId ?? invocation?.runContext?.sessionId ?? "direct",
|
|
1423
|
+
turnId: "direct",
|
|
1424
|
+
modelStepId: "direct"
|
|
1425
|
+
};
|
|
1426
|
+
}
|
|
1427
|
+
throwPreparedTerminalResult(toolName, prepared, sessionId) {
|
|
1428
|
+
if (prepared.reason === "unknown-tool") {
|
|
1429
|
+
throw import_errors.ToolError.notFound(toolName);
|
|
1430
|
+
}
|
|
1431
|
+
if (prepared.reason === "denied") {
|
|
1432
|
+
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
1433
|
+
}
|
|
1434
|
+
if (prepared.reason === "invalid-input") {
|
|
1435
|
+
throw import_errors.ToolError.validationFailed(
|
|
1436
|
+
toolName,
|
|
1437
|
+
this.getPreparedTerminalMessage(prepared.modelVisibleResult)
|
|
1438
|
+
);
|
|
1439
|
+
}
|
|
1440
|
+
throw import_errors.ToolError.executionFailed(
|
|
1441
|
+
toolName,
|
|
1442
|
+
this.getPreparedTerminalMessage(prepared.modelVisibleResult),
|
|
1443
|
+
sessionId
|
|
1444
|
+
);
|
|
1445
|
+
}
|
|
1446
|
+
getPreparedTerminalMessage(result) {
|
|
1447
|
+
const output = result.result;
|
|
1448
|
+
if (isRecord(output) && typeof output.error === "string") {
|
|
1449
|
+
return output.error;
|
|
1450
|
+
}
|
|
1451
|
+
return "Tool call could not be prepared for execution";
|
|
1452
|
+
}
|
|
1453
|
+
async executePreparedToolCall(call, invocation, options) {
|
|
1454
|
+
const { sessionId, abortSignal, runContext, hostRuntime } = this.resolveToolExecutionInvocation(invocation);
|
|
1455
|
+
const durableIdentity = this.resolveToolExecutionIdentity(
|
|
1456
|
+
invocation ?? {},
|
|
1457
|
+
call.toolCallId
|
|
1458
|
+
);
|
|
1459
|
+
const backgroundTasksEnabled = (0, import_env.isBackgroundTasksEnabled)();
|
|
1460
|
+
const willRunInBackground = backgroundTasksEnabled && call.meta?.runInBackground === true && sessionId !== void 0;
|
|
1461
|
+
const executionIdentity = willRunInBackground ? void 0 : durableIdentity;
|
|
1462
|
+
const executionId = executionIdentity === void 0 ? void 0 : (0, import_types4.createToolExecutionId)(executionIdentity);
|
|
1463
|
+
let toolArgs = call.input;
|
|
1464
|
+
this.logger.debug(
|
|
1465
|
+
`\u{1F527} Prepared tool execution requested: '${call.toolName}' (toolCallId: ${call.toolCallId})`
|
|
1466
|
+
);
|
|
1467
|
+
if (executionIdentity !== void 0 && executionId !== void 0) {
|
|
1468
|
+
const started = await this.toolExecutionStore.start({
|
|
1469
|
+
record: {
|
|
1470
|
+
executionId,
|
|
1471
|
+
identity: executionIdentity,
|
|
1472
|
+
input: call.input,
|
|
1473
|
+
toolName: call.toolName,
|
|
1474
|
+
status: "running",
|
|
1475
|
+
startedAt: /* @__PURE__ */ new Date(),
|
|
1476
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
1477
|
+
}
|
|
1478
|
+
});
|
|
1479
|
+
if (started.status === "existing") {
|
|
1480
|
+
this.assertToolExecutionRecordMatches({
|
|
1481
|
+
record: started.record,
|
|
1482
|
+
identity: executionIdentity,
|
|
1483
|
+
toolName: call.toolName,
|
|
1484
|
+
toolInput: call.input
|
|
1485
|
+
});
|
|
1486
|
+
if (started.record.status === "completed") {
|
|
1487
|
+
this.logger.info("Replaying completed prepared tool execution result", {
|
|
1488
|
+
executionId,
|
|
1489
|
+
toolName: call.toolName
|
|
1490
|
+
});
|
|
1491
|
+
return (0, import_types4.completedToolExecutionToResult)(started.record);
|
|
1492
|
+
}
|
|
1493
|
+
if (started.record.status === "failed") {
|
|
1494
|
+
this.logger.info("Replaying failed prepared tool execution result", {
|
|
1495
|
+
executionId,
|
|
1496
|
+
toolName: call.toolName
|
|
1497
|
+
});
|
|
1498
|
+
if (options?.throwOnError === true) {
|
|
1499
|
+
throw import_errors.ToolError.executionFailed(
|
|
1500
|
+
call.toolName,
|
|
1501
|
+
`Tool execution already failed: ${executionId}`
|
|
1502
|
+
);
|
|
1503
|
+
}
|
|
1504
|
+
return this.createFailedPreparedToolResult(call, started.record.error);
|
|
1505
|
+
}
|
|
1506
|
+
throw import_errors.ToolError.executionFailed(
|
|
1507
|
+
call.toolName,
|
|
1508
|
+
`Tool execution already ${started.record.status}: ${executionId}`
|
|
1509
|
+
);
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
const startTime = Date.now();
|
|
1513
|
+
try {
|
|
1514
|
+
this.logger.info(
|
|
1515
|
+
`\u{1F527} Prepared tool execution started for ${call.toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1516
|
+
);
|
|
1517
|
+
if (sessionId) {
|
|
1518
|
+
this.agentEventBus.emit("tool:running", {
|
|
1519
|
+
toolName: call.toolName,
|
|
1520
|
+
toolCallId: call.toolCallId,
|
|
1521
|
+
sessionId,
|
|
1522
|
+
...hostRuntime !== void 0 && { hostRuntime }
|
|
1523
|
+
});
|
|
1524
|
+
}
|
|
1525
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
1526
|
+
const beforePayload = {
|
|
1527
|
+
toolName: call.toolName,
|
|
1528
|
+
args: toolArgs,
|
|
1529
|
+
...sessionId !== void 0 && { sessionId }
|
|
1530
|
+
};
|
|
1531
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
1532
|
+
"beforeToolCall",
|
|
1533
|
+
beforePayload,
|
|
1534
|
+
{
|
|
1535
|
+
sessionManager: this.sessionManager,
|
|
1536
|
+
mcpManager: this.mcpManager,
|
|
1537
|
+
toolManager: this,
|
|
1538
|
+
stateManager: this.stateManager,
|
|
1539
|
+
...runContext !== void 0 && { runContext },
|
|
1540
|
+
...sessionId !== void 0 && { sessionId }
|
|
1541
|
+
}
|
|
1542
|
+
);
|
|
1543
|
+
toolArgs = modifiedPayload.args;
|
|
1544
|
+
try {
|
|
1545
|
+
toolArgs = this.validateLocalToolArgs(call.toolName, toolArgs);
|
|
1546
|
+
} catch (error) {
|
|
1547
|
+
this.logger.error(
|
|
1548
|
+
`Post-hook validation failed for tool '${call.toolName}': a beforeToolCall hook may have set invalid args`
|
|
1549
|
+
);
|
|
1550
|
+
throw error;
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
let result;
|
|
1554
|
+
const registerBackgroundTask = (promise, description) => {
|
|
1555
|
+
return {
|
|
1556
|
+
result: {
|
|
1557
|
+
taskId: call.toolCallId,
|
|
1558
|
+
status: "running",
|
|
1559
|
+
description
|
|
1560
|
+
},
|
|
1561
|
+
promise
|
|
1562
|
+
};
|
|
1563
|
+
};
|
|
1564
|
+
if (call.source === "mcp") {
|
|
1565
|
+
const actualToolName = call.toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
1566
|
+
if (actualToolName.length === 0) {
|
|
1567
|
+
throw import_errors.ToolError.invalidName(
|
|
1568
|
+
call.toolName,
|
|
1569
|
+
"tool name cannot be empty after prefix"
|
|
1570
|
+
);
|
|
1571
|
+
}
|
|
1572
|
+
const executeMcpTool = () => runContext === void 0 ? this.mcpManager.executeTool(actualToolName, toolArgs, sessionId) : this.mcpManager.executeTool(
|
|
1573
|
+
actualToolName,
|
|
1574
|
+
toolArgs,
|
|
1575
|
+
sessionId,
|
|
1576
|
+
runContext
|
|
1577
|
+
);
|
|
1578
|
+
if (call.meta?.runInBackground === true && !backgroundTasksEnabled) {
|
|
1579
|
+
this.logger.debug(
|
|
1580
|
+
"Background tool execution disabled; running synchronously instead.",
|
|
1581
|
+
{ toolName: call.toolName }
|
|
1582
|
+
);
|
|
1583
|
+
}
|
|
1584
|
+
if (willRunInBackground) {
|
|
1585
|
+
const backgroundSessionId = sessionId;
|
|
1586
|
+
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
1587
|
+
executeMcpTool(),
|
|
1588
|
+
`MCP tool ${actualToolName}`
|
|
1589
|
+
);
|
|
1590
|
+
this.agentEventBus.emit("tool:background", {
|
|
1591
|
+
toolName: call.toolName,
|
|
1592
|
+
toolCallId: backgroundResult.taskId,
|
|
1593
|
+
sessionId: backgroundSessionId,
|
|
1594
|
+
description: backgroundResult.description,
|
|
1595
|
+
promise,
|
|
1596
|
+
...hostRuntime !== void 0 && { hostRuntime },
|
|
1597
|
+
...call.meta?.timeoutMs !== void 0 && {
|
|
1598
|
+
timeoutMs: call.meta.timeoutMs
|
|
1599
|
+
},
|
|
1600
|
+
...call.meta?.notifyOnComplete !== void 0 && {
|
|
1601
|
+
notifyOnComplete: call.meta.notifyOnComplete
|
|
1602
|
+
}
|
|
1603
|
+
});
|
|
1604
|
+
result = backgroundResult;
|
|
1605
|
+
} else {
|
|
1606
|
+
result = await executeMcpTool();
|
|
1607
|
+
}
|
|
1608
|
+
} else {
|
|
1609
|
+
if (call.meta?.runInBackground === true && !backgroundTasksEnabled) {
|
|
1610
|
+
this.logger.debug(
|
|
1611
|
+
"Background tool execution disabled; running synchronously instead.",
|
|
1612
|
+
{ toolName: call.toolName }
|
|
1613
|
+
);
|
|
1614
|
+
}
|
|
1615
|
+
if (willRunInBackground) {
|
|
1616
|
+
const backgroundSessionId = sessionId;
|
|
1617
|
+
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
1618
|
+
this.executeLocalTool(call.toolName, toolArgs, {
|
|
1619
|
+
sessionId: backgroundSessionId,
|
|
1620
|
+
abortSignal,
|
|
1621
|
+
toolCallId: call.toolCallId,
|
|
1315
1622
|
runContext
|
|
1316
1623
|
}),
|
|
1317
|
-
`Tool ${toolName}`
|
|
1624
|
+
`Tool ${call.toolName}`
|
|
1318
1625
|
);
|
|
1319
1626
|
this.agentEventBus.emit("tool:background", {
|
|
1320
|
-
toolName,
|
|
1627
|
+
toolName: call.toolName,
|
|
1321
1628
|
toolCallId: backgroundResult.taskId,
|
|
1322
1629
|
sessionId: backgroundSessionId,
|
|
1323
1630
|
description: backgroundResult.description,
|
|
1324
1631
|
promise,
|
|
1325
1632
|
...hostRuntime !== void 0 && { hostRuntime },
|
|
1326
|
-
...meta
|
|
1327
|
-
|
|
1328
|
-
|
|
1633
|
+
...call.meta?.timeoutMs !== void 0 && {
|
|
1634
|
+
timeoutMs: call.meta.timeoutMs
|
|
1635
|
+
},
|
|
1636
|
+
...call.meta?.notifyOnComplete !== void 0 && {
|
|
1637
|
+
notifyOnComplete: call.meta.notifyOnComplete
|
|
1329
1638
|
}
|
|
1330
1639
|
});
|
|
1331
1640
|
result = backgroundResult;
|
|
1332
1641
|
} else {
|
|
1333
|
-
result = await this.executeLocalTool(toolName, toolArgs, {
|
|
1642
|
+
result = await this.executeLocalTool(call.toolName, toolArgs, {
|
|
1334
1643
|
sessionId,
|
|
1335
1644
|
abortSignal,
|
|
1336
|
-
toolCallId,
|
|
1645
|
+
toolCallId: call.toolCallId,
|
|
1337
1646
|
runContext
|
|
1338
1647
|
});
|
|
1339
1648
|
}
|
|
1340
1649
|
}
|
|
1341
1650
|
const duration = Date.now() - startTime;
|
|
1342
|
-
this.logger.debug(
|
|
1343
|
-
|
|
1344
|
-
`\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
|
|
1651
|
+
this.logger.debug(
|
|
1652
|
+
`\u{1F3AF} Prepared tool execution completed in ${duration}ms: '${call.toolName}'`
|
|
1345
1653
|
);
|
|
1346
1654
|
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
1347
1655
|
const afterPayload = {
|
|
1348
|
-
toolName,
|
|
1656
|
+
toolName: call.toolName,
|
|
1349
1657
|
result,
|
|
1350
1658
|
success: true,
|
|
1351
1659
|
...sessionId !== void 0 && { sessionId }
|
|
@@ -1364,29 +1672,45 @@ let _ToolManager = class _ToolManager {
|
|
|
1364
1672
|
);
|
|
1365
1673
|
result = modifiedPayload.result;
|
|
1366
1674
|
}
|
|
1367
|
-
const presentationSnapshot = await this.
|
|
1368
|
-
toolName,
|
|
1369
|
-
|
|
1675
|
+
const presentationSnapshot = await this.toolPresentation.augmentWithResult({
|
|
1676
|
+
toolName: call.toolName,
|
|
1677
|
+
snapshot: call.presentationSnapshot,
|
|
1370
1678
|
result,
|
|
1371
|
-
toolArgs,
|
|
1372
|
-
toolCallId,
|
|
1373
|
-
sessionId,
|
|
1374
|
-
runContext
|
|
1375
|
-
);
|
|
1376
|
-
|
|
1679
|
+
args: toolArgs,
|
|
1680
|
+
toolCallId: call.toolCallId,
|
|
1681
|
+
...sessionId !== void 0 ? { sessionId } : {},
|
|
1682
|
+
...runContext !== void 0 ? { runContext } : {}
|
|
1683
|
+
});
|
|
1684
|
+
const executionResult = {
|
|
1377
1685
|
result,
|
|
1378
1686
|
...presentationSnapshot !== void 0 && { presentationSnapshot },
|
|
1379
|
-
...
|
|
1380
|
-
...
|
|
1687
|
+
...call.meta !== void 0 ? { meta: call.meta } : {},
|
|
1688
|
+
...call.approval !== void 0 ? call.approval : {}
|
|
1381
1689
|
};
|
|
1690
|
+
if (executionId !== void 0) {
|
|
1691
|
+
await this.toolExecutionStore.complete({
|
|
1692
|
+
executionId,
|
|
1693
|
+
completedAt: /* @__PURE__ */ new Date(),
|
|
1694
|
+
result: executionResult
|
|
1695
|
+
});
|
|
1696
|
+
}
|
|
1697
|
+
return executionResult;
|
|
1382
1698
|
} catch (error) {
|
|
1383
1699
|
const duration = Date.now() - startTime;
|
|
1384
1700
|
this.logger.error(
|
|
1385
|
-
`\u274C
|
|
1701
|
+
`\u274C Prepared tool execution failed for ${call.toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
|
|
1386
1702
|
);
|
|
1703
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1704
|
+
if (executionId !== void 0) {
|
|
1705
|
+
await this.toolExecutionStore.fail({
|
|
1706
|
+
executionId,
|
|
1707
|
+
completedAt: /* @__PURE__ */ new Date(),
|
|
1708
|
+
error: message
|
|
1709
|
+
});
|
|
1710
|
+
}
|
|
1387
1711
|
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
1388
1712
|
const afterPayload = {
|
|
1389
|
-
toolName,
|
|
1713
|
+
toolName: call.toolName,
|
|
1390
1714
|
result: error instanceof Error ? error.message : String(error),
|
|
1391
1715
|
success: false,
|
|
1392
1716
|
...sessionId !== void 0 && { sessionId }
|
|
@@ -1400,9 +1724,20 @@ let _ToolManager = class _ToolManager {
|
|
|
1400
1724
|
...sessionId !== void 0 && { sessionId }
|
|
1401
1725
|
});
|
|
1402
1726
|
}
|
|
1403
|
-
|
|
1727
|
+
if (options?.throwOnError === true) {
|
|
1728
|
+
throw error;
|
|
1729
|
+
}
|
|
1730
|
+
return this.createFailedPreparedToolResult(call, message);
|
|
1404
1731
|
}
|
|
1405
1732
|
}
|
|
1733
|
+
createFailedPreparedToolResult(call, error) {
|
|
1734
|
+
return {
|
|
1735
|
+
result: { error },
|
|
1736
|
+
presentationSnapshot: call.presentationSnapshot,
|
|
1737
|
+
...call.meta !== void 0 ? { meta: call.meta } : {},
|
|
1738
|
+
...call.approval !== void 0 ? call.approval : {}
|
|
1739
|
+
};
|
|
1740
|
+
}
|
|
1406
1741
|
/**
|
|
1407
1742
|
* Check if a tool exists.
|
|
1408
1743
|
*/
|
|
@@ -1448,45 +1783,6 @@ let _ToolManager = class _ToolManager {
|
|
|
1448
1783
|
}
|
|
1449
1784
|
return "unknown";
|
|
1450
1785
|
}
|
|
1451
|
-
/**
|
|
1452
|
-
* Check if a tool matches a policy pattern
|
|
1453
|
-
* Supports both exact matching and suffix matching for MCP tools with server prefixes
|
|
1454
|
-
*
|
|
1455
|
-
* Examples:
|
|
1456
|
-
* - Policy "mcp--read_file" matches "mcp--read_file" (exact)
|
|
1457
|
-
* - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
|
|
1458
|
-
* - Policy "read_file" matches "read_file" (local tool exact only)
|
|
1459
|
-
*
|
|
1460
|
-
* @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
|
|
1461
|
-
* @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
|
|
1462
|
-
* @returns true if the tool matches the policy pattern
|
|
1463
|
-
*/
|
|
1464
|
-
matchesToolPolicy(toolName, policyPattern) {
|
|
1465
|
-
if (toolName === policyPattern) {
|
|
1466
|
-
return true;
|
|
1467
|
-
}
|
|
1468
|
-
if (policyPattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
1469
|
-
const baseName = policyPattern.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
1470
|
-
if (toolName.endsWith(`--${baseName}`) && toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
1471
|
-
return true;
|
|
1472
|
-
}
|
|
1473
|
-
}
|
|
1474
|
-
return false;
|
|
1475
|
-
}
|
|
1476
|
-
/**
|
|
1477
|
-
* Check if a tool is in the static alwaysDeny list
|
|
1478
|
-
* Supports both exact and suffix matching (e.g., "mcp--read_file" matches "mcp--server--read_file")
|
|
1479
|
-
* @param toolName The fully qualified tool name to check
|
|
1480
|
-
* @returns true if the tool is in the deny list
|
|
1481
|
-
*/
|
|
1482
|
-
isInAlwaysDenyList(toolName) {
|
|
1483
|
-
if (!this.toolPolicies?.alwaysDeny) {
|
|
1484
|
-
return false;
|
|
1485
|
-
}
|
|
1486
|
-
return this.toolPolicies.alwaysDeny.some(
|
|
1487
|
-
(pattern) => this.matchesToolPolicy(toolName, pattern)
|
|
1488
|
-
);
|
|
1489
|
-
}
|
|
1490
1786
|
/**
|
|
1491
1787
|
* Check if a tool is in the static alwaysAllow list
|
|
1492
1788
|
* Supports both exact and suffix matching (e.g., "mcp--read_file" matches "mcp--server--read_file")
|
|
@@ -1498,250 +1794,9 @@ let _ToolManager = class _ToolManager {
|
|
|
1498
1794
|
return false;
|
|
1499
1795
|
}
|
|
1500
1796
|
return this.toolPolicies.alwaysAllow.some(
|
|
1501
|
-
(pattern) =>
|
|
1797
|
+
(pattern) => (0, import_session_tool_policy.matchesToolPolicyPattern)(toolName, pattern)
|
|
1502
1798
|
);
|
|
1503
1799
|
}
|
|
1504
|
-
/**
|
|
1505
|
-
* Handle tool approval flow. Checks various precedence levels to determine
|
|
1506
|
-
* if a tool should be auto-approved, denied, or requires manual approval.
|
|
1507
|
-
*/
|
|
1508
|
-
async handleToolApproval(toolName, args, toolCallId, sessionId, runContext, callDescription) {
|
|
1509
|
-
if (this.isInAlwaysDenyList(toolName)) {
|
|
1510
|
-
this.logger.info(
|
|
1511
|
-
`Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
|
|
1512
|
-
);
|
|
1513
|
-
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
1514
|
-
}
|
|
1515
|
-
const validatedArgs = this.validateLocalToolArgs(toolName, args);
|
|
1516
|
-
const presentationSnapshot = await this.getToolPresentationSnapshotForCall(
|
|
1517
|
-
toolName,
|
|
1518
|
-
validatedArgs,
|
|
1519
|
-
toolCallId,
|
|
1520
|
-
sessionId,
|
|
1521
|
-
runContext
|
|
1522
|
-
);
|
|
1523
|
-
let directoryAccess;
|
|
1524
|
-
let directoryAccessApprovalRequest;
|
|
1525
|
-
if (!toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
1526
|
-
const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
|
|
1527
|
-
if (getApprovalOverride) {
|
|
1528
|
-
const context = this.buildToolExecutionContext({
|
|
1529
|
-
sessionId,
|
|
1530
|
-
toolCallId,
|
|
1531
|
-
runContext
|
|
1532
|
-
});
|
|
1533
|
-
const approvalRequest = await getApprovalOverride(validatedArgs, context);
|
|
1534
|
-
if (approvalRequest) {
|
|
1535
|
-
if (approvalRequest.type === import_types3.ApprovalType.DIRECTORY_ACCESS) {
|
|
1536
|
-
const metadata = approvalRequest.metadata;
|
|
1537
|
-
if (typeof metadata !== "object" || metadata === null || typeof metadata.path !== "string" || typeof metadata.parentDir !== "string" || typeof metadata.operation !== "string" || typeof metadata.toolName !== "string") {
|
|
1538
|
-
throw import_errors.ToolError.configInvalid(
|
|
1539
|
-
`Tool '${toolName}' returned invalid directory access metadata`
|
|
1540
|
-
);
|
|
1541
|
-
}
|
|
1542
|
-
directoryAccess = metadata;
|
|
1543
|
-
directoryAccessApprovalRequest = approvalRequest;
|
|
1544
|
-
} else {
|
|
1545
|
-
this.logger.debug(
|
|
1546
|
-
`Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
|
|
1547
|
-
);
|
|
1548
|
-
if (sessionId && !approvalRequest.sessionId) {
|
|
1549
|
-
approvalRequest.sessionId = sessionId;
|
|
1550
|
-
}
|
|
1551
|
-
if (runContext?.hostRuntime !== void 0 && approvalRequest.hostRuntime === void 0) {
|
|
1552
|
-
approvalRequest.hostRuntime = runContext.hostRuntime;
|
|
1553
|
-
}
|
|
1554
|
-
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
1555
|
-
if (response.status === import_types3.ApprovalStatus.APPROVED) {
|
|
1556
|
-
const onGranted = this.getToolApprovalOnGrantedFn(toolName);
|
|
1557
|
-
if (onGranted) {
|
|
1558
|
-
await Promise.resolve(
|
|
1559
|
-
onGranted(response, context, approvalRequest)
|
|
1560
|
-
);
|
|
1561
|
-
}
|
|
1562
|
-
this.logger.info(
|
|
1563
|
-
`Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
|
|
1564
|
-
);
|
|
1565
|
-
return {
|
|
1566
|
-
requireApproval: true,
|
|
1567
|
-
approvalStatus: "approved",
|
|
1568
|
-
args: validatedArgs,
|
|
1569
|
-
presentationSnapshot
|
|
1570
|
-
};
|
|
1571
|
-
}
|
|
1572
|
-
this.logger.info(
|
|
1573
|
-
`Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
|
|
1574
|
-
);
|
|
1575
|
-
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
1576
|
-
}
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
|
-
const quickResult = await this.tryQuickApprovalResolution(
|
|
1581
|
-
toolName,
|
|
1582
|
-
validatedArgs,
|
|
1583
|
-
sessionId,
|
|
1584
|
-
directoryAccess
|
|
1585
|
-
);
|
|
1586
|
-
if (quickResult !== null) {
|
|
1587
|
-
return { ...quickResult, args: validatedArgs, presentationSnapshot };
|
|
1588
|
-
}
|
|
1589
|
-
const manualResult = await this.requestManualApproval(
|
|
1590
|
-
toolName,
|
|
1591
|
-
validatedArgs,
|
|
1592
|
-
toolCallId,
|
|
1593
|
-
sessionId,
|
|
1594
|
-
runContext,
|
|
1595
|
-
directoryAccess,
|
|
1596
|
-
directoryAccessApprovalRequest,
|
|
1597
|
-
callDescription,
|
|
1598
|
-
presentationSnapshot
|
|
1599
|
-
);
|
|
1600
|
-
return { ...manualResult, args: validatedArgs, presentationSnapshot };
|
|
1601
|
-
}
|
|
1602
|
-
/**
|
|
1603
|
-
* Try to resolve tool approval quickly based on policies and cached permissions.
|
|
1604
|
-
* Returns null if manual approval is needed.
|
|
1605
|
-
*
|
|
1606
|
-
* Precedence order (highest to lowest):
|
|
1607
|
-
* 1. Directory access requirement (outside-root paths)
|
|
1608
|
-
* 2. Session auto-approve (skill allowed-tools)
|
|
1609
|
-
* 3. Static allow list
|
|
1610
|
-
* 4. Dynamic "remembered" allowed list
|
|
1611
|
-
* 5. Tool approval patterns
|
|
1612
|
-
* 6. Approval mode (auto-approve/auto-deny)
|
|
1613
|
-
*/
|
|
1614
|
-
async tryQuickApprovalResolution(toolName, args, sessionId, directoryAccess) {
|
|
1615
|
-
if (directoryAccess) {
|
|
1616
|
-
if (this.approvalMode === "auto-approve") {
|
|
1617
|
-
await this.approvalManager.addApprovedDirectory(
|
|
1618
|
-
directoryAccess.parentDir,
|
|
1619
|
-
"once",
|
|
1620
|
-
sessionId
|
|
1621
|
-
);
|
|
1622
|
-
return { requireApproval: false };
|
|
1623
|
-
}
|
|
1624
|
-
return null;
|
|
1625
|
-
}
|
|
1626
|
-
if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
|
|
1627
|
-
this.logger.info(
|
|
1628
|
-
`Tool '${toolName}' is in session's auto-approve list \u2013 skipping confirmation (session: ${sessionId})`
|
|
1629
|
-
);
|
|
1630
|
-
return { requireApproval: false };
|
|
1631
|
-
}
|
|
1632
|
-
if (this.isInAlwaysAllowList(toolName)) {
|
|
1633
|
-
this.logger.info(
|
|
1634
|
-
`Tool '${toolName}' is in static allow list \u2013 skipping confirmation (session: ${sessionId ?? "global"})`
|
|
1635
|
-
);
|
|
1636
|
-
return { requireApproval: false };
|
|
1637
|
-
}
|
|
1638
|
-
if (await this.allowedToolsProvider.isToolAllowed(toolName, sessionId)) {
|
|
1639
|
-
this.logger.info(
|
|
1640
|
-
`Tool '${toolName}' already allowed for session '${sessionId ?? "global"}' \u2013 skipping confirmation.`
|
|
1641
|
-
);
|
|
1642
|
-
return { requireApproval: false };
|
|
1643
|
-
}
|
|
1644
|
-
const patternKey = this.getToolPatternKey(toolName, args);
|
|
1645
|
-
if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey, sessionId)) {
|
|
1646
|
-
this.logger.info(
|
|
1647
|
-
`Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
|
|
1648
|
-
);
|
|
1649
|
-
return { requireApproval: false };
|
|
1650
|
-
}
|
|
1651
|
-
if (this.approvalMode === "auto-approve") {
|
|
1652
|
-
this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
|
|
1653
|
-
return { requireApproval: false };
|
|
1654
|
-
}
|
|
1655
|
-
if (this.approvalMode === "auto-deny") {
|
|
1656
|
-
this.logger.debug(`\u{1F6AB} Auto-denying tool execution: ${toolName}`);
|
|
1657
|
-
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
1658
|
-
}
|
|
1659
|
-
return null;
|
|
1660
|
-
}
|
|
1661
|
-
/**
|
|
1662
|
-
* Request manual approval from the user for a tool execution.
|
|
1663
|
-
* Generates preview, sends approval request, and handles the response.
|
|
1664
|
-
*/
|
|
1665
|
-
async requestManualApproval(toolName, args, toolCallId, sessionId, runContext, directoryAccess, directoryAccessApprovalRequest, callDescription, presentationSnapshot) {
|
|
1666
|
-
this.logger.info(
|
|
1667
|
-
`Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1668
|
-
);
|
|
1669
|
-
try {
|
|
1670
|
-
const displayPreview = await this.generateToolPreview(
|
|
1671
|
-
toolName,
|
|
1672
|
-
args,
|
|
1673
|
-
toolCallId,
|
|
1674
|
-
sessionId,
|
|
1675
|
-
runContext
|
|
1676
|
-
);
|
|
1677
|
-
const hostRuntime = runContext?.hostRuntime ?? directoryAccessApprovalRequest?.hostRuntime;
|
|
1678
|
-
const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
|
|
1679
|
-
const response = await this.approvalManager.requestToolApproval({
|
|
1680
|
-
toolName,
|
|
1681
|
-
...presentationSnapshot !== void 0 && { presentationSnapshot },
|
|
1682
|
-
toolCallId,
|
|
1683
|
-
args,
|
|
1684
|
-
...callDescription !== void 0 && { description: callDescription },
|
|
1685
|
-
...sessionId !== void 0 && { sessionId },
|
|
1686
|
-
...hostRuntime !== void 0 && { hostRuntime },
|
|
1687
|
-
...displayPreview !== void 0 && { displayPreview },
|
|
1688
|
-
...directoryAccess !== void 0 && { directoryAccess },
|
|
1689
|
-
...suggestedPatterns !== void 0 && { suggestedPatterns }
|
|
1690
|
-
});
|
|
1691
|
-
if (response.status === import_types3.ApprovalStatus.APPROVED && directoryAccessApprovalRequest !== void 0) {
|
|
1692
|
-
const onGranted = this.getToolApprovalOnGrantedFn(toolName);
|
|
1693
|
-
if (onGranted) {
|
|
1694
|
-
const context = this.buildToolExecutionContext({
|
|
1695
|
-
sessionId,
|
|
1696
|
-
toolCallId,
|
|
1697
|
-
runContext
|
|
1698
|
-
});
|
|
1699
|
-
await Promise.resolve(
|
|
1700
|
-
onGranted(response, context, directoryAccessApprovalRequest)
|
|
1701
|
-
);
|
|
1702
|
-
}
|
|
1703
|
-
}
|
|
1704
|
-
if (response.status === import_types3.ApprovalStatus.APPROVED && response.data) {
|
|
1705
|
-
await this.handleRememberChoice(toolName, response, sessionId);
|
|
1706
|
-
}
|
|
1707
|
-
if (response.status !== import_types3.ApprovalStatus.APPROVED) {
|
|
1708
|
-
this.handleApprovalDenied(toolName, response, sessionId);
|
|
1709
|
-
}
|
|
1710
|
-
this.logger.info(
|
|
1711
|
-
`Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1712
|
-
);
|
|
1713
|
-
return { requireApproval: true, approvalStatus: "approved" };
|
|
1714
|
-
} catch (error) {
|
|
1715
|
-
this.logger.error(
|
|
1716
|
-
`Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
|
|
1717
|
-
);
|
|
1718
|
-
throw error;
|
|
1719
|
-
}
|
|
1720
|
-
}
|
|
1721
|
-
/**
|
|
1722
|
-
* Generate a preview for the tool approval UI if the tool supports it.
|
|
1723
|
-
*/
|
|
1724
|
-
async generateToolPreview(toolName, args, toolCallId, sessionId, runContext) {
|
|
1725
|
-
const previewFn = this.getToolPreviewFn(toolName);
|
|
1726
|
-
if (!previewFn) {
|
|
1727
|
-
return void 0;
|
|
1728
|
-
}
|
|
1729
|
-
try {
|
|
1730
|
-
const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
|
|
1731
|
-
const preview = await previewFn(args, context);
|
|
1732
|
-
this.logger.debug(`Generated preview for ${toolName}`);
|
|
1733
|
-
return preview ?? void 0;
|
|
1734
|
-
} catch (previewError) {
|
|
1735
|
-
if (previewError instanceof import_errors2.DextoRuntimeError && previewError.code === import_error_codes.ToolErrorCode.VALIDATION_FAILED) {
|
|
1736
|
-
this.logger.debug(`Validation failed for ${toolName}: ${previewError.message}`);
|
|
1737
|
-
throw previewError;
|
|
1738
|
-
}
|
|
1739
|
-
this.logger.debug(
|
|
1740
|
-
`Preview generation failed for ${toolName}: ${previewError instanceof Error ? previewError.message : String(previewError)}`
|
|
1741
|
-
);
|
|
1742
|
-
return void 0;
|
|
1743
|
-
}
|
|
1744
|
-
}
|
|
1745
1800
|
/**
|
|
1746
1801
|
* Handle "remember" actions when user approves a tool.
|
|
1747
1802
|
*/
|
|
@@ -1773,12 +1828,12 @@ let _ToolManager = class _ToolManager {
|
|
|
1773
1828
|
handleApprovalDenied(toolName, response, sessionId) {
|
|
1774
1829
|
if (response.status === import_types3.ApprovalStatus.CANCELLED && response.reason === import_types3.DenialReason.TIMEOUT) {
|
|
1775
1830
|
this.logger.info(
|
|
1776
|
-
`Tool
|
|
1831
|
+
`Tool approval timed out for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1777
1832
|
);
|
|
1778
1833
|
throw import_errors.ToolError.executionTimeout(toolName, response.timeoutMs ?? 0, sessionId);
|
|
1779
1834
|
}
|
|
1780
1835
|
this.logger.info(
|
|
1781
|
-
`Tool
|
|
1836
|
+
`Tool approval denied for ${toolName}, sessionId: ${sessionId ?? "global"}, reason: ${response.reason ?? "unknown"}`
|
|
1782
1837
|
);
|
|
1783
1838
|
throw import_errors.ToolError.executionDenied(toolName, sessionId, response.message);
|
|
1784
1839
|
}
|
|
@@ -1791,24 +1846,6 @@ let _ToolManager = class _ToolManager {
|
|
|
1791
1846
|
this.invalidateCache();
|
|
1792
1847
|
this.logger.debug("ToolManager refreshed (including MCP server capabilities)");
|
|
1793
1848
|
}
|
|
1794
|
-
/**
|
|
1795
|
-
* Get list of pending confirmation requests
|
|
1796
|
-
*/
|
|
1797
|
-
getPendingConfirmations() {
|
|
1798
|
-
return this.approvalManager.getPendingApprovals();
|
|
1799
|
-
}
|
|
1800
|
-
/**
|
|
1801
|
-
* Cancel a pending confirmation request
|
|
1802
|
-
*/
|
|
1803
|
-
cancelConfirmation(approvalId) {
|
|
1804
|
-
this.approvalManager.cancelApproval(approvalId);
|
|
1805
|
-
}
|
|
1806
|
-
/**
|
|
1807
|
-
* Cancel all pending confirmation requests
|
|
1808
|
-
*/
|
|
1809
|
-
cancelAllConfirmations() {
|
|
1810
|
-
this.approvalManager.cancelAllApprovals();
|
|
1811
|
-
}
|
|
1812
1849
|
};
|
|
1813
1850
|
_init = __decoratorStart(null);
|
|
1814
1851
|
_ToolManager = __decorateElement(_init, 0, "ToolManager", _ToolManager_decorators, _ToolManager);
|