@dexto/core 1.4.0 → 1.5.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 +36 -0
- package/dist/agent/DextoAgent.cjs +22 -3
- package/dist/agent/DextoAgent.d.ts +19 -2
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +23 -4
- package/dist/agent/index.cjs +4 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +5 -1
- package/dist/agent/schemas.cjs +90 -71
- package/dist/agent/schemas.d.ts +5959 -96
- package/dist/agent/schemas.d.ts.map +1 -1
- package/dist/agent/schemas.js +87 -66
- package/dist/approval/manager.cjs +165 -1
- package/dist/approval/manager.d.ts +91 -2
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +155 -1
- package/dist/approval/schemas.cjs +39 -3
- package/dist/approval/schemas.d.ts +238 -1
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +35 -3
- package/dist/approval/types.cjs +1 -0
- package/dist/approval/types.d.ts +26 -1
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/approval/types.js +1 -0
- package/dist/context/compaction/factory.cjs +57 -0
- package/dist/context/compaction/factory.d.ts +17 -0
- package/dist/context/compaction/factory.d.ts.map +1 -0
- package/dist/context/compaction/factory.js +34 -0
- package/dist/context/compaction/index.cjs +49 -0
- package/dist/context/compaction/index.d.ts +11 -0
- package/dist/context/compaction/index.d.ts.map +1 -0
- package/dist/context/compaction/index.js +19 -0
- package/dist/context/{compression → compaction}/overflow.cjs +3 -3
- package/dist/context/{compression → compaction}/overflow.d.ts +4 -4
- package/dist/context/compaction/overflow.d.ts.map +1 -0
- package/dist/context/{compression → compaction}/overflow.js +2 -2
- package/dist/context/compaction/provider.cjs +16 -0
- package/dist/context/compaction/provider.d.ts +48 -0
- package/dist/context/compaction/provider.d.ts.map +1 -0
- package/dist/context/compaction/providers/noop-provider.cjs +48 -0
- package/dist/context/compaction/providers/noop-provider.d.ts +24 -0
- package/dist/context/compaction/providers/noop-provider.d.ts.map +1 -0
- package/dist/context/compaction/providers/noop-provider.js +24 -0
- package/dist/context/compaction/providers/reactive-overflow-provider.cjs +61 -0
- package/dist/context/compaction/providers/reactive-overflow-provider.d.ts +36 -0
- package/dist/context/compaction/providers/reactive-overflow-provider.d.ts.map +1 -0
- package/dist/context/compaction/providers/reactive-overflow-provider.js +37 -0
- package/dist/context/compaction/registry.cjs +39 -0
- package/dist/context/compaction/registry.d.ts +19 -0
- package/dist/context/compaction/registry.d.ts.map +1 -0
- package/dist/context/compaction/registry.js +16 -0
- package/dist/context/compaction/schemas.cjs +38 -0
- package/dist/context/compaction/schemas.d.ts +24 -0
- package/dist/context/compaction/schemas.d.ts.map +1 -0
- package/dist/context/compaction/schemas.js +14 -0
- package/dist/context/compaction/strategies/noop.cjs +36 -0
- package/dist/context/compaction/strategies/noop.d.ts +18 -0
- package/dist/context/compaction/strategies/noop.d.ts.map +1 -0
- package/dist/context/compaction/strategies/noop.js +13 -0
- package/dist/context/{compression → compaction/strategies}/reactive-overflow.cjs +3 -3
- package/dist/context/{compression → compaction/strategies}/reactive-overflow.d.ts +6 -6
- package/dist/context/compaction/strategies/reactive-overflow.d.ts.map +1 -0
- package/dist/context/{compression → compaction/strategies}/reactive-overflow.js +4 -4
- package/dist/context/{compression → compaction}/types.d.ts +4 -4
- package/dist/context/compaction/types.d.ts.map +1 -0
- package/dist/context/compaction/types.js +0 -0
- package/dist/context/error-codes.cjs +4 -0
- package/dist/context/error-codes.d.ts +4 -0
- package/dist/context/error-codes.d.ts.map +1 -1
- package/dist/context/error-codes.js +4 -0
- package/dist/context/errors.cjs +40 -0
- package/dist/context/errors.d.ts +14 -0
- package/dist/context/errors.d.ts.map +1 -1
- package/dist/context/errors.js +40 -0
- package/dist/context/index.cjs +3 -1
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -0
- package/dist/context/types.d.ts +6 -0
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/utils.cjs +27 -7
- package/dist/context/utils.d.ts.map +1 -1
- package/dist/context/utils.js +27 -7
- package/dist/errors/result-bridge.cjs +2 -3
- package/dist/errors/result-bridge.d.ts.map +1 -1
- package/dist/errors/result-bridge.js +2 -3
- package/dist/events/index.cjs +6 -3
- package/dist/events/index.d.ts +35 -19
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +5 -3
- package/dist/filesystem/filesystem-service.cjs +39 -0
- package/dist/filesystem/filesystem-service.d.ts +32 -0
- package/dist/filesystem/filesystem-service.d.ts.map +1 -1
- package/dist/filesystem/filesystem-service.js +39 -0
- package/dist/filesystem/index.d.ts +1 -1
- package/dist/filesystem/index.d.ts.map +1 -1
- package/dist/filesystem/path-validator.cjs +69 -1
- package/dist/filesystem/path-validator.d.ts +43 -2
- package/dist/filesystem/path-validator.d.ts.map +1 -1
- package/dist/filesystem/path-validator.js +69 -1
- package/dist/image/define-image.cjs +146 -0
- package/dist/image/define-image.d.ts +71 -0
- package/dist/image/define-image.d.ts.map +1 -0
- package/dist/image/define-image.js +121 -0
- package/dist/image/index.cjs +32 -0
- package/dist/image/index.d.ts +53 -0
- package/dist/image/index.d.ts.map +1 -0
- package/dist/image/index.js +7 -0
- package/dist/image/types.cjs +16 -0
- package/dist/image/types.d.ts +231 -0
- package/dist/image/types.d.ts.map +1 -0
- package/dist/image/types.js +0 -0
- package/dist/index.cjs +5 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/llm/error-codes.cjs +1 -0
- package/dist/llm/error-codes.d.ts +1 -0
- package/dist/llm/error-codes.d.ts.map +1 -1
- package/dist/llm/error-codes.js +1 -0
- package/dist/llm/errors.cjs +24 -0
- package/dist/llm/errors.d.ts +19 -6
- package/dist/llm/errors.d.ts.map +1 -1
- package/dist/llm/errors.js +24 -0
- package/dist/llm/executor/provider-options.cjs +87 -0
- package/dist/llm/executor/provider-options.d.ts +49 -0
- package/dist/llm/executor/provider-options.d.ts.map +1 -0
- package/dist/llm/executor/provider-options.js +63 -0
- package/dist/llm/executor/stream-processor.cjs +22 -11
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +22 -11
- package/dist/llm/executor/turn-executor.cjs +60 -23
- package/dist/llm/executor/turn-executor.d.ts +7 -5
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +60 -23
- package/dist/llm/formatters/vercel.cjs +15 -3
- package/dist/llm/formatters/vercel.d.ts.map +1 -1
- package/dist/llm/formatters/vercel.js +15 -3
- package/dist/llm/index.cjs +18 -1
- package/dist/llm/index.d.ts +2 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +14 -0
- package/dist/llm/providers/local/ai-sdk-adapter.cjs +308 -0
- package/dist/llm/providers/local/ai-sdk-adapter.d.ts +29 -0
- package/dist/llm/providers/local/ai-sdk-adapter.d.ts.map +1 -0
- package/dist/llm/providers/local/ai-sdk-adapter.js +278 -0
- package/dist/llm/providers/local/downloader.cjs +291 -0
- package/dist/llm/providers/local/downloader.d.ts +82 -0
- package/dist/llm/providers/local/downloader.d.ts.map +1 -0
- package/dist/llm/providers/local/downloader.js +251 -0
- package/dist/llm/providers/local/error-codes.cjs +57 -0
- package/dist/llm/providers/local/error-codes.d.ts +66 -0
- package/dist/llm/providers/local/error-codes.d.ts.map +1 -0
- package/dist/llm/providers/local/error-codes.js +34 -0
- package/dist/llm/providers/local/errors.cjs +240 -0
- package/dist/llm/providers/local/errors.d.ts +31 -0
- package/dist/llm/providers/local/errors.d.ts.map +1 -0
- package/dist/llm/providers/local/errors.js +217 -0
- package/dist/llm/providers/local/gpu-detector.cjs +214 -0
- package/dist/llm/providers/local/gpu-detector.d.ts +28 -0
- package/dist/llm/providers/local/gpu-detector.d.ts.map +1 -0
- package/dist/llm/providers/local/gpu-detector.js +178 -0
- package/dist/llm/providers/local/index.cjs +147 -0
- package/dist/llm/providers/local/index.d.ts +21 -0
- package/dist/llm/providers/local/index.d.ts.map +1 -0
- package/dist/llm/providers/local/index.js +126 -0
- package/dist/llm/providers/local/node-llama-provider.cjs +216 -0
- package/dist/llm/providers/local/node-llama-provider.d.ts +90 -0
- package/dist/llm/providers/local/node-llama-provider.d.ts.map +1 -0
- package/dist/llm/providers/local/node-llama-provider.js +176 -0
- package/dist/llm/providers/local/ollama-provider.cjs +230 -0
- package/dist/llm/providers/local/ollama-provider.d.ts +70 -0
- package/dist/llm/providers/local/ollama-provider.d.ts.map +1 -0
- package/dist/llm/providers/local/ollama-provider.js +198 -0
- package/dist/llm/providers/local/registry.cjs +343 -0
- package/dist/llm/providers/local/registry.d.ts +51 -0
- package/dist/llm/providers/local/registry.d.ts.map +1 -0
- package/dist/llm/providers/local/registry.js +312 -0
- package/dist/llm/providers/local/schemas.cjs +169 -0
- package/dist/llm/providers/local/schemas.d.ts +395 -0
- package/dist/llm/providers/local/schemas.d.ts.map +1 -0
- package/dist/llm/providers/local/schemas.js +133 -0
- package/dist/llm/providers/local/types.cjs +16 -0
- package/dist/llm/providers/local/types.d.ts +219 -0
- package/dist/llm/providers/local/types.d.ts.map +1 -0
- package/dist/llm/providers/local/types.js +0 -0
- package/dist/llm/providers/openrouter-model-registry.cjs +350 -0
- package/dist/llm/providers/openrouter-model-registry.d.ts +120 -0
- package/dist/llm/providers/openrouter-model-registry.d.ts.map +1 -0
- package/dist/llm/providers/openrouter-model-registry.js +309 -0
- package/dist/llm/registry.cjs +604 -9
- package/dist/llm/registry.d.ts +35 -0
- package/dist/llm/registry.d.ts.map +1 -1
- package/dist/llm/registry.js +600 -9
- package/dist/llm/resolver.cjs +63 -5
- package/dist/llm/resolver.d.ts +3 -3
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/resolver.js +69 -6
- package/dist/llm/schemas.cjs +107 -81
- package/dist/llm/schemas.d.ts +181 -22
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +107 -81
- package/dist/llm/services/factory.cjs +87 -13
- package/dist/llm/services/factory.d.ts +4 -1
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +85 -12
- package/dist/llm/services/test-utils.integration.cjs +22 -2
- package/dist/llm/services/test-utils.integration.d.ts +7 -1
- package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
- package/dist/llm/services/test-utils.integration.js +26 -3
- package/dist/llm/services/vercel.cjs +8 -3
- package/dist/llm/services/vercel.d.ts +3 -2
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +8 -3
- package/dist/llm/types.cjs +11 -1
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +11 -1
- package/dist/logger/logger.cjs +7 -3
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +7 -3
- package/dist/mcp/manager.cjs +8 -0
- package/dist/mcp/manager.d.ts +17 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +8 -0
- package/dist/mcp/mcp-client.cjs +0 -3
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +0 -3
- package/dist/memory/schemas.d.ts +3 -3
- package/dist/plugins/error-codes.cjs +3 -0
- package/dist/plugins/error-codes.d.ts +7 -1
- package/dist/plugins/error-codes.d.ts.map +1 -1
- package/dist/plugins/error-codes.js +3 -0
- package/dist/plugins/index.cjs +7 -0
- package/dist/plugins/index.d.ts +4 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +6 -1
- package/dist/plugins/manager.cjs +92 -7
- package/dist/plugins/manager.d.ts +10 -3
- package/dist/plugins/manager.d.ts.map +1 -1
- package/dist/plugins/manager.js +92 -7
- package/dist/plugins/registry.cjs +63 -0
- package/dist/plugins/registry.d.ts +101 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +39 -0
- package/dist/plugins/schemas.cjs +17 -5
- package/dist/plugins/schemas.d.ts +62 -5
- package/dist/plugins/schemas.d.ts.map +1 -1
- package/dist/plugins/schemas.js +15 -4
- package/dist/providers/base-registry.cjs +147 -0
- package/dist/providers/base-registry.d.ts +147 -0
- package/dist/providers/base-registry.d.ts.map +1 -0
- package/dist/providers/base-registry.js +123 -0
- package/dist/providers/discovery.cjs +109 -0
- package/dist/providers/discovery.d.ts +96 -0
- package/dist/providers/discovery.d.ts.map +1 -0
- package/dist/providers/discovery.js +84 -0
- package/dist/providers/index.cjs +24 -0
- package/dist/providers/index.d.ts +32 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +2 -0
- package/dist/resources/reference-parser.cjs +3 -3
- package/dist/resources/reference-parser.d.ts.map +1 -1
- package/dist/resources/reference-parser.js +3 -3
- package/dist/session/chat-session.cjs +20 -3
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +21 -4
- package/dist/session/history/database.cjs +49 -15
- package/dist/session/history/database.d.ts.map +1 -1
- package/dist/session/history/database.js +49 -15
- package/dist/session/session-manager.cjs +2 -1
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +2 -1
- package/dist/storage/blob/factory.cjs +8 -11
- package/dist/storage/blob/factory.d.ts +32 -6
- package/dist/storage/blob/factory.d.ts.map +1 -1
- package/dist/storage/blob/factory.js +8 -11
- package/dist/storage/blob/index.cjs +56 -0
- package/dist/storage/blob/index.d.ts +45 -0
- package/dist/storage/blob/index.d.ts.map +1 -0
- package/dist/storage/blob/index.js +30 -0
- package/dist/storage/blob/provider.cjs +16 -0
- package/dist/storage/blob/provider.d.ts +50 -0
- package/dist/storage/blob/provider.d.ts.map +1 -0
- package/dist/storage/blob/provider.js +0 -0
- package/dist/storage/blob/providers/index.cjs +31 -0
- package/dist/storage/blob/providers/index.d.ts +8 -0
- package/dist/storage/blob/providers/index.d.ts.map +1 -0
- package/dist/storage/blob/providers/index.js +7 -0
- package/dist/storage/blob/providers/local.cjs +39 -0
- package/dist/storage/blob/providers/local.d.ts +17 -0
- package/dist/storage/blob/providers/local.d.ts.map +1 -0
- package/dist/storage/blob/providers/local.js +16 -0
- package/dist/storage/blob/providers/memory.cjs +39 -0
- package/dist/storage/blob/providers/memory.d.ts +17 -0
- package/dist/storage/blob/providers/memory.d.ts.map +1 -0
- package/dist/storage/blob/providers/memory.js +16 -0
- package/dist/storage/blob/registry.cjs +50 -0
- package/dist/storage/blob/registry.d.ts +42 -0
- package/dist/storage/blob/registry.d.ts.map +1 -0
- package/dist/storage/blob/registry.js +26 -0
- package/dist/storage/blob/schemas.cjs +9 -12
- package/dist/storage/blob/schemas.d.ts +39 -34
- package/dist/storage/blob/schemas.d.ts.map +1 -1
- package/dist/storage/blob/schemas.js +6 -11
- package/dist/storage/cache/factory.cjs +8 -36
- package/dist/storage/cache/factory.d.ts +32 -7
- package/dist/storage/cache/factory.d.ts.map +1 -1
- package/dist/storage/cache/factory.js +8 -26
- package/dist/storage/cache/index.cjs +53 -0
- package/dist/storage/cache/index.d.ts +44 -0
- package/dist/storage/cache/index.d.ts.map +1 -0
- package/dist/storage/cache/index.js +28 -0
- package/dist/storage/cache/provider.cjs +16 -0
- package/dist/storage/cache/provider.d.ts +56 -0
- package/dist/storage/cache/provider.d.ts.map +1 -0
- package/dist/storage/cache/provider.js +0 -0
- package/dist/storage/cache/providers/index.cjs +31 -0
- package/dist/storage/cache/providers/index.d.ts +8 -0
- package/dist/storage/cache/providers/index.d.ts.map +1 -0
- package/dist/storage/cache/providers/index.js +7 -0
- package/dist/storage/cache/providers/memory.cjs +40 -0
- package/dist/storage/cache/providers/memory.d.ts +17 -0
- package/dist/storage/cache/providers/memory.d.ts.map +1 -0
- package/dist/storage/cache/providers/memory.js +17 -0
- package/dist/storage/cache/providers/redis.cjs +66 -0
- package/dist/storage/cache/providers/redis.d.ts +20 -0
- package/dist/storage/cache/providers/redis.d.ts.map +1 -0
- package/dist/storage/cache/providers/redis.js +33 -0
- package/dist/storage/cache/registry.cjs +50 -0
- package/dist/storage/cache/registry.d.ts +42 -0
- package/dist/storage/cache/registry.d.ts.map +1 -0
- package/dist/storage/cache/registry.js +26 -0
- package/dist/storage/cache/schemas.cjs +6 -2
- package/dist/storage/cache/schemas.d.ts +2 -3
- package/dist/storage/cache/schemas.d.ts.map +1 -1
- package/dist/storage/cache/schemas.js +3 -1
- package/dist/storage/database/factory.cjs +8 -47
- package/dist/storage/database/factory.d.ts +34 -8
- package/dist/storage/database/factory.d.ts.map +1 -1
- package/dist/storage/database/factory.js +8 -37
- package/dist/storage/database/index.cjs +58 -0
- package/dist/storage/database/index.d.ts +45 -0
- package/dist/storage/database/index.d.ts.map +1 -0
- package/dist/storage/database/index.js +37 -0
- package/dist/storage/database/postgres-store.cjs +174 -78
- package/dist/storage/database/postgres-store.d.ts +19 -0
- package/dist/storage/database/postgres-store.d.ts.map +1 -1
- package/dist/storage/database/postgres-store.js +174 -78
- package/dist/storage/database/provider.cjs +16 -0
- package/dist/storage/database/provider.d.ts +56 -0
- package/dist/storage/database/provider.d.ts.map +1 -0
- package/dist/storage/database/provider.js +0 -0
- package/dist/storage/database/providers/index.cjs +34 -0
- package/dist/storage/database/providers/index.d.ts +9 -0
- package/dist/storage/database/providers/index.d.ts.map +1 -0
- package/dist/storage/database/providers/index.js +9 -0
- package/dist/storage/database/providers/memory.cjs +40 -0
- package/dist/storage/database/providers/memory.d.ts +16 -0
- package/dist/storage/database/providers/memory.d.ts.map +1 -0
- package/dist/storage/database/providers/memory.js +17 -0
- package/dist/storage/database/providers/postgres.cjs +62 -0
- package/dist/storage/database/providers/postgres.d.ts +19 -0
- package/dist/storage/database/providers/postgres.d.ts.map +1 -0
- package/dist/storage/database/providers/postgres.js +29 -0
- package/dist/storage/database/providers/sqlite.cjs +66 -0
- package/dist/storage/database/providers/sqlite.d.ts +20 -0
- package/dist/storage/database/providers/sqlite.d.ts.map +1 -0
- package/dist/storage/database/providers/sqlite.js +33 -0
- package/dist/storage/database/registry.cjs +50 -0
- package/dist/storage/database/registry.d.ts +42 -0
- package/dist/storage/database/registry.d.ts.map +1 -0
- package/dist/storage/database/registry.js +26 -0
- package/dist/storage/database/schemas.cjs +12 -3
- package/dist/storage/database/schemas.d.ts +11 -4
- package/dist/storage/database/schemas.d.ts.map +1 -1
- package/dist/storage/database/schemas.js +8 -2
- package/dist/storage/error-codes.cjs +6 -0
- package/dist/storage/error-codes.d.ts +7 -1
- package/dist/storage/error-codes.d.ts.map +1 -1
- package/dist/storage/error-codes.js +6 -0
- package/dist/storage/errors.cjs +80 -0
- package/dist/storage/errors.d.ts +24 -0
- package/dist/storage/errors.d.ts.map +1 -1
- package/dist/storage/errors.js +80 -0
- package/dist/storage/index.cjs +47 -4
- package/dist/storage/index.d.ts +34 -8
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +32 -3
- package/dist/storage/schemas.cjs +4 -0
- package/dist/storage/schemas.d.ts +24 -50
- package/dist/storage/schemas.d.ts.map +1 -1
- package/dist/storage/schemas.js +5 -1
- package/dist/storage/storage-manager.cjs +6 -6
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +3 -3
- package/dist/systemPrompt/in-built-prompts.cjs +7 -6
- package/dist/systemPrompt/in-built-prompts.d.ts +2 -2
- package/dist/systemPrompt/in-built-prompts.d.ts.map +1 -1
- package/dist/systemPrompt/in-built-prompts.js +6 -5
- package/dist/systemPrompt/registry.cjs +2 -2
- package/dist/systemPrompt/registry.d.ts +1 -1
- package/dist/systemPrompt/registry.d.ts.map +1 -1
- package/dist/systemPrompt/registry.js +2 -2
- package/dist/systemPrompt/schemas.cjs +2 -2
- package/dist/systemPrompt/schemas.d.ts +13 -13
- package/dist/systemPrompt/schemas.js +2 -2
- package/dist/tools/custom-tool-registry.cjs +64 -0
- package/dist/tools/custom-tool-registry.d.ts +126 -0
- package/dist/tools/custom-tool-registry.d.ts.map +1 -0
- package/dist/tools/custom-tool-registry.js +40 -0
- package/dist/tools/custom-tool-schema-registry.cjs +164 -0
- package/dist/tools/custom-tool-schema-registry.d.ts +86 -0
- package/dist/tools/custom-tool-schema-registry.d.ts.map +1 -0
- package/dist/tools/custom-tool-schema-registry.js +140 -0
- package/dist/tools/error-codes.cjs +3 -0
- package/dist/tools/error-codes.d.ts +4 -1
- package/dist/tools/error-codes.d.ts.map +1 -1
- package/dist/tools/error-codes.js +3 -0
- package/dist/tools/errors.cjs +41 -0
- package/dist/tools/errors.d.ts +17 -0
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +41 -0
- package/dist/tools/index.cjs +13 -1
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +11 -1
- package/dist/tools/internal-tools/constants.cjs +3 -9
- package/dist/tools/internal-tools/constants.d.ts +1 -1
- package/dist/tools/internal-tools/constants.d.ts.map +1 -1
- package/dist/tools/internal-tools/constants.js +3 -9
- package/dist/tools/internal-tools/implementations/get-resource-tool.cjs +113 -0
- package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts +30 -0
- package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts.map +1 -0
- package/dist/tools/internal-tools/implementations/get-resource-tool.js +90 -0
- package/dist/tools/internal-tools/implementations/list-resources-tool.cjs +91 -0
- package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts +24 -0
- package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts.map +1 -0
- package/dist/tools/internal-tools/implementations/list-resources-tool.js +68 -0
- package/dist/tools/internal-tools/provider.cjs +153 -23
- package/dist/tools/internal-tools/provider.d.ts +55 -10
- package/dist/tools/internal-tools/provider.d.ts.map +1 -1
- package/dist/tools/internal-tools/provider.js +153 -23
- package/dist/tools/internal-tools/registry.cjs +18 -43
- package/dist/tools/internal-tools/registry.d.ts +4 -4
- package/dist/tools/internal-tools/registry.d.ts.map +1 -1
- package/dist/tools/internal-tools/registry.js +18 -43
- package/dist/tools/schemas.cjs +20 -0
- package/dist/tools/schemas.d.ts +43 -1
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +16 -0
- package/dist/tools/tool-manager.cjs +140 -13
- package/dist/tools/tool-manager.d.ts +22 -3
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +140 -13
- package/dist/tools/types.d.ts +43 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.cjs +19 -1
- package/dist/utils/api-key-resolver.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.js +19 -1
- package/dist/utils/index.cjs +0 -2
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/redactor.cjs +18 -3
- package/dist/utils/redactor.d.ts +0 -7
- package/dist/utils/redactor.d.ts.map +1 -1
- package/dist/utils/redactor.js +18 -3
- package/dist/utils/service-initializer.cjs +9 -35
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +9 -35
- package/package.json +5 -2
- package/dist/context/compression/overflow.d.ts.map +0 -1
- package/dist/context/compression/reactive-overflow.d.ts.map +0 -1
- package/dist/context/compression/types.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/bash-exec-tool.cjs +0 -130
- package/dist/tools/internal-tools/implementations/bash-exec-tool.d.ts +0 -13
- package/dist/tools/internal-tools/implementations/bash-exec-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/bash-exec-tool.js +0 -97
- package/dist/tools/internal-tools/implementations/bash-output-tool.cjs +0 -49
- package/dist/tools/internal-tools/implementations/bash-output-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/bash-output-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/bash-output-tool.js +0 -26
- package/dist/tools/internal-tools/implementations/edit-file-tool.cjs +0 -127
- package/dist/tools/internal-tools/implementations/edit-file-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/edit-file-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/edit-file-tool.js +0 -104
- package/dist/tools/internal-tools/implementations/glob-files-tool.cjs +0 -70
- package/dist/tools/internal-tools/implementations/glob-files-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/glob-files-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/glob-files-tool.js +0 -47
- package/dist/tools/internal-tools/implementations/grep-content-tool.cjs +0 -86
- package/dist/tools/internal-tools/implementations/grep-content-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/grep-content-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/grep-content-tool.js +0 -63
- package/dist/tools/internal-tools/implementations/kill-process-tool.cjs +0 -47
- package/dist/tools/internal-tools/implementations/kill-process-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/kill-process-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/kill-process-tool.js +0 -24
- package/dist/tools/internal-tools/implementations/read-file-tool.cjs +0 -63
- package/dist/tools/internal-tools/implementations/read-file-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/read-file-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/read-file-tool.js +0 -40
- package/dist/tools/internal-tools/implementations/write-file-tool.cjs +0 -124
- package/dist/tools/internal-tools/implementations/write-file-tool.d.ts +0 -12
- package/dist/tools/internal-tools/implementations/write-file-tool.d.ts.map +0 -1
- package/dist/tools/internal-tools/implementations/write-file-tool.js +0 -103
- package/dist/utils/env-file.cjs +0 -118
- package/dist/utils/env-file.d.ts +0 -5
- package/dist/utils/env-file.d.ts.map +0 -1
- package/dist/utils/env-file.js +0 -85
- /package/dist/context/{compression/types.js → compaction/provider.js} +0 -0
- /package/dist/context/{compression → compaction}/types.cjs +0 -0
|
@@ -99,6 +99,7 @@ let _ToolManager = class _ToolManager {
|
|
|
99
99
|
// Tool source prefixing - ALL tools get prefixed by source
|
|
100
100
|
static MCP_TOOL_PREFIX = "mcp--";
|
|
101
101
|
static INTERNAL_TOOL_PREFIX = "internal--";
|
|
102
|
+
static CUSTOM_TOOL_PREFIX = "custom--";
|
|
102
103
|
// Tool caching for performance
|
|
103
104
|
toolsCache = {};
|
|
104
105
|
cacheValid = false;
|
|
@@ -111,14 +112,15 @@ let _ToolManager = class _ToolManager {
|
|
|
111
112
|
this.agentEventBus = agentEventBus;
|
|
112
113
|
this.toolPolicies = toolPolicies;
|
|
113
114
|
this.logger = logger.createChild(import_types2.DextoLogComponent.TOOLS);
|
|
114
|
-
if (options?.internalToolsConfig && options.internalToolsConfig.length > 0) {
|
|
115
|
+
if (options?.internalToolsConfig && options.internalToolsConfig.length > 0 || options?.customToolsConfig && options.customToolsConfig.length > 0) {
|
|
115
116
|
const internalToolsServices = {
|
|
116
117
|
...options.internalToolsServices,
|
|
117
118
|
approvalManager
|
|
118
119
|
};
|
|
119
120
|
this.internalToolsProvider = new import_provider.InternalToolsProvider(
|
|
120
121
|
internalToolsServices,
|
|
121
|
-
options.internalToolsConfig,
|
|
122
|
+
options.internalToolsConfig || [],
|
|
123
|
+
options.customToolsConfig || [],
|
|
122
124
|
this.logger
|
|
123
125
|
);
|
|
124
126
|
}
|
|
@@ -143,6 +145,16 @@ let _ToolManager = class _ToolManager {
|
|
|
143
145
|
this.stateManager = stateManager;
|
|
144
146
|
this.logger.debug("Plugin support configured for ToolManager");
|
|
145
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Set agent reference for custom tools (called after construction to avoid circular dependencies)
|
|
150
|
+
* Must be called before initialize() if custom tools are configured
|
|
151
|
+
*/
|
|
152
|
+
setAgent(agent) {
|
|
153
|
+
if (this.internalToolsProvider) {
|
|
154
|
+
this.internalToolsProvider.setAgent(agent);
|
|
155
|
+
this.logger.debug("Agent reference configured for custom tools");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
146
158
|
/**
|
|
147
159
|
* Invalidate the tools cache when tool sources change
|
|
148
160
|
*/
|
|
@@ -174,7 +186,7 @@ let _ToolManager = class _ToolManager {
|
|
|
174
186
|
* Check if a tool name represents a bash execution tool
|
|
175
187
|
*/
|
|
176
188
|
isBashTool(toolName) {
|
|
177
|
-
return toolName === "bash_exec" || toolName === "internal--bash_exec";
|
|
189
|
+
return toolName === "bash_exec" || toolName === "internal--bash_exec" || toolName === "custom--bash_exec";
|
|
178
190
|
}
|
|
179
191
|
/**
|
|
180
192
|
* Check if a bash command is covered by any approved pattern.
|
|
@@ -228,6 +240,7 @@ let _ToolManager = class _ToolManager {
|
|
|
228
240
|
const allTools = {};
|
|
229
241
|
let mcpTools = {};
|
|
230
242
|
let internalTools = {};
|
|
243
|
+
let customTools = {};
|
|
231
244
|
try {
|
|
232
245
|
mcpTools = await this.mcpManager.getAllTools();
|
|
233
246
|
} catch (error) {
|
|
@@ -237,13 +250,21 @@ let _ToolManager = class _ToolManager {
|
|
|
237
250
|
mcpTools = {};
|
|
238
251
|
}
|
|
239
252
|
try {
|
|
240
|
-
internalTools = this.internalToolsProvider?.
|
|
253
|
+
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
241
254
|
} catch (error) {
|
|
242
255
|
this.logger.error(
|
|
243
256
|
`Failed to get internal tools: ${error instanceof Error ? error.message : String(error)}`
|
|
244
257
|
);
|
|
245
258
|
internalTools = {};
|
|
246
259
|
}
|
|
260
|
+
try {
|
|
261
|
+
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
262
|
+
} catch (error) {
|
|
263
|
+
this.logger.error(
|
|
264
|
+
`Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
|
|
265
|
+
);
|
|
266
|
+
customTools = {};
|
|
267
|
+
}
|
|
247
268
|
for (const [toolName, toolDef] of Object.entries(internalTools)) {
|
|
248
269
|
const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
|
|
249
270
|
allTools[qualifiedName] = {
|
|
@@ -252,6 +273,14 @@ let _ToolManager = class _ToolManager {
|
|
|
252
273
|
description: `${toolDef.description || "No description provided"} (internal tool)`
|
|
253
274
|
};
|
|
254
275
|
}
|
|
276
|
+
for (const [toolName, toolDef] of Object.entries(customTools)) {
|
|
277
|
+
const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
|
|
278
|
+
allTools[qualifiedName] = {
|
|
279
|
+
...toolDef,
|
|
280
|
+
name: qualifiedName,
|
|
281
|
+
description: `${toolDef.description || "No description provided"} (custom tool)`
|
|
282
|
+
};
|
|
283
|
+
}
|
|
255
284
|
for (const [toolName, toolDef] of Object.entries(mcpTools)) {
|
|
256
285
|
const qualifiedName = `${_ToolManager.MCP_TOOL_PREFIX}${toolName}`;
|
|
257
286
|
allTools[qualifiedName] = {
|
|
@@ -263,8 +292,9 @@ let _ToolManager = class _ToolManager {
|
|
|
263
292
|
const totalTools = Object.keys(allTools).length;
|
|
264
293
|
const mcpCount = Object.keys(mcpTools).length;
|
|
265
294
|
const internalCount = Object.keys(internalTools).length;
|
|
295
|
+
const customCount = Object.keys(customTools).length;
|
|
266
296
|
this.logger.debug(
|
|
267
|
-
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP
|
|
297
|
+
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${internalCount} internal, ${customCount} custom)`
|
|
268
298
|
);
|
|
269
299
|
return allTools;
|
|
270
300
|
}
|
|
@@ -365,14 +395,30 @@ let _ToolManager = class _ToolManager {
|
|
|
365
395
|
sessionId,
|
|
366
396
|
abortSignal
|
|
367
397
|
);
|
|
398
|
+
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
399
|
+
this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
|
|
400
|
+
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
401
|
+
if (actualToolName.length === 0) {
|
|
402
|
+
throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
403
|
+
}
|
|
404
|
+
if (!this.internalToolsProvider) {
|
|
405
|
+
throw import_errors.ToolError.internalToolsNotInitialized(toolName);
|
|
406
|
+
}
|
|
407
|
+
this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
|
|
408
|
+
result = await this.internalToolsProvider.executeTool(
|
|
409
|
+
actualToolName,
|
|
410
|
+
args,
|
|
411
|
+
sessionId,
|
|
412
|
+
abortSignal
|
|
413
|
+
);
|
|
368
414
|
} else {
|
|
369
415
|
this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
|
|
370
416
|
const stats = await this.getToolStats();
|
|
371
417
|
this.logger.error(
|
|
372
|
-
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*' or '${_ToolManager.
|
|
418
|
+
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
|
|
373
419
|
);
|
|
374
420
|
this.logger.debug(
|
|
375
|
-
`Available: ${stats.mcp} MCP
|
|
421
|
+
`Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
|
|
376
422
|
);
|
|
377
423
|
throw import_errors.ToolError.notFound(toolName);
|
|
378
424
|
}
|
|
@@ -438,7 +484,11 @@ let _ToolManager = class _ToolManager {
|
|
|
438
484
|
}
|
|
439
485
|
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
440
486
|
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
441
|
-
return this.internalToolsProvider?.
|
|
487
|
+
return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
|
|
488
|
+
}
|
|
489
|
+
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
490
|
+
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
491
|
+
return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
|
|
442
492
|
}
|
|
443
493
|
return false;
|
|
444
494
|
}
|
|
@@ -448,6 +498,7 @@ let _ToolManager = class _ToolManager {
|
|
|
448
498
|
async getToolStats() {
|
|
449
499
|
let mcpTools = {};
|
|
450
500
|
let internalTools = {};
|
|
501
|
+
let customTools = {};
|
|
451
502
|
try {
|
|
452
503
|
mcpTools = await this.mcpManager.getAllTools();
|
|
453
504
|
} catch (error) {
|
|
@@ -457,24 +508,33 @@ let _ToolManager = class _ToolManager {
|
|
|
457
508
|
mcpTools = {};
|
|
458
509
|
}
|
|
459
510
|
try {
|
|
460
|
-
internalTools = this.internalToolsProvider?.
|
|
511
|
+
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
461
512
|
} catch (error) {
|
|
462
513
|
this.logger.error(
|
|
463
514
|
`Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
464
515
|
);
|
|
465
516
|
internalTools = {};
|
|
466
517
|
}
|
|
518
|
+
try {
|
|
519
|
+
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
520
|
+
} catch (error) {
|
|
521
|
+
this.logger.error(
|
|
522
|
+
`Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
523
|
+
);
|
|
524
|
+
customTools = {};
|
|
525
|
+
}
|
|
467
526
|
const mcpCount = Object.keys(mcpTools).length;
|
|
468
527
|
const internalCount = Object.keys(internalTools).length;
|
|
528
|
+
const customCount = Object.keys(customTools).length;
|
|
469
529
|
return {
|
|
470
|
-
total: mcpCount + internalCount,
|
|
471
|
-
// No conflicts with universal prefixing
|
|
530
|
+
total: mcpCount + internalCount + customCount,
|
|
472
531
|
mcp: mcpCount,
|
|
473
|
-
internal: internalCount
|
|
532
|
+
internal: internalCount,
|
|
533
|
+
custom: customCount
|
|
474
534
|
};
|
|
475
535
|
}
|
|
476
536
|
/**
|
|
477
|
-
* Get the source of a tool (mcp, internal, or unknown)
|
|
537
|
+
* Get the source of a tool (mcp, internal, custom, or unknown)
|
|
478
538
|
* @param toolName The name of the tool to check
|
|
479
539
|
* @returns The source of the tool
|
|
480
540
|
*/
|
|
@@ -485,6 +545,9 @@ let _ToolManager = class _ToolManager {
|
|
|
485
545
|
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX) && toolName.length > _ToolManager.INTERNAL_TOOL_PREFIX.length) {
|
|
486
546
|
return "internal";
|
|
487
547
|
}
|
|
548
|
+
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
|
|
549
|
+
return "custom";
|
|
550
|
+
}
|
|
488
551
|
return "unknown";
|
|
489
552
|
}
|
|
490
553
|
/**
|
|
@@ -540,6 +603,62 @@ let _ToolManager = class _ToolManager {
|
|
|
540
603
|
(pattern) => this.matchesToolPolicy(toolName, pattern)
|
|
541
604
|
);
|
|
542
605
|
}
|
|
606
|
+
/**
|
|
607
|
+
* Check if a tool has a custom approval override and handle it.
|
|
608
|
+
* Tools can implement getApprovalOverride() to request specialized approval flows
|
|
609
|
+
* (e.g., directory access approval for file tools) instead of default tool confirmation.
|
|
610
|
+
*
|
|
611
|
+
* @param toolName The fully qualified tool name
|
|
612
|
+
* @param args The tool arguments
|
|
613
|
+
* @param sessionId Optional session ID
|
|
614
|
+
* @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
|
|
615
|
+
*/
|
|
616
|
+
async checkCustomApprovalOverride(toolName, args, sessionId) {
|
|
617
|
+
let actualToolName;
|
|
618
|
+
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
619
|
+
actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
620
|
+
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
621
|
+
actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
622
|
+
}
|
|
623
|
+
if (!actualToolName || !this.internalToolsProvider) {
|
|
624
|
+
return { handled: false };
|
|
625
|
+
}
|
|
626
|
+
const tool = this.internalToolsProvider.getTool(actualToolName);
|
|
627
|
+
if (!tool?.getApprovalOverride) {
|
|
628
|
+
return { handled: false };
|
|
629
|
+
}
|
|
630
|
+
const approvalRequest = tool.getApprovalOverride(args);
|
|
631
|
+
if (!approvalRequest) {
|
|
632
|
+
return { handled: false };
|
|
633
|
+
}
|
|
634
|
+
this.logger.debug(
|
|
635
|
+
`Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
|
|
636
|
+
);
|
|
637
|
+
if (sessionId && !approvalRequest.sessionId) {
|
|
638
|
+
approvalRequest.sessionId = sessionId;
|
|
639
|
+
}
|
|
640
|
+
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
641
|
+
if (response.status === import_types3.ApprovalStatus.APPROVED) {
|
|
642
|
+
if (tool.onApprovalGranted) {
|
|
643
|
+
tool.onApprovalGranted(response);
|
|
644
|
+
}
|
|
645
|
+
this.logger.info(
|
|
646
|
+
`Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
|
|
647
|
+
);
|
|
648
|
+
return { handled: true };
|
|
649
|
+
}
|
|
650
|
+
this.logger.info(
|
|
651
|
+
`Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
|
|
652
|
+
);
|
|
653
|
+
if (approvalRequest.type === "directory_access") {
|
|
654
|
+
const metadata = approvalRequest.metadata;
|
|
655
|
+
throw import_errors.ToolError.directoryAccessDenied(
|
|
656
|
+
metadata?.parentDir ?? "unknown directory",
|
|
657
|
+
sessionId
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
661
|
+
}
|
|
543
662
|
/**
|
|
544
663
|
* Handle tool approval/confirmation flow
|
|
545
664
|
* Checks allowed list, manages approval modes (manual, auto-approve, auto-deny),
|
|
@@ -558,6 +677,14 @@ let _ToolManager = class _ToolManager {
|
|
|
558
677
|
this.logger.debug(`\u{1F6AB} Tool execution blocked by policy: ${toolName}`);
|
|
559
678
|
throw import_errors.ToolError.executionDenied(toolName, sessionId);
|
|
560
679
|
}
|
|
680
|
+
const customApprovalResult = await this.checkCustomApprovalOverride(
|
|
681
|
+
toolName,
|
|
682
|
+
args,
|
|
683
|
+
sessionId
|
|
684
|
+
);
|
|
685
|
+
if (customApprovalResult.handled) {
|
|
686
|
+
return { requireApproval: true, approvalStatus: "approved" };
|
|
687
|
+
}
|
|
561
688
|
if (this.isInAlwaysAllowList(toolName)) {
|
|
562
689
|
this.logger.info(
|
|
563
690
|
`Tool '${toolName}' is in static allow list \u2013 skipping confirmation (session: ${sessionId ?? "global"})`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MCPManager } from '../mcp/manager.js';
|
|
2
2
|
import { InternalToolsServices } from './internal-tools/registry.js';
|
|
3
|
-
import type { InternalToolsConfig, ToolPolicies } from './schemas.js';
|
|
3
|
+
import type { InternalToolsConfig, CustomToolsConfig, ToolPolicies } from './schemas.js';
|
|
4
4
|
import { ToolSet } from './types.js';
|
|
5
5
|
import type { IDextoLogger } from '../logger/v2/types.js';
|
|
6
6
|
import type { AgentEventBus } from '../events/index.js';
|
|
@@ -15,6 +15,7 @@ import type { AgentStateManager } from '../agent/state-manager.js';
|
|
|
15
15
|
export interface InternalToolsOptions {
|
|
16
16
|
internalToolsServices?: InternalToolsServices;
|
|
17
17
|
internalToolsConfig?: InternalToolsConfig;
|
|
18
|
+
customToolsConfig?: CustomToolsConfig;
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
21
|
* Unified Tool Manager - Single interface for all tool operations
|
|
@@ -55,6 +56,7 @@ export declare class ToolManager {
|
|
|
55
56
|
private stateManager?;
|
|
56
57
|
private static readonly MCP_TOOL_PREFIX;
|
|
57
58
|
private static readonly INTERNAL_TOOL_PREFIX;
|
|
59
|
+
private static readonly CUSTOM_TOOL_PREFIX;
|
|
58
60
|
private toolsCache;
|
|
59
61
|
private cacheValid;
|
|
60
62
|
private logger;
|
|
@@ -67,6 +69,11 @@ export declare class ToolManager {
|
|
|
67
69
|
* Set plugin support services (called after construction to avoid circular dependencies)
|
|
68
70
|
*/
|
|
69
71
|
setPluginSupport(pluginManager: PluginManager, sessionManager: SessionManager, stateManager: AgentStateManager): void;
|
|
72
|
+
/**
|
|
73
|
+
* Set agent reference for custom tools (called after construction to avoid circular dependencies)
|
|
74
|
+
* Must be called before initialize() if custom tools are configured
|
|
75
|
+
*/
|
|
76
|
+
setAgent(agent: any): void;
|
|
70
77
|
/**
|
|
71
78
|
* Invalidate the tools cache when tool sources change
|
|
72
79
|
*/
|
|
@@ -135,13 +142,14 @@ export declare class ToolManager {
|
|
|
135
142
|
total: number;
|
|
136
143
|
mcp: number;
|
|
137
144
|
internal: number;
|
|
145
|
+
custom: number;
|
|
138
146
|
}>;
|
|
139
147
|
/**
|
|
140
|
-
* Get the source of a tool (mcp, internal, or unknown)
|
|
148
|
+
* Get the source of a tool (mcp, internal, custom, or unknown)
|
|
141
149
|
* @param toolName The name of the tool to check
|
|
142
150
|
* @returns The source of the tool
|
|
143
151
|
*/
|
|
144
|
-
getToolSource(toolName: string): 'mcp' | 'internal' | 'unknown';
|
|
152
|
+
getToolSource(toolName: string): 'mcp' | 'internal' | 'custom' | 'unknown';
|
|
145
153
|
/**
|
|
146
154
|
* Check if a tool matches a policy pattern
|
|
147
155
|
* Supports both exact matching and suffix matching for MCP tools with server prefixes
|
|
@@ -170,6 +178,17 @@ export declare class ToolManager {
|
|
|
170
178
|
* @returns true if the tool is in the allow list
|
|
171
179
|
*/
|
|
172
180
|
private isInAlwaysAllowList;
|
|
181
|
+
/**
|
|
182
|
+
* Check if a tool has a custom approval override and handle it.
|
|
183
|
+
* Tools can implement getApprovalOverride() to request specialized approval flows
|
|
184
|
+
* (e.g., directory access approval for file tools) instead of default tool confirmation.
|
|
185
|
+
*
|
|
186
|
+
* @param toolName The fully qualified tool name
|
|
187
|
+
* @param args The tool arguments
|
|
188
|
+
* @param sessionId Optional session ID
|
|
189
|
+
* @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
|
|
190
|
+
*/
|
|
191
|
+
private checkCustomApprovalOverride;
|
|
173
192
|
/**
|
|
174
193
|
* Handle tool approval/confirmation flow
|
|
175
194
|
* Checks allowed list, manages approval modes (manual, auto-approve, auto-deny),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,7 @@ let _ToolManager = class _ToolManager {
|
|
|
40
40
|
// Tool source prefixing - ALL tools get prefixed by source
|
|
41
41
|
static MCP_TOOL_PREFIX = "mcp--";
|
|
42
42
|
static INTERNAL_TOOL_PREFIX = "internal--";
|
|
43
|
+
static CUSTOM_TOOL_PREFIX = "custom--";
|
|
43
44
|
// Tool caching for performance
|
|
44
45
|
toolsCache = {};
|
|
45
46
|
cacheValid = false;
|
|
@@ -52,14 +53,15 @@ let _ToolManager = class _ToolManager {
|
|
|
52
53
|
this.agentEventBus = agentEventBus;
|
|
53
54
|
this.toolPolicies = toolPolicies;
|
|
54
55
|
this.logger = logger.createChild(DextoLogComponent.TOOLS);
|
|
55
|
-
if (options?.internalToolsConfig && options.internalToolsConfig.length > 0) {
|
|
56
|
+
if (options?.internalToolsConfig && options.internalToolsConfig.length > 0 || options?.customToolsConfig && options.customToolsConfig.length > 0) {
|
|
56
57
|
const internalToolsServices = {
|
|
57
58
|
...options.internalToolsServices,
|
|
58
59
|
approvalManager
|
|
59
60
|
};
|
|
60
61
|
this.internalToolsProvider = new InternalToolsProvider(
|
|
61
62
|
internalToolsServices,
|
|
62
|
-
options.internalToolsConfig,
|
|
63
|
+
options.internalToolsConfig || [],
|
|
64
|
+
options.customToolsConfig || [],
|
|
63
65
|
this.logger
|
|
64
66
|
);
|
|
65
67
|
}
|
|
@@ -84,6 +86,16 @@ let _ToolManager = class _ToolManager {
|
|
|
84
86
|
this.stateManager = stateManager;
|
|
85
87
|
this.logger.debug("Plugin support configured for ToolManager");
|
|
86
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Set agent reference for custom tools (called after construction to avoid circular dependencies)
|
|
91
|
+
* Must be called before initialize() if custom tools are configured
|
|
92
|
+
*/
|
|
93
|
+
setAgent(agent) {
|
|
94
|
+
if (this.internalToolsProvider) {
|
|
95
|
+
this.internalToolsProvider.setAgent(agent);
|
|
96
|
+
this.logger.debug("Agent reference configured for custom tools");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
87
99
|
/**
|
|
88
100
|
* Invalidate the tools cache when tool sources change
|
|
89
101
|
*/
|
|
@@ -115,7 +127,7 @@ let _ToolManager = class _ToolManager {
|
|
|
115
127
|
* Check if a tool name represents a bash execution tool
|
|
116
128
|
*/
|
|
117
129
|
isBashTool(toolName) {
|
|
118
|
-
return toolName === "bash_exec" || toolName === "internal--bash_exec";
|
|
130
|
+
return toolName === "bash_exec" || toolName === "internal--bash_exec" || toolName === "custom--bash_exec";
|
|
119
131
|
}
|
|
120
132
|
/**
|
|
121
133
|
* Check if a bash command is covered by any approved pattern.
|
|
@@ -169,6 +181,7 @@ let _ToolManager = class _ToolManager {
|
|
|
169
181
|
const allTools = {};
|
|
170
182
|
let mcpTools = {};
|
|
171
183
|
let internalTools = {};
|
|
184
|
+
let customTools = {};
|
|
172
185
|
try {
|
|
173
186
|
mcpTools = await this.mcpManager.getAllTools();
|
|
174
187
|
} catch (error) {
|
|
@@ -178,13 +191,21 @@ let _ToolManager = class _ToolManager {
|
|
|
178
191
|
mcpTools = {};
|
|
179
192
|
}
|
|
180
193
|
try {
|
|
181
|
-
internalTools = this.internalToolsProvider?.
|
|
194
|
+
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
182
195
|
} catch (error) {
|
|
183
196
|
this.logger.error(
|
|
184
197
|
`Failed to get internal tools: ${error instanceof Error ? error.message : String(error)}`
|
|
185
198
|
);
|
|
186
199
|
internalTools = {};
|
|
187
200
|
}
|
|
201
|
+
try {
|
|
202
|
+
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
203
|
+
} catch (error) {
|
|
204
|
+
this.logger.error(
|
|
205
|
+
`Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
|
|
206
|
+
);
|
|
207
|
+
customTools = {};
|
|
208
|
+
}
|
|
188
209
|
for (const [toolName, toolDef] of Object.entries(internalTools)) {
|
|
189
210
|
const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
|
|
190
211
|
allTools[qualifiedName] = {
|
|
@@ -193,6 +214,14 @@ let _ToolManager = class _ToolManager {
|
|
|
193
214
|
description: `${toolDef.description || "No description provided"} (internal tool)`
|
|
194
215
|
};
|
|
195
216
|
}
|
|
217
|
+
for (const [toolName, toolDef] of Object.entries(customTools)) {
|
|
218
|
+
const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
|
|
219
|
+
allTools[qualifiedName] = {
|
|
220
|
+
...toolDef,
|
|
221
|
+
name: qualifiedName,
|
|
222
|
+
description: `${toolDef.description || "No description provided"} (custom tool)`
|
|
223
|
+
};
|
|
224
|
+
}
|
|
196
225
|
for (const [toolName, toolDef] of Object.entries(mcpTools)) {
|
|
197
226
|
const qualifiedName = `${_ToolManager.MCP_TOOL_PREFIX}${toolName}`;
|
|
198
227
|
allTools[qualifiedName] = {
|
|
@@ -204,8 +233,9 @@ let _ToolManager = class _ToolManager {
|
|
|
204
233
|
const totalTools = Object.keys(allTools).length;
|
|
205
234
|
const mcpCount = Object.keys(mcpTools).length;
|
|
206
235
|
const internalCount = Object.keys(internalTools).length;
|
|
236
|
+
const customCount = Object.keys(customTools).length;
|
|
207
237
|
this.logger.debug(
|
|
208
|
-
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP
|
|
238
|
+
`\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${internalCount} internal, ${customCount} custom)`
|
|
209
239
|
);
|
|
210
240
|
return allTools;
|
|
211
241
|
}
|
|
@@ -306,14 +336,30 @@ let _ToolManager = class _ToolManager {
|
|
|
306
336
|
sessionId,
|
|
307
337
|
abortSignal
|
|
308
338
|
);
|
|
339
|
+
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
340
|
+
this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
|
|
341
|
+
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
342
|
+
if (actualToolName.length === 0) {
|
|
343
|
+
throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
|
|
344
|
+
}
|
|
345
|
+
if (!this.internalToolsProvider) {
|
|
346
|
+
throw ToolError.internalToolsNotInitialized(toolName);
|
|
347
|
+
}
|
|
348
|
+
this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
|
|
349
|
+
result = await this.internalToolsProvider.executeTool(
|
|
350
|
+
actualToolName,
|
|
351
|
+
args,
|
|
352
|
+
sessionId,
|
|
353
|
+
abortSignal
|
|
354
|
+
);
|
|
309
355
|
} else {
|
|
310
356
|
this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
|
|
311
357
|
const stats = await this.getToolStats();
|
|
312
358
|
this.logger.error(
|
|
313
|
-
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*' or '${_ToolManager.
|
|
359
|
+
`\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
|
|
314
360
|
);
|
|
315
361
|
this.logger.debug(
|
|
316
|
-
`Available: ${stats.mcp} MCP
|
|
362
|
+
`Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
|
|
317
363
|
);
|
|
318
364
|
throw ToolError.notFound(toolName);
|
|
319
365
|
}
|
|
@@ -379,7 +425,11 @@ let _ToolManager = class _ToolManager {
|
|
|
379
425
|
}
|
|
380
426
|
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
381
427
|
const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
382
|
-
return this.internalToolsProvider?.
|
|
428
|
+
return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
|
|
429
|
+
}
|
|
430
|
+
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
431
|
+
const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
432
|
+
return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
|
|
383
433
|
}
|
|
384
434
|
return false;
|
|
385
435
|
}
|
|
@@ -389,6 +439,7 @@ let _ToolManager = class _ToolManager {
|
|
|
389
439
|
async getToolStats() {
|
|
390
440
|
let mcpTools = {};
|
|
391
441
|
let internalTools = {};
|
|
442
|
+
let customTools = {};
|
|
392
443
|
try {
|
|
393
444
|
mcpTools = await this.mcpManager.getAllTools();
|
|
394
445
|
} catch (error) {
|
|
@@ -398,24 +449,33 @@ let _ToolManager = class _ToolManager {
|
|
|
398
449
|
mcpTools = {};
|
|
399
450
|
}
|
|
400
451
|
try {
|
|
401
|
-
internalTools = this.internalToolsProvider?.
|
|
452
|
+
internalTools = this.internalToolsProvider?.getInternalTools() || {};
|
|
402
453
|
} catch (error) {
|
|
403
454
|
this.logger.error(
|
|
404
455
|
`Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
405
456
|
);
|
|
406
457
|
internalTools = {};
|
|
407
458
|
}
|
|
459
|
+
try {
|
|
460
|
+
customTools = this.internalToolsProvider?.getCustomTools() || {};
|
|
461
|
+
} catch (error) {
|
|
462
|
+
this.logger.error(
|
|
463
|
+
`Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
|
|
464
|
+
);
|
|
465
|
+
customTools = {};
|
|
466
|
+
}
|
|
408
467
|
const mcpCount = Object.keys(mcpTools).length;
|
|
409
468
|
const internalCount = Object.keys(internalTools).length;
|
|
469
|
+
const customCount = Object.keys(customTools).length;
|
|
410
470
|
return {
|
|
411
|
-
total: mcpCount + internalCount,
|
|
412
|
-
// No conflicts with universal prefixing
|
|
471
|
+
total: mcpCount + internalCount + customCount,
|
|
413
472
|
mcp: mcpCount,
|
|
414
|
-
internal: internalCount
|
|
473
|
+
internal: internalCount,
|
|
474
|
+
custom: customCount
|
|
415
475
|
};
|
|
416
476
|
}
|
|
417
477
|
/**
|
|
418
|
-
* Get the source of a tool (mcp, internal, or unknown)
|
|
478
|
+
* Get the source of a tool (mcp, internal, custom, or unknown)
|
|
419
479
|
* @param toolName The name of the tool to check
|
|
420
480
|
* @returns The source of the tool
|
|
421
481
|
*/
|
|
@@ -426,6 +486,9 @@ let _ToolManager = class _ToolManager {
|
|
|
426
486
|
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX) && toolName.length > _ToolManager.INTERNAL_TOOL_PREFIX.length) {
|
|
427
487
|
return "internal";
|
|
428
488
|
}
|
|
489
|
+
if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
|
|
490
|
+
return "custom";
|
|
491
|
+
}
|
|
429
492
|
return "unknown";
|
|
430
493
|
}
|
|
431
494
|
/**
|
|
@@ -481,6 +544,62 @@ let _ToolManager = class _ToolManager {
|
|
|
481
544
|
(pattern) => this.matchesToolPolicy(toolName, pattern)
|
|
482
545
|
);
|
|
483
546
|
}
|
|
547
|
+
/**
|
|
548
|
+
* Check if a tool has a custom approval override and handle it.
|
|
549
|
+
* Tools can implement getApprovalOverride() to request specialized approval flows
|
|
550
|
+
* (e.g., directory access approval for file tools) instead of default tool confirmation.
|
|
551
|
+
*
|
|
552
|
+
* @param toolName The fully qualified tool name
|
|
553
|
+
* @param args The tool arguments
|
|
554
|
+
* @param sessionId Optional session ID
|
|
555
|
+
* @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
|
|
556
|
+
*/
|
|
557
|
+
async checkCustomApprovalOverride(toolName, args, sessionId) {
|
|
558
|
+
let actualToolName;
|
|
559
|
+
if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
|
|
560
|
+
actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
|
|
561
|
+
} else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
|
|
562
|
+
actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
|
|
563
|
+
}
|
|
564
|
+
if (!actualToolName || !this.internalToolsProvider) {
|
|
565
|
+
return { handled: false };
|
|
566
|
+
}
|
|
567
|
+
const tool = this.internalToolsProvider.getTool(actualToolName);
|
|
568
|
+
if (!tool?.getApprovalOverride) {
|
|
569
|
+
return { handled: false };
|
|
570
|
+
}
|
|
571
|
+
const approvalRequest = tool.getApprovalOverride(args);
|
|
572
|
+
if (!approvalRequest) {
|
|
573
|
+
return { handled: false };
|
|
574
|
+
}
|
|
575
|
+
this.logger.debug(
|
|
576
|
+
`Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
|
|
577
|
+
);
|
|
578
|
+
if (sessionId && !approvalRequest.sessionId) {
|
|
579
|
+
approvalRequest.sessionId = sessionId;
|
|
580
|
+
}
|
|
581
|
+
const response = await this.approvalManager.requestApproval(approvalRequest);
|
|
582
|
+
if (response.status === ApprovalStatus.APPROVED) {
|
|
583
|
+
if (tool.onApprovalGranted) {
|
|
584
|
+
tool.onApprovalGranted(response);
|
|
585
|
+
}
|
|
586
|
+
this.logger.info(
|
|
587
|
+
`Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
|
|
588
|
+
);
|
|
589
|
+
return { handled: true };
|
|
590
|
+
}
|
|
591
|
+
this.logger.info(
|
|
592
|
+
`Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
|
|
593
|
+
);
|
|
594
|
+
if (approvalRequest.type === "directory_access") {
|
|
595
|
+
const metadata = approvalRequest.metadata;
|
|
596
|
+
throw ToolError.directoryAccessDenied(
|
|
597
|
+
metadata?.parentDir ?? "unknown directory",
|
|
598
|
+
sessionId
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
throw ToolError.executionDenied(toolName, sessionId);
|
|
602
|
+
}
|
|
484
603
|
/**
|
|
485
604
|
* Handle tool approval/confirmation flow
|
|
486
605
|
* Checks allowed list, manages approval modes (manual, auto-approve, auto-deny),
|
|
@@ -499,6 +618,14 @@ let _ToolManager = class _ToolManager {
|
|
|
499
618
|
this.logger.debug(`\u{1F6AB} Tool execution blocked by policy: ${toolName}`);
|
|
500
619
|
throw ToolError.executionDenied(toolName, sessionId);
|
|
501
620
|
}
|
|
621
|
+
const customApprovalResult = await this.checkCustomApprovalOverride(
|
|
622
|
+
toolName,
|
|
623
|
+
args,
|
|
624
|
+
sessionId
|
|
625
|
+
);
|
|
626
|
+
if (customApprovalResult.handled) {
|
|
627
|
+
return { requireApproval: true, approvalStatus: "approved" };
|
|
628
|
+
}
|
|
502
629
|
if (this.isInAlwaysAllowList(toolName)) {
|
|
503
630
|
this.logger.info(
|
|
504
631
|
`Tool '${toolName}' is in static allow list \u2013 skipping confirmation (session: ${sessionId ?? "global"})`
|