agent-orcha 0.0.5 → 0.0.8
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 +250 -1275
- package/dist/lib/agents/agent-executor.d.ts +4 -2
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +85 -53
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/agent-loader.d.ts +3 -0
- package/dist/lib/agents/agent-loader.d.ts.map +1 -1
- package/dist/lib/agents/agent-loader.js +10 -1
- package/dist/lib/agents/agent-loader.js.map +1 -1
- package/dist/lib/agents/react-loop.d.ts.map +1 -1
- package/dist/lib/agents/react-loop.js +207 -142
- package/dist/lib/agents/react-loop.js.map +1 -1
- package/dist/lib/agents/types.d.ts +181 -18
- package/dist/lib/agents/types.d.ts.map +1 -1
- package/dist/lib/agents/types.js +18 -2
- package/dist/lib/agents/types.js.map +1 -1
- package/dist/lib/functions/function-loader.d.ts +2 -0
- package/dist/lib/functions/function-loader.d.ts.map +1 -1
- package/dist/lib/functions/function-loader.js +10 -0
- package/dist/lib/functions/function-loader.js.map +1 -1
- package/dist/lib/functions/simple-function-wrapper.js +3 -3
- package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
- package/dist/lib/integrations/email.d.ts +38 -0
- package/dist/lib/integrations/email.d.ts.map +1 -0
- package/dist/lib/integrations/email.js +249 -0
- package/dist/lib/integrations/email.js.map +1 -0
- package/dist/lib/integrations/integration-manager.d.ts +5 -0
- package/dist/lib/integrations/integration-manager.d.ts.map +1 -1
- package/dist/lib/integrations/integration-manager.js +53 -3
- package/dist/lib/integrations/integration-manager.js.map +1 -1
- package/dist/lib/integrations/types.d.ts +187 -4
- package/dist/lib/integrations/types.d.ts.map +1 -1
- package/dist/lib/integrations/types.js +24 -1
- package/dist/lib/integrations/types.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts +7 -1
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
- package/dist/lib/knowledge/knowledge-store.js +96 -8
- package/dist/lib/knowledge/knowledge-store.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +8 -3
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.js +96 -75
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.d.ts +12 -3
- package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.js +56 -22
- package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
- package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
- package/dist/lib/knowledge/sqlite-store.js +19 -10
- package/dist/lib/knowledge/sqlite-store.js.map +1 -1
- package/dist/lib/knowledge/types.d.ts +69 -33
- package/dist/lib/knowledge/types.d.ts.map +1 -1
- package/dist/lib/knowledge/types.js +18 -3
- package/dist/lib/knowledge/types.js.map +1 -1
- package/dist/lib/llm/index.d.ts +1 -1
- package/dist/lib/llm/index.d.ts.map +1 -1
- package/dist/lib/llm/index.js +1 -1
- package/dist/lib/llm/index.js.map +1 -1
- package/dist/lib/llm/llm-call-logger.d.ts +3 -1
- package/dist/lib/llm/llm-call-logger.d.ts.map +1 -1
- package/dist/lib/llm/llm-call-logger.js +31 -26
- package/dist/lib/llm/llm-call-logger.js.map +1 -1
- package/dist/lib/llm/llm-config.d.ts +59 -8
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +163 -17
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts +1 -2
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +44 -8
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts +5 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.js +118 -42
- package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/gemini-chat-model.d.ts +3 -2
- package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/gemini-chat-model.js +83 -24
- package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts +20 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.js +265 -32
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-embeddings.js +41 -10
- package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
- package/dist/lib/local-llm/binary-manager.d.ts +66 -0
- package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/binary-manager.js +441 -0
- package/dist/lib/local-llm/binary-manager.js.map +1 -0
- package/dist/lib/local-llm/engine-interface.d.ts +47 -0
- package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
- package/dist/lib/local-llm/engine-interface.js +2 -0
- package/dist/lib/local-llm/engine-interface.js.map +1 -0
- package/dist/lib/local-llm/engine-registry.d.ts +20 -0
- package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
- package/dist/lib/local-llm/engine-registry.js +56 -0
- package/dist/lib/local-llm/engine-registry.js.map +1 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
- package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
- package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
- package/dist/lib/local-llm/gguf-reader.js +190 -0
- package/dist/lib/local-llm/gguf-reader.js.map +1 -0
- package/dist/lib/local-llm/index.d.ts +9 -0
- package/dist/lib/local-llm/index.d.ts.map +1 -0
- package/dist/lib/local-llm/index.js +6 -0
- package/dist/lib/local-llm/index.js.map +1 -0
- package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
- package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
- package/dist/lib/local-llm/llama-server-process.js +237 -0
- package/dist/lib/local-llm/llama-server-process.js.map +1 -0
- package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
- package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
- package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
- package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
- package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
- package/dist/lib/local-llm/mlx-server-process.js +210 -0
- package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
- package/dist/lib/local-llm/model-manager.d.ts +33 -0
- package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/model-manager.js +591 -0
- package/dist/lib/local-llm/model-manager.js.map +1 -0
- package/dist/lib/local-llm/types.d.ts +51 -0
- package/dist/lib/local-llm/types.d.ts.map +1 -0
- package/dist/lib/local-llm/types.js +2 -0
- package/dist/lib/local-llm/types.js.map +1 -0
- package/dist/lib/logger.d.ts +2 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +68 -6
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp/mcp-client.js +5 -3
- package/dist/lib/mcp/mcp-client.js.map +1 -1
- package/dist/lib/mcp/types.d.ts +0 -9
- package/dist/lib/mcp/types.d.ts.map +1 -1
- package/dist/lib/mcp/types.js +1 -2
- package/dist/lib/mcp/types.js.map +1 -1
- package/dist/lib/memory/memory-manager.d.ts +1 -0
- package/dist/lib/memory/memory-manager.d.ts.map +1 -1
- package/dist/lib/memory/memory-manager.js +9 -0
- package/dist/lib/memory/memory-manager.js.map +1 -1
- package/dist/lib/orchestrator.d.ts +11 -8
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +246 -5
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/cdp-client.d.ts +15 -0
- package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
- package/dist/lib/sandbox/cdp-client.js +139 -0
- package/dist/lib/sandbox/cdp-client.js.map +1 -0
- package/dist/lib/sandbox/html-to-markdown.d.ts +9 -1
- package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -1
- package/dist/lib/sandbox/html-to-markdown.js +67 -10
- package/dist/lib/sandbox/html-to-markdown.js.map +1 -1
- package/dist/lib/sandbox/index.d.ts +6 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -1
- package/dist/lib/sandbox/index.js +5 -0
- package/dist/lib/sandbox/index.js.map +1 -1
- package/dist/lib/sandbox/page-readiness.d.ts +37 -0
- package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
- package/dist/lib/sandbox/page-readiness.js +268 -0
- package/dist/lib/sandbox/page-readiness.js.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.js +316 -0
- package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
- package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
- package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-container.js +176 -0
- package/dist/lib/sandbox/sandbox-container.js.map +1 -0
- package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-file.js +169 -0
- package/dist/lib/sandbox/sandbox-file.js.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts +5 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.js +111 -0
- package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-web.js +64 -24
- package/dist/lib/sandbox/sandbox-web.js.map +1 -1
- package/dist/lib/sandbox/types.d.ts +9 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -1
- package/dist/lib/sandbox/types.js +1 -0
- package/dist/lib/sandbox/types.js.map +1 -1
- package/dist/lib/sandbox/vision-browser.d.ts +4 -0
- package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/vision-browser.js +298 -0
- package/dist/lib/sandbox/vision-browser.js.map +1 -0
- package/dist/lib/sea/app-window.d.ts +7 -0
- package/dist/lib/sea/app-window.d.ts.map +1 -0
- package/dist/lib/sea/app-window.js +95 -0
- package/dist/lib/sea/app-window.js.map +1 -0
- package/dist/lib/sea/bootstrap.d.ts +18 -0
- package/dist/lib/sea/bootstrap.d.ts.map +1 -0
- package/dist/lib/sea/bootstrap.js +103 -0
- package/dist/lib/sea/bootstrap.js.map +1 -0
- package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
- package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
- package/dist/lib/sea/sqlite-vec-shim.js +10 -0
- package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
- package/dist/lib/skills/skill-loader.d.ts +2 -0
- package/dist/lib/skills/skill-loader.d.ts.map +1 -1
- package/dist/lib/skills/skill-loader.js +12 -1
- package/dist/lib/skills/skill-loader.js.map +1 -1
- package/dist/lib/tasks/task-manager.d.ts +3 -1
- package/dist/lib/tasks/task-manager.d.ts.map +1 -1
- package/dist/lib/tasks/task-manager.js +11 -0
- package/dist/lib/tasks/task-manager.js.map +1 -1
- package/dist/lib/tasks/task-store.d.ts +1 -1
- package/dist/lib/tasks/task-store.d.ts.map +1 -1
- package/dist/lib/tasks/task-store.js.map +1 -1
- package/dist/lib/tasks/types.d.ts +18 -0
- package/dist/lib/tasks/types.d.ts.map +1 -1
- package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
- package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
- package/dist/lib/tools/built-in/integration-tools.js +47 -0
- package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +17 -17
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
- package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +74 -40
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
- package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
- package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -1
- package/dist/lib/tools/built-in/query-validators.js +4 -0
- package/dist/lib/tools/built-in/query-validators.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts +1 -0
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.js +44 -4
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
- package/dist/lib/triggers/cron-trigger.d.ts +1 -1
- package/dist/lib/triggers/cron-trigger.d.ts.map +1 -1
- package/dist/lib/triggers/cron-trigger.js.map +1 -1
- package/dist/lib/triggers/trigger-manager.d.ts +1 -0
- package/dist/lib/triggers/trigger-manager.d.ts.map +1 -1
- package/dist/lib/triggers/trigger-manager.js +26 -0
- package/dist/lib/triggers/trigger-manager.js.map +1 -1
- package/dist/lib/triggers/webhook-trigger.d.ts +1 -1
- package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -1
- package/dist/lib/triggers/webhook-trigger.js.map +1 -1
- package/dist/lib/types/llm-types.d.ts +22 -4
- package/dist/lib/types/llm-types.d.ts.map +1 -1
- package/dist/lib/types/llm-types.js +50 -0
- package/dist/lib/types/llm-types.js.map +1 -1
- package/dist/lib/types/tool-factory.d.ts +2 -2
- package/dist/lib/types/tool-factory.d.ts.map +1 -1
- package/dist/lib/types/tool-factory.js +9 -2
- package/dist/lib/types/tool-factory.js.map +1 -1
- package/dist/lib/utils/document-extract.d.ts +10 -0
- package/dist/lib/utils/document-extract.d.ts.map +1 -0
- package/dist/lib/utils/document-extract.js +149 -0
- package/dist/lib/utils/document-extract.js.map +1 -0
- package/dist/lib/utils/env-substitution.d.ts +6 -0
- package/dist/lib/utils/env-substitution.d.ts.map +1 -0
- package/dist/lib/utils/env-substitution.js +15 -0
- package/dist/lib/utils/env-substitution.js.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
- package/dist/lib/workflows/react-workflow-executor.js +23 -17
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
- package/dist/lib/workflows/types.d.ts +81 -55
- package/dist/lib/workflows/types.d.ts.map +1 -1
- package/dist/lib/workflows/types.js +10 -0
- package/dist/lib/workflows/types.js.map +1 -1
- package/dist/lib/workflows/workflow-loader.d.ts +3 -0
- package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-loader.js +10 -1
- package/dist/lib/workflows/workflow-loader.js.map +1 -1
- package/dist/public/assets/logo.png +0 -0
- package/dist/public/chat.html +39 -0
- package/dist/public/index.html +6 -176
- package/dist/public/src/components/AgentComposer.js +807 -0
- package/dist/public/src/components/AgentsView.js +1812 -508
- package/dist/public/src/components/AppRoot.js +125 -38
- package/dist/public/src/components/GraphView.js +382 -300
- package/dist/public/src/components/IdeView.js +277 -86
- package/dist/public/src/components/KnowledgeView.js +94 -130
- package/dist/public/src/components/LlmView.js +15 -19
- package/dist/public/src/components/LocalLlmView.js +2440 -0
- package/dist/public/src/components/LogViewer.js +155 -0
- package/dist/public/src/components/McpView.js +41 -49
- package/dist/public/src/components/MonitorView.js +174 -83
- package/dist/public/src/components/NavBar.js +16 -26
- package/dist/public/src/components/StandaloneChat.js +875 -0
- package/dist/public/src/services/ApiService.js +203 -4
- package/dist/public/src/services/SessionStore.js +86 -0
- package/dist/public/src/services/StreamManager.js +183 -0
- package/dist/public/src/store.js +1 -3
- package/dist/public/src/utils/card.js +21 -0
- package/dist/public/src/utils/markdown.js +7 -0
- package/dist/public/styles.css +2777 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +7 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/start.d.ts.map +1 -1
- package/dist/src/cli/commands/start.js +28 -5
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/cli/index.js +19 -5
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/index.js +7 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts.map +1 -1
- package/dist/src/middleware/auth.js +28 -6
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/middleware/rate-limit.d.ts +8 -0
- package/dist/src/middleware/rate-limit.d.ts.map +1 -0
- package/dist/src/middleware/rate-limit.js +21 -0
- package/dist/src/middleware/rate-limit.js.map +1 -0
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +138 -10
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/chat.route.d.ts +3 -0
- package/dist/src/routes/chat.route.d.ts.map +1 -0
- package/dist/src/routes/chat.route.js +156 -0
- package/dist/src/routes/chat.route.js.map +1 -0
- package/dist/src/routes/files.route.d.ts.map +1 -1
- package/dist/src/routes/files.route.js +37 -2
- package/dist/src/routes/files.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +263 -8
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/local-llm.route.d.ts +3 -0
- package/dist/src/routes/local-llm.route.d.ts.map +1 -0
- package/dist/src/routes/local-llm.route.js +688 -0
- package/dist/src/routes/local-llm.route.js.map +1 -0
- package/dist/src/routes/logs.route.d.ts +3 -0
- package/dist/src/routes/logs.route.d.ts.map +1 -0
- package/dist/src/routes/logs.route.js +24 -0
- package/dist/src/routes/logs.route.js.map +1 -0
- package/dist/src/routes/tasks.route.d.ts.map +1 -1
- package/dist/src/routes/tasks.route.js +15 -1
- package/dist/src/routes/tasks.route.js.map +1 -1
- package/dist/src/routes/vnc.route.d.ts +12 -0
- package/dist/src/routes/vnc.route.d.ts.map +1 -0
- package/dist/src/routes/vnc.route.js +74 -0
- package/dist/src/routes/vnc.route.js.map +1 -0
- package/dist/src/routes/workflows.route.d.ts.map +1 -1
- package/dist/src/routes/workflows.route.js +24 -0
- package/dist/src/routes/workflows.route.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +29 -3
- package/dist/src/server.js.map +1 -1
- package/dist/templates/Demo.md +152 -0
- package/dist/templates/README.md +12 -3
- package/dist/templates/agents/actor.agent.yaml +34 -0
- package/dist/templates/agents/architect.agent.yaml +20 -13
- package/dist/templates/agents/chatbot.agent.yaml +23 -27
- package/dist/templates/agents/corporate.agent.yaml +64 -0
- package/dist/templates/agents/functions.agent.yaml +29 -0
- package/dist/templates/agents/investment-analyst.agent.yaml +79 -0
- package/dist/templates/agents/music-librarian.agent.yaml +46 -0
- package/dist/templates/agents/network-security.agent.yaml +81 -0
- package/dist/templates/agents/transport-security.agent.yaml +69 -0
- package/dist/templates/agents/web-engineer.agent.yaml +98 -0
- package/dist/templates/agents/web-pilot.agent.yaml +57 -0
- package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
- package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
- package/dist/templates/knowledge/music-store/tables.png +0 -0
- package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
- package/dist/templates/knowledge/org-chart/personnel.csv +21 -21
- package/dist/templates/knowledge/org-chart.knowledge.yaml +4 -0
- package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
- package/dist/templates/knowledge/pet-store.knowledge.yaml +3 -0
- package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
- package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
- package/dist/templates/knowledge/{example.knowledge.yaml → transcripts.knowledge.yaml} +9 -5
- package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
- package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
- package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
- package/dist/templates/llm.json +62 -22
- package/dist/templates/mcp.json +7 -4
- package/dist/templates/skills/orcha-builder/SKILL.md +148 -215
- package/dist/templates/skills/pii-guard/SKILL.md +22 -0
- package/dist/templates/skills/sandbox/SKILL.md +25 -48
- package/dist/templates/skills/web-pilot/SKILL.md +51 -0
- package/dist/templates/workflows/example.workflow.yaml +27 -35
- package/dist/templates/workflows/react-example.workflow.yaml +14 -19
- package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
- package/package.json +17 -4
- package/dist/public/src/components/SkillsView.js +0 -137
- package/dist/public/src/components/WorkflowsView.js +0 -416
- package/dist/templates/agents/knowledge-broker.agent.yaml +0 -39
- package/dist/templates/agents/sandbox.agent.yaml +0 -56
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { createWriteStream } from 'fs';
|
|
4
|
+
import { pipeline } from 'stream/promises';
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
const STATE_FILE = 'state.json';
|
|
7
|
+
export class ModelManager {
|
|
8
|
+
modelsDir;
|
|
9
|
+
_activeDownloads = new Map();
|
|
10
|
+
constructor(workspaceRoot) {
|
|
11
|
+
this.modelsDir = path.join(workspaceRoot, '.models');
|
|
12
|
+
}
|
|
13
|
+
getActiveDownloads() {
|
|
14
|
+
return [...this._activeDownloads.values()];
|
|
15
|
+
}
|
|
16
|
+
/** Find .downloading partial files that aren't currently being downloaded (interrupted by restart etc.) */
|
|
17
|
+
async getInterruptedDownloads() {
|
|
18
|
+
await this.ensureDir();
|
|
19
|
+
const entries = await fs.readdir(this.modelsDir);
|
|
20
|
+
const results = [];
|
|
21
|
+
for (const entry of entries) {
|
|
22
|
+
// GGUF partial downloads
|
|
23
|
+
if (entry.endsWith('.gguf.downloading')) {
|
|
24
|
+
const fileName = entry.replace(/\.downloading$/, '');
|
|
25
|
+
const isActive = [...this._activeDownloads.values()].some(d => d.fileName === fileName);
|
|
26
|
+
if (isActive)
|
|
27
|
+
continue;
|
|
28
|
+
const filePath = path.join(this.modelsDir, entry);
|
|
29
|
+
const stat = await fs.stat(filePath);
|
|
30
|
+
const meta = await this.readMeta(fileName);
|
|
31
|
+
results.push({
|
|
32
|
+
fileName,
|
|
33
|
+
repo: meta?.repo,
|
|
34
|
+
downloadedBytes: stat.size,
|
|
35
|
+
});
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// MLX partial downloads (directories with .downloading marker)
|
|
39
|
+
const markerPath = path.join(this.modelsDir, entry, '.downloading');
|
|
40
|
+
try {
|
|
41
|
+
await fs.stat(markerPath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const isActive = [...this._activeDownloads.values()].some(d => d.fileName === entry);
|
|
47
|
+
if (isActive)
|
|
48
|
+
continue;
|
|
49
|
+
const dirSize = await this.dirSize(path.join(this.modelsDir, entry));
|
|
50
|
+
const meta = await this.readMlxMeta(entry);
|
|
51
|
+
results.push({
|
|
52
|
+
fileName: entry,
|
|
53
|
+
repo: meta?.repo,
|
|
54
|
+
downloadedBytes: dirSize,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return results;
|
|
58
|
+
}
|
|
59
|
+
async deleteInterruptedDownload(fileName) {
|
|
60
|
+
// Check if it's an MLX directory with .downloading marker
|
|
61
|
+
const dirPath = path.join(this.modelsDir, fileName);
|
|
62
|
+
try {
|
|
63
|
+
const stat = await fs.stat(dirPath);
|
|
64
|
+
if (stat.isDirectory()) {
|
|
65
|
+
await fs.rm(dirPath, { recursive: true });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch { /* not a directory */ }
|
|
70
|
+
// GGUF partial download
|
|
71
|
+
const tempPath = path.join(this.modelsDir, `${fileName}.downloading`);
|
|
72
|
+
await fs.unlink(tempPath).catch(() => { });
|
|
73
|
+
await fs.unlink(this.metaPath(fileName)).catch(() => { });
|
|
74
|
+
}
|
|
75
|
+
async ensureDir() {
|
|
76
|
+
await fs.mkdir(this.modelsDir, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
async listModels() {
|
|
79
|
+
await this.ensureDir();
|
|
80
|
+
const entries = await fs.readdir(this.modelsDir);
|
|
81
|
+
const models = [];
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const entryPath = path.join(this.modelsDir, entry);
|
|
84
|
+
const stat = await fs.stat(entryPath);
|
|
85
|
+
// GGUF files
|
|
86
|
+
if (entry.endsWith('.gguf') && stat.isFile()) {
|
|
87
|
+
if (entry.toLowerCase().includes('mmproj'))
|
|
88
|
+
continue;
|
|
89
|
+
const meta = await this.readMeta(entry);
|
|
90
|
+
models.push({
|
|
91
|
+
id: this.fileNameToId(entry),
|
|
92
|
+
fileName: entry,
|
|
93
|
+
filePath: entryPath,
|
|
94
|
+
sizeBytes: stat.size,
|
|
95
|
+
repo: meta?.repo,
|
|
96
|
+
downloadedAt: meta?.downloadedAt ?? stat.birthtime.toISOString(),
|
|
97
|
+
type: 'gguf',
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// MLX model directories (contain config.json)
|
|
102
|
+
if (stat.isDirectory()) {
|
|
103
|
+
const configPath = path.join(entryPath, 'config.json');
|
|
104
|
+
try {
|
|
105
|
+
await fs.stat(configPath);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// Skip directories with .downloading marker (incomplete)
|
|
111
|
+
try {
|
|
112
|
+
await fs.stat(path.join(entryPath, '.downloading'));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
catch { /* no marker = complete */ }
|
|
116
|
+
const meta = await this.readMlxMeta(entry);
|
|
117
|
+
const sizeBytes = await this.dirSize(entryPath);
|
|
118
|
+
models.push({
|
|
119
|
+
id: entry,
|
|
120
|
+
fileName: entry,
|
|
121
|
+
filePath: entryPath,
|
|
122
|
+
sizeBytes,
|
|
123
|
+
repo: meta?.repo,
|
|
124
|
+
downloadedAt: meta?.downloadedAt ?? stat.birthtime.toISOString(),
|
|
125
|
+
type: 'mlx',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return models;
|
|
130
|
+
}
|
|
131
|
+
async getModel(id) {
|
|
132
|
+
const models = await this.listModels();
|
|
133
|
+
return models.find((m) => m.id === id) ?? null;
|
|
134
|
+
}
|
|
135
|
+
/** Auto-download an mmproj file from the same repo if needed for vision support. */
|
|
136
|
+
async autoDownloadMmproj(repo, onProgress) {
|
|
137
|
+
await this.ensureDir();
|
|
138
|
+
// Already have an mmproj from this repo?
|
|
139
|
+
const entries = await fs.readdir(this.modelsDir);
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
if (!entry.toLowerCase().includes('mmproj') || !entry.endsWith('.gguf'))
|
|
142
|
+
continue;
|
|
143
|
+
const meta = await this.readMeta(entry);
|
|
144
|
+
if (meta?.repo === repo)
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
// Fetch repo file list from HuggingFace
|
|
148
|
+
try {
|
|
149
|
+
const res = await fetch(`https://huggingface.co/api/models/${repo}?blobs=true`);
|
|
150
|
+
if (!res.ok)
|
|
151
|
+
return null;
|
|
152
|
+
const detail = await res.json();
|
|
153
|
+
const mmprojFiles = (detail.siblings ?? [])
|
|
154
|
+
.filter((s) => s.rfilename?.endsWith('.gguf') && s.rfilename.toLowerCase().includes('mmproj'))
|
|
155
|
+
.map((s) => ({ fileName: s.rfilename, sizeBytes: (s.size ?? 0) }));
|
|
156
|
+
if (mmprojFiles.length === 0)
|
|
157
|
+
return null;
|
|
158
|
+
// Prefer F16/BF16 (smaller, good quality) over F32
|
|
159
|
+
const preferred = mmprojFiles.find((f) => /f16|bf16/i.test(f.fileName) && !/f32/i.test(f.fileName)) ?? mmprojFiles[0];
|
|
160
|
+
logger.info(`[ModelManager] Auto-downloading mmproj: ${preferred.fileName} from ${repo}`);
|
|
161
|
+
return this.downloadModel(repo, preferred.fileName, onProgress);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
logger.warn(`[ModelManager] Failed to auto-download mmproj: ${err}`);
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async findModelFile(modelName) {
|
|
169
|
+
const models = await this.listModels();
|
|
170
|
+
const match = models.find((m) => m.id === modelName || m.fileName === modelName);
|
|
171
|
+
return match ? { filePath: match.filePath, type: match.type } : null;
|
|
172
|
+
}
|
|
173
|
+
/** Find a multimodal projector (mmproj) file from the same repo as the given model. */
|
|
174
|
+
async findMmprojForModel(modelFileName) {
|
|
175
|
+
const modelMeta = await this.readMeta(modelFileName);
|
|
176
|
+
if (!modelMeta?.repo)
|
|
177
|
+
return null;
|
|
178
|
+
await this.ensureDir();
|
|
179
|
+
const entries = await fs.readdir(this.modelsDir);
|
|
180
|
+
for (const entry of entries) {
|
|
181
|
+
if (!entry.toLowerCase().includes('mmproj') || !entry.endsWith('.gguf'))
|
|
182
|
+
continue;
|
|
183
|
+
const meta = await this.readMeta(entry);
|
|
184
|
+
if (meta?.repo === modelMeta.repo)
|
|
185
|
+
return path.join(this.modelsDir, entry);
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
async downloadModel(repo, fileName, onProgress) {
|
|
190
|
+
const downloadKey = `${repo}/${fileName}`;
|
|
191
|
+
// If already downloading, don't start again
|
|
192
|
+
if (this._activeDownloads.has(downloadKey)) {
|
|
193
|
+
throw new Error(`Already downloading ${downloadKey}`);
|
|
194
|
+
}
|
|
195
|
+
await this.ensureDir();
|
|
196
|
+
const url = `https://huggingface.co/${repo}/resolve/main/${fileName}`;
|
|
197
|
+
const tempPath = path.join(this.modelsDir, `${fileName}.downloading`);
|
|
198
|
+
const finalPath = path.join(this.modelsDir, fileName);
|
|
199
|
+
// Check for a partial download to resume
|
|
200
|
+
let existingBytes = 0;
|
|
201
|
+
try {
|
|
202
|
+
const stat = await fs.stat(tempPath);
|
|
203
|
+
existingBytes = stat.size;
|
|
204
|
+
}
|
|
205
|
+
catch { /* no partial file */ }
|
|
206
|
+
const resuming = existingBytes > 0;
|
|
207
|
+
if (resuming) {
|
|
208
|
+
logger.info(`[ModelManager] Resuming download of ${fileName} from ${existingBytes} bytes`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
logger.info(`[ModelManager] Downloading ${url}`);
|
|
212
|
+
}
|
|
213
|
+
// Write meta early so interrupted downloads know which repo they belong to
|
|
214
|
+
await fs.writeFile(this.metaPath(fileName), JSON.stringify({ repo }, null, 2));
|
|
215
|
+
const initialProgress = { fileName, downloadedBytes: existingBytes, totalBytes: 0, percent: 0 };
|
|
216
|
+
this._activeDownloads.set(downloadKey, { repo, fileName, progress: initialProgress });
|
|
217
|
+
try {
|
|
218
|
+
const headers = {};
|
|
219
|
+
if (resuming) {
|
|
220
|
+
headers['Range'] = `bytes=${existingBytes}-`;
|
|
221
|
+
}
|
|
222
|
+
const response = await fetch(url, { redirect: 'follow', headers });
|
|
223
|
+
// 416 = Range Not Satisfiable — file is already complete
|
|
224
|
+
if (response.status === 416) {
|
|
225
|
+
await fs.rename(tempPath, finalPath);
|
|
226
|
+
const meta = { repo, downloadedAt: new Date().toISOString() };
|
|
227
|
+
await fs.writeFile(this.metaPath(fileName), JSON.stringify(meta, null, 2));
|
|
228
|
+
const stat = await fs.stat(finalPath);
|
|
229
|
+
return {
|
|
230
|
+
id: this.fileNameToId(fileName),
|
|
231
|
+
fileName,
|
|
232
|
+
filePath: finalPath,
|
|
233
|
+
sizeBytes: stat.size,
|
|
234
|
+
repo,
|
|
235
|
+
downloadedAt: meta.downloadedAt,
|
|
236
|
+
type: 'gguf',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (!response.ok && response.status !== 206) {
|
|
240
|
+
throw new Error(`Download failed: ${response.status} ${response.statusText}`);
|
|
241
|
+
}
|
|
242
|
+
// 206 = Partial Content (resume), 200 = full file (server doesn't support range or fresh start)
|
|
243
|
+
const isPartial = response.status === 206;
|
|
244
|
+
const contentLength = Number(response.headers.get('content-length') ?? 0);
|
|
245
|
+
const totalBytes = isPartial ? existingBytes + contentLength : contentLength;
|
|
246
|
+
let downloadedBytes = isPartial ? existingBytes : 0;
|
|
247
|
+
// If server returned 200 instead of 206, start from scratch
|
|
248
|
+
if (!isPartial && resuming) {
|
|
249
|
+
existingBytes = 0;
|
|
250
|
+
downloadedBytes = 0;
|
|
251
|
+
}
|
|
252
|
+
const body = response.body;
|
|
253
|
+
if (!body)
|
|
254
|
+
throw new Error('No response body');
|
|
255
|
+
const fileStream = createWriteStream(tempPath, {
|
|
256
|
+
flags: isPartial ? 'a' : 'w',
|
|
257
|
+
});
|
|
258
|
+
const activeDownloads = this._activeDownloads;
|
|
259
|
+
const progressStream = new TransformStream({
|
|
260
|
+
transform(chunk, controller) {
|
|
261
|
+
downloadedBytes += chunk.byteLength;
|
|
262
|
+
const progress = {
|
|
263
|
+
fileName,
|
|
264
|
+
downloadedBytes,
|
|
265
|
+
totalBytes,
|
|
266
|
+
percent: totalBytes > 0 ? Math.round((downloadedBytes / totalBytes) * 100) : 0,
|
|
267
|
+
};
|
|
268
|
+
const entry = activeDownloads.get(downloadKey);
|
|
269
|
+
if (entry)
|
|
270
|
+
entry.progress = progress;
|
|
271
|
+
onProgress?.(progress);
|
|
272
|
+
controller.enqueue(chunk);
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
const readable = body.pipeThrough(progressStream);
|
|
276
|
+
const nodeReadable = await import('stream');
|
|
277
|
+
const nodeStream = nodeReadable.Readable.fromWeb(readable);
|
|
278
|
+
await pipeline(nodeStream, fileStream);
|
|
279
|
+
await fs.rename(tempPath, finalPath);
|
|
280
|
+
const meta = { repo, downloadedAt: new Date().toISOString() };
|
|
281
|
+
await fs.writeFile(this.metaPath(fileName), JSON.stringify(meta, null, 2));
|
|
282
|
+
const stat = await fs.stat(finalPath);
|
|
283
|
+
return {
|
|
284
|
+
id: this.fileNameToId(fileName),
|
|
285
|
+
fileName,
|
|
286
|
+
filePath: finalPath,
|
|
287
|
+
sizeBytes: stat.size,
|
|
288
|
+
repo,
|
|
289
|
+
downloadedAt: meta.downloadedAt,
|
|
290
|
+
type: 'gguf',
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
this._activeDownloads.delete(downloadKey);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async deleteModel(id) {
|
|
298
|
+
const model = await this.getModel(id);
|
|
299
|
+
if (!model)
|
|
300
|
+
throw new Error(`Model "${id}" not found`);
|
|
301
|
+
if (model.type === 'mlx') {
|
|
302
|
+
// MLX: remove the entire directory
|
|
303
|
+
await fs.rm(model.filePath, { recursive: true });
|
|
304
|
+
logger.info(`[ModelManager] Deleted MLX model directory: ${model.fileName}`);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// GGUF: Find and delete associated mmproj files from the same repo
|
|
308
|
+
if (model.repo) {
|
|
309
|
+
const entries = await fs.readdir(this.modelsDir);
|
|
310
|
+
for (const entry of entries) {
|
|
311
|
+
if (!entry.toLowerCase().includes('mmproj') || !entry.endsWith('.gguf'))
|
|
312
|
+
continue;
|
|
313
|
+
const meta = await this.readMeta(entry);
|
|
314
|
+
if (meta?.repo === model.repo) {
|
|
315
|
+
await fs.unlink(path.join(this.modelsDir, entry)).catch(() => { });
|
|
316
|
+
await fs.unlink(this.metaPath(entry)).catch(() => { });
|
|
317
|
+
logger.info(`[ModelManager] Deleted associated mmproj: ${entry}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
await fs.unlink(model.filePath);
|
|
322
|
+
try {
|
|
323
|
+
await fs.unlink(this.metaPath(model.fileName));
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// meta file may not exist
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async downloadMlxModel(repo, onProgress) {
|
|
330
|
+
const downloadKey = `mlx:${repo}`;
|
|
331
|
+
if (this._activeDownloads.has(downloadKey)) {
|
|
332
|
+
throw new Error(`Already downloading ${repo}`);
|
|
333
|
+
}
|
|
334
|
+
await this.ensureDir();
|
|
335
|
+
// Derive directory name from repo (e.g., "mlx-community/Qwen3.5-9B-4bit" → "Qwen3.5-9B-4bit")
|
|
336
|
+
const dirName = repo.split('/').pop();
|
|
337
|
+
const modelDir = path.join(this.modelsDir, dirName);
|
|
338
|
+
await fs.mkdir(modelDir, { recursive: true });
|
|
339
|
+
// Write .downloading marker
|
|
340
|
+
const markerPath = path.join(modelDir, '.downloading');
|
|
341
|
+
await fs.writeFile(markerPath, '');
|
|
342
|
+
// Write meta early
|
|
343
|
+
const metaPath = path.join(modelDir, '.meta.json');
|
|
344
|
+
await fs.writeFile(metaPath, JSON.stringify({ repo }, null, 2));
|
|
345
|
+
const initialProgress = { fileName: dirName, downloadedBytes: 0, totalBytes: 0, percent: 0 };
|
|
346
|
+
this._activeDownloads.set(downloadKey, { repo, fileName: dirName, progress: initialProgress });
|
|
347
|
+
try {
|
|
348
|
+
// Fetch file list from HuggingFace API
|
|
349
|
+
const apiRes = await fetch(`https://huggingface.co/api/models/${repo}?blobs=true`);
|
|
350
|
+
if (!apiRes.ok)
|
|
351
|
+
throw new Error(`HuggingFace API error: ${apiRes.status}`);
|
|
352
|
+
const detail = await apiRes.json();
|
|
353
|
+
const siblings = (detail.siblings ?? []);
|
|
354
|
+
const totalBytes = siblings.reduce((sum, s) => sum + (s.size ?? 0), 0);
|
|
355
|
+
let downloadedBytes = 0;
|
|
356
|
+
// Download each file
|
|
357
|
+
for (const sibling of siblings) {
|
|
358
|
+
const fileName = sibling.rfilename;
|
|
359
|
+
const filePath = path.join(modelDir, fileName);
|
|
360
|
+
// Create subdirectories if needed
|
|
361
|
+
const fileDir = path.dirname(filePath);
|
|
362
|
+
if (fileDir !== modelDir) {
|
|
363
|
+
await fs.mkdir(fileDir, { recursive: true });
|
|
364
|
+
}
|
|
365
|
+
// Skip if already downloaded (resume)
|
|
366
|
+
try {
|
|
367
|
+
const existing = await fs.stat(filePath);
|
|
368
|
+
if (existing.size === (sibling.size ?? 0)) {
|
|
369
|
+
downloadedBytes += existing.size;
|
|
370
|
+
const progress = {
|
|
371
|
+
fileName: dirName,
|
|
372
|
+
downloadedBytes,
|
|
373
|
+
totalBytes,
|
|
374
|
+
percent: totalBytes > 0 ? Math.round((downloadedBytes / totalBytes) * 100) : 0,
|
|
375
|
+
};
|
|
376
|
+
const entry = this._activeDownloads.get(downloadKey);
|
|
377
|
+
if (entry)
|
|
378
|
+
entry.progress = progress;
|
|
379
|
+
onProgress?.(progress);
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
catch { /* file doesn't exist */ }
|
|
384
|
+
const url = `https://huggingface.co/${repo}/resolve/main/${fileName}`;
|
|
385
|
+
const response = await fetch(url, { redirect: 'follow' });
|
|
386
|
+
if (!response.ok)
|
|
387
|
+
throw new Error(`Download failed: ${response.status} ${response.statusText} for ${fileName}`);
|
|
388
|
+
const body = response.body;
|
|
389
|
+
if (!body)
|
|
390
|
+
throw new Error(`No response body for ${fileName}`);
|
|
391
|
+
const fileStream = createWriteStream(filePath);
|
|
392
|
+
const activeDownloads = this._activeDownloads;
|
|
393
|
+
const progressStream = new TransformStream({
|
|
394
|
+
transform(chunk, controller) {
|
|
395
|
+
downloadedBytes += chunk.byteLength;
|
|
396
|
+
const progress = {
|
|
397
|
+
fileName: dirName,
|
|
398
|
+
downloadedBytes,
|
|
399
|
+
totalBytes,
|
|
400
|
+
percent: totalBytes > 0 ? Math.round((downloadedBytes / totalBytes) * 100) : 0,
|
|
401
|
+
};
|
|
402
|
+
const entry = activeDownloads.get(downloadKey);
|
|
403
|
+
if (entry)
|
|
404
|
+
entry.progress = progress;
|
|
405
|
+
onProgress?.(progress);
|
|
406
|
+
controller.enqueue(chunk);
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
const readable = body.pipeThrough(progressStream);
|
|
410
|
+
const nodeReadable = await import('stream');
|
|
411
|
+
const nodeStream = nodeReadable.Readable.fromWeb(readable);
|
|
412
|
+
await pipeline(nodeStream, fileStream);
|
|
413
|
+
}
|
|
414
|
+
// Remove .downloading marker
|
|
415
|
+
await fs.unlink(markerPath).catch(() => { });
|
|
416
|
+
// Update meta
|
|
417
|
+
const meta = { repo, downloadedAt: new Date().toISOString() };
|
|
418
|
+
await fs.writeFile(metaPath, JSON.stringify(meta, null, 2));
|
|
419
|
+
const sizeBytes = await this.dirSize(modelDir);
|
|
420
|
+
return {
|
|
421
|
+
id: dirName,
|
|
422
|
+
fileName: dirName,
|
|
423
|
+
filePath: modelDir,
|
|
424
|
+
sizeBytes,
|
|
425
|
+
repo,
|
|
426
|
+
downloadedAt: meta.downloadedAt,
|
|
427
|
+
type: 'mlx',
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
this._activeDownloads.delete(downloadKey);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
async browseHuggingFace(query, limit = 10, format = 'gguf') {
|
|
435
|
+
// Strip HuggingFace URL prefixes so users can paste links directly
|
|
436
|
+
let cleaned = query.replace(/^https?:\/\/huggingface\.co\//, '').replace(/\/$/, '');
|
|
437
|
+
const searches = [];
|
|
438
|
+
if (format === 'mlx') {
|
|
439
|
+
// For MLX: search mlx-community first, then general
|
|
440
|
+
if (!cleaned.includes('/')) {
|
|
441
|
+
searches.push(`mlx-community/${cleaned}`);
|
|
442
|
+
}
|
|
443
|
+
searches.push(cleaned);
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
// GGUF: existing behavior
|
|
447
|
+
searches.push(cleaned);
|
|
448
|
+
if (/^[^/]+\/[^/]+$/.test(cleaned) && !cleaned.toLowerCase().includes('gguf')) {
|
|
449
|
+
searches.push(cleaned.split('/')[1]);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
const seen = new Set();
|
|
453
|
+
let models = [];
|
|
454
|
+
for (const q of searches) {
|
|
455
|
+
const filter = format === 'gguf' ? '&filter=gguf' : '&filter=mlx';
|
|
456
|
+
const url = `https://huggingface.co/api/models?search=${encodeURIComponent(q)}${filter}&sort=downloads&direction=-1&limit=${limit}`;
|
|
457
|
+
const response = await fetch(url);
|
|
458
|
+
if (!response.ok) {
|
|
459
|
+
throw new Error(`HuggingFace API error: ${response.status}`);
|
|
460
|
+
}
|
|
461
|
+
const batch = await response.json();
|
|
462
|
+
for (const m of batch) {
|
|
463
|
+
const id = m.modelId ?? m.id;
|
|
464
|
+
if (!seen.has(id)) {
|
|
465
|
+
seen.add(id);
|
|
466
|
+
models.push(m);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// Re-sort merged results: MLX prioritizes mlx-community repos, then by downloads
|
|
471
|
+
if (format === 'mlx') {
|
|
472
|
+
models.sort((a, b) => {
|
|
473
|
+
const aIsMlx = (a.modelId ?? a.id ?? '').startsWith('mlx-community/') ? 1 : 0;
|
|
474
|
+
const bIsMlx = (b.modelId ?? b.id ?? '').startsWith('mlx-community/') ? 1 : 0;
|
|
475
|
+
if (aIsMlx !== bIsMlx)
|
|
476
|
+
return bIsMlx - aIsMlx;
|
|
477
|
+
return (b.downloads ?? 0) - (a.downloads ?? 0);
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
models.sort((a, b) => (b.downloads ?? 0) - (a.downloads ?? 0));
|
|
482
|
+
}
|
|
483
|
+
models = models.slice(0, limit);
|
|
484
|
+
const results = [];
|
|
485
|
+
for (const model of models) {
|
|
486
|
+
// Fetch detailed info (file list + pipeline_tag) for each model
|
|
487
|
+
let ggufFiles = [];
|
|
488
|
+
let pipelineTag = model.pipeline_tag ?? '';
|
|
489
|
+
let detailTags = [];
|
|
490
|
+
try {
|
|
491
|
+
const detailUrl = `https://huggingface.co/api/models/${model.modelId}?blobs=true`;
|
|
492
|
+
const detailRes = await fetch(detailUrl);
|
|
493
|
+
if (detailRes.ok) {
|
|
494
|
+
const detail = await detailRes.json();
|
|
495
|
+
pipelineTag = detail.pipeline_tag ?? pipelineTag;
|
|
496
|
+
detailTags = Array.isArray(detail.tags) ? detail.tags : [];
|
|
497
|
+
const siblings = detail.siblings ?? [];
|
|
498
|
+
if (format === 'mlx') {
|
|
499
|
+
// For MLX: check for safetensors files, report total repo size as single entry
|
|
500
|
+
const hasSafetensors = siblings.some((s) => s.rfilename?.endsWith('.safetensors'));
|
|
501
|
+
if (hasSafetensors) {
|
|
502
|
+
const totalSize = siblings.reduce((sum, s) => sum + (s.size ?? 0), 0);
|
|
503
|
+
ggufFiles = [{ fileName: '__mlx_repo__', sizeBytes: totalSize }];
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
ggufFiles = siblings
|
|
508
|
+
.filter((s) => s.rfilename?.endsWith('.gguf'))
|
|
509
|
+
.map((s) => ({
|
|
510
|
+
fileName: s.rfilename,
|
|
511
|
+
sizeBytes: s.size ?? 0,
|
|
512
|
+
}));
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
catch {
|
|
517
|
+
// Skip on error
|
|
518
|
+
}
|
|
519
|
+
// Merge tags from list and detail responses
|
|
520
|
+
const listTags = Array.isArray(model.tags) ? model.tags : [];
|
|
521
|
+
const allTags = [...new Set([...listTags, ...detailTags])];
|
|
522
|
+
// For MLX format, skip repos without safetensors (no ggufFiles means no MLX content)
|
|
523
|
+
if (format === 'mlx' && ggufFiles.length === 0)
|
|
524
|
+
continue;
|
|
525
|
+
results.push({
|
|
526
|
+
repoId: model.modelId ?? model.id,
|
|
527
|
+
author: model.author ?? model.modelId?.split('/')[0] ?? '',
|
|
528
|
+
modelName: model.modelId?.split('/')[1] ?? model.modelId,
|
|
529
|
+
likes: model.likes ?? 0,
|
|
530
|
+
downloads: model.downloads ?? 0,
|
|
531
|
+
tags: allTags,
|
|
532
|
+
pipelineTag,
|
|
533
|
+
ggufFiles,
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
return results;
|
|
537
|
+
}
|
|
538
|
+
async getState() {
|
|
539
|
+
try {
|
|
540
|
+
const content = await fs.readFile(path.join(this.modelsDir, STATE_FILE), 'utf-8');
|
|
541
|
+
return JSON.parse(content);
|
|
542
|
+
}
|
|
543
|
+
catch {
|
|
544
|
+
return { lastActiveModel: null };
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
async saveState(state) {
|
|
548
|
+
await this.ensureDir();
|
|
549
|
+
await fs.writeFile(path.join(this.modelsDir, STATE_FILE), JSON.stringify(state, null, 2));
|
|
550
|
+
}
|
|
551
|
+
fileNameToId(fileName) {
|
|
552
|
+
return fileName.replace(/\.gguf$/, '');
|
|
553
|
+
}
|
|
554
|
+
metaPath(fileName) {
|
|
555
|
+
return path.join(this.modelsDir, `${fileName}.meta.json`);
|
|
556
|
+
}
|
|
557
|
+
async readMeta(fileName) {
|
|
558
|
+
try {
|
|
559
|
+
const content = await fs.readFile(this.metaPath(fileName), 'utf-8');
|
|
560
|
+
return JSON.parse(content);
|
|
561
|
+
}
|
|
562
|
+
catch {
|
|
563
|
+
return null;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
async readMlxMeta(dirName) {
|
|
567
|
+
try {
|
|
568
|
+
const content = await fs.readFile(path.join(this.modelsDir, dirName, '.meta.json'), 'utf-8');
|
|
569
|
+
return JSON.parse(content);
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
return null;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
async dirSize(dirPath) {
|
|
576
|
+
let total = 0;
|
|
577
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
578
|
+
for (const entry of entries) {
|
|
579
|
+
const entryPath = path.join(dirPath, entry.name);
|
|
580
|
+
if (entry.isDirectory()) {
|
|
581
|
+
total += await this.dirSize(entryPath);
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
const stat = await fs.stat(entryPath);
|
|
585
|
+
total += stat.size;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
return total;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
//# sourceMappingURL=model-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.js","sourceRoot":"","sources":["../../../lib/local-llm/model-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAUtC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,MAAM,OAAO,YAAY;IACf,SAAS,CAAS;IAClB,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE7D,YAAY,aAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,kBAAkB;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,2GAA2G;IAC3G,KAAK,CAAC,uBAAuB;QAC3B,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,yBAAyB;YACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBACrD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;gBACxF,IAAI,QAAQ;oBAAE,SAAS;gBAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAE3C,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ;oBACR,IAAI,EAAE,IAAI,EAAE,IAAI;oBAChB,eAAe,EAAE,IAAI,CAAC,IAAI;iBAC3B,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,+DAA+D;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YACpE,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAErB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC;YACrF,IAAI,QAAQ;gBAAE,SAAS;YAEvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAE3C,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,IAAI,EAAE,IAAI;gBAChB,eAAe,EAAE,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,QAAgB;QAC9C,0DAA0D;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;QAEjC,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,cAAc,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEtC,aAAa;YACb,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;oBAC5B,QAAQ,EAAE,KAAK;oBACf,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,IAAI,CAAC,IAAI;oBACpB,IAAI,EAAE,IAAI,EAAE,IAAI;oBAChB,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;oBAChE,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,8CAA8C;YAC9C,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBACvD,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAErB,yDAAyD;gBACzD,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;oBACpD,SAAS;gBACX,CAAC;gBAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;gBAEtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC3C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,KAAK;oBACf,QAAQ,EAAE,SAAS;oBACnB,SAAS;oBACT,IAAI,EAAE,IAAI,EAAE,IAAI;oBAChB,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;oBAChE,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,kBAAkB,CACtB,IAAY,EACZ,UAAiD;QAEjD,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEvB,yCAAyC;QACzC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YAClF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;QACvC,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,qCAAqC,IAAI,aAAa,CAAC,CAAC;YAChF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,MAAM,GAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAErC,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;iBACxC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;iBAClG,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAmB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC;YAE9F,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE1C,mDAAmD;YACnD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAuB,EAAE,EAAE,CAC7D,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CACzD,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAEpB,MAAM,CAAC,IAAI,CAAC,2CAA2C,SAAS,CAAC,QAAQ,SAAS,IAAI,EAAE,CAAC,CAAC;YAC1F,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,kDAAkD,GAAG,EAAE,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;IAED,uFAAuF;IACvF,KAAK,CAAC,kBAAkB,CAAC,aAAqB;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,EAAE,IAAI;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YAClF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAAY,EACZ,QAAgB,EAChB,UAAiD;QAEjD,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;QAE1C,4CAA4C;QAC5C,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEvB,MAAM,GAAG,GAAG,0BAA0B,IAAI,iBAAiB,QAAQ,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,cAAc,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEtD,yCAAyC;QACzC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,aAAa,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,uCAAuC,QAAQ,SAAS,aAAa,QAAQ,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,2EAA2E;QAC3E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/E,MAAM,eAAe,GAAqB,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAClH,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;QAEtF,IAAI,CAAC;YACH,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,aAAa,GAAG,CAAC;YAC/C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAEnE,yDAAyD;YACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACrC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,OAAO;oBACL,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;oBAC/B,QAAQ;oBACR,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,IAAI,CAAC,IAAI;oBACpB,IAAI;oBACJ,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,IAAI,EAAE,MAAe;iBACtB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAChF,CAAC;YAED,gGAAgG;YAChG,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;YAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7E,IAAI,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpD,4DAA4D;YAC5D,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC3B,aAAa,GAAG,CAAC,CAAC;gBAClB,eAAe,GAAG,CAAC,CAAC;YACtB,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAE/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE;gBAC7C,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAE9C,MAAM,cAAc,GAAG,IAAI,eAAe,CAAC;gBACzC,SAAS,CAAC,KAAK,EAAE,UAAU;oBACzB,eAAe,IAAI,KAAK,CAAC,UAAU,CAAC;oBACpC,MAAM,QAAQ,GAAqB;wBACjC,QAAQ;wBACR,eAAe;wBACf,UAAU;wBACV,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC/E,CAAC;oBACF,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBAC/C,IAAI,KAAK;wBAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBACrC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;oBACvB,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAElD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAe,CAAC,CAAC;YAClE,MAAM,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEvC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAErC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE3E,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;gBAC/B,QAAQ;gBACR,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,IAAI;gBACJ,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,IAAI,EAAE,MAAe;aACtB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAEvD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzB,mCAAmC;YACnC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,+CAA+C,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAClF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC9B,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAClE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,UAAiD;QAEjD,MAAM,WAAW,GAAG,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEvB,8FAA8F;QAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEnC,mBAAmB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhE,MAAM,eAAe,GAAqB,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/G,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,qCAAqC,IAAI,aAAa,CAAC,CAAC;YACnF,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAQ,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAExC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAA2C,CAAC;YACnF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpF,IAAI,eAAe,GAAG,CAAC,CAAC;YAExB,qBAAqB;YACrB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAE/C,kCAAkC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACzB,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBAED,sCAAsC;gBACtC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzC,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;wBAC1C,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC;wBACjC,MAAM,QAAQ,GAAqB;4BACjC,QAAQ,EAAE,OAAO;4BACjB,eAAe;4BACf,UAAU;4BACV,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;yBAC/E,CAAC;wBACF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;wBACrD,IAAI,KAAK;4BAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;wBACrC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;wBACvB,SAAS;oBACX,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAEpC,MAAM,GAAG,GAAG,0BAA0B,IAAI,iBAAiB,QAAQ,EAAE,CAAC;gBACtE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,QAAQ,QAAQ,EAAE,CAAC,CAAC;gBAEhH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAC3B,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;gBAE/D,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAE9C,MAAM,cAAc,GAAG,IAAI,eAAe,CAAC;oBACzC,SAAS,CAAC,KAAK,EAAE,UAAU;wBACzB,eAAe,IAAI,KAAK,CAAC,UAAU,CAAC;wBACpC,MAAM,QAAQ,GAAqB;4BACjC,QAAQ,EAAE,OAAO;4BACjB,eAAe;4BACf,UAAU;4BACV,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;yBAC/E,CAAC;wBACF,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;wBAC/C,IAAI,KAAK;4BAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;wBACrC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;wBACvB,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,CAAC;iBACF,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;gBAClD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAe,CAAC,CAAC;gBAClE,MAAM,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACzC,CAAC;YAED,6BAA6B;YAC7B,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE5C,cAAc;YACd,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO;gBACL,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,QAAQ;gBAClB,SAAS;gBACT,IAAI;gBACJ,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,IAAI,EAAE,KAAK;aACZ,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE,EAAE,SAAyB,MAAM;QAChF,mEAAmE;QACnE,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEpF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,oDAAoD;YACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,0BAA0B;YAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,IAAI,MAAM,GAAU,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;YAClE,MAAM,GAAG,GAAG,4CAA4C,kBAAkB,CAAC,CAAC,CAAC,GAAG,MAAM,sCAAsC,KAAK,EAAE,CAAC;YACpI,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,KAAK,GAAU,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,iFAAiF;QACjF,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9E,IAAI,MAAM,KAAK,MAAM;oBAAE,OAAO,MAAM,GAAG,MAAM,CAAC;gBAC9C,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,MAAM,OAAO,GAA6B,EAAE,CAAC;QAE7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,gEAAgE;YAChE,IAAI,SAAS,GAA8C,EAAE,CAAC;YAC9D,IAAI,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;YAC3C,IAAI,UAAU,GAAa,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,qCAAqC,KAAK,CAAC,OAAO,aAAa,CAAC;gBAClF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;oBACtC,WAAW,GAAG,MAAM,CAAC,YAAY,IAAI,WAAW,CAAC;oBACjD,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;oBAEvC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;wBACrB,+EAA+E;wBAC/E,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;wBACxF,IAAI,cAAc,EAAE,CAAC;4BACnB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;4BACnF,SAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;wBACnE,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,QAAQ;6BACjB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;6BAClD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;4BAChB,QAAQ,EAAE,CAAC,CAAC,SAAS;4BACrB,SAAS,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;yBACvB,CAAC,CAAC,CAAC;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;YAED,4CAA4C;YAC5C,MAAM,QAAQ,GAAa,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE3D,qFAAqF;YACrF,IAAI,MAAM,KAAK,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEzD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE;gBACjC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC1D,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO;gBACxD,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBACvB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;gBAC/B,IAAI,EAAE,OAAO;gBACb,WAAW;gBACX,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAoB;QAClC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EACrC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAC/B,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,QAAgB;QACnC,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,QAAQ,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,YAAY,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,QAAgB;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAAe;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7F,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,OAAe;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|