@dexto/core 1.5.8 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -8
- package/dist/agent/DextoAgent.cjs +293 -154
- package/dist/agent/DextoAgent.d.ts +83 -56
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +290 -151
- 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 +10 -9199
- 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 +77 -57
- package/dist/approval/manager.d.ts +41 -43
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +75 -55
- package/dist/approval/schemas.cjs +26 -25
- package/dist/approval/schemas.d.ts +35 -15
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +22 -21
- package/dist/approval/types.cjs +1 -1
- package/dist/approval/types.d.ts +14 -14
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/approval/types.js +1 -1
- package/dist/context/compaction/index.cjs +2 -23
- package/dist/context/compaction/index.d.ts +1 -7
- package/dist/context/compaction/index.d.ts.map +1 -1
- package/dist/context/compaction/index.js +1 -16
- package/dist/context/compaction/strategies/noop.cjs +19 -1
- package/dist/context/compaction/strategies/noop.d.ts +13 -3
- package/dist/context/compaction/strategies/noop.d.ts.map +1 -1
- package/dist/context/compaction/strategies/noop.js +19 -1
- package/dist/context/compaction/strategies/{reactive-overflow.cjs → reactive-overflow-compaction.cjs} +67 -64
- package/dist/context/compaction/strategies/{reactive-overflow.d.ts → reactive-overflow-compaction.d.ts} +19 -36
- package/dist/context/compaction/strategies/reactive-overflow-compaction.d.ts.map +1 -0
- package/dist/context/compaction/strategies/{reactive-overflow.js → reactive-overflow-compaction.js} +63 -60
- package/dist/context/compaction/types.d.ts +40 -8
- package/dist/context/compaction/types.d.ts.map +1 -1
- package/dist/context/manager.cjs +4 -2
- package/dist/context/manager.d.ts +4 -3
- package/dist/context/manager.d.ts.map +1 -1
- package/dist/context/manager.js +4 -2
- package/dist/context/types.d.ts +2 -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 +43 -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 +36 -34
- 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 +7 -5
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +131 -11
- package/dist/llm/executor/turn-executor.cjs +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 +10 -10
- 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 +6 -145
- 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 +7 -14
- 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 +7 -14
- 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.d.ts +3 -3
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/schemas.d.ts +12 -12
- package/dist/logger/v2/test-utils.d.ts +5 -5
- package/dist/logger/v2/test-utils.d.ts.map +1 -1
- package/dist/logger/v2/transport-factory.d.ts +3 -3
- package/dist/logger/v2/transport-factory.d.ts.map +1 -1
- package/dist/logger/v2/transports/console-transport.d.ts +2 -2
- package/dist/logger/v2/transports/console-transport.d.ts.map +1 -1
- package/dist/logger/v2/transports/file-transport.d.ts +2 -2
- package/dist/logger/v2/transports/file-transport.d.ts.map +1 -1
- package/dist/logger/v2/transports/silent-transport.d.ts +2 -2
- package/dist/logger/v2/transports/silent-transport.d.ts.map +1 -1
- package/dist/logger/v2/types.cjs +1 -1
- package/dist/logger/v2/types.d.ts +8 -8
- package/dist/logger/v2/types.d.ts.map +1 -1
- package/dist/logger/v2/types.js +1 -1
- package/dist/mcp/errors.cjs +2 -2
- package/dist/mcp/errors.d.ts.map +1 -1
- package/dist/mcp/manager.cjs +16 -11
- package/dist/mcp/manager.d.ts +16 -13
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +17 -12
- package/dist/mcp/mcp-client.cjs +25 -20
- package/dist/mcp/mcp-client.d.ts +5 -5
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +20 -15
- package/dist/mcp/resolver.cjs +1 -1
- package/dist/mcp/schemas.cjs +5 -5
- package/dist/mcp/schemas.d.ts +4 -4
- package/dist/mcp/schemas.js +2 -2
- package/dist/mcp/types.d.ts +7 -7
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/memory/manager.d.ts +2 -2
- package/dist/memory/manager.d.ts.map +1 -1
- package/dist/memory/schemas.d.ts +2 -2
- package/dist/prompts/errors.cjs +3 -3
- package/dist/prompts/errors.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.d.ts +3 -3
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.cjs +15 -29
- package/dist/prompts/providers/config-prompt-provider.d.ts +3 -3
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +15 -29
- package/dist/prompts/providers/custom-prompt-provider.d.ts +2 -2
- package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/mcp-prompt-provider.d.ts +2 -2
- package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/schemas.d.ts +4 -4
- package/dist/resources/{internal-provider.cjs → agent-resources-provider.cjs} +16 -16
- package/dist/resources/{internal-provider.d.ts → agent-resources-provider.d.ts} +6 -6
- package/dist/resources/agent-resources-provider.d.ts.map +1 -0
- package/dist/resources/{internal-provider.js → agent-resources-provider.js} +13 -13
- package/dist/resources/errors.cjs +2 -2
- package/dist/resources/errors.d.ts.map +1 -1
- package/dist/resources/handlers/blob-handler.d.ts +2 -2
- package/dist/resources/handlers/blob-handler.d.ts.map +1 -1
- package/dist/resources/handlers/factory.d.ts +3 -3
- package/dist/resources/handlers/factory.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.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/manager.cjs +1 -5
- package/dist/systemPrompt/manager.d.ts +2 -3
- package/dist/systemPrompt/manager.d.ts.map +1 -1
- package/dist/systemPrompt/manager.js +1 -5
- package/dist/telemetry/index.cjs +3 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -0
- package/dist/telemetry/utils.d.ts +4 -4
- package/dist/telemetry/utils.d.ts.map +1 -1
- package/dist/test-utils/in-memory-storage.cjs +288 -0
- package/dist/test-utils/in-memory-storage.js +252 -0
- package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts +3 -3
- package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts.map +1 -1
- package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts +2 -2
- package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts.map +1 -1
- package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts +4 -4
- package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts.map +1 -1
- package/dist/tools/confirmation/allowed-tools-provider/types.d.ts +2 -2
- package/dist/tools/confirmation/allowed-tools-provider/types.d.ts.map +1 -1
- package/dist/tools/{internal-tools/constants.cjs → define-tool.cjs} +8 -13
- package/dist/tools/define-tool.d.ts +11 -0
- package/dist/tools/define-tool.d.ts.map +1 -0
- package/dist/tools/define-tool.js +7 -0
- package/dist/tools/error-codes.cjs +2 -2
- package/dist/tools/error-codes.d.ts +2 -2
- package/dist/tools/error-codes.d.ts.map +1 -1
- package/dist/tools/error-codes.js +2 -2
- package/dist/tools/errors.cjs +11 -23
- package/dist/tools/errors.d.ts +4 -10
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +9 -21
- package/dist/tools/index.cjs +3 -8
- package/dist/tools/index.d.ts +2 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -7
- package/dist/{storage/blob/providers/index.cjs → tools/pattern-utils.cjs} +11 -9
- package/dist/tools/pattern-utils.d.ts +20 -0
- package/dist/tools/pattern-utils.d.ts.map +1 -0
- package/dist/tools/pattern-utils.js +10 -0
- package/dist/tools/schemas.cjs +14 -40
- package/dist/tools/schemas.d.ts +6 -50
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +11 -32
- package/dist/tools/tool-call-metadata.cjs +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 +376 -327
- package/dist/tools/tool-manager.d.ts +63 -80
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +376 -331
- package/dist/tools/types.d.ts +112 -13
- 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.d.ts +2 -2
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/result.cjs +1 -1
- package/dist/utils/result.d.ts.map +1 -1
- package/dist/utils/schema.cjs +9 -5
- package/dist/utils/schema.d.ts +4 -2
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +9 -5
- package/dist/utils/service-initializer.cjs +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.cjs +0 -38
- package/dist/storage/cache/factory.d.ts +0 -37
- package/dist/storage/cache/factory.d.ts.map +0 -1
- package/dist/storage/cache/factory.js +0 -15
- package/dist/storage/cache/memory-cache-store.cjs +0 -107
- package/dist/storage/cache/memory-cache-store.d.ts +0 -26
- package/dist/storage/cache/memory-cache-store.d.ts.map +0 -1
- package/dist/storage/cache/memory-cache-store.js +0 -84
- package/dist/storage/cache/provider.cjs +0 -16
- package/dist/storage/cache/provider.d.ts +0 -56
- package/dist/storage/cache/provider.d.ts.map +0 -1
- package/dist/storage/cache/provider.js +0 -0
- package/dist/storage/cache/providers/index.d.ts +0 -8
- package/dist/storage/cache/providers/index.d.ts.map +0 -1
- package/dist/storage/cache/providers/index.js +0 -7
- package/dist/storage/cache/providers/memory.d.ts +0 -17
- package/dist/storage/cache/providers/memory.d.ts.map +0 -1
- package/dist/storage/cache/providers/memory.js +0 -17
- package/dist/storage/cache/providers/redis.cjs +0 -66
- package/dist/storage/cache/providers/redis.d.ts +0 -20
- package/dist/storage/cache/providers/redis.d.ts.map +0 -1
- package/dist/storage/cache/providers/redis.js +0 -33
- package/dist/storage/cache/redis-store.cjs +0 -173
- package/dist/storage/cache/redis-store.d.ts +0 -32
- package/dist/storage/cache/redis-store.d.ts.map +0 -1
- package/dist/storage/cache/redis-store.js +0 -150
- package/dist/storage/cache/registry.cjs +0 -50
- package/dist/storage/cache/registry.d.ts +0 -42
- package/dist/storage/cache/registry.d.ts.map +0 -1
- package/dist/storage/cache/registry.js +0 -26
- package/dist/storage/cache/schemas.cjs +0 -81
- package/dist/storage/cache/schemas.d.ts +0 -150
- package/dist/storage/cache/schemas.d.ts.map +0 -1
- package/dist/storage/cache/schemas.js +0 -55
- package/dist/storage/database/factory.cjs +0 -38
- package/dist/storage/database/factory.d.ts +0 -39
- package/dist/storage/database/factory.d.ts.map +0 -1
- package/dist/storage/database/factory.js +0 -15
- package/dist/storage/database/memory-database-store.cjs +0 -122
- package/dist/storage/database/memory-database-store.d.ts +0 -29
- package/dist/storage/database/memory-database-store.d.ts.map +0 -1
- package/dist/storage/database/memory-database-store.js +0 -99
- package/dist/storage/database/postgres-store.cjs +0 -342
- package/dist/storage/database/postgres-store.d.ts +0 -55
- package/dist/storage/database/postgres-store.d.ts.map +0 -1
- package/dist/storage/database/postgres-store.js +0 -319
- package/dist/storage/database/provider.cjs +0 -16
- package/dist/storage/database/provider.d.ts +0 -56
- package/dist/storage/database/provider.d.ts.map +0 -1
- package/dist/storage/database/provider.js +0 -0
- package/dist/storage/database/providers/index.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
|
@@ -4,45 +4,40 @@ import {
|
|
|
4
4
|
__runInitializers
|
|
5
5
|
} from "../chunk-PTJYTZNU.js";
|
|
6
6
|
var _ToolManager_decorators, _init;
|
|
7
|
-
import { InternalToolsProvider } from "./internal-tools/provider.js";
|
|
8
7
|
import { ToolError } from "./errors.js";
|
|
9
8
|
import { ToolErrorCode } from "./error-codes.js";
|
|
10
9
|
import { DextoRuntimeError } from "../errors/index.js";
|
|
11
10
|
import { DextoLogComponent } from "../logger/v2/types.js";
|
|
11
|
+
import { convertZodSchemaToJsonSchema } from "../utils/schema.js";
|
|
12
12
|
import { ApprovalStatus, ApprovalType, DenialReason } from "../approval/types.js";
|
|
13
13
|
import { InstrumentClass } from "../telemetry/decorators.js";
|
|
14
14
|
import { extractToolCallMeta, wrapToolParametersSchema } from "./tool-call-metadata.js";
|
|
15
|
-
import {
|
|
16
|
-
generateBashPatternKey,
|
|
17
|
-
generateBashPatternSuggestions,
|
|
18
|
-
isDangerousCommand
|
|
19
|
-
} from "./bash-pattern-utils.js";
|
|
20
15
|
import { isBackgroundTasksEnabled } from "../utils/env.js";
|
|
21
16
|
_ToolManager_decorators = [InstrumentClass({
|
|
22
17
|
prefix: "tool",
|
|
23
|
-
excludeMethods: [
|
|
24
|
-
"setPluginManager",
|
|
25
|
-
"setStateManager",
|
|
26
|
-
"getApprovalManager",
|
|
27
|
-
"getAllowedToolsProvider"
|
|
28
|
-
]
|
|
18
|
+
excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
|
|
29
19
|
})];
|
|
30
20
|
let _ToolManager = class _ToolManager {
|
|
31
21
|
mcpManager;
|
|
32
|
-
|
|
22
|
+
agentTools = /* @__PURE__ */ new Map();
|
|
33
23
|
approvalManager;
|
|
34
24
|
allowedToolsProvider;
|
|
35
25
|
approvalMode;
|
|
36
26
|
agentEventBus;
|
|
37
27
|
toolPolicies;
|
|
38
|
-
|
|
39
|
-
|
|
28
|
+
toolExecutionContextFactory;
|
|
29
|
+
// Hook support - set after construction to avoid circular dependencies
|
|
30
|
+
hookManager;
|
|
40
31
|
sessionManager;
|
|
41
32
|
stateManager;
|
|
42
|
-
|
|
33
|
+
workspaceManager;
|
|
34
|
+
currentWorkspace;
|
|
35
|
+
workspaceListenerAttached = false;
|
|
36
|
+
workspaceListenerAbort = new AbortController();
|
|
37
|
+
// Tool naming:
|
|
38
|
+
// - MCP tools are prefixed with `mcp--` for disambiguation.
|
|
39
|
+
// - Local tools use their `Tool.id` as-is (no internal/custom prefixing).
|
|
43
40
|
static MCP_TOOL_PREFIX = "mcp--";
|
|
44
|
-
static INTERNAL_TOOL_PREFIX = "internal--";
|
|
45
|
-
static CUSTOM_TOOL_PREFIX = "custom--";
|
|
46
41
|
// Tool caching for performance
|
|
47
42
|
toolsCache = {};
|
|
48
43
|
cacheValid = false;
|
|
@@ -55,7 +50,29 @@ let _ToolManager = class _ToolManager {
|
|
|
55
50
|
sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
|
|
56
51
|
sessionDisabledTools = /* @__PURE__ */ new Map();
|
|
57
52
|
globalDisabledTools = [];
|
|
58
|
-
|
|
53
|
+
cleanupHandlers = /* @__PURE__ */ new Set();
|
|
54
|
+
cleanupStarted = false;
|
|
55
|
+
resolveLocalToolIdOrAlias(name) {
|
|
56
|
+
const direct = this.agentTools.get(name);
|
|
57
|
+
if (direct) return direct.id;
|
|
58
|
+
const lower = name.toLowerCase();
|
|
59
|
+
for (const tool of this.agentTools.values()) {
|
|
60
|
+
if (tool.id.toLowerCase() === lower) {
|
|
61
|
+
return tool.id;
|
|
62
|
+
}
|
|
63
|
+
if (tool.aliases?.some((alias) => alias.toLowerCase() === lower)) {
|
|
64
|
+
return tool.id;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
normalizeToolPolicyPattern(pattern) {
|
|
70
|
+
if (pattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
71
|
+
return pattern;
|
|
72
|
+
}
|
|
73
|
+
return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
|
|
74
|
+
}
|
|
75
|
+
constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger) {
|
|
59
76
|
this.mcpManager = mcpManager;
|
|
60
77
|
this.approvalManager = approvalManager;
|
|
61
78
|
this.allowedToolsProvider = allowedToolsProvider;
|
|
@@ -63,18 +80,12 @@ let _ToolManager = class _ToolManager {
|
|
|
63
80
|
this.agentEventBus = agentEventBus;
|
|
64
81
|
this.toolPolicies = toolPolicies;
|
|
65
82
|
this.logger = logger.createChild(DextoLogComponent.TOOLS);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
};
|
|
71
|
-
this.internalToolsProvider = new InternalToolsProvider(
|
|
72
|
-
internalToolsServices,
|
|
73
|
-
options.internalToolsConfig || [],
|
|
74
|
-
options.customToolsConfig || [],
|
|
75
|
-
this.logger
|
|
83
|
+
this.setTools(tools);
|
|
84
|
+
this.toolExecutionContextFactory = () => {
|
|
85
|
+
throw ToolError.configInvalid(
|
|
86
|
+
"ToolExecutionContextFactory not configured. DextoAgent.start() must configure tool execution context before tools can run."
|
|
76
87
|
);
|
|
77
|
-
}
|
|
88
|
+
};
|
|
78
89
|
this.setupNotificationListeners();
|
|
79
90
|
this.logger.debug("ToolManager initialized");
|
|
80
91
|
}
|
|
@@ -82,50 +93,78 @@ let _ToolManager = class _ToolManager {
|
|
|
82
93
|
* Initialize the ToolManager and its components
|
|
83
94
|
*/
|
|
84
95
|
async initialize() {
|
|
85
|
-
if (this.internalToolsProvider) {
|
|
86
|
-
await this.internalToolsProvider.initialize();
|
|
87
|
-
}
|
|
88
96
|
this.logger.debug("ToolManager initialization complete");
|
|
89
97
|
}
|
|
98
|
+
setTools(tools) {
|
|
99
|
+
this.agentTools.clear();
|
|
100
|
+
for (const tool of tools) {
|
|
101
|
+
this.agentTools.set(tool.id, tool);
|
|
102
|
+
}
|
|
103
|
+
this.invalidateCache();
|
|
104
|
+
}
|
|
105
|
+
setToolExecutionContextFactory(factory) {
|
|
106
|
+
this.toolExecutionContextFactory = factory;
|
|
107
|
+
}
|
|
108
|
+
registerCleanup(handler) {
|
|
109
|
+
this.cleanupHandlers.add(handler);
|
|
110
|
+
}
|
|
111
|
+
async cleanup() {
|
|
112
|
+
if (this.cleanupStarted) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this.cleanupStarted = true;
|
|
116
|
+
for (const handler of this.cleanupHandlers) {
|
|
117
|
+
try {
|
|
118
|
+
await handler();
|
|
119
|
+
} catch (error) {
|
|
120
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
121
|
+
this.logger.warn(`ToolManager cleanup handler failed: ${err.message}`, {
|
|
122
|
+
color: "yellow"
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
90
127
|
/**
|
|
91
|
-
* Set
|
|
128
|
+
* Set hook support services (called after construction to avoid circular dependencies)
|
|
92
129
|
*/
|
|
93
|
-
|
|
94
|
-
this.
|
|
130
|
+
setHookSupport(hookManager, sessionManager, stateManager) {
|
|
131
|
+
this.hookManager = hookManager;
|
|
95
132
|
this.sessionManager = sessionManager;
|
|
96
133
|
this.stateManager = stateManager;
|
|
97
|
-
this.logger.debug("
|
|
134
|
+
this.logger.debug("Hook support configured for ToolManager");
|
|
98
135
|
}
|
|
99
136
|
/**
|
|
100
|
-
* Set
|
|
101
|
-
* Must be called before initialize() if custom tools are configured
|
|
137
|
+
* Set workspace manager for tool execution context propagation.
|
|
102
138
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
139
|
+
setWorkspaceManager(workspaceManager) {
|
|
140
|
+
this.workspaceManager = workspaceManager;
|
|
141
|
+
void this.refreshWorkspace();
|
|
142
|
+
if (!this.workspaceListenerAttached) {
|
|
143
|
+
this.workspaceListenerAttached = true;
|
|
144
|
+
this.agentEventBus.on(
|
|
145
|
+
"workspace:changed",
|
|
146
|
+
(payload) => {
|
|
147
|
+
this.currentWorkspace = payload.workspace ?? void 0;
|
|
148
|
+
},
|
|
149
|
+
{ signal: this.workspaceListenerAbort.signal }
|
|
150
|
+
);
|
|
151
|
+
this.registerCleanup(() => {
|
|
152
|
+
if (!this.workspaceListenerAbort.signal.aborted) {
|
|
153
|
+
this.workspaceListenerAbort.abort();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
107
156
|
}
|
|
157
|
+
this.logger.debug("WorkspaceManager reference configured for ToolManager");
|
|
108
158
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
*/
|
|
113
|
-
setPromptManager(promptManager) {
|
|
114
|
-
if (this.internalToolsProvider) {
|
|
115
|
-
this.internalToolsProvider.setPromptManager(promptManager);
|
|
116
|
-
this.logger.debug("PromptManager reference configured for invoke_skill tool");
|
|
159
|
+
async refreshWorkspace() {
|
|
160
|
+
if (!this.workspaceManager) {
|
|
161
|
+
return;
|
|
117
162
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
* Called by agent-spawner custom tool provider after RuntimeService is created.
|
|
122
|
-
* This enables invoke_skill to fork execution to an isolated subagent.
|
|
123
|
-
*/
|
|
124
|
-
setTaskForker(taskForker) {
|
|
125
|
-
if (this.internalToolsProvider) {
|
|
126
|
-
this.internalToolsProvider.setTaskForker(taskForker);
|
|
163
|
+
try {
|
|
164
|
+
this.currentWorkspace = await this.workspaceManager.getWorkspace();
|
|
165
|
+
} catch (error) {
|
|
127
166
|
this.logger.debug(
|
|
128
|
-
|
|
167
|
+
`Failed to refresh workspace context: ${error instanceof Error ? error.message : String(error)}`
|
|
129
168
|
);
|
|
130
169
|
}
|
|
131
170
|
}
|
|
@@ -136,18 +175,21 @@ let _ToolManager = class _ToolManager {
|
|
|
136
175
|
* This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
|
|
137
176
|
*
|
|
138
177
|
* @param sessionId The session ID
|
|
139
|
-
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['
|
|
178
|
+
* @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
|
|
140
179
|
*/
|
|
141
180
|
setSessionAutoApproveTools(sessionId, autoApproveTools) {
|
|
142
181
|
if (autoApproveTools.length === 0) {
|
|
143
182
|
this.clearSessionAutoApproveTools(sessionId);
|
|
144
183
|
return;
|
|
145
184
|
}
|
|
146
|
-
|
|
185
|
+
const normalized = autoApproveTools.map(
|
|
186
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
187
|
+
);
|
|
188
|
+
this.sessionAutoApproveTools.set(sessionId, normalized);
|
|
147
189
|
this.logger.info(
|
|
148
190
|
`Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
149
191
|
);
|
|
150
|
-
this.logger.debug(`Auto-approve tools: ${
|
|
192
|
+
this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
|
|
151
193
|
}
|
|
152
194
|
/**
|
|
153
195
|
* Set session-level auto-approve tools chosen by the user.
|
|
@@ -157,11 +199,14 @@ let _ToolManager = class _ToolManager {
|
|
|
157
199
|
this.clearSessionUserAutoApproveTools(sessionId);
|
|
158
200
|
return;
|
|
159
201
|
}
|
|
160
|
-
|
|
202
|
+
const normalized = autoApproveTools.map(
|
|
203
|
+
(pattern) => this.normalizeToolPolicyPattern(pattern)
|
|
204
|
+
);
|
|
205
|
+
this.sessionUserAutoApproveTools.set(sessionId, normalized);
|
|
161
206
|
this.logger.info(
|
|
162
207
|
`Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
|
|
163
208
|
);
|
|
164
|
-
this.logger.debug(`User auto-approve tools: ${
|
|
209
|
+
this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
|
|
165
210
|
}
|
|
166
211
|
/**
|
|
167
212
|
* Clear session-level auto-approve tools chosen by the user.
|
|
@@ -338,39 +383,44 @@ let _ToolManager = class _ToolManager {
|
|
|
338
383
|
}
|
|
339
384
|
});
|
|
340
385
|
}
|
|
341
|
-
// ====================
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
386
|
+
// ==================== Pattern Approval Helpers ====================
|
|
387
|
+
getToolPatternKey(toolName, args) {
|
|
388
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
const tool = this.agentTools.get(toolName);
|
|
392
|
+
if (!tool?.getApprovalPatternKey) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
try {
|
|
396
|
+
return tool.getApprovalPatternKey(args);
|
|
397
|
+
} catch (error) {
|
|
398
|
+
this.logger.debug(
|
|
399
|
+
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
400
|
+
);
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
347
403
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
*
|
|
352
|
-
* Returns approval info if covered, or pattern suggestions if not.
|
|
353
|
-
*/
|
|
354
|
-
checkBashPatternApproval(command) {
|
|
355
|
-
const patternKey = generateBashPatternKey(command);
|
|
356
|
-
if (!patternKey) {
|
|
357
|
-
if (isDangerousCommand(command)) {
|
|
358
|
-
this.logger.debug(
|
|
359
|
-
`Skipping pattern generation for dangerous command: ${command.split(/\s+/)[0]}`
|
|
360
|
-
);
|
|
361
|
-
}
|
|
362
|
-
return { approved: false, suggestedPatterns: [] };
|
|
404
|
+
getToolSuggestedPatterns(toolName, args) {
|
|
405
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
406
|
+
return void 0;
|
|
363
407
|
}
|
|
364
|
-
|
|
365
|
-
|
|
408
|
+
const tool = this.agentTools.get(toolName);
|
|
409
|
+
if (!tool?.suggestApprovalPatterns) {
|
|
410
|
+
return void 0;
|
|
411
|
+
}
|
|
412
|
+
try {
|
|
413
|
+
const patterns = tool.suggestApprovalPatterns(args);
|
|
414
|
+
return patterns.length > 0 ? patterns : void 0;
|
|
415
|
+
} catch (error) {
|
|
416
|
+
this.logger.debug(
|
|
417
|
+
`Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
418
|
+
);
|
|
419
|
+
return void 0;
|
|
366
420
|
}
|
|
367
|
-
return {
|
|
368
|
-
approved: false,
|
|
369
|
-
suggestedPatterns: generateBashPatternSuggestions(command)
|
|
370
|
-
};
|
|
371
421
|
}
|
|
372
422
|
/**
|
|
373
|
-
* Auto-approve pending tool
|
|
423
|
+
* Auto-approve pending tool approval requests for the same tool.
|
|
374
424
|
* Called after a user selects "remember choice" for a tool.
|
|
375
425
|
* This handles the case where parallel tool calls come in before the first one is approved.
|
|
376
426
|
*
|
|
@@ -380,7 +430,7 @@ let _ToolManager = class _ToolManager {
|
|
|
380
430
|
autoApprovePendingToolRequests(toolName, sessionId) {
|
|
381
431
|
const count = this.approvalManager.autoApprovePendingRequests(
|
|
382
432
|
(request) => {
|
|
383
|
-
if (request.type !== ApprovalType.
|
|
433
|
+
if (request.type !== ApprovalType.TOOL_APPROVAL) {
|
|
384
434
|
return false;
|
|
385
435
|
}
|
|
386
436
|
if (request.sessionId !== sessionId) {
|
|
@@ -399,42 +449,86 @@ let _ToolManager = class _ToolManager {
|
|
|
399
449
|
}
|
|
400
450
|
}
|
|
401
451
|
/**
|
|
402
|
-
* Auto-approve pending
|
|
403
|
-
* Called after a user selects "remember pattern" for a
|
|
404
|
-
* This handles the case where parallel bash commands come in before the first one is approved.
|
|
405
|
-
*
|
|
406
|
-
* @param pattern The bash pattern that was just remembered
|
|
407
|
-
* @param sessionId The session ID for context
|
|
452
|
+
* Auto-approve pending tool approval requests that are now covered by a remembered pattern.
|
|
453
|
+
* Called after a user selects "remember pattern" for a tool.
|
|
408
454
|
*/
|
|
409
|
-
|
|
455
|
+
autoApprovePendingPatternRequests(toolName, sessionId) {
|
|
456
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
const tool = this.agentTools.get(toolName);
|
|
460
|
+
const getPatternKey = tool?.getApprovalPatternKey;
|
|
461
|
+
if (!getPatternKey) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
410
464
|
const count = this.approvalManager.autoApprovePendingRequests(
|
|
411
465
|
(request) => {
|
|
412
|
-
if (request.type !== ApprovalType.
|
|
466
|
+
if (request.type !== ApprovalType.TOOL_APPROVAL) {
|
|
413
467
|
return false;
|
|
414
468
|
}
|
|
415
469
|
if (request.sessionId !== sessionId) {
|
|
416
470
|
return false;
|
|
417
471
|
}
|
|
418
472
|
const metadata = request.metadata;
|
|
419
|
-
if (
|
|
473
|
+
if (metadata.toolName !== toolName) {
|
|
420
474
|
return false;
|
|
421
475
|
}
|
|
422
|
-
const
|
|
423
|
-
if (
|
|
476
|
+
const args = metadata.args;
|
|
477
|
+
if (typeof args !== "object" || args === null) {
|
|
424
478
|
return false;
|
|
425
479
|
}
|
|
426
|
-
|
|
427
|
-
|
|
480
|
+
let patternKey;
|
|
481
|
+
try {
|
|
482
|
+
patternKey = getPatternKey(args);
|
|
483
|
+
} catch (error) {
|
|
484
|
+
this.logger.debug(
|
|
485
|
+
`Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
|
|
486
|
+
);
|
|
428
487
|
return false;
|
|
429
488
|
}
|
|
430
|
-
|
|
489
|
+
if (!patternKey) return false;
|
|
490
|
+
return this.approvalManager.matchesPattern(toolName, patternKey);
|
|
431
491
|
},
|
|
432
492
|
{ rememberPattern: void 0 }
|
|
433
|
-
// Don't propagate pattern to auto-approved requests
|
|
493
|
+
// Don't propagate pattern choice to auto-approved requests
|
|
434
494
|
);
|
|
435
495
|
if (count > 0) {
|
|
436
496
|
this.logger.info(
|
|
437
|
-
`Auto-approved ${count} parallel
|
|
497
|
+
`Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Auto-approve pending directory access requests that match a newly approved directory access request.
|
|
503
|
+
*
|
|
504
|
+
* This handles the case where parallel file operations request directory approval concurrently.
|
|
505
|
+
*/
|
|
506
|
+
autoApprovePendingDirectoryAccessRequests(options) {
|
|
507
|
+
const count = this.approvalManager.autoApprovePendingRequests(
|
|
508
|
+
(request) => {
|
|
509
|
+
if (request.type !== ApprovalType.DIRECTORY_ACCESS) {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
if (request.sessionId !== options.sessionId) {
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
const metadata = request.metadata;
|
|
516
|
+
if (typeof metadata?.parentDir !== "string" || metadata.parentDir !== options.parentDir) {
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
if (options.rememberDirectory) {
|
|
520
|
+
return true;
|
|
521
|
+
}
|
|
522
|
+
if (typeof metadata?.operation !== "string" || typeof metadata?.toolName !== "string") {
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
return metadata.operation === options.operation && metadata.toolName === options.toolName;
|
|
526
|
+
},
|
|
527
|
+
{ rememberDirectory: false }
|
|
528
|
+
);
|
|
529
|
+
if (count > 0) {
|
|
530
|
+
this.logger.info(
|
|
531
|
+
`Auto-approved ${count} parallel request(s) for directory '${options.parentDir}' after directory access was approved`
|
|
438
532
|
);
|
|
439
533
|
}
|
|
440
534
|
}
|
|
@@ -448,11 +542,66 @@ let _ToolManager = class _ToolManager {
|
|
|
448
542
|
async getMcpTools() {
|
|
449
543
|
return await this.mcpManager.getAllTools();
|
|
450
544
|
}
|
|
545
|
+
buildToolExecutionContext(options) {
|
|
546
|
+
const workspace = this.currentWorkspace;
|
|
547
|
+
const baseContext = {
|
|
548
|
+
sessionId: options.sessionId,
|
|
549
|
+
workspaceId: workspace?.id,
|
|
550
|
+
workspace,
|
|
551
|
+
abortSignal: options.abortSignal,
|
|
552
|
+
toolCallId: options.toolCallId,
|
|
553
|
+
logger: this.logger
|
|
554
|
+
};
|
|
555
|
+
return this.toolExecutionContextFactory(baseContext);
|
|
556
|
+
}
|
|
557
|
+
validateLocalToolArgsOrThrow(toolName, args) {
|
|
558
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
559
|
+
return args;
|
|
560
|
+
}
|
|
561
|
+
const tool = this.agentTools.get(toolName);
|
|
562
|
+
if (!tool) {
|
|
563
|
+
return args;
|
|
564
|
+
}
|
|
565
|
+
const validationResult = tool.inputSchema.safeParse(args);
|
|
566
|
+
if (!validationResult.success) {
|
|
567
|
+
this.logger.error(
|
|
568
|
+
`\u274C Invalid arguments for tool ${toolName}: ${validationResult.error.message}`
|
|
569
|
+
);
|
|
570
|
+
throw ToolError.validationFailed(
|
|
571
|
+
toolName,
|
|
572
|
+
`Invalid arguments: ${validationResult.error.message}`
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
const validated = validationResult.data;
|
|
576
|
+
if (typeof validated !== "object" || validated === null || Array.isArray(validated)) {
|
|
577
|
+
throw ToolError.validationFailed(toolName, "Invalid arguments: expected an object");
|
|
578
|
+
}
|
|
579
|
+
return validated;
|
|
580
|
+
}
|
|
581
|
+
async executeLocalTool(toolName, args, sessionId, abortSignal, toolCallId) {
|
|
582
|
+
const tool = this.agentTools.get(toolName);
|
|
583
|
+
if (!tool) {
|
|
584
|
+
this.logger.error(`\u274C No local tool found: ${toolName}`);
|
|
585
|
+
this.logger.debug(
|
|
586
|
+
`Available local tools: ${Array.from(this.agentTools.keys()).join(", ")}`
|
|
587
|
+
);
|
|
588
|
+
throw ToolError.notFound(toolName);
|
|
589
|
+
}
|
|
590
|
+
try {
|
|
591
|
+
const context = this.buildToolExecutionContext({ sessionId, abortSignal, toolCallId });
|
|
592
|
+
const result = await tool.execute(args, context);
|
|
593
|
+
return result;
|
|
594
|
+
} catch (error) {
|
|
595
|
+
this.logger.error(`\u274C Local tool execution failed: ${toolName}`, {
|
|
596
|
+
error: error instanceof Error ? error.message : String(error)
|
|
597
|
+
});
|
|
598
|
+
throw error;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
451
601
|
/**
|
|
452
|
-
* Build all tools from sources
|
|
453
|
-
* ALL tools get prefixed by their source - no exceptions
|
|
602
|
+
* Build all tools from sources.
|
|
454
603
|
*
|
|
455
|
-
* TODO: Rethink tool naming convention for more consistency
|
|
604
|
+
* TODO: Rethink MCP tool naming convention for more consistency.
|
|
456
605
|
* Current issue: MCP tools have dynamic naming based on conflicts:
|
|
457
606
|
* - No conflict: mcp--toolName
|
|
458
607
|
* - With conflict: mcp--serverName--toolName
|
|
@@ -465,8 +614,6 @@ let _ToolManager = class _ToolManager {
|
|
|
465
614
|
async buildAllTools() {
|
|
466
615
|
const allTools = {};
|
|
467
616
|
let mcpTools = {};
|
|
468
|
-
let internalTools = {};
|
|
469
|
-
let customTools = {};
|
|
470
617
|
try {
|
|
471
618
|
mcpTools = await this.mcpManager.getAllTools();
|
|
472
619
|
} catch (error) {
|
|
@@ -475,38 +622,13 @@ let _ToolManager = class _ToolManager {
|
|
|
475
622
|
);
|
|
476
623
|
mcpTools = {};
|
|
477
624
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
}
|
|
486
|
-
try {
|
|
487
|
-
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
488
|
-
} catch (error) {
|
|
489
|
-
this.logger.error(
|
|
490
|
-
`Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
|
|
491
|
-
);
|
|
492
|
-
customTools = {};
|
|
493
|
-
}
|
|
494
|
-
for (const [toolName, toolDef] of Object.entries(internalTools)) {
|
|
495
|
-
const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
|
|
496
|
-
allTools[qualifiedName] = {
|
|
497
|
-
...toolDef,
|
|
498
|
-
name: qualifiedName,
|
|
499
|
-
description: `${toolDef.description || "No description provided"} (internal tool)`,
|
|
500
|
-
parameters: wrapToolParametersSchema(toolDef.parameters)
|
|
501
|
-
};
|
|
502
|
-
}
|
|
503
|
-
for (const [toolName, toolDef] of Object.entries(customTools)) {
|
|
504
|
-
const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
|
|
505
|
-
allTools[qualifiedName] = {
|
|
506
|
-
...toolDef,
|
|
507
|
-
name: qualifiedName,
|
|
508
|
-
description: `${toolDef.description || "No description provided"} (custom tool)`,
|
|
509
|
-
parameters: wrapToolParametersSchema(toolDef.parameters)
|
|
625
|
+
for (const [toolName, tool] of this.agentTools) {
|
|
626
|
+
allTools[toolName] = {
|
|
627
|
+
name: toolName,
|
|
628
|
+
description: tool.description || "No description provided",
|
|
629
|
+
parameters: wrapToolParametersSchema(
|
|
630
|
+
convertZodSchemaToJsonSchema(tool.inputSchema, this.logger)
|
|
631
|
+
)
|
|
510
632
|
};
|
|
511
633
|
}
|
|
512
634
|
for (const [toolName, toolDef] of Object.entries(mcpTools)) {
|
|
@@ -520,10 +642,9 @@ let _ToolManager = class _ToolManager {
|
|
|
520
642
|
}
|
|
521
643
|
const totalTools = Object.keys(allTools).length;
|
|
522
644
|
const mcpCount = Object.keys(mcpTools).length;
|
|
523
|
-
const
|
|
524
|
-
const customCount = Object.keys(customTools).length;
|
|
645
|
+
const localCount = this.agentTools.size;
|
|
525
646
|
this.logger.debug(
|
|
526
|
-
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${
|
|
647
|
+
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${localCount} local)`
|
|
527
648
|
);
|
|
528
649
|
return allTools;
|
|
529
650
|
}
|
|
@@ -541,10 +662,11 @@ let _ToolManager = class _ToolManager {
|
|
|
541
662
|
return this.toolsCache;
|
|
542
663
|
}
|
|
543
664
|
/**
|
|
544
|
-
* Execute a tool by routing based on
|
|
545
|
-
*
|
|
665
|
+
* Execute a tool by routing based on prefix:
|
|
666
|
+
* - MCP tools: `mcp--...`
|
|
667
|
+
* - Local tools: `Tool.id`
|
|
546
668
|
*
|
|
547
|
-
* @param toolName
|
|
669
|
+
* @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
|
|
548
670
|
* @param args The arguments for the tool
|
|
549
671
|
* @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
|
|
550
672
|
* @param sessionId Optional session ID for context
|
|
@@ -554,23 +676,30 @@ let _ToolManager = class _ToolManager {
|
|
|
554
676
|
const { toolArgs: rawToolArgs, meta } = extractToolCallMeta(args);
|
|
555
677
|
let toolArgs = rawToolArgs;
|
|
556
678
|
const backgroundTasksEnabled = isBackgroundTasksEnabled();
|
|
679
|
+
const toolDisplayName = this.agentTools.get(toolName)?.displayName;
|
|
557
680
|
this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
|
|
558
681
|
this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
|
|
559
682
|
if (sessionId) {
|
|
560
683
|
this.agentEventBus.emit("llm:tool-call", {
|
|
561
684
|
toolName,
|
|
685
|
+
...toolDisplayName !== void 0 && { toolDisplayName },
|
|
562
686
|
args: toolArgs,
|
|
563
687
|
callId: toolCallId,
|
|
564
688
|
sessionId
|
|
565
689
|
});
|
|
566
690
|
}
|
|
567
|
-
const {
|
|
691
|
+
const {
|
|
692
|
+
requireApproval,
|
|
693
|
+
approvalStatus,
|
|
694
|
+
args: validatedToolArgs
|
|
695
|
+
} = await this.handleToolApproval(
|
|
568
696
|
toolName,
|
|
569
697
|
toolArgs,
|
|
570
698
|
toolCallId,
|
|
571
699
|
sessionId,
|
|
572
700
|
meta.callDescription
|
|
573
701
|
);
|
|
702
|
+
toolArgs = validatedToolArgs;
|
|
574
703
|
this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
|
|
575
704
|
this.logger.info(
|
|
576
705
|
`\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
@@ -583,13 +712,13 @@ let _ToolManager = class _ToolManager {
|
|
|
583
712
|
});
|
|
584
713
|
}
|
|
585
714
|
const startTime = Date.now();
|
|
586
|
-
if (this.
|
|
715
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
587
716
|
const beforePayload = {
|
|
588
717
|
toolName,
|
|
589
718
|
args: toolArgs,
|
|
590
719
|
...sessionId !== void 0 && { sessionId }
|
|
591
720
|
};
|
|
592
|
-
const modifiedPayload = await this.
|
|
721
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
593
722
|
"beforeToolCall",
|
|
594
723
|
beforePayload,
|
|
595
724
|
{
|
|
@@ -601,6 +730,14 @@ let _ToolManager = class _ToolManager {
|
|
|
601
730
|
}
|
|
602
731
|
);
|
|
603
732
|
toolArgs = modifiedPayload.args;
|
|
733
|
+
try {
|
|
734
|
+
toolArgs = this.validateLocalToolArgsOrThrow(toolName, toolArgs);
|
|
735
|
+
} catch (error) {
|
|
736
|
+
this.logger.error(
|
|
737
|
+
`Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
|
|
738
|
+
);
|
|
739
|
+
throw error;
|
|
740
|
+
}
|
|
604
741
|
}
|
|
605
742
|
try {
|
|
606
743
|
let result;
|
|
@@ -650,16 +787,7 @@ let _ToolManager = class _ToolManager {
|
|
|
650
787
|
} else {
|
|
651
788
|
result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
|
|
652
789
|
}
|
|
653
|
-
} else
|
|
654
|
-
this.logger.debug(`\u{1F527} Detected internal tool: '${toolName}'`);
|
|
655
|
-
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
656
|
-
if (actualToolName.length === 0) {
|
|
657
|
-
throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
658
|
-
}
|
|
659
|
-
if (!this.internalToolsProvider) {
|
|
660
|
-
throw ToolError.internalToolsNotInitialized(toolName);
|
|
661
|
-
}
|
|
662
|
-
this.logger.debug(`\u{1F3AF} Internal routing: '${toolName}' -> '${actualToolName}'`);
|
|
790
|
+
} else {
|
|
663
791
|
const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
|
|
664
792
|
if (meta.runInBackground === true && !backgroundTasksEnabled) {
|
|
665
793
|
this.logger.debug(
|
|
@@ -670,14 +798,14 @@ let _ToolManager = class _ToolManager {
|
|
|
670
798
|
if (runInBackground) {
|
|
671
799
|
const backgroundSessionId = sessionId;
|
|
672
800
|
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
673
|
-
this.
|
|
674
|
-
|
|
801
|
+
this.executeLocalTool(
|
|
802
|
+
toolName,
|
|
675
803
|
toolArgs,
|
|
676
804
|
backgroundSessionId,
|
|
677
805
|
abortSignal,
|
|
678
806
|
toolCallId
|
|
679
807
|
),
|
|
680
|
-
`
|
|
808
|
+
`Tool ${toolName}`
|
|
681
809
|
);
|
|
682
810
|
this.agentEventBus.emit("tool:background", {
|
|
683
811
|
toolName,
|
|
@@ -692,88 +820,28 @@ let _ToolManager = class _ToolManager {
|
|
|
692
820
|
});
|
|
693
821
|
result = backgroundResult;
|
|
694
822
|
} else {
|
|
695
|
-
result = await this.
|
|
696
|
-
actualToolName,
|
|
697
|
-
toolArgs,
|
|
698
|
-
sessionId,
|
|
699
|
-
abortSignal,
|
|
700
|
-
toolCallId
|
|
701
|
-
);
|
|
702
|
-
}
|
|
703
|
-
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
704
|
-
this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
|
|
705
|
-
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
706
|
-
if (actualToolName.length === 0) {
|
|
707
|
-
throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
708
|
-
}
|
|
709
|
-
if (!this.internalToolsProvider) {
|
|
710
|
-
throw ToolError.internalToolsNotInitialized(toolName);
|
|
711
|
-
}
|
|
712
|
-
this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
|
|
713
|
-
const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
|
|
714
|
-
if (meta.runInBackground === true && !backgroundTasksEnabled) {
|
|
715
|
-
this.logger.debug(
|
|
716
|
-
"Background tool execution disabled; running synchronously instead.",
|
|
717
|
-
{ toolName }
|
|
718
|
-
);
|
|
719
|
-
}
|
|
720
|
-
if (runInBackground) {
|
|
721
|
-
const backgroundSessionId = sessionId;
|
|
722
|
-
const { result: backgroundResult, promise } = registerBackgroundTask(
|
|
723
|
-
this.internalToolsProvider.executeTool(
|
|
724
|
-
actualToolName,
|
|
725
|
-
toolArgs,
|
|
726
|
-
backgroundSessionId,
|
|
727
|
-
abortSignal,
|
|
728
|
-
toolCallId
|
|
729
|
-
),
|
|
730
|
-
`Custom tool ${actualToolName}`
|
|
731
|
-
);
|
|
732
|
-
this.agentEventBus.emit("tool:background", {
|
|
823
|
+
result = await this.executeLocalTool(
|
|
733
824
|
toolName,
|
|
734
|
-
toolCallId: backgroundResult.taskId,
|
|
735
|
-
sessionId: backgroundSessionId,
|
|
736
|
-
description: backgroundResult.description,
|
|
737
|
-
promise,
|
|
738
|
-
...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
|
|
739
|
-
...meta.notifyOnComplete !== void 0 && {
|
|
740
|
-
notifyOnComplete: meta.notifyOnComplete
|
|
741
|
-
}
|
|
742
|
-
});
|
|
743
|
-
result = backgroundResult;
|
|
744
|
-
} else {
|
|
745
|
-
result = await this.internalToolsProvider.executeTool(
|
|
746
|
-
actualToolName,
|
|
747
825
|
toolArgs,
|
|
748
826
|
sessionId,
|
|
749
827
|
abortSignal,
|
|
750
828
|
toolCallId
|
|
751
829
|
);
|
|
752
830
|
}
|
|
753
|
-
} else {
|
|
754
|
-
this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
|
|
755
|
-
const stats = await this.getToolStats();
|
|
756
|
-
this.logger.error(
|
|
757
|
-
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
|
|
758
|
-
);
|
|
759
|
-
this.logger.debug(
|
|
760
|
-
`Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
|
|
761
|
-
);
|
|
762
|
-
throw ToolError.notFound(toolName);
|
|
763
831
|
}
|
|
764
832
|
const duration = Date.now() - startTime;
|
|
765
833
|
this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
|
|
766
834
|
this.logger.info(
|
|
767
835
|
`\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
|
|
768
836
|
);
|
|
769
|
-
if (this.
|
|
837
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
770
838
|
const afterPayload = {
|
|
771
839
|
toolName,
|
|
772
840
|
result,
|
|
773
841
|
success: true,
|
|
774
842
|
...sessionId !== void 0 && { sessionId }
|
|
775
843
|
};
|
|
776
|
-
const modifiedPayload = await this.
|
|
844
|
+
const modifiedPayload = await this.hookManager.executeHooks(
|
|
777
845
|
"afterToolResult",
|
|
778
846
|
afterPayload,
|
|
779
847
|
{
|
|
@@ -788,6 +856,7 @@ let _ToolManager = class _ToolManager {
|
|
|
788
856
|
}
|
|
789
857
|
return {
|
|
790
858
|
result,
|
|
859
|
+
...toolDisplayName !== void 0 && { toolDisplayName },
|
|
791
860
|
...requireApproval && { requireApproval, approvalStatus }
|
|
792
861
|
};
|
|
793
862
|
} catch (error) {
|
|
@@ -795,14 +864,14 @@ let _ToolManager = class _ToolManager {
|
|
|
795
864
|
this.logger.error(
|
|
796
865
|
`\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
|
|
797
866
|
);
|
|
798
|
-
if (this.
|
|
867
|
+
if (this.hookManager && this.sessionManager && this.stateManager) {
|
|
799
868
|
const afterPayload = {
|
|
800
869
|
toolName,
|
|
801
870
|
result: error instanceof Error ? error.message : String(error),
|
|
802
871
|
success: false,
|
|
803
872
|
...sessionId !== void 0 && { sessionId }
|
|
804
873
|
};
|
|
805
|
-
await this.
|
|
874
|
+
await this.hookManager.executeHooks("afterToolResult", afterPayload, {
|
|
806
875
|
sessionManager: this.sessionManager,
|
|
807
876
|
mcpManager: this.mcpManager,
|
|
808
877
|
toolManager: this,
|
|
@@ -814,30 +883,20 @@ let _ToolManager = class _ToolManager {
|
|
|
814
883
|
}
|
|
815
884
|
}
|
|
816
885
|
/**
|
|
817
|
-
* Check if a tool exists
|
|
886
|
+
* Check if a tool exists.
|
|
818
887
|
*/
|
|
819
888
|
async hasTool(toolName) {
|
|
820
889
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
821
890
|
const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
|
|
822
891
|
return this.mcpManager.getToolClient(actualToolName) !== void 0;
|
|
823
892
|
}
|
|
824
|
-
|
|
825
|
-
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
826
|
-
return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
|
|
827
|
-
}
|
|
828
|
-
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
829
|
-
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
830
|
-
return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
|
|
831
|
-
}
|
|
832
|
-
return false;
|
|
893
|
+
return this.agentTools.has(toolName);
|
|
833
894
|
}
|
|
834
895
|
/**
|
|
835
896
|
* Get tool statistics across all sources
|
|
836
897
|
*/
|
|
837
898
|
async getToolStats() {
|
|
838
899
|
let mcpTools = {};
|
|
839
|
-
let internalTools = {};
|
|
840
|
-
let customTools = {};
|
|
841
900
|
try {
|
|
842
901
|
mcpTools = await this.mcpManager.getAllTools();
|
|
843
902
|
} catch (error) {
|
|
@@ -846,34 +905,16 @@ let _ToolManager = class _ToolManager {
|
|
|
846
905
|
);
|
|
847
906
|
mcpTools = {};
|
|
848
907
|
}
|
|
849
|
-
try {
|
|
850
|
-
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
851
|
-
} catch (error) {
|
|
852
|
-
this.logger.error(
|
|
853
|
-
`Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
854
|
-
);
|
|
855
|
-
internalTools = {};
|
|
856
|
-
}
|
|
857
|
-
try {
|
|
858
|
-
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
859
|
-
} catch (error) {
|
|
860
|
-
this.logger.error(
|
|
861
|
-
`Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
862
|
-
);
|
|
863
|
-
customTools = {};
|
|
864
|
-
}
|
|
865
908
|
const mcpCount = Object.keys(mcpTools).length;
|
|
866
|
-
const
|
|
867
|
-
const customCount = Object.keys(customTools).length;
|
|
909
|
+
const localCount = this.agentTools.size;
|
|
868
910
|
return {
|
|
869
|
-
total: mcpCount +
|
|
911
|
+
total: mcpCount + localCount,
|
|
870
912
|
mcp: mcpCount,
|
|
871
|
-
|
|
872
|
-
custom: customCount
|
|
913
|
+
local: localCount
|
|
873
914
|
};
|
|
874
915
|
}
|
|
875
916
|
/**
|
|
876
|
-
* Get the source of a tool (mcp,
|
|
917
|
+
* Get the source of a tool (mcp, local, or unknown).
|
|
877
918
|
* @param toolName The name of the tool to check
|
|
878
919
|
* @returns The source of the tool
|
|
879
920
|
*/
|
|
@@ -881,11 +922,8 @@ let _ToolManager = class _ToolManager {
|
|
|
881
922
|
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
|
|
882
923
|
return "mcp";
|
|
883
924
|
}
|
|
884
|
-
if (
|
|
885
|
-
return "
|
|
886
|
-
}
|
|
887
|
-
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
|
|
888
|
-
return "custom";
|
|
925
|
+
if (this.agentTools.has(toolName)) {
|
|
926
|
+
return "local";
|
|
889
927
|
}
|
|
890
928
|
return "unknown";
|
|
891
929
|
}
|
|
@@ -896,7 +934,7 @@ let _ToolManager = class _ToolManager {
|
|
|
896
934
|
* Examples:
|
|
897
935
|
* - Policy "mcp--read_file" matches "mcp--read_file" (exact)
|
|
898
936
|
* - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
|
|
899
|
-
* - Policy "
|
|
937
|
+
* - Policy "read_file" matches "read_file" (local tool exact only)
|
|
900
938
|
*
|
|
901
939
|
* @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
|
|
902
940
|
* @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
|
|
@@ -947,26 +985,21 @@ let _ToolManager = class _ToolManager {
|
|
|
947
985
|
* Tools can implement getApprovalOverride() to request specialized approval flows
|
|
948
986
|
* (e.g., directory access approval for file tools) instead of default tool confirmation.
|
|
949
987
|
*
|
|
950
|
-
* @param toolName
|
|
988
|
+
* @param toolName Tool name
|
|
951
989
|
* @param args The tool arguments
|
|
952
990
|
* @param sessionId Optional session ID
|
|
953
991
|
* @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
|
|
954
992
|
*/
|
|
955
|
-
async checkCustomApprovalOverride(toolName, args, sessionId) {
|
|
956
|
-
|
|
957
|
-
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
958
|
-
actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
959
|
-
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
960
|
-
actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
961
|
-
}
|
|
962
|
-
if (!actualToolName || !this.internalToolsProvider) {
|
|
993
|
+
async checkCustomApprovalOverride(toolName, args, toolCallId, sessionId) {
|
|
994
|
+
if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
|
|
963
995
|
return { handled: false };
|
|
964
996
|
}
|
|
965
|
-
const tool = this.
|
|
997
|
+
const tool = this.agentTools.get(toolName);
|
|
966
998
|
if (!tool?.getApprovalOverride) {
|
|
967
999
|
return { handled: false };
|
|
968
1000
|
}
|
|
969
|
-
const
|
|
1001
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1002
|
+
const approvalRequest = await tool.getApprovalOverride(args, context);
|
|
970
1003
|
if (!approvalRequest) {
|
|
971
1004
|
return { handled: false };
|
|
972
1005
|
}
|
|
@@ -979,7 +1012,23 @@ let _ToolManager = class _ToolManager {
|
|
|
979
1012
|
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
980
1013
|
if (response.status === ApprovalStatus.APPROVED) {
|
|
981
1014
|
if (tool.onApprovalGranted) {
|
|
982
|
-
tool.onApprovalGranted(response);
|
|
1015
|
+
tool.onApprovalGranted(response, context, approvalRequest);
|
|
1016
|
+
}
|
|
1017
|
+
if (approvalRequest.type === ApprovalType.DIRECTORY_ACCESS) {
|
|
1018
|
+
const metadata = approvalRequest.metadata;
|
|
1019
|
+
const parentDir = typeof metadata?.parentDir === "string" ? metadata.parentDir : null;
|
|
1020
|
+
const operation = typeof metadata?.operation === "string" ? metadata.operation : null;
|
|
1021
|
+
if (parentDir && operation) {
|
|
1022
|
+
const data = response.data;
|
|
1023
|
+
const rememberDirectory = data?.rememberDirectory ?? false;
|
|
1024
|
+
this.autoApprovePendingDirectoryAccessRequests({
|
|
1025
|
+
parentDir,
|
|
1026
|
+
operation,
|
|
1027
|
+
sessionId,
|
|
1028
|
+
toolName,
|
|
1029
|
+
rememberDirectory
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
983
1032
|
}
|
|
984
1033
|
this.logger.info(
|
|
985
1034
|
`Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
|
|
@@ -1003,11 +1052,24 @@ let _ToolManager = class _ToolManager {
|
|
|
1003
1052
|
* if a tool should be auto-approved, denied, or requires manual approval.
|
|
1004
1053
|
*/
|
|
1005
1054
|
async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
1006
|
-
const
|
|
1055
|
+
const validatedArgs = this.validateLocalToolArgsOrThrow(toolName, args);
|
|
1056
|
+
const quickResult = await this.tryQuickApprovalResolution(
|
|
1057
|
+
toolName,
|
|
1058
|
+
validatedArgs,
|
|
1059
|
+
toolCallId,
|
|
1060
|
+
sessionId
|
|
1061
|
+
);
|
|
1007
1062
|
if (quickResult !== null) {
|
|
1008
|
-
return quickResult;
|
|
1063
|
+
return { ...quickResult, args: validatedArgs };
|
|
1009
1064
|
}
|
|
1010
|
-
|
|
1065
|
+
const manualResult = await this.requestManualApproval(
|
|
1066
|
+
toolName,
|
|
1067
|
+
validatedArgs,
|
|
1068
|
+
toolCallId,
|
|
1069
|
+
sessionId,
|
|
1070
|
+
callDescription
|
|
1071
|
+
);
|
|
1072
|
+
return { ...manualResult, args: validatedArgs };
|
|
1011
1073
|
}
|
|
1012
1074
|
/**
|
|
1013
1075
|
* Try to resolve tool approval quickly based on policies and cached permissions.
|
|
@@ -1019,10 +1081,10 @@ let _ToolManager = class _ToolManager {
|
|
|
1019
1081
|
* 3. Session auto-approve (skill allowed-tools)
|
|
1020
1082
|
* 4. Static allow list
|
|
1021
1083
|
* 5. Dynamic "remembered" allowed list
|
|
1022
|
-
* 6.
|
|
1084
|
+
* 6. Tool approval patterns
|
|
1023
1085
|
* 7. Approval mode (auto-approve/auto-deny)
|
|
1024
1086
|
*/
|
|
1025
|
-
async tryQuickApprovalResolution(toolName, args, sessionId) {
|
|
1087
|
+
async tryQuickApprovalResolution(toolName, args, toolCallId, sessionId) {
|
|
1026
1088
|
if (this.isInAlwaysDenyList(toolName)) {
|
|
1027
1089
|
this.logger.info(
|
|
1028
1090
|
`Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
|
|
@@ -1032,6 +1094,7 @@ let _ToolManager = class _ToolManager {
|
|
|
1032
1094
|
const customApprovalResult = await this.checkCustomApprovalOverride(
|
|
1033
1095
|
toolName,
|
|
1034
1096
|
args,
|
|
1097
|
+
toolCallId,
|
|
1035
1098
|
sessionId
|
|
1036
1099
|
);
|
|
1037
1100
|
if (customApprovalResult.handled) {
|
|
@@ -1055,17 +1118,12 @@ let _ToolManager = class _ToolManager {
|
|
|
1055
1118
|
);
|
|
1056
1119
|
return { requireApproval: false };
|
|
1057
1120
|
}
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
`Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
|
|
1065
|
-
);
|
|
1066
|
-
return { requireApproval: false };
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1121
|
+
const patternKey = this.getToolPatternKey(toolName, args);
|
|
1122
|
+
if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey)) {
|
|
1123
|
+
this.logger.info(
|
|
1124
|
+
`Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
|
|
1125
|
+
);
|
|
1126
|
+
return { requireApproval: false };
|
|
1069
1127
|
}
|
|
1070
1128
|
if (this.approvalMode === "auto-approve") {
|
|
1071
1129
|
this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
|
|
@@ -1083,18 +1141,20 @@ let _ToolManager = class _ToolManager {
|
|
|
1083
1141
|
*/
|
|
1084
1142
|
async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
|
|
1085
1143
|
this.logger.info(
|
|
1086
|
-
`Tool
|
|
1144
|
+
`Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1087
1145
|
);
|
|
1088
1146
|
try {
|
|
1147
|
+
const toolDisplayName = this.agentTools.get(toolName)?.displayName;
|
|
1089
1148
|
const displayPreview = await this.generateToolPreview(
|
|
1090
1149
|
toolName,
|
|
1091
1150
|
args,
|
|
1092
1151
|
toolCallId,
|
|
1093
1152
|
sessionId
|
|
1094
1153
|
);
|
|
1095
|
-
const suggestedPatterns = this.
|
|
1096
|
-
const response = await this.approvalManager.
|
|
1154
|
+
const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
|
|
1155
|
+
const response = await this.approvalManager.requestToolApproval({
|
|
1097
1156
|
toolName,
|
|
1157
|
+
...toolDisplayName !== void 0 && { toolDisplayName },
|
|
1098
1158
|
toolCallId,
|
|
1099
1159
|
args,
|
|
1100
1160
|
...callDescription !== void 0 && { description: callDescription },
|
|
@@ -1109,12 +1169,12 @@ let _ToolManager = class _ToolManager {
|
|
|
1109
1169
|
this.handleApprovalDenied(toolName, response, sessionId);
|
|
1110
1170
|
}
|
|
1111
1171
|
this.logger.info(
|
|
1112
|
-
`Tool
|
|
1172
|
+
`Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
|
|
1113
1173
|
);
|
|
1114
1174
|
return { requireApproval: true, approvalStatus: "approved" };
|
|
1115
1175
|
} catch (error) {
|
|
1116
1176
|
this.logger.error(
|
|
1117
|
-
`Tool
|
|
1177
|
+
`Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
|
|
1118
1178
|
);
|
|
1119
1179
|
throw error;
|
|
1120
1180
|
}
|
|
@@ -1123,14 +1183,13 @@ let _ToolManager = class _ToolManager {
|
|
|
1123
1183
|
* Generate a preview for the tool approval UI if the tool supports it.
|
|
1124
1184
|
*/
|
|
1125
1185
|
async generateToolPreview(toolName, args, toolCallId, sessionId) {
|
|
1126
|
-
const
|
|
1127
|
-
|
|
1128
|
-
if (!internalTool?.generatePreview) {
|
|
1186
|
+
const tool = this.agentTools.get(toolName);
|
|
1187
|
+
if (!tool?.generatePreview) {
|
|
1129
1188
|
return void 0;
|
|
1130
1189
|
}
|
|
1131
1190
|
try {
|
|
1132
|
-
const context = { sessionId, toolCallId };
|
|
1133
|
-
const preview = await
|
|
1191
|
+
const context = this.buildToolExecutionContext({ sessionId, toolCallId });
|
|
1192
|
+
const preview = await tool.generatePreview(args, context);
|
|
1134
1193
|
this.logger.debug(`Generated preview for ${toolName}`);
|
|
1135
1194
|
return preview ?? void 0;
|
|
1136
1195
|
} catch (previewError) {
|
|
@@ -1144,20 +1203,6 @@ let _ToolManager = class _ToolManager {
|
|
|
1144
1203
|
return void 0;
|
|
1145
1204
|
}
|
|
1146
1205
|
}
|
|
1147
|
-
/**
|
|
1148
|
-
* Get suggested bash patterns for the approval UI.
|
|
1149
|
-
*/
|
|
1150
|
-
getBashSuggestedPatterns(toolName, args) {
|
|
1151
|
-
if (!this.isBashTool(toolName)) {
|
|
1152
|
-
return void 0;
|
|
1153
|
-
}
|
|
1154
|
-
const command = args.command;
|
|
1155
|
-
if (!command) {
|
|
1156
|
-
return void 0;
|
|
1157
|
-
}
|
|
1158
|
-
const result = this.checkBashPatternApproval(command);
|
|
1159
|
-
return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
|
|
1160
|
-
}
|
|
1161
1206
|
/**
|
|
1162
1207
|
* Handle "remember choice" or "remember pattern" when user approves a tool.
|
|
1163
1208
|
*/
|
|
@@ -1173,10 +1218,10 @@ let _ToolManager = class _ToolManager {
|
|
|
1173
1218
|
`Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
|
|
1174
1219
|
);
|
|
1175
1220
|
this.autoApprovePendingToolRequests(toolName, allowSessionId);
|
|
1176
|
-
} else if (rememberPattern && this.
|
|
1177
|
-
this.approvalManager.
|
|
1178
|
-
this.logger.info(`
|
|
1179
|
-
this.
|
|
1221
|
+
} else if (rememberPattern && this.agentTools.get(toolName)?.getApprovalPatternKey) {
|
|
1222
|
+
this.approvalManager.addPattern(toolName, rememberPattern);
|
|
1223
|
+
this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
|
|
1224
|
+
this.autoApprovePendingPatternRequests(toolName, sessionId);
|
|
1180
1225
|
}
|
|
1181
1226
|
}
|
|
1182
1227
|
/**
|