@daniel.stefan/metalink 1.3.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 +160 -0
- package/package.json +96 -0
- package/packages/cli/dist/bin/cli.d.ts +3 -0
- package/packages/cli/dist/bin/cli.d.ts.map +1 -0
- package/packages/cli/dist/bin/cli.js +4 -0
- package/packages/cli/dist/bin/cli.js.map +1 -0
- package/packages/cli/dist/commands/config/init.d.ts +9 -0
- package/packages/cli/dist/commands/config/init.d.ts.map +1 -0
- package/packages/cli/dist/commands/config/init.js +38 -0
- package/packages/cli/dist/commands/config/init.js.map +1 -0
- package/packages/cli/dist/commands/config/validate.d.ts +9 -0
- package/packages/cli/dist/commands/config/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/config/validate.js +34 -0
- package/packages/cli/dist/commands/config/validate.js.map +1 -0
- package/packages/cli/dist/commands/daemon/restart.d.ts +15 -0
- package/packages/cli/dist/commands/daemon/restart.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/restart.js +184 -0
- package/packages/cli/dist/commands/daemon/restart.js.map +1 -0
- package/packages/cli/dist/commands/daemon/start.d.ts +7 -0
- package/packages/cli/dist/commands/daemon/start.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/start.js +85 -0
- package/packages/cli/dist/commands/daemon/start.js.map +1 -0
- package/packages/cli/dist/commands/daemon/status.d.ts +7 -0
- package/packages/cli/dist/commands/daemon/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/status.js +69 -0
- package/packages/cli/dist/commands/daemon/status.js.map +1 -0
- package/packages/cli/dist/commands/daemon/stop.d.ts +8 -0
- package/packages/cli/dist/commands/daemon/stop.d.ts.map +1 -0
- package/packages/cli/dist/commands/daemon/stop.js +77 -0
- package/packages/cli/dist/commands/daemon/stop.js.map +1 -0
- package/packages/cli/dist/commands/import/mcpm.d.ts +10 -0
- package/packages/cli/dist/commands/import/mcpm.d.ts.map +1 -0
- package/packages/cli/dist/commands/import/mcpm.js +58 -0
- package/packages/cli/dist/commands/import/mcpm.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.d.ts +16 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.js +72 -0
- package/packages/cli/dist/commands/safety/add-risky-pattern.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky.d.ts +12 -0
- package/packages/cli/dist/commands/safety/add-risky.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-risky.js +52 -0
- package/packages/cli/dist/commands/safety/add-risky.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.d.ts +16 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.js +72 -0
- package/packages/cli/dist/commands/safety/add-safe-pattern.js.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe.d.ts +12 -0
- package/packages/cli/dist/commands/safety/add-safe.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/add-safe.js +52 -0
- package/packages/cli/dist/commands/safety/add-safe.js.map +1 -0
- package/packages/cli/dist/commands/safety/check.d.ts +9 -0
- package/packages/cli/dist/commands/safety/check.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/check.js +36 -0
- package/packages/cli/dist/commands/safety/check.js.map +1 -0
- package/packages/cli/dist/commands/safety/export.d.ts +10 -0
- package/packages/cli/dist/commands/safety/export.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/export.js +48 -0
- package/packages/cli/dist/commands/safety/export.js.map +1 -0
- package/packages/cli/dist/commands/safety/import.d.ts +12 -0
- package/packages/cli/dist/commands/safety/import.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/import.js +78 -0
- package/packages/cli/dist/commands/safety/import.js.map +1 -0
- package/packages/cli/dist/commands/safety/index.d.ts +8 -0
- package/packages/cli/dist/commands/safety/index.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/index.js +46 -0
- package/packages/cli/dist/commands/safety/index.js.map +1 -0
- package/packages/cli/dist/commands/safety/list.d.ts +6 -0
- package/packages/cli/dist/commands/safety/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/list.js +77 -0
- package/packages/cli/dist/commands/safety/list.js.map +1 -0
- package/packages/cli/dist/commands/safety/remove.d.ts +9 -0
- package/packages/cli/dist/commands/safety/remove.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/remove.js +46 -0
- package/packages/cli/dist/commands/safety/remove.js.map +1 -0
- package/packages/cli/dist/commands/safety/reset.d.ts +9 -0
- package/packages/cli/dist/commands/safety/reset.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/reset.js +46 -0
- package/packages/cli/dist/commands/safety/reset.js.map +1 -0
- package/packages/cli/dist/commands/safety/validate.d.ts +9 -0
- package/packages/cli/dist/commands/safety/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/safety/validate.js +51 -0
- package/packages/cli/dist/commands/safety/validate.js.map +1 -0
- package/packages/cli/dist/commands/secret/get.d.ts +9 -0
- package/packages/cli/dist/commands/secret/get.d.ts.map +1 -0
- package/packages/cli/dist/commands/secret/get.js +26 -0
- package/packages/cli/dist/commands/secret/get.js.map +1 -0
- package/packages/cli/dist/commands/secret/set.d.ts +10 -0
- package/packages/cli/dist/commands/secret/set.d.ts.map +1 -0
- package/packages/cli/dist/commands/secret/set.js +22 -0
- package/packages/cli/dist/commands/secret/set.js.map +1 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.d.ts +2 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.js +234 -0
- package/packages/cli/dist/commands/server/__tests__/server-management-e2e.test.js.map +1 -0
- package/packages/cli/dist/commands/server/add.d.ts +14 -0
- package/packages/cli/dist/commands/server/add.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/add.js +86 -0
- package/packages/cli/dist/commands/server/add.js.map +1 -0
- package/packages/cli/dist/commands/server/available.d.ts +10 -0
- package/packages/cli/dist/commands/server/available.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/available.js +62 -0
- package/packages/cli/dist/commands/server/available.js.map +1 -0
- package/packages/cli/dist/commands/server/debug.d.ts +18 -0
- package/packages/cli/dist/commands/server/debug.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/debug.js +165 -0
- package/packages/cli/dist/commands/server/debug.js.map +1 -0
- package/packages/cli/dist/commands/server/info.d.ts +13 -0
- package/packages/cli/dist/commands/server/info.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/info.js +62 -0
- package/packages/cli/dist/commands/server/info.js.map +1 -0
- package/packages/cli/dist/commands/server/list.d.ts +10 -0
- package/packages/cli/dist/commands/server/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/list.js +105 -0
- package/packages/cli/dist/commands/server/list.js.map +1 -0
- package/packages/cli/dist/commands/server/refresh-tools.d.ts +13 -0
- package/packages/cli/dist/commands/server/refresh-tools.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/refresh-tools.js +46 -0
- package/packages/cli/dist/commands/server/refresh-tools.js.map +1 -0
- package/packages/cli/dist/commands/server/remove.d.ts +12 -0
- package/packages/cli/dist/commands/server/remove.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/remove.js +39 -0
- package/packages/cli/dist/commands/server/remove.js.map +1 -0
- package/packages/cli/dist/commands/server/restart.d.ts +9 -0
- package/packages/cli/dist/commands/server/restart.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/restart.js +30 -0
- package/packages/cli/dist/commands/server/restart.js.map +1 -0
- package/packages/cli/dist/commands/server/start.d.ts +9 -0
- package/packages/cli/dist/commands/server/start.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/start.js +37 -0
- package/packages/cli/dist/commands/server/start.js.map +1 -0
- package/packages/cli/dist/commands/server/status.d.ts +9 -0
- package/packages/cli/dist/commands/server/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/status.js +30 -0
- package/packages/cli/dist/commands/server/status.js.map +1 -0
- package/packages/cli/dist/commands/server/stop.d.ts +9 -0
- package/packages/cli/dist/commands/server/stop.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/stop.js +31 -0
- package/packages/cli/dist/commands/server/stop.js.map +1 -0
- package/packages/cli/dist/commands/server/validate.d.ts +15 -0
- package/packages/cli/dist/commands/server/validate.d.ts.map +1 -0
- package/packages/cli/dist/commands/server/validate.js +87 -0
- package/packages/cli/dist/commands/server/validate.js.map +1 -0
- package/packages/cli/dist/commands/stdio.d.ts +36 -0
- package/packages/cli/dist/commands/stdio.d.ts.map +1 -0
- package/packages/cli/dist/commands/stdio.js +85 -0
- package/packages/cli/dist/commands/stdio.js.map +1 -0
- package/packages/cli/dist/commands/tool/execute-confirm.d.ts +12 -0
- package/packages/cli/dist/commands/tool/execute-confirm.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/execute-confirm.js +98 -0
- package/packages/cli/dist/commands/tool/execute-confirm.js.map +1 -0
- package/packages/cli/dist/commands/tool/execute.d.ts +12 -0
- package/packages/cli/dist/commands/tool/execute.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/execute.js +55 -0
- package/packages/cli/dist/commands/tool/execute.js.map +1 -0
- package/packages/cli/dist/commands/tool/list.d.ts +13 -0
- package/packages/cli/dist/commands/tool/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/list.js +91 -0
- package/packages/cli/dist/commands/tool/list.js.map +1 -0
- package/packages/cli/dist/commands/tool/search.d.ts +12 -0
- package/packages/cli/dist/commands/tool/search.d.ts.map +1 -0
- package/packages/cli/dist/commands/tool/search.js +87 -0
- package/packages/cli/dist/commands/tool/search.js.map +1 -0
- package/packages/cli/dist/index.d.ts +2 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +9 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/utils/daemon-checker.d.ts +18 -0
- package/packages/cli/dist/utils/daemon-checker.d.ts.map +1 -0
- package/packages/cli/dist/utils/daemon-checker.js +69 -0
- package/packages/cli/dist/utils/daemon-checker.js.map +1 -0
- package/packages/cli/dist/utils/daemon-endpoint.d.ts +7 -0
- package/packages/cli/dist/utils/daemon-endpoint.d.ts.map +1 -0
- package/packages/cli/dist/utils/daemon-endpoint.js +13 -0
- package/packages/cli/dist/utils/daemon-endpoint.js.map +1 -0
- package/packages/cli/dist/utils/get-configured-port.d.ts +43 -0
- package/packages/cli/dist/utils/get-configured-port.d.ts.map +1 -0
- package/packages/cli/dist/utils/get-configured-port.js +141 -0
- package/packages/cli/dist/utils/get-configured-port.js.map +1 -0
- package/packages/cli/dist/utils/stdio-bridge.d.ts +48 -0
- package/packages/cli/dist/utils/stdio-bridge.d.ts.map +1 -0
- package/packages/cli/dist/utils/stdio-bridge.js +181 -0
- package/packages/cli/dist/utils/stdio-bridge.js.map +1 -0
- package/packages/cli/package.json +48 -0
- package/packages/core/dist/config/defaults.d.ts +36 -0
- package/packages/core/dist/config/defaults.d.ts.map +1 -0
- package/packages/core/dist/config/defaults.js +324 -0
- package/packages/core/dist/config/defaults.js.map +1 -0
- package/packages/core/dist/config/index.d.ts +9 -0
- package/packages/core/dist/config/index.d.ts.map +1 -0
- package/packages/core/dist/config/index.js +14 -0
- package/packages/core/dist/config/index.js.map +1 -0
- package/packages/core/dist/config/loader.d.ts +269 -0
- package/packages/core/dist/config/loader.d.ts.map +1 -0
- package/packages/core/dist/config/loader.js +777 -0
- package/packages/core/dist/config/loader.js.map +1 -0
- package/packages/core/dist/config/registry.d.ts +212 -0
- package/packages/core/dist/config/registry.d.ts.map +1 -0
- package/packages/core/dist/config/registry.js +754 -0
- package/packages/core/dist/config/registry.js.map +1 -0
- package/packages/core/dist/config/schema.d.ts +4352 -0
- package/packages/core/dist/config/schema.d.ts.map +1 -0
- package/packages/core/dist/config/schema.js +267 -0
- package/packages/core/dist/config/schema.js.map +1 -0
- package/packages/core/dist/daemon.d.ts +7 -0
- package/packages/core/dist/daemon.d.ts.map +1 -0
- package/packages/core/dist/daemon.js +116 -0
- package/packages/core/dist/daemon.js.map +1 -0
- package/packages/core/dist/http-client-retry.d.ts +67 -0
- package/packages/core/dist/http-client-retry.d.ts.map +1 -0
- package/packages/core/dist/http-client-retry.js +133 -0
- package/packages/core/dist/http-client-retry.js.map +1 -0
- package/packages/core/dist/http-client-updated.d.ts +147 -0
- package/packages/core/dist/http-client-updated.d.ts.map +1 -0
- package/packages/core/dist/http-client-updated.js +452 -0
- package/packages/core/dist/http-client-updated.js.map +1 -0
- package/packages/core/dist/http-client.d.ts +207 -0
- package/packages/core/dist/http-client.d.ts.map +1 -0
- package/packages/core/dist/http-client.js +704 -0
- package/packages/core/dist/http-client.js.map +1 -0
- package/packages/core/dist/index.d.ts +13 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +23 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/logging/index.d.ts +46 -0
- package/packages/core/dist/logging/index.d.ts.map +1 -0
- package/packages/core/dist/logging/index.js +74 -0
- package/packages/core/dist/logging/index.js.map +1 -0
- package/packages/core/dist/metrics/index.d.ts +339 -0
- package/packages/core/dist/metrics/index.d.ts.map +1 -0
- package/packages/core/dist/metrics/index.js +792 -0
- package/packages/core/dist/metrics/index.js.map +1 -0
- package/packages/core/dist/plugins/index.d.ts +49 -0
- package/packages/core/dist/plugins/index.d.ts.map +1 -0
- package/packages/core/dist/plugins/index.js +82 -0
- package/packages/core/dist/plugins/index.js.map +1 -0
- package/packages/core/dist/secrets/index.d.ts +6 -0
- package/packages/core/dist/secrets/index.d.ts.map +1 -0
- package/packages/core/dist/secrets/index.js +5 -0
- package/packages/core/dist/secrets/index.js.map +1 -0
- package/packages/core/dist/secrets/keyring.d.ts +54 -0
- package/packages/core/dist/secrets/keyring.d.ts.map +1 -0
- package/packages/core/dist/secrets/keyring.js +141 -0
- package/packages/core/dist/secrets/keyring.js.map +1 -0
- package/packages/core/dist/server/batch-executor.d.ts +83 -0
- package/packages/core/dist/server/batch-executor.d.ts.map +1 -0
- package/packages/core/dist/server/batch-executor.js +291 -0
- package/packages/core/dist/server/batch-executor.js.map +1 -0
- package/packages/core/dist/server/circuit-breaker.d.ts +215 -0
- package/packages/core/dist/server/circuit-breaker.d.ts.map +1 -0
- package/packages/core/dist/server/circuit-breaker.js +330 -0
- package/packages/core/dist/server/circuit-breaker.js.map +1 -0
- package/packages/core/dist/server/client-detection.d.ts +40 -0
- package/packages/core/dist/server/client-detection.d.ts.map +1 -0
- package/packages/core/dist/server/client-detection.js +242 -0
- package/packages/core/dist/server/client-detection.js.map +1 -0
- package/packages/core/dist/server/client-profiles.d.ts +102 -0
- package/packages/core/dist/server/client-profiles.d.ts.map +1 -0
- package/packages/core/dist/server/client-profiles.js +254 -0
- package/packages/core/dist/server/client-profiles.js.map +1 -0
- package/packages/core/dist/server/http.d.ts +386 -0
- package/packages/core/dist/server/http.d.ts.map +1 -0
- package/packages/core/dist/server/http.js +4253 -0
- package/packages/core/dist/server/http.js.map +1 -0
- package/packages/core/dist/server/index.d.ts +7 -0
- package/packages/core/dist/server/index.d.ts.map +1 -0
- package/packages/core/dist/server/index.js +6 -0
- package/packages/core/dist/server/index.js.map +1 -0
- package/packages/core/dist/server/manager.d.ts +458 -0
- package/packages/core/dist/server/manager.d.ts.map +1 -0
- package/packages/core/dist/server/manager.js +3255 -0
- package/packages/core/dist/server/manager.js.map +1 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.d.ts +69 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.d.ts.map +1 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.js +214 -0
- package/packages/core/dist/server/managers/HttpConnectionManager.js.map +1 -0
- package/packages/core/dist/server/managers/ProcessManager.d.ts +128 -0
- package/packages/core/dist/server/managers/ProcessManager.d.ts.map +1 -0
- package/packages/core/dist/server/managers/ProcessManager.js +443 -0
- package/packages/core/dist/server/managers/ProcessManager.js.map +1 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.d.ts +152 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.d.ts.map +1 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.js +426 -0
- package/packages/core/dist/server/managers/SchemaCacheManager.js.map +1 -0
- package/packages/core/dist/server/managers/index.d.ts +9 -0
- package/packages/core/dist/server/managers/index.d.ts.map +1 -0
- package/packages/core/dist/server/managers/index.js +9 -0
- package/packages/core/dist/server/managers/index.js.map +1 -0
- package/packages/core/dist/server/metrics.d.ts +134 -0
- package/packages/core/dist/server/metrics.d.ts.map +1 -0
- package/packages/core/dist/server/metrics.js +273 -0
- package/packages/core/dist/server/metrics.js.map +1 -0
- package/packages/core/dist/server/prompts.d.ts +58 -0
- package/packages/core/dist/server/prompts.d.ts.map +1 -0
- package/packages/core/dist/server/prompts.js +405 -0
- package/packages/core/dist/server/prompts.js.map +1 -0
- package/packages/core/dist/server/protocol-versions.d.ts +49 -0
- package/packages/core/dist/server/protocol-versions.d.ts.map +1 -0
- package/packages/core/dist/server/protocol-versions.js +173 -0
- package/packages/core/dist/server/protocol-versions.js.map +1 -0
- package/packages/core/dist/server/resources.d.ts +64 -0
- package/packages/core/dist/server/resources.d.ts.map +1 -0
- package/packages/core/dist/server/resources.js +243 -0
- package/packages/core/dist/server/resources.js.map +1 -0
- package/packages/core/dist/server/schema-store.d.ts +84 -0
- package/packages/core/dist/server/schema-store.d.ts.map +1 -0
- package/packages/core/dist/server/schema-store.js +234 -0
- package/packages/core/dist/server/schema-store.js.map +1 -0
- package/packages/core/dist/server/schema-validator.d.ts +51 -0
- package/packages/core/dist/server/schema-validator.d.ts.map +1 -0
- package/packages/core/dist/server/schema-validator.js +208 -0
- package/packages/core/dist/server/schema-validator.js.map +1 -0
- package/packages/core/dist/server/token-calculator.d.ts +44 -0
- package/packages/core/dist/server/token-calculator.d.ts.map +1 -0
- package/packages/core/dist/server/token-calculator.js +53 -0
- package/packages/core/dist/server/token-calculator.js.map +1 -0
- package/packages/core/dist/server/types.d.ts +45 -0
- package/packages/core/dist/server/types.d.ts.map +1 -0
- package/packages/core/dist/server/types.js +5 -0
- package/packages/core/dist/server/types.js.map +1 -0
- package/packages/core/dist/utils/file-lock.d.ts +73 -0
- package/packages/core/dist/utils/file-lock.d.ts.map +1 -0
- package/packages/core/dist/utils/file-lock.js +235 -0
- package/packages/core/dist/utils/file-lock.js.map +1 -0
- package/packages/core/package.json +36 -0
- package/packages/dashboard/dist/assets/index-B7hvkCMu.css +1 -0
- package/packages/dashboard/dist/assets/index-yZhLPpzr.js +1 -0
- package/packages/dashboard/dist/index.html +14 -0
- package/packages/dashboard/package.json +24 -0
- package/packages/shared/dist/version.d.ts +2 -0
- package/packages/shared/dist/version.d.ts.map +1 -0
- package/packages/shared/dist/version.js +2 -0
- package/packages/shared/dist/version.js.map +1 -0
- package/packages/shared/package.json +18 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Implementation for MetaLink
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascade failures by monitoring server health and temporarily
|
|
5
|
+
* blocking requests to failing servers. Implements the Circuit Breaker pattern
|
|
6
|
+
* with three states: CLOSED, OPEN, and HALF_OPEN.
|
|
7
|
+
*
|
|
8
|
+
* @see https://martinfowler.com/bliki/CircuitBreaker.html
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Circuit breaker states
|
|
12
|
+
*
|
|
13
|
+
* - CLOSED: Normal operation, requests flow through
|
|
14
|
+
* - OPEN: Server is failing, requests blocked immediately
|
|
15
|
+
* - HALF_OPEN: Testing if server has recovered, limited requests allowed
|
|
16
|
+
*/
|
|
17
|
+
export var CircuitState;
|
|
18
|
+
(function (CircuitState) {
|
|
19
|
+
CircuitState["CLOSED"] = "CLOSED";
|
|
20
|
+
CircuitState["OPEN"] = "OPEN";
|
|
21
|
+
CircuitState["HALF_OPEN"] = "HALF_OPEN";
|
|
22
|
+
})(CircuitState || (CircuitState = {}));
|
|
23
|
+
/**
|
|
24
|
+
* Circuit Breaker implementation
|
|
25
|
+
*
|
|
26
|
+
* Monitors server health and prevents cascade failures by temporarily blocking
|
|
27
|
+
* requests to failing servers. Automatically recovers when server becomes healthy.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const breaker = new CircuitBreaker('memory-server', {
|
|
32
|
+
* failureThreshold: 3,
|
|
33
|
+
* resetTimeout: 30000,
|
|
34
|
+
* halfOpenSuccessThreshold: 1,
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Before making request
|
|
38
|
+
* if (!breaker.canExecute()) {
|
|
39
|
+
* throw new Error('Circuit breaker is OPEN');
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* try {
|
|
43
|
+
* const result = await makeRequest();
|
|
44
|
+
* breaker.recordSuccess();
|
|
45
|
+
* return result;
|
|
46
|
+
* } catch (error) {
|
|
47
|
+
* breaker.recordFailure();
|
|
48
|
+
* throw error;
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export class CircuitBreaker {
|
|
53
|
+
/**
|
|
54
|
+
* Create a new circuit breaker for a server
|
|
55
|
+
*
|
|
56
|
+
* @param serverName - Name of the server being protected
|
|
57
|
+
* @param config - Circuit breaker configuration options
|
|
58
|
+
*/
|
|
59
|
+
constructor(serverName, config = {}) {
|
|
60
|
+
this.state = CircuitState.CLOSED;
|
|
61
|
+
this.failureCount = 0;
|
|
62
|
+
this.successCount = 0;
|
|
63
|
+
this.lastFailureTime = null;
|
|
64
|
+
this.lastSuccessTime = null;
|
|
65
|
+
this.stateChangedAt = Date.now();
|
|
66
|
+
this.resetTimer = null;
|
|
67
|
+
// Metrics tracking
|
|
68
|
+
this.totalRequests = 0;
|
|
69
|
+
this.rejectedRequests = 0;
|
|
70
|
+
this.serverName = serverName;
|
|
71
|
+
this.config = {
|
|
72
|
+
failureThreshold: config.failureThreshold ?? 3,
|
|
73
|
+
resetTimeout: config.resetTimeout ?? 30000,
|
|
74
|
+
halfOpenSuccessThreshold: config.halfOpenSuccessThreshold ?? 1,
|
|
75
|
+
onStateChange: config.onStateChange ?? (() => { }),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a request can be executed
|
|
80
|
+
*
|
|
81
|
+
* @returns true if request should proceed, false if circuit is OPEN
|
|
82
|
+
*/
|
|
83
|
+
canExecute() {
|
|
84
|
+
this.totalRequests++;
|
|
85
|
+
switch (this.state) {
|
|
86
|
+
case CircuitState.CLOSED:
|
|
87
|
+
return true;
|
|
88
|
+
case CircuitState.OPEN:
|
|
89
|
+
// Check if reset timeout has elapsed
|
|
90
|
+
if (this.shouldAttemptReset()) {
|
|
91
|
+
this.transitionTo(CircuitState.HALF_OPEN);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
this.rejectedRequests++;
|
|
95
|
+
return false;
|
|
96
|
+
case CircuitState.HALF_OPEN:
|
|
97
|
+
// Allow limited requests in HALF_OPEN state
|
|
98
|
+
return true;
|
|
99
|
+
default:
|
|
100
|
+
// Should never reach here
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Record a successful operation
|
|
106
|
+
*
|
|
107
|
+
* Resets failure count and may transition circuit to CLOSED state
|
|
108
|
+
*/
|
|
109
|
+
recordSuccess() {
|
|
110
|
+
this.lastSuccessTime = Date.now();
|
|
111
|
+
switch (this.state) {
|
|
112
|
+
case CircuitState.CLOSED:
|
|
113
|
+
// Reset failure count on success
|
|
114
|
+
this.failureCount = 0;
|
|
115
|
+
break;
|
|
116
|
+
case CircuitState.HALF_OPEN:
|
|
117
|
+
this.successCount++;
|
|
118
|
+
if (this.successCount >= this.config.halfOpenSuccessThreshold) {
|
|
119
|
+
this.transitionTo(CircuitState.CLOSED);
|
|
120
|
+
this.failureCount = 0;
|
|
121
|
+
this.successCount = 0;
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case CircuitState.OPEN:
|
|
125
|
+
// Should not receive success in OPEN state, but handle gracefully
|
|
126
|
+
console.warn(`[CircuitBreaker] Unexpected success in OPEN state for ${this.serverName}`);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Record a failed operation
|
|
132
|
+
*
|
|
133
|
+
* Increments failure count and may transition circuit to OPEN state
|
|
134
|
+
*/
|
|
135
|
+
recordFailure() {
|
|
136
|
+
this.lastFailureTime = Date.now();
|
|
137
|
+
this.failureCount++;
|
|
138
|
+
switch (this.state) {
|
|
139
|
+
case CircuitState.CLOSED:
|
|
140
|
+
if (this.failureCount >= this.config.failureThreshold) {
|
|
141
|
+
this.transitionTo(CircuitState.OPEN);
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
case CircuitState.HALF_OPEN:
|
|
145
|
+
// Immediate transition to OPEN on failure during recovery test
|
|
146
|
+
this.transitionTo(CircuitState.OPEN);
|
|
147
|
+
this.successCount = 0;
|
|
148
|
+
break;
|
|
149
|
+
case CircuitState.OPEN:
|
|
150
|
+
// Already open, just update timestamp
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get current circuit breaker state
|
|
156
|
+
*
|
|
157
|
+
* @returns Current state (CLOSED, OPEN, or HALF_OPEN)
|
|
158
|
+
*/
|
|
159
|
+
getState() {
|
|
160
|
+
return this.state;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get circuit breaker metrics
|
|
164
|
+
*
|
|
165
|
+
* @returns Current metrics including state, failure count, etc.
|
|
166
|
+
*/
|
|
167
|
+
getMetrics() {
|
|
168
|
+
return {
|
|
169
|
+
state: this.state,
|
|
170
|
+
failures: this.failureCount,
|
|
171
|
+
successes: this.successCount,
|
|
172
|
+
lastFailureTime: this.lastFailureTime,
|
|
173
|
+
lastSuccessTime: this.lastSuccessTime,
|
|
174
|
+
stateChangedAt: this.stateChangedAt,
|
|
175
|
+
totalRequests: this.totalRequests,
|
|
176
|
+
rejectedRequests: this.rejectedRequests,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Manually reset the circuit breaker to CLOSED state
|
|
181
|
+
*
|
|
182
|
+
* Use with caution - typically only for testing or administrative override
|
|
183
|
+
*/
|
|
184
|
+
reset() {
|
|
185
|
+
this.transitionTo(CircuitState.CLOSED);
|
|
186
|
+
this.failureCount = 0;
|
|
187
|
+
this.successCount = 0;
|
|
188
|
+
this.lastFailureTime = null;
|
|
189
|
+
this.lastSuccessTime = null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if enough time has passed to attempt reset
|
|
193
|
+
*
|
|
194
|
+
* @returns true if reset timeout has elapsed
|
|
195
|
+
*/
|
|
196
|
+
shouldAttemptReset() {
|
|
197
|
+
if (this.lastFailureTime === null) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
const timeSinceLastFailure = Date.now() - this.lastFailureTime;
|
|
201
|
+
return timeSinceLastFailure >= this.config.resetTimeout;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Transition to a new circuit state
|
|
205
|
+
*
|
|
206
|
+
* @param newState - Target state
|
|
207
|
+
*/
|
|
208
|
+
transitionTo(newState) {
|
|
209
|
+
const oldState = this.state;
|
|
210
|
+
if (oldState === newState) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.state = newState;
|
|
214
|
+
this.stateChangedAt = Date.now();
|
|
215
|
+
// Clear any existing reset timer
|
|
216
|
+
if (this.resetTimer) {
|
|
217
|
+
clearTimeout(this.resetTimer);
|
|
218
|
+
this.resetTimer = null;
|
|
219
|
+
}
|
|
220
|
+
// Schedule reset timer for OPEN state
|
|
221
|
+
if (newState === CircuitState.OPEN) {
|
|
222
|
+
this.resetTimer = setTimeout(() => {
|
|
223
|
+
if (this.state === CircuitState.OPEN) {
|
|
224
|
+
this.transitionTo(CircuitState.HALF_OPEN);
|
|
225
|
+
}
|
|
226
|
+
}, this.config.resetTimeout);
|
|
227
|
+
}
|
|
228
|
+
// Log state transition
|
|
229
|
+
console.log(`[CircuitBreaker] ${this.serverName}: ${oldState} → ${newState} ` +
|
|
230
|
+
`(failures: ${this.failureCount}, threshold: ${this.config.failureThreshold})`);
|
|
231
|
+
// Invoke callback
|
|
232
|
+
this.config.onStateChange(oldState, newState, this.serverName);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Clean up resources
|
|
236
|
+
*
|
|
237
|
+
* Call this when circuit breaker is no longer needed
|
|
238
|
+
*/
|
|
239
|
+
destroy() {
|
|
240
|
+
if (this.resetTimer) {
|
|
241
|
+
clearTimeout(this.resetTimer);
|
|
242
|
+
this.resetTimer = null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Circuit Breaker Manager
|
|
248
|
+
*
|
|
249
|
+
* Manages multiple circuit breakers for different servers.
|
|
250
|
+
* Provides centralized monitoring and control.
|
|
251
|
+
*/
|
|
252
|
+
export class CircuitBreakerManager {
|
|
253
|
+
/**
|
|
254
|
+
* Create a new circuit breaker manager
|
|
255
|
+
*
|
|
256
|
+
* @param defaultConfig - Default configuration for all circuit breakers
|
|
257
|
+
*/
|
|
258
|
+
constructor(defaultConfig = {}) {
|
|
259
|
+
this.breakers = new Map();
|
|
260
|
+
this.defaultConfig = defaultConfig;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get or create a circuit breaker for a server
|
|
264
|
+
*
|
|
265
|
+
* @param serverName - Name of the server
|
|
266
|
+
* @param config - Optional server-specific configuration
|
|
267
|
+
* @returns Circuit breaker instance
|
|
268
|
+
*/
|
|
269
|
+
getBreaker(serverName, config) {
|
|
270
|
+
let breaker = this.breakers.get(serverName);
|
|
271
|
+
if (!breaker) {
|
|
272
|
+
const finalConfig = { ...this.defaultConfig, ...config };
|
|
273
|
+
breaker = new CircuitBreaker(serverName, finalConfig);
|
|
274
|
+
this.breakers.set(serverName, breaker);
|
|
275
|
+
}
|
|
276
|
+
return breaker;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get all circuit breakers
|
|
280
|
+
*
|
|
281
|
+
* @returns Map of server names to circuit breakers
|
|
282
|
+
*/
|
|
283
|
+
getAllBreakers() {
|
|
284
|
+
return new Map(this.breakers);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get aggregated metrics for all circuit breakers
|
|
288
|
+
*
|
|
289
|
+
* @returns Array of metrics for all servers
|
|
290
|
+
*/
|
|
291
|
+
getAllMetrics() {
|
|
292
|
+
const results = [];
|
|
293
|
+
for (const [serverName, breaker] of this.breakers) {
|
|
294
|
+
results.push({
|
|
295
|
+
serverName,
|
|
296
|
+
metrics: breaker.getMetrics(),
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
return results;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Reset a specific circuit breaker
|
|
303
|
+
*
|
|
304
|
+
* @param serverName - Name of the server
|
|
305
|
+
*/
|
|
306
|
+
reset(serverName) {
|
|
307
|
+
const breaker = this.breakers.get(serverName);
|
|
308
|
+
if (breaker) {
|
|
309
|
+
breaker.reset();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Reset all circuit breakers
|
|
314
|
+
*/
|
|
315
|
+
resetAll() {
|
|
316
|
+
for (const breaker of this.breakers.values()) {
|
|
317
|
+
breaker.reset();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Clean up all circuit breakers
|
|
322
|
+
*/
|
|
323
|
+
destroy() {
|
|
324
|
+
for (const breaker of this.breakers.values()) {
|
|
325
|
+
breaker.destroy();
|
|
326
|
+
}
|
|
327
|
+
this.breakers.clear();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/server/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.1.8: Client Detection Module
|
|
3
|
+
* Detects client type and capabilities from request headers
|
|
4
|
+
* Supports: Claude Code, Raycast, Grok, Gemini, GPT, Cursor, Continue, MCP Remote
|
|
5
|
+
*/
|
|
6
|
+
export type ClientType = 'claude-code' | 'raycast' | 'grok' | 'gemini' | 'openai' | 'cursor' | 'continue' | 'mcp-remote' | 'unknown';
|
|
7
|
+
export interface ClientCapabilities {
|
|
8
|
+
type: ClientType;
|
|
9
|
+
name: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
userAgent?: string;
|
|
12
|
+
detectedFrom: 'clientInfo' | 'x-mcp-client' | 'user-agent' | 'fallback';
|
|
13
|
+
features: {
|
|
14
|
+
batchRequests: boolean;
|
|
15
|
+
streaming: boolean;
|
|
16
|
+
schemaFormat: 'standard' | 'raycast' | 'minimal';
|
|
17
|
+
toolsListChanged: boolean;
|
|
18
|
+
maxToolsPerResponse: number;
|
|
19
|
+
nestedArguments: boolean;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Detect client from headers (with priority order)
|
|
24
|
+
* Priority: clientInfo > X-MCP-Client > User-Agent > fallback
|
|
25
|
+
*/
|
|
26
|
+
export declare function detectClientCapabilities(headers: {
|
|
27
|
+
'x-mcp-client'?: string;
|
|
28
|
+
'user-agent'?: string;
|
|
29
|
+
clientinfo?: string;
|
|
30
|
+
[key: string]: string | undefined;
|
|
31
|
+
}): ClientCapabilities;
|
|
32
|
+
/**
|
|
33
|
+
* Format client type for human-readable logging
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatClientForLogging(clientType: ClientType): string;
|
|
36
|
+
/**
|
|
37
|
+
* Test helper: Create mock headers for testing
|
|
38
|
+
*/
|
|
39
|
+
export declare function createMockHeaders(clientType: ClientType, version?: string): Record<string, string>;
|
|
40
|
+
//# sourceMappingURL=client-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-detection.d.ts","sourceRoot":"","sources":["../../src/server/client-detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAErI,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC;IACxE,QAAQ,EAAE;QACR,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;QACjD,gBAAgB,EAAE,OAAO,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;CACH;AA2LD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC,GAAG,kBAAkB,CA6CrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAcrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKlG"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.1.8: Client Detection Module
|
|
3
|
+
* Detects client type and capabilities from request headers
|
|
4
|
+
* Supports: Claude Code, Raycast, Grok, Gemini, GPT, Cursor, Continue, MCP Remote
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Detect client type from User-Agent string
|
|
8
|
+
*/
|
|
9
|
+
function parseUserAgent(userAgent) {
|
|
10
|
+
if (!userAgent)
|
|
11
|
+
return null;
|
|
12
|
+
const ua = userAgent.toLowerCase();
|
|
13
|
+
// Claude Code detection
|
|
14
|
+
if (ua.includes('claude-code') || ua.includes('claude-ai') || ua.includes('anthropic')) {
|
|
15
|
+
return 'claude-code';
|
|
16
|
+
}
|
|
17
|
+
// Raycast detection
|
|
18
|
+
if (ua.includes('raycast')) {
|
|
19
|
+
return 'raycast';
|
|
20
|
+
}
|
|
21
|
+
// Grok detection
|
|
22
|
+
if (ua.includes('grok') || ua.includes('x-grok')) {
|
|
23
|
+
return 'grok';
|
|
24
|
+
}
|
|
25
|
+
// Gemini detection
|
|
26
|
+
if (ua.includes('gemini') || ua.includes('google-gemini')) {
|
|
27
|
+
return 'gemini';
|
|
28
|
+
}
|
|
29
|
+
// OpenAI/GPT detection
|
|
30
|
+
if (ua.includes('chatgpt') || ua.includes('openai') || ua.includes('gpt')) {
|
|
31
|
+
return 'openai';
|
|
32
|
+
}
|
|
33
|
+
// Cursor detection
|
|
34
|
+
if (ua.includes('cursor') || ua.includes('cursor-ai')) {
|
|
35
|
+
return 'cursor';
|
|
36
|
+
}
|
|
37
|
+
// Continue detection
|
|
38
|
+
if (ua.includes('continue') || ua.includes('continue-dev')) {
|
|
39
|
+
return 'continue';
|
|
40
|
+
}
|
|
41
|
+
// MCP Remote detection
|
|
42
|
+
if (ua.includes('mcp-remote') || ua.includes('mcp-client')) {
|
|
43
|
+
return 'mcp-remote';
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Normalize client type string
|
|
49
|
+
*/
|
|
50
|
+
function normalizeClientType(clientType) {
|
|
51
|
+
const normalized = clientType.toLowerCase().trim();
|
|
52
|
+
switch (normalized) {
|
|
53
|
+
case 'claude-code':
|
|
54
|
+
case 'claude':
|
|
55
|
+
case 'claude-ai':
|
|
56
|
+
return 'claude-code';
|
|
57
|
+
case 'raycast':
|
|
58
|
+
return 'raycast';
|
|
59
|
+
case 'grok':
|
|
60
|
+
case 'x-grok':
|
|
61
|
+
return 'grok';
|
|
62
|
+
case 'gemini':
|
|
63
|
+
case 'google-gemini':
|
|
64
|
+
return 'gemini';
|
|
65
|
+
case 'openai':
|
|
66
|
+
case 'gpt':
|
|
67
|
+
case 'chatgpt':
|
|
68
|
+
return 'openai';
|
|
69
|
+
case 'cursor':
|
|
70
|
+
case 'cursor-ai':
|
|
71
|
+
return 'cursor';
|
|
72
|
+
case 'continue':
|
|
73
|
+
case 'continue-dev':
|
|
74
|
+
return 'continue';
|
|
75
|
+
case 'mcp-remote':
|
|
76
|
+
case 'mcp-client':
|
|
77
|
+
return 'mcp-remote';
|
|
78
|
+
default:
|
|
79
|
+
return 'unknown';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get client capabilities based on detected type
|
|
84
|
+
*/
|
|
85
|
+
function getClientCapabilities(clientType) {
|
|
86
|
+
switch (clientType) {
|
|
87
|
+
case 'claude-code':
|
|
88
|
+
return {
|
|
89
|
+
batchRequests: true,
|
|
90
|
+
streaming: true,
|
|
91
|
+
schemaFormat: 'standard',
|
|
92
|
+
toolsListChanged: true,
|
|
93
|
+
maxToolsPerResponse: 500,
|
|
94
|
+
nestedArguments: true
|
|
95
|
+
};
|
|
96
|
+
case 'raycast':
|
|
97
|
+
return {
|
|
98
|
+
batchRequests: false,
|
|
99
|
+
streaming: false,
|
|
100
|
+
schemaFormat: 'raycast',
|
|
101
|
+
toolsListChanged: false,
|
|
102
|
+
maxToolsPerResponse: 50,
|
|
103
|
+
nestedArguments: false
|
|
104
|
+
};
|
|
105
|
+
case 'grok':
|
|
106
|
+
return {
|
|
107
|
+
batchRequests: true,
|
|
108
|
+
streaming: true,
|
|
109
|
+
schemaFormat: 'standard',
|
|
110
|
+
toolsListChanged: true,
|
|
111
|
+
maxToolsPerResponse: 300,
|
|
112
|
+
nestedArguments: true
|
|
113
|
+
};
|
|
114
|
+
case 'gemini':
|
|
115
|
+
return {
|
|
116
|
+
batchRequests: false,
|
|
117
|
+
streaming: true,
|
|
118
|
+
schemaFormat: 'standard',
|
|
119
|
+
toolsListChanged: true,
|
|
120
|
+
maxToolsPerResponse: 200,
|
|
121
|
+
nestedArguments: true
|
|
122
|
+
};
|
|
123
|
+
case 'openai':
|
|
124
|
+
return {
|
|
125
|
+
batchRequests: true,
|
|
126
|
+
streaming: true,
|
|
127
|
+
schemaFormat: 'standard',
|
|
128
|
+
toolsListChanged: true,
|
|
129
|
+
maxToolsPerResponse: 400,
|
|
130
|
+
nestedArguments: true
|
|
131
|
+
};
|
|
132
|
+
case 'cursor':
|
|
133
|
+
return {
|
|
134
|
+
batchRequests: true,
|
|
135
|
+
streaming: true,
|
|
136
|
+
schemaFormat: 'standard',
|
|
137
|
+
toolsListChanged: true,
|
|
138
|
+
maxToolsPerResponse: 300,
|
|
139
|
+
nestedArguments: true
|
|
140
|
+
};
|
|
141
|
+
case 'continue':
|
|
142
|
+
return {
|
|
143
|
+
batchRequests: false,
|
|
144
|
+
streaming: true,
|
|
145
|
+
schemaFormat: 'standard',
|
|
146
|
+
toolsListChanged: true,
|
|
147
|
+
maxToolsPerResponse: 150,
|
|
148
|
+
nestedArguments: true
|
|
149
|
+
};
|
|
150
|
+
case 'mcp-remote':
|
|
151
|
+
return {
|
|
152
|
+
batchRequests: true,
|
|
153
|
+
streaming: false,
|
|
154
|
+
schemaFormat: 'standard',
|
|
155
|
+
toolsListChanged: true,
|
|
156
|
+
maxToolsPerResponse: 500,
|
|
157
|
+
nestedArguments: true
|
|
158
|
+
};
|
|
159
|
+
default:
|
|
160
|
+
return {
|
|
161
|
+
batchRequests: false,
|
|
162
|
+
streaming: false,
|
|
163
|
+
schemaFormat: 'standard',
|
|
164
|
+
toolsListChanged: false,
|
|
165
|
+
maxToolsPerResponse: 100,
|
|
166
|
+
nestedArguments: false
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Detect client from headers (with priority order)
|
|
172
|
+
* Priority: clientInfo > X-MCP-Client > User-Agent > fallback
|
|
173
|
+
*/
|
|
174
|
+
export function detectClientCapabilities(headers) {
|
|
175
|
+
let clientType = 'unknown';
|
|
176
|
+
let detectedFrom = 'fallback';
|
|
177
|
+
let version;
|
|
178
|
+
let userAgent = headers['user-agent'];
|
|
179
|
+
// Priority 1: clientInfo (Claude Code specific)
|
|
180
|
+
if (headers.clientinfo) {
|
|
181
|
+
try {
|
|
182
|
+
const clientInfo = JSON.parse(headers.clientinfo);
|
|
183
|
+
if (clientInfo.type) {
|
|
184
|
+
clientType = normalizeClientType(clientInfo.type);
|
|
185
|
+
detectedFrom = 'clientInfo';
|
|
186
|
+
version = clientInfo.version;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
// Fallback to next detection method
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Priority 2: X-MCP-Client header
|
|
194
|
+
if (detectedFrom === 'fallback' && headers['x-mcp-client']) {
|
|
195
|
+
clientType = normalizeClientType(headers['x-mcp-client']);
|
|
196
|
+
detectedFrom = 'x-mcp-client';
|
|
197
|
+
}
|
|
198
|
+
// Priority 3: User-Agent header
|
|
199
|
+
if (detectedFrom === 'fallback' && userAgent) {
|
|
200
|
+
const detected = parseUserAgent(userAgent);
|
|
201
|
+
if (detected) {
|
|
202
|
+
clientType = detected;
|
|
203
|
+
detectedFrom = 'user-agent';
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const features = getClientCapabilities(clientType);
|
|
207
|
+
return {
|
|
208
|
+
type: clientType,
|
|
209
|
+
name: formatClientForLogging(clientType),
|
|
210
|
+
version,
|
|
211
|
+
userAgent,
|
|
212
|
+
detectedFrom,
|
|
213
|
+
features
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Format client type for human-readable logging
|
|
218
|
+
*/
|
|
219
|
+
export function formatClientForLogging(clientType) {
|
|
220
|
+
const names = {
|
|
221
|
+
'claude-code': 'Claude Code',
|
|
222
|
+
'raycast': 'Raycast',
|
|
223
|
+
'grok': 'Grok',
|
|
224
|
+
'gemini': 'Gemini',
|
|
225
|
+
'openai': 'OpenAI/GPT',
|
|
226
|
+
'cursor': 'Cursor',
|
|
227
|
+
'continue': 'Continue',
|
|
228
|
+
'mcp-remote': 'MCP Remote',
|
|
229
|
+
'unknown': 'Unknown Client'
|
|
230
|
+
};
|
|
231
|
+
return names[clientType];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Test helper: Create mock headers for testing
|
|
235
|
+
*/
|
|
236
|
+
export function createMockHeaders(clientType, version) {
|
|
237
|
+
return {
|
|
238
|
+
'x-mcp-client': clientType,
|
|
239
|
+
'user-agent': `MockClient/${version || '1.0'} ${clientType}/1.0`
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=client-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-detection.js","sourceRoot":"","sources":["../../src/server/client-detection.ts"],"names":[],"mappings":"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"}
|