@dexto/core 1.5.8 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -8
- package/dist/agent/DextoAgent.cjs +318 -159
- package/dist/agent/DextoAgent.d.ts +94 -56
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +315 -156
- 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 -104
- package/dist/agent/schemas.d.ts +8 -9197
- package/dist/agent/schemas.d.ts.map +1 -1
- package/dist/agent/schemas.js +1 -109
- 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 +163 -83
- package/dist/approval/manager.d.ts +50 -43
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +161 -81
- package/dist/approval/schemas.cjs +47 -32
- package/dist/approval/schemas.d.ts +291 -97
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +43 -28
- 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 +4 -2
- package/dist/context/manager.d.ts +5 -3
- package/dist/context/manager.d.ts.map +1 -1
- package/dist/context/manager.js +4 -2
- package/dist/context/types.d.ts +3 -0
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/utils.cjs +2 -2
- package/dist/context/utils.d.ts +14 -14
- package/dist/context/utils.d.ts.map +1 -1
- 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 +11 -1
- package/dist/events/index.d.ts +48 -7
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +11 -1
- 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 +26 -45
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/index.browser.cjs +13 -12
- package/dist/index.browser.d.ts +5 -5
- 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/errors.cjs +1 -1
- package/dist/llm/executor/stream-processor.cjs +131 -11
- package/dist/llm/executor/stream-processor.d.ts +8 -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 +49 -54
- 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 +49 -54
- 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/providers/local/schemas.d.ts +12 -12
- package/dist/llm/registry/auto-update.d.ts +2 -2
- package/dist/llm/registry/auto-update.d.ts.map +1 -1
- package/dist/llm/registry/index.d.ts +3 -3
- package/dist/llm/registry/index.d.ts.map +1 -1
- package/dist/llm/resolver.cjs +2 -2
- package/dist/llm/resolver.d.ts +4 -4
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/schemas.cjs +67 -104
- package/dist/llm/schemas.d.ts +10 -149
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +64 -101
- package/dist/llm/services/factory.cjs +2 -3
- 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 +2 -3
- package/dist/llm/services/vercel.cjs +8 -15
- package/dist/llm/services/vercel.d.ts +6 -7
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +8 -15
- package/dist/llm/validation.cjs +1 -1
- package/dist/llm/validation.d.ts +2 -2
- package/dist/llm/validation.d.ts.map +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.cjs +35 -0
- package/dist/logger/v2/dexto-logger.d.ts +22 -3
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/dexto-logger.js +35 -0
- package/dist/logger/v2/schemas.d.ts +6 -6
- package/dist/logger/v2/test-utils.cjs +2 -0
- 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/test-utils.js +2 -0
- 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 +22 -9
- 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 +19 -19
- 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 +7 -7
- 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.d.ts +2 -2
- package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
- 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 +15 -25
- 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 +16 -26
- 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.d.ts +2 -2
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/session-manager.cjs +67 -9
- package/dist/session/session-manager.d.ts +46 -7
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +67 -9
- 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/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/in-built-prompts.cjs +5 -5
- package/dist/systemPrompt/in-built-prompts.d.ts +1 -1
- package/dist/systemPrompt/in-built-prompts.d.ts.map +1 -1
- package/dist/systemPrompt/in-built-prompts.js +5 -5
- 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/systemPrompt/schemas.d.ts +5 -5
- package/dist/systemPrompt/types.d.ts +11 -0
- package/dist/systemPrompt/types.d.ts.map +1 -1
- 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/display-types.d.ts +10 -0
- package/dist/tools/display-types.d.ts.map +1 -1
- 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 +6 -9
- package/dist/tools/index.d.ts +3 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -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/{storage/cache/factory.cjs → tools/presentation.cjs} +26 -15
- package/dist/tools/presentation.d.ts +11 -0
- package/dist/tools/presentation.d.ts.map +1 -0
- package/dist/tools/presentation.js +24 -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 +3 -3
- package/dist/tools/tool-call-metadata.d.ts +1 -1
- package/dist/tools/tool-call-metadata.d.ts.map +1 -1
- package/dist/tools/tool-call-metadata.js +3 -3
- package/dist/tools/tool-manager.cjs +608 -392
- package/dist/tools/tool-manager.d.ts +79 -98
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +608 -396
- package/dist/tools/types.d.ts +223 -45
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/error-conversion.d.ts +2 -2
- package/dist/utils/error-conversion.d.ts.map +1 -1
- package/dist/utils/path.cjs +10 -1
- package/dist/utils/path.d.ts +7 -4
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +10 -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 +51 -56
- package/dist/utils/service-initializer.d.ts +17 -14
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +51 -56
- 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 +2 -2
- 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/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.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.cjs +0 -34
- 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 -116
- 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,42 +66,42 @@ __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
76
|
var import_tool_call_metadata = require("./tool-call-metadata.js");
|
|
77
|
-
var import_bash_pattern_utils = require("./bash-pattern-utils.js");
|
|
78
77
|
var import_env = require("../utils/env.js");
|
|
79
78
|
var _ToolManager_decorators, _init;
|
|
80
79
|
_ToolManager_decorators = [(0, import_decorators.InstrumentClass)({
|
|
81
80
|
prefix: "tool",
|
|
82
|
-
excludeMethods: [
|
|
83
|
-
"setPluginManager",
|
|
84
|
-
"setStateManager",
|
|
85
|
-
"getApprovalManager",
|
|
86
|
-
"getAllowedToolsProvider"
|
|
87
|
-
]
|
|
81
|
+
excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
|
|
88
82
|
})];
|
|
89
83
|
let _ToolManager = class _ToolManager {
|
|
90
84
|
mcpManager;
|
|
91
|
-
|
|
85
|
+
agentTools = /* @__PURE__ */ new Map();
|
|
92
86
|
approvalManager;
|
|
93
87
|
allowedToolsProvider;
|
|
94
88
|
approvalMode;
|
|
95
89
|
agentEventBus;
|
|
96
90
|
toolPolicies;
|
|
97
|
-
|
|
98
|
-
|
|
91
|
+
toolExecutionContextFactory;
|
|
92
|
+
contributorContextFactory;
|
|
93
|
+
// Hook support - set after construction to avoid circular dependencies
|
|
94
|
+
hookManager;
|
|
99
95
|
sessionManager;
|
|
100
96
|
stateManager;
|
|
101
|
-
|
|
97
|
+
workspaceManager;
|
|
98
|
+
currentWorkspace;
|
|
99
|
+
workspaceListenerAttached = false;
|
|
100
|
+
workspaceListenerAbort = new AbortController();
|
|
101
|
+
// Tool naming:
|
|
102
|
+
// - MCP tools are prefixed with `mcp--` for disambiguation.
|
|
103
|
+
// - Local tools use their `Tool.id` as-is (no internal/custom prefixing).
|
|
102
104
|
static MCP_TOOL_PREFIX = "mcp--";
|
|
103
|
-
static INTERNAL_TOOL_PREFIX = "internal--";
|
|
104
|
-
static CUSTOM_TOOL_PREFIX = "custom--";
|
|
105
105
|
// Tool caching for performance
|
|
106
106
|
toolsCache = {};
|
|
107
107
|
cacheValid = false;
|
|
@@ -114,7 +114,29 @@ let _ToolManager = class _ToolManager {
|
|
|
114
114
|
sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
|
|
115
115
|
sessionDisabledTools = /* @__PURE__ */ new Map();
|
|
116
116
|
globalDisabledTools = [];
|
|
117
|
-
|
|
117
|
+
cleanupHandlers = /* @__PURE__ */ new Set();
|
|
118
|
+
cleanupStarted = false;
|
|
119
|
+
resolveLocalToolIdOrAlias(name) {
|
|
120
|
+
const direct = this.agentTools.get(name);
|
|
121
|
+
if (direct) return direct.id;
|
|
122
|
+
const lower = name.toLowerCase();
|
|
123
|
+
for (const tool of this.agentTools.values()) {
|
|
124
|
+
if (tool.id.toLowerCase() === lower) {
|
|
125
|
+
return tool.id;
|
|
126
|
+
}
|
|
127
|
+
if (tool.aliases?.some((alias) => alias.toLowerCase() === lower)) {
|
|
128
|
+
return tool.id;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
normalizeToolPolicyPattern(pattern) {
|
|
134
|
+
if (pattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
135
|
+
return pattern;
|
|
136
|
+
}
|
|
137
|
+
return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
|
|
138
|
+
}
|
|
139
|
+
constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger) {
|
|
118
140
|
this.mcpManager = mcpManager;
|
|
119
141
|
this.approvalManager = approvalManager;
|
|
120
142
|
this.allowedToolsProvider = allowedToolsProvider;
|
|
@@ -122,18 +144,12 @@ let _ToolManager = class _ToolManager {
|
|
|
122
144
|
this.agentEventBus = agentEventBus;
|
|
123
145
|
this.toolPolicies = toolPolicies;
|
|
124
146
|
this.logger = logger.createChild(import_types2.DextoLogComponent.TOOLS);
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
};
|
|
130
|
-
this.internalToolsProvider = new import_provider.InternalToolsProvider(
|
|
131
|
-
internalToolsServices,
|
|
132
|
-
options.internalToolsConfig || [],
|
|
133
|
-
options.customToolsConfig || [],
|
|
134
|
-
this.logger
|
|
147
|
+
this.setTools(tools);
|
|
148
|
+
this.toolExecutionContextFactory = () => {
|
|
149
|
+
throw import_errors.ToolError.configInvalid(
|
|
150
|
+
"ToolExecutionContextFactory not configured. DextoAgent.start() must configure tool execution context before tools can run."
|
|
135
151
|
);
|
|
136
|
-
}
|
|
152
|
+
};
|
|
137
153
|
this.setupNotificationListeners();
|
|
138
154
|
this.logger.debug("ToolManager initialized");
|
|
139
155
|
}
|
|
@@ -141,50 +157,78 @@ let _ToolManager = class _ToolManager {
|
|
|
141
157
|
* Initialize the ToolManager and its components
|
|
142
158
|
*/
|
|
143
159
|
async initialize() {
|
|
144
|
-
if (this.internalToolsProvider) {
|
|
145
|
-
await this.internalToolsProvider.initialize();
|
|
146
|
-
}
|
|
147
160
|
this.logger.debug("ToolManager initialization complete");
|
|
148
161
|
}
|
|
162
|
+
setTools(tools) {
|
|
163
|
+
this.agentTools.clear();
|
|
164
|
+
for (const tool of tools) {
|
|
165
|
+
this.agentTools.set(tool.id, tool);
|
|
166
|
+
}
|
|
167
|
+
this.invalidateCache();
|
|
168
|
+
}
|
|
169
|
+
setToolExecutionContextFactory(factory) {
|
|
170
|
+
this.toolExecutionContextFactory = factory;
|
|
171
|
+
}
|
|
172
|
+
registerCleanup(handler) {
|
|
173
|
+
this.cleanupHandlers.add(handler);
|
|
174
|
+
}
|
|
175
|
+
async cleanup() {
|
|
176
|
+
if (this.cleanupStarted) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
this.cleanupStarted = true;
|
|
180
|
+
for (const handler of this.cleanupHandlers) {
|
|
181
|
+
try {
|
|
182
|
+
await handler();
|
|
183
|
+
} catch (error) {
|
|
184
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
185
|
+
this.logger.warn(`ToolManager cleanup handler failed: ${err.message}`, {
|
|
186
|
+
color: "yellow"
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
149
191
|
/**
|
|
150
|
-
* Set
|
|
192
|
+
* Set hook support services (called after construction to avoid circular dependencies)
|
|
151
193
|
*/
|
|
152
|
-
|
|
153
|
-
this.
|
|
194
|
+
setHookSupport(hookManager, sessionManager, stateManager) {
|
|
195
|
+
this.hookManager = hookManager;
|
|
154
196
|
this.sessionManager = sessionManager;
|
|
155
197
|
this.stateManager = stateManager;
|
|
156
|
-
this.logger.debug("
|
|
198
|
+
this.logger.debug("Hook support configured for ToolManager");
|
|
157
199
|
}
|
|
158
200
|
/**
|
|
159
|
-
* Set
|
|
160
|
-
* Must be called before initialize() if custom tools are configured
|
|
201
|
+
* Set workspace manager for tool execution context propagation.
|
|
161
202
|
*/
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
203
|
+
setWorkspaceManager(workspaceManager) {
|
|
204
|
+
this.workspaceManager = workspaceManager;
|
|
205
|
+
void this.refreshWorkspace();
|
|
206
|
+
if (!this.workspaceListenerAttached) {
|
|
207
|
+
this.workspaceListenerAttached = true;
|
|
208
|
+
this.agentEventBus.on(
|
|
209
|
+
"workspace:changed",
|
|
210
|
+
(payload) => {
|
|
211
|
+
this.currentWorkspace = payload.workspace ?? void 0;
|
|
212
|
+
},
|
|
213
|
+
{ signal: this.workspaceListenerAbort.signal }
|
|
214
|
+
);
|
|
215
|
+
this.registerCleanup(() => {
|
|
216
|
+
if (!this.workspaceListenerAbort.signal.aborted) {
|
|
217
|
+
this.workspaceListenerAbort.abort();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
166
220
|
}
|
|
221
|
+
this.logger.debug("WorkspaceManager reference configured for ToolManager");
|
|
167
222
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
*/
|
|
172
|
-
setPromptManager(promptManager) {
|
|
173
|
-
if (this.internalToolsProvider) {
|
|
174
|
-
this.internalToolsProvider.setPromptManager(promptManager);
|
|
175
|
-
this.logger.debug("PromptManager reference configured for invoke_skill tool");
|
|
223
|
+
async refreshWorkspace() {
|
|
224
|
+
if (!this.workspaceManager) {
|
|
225
|
+
return;
|
|
176
226
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
* Called by agent-spawner custom tool provider after RuntimeService is created.
|
|
181
|
-
* This enables invoke_skill to fork execution to an isolated subagent.
|
|
182
|
-
*/
|
|
183
|
-
setTaskForker(taskForker) {
|
|
184
|
-
if (this.internalToolsProvider) {
|
|
185
|
-
this.internalToolsProvider.setTaskForker(taskForker);
|
|
227
|
+
try {
|
|
228
|
+
this.currentWorkspace = await this.workspaceManager.getWorkspace();
|
|
229
|
+
} catch (error) {
|
|
186
230
|
this.logger.debug(
|
|
187
|
-
|
|
231
|
+
`Failed to refresh workspace context: ${error instanceof Error ? error.message : String(error)}`
|
|
188
232
|
);
|
|
189
233
|
}
|
|
190
234
|
}
|
|
@@ -195,18 +239,21 @@ let _ToolManager = class _ToolManager {
|
|
|
195
239
|
* This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
|
|
196
240
|
*
|
|
197
241
|
* @param sessionId The session ID
|
|
198
|
-
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['
|
|
242
|
+
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
|
|
199
243
|
*/
|
|
200
244
|
setSessionAutoApproveTools(sessionId, autoApproveTools) {
|
|
201
245
|
if (autoApproveTools.length === 0) {
|
|
202
246
|
this.clearSessionAutoApproveTools(sessionId);
|
|
203
247
|
return;
|
|
204
248
|
}
|
|
205
|
-
|
|
249
|
+
const normalized = autoApproveTools.map(
|
|
250
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
251
|
+
);
|
|
252
|
+
this.sessionAutoApproveTools.set(sessionId, normalized);
|
|
206
253
|
this.logger.info(
|
|
207
254
|
`Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
208
255
|
);
|
|
209
|
-
this.logger.debug(`Auto-approve tools: ${
|
|
256
|
+
this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
|
|
210
257
|
}
|
|
211
258
|
/**
|
|
212
259
|
* Set session-level auto-approve tools chosen by the user.
|
|
@@ -216,11 +263,14 @@ let _ToolManager = class _ToolManager {
|
|
|
216
263
|
this.clearSessionUserAutoApproveTools(sessionId);
|
|
217
264
|
return;
|
|
218
265
|
}
|
|
219
|
-
|
|
266
|
+
const normalized = autoApproveTools.map(
|
|
267
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
268
|
+
);
|
|
269
|
+
this.sessionUserAutoApproveTools.set(sessionId, normalized);
|
|
220
270
|
this.logger.info(
|
|
221
271
|
`Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
222
272
|
);
|
|
223
|
-
this.logger.debug(`User auto-approve tools: ${
|
|
273
|
+
this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
|
|
224
274
|
}
|
|
225
275
|
/**
|
|
226
276
|
* Clear session-level auto-approve tools chosen by the user.
|
|
@@ -397,39 +447,203 @@ let _ToolManager = class _ToolManager {
|
|
|
397
447
|
}
|
|
398
448
|
});
|
|
399
449
|
}
|
|
400
|
-
// ====================
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
isBashTool(toolName) {
|
|
405
|
-
return toolName === "bash_exec" || toolName === "internal--bash_exec" || toolName === "custom--bash_exec";
|
|
450
|
+
// ==================== Pattern Approval Helpers ====================
|
|
451
|
+
getToolApprovalPatternKeyFn(toolName) {
|
|
452
|
+
const tool = this.agentTools.get(toolName);
|
|
453
|
+
return tool?.approval?.patternKey;
|
|
406
454
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
455
|
+
getToolSuggestApprovalPatternsFn(toolName) {
|
|
456
|
+
const tool = this.agentTools.get(toolName);
|
|
457
|
+
return tool?.approval?.suggestPatterns;
|
|
458
|
+
}
|
|
459
|
+
getToolApprovalOverrideFn(toolName) {
|
|
460
|
+
const tool = this.agentTools.get(toolName);
|
|
461
|
+
return tool?.approval?.override;
|
|
462
|
+
}
|
|
463
|
+
getToolApprovalOnGrantedFn(toolName) {
|
|
464
|
+
const tool = this.agentTools.get(toolName);
|
|
465
|
+
return tool?.approval?.onGranted;
|
|
466
|
+
}
|
|
467
|
+
getToolPreviewFn(toolName) {
|
|
468
|
+
const tool = this.agentTools.get(toolName);
|
|
469
|
+
return tool?.presentation?.preview;
|
|
470
|
+
}
|
|
471
|
+
getToolDescribeHeaderFn(toolName) {
|
|
472
|
+
const tool = this.agentTools.get(toolName);
|
|
473
|
+
return tool?.presentation?.describeHeader;
|
|
474
|
+
}
|
|
475
|
+
getToolDescribeArgsFn(toolName) {
|
|
476
|
+
const tool = this.agentTools.get(toolName);
|
|
477
|
+
return tool?.presentation?.describeArgs;
|
|
478
|
+
}
|
|
479
|
+
getToolDescribeResultFn(toolName) {
|
|
480
|
+
const tool = this.agentTools.get(toolName);
|
|
481
|
+
return tool?.presentation?.describeResult;
|
|
482
|
+
}
|
|
483
|
+
buildGenericToolPresentationSnapshot(toolName) {
|
|
484
|
+
const toTitleCase = (name) => name.replace(/[_-]+/g, " ").split(" ").filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
485
|
+
const isMcp = toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX);
|
|
486
|
+
const fallbackTitle = (() => {
|
|
487
|
+
if (!isMcp) {
|
|
488
|
+
return toTitleCase(toolName);
|
|
489
|
+
}
|
|
490
|
+
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
491
|
+
const parts = actualToolName.split("--");
|
|
492
|
+
const toolPart = parts.length >= 2 ? parts.slice(1).join("--") : actualToolName;
|
|
493
|
+
return toTitleCase(toolPart);
|
|
494
|
+
})();
|
|
495
|
+
const snapshot = {
|
|
496
|
+
version: 1,
|
|
497
|
+
source: {
|
|
498
|
+
type: toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) ? "mcp" : "local"
|
|
499
|
+
},
|
|
500
|
+
header: {
|
|
501
|
+
title: fallbackTitle
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
if (snapshot.source?.type === "mcp") {
|
|
505
|
+
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
506
|
+
const parts = actualToolName.split("--");
|
|
507
|
+
if (parts.length >= 2 && parts[0]) {
|
|
508
|
+
snapshot.source.mcpServerName = parts[0];
|
|
420
509
|
}
|
|
421
|
-
return { approved: false, suggestedPatterns: [] };
|
|
422
510
|
}
|
|
423
|
-
|
|
424
|
-
|
|
511
|
+
return snapshot;
|
|
512
|
+
}
|
|
513
|
+
getToolPresentationSnapshotForToolCallEvent(toolName, args, toolCallId, sessionId) {
|
|
514
|
+
const fallback = this.buildGenericToolPresentationSnapshot(toolName);
|
|
515
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
516
|
+
return fallback;
|
|
517
|
+
}
|
|
518
|
+
const describeHeader = this.getToolDescribeHeaderFn(toolName);
|
|
519
|
+
const describeArgs = this.getToolDescribeArgsFn(toolName);
|
|
520
|
+
if (!describeHeader && !describeArgs) {
|
|
521
|
+
return fallback;
|
|
522
|
+
}
|
|
523
|
+
try {
|
|
524
|
+
const validatedArgs = this.validateLocalToolArgs(toolName, args);
|
|
525
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
526
|
+
const isPromiseLike = (value) => {
|
|
527
|
+
if (typeof value !== "object" || value === null) {
|
|
528
|
+
return false;
|
|
529
|
+
}
|
|
530
|
+
return typeof value.then === "function";
|
|
531
|
+
};
|
|
532
|
+
let nextSnapshot = fallback;
|
|
533
|
+
if (describeHeader) {
|
|
534
|
+
const header = describeHeader(validatedArgs, context);
|
|
535
|
+
if (!isPromiseLike(header) && header) {
|
|
536
|
+
nextSnapshot = {
|
|
537
|
+
...nextSnapshot,
|
|
538
|
+
header: { ...nextSnapshot.header, ...header }
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
if (describeArgs) {
|
|
543
|
+
const argsPresentation = describeArgs(validatedArgs, context);
|
|
544
|
+
if (!isPromiseLike(argsPresentation) && argsPresentation) {
|
|
545
|
+
nextSnapshot = {
|
|
546
|
+
...nextSnapshot,
|
|
547
|
+
args: argsPresentation
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return nextSnapshot;
|
|
552
|
+
} catch (error) {
|
|
553
|
+
this.logger.debug(
|
|
554
|
+
`Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
555
|
+
);
|
|
556
|
+
return fallback;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
async getToolPresentationSnapshotForCall(toolName, args, toolCallId, sessionId) {
|
|
560
|
+
const fallback = this.buildGenericToolPresentationSnapshot(toolName);
|
|
561
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
562
|
+
return fallback;
|
|
563
|
+
}
|
|
564
|
+
const describeHeader = this.getToolDescribeHeaderFn(toolName);
|
|
565
|
+
const describeArgs = this.getToolDescribeArgsFn(toolName);
|
|
566
|
+
if (!describeHeader && !describeArgs) {
|
|
567
|
+
return fallback;
|
|
568
|
+
}
|
|
569
|
+
try {
|
|
570
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
571
|
+
const describedHeader = describeHeader ? await Promise.resolve(describeHeader(args, context)) : null;
|
|
572
|
+
const describedArgs = describeArgs ? await Promise.resolve(describeArgs(args, context)) : null;
|
|
573
|
+
return {
|
|
574
|
+
...fallback,
|
|
575
|
+
...describedHeader ? { header: { ...fallback.header, ...describedHeader } } : {},
|
|
576
|
+
...describedArgs ? { args: describedArgs } : {}
|
|
577
|
+
};
|
|
578
|
+
} catch (error) {
|
|
579
|
+
this.logger.debug(
|
|
580
|
+
`Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
581
|
+
);
|
|
582
|
+
return fallback;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
async augmentSnapshotWithResult(toolName, snapshot, result, args, toolCallId, sessionId) {
|
|
586
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
587
|
+
return snapshot;
|
|
588
|
+
}
|
|
589
|
+
const describeResult = this.getToolDescribeResultFn(toolName);
|
|
590
|
+
if (!describeResult) {
|
|
591
|
+
return snapshot;
|
|
592
|
+
}
|
|
593
|
+
try {
|
|
594
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
595
|
+
const resultPresentation = await Promise.resolve(describeResult(result, args, context));
|
|
596
|
+
if (!resultPresentation) {
|
|
597
|
+
return snapshot;
|
|
598
|
+
}
|
|
599
|
+
return {
|
|
600
|
+
...snapshot,
|
|
601
|
+
result: resultPresentation
|
|
602
|
+
};
|
|
603
|
+
} catch (error) {
|
|
604
|
+
this.logger.debug(
|
|
605
|
+
`Tool result presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
606
|
+
);
|
|
607
|
+
return snapshot;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
getToolPatternKey(toolName, args) {
|
|
611
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
const getPatternKey = this.getToolApprovalPatternKeyFn(toolName);
|
|
615
|
+
if (!getPatternKey) {
|
|
616
|
+
return null;
|
|
617
|
+
}
|
|
618
|
+
try {
|
|
619
|
+
return getPatternKey(args);
|
|
620
|
+
} catch (error) {
|
|
621
|
+
this.logger.debug(
|
|
622
|
+
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
623
|
+
);
|
|
624
|
+
return null;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
getToolSuggestedPatterns(toolName, args) {
|
|
628
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
629
|
+
return void 0;
|
|
630
|
+
}
|
|
631
|
+
const suggestPatterns = this.getToolSuggestApprovalPatternsFn(toolName);
|
|
632
|
+
if (!suggestPatterns) {
|
|
633
|
+
return void 0;
|
|
634
|
+
}
|
|
635
|
+
try {
|
|
636
|
+
const patterns = suggestPatterns(args);
|
|
637
|
+
return patterns.length > 0 ? patterns : void 0;
|
|
638
|
+
} catch (error) {
|
|
639
|
+
this.logger.debug(
|
|
640
|
+
`Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
641
|
+
);
|
|
642
|
+
return void 0;
|
|
425
643
|
}
|
|
426
|
-
return {
|
|
427
|
-
approved: false,
|
|
428
|
-
suggestedPatterns: (0, import_bash_pattern_utils.generateBashPatternSuggestions)(command)
|
|
429
|
-
};
|
|
430
644
|
}
|
|
431
645
|
/**
|
|
432
|
-
* Auto-approve pending tool
|
|
646
|
+
* Auto-approve pending tool approval requests for the same tool.
|
|
433
647
|
* Called after a user selects "remember choice" for a tool.
|
|
434
648
|
* This handles the case where parallel tool calls come in before the first one is approved.
|
|
435
649
|
*
|
|
@@ -439,14 +653,13 @@ let _ToolManager = class _ToolManager {
|
|
|
439
653
|
autoApprovePendingToolRequests(toolName, sessionId) {
|
|
440
654
|
const count = this.approvalManager.autoApprovePendingRequests(
|
|
441
655
|
(request) => {
|
|
442
|
-
if (request.type !== import_types3.ApprovalType.
|
|
656
|
+
if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
|
|
443
657
|
return false;
|
|
444
658
|
}
|
|
445
659
|
if (request.sessionId !== sessionId) {
|
|
446
660
|
return false;
|
|
447
661
|
}
|
|
448
|
-
|
|
449
|
-
return metadata.toolName === toolName;
|
|
662
|
+
return request.metadata.toolName === toolName;
|
|
450
663
|
},
|
|
451
664
|
{ rememberChoice: false }
|
|
452
665
|
// Don't propagate remember choice to auto-approved requests
|
|
@@ -458,48 +671,86 @@ let _ToolManager = class _ToolManager {
|
|
|
458
671
|
}
|
|
459
672
|
}
|
|
460
673
|
/**
|
|
461
|
-
* Auto-approve pending
|
|
462
|
-
* Called after a user selects "remember pattern" for a
|
|
463
|
-
* This handles the case where parallel bash commands come in before the first one is approved.
|
|
464
|
-
*
|
|
465
|
-
* @param pattern The bash pattern that was just remembered
|
|
466
|
-
* @param sessionId The session ID for context
|
|
674
|
+
* Auto-approve pending tool approval requests that are now covered by a remembered pattern.
|
|
675
|
+
* Called after a user selects "remember pattern" for a tool.
|
|
467
676
|
*/
|
|
468
|
-
|
|
677
|
+
autoApprovePendingPatternRequests(toolName, sessionId) {
|
|
678
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
const getPatternKey = this.getToolApprovalPatternKeyFn(toolName);
|
|
682
|
+
if (!getPatternKey) {
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
469
685
|
const count = this.approvalManager.autoApprovePendingRequests(
|
|
470
686
|
(request) => {
|
|
471
|
-
if (request.type !== import_types3.ApprovalType.
|
|
687
|
+
if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
|
|
472
688
|
return false;
|
|
473
689
|
}
|
|
474
690
|
if (request.sessionId !== sessionId) {
|
|
475
691
|
return false;
|
|
476
692
|
}
|
|
477
|
-
|
|
478
|
-
if (!this.isBashTool(metadata.toolName)) {
|
|
693
|
+
if (request.metadata.toolName !== toolName) {
|
|
479
694
|
return false;
|
|
480
695
|
}
|
|
481
|
-
const
|
|
482
|
-
if (
|
|
696
|
+
const args = request.metadata.args;
|
|
697
|
+
if (typeof args !== "object" || args === null) {
|
|
483
698
|
return false;
|
|
484
699
|
}
|
|
485
|
-
const
|
|
486
|
-
|
|
700
|
+
const argsRecord = args;
|
|
701
|
+
let patternKey;
|
|
702
|
+
try {
|
|
703
|
+
patternKey = getPatternKey(argsRecord);
|
|
704
|
+
} catch (error) {
|
|
705
|
+
this.logger.debug(
|
|
706
|
+
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
707
|
+
);
|
|
487
708
|
return false;
|
|
488
709
|
}
|
|
489
|
-
|
|
710
|
+
if (!patternKey) return false;
|
|
711
|
+
return this.approvalManager.matchesPattern(toolName, patternKey);
|
|
490
712
|
},
|
|
491
713
|
{ rememberPattern: void 0 }
|
|
492
|
-
// Don't propagate pattern to auto-approved requests
|
|
714
|
+
// Don't propagate pattern choice to auto-approved requests
|
|
493
715
|
);
|
|
494
716
|
if (count > 0) {
|
|
495
717
|
this.logger.info(
|
|
496
|
-
`Auto-approved ${count} parallel
|
|
718
|
+
`Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
|
|
497
719
|
);
|
|
498
720
|
}
|
|
499
721
|
}
|
|
500
722
|
getMcpManager() {
|
|
501
723
|
return this.mcpManager;
|
|
502
724
|
}
|
|
725
|
+
setContributorContextFactory(factory) {
|
|
726
|
+
this.contributorContextFactory = factory ?? void 0;
|
|
727
|
+
}
|
|
728
|
+
async buildContributorContext() {
|
|
729
|
+
const baseWorkspace = this.currentWorkspace ?? null;
|
|
730
|
+
const baseContext = {
|
|
731
|
+
mcpManager: this.mcpManager,
|
|
732
|
+
workspace: baseWorkspace
|
|
733
|
+
};
|
|
734
|
+
if (!this.contributorContextFactory) {
|
|
735
|
+
return baseContext;
|
|
736
|
+
}
|
|
737
|
+
try {
|
|
738
|
+
const overrides = await this.contributorContextFactory() ?? {};
|
|
739
|
+
const workspace = overrides.workspace !== void 0 ? overrides.workspace : baseWorkspace;
|
|
740
|
+
const environment = overrides.environment !== void 0 ? overrides.environment : baseContext.environment;
|
|
741
|
+
const mcpManager = overrides.mcpManager ?? baseContext.mcpManager;
|
|
742
|
+
return {
|
|
743
|
+
mcpManager,
|
|
744
|
+
workspace,
|
|
745
|
+
...environment !== void 0 ? { environment } : {}
|
|
746
|
+
};
|
|
747
|
+
} catch (error) {
|
|
748
|
+
this.logger.warn(
|
|
749
|
+
`Failed to build contributor context: ${error instanceof Error ? error.message : String(error)}`
|
|
750
|
+
);
|
|
751
|
+
return baseContext;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
503
754
|
/**
|
|
504
755
|
* Get all MCP tools (delegates to mcpManager.getAllTools())
|
|
505
756
|
* This provides access to MCP tools while maintaining separation of concerns
|
|
@@ -507,11 +758,66 @@ let _ToolManager = class _ToolManager {
|
|
|
507
758
|
async getMcpTools() {
|
|
508
759
|
return await this.mcpManager.getAllTools();
|
|
509
760
|
}
|
|
761
|
+
buildToolExecutionContext(options) {
|
|
762
|
+
const workspace = this.currentWorkspace;
|
|
763
|
+
const baseContext = {
|
|
764
|
+
sessionId: options.sessionId,
|
|
765
|
+
workspaceId: workspace?.id,
|
|
766
|
+
workspace,
|
|
767
|
+
abortSignal: options.abortSignal,
|
|
768
|
+
toolCallId: options.toolCallId,
|
|
769
|
+
logger: this.logger
|
|
770
|
+
};
|
|
771
|
+
return this.toolExecutionContextFactory(baseContext);
|
|
772
|
+
}
|
|
773
|
+
validateLocalToolArgs(toolName, args) {
|
|
774
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
775
|
+
return args;
|
|
776
|
+
}
|
|
777
|
+
const tool = this.agentTools.get(toolName);
|
|
778
|
+
if (!tool) {
|
|
779
|
+
return args;
|
|
780
|
+
}
|
|
781
|
+
const validationResult = tool.inputSchema.safeParse(args);
|
|
782
|
+
if (!validationResult.success) {
|
|
783
|
+
this.logger.error(
|
|
784
|
+
`\u274C Invalid arguments for tool ${toolName}: ${validationResult.error.message}`
|
|
785
|
+
);
|
|
786
|
+
throw import_errors.ToolError.validationFailed(
|
|
787
|
+
toolName,
|
|
788
|
+
`Invalid arguments: ${validationResult.error.message}`
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
const validated = validationResult.data;
|
|
792
|
+
if (typeof validated !== "object" || validated === null || Array.isArray(validated)) {
|
|
793
|
+
throw import_errors.ToolError.validationFailed(toolName, "Invalid arguments: expected an object");
|
|
794
|
+
}
|
|
795
|
+
return validated;
|
|
796
|
+
}
|
|
797
|
+
async executeLocalTool(toolName, args, sessionId, abortSignal, toolCallId) {
|
|
798
|
+
const tool = this.agentTools.get(toolName);
|
|
799
|
+
if (!tool) {
|
|
800
|
+
this.logger.error(`\u274C No local tool found: ${toolName}`);
|
|
801
|
+
this.logger.debug(
|
|
802
|
+
`Available local tools: ${Array.from(this.agentTools.keys()).join(", ")}`
|
|
803
|
+
);
|
|
804
|
+
throw import_errors.ToolError.notFound(toolName);
|
|
805
|
+
}
|
|
806
|
+
try {
|
|
807
|
+
const context = this.buildToolExecutionContext({ sessionId, abortSignal, toolCallId });
|
|
808
|
+
const result = await tool.execute(args, context);
|
|
809
|
+
return result;
|
|
810
|
+
} catch (error) {
|
|
811
|
+
this.logger.error(`\u274C Local tool execution failed: ${toolName}`, {
|
|
812
|
+
error: error instanceof Error ? error.message : String(error)
|
|
813
|
+
});
|
|
814
|
+
throw error;
|
|
815
|
+
}
|
|
816
|
+
}
|
|
510
817
|
/**
|
|
511
|
-
* Build all tools from sources
|
|
512
|
-
* ALL tools get prefixed by their source - no exceptions
|
|
818
|
+
* Build all tools from sources.
|
|
513
819
|
*
|
|
514
|
-
* TODO: Rethink tool naming convention for more consistency
|
|
820
|
+
* TODO: Rethink MCP tool naming convention for more consistency.
|
|
515
821
|
* Current issue: MCP tools have dynamic naming based on conflicts:
|
|
516
822
|
* - No conflict: mcp--toolName
|
|
517
823
|
* - With conflict: mcp--serverName--toolName
|
|
@@ -524,8 +830,6 @@ let _ToolManager = class _ToolManager {
|
|
|
524
830
|
async buildAllTools() {
|
|
525
831
|
const allTools = {};
|
|
526
832
|
let mcpTools = {};
|
|
527
|
-
let internalTools = {};
|
|
528
|
-
let customTools = {};
|
|
529
833
|
try {
|
|
530
834
|
mcpTools = await this.mcpManager.getAllTools();
|
|
531
835
|
} catch (error) {
|
|
@@ -534,38 +838,13 @@ let _ToolManager = class _ToolManager {
|
|
|
534
838
|
);
|
|
535
839
|
mcpTools = {};
|
|
536
840
|
}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
}
|
|
545
|
-
try {
|
|
546
|
-
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
547
|
-
} catch (error) {
|
|
548
|
-
this.logger.error(
|
|
549
|
-
`Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
|
|
550
|
-
);
|
|
551
|
-
customTools = {};
|
|
552
|
-
}
|
|
553
|
-
for (const [toolName, toolDef] of Object.entries(internalTools)) {
|
|
554
|
-
const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
|
|
555
|
-
allTools[qualifiedName] = {
|
|
556
|
-
...toolDef,
|
|
557
|
-
name: qualifiedName,
|
|
558
|
-
description: `${toolDef.description || "No description provided"} (internal tool)`,
|
|
559
|
-
parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(toolDef.parameters)
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
for (const [toolName, toolDef] of Object.entries(customTools)) {
|
|
563
|
-
const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
|
|
564
|
-
allTools[qualifiedName] = {
|
|
565
|
-
...toolDef,
|
|
566
|
-
name: qualifiedName,
|
|
567
|
-
description: `${toolDef.description || "No description provided"} (custom tool)`,
|
|
568
|
-
parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(toolDef.parameters)
|
|
841
|
+
for (const [toolName, tool] of this.agentTools) {
|
|
842
|
+
allTools[toolName] = {
|
|
843
|
+
name: toolName,
|
|
844
|
+
description: tool.description || "No description provided",
|
|
845
|
+
parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(
|
|
846
|
+
(0, import_schema.convertZodSchemaToJsonSchema)(tool.inputSchema, this.logger)
|
|
847
|
+
)
|
|
569
848
|
};
|
|
570
849
|
}
|
|
571
850
|
for (const [toolName, toolDef] of Object.entries(mcpTools)) {
|
|
@@ -579,10 +858,9 @@ let _ToolManager = class _ToolManager {
|
|
|
579
858
|
}
|
|
580
859
|
const totalTools = Object.keys(allTools).length;
|
|
581
860
|
const mcpCount = Object.keys(mcpTools).length;
|
|
582
|
-
const
|
|
583
|
-
const customCount = Object.keys(customTools).length;
|
|
861
|
+
const localCount = this.agentTools.size;
|
|
584
862
|
this.logger.debug(
|
|
585
|
-
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${
|
|
863
|
+
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${localCount} local)`
|
|
586
864
|
);
|
|
587
865
|
return allTools;
|
|
588
866
|
}
|
|
@@ -600,10 +878,11 @@ let _ToolManager = class _ToolManager {
|
|
|
600
878
|
return this.toolsCache;
|
|
601
879
|
}
|
|
602
880
|
/**
|
|
603
|
-
* Execute a tool by routing based on
|
|
604
|
-
*
|
|
881
|
+
* Execute a tool by routing based on prefix:
|
|
882
|
+
* - MCP tools: `mcp--...`
|
|
883
|
+
* - Local tools: `Tool.id`
|
|
605
884
|
*
|
|
606
|
-
* @param toolName
|
|
885
|
+
* @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
|
|
607
886
|
* @param args The arguments for the tool
|
|
608
887
|
* @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
|
|
609
888
|
* @param sessionId Optional session ID for context
|
|
@@ -612,24 +891,39 @@ let _ToolManager = class _ToolManager {
|
|
|
612
891
|
async executeTool(toolName, args, toolCallId, sessionId, abortSignal) {
|
|
613
892
|
const { toolArgs: rawToolArgs, meta } = (0, import_tool_call_metadata.extractToolCallMeta)(args);
|
|
614
893
|
let toolArgs = rawToolArgs;
|
|
894
|
+
const callDescription = typeof meta.callDescription === "string" ? meta.callDescription : typeof rawToolArgs.description === "string" ? rawToolArgs.description : void 0;
|
|
615
895
|
const backgroundTasksEnabled = (0, import_env.isBackgroundTasksEnabled)();
|
|
616
896
|
this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
|
|
617
897
|
this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
|
|
618
898
|
if (sessionId) {
|
|
899
|
+
const presentationSnapshot = this.getToolPresentationSnapshotForToolCallEvent(
|
|
900
|
+
toolName,
|
|
901
|
+
toolArgs,
|
|
902
|
+
toolCallId,
|
|
903
|
+
sessionId
|
|
904
|
+
);
|
|
619
905
|
this.agentEventBus.emit("llm:tool-call", {
|
|
620
906
|
toolName,
|
|
907
|
+
presentationSnapshot,
|
|
621
908
|
args: toolArgs,
|
|
909
|
+
...callDescription !== void 0 && { callDescription },
|
|
622
910
|
callId: toolCallId,
|
|
623
911
|
sessionId
|
|
624
912
|
});
|
|
625
913
|
}
|
|
626
|
-
const {
|
|
914
|
+
const {
|
|
915
|
+
requireApproval,
|
|
916
|
+
approvalStatus,
|
|
917
|
+
args: validatedToolArgs,
|
|
918
|
+
presentationSnapshot: callSnapshot
|
|
919
|
+
} = await this.handleToolApproval(
|
|
627
920
|
toolName,
|
|
628
921
|
toolArgs,
|
|
629
922
|
toolCallId,
|
|
630
923
|
sessionId,
|
|
631
|
-
|
|
924
|
+
callDescription
|
|
632
925
|
);
|
|
926
|
+
toolArgs = validatedToolArgs;
|
|
633
927
|
this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
|
|
634
928
|
this.logger.info(
|
|
635
929
|
`\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
@@ -642,13 +936,13 @@ let _ToolManager = class _ToolManager {
|
|
|
642
936
|
});
|
|
643
937
|
}
|
|
644
938
|
const startTime = Date.now();
|
|
645
|
-
if (this.
|
|
939
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
646
940
|
const beforePayload = {
|
|
647
941
|
toolName,
|
|
648
942
|
args: toolArgs,
|
|
649
943
|
...sessionId !== void 0 && { sessionId }
|
|
650
944
|
};
|
|
651
|
-
const modifiedPayload = await this.
|
|
945
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
652
946
|
"beforeToolCall",
|
|
653
947
|
beforePayload,
|
|
654
948
|
{
|
|
@@ -660,6 +954,14 @@ let _ToolManager = class _ToolManager {
|
|
|
660
954
|
}
|
|
661
955
|
);
|
|
662
956
|
toolArgs = modifiedPayload.args;
|
|
957
|
+
try {
|
|
958
|
+
toolArgs = this.validateLocalToolArgs(toolName, toolArgs);
|
|
959
|
+
} catch (error) {
|
|
960
|
+
this.logger.error(
|
|
961
|
+
`Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
|
|
962
|
+
);
|
|
963
|
+
throw error;
|
|
964
|
+
}
|
|
663
965
|
}
|
|
664
966
|
try {
|
|
665
967
|
let result;
|
|
@@ -709,16 +1011,7 @@ let _ToolManager = class _ToolManager {
|
|
|
709
1011
|
} else {
|
|
710
1012
|
result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
|
|
711
1013
|
}
|
|
712
|
-
} else
|
|
713
|
-
this.logger.debug(`\u{1F527} Detected internal tool: '${toolName}'`);
|
|
714
|
-
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
715
|
-
if (actualToolName.length === 0) {
|
|
716
|
-
throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
717
|
-
}
|
|
718
|
-
if (!this.internalToolsProvider) {
|
|
719
|
-
throw import_errors.ToolError.internalToolsNotInitialized(toolName);
|
|
720
|
-
}
|
|
721
|
-
this.logger.debug(`\u{1F3AF} Internal routing: '${toolName}' -> '${actualToolName}'`);
|
|
1014
|
+
} else {
|
|
722
1015
|
const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
|
|
723
1016
|
if (meta.runInBackground === true && !backgroundTasksEnabled) {
|
|
724
1017
|
this.logger.debug(
|
|
@@ -729,14 +1022,14 @@ let _ToolManager = class _ToolManager {
|
|
|
729
1022
|
if (runInBackground) {
|
|
730
1023
|
const backgroundSessionId = sessionId;
|
|
731
1024
|
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
732
|
-
this.
|
|
733
|
-
|
|
1025
|
+
this.executeLocalTool(
|
|
1026
|
+
toolName,
|
|
734
1027
|
toolArgs,
|
|
735
1028
|
backgroundSessionId,
|
|
736
1029
|
abortSignal,
|
|
737
1030
|
toolCallId
|
|
738
1031
|
),
|
|
739
|
-
`
|
|
1032
|
+
`Tool ${toolName}`
|
|
740
1033
|
);
|
|
741
1034
|
this.agentEventBus.emit("tool:background", {
|
|
742
1035
|
toolName,
|
|
@@ -751,88 +1044,28 @@ let _ToolManager = class _ToolManager {
|
|
|
751
1044
|
});
|
|
752
1045
|
result = backgroundResult;
|
|
753
1046
|
} else {
|
|
754
|
-
result = await this.
|
|
755
|
-
actualToolName,
|
|
756
|
-
toolArgs,
|
|
757
|
-
sessionId,
|
|
758
|
-
abortSignal,
|
|
759
|
-
toolCallId
|
|
760
|
-
);
|
|
761
|
-
}
|
|
762
|
-
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
763
|
-
this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
|
|
764
|
-
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
765
|
-
if (actualToolName.length === 0) {
|
|
766
|
-
throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
767
|
-
}
|
|
768
|
-
if (!this.internalToolsProvider) {
|
|
769
|
-
throw import_errors.ToolError.internalToolsNotInitialized(toolName);
|
|
770
|
-
}
|
|
771
|
-
this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
|
|
772
|
-
const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
|
|
773
|
-
if (meta.runInBackground === true && !backgroundTasksEnabled) {
|
|
774
|
-
this.logger.debug(
|
|
775
|
-
"Background tool execution disabled; running synchronously instead.",
|
|
776
|
-
{ toolName }
|
|
777
|
-
);
|
|
778
|
-
}
|
|
779
|
-
if (runInBackground) {
|
|
780
|
-
const backgroundSessionId = sessionId;
|
|
781
|
-
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
782
|
-
this.internalToolsProvider.executeTool(
|
|
783
|
-
actualToolName,
|
|
784
|
-
toolArgs,
|
|
785
|
-
backgroundSessionId,
|
|
786
|
-
abortSignal,
|
|
787
|
-
toolCallId
|
|
788
|
-
),
|
|
789
|
-
`Custom tool ${actualToolName}`
|
|
790
|
-
);
|
|
791
|
-
this.agentEventBus.emit("tool:background", {
|
|
1047
|
+
result = await this.executeLocalTool(
|
|
792
1048
|
toolName,
|
|
793
|
-
toolCallId: backgroundResult.taskId,
|
|
794
|
-
sessionId: backgroundSessionId,
|
|
795
|
-
description: backgroundResult.description,
|
|
796
|
-
promise,
|
|
797
|
-
...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
|
|
798
|
-
...meta.notifyOnComplete !== void 0 && {
|
|
799
|
-
notifyOnComplete: meta.notifyOnComplete
|
|
800
|
-
}
|
|
801
|
-
});
|
|
802
|
-
result = backgroundResult;
|
|
803
|
-
} else {
|
|
804
|
-
result = await this.internalToolsProvider.executeTool(
|
|
805
|
-
actualToolName,
|
|
806
1049
|
toolArgs,
|
|
807
1050
|
sessionId,
|
|
808
1051
|
abortSignal,
|
|
809
1052
|
toolCallId
|
|
810
1053
|
);
|
|
811
1054
|
}
|
|
812
|
-
} else {
|
|
813
|
-
this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
|
|
814
|
-
const stats = await this.getToolStats();
|
|
815
|
-
this.logger.error(
|
|
816
|
-
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
|
|
817
|
-
);
|
|
818
|
-
this.logger.debug(
|
|
819
|
-
`Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
|
|
820
|
-
);
|
|
821
|
-
throw import_errors.ToolError.notFound(toolName);
|
|
822
1055
|
}
|
|
823
1056
|
const duration = Date.now() - startTime;
|
|
824
1057
|
this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
|
|
825
1058
|
this.logger.info(
|
|
826
1059
|
`\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
|
|
827
1060
|
);
|
|
828
|
-
if (this.
|
|
1061
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
829
1062
|
const afterPayload = {
|
|
830
1063
|
toolName,
|
|
831
1064
|
result,
|
|
832
1065
|
success: true,
|
|
833
1066
|
...sessionId !== void 0 && { sessionId }
|
|
834
1067
|
};
|
|
835
|
-
const modifiedPayload = await this.
|
|
1068
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
836
1069
|
"afterToolResult",
|
|
837
1070
|
afterPayload,
|
|
838
1071
|
{
|
|
@@ -845,8 +1078,17 @@ let _ToolManager = class _ToolManager {
|
|
|
845
1078
|
);
|
|
846
1079
|
result = modifiedPayload.result;
|
|
847
1080
|
}
|
|
1081
|
+
const presentationSnapshot = await this.augmentSnapshotWithResult(
|
|
1082
|
+
toolName,
|
|
1083
|
+
callSnapshot,
|
|
1084
|
+
result,
|
|
1085
|
+
toolArgs,
|
|
1086
|
+
toolCallId,
|
|
1087
|
+
sessionId
|
|
1088
|
+
);
|
|
848
1089
|
return {
|
|
849
1090
|
result,
|
|
1091
|
+
...presentationSnapshot !== void 0 && { presentationSnapshot },
|
|
850
1092
|
...requireApproval && { requireApproval, approvalStatus }
|
|
851
1093
|
};
|
|
852
1094
|
} catch (error) {
|
|
@@ -854,14 +1096,14 @@ let _ToolManager = class _ToolManager {
|
|
|
854
1096
|
this.logger.error(
|
|
855
1097
|
`\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
|
|
856
1098
|
);
|
|
857
|
-
if (this.
|
|
1099
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
858
1100
|
const afterPayload = {
|
|
859
1101
|
toolName,
|
|
860
1102
|
result: error instanceof Error ? error.message : String(error),
|
|
861
1103
|
success: false,
|
|
862
1104
|
...sessionId !== void 0 && { sessionId }
|
|
863
1105
|
};
|
|
864
|
-
await this.
|
|
1106
|
+
await this.hookManager.executeHooks("afterToolResult", afterPayload, {
|
|
865
1107
|
sessionManager: this.sessionManager,
|
|
866
1108
|
mcpManager: this.mcpManager,
|
|
867
1109
|
toolManager: this,
|
|
@@ -873,30 +1115,20 @@ let _ToolManager = class _ToolManager {
|
|
|
873
1115
|
}
|
|
874
1116
|
}
|
|
875
1117
|
/**
|
|
876
|
-
* Check if a tool exists
|
|
1118
|
+
* Check if a tool exists.
|
|
877
1119
|
*/
|
|
878
1120
|
async hasTool(toolName) {
|
|
879
1121
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
880
1122
|
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
881
1123
|
return this.mcpManager.getToolClient(actualToolName) !== void 0;
|
|
882
1124
|
}
|
|
883
|
-
|
|
884
|
-
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
885
|
-
return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
|
|
886
|
-
}
|
|
887
|
-
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
888
|
-
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
889
|
-
return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
|
|
890
|
-
}
|
|
891
|
-
return false;
|
|
1125
|
+
return this.agentTools.has(toolName);
|
|
892
1126
|
}
|
|
893
1127
|
/**
|
|
894
1128
|
* Get tool statistics across all sources
|
|
895
1129
|
*/
|
|
896
1130
|
async getToolStats() {
|
|
897
1131
|
let mcpTools = {};
|
|
898
|
-
let internalTools = {};
|
|
899
|
-
let customTools = {};
|
|
900
1132
|
try {
|
|
901
1133
|
mcpTools = await this.mcpManager.getAllTools();
|
|
902
1134
|
} catch (error) {
|
|
@@ -905,34 +1137,16 @@ let _ToolManager = class _ToolManager {
|
|
|
905
1137
|
);
|
|
906
1138
|
mcpTools = {};
|
|
907
1139
|
}
|
|
908
|
-
try {
|
|
909
|
-
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
910
|
-
} catch (error) {
|
|
911
|
-
this.logger.error(
|
|
912
|
-
`Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
913
|
-
);
|
|
914
|
-
internalTools = {};
|
|
915
|
-
}
|
|
916
|
-
try {
|
|
917
|
-
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
918
|
-
} catch (error) {
|
|
919
|
-
this.logger.error(
|
|
920
|
-
`Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
921
|
-
);
|
|
922
|
-
customTools = {};
|
|
923
|
-
}
|
|
924
1140
|
const mcpCount = Object.keys(mcpTools).length;
|
|
925
|
-
const
|
|
926
|
-
const customCount = Object.keys(customTools).length;
|
|
1141
|
+
const localCount = this.agentTools.size;
|
|
927
1142
|
return {
|
|
928
|
-
total: mcpCount +
|
|
1143
|
+
total: mcpCount + localCount,
|
|
929
1144
|
mcp: mcpCount,
|
|
930
|
-
|
|
931
|
-
custom: customCount
|
|
1145
|
+
local: localCount
|
|
932
1146
|
};
|
|
933
1147
|
}
|
|
934
1148
|
/**
|
|
935
|
-
* Get the source of a tool (mcp,
|
|
1149
|
+
* Get the source of a tool (mcp, local, or unknown).
|
|
936
1150
|
* @param toolName The name of the tool to check
|
|
937
1151
|
* @returns The source of the tool
|
|
938
1152
|
*/
|
|
@@ -940,11 +1154,8 @@ let _ToolManager = class _ToolManager {
|
|
|
940
1154
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
|
|
941
1155
|
return "mcp";
|
|
942
1156
|
}
|
|
943
|
-
if (
|
|
944
|
-
return "
|
|
945
|
-
}
|
|
946
|
-
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
|
|
947
|
-
return "custom";
|
|
1157
|
+
if (this.agentTools.has(toolName)) {
|
|
1158
|
+
return "local";
|
|
948
1159
|
}
|
|
949
1160
|
return "unknown";
|
|
950
1161
|
}
|
|
@@ -955,7 +1166,7 @@ let _ToolManager = class _ToolManager {
|
|
|
955
1166
|
* Examples:
|
|
956
1167
|
* - Policy "mcp--read_file" matches "mcp--read_file" (exact)
|
|
957
1168
|
* - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
|
|
958
|
-
* - Policy "
|
|
1169
|
+
* - Policy "read_file" matches "read_file" (local tool exact only)
|
|
959
1170
|
*
|
|
960
1171
|
* @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
|
|
961
1172
|
* @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
|
|
@@ -1002,99 +1213,113 @@ let _ToolManager = class _ToolManager {
|
|
|
1002
1213
|
);
|
|
1003
1214
|
}
|
|
1004
1215
|
/**
|
|
1005
|
-
*
|
|
1006
|
-
*
|
|
1007
|
-
* (e.g., directory access approval for file tools) instead of default tool confirmation.
|
|
1008
|
-
*
|
|
1009
|
-
* @param toolName The fully qualified tool name
|
|
1010
|
-
* @param args The tool arguments
|
|
1011
|
-
* @param sessionId Optional session ID
|
|
1012
|
-
* @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
|
|
1216
|
+
* Handle tool approval flow. Checks various precedence levels to determine
|
|
1217
|
+
* if a tool should be auto-approved, denied, or requires manual approval.
|
|
1013
1218
|
*/
|
|
1014
|
-
async
|
|
1015
|
-
|
|
1016
|
-
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
1017
|
-
actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
1018
|
-
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
1019
|
-
actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
1020
|
-
}
|
|
1021
|
-
if (!actualToolName || !this.internalToolsProvider) {
|
|
1022
|
-
return { handled: false };
|
|
1023
|
-
}
|
|
1024
|
-
const tool = this.internalToolsProvider.getTool(actualToolName);
|
|
1025
|
-
if (!tool?.getApprovalOverride) {
|
|
1026
|
-
return { handled: false };
|
|
1027
|
-
}
|
|
1028
|
-
const approvalRequest = await tool.getApprovalOverride(args);
|
|
1029
|
-
if (!approvalRequest) {
|
|
1030
|
-
return { handled: false };
|
|
1031
|
-
}
|
|
1032
|
-
this.logger.debug(
|
|
1033
|
-
`Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
|
|
1034
|
-
);
|
|
1035
|
-
if (sessionId && !approvalRequest.sessionId) {
|
|
1036
|
-
approvalRequest.sessionId = sessionId;
|
|
1037
|
-
}
|
|
1038
|
-
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
1039
|
-
if (response.status === import_types3.ApprovalStatus.APPROVED) {
|
|
1040
|
-
if (tool.onApprovalGranted) {
|
|
1041
|
-
tool.onApprovalGranted(response);
|
|
1042
|
-
}
|
|
1219
|
+
async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
1220
|
+
if (this.isInAlwaysDenyList(toolName)) {
|
|
1043
1221
|
this.logger.info(
|
|
1044
|
-
`
|
|
1222
|
+
`Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
|
|
1045
1223
|
);
|
|
1046
|
-
|
|
1224
|
+
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
1047
1225
|
}
|
|
1048
|
-
this.
|
|
1049
|
-
|
|
1226
|
+
const validatedArgs = this.validateLocalToolArgs(toolName, args);
|
|
1227
|
+
const presentationSnapshot = await this.getToolPresentationSnapshotForCall(
|
|
1228
|
+
toolName,
|
|
1229
|
+
validatedArgs,
|
|
1230
|
+
toolCallId,
|
|
1231
|
+
sessionId
|
|
1050
1232
|
);
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1233
|
+
let directoryAccess;
|
|
1234
|
+
let directoryAccessApprovalRequest;
|
|
1235
|
+
if (!toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
1236
|
+
const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
|
|
1237
|
+
if (getApprovalOverride) {
|
|
1238
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1239
|
+
const approvalRequest = await getApprovalOverride(validatedArgs, context);
|
|
1240
|
+
if (approvalRequest) {
|
|
1241
|
+
if (approvalRequest.type === import_types3.ApprovalType.DIRECTORY_ACCESS) {
|
|
1242
|
+
const metadata = approvalRequest.metadata;
|
|
1243
|
+
if (typeof metadata !== "object" || metadata === null || typeof metadata.path !== "string" || typeof metadata.parentDir !== "string" || typeof metadata.operation !== "string" || typeof metadata.toolName !== "string") {
|
|
1244
|
+
throw import_errors.ToolError.configInvalid(
|
|
1245
|
+
`Tool '${toolName}' returned invalid directory access metadata`
|
|
1246
|
+
);
|
|
1247
|
+
}
|
|
1248
|
+
directoryAccess = metadata;
|
|
1249
|
+
directoryAccessApprovalRequest = approvalRequest;
|
|
1250
|
+
} else {
|
|
1251
|
+
this.logger.debug(
|
|
1252
|
+
`Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
|
|
1253
|
+
);
|
|
1254
|
+
if (sessionId && !approvalRequest.sessionId) {
|
|
1255
|
+
approvalRequest.sessionId = sessionId;
|
|
1256
|
+
}
|
|
1257
|
+
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
1258
|
+
if (response.status === import_types3.ApprovalStatus.APPROVED) {
|
|
1259
|
+
const onGranted = this.getToolApprovalOnGrantedFn(toolName);
|
|
1260
|
+
if (onGranted) {
|
|
1261
|
+
await Promise.resolve(
|
|
1262
|
+
onGranted(response, context, approvalRequest)
|
|
1263
|
+
);
|
|
1264
|
+
}
|
|
1265
|
+
this.logger.info(
|
|
1266
|
+
`Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
|
|
1267
|
+
);
|
|
1268
|
+
return {
|
|
1269
|
+
requireApproval: true,
|
|
1270
|
+
approvalStatus: "approved",
|
|
1271
|
+
args: validatedArgs,
|
|
1272
|
+
presentationSnapshot
|
|
1273
|
+
};
|
|
1274
|
+
}
|
|
1275
|
+
this.logger.info(
|
|
1276
|
+
`Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
|
|
1277
|
+
);
|
|
1278
|
+
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1057
1282
|
}
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
1065
|
-
const quickResult = await this.tryQuickApprovalResolution(toolName, args, sessionId);
|
|
1283
|
+
const quickResult = await this.tryQuickApprovalResolution(
|
|
1284
|
+
toolName,
|
|
1285
|
+
validatedArgs,
|
|
1286
|
+
sessionId,
|
|
1287
|
+
directoryAccess
|
|
1288
|
+
);
|
|
1066
1289
|
if (quickResult !== null) {
|
|
1067
|
-
return quickResult;
|
|
1290
|
+
return { ...quickResult, args: validatedArgs, presentationSnapshot };
|
|
1068
1291
|
}
|
|
1069
|
-
|
|
1292
|
+
const manualResult = await this.requestManualApproval(
|
|
1293
|
+
toolName,
|
|
1294
|
+
validatedArgs,
|
|
1295
|
+
toolCallId,
|
|
1296
|
+
sessionId,
|
|
1297
|
+
directoryAccess,
|
|
1298
|
+
directoryAccessApprovalRequest,
|
|
1299
|
+
callDescription,
|
|
1300
|
+
presentationSnapshot
|
|
1301
|
+
);
|
|
1302
|
+
return { ...manualResult, args: validatedArgs, presentationSnapshot };
|
|
1070
1303
|
}
|
|
1071
1304
|
/**
|
|
1072
1305
|
* Try to resolve tool approval quickly based on policies and cached permissions.
|
|
1073
1306
|
* Returns null if manual approval is needed.
|
|
1074
1307
|
*
|
|
1075
1308
|
* Precedence order (highest to lowest):
|
|
1076
|
-
* 1.
|
|
1077
|
-
* 2.
|
|
1078
|
-
* 3.
|
|
1079
|
-
* 4.
|
|
1080
|
-
* 5.
|
|
1081
|
-
* 6.
|
|
1082
|
-
* 7. Approval mode (auto-approve/auto-deny)
|
|
1309
|
+
* 1. Directory access requirement (outside-root paths)
|
|
1310
|
+
* 2. Session auto-approve (skill allowed-tools)
|
|
1311
|
+
* 3. Static allow list
|
|
1312
|
+
* 4. Dynamic "remembered" allowed list
|
|
1313
|
+
* 5. Tool approval patterns
|
|
1314
|
+
* 6. Approval mode (auto-approve/auto-deny)
|
|
1083
1315
|
*/
|
|
1084
|
-
async tryQuickApprovalResolution(toolName, args, sessionId) {
|
|
1085
|
-
if (
|
|
1086
|
-
this.
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
const customApprovalResult = await this.checkCustomApprovalOverride(
|
|
1092
|
-
toolName,
|
|
1093
|
-
args,
|
|
1094
|
-
sessionId
|
|
1095
|
-
);
|
|
1096
|
-
if (customApprovalResult.handled) {
|
|
1097
|
-
return { requireApproval: true, approvalStatus: "approved" };
|
|
1316
|
+
async tryQuickApprovalResolution(toolName, args, sessionId, directoryAccess) {
|
|
1317
|
+
if (directoryAccess) {
|
|
1318
|
+
if (this.approvalMode === "auto-approve") {
|
|
1319
|
+
this.approvalManager.addApprovedDirectory(directoryAccess.parentDir, "once");
|
|
1320
|
+
return { requireApproval: false };
|
|
1321
|
+
}
|
|
1322
|
+
return null;
|
|
1098
1323
|
}
|
|
1099
1324
|
if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
|
|
1100
1325
|
this.logger.info(
|
|
@@ -1114,17 +1339,12 @@ let _ToolManager = class _ToolManager {
|
|
|
1114
1339
|
);
|
|
1115
1340
|
return { requireApproval: false };
|
|
1116
1341
|
}
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
`Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
|
|
1124
|
-
);
|
|
1125
|
-
return { requireApproval: false };
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1342
|
+
const patternKey = this.getToolPatternKey(toolName, args);
|
|
1343
|
+
if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey)) {
|
|
1344
|
+
this.logger.info(
|
|
1345
|
+
`Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
|
|
1346
|
+
);
|
|
1347
|
+
return { requireApproval: false };
|
|
1128
1348
|
}
|
|
1129
1349
|
if (this.approvalMode === "auto-approve") {
|
|
1130
1350
|
this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
|
|
@@ -1140,9 +1360,9 @@ let _ToolManager = class _ToolManager {
|
|
|
1140
1360
|
* Request manual approval from the user for a tool execution.
|
|
1141
1361
|
* Generates preview, sends approval request, and handles the response.
|
|
1142
1362
|
*/
|
|
1143
|
-
async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
1363
|
+
async requestManualApproval(toolName, args, toolCallId, sessionId, directoryAccess, directoryAccessApprovalRequest, callDescription, presentationSnapshot) {
|
|
1144
1364
|
this.logger.info(
|
|
1145
|
-
`Tool
|
|
1365
|
+
`Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1146
1366
|
);
|
|
1147
1367
|
try {
|
|
1148
1368
|
const displayPreview = await this.generateToolPreview(
|
|
@@ -1151,16 +1371,27 @@ let _ToolManager = class _ToolManager {
|
|
|
1151
1371
|
toolCallId,
|
|
1152
1372
|
sessionId
|
|
1153
1373
|
);
|
|
1154
|
-
const suggestedPatterns = this.
|
|
1155
|
-
const response = await this.approvalManager.
|
|
1374
|
+
const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
|
|
1375
|
+
const response = await this.approvalManager.requestToolApproval({
|
|
1156
1376
|
toolName,
|
|
1377
|
+
...presentationSnapshot !== void 0 && { presentationSnapshot },
|
|
1157
1378
|
toolCallId,
|
|
1158
1379
|
args,
|
|
1159
1380
|
...callDescription !== void 0 && { description: callDescription },
|
|
1160
1381
|
...sessionId !== void 0 && { sessionId },
|
|
1161
1382
|
...displayPreview !== void 0 && { displayPreview },
|
|
1383
|
+
...directoryAccess !== void 0 && { directoryAccess },
|
|
1162
1384
|
...suggestedPatterns !== void 0 && { suggestedPatterns }
|
|
1163
1385
|
});
|
|
1386
|
+
if (response.status === import_types3.ApprovalStatus.APPROVED && directoryAccessApprovalRequest !== void 0) {
|
|
1387
|
+
const onGranted = this.getToolApprovalOnGrantedFn(toolName);
|
|
1388
|
+
if (onGranted) {
|
|
1389
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1390
|
+
await Promise.resolve(
|
|
1391
|
+
onGranted(response, context, directoryAccessApprovalRequest)
|
|
1392
|
+
);
|
|
1393
|
+
}
|
|
1394
|
+
}
|
|
1164
1395
|
if (response.status === import_types3.ApprovalStatus.APPROVED && response.data) {
|
|
1165
1396
|
await this.handleRememberChoice(toolName, response, sessionId);
|
|
1166
1397
|
}
|
|
@@ -1168,12 +1399,12 @@ let _ToolManager = class _ToolManager {
|
|
|
1168
1399
|
this.handleApprovalDenied(toolName, response, sessionId);
|
|
1169
1400
|
}
|
|
1170
1401
|
this.logger.info(
|
|
1171
|
-
`Tool
|
|
1402
|
+
`Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1172
1403
|
);
|
|
1173
1404
|
return { requireApproval: true, approvalStatus: "approved" };
|
|
1174
1405
|
} catch (error) {
|
|
1175
1406
|
this.logger.error(
|
|
1176
|
-
`Tool
|
|
1407
|
+
`Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
|
|
1177
1408
|
);
|
|
1178
1409
|
throw error;
|
|
1179
1410
|
}
|
|
@@ -1182,14 +1413,13 @@ let _ToolManager = class _ToolManager {
|
|
|
1182
1413
|
* Generate a preview for the tool approval UI if the tool supports it.
|
|
1183
1414
|
*/
|
|
1184
1415
|
async generateToolPreview(toolName, args, toolCallId, sessionId) {
|
|
1185
|
-
const
|
|
1186
|
-
|
|
1187
|
-
if (!internalTool?.generatePreview) {
|
|
1416
|
+
const previewFn = this.getToolPreviewFn(toolName);
|
|
1417
|
+
if (!previewFn) {
|
|
1188
1418
|
return void 0;
|
|
1189
1419
|
}
|
|
1190
1420
|
try {
|
|
1191
|
-
const context = { sessionId, toolCallId };
|
|
1192
|
-
const preview = await
|
|
1421
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1422
|
+
const preview = await previewFn(args, context);
|
|
1193
1423
|
this.logger.debug(`Generated preview for ${toolName}`);
|
|
1194
1424
|
return preview ?? void 0;
|
|
1195
1425
|
} catch (previewError) {
|
|
@@ -1203,20 +1433,6 @@ let _ToolManager = class _ToolManager {
|
|
|
1203
1433
|
return void 0;
|
|
1204
1434
|
}
|
|
1205
1435
|
}
|
|
1206
|
-
/**
|
|
1207
|
-
* Get suggested bash patterns for the approval UI.
|
|
1208
|
-
*/
|
|
1209
|
-
getBashSuggestedPatterns(toolName, args) {
|
|
1210
|
-
if (!this.isBashTool(toolName)) {
|
|
1211
|
-
return void 0;
|
|
1212
|
-
}
|
|
1213
|
-
const command = args.command;
|
|
1214
|
-
if (!command) {
|
|
1215
|
-
return void 0;
|
|
1216
|
-
}
|
|
1217
|
-
const result = this.checkBashPatternApproval(command);
|
|
1218
|
-
return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
|
|
1219
|
-
}
|
|
1220
1436
|
/**
|
|
1221
1437
|
* Handle "remember choice" or "remember pattern" when user approves a tool.
|
|
1222
1438
|
*/
|
|
@@ -1232,10 +1448,10 @@ let _ToolManager = class _ToolManager {
|
|
|
1232
1448
|
`Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
|
|
1233
1449
|
);
|
|
1234
1450
|
this.autoApprovePendingToolRequests(toolName, allowSessionId);
|
|
1235
|
-
} else if (rememberPattern && this.
|
|
1236
|
-
this.approvalManager.
|
|
1237
|
-
this.logger.info(`
|
|
1238
|
-
this.
|
|
1451
|
+
} else if (rememberPattern && this.getToolApprovalPatternKeyFn(toolName)) {
|
|
1452
|
+
this.approvalManager.addPattern(toolName, rememberPattern);
|
|
1453
|
+
this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
|
|
1454
|
+
this.autoApprovePendingPatternRequests(toolName, sessionId);
|
|
1239
1455
|
}
|
|
1240
1456
|
}
|
|
1241
1457
|
/**
|