@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,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.2.0: Batch Executor Module
|
|
3
|
+
* Handles parallel tool execution with dependency resolution and error handling
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Batch executor - handles parallel and sequential task execution
|
|
7
|
+
*/
|
|
8
|
+
export class BatchExecutor {
|
|
9
|
+
/**
|
|
10
|
+
* Execute a batch of tasks with dependency resolution
|
|
11
|
+
*/
|
|
12
|
+
static async executeBatch(request, toolExecutor) {
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
const results = [];
|
|
15
|
+
const taskMap = new Map(request.tasks.map(t => [t.id, t]));
|
|
16
|
+
const resultMap = new Map();
|
|
17
|
+
const errors = [];
|
|
18
|
+
try {
|
|
19
|
+
// Validate and build dependency graph
|
|
20
|
+
const depGraph = this.buildDependencyGraph(request.tasks);
|
|
21
|
+
// Get execution order (topological sort)
|
|
22
|
+
const executionOrder = this.topologicalSort(depGraph);
|
|
23
|
+
// Execute tasks
|
|
24
|
+
const parallel = request.options?.parallel !== false;
|
|
25
|
+
const batchTimeout = request.options?.timeout || 60000;
|
|
26
|
+
const stopOnError = request.options?.stopOnError === true;
|
|
27
|
+
let theoreticalDuration = 0;
|
|
28
|
+
const startTimes = new Map();
|
|
29
|
+
const endTimes = new Map();
|
|
30
|
+
if (parallel) {
|
|
31
|
+
// Execute independent tasks concurrently
|
|
32
|
+
await this.executeParallel(executionOrder, taskMap, depGraph, resultMap, toolExecutor, stopOnError, batchTimeout, startTimes, endTimes, errors);
|
|
33
|
+
// Calculate parallelism savings
|
|
34
|
+
theoreticalDuration = Math.max(...Array.from(endTimes.values()).map(t => t - (Math.min(...Array.from(startTimes.values())) || 0)));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Execute tasks sequentially
|
|
38
|
+
for (const taskId of executionOrder) {
|
|
39
|
+
if (stopOnError && errors.length > 0)
|
|
40
|
+
break;
|
|
41
|
+
const task = taskMap.get(taskId);
|
|
42
|
+
if (!task)
|
|
43
|
+
continue;
|
|
44
|
+
const result = await this.executeTask(task, toolExecutor);
|
|
45
|
+
resultMap.set(taskId, result);
|
|
46
|
+
if (result.status === 'error') {
|
|
47
|
+
errors.push({ taskId, error: result.error?.message || 'Unknown error' });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Collect results in request order
|
|
52
|
+
for (const task of request.tasks) {
|
|
53
|
+
const result = resultMap.get(task.id);
|
|
54
|
+
if (result) {
|
|
55
|
+
results.push(result);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const totalDuration = Date.now() - startTime;
|
|
59
|
+
const successCount = results.filter(r => r.status === 'success').length;
|
|
60
|
+
const errorCount = results.filter(r => r.status === 'error').length;
|
|
61
|
+
const skippedCount = results.filter(r => r.status === 'skipped').length;
|
|
62
|
+
// Calculate parallelism savings
|
|
63
|
+
let parallelismSavings = 0;
|
|
64
|
+
if (parallel && theoreticalDuration > 0) {
|
|
65
|
+
const sequentialEstimate = results.reduce((sum, r) => sum + r.duration, 0);
|
|
66
|
+
parallelismSavings = ((sequentialEstimate - totalDuration) / sequentialEstimate) * 100;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
id: request.id,
|
|
70
|
+
results,
|
|
71
|
+
stats: {
|
|
72
|
+
totalDuration,
|
|
73
|
+
successCount,
|
|
74
|
+
errorCount,
|
|
75
|
+
skippedCount,
|
|
76
|
+
parallelismSavings: Math.max(0, parallelismSavings)
|
|
77
|
+
},
|
|
78
|
+
...(errors.length > 0 ? { errors } : {})
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new Error(`Batch execution failed: ${error.message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Build dependency graph from tasks
|
|
87
|
+
*/
|
|
88
|
+
static buildDependencyGraph(tasks) {
|
|
89
|
+
const graph = new Map();
|
|
90
|
+
// Initialize nodes
|
|
91
|
+
for (const task of tasks) {
|
|
92
|
+
graph.set(task.id, {
|
|
93
|
+
taskId: task.id,
|
|
94
|
+
dependencies: new Set(task.dependsOn || []),
|
|
95
|
+
dependents: new Set()
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Build reverse edges (dependents)
|
|
99
|
+
for (const task of tasks) {
|
|
100
|
+
if (task.dependsOn) {
|
|
101
|
+
for (const depId of task.dependsOn) {
|
|
102
|
+
const depNode = graph.get(depId);
|
|
103
|
+
if (depNode) {
|
|
104
|
+
depNode.dependents.add(task.id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Detect circular dependencies
|
|
110
|
+
this.detectCircularDependencies(graph);
|
|
111
|
+
return graph;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Detect circular dependencies in the graph
|
|
115
|
+
*/
|
|
116
|
+
static detectCircularDependencies(graph) {
|
|
117
|
+
const visited = new Set();
|
|
118
|
+
const visiting = new Set();
|
|
119
|
+
const dfs = (nodeId) => {
|
|
120
|
+
if (visited.has(nodeId))
|
|
121
|
+
return;
|
|
122
|
+
if (visiting.has(nodeId)) {
|
|
123
|
+
throw new Error(`Circular dependency detected involving task: ${nodeId}`);
|
|
124
|
+
}
|
|
125
|
+
visiting.add(nodeId);
|
|
126
|
+
const node = graph.get(nodeId);
|
|
127
|
+
if (node) {
|
|
128
|
+
for (const depId of node.dependencies) {
|
|
129
|
+
dfs(depId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
visiting.delete(nodeId);
|
|
133
|
+
visited.add(nodeId);
|
|
134
|
+
};
|
|
135
|
+
for (const taskId of graph.keys()) {
|
|
136
|
+
if (!visited.has(taskId)) {
|
|
137
|
+
dfs(taskId);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Topological sort of task dependencies
|
|
143
|
+
*/
|
|
144
|
+
static topologicalSort(graph) {
|
|
145
|
+
const result = [];
|
|
146
|
+
const visited = new Set();
|
|
147
|
+
const visiting = new Set();
|
|
148
|
+
const visit = (nodeId) => {
|
|
149
|
+
if (visited.has(nodeId))
|
|
150
|
+
return;
|
|
151
|
+
if (visiting.has(nodeId)) {
|
|
152
|
+
throw new Error(`Circular dependency detected involving task: ${nodeId}`);
|
|
153
|
+
}
|
|
154
|
+
visiting.add(nodeId);
|
|
155
|
+
const node = graph.get(nodeId);
|
|
156
|
+
if (node) {
|
|
157
|
+
for (const depId of node.dependencies) {
|
|
158
|
+
visit(depId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
visiting.delete(nodeId);
|
|
162
|
+
visited.add(nodeId);
|
|
163
|
+
result.push(nodeId);
|
|
164
|
+
};
|
|
165
|
+
for (const taskId of graph.keys()) {
|
|
166
|
+
if (!visited.has(taskId)) {
|
|
167
|
+
visit(taskId);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Execute independent tasks in parallel
|
|
174
|
+
*/
|
|
175
|
+
static async executeParallel(executionOrder, taskMap, depGraph, resultMap, toolExecutor, stopOnError, batchTimeout, startTimes, endTimes, errors) {
|
|
176
|
+
const completed = new Set();
|
|
177
|
+
const batchStartTime = Date.now();
|
|
178
|
+
for (const taskId of executionOrder) {
|
|
179
|
+
// Check batch timeout
|
|
180
|
+
if (Date.now() - batchStartTime > batchTimeout) {
|
|
181
|
+
throw new Error(`Batch timeout exceeded (${batchTimeout}ms)`);
|
|
182
|
+
}
|
|
183
|
+
// Check if dependencies are met
|
|
184
|
+
const node = depGraph.get(taskId);
|
|
185
|
+
if (node && node.dependencies.size > 0) {
|
|
186
|
+
const unmetDeps = Array.from(node.dependencies).filter(d => !completed.has(d));
|
|
187
|
+
if (unmetDeps.length > 0) {
|
|
188
|
+
// Wait for dependencies
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const task = taskMap.get(taskId);
|
|
193
|
+
if (!task)
|
|
194
|
+
continue;
|
|
195
|
+
if (stopOnError && errors.length > 0) {
|
|
196
|
+
resultMap.set(taskId, {
|
|
197
|
+
taskId,
|
|
198
|
+
status: 'skipped',
|
|
199
|
+
duration: 0,
|
|
200
|
+
attempt: 1
|
|
201
|
+
});
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
startTimes.set(taskId, Date.now());
|
|
205
|
+
const result = await this.executeTask(task, toolExecutor);
|
|
206
|
+
endTimes.set(taskId, Date.now());
|
|
207
|
+
resultMap.set(taskId, result);
|
|
208
|
+
completed.add(taskId);
|
|
209
|
+
if (result.status === 'error') {
|
|
210
|
+
errors.push({ taskId, error: result.error?.message || 'Unknown error' });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Execute a single task with retry logic
|
|
216
|
+
*/
|
|
217
|
+
static async executeTask(task, toolExecutor) {
|
|
218
|
+
const startTime = Date.now();
|
|
219
|
+
const maxRetries = task.retryCount || 0;
|
|
220
|
+
let lastError = null;
|
|
221
|
+
for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
|
|
222
|
+
try {
|
|
223
|
+
const result = await toolExecutor(task.tool, task.arguments, task.timeout);
|
|
224
|
+
return {
|
|
225
|
+
taskId: task.id,
|
|
226
|
+
status: 'success',
|
|
227
|
+
result,
|
|
228
|
+
duration: Date.now() - startTime,
|
|
229
|
+
attempt
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
lastError = error;
|
|
234
|
+
if (attempt < maxRetries + 1) {
|
|
235
|
+
// Exponential backoff: 100ms * 2^(attempt-1)
|
|
236
|
+
const delay = 100 * Math.pow(2, attempt - 1);
|
|
237
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// All retries exhausted
|
|
242
|
+
return {
|
|
243
|
+
taskId: task.id,
|
|
244
|
+
status: 'error',
|
|
245
|
+
error: {
|
|
246
|
+
code: 'TOOL_EXECUTION_FAILED',
|
|
247
|
+
message: lastError?.message || 'Tool execution failed',
|
|
248
|
+
data: lastError
|
|
249
|
+
},
|
|
250
|
+
duration: Date.now() - startTime,
|
|
251
|
+
attempt: maxRetries + 1
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Helper: Resolve output references in task arguments
|
|
257
|
+
* Example: "${task-1.result.id}" refers to task-1's result.id
|
|
258
|
+
*/
|
|
259
|
+
export function resolveOutputReferences(arguments_, resultMap) {
|
|
260
|
+
const resolved = {};
|
|
261
|
+
for (const [key, value] of Object.entries(arguments_)) {
|
|
262
|
+
if (typeof value === 'string' && value.startsWith('${') && value.endsWith('}')) {
|
|
263
|
+
// Parse reference: ${taskId.resultPath}
|
|
264
|
+
const refContent = value.slice(2, -1); // Remove ${ and }
|
|
265
|
+
const [taskId, ...pathParts] = refContent.split('.');
|
|
266
|
+
const taskResult = resultMap.get(taskId);
|
|
267
|
+
if (taskResult && taskResult.status === 'success') {
|
|
268
|
+
// Navigate through result object
|
|
269
|
+
let current = taskResult.result;
|
|
270
|
+
for (const part of pathParts) {
|
|
271
|
+
if (current && typeof current === 'object') {
|
|
272
|
+
current = current[part];
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
current = undefined;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
resolved[key] = current;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
resolved[key] = null; // Reference to failed task
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
resolved[key] = value;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return resolved;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=batch-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-executor.js","sourceRoot":"","sources":["../../src/server/batch-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
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 declare enum CircuitState {
|
|
18
|
+
CLOSED = "CLOSED",
|
|
19
|
+
OPEN = "OPEN",
|
|
20
|
+
HALF_OPEN = "HALF_OPEN"
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Circuit breaker configuration options
|
|
24
|
+
*/
|
|
25
|
+
export interface CircuitBreakerConfig {
|
|
26
|
+
/**
|
|
27
|
+
* Number of consecutive failures before opening circuit
|
|
28
|
+
* @default 3
|
|
29
|
+
*/
|
|
30
|
+
failureThreshold?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Time in milliseconds before attempting to close circuit after opening
|
|
33
|
+
* @default 30000 (30 seconds)
|
|
34
|
+
*/
|
|
35
|
+
resetTimeout?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Number of consecutive successes in HALF_OPEN state to close circuit
|
|
38
|
+
* @default 1
|
|
39
|
+
*/
|
|
40
|
+
halfOpenSuccessThreshold?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Optional callback invoked when circuit state changes
|
|
43
|
+
*/
|
|
44
|
+
onStateChange?: (oldState: CircuitState, newState: CircuitState, serverName: string) => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Circuit breaker metrics for monitoring
|
|
48
|
+
*/
|
|
49
|
+
export interface CircuitBreakerMetrics {
|
|
50
|
+
state: CircuitState;
|
|
51
|
+
failures: number;
|
|
52
|
+
successes: number;
|
|
53
|
+
lastFailureTime: number | null;
|
|
54
|
+
lastSuccessTime: number | null;
|
|
55
|
+
stateChangedAt: number;
|
|
56
|
+
totalRequests: number;
|
|
57
|
+
rejectedRequests: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Circuit Breaker implementation
|
|
61
|
+
*
|
|
62
|
+
* Monitors server health and prevents cascade failures by temporarily blocking
|
|
63
|
+
* requests to failing servers. Automatically recovers when server becomes healthy.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const breaker = new CircuitBreaker('memory-server', {
|
|
68
|
+
* failureThreshold: 3,
|
|
69
|
+
* resetTimeout: 30000,
|
|
70
|
+
* halfOpenSuccessThreshold: 1,
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // Before making request
|
|
74
|
+
* if (!breaker.canExecute()) {
|
|
75
|
+
* throw new Error('Circuit breaker is OPEN');
|
|
76
|
+
* }
|
|
77
|
+
*
|
|
78
|
+
* try {
|
|
79
|
+
* const result = await makeRequest();
|
|
80
|
+
* breaker.recordSuccess();
|
|
81
|
+
* return result;
|
|
82
|
+
* } catch (error) {
|
|
83
|
+
* breaker.recordFailure();
|
|
84
|
+
* throw error;
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare class CircuitBreaker {
|
|
89
|
+
private readonly serverName;
|
|
90
|
+
private readonly config;
|
|
91
|
+
private state;
|
|
92
|
+
private failureCount;
|
|
93
|
+
private successCount;
|
|
94
|
+
private lastFailureTime;
|
|
95
|
+
private lastSuccessTime;
|
|
96
|
+
private stateChangedAt;
|
|
97
|
+
private resetTimer;
|
|
98
|
+
private totalRequests;
|
|
99
|
+
private rejectedRequests;
|
|
100
|
+
/**
|
|
101
|
+
* Create a new circuit breaker for a server
|
|
102
|
+
*
|
|
103
|
+
* @param serverName - Name of the server being protected
|
|
104
|
+
* @param config - Circuit breaker configuration options
|
|
105
|
+
*/
|
|
106
|
+
constructor(serverName: string, config?: CircuitBreakerConfig);
|
|
107
|
+
/**
|
|
108
|
+
* Check if a request can be executed
|
|
109
|
+
*
|
|
110
|
+
* @returns true if request should proceed, false if circuit is OPEN
|
|
111
|
+
*/
|
|
112
|
+
canExecute(): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Record a successful operation
|
|
115
|
+
*
|
|
116
|
+
* Resets failure count and may transition circuit to CLOSED state
|
|
117
|
+
*/
|
|
118
|
+
recordSuccess(): void;
|
|
119
|
+
/**
|
|
120
|
+
* Record a failed operation
|
|
121
|
+
*
|
|
122
|
+
* Increments failure count and may transition circuit to OPEN state
|
|
123
|
+
*/
|
|
124
|
+
recordFailure(): void;
|
|
125
|
+
/**
|
|
126
|
+
* Get current circuit breaker state
|
|
127
|
+
*
|
|
128
|
+
* @returns Current state (CLOSED, OPEN, or HALF_OPEN)
|
|
129
|
+
*/
|
|
130
|
+
getState(): CircuitState;
|
|
131
|
+
/**
|
|
132
|
+
* Get circuit breaker metrics
|
|
133
|
+
*
|
|
134
|
+
* @returns Current metrics including state, failure count, etc.
|
|
135
|
+
*/
|
|
136
|
+
getMetrics(): CircuitBreakerMetrics;
|
|
137
|
+
/**
|
|
138
|
+
* Manually reset the circuit breaker to CLOSED state
|
|
139
|
+
*
|
|
140
|
+
* Use with caution - typically only for testing or administrative override
|
|
141
|
+
*/
|
|
142
|
+
reset(): void;
|
|
143
|
+
/**
|
|
144
|
+
* Check if enough time has passed to attempt reset
|
|
145
|
+
*
|
|
146
|
+
* @returns true if reset timeout has elapsed
|
|
147
|
+
*/
|
|
148
|
+
private shouldAttemptReset;
|
|
149
|
+
/**
|
|
150
|
+
* Transition to a new circuit state
|
|
151
|
+
*
|
|
152
|
+
* @param newState - Target state
|
|
153
|
+
*/
|
|
154
|
+
private transitionTo;
|
|
155
|
+
/**
|
|
156
|
+
* Clean up resources
|
|
157
|
+
*
|
|
158
|
+
* Call this when circuit breaker is no longer needed
|
|
159
|
+
*/
|
|
160
|
+
destroy(): void;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Circuit Breaker Manager
|
|
164
|
+
*
|
|
165
|
+
* Manages multiple circuit breakers for different servers.
|
|
166
|
+
* Provides centralized monitoring and control.
|
|
167
|
+
*/
|
|
168
|
+
export declare class CircuitBreakerManager {
|
|
169
|
+
private breakers;
|
|
170
|
+
private readonly defaultConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Create a new circuit breaker manager
|
|
173
|
+
*
|
|
174
|
+
* @param defaultConfig - Default configuration for all circuit breakers
|
|
175
|
+
*/
|
|
176
|
+
constructor(defaultConfig?: CircuitBreakerConfig);
|
|
177
|
+
/**
|
|
178
|
+
* Get or create a circuit breaker for a server
|
|
179
|
+
*
|
|
180
|
+
* @param serverName - Name of the server
|
|
181
|
+
* @param config - Optional server-specific configuration
|
|
182
|
+
* @returns Circuit breaker instance
|
|
183
|
+
*/
|
|
184
|
+
getBreaker(serverName: string, config?: CircuitBreakerConfig): CircuitBreaker;
|
|
185
|
+
/**
|
|
186
|
+
* Get all circuit breakers
|
|
187
|
+
*
|
|
188
|
+
* @returns Map of server names to circuit breakers
|
|
189
|
+
*/
|
|
190
|
+
getAllBreakers(): Map<string, CircuitBreaker>;
|
|
191
|
+
/**
|
|
192
|
+
* Get aggregated metrics for all circuit breakers
|
|
193
|
+
*
|
|
194
|
+
* @returns Array of metrics for all servers
|
|
195
|
+
*/
|
|
196
|
+
getAllMetrics(): Array<{
|
|
197
|
+
serverName: string;
|
|
198
|
+
metrics: CircuitBreakerMetrics;
|
|
199
|
+
}>;
|
|
200
|
+
/**
|
|
201
|
+
* Reset a specific circuit breaker
|
|
202
|
+
*
|
|
203
|
+
* @param serverName - Name of the server
|
|
204
|
+
*/
|
|
205
|
+
reset(serverName: string): void;
|
|
206
|
+
/**
|
|
207
|
+
* Reset all circuit breakers
|
|
208
|
+
*/
|
|
209
|
+
resetAll(): void;
|
|
210
|
+
/**
|
|
211
|
+
* Clean up all circuit breakers
|
|
212
|
+
*/
|
|
213
|
+
destroy(): void;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/server/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,oBAAY,YAAY;IACtB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9F;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAExD,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,UAAU,CAA+B;IAGjD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,gBAAgB,CAAa;IAErC;;;;;OAKG;gBACS,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,oBAAyB;IAUjE;;;;OAIG;IACH,UAAU,IAAI,OAAO;IA0BrB;;;;OAIG;IACH,aAAa,IAAI,IAAI;IAyBrB;;;;OAIG;IACH,aAAa,IAAI,IAAI;IAuBrB;;;;OAIG;IACH,QAAQ,IAAI,YAAY;IAIxB;;;;OAIG;IACH,UAAU,IAAI,qBAAqB;IAanC;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAmCpB;;;;OAIG;IACH,OAAO,IAAI,IAAI;CAMhB;AAED;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IAErD;;;;OAIG;gBACS,aAAa,GAAE,oBAAyB;IAIpD;;;;;;OAMG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,oBAAoB,GAAG,cAAc;IAY7E;;;;OAIG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAI7C;;;;OAIG;IACH,aAAa,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAa9E;;;;OAIG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAMhB;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
|