claude-mpm 4.16.0__py3-none-any.whl → 4.25.10__py3-none-any.whl
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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +272 -23
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1821 -32
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/agent_loader.py +4 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/api_qa.json +5 -2
- claude_mpm/agents/templates/circuit_breakers.md +108 -2
- claude_mpm/agents/templates/documentation.json +33 -6
- claude_mpm/agents/templates/engineer.json +5 -1
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/php-engineer.json +10 -4
- claude_mpm/agents/templates/pm_red_flags.md +89 -19
- claude_mpm/agents/templates/project_organizer.json +7 -3
- claude_mpm/agents/templates/python_engineer.json +8 -3
- claude_mpm/agents/templates/qa.json +2 -1
- claude_mpm/agents/templates/react_engineer.json +1 -0
- claude_mpm/agents/templates/research.json +82 -12
- claude_mpm/agents/templates/rust_engineer.json +12 -7
- claude_mpm/agents/templates/security.json +4 -4
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +10 -6
- claude_mpm/agents/templates/version_control.json +4 -2
- claude_mpm/agents/templates/web_qa.json +2 -1
- claude_mpm/cli/README.md +253 -0
- claude_mpm/cli/__init__.py +11 -1
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
- claude_mpm/cli/commands/mpm_init/README.md +365 -0
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skills.py +922 -0
- claude_mpm/cli/executor.py +58 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +35 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +275 -0
- claude_mpm/cli/startup.py +168 -8
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/cli_module/refactoring_guide.md +253 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +6 -0
- claude_mpm/commands/mpm-init.md +130 -8
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +24 -0
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +14 -1
- claude_mpm/core/config.py +50 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +48 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +39 -0
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/d2/.gitignore +22 -0
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
- claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
- claude_mpm/d2/QUICKSTART.md +186 -0
- claude_mpm/d2/README.md +232 -0
- claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
- claude_mpm/d2/TESTING.md +288 -0
- claude_mpm/d2/index.html +118 -0
- claude_mpm/d2/package.json +19 -0
- claude_mpm/d2/src/App.svelte +110 -0
- claude_mpm/d2/src/components/Header.svelte +153 -0
- claude_mpm/d2/src/components/MainContent.svelte +74 -0
- claude_mpm/d2/src/components/Sidebar.svelte +85 -0
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
- claude_mpm/d2/src/lib/socketio.js +144 -0
- claude_mpm/d2/src/main.js +7 -0
- claude_mpm/d2/src/stores/events.js +114 -0
- claude_mpm/d2/src/stores/socket.js +108 -0
- claude_mpm/d2/src/stores/theme.js +65 -0
- claude_mpm/d2/svelte.config.js +12 -0
- claude_mpm/d2/vite.config.js +15 -0
- claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/BUILD_NUMBER +1 -0
- claude_mpm/dashboard/README.md +121 -0
- claude_mpm/dashboard/VERSION +1 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
- claude_mpm/dashboard/react/entries/events.tsx +165 -0
- claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
- claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
- claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
- claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
- claude_mpm/dashboard/static/built/connection-manager.js +76 -76
- claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
- claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/built/react/events.js.map +1 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/built/shared/logger.js +16 -16
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/index.html +22 -22
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/js/shared/logger.js +16 -16
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/static/navigation-test-results.md +118 -0
- claude_mpm/dashboard/static/production/main.html +21 -21
- claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/hooks/README.md +143 -0
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/README.md +180 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/templates/settings.json.example +147 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/agent_schema.json +596 -0
- claude_mpm/schemas/frontmatter_schema.json +165 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/auto_config_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
- claude_mpm/services/agents/local_template_manager.py +4 -2
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/README.md +244 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/README.md +303 -0
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/framework_claude_md_generator/README.md +119 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +2 -0
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +7 -131
- claude_mpm/services/mcp_gateway/README.md +185 -0
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
- claude_mpm/services/static/.gitkeep +2 -0
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/local.py +1 -1
- claude_mpm/services/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +97 -9
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/templates/questions/EXAMPLES.md +501 -0
- claude_mpm/templates/questions/__init__.py +43 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +314 -0
- claude_mpm/templates/questions/project_init.py +388 -0
- claude_mpm/templates/questions/ticket_mgmt.py +397 -0
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/README.md +64 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +5 -5
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm-4.25.10.dist-info/METADATA +789 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +485 -240
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/cli/commands/mpm_init.py +0 -2008
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- claude_mpm-4.16.0.dist-info/METADATA +0 -453
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-viewer.js","sources":["../../js/components/file-viewer.js"],"sourcesContent":["/**\n * File Viewer Component\n * \n * A simple file content viewer that displays file contents in a modal window.\n * This component handles file loading via HTTP requests and displays the content\n * with basic syntax highlighting support.\n */\n\nclass FileViewer {\n constructor() {\n this.modal = null;\n this.currentFile = null;\n this.initialized = false;\n this.contentCache = new Map();\n }\n\n /**\n * Initialize the file viewer\n */\n initialize() {\n if (this.initialized) {\n return;\n }\n\n this.createModal();\n this.setupEventHandlers();\n \n this.initialized = true;\n console.log('File viewer initialized');\n }\n\n /**\n * Create modal DOM structure\n */\n createModal() {\n const modalHtml = `\n <div class=\"file-viewer-modal\" id=\"file-viewer-modal\">\n <div class=\"file-viewer-content\">\n <div class=\"file-viewer-header\">\n <h2>📄 File Viewer</h2>\n <button class=\"file-viewer-close\" id=\"file-viewer-close\">×</button>\n </div>\n <div class=\"file-viewer-path\" id=\"file-viewer-path\">\n Loading...\n </div>\n <div class=\"file-viewer-body\">\n <pre class=\"file-viewer-code\" id=\"file-viewer-code\">\n <code id=\"file-viewer-code-content\">Loading file content...</code>\n </pre>\n </div>\n <div class=\"file-viewer-footer\">\n <div class=\"file-viewer-info\">\n <span id=\"file-viewer-type\">Type: --</span>\n <span id=\"file-viewer-lines\">Lines: --</span>\n <span id=\"file-viewer-size\">Size: --</span>\n </div>\n <button class=\"file-viewer-copy\" id=\"file-viewer-copy\">📋 Copy</button>\n </div>\n </div>\n </div>\n `;\n\n // Add modal to body\n document.body.insertAdjacentHTML('beforeend', modalHtml);\n this.modal = document.getElementById('file-viewer-modal');\n\n // Add styles if not already present\n if (!document.getElementById('file-viewer-styles')) {\n const styles = `\n <style id=\"file-viewer-styles\">\n .file-viewer-modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.7);\n z-index: 10000;\n animation: fadeIn 0.2s;\n }\n\n .file-viewer-modal.show {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .file-viewer-content {\n background: #1e1e1e;\n border-radius: 8px;\n width: 90%;\n max-width: 1200px;\n height: 80%;\n display: flex;\n flex-direction: column;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);\n }\n\n .file-viewer-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 15px 20px;\n background: #2d2d30;\n border-radius: 8px 8px 0 0;\n border-bottom: 1px solid #3e3e42;\n }\n\n .file-viewer-header h2 {\n margin: 0;\n color: #cccccc;\n font-size: 18px;\n }\n\n .file-viewer-close {\n background: none;\n border: none;\n color: #999;\n font-size: 24px;\n cursor: pointer;\n padding: 0;\n width: 30px;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .file-viewer-close:hover {\n color: #fff;\n }\n\n .file-viewer-path {\n padding: 10px 20px;\n background: #252526;\n color: #8b8b8b;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 12px;\n border-bottom: 1px solid #3e3e42;\n word-break: break-all;\n }\n\n .file-viewer-body {\n flex: 1;\n overflow: auto;\n padding: 20px;\n background: #1e1e1e;\n }\n\n .file-viewer-code {\n margin: 0;\n padding: 0;\n background: transparent;\n overflow: visible;\n }\n\n .file-viewer-code code {\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n color: #d4d4d4;\n white-space: pre;\n display: block;\n }\n\n .file-viewer-footer {\n padding: 15px 20px;\n background: #2d2d30;\n border-top: 1px solid #3e3e42;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-radius: 0 0 8px 8px;\n }\n\n .file-viewer-info {\n display: flex;\n gap: 20px;\n color: #8b8b8b;\n font-size: 12px;\n }\n\n .file-viewer-copy {\n background: #0e639c;\n color: white;\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n }\n\n .file-viewer-copy:hover {\n background: #1177bb;\n }\n\n .file-viewer-copy.copied {\n background: #4ec9b0;\n }\n\n .file-viewer-error {\n color: #f48771;\n padding: 20px;\n text-align: center;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n </style>\n `;\n document.head.insertAdjacentHTML('beforeend', styles);\n }\n }\n\n /**\n * Setup event handlers\n */\n setupEventHandlers() {\n // Close button\n document.getElementById('file-viewer-close').addEventListener('click', () => {\n this.hide();\n });\n\n // Close on backdrop click\n this.modal.addEventListener('click', (e) => {\n if (e.target === this.modal) {\n this.hide();\n }\n });\n\n // Close on ESC key\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.modal.classList.contains('show')) {\n this.hide();\n }\n });\n\n // Copy button\n document.getElementById('file-viewer-copy').addEventListener('click', () => {\n this.copyContent();\n });\n }\n\n /**\n * Show the file viewer with file content\n */\n async show(filePath) {\n console.log('[FileViewer] show() called with path:', filePath);\n console.log('[FileViewer] initialized:', this.initialized);\n \n if (!this.initialized) {\n console.log('[FileViewer] Not initialized, initializing now...');\n this.initialize();\n }\n\n this.currentFile = filePath;\n this.modal.classList.add('show');\n \n // Update path\n document.getElementById('file-viewer-path').textContent = filePath;\n \n console.log('[FileViewer] Modal shown, loading file content...');\n // Load file content\n await this.loadFileContent(filePath);\n }\n\n /**\n * Hide the file viewer\n */\n hide() {\n this.modal.classList.remove('show');\n this.currentFile = null;\n }\n\n /**\n * Load file content\n */\n async loadFileContent(filePath) {\n const codeContent = document.getElementById('file-viewer-code-content');\n \n console.log('[FileViewer] loadFileContent called with path:', filePath);\n \n // Check cache first\n if (this.contentCache.has(filePath)) {\n console.log('[FileViewer] Using cached content for:', filePath);\n this.displayContent(this.contentCache.get(filePath));\n return;\n }\n \n // Show loading state\n codeContent.textContent = 'Loading file content...';\n \n try {\n // Check if we have a socket connection available\n if (window.socket && window.socket.connected) {\n console.log('[FileViewer] Using Socket.IO to load file:', filePath);\n \n // Create a promise to wait for the response\n const responsePromise = new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n console.error('[FileViewer] Socket.IO request timed out for:', filePath);\n reject(new Error('Socket.IO request timed out'));\n }, 10000); // 10 second timeout\n \n // Set up one-time listener for the response\n window.socket.once('file_content_response', (data) => {\n clearTimeout(timeoutId);\n console.log('[FileViewer] Received file_content_response:', data);\n resolve(data);\n });\n \n // Emit the read_file event\n console.log('[FileViewer] Emitting read_file event with data:', {\n file_path: filePath,\n working_dir: window.workingDirectory || '/',\n max_size: 5 * 1024 * 1024 // 5MB limit\n });\n \n window.socket.emit('read_file', {\n file_path: filePath,\n working_dir: window.workingDirectory || '/',\n max_size: 5 * 1024 * 1024 // 5MB limit\n });\n });\n \n // Wait for the response\n const data = await responsePromise;\n \n if (data.success && data.content !== undefined) {\n console.log('[FileViewer] Successfully loaded file content, caching...');\n // Cache the content\n this.contentCache.set(filePath, data.content);\n \n // Display the content\n this.displayContent(data.content);\n \n // Update file info\n this.updateFileInfo(data);\n } else {\n console.error('[FileViewer] Server returned error:', data.error);\n throw new Error(data.error || 'Failed to load file content');\n }\n } else {\n console.error('[FileViewer] No Socket.IO connection available');\n throw new Error('No socket connection available. Please ensure the dashboard is connected to the monitoring server.');\n }\n } catch (error) {\n console.error('[FileViewer] Error loading file:', error);\n console.error('[FileViewer] Error stack:', error.stack);\n \n // If API fails, show error message with helpful information\n this.displayError(filePath, error.message);\n }\n }\n\n /**\n * Display file content\n */\n displayContent(content) {\n const codeContent = document.getElementById('file-viewer-code-content');\n \n // Set the content\n codeContent.textContent = content || '(Empty file)';\n \n // Update line count\n const lines = content ? content.split('\\n').length : 0;\n document.getElementById('file-viewer-lines').textContent = `Lines: ${lines}`;\n \n // Update file size\n const size = content ? new Blob([content]).size : 0;\n document.getElementById('file-viewer-size').textContent = `Size: ${this.formatFileSize(size)}`;\n \n // Detect and set file type\n const fileType = this.detectFileType(this.currentFile);\n document.getElementById('file-viewer-type').textContent = `Type: ${fileType}`;\n \n // Apply syntax highlighting if Prism is available\n if (window.Prism) {\n const language = this.detectLanguage(this.currentFile);\n codeContent.className = `language-${language}`;\n Prism.highlightElement(codeContent);\n }\n }\n\n /**\n * Display error message\n */\n displayError(filePath, errorMessage) {\n const codeContent = document.getElementById('file-viewer-code-content');\n \n // For now, show a helpful message since the API endpoint doesn't exist yet\n const errorHtml = `\n <div class=\"file-viewer-error\">\n ⚠️ File content loading is not yet implemented\n \n File path: ${filePath}\n \n The file viewing functionality requires:\n 1. A server-side /api/file endpoint\n 2. Proper file reading permissions\n 3. Security validation for file access\n \n Error: ${errorMessage}\n \n This feature will be available once the backend API is implemented.\n </div>\n `;\n \n codeContent.innerHTML = errorHtml;\n \n // Update info\n document.getElementById('file-viewer-lines').textContent = 'Lines: --';\n document.getElementById('file-viewer-size').textContent = 'Size: --';\n document.getElementById('file-viewer-type').textContent = 'Type: --';\n }\n\n /**\n * Update file info\n */\n updateFileInfo(data) {\n if (data.lines !== undefined) {\n document.getElementById('file-viewer-lines').textContent = `Lines: ${data.lines}`;\n }\n \n if (data.size !== undefined) {\n document.getElementById('file-viewer-size').textContent = `Size: ${this.formatFileSize(data.size)}`;\n }\n \n if (data.type) {\n document.getElementById('file-viewer-type').textContent = `Type: ${data.type}`;\n }\n }\n\n /**\n * Format file size for display\n */\n formatFileSize(bytes) {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n }\n\n /**\n * Detect file type from path\n */\n detectFileType(path) {\n if (!path) return 'Unknown';\n \n const ext = path.split('.').pop()?.toLowerCase();\n const typeMap = {\n 'py': 'Python',\n 'js': 'JavaScript',\n 'ts': 'TypeScript',\n 'jsx': 'React JSX',\n 'tsx': 'React TSX',\n 'html': 'HTML',\n 'css': 'CSS',\n 'json': 'JSON',\n 'xml': 'XML',\n 'yaml': 'YAML',\n 'yml': 'YAML',\n 'md': 'Markdown',\n 'txt': 'Text',\n 'sh': 'Shell Script',\n 'bash': 'Bash Script',\n 'sql': 'SQL',\n 'go': 'Go',\n 'rs': 'Rust',\n 'java': 'Java',\n 'cpp': 'C++',\n 'c': 'C',\n 'cs': 'C#',\n 'rb': 'Ruby',\n 'php': 'PHP'\n };\n \n return typeMap[ext] || 'Text';\n }\n\n /**\n * Detect language for syntax highlighting\n */\n detectLanguage(path) {\n if (!path) return 'plaintext';\n \n const ext = path.split('.').pop()?.toLowerCase();\n const languageMap = {\n 'py': 'python',\n 'js': 'javascript',\n 'ts': 'typescript',\n 'jsx': 'jsx',\n 'tsx': 'tsx',\n 'html': 'html',\n 'css': 'css',\n 'json': 'json',\n 'xml': 'xml',\n 'yaml': 'yaml',\n 'yml': 'yaml',\n 'md': 'markdown',\n 'sh': 'bash',\n 'bash': 'bash',\n 'sql': 'sql',\n 'go': 'go',\n 'rs': 'rust',\n 'java': 'java',\n 'cpp': 'cpp',\n 'c': 'c',\n 'cs': 'csharp',\n 'rb': 'ruby',\n 'php': 'php'\n };\n \n return languageMap[ext] || 'plaintext';\n }\n\n /**\n * Copy file content to clipboard\n */\n async copyContent() {\n const codeContent = document.getElementById('file-viewer-code-content');\n const button = document.getElementById('file-viewer-copy');\n const content = codeContent.textContent;\n \n try {\n await navigator.clipboard.writeText(content);\n \n // Show feedback\n const originalText = button.textContent;\n button.textContent = '✅ Copied!';\n button.classList.add('copied');\n \n setTimeout(() => {\n button.textContent = originalText;\n button.classList.remove('copied');\n }, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n alert('Failed to copy content to clipboard');\n }\n }\n}\n\n// Create singleton instance\nconst fileViewer = new FileViewer();\n\n// Create global function for easy access\n// Only set if not already defined by dashboard.js\nif (!window.showFileViewerModal) {\n window.showFileViewerModal = (filePath) => {\n console.log('[FileViewer] showFileViewerModal called with path:', filePath);\n fileViewer.show(filePath);\n };\n}\n\n// Expose the singleton for debugging\nwindow.fileViewerInstance = fileViewer;\n\n// Export for use in other modules\nif (typeof window !== 'undefined') {\n window.FileViewer = fileViewer;\n \n // Initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n fileViewer.initialize();\n });\n } else {\n // DOM is already loaded\n fileViewer.initialize();\n }\n}\n\nexport default fileViewer;"],"names":["fileViewer","constructor","this","modal","currentFile","initialized","contentCache","Map","initialize","createModal","setupEventHandlers","console","log","document","body","insertAdjacentHTML","getElementById","styles","head","addEventListener","hide","e","target","key","classList","contains","copyContent","show","filePath","add","textContent","loadFileContent","remove","codeContent","has","displayContent","get","window","socket","connected","error","Error","responsePromise","Promise","resolve","reject","timeoutId","setTimeout","once","data","clearTimeout","file_path","working_dir","workingDirectory","max_size","emit","success","content","set","updateFileInfo","stack","displayError","message","lines","split","length","size","Blob","formatFileSize","fileType","detectFileType","Prism","language","detectLanguage","className","highlightElement","errorMessage","errorHtml","innerHTML","type","bytes","i","Math","floor","round","pow","path","ext","pop","toLowerCase","py","js","ts","jsx","tsx","html","css","json","xml","yaml","yml","md","txt","sh","bash","sql","go","rs","java","cpp","c","cs","rb","php","button","navigator","clipboard","writeText","originalText","err","alert","showFileViewerModal","fileViewerInstance","FileViewer","readyState"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hud-library-loader.js","sources":["../../js/components/hud-library-loader.js"],"sourcesContent":["/**\n * HUD Library Loader\n * Handles lazy loading of Cytoscape.js and its dependencies with proper loading order\n */\n\nclass HUDLibraryLoader {\n constructor() {\n this.loadedLibraries = new Set();\n this.loadingPromises = new Map();\n this.loadingCallbacks = new Map();\n\n // Define library configurations with proper loading order\n this.libraries = [\n {\n name: 'cytoscape',\n url: 'https://unpkg.com/cytoscape@3.26.0/dist/cytoscape.min.js',\n globalCheck: () => typeof window.cytoscape !== 'undefined',\n dependencies: []\n },\n {\n name: 'dagre',\n url: 'https://unpkg.com/dagre@0.8.5/dist/dagre.min.js',\n globalCheck: () => typeof window.dagre !== 'undefined',\n dependencies: []\n },\n {\n name: 'cytoscape-dagre',\n url: 'https://unpkg.com/cytoscape-dagre@2.5.0/cytoscape-dagre.js',\n globalCheck: () => typeof window.cytoscapeDagre !== 'undefined',\n dependencies: ['cytoscape', 'dagre']\n }\n ];\n }\n\n /**\n * Load a single library via script tag\n * @param {Object} library - Library configuration object\n * @returns {Promise} - Promise that resolves when library is loaded\n */\n loadLibrary(library) {\n // Check if already loaded\n if (library.globalCheck()) {\n this.loadedLibraries.add(library.name);\n return Promise.resolve();\n }\n\n // Check if already loading\n if (this.loadingPromises.has(library.name)) {\n return this.loadingPromises.get(library.name);\n }\n\n console.log(`Loading library: ${library.name} from ${library.url}`);\n\n const promise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = library.url;\n script.async = true;\n\n script.onload = () => {\n if (library.globalCheck()) {\n console.log(`Successfully loaded library: ${library.name}`);\n this.loadedLibraries.add(library.name);\n this.loadingPromises.delete(library.name);\n resolve();\n } else {\n const error = new Error(`Library ${library.name} failed global check after loading`);\n console.error(error);\n this.loadingPromises.delete(library.name);\n reject(error);\n }\n };\n\n script.onerror = () => {\n const error = new Error(`Failed to load library: ${library.name} from ${library.url}`);\n console.error(error);\n this.loadingPromises.delete(library.name);\n reject(error);\n };\n\n document.head.appendChild(script);\n });\n\n this.loadingPromises.set(library.name, promise);\n return promise;\n }\n\n /**\n * Load dependencies for a library\n * @param {Array} dependencies - Array of dependency names\n * @returns {Promise} - Promise that resolves when all dependencies are loaded\n */\n async loadDependencies(dependencies) {\n const dependencyPromises = dependencies.map(depName => {\n const depLibrary = this.libraries.find(lib => lib.name === depName);\n if (!depLibrary) {\n throw new Error(`Dependency ${depName} not found in library configuration`);\n }\n return this.loadLibraryWithDependencies(depLibrary);\n });\n\n return Promise.all(dependencyPromises);\n }\n\n /**\n * Load a library and all its dependencies\n * @param {Object} library - Library configuration object\n * @returns {Promise} - Promise that resolves when library and dependencies are loaded\n */\n async loadLibraryWithDependencies(library) {\n // Load dependencies first\n if (library.dependencies.length > 0) {\n await this.loadDependencies(library.dependencies);\n }\n\n // Then load the library itself\n return this.loadLibrary(library);\n }\n\n /**\n * Load all HUD visualization libraries in correct order\n * @param {Function} onProgress - Optional progress callback\n * @returns {Promise} - Promise that resolves when all libraries are loaded\n */\n async loadHUDLibraries(onProgress = null) {\n console.log('Starting HUD libraries loading...');\n\n try {\n // Load libraries in dependency order\n for (let i = 0; i < this.libraries.length; i++) {\n const library = this.libraries[i];\n\n if (onProgress) {\n onProgress({\n library: library.name,\n current: i + 1,\n total: this.libraries.length,\n message: `Loading ${library.name}...`\n });\n }\n\n await this.loadLibraryWithDependencies(library);\n }\n\n // Verify all libraries are loaded\n const missingLibraries = this.libraries.filter(lib => !lib.globalCheck());\n if (missingLibraries.length > 0) {\n throw new Error(`Failed to load libraries: ${missingLibraries.map(lib => lib.name).join(', ')}`);\n }\n\n console.log('All HUD libraries loaded successfully');\n\n if (onProgress) {\n onProgress({\n library: 'complete',\n current: this.libraries.length,\n total: this.libraries.length,\n message: 'All libraries loaded successfully'\n });\n }\n\n return true;\n } catch (error) {\n console.error('Failed to load HUD libraries:', error);\n\n if (onProgress) {\n onProgress({\n library: 'error',\n current: 0,\n total: this.libraries.length,\n message: `Error: ${error.message}`,\n error: error\n });\n }\n\n throw error;\n }\n }\n\n /**\n * Check if all HUD libraries are loaded\n * @returns {boolean} - True if all libraries are loaded\n */\n areLibrariesLoaded() {\n return this.libraries.every(lib => lib.globalCheck());\n }\n\n /**\n * Get loading status for all libraries\n * @returns {Object} - Status object with library loading states\n */\n getLoadingStatus() {\n return {\n loaded: Array.from(this.loadedLibraries),\n loading: Array.from(this.loadingPromises.keys()),\n total: this.libraries.length,\n allLoaded: this.areLibrariesLoaded()\n };\n }\n\n /**\n * Reset loader state (for testing purposes)\n */\n reset() {\n this.loadedLibraries.clear();\n this.loadingPromises.clear();\n this.loadingCallbacks.clear();\n }\n}\n\n// Create singleton instance\nwindow.HUDLibraryLoader = new HUDLibraryLoader();\n"],"names":["window","HUDLibraryLoader","constructor","this","loadedLibraries","Set","loadingPromises","Map","loadingCallbacks","libraries","name","url","globalCheck","cytoscape","dependencies","dagre","cytoscapeDagre","loadLibrary","library","add","Promise","resolve","has","get","console","log","promise","reject","script","document","createElement","src","async","onload","delete","error","Error","onerror","head","appendChild","set","loadDependencies","dependencyPromises","map","depName","depLibrary","find","lib","loadLibraryWithDependencies","all","length","loadHUDLibraries","onProgress","i","current","total","message","missingLibraries","filter","join","areLibrariesLoaded","every","getLoadingStatus","loaded","Array","from","loading","keys","allLoaded","reset","clear"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hud-manager.js","sources":["../../js/components/hud-visualizer.js"],"sourcesContent":["/**\n * HUD Visualizer Component\n * Manages the Cytoscape.js tree visualization for the HUD mode with lazy loading\n */\n\nclass HUDVisualizer {\n constructor() {\n this.cy = null;\n this.container = null;\n this.nodes = new Map(); // Map of node IDs to node data\n this.isActive = false;\n this.librariesLoaded = false;\n this.loadingPromise = null;\n this.pendingEvents = []; // Store events received before libraries are loaded\n\n // Layout configuration\n this.layoutConfig = {\n name: 'dagre',\n rankDir: 'TB', // Top to bottom\n animate: true,\n animationDuration: 500,\n fit: true,\n padding: 30,\n rankSep: 100,\n nodeSep: 80\n };\n\n // Node type configurations\n this.nodeTypes = {\n PM: {\n color: '#48bb78',\n shape: 'rectangle',\n width: 120,\n height: 40,\n icon: '👤'\n },\n AGENT: {\n color: '#9f7aea',\n shape: 'ellipse',\n width: 100,\n height: 60,\n icon: '🤖'\n },\n TOOL: {\n color: '#4299e1',\n shape: 'diamond',\n width: 80,\n height: 50,\n icon: '🔧'\n },\n TODO: {\n color: '#e53e3e',\n shape: 'triangle',\n width: 70,\n height: 40,\n icon: '📝'\n }\n };\n }\n\n /**\n * Initialize the HUD visualizer (called at startup)\n */\n initialize() {\n this.container = document.getElementById('hud-cytoscape');\n if (!this.container) {\n console.error('HUD container not found');\n return false;\n }\n\n // Ensure container has proper attributes for interaction\n this.container.style.pointerEvents = 'auto';\n this.container.style.cursor = 'default';\n this.container.style.position = 'relative';\n this.container.style.zIndex = '1';\n\n // Setup basic event handlers (not library-dependent)\n this.setupBasicEventHandlers();\n\n console.log('HUD Visualizer initialized (libraries will load lazily)');\n return true;\n }\n\n /**\n * Load libraries and initialize Cytoscape when HUD is first activated\n * @returns {Promise} - Promise that resolves when libraries are loaded and Cytoscape is initialized\n */\n async loadLibrariesAndInitialize() {\n if (this.librariesLoaded && this.cy) {\n return Promise.resolve();\n }\n\n // If already loading, return the existing promise\n if (this.loadingPromise) {\n return this.loadingPromise;\n }\n\n this.loadingPromise = this._performLazyLoading();\n return this.loadingPromise;\n }\n\n /**\n * Perform the actual lazy loading process\n * @private\n */\n async _performLazyLoading() {\n try {\n console.log('[HUD-VISUALIZER-DEBUG] _performLazyLoading() called');\n console.log('[HUD-VISUALIZER-DEBUG] Loading HUD visualization libraries...');\n\n // Show loading indicator\n this.showLoadingIndicator();\n\n // Load libraries using the HUD library loader\n if (!window.HUDLibraryLoader) {\n throw new Error('HUD Library Loader not available');\n }\n\n console.log('[HUD-VISUALIZER-DEBUG] HUD Library Loader found, loading libraries...');\n await window.HUDLibraryLoader.loadHUDLibraries((progress) => {\n console.log('[HUD-VISUALIZER-DEBUG] Loading progress:', progress);\n this.updateLoadingProgress(progress);\n });\n\n // Verify libraries are available\n console.log('[HUD-VISUALIZER-DEBUG] Verifying libraries are loaded...');\n if (typeof window.cytoscape === 'undefined') {\n throw new Error('Cytoscape.js not loaded');\n }\n if (typeof window.dagre === 'undefined') {\n throw new Error('Dagre not loaded');\n }\n if (typeof window.cytoscapeDagre === 'undefined') {\n throw new Error('Cytoscape-dagre not loaded');\n }\n\n console.log('[HUD-VISUALIZER-DEBUG] All HUD libraries loaded successfully');\n this.librariesLoaded = true;\n\n // Initialize Cytoscape instance\n console.log('[HUD-VISUALIZER-DEBUG] Initializing Cytoscape...');\n this.initializeCytoscape();\n\n // Setup library-dependent event handlers\n console.log('[HUD-VISUALIZER-DEBUG] Setting up Cytoscape event handlers...');\n this.setupCytoscapeEventHandlers();\n\n // Process any pending events\n console.log('[HUD-VISUALIZER-DEBUG] Processing pending events...');\n this.processPendingEvents();\n\n // Hide loading indicator\n this.hideLoadingIndicator();\n\n console.log('[HUD-VISUALIZER-DEBUG] HUD Visualizer fully initialized with lazy loading');\n return true;\n\n } catch (error) {\n console.error('[HUD-VISUALIZER-DEBUG] Failed to load HUD libraries:', error);\n console.error('[HUD-VISUALIZER-DEBUG] Error stack:', error.stack);\n this.showLoadingError(error.message);\n this.librariesLoaded = false;\n this.loadingPromise = null;\n throw error;\n }\n }\n\n /**\n * Initialize Cytoscape.js instance (called after libraries are loaded)\n */\n initializeCytoscape() {\n if (!this.librariesLoaded || !window.cytoscape) {\n console.error('Cannot initialize Cytoscape: libraries not loaded');\n return;\n }\n\n // Register dagre extension for hierarchical layouts\n if (typeof window.cytoscape !== 'undefined' && typeof window.cytoscapeDagre !== 'undefined') {\n window.cytoscape.use(window.cytoscapeDagre);\n }\n\n this.cy = window.cytoscape({\n container: this.container,\n\n elements: [],\n\n // Enable user interaction\n userZoomingEnabled: true,\n userPanningEnabled: true,\n boxSelectionEnabled: false,\n autoungrabify: false,\n autounselectify: false,\n\n style: [\n // Node styles\n {\n selector: 'node',\n style: {\n 'background-color': 'data(color)',\n 'border-color': 'data(borderColor)',\n 'border-width': 2,\n 'color': '#ffffff',\n 'label': 'data(label)',\n 'text-valign': 'center',\n 'text-halign': 'center',\n 'font-size': '12px',\n 'font-weight': 'bold',\n 'width': 'data(width)',\n 'height': 'data(height)',\n 'shape': 'data(shape)',\n 'text-wrap': 'wrap',\n 'text-max-width': '100px'\n }\n },\n\n // Edge styles\n {\n selector: 'edge',\n style: {\n 'width': 2,\n 'line-color': '#718096',\n 'target-arrow-color': '#718096',\n 'target-arrow-shape': 'triangle',\n 'curve-style': 'bezier',\n 'arrow-scale': 1.2\n }\n },\n\n // Node type specific styles\n {\n selector: '.pm-node',\n style: {\n 'background-color': '#48bb78',\n 'border-color': '#38a169',\n 'shape': 'rectangle'\n }\n },\n\n {\n selector: '.agent-node',\n style: {\n 'background-color': '#9f7aea',\n 'border-color': '#805ad5',\n 'shape': 'ellipse'\n }\n },\n\n {\n selector: '.tool-node',\n style: {\n 'background-color': '#4299e1',\n 'border-color': '#3182ce',\n 'shape': 'diamond'\n }\n },\n\n {\n selector: '.todo-node',\n style: {\n 'background-color': '#e53e3e',\n 'border-color': '#c53030',\n 'shape': 'triangle'\n }\n },\n\n // Hover effects\n {\n selector: 'node:active',\n style: {\n 'overlay-opacity': 0.2,\n 'overlay-color': '#000000'\n }\n }\n ],\n\n layout: this.layoutConfig\n });\n\n // Setup resize handler\n this.setupResizeHandler();\n }\n\n /**\n * Setup basic event handlers (not dependent on libraries)\n */\n setupBasicEventHandlers() {\n // Reset layout button\n const resetBtn = document.getElementById('hud-reset-layout');\n if (resetBtn) {\n resetBtn.addEventListener('click', () => {\n this.resetLayout();\n });\n }\n\n // Center view button\n const centerBtn = document.getElementById('hud-center-view');\n if (centerBtn) {\n centerBtn.addEventListener('click', () => {\n this.centerView();\n });\n }\n }\n\n /**\n * Setup Cytoscape-dependent event handlers (called after libraries are loaded)\n */\n setupCytoscapeEventHandlers() {\n if (!this.cy) {\n console.warn('[HUD-VISUALIZER-DEBUG] Cannot setup Cytoscape event handlers: no cy instance');\n return;\n }\n\n console.log('[HUD-VISUALIZER-DEBUG] Setting up Cytoscape event handlers...');\n\n // Node click events\n this.cy.on('tap', 'node', (evt) => {\n const node = evt.target;\n const data = node.data();\n console.log('[HUD-VISUALIZER-DEBUG] Node clicked:', data);\n\n // Highlight connected nodes\n this.highlightConnectedNodes(node);\n });\n\n // Background click events\n this.cy.on('tap', (evt) => {\n if (evt.target === this.cy) {\n console.log('[HUD-VISUALIZER-DEBUG] Background clicked - resetting highlights');\n // Reset all node styles\n this.cy.nodes().style({\n 'opacity': 1\n });\n\n this.cy.edges().style({\n 'opacity': 1\n });\n }\n });\n\n // Mouse events for debugging\n this.cy.on('mouseover', 'node', (evt) => {\n const node = evt.target;\n node.style('opacity', 0.8);\n });\n\n this.cy.on('mouseout', 'node', (evt) => {\n const node = evt.target;\n node.style('opacity', 1);\n });\n\n console.log('[HUD-VISUALIZER-DEBUG] Cytoscape event handlers set up successfully');\n }\n\n /**\n * Setup resize handler for container\n */\n setupResizeHandler() {\n const resizeObserver = new ResizeObserver(() => {\n if (this.cy && this.isActive) {\n this.ensureContainerResize();\n }\n });\n\n if (this.container) {\n resizeObserver.observe(this.container);\n }\n }\n\n /**\n * Ensure container is properly resized and visible\n */\n ensureContainerResize() {\n if (!this.cy || !this.container) {\n console.log('[HUD-VISUALIZER-DEBUG] Cannot resize: missing cy or container');\n return;\n }\n\n // Ensure container can receive events\n this.ensureContainerInteractivity();\n\n // Log container dimensions\n const containerRect = this.container.getBoundingClientRect();\n console.log('[HUD-VISUALIZER-DEBUG] Container dimensions:', {\n width: containerRect.width,\n height: containerRect.height,\n offsetWidth: this.container.offsetWidth,\n offsetHeight: this.container.offsetHeight,\n isVisible: containerRect.width > 0 && containerRect.height > 0\n });\n\n // Only proceed if container is visible\n if (containerRect.width > 0 && containerRect.height > 0) {\n console.log('[HUD-VISUALIZER-DEBUG] Container is visible, resizing Cytoscape...');\n\n try {\n // Force Cytoscape to resize\n this.cy.resize();\n\n // Log Cytoscape elements\n const nodeCount = this.cy.nodes().length;\n const edgeCount = this.cy.edges().length;\n console.log('[HUD-VISUALIZER-DEBUG] Cytoscape elements after resize:', {\n nodes: nodeCount,\n edges: edgeCount\n });\n\n // If we have nodes, fit and run layout\n if (nodeCount > 0) {\n console.log('[HUD-VISUALIZER-DEBUG] Running fit and layout...');\n this.cy.fit();\n this.runLayout();\n } else {\n console.log('[HUD-VISUALIZER-DEBUG] No nodes to display');\n }\n\n } catch (error) {\n console.error('[HUD-VISUALIZER-DEBUG] Error during resize:', error);\n }\n } else {\n console.log('[HUD-VISUALIZER-DEBUG] Container not visible yet, skipping resize');\n }\n }\n\n /**\n * Ensure container can receive mouse and touch events\n */\n ensureContainerInteractivity() {\n if (!this.container) return;\n\n // Force container to be interactive\n this.container.style.pointerEvents = 'auto';\n this.container.style.cursor = 'default';\n this.container.style.userSelect = 'none';\n this.container.style.touchAction = 'manipulation';\n\n // Remove any overlapping elements that might block events\n const parent = this.container.parentElement;\n if (parent) {\n parent.style.pointerEvents = 'auto';\n parent.style.position = 'relative';\n }\n\n console.log('[HUD-VISUALIZER-DEBUG] Container interactivity ensured');\n }\n\n /**\n * Activate the HUD visualizer (triggers lazy loading if needed)\n */\n async activate() {\n console.log('[HUD-VISUALIZER-DEBUG] activate() called');\n this.isActive = true;\n\n try {\n console.log('[HUD-VISUALIZER-DEBUG] Loading libraries and initializing...');\n // Load libraries if not already loaded\n await this.loadLibrariesAndInitialize();\n\n console.log('[HUD-VISUALIZER-DEBUG] Libraries loaded, cy exists:', !!this.cy);\n\n // If Cytoscape was destroyed during clearing, recreate it\n if (!this.cy) {\n console.log('[HUD-VISUALIZER-DEBUG] Cytoscape instance missing, recreating...');\n this.initializeCytoscape();\n this.setupCytoscapeEventHandlers();\n }\n\n if (this.cy) {\n // Wait for container to be visible, then trigger resize and fit\n console.log('[HUD-VISUALIZER-DEBUG] Triggering resize and fit...');\n\n // Multiple resize attempts to ensure container visibility\n setTimeout(() => {\n console.log('[HUD-VISUALIZER-DEBUG] First resize attempt...');\n this.ensureContainerResize();\n }, 50);\n\n setTimeout(() => {\n console.log('[HUD-VISUALIZER-DEBUG] Second resize attempt...');\n this.ensureContainerResize();\n }, 200);\n\n setTimeout(() => {\n console.log('[HUD-VISUALIZER-DEBUG] Final resize attempt...');\n this.ensureContainerResize();\n }, 500);\n }\n console.log('[HUD-VISUALIZER-DEBUG] activate() completed successfully');\n } catch (error) {\n console.error('[HUD-VISUALIZER-DEBUG] Failed to activate HUD:', error);\n console.error('[HUD-VISUALIZER-DEBUG] Error stack:', error.stack);\n // Keep isActive true so user can retry\n throw error; // Re-throw so the promise rejects properly\n }\n }\n\n /**\n * Deactivate the HUD visualizer\n */\n deactivate() {\n this.isActive = false;\n }\n\n /**\n * Process pending events that were received before libraries loaded\n */\n processPendingEvents() {\n if (this.pendingEvents.length > 0) {\n console.log(`Processing ${this.pendingEvents.length} pending events`);\n\n for (const event of this.pendingEvents) {\n this._processEventInternal(event);\n }\n\n this.pendingEvents = [];\n }\n }\n\n /**\n * Process existing events from dashboard when HUD is activated\n * This builds the complete tree structure from historical events\n * @param {Array} events - Array of sorted historical events\n */\n processExistingEvents(events) {\n console.log(`[HUD-VISUALIZER-DEBUG] processExistingEvents called with ${events ? events.length : 0} events`);\n\n if (!events) {\n console.error('[HUD-VISUALIZER-DEBUG] No events provided to processExistingEvents');\n return;\n }\n\n if (!Array.isArray(events)) {\n console.error('[HUD-VISUALIZER-DEBUG] Events is not an array:', typeof events);\n return;\n }\n\n console.log(`[HUD-VISUALIZER-DEBUG] Libraries loaded: ${this.librariesLoaded}, Cytoscape available: ${!!this.cy}`);\n\n if (!this.librariesLoaded || !this.cy) {\n console.warn('[HUD-VISUALIZER-DEBUG] HUD libraries not loaded, cannot process existing events');\n console.log(`[HUD-VISUALIZER-DEBUG] Storing ${events.length} events as pending`);\n this.pendingEvents = [...events];\n return;\n }\n\n console.log(`[HUD-VISUALIZER-DEBUG] 🏗️ Building HUD tree structure from ${events.length} historical events`);\n\n // Log sample events to understand structure\n if (events.length > 0) {\n console.log('[HUD-VISUALIZER-DEBUG] Sample events:');\n events.slice(0, 3).forEach((event, i) => {\n console.log(`[HUD-VISUALIZER-DEBUG] Event ${i + 1}:`, {\n timestamp: event.timestamp,\n hook_event_name: event.hook_event_name,\n type: event.type,\n subtype: event.subtype,\n session_id: event.session_id,\n data_session_id: event.data?.session_id,\n data_keys: event.data ? Object.keys(event.data) : 'no data'\n });\n });\n }\n\n // Clear any existing visualization\n this.clear();\n\n // Group events by session to build proper hierarchies\n const sessionGroups = this.groupEventsBySession(events);\n\n // Process each session group to build trees\n Object.entries(sessionGroups).forEach(([sessionId, sessionEvents]) => {\n console.log(` 📂 Processing session ${sessionId}: ${sessionEvents.length} events`);\n this.buildSessionTree(sessionId, sessionEvents);\n });\n\n // Run final layout to organize the complete visualization\n this.runLayout();\n\n console.log(`✅ HUD tree structure built successfully`);\n }\n\n /**\n * Group events by session ID for hierarchical processing\n * @param {Array} events - Array of events\n * @returns {Object} Object with session IDs as keys and event arrays as values\n */\n groupEventsBySession(events) {\n const sessionGroups = {};\n\n events.forEach(event => {\n const sessionId = event.session_id || event.data?.session_id || 'unknown';\n if (!sessionGroups[sessionId]) {\n sessionGroups[sessionId] = [];\n }\n sessionGroups[sessionId].push(event);\n });\n\n return sessionGroups;\n }\n\n /**\n * Build a tree structure for a specific session\n * @param {string} sessionId - Session identifier\n * @param {Array} sessionEvents - Events for this session\n */\n buildSessionTree(sessionId, sessionEvents) {\n console.log(`[HUD-VISUALIZER-DEBUG] Building session tree for ${sessionId} with ${sessionEvents.length} events`);\n\n const sessionNodes = new Map(); // Track nodes created for this session\n let sessionRootNode = null;\n\n // Sort events chronologically within the session\n const sortedEvents = sessionEvents.sort((a, b) => {\n return new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime();\n });\n\n console.log(`[HUD-VISUALIZER-DEBUG] Sorted ${sortedEvents.length} events chronologically`);\n\n sortedEvents.forEach((event, index) => {\n const nodeData = this.createNodeFromEvent(event, sessionId);\n if (!nodeData) return;\n\n // Add the node to visualization\n this.addNode(nodeData.id, nodeData.type, nodeData.label, {\n sessionId: sessionId,\n timestamp: event.timestamp,\n eventData: event,\n isSessionRoot: nodeData.isSessionRoot\n });\n\n sessionNodes.set(nodeData.id, {\n ...nodeData,\n event: event,\n index: index\n });\n\n // Track session root node\n if (nodeData.isSessionRoot && !sessionRootNode) {\n sessionRootNode = nodeData.id;\n }\n\n // Create relationships based on event context\n this.createHierarchicalRelationships(nodeData.id, event, sessionNodes, sessionRootNode);\n });\n }\n\n /**\n * Create node data from an event\n * @param {Object} event - Event object\n * @param {string} sessionId - Session ID\n * @returns {Object|null} Node data or null if event should be skipped\n */\n createNodeFromEvent(event, sessionId) {\n const eventType = event.hook_event_name || event.type || '';\n const subtype = event.subtype || '';\n const timestamp = new Date(event.timestamp || Date.now());\n\n console.log(`[HUD-VISUALIZER-DEBUG] Creating node from event: ${eventType}/${subtype} for session ${sessionId}`);\n\n let nodeId, nodeType, label, isSessionRoot = false;\n\n // Generate a unique timestamp-based ID suffix\n const timestampId = timestamp.getTime();\n const randomSuffix = Math.random().toString(36).substring(2, 7);\n\n // Determine node type and create appropriate visualization\n if (eventType === 'session' && subtype === 'started') {\n // Session root node\n nodeType = 'PM';\n label = `Session ${sessionId.substring(0, 8)}...`;\n nodeId = `session-${sessionId.replace(/[^a-zA-Z0-9]/g, '')}`;\n isSessionRoot = true;\n\n } else if (eventType === 'hook' && subtype === 'user_prompt') {\n // User prompts are major workflow nodes\n nodeType = 'PM';\n const promptPreview = event.data?.prompt_preview || 'User Prompt';\n label = promptPreview.length > 20 ? promptPreview.substring(0, 20) + '...' : promptPreview;\n nodeId = `user-prompt-${timestampId}-${randomSuffix}`;\n\n } else if (eventType === 'hook' && subtype === 'claude_response') {\n // Claude responses\n nodeType = 'PM';\n label = 'Claude Response';\n nodeId = `claude-response-${timestampId}-${randomSuffix}`;\n\n } else if (eventType === 'hook' && subtype === 'pre_tool') {\n // Tool calls - pre hook\n nodeType = 'TOOL';\n const toolName = event.data?.tool_name || 'Unknown Tool';\n // Clean tool name for ID\n const cleanToolName = toolName.replace(/[^a-zA-Z0-9]/g, '');\n label = `${toolName}`;\n nodeId = `tool-${cleanToolName}-${timestampId}-${randomSuffix}`;\n\n } else if (eventType === 'agent' || event.data?.agent_type) {\n // Agent operations\n nodeType = 'AGENT';\n const agentName = event.data?.agent_type || event.data?.agent_name || 'Agent';\n // Clean agent name for ID\n const cleanAgentName = agentName.replace(/[^a-zA-Z0-9]/g, '');\n label = agentName;\n nodeId = `agent-${cleanAgentName}-${timestampId}-${randomSuffix}`;\n\n } else if (eventType === 'todo' || subtype.includes('todo')) {\n // Todo operations\n nodeType = 'TODO';\n label = 'Todo Update';\n nodeId = `todo-${timestampId}-${randomSuffix}`;\n\n } else if (eventType === 'hook' && subtype === 'notification') {\n // Skip notifications for cleaner visualization\n return null;\n\n } else if (eventType === 'log') {\n // Skip log events for cleaner visualization unless they're errors\n const level = event.data?.level || 'info';\n if (!['error', 'critical'].includes(level)) {\n return null;\n }\n nodeType = 'PM';\n label = `${level.toUpperCase()} Log`;\n nodeId = `log-${level}-${timestampId}-${randomSuffix}`;\n\n } else {\n // Generic event node\n nodeType = 'PM';\n const cleanEventType = eventType.replace(/[^a-zA-Z0-9]/g, '') || 'Event';\n label = eventType || 'Event';\n nodeId = `generic-${cleanEventType}-${timestampId}-${randomSuffix}`;\n }\n\n return {\n id: nodeId,\n type: nodeType,\n label: label,\n isSessionRoot: isSessionRoot\n };\n }\n\n /**\n * Create hierarchical relationships between nodes based on event context\n * @param {string} nodeId - Current node ID\n * @param {Object} event - Current event\n * @param {Map} sessionNodes - Map of all nodes in this session\n * @param {string} sessionRootNode - Root node ID for this session\n */\n createHierarchicalRelationships(nodeId, event, sessionNodes, sessionRootNode) {\n const eventType = event.hook_event_name || event.type || '';\n const subtype = event.subtype || '';\n\n // Find appropriate parent node based on event context\n let parentNodeId = null;\n\n if (eventType === 'session' && subtype === 'started') {\n // Session start nodes have no parent\n return;\n\n } else if (eventType === 'hook' && subtype === 'pre_tool') {\n // Tool calls should connect to the most recent user prompt or agent\n parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt', 'agent'], nodeId);\n\n } else if (eventType === 'hook' && subtype === 'claude_response') {\n // Claude responses should connect to user prompts\n parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt'], nodeId);\n\n } else if (eventType === 'agent') {\n // Agents should connect to user prompts or other agents (delegation)\n parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt', 'agent'], nodeId);\n\n } else if (eventType === 'todo') {\n // Todos should connect to agents or user prompts\n parentNodeId = this.findRecentParentNode(sessionNodes, ['agent', 'user-prompt'], nodeId);\n\n } else {\n // Default: connect to most recent significant node\n parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt', 'agent', 'session'], nodeId);\n }\n\n // If no specific parent found, connect to session root\n if (!parentNodeId && sessionRootNode && nodeId !== sessionRootNode) {\n parentNodeId = sessionRootNode;\n }\n\n // Create the edge if parent exists\n if (parentNodeId && parentNodeId !== nodeId) {\n this.addEdge(parentNodeId, nodeId);\n }\n }\n\n /**\n * Find the most recent parent node of specified types\n * @param {Map} sessionNodes - Map of session nodes\n * @param {Array} nodeTypes - Array of node type prefixes to search for\n * @param {string} currentNodeId - Current node ID to exclude from search\n * @returns {string|null} Parent node ID or null\n */\n findRecentParentNode(sessionNodes, nodeTypes, currentNodeId) {\n const nodeEntries = Array.from(sessionNodes.entries()).reverse(); // Most recent first\n\n for (const [nodeId, nodeData] of nodeEntries) {\n if (nodeId === currentNodeId) continue; // Skip current node\n\n // Check if this node matches any of the desired parent types\n for (const typePrefix of nodeTypes) {\n if (nodeId.startsWith(typePrefix)) {\n return nodeId;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Process a socket event and add appropriate nodes/edges\n * @param {Object} event - Socket event data\n */\n processEvent(event) {\n if (!this.isActive) return;\n\n // If libraries aren't loaded yet, store the event for later processing\n if (!this.librariesLoaded || !this.cy) {\n this.pendingEvents.push(event);\n return;\n }\n\n this._processEventInternal(event);\n }\n\n /**\n * Internal event processing (assumes libraries are loaded)\n * @private\n */\n _processEventInternal(event) {\n const eventType = event.hook_event_name || event.type || '';\n const sessionId = event.session_id || 'unknown';\n const timestamp = new Date(event.timestamp || Date.now());\n\n // Create a unique node ID based on event type and data\n let nodeId = `${eventType}-${timestamp.getTime()}`;\n let nodeType = 'PM';\n let label = eventType;\n\n // Determine node type based on event\n if (eventType.includes('tool_call')) {\n nodeType = 'TOOL';\n const toolName = event.data?.tool_name || 'Unknown Tool';\n label = toolName;\n nodeId = `tool-${toolName}-${timestamp.getTime()}`;\n } else if (eventType.includes('agent')) {\n nodeType = 'AGENT';\n const agentName = event.data?.agent_name || 'Agent';\n label = agentName;\n nodeId = `agent-${agentName}-${timestamp.getTime()}`;\n } else if (eventType.includes('todo')) {\n nodeType = 'TODO';\n label = 'Todo List';\n nodeId = `todo-${timestamp.getTime()}`;\n } else if (eventType.includes('user_prompt') || eventType.includes('claude_response')) {\n nodeType = 'PM';\n label = eventType.includes('user_prompt') ? 'User Prompt' : 'Claude Response';\n nodeId = `pm-${label.replace(' ', '')}-${timestamp.getTime()}`;\n }\n\n // Add the node\n this.addNode(nodeId, nodeType, label, {\n sessionId: sessionId,\n timestamp: timestamp.toISOString(),\n eventData: event\n });\n\n // Add edges based on relationships\n this.createEventRelationships(nodeId, event);\n }\n\n /**\n * Add a node to the visualization\n * @param {string} id - Unique node identifier\n * @param {string} type - Node type (PM, AGENT, TOOL, TODO)\n * @param {string} label - Node label\n * @param {Object} data - Additional node data\n */\n addNode(id, type, label, data = {}) {\n console.log(`[HUD-VISUALIZER-DEBUG] Adding node: ${id} (${type}) - ${label}`);\n\n if (this.nodes.has(id)) {\n console.log(`[HUD-VISUALIZER-DEBUG] Node ${id} already exists, skipping`);\n return; // Node already exists\n }\n\n const nodeType = this.nodeTypes[type] || this.nodeTypes.PM;\n const nodeData = {\n id: id,\n label: `${nodeType.icon} ${label}`,\n type: type,\n color: nodeType.color,\n borderColor: this.darkenColor(nodeType.color, 20),\n shape: nodeType.shape,\n width: nodeType.width,\n height: nodeType.height,\n ...data\n };\n\n this.nodes.set(id, nodeData);\n\n if (this.cy) {\n const element = {\n group: 'nodes',\n data: nodeData,\n classes: `${type.toLowerCase()}-node`\n };\n\n console.log(`[HUD-VISUALIZER-DEBUG] Adding node element to Cytoscape:`, element);\n this.cy.add(element);\n console.log(`[HUD-VISUALIZER-DEBUG] Node added successfully. Total nodes in cy: ${this.cy.nodes().length}`);\n this.runLayout();\n }\n }\n\n /**\n * Add an edge between two nodes\n * @param {string} sourceId - Source node ID\n * @param {string} targetId - Target node ID\n * @param {string} edgeId - Unique edge identifier\n * @param {Object} data - Additional edge data\n */\n addEdge(sourceId, targetId, edgeId = null, data = {}) {\n if (!sourceId || !targetId) {\n console.warn(`[HUD-VISUALIZER-DEBUG] Cannot create edge: missing source (${sourceId}) or target (${targetId})`);\n return;\n }\n\n if (sourceId === targetId) {\n console.warn(`[HUD-VISUALIZER-DEBUG] Cannot create self-loop edge from ${sourceId} to itself`);\n return;\n }\n\n if (!edgeId) {\n edgeId = `edge-${sourceId}-to-${targetId}`;\n }\n\n if (this.cy) {\n // Check if edge already exists\n const existingEdge = this.cy.getElementById(edgeId);\n if (existingEdge.length > 0) {\n console.log(`[HUD-VISUALIZER-DEBUG] Edge ${edgeId} already exists, skipping`);\n return;\n }\n\n // Check if nodes exist\n const sourceNode = this.cy.getElementById(sourceId);\n const targetNode = this.cy.getElementById(targetId);\n\n if (sourceNode.length === 0) {\n console.warn(`[HUD-VISUALIZER-DEBUG] Source node ${sourceId} does not exist, cannot create edge`);\n return;\n }\n\n if (targetNode.length === 0) {\n console.warn(`[HUD-VISUALIZER-DEBUG] Target node ${targetId} does not exist, cannot create edge`);\n return;\n }\n\n const element = {\n group: 'edges',\n data: {\n id: edgeId,\n source: sourceId,\n target: targetId,\n ...data\n }\n };\n\n console.log(`[HUD-VISUALIZER-DEBUG] Adding edge element to Cytoscape:`, element);\n\n try {\n this.cy.add(element);\n console.log(`[HUD-VISUALIZER-DEBUG] Edge added successfully. Total edges in cy: ${this.cy.edges().length}`);\n this.runLayout();\n } catch (error) {\n console.error(`[HUD-VISUALIZER-DEBUG] Failed to add edge ${edgeId}:`, error);\n console.error(`[HUD-VISUALIZER-DEBUG] Element details:`, element);\n }\n }\n }\n\n /**\n * Create relationships between events\n * @param {string} nodeId - Current node ID\n * @param {Object} event - Event data\n */\n createEventRelationships(nodeId, event) {\n const eventType = event.hook_event_name || event.type || '';\n const sessionId = event.session_id || 'unknown';\n\n // Find parent nodes based on event relationships\n const allNodeEntries = Array.from(this.nodes.entries());\n\n // Tool call relationships\n if (eventType.includes('tool_call') && event.data?.tool_name) {\n // Connect tool calls to their invoking agent/PM nodes\n const parentNode = this.findParentNode(sessionId, ['PM', 'AGENT']);\n if (parentNode) {\n this.addEdge(parentNode, nodeId);\n return;\n }\n }\n\n // Agent delegation relationships\n if (eventType.includes('agent') || event.data?.agent_name) {\n // Connect agents to PM nodes\n const pmNode = this.findParentNode(sessionId, ['PM']);\n if (pmNode) {\n this.addEdge(pmNode, nodeId);\n return;\n }\n }\n\n // Todo relationships - connect to agent or PM nodes\n if (eventType.includes('todo')) {\n const parentNode = this.findParentNode(sessionId, ['AGENT', 'PM']);\n if (parentNode) {\n this.addEdge(parentNode, nodeId);\n return;\n }\n }\n\n // Default sequential relationship\n const allNodes = Array.from(this.nodes.keys());\n const currentIndex = allNodes.indexOf(nodeId);\n\n if (currentIndex > 0) {\n const previousNodeId = allNodes[currentIndex - 1];\n this.addEdge(previousNodeId, nodeId);\n }\n }\n\n /**\n * Find a parent node of specific types for the same session\n * @param {string} sessionId - Session ID\n * @param {Array} nodeTypes - Array of node types to search for\n * @returns {string|null} - Parent node ID or null\n */\n findParentNode(sessionId, nodeTypes) {\n const nodeEntries = Array.from(this.nodes.entries()).reverse(); // Start from most recent\n\n for (const [nodeId, nodeData] of nodeEntries) {\n if (nodeData.sessionId === sessionId && nodeTypes.includes(nodeData.type)) {\n return nodeId;\n }\n }\n\n return null;\n }\n\n /**\n * Highlight connected nodes\n * @param {Object} node - Cytoscape node object\n */\n highlightConnectedNodes(node) {\n if (!this.cy) return;\n\n // Reset all node styles\n this.cy.nodes().style({\n 'opacity': 0.3\n });\n\n this.cy.edges().style({\n 'opacity': 0.2\n });\n\n // Highlight selected node and its neighborhood\n const neighborhood = node.neighborhood();\n node.style('opacity', 1);\n neighborhood.style('opacity', 1);\n }\n\n /**\n * Reset layout\n */\n resetLayout() {\n if (this.cy) {\n this.cy.layout(this.layoutConfig).run();\n }\n }\n\n /**\n * Center view\n */\n centerView() {\n if (this.cy) {\n this.cy.fit();\n this.cy.center();\n }\n }\n\n /**\n * Run layout animation\n */\n runLayout() {\n console.log(`[HUD-VISUALIZER-DEBUG] runLayout called - isActive: ${this.isActive}, cy exists: ${!!this.cy}`);\n if (this.cy && this.isActive) {\n const nodeCount = this.cy.nodes().length;\n const edgeCount = this.cy.edges().length;\n console.log(`[HUD-VISUALIZER-DEBUG] Running layout with ${nodeCount} nodes and ${edgeCount} edges`);\n\n // Check container dimensions before layout\n if (this.container) {\n const rect = this.container.getBoundingClientRect();\n console.log(`[HUD-VISUALIZER-DEBUG] Container dimensions before layout:`, {\n width: rect.width,\n height: rect.height,\n offsetWidth: this.container.offsetWidth,\n offsetHeight: this.container.offsetHeight\n });\n }\n\n const layout = this.cy.layout(this.layoutConfig);\n\n // Listen for layout completion\n layout.on('layoutstop', () => {\n console.log(`[HUD-VISUALIZER-DEBUG] Layout completed. Final node positions:`);\n this.cy.nodes().forEach((node, index) => {\n const position = node.position();\n const data = node.data();\n console.log(`[HUD-VISUALIZER-DEBUG] Node ${index + 1}: ${data.label} at (${position.x.toFixed(1)}, ${position.y.toFixed(1)})`);\n });\n });\n\n layout.run();\n } else {\n console.log(`[HUD-VISUALIZER-DEBUG] Skipping layout - not active or no Cytoscape instance`);\n }\n }\n\n /**\n * Clear all nodes and edges\n */\n clear() {\n console.log(`[HUD-VISUALIZER-DEBUG] Clearing HUD: ${this.nodes.size} nodes, ${this.pendingEvents.length} pending events`);\n this.nodes.clear();\n this.pendingEvents = [];\n if (this.cy) {\n const elementCount = this.cy.elements().length;\n try {\n this.cy.elements().remove();\n console.log(`[HUD-VISUALIZER-DEBUG] Removed ${elementCount} Cytoscape elements`);\n } catch (error) {\n console.error(`[HUD-VISUALIZER-DEBUG] Error clearing Cytoscape elements:`, error);\n // Try to destroy and recreate if clearing fails\n try {\n this.cy.destroy();\n this.cy = null;\n console.log(`[HUD-VISUALIZER-DEBUG] Destroyed Cytoscape instance due to clear error`);\n } catch (destroyError) {\n console.error(`[HUD-VISUALIZER-DEBUG] Error destroying Cytoscape:`, destroyError);\n }\n }\n }\n }\n\n /**\n * Show loading indicator\n */\n showLoadingIndicator() {\n if (this.container) {\n this.container.innerHTML = `\n <div class=\"hud-loading-container\">\n <div class=\"hud-loading-spinner\"></div>\n <div class=\"hud-loading-text\">Loading HUD visualization libraries...</div>\n <div class=\"hud-loading-progress\" id=\"hud-loading-progress\"></div>\n </div>\n `;\n }\n }\n\n /**\n * Update loading progress\n */\n updateLoadingProgress(progress) {\n const progressElement = document.getElementById('hud-loading-progress');\n if (progressElement) {\n if (progress.error) {\n progressElement.innerHTML = `<span class=\"hud-error\">❌ ${progress.message}</span>`;\n } else {\n progressElement.innerHTML = `\n <div class=\"hud-progress-bar\">\n <div class=\"hud-progress-fill\" style=\"width: ${(progress.current / progress.total) * 100}%\"></div>\n </div>\n <div class=\"hud-progress-text\">${progress.message} (${progress.current}/${progress.total})</div>\n `;\n }\n }\n }\n\n /**\n * Hide loading indicator\n */\n hideLoadingIndicator() {\n if (this.container) {\n this.container.innerHTML = '';\n }\n }\n\n /**\n * Show loading error\n */\n showLoadingError(message) {\n if (this.container) {\n this.container.innerHTML = `\n <div class=\"hud-error-container\">\n <div class=\"hud-error-icon\">⚠️</div>\n <div class=\"hud-error-text\">Failed to load HUD libraries</div>\n <div class=\"hud-error-message\">${message}</div>\n <button class=\"hud-retry-button\" onclick=\"window.hudVisualizer && window.hudVisualizer.retryLoading()\">\n Retry Loading\n </button>\n </div>\n `;\n }\n }\n\n /**\n * Retry loading libraries (called from error UI)\n */\n retryLoading() {\n this.librariesLoaded = false;\n this.loadingPromise = null;\n this.activate();\n }\n\n /**\n * Debug method to manually test HUD visualizer\n * Can be called from browser console: window.hudVisualizer.debugTest()\n */\n debugTest() {\n console.log('[HUD-VISUALIZER-DEBUG] debugTest() called manually');\n console.log('[HUD-VISUALIZER-DEBUG] Current state:', {\n isActive: this.isActive,\n librariesLoaded: this.librariesLoaded,\n hasCy: !!this.cy,\n hasContainer: !!this.container,\n nodeCount: this.nodes.size,\n pendingEventCount: this.pendingEvents.length,\n hasHUDLibraryLoader: !!window.HUDLibraryLoader\n });\n\n // Test container\n if (this.container) {\n console.log('[HUD-VISUALIZER-DEBUG] Container info:', {\n id: this.container.id,\n className: this.container.className,\n offsetWidth: this.container.offsetWidth,\n offsetHeight: this.container.offsetHeight,\n innerHTML: this.container.innerHTML ? 'has content' : 'empty'\n });\n }\n\n // Test library availability\n console.log('[HUD-VISUALIZER-DEBUG] Library availability:', {\n cytoscape: typeof window.cytoscape,\n dagre: typeof window.dagre,\n cytoscapeDagre: typeof window.cytoscapeDagre,\n HUDLibraryLoader: typeof window.HUDLibraryLoader\n });\n\n return {\n isActive: this.isActive,\n librariesLoaded: this.librariesLoaded,\n hasCy: !!this.cy,\n containerFound: !!this.container\n };\n }\n\n /**\n * Comprehensive debug method to identify blank screen issues\n * Can be called from browser console: window.hudVisualizer.debugBlankScreen()\n */\n debugBlankScreen() {\n console.log('[HUD-BLANK-SCREEN-DEBUG] =================================');\n console.log('[HUD-BLANK-SCREEN-DEBUG] COMPREHENSIVE BLANK SCREEN DEBUG');\n console.log('[HUD-BLANK-SCREEN-DEBUG] =================================');\n\n // 1. Check basic state\n const basicState = {\n isActive: this.isActive,\n librariesLoaded: this.librariesLoaded,\n hasCy: !!this.cy,\n hasContainer: !!this.container,\n nodeCount: this.nodes.size,\n cytoscapeElementCount: this.cy ? this.cy.elements().length : 0\n };\n console.log('[HUD-BLANK-SCREEN-DEBUG] 1. Basic State:', basicState);\n\n // 2. Check container visibility and dimensions\n if (this.container) {\n const containerInfo = this.getContainerDebugInfo();\n console.log('[HUD-BLANK-SCREEN-DEBUG] 2. Container Info:', containerInfo);\n\n // Add background color to verify container is visible\n this.debugAddContainerBackground();\n } else {\n console.error('[HUD-BLANK-SCREEN-DEBUG] 2. Container not found!');\n return false;\n }\n\n // 3. Check Cytoscape state\n if (this.cy) {\n const cytoscapeInfo = this.getCytoscapeDebugInfo();\n console.log('[HUD-BLANK-SCREEN-DEBUG] 3. Cytoscape Info:', cytoscapeInfo);\n } else {\n console.error('[HUD-BLANK-SCREEN-DEBUG] 3. Cytoscape instance not found!');\n return false;\n }\n\n // 4. Check node positions\n this.debugNodePositions();\n\n // 5. Try manual rendering triggers\n this.debugManualRenderingTriggers();\n\n // 6. Add test nodes if none exist\n if (this.cy && this.cy.nodes().length === 0) {\n console.log('[HUD-BLANK-SCREEN-DEBUG] 6. No nodes found, adding test nodes...');\n this.debugAddTestNodes();\n }\n\n // 7. Force zoom fit\n this.debugForceZoomFit();\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] Debug complete. Check visual results.');\n return true;\n }\n\n /**\n * Get comprehensive container debug information\n */\n getContainerDebugInfo() {\n const rect = this.container.getBoundingClientRect();\n const computed = window.getComputedStyle(this.container);\n\n return {\n id: this.container.id,\n className: this.container.className,\n // Dimensions\n offsetWidth: this.container.offsetWidth,\n offsetHeight: this.container.offsetHeight,\n clientWidth: this.container.clientWidth,\n clientHeight: this.container.clientHeight,\n scrollWidth: this.container.scrollWidth,\n scrollHeight: this.container.scrollHeight,\n // Bounding rect\n boundingRect: {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n bottom: rect.bottom,\n right: rect.right\n },\n // Computed styles that affect visibility\n computedStyles: {\n display: computed.display,\n visibility: computed.visibility,\n opacity: computed.opacity,\n position: computed.position,\n overflow: computed.overflow,\n zIndex: computed.zIndex,\n backgroundColor: computed.backgroundColor,\n transform: computed.transform\n },\n // Check if visible\n isVisible: rect.width > 0 && rect.height > 0 && computed.display !== 'none' && computed.visibility !== 'hidden',\n // Parent info\n parentElement: this.container.parentElement ? {\n tagName: this.container.parentElement.tagName,\n className: this.container.parentElement.className,\n offsetWidth: this.container.parentElement.offsetWidth,\n offsetHeight: this.container.parentElement.offsetHeight\n } : null\n };\n }\n\n /**\n * Get comprehensive Cytoscape debug information\n */\n getCytoscapeDebugInfo() {\n const extent = this.cy.extent();\n const zoom = this.cy.zoom();\n const pan = this.cy.pan();\n const viewport = this.cy.viewport();\n\n return {\n // Elements\n nodeCount: this.cy.nodes().length,\n edgeCount: this.cy.edges().length,\n elementCount: this.cy.elements().length,\n // Viewport\n zoom: zoom,\n pan: pan,\n extent: extent,\n viewport: viewport,\n // Container\n containerWidth: this.cy.width(),\n containerHeight: this.cy.height(),\n // Check if initialized\n isInitialized: this.cy.scratch('_cytoscape-initialized') !== undefined,\n // Renderer info\n renderer: this.cy.renderer() ? {\n name: this.cy.renderer().name,\n options: this.cy.renderer().options\n } : null\n };\n }\n\n /**\n * Debug node positions to check if they're outside viewport\n */\n debugNodePositions() {\n if (!this.cy || this.cy.nodes().length === 0) {\n console.log('[HUD-BLANK-SCREEN-DEBUG] 4. No nodes to check positions');\n return;\n }\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] 4. Node Positions:');\n const nodes = this.cy.nodes();\n const extent = this.cy.extent();\n const viewport = this.cy.viewport();\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] Viewport extent:', extent);\n console.log('[HUD-BLANK-SCREEN-DEBUG] Current viewport:', viewport);\n\n nodes.forEach((node, index) => {\n const position = node.position();\n const data = node.data();\n const boundingBox = node.boundingBox();\n\n console.log(`[HUD-BLANK-SCREEN-DEBUG] Node ${index + 1}:`, {\n id: data.id,\n label: data.label,\n position: position,\n boundingBox: boundingBox,\n isVisible: node.visible(),\n opacity: node.style('opacity'),\n width: node.style('width'),\n height: node.style('height')\n });\n });\n }\n\n /**\n * Add background color to container to verify it's visible\n */\n debugAddContainerBackground() {\n if (this.container) {\n this.container.style.backgroundColor = '#ff000020'; // Light red background\n this.container.style.border = '2px solid #ff0000'; // Red border\n this.container.style.minHeight = '400px'; // Ensure minimum height\n console.log('[HUD-BLANK-SCREEN-DEBUG] Added red background and border to container for visibility test');\n }\n }\n\n /**\n * Manual rendering triggers to force Cytoscape to render\n */\n debugManualRenderingTriggers() {\n if (!this.cy) {\n console.log('[HUD-BLANK-SCREEN-DEBUG] 5. No Cytoscape instance for manual rendering');\n return;\n }\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] 5. Triggering manual rendering operations...');\n\n try {\n // Force resize\n console.log('[HUD-BLANK-SCREEN-DEBUG] - Forcing resize...');\n this.cy.resize();\n\n // Force redraw\n console.log('[HUD-BLANK-SCREEN-DEBUG] - Forcing redraw...');\n this.cy.forceRender();\n\n // Force layout\n if (this.cy.nodes().length > 0) {\n console.log('[HUD-BLANK-SCREEN-DEBUG] - Running layout...');\n this.cy.layout(this.layoutConfig).run();\n }\n\n // Force viewport update\n console.log('[HUD-BLANK-SCREEN-DEBUG] - Updating viewport...');\n this.cy.viewport({\n zoom: this.cy.zoom(),\n pan: this.cy.pan()\n });\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] Manual rendering triggers completed');\n } catch (error) {\n console.error('[HUD-BLANK-SCREEN-DEBUG] Error during manual rendering:', error);\n }\n }\n\n /**\n * Add test nodes to verify Cytoscape is working\n */\n debugAddTestNodes() {\n if (!this.cy) return;\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] Adding test nodes...');\n\n try {\n // Clear existing elements\n this.cy.elements().remove();\n\n // Add test nodes\n const testNodes = [\n {\n group: 'nodes',\n data: {\n id: 'test-node-1',\n label: '🤖 Test Node 1',\n color: '#48bb78',\n borderColor: '#38a169',\n shape: 'rectangle',\n width: 120,\n height: 40\n },\n classes: 'pm-node'\n },\n {\n group: 'nodes',\n data: {\n id: 'test-node-2',\n label: '🔧 Test Node 2',\n color: '#4299e1',\n borderColor: '#3182ce',\n shape: 'diamond',\n width: 80,\n height: 50\n },\n classes: 'tool-node'\n },\n {\n group: 'nodes',\n data: {\n id: 'test-node-3',\n label: '📝 Test Node 3',\n color: '#e53e3e',\n borderColor: '#c53030',\n shape: 'triangle',\n width: 70,\n height: 40\n },\n classes: 'todo-node'\n }\n ];\n\n // Add test edges\n const testEdges = [\n {\n group: 'edges',\n data: {\n id: 'test-edge-1',\n source: 'test-node-1',\n target: 'test-node-2'\n }\n },\n {\n group: 'edges',\n data: {\n id: 'test-edge-2',\n source: 'test-node-2',\n target: 'test-node-3'\n }\n }\n ];\n\n // Add elements to Cytoscape\n this.cy.add(testNodes);\n this.cy.add(testEdges);\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] Added 3 test nodes and 2 test edges');\n\n // Update our internal nodes map\n testNodes.forEach(nodeElement => {\n this.nodes.set(nodeElement.data.id, nodeElement.data);\n });\n\n // Run layout\n this.runLayout();\n\n } catch (error) {\n console.error('[HUD-BLANK-SCREEN-DEBUG] Error adding test nodes:', error);\n }\n }\n\n /**\n * Force zoom fit after layout with multiple attempts\n */\n debugForceZoomFit() {\n if (!this.cy) return;\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] 7. Forcing zoom fit...');\n\n const attemptZoomFit = (attemptNumber) => {\n try {\n console.log(`[HUD-BLANK-SCREEN-DEBUG] Zoom fit attempt ${attemptNumber}...`);\n\n // Get current state before fit\n const beforeZoom = this.cy.zoom();\n const beforePan = this.cy.pan();\n const elements = this.cy.elements();\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] Before fit:', {\n zoom: beforeZoom,\n pan: beforePan,\n elementCount: elements.length\n });\n\n if (elements.length > 0) {\n // Try fit with specific options\n this.cy.fit(elements, 50); // 50px padding\n\n // Get state after fit\n const afterZoom = this.cy.zoom();\n const afterPan = this.cy.pan();\n\n console.log('[HUD-BLANK-SCREEN-DEBUG] After fit:', {\n zoom: afterZoom,\n pan: afterPan,\n changed: beforeZoom !== afterZoom || beforePan.x !== afterPan.x || beforePan.y !== afterPan.y\n });\n\n // Force center\n this.cy.center(elements);\n\n } else {\n console.log('[HUD-BLANK-SCREEN-DEBUG] No elements to fit');\n }\n\n } catch (error) {\n console.error(`[HUD-BLANK-SCREEN-DEBUG] Zoom fit attempt ${attemptNumber} failed:`, error);\n }\n };\n\n // Multiple attempts with delays\n attemptZoomFit(1);\n setTimeout(() => attemptZoomFit(2), 100);\n setTimeout(() => attemptZoomFit(3), 500);\n setTimeout(() => attemptZoomFit(4), 1000);\n }\n\n /**\n * Quick test to draw a simple shape to verify Cytoscape canvas is working\n */\n debugDrawSimpleShape() {\n if (!this.cy) {\n console.log('[HUD-CANVAS-TEST] No Cytoscape instance');\n return false;\n }\n\n console.log('[HUD-CANVAS-TEST] Testing Cytoscape canvas rendering...');\n\n try {\n // Clear everything\n this.cy.elements().remove();\n\n // Add a single, simple node at center\n this.cy.add({\n group: 'nodes',\n data: {\n id: 'canvas-test',\n label: '✅ CANVAS TEST',\n color: '#ff0000',\n borderColor: '#000000',\n width: 200,\n height: 100,\n shape: 'rectangle'\n },\n position: { x: 200, y: 200 } // Fixed position\n });\n\n // Force immediate render\n this.cy.forceRender();\n\n // Zoom to fit this single node\n this.cy.fit(this.cy.$('#canvas-test'), 50);\n\n console.log('[HUD-CANVAS-TEST] Canvas test node added and positioned');\n console.log('[HUD-CANVAS-TEST] If you see a red rectangle with \"CANVAS TEST\", rendering works!');\n\n return true;\n\n } catch (error) {\n console.error('[HUD-CANVAS-TEST] Canvas test failed:', error);\n return false;\n }\n }\n\n /**\n * Utility function to darken a color\n * @param {string} color - Hex color\n * @param {number} percent - Percentage to darken\n * @returns {string} - Darkened hex color\n */\n darkenColor(color, percent) {\n const num = parseInt(color.replace(\"#\", \"\"), 16);\n const amt = Math.round(2.55 * percent);\n const R = (num >> 16) - amt;\n const G = (num >> 8 & 0x00FF) - amt;\n const B = (num & 0x0000FF) - amt;\n return \"#\" + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +\n (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +\n (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);\n }\n}\n\n// Export for use in dashboard\nwindow.HUDVisualizer = HUDVisualizer;\n"],"names":["window","HUDVisualizer","constructor","this","cy","container","nodes","Map","isActive","librariesLoaded","loadingPromise","pendingEvents","layoutConfig","name","rankDir","animate","animationDuration","fit","padding","rankSep","nodeSep","nodeTypes","PM","color","shape","width","height","icon","AGENT","TOOL","TODO","initialize","document","getElementById","style","pointerEvents","cursor","position","zIndex","setupBasicEventHandlers","console","log","error","loadLibrariesAndInitialize","Promise","resolve","_performLazyLoading","showLoadingIndicator","HUDLibraryLoader","Error","loadHUDLibraries","progress","updateLoadingProgress","cytoscape","dagre","cytoscapeDagre","initializeCytoscape","setupCytoscapeEventHandlers","processPendingEvents","hideLoadingIndicator","stack","showLoadingError","message","use","elements","userZoomingEnabled","userPanningEnabled","boxSelectionEnabled","autoungrabify","autounselectify","selector","label","layout","setupResizeHandler","resetBtn","addEventListener","resetLayout","centerBtn","centerView","on","evt","node","target","data","highlightConnectedNodes","opacity","edges","warn","resizeObserver","ResizeObserver","ensureContainerResize","observe","ensureContainerInteractivity","containerRect","getBoundingClientRect","offsetWidth","offsetHeight","isVisible","resize","nodeCount","length","edgeCount","runLayout","userSelect","touchAction","parent","parentElement","activate","setTimeout","deactivate","event","_processEventInternal","processExistingEvents","events","Array","isArray","slice","forEach","i","timestamp","hook_event_name","type","subtype","session_id","data_session_id","data_keys","Object","keys","clear","sessionGroups","groupEventsBySession","entries","sessionId","sessionEvents","buildSessionTree","push","sessionNodes","sessionRootNode","sortedEvents","sort","a","b","Date","getTime","index","nodeData","createNodeFromEvent","addNode","id","eventData","isSessionRoot","set","createHierarchicalRelationships","eventType","now","nodeId","nodeType","timestampId","randomSuffix","Math","random","toString","substring","replace","promptPreview","prompt_preview","toolName","tool_name","cleanToolName","agent_type","agentName","agent_name","cleanAgentName","includes","level","toUpperCase","cleanEventType","parentNodeId","findRecentParentNode","addEdge","currentNodeId","nodeEntries","from","reverse","typePrefix","startsWith","processEvent","toISOString","createEventRelationships","has","borderColor","darkenColor","element","group","classes","toLowerCase","add","sourceId","targetId","edgeId","sourceNode","targetNode","source","parentNode","findParentNode","pmNode","allNodes","currentIndex","indexOf","previousNodeId","neighborhood","run","center","rect","x","toFixed","y","size","elementCount","remove","destroy","destroyError","innerHTML","progressElement","current","total","retryLoading","debugTest","hasCy","hasContainer","pendingEventCount","hasHUDLibraryLoader","className","containerFound","debugBlankScreen","basicState","cytoscapeElementCount","containerInfo","getContainerDebugInfo","debugAddContainerBackground","cytoscapeInfo","getCytoscapeDebugInfo","debugNodePositions","debugManualRenderingTriggers","debugAddTestNodes","debugForceZoomFit","computed","getComputedStyle","clientWidth","clientHeight","scrollWidth","scrollHeight","boundingRect","top","left","bottom","right","computedStyles","display","visibility","overflow","backgroundColor","transform","tagName","extent","zoom","pan","viewport","containerWidth","containerHeight","isInitialized","scratch","renderer","options","boundingBox","visible","border","minHeight","forceRender","testNodes","testEdges","nodeElement","attemptZoomFit","attemptNumber","beforeZoom","beforePan","afterZoom","afterPan","changed","debugDrawSimpleShape","$","percent","num","parseInt","amt","round","R","G","B"],"mappings":"AAqrDAA,OAAOC,cAhrDP,MACI,WAAAC,GACIC,KAAKC,GAAK,KACVD,KAAKE,UAAY,KACjBF,KAAKG,UAAYC,IACjBJ,KAAKK,UAAW,EAChBL,KAAKM,iBAAkB,EACvBN,KAAKO,eAAiB,KACtBP,KAAKQ,cAAgB,GAGrBR,KAAKS,aAAe,CAChBC,KAAM,QACNC,QAAS,KACTC,SAAS,EACTC,kBAAmB,IACnBC,KAAK,EACLC,QAAS,GACTC,QAAS,IACTC,QAAS,IAIbjB,KAAKkB,UAAY,CACbC,GAAI,CACAC,MAAO,UACPC,MAAO,YACPC,MAAO,IACPC,OAAQ,GACRC,KAAM,MAEVC,MAAO,CACHL,MAAO,UACPC,MAAO,UACPC,MAAO,IACPC,OAAQ,GACRC,KAAM,MAEVE,KAAM,CACFN,MAAO,UACPC,MAAO,UACPC,MAAO,GACPC,OAAQ,GACRC,KAAM,MAEVG,KAAM,CACFP,MAAO,UACPC,MAAO,WACPC,MAAO,GACPC,OAAQ,GACRC,KAAM,MAGlB,CAKA,UAAAI,GAEI,OADA5B,KAAKE,UAAY2B,SAASC,eAAe,iBACpC9B,KAAKE,WAMVF,KAAKE,UAAU6B,MAAMC,cAAgB,OACrChC,KAAKE,UAAU6B,MAAME,OAAS,UAC9BjC,KAAKE,UAAU6B,MAAMG,SAAW,WAChClC,KAAKE,UAAU6B,MAAMI,OAAS,IAG9BnC,KAAKoC,0BAELC,QAAQC,IAAI,4DACL,IAdHD,QAAQE,MAAM,4BACP,EAcf,CAMA,gCAAMC,GACF,OAAIxC,KAAKM,iBAAmBN,KAAKC,GACtBwC,QAAQC,WAIf1C,KAAKO,iBAITP,KAAKO,eAAiBP,KAAK2C,uBAHhB3C,KAAKO,eAKpB,CAMA,yBAAMoC,GACF,IAQI,GAPAN,QAAQC,IAAI,uDACZD,QAAQC,IAAI,iEAGZtC,KAAK4C,wBAGA/C,OAAOgD,iBACR,MAAM,IAAIC,MAAM,oCAWpB,GARAT,QAAQC,IAAI,+EACNzC,OAAOgD,iBAAiBE,iBAAkBC,IAC5CX,QAAQC,IAAI,2CAA4CU,GACxDhD,KAAKiD,sBAAsBD,KAI/BX,QAAQC,IAAI,iEACoB,IAArBzC,OAAOqD,UACd,MAAM,IAAIJ,MAAM,2BAEpB,QAA4B,IAAjBjD,OAAOsD,MACd,MAAM,IAAIL,MAAM,oBAEpB,QAAqC,IAA1BjD,OAAOuD,eACd,MAAM,IAAIN,MAAM,8BAsBpB,OAnBAT,QAAQC,IAAI,gEACZtC,KAAKM,iBAAkB,EAGvB+B,QAAQC,IAAI,oDACZtC,KAAKqD,sBAGLhB,QAAQC,IAAI,iEACZtC,KAAKsD,8BAGLjB,QAAQC,IAAI,uDACZtC,KAAKuD,uBAGLvD,KAAKwD,uBAELnB,QAAQC,IAAI,8EACL,CAEX,OAASC,GAML,MALAF,QAAQE,MAAM,uDAAwDA,GACtEF,QAAQE,MAAM,sCAAuCA,EAAMkB,OAC3DzD,KAAK0D,iBAAiBnB,EAAMoB,SAC5B3D,KAAKM,iBAAkB,EACvBN,KAAKO,eAAiB,KAChBgC,CACV,CACJ,CAKA,mBAAAc,GACSrD,KAAKM,iBAAoBT,OAAOqD,gBAML,IAArBrD,OAAOqD,gBAA8D,IAA1BrD,OAAOuD,gBACzDvD,OAAOqD,UAAUU,IAAI/D,OAAOuD,gBAGhCpD,KAAKC,GAAKJ,OAAOqD,UAAU,CACvBhD,UAAWF,KAAKE,UAEhB2D,SAAU,GAGVC,oBAAoB,EACpBC,oBAAoB,EACpBC,qBAAqB,EACrBC,eAAe,EACfC,iBAAiB,EAEjBnC,MAAO,CAEH,CACIoC,SAAU,OACVpC,MAAO,CACH,mBAAoB,cACpB,eAAgB,oBAChB,eAAgB,EAChBX,MAAS,UACTgD,MAAS,cACT,cAAe,SACf,cAAe,SACf,YAAa,OACb,cAAe,OACf9C,MAAS,cACTC,OAAU,eACVF,MAAS,cACT,YAAa,OACb,iBAAkB,UAK1B,CACI8C,SAAU,OACVpC,MAAO,CACHT,MAAS,EACT,aAAc,UACd,qBAAsB,UACtB,qBAAsB,WACtB,cAAe,SACf,cAAe,MAKvB,CACI6C,SAAU,WACVpC,MAAO,CACH,mBAAoB,UACpB,eAAgB,UAChBV,MAAS,cAIjB,CACI8C,SAAU,cACVpC,MAAO,CACH,mBAAoB,UACpB,eAAgB,UAChBV,MAAS,YAIjB,CACI8C,SAAU,aACVpC,MAAO,CACH,mBAAoB,UACpB,eAAgB,UAChBV,MAAS,YAIjB,CACI8C,SAAU,aACVpC,MAAO,CACH,mBAAoB,UACpB,eAAgB,UAChBV,MAAS,aAKjB,CACI8C,SAAU,cACVpC,MAAO,CACH,kBAAmB,GACnB,gBAAiB,aAK7BsC,OAAQrE,KAAKS,eAIjBT,KAAKsE,sBA3GDjC,QAAQE,MAAM,oDA4GtB,CAKA,uBAAAH,GAEI,MAAMmC,EAAW1C,SAASC,eAAe,oBACrCyC,GACAA,EAASC,iBAAiB,QAAS,KAC/BxE,KAAKyE,gBAKb,MAAMC,EAAY7C,SAASC,eAAe,mBACtC4C,GACAA,EAAUF,iBAAiB,QAAS,KAChCxE,KAAK2E,cAGjB,CAKA,2BAAArB,GACStD,KAAKC,IAKVoC,QAAQC,IAAI,iEAGZtC,KAAKC,GAAG2E,GAAG,MAAO,OAASC,IACvB,MAAMC,EAAOD,EAAIE,OACXC,EAAOF,EAAKE,OAClB3C,QAAQC,IAAI,uCAAwC0C,GAGpDhF,KAAKiF,wBAAwBH,KAIjC9E,KAAKC,GAAG2E,GAAG,MAAQC,IACXA,EAAIE,SAAW/E,KAAKC,KACpBoC,QAAQC,IAAI,oEAEZtC,KAAKC,GAAGE,QAAQ4B,MAAM,CAClBmD,QAAW,IAGflF,KAAKC,GAAGkF,QAAQpD,MAAM,CAClBmD,QAAW,OAMvBlF,KAAKC,GAAG2E,GAAG,YAAa,OAASC,IAChBA,EAAIE,OACZhD,MAAM,UAAW,MAG1B/B,KAAKC,GAAG2E,GAAG,WAAY,OAASC,IACfA,EAAIE,OACZhD,MAAM,UAAW,KAG1BM,QAAQC,IAAI,wEA1CRD,QAAQ+C,KAAK,+EA2CrB,CAKA,kBAAAd,GACI,MAAMe,EAAiB,IAAIC,eAAe,KAClCtF,KAAKC,IAAMD,KAAKK,UAChBL,KAAKuF,0BAITvF,KAAKE,WACLmF,EAAeG,QAAQxF,KAAKE,UAEpC,CAKA,qBAAAqF,GACI,IAAKvF,KAAKC,KAAOD,KAAKE,UAElB,YADAmC,QAAQC,IAAI,iEAKhBtC,KAAKyF,+BAGL,MAAMC,EAAgB1F,KAAKE,UAAUyF,wBAUrC,GATAtD,QAAQC,IAAI,+CAAgD,CACxDhB,MAAOoE,EAAcpE,MACrBC,OAAQmE,EAAcnE,OACtBqE,YAAa5F,KAAKE,UAAU0F,YAC5BC,aAAc7F,KAAKE,UAAU2F,aAC7BC,UAAWJ,EAAcpE,MAAQ,GAAKoE,EAAcnE,OAAS,IAI7DmE,EAAcpE,MAAQ,GAAKoE,EAAcnE,OAAS,EAAG,CACrDc,QAAQC,IAAI,sEAEZ,IAEItC,KAAKC,GAAG8F,SAGR,MAAMC,EAAYhG,KAAKC,GAAGE,QAAQ8F,OAC5BC,EAAYlG,KAAKC,GAAGkF,QAAQc,OAClC5D,QAAQC,IAAI,0DAA2D,CACnEnC,MAAO6F,EACPb,MAAOe,IAIPF,EAAY,GACZ3D,QAAQC,IAAI,oDACZtC,KAAKC,GAAGa,MACRd,KAAKmG,aAEL9D,QAAQC,IAAI,6CAGpB,OAASC,GACLF,QAAQE,MAAM,8CAA+CA,EACjE,CACJ,MACIF,QAAQC,IAAI,oEAEpB,CAKA,4BAAAmD,GACI,IAAKzF,KAAKE,UAAW,OAGrBF,KAAKE,UAAU6B,MAAMC,cAAgB,OACrChC,KAAKE,UAAU6B,MAAME,OAAS,UAC9BjC,KAAKE,UAAU6B,MAAMqE,WAAa,OAClCpG,KAAKE,UAAU6B,MAAMsE,YAAc,eAGnC,MAAMC,EAAStG,KAAKE,UAAUqG,cAC1BD,IACAA,EAAOvE,MAAMC,cAAgB,OAC7BsE,EAAOvE,MAAMG,SAAW,YAG5BG,QAAQC,IAAI,yDAChB,CAKA,cAAMkE,GACFnE,QAAQC,IAAI,4CACZtC,KAAKK,UAAW,EAEhB,IACIgC,QAAQC,IAAI,sEAENtC,KAAKwC,6BAEXH,QAAQC,IAAI,wDAAyDtC,KAAKC,IAGrED,KAAKC,KACNoC,QAAQC,IAAI,oEACZtC,KAAKqD,sBACLrD,KAAKsD,+BAGLtD,KAAKC,KAELoC,QAAQC,IAAI,uDAGZmE,WAAW,KACPpE,QAAQC,IAAI,kDACZtC,KAAKuF,yBACN,IAEHkB,WAAW,KACPpE,QAAQC,IAAI,mDACZtC,KAAKuF,yBACN,KAEHkB,WAAW,KACPpE,QAAQC,IAAI,kDACZtC,KAAKuF,yBACN,MAEPlD,QAAQC,IAAI,2DAChB,OAASC,GAIL,MAHAF,QAAQE,MAAM,iDAAkDA,GAChEF,QAAQE,MAAM,sCAAuCA,EAAMkB,OAErDlB,CACV,CACJ,CAKA,UAAAmE,GACI1G,KAAKK,UAAW,CACpB,CAKA,oBAAAkD,GACI,GAAIvD,KAAKQ,cAAcyF,OAAS,EAAG,CAC/B5D,QAAQC,IAAI,cAActC,KAAKQ,cAAcyF,yBAE7C,IAAA,MAAWU,KAAS3G,KAAKQ,cACrBR,KAAK4G,sBAAsBD,GAG/B3G,KAAKQ,cAAgB,EACzB,CACJ,CAOA,qBAAAqG,CAAsBC,GAGlB,GAFAzE,QAAQC,IAAI,4DAA4DwE,EAASA,EAAOb,OAAS,aAE5Fa,EAED,YADAzE,QAAQE,MAAM,sEAIlB,IAAKwE,MAAMC,QAAQF,GAEf,YADAzE,QAAQE,MAAM,wDAAyDuE,GAM3E,GAFAzE,QAAQC,IAAI,4CAA4CtC,KAAKM,2CAA2CN,KAAKC,OAExGD,KAAKM,kBAAoBN,KAAKC,GAI/B,OAHAoC,QAAQ+C,KAAK,mFACb/C,QAAQC,IAAI,kCAAkCwE,EAAOb,iCACrDjG,KAAKQ,cAAgB,IAAIsG,IAI7BzE,QAAQC,IAAI,+DAA+DwE,EAAOb,4BAG9Ea,EAAOb,OAAS,IAChB5D,QAAQC,IAAI,yCACZwE,EAAOG,MAAM,EAAG,GAAGC,QAAQ,CAACP,EAAOQ,KAC/B9E,QAAQC,IAAI,kCAAkC6E,EAAI,KAAM,CACpDC,UAAWT,EAAMS,UACjBC,gBAAiBV,EAAMU,gBACvBC,KAAMX,EAAMW,KACZC,QAASZ,EAAMY,QACfC,WAAYb,EAAMa,WAClBC,gBAAiBd,EAAM3B,MAAMwC,WAC7BE,UAAWf,EAAM3B,KAAO2C,OAAOC,KAAKjB,EAAM3B,MAAQ,eAM9DhF,KAAK6H,QAGL,MAAMC,EAAgB9H,KAAK+H,qBAAqBjB,GAGhDa,OAAOK,QAAQF,GAAeZ,QAAQ,EAAEe,EAAWC,MAC/C7F,QAAQC,IAAI,2BAA2B2F,MAAcC,EAAcjC,iBACnEjG,KAAKmI,iBAAiBF,EAAWC,KAIrClI,KAAKmG,YAEL9D,QAAQC,IAAI,0CAChB,CAOA,oBAAAyF,CAAqBjB,GACjB,MAAMgB,EAAgB,CAAA,EAUtB,OARAhB,EAAOI,QAAQP,IACX,MAAMsB,EAAYtB,EAAMa,YAAcb,EAAM3B,MAAMwC,YAAc,UAC3DM,EAAcG,KACfH,EAAcG,GAAa,IAE/BH,EAAcG,GAAWG,KAAKzB,KAG3BmB,CACX,CAOA,gBAAAK,CAAiBF,EAAWC,GACxB7F,QAAQC,IAAI,oDAAoD2F,UAAkBC,EAAcjC,iBAEhG,MAAMoC,MAAmBjI,IACzB,IAAIkI,EAAkB,KAGtB,MAAMC,EAAeL,EAAcM,KAAK,CAACC,EAAGC,IACjC,IAAIC,KAAKF,EAAErB,WAAWwB,UAAY,IAAID,KAAKD,EAAEtB,WAAWwB,WAGnEvG,QAAQC,IAAI,iCAAiCiG,EAAatC,iCAE1DsC,EAAarB,QAAQ,CAACP,EAAOkC,KACzB,MAAMC,EAAW9I,KAAK+I,oBAAoBpC,EAAOsB,GAC5Ca,IAGL9I,KAAKgJ,QAAQF,EAASG,GAAIH,EAASxB,KAAMwB,EAAS1E,MAAO,CACrD6D,YACAb,UAAWT,EAAMS,UACjB8B,UAAWvC,EACXwC,cAAeL,EAASK,gBAG5Bd,EAAae,IAAIN,EAASG,GAAI,IACvBH,EACHnC,QACAkC,UAIAC,EAASK,gBAAkBb,IAC3BA,EAAkBQ,EAASG,IAI/BjJ,KAAKqJ,gCAAgCP,EAASG,GAAItC,EAAO0B,EAAcC,KAE/E,CAQA,mBAAAS,CAAoBpC,EAAOsB,GACvB,MAAMqB,EAAY3C,EAAMU,iBAAmBV,EAAMW,MAAQ,GACnDC,EAAUZ,EAAMY,SAAW,GAC3BH,EAAY,IAAIuB,KAAKhC,EAAMS,WAAauB,KAAKY,OAEnDlH,QAAQC,IAAI,oDAAoDgH,KAAa/B,iBAAuBU,KAEpG,IAAIuB,EAAQC,EAAUrF,EAAO+E,GAAgB,EAG7C,MAAMO,EAActC,EAAUwB,UACxBe,EAAeC,KAAKC,SAASC,SAAS,IAAIC,UAAU,EAAG,GAG7D,GAAkB,YAAdT,GAAuC,YAAZ/B,EAE3BkC,EAAW,KACXrF,EAAQ,WAAW6D,EAAU8B,UAAU,EAAG,QAC1CP,EAAS,WAAWvB,EAAU+B,QAAQ,gBAAiB,MACvDb,GAAgB,OAEpB,GAAyB,SAAdG,GAAoC,gBAAZ/B,EAA2B,CAE1DkC,EAAW,KACX,MAAMQ,EAAgBtD,EAAM3B,MAAMkF,gBAAkB,cACpD9F,EAAQ6F,EAAchE,OAAS,GAAKgE,EAAcF,UAAU,EAAG,IAAM,MAAQE,EAC7ET,EAAS,eAAeE,KAAeC,GAE3C,MAAA,GAAyB,SAAdL,GAAoC,oBAAZ/B,EAE/BkC,EAAW,KACXrF,EAAQ,kBACRoF,EAAS,mBAAmBE,KAAeC,SAE/C,GAAyB,SAAdL,GAAoC,aAAZ/B,EAAwB,CAEvDkC,EAAW,OACX,MAAMU,EAAWxD,EAAM3B,MAAMoF,WAAa,eAEpCC,EAAgBF,EAASH,QAAQ,gBAAiB,IACxD5F,EAAQ,GAAG+F,IACXX,EAAS,QAAQa,KAAiBX,KAAeC,GAErD,MAAA,GAAyB,UAAdL,GAAyB3C,EAAM3B,MAAMsF,WAAY,CAExDb,EAAW,QACX,MAAMc,EAAY5D,EAAM3B,MAAMsF,YAAc3D,EAAM3B,MAAMwF,YAAc,QAEhEC,EAAiBF,EAAUP,QAAQ,gBAAiB,IAC1D5F,EAAQmG,EACRf,EAAS,SAASiB,KAAkBf,KAAeC,GAEvD,SAAyB,SAAdL,GAAwB/B,EAAQmD,SAAS,QAEhDjB,EAAW,OACXrF,EAAQ,cACRoF,EAAS,QAAQE,KAAeC,QAEpC,IAAyB,SAAdL,GAAoC,iBAAZ/B,EAE/B,OAAO,KAEX,GAAyB,QAAd+B,EAAqB,CAE5B,MAAMqB,EAAQhE,EAAM3B,MAAM2F,OAAS,OACnC,IAAK,CAAC,QAAS,YAAYD,SAASC,GAChC,OAAO,KAEXlB,EAAW,KACXrF,EAAQ,GAAGuG,EAAMC,oBACjBpB,EAAS,OAAOmB,KAASjB,KAAeC,GAE5C,KAAO,CAEHF,EAAW,KACX,MAAMoB,EAAiBvB,EAAUU,QAAQ,gBAAiB,KAAO,QACjE5F,EAAQkF,GAAa,QACrBE,EAAS,WAAWqB,KAAkBnB,KAAeC,GACzD,EAEA,MAAO,CACHV,GAAIO,EACJlC,KAAMmC,EACNrF,QACA+E,gBAER,CASA,+BAAAE,CAAgCG,EAAQ7C,EAAO0B,EAAcC,GACzD,MAAMgB,EAAY3C,EAAMU,iBAAmBV,EAAMW,MAAQ,GACnDC,EAAUZ,EAAMY,SAAW,GAGjC,IAAIuD,EAAe,KAED,YAAdxB,GAAuC,YAAZ/B,IAM3BuD,EAFqB,SAAdxB,GAAoC,aAAZ/B,EAEhBvH,KAAK+K,qBAAqB1C,EAAc,CAAC,cAAe,SAAUmB,GAE5D,SAAdF,GAAoC,oBAAZ/B,EAEhBvH,KAAK+K,qBAAqB1C,EAAc,CAAC,eAAgBmB,GAEnD,UAAdF,EAEQtJ,KAAK+K,qBAAqB1C,EAAc,CAAC,cAAe,SAAUmB,GAE5D,SAAdF,EAEQtJ,KAAK+K,qBAAqB1C,EAAc,CAAC,QAAS,eAAgBmB,GAIlExJ,KAAK+K,qBAAqB1C,EAAc,CAAC,cAAe,QAAS,WAAYmB,IAI3FsB,GAAgBxC,GAAmBkB,IAAWlB,IAC/CwC,EAAexC,GAIfwC,GAAgBA,IAAiBtB,GACjCxJ,KAAKgL,QAAQF,EAActB,GAEnC,CASA,oBAAAuB,CAAqB1C,EAAcnH,EAAW+J,GAC1C,MAAMC,EAAcnE,MAAMoE,KAAK9C,EAAaL,WAAWoD,UAEvD,IAAA,MAAY5B,EAAQV,KAAaoC,EAC7B,GAAI1B,IAAWyB,EAGf,IAAA,MAAWI,KAAcnK,EACrB,GAAIsI,EAAO8B,WAAWD,GAClB,OAAO7B,EAKnB,OAAO,IACX,CAMA,YAAA+B,CAAa5E,GACJ3G,KAAKK,WAGLL,KAAKM,iBAAoBN,KAAKC,GAKnCD,KAAK4G,sBAAsBD,GAJvB3G,KAAKQ,cAAc4H,KAAKzB,GAKhC,CAMA,qBAAAC,CAAsBD,GAClB,MAAM2C,EAAY3C,EAAMU,iBAAmBV,EAAMW,MAAQ,GACnDW,EAAYtB,EAAMa,YAAc,UAChCJ,EAAY,IAAIuB,KAAKhC,EAAMS,WAAauB,KAAKY,OAGnD,IAAIC,EAAS,GAAGF,KAAalC,EAAUwB,YACnCa,EAAW,KACXrF,EAAQkF,EAGZ,GAAIA,EAAUoB,SAAS,aAAc,CACjCjB,EAAW,OACX,MAAMU,EAAWxD,EAAM3B,MAAMoF,WAAa,eAC1ChG,EAAQ+F,EACRX,EAAS,QAAQW,KAAY/C,EAAUwB,WAC3C,MAAA,GAAWU,EAAUoB,SAAS,SAAU,CACpCjB,EAAW,QACX,MAAMc,EAAY5D,EAAM3B,MAAMwF,YAAc,QAC5CpG,EAAQmG,EACRf,EAAS,SAASe,KAAanD,EAAUwB,WAC7C,MAAWU,EAAUoB,SAAS,SAC1BjB,EAAW,OACXrF,EAAQ,YACRoF,EAAS,QAAQpC,EAAUwB,cACpBU,EAAUoB,SAAS,gBAAkBpB,EAAUoB,SAAS,sBAC/DjB,EAAW,KACXrF,EAAQkF,EAAUoB,SAAS,eAAiB,cAAgB,kBAC5DlB,EAAS,MAAMpF,EAAM4F,QAAQ,IAAK,OAAO5C,EAAUwB,aAIvD5I,KAAKgJ,QAAQQ,EAAQC,EAAUrF,EAAO,CAClC6D,YACAb,UAAWA,EAAUoE,cACrBtC,UAAWvC,IAIf3G,KAAKyL,yBAAyBjC,EAAQ7C,EAC1C,CASA,OAAAqC,CAAQC,EAAI3B,EAAMlD,EAAOY,EAAO,CAAA,GAG5B,GAFA3C,QAAQC,IAAI,uCAAuC2G,MAAO3B,QAAWlD,KAEjEpE,KAAKG,MAAMuL,IAAIzC,GAEf,YADA5G,QAAQC,IAAI,+BAA+B2G,8BAI/C,MAAMQ,EAAWzJ,KAAKkB,UAAUoG,IAAStH,KAAKkB,UAAUC,GAClD2H,EAAW,CACbG,KACA7E,MAAO,GAAGqF,EAASjI,QAAQ4C,IAC3BkD,OACAlG,MAAOqI,EAASrI,MAChBuK,YAAa3L,KAAK4L,YAAYnC,EAASrI,MAAO,IAC9CC,MAAOoI,EAASpI,MAChBC,MAAOmI,EAASnI,MAChBC,OAAQkI,EAASlI,UACdyD,GAKP,GAFAhF,KAAKG,MAAMiJ,IAAIH,EAAIH,GAEf9I,KAAKC,GAAI,CACT,MAAM4L,EAAU,CACZC,MAAO,QACP9G,KAAM8D,EACNiD,QAAS,GAAGzE,EAAK0E,sBAGrB3J,QAAQC,IAAI,2DAA4DuJ,GACxE7L,KAAKC,GAAGgM,IAAIJ,GACZxJ,QAAQC,IAAI,sEAAsEtC,KAAKC,GAAGE,QAAQ8F,UAClGjG,KAAKmG,WACT,CACJ,CASA,OAAA6E,CAAQkB,EAAUC,EAAUC,EAAS,KAAMpH,EAAO,IAC9C,GAAKkH,GAAaC,EAKlB,GAAID,IAAaC,GASjB,GAJKC,IACDA,EAAS,QAAQF,QAAeC,KAGhCnM,KAAKC,GAAI,CAGT,GADqBD,KAAKC,GAAG6B,eAAesK,GAC3BnG,OAAS,EAEtB,YADA5D,QAAQC,IAAI,+BAA+B8J,8BAK/C,MAAMC,EAAarM,KAAKC,GAAG6B,eAAeoK,GACpCI,EAAatM,KAAKC,GAAG6B,eAAeqK,GAE1C,GAA0B,IAAtBE,EAAWpG,OAEX,YADA5D,QAAQ+C,KAAK,sCAAsC8G,wCAIvD,GAA0B,IAAtBI,EAAWrG,OAEX,YADA5D,QAAQ+C,KAAK,sCAAsC+G,wCAIvD,MAAMN,EAAU,CACZC,MAAO,QACP9G,KAAM,CACFiE,GAAImD,EACJG,OAAQL,EACRnH,OAAQoH,KACLnH,IAIX3C,QAAQC,IAAI,2DAA4DuJ,GAExE,IACI7L,KAAKC,GAAGgM,IAAIJ,GACZxJ,QAAQC,IAAI,sEAAsEtC,KAAKC,GAAGkF,QAAQc,UAClGjG,KAAKmG,WACT,OAAS5D,GACLF,QAAQE,MAAM,6CAA6C6J,KAAW7J,GACtEF,QAAQE,MAAM,0CAA2CsJ,EAC7D,CACJ,OAlDIxJ,QAAQ+C,KAAK,4DAA4D8G,oBALzE7J,QAAQ+C,KAAK,8DAA8D8G,iBAAwBC,KAwD3G,CAOA,wBAAAV,CAAyBjC,EAAQ7C,GAC7B,MAAM2C,EAAY3C,EAAMU,iBAAmBV,EAAMW,MAAQ,GACnDW,EAAYtB,EAAMa,YAAc,UAMtC,GAHuBT,MAAMoE,KAAKnL,KAAKG,MAAM6H,WAGzCsB,EAAUoB,SAAS,cAAgB/D,EAAM3B,MAAMoF,UAAW,CAE1D,MAAMoC,EAAaxM,KAAKyM,eAAexE,EAAW,CAAC,KAAM,UACzD,GAAIuE,EAEA,YADAxM,KAAKgL,QAAQwB,EAAYhD,EAGjC,CAGA,GAAIF,EAAUoB,SAAS,UAAY/D,EAAM3B,MAAMwF,WAAY,CAEvD,MAAMkC,EAAS1M,KAAKyM,eAAexE,EAAW,CAAC,OAC/C,GAAIyE,EAEA,YADA1M,KAAKgL,QAAQ0B,EAAQlD,EAG7B,CAGA,GAAIF,EAAUoB,SAAS,QAAS,CAC5B,MAAM8B,EAAaxM,KAAKyM,eAAexE,EAAW,CAAC,QAAS,OAC5D,GAAIuE,EAEA,YADAxM,KAAKgL,QAAQwB,EAAYhD,EAGjC,CAGA,MAAMmD,EAAW5F,MAAMoE,KAAKnL,KAAKG,MAAMyH,QACjCgF,EAAeD,EAASE,QAAQrD,GAEtC,GAAIoD,EAAe,EAAG,CAClB,MAAME,EAAiBH,EAASC,EAAe,GAC/C5M,KAAKgL,QAAQ8B,EAAgBtD,EACjC,CACJ,CAQA,cAAAiD,CAAexE,EAAW/G,GACtB,MAAMgK,EAAcnE,MAAMoE,KAAKnL,KAAKG,MAAM6H,WAAWoD,UAErD,IAAA,MAAY5B,EAAQV,KAAaoC,EAC7B,GAAIpC,EAASb,YAAcA,GAAa/G,EAAUwJ,SAAS5B,EAASxB,MAChE,OAAOkC,EAIf,OAAO,IACX,CAMA,uBAAAvE,CAAwBH,GACpB,IAAK9E,KAAKC,GAAI,OAGdD,KAAKC,GAAGE,QAAQ4B,MAAM,CAClBmD,QAAW,KAGflF,KAAKC,GAAGkF,QAAQpD,MAAM,CAClBmD,QAAW,KAIf,MAAM6H,EAAejI,EAAKiI,eAC1BjI,EAAK/C,MAAM,UAAW,GACtBgL,EAAahL,MAAM,UAAW,EAClC,CAKA,WAAA0C,GACQzE,KAAKC,IACLD,KAAKC,GAAGoE,OAAOrE,KAAKS,cAAcuM,KAE1C,CAKA,UAAArI,GACQ3E,KAAKC,KACLD,KAAKC,GAAGa,MACRd,KAAKC,GAAGgN,SAEhB,CAKA,SAAA9G,GAEI,GADA9D,QAAQC,IAAI,uDAAuDtC,KAAKK,0BAA0BL,KAAKC,MACnGD,KAAKC,IAAMD,KAAKK,SAAU,CAC1B,MAAM2F,EAAYhG,KAAKC,GAAGE,QAAQ8F,OAC5BC,EAAYlG,KAAKC,GAAGkF,QAAQc,OAIlC,GAHA5D,QAAQC,IAAI,8CAA8C0D,eAAuBE,WAG7ElG,KAAKE,UAAW,CAChB,MAAMgN,EAAOlN,KAAKE,UAAUyF,wBAC5BtD,QAAQC,IAAI,6DAA8D,CACtEhB,MAAO4L,EAAK5L,MACZC,OAAQ2L,EAAK3L,OACbqE,YAAa5F,KAAKE,UAAU0F,YAC5BC,aAAc7F,KAAKE,UAAU2F,cAErC,CAEA,MAAMxB,EAASrE,KAAKC,GAAGoE,OAAOrE,KAAKS,cAGnC4D,EAAOO,GAAG,aAAc,KACpBvC,QAAQC,IAAI,kEACZtC,KAAKC,GAAGE,QAAQ+G,QAAQ,CAACpC,EAAM+D,KAC3B,MAAM3G,EAAW4C,EAAK5C,WAChB8C,EAAOF,EAAKE,OAClB3C,QAAQC,IAAI,iCAAiCuG,EAAQ,MAAM7D,EAAKZ,aAAalC,EAASiL,EAAEC,QAAQ,OAAOlL,EAASmL,EAAED,QAAQ,WAIlI/I,EAAO2I,KACX,MACI3K,QAAQC,IAAI,+EAEpB,CAKA,KAAAuF,GAII,GAHAxF,QAAQC,IAAI,wCAAwCtC,KAAKG,MAAMmN,eAAetN,KAAKQ,cAAcyF,yBACjGjG,KAAKG,MAAM0H,QACX7H,KAAKQ,cAAgB,GACjBR,KAAKC,GAAI,CACT,MAAMsN,EAAevN,KAAKC,GAAG4D,WAAWoC,OACxC,IACIjG,KAAKC,GAAG4D,WAAW2J,SACnBnL,QAAQC,IAAI,kCAAkCiL,uBAClD,OAAShL,GACLF,QAAQE,MAAM,4DAA6DA,GAE3E,IACIvC,KAAKC,GAAGwN,UACRzN,KAAKC,GAAK,KACVoC,QAAQC,IAAI,yEAChB,OAASoL,GACLrL,QAAQE,MAAM,qDAAsDmL,EACxE,CACJ,CACJ,CACJ,CAKA,oBAAA9K,GACQ5C,KAAKE,YACLF,KAAKE,UAAUyN,UAAY,mVAQnC,CAKA,qBAAA1K,CAAsBD,GAClB,MAAM4K,EAAkB/L,SAASC,eAAe,wBAC5C8L,IACI5K,EAAST,MACTqL,EAAgBD,UAAY,6BAA6B3K,EAASW,iBAElEiK,EAAgBD,UAAY,8HAE4B3K,EAAS6K,QAAU7K,EAAS8K,MAAS,gGAExD9K,EAASW,YAAYX,EAAS6K,WAAW7K,EAAS8K,iCAInG,CAKA,oBAAAtK,GACQxD,KAAKE,YACLF,KAAKE,UAAUyN,UAAY,GAEnC,CAKA,gBAAAjK,CAAiBC,GACT3D,KAAKE,YACLF,KAAKE,UAAUyN,UAAY,yPAIchK,mPAOjD,CAKA,YAAAoK,GACI/N,KAAKM,iBAAkB,EACvBN,KAAKO,eAAiB,KACtBP,KAAKwG,UACT,CAMA,SAAAwH,GA+BI,OA9BA3L,QAAQC,IAAI,sDACZD,QAAQC,IAAI,wCAAyC,CACjDjC,SAAUL,KAAKK,SACfC,gBAAiBN,KAAKM,gBACtB2N,QAASjO,KAAKC,GACdiO,eAAgBlO,KAAKE,UACrB8F,UAAWhG,KAAKG,MAAMmN,KACtBa,kBAAmBnO,KAAKQ,cAAcyF,OACtCmI,sBAAuBvO,OAAOgD,mBAI9B7C,KAAKE,WACLmC,QAAQC,IAAI,yCAA0C,CAClD2G,GAAIjJ,KAAKE,UAAU+I,GACnBoF,UAAWrO,KAAKE,UAAUmO,UAC1BzI,YAAa5F,KAAKE,UAAU0F,YAC5BC,aAAc7F,KAAKE,UAAU2F,aAC7B8H,UAAW3N,KAAKE,UAAUyN,UAAY,cAAgB,UAK9DtL,QAAQC,IAAI,+CAAgD,CACxDY,iBAAkBrD,OAAOqD,UACzBC,aAActD,OAAOsD,MACrBC,sBAAuBvD,OAAOuD,eAC9BP,wBAAyBhD,OAAOgD,mBAG7B,CACHxC,SAAUL,KAAKK,SACfC,gBAAiBN,KAAKM,gBACtB2N,QAASjO,KAAKC,GACdqO,iBAAkBtO,KAAKE,UAE/B,CAMA,gBAAAqO,GACIlM,QAAQC,IAAI,8DACZD,QAAQC,IAAI,6DACZD,QAAQC,IAAI,8DAGZ,MAAMkM,EAAa,CACfnO,SAAUL,KAAKK,SACfC,gBAAiBN,KAAKM,gBACtB2N,QAASjO,KAAKC,GACdiO,eAAgBlO,KAAKE,UACrB8F,UAAWhG,KAAKG,MAAMmN,KACtBmB,sBAAuBzO,KAAKC,GAAKD,KAAKC,GAAG4D,WAAWoC,OAAS,GAKjE,GAHA5D,QAAQC,IAAI,2CAA4CkM,IAGpDxO,KAAKE,UAQL,OADAmC,QAAQE,MAAM,qDACP,EARS,CAChB,MAAMmM,EAAgB1O,KAAK2O,wBAC3BtM,QAAQC,IAAI,8CAA+CoM,GAG3D1O,KAAK4O,6BACT,CAMA,IAAI5O,KAAKC,GAKL,OADAoC,QAAQE,MAAM,8DACP,EALE,CACT,MAAMsM,EAAgB7O,KAAK8O,wBAC3BzM,QAAQC,IAAI,8CAA+CuM,EAC/D,CAqBA,OAfA7O,KAAK+O,qBAGL/O,KAAKgP,+BAGDhP,KAAKC,IAAiC,IAA3BD,KAAKC,GAAGE,QAAQ8F,SAC3B5D,QAAQC,IAAI,oEACZtC,KAAKiP,qBAITjP,KAAKkP,oBAEL7M,QAAQC,IAAI,mEACL,CACX,CAKA,qBAAAqM,GACI,MAAMzB,EAAOlN,KAAKE,UAAUyF,wBACtBwJ,EAAWtP,OAAOuP,iBAAiBpP,KAAKE,WAE9C,MAAO,CACH+I,GAAIjJ,KAAKE,UAAU+I,GACnBoF,UAAWrO,KAAKE,UAAUmO,UAE1BzI,YAAa5F,KAAKE,UAAU0F,YAC5BC,aAAc7F,KAAKE,UAAU2F,aAC7BwJ,YAAarP,KAAKE,UAAUmP,YAC5BC,aAActP,KAAKE,UAAUoP,aAC7BC,YAAavP,KAAKE,UAAUqP,YAC5BC,aAAcxP,KAAKE,UAAUsP,aAE7BC,aAAc,CACVnO,MAAO4L,EAAK5L,MACZC,OAAQ2L,EAAK3L,OACbmO,IAAKxC,EAAKwC,IACVC,KAAMzC,EAAKyC,KACXC,OAAQ1C,EAAK0C,OACbC,MAAO3C,EAAK2C,OAGhBC,eAAgB,CACZC,QAASZ,EAASY,QAClBC,WAAYb,EAASa,WACrB9K,QAASiK,EAASjK,QAClBhD,SAAUiN,EAASjN,SACnB+N,SAAUd,EAASc,SACnB9N,OAAQgN,EAAShN,OACjB+N,gBAAiBf,EAASe,gBAC1BC,UAAWhB,EAASgB,WAGxBrK,UAAWoH,EAAK5L,MAAQ,GAAK4L,EAAK3L,OAAS,GAA0B,SAArB4N,EAASY,SAA8C,WAAxBZ,EAASa,WAExFzJ,cAAevG,KAAKE,UAAUqG,cAAgB,CAC1C6J,QAASpQ,KAAKE,UAAUqG,cAAc6J,QACtC/B,UAAWrO,KAAKE,UAAUqG,cAAc8H,UACxCzI,YAAa5F,KAAKE,UAAUqG,cAAcX,YAC1CC,aAAc7F,KAAKE,UAAUqG,cAAcV,cAC3C,KAEZ,CAKA,qBAAAiJ,GACI,MAAMuB,EAASrQ,KAAKC,GAAGoQ,SACjBC,EAAOtQ,KAAKC,GAAGqQ,OACfC,EAAMvQ,KAAKC,GAAGsQ,MACdC,EAAWxQ,KAAKC,GAAGuQ,WAEzB,MAAO,CAEHxK,UAAWhG,KAAKC,GAAGE,QAAQ8F,OAC3BC,UAAWlG,KAAKC,GAAGkF,QAAQc,OAC3BsH,aAAcvN,KAAKC,GAAG4D,WAAWoC,OAEjCqK,OACAC,MACAF,SACAG,WAEAC,eAAgBzQ,KAAKC,GAAGqB,QACxBoP,gBAAiB1Q,KAAKC,GAAGsB,SAEzBoP,mBAA6D,IAA9C3Q,KAAKC,GAAG2Q,QAAQ,0BAE/BC,SAAU7Q,KAAKC,GAAG4Q,WAAa,CAC3BnQ,KAAMV,KAAKC,GAAG4Q,WAAWnQ,KACzBoQ,QAAS9Q,KAAKC,GAAG4Q,WAAWC,SAC5B,KAEZ,CAKA,kBAAA/B,GACI,IAAK/O,KAAKC,IAAiC,IAA3BD,KAAKC,GAAGE,QAAQ8F,OAE5B,YADA5D,QAAQC,IAAI,2DAIhBD,QAAQC,IAAI,+CACZ,MAAMnC,EAAQH,KAAKC,GAAGE,QAChBkQ,EAASrQ,KAAKC,GAAGoQ,SACjBG,EAAWxQ,KAAKC,GAAGuQ,WAEzBnO,QAAQC,IAAI,8CAA+C+N,GAC3DhO,QAAQC,IAAI,+CAAgDkO,GAE5DrQ,EAAM+G,QAAQ,CAACpC,EAAM+D,KACjB,MAAM3G,EAAW4C,EAAK5C,WAChB8C,EAAOF,EAAKE,OACZ+L,EAAcjM,EAAKiM,cAEzB1O,QAAQC,IAAI,mCAAmCuG,EAAQ,KAAM,CACzDI,GAAIjE,EAAKiE,GACT7E,MAAOY,EAAKZ,MACZlC,WACA6O,cACAjL,UAAWhB,EAAKkM,UAChB9L,QAASJ,EAAK/C,MAAM,WACpBT,MAAOwD,EAAK/C,MAAM,SAClBR,OAAQuD,EAAK/C,MAAM,aAG/B,CAKA,2BAAA6M,GACQ5O,KAAKE,YACLF,KAAKE,UAAU6B,MAAMmO,gBAAkB,YACvClQ,KAAKE,UAAU6B,MAAMkP,OAAS,oBAC9BjR,KAAKE,UAAU6B,MAAMmP,UAAY,QACjC7O,QAAQC,IAAI,6FAEpB,CAKA,4BAAA0M,GACI,GAAKhP,KAAKC,GAAV,CAKAoC,QAAQC,IAAI,yEAEZ,IAEID,QAAQC,IAAI,kDACZtC,KAAKC,GAAG8F,SAGR1D,QAAQC,IAAI,kDACZtC,KAAKC,GAAGkR,cAGJnR,KAAKC,GAAGE,QAAQ8F,OAAS,IACzB5D,QAAQC,IAAI,kDACZtC,KAAKC,GAAGoE,OAAOrE,KAAKS,cAAcuM,OAItC3K,QAAQC,IAAI,qDACZtC,KAAKC,GAAGuQ,SAAS,CACbF,KAAMtQ,KAAKC,GAAGqQ,OACdC,IAAKvQ,KAAKC,GAAGsQ,QAGjBlO,QAAQC,IAAI,iEAChB,OAASC,GACLF,QAAQE,MAAM,4DAA6DA,EAC/E,CA7BA,MAFIF,QAAQC,IAAI,yEAgCpB,CAKA,iBAAA2M,GACI,GAAKjP,KAAKC,GAAV,CAEAoC,QAAQC,IAAI,mDAEZ,IAEItC,KAAKC,GAAG4D,WAAW2J,SAGnB,MAAM4D,EAAY,CACd,CACItF,MAAO,QACP9G,KAAM,CACFiE,GAAI,cACJ7E,MAAO,iBACPhD,MAAO,UACPuK,YAAa,UACbtK,MAAO,YACPC,MAAO,IACPC,OAAQ,IAEZwK,QAAS,WAEb,CACID,MAAO,QACP9G,KAAM,CACFiE,GAAI,cACJ7E,MAAO,iBACPhD,MAAO,UACPuK,YAAa,UACbtK,MAAO,UACPC,MAAO,GACPC,OAAQ,IAEZwK,QAAS,aAEb,CACID,MAAO,QACP9G,KAAM,CACFiE,GAAI,cACJ7E,MAAO,iBACPhD,MAAO,UACPuK,YAAa,UACbtK,MAAO,WACPC,MAAO,GACPC,OAAQ,IAEZwK,QAAS,cAKXsF,EAAY,CACd,CACIvF,MAAO,QACP9G,KAAM,CACFiE,GAAI,cACJsD,OAAQ,cACRxH,OAAQ,gBAGhB,CACI+G,MAAO,QACP9G,KAAM,CACFiE,GAAI,cACJsD,OAAQ,cACRxH,OAAQ,iBAMpB/E,KAAKC,GAAGgM,IAAImF,GACZpR,KAAKC,GAAGgM,IAAIoF,GAEZhP,QAAQC,IAAI,kEAGZ8O,EAAUlK,QAAQoK,IACdtR,KAAKG,MAAMiJ,IAAIkI,EAAYtM,KAAKiE,GAAIqI,EAAYtM,QAIpDhF,KAAKmG,WAET,OAAS5D,GACLF,QAAQE,MAAM,sDAAuDA,EACzE,CAvFc,CAwFlB,CAKA,iBAAA2M,GACI,IAAKlP,KAAKC,GAAI,OAEdoC,QAAQC,IAAI,mDAEZ,MAAMiP,EAAkBC,IACpB,IACInP,QAAQC,IAAI,+CAA+CkP,QAG3D,MAAMC,EAAazR,KAAKC,GAAGqQ,OACrBoB,EAAY1R,KAAKC,GAAGsQ,MACpB1M,EAAW7D,KAAKC,GAAG4D,WAQzB,GANAxB,QAAQC,IAAI,yCAA0C,CAClDgO,KAAMmB,EACNlB,IAAKmB,EACLnE,aAAc1J,EAASoC,SAGvBpC,EAASoC,OAAS,EAAG,CAErBjG,KAAKC,GAAGa,IAAI+C,EAAU,IAGtB,MAAM8N,EAAY3R,KAAKC,GAAGqQ,OACpBsB,EAAW5R,KAAKC,GAAGsQ,MAEzBlO,QAAQC,IAAI,wCAAyC,CACjDgO,KAAMqB,EACNpB,IAAKqB,EACLC,QAASJ,IAAeE,GAAaD,EAAUvE,IAAMyE,EAASzE,GAAKuE,EAAUrE,IAAMuE,EAASvE,IAIhGrN,KAAKC,GAAGgN,OAAOpJ,EAEnB,MACIxB,QAAQC,IAAI,gDAGpB,OAASC,GACLF,QAAQE,MAAM,+CAA+CiP,YAAyBjP,EAC1F,GAIJgP,EAAe,GACf9K,WAAW,IAAM8K,EAAe,GAAI,KACpC9K,WAAW,IAAM8K,EAAe,GAAI,KACpC9K,WAAW,IAAM8K,EAAe,GAAI,IACxC,CAKA,oBAAAO,GACI,IAAK9R,KAAKC,GAEN,OADAoC,QAAQC,IAAI,4CACL,EAGXD,QAAQC,IAAI,2DAEZ,IA4BI,OA1BAtC,KAAKC,GAAG4D,WAAW2J,SAGnBxN,KAAKC,GAAGgM,IAAI,CACRH,MAAO,QACP9G,KAAM,CACFiE,GAAI,cACJ7E,MAAO,gBACPhD,MAAO,UACPuK,YAAa,UACbrK,MAAO,IACPC,OAAQ,IACRF,MAAO,aAEXa,SAAU,CAAEiL,EAAG,IAAKE,EAAG,OAI3BrN,KAAKC,GAAGkR,cAGRnR,KAAKC,GAAGa,IAAId,KAAKC,GAAG8R,EAAE,gBAAiB,IAEvC1P,QAAQC,IAAI,2DACZD,QAAQC,IAAI,sFAEL,CAEX,OAASC,GAEL,OADAF,QAAQE,MAAM,wCAAyCA,IAChD,CACX,CACJ,CAQA,WAAAqJ,CAAYxK,EAAO4Q,GACf,MAAMC,EAAMC,SAAS9Q,EAAM4I,QAAQ,IAAK,IAAK,IACvCmI,EAAMvI,KAAKwI,MAAM,KAAOJ,GACxBK,GAAKJ,GAAO,IAAME,EAClBG,GAAKL,GAAO,EAAI,KAAUE,EAC1BI,GAAW,IAANN,GAAkBE,EAC7B,MAAO,KAAO,SAA8C,OAAjCE,EAAI,IAAMA,EAAI,EAAI,EAAIA,EAAI,KACf,KAAjCC,EAAI,IAAMA,EAAI,EAAI,EAAIA,EAAI,MAC1BC,EAAI,IAAMA,EAAI,EAAI,EAAIA,EAAI,MAAMzI,SAAS,IAAI7C,MAAM,EAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hud-visualizer.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|