@dexto/core 1.5.7 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -8
- package/dist/agent/DextoAgent.cjs +383 -153
- package/dist/agent/DextoAgent.d.ts +112 -60
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +380 -150
- package/dist/{context/compaction/provider.cjs → agent/agent-options.cjs} +2 -2
- package/dist/agent/agent-options.d.ts +53 -0
- package/dist/agent/agent-options.d.ts.map +1 -0
- package/dist/agent/agentCard.cjs +1 -1
- package/dist/agent/errors.cjs +2 -2
- package/dist/agent/errors.d.ts.map +1 -1
- package/dist/agent/index.cjs +1 -6
- package/dist/agent/index.d.ts +3 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +1 -7
- package/dist/{storage/blob/provider.cjs → agent/runtime-config.cjs} +2 -2
- package/dist/agent/runtime-config.d.ts +53 -0
- package/dist/agent/runtime-config.d.ts.map +1 -0
- package/dist/agent/schemas.cjs +2 -99
- package/dist/agent/schemas.d.ts +10 -9160
- package/dist/agent/schemas.d.ts.map +1 -1
- package/dist/agent/schemas.js +1 -104
- package/dist/agent/state-manager.d.ts +5 -5
- package/dist/agent/state-manager.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 +1 -1
- package/dist/approval/errors.cjs +5 -5
- package/dist/approval/errors.d.ts +2 -2
- package/dist/approval/errors.d.ts.map +1 -1
- package/dist/approval/errors.js +5 -5
- package/dist/approval/index.cjs +8 -8
- package/dist/approval/index.d.ts +2 -2
- package/dist/approval/index.d.ts.map +1 -1
- package/dist/approval/index.js +8 -8
- package/dist/approval/manager.cjs +77 -57
- package/dist/approval/manager.d.ts +41 -43
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +75 -55
- package/dist/approval/schemas.cjs +26 -25
- package/dist/approval/schemas.d.ts +35 -15
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +22 -21
- package/dist/approval/types.cjs +1 -1
- package/dist/approval/types.d.ts +14 -14
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/approval/types.js +1 -1
- package/dist/context/compaction/index.cjs +2 -23
- package/dist/context/compaction/index.d.ts +1 -7
- package/dist/context/compaction/index.d.ts.map +1 -1
- package/dist/context/compaction/index.js +1 -16
- package/dist/context/compaction/strategies/noop.cjs +19 -1
- package/dist/context/compaction/strategies/noop.d.ts +13 -3
- package/dist/context/compaction/strategies/noop.d.ts.map +1 -1
- package/dist/context/compaction/strategies/noop.js +19 -1
- package/dist/context/compaction/strategies/{reactive-overflow.cjs → reactive-overflow-compaction.cjs} +67 -64
- package/dist/context/compaction/strategies/{reactive-overflow.d.ts → reactive-overflow-compaction.d.ts} +19 -36
- package/dist/context/compaction/strategies/reactive-overflow-compaction.d.ts.map +1 -0
- package/dist/context/compaction/strategies/{reactive-overflow.js → reactive-overflow-compaction.js} +63 -60
- package/dist/context/compaction/types.d.ts +40 -8
- package/dist/context/compaction/types.d.ts.map +1 -1
- package/dist/context/manager.cjs +5 -3
- package/dist/context/manager.d.ts +4 -3
- package/dist/context/manager.d.ts.map +1 -1
- package/dist/context/manager.js +5 -3
- package/dist/context/types.d.ts +2 -0
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/utils.cjs +70 -43
- package/dist/context/utils.d.ts +14 -14
- package/dist/context/utils.d.ts.map +1 -1
- package/dist/context/utils.js +69 -42
- package/dist/errors/result-bridge.d.ts +2 -2
- package/dist/errors/result-bridge.d.ts.map +1 -1
- package/dist/errors/types.cjs +1 -1
- package/dist/errors/types.d.ts +3 -3
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/errors/types.js +1 -1
- package/dist/events/index.cjs +15 -2
- package/dist/events/index.d.ts +78 -7
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +15 -2
- package/dist/{plugins → hooks}/builtins/content-policy.cjs +7 -6
- package/dist/hooks/builtins/content-policy.d.ts +24 -0
- package/dist/hooks/builtins/content-policy.d.ts.map +1 -0
- package/dist/{plugins → hooks}/builtins/content-policy.js +6 -5
- package/dist/{plugins → hooks}/builtins/response-sanitizer.cjs +3 -3
- package/dist/hooks/builtins/response-sanitizer.d.ts +22 -0
- package/dist/hooks/builtins/response-sanitizer.d.ts.map +1 -0
- package/dist/{plugins → hooks}/builtins/response-sanitizer.js +2 -2
- package/dist/hooks/error-codes.cjs +43 -0
- package/dist/hooks/error-codes.d.ts +34 -0
- package/dist/hooks/error-codes.d.ts.map +1 -0
- package/dist/hooks/error-codes.js +20 -0
- package/dist/{storage/cache/providers/memory.cjs → hooks/index.cjs} +15 -18
- package/dist/hooks/index.d.ts +14 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +11 -0
- package/dist/hooks/manager.cjs +354 -0
- package/dist/hooks/manager.d.ts +103 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +331 -0
- package/dist/{plugins → hooks}/types.d.ts +36 -34
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/index.browser.cjs +13 -12
- package/dist/index.browser.d.ts +6 -6
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +8 -7
- package/dist/index.cjs +5 -7
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/llm/curation-config.cjs +82 -0
- package/dist/llm/curation-config.d.ts +13 -0
- package/dist/llm/curation-config.d.ts.map +1 -0
- package/dist/llm/curation-config.js +59 -0
- package/dist/llm/curation.cjs +57 -0
- package/dist/llm/curation.d.ts +16 -0
- package/dist/llm/curation.d.ts.map +1 -0
- package/dist/llm/curation.js +34 -0
- package/dist/llm/errors.cjs +2 -2
- package/dist/llm/errors.d.ts +8 -8
- package/dist/llm/errors.js +1 -1
- package/dist/llm/executor/provider-options.cjs +1 -1
- package/dist/llm/executor/provider-options.js +1 -1
- package/dist/llm/executor/stream-processor.cjs +131 -11
- package/dist/llm/executor/stream-processor.d.ts +7 -5
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +131 -11
- package/dist/llm/executor/turn-executor.cjs +57 -56
- package/dist/llm/executor/turn-executor.d.ts +7 -8
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +57 -56
- package/dist/llm/formatters/vercel.cjs +2 -2
- package/dist/llm/formatters/vercel.d.ts +2 -2
- package/dist/llm/formatters/vercel.d.ts.map +1 -1
- package/dist/llm/index.cjs +14 -3
- package/dist/llm/index.d.ts +3 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +13 -2
- package/dist/llm/providers/local/schemas.d.ts +10 -10
- package/dist/llm/registry/auto-update.cjs +263 -0
- package/dist/llm/registry/auto-update.d.ts +27 -0
- package/dist/llm/registry/auto-update.d.ts.map +1 -0
- package/dist/llm/registry/auto-update.js +227 -0
- package/dist/llm/registry/index.cjs +806 -0
- package/dist/llm/{registry.d.ts → registry/index.d.ts} +21 -43
- package/dist/llm/registry/index.d.ts.map +1 -0
- package/dist/llm/registry/index.js +756 -0
- package/dist/llm/registry/models.generated.cjs +4861 -0
- package/dist/llm/registry/models.generated.d.ts +431 -0
- package/dist/llm/registry/models.generated.d.ts.map +1 -0
- package/dist/llm/registry/models.generated.js +4838 -0
- package/dist/{storage/database/providers/index.cjs → llm/registry/models.manual.cjs} +22 -12
- package/dist/llm/registry/models.manual.d.ts +22 -0
- package/dist/llm/registry/models.manual.d.ts.map +1 -0
- package/dist/llm/registry/models.manual.js +21 -0
- package/dist/llm/registry/sync.cjs +354 -0
- package/dist/llm/registry/sync.d.ts +41 -0
- package/dist/llm/registry/sync.d.ts.map +1 -0
- package/dist/llm/registry/sync.js +328 -0
- package/dist/llm/resolver.cjs +29 -20
- package/dist/llm/resolver.d.ts +4 -4
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/resolver.js +28 -20
- package/dist/llm/schemas.cjs +69 -94
- package/dist/llm/schemas.d.ts +19 -158
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +67 -91
- package/dist/llm/services/factory.cjs +6 -7
- package/dist/llm/services/factory.d.ts +3 -4
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +6 -7
- package/dist/llm/services/vercel.cjs +11 -15
- package/dist/llm/services/vercel.d.ts +7 -7
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +11 -15
- package/dist/llm/types.cjs +1 -1
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +1 -1
- package/dist/llm/validation.cjs +2 -2
- package/dist/llm/validation.d.ts +2 -2
- package/dist/llm/validation.d.ts.map +1 -1
- package/dist/llm/validation.js +1 -1
- package/dist/logger/browser.cjs +4 -4
- package/dist/logger/browser.d.ts +4 -4
- package/dist/logger/browser.d.ts.map +1 -1
- package/dist/logger/browser.js +3 -3
- package/dist/{context/compaction/providers/noop-provider.cjs → logger/default-logger-factory.cjs} +16 -22
- package/dist/logger/default-logger-factory.d.ts +301 -0
- package/dist/logger/default-logger-factory.d.ts.map +1 -0
- package/dist/logger/default-logger-factory.js +18 -0
- package/dist/logger/factory.d.ts +2 -2
- package/dist/logger/factory.d.ts.map +1 -1
- package/dist/logger/index.cjs +7 -2
- package/dist/logger/index.d.ts +5 -3
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +8 -2
- package/dist/logger/logger.cjs +4 -4
- package/dist/logger/logger.d.ts +4 -4
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +3 -3
- package/dist/logger/v2/dexto-logger.d.ts +3 -3
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/schemas.d.ts +12 -12
- package/dist/logger/v2/test-utils.d.ts +5 -5
- package/dist/logger/v2/test-utils.d.ts.map +1 -1
- package/dist/logger/v2/transport-factory.d.ts +3 -3
- package/dist/logger/v2/transport-factory.d.ts.map +1 -1
- package/dist/logger/v2/transports/console-transport.d.ts +2 -2
- package/dist/logger/v2/transports/console-transport.d.ts.map +1 -1
- package/dist/logger/v2/transports/file-transport.d.ts +2 -2
- package/dist/logger/v2/transports/file-transport.d.ts.map +1 -1
- package/dist/logger/v2/transports/silent-transport.d.ts +2 -2
- package/dist/logger/v2/transports/silent-transport.d.ts.map +1 -1
- package/dist/logger/v2/types.cjs +1 -1
- package/dist/logger/v2/types.d.ts +8 -8
- package/dist/logger/v2/types.d.ts.map +1 -1
- package/dist/logger/v2/types.js +1 -1
- package/dist/mcp/errors.cjs +2 -2
- package/dist/mcp/errors.d.ts.map +1 -1
- package/dist/mcp/manager.cjs +16 -11
- package/dist/mcp/manager.d.ts +16 -13
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +17 -12
- package/dist/mcp/mcp-client.cjs +25 -20
- package/dist/mcp/mcp-client.d.ts +5 -5
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +20 -15
- package/dist/mcp/resolver.cjs +1 -1
- package/dist/mcp/schemas.cjs +5 -5
- package/dist/mcp/schemas.d.ts +4 -4
- package/dist/mcp/schemas.js +2 -2
- package/dist/mcp/types.d.ts +7 -7
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/memory/manager.d.ts +2 -2
- package/dist/memory/manager.d.ts.map +1 -1
- package/dist/memory/schemas.d.ts +2 -2
- package/dist/prompts/errors.cjs +3 -3
- package/dist/prompts/errors.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.d.ts +3 -3
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.cjs +15 -29
- package/dist/prompts/providers/config-prompt-provider.d.ts +3 -3
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +15 -29
- package/dist/prompts/providers/custom-prompt-provider.d.ts +2 -2
- package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/mcp-prompt-provider.d.ts +2 -2
- package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/schemas.d.ts +4 -4
- package/dist/resources/{internal-provider.cjs → agent-resources-provider.cjs} +16 -16
- package/dist/resources/{internal-provider.d.ts → agent-resources-provider.d.ts} +6 -6
- package/dist/resources/agent-resources-provider.d.ts.map +1 -0
- package/dist/resources/{internal-provider.js → agent-resources-provider.js} +13 -13
- package/dist/resources/errors.cjs +2 -2
- package/dist/resources/errors.d.ts.map +1 -1
- package/dist/resources/handlers/blob-handler.d.ts +2 -2
- package/dist/resources/handlers/blob-handler.d.ts.map +1 -1
- package/dist/resources/handlers/factory.d.ts +3 -3
- package/dist/resources/handlers/factory.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.cjs +25 -0
- package/dist/resources/handlers/filesystem-handler.d.ts +3 -2
- package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.js +25 -0
- package/dist/resources/index.cjs +7 -9
- package/dist/resources/index.d.ts +3 -3
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +5 -10
- package/dist/resources/manager.cjs +77 -74
- package/dist/resources/manager.d.ts +16 -7
- package/dist/resources/manager.d.ts.map +1 -1
- package/dist/resources/manager.js +77 -74
- package/dist/resources/schemas.cjs +6 -26
- package/dist/resources/schemas.d.ts +8 -100
- package/dist/resources/schemas.d.ts.map +1 -1
- package/dist/resources/schemas.js +4 -23
- package/dist/search/search-service.d.ts +2 -2
- package/dist/search/search-service.d.ts.map +1 -1
- package/dist/session/chat-session.cjs +16 -26
- package/dist/session/chat-session.d.ts +7 -5
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +17 -27
- package/dist/session/errors.cjs +2 -2
- package/dist/session/errors.d.ts.map +1 -1
- package/dist/session/history/database.cjs +1 -1
- package/dist/session/history/database.d.ts +4 -4
- package/dist/session/history/database.d.ts.map +1 -1
- package/dist/session/history/factory.d.ts +3 -3
- package/dist/session/history/factory.d.ts.map +1 -1
- package/dist/session/history/memory.d.ts +4 -4
- package/dist/session/history/memory.d.ts.map +1 -1
- package/dist/session/history/types.d.ts +2 -2
- package/dist/session/history/types.d.ts.map +1 -1
- package/dist/session/index.cjs +3 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +2 -0
- package/dist/session/message-queue.cjs +29 -5
- package/dist/session/message-queue.d.ts +5 -3
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +29 -5
- package/dist/session/session-manager.cjs +107 -12
- package/dist/session/session-manager.d.ts +49 -8
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +97 -12
- package/dist/session/title-generator.cjs +2 -2
- package/dist/session/title-generator.d.ts +2 -2
- package/dist/session/title-generator.d.ts.map +1 -1
- package/dist/session/types.d.ts +1 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/storage/blob/index.cjs +0 -40
- package/dist/storage/blob/index.d.ts +2 -44
- package/dist/storage/blob/index.d.ts.map +1 -1
- package/dist/storage/blob/index.js +0 -30
- package/dist/storage/cache/index.cjs +0 -37
- package/dist/storage/cache/index.d.ts +0 -42
- package/dist/storage/cache/index.d.ts.map +1 -1
- package/dist/storage/cache/index.js +0 -28
- package/dist/storage/database/index.cjs +0 -42
- package/dist/storage/database/index.d.ts +0 -43
- package/dist/storage/database/index.d.ts.map +1 -1
- package/dist/storage/database/index.js +0 -37
- package/dist/storage/error-codes.cjs +1 -6
- package/dist/storage/error-codes.d.ts +2 -7
- package/dist/storage/error-codes.d.ts.map +1 -1
- package/dist/storage/error-codes.js +1 -6
- package/dist/storage/errors.cjs +18 -82
- package/dist/storage/errors.d.ts +4 -24
- package/dist/storage/errors.d.ts.map +1 -1
- package/dist/storage/errors.js +16 -80
- package/dist/storage/index.cjs +8 -69
- package/dist/storage/index.d.ts +11 -66
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +6 -50
- package/dist/storage/storage-manager.cjs +9 -25
- package/dist/storage/storage-manager.d.ts +11 -15
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +8 -23
- package/dist/storage/types.d.ts +0 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.d.ts +4 -4
- package/dist/systemPrompt/contributors.d.ts.map +1 -1
- package/dist/systemPrompt/errors.cjs +2 -2
- package/dist/systemPrompt/errors.d.ts.map +1 -1
- package/dist/systemPrompt/manager.cjs +1 -5
- package/dist/systemPrompt/manager.d.ts +2 -3
- package/dist/systemPrompt/manager.d.ts.map +1 -1
- package/dist/systemPrompt/manager.js +1 -5
- package/dist/telemetry/index.cjs +3 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -0
- package/dist/telemetry/utils.d.ts +4 -4
- package/dist/telemetry/utils.d.ts.map +1 -1
- package/dist/test-utils/in-memory-storage.cjs +288 -0
- package/dist/test-utils/in-memory-storage.js +252 -0
- package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts +3 -3
- package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts.map +1 -1
- package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts +2 -2
- package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts.map +1 -1
- package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts +4 -4
- package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts.map +1 -1
- package/dist/tools/confirmation/allowed-tools-provider/types.d.ts +2 -2
- package/dist/tools/confirmation/allowed-tools-provider/types.d.ts.map +1 -1
- package/dist/tools/{internal-tools/constants.cjs → define-tool.cjs} +8 -13
- package/dist/tools/define-tool.d.ts +11 -0
- package/dist/tools/define-tool.d.ts.map +1 -0
- package/dist/tools/define-tool.js +7 -0
- package/dist/tools/error-codes.cjs +2 -2
- package/dist/tools/error-codes.d.ts +2 -2
- package/dist/tools/error-codes.d.ts.map +1 -1
- package/dist/tools/error-codes.js +2 -2
- package/dist/tools/errors.cjs +11 -23
- package/dist/tools/errors.d.ts +4 -10
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +9 -21
- package/dist/tools/index.cjs +3 -8
- package/dist/tools/index.d.ts +2 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -7
- package/dist/{storage/blob/providers/index.cjs → tools/pattern-utils.cjs} +11 -9
- package/dist/tools/pattern-utils.d.ts +20 -0
- package/dist/tools/pattern-utils.d.ts.map +1 -0
- package/dist/tools/pattern-utils.js +10 -0
- package/dist/tools/schemas.cjs +14 -40
- package/dist/tools/schemas.d.ts +6 -50
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +11 -32
- package/dist/tools/tool-call-metadata.cjs +75 -0
- package/dist/tools/tool-call-metadata.d.ts +16 -0
- package/dist/tools/tool-call-metadata.d.ts.map +1 -0
- package/dist/tools/tool-call-metadata.js +51 -0
- package/dist/tools/tool-manager.cjs +578 -302
- package/dist/tools/tool-manager.d.ts +105 -81
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +578 -306
- package/dist/tools/types.d.ts +112 -13
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.cjs +1 -1
- package/dist/utils/api-key-resolver.js +1 -1
- package/dist/utils/env.cjs +49 -0
- package/dist/utils/env.d.ts +4 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +24 -0
- package/dist/utils/error-conversion.d.ts +2 -2
- package/dist/utils/error-conversion.d.ts.map +1 -1
- package/dist/utils/index.cjs +3 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/path.d.ts +2 -2
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/result.cjs +1 -1
- package/dist/utils/result.d.ts.map +1 -1
- package/dist/utils/schema.cjs +9 -5
- package/dist/utils/schema.d.ts +4 -2
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +9 -5
- package/dist/utils/service-initializer.cjs +58 -51
- package/dist/utils/service-initializer.d.ts +31 -9
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +58 -51
- package/dist/{storage/cache/providers/index.cjs → workspace/error-codes.cjs} +8 -9
- package/dist/workspace/error-codes.d.ts +5 -0
- package/dist/workspace/error-codes.d.ts.map +1 -0
- package/dist/workspace/error-codes.js +7 -0
- package/dist/{storage/blob/factory.cjs → workspace/errors.cjs} +20 -14
- package/dist/workspace/errors.d.ts +5 -0
- package/dist/workspace/errors.d.ts.map +1 -0
- package/dist/workspace/errors.js +21 -0
- package/dist/{image → workspace}/index.cjs +12 -10
- package/dist/workspace/index.d.ts +5 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +9 -0
- package/dist/workspace/manager.cjs +113 -0
- package/dist/workspace/manager.d.ts +18 -0
- package/dist/workspace/manager.d.ts.map +1 -0
- package/dist/workspace/manager.js +90 -0
- package/dist/workspace/types.d.ts +14 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/package.json +7 -3
- package/dist/context/compaction/factory.cjs +0 -57
- package/dist/context/compaction/factory.d.ts +0 -17
- package/dist/context/compaction/factory.d.ts.map +0 -1
- package/dist/context/compaction/factory.js +0 -34
- package/dist/context/compaction/provider.d.ts +0 -48
- package/dist/context/compaction/provider.d.ts.map +0 -1
- package/dist/context/compaction/providers/noop-provider.d.ts +0 -24
- package/dist/context/compaction/providers/noop-provider.d.ts.map +0 -1
- package/dist/context/compaction/providers/noop-provider.js +0 -24
- package/dist/context/compaction/providers/reactive-overflow-provider.cjs +0 -76
- package/dist/context/compaction/providers/reactive-overflow-provider.d.ts +0 -51
- package/dist/context/compaction/providers/reactive-overflow-provider.d.ts.map +0 -1
- package/dist/context/compaction/providers/reactive-overflow-provider.js +0 -52
- package/dist/context/compaction/registry.cjs +0 -39
- package/dist/context/compaction/registry.d.ts +0 -19
- package/dist/context/compaction/registry.d.ts.map +0 -1
- package/dist/context/compaction/registry.js +0 -16
- package/dist/context/compaction/schemas.cjs +0 -58
- package/dist/context/compaction/schemas.d.ts +0 -69
- package/dist/context/compaction/schemas.d.ts.map +0 -1
- package/dist/context/compaction/schemas.js +0 -34
- package/dist/context/compaction/strategies/reactive-overflow.d.ts.map +0 -1
- package/dist/image/define-image.cjs +0 -146
- package/dist/image/define-image.d.ts +0 -71
- package/dist/image/define-image.d.ts.map +0 -1
- package/dist/image/define-image.js +0 -121
- package/dist/image/index.d.ts +0 -53
- package/dist/image/index.d.ts.map +0 -1
- package/dist/image/index.js +0 -7
- package/dist/image/types.d.ts +0 -246
- package/dist/image/types.d.ts.map +0 -1
- package/dist/llm/registry.cjs +0 -2075
- package/dist/llm/registry.d.ts.map +0 -1
- package/dist/llm/registry.js +0 -2025
- package/dist/llm/services/test-utils.integration.cjs +0 -237
- package/dist/llm/services/test-utils.integration.d.ts +0 -48
- package/dist/llm/services/test-utils.integration.d.ts.map +0 -1
- package/dist/llm/services/test-utils.integration.js +0 -214
- package/dist/plugins/builtins/content-policy.d.ts +0 -26
- package/dist/plugins/builtins/content-policy.d.ts.map +0 -1
- package/dist/plugins/builtins/response-sanitizer.d.ts +0 -25
- package/dist/plugins/builtins/response-sanitizer.d.ts.map +0 -1
- package/dist/plugins/error-codes.cjs +0 -43
- package/dist/plugins/error-codes.d.ts +0 -34
- package/dist/plugins/error-codes.d.ts.map +0 -1
- package/dist/plugins/error-codes.js +0 -20
- package/dist/plugins/index.cjs +0 -61
- package/dist/plugins/index.d.ts +0 -21
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -30
- package/dist/plugins/loader.cjs +0 -171
- package/dist/plugins/loader.d.ts +0 -30
- package/dist/plugins/loader.d.ts.map +0 -1
- package/dist/plugins/loader.js +0 -145
- package/dist/plugins/manager.cjs +0 -473
- package/dist/plugins/manager.d.ts +0 -106
- package/dist/plugins/manager.d.ts.map +0 -1
- package/dist/plugins/manager.js +0 -450
- package/dist/plugins/registrations/builtins.cjs +0 -51
- package/dist/plugins/registrations/builtins.d.ts +0 -17
- package/dist/plugins/registrations/builtins.d.ts.map +0 -1
- package/dist/plugins/registrations/builtins.js +0 -28
- package/dist/plugins/registry.cjs +0 -63
- package/dist/plugins/registry.d.ts +0 -101
- package/dist/plugins/registry.d.ts.map +0 -1
- package/dist/plugins/registry.js +0 -39
- package/dist/plugins/schemas.cjs +0 -73
- package/dist/plugins/schemas.d.ts +0 -195
- package/dist/plugins/schemas.d.ts.map +0 -1
- package/dist/plugins/schemas.js +0 -47
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/providers/base-registry.cjs +0 -147
- package/dist/providers/base-registry.d.ts +0 -147
- package/dist/providers/base-registry.d.ts.map +0 -1
- package/dist/providers/base-registry.js +0 -123
- package/dist/providers/discovery.cjs +0 -109
- package/dist/providers/discovery.d.ts +0 -96
- package/dist/providers/discovery.d.ts.map +0 -1
- package/dist/providers/discovery.js +0 -84
- package/dist/providers/index.cjs +0 -24
- package/dist/providers/index.d.ts +0 -32
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -2
- package/dist/resources/internal-provider.d.ts.map +0 -1
- package/dist/storage/blob/factory.d.ts +0 -37
- package/dist/storage/blob/factory.d.ts.map +0 -1
- package/dist/storage/blob/factory.js +0 -15
- package/dist/storage/blob/local-blob-store.cjs +0 -496
- package/dist/storage/blob/local-blob-store.d.ts +0 -58
- package/dist/storage/blob/local-blob-store.d.ts.map +0 -1
- package/dist/storage/blob/local-blob-store.js +0 -463
- package/dist/storage/blob/memory-blob-store.cjs +0 -326
- package/dist/storage/blob/memory-blob-store.d.ts +0 -66
- package/dist/storage/blob/memory-blob-store.d.ts.map +0 -1
- package/dist/storage/blob/memory-blob-store.js +0 -303
- package/dist/storage/blob/provider.d.ts +0 -50
- package/dist/storage/blob/provider.d.ts.map +0 -1
- package/dist/storage/blob/providers/index.d.ts +0 -8
- package/dist/storage/blob/providers/index.d.ts.map +0 -1
- package/dist/storage/blob/providers/index.js +0 -7
- package/dist/storage/blob/providers/local.cjs +0 -39
- package/dist/storage/blob/providers/local.d.ts +0 -17
- package/dist/storage/blob/providers/local.d.ts.map +0 -1
- package/dist/storage/blob/providers/local.js +0 -16
- package/dist/storage/blob/providers/memory.cjs +0 -39
- package/dist/storage/blob/providers/memory.d.ts +0 -17
- package/dist/storage/blob/providers/memory.d.ts.map +0 -1
- package/dist/storage/blob/providers/memory.js +0 -16
- package/dist/storage/blob/registry.cjs +0 -50
- package/dist/storage/blob/registry.d.ts +0 -42
- package/dist/storage/blob/registry.d.ts.map +0 -1
- package/dist/storage/blob/registry.js +0 -26
- package/dist/storage/blob/schemas.cjs +0 -52
- package/dist/storage/blob/schemas.d.ts +0 -85
- package/dist/storage/blob/schemas.d.ts.map +0 -1
- package/dist/storage/blob/schemas.js +0 -26
- package/dist/storage/cache/factory.cjs +0 -38
- package/dist/storage/cache/factory.d.ts +0 -37
- package/dist/storage/cache/factory.d.ts.map +0 -1
- package/dist/storage/cache/factory.js +0 -15
- package/dist/storage/cache/memory-cache-store.cjs +0 -107
- package/dist/storage/cache/memory-cache-store.d.ts +0 -26
- package/dist/storage/cache/memory-cache-store.d.ts.map +0 -1
- package/dist/storage/cache/memory-cache-store.js +0 -84
- package/dist/storage/cache/provider.cjs +0 -16
- package/dist/storage/cache/provider.d.ts +0 -56
- package/dist/storage/cache/provider.d.ts.map +0 -1
- package/dist/storage/cache/provider.js +0 -0
- package/dist/storage/cache/providers/index.d.ts +0 -8
- package/dist/storage/cache/providers/index.d.ts.map +0 -1
- package/dist/storage/cache/providers/index.js +0 -7
- package/dist/storage/cache/providers/memory.d.ts +0 -17
- package/dist/storage/cache/providers/memory.d.ts.map +0 -1
- package/dist/storage/cache/providers/memory.js +0 -17
- package/dist/storage/cache/providers/redis.cjs +0 -66
- package/dist/storage/cache/providers/redis.d.ts +0 -20
- package/dist/storage/cache/providers/redis.d.ts.map +0 -1
- package/dist/storage/cache/providers/redis.js +0 -33
- package/dist/storage/cache/redis-store.cjs +0 -173
- package/dist/storage/cache/redis-store.d.ts +0 -32
- package/dist/storage/cache/redis-store.d.ts.map +0 -1
- package/dist/storage/cache/redis-store.js +0 -150
- package/dist/storage/cache/registry.cjs +0 -50
- package/dist/storage/cache/registry.d.ts +0 -42
- package/dist/storage/cache/registry.d.ts.map +0 -1
- package/dist/storage/cache/registry.js +0 -26
- package/dist/storage/cache/schemas.cjs +0 -81
- package/dist/storage/cache/schemas.d.ts +0 -150
- package/dist/storage/cache/schemas.d.ts.map +0 -1
- package/dist/storage/cache/schemas.js +0 -55
- package/dist/storage/database/factory.cjs +0 -38
- package/dist/storage/database/factory.d.ts +0 -39
- package/dist/storage/database/factory.d.ts.map +0 -1
- package/dist/storage/database/factory.js +0 -15
- package/dist/storage/database/memory-database-store.cjs +0 -122
- package/dist/storage/database/memory-database-store.d.ts +0 -29
- package/dist/storage/database/memory-database-store.d.ts.map +0 -1
- package/dist/storage/database/memory-database-store.js +0 -99
- package/dist/storage/database/postgres-store.cjs +0 -342
- package/dist/storage/database/postgres-store.d.ts +0 -55
- package/dist/storage/database/postgres-store.d.ts.map +0 -1
- package/dist/storage/database/postgres-store.js +0 -319
- package/dist/storage/database/provider.cjs +0 -16
- package/dist/storage/database/provider.d.ts +0 -56
- package/dist/storage/database/provider.d.ts.map +0 -1
- package/dist/storage/database/provider.js +0 -0
- package/dist/storage/database/providers/index.d.ts +0 -9
- package/dist/storage/database/providers/index.d.ts.map +0 -1
- package/dist/storage/database/providers/index.js +0 -9
- package/dist/storage/database/providers/memory.cjs +0 -40
- package/dist/storage/database/providers/memory.d.ts +0 -16
- package/dist/storage/database/providers/memory.d.ts.map +0 -1
- package/dist/storage/database/providers/memory.js +0 -17
- package/dist/storage/database/providers/postgres.cjs +0 -62
- package/dist/storage/database/providers/postgres.d.ts +0 -19
- package/dist/storage/database/providers/postgres.d.ts.map +0 -1
- package/dist/storage/database/providers/postgres.js +0 -29
- package/dist/storage/database/providers/sqlite.cjs +0 -66
- package/dist/storage/database/providers/sqlite.d.ts +0 -20
- package/dist/storage/database/providers/sqlite.d.ts.map +0 -1
- package/dist/storage/database/providers/sqlite.js +0 -33
- package/dist/storage/database/registry.cjs +0 -50
- package/dist/storage/database/registry.d.ts +0 -42
- package/dist/storage/database/registry.d.ts.map +0 -1
- package/dist/storage/database/registry.js +0 -26
- package/dist/storage/database/schemas.cjs +0 -97
- package/dist/storage/database/schemas.d.ts +0 -226
- package/dist/storage/database/schemas.d.ts.map +0 -1
- package/dist/storage/database/schemas.js +0 -70
- package/dist/storage/database/sqlite-store.cjs +0 -270
- package/dist/storage/database/sqlite-store.d.ts +0 -33
- package/dist/storage/database/sqlite-store.d.ts.map +0 -1
- package/dist/storage/database/sqlite-store.js +0 -237
- package/dist/storage/schemas.cjs +0 -57
- package/dist/storage/schemas.d.ts +0 -347
- package/dist/storage/schemas.d.ts.map +0 -1
- package/dist/storage/schemas.js +0 -37
- package/dist/tools/bash-pattern-utils.cjs +0 -91
- package/dist/tools/bash-pattern-utils.d.ts +0 -58
- package/dist/tools/bash-pattern-utils.d.ts.map +0 -1
- package/dist/tools/bash-pattern-utils.js +0 -64
- package/dist/tools/custom-tool-registry.cjs +0 -64
- package/dist/tools/custom-tool-registry.d.ts +0 -126
- package/dist/tools/custom-tool-registry.d.ts.map +0 -1
- package/dist/tools/custom-tool-registry.js +0 -40
- package/dist/tools/custom-tool-schema-registry.cjs +0 -164
- package/dist/tools/custom-tool-schema-registry.d.ts +0 -86
- package/dist/tools/custom-tool-schema-registry.d.ts.map +0 -1
- package/dist/tools/custom-tool-schema-registry.js +0 -140
- package/dist/tools/internal-tools/constants.d.ts +0 -12
- package/dist/tools/internal-tools/constants.d.ts.map +0 -1
- package/dist/tools/internal-tools/constants.js +0 -12
- package/dist/tools/internal-tools/implementations/ask-user-tool.cjs +0 -57
- package/dist/tools/internal-tools/implementations/ask-user-tool.d.ts +0 -18
- package/dist/tools/internal-tools/implementations/ask-user-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/ask-user-tool.js +0 -34
- package/dist/tools/internal-tools/implementations/delegate-to-url-tool.cjs +0 -192
- package/dist/tools/internal-tools/implementations/delegate-to-url-tool.d.ts +0 -33
- package/dist/tools/internal-tools/implementations/delegate-to-url-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/delegate-to-url-tool.js +0 -169
- package/dist/tools/internal-tools/implementations/get-resource-tool.cjs +0 -113
- package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts +0 -30
- package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/get-resource-tool.js +0 -90
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +0 -140
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +0 -24
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +0 -117
- package/dist/tools/internal-tools/implementations/list-resources-tool.cjs +0 -91
- package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts +0 -24
- package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/list-resources-tool.js +0 -68
- package/dist/tools/internal-tools/implementations/search-history-tool.cjs +0 -61
- package/dist/tools/internal-tools/implementations/search-history-tool.d.ts +0 -7
- package/dist/tools/internal-tools/implementations/search-history-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/search-history-tool.js +0 -38
- package/dist/tools/internal-tools/index.cjs +0 -26
- package/dist/tools/internal-tools/index.d.ts +0 -4
- package/dist/tools/internal-tools/index.d.ts.map +0 -1
- package/dist/tools/internal-tools/index.js +0 -3
- package/dist/tools/internal-tools/provider.cjs +0 -324
- package/dist/tools/internal-tools/provider.d.ts +0 -114
- package/dist/tools/internal-tools/provider.d.ts.map +0 -1
- package/dist/tools/internal-tools/provider.js +0 -301
- package/dist/tools/internal-tools/registry.cjs +0 -71
- package/dist/tools/internal-tools/registry.d.ts +0 -91
- package/dist/tools/internal-tools/registry.d.ts.map +0 -1
- package/dist/tools/internal-tools/registry.js +0 -47
- /package/dist/{context/compaction/provider.js → agent/agent-options.js} +0 -0
- /package/dist/{image/types.js → agent/runtime-config.js} +0 -0
- /package/dist/{image → hooks}/types.cjs +0 -0
- /package/dist/{plugins → hooks}/types.js +0 -0
- /package/dist/{plugins → workspace}/types.cjs +0 -0
- /package/dist/{storage/blob/provider.js → workspace/types.js} +0 -0
|
@@ -66,40 +66,41 @@ __export(tool_manager_exports, {
|
|
|
66
66
|
ToolManager: () => ToolManager
|
|
67
67
|
});
|
|
68
68
|
module.exports = __toCommonJS(tool_manager_exports);
|
|
69
|
-
var import_provider = require("./internal-tools/provider.js");
|
|
70
69
|
var import_errors = require("./errors.js");
|
|
71
70
|
var import_error_codes = require("./error-codes.js");
|
|
72
71
|
var import_errors2 = require("../errors/index.js");
|
|
73
72
|
var import_types2 = require("../logger/v2/types.js");
|
|
73
|
+
var import_schema = require("../utils/schema.js");
|
|
74
74
|
var import_types3 = require("../approval/types.js");
|
|
75
75
|
var import_decorators = require("../telemetry/decorators.js");
|
|
76
|
-
var
|
|
76
|
+
var import_tool_call_metadata = require("./tool-call-metadata.js");
|
|
77
|
+
var import_env = require("../utils/env.js");
|
|
77
78
|
var _ToolManager_decorators, _init;
|
|
78
79
|
_ToolManager_decorators = [(0, import_decorators.InstrumentClass)({
|
|
79
80
|
prefix: "tool",
|
|
80
|
-
excludeMethods: [
|
|
81
|
-
"setPluginManager",
|
|
82
|
-
"setStateManager",
|
|
83
|
-
"getApprovalManager",
|
|
84
|
-
"getAllowedToolsProvider"
|
|
85
|
-
]
|
|
81
|
+
excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
|
|
86
82
|
})];
|
|
87
83
|
let _ToolManager = class _ToolManager {
|
|
88
84
|
mcpManager;
|
|
89
|
-
|
|
85
|
+
agentTools = /* @__PURE__ */ new Map();
|
|
90
86
|
approvalManager;
|
|
91
87
|
allowedToolsProvider;
|
|
92
88
|
approvalMode;
|
|
93
89
|
agentEventBus;
|
|
94
90
|
toolPolicies;
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
toolExecutionContextFactory;
|
|
92
|
+
// Hook support - set after construction to avoid circular dependencies
|
|
93
|
+
hookManager;
|
|
97
94
|
sessionManager;
|
|
98
95
|
stateManager;
|
|
99
|
-
|
|
96
|
+
workspaceManager;
|
|
97
|
+
currentWorkspace;
|
|
98
|
+
workspaceListenerAttached = false;
|
|
99
|
+
workspaceListenerAbort = new AbortController();
|
|
100
|
+
// Tool naming:
|
|
101
|
+
// - MCP tools are prefixed with `mcp--` for disambiguation.
|
|
102
|
+
// - Local tools use their `Tool.id` as-is (no internal/custom prefixing).
|
|
100
103
|
static MCP_TOOL_PREFIX = "mcp--";
|
|
101
|
-
static INTERNAL_TOOL_PREFIX = "internal--";
|
|
102
|
-
static CUSTOM_TOOL_PREFIX = "custom--";
|
|
103
104
|
// Tool caching for performance
|
|
104
105
|
toolsCache = {};
|
|
105
106
|
cacheValid = false;
|
|
@@ -108,7 +109,33 @@ let _ToolManager = class _ToolManager {
|
|
|
108
109
|
// When a skill with allowedTools is invoked, those tools are auto-approved (skip confirmation)
|
|
109
110
|
// This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow
|
|
110
111
|
sessionAutoApproveTools = /* @__PURE__ */ new Map();
|
|
111
|
-
|
|
112
|
+
// Session-level auto-approve tools set by users (UI)
|
|
113
|
+
sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
|
|
114
|
+
sessionDisabledTools = /* @__PURE__ */ new Map();
|
|
115
|
+
globalDisabledTools = [];
|
|
116
|
+
cleanupHandlers = /* @__PURE__ */ new Set();
|
|
117
|
+
cleanupStarted = false;
|
|
118
|
+
resolveLocalToolIdOrAlias(name) {
|
|
119
|
+
const direct = this.agentTools.get(name);
|
|
120
|
+
if (direct) return direct.id;
|
|
121
|
+
const lower = name.toLowerCase();
|
|
122
|
+
for (const tool of this.agentTools.values()) {
|
|
123
|
+
if (tool.id.toLowerCase() === lower) {
|
|
124
|
+
return tool.id;
|
|
125
|
+
}
|
|
126
|
+
if (tool.aliases?.some((alias) => alias.toLowerCase() === lower)) {
|
|
127
|
+
return tool.id;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
normalizeToolPolicyPattern(pattern) {
|
|
133
|
+
if (pattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
134
|
+
return pattern;
|
|
135
|
+
}
|
|
136
|
+
return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
|
|
137
|
+
}
|
|
138
|
+
constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger) {
|
|
112
139
|
this.mcpManager = mcpManager;
|
|
113
140
|
this.approvalManager = approvalManager;
|
|
114
141
|
this.allowedToolsProvider = allowedToolsProvider;
|
|
@@ -116,18 +143,12 @@ let _ToolManager = class _ToolManager {
|
|
|
116
143
|
this.agentEventBus = agentEventBus;
|
|
117
144
|
this.toolPolicies = toolPolicies;
|
|
118
145
|
this.logger = logger.createChild(import_types2.DextoLogComponent.TOOLS);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
};
|
|
124
|
-
this.internalToolsProvider = new import_provider.InternalToolsProvider(
|
|
125
|
-
internalToolsServices,
|
|
126
|
-
options.internalToolsConfig || [],
|
|
127
|
-
options.customToolsConfig || [],
|
|
128
|
-
this.logger
|
|
146
|
+
this.setTools(tools);
|
|
147
|
+
this.toolExecutionContextFactory = () => {
|
|
148
|
+
throw import_errors.ToolError.configInvalid(
|
|
149
|
+
"ToolExecutionContextFactory not configured. DextoAgent.start() must configure tool execution context before tools can run."
|
|
129
150
|
);
|
|
130
|
-
}
|
|
151
|
+
};
|
|
131
152
|
this.setupNotificationListeners();
|
|
132
153
|
this.logger.debug("ToolManager initialized");
|
|
133
154
|
}
|
|
@@ -135,50 +156,78 @@ let _ToolManager = class _ToolManager {
|
|
|
135
156
|
* Initialize the ToolManager and its components
|
|
136
157
|
*/
|
|
137
158
|
async initialize() {
|
|
138
|
-
if (this.internalToolsProvider) {
|
|
139
|
-
await this.internalToolsProvider.initialize();
|
|
140
|
-
}
|
|
141
159
|
this.logger.debug("ToolManager initialization complete");
|
|
142
160
|
}
|
|
161
|
+
setTools(tools) {
|
|
162
|
+
this.agentTools.clear();
|
|
163
|
+
for (const tool of tools) {
|
|
164
|
+
this.agentTools.set(tool.id, tool);
|
|
165
|
+
}
|
|
166
|
+
this.invalidateCache();
|
|
167
|
+
}
|
|
168
|
+
setToolExecutionContextFactory(factory) {
|
|
169
|
+
this.toolExecutionContextFactory = factory;
|
|
170
|
+
}
|
|
171
|
+
registerCleanup(handler) {
|
|
172
|
+
this.cleanupHandlers.add(handler);
|
|
173
|
+
}
|
|
174
|
+
async cleanup() {
|
|
175
|
+
if (this.cleanupStarted) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.cleanupStarted = true;
|
|
179
|
+
for (const handler of this.cleanupHandlers) {
|
|
180
|
+
try {
|
|
181
|
+
await handler();
|
|
182
|
+
} catch (error) {
|
|
183
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
184
|
+
this.logger.warn(`ToolManager cleanup handler failed: ${err.message}`, {
|
|
185
|
+
color: "yellow"
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
143
190
|
/**
|
|
144
|
-
* Set
|
|
191
|
+
* Set hook support services (called after construction to avoid circular dependencies)
|
|
145
192
|
*/
|
|
146
|
-
|
|
147
|
-
this.
|
|
193
|
+
setHookSupport(hookManager, sessionManager, stateManager) {
|
|
194
|
+
this.hookManager = hookManager;
|
|
148
195
|
this.sessionManager = sessionManager;
|
|
149
196
|
this.stateManager = stateManager;
|
|
150
|
-
this.logger.debug("
|
|
197
|
+
this.logger.debug("Hook support configured for ToolManager");
|
|
151
198
|
}
|
|
152
199
|
/**
|
|
153
|
-
* Set
|
|
154
|
-
* Must be called before initialize() if custom tools are configured
|
|
200
|
+
* Set workspace manager for tool execution context propagation.
|
|
155
201
|
*/
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
202
|
+
setWorkspaceManager(workspaceManager) {
|
|
203
|
+
this.workspaceManager = workspaceManager;
|
|
204
|
+
void this.refreshWorkspace();
|
|
205
|
+
if (!this.workspaceListenerAttached) {
|
|
206
|
+
this.workspaceListenerAttached = true;
|
|
207
|
+
this.agentEventBus.on(
|
|
208
|
+
"workspace:changed",
|
|
209
|
+
(payload) => {
|
|
210
|
+
this.currentWorkspace = payload.workspace ?? void 0;
|
|
211
|
+
},
|
|
212
|
+
{ signal: this.workspaceListenerAbort.signal }
|
|
213
|
+
);
|
|
214
|
+
this.registerCleanup(() => {
|
|
215
|
+
if (!this.workspaceListenerAbort.signal.aborted) {
|
|
216
|
+
this.workspaceListenerAbort.abort();
|
|
217
|
+
}
|
|
218
|
+
});
|
|
160
219
|
}
|
|
220
|
+
this.logger.debug("WorkspaceManager reference configured for ToolManager");
|
|
161
221
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*/
|
|
166
|
-
setPromptManager(promptManager) {
|
|
167
|
-
if (this.internalToolsProvider) {
|
|
168
|
-
this.internalToolsProvider.setPromptManager(promptManager);
|
|
169
|
-
this.logger.debug("PromptManager reference configured for invoke_skill tool");
|
|
222
|
+
async refreshWorkspace() {
|
|
223
|
+
if (!this.workspaceManager) {
|
|
224
|
+
return;
|
|
170
225
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
* Called by agent-spawner custom tool provider after RuntimeService is created.
|
|
175
|
-
* This enables invoke_skill to fork execution to an isolated subagent.
|
|
176
|
-
*/
|
|
177
|
-
setTaskForker(taskForker) {
|
|
178
|
-
if (this.internalToolsProvider) {
|
|
179
|
-
this.internalToolsProvider.setTaskForker(taskForker);
|
|
226
|
+
try {
|
|
227
|
+
this.currentWorkspace = await this.workspaceManager.getWorkspace();
|
|
228
|
+
} catch (error) {
|
|
180
229
|
this.logger.debug(
|
|
181
|
-
|
|
230
|
+
`Failed to refresh workspace context: ${error instanceof Error ? error.message : String(error)}`
|
|
182
231
|
);
|
|
183
232
|
}
|
|
184
233
|
}
|
|
@@ -189,18 +238,48 @@ let _ToolManager = class _ToolManager {
|
|
|
189
238
|
* This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
|
|
190
239
|
*
|
|
191
240
|
* @param sessionId The session ID
|
|
192
|
-
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['
|
|
241
|
+
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
|
|
193
242
|
*/
|
|
194
243
|
setSessionAutoApproveTools(sessionId, autoApproveTools) {
|
|
195
244
|
if (autoApproveTools.length === 0) {
|
|
196
245
|
this.clearSessionAutoApproveTools(sessionId);
|
|
197
246
|
return;
|
|
198
247
|
}
|
|
199
|
-
|
|
248
|
+
const normalized = autoApproveTools.map(
|
|
249
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
250
|
+
);
|
|
251
|
+
this.sessionAutoApproveTools.set(sessionId, normalized);
|
|
200
252
|
this.logger.info(
|
|
201
253
|
`Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
202
254
|
);
|
|
203
|
-
this.logger.debug(`Auto-approve tools: ${
|
|
255
|
+
this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Set session-level auto-approve tools chosen by the user.
|
|
259
|
+
*/
|
|
260
|
+
setSessionUserAutoApproveTools(sessionId, autoApproveTools) {
|
|
261
|
+
if (autoApproveTools.length === 0) {
|
|
262
|
+
this.clearSessionUserAutoApproveTools(sessionId);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const normalized = autoApproveTools.map(
|
|
266
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
267
|
+
);
|
|
268
|
+
this.sessionUserAutoApproveTools.set(sessionId, normalized);
|
|
269
|
+
this.logger.info(
|
|
270
|
+
`Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
271
|
+
);
|
|
272
|
+
this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Clear session-level auto-approve tools chosen by the user.
|
|
276
|
+
*/
|
|
277
|
+
clearSessionUserAutoApproveTools(sessionId) {
|
|
278
|
+
const hadAutoApprove = this.sessionUserAutoApproveTools.has(sessionId);
|
|
279
|
+
this.sessionUserAutoApproveTools.delete(sessionId);
|
|
280
|
+
if (hadAutoApprove) {
|
|
281
|
+
this.logger.info(`Session user auto-approve tools cleared for '${sessionId}'`);
|
|
282
|
+
}
|
|
204
283
|
}
|
|
205
284
|
/**
|
|
206
285
|
* Clear session-level auto-approve tools.
|
|
@@ -215,6 +294,76 @@ let _ToolManager = class _ToolManager {
|
|
|
215
294
|
this.logger.info(`Session auto-approve tools cleared for '${sessionId}'`);
|
|
216
295
|
}
|
|
217
296
|
}
|
|
297
|
+
hasSessionUserAutoApproveTools(sessionId) {
|
|
298
|
+
return this.sessionUserAutoApproveTools.has(sessionId);
|
|
299
|
+
}
|
|
300
|
+
// ============= ENABLED/DISABLED TOOLS =============
|
|
301
|
+
/**
|
|
302
|
+
* Set global disabled tools (agent-level preferences).
|
|
303
|
+
*/
|
|
304
|
+
setGlobalDisabledTools(toolNames) {
|
|
305
|
+
this.globalDisabledTools = [...toolNames];
|
|
306
|
+
this.logger.info("Global disabled tools updated", {
|
|
307
|
+
count: toolNames.length
|
|
308
|
+
});
|
|
309
|
+
this.agentEventBus.emit("tools:enabled-updated", {
|
|
310
|
+
scope: "global",
|
|
311
|
+
disabledTools: [...this.globalDisabledTools]
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
getGlobalDisabledTools() {
|
|
315
|
+
return [...this.globalDisabledTools];
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Set session-level disabled tools (overrides global list).
|
|
319
|
+
*/
|
|
320
|
+
setSessionDisabledTools(sessionId, toolNames) {
|
|
321
|
+
if (toolNames.length === 0) {
|
|
322
|
+
this.clearSessionDisabledTools(sessionId);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
this.sessionDisabledTools.set(sessionId, [...toolNames]);
|
|
326
|
+
this.logger.info("Session disabled tools updated", {
|
|
327
|
+
sessionId,
|
|
328
|
+
count: toolNames.length
|
|
329
|
+
});
|
|
330
|
+
this.agentEventBus.emit("tools:enabled-updated", {
|
|
331
|
+
scope: "session",
|
|
332
|
+
sessionId,
|
|
333
|
+
disabledTools: [...toolNames]
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Clear session-level disabled tools.
|
|
338
|
+
*/
|
|
339
|
+
clearSessionDisabledTools(sessionId) {
|
|
340
|
+
const hadOverrides = this.sessionDisabledTools.has(sessionId);
|
|
341
|
+
this.sessionDisabledTools.delete(sessionId);
|
|
342
|
+
if (hadOverrides) {
|
|
343
|
+
this.logger.info("Session disabled tools cleared", { sessionId });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Get disabled tools for a session (session override wins).
|
|
348
|
+
*/
|
|
349
|
+
getDisabledTools(sessionId) {
|
|
350
|
+
if (sessionId && this.sessionDisabledTools.has(sessionId)) {
|
|
351
|
+
return this.sessionDisabledTools.get(sessionId) ?? [];
|
|
352
|
+
}
|
|
353
|
+
return this.globalDisabledTools;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Filter a tool set based on disabled tools for a session.
|
|
357
|
+
*/
|
|
358
|
+
filterToolsForSession(toolSet, sessionId) {
|
|
359
|
+
const disabled = new Set(this.getDisabledTools(sessionId));
|
|
360
|
+
if (disabled.size === 0) {
|
|
361
|
+
return toolSet;
|
|
362
|
+
}
|
|
363
|
+
return Object.fromEntries(
|
|
364
|
+
Object.entries(toolSet).filter(([toolName]) => !disabled.has(toolName))
|
|
365
|
+
);
|
|
366
|
+
}
|
|
218
367
|
/**
|
|
219
368
|
* Check if a session has auto-approve tools set.
|
|
220
369
|
*
|
|
@@ -225,7 +374,7 @@ let _ToolManager = class _ToolManager {
|
|
|
225
374
|
return this.sessionAutoApproveTools.has(sessionId);
|
|
226
375
|
}
|
|
227
376
|
/**
|
|
228
|
-
* Get the auto-approve tools for a session.
|
|
377
|
+
* Get the auto-approve tools for a session (skill-provided list).
|
|
229
378
|
*
|
|
230
379
|
* @param sessionId The session ID to check
|
|
231
380
|
* @returns Array of auto-approve tool names, or undefined if none set
|
|
@@ -233,6 +382,21 @@ let _ToolManager = class _ToolManager {
|
|
|
233
382
|
getSessionAutoApproveTools(sessionId) {
|
|
234
383
|
return this.sessionAutoApproveTools.get(sessionId);
|
|
235
384
|
}
|
|
385
|
+
/**
|
|
386
|
+
* Get the user auto-approve tools for a session.
|
|
387
|
+
*/
|
|
388
|
+
getSessionUserAutoApproveTools(sessionId) {
|
|
389
|
+
return this.sessionUserAutoApproveTools.get(sessionId);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Combined auto-approve list for a session.
|
|
393
|
+
*/
|
|
394
|
+
getCombinedSessionAutoApproveTools(sessionId) {
|
|
395
|
+
return [
|
|
396
|
+
...this.sessionAutoApproveTools.get(sessionId) ?? [],
|
|
397
|
+
...this.sessionUserAutoApproveTools.get(sessionId) ?? []
|
|
398
|
+
];
|
|
399
|
+
}
|
|
236
400
|
/**
|
|
237
401
|
* Check if a tool should be auto-approved for a session.
|
|
238
402
|
* Returns true if the tool is in the session's auto-approve list.
|
|
@@ -242,8 +406,8 @@ let _ToolManager = class _ToolManager {
|
|
|
242
406
|
* @returns true if the tool should be auto-approved
|
|
243
407
|
*/
|
|
244
408
|
isToolAutoApprovedForSession(sessionId, toolName) {
|
|
245
|
-
const autoApproveTools = this.
|
|
246
|
-
if (
|
|
409
|
+
const autoApproveTools = this.getCombinedSessionAutoApproveTools(sessionId);
|
|
410
|
+
if (autoApproveTools.length === 0) {
|
|
247
411
|
return false;
|
|
248
412
|
}
|
|
249
413
|
return autoApproveTools.some((pattern) => this.matchesToolPolicy(toolName, pattern));
|
|
@@ -282,39 +446,44 @@ let _ToolManager = class _ToolManager {
|
|
|
282
446
|
}
|
|
283
447
|
});
|
|
284
448
|
}
|
|
285
|
-
// ====================
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
449
|
+
// ==================== Pattern Approval Helpers ====================
|
|
450
|
+
getToolPatternKey(toolName, args) {
|
|
451
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
const tool = this.agentTools.get(toolName);
|
|
455
|
+
if (!tool?.getApprovalPatternKey) {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
try {
|
|
459
|
+
return tool.getApprovalPatternKey(args);
|
|
460
|
+
} catch (error) {
|
|
461
|
+
this.logger.debug(
|
|
462
|
+
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
463
|
+
);
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
291
466
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
*
|
|
296
|
-
* Returns approval info if covered, or pattern suggestions if not.
|
|
297
|
-
*/
|
|
298
|
-
checkBashPatternApproval(command) {
|
|
299
|
-
const patternKey = (0, import_bash_pattern_utils.generateBashPatternKey)(command);
|
|
300
|
-
if (!patternKey) {
|
|
301
|
-
if ((0, import_bash_pattern_utils.isDangerousCommand)(command)) {
|
|
302
|
-
this.logger.debug(
|
|
303
|
-
`Skipping pattern generation for dangerous command: ${command.split(/\s+/)[0]}`
|
|
304
|
-
);
|
|
305
|
-
}
|
|
306
|
-
return { approved: false, suggestedPatterns: [] };
|
|
467
|
+
getToolSuggestedPatterns(toolName, args) {
|
|
468
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
469
|
+
return void 0;
|
|
307
470
|
}
|
|
308
|
-
|
|
309
|
-
|
|
471
|
+
const tool = this.agentTools.get(toolName);
|
|
472
|
+
if (!tool?.suggestApprovalPatterns) {
|
|
473
|
+
return void 0;
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
const patterns = tool.suggestApprovalPatterns(args);
|
|
477
|
+
return patterns.length > 0 ? patterns : void 0;
|
|
478
|
+
} catch (error) {
|
|
479
|
+
this.logger.debug(
|
|
480
|
+
`Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
481
|
+
);
|
|
482
|
+
return void 0;
|
|
310
483
|
}
|
|
311
|
-
return {
|
|
312
|
-
approved: false,
|
|
313
|
-
suggestedPatterns: (0, import_bash_pattern_utils.generateBashPatternSuggestions)(command)
|
|
314
|
-
};
|
|
315
484
|
}
|
|
316
485
|
/**
|
|
317
|
-
* Auto-approve pending tool
|
|
486
|
+
* Auto-approve pending tool approval requests for the same tool.
|
|
318
487
|
* Called after a user selects "remember choice" for a tool.
|
|
319
488
|
* This handles the case where parallel tool calls come in before the first one is approved.
|
|
320
489
|
*
|
|
@@ -324,7 +493,7 @@ let _ToolManager = class _ToolManager {
|
|
|
324
493
|
autoApprovePendingToolRequests(toolName, sessionId) {
|
|
325
494
|
const count = this.approvalManager.autoApprovePendingRequests(
|
|
326
495
|
(request) => {
|
|
327
|
-
if (request.type !== import_types3.ApprovalType.
|
|
496
|
+
if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
|
|
328
497
|
return false;
|
|
329
498
|
}
|
|
330
499
|
if (request.sessionId !== sessionId) {
|
|
@@ -343,42 +512,86 @@ let _ToolManager = class _ToolManager {
|
|
|
343
512
|
}
|
|
344
513
|
}
|
|
345
514
|
/**
|
|
346
|
-
* Auto-approve pending
|
|
347
|
-
* Called after a user selects "remember pattern" for a
|
|
348
|
-
* This handles the case where parallel bash commands come in before the first one is approved.
|
|
349
|
-
*
|
|
350
|
-
* @param pattern The bash pattern that was just remembered
|
|
351
|
-
* @param sessionId The session ID for context
|
|
515
|
+
* Auto-approve pending tool approval requests that are now covered by a remembered pattern.
|
|
516
|
+
* Called after a user selects "remember pattern" for a tool.
|
|
352
517
|
*/
|
|
353
|
-
|
|
518
|
+
autoApprovePendingPatternRequests(toolName, sessionId) {
|
|
519
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
const tool = this.agentTools.get(toolName);
|
|
523
|
+
const getPatternKey = tool?.getApprovalPatternKey;
|
|
524
|
+
if (!getPatternKey) {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
354
527
|
const count = this.approvalManager.autoApprovePendingRequests(
|
|
355
528
|
(request) => {
|
|
356
|
-
if (request.type !== import_types3.ApprovalType.
|
|
529
|
+
if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
|
|
357
530
|
return false;
|
|
358
531
|
}
|
|
359
532
|
if (request.sessionId !== sessionId) {
|
|
360
533
|
return false;
|
|
361
534
|
}
|
|
362
535
|
const metadata = request.metadata;
|
|
363
|
-
if (
|
|
536
|
+
if (metadata.toolName !== toolName) {
|
|
364
537
|
return false;
|
|
365
538
|
}
|
|
366
|
-
const
|
|
367
|
-
if (
|
|
539
|
+
const args = metadata.args;
|
|
540
|
+
if (typeof args !== "object" || args === null) {
|
|
368
541
|
return false;
|
|
369
542
|
}
|
|
370
|
-
|
|
371
|
-
|
|
543
|
+
let patternKey;
|
|
544
|
+
try {
|
|
545
|
+
patternKey = getPatternKey(args);
|
|
546
|
+
} catch (error) {
|
|
547
|
+
this.logger.debug(
|
|
548
|
+
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
549
|
+
);
|
|
372
550
|
return false;
|
|
373
551
|
}
|
|
374
|
-
|
|
552
|
+
if (!patternKey) return false;
|
|
553
|
+
return this.approvalManager.matchesPattern(toolName, patternKey);
|
|
375
554
|
},
|
|
376
555
|
{ rememberPattern: void 0 }
|
|
377
|
-
// Don't propagate pattern to auto-approved requests
|
|
556
|
+
// Don't propagate pattern choice to auto-approved requests
|
|
378
557
|
);
|
|
379
558
|
if (count > 0) {
|
|
380
559
|
this.logger.info(
|
|
381
|
-
`Auto-approved ${count} parallel
|
|
560
|
+
`Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Auto-approve pending directory access requests that match a newly approved directory access request.
|
|
566
|
+
*
|
|
567
|
+
* This handles the case where parallel file operations request directory approval concurrently.
|
|
568
|
+
*/
|
|
569
|
+
autoApprovePendingDirectoryAccessRequests(options) {
|
|
570
|
+
const count = this.approvalManager.autoApprovePendingRequests(
|
|
571
|
+
(request) => {
|
|
572
|
+
if (request.type !== import_types3.ApprovalType.DIRECTORY_ACCESS) {
|
|
573
|
+
return false;
|
|
574
|
+
}
|
|
575
|
+
if (request.sessionId !== options.sessionId) {
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
const metadata = request.metadata;
|
|
579
|
+
if (typeof metadata?.parentDir !== "string" || metadata.parentDir !== options.parentDir) {
|
|
580
|
+
return false;
|
|
581
|
+
}
|
|
582
|
+
if (options.rememberDirectory) {
|
|
583
|
+
return true;
|
|
584
|
+
}
|
|
585
|
+
if (typeof metadata?.operation !== "string" || typeof metadata?.toolName !== "string") {
|
|
586
|
+
return false;
|
|
587
|
+
}
|
|
588
|
+
return metadata.operation === options.operation && metadata.toolName === options.toolName;
|
|
589
|
+
},
|
|
590
|
+
{ rememberDirectory: false }
|
|
591
|
+
);
|
|
592
|
+
if (count > 0) {
|
|
593
|
+
this.logger.info(
|
|
594
|
+
`Auto-approved ${count} parallel request(s) for directory '${options.parentDir}' after directory access was approved`
|
|
382
595
|
);
|
|
383
596
|
}
|
|
384
597
|
}
|
|
@@ -392,11 +605,66 @@ let _ToolManager = class _ToolManager {
|
|
|
392
605
|
async getMcpTools() {
|
|
393
606
|
return await this.mcpManager.getAllTools();
|
|
394
607
|
}
|
|
608
|
+
buildToolExecutionContext(options) {
|
|
609
|
+
const workspace = this.currentWorkspace;
|
|
610
|
+
const baseContext = {
|
|
611
|
+
sessionId: options.sessionId,
|
|
612
|
+
workspaceId: workspace?.id,
|
|
613
|
+
workspace,
|
|
614
|
+
abortSignal: options.abortSignal,
|
|
615
|
+
toolCallId: options.toolCallId,
|
|
616
|
+
logger: this.logger
|
|
617
|
+
};
|
|
618
|
+
return this.toolExecutionContextFactory(baseContext);
|
|
619
|
+
}
|
|
620
|
+
validateLocalToolArgsOrThrow(toolName, args) {
|
|
621
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
622
|
+
return args;
|
|
623
|
+
}
|
|
624
|
+
const tool = this.agentTools.get(toolName);
|
|
625
|
+
if (!tool) {
|
|
626
|
+
return args;
|
|
627
|
+
}
|
|
628
|
+
const validationResult = tool.inputSchema.safeParse(args);
|
|
629
|
+
if (!validationResult.success) {
|
|
630
|
+
this.logger.error(
|
|
631
|
+
`\u274C Invalid arguments for tool ${toolName}: ${validationResult.error.message}`
|
|
632
|
+
);
|
|
633
|
+
throw import_errors.ToolError.validationFailed(
|
|
634
|
+
toolName,
|
|
635
|
+
`Invalid arguments: ${validationResult.error.message}`
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
const validated = validationResult.data;
|
|
639
|
+
if (typeof validated !== "object" || validated === null || Array.isArray(validated)) {
|
|
640
|
+
throw import_errors.ToolError.validationFailed(toolName, "Invalid arguments: expected an object");
|
|
641
|
+
}
|
|
642
|
+
return validated;
|
|
643
|
+
}
|
|
644
|
+
async executeLocalTool(toolName, args, sessionId, abortSignal, toolCallId) {
|
|
645
|
+
const tool = this.agentTools.get(toolName);
|
|
646
|
+
if (!tool) {
|
|
647
|
+
this.logger.error(`\u274C No local tool found: ${toolName}`);
|
|
648
|
+
this.logger.debug(
|
|
649
|
+
`Available local tools: ${Array.from(this.agentTools.keys()).join(", ")}`
|
|
650
|
+
);
|
|
651
|
+
throw import_errors.ToolError.notFound(toolName);
|
|
652
|
+
}
|
|
653
|
+
try {
|
|
654
|
+
const context = this.buildToolExecutionContext({ sessionId, abortSignal, toolCallId });
|
|
655
|
+
const result = await tool.execute(args, context);
|
|
656
|
+
return result;
|
|
657
|
+
} catch (error) {
|
|
658
|
+
this.logger.error(`\u274C Local tool execution failed: ${toolName}`, {
|
|
659
|
+
error: error instanceof Error ? error.message : String(error)
|
|
660
|
+
});
|
|
661
|
+
throw error;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
395
664
|
/**
|
|
396
|
-
* Build all tools from sources
|
|
397
|
-
* ALL tools get prefixed by their source - no exceptions
|
|
665
|
+
* Build all tools from sources.
|
|
398
666
|
*
|
|
399
|
-
* TODO: Rethink tool naming convention for more consistency
|
|
667
|
+
* TODO: Rethink MCP tool naming convention for more consistency.
|
|
400
668
|
* Current issue: MCP tools have dynamic naming based on conflicts:
|
|
401
669
|
* - No conflict: mcp--toolName
|
|
402
670
|
* - With conflict: mcp--serverName--toolName
|
|
@@ -409,8 +677,6 @@ let _ToolManager = class _ToolManager {
|
|
|
409
677
|
async buildAllTools() {
|
|
410
678
|
const allTools = {};
|
|
411
679
|
let mcpTools = {};
|
|
412
|
-
let internalTools = {};
|
|
413
|
-
let customTools = {};
|
|
414
680
|
try {
|
|
415
681
|
mcpTools = await this.mcpManager.getAllTools();
|
|
416
682
|
} catch (error) {
|
|
@@ -419,36 +685,13 @@ let _ToolManager = class _ToolManager {
|
|
|
419
685
|
);
|
|
420
686
|
mcpTools = {};
|
|
421
687
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
}
|
|
430
|
-
try {
|
|
431
|
-
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
432
|
-
} catch (error) {
|
|
433
|
-
this.logger.error(
|
|
434
|
-
`Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
|
|
435
|
-
);
|
|
436
|
-
customTools = {};
|
|
437
|
-
}
|
|
438
|
-
for (const [toolName, toolDef] of Object.entries(internalTools)) {
|
|
439
|
-
const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
|
|
440
|
-
allTools[qualifiedName] = {
|
|
441
|
-
...toolDef,
|
|
442
|
-
name: qualifiedName,
|
|
443
|
-
description: `${toolDef.description || "No description provided"} (internal tool)`
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
for (const [toolName, toolDef] of Object.entries(customTools)) {
|
|
447
|
-
const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
|
|
448
|
-
allTools[qualifiedName] = {
|
|
449
|
-
...toolDef,
|
|
450
|
-
name: qualifiedName,
|
|
451
|
-
description: `${toolDef.description || "No description provided"} (custom tool)`
|
|
688
|
+
for (const [toolName, tool] of this.agentTools) {
|
|
689
|
+
allTools[toolName] = {
|
|
690
|
+
name: toolName,
|
|
691
|
+
description: tool.description || "No description provided",
|
|
692
|
+
parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(
|
|
693
|
+
(0, import_schema.convertZodSchemaToJsonSchema)(tool.inputSchema, this.logger)
|
|
694
|
+
)
|
|
452
695
|
};
|
|
453
696
|
}
|
|
454
697
|
for (const [toolName, toolDef] of Object.entries(mcpTools)) {
|
|
@@ -456,15 +699,15 @@ let _ToolManager = class _ToolManager {
|
|
|
456
699
|
allTools[qualifiedName] = {
|
|
457
700
|
...toolDef,
|
|
458
701
|
name: qualifiedName,
|
|
459
|
-
description: `${toolDef.description || "No description provided"} (via MCP servers)
|
|
702
|
+
description: `${toolDef.description || "No description provided"} (via MCP servers)`,
|
|
703
|
+
parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(toolDef.parameters)
|
|
460
704
|
};
|
|
461
705
|
}
|
|
462
706
|
const totalTools = Object.keys(allTools).length;
|
|
463
707
|
const mcpCount = Object.keys(mcpTools).length;
|
|
464
|
-
const
|
|
465
|
-
const customCount = Object.keys(customTools).length;
|
|
708
|
+
const localCount = this.agentTools.size;
|
|
466
709
|
this.logger.debug(
|
|
467
|
-
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${
|
|
710
|
+
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${localCount} local)`
|
|
468
711
|
);
|
|
469
712
|
return allTools;
|
|
470
713
|
}
|
|
@@ -482,32 +725,44 @@ let _ToolManager = class _ToolManager {
|
|
|
482
725
|
return this.toolsCache;
|
|
483
726
|
}
|
|
484
727
|
/**
|
|
485
|
-
* Execute a tool by routing based on
|
|
486
|
-
*
|
|
728
|
+
* Execute a tool by routing based on prefix:
|
|
729
|
+
* - MCP tools: `mcp--...`
|
|
730
|
+
* - Local tools: `Tool.id`
|
|
487
731
|
*
|
|
488
|
-
* @param toolName
|
|
732
|
+
* @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
|
|
489
733
|
* @param args The arguments for the tool
|
|
490
734
|
* @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
|
|
491
735
|
* @param sessionId Optional session ID for context
|
|
492
736
|
* @param abortSignal Optional abort signal for cancellation support
|
|
493
737
|
*/
|
|
494
738
|
async executeTool(toolName, args, toolCallId, sessionId, abortSignal) {
|
|
739
|
+
const { toolArgs: rawToolArgs, meta } = (0, import_tool_call_metadata.extractToolCallMeta)(args);
|
|
740
|
+
let toolArgs = rawToolArgs;
|
|
741
|
+
const backgroundTasksEnabled = (0, import_env.isBackgroundTasksEnabled)();
|
|
742
|
+
const toolDisplayName = this.agentTools.get(toolName)?.displayName;
|
|
495
743
|
this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
|
|
496
|
-
this.logger.debug(`Tool args: ${JSON.stringify(
|
|
744
|
+
this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
|
|
497
745
|
if (sessionId) {
|
|
498
746
|
this.agentEventBus.emit("llm:tool-call", {
|
|
499
747
|
toolName,
|
|
500
|
-
|
|
748
|
+
...toolDisplayName !== void 0 && { toolDisplayName },
|
|
749
|
+
args: toolArgs,
|
|
501
750
|
callId: toolCallId,
|
|
502
751
|
sessionId
|
|
503
752
|
});
|
|
504
753
|
}
|
|
505
|
-
const {
|
|
754
|
+
const {
|
|
755
|
+
requireApproval,
|
|
756
|
+
approvalStatus,
|
|
757
|
+
args: validatedToolArgs
|
|
758
|
+
} = await this.handleToolApproval(
|
|
506
759
|
toolName,
|
|
507
|
-
|
|
760
|
+
toolArgs,
|
|
508
761
|
toolCallId,
|
|
509
|
-
sessionId
|
|
762
|
+
sessionId,
|
|
763
|
+
meta.callDescription
|
|
510
764
|
);
|
|
765
|
+
toolArgs = validatedToolArgs;
|
|
511
766
|
this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
|
|
512
767
|
this.logger.info(
|
|
513
768
|
`\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
@@ -520,13 +775,13 @@ let _ToolManager = class _ToolManager {
|
|
|
520
775
|
});
|
|
521
776
|
}
|
|
522
777
|
const startTime = Date.now();
|
|
523
|
-
if (this.
|
|
778
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
524
779
|
const beforePayload = {
|
|
525
780
|
toolName,
|
|
526
|
-
args,
|
|
781
|
+
args: toolArgs,
|
|
527
782
|
...sessionId !== void 0 && { sessionId }
|
|
528
783
|
};
|
|
529
|
-
const modifiedPayload = await this.
|
|
784
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
530
785
|
"beforeToolCall",
|
|
531
786
|
beforePayload,
|
|
532
787
|
{
|
|
@@ -537,10 +792,29 @@ let _ToolManager = class _ToolManager {
|
|
|
537
792
|
...sessionId !== void 0 && { sessionId }
|
|
538
793
|
}
|
|
539
794
|
);
|
|
540
|
-
|
|
795
|
+
toolArgs = modifiedPayload.args;
|
|
796
|
+
try {
|
|
797
|
+
toolArgs = this.validateLocalToolArgsOrThrow(toolName, toolArgs);
|
|
798
|
+
} catch (error) {
|
|
799
|
+
this.logger.error(
|
|
800
|
+
`Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
|
|
801
|
+
);
|
|
802
|
+
throw error;
|
|
803
|
+
}
|
|
541
804
|
}
|
|
542
805
|
try {
|
|
543
806
|
let result;
|
|
807
|
+
const registerBackgroundTask = (promise, description) => {
|
|
808
|
+
const fallbackId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
809
|
+
return {
|
|
810
|
+
result: {
|
|
811
|
+
taskId: toolCallId ?? fallbackId,
|
|
812
|
+
status: "running",
|
|
813
|
+
description
|
|
814
|
+
},
|
|
815
|
+
promise
|
|
816
|
+
};
|
|
817
|
+
};
|
|
544
818
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
545
819
|
this.logger.debug(`\u{1F527} Detected MCP tool: '${toolName}'`);
|
|
546
820
|
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
@@ -548,65 +822,89 @@ let _ToolManager = class _ToolManager {
|
|
|
548
822
|
throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
549
823
|
}
|
|
550
824
|
this.logger.debug(`\u{1F3AF} MCP routing: '${toolName}' -> '${actualToolName}'`);
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
825
|
+
const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
|
|
826
|
+
if (meta.runInBackground === true && !backgroundTasksEnabled) {
|
|
827
|
+
this.logger.debug(
|
|
828
|
+
"Background tool execution disabled; running synchronously instead.",
|
|
829
|
+
{ toolName }
|
|
830
|
+
);
|
|
557
831
|
}
|
|
558
|
-
if (
|
|
559
|
-
|
|
832
|
+
if (runInBackground) {
|
|
833
|
+
const backgroundSessionId = sessionId;
|
|
834
|
+
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
835
|
+
this.mcpManager.executeTool(actualToolName, toolArgs, backgroundSessionId),
|
|
836
|
+
`MCP tool ${actualToolName}`
|
|
837
|
+
);
|
|
838
|
+
this.agentEventBus.emit("tool:background", {
|
|
839
|
+
toolName,
|
|
840
|
+
toolCallId: backgroundResult.taskId,
|
|
841
|
+
sessionId: backgroundSessionId,
|
|
842
|
+
description: backgroundResult.description,
|
|
843
|
+
promise,
|
|
844
|
+
...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
|
|
845
|
+
...meta.notifyOnComplete !== void 0 && {
|
|
846
|
+
notifyOnComplete: meta.notifyOnComplete
|
|
847
|
+
}
|
|
848
|
+
});
|
|
849
|
+
result = backgroundResult;
|
|
850
|
+
} else {
|
|
851
|
+
result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
|
|
560
852
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
);
|
|
569
|
-
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
570
|
-
this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
|
|
571
|
-
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
572
|
-
if (actualToolName.length === 0) {
|
|
573
|
-
throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
853
|
+
} else {
|
|
854
|
+
const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
|
|
855
|
+
if (meta.runInBackground === true && !backgroundTasksEnabled) {
|
|
856
|
+
this.logger.debug(
|
|
857
|
+
"Background tool execution disabled; running synchronously instead.",
|
|
858
|
+
{ toolName }
|
|
859
|
+
);
|
|
574
860
|
}
|
|
575
|
-
if (
|
|
576
|
-
|
|
861
|
+
if (runInBackground) {
|
|
862
|
+
const backgroundSessionId = sessionId;
|
|
863
|
+
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
864
|
+
this.executeLocalTool(
|
|
865
|
+
toolName,
|
|
866
|
+
toolArgs,
|
|
867
|
+
backgroundSessionId,
|
|
868
|
+
abortSignal,
|
|
869
|
+
toolCallId
|
|
870
|
+
),
|
|
871
|
+
`Tool ${toolName}`
|
|
872
|
+
);
|
|
873
|
+
this.agentEventBus.emit("tool:background", {
|
|
874
|
+
toolName,
|
|
875
|
+
toolCallId: backgroundResult.taskId,
|
|
876
|
+
sessionId: backgroundSessionId,
|
|
877
|
+
description: backgroundResult.description,
|
|
878
|
+
promise,
|
|
879
|
+
...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
|
|
880
|
+
...meta.notifyOnComplete !== void 0 && {
|
|
881
|
+
notifyOnComplete: meta.notifyOnComplete
|
|
882
|
+
}
|
|
883
|
+
});
|
|
884
|
+
result = backgroundResult;
|
|
885
|
+
} else {
|
|
886
|
+
result = await this.executeLocalTool(
|
|
887
|
+
toolName,
|
|
888
|
+
toolArgs,
|
|
889
|
+
sessionId,
|
|
890
|
+
abortSignal,
|
|
891
|
+
toolCallId
|
|
892
|
+
);
|
|
577
893
|
}
|
|
578
|
-
this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
|
|
579
|
-
result = await this.internalToolsProvider.executeTool(
|
|
580
|
-
actualToolName,
|
|
581
|
-
args,
|
|
582
|
-
sessionId,
|
|
583
|
-
abortSignal,
|
|
584
|
-
toolCallId
|
|
585
|
-
);
|
|
586
|
-
} else {
|
|
587
|
-
this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
|
|
588
|
-
const stats = await this.getToolStats();
|
|
589
|
-
this.logger.error(
|
|
590
|
-
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
|
|
591
|
-
);
|
|
592
|
-
this.logger.debug(
|
|
593
|
-
`Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
|
|
594
|
-
);
|
|
595
|
-
throw import_errors.ToolError.notFound(toolName);
|
|
596
894
|
}
|
|
597
895
|
const duration = Date.now() - startTime;
|
|
598
896
|
this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
|
|
599
897
|
this.logger.info(
|
|
600
898
|
`\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
|
|
601
899
|
);
|
|
602
|
-
if (this.
|
|
900
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
603
901
|
const afterPayload = {
|
|
604
902
|
toolName,
|
|
605
903
|
result,
|
|
606
904
|
success: true,
|
|
607
905
|
...sessionId !== void 0 && { sessionId }
|
|
608
906
|
};
|
|
609
|
-
const modifiedPayload = await this.
|
|
907
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
610
908
|
"afterToolResult",
|
|
611
909
|
afterPayload,
|
|
612
910
|
{
|
|
@@ -621,6 +919,7 @@ let _ToolManager = class _ToolManager {
|
|
|
621
919
|
}
|
|
622
920
|
return {
|
|
623
921
|
result,
|
|
922
|
+
...toolDisplayName !== void 0 && { toolDisplayName },
|
|
624
923
|
...requireApproval && { requireApproval, approvalStatus }
|
|
625
924
|
};
|
|
626
925
|
} catch (error) {
|
|
@@ -628,14 +927,14 @@ let _ToolManager = class _ToolManager {
|
|
|
628
927
|
this.logger.error(
|
|
629
928
|
`\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
|
|
630
929
|
);
|
|
631
|
-
if (this.
|
|
930
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
632
931
|
const afterPayload = {
|
|
633
932
|
toolName,
|
|
634
933
|
result: error instanceof Error ? error.message : String(error),
|
|
635
934
|
success: false,
|
|
636
935
|
...sessionId !== void 0 && { sessionId }
|
|
637
936
|
};
|
|
638
|
-
await this.
|
|
937
|
+
await this.hookManager.executeHooks("afterToolResult", afterPayload, {
|
|
639
938
|
sessionManager: this.sessionManager,
|
|
640
939
|
mcpManager: this.mcpManager,
|
|
641
940
|
toolManager: this,
|
|
@@ -647,30 +946,20 @@ let _ToolManager = class _ToolManager {
|
|
|
647
946
|
}
|
|
648
947
|
}
|
|
649
948
|
/**
|
|
650
|
-
* Check if a tool exists
|
|
949
|
+
* Check if a tool exists.
|
|
651
950
|
*/
|
|
652
951
|
async hasTool(toolName) {
|
|
653
952
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
654
953
|
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
655
954
|
return this.mcpManager.getToolClient(actualToolName) !== void 0;
|
|
656
955
|
}
|
|
657
|
-
|
|
658
|
-
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
659
|
-
return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
|
|
660
|
-
}
|
|
661
|
-
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
662
|
-
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
663
|
-
return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
|
|
664
|
-
}
|
|
665
|
-
return false;
|
|
956
|
+
return this.agentTools.has(toolName);
|
|
666
957
|
}
|
|
667
958
|
/**
|
|
668
959
|
* Get tool statistics across all sources
|
|
669
960
|
*/
|
|
670
961
|
async getToolStats() {
|
|
671
962
|
let mcpTools = {};
|
|
672
|
-
let internalTools = {};
|
|
673
|
-
let customTools = {};
|
|
674
963
|
try {
|
|
675
964
|
mcpTools = await this.mcpManager.getAllTools();
|
|
676
965
|
} catch (error) {
|
|
@@ -679,34 +968,16 @@ let _ToolManager = class _ToolManager {
|
|
|
679
968
|
);
|
|
680
969
|
mcpTools = {};
|
|
681
970
|
}
|
|
682
|
-
try {
|
|
683
|
-
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
684
|
-
} catch (error) {
|
|
685
|
-
this.logger.error(
|
|
686
|
-
`Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
687
|
-
);
|
|
688
|
-
internalTools = {};
|
|
689
|
-
}
|
|
690
|
-
try {
|
|
691
|
-
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
692
|
-
} catch (error) {
|
|
693
|
-
this.logger.error(
|
|
694
|
-
`Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
695
|
-
);
|
|
696
|
-
customTools = {};
|
|
697
|
-
}
|
|
698
971
|
const mcpCount = Object.keys(mcpTools).length;
|
|
699
|
-
const
|
|
700
|
-
const customCount = Object.keys(customTools).length;
|
|
972
|
+
const localCount = this.agentTools.size;
|
|
701
973
|
return {
|
|
702
|
-
total: mcpCount +
|
|
974
|
+
total: mcpCount + localCount,
|
|
703
975
|
mcp: mcpCount,
|
|
704
|
-
|
|
705
|
-
custom: customCount
|
|
976
|
+
local: localCount
|
|
706
977
|
};
|
|
707
978
|
}
|
|
708
979
|
/**
|
|
709
|
-
* Get the source of a tool (mcp,
|
|
980
|
+
* Get the source of a tool (mcp, local, or unknown).
|
|
710
981
|
* @param toolName The name of the tool to check
|
|
711
982
|
* @returns The source of the tool
|
|
712
983
|
*/
|
|
@@ -714,11 +985,8 @@ let _ToolManager = class _ToolManager {
|
|
|
714
985
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
|
|
715
986
|
return "mcp";
|
|
716
987
|
}
|
|
717
|
-
if (
|
|
718
|
-
return "
|
|
719
|
-
}
|
|
720
|
-
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
|
|
721
|
-
return "custom";
|
|
988
|
+
if (this.agentTools.has(toolName)) {
|
|
989
|
+
return "local";
|
|
722
990
|
}
|
|
723
991
|
return "unknown";
|
|
724
992
|
}
|
|
@@ -729,7 +997,7 @@ let _ToolManager = class _ToolManager {
|
|
|
729
997
|
* Examples:
|
|
730
998
|
* - Policy "mcp--read_file" matches "mcp--read_file" (exact)
|
|
731
999
|
* - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
|
|
732
|
-
* - Policy "
|
|
1000
|
+
* - Policy "read_file" matches "read_file" (local tool exact only)
|
|
733
1001
|
*
|
|
734
1002
|
* @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
|
|
735
1003
|
* @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
|
|
@@ -780,26 +1048,21 @@ let _ToolManager = class _ToolManager {
|
|
|
780
1048
|
* Tools can implement getApprovalOverride() to request specialized approval flows
|
|
781
1049
|
* (e.g., directory access approval for file tools) instead of default tool confirmation.
|
|
782
1050
|
*
|
|
783
|
-
* @param toolName
|
|
1051
|
+
* @param toolName Tool name
|
|
784
1052
|
* @param args The tool arguments
|
|
785
1053
|
* @param sessionId Optional session ID
|
|
786
1054
|
* @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
|
|
787
1055
|
*/
|
|
788
|
-
async checkCustomApprovalOverride(toolName, args, sessionId) {
|
|
789
|
-
|
|
790
|
-
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
791
|
-
actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
792
|
-
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
793
|
-
actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
794
|
-
}
|
|
795
|
-
if (!actualToolName || !this.internalToolsProvider) {
|
|
1056
|
+
async checkCustomApprovalOverride(toolName, args, toolCallId, sessionId) {
|
|
1057
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
796
1058
|
return { handled: false };
|
|
797
1059
|
}
|
|
798
|
-
const tool = this.
|
|
1060
|
+
const tool = this.agentTools.get(toolName);
|
|
799
1061
|
if (!tool?.getApprovalOverride) {
|
|
800
1062
|
return { handled: false };
|
|
801
1063
|
}
|
|
802
|
-
const
|
|
1064
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1065
|
+
const approvalRequest = await tool.getApprovalOverride(args, context);
|
|
803
1066
|
if (!approvalRequest) {
|
|
804
1067
|
return { handled: false };
|
|
805
1068
|
}
|
|
@@ -812,7 +1075,23 @@ let _ToolManager = class _ToolManager {
|
|
|
812
1075
|
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
813
1076
|
if (response.status === import_types3.ApprovalStatus.APPROVED) {
|
|
814
1077
|
if (tool.onApprovalGranted) {
|
|
815
|
-
tool.onApprovalGranted(response);
|
|
1078
|
+
tool.onApprovalGranted(response, context, approvalRequest);
|
|
1079
|
+
}
|
|
1080
|
+
if (approvalRequest.type === import_types3.ApprovalType.DIRECTORY_ACCESS) {
|
|
1081
|
+
const metadata = approvalRequest.metadata;
|
|
1082
|
+
const parentDir = typeof metadata?.parentDir === "string" ? metadata.parentDir : null;
|
|
1083
|
+
const operation = typeof metadata?.operation === "string" ? metadata.operation : null;
|
|
1084
|
+
if (parentDir && operation) {
|
|
1085
|
+
const data = response.data;
|
|
1086
|
+
const rememberDirectory = data?.rememberDirectory ?? false;
|
|
1087
|
+
this.autoApprovePendingDirectoryAccessRequests({
|
|
1088
|
+
parentDir,
|
|
1089
|
+
operation,
|
|
1090
|
+
sessionId,
|
|
1091
|
+
toolName,
|
|
1092
|
+
rememberDirectory
|
|
1093
|
+
});
|
|
1094
|
+
}
|
|
816
1095
|
}
|
|
817
1096
|
this.logger.info(
|
|
818
1097
|
`Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
|
|
@@ -835,12 +1114,25 @@ let _ToolManager = class _ToolManager {
|
|
|
835
1114
|
* Handle tool approval flow. Checks various precedence levels to determine
|
|
836
1115
|
* if a tool should be auto-approved, denied, or requires manual approval.
|
|
837
1116
|
*/
|
|
838
|
-
async handleToolApproval(toolName, args, toolCallId, sessionId) {
|
|
839
|
-
const
|
|
1117
|
+
async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
1118
|
+
const validatedArgs = this.validateLocalToolArgsOrThrow(toolName, args);
|
|
1119
|
+
const quickResult = await this.tryQuickApprovalResolution(
|
|
1120
|
+
toolName,
|
|
1121
|
+
validatedArgs,
|
|
1122
|
+
toolCallId,
|
|
1123
|
+
sessionId
|
|
1124
|
+
);
|
|
840
1125
|
if (quickResult !== null) {
|
|
841
|
-
return quickResult;
|
|
1126
|
+
return { ...quickResult, args: validatedArgs };
|
|
842
1127
|
}
|
|
843
|
-
|
|
1128
|
+
const manualResult = await this.requestManualApproval(
|
|
1129
|
+
toolName,
|
|
1130
|
+
validatedArgs,
|
|
1131
|
+
toolCallId,
|
|
1132
|
+
sessionId,
|
|
1133
|
+
callDescription
|
|
1134
|
+
);
|
|
1135
|
+
return { ...manualResult, args: validatedArgs };
|
|
844
1136
|
}
|
|
845
1137
|
/**
|
|
846
1138
|
* Try to resolve tool approval quickly based on policies and cached permissions.
|
|
@@ -852,10 +1144,10 @@ let _ToolManager = class _ToolManager {
|
|
|
852
1144
|
* 3. Session auto-approve (skill allowed-tools)
|
|
853
1145
|
* 4. Static allow list
|
|
854
1146
|
* 5. Dynamic "remembered" allowed list
|
|
855
|
-
* 6.
|
|
1147
|
+
* 6. Tool approval patterns
|
|
856
1148
|
* 7. Approval mode (auto-approve/auto-deny)
|
|
857
1149
|
*/
|
|
858
|
-
async tryQuickApprovalResolution(toolName, args, sessionId) {
|
|
1150
|
+
async tryQuickApprovalResolution(toolName, args, toolCallId, sessionId) {
|
|
859
1151
|
if (this.isInAlwaysDenyList(toolName)) {
|
|
860
1152
|
this.logger.info(
|
|
861
1153
|
`Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
|
|
@@ -865,6 +1157,7 @@ let _ToolManager = class _ToolManager {
|
|
|
865
1157
|
const customApprovalResult = await this.checkCustomApprovalOverride(
|
|
866
1158
|
toolName,
|
|
867
1159
|
args,
|
|
1160
|
+
toolCallId,
|
|
868
1161
|
sessionId
|
|
869
1162
|
);
|
|
870
1163
|
if (customApprovalResult.handled) {
|
|
@@ -888,17 +1181,12 @@ let _ToolManager = class _ToolManager {
|
|
|
888
1181
|
);
|
|
889
1182
|
return { requireApproval: false };
|
|
890
1183
|
}
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
`Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
|
|
898
|
-
);
|
|
899
|
-
return { requireApproval: false };
|
|
900
|
-
}
|
|
901
|
-
}
|
|
1184
|
+
const patternKey = this.getToolPatternKey(toolName, args);
|
|
1185
|
+
if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey)) {
|
|
1186
|
+
this.logger.info(
|
|
1187
|
+
`Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
|
|
1188
|
+
);
|
|
1189
|
+
return { requireApproval: false };
|
|
902
1190
|
}
|
|
903
1191
|
if (this.approvalMode === "auto-approve") {
|
|
904
1192
|
this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
|
|
@@ -914,22 +1202,25 @@ let _ToolManager = class _ToolManager {
|
|
|
914
1202
|
* Request manual approval from the user for a tool execution.
|
|
915
1203
|
* Generates preview, sends approval request, and handles the response.
|
|
916
1204
|
*/
|
|
917
|
-
async requestManualApproval(toolName, args, toolCallId, sessionId) {
|
|
1205
|
+
async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
918
1206
|
this.logger.info(
|
|
919
|
-
`Tool
|
|
1207
|
+
`Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
920
1208
|
);
|
|
921
1209
|
try {
|
|
1210
|
+
const toolDisplayName = this.agentTools.get(toolName)?.displayName;
|
|
922
1211
|
const displayPreview = await this.generateToolPreview(
|
|
923
1212
|
toolName,
|
|
924
1213
|
args,
|
|
925
1214
|
toolCallId,
|
|
926
1215
|
sessionId
|
|
927
1216
|
);
|
|
928
|
-
const suggestedPatterns = this.
|
|
929
|
-
const response = await this.approvalManager.
|
|
1217
|
+
const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
|
|
1218
|
+
const response = await this.approvalManager.requestToolApproval({
|
|
930
1219
|
toolName,
|
|
1220
|
+
...toolDisplayName !== void 0 && { toolDisplayName },
|
|
931
1221
|
toolCallId,
|
|
932
1222
|
args,
|
|
1223
|
+
...callDescription !== void 0 && { description: callDescription },
|
|
933
1224
|
...sessionId !== void 0 && { sessionId },
|
|
934
1225
|
...displayPreview !== void 0 && { displayPreview },
|
|
935
1226
|
...suggestedPatterns !== void 0 && { suggestedPatterns }
|
|
@@ -941,12 +1232,12 @@ let _ToolManager = class _ToolManager {
|
|
|
941
1232
|
this.handleApprovalDenied(toolName, response, sessionId);
|
|
942
1233
|
}
|
|
943
1234
|
this.logger.info(
|
|
944
|
-
`Tool
|
|
1235
|
+
`Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
945
1236
|
);
|
|
946
1237
|
return { requireApproval: true, approvalStatus: "approved" };
|
|
947
1238
|
} catch (error) {
|
|
948
1239
|
this.logger.error(
|
|
949
|
-
`Tool
|
|
1240
|
+
`Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
|
|
950
1241
|
);
|
|
951
1242
|
throw error;
|
|
952
1243
|
}
|
|
@@ -955,14 +1246,13 @@ let _ToolManager = class _ToolManager {
|
|
|
955
1246
|
* Generate a preview for the tool approval UI if the tool supports it.
|
|
956
1247
|
*/
|
|
957
1248
|
async generateToolPreview(toolName, args, toolCallId, sessionId) {
|
|
958
|
-
const
|
|
959
|
-
|
|
960
|
-
if (!internalTool?.generatePreview) {
|
|
1249
|
+
const tool = this.agentTools.get(toolName);
|
|
1250
|
+
if (!tool?.generatePreview) {
|
|
961
1251
|
return void 0;
|
|
962
1252
|
}
|
|
963
1253
|
try {
|
|
964
|
-
const context = { sessionId, toolCallId };
|
|
965
|
-
const preview = await
|
|
1254
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1255
|
+
const preview = await tool.generatePreview(args, context);
|
|
966
1256
|
this.logger.debug(`Generated preview for ${toolName}`);
|
|
967
1257
|
return preview ?? void 0;
|
|
968
1258
|
} catch (previewError) {
|
|
@@ -976,20 +1266,6 @@ let _ToolManager = class _ToolManager {
|
|
|
976
1266
|
return void 0;
|
|
977
1267
|
}
|
|
978
1268
|
}
|
|
979
|
-
/**
|
|
980
|
-
* Get suggested bash patterns for the approval UI.
|
|
981
|
-
*/
|
|
982
|
-
getBashSuggestedPatterns(toolName, args) {
|
|
983
|
-
if (!this.isBashTool(toolName)) {
|
|
984
|
-
return void 0;
|
|
985
|
-
}
|
|
986
|
-
const command = args.command;
|
|
987
|
-
if (!command) {
|
|
988
|
-
return void 0;
|
|
989
|
-
}
|
|
990
|
-
const result = this.checkBashPatternApproval(command);
|
|
991
|
-
return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
|
|
992
|
-
}
|
|
993
1269
|
/**
|
|
994
1270
|
* Handle "remember choice" or "remember pattern" when user approves a tool.
|
|
995
1271
|
*/
|
|
@@ -1005,10 +1281,10 @@ let _ToolManager = class _ToolManager {
|
|
|
1005
1281
|
`Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
|
|
1006
1282
|
);
|
|
1007
1283
|
this.autoApprovePendingToolRequests(toolName, allowSessionId);
|
|
1008
|
-
} else if (rememberPattern && this.
|
|
1009
|
-
this.approvalManager.
|
|
1010
|
-
this.logger.info(`
|
|
1011
|
-
this.
|
|
1284
|
+
} else if (rememberPattern && this.agentTools.get(toolName)?.getApprovalPatternKey) {
|
|
1285
|
+
this.approvalManager.addPattern(toolName, rememberPattern);
|
|
1286
|
+
this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
|
|
1287
|
+
this.autoApprovePendingPatternRequests(toolName, sessionId);
|
|
1012
1288
|
}
|
|
1013
1289
|
}
|
|
1014
1290
|
/**
|