kynjal-cli 3.1.4 → 4.0.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/.claude/agents/core/coder.md +1 -1
- package/.claude/agents/core/planner.md +2 -2
- package/.claude/agents/core/researcher.md +1 -1
- package/.claude/agents/core/reviewer.md +1 -1
- package/.claude/agents/core/tester.md +1 -1
- package/.claude/agents/data/data-ml-model.md +4 -4
- package/.claude/agents/development/dev-backend-api.md +4 -4
- package/.claude/agents/documentation/docs-api-openapi.md +4 -4
- package/.claude/agents/github/code-review-swarm.md +2 -2
- package/.claude/agents/github/issue-tracker.md +2 -2
- package/.claude/agents/github/pr-manager.md +2 -2
- package/.claude/agents/github/release-manager.md +2 -2
- package/.claude/agents/github/workflow-automation.md +2 -2
- package/.claude/agents/sparc/architecture.md +3 -3
- package/.claude/agents/sparc/pseudocode.md +2 -2
- package/.claude/agents/sparc/refinement.md +3 -3
- package/.claude/agents/sparc/specification.md +2 -2
- package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
- package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
- package/.claude/agents/swarm/mesh-coordinator.md +1 -1
- package/.claude/agents/templates/base-template-generator.md +25 -4
- package/.claude/agents/templates/sparc-coordinator.md +3 -3
- package/.claude/helpers/auto-commit.sh +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +27 -9
- package/.claude/helpers/hook-handler.cjs +58 -18
- package/.claude/helpers/statusline.cjs +420 -613
- package/.claude/helpers/statusline.js +3 -3
- package/.claude/settings.json +9 -9
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
- package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
- package/README.md +383 -170
- package/bin/cli.js +6 -6
- package/bin/mcp-server.js +1 -1
- package/bin/preinstall.cjs +2 -0
- package/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +425 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +329 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +370 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +393 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +237 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +347 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +121 -21
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +215 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +406 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +2 -2
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +1 -1
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.d.ts.map +1 -0
- package/dist/src/commands/cleanup.js +218 -0
- package/dist/src/commands/cleanup.js.map +1 -0
- package/dist/src/commands/config.js +1 -1
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +81 -18
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +1 -1
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +99 -51
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1 -1
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/hive-mind.js +26 -26
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +800 -100
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +9 -2
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +20 -2
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +22 -18
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +23 -5
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +24 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +13 -7
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +1 -1
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +1 -1
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/providers.js +1 -1
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +2 -2
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +1 -1
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +6 -6
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +47 -16
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts +1 -1
- package/dist/src/commands/session.js +1 -1
- package/dist/src/commands/start.d.ts +1 -1
- package/dist/src/commands/start.js +12 -12
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +13 -6
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +2 -2
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts +1 -1
- package/dist/src/commands/task.js +1 -1
- package/dist/src/commands/transfer-store.js +1 -1
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/config-adapter.js +1 -1
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +30 -30
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +86 -101
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +96 -26
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts +0 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +34 -18
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +107 -41
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +16 -8
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +537 -1019
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +14 -4
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +9 -2
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +10 -0
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +30 -4
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/agentdb-tools.js +557 -0
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
- package/dist/src/mcp-tools/browser-tools.js +2 -2
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +21 -2
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +192 -13
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +5 -5
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +2 -2
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +263 -35
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +355 -40
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +2 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +2 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +31 -1
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +32 -27
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +1 -1
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +283 -0
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
- package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +216 -30
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +109 -6
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +102 -0
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +230 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +91 -0
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts +24 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +59 -0
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.d.ts +53 -0
- package/dist/src/memory/intelligence.d.ts.map +1 -1
- package/dist/src/memory/intelligence.js +264 -7
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +407 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge.js +1494 -0
- package/dist/src/memory/memory-bridge.js.map +1 -0
- package/dist/src/memory/memory-initializer.d.ts +17 -1
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +320 -42
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +1 -0
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.d.ts +10 -0
- package/dist/src/parser.d.ts.map +1 -1
- package/dist/src/parser.js +49 -3
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.d.ts.map +1 -1
- package/dist/src/plugins/manager.js +31 -14
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.js +5 -5
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +4 -4
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/production/error-handler.js +1 -1
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/runtime/headless.d.ts +3 -3
- package/dist/src/runtime/headless.js +6 -6
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.d.ts +182 -0
- package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/agent-wasm.js +316 -0
- package/dist/src/ruvector/agent-wasm.js.map +1 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +25 -15
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +7 -1
- package/dist/src/ruvector/index.d.ts.map +1 -1
- package/dist/src/ruvector/index.js +17 -1
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/ruvllm-wasm.js +363 -0
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
- package/dist/src/services/agentic-flow-bridge.js +95 -0
- package/dist/src/services/agentic-flow-bridge.js.map +1 -0
- package/dist/src/services/claim-service.js +1 -1
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts.map +1 -1
- package/dist/src/services/container-worker-pool.js +3 -1
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/index.d.ts +1 -1
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/registry-api.d.ts +1 -1
- package/dist/src/services/registry-api.js +1 -1
- package/dist/src/services/ruvector-training.d.ts +11 -2
- package/dist/src/services/ruvector-training.d.ts.map +1 -1
- package/dist/src/services/ruvector-training.js +233 -43
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts +28 -3
- package/dist/src/services/worker-daemon.d.ts.map +1 -1
- package/dist/src/services/worker-daemon.js +156 -17
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts.map +1 -1
- package/dist/src/services/worker-queue.js +2 -0
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
- package/dist/src/transfer/deploy-seraphine.js +4 -4
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -1
- package/dist/src/transfer/ipfs/client.js +8 -0
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +0 -2
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.d.ts +1 -1
- package/dist/src/transfer/models/seraphine.js +5 -5
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +9 -6
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -1
- package/dist/src/transfer/storage/gcs.js +71 -29
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.js +4 -4
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/registry.js +1 -1
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +4 -4
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/types.d.ts +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.js +1 -1
- package/dist/src/update/validator.js +1 -1
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -10
- package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
- package/.claude/agents/custom/design-architect.yaml +0 -48
- package/.claude/agents/custom/ui-developer.yaml +0 -46
- package/.claude/agents/custom/ux-researcher.yaml +0 -60
package/bin/cli.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
3
|
+
* @claude-flow/cli - CLI Entry Point
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Claude Flow V3 Command Line Interface
|
|
6
6
|
*
|
|
7
7
|
* Auto-detects MCP mode when stdin is piped and no args provided.
|
|
8
|
-
* This allows: echo '{"jsonrpc":"2.0",...}' | npx @
|
|
8
|
+
* This allows: echo '{"jsonrpc":"2.0",...}' | npx @claude-flow/cli
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { randomUUID } from 'crypto';
|
|
@@ -13,7 +13,7 @@ import { randomUUID } from 'crypto';
|
|
|
13
13
|
// Check if we should run in MCP server mode
|
|
14
14
|
// Conditions:
|
|
15
15
|
// 1. stdin is being piped AND no CLI arguments provided (auto-detect)
|
|
16
|
-
// 2. stdin is being piped AND args are "mcp start" (explicit, e.g. npx @
|
|
16
|
+
// 2. stdin is being piped AND args are "mcp start" (explicit, e.g. npx claude-flow@alpha mcp start)
|
|
17
17
|
const cliArgs = process.argv.slice(2);
|
|
18
18
|
const isExplicitMCP = cliArgs.length >= 1 && cliArgs[0] === 'mcp' && (cliArgs.length === 1 || cliArgs[1] === 'start');
|
|
19
19
|
const isMCPMode = !process.stdin.isTTY && (process.argv.length === 2 || isExplicitMCP);
|
|
@@ -26,7 +26,7 @@ if (isMCPMode) {
|
|
|
26
26
|
const sessionId = `mcp-${Date.now()}-${randomUUID().slice(0, 8)}`;
|
|
27
27
|
|
|
28
28
|
console.error(
|
|
29
|
-
`[${new Date().toISOString()}] INFO [
|
|
29
|
+
`[${new Date().toISOString()}] INFO [claude-flow-mcp] (${sessionId}) Starting in stdio mode`
|
|
30
30
|
);
|
|
31
31
|
|
|
32
32
|
let buffer = '';
|
|
@@ -77,7 +77,7 @@ if (isMCPMode) {
|
|
|
77
77
|
id: message.id,
|
|
78
78
|
result: {
|
|
79
79
|
protocolVersion: '2024-11-05',
|
|
80
|
-
serverInfo: { name: '
|
|
80
|
+
serverInfo: { name: 'claude-flow', version: VERSION },
|
|
81
81
|
capabilities: {
|
|
82
82
|
tools: { listChanged: true },
|
|
83
83
|
resources: { subscribe: true, listChanged: true },
|
package/bin/mcp-server.js
CHANGED
|
@@ -103,7 +103,7 @@ async function handleMessage(message) {
|
|
|
103
103
|
id: message.id,
|
|
104
104
|
result: {
|
|
105
105
|
protocolVersion: '2024-11-05',
|
|
106
|
-
serverInfo: { name: '
|
|
106
|
+
serverInfo: { name: 'claude-flow', version: VERSION },
|
|
107
107
|
capabilities: {
|
|
108
108
|
tools: { listChanged: true },
|
|
109
109
|
resources: { subscribe: true, listChanged: true },
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ruvLLM GGUF Inference Engine -- Pure Node.js GGUF Model Interface
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* 1. GGUF binary header parsing (metadata without loading weights)
|
|
6
|
+
* 2. Model loading abstraction (node-llama-cpp when available, metadata-only fallback)
|
|
7
|
+
* 3. Token generation interface with async iterator streaming
|
|
8
|
+
* 4. KV-cache persistence to RVF-compatible binary format
|
|
9
|
+
*
|
|
10
|
+
* Zero external dependencies. node-llama-cpp is an optional peer.
|
|
11
|
+
*
|
|
12
|
+
* @module @claude-flow/cli/appliance/gguf-engine
|
|
13
|
+
*/
|
|
14
|
+
export interface GgufMetadata {
|
|
15
|
+
magic: string;
|
|
16
|
+
version: number;
|
|
17
|
+
tensorCount: number;
|
|
18
|
+
kvCount: number;
|
|
19
|
+
architecture?: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
contextLength?: number;
|
|
22
|
+
embeddingLength?: number;
|
|
23
|
+
blockCount?: number;
|
|
24
|
+
vocabSize?: number;
|
|
25
|
+
quantization?: string;
|
|
26
|
+
fileSize: number;
|
|
27
|
+
metadata: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface GgufEngineConfig {
|
|
30
|
+
contextSize?: number;
|
|
31
|
+
maxTokens?: number;
|
|
32
|
+
temperature?: number;
|
|
33
|
+
kvCachePath?: string;
|
|
34
|
+
verbose?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface GenerateRequest {
|
|
37
|
+
prompt: string;
|
|
38
|
+
model?: string;
|
|
39
|
+
maxTokens?: number;
|
|
40
|
+
temperature?: number;
|
|
41
|
+
stream?: boolean;
|
|
42
|
+
stopSequences?: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface GenerateResponse {
|
|
45
|
+
text: string;
|
|
46
|
+
model: string;
|
|
47
|
+
tokensUsed: number;
|
|
48
|
+
latencyMs: number;
|
|
49
|
+
metadataOnly: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse the header and metadata from a GGUF file without loading tensors.
|
|
53
|
+
* Reads only the first 256 KB of the file.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseGgufHeader(path: string): Promise<GgufMetadata>;
|
|
56
|
+
export declare class GgufEngine {
|
|
57
|
+
private config;
|
|
58
|
+
private llamaCpp;
|
|
59
|
+
private llamaModel;
|
|
60
|
+
private llamaContext;
|
|
61
|
+
private loadedModels;
|
|
62
|
+
private activeModelPath;
|
|
63
|
+
private kvCache;
|
|
64
|
+
constructor(config: GgufEngineConfig);
|
|
65
|
+
/** Probe for node-llama-cpp availability. */
|
|
66
|
+
initialize(): Promise<void>;
|
|
67
|
+
/** Parse GGUF header and optionally load the model for inference. */
|
|
68
|
+
loadModel(path: string): Promise<GgufMetadata>;
|
|
69
|
+
/** Generate text. Delegates to node-llama-cpp or returns a metadata-only stub. */
|
|
70
|
+
generate(request: GenerateRequest): Promise<GenerateResponse>;
|
|
71
|
+
/** Stream tokens via async iterator. Falls back to yielding full response. */
|
|
72
|
+
stream(request: GenerateRequest): AsyncGenerator<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Persist the KV cache to an RVF-compatible binary file.
|
|
75
|
+
* Format: RVKV magic | version u32 | model SHA-256 (32B) | entry count u32
|
|
76
|
+
* entries: [key_len u32, key, val_len u32, val] | footer SHA-256 (32B)
|
|
77
|
+
*/
|
|
78
|
+
persistKvCache(outputPath: string): Promise<void>;
|
|
79
|
+
/** Restore KV cache from an RVF-compatible binary file. */
|
|
80
|
+
loadKvCache(inputPath: string): Promise<void>;
|
|
81
|
+
/** Return metadata for all loaded models. */
|
|
82
|
+
getLoadedModels(): GgufMetadata[];
|
|
83
|
+
/** Store a key-value pair in the in-memory KV cache. */
|
|
84
|
+
setKvEntry(key: string, value: Buffer): void;
|
|
85
|
+
/** Retrieve a key-value pair from the in-memory KV cache. */
|
|
86
|
+
getKvEntry(key: string): Buffer | undefined;
|
|
87
|
+
/** Release resources, unload models, and optionally persist the KV cache. */
|
|
88
|
+
shutdown(): Promise<void>;
|
|
89
|
+
private tryLoadLlamaCpp;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=gguf-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gguf-engine.d.ts","sourceRoot":"","sources":["../../../src/appliance/gguf-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAmBH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AA6ED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAWzE;AAyED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,OAAO,CAAkC;gBAErC,MAAM,EAAE,gBAAgB;IAUpC,6CAA6C;IACvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,qEAAqE;IAC/D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBpD,kFAAkF;IAC5E,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6CnE,8EAA8E;IACvE,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC;IAuB/D;;;;OAIG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BvD,2DAA2D;IACrD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCnD,6CAA6C;IAC7C,eAAe,IAAI,YAAY,EAAE;IAEjC,wDAAwD;IACxD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAE5C,6DAA6D;IAC7D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAE3C,6EAA6E;IACvE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBjB,eAAe;CAI9B"}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ruvLLM GGUF Inference Engine -- Pure Node.js GGUF Model Interface
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* 1. GGUF binary header parsing (metadata without loading weights)
|
|
6
|
+
* 2. Model loading abstraction (node-llama-cpp when available, metadata-only fallback)
|
|
7
|
+
* 3. Token generation interface with async iterator streaming
|
|
8
|
+
* 4. KV-cache persistence to RVF-compatible binary format
|
|
9
|
+
*
|
|
10
|
+
* Zero external dependencies. node-llama-cpp is an optional peer.
|
|
11
|
+
*
|
|
12
|
+
* @module @claude-flow/cli/appliance/gguf-engine
|
|
13
|
+
*/
|
|
14
|
+
import { open, readFile, writeFile, stat as fsStat } from 'node:fs/promises';
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import { basename } from 'node:path';
|
|
17
|
+
// ── GGUF Metadata Value Types ───────────────────────────────
|
|
18
|
+
var GgufValueType;
|
|
19
|
+
(function (GgufValueType) {
|
|
20
|
+
GgufValueType[GgufValueType["UINT8"] = 0] = "UINT8";
|
|
21
|
+
GgufValueType[GgufValueType["INT8"] = 1] = "INT8";
|
|
22
|
+
GgufValueType[GgufValueType["UINT16"] = 2] = "UINT16";
|
|
23
|
+
GgufValueType[GgufValueType["INT16"] = 3] = "INT16";
|
|
24
|
+
GgufValueType[GgufValueType["UINT32"] = 4] = "UINT32";
|
|
25
|
+
GgufValueType[GgufValueType["INT32"] = 5] = "INT32";
|
|
26
|
+
GgufValueType[GgufValueType["FLOAT32"] = 6] = "FLOAT32";
|
|
27
|
+
GgufValueType[GgufValueType["BOOL"] = 7] = "BOOL";
|
|
28
|
+
GgufValueType[GgufValueType["STRING"] = 8] = "STRING";
|
|
29
|
+
GgufValueType[GgufValueType["ARRAY"] = 9] = "ARRAY";
|
|
30
|
+
GgufValueType[GgufValueType["UINT64"] = 10] = "UINT64";
|
|
31
|
+
GgufValueType[GgufValueType["INT64"] = 11] = "INT64";
|
|
32
|
+
GgufValueType[GgufValueType["FLOAT64"] = 12] = "FLOAT64";
|
|
33
|
+
})(GgufValueType || (GgufValueType = {}));
|
|
34
|
+
const GGUF_MAGIC = 0x46554747; // "GGUF" in little-endian
|
|
35
|
+
const RVKV_MAGIC = 0x564B5652; // "RVKV" in little-endian
|
|
36
|
+
const RVKV_VERSION = 1;
|
|
37
|
+
// ── Internal Buffer Reader ──────────────────────────────────
|
|
38
|
+
/** Stateful cursor over a Buffer for sequential binary reads. */
|
|
39
|
+
class BufferReader {
|
|
40
|
+
buf;
|
|
41
|
+
offset = 0;
|
|
42
|
+
constructor(buf) {
|
|
43
|
+
this.buf = buf;
|
|
44
|
+
}
|
|
45
|
+
get remaining() { return this.buf.length - this.offset; }
|
|
46
|
+
readU8() { const v = this.buf.readUInt8(this.offset); this.offset += 1; return v; }
|
|
47
|
+
readI8() { const v = this.buf.readInt8(this.offset); this.offset += 1; return v; }
|
|
48
|
+
readU16() { const v = this.buf.readUInt16LE(this.offset); this.offset += 2; return v; }
|
|
49
|
+
readI16() { const v = this.buf.readInt16LE(this.offset); this.offset += 2; return v; }
|
|
50
|
+
readU32() { const v = this.buf.readUInt32LE(this.offset); this.offset += 4; return v; }
|
|
51
|
+
readI32() { const v = this.buf.readInt32LE(this.offset); this.offset += 4; return v; }
|
|
52
|
+
readF32() { const v = this.buf.readFloatLE(this.offset); this.offset += 4; return v; }
|
|
53
|
+
readF64() { const v = this.buf.readDoubleLE(this.offset); this.offset += 8; return v; }
|
|
54
|
+
readU64() { const v = this.buf.readBigUInt64LE(this.offset); this.offset += 8; return v; }
|
|
55
|
+
readI64() { const v = this.buf.readBigInt64LE(this.offset); this.offset += 8; return v; }
|
|
56
|
+
/** Safe for values up to 2^53. Real GGUF files never exceed this for tensor/kv counts. */
|
|
57
|
+
readU64AsNumber() { return Number(this.readU64()); }
|
|
58
|
+
readBool() { return this.readU8() !== 0; }
|
|
59
|
+
/** GGUF string: [length u64 LE][utf-8 bytes]. */
|
|
60
|
+
readString() {
|
|
61
|
+
const len = this.readU64AsNumber();
|
|
62
|
+
if (len === 0)
|
|
63
|
+
return '';
|
|
64
|
+
if (len > this.remaining)
|
|
65
|
+
throw new Error(`String length ${len} exceeds remaining buffer`);
|
|
66
|
+
const s = this.buf.toString('utf-8', this.offset, this.offset + len);
|
|
67
|
+
this.offset += len;
|
|
68
|
+
return s;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ── GGUF Value Reading ──────────────────────────────────────
|
|
72
|
+
/** Read a typed scalar from the buffer (shared by value and array-element readers). */
|
|
73
|
+
function readScalar(reader, t) {
|
|
74
|
+
switch (t) {
|
|
75
|
+
case GgufValueType.UINT8: return reader.readU8();
|
|
76
|
+
case GgufValueType.INT8: return reader.readI8();
|
|
77
|
+
case GgufValueType.UINT16: return reader.readU16();
|
|
78
|
+
case GgufValueType.INT16: return reader.readI16();
|
|
79
|
+
case GgufValueType.UINT32: return reader.readU32();
|
|
80
|
+
case GgufValueType.INT32: return reader.readI32();
|
|
81
|
+
case GgufValueType.FLOAT32: return reader.readF32();
|
|
82
|
+
case GgufValueType.BOOL: return reader.readBool();
|
|
83
|
+
case GgufValueType.STRING: return reader.readString();
|
|
84
|
+
case GgufValueType.UINT64: return Number(reader.readU64());
|
|
85
|
+
case GgufValueType.INT64: return Number(reader.readI64());
|
|
86
|
+
case GgufValueType.FLOAT64: return reader.readF64();
|
|
87
|
+
default: return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Read a single GGUF typed value (scalar or array) from the buffer. */
|
|
91
|
+
function readGgufValue(reader) {
|
|
92
|
+
const valueType = reader.readU32();
|
|
93
|
+
if (valueType === GgufValueType.ARRAY) {
|
|
94
|
+
const elemType = reader.readU32();
|
|
95
|
+
const len = reader.readU64AsNumber();
|
|
96
|
+
const arr = [];
|
|
97
|
+
for (let i = 0; i < len; i++) {
|
|
98
|
+
const v = readScalar(reader, elemType);
|
|
99
|
+
if (v === undefined)
|
|
100
|
+
throw new Error(`Unknown GGUF array element type: ${elemType}`);
|
|
101
|
+
arr.push(v);
|
|
102
|
+
}
|
|
103
|
+
return arr;
|
|
104
|
+
}
|
|
105
|
+
const v = readScalar(reader, valueType);
|
|
106
|
+
if (v === undefined)
|
|
107
|
+
throw new Error(`Unknown GGUF value type: ${valueType}`);
|
|
108
|
+
return v;
|
|
109
|
+
}
|
|
110
|
+
// ── GGUF Header Parsing ─────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Parse the header and metadata from a GGUF file without loading tensors.
|
|
113
|
+
* Reads only the first 256 KB of the file.
|
|
114
|
+
*/
|
|
115
|
+
export async function parseGgufHeader(path) {
|
|
116
|
+
const fileInfo = await fsStat(path);
|
|
117
|
+
const readSize = Math.min(fileInfo.size, 256 * 1024);
|
|
118
|
+
const fh = await open(path, 'r');
|
|
119
|
+
try {
|
|
120
|
+
const buf = Buffer.alloc(readSize);
|
|
121
|
+
await fh.read(buf, 0, readSize, 0);
|
|
122
|
+
return parseGgufBuffer(buf, fileInfo.size, path);
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await fh.close();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function parseGgufBuffer(buf, fileSize, filePath) {
|
|
129
|
+
const reader = new BufferReader(buf);
|
|
130
|
+
const magic = reader.readU32();
|
|
131
|
+
if (magic !== GGUF_MAGIC) {
|
|
132
|
+
throw new Error(`Invalid GGUF magic: 0x${magic.toString(16)} (expected 0x${GGUF_MAGIC.toString(16)})`);
|
|
133
|
+
}
|
|
134
|
+
const version = reader.readU32();
|
|
135
|
+
if (version < 2 || version > 3) {
|
|
136
|
+
throw new Error(`Unsupported GGUF version: ${version} (expected 2 or 3)`);
|
|
137
|
+
}
|
|
138
|
+
const tensorCount = reader.readU64AsNumber();
|
|
139
|
+
const kvCount = reader.readU64AsNumber();
|
|
140
|
+
const metadata = {};
|
|
141
|
+
for (let i = 0; i < kvCount; i++) {
|
|
142
|
+
if (reader.remaining < 12)
|
|
143
|
+
break;
|
|
144
|
+
try {
|
|
145
|
+
const key = reader.readString();
|
|
146
|
+
metadata[key] = readGgufValue(reader);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
break; // reached end of read window
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const arch = asString(metadata['general.architecture']);
|
|
153
|
+
const pfx = arch || 'llama'; // fallback prefix for well-known keys
|
|
154
|
+
return {
|
|
155
|
+
magic: 'GGUF', version, tensorCount, kvCount,
|
|
156
|
+
architecture: arch,
|
|
157
|
+
name: asString(metadata['general.name']),
|
|
158
|
+
contextLength: asNumber(metadata[`${pfx}.context_length`]),
|
|
159
|
+
embeddingLength: asNumber(metadata[`${pfx}.embedding_length`]),
|
|
160
|
+
blockCount: asNumber(metadata[`${pfx}.block_count`]),
|
|
161
|
+
vocabSize: inferVocabSize(metadata),
|
|
162
|
+
quantization: inferQuantFromMetadata(metadata, filePath),
|
|
163
|
+
fileSize, metadata,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// ── Metadata Helpers ────────────────────────────────────────
|
|
167
|
+
function asString(v) { return typeof v === 'string' ? v : undefined; }
|
|
168
|
+
function asNumber(v) { return typeof v === 'number' ? v : undefined; }
|
|
169
|
+
const QUANT_RE = [
|
|
170
|
+
[/q2_k/i, 'Q2_K'], [/q3_k_s/i, 'Q3_K_S'], [/q3_k_m/i, 'Q3_K_M'], [/q3_k_l/i, 'Q3_K_L'],
|
|
171
|
+
[/q4_k_s/i, 'Q4_K_S'], [/q4_k_m/i, 'Q4_K_M'], [/q4_0/i, 'Q4_0'], [/q4_1/i, 'Q4_1'],
|
|
172
|
+
[/q5_k_s/i, 'Q5_K_S'], [/q5_k_m/i, 'Q5_K_M'], [/q5_0/i, 'Q5_0'], [/q5_1/i, 'Q5_1'],
|
|
173
|
+
[/q6_k/i, 'Q6_K'], [/q8_0/i, 'Q8_0'], [/f16/i, 'F16'], [/f32/i, 'F32'],
|
|
174
|
+
];
|
|
175
|
+
function inferQuantFromMetadata(meta, filePath) {
|
|
176
|
+
const ft = meta['general.file_type'];
|
|
177
|
+
if (typeof ft === 'number')
|
|
178
|
+
return `file_type_${ft}`;
|
|
179
|
+
const name = basename(filePath);
|
|
180
|
+
for (const [re, label] of QUANT_RE)
|
|
181
|
+
if (re.test(name))
|
|
182
|
+
return label;
|
|
183
|
+
return 'unknown';
|
|
184
|
+
}
|
|
185
|
+
function inferVocabSize(meta) {
|
|
186
|
+
const tokens = meta['tokenizer.ggml.tokens'];
|
|
187
|
+
if (Array.isArray(tokens))
|
|
188
|
+
return tokens.length;
|
|
189
|
+
return asNumber(meta['tokenizer.ggml.vocab_size']);
|
|
190
|
+
}
|
|
191
|
+
// ── GGUF Engine ─────────────────────────────────────────────
|
|
192
|
+
export class GgufEngine {
|
|
193
|
+
config;
|
|
194
|
+
llamaCpp = null;
|
|
195
|
+
llamaModel = null;
|
|
196
|
+
llamaContext = null;
|
|
197
|
+
loadedModels = new Map();
|
|
198
|
+
activeModelPath = null;
|
|
199
|
+
kvCache = new Map();
|
|
200
|
+
constructor(config) {
|
|
201
|
+
this.config = {
|
|
202
|
+
contextSize: config.contextSize ?? 4096,
|
|
203
|
+
maxTokens: config.maxTokens ?? 512,
|
|
204
|
+
temperature: config.temperature ?? 0.7,
|
|
205
|
+
kvCachePath: config.kvCachePath ?? '',
|
|
206
|
+
verbose: config.verbose ?? false,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/** Probe for node-llama-cpp availability. */
|
|
210
|
+
async initialize() {
|
|
211
|
+
this.llamaCpp = await this.tryLoadLlamaCpp();
|
|
212
|
+
if (this.config.verbose) {
|
|
213
|
+
console.log(`[gguf-engine] node-llama-cpp: ${this.llamaCpp ? 'available' : 'not found (metadata-only mode)'}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** Parse GGUF header and optionally load the model for inference. */
|
|
217
|
+
async loadModel(path) {
|
|
218
|
+
const meta = await parseGgufHeader(path);
|
|
219
|
+
this.loadedModels.set(path, meta);
|
|
220
|
+
this.activeModelPath = path;
|
|
221
|
+
if (this.llamaCpp) {
|
|
222
|
+
try {
|
|
223
|
+
const { getLlama } = this.llamaCpp;
|
|
224
|
+
const llama = await getLlama();
|
|
225
|
+
this.llamaModel = await llama.loadModel({ modelPath: path });
|
|
226
|
+
this.llamaContext = await this.llamaModel.createContext({ contextSize: this.config.contextSize });
|
|
227
|
+
if (this.config.verbose)
|
|
228
|
+
console.log(`[gguf-engine] Model loaded: ${basename(path)}`);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
if (this.config.verbose)
|
|
232
|
+
console.warn('[gguf-engine] node-llama-cpp load failed:', err);
|
|
233
|
+
this.llamaModel = null;
|
|
234
|
+
this.llamaContext = null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return meta;
|
|
238
|
+
}
|
|
239
|
+
/** Generate text. Delegates to node-llama-cpp or returns a metadata-only stub. */
|
|
240
|
+
async generate(request) {
|
|
241
|
+
const start = performance.now();
|
|
242
|
+
const modelPath = request.model ?? this.activeModelPath;
|
|
243
|
+
const modelName = modelPath ? basename(modelPath) : 'none';
|
|
244
|
+
if (this.llamaContext && this.llamaModel) {
|
|
245
|
+
try {
|
|
246
|
+
const session = new this.llamaCpp.LlamaChatSession({
|
|
247
|
+
contextSequence: this.llamaContext.getSequence(),
|
|
248
|
+
});
|
|
249
|
+
const text = await session.prompt(request.prompt, {
|
|
250
|
+
maxTokens: request.maxTokens ?? this.config.maxTokens,
|
|
251
|
+
temperature: request.temperature ?? this.config.temperature,
|
|
252
|
+
stopGenerationTrigger: request.stopSequences
|
|
253
|
+
? request.stopSequences.map((s) => new this.llamaCpp.LlamaText([s]))
|
|
254
|
+
: undefined,
|
|
255
|
+
});
|
|
256
|
+
// Use llama.cpp tokenizer for accurate count when available, else estimate
|
|
257
|
+
let tokensUsed;
|
|
258
|
+
try {
|
|
259
|
+
const seq = this.llamaContext.getSequence();
|
|
260
|
+
tokensUsed = seq.tokenCount ?? Math.ceil(text.length / 4);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
tokensUsed = Math.ceil(text.length / 4); // ~4 chars per token heuristic
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
text, model: modelName, tokensUsed,
|
|
267
|
+
latencyMs: performance.now() - start, metadataOnly: false,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
if (this.config.verbose)
|
|
272
|
+
console.warn('[gguf-engine] Generation failed:', err);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Metadata-only fallback
|
|
276
|
+
const meta = modelPath ? this.loadedModels.get(modelPath) : undefined;
|
|
277
|
+
return {
|
|
278
|
+
text: meta
|
|
279
|
+
? `[metadata-only] Model: ${meta.name ?? modelName}, arch: ${meta.architecture ?? 'unknown'}, ctx: ${meta.contextLength ?? 'unknown'}`
|
|
280
|
+
: '[metadata-only] No model loaded',
|
|
281
|
+
model: modelName, tokensUsed: 0,
|
|
282
|
+
latencyMs: performance.now() - start, metadataOnly: true,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/** Stream tokens via async iterator. Falls back to yielding full response. */
|
|
286
|
+
async *stream(request) {
|
|
287
|
+
if (this.llamaContext && this.llamaModel) {
|
|
288
|
+
try {
|
|
289
|
+
const session = new this.llamaCpp.LlamaChatSession({
|
|
290
|
+
contextSequence: this.llamaContext.getSequence(),
|
|
291
|
+
});
|
|
292
|
+
const it = session.promptWithMeta(request.prompt, {
|
|
293
|
+
maxTokens: request.maxTokens ?? this.config.maxTokens,
|
|
294
|
+
temperature: request.temperature ?? this.config.temperature,
|
|
295
|
+
});
|
|
296
|
+
if (it && typeof it[Symbol.asyncIterator] === 'function') {
|
|
297
|
+
for await (const chunk of it) {
|
|
298
|
+
if (typeof chunk === 'string')
|
|
299
|
+
yield chunk;
|
|
300
|
+
else if (chunk?.text)
|
|
301
|
+
yield chunk.text;
|
|
302
|
+
}
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch { /* fall through to single-chunk fallback */ }
|
|
307
|
+
}
|
|
308
|
+
const response = await this.generate(request);
|
|
309
|
+
yield response.text;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Persist the KV cache to an RVF-compatible binary file.
|
|
313
|
+
* Format: RVKV magic | version u32 | model SHA-256 (32B) | entry count u32
|
|
314
|
+
* entries: [key_len u32, key, val_len u32, val] | footer SHA-256 (32B)
|
|
315
|
+
*/
|
|
316
|
+
async persistKvCache(outputPath) {
|
|
317
|
+
const path = outputPath || this.config.kvCachePath;
|
|
318
|
+
if (!path)
|
|
319
|
+
throw new Error('No KV cache output path specified');
|
|
320
|
+
const modelHash = createHash('sha256').update(this.activeModelPath ?? 'no-model').digest();
|
|
321
|
+
const entryBufs = [];
|
|
322
|
+
for (const [key, value] of this.kvCache) {
|
|
323
|
+
const keyBuf = Buffer.from(key, 'utf-8');
|
|
324
|
+
const hdr = Buffer.alloc(8);
|
|
325
|
+
hdr.writeUInt32LE(keyBuf.length, 0);
|
|
326
|
+
hdr.writeUInt32LE(value.length, 4);
|
|
327
|
+
entryBufs.push(hdr, keyBuf, value);
|
|
328
|
+
}
|
|
329
|
+
const entryData = Buffer.concat(entryBufs);
|
|
330
|
+
const footer = createHash('sha256').update(entryData).digest();
|
|
331
|
+
const header = Buffer.alloc(44);
|
|
332
|
+
header.writeUInt32LE(RVKV_MAGIC, 0);
|
|
333
|
+
header.writeUInt32LE(RVKV_VERSION, 4);
|
|
334
|
+
modelHash.copy(header, 8);
|
|
335
|
+
header.writeUInt32LE(this.kvCache.size, 40);
|
|
336
|
+
await writeFile(path, Buffer.concat([header, entryData, footer]));
|
|
337
|
+
if (this.config.verbose)
|
|
338
|
+
console.log(`[gguf-engine] KV cache persisted: ${this.kvCache.size} entries`);
|
|
339
|
+
}
|
|
340
|
+
/** Restore KV cache from an RVF-compatible binary file. */
|
|
341
|
+
async loadKvCache(inputPath) {
|
|
342
|
+
const data = await readFile(inputPath);
|
|
343
|
+
if (data.length < 44)
|
|
344
|
+
throw new Error('KV cache file too small');
|
|
345
|
+
const magic = data.readUInt32LE(0);
|
|
346
|
+
if (magic !== RVKV_MAGIC)
|
|
347
|
+
throw new Error(`Invalid KV cache magic: 0x${magic.toString(16)}`);
|
|
348
|
+
const version = data.readUInt32LE(4);
|
|
349
|
+
if (version !== RVKV_VERSION)
|
|
350
|
+
throw new Error(`Unsupported KV cache version: ${version}`);
|
|
351
|
+
const entryCount = data.readUInt32LE(40);
|
|
352
|
+
let offset = 44;
|
|
353
|
+
const entries = new Map();
|
|
354
|
+
for (let i = 0; i < entryCount; i++) {
|
|
355
|
+
if (offset + 8 > data.length)
|
|
356
|
+
throw new Error('KV cache file truncated');
|
|
357
|
+
const keyLen = data.readUInt32LE(offset);
|
|
358
|
+
const valLen = data.readUInt32LE(offset + 4);
|
|
359
|
+
offset += 8;
|
|
360
|
+
if (offset + keyLen + valLen > data.length)
|
|
361
|
+
throw new Error('KV cache file truncated');
|
|
362
|
+
entries.set(data.toString('utf-8', offset, offset + keyLen), Buffer.from(data.subarray(offset + keyLen, offset + keyLen + valLen)));
|
|
363
|
+
offset += keyLen + valLen;
|
|
364
|
+
}
|
|
365
|
+
// Verify footer hash (mandatory)
|
|
366
|
+
if (offset + 32 > data.length) {
|
|
367
|
+
throw new Error('KV cache file missing SHA256 footer');
|
|
368
|
+
}
|
|
369
|
+
const stored = data.subarray(offset, offset + 32);
|
|
370
|
+
const computed = createHash('sha256').update(data.subarray(44, offset)).digest();
|
|
371
|
+
if (!stored.equals(computed))
|
|
372
|
+
throw new Error('KV cache integrity check failed: hash mismatch');
|
|
373
|
+
this.kvCache = entries;
|
|
374
|
+
if (this.config.verbose)
|
|
375
|
+
console.log(`[gguf-engine] KV cache loaded: ${entries.size} entries`);
|
|
376
|
+
}
|
|
377
|
+
/** Return metadata for all loaded models. */
|
|
378
|
+
getLoadedModels() { return Array.from(this.loadedModels.values()); }
|
|
379
|
+
/** Store a key-value pair in the in-memory KV cache. */
|
|
380
|
+
setKvEntry(key, value) { this.kvCache.set(key, value); }
|
|
381
|
+
/** Retrieve a key-value pair from the in-memory KV cache. */
|
|
382
|
+
getKvEntry(key) { return this.kvCache.get(key); }
|
|
383
|
+
/** Release resources, unload models, and optionally persist the KV cache. */
|
|
384
|
+
async shutdown() {
|
|
385
|
+
if (this.config.kvCachePath && this.kvCache.size > 0) {
|
|
386
|
+
try {
|
|
387
|
+
await this.persistKvCache(this.config.kvCachePath);
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
if (this.config.verbose)
|
|
391
|
+
console.warn('[gguf-engine] KV persist failed:', err);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (this.llamaContext?.dispose) {
|
|
395
|
+
try {
|
|
396
|
+
await this.llamaContext.dispose();
|
|
397
|
+
}
|
|
398
|
+
catch { /* ignore */ }
|
|
399
|
+
}
|
|
400
|
+
if (this.llamaModel?.dispose) {
|
|
401
|
+
try {
|
|
402
|
+
await this.llamaModel.dispose();
|
|
403
|
+
}
|
|
404
|
+
catch { /* ignore */ }
|
|
405
|
+
}
|
|
406
|
+
this.llamaContext = null;
|
|
407
|
+
this.llamaModel = null;
|
|
408
|
+
this.activeModelPath = null;
|
|
409
|
+
this.loadedModels.clear();
|
|
410
|
+
this.kvCache.clear();
|
|
411
|
+
if (this.config.verbose)
|
|
412
|
+
console.log('[gguf-engine] Shutdown complete');
|
|
413
|
+
}
|
|
414
|
+
// ── Private ───────────────────────────────────────────────
|
|
415
|
+
async tryLoadLlamaCpp() {
|
|
416
|
+
// @ts-ignore -- optional peer dependency, may not be installed
|
|
417
|
+
try {
|
|
418
|
+
return await import('node-llama-cpp');
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
return null;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=gguf-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gguf-engine.js","sourceRoot":"","sources":["../../../src/appliance/gguf-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,+DAA+D;AAE/D,IAAW,aAGV;AAHD,WAAW,aAAa;IACtB,mDAAS,CAAA;IAAE,iDAAQ,CAAA;IAAE,qDAAU,CAAA;IAAE,mDAAS,CAAA;IAAE,qDAAU,CAAA;IAAE,mDAAS,CAAA;IACjE,uDAAW,CAAA;IAAE,iDAAQ,CAAA;IAAE,qDAAU,CAAA;IAAE,mDAAS,CAAA;IAAE,sDAAW,CAAA;IAAE,oDAAU,CAAA;IAAE,wDAAY,CAAA;AACrF,CAAC,EAHU,aAAa,KAAb,aAAa,QAGvB;AAED,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,0BAA0B;AACzD,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,0BAA0B;AACzD,MAAM,YAAY,GAAG,CAAC,CAAC;AA6CvB,+DAA+D;AAE/D,iEAAiE;AACjE,MAAM,YAAY;IAEI;IADZ,MAAM,GAAG,CAAC,CAAC;IACnB,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IACnC,IAAI,SAAS,KAAa,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE,MAAM,KAAc,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,KAAc,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO,KAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjG,0FAA0F;IAC1F,eAAe,KAAa,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,QAAQ,KAAc,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnD,iDAAiD;IACjD,UAAU;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,2BAA2B,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAED,+DAA+D;AAE/D,uFAAuF;AACvF,SAAS,UAAU,CAAC,MAAoB,EAAE,CAAS;IACjD,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,aAAa,CAAC,KAAK,CAAC,CAAG,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;QACnD,KAAK,aAAa,CAAC,IAAI,CAAC,CAAI,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;QACnD,KAAK,aAAa,CAAC,MAAM,CAAC,CAAE,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,aAAa,CAAC,KAAK,CAAC,CAAG,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,aAAa,CAAC,MAAM,CAAC,CAAE,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,aAAa,CAAC,KAAK,CAAC,CAAG,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,aAAa,CAAC,IAAI,CAAC,CAAI,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrD,KAAK,aAAa,CAAC,MAAM,CAAC,CAAE,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,KAAK,aAAa,CAAC,MAAM,CAAC,CAAE,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,KAAK,aAAa,CAAC,KAAK,CAAC,CAAG,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,aAAa,CAAC,MAAoB;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACnC,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACrC,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YACrF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+DAA+D;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAgB;IACtE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,oBAAoB,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzC,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,SAAS,GAAG,EAAE;YAAE,MAAM;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,6BAA6B;QACtC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,sCAAsC;IAEnE,OAAO;QACL,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO;QAC5C,YAAY,EAAE,IAAI;QAClB,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACxC,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,iBAAiB,CAAC,CAAC;QAC1D,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;QAC9D,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;QACpD,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC;QACnC,YAAY,EAAE,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACxD,QAAQ,EAAE,QAAQ;KACnB,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D,SAAS,QAAQ,CAAC,CAAU,IAAwB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACnG,SAAS,QAAQ,CAAC,CAAU,IAAwB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAEnG,MAAM,QAAQ,GAA4B;IACxC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;IACtF,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;IAClF,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;IAClF,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;CACvE,CAAC;AAEF,SAAS,sBAAsB,CAAC,IAA6B,EAAE,QAAgB;IAC7E,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrC,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,aAAa,EAAE,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ;QAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IACpE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,IAA6B;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAChD,OAAO,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,+DAA+D;AAE/D,MAAM,OAAO,UAAU;IACb,MAAM,CAA6B;IACnC,QAAQ,GAAQ,IAAI,CAAC;IACrB,UAAU,GAAQ,IAAI,CAAC;IACvB,YAAY,GAAQ,IAAI,CAAC;IACzB,YAAY,GAA8B,IAAI,GAAG,EAAE,CAAC;IACpD,eAAe,GAAkB,IAAI,CAAC;IACtC,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEjD,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;YACvC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG;YAClC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,GAAG;YACtC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;SACjC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gCAAgC,EAAE,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7D,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBAClG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;gBACxF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC;QACxD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE3D,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBACjD,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;iBACjD,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;oBAChD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;oBACrD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;oBAC3D,qBAAqB,EAAE,OAAO,CAAC,aAAa;wBAC1C,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5E,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;gBACH,2EAA2E;gBAC3E,IAAI,UAAkB,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC5C,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,+BAA+B;gBAC1E,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU;oBAClC,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,KAAK;iBAC1D,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,OAAO;YACL,IAAI,EAAE,IAAI;gBACR,CAAC,CAAC,0BAA0B,IAAI,CAAC,IAAI,IAAI,SAAS,WAAW,IAAI,CAAC,YAAY,IAAI,SAAS,UAAU,IAAI,CAAC,aAAa,IAAI,SAAS,EAAE;gBACtI,CAAC,CAAC,iCAAiC;YACrC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;YAC/B,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI;SACzD,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,CAAC,MAAM,CAAC,OAAwB;QACpC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBACjD,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;iBACjD,CAAC,CAAC;gBACH,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE;oBAChD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;oBACrD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;iBAC5D,CAAC,CAAC;gBACH,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,UAAU,EAAE,CAAC;oBACzD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC;wBAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;4BAAE,MAAM,KAAK,CAAC;6BACtC,IAAI,KAAK,EAAE,IAAI;4BAAE,MAAM,KAAK,CAAC,IAAI,CAAC;oBACzC,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,2CAA2C,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3F,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAE5C,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC;IACzG,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAE1F,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpI,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC;QAC5B,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAEhG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC;IACjG,CAAC;IAED,6CAA6C;IAC7C,eAAe,KAAqB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpF,wDAAwD;IACxD,UAAU,CAAC,GAAW,EAAE,KAAa,IAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9E,6DAA6D;IAC7D,UAAU,CAAC,GAAW,IAAwB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE7E,6EAA6E;IAC7E,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAAC,CAAC;YAC3D,OAAO,GAAG,EAAE,CAAC;gBAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC;QACjG,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAAC,CAAC;QACrG,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAAC,CAAC;QACjG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC1E,CAAC;IAED,6DAA6D;IAErD,KAAK,CAAC,eAAe;QAC3B,+DAA+D;QAC/D,IAAI,CAAC;YAAC,OAAO,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACvE,CAAC;CACF"}
|