claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- 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/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- 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/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- 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/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- 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/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- 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/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- 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/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- 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/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -1,749 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UI State Manager Module
|
|
3
|
-
*
|
|
4
|
-
* Manages UI state including tab switching, card selection, keyboard navigation,
|
|
5
|
-
* and visual feedback across the dashboard interface.
|
|
6
|
-
*
|
|
7
|
-
* WHY: Extracted from main dashboard to centralize UI state management and
|
|
8
|
-
* provide better separation between business logic and UI state. This makes
|
|
9
|
-
* the UI behavior more predictable and easier to test.
|
|
10
|
-
*
|
|
11
|
-
* DESIGN DECISION: Maintains centralized state for current tab, selected cards,
|
|
12
|
-
* and navigation context while providing a clean API for other modules to
|
|
13
|
-
* interact with UI state changes.
|
|
14
|
-
*/
|
|
15
|
-
class UIStateManager {
|
|
16
|
-
constructor() {
|
|
17
|
-
// Switching lock to prevent race conditions
|
|
18
|
-
this._switching = false;
|
|
19
|
-
|
|
20
|
-
// Hash to tab mapping
|
|
21
|
-
this.hashToTab = {
|
|
22
|
-
'#events': 'events',
|
|
23
|
-
'#agents': 'agents',
|
|
24
|
-
'#tools': 'tools',
|
|
25
|
-
'#files': 'files',
|
|
26
|
-
'#activity': 'activity',
|
|
27
|
-
'#file_tree': 'claude-tree',
|
|
28
|
-
'': 'events', // default
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// Tab to hash mapping (reverse lookup)
|
|
32
|
-
this.tabToHash = {
|
|
33
|
-
'events': '#events',
|
|
34
|
-
'agents': '#agents',
|
|
35
|
-
'tools': '#tools',
|
|
36
|
-
'files': '#files',
|
|
37
|
-
'activity': '#activity',
|
|
38
|
-
'claude-tree': '#file_tree'
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// Current active tab - will be set based on URL hash
|
|
42
|
-
this.currentTab = this.getTabFromHash();
|
|
43
|
-
|
|
44
|
-
// Auto-scroll behavior
|
|
45
|
-
this.autoScroll = true;
|
|
46
|
-
|
|
47
|
-
// Selection state - tracks the currently selected card across all tabs
|
|
48
|
-
this.selectedCard = {
|
|
49
|
-
tab: null, // which tab the selection is in
|
|
50
|
-
index: null, // index of selected item in that tab
|
|
51
|
-
type: null, // 'event', 'agent', 'tool', 'file'
|
|
52
|
-
data: null // the actual data object
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// Navigation state for each tab
|
|
56
|
-
this.tabNavigation = {
|
|
57
|
-
events: { selectedIndex: -1, items: [] },
|
|
58
|
-
agents: { selectedIndex: -1, items: [] },
|
|
59
|
-
tools: { selectedIndex: -1, items: [] },
|
|
60
|
-
files: { selectedIndex: -1, items: [] }
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
this.setupEventHandlers();
|
|
64
|
-
console.log('UI state manager initialized with hash navigation');
|
|
65
|
-
|
|
66
|
-
// Initialize with current hash
|
|
67
|
-
this.handleHashChange();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Get tab name from current URL hash
|
|
72
|
-
* @returns {string} - Tab name based on hash
|
|
73
|
-
*/
|
|
74
|
-
getTabFromHash() {
|
|
75
|
-
const hash = window.location.hash || '';
|
|
76
|
-
return this.hashToTab[hash] || 'events';
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Set up event handlers for UI interactions
|
|
81
|
-
*/
|
|
82
|
-
setupEventHandlers() {
|
|
83
|
-
this.setupHashNavigation();
|
|
84
|
-
this.setupTabClickHandlers(); // Add explicit tab click handlers
|
|
85
|
-
this.setupUnifiedKeyboardNavigation();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Set up hash-based navigation
|
|
90
|
-
*/
|
|
91
|
-
setupHashNavigation() {
|
|
92
|
-
// Handle hash changes
|
|
93
|
-
window.addEventListener('hashchange', (e) => {
|
|
94
|
-
console.log('[Hash Navigation] Hash changed from', new URL(e.oldURL).hash, 'to', window.location.hash);
|
|
95
|
-
this.handleHashChange();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// Handle initial page load
|
|
99
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
100
|
-
console.log('[Hash Navigation] Initial hash:', window.location.hash);
|
|
101
|
-
this.handleHashChange();
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Handle hash change events
|
|
107
|
-
*/
|
|
108
|
-
handleHashChange() {
|
|
109
|
-
const hash = window.location.hash || '';
|
|
110
|
-
console.log('[Hash Navigation] DETAILED DEBUG:');
|
|
111
|
-
console.log('[Hash Navigation] - Current hash:', hash);
|
|
112
|
-
console.log('[Hash Navigation] - hashToTab mapping:', this.hashToTab);
|
|
113
|
-
console.log('[Hash Navigation] - Direct lookup result:', this.hashToTab[hash]);
|
|
114
|
-
console.log('[Hash Navigation] - Is hash in mapping?', hash in this.hashToTab);
|
|
115
|
-
console.log('[Hash Navigation] - Hash length:', hash.length);
|
|
116
|
-
console.log('[Hash Navigation] - Hash char codes:', hash.split('').map(c => c.charCodeAt(0)));
|
|
117
|
-
|
|
118
|
-
const tabName = this.hashToTab[hash] || 'events';
|
|
119
|
-
console.log('[Hash Navigation] Final resolved tab name:', tabName);
|
|
120
|
-
|
|
121
|
-
// Special logging for File Tree tab
|
|
122
|
-
if (tabName === 'claude-tree' || hash === '#file_tree') {
|
|
123
|
-
console.log('[UIStateManager] FILE TREE TAB SELECTED via hash:', hash);
|
|
124
|
-
console.log('[UIStateManager] Tab name resolved to:', tabName);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
this.switchTab(tabName, false); // false = don't update hash (we're responding to hash change)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* DEPRECATED: Tab navigation is now handled by hash navigation
|
|
132
|
-
* This method is kept for backward compatibility but does nothing
|
|
133
|
-
*/
|
|
134
|
-
setupTabNavigation() {
|
|
135
|
-
console.log('[Hash Navigation] setupTabNavigation is deprecated - using hash navigation instead');
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Set up explicit click handlers for tab buttons to ensure proper routing
|
|
140
|
-
* This ensures tab clicks work even if other modules interfere
|
|
141
|
-
*/
|
|
142
|
-
setupTabClickHandlers() {
|
|
143
|
-
document.querySelectorAll('.tab-button').forEach(button => {
|
|
144
|
-
button.addEventListener('click', (e) => {
|
|
145
|
-
console.log('[UIStateManager] Tab button clicked:', e.target);
|
|
146
|
-
|
|
147
|
-
// Prevent default only if we're going to handle it
|
|
148
|
-
const tabName = this.getTabNameFromButton(e.target);
|
|
149
|
-
console.log('[UIStateManager] Resolved tab name:', tabName);
|
|
150
|
-
|
|
151
|
-
if (tabName) {
|
|
152
|
-
// Let the href attribute update the hash naturally, which will trigger our hashchange handler
|
|
153
|
-
// But also explicitly trigger the switch in case href doesn't work
|
|
154
|
-
setTimeout(() => {
|
|
155
|
-
const expectedHash = this.tabToHash[tabName];
|
|
156
|
-
if (window.location.hash !== expectedHash && expectedHash) {
|
|
157
|
-
console.log('[UIStateManager] Hash not updated, forcing update:', expectedHash);
|
|
158
|
-
window.location.hash = expectedHash;
|
|
159
|
-
}
|
|
160
|
-
}, 10);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
console.log('[UIStateManager] Tab click handlers set up for', document.querySelectorAll('.tab-button').length, 'buttons');
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Set up unified keyboard navigation across all tabs
|
|
170
|
-
*/
|
|
171
|
-
setupUnifiedKeyboardNavigation() {
|
|
172
|
-
document.addEventListener('keydown', (e) => {
|
|
173
|
-
// Only handle if not in an input field
|
|
174
|
-
if (document.activeElement &&
|
|
175
|
-
['INPUT', 'TEXTAREA', 'SELECT'].includes(document.activeElement.tagName)) {
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
|
|
180
|
-
e.preventDefault();
|
|
181
|
-
this.handleUnifiedArrowNavigation(e.key === 'ArrowDown' ? 1 : -1);
|
|
182
|
-
} else if (e.key === 'Enter') {
|
|
183
|
-
e.preventDefault();
|
|
184
|
-
this.handleUnifiedEnterKey();
|
|
185
|
-
} else if (e.key === 'Escape') {
|
|
186
|
-
this.clearUnifiedSelection();
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Get tab name from button element
|
|
193
|
-
* @param {HTMLElement} button - Tab button element
|
|
194
|
-
* @returns {string} - Tab name
|
|
195
|
-
*/
|
|
196
|
-
getTabNameFromButton(button) {
|
|
197
|
-
console.log('[getTabNameFromButton] DEBUG: button object:', button);
|
|
198
|
-
console.log('[getTabNameFromButton] DEBUG: button.nodeType:', button.nodeType);
|
|
199
|
-
console.log('[getTabNameFromButton] DEBUG: button.tagName:', button.tagName);
|
|
200
|
-
|
|
201
|
-
// CRITICAL FIX: Make sure we're dealing with the actual button element
|
|
202
|
-
// Sometimes the click target might be a child element (like the emoji icon)
|
|
203
|
-
let targetButton = button;
|
|
204
|
-
if (button && button.closest && button.closest('.tab-button')) {
|
|
205
|
-
targetButton = button.closest('.tab-button');
|
|
206
|
-
console.log('[getTabNameFromButton] DEBUG: Used closest() to find actual button');
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// First check for data-tab attribute
|
|
210
|
-
const dataTab = targetButton ? targetButton.getAttribute('data-tab') : null;
|
|
211
|
-
console.log('[getTabNameFromButton] DEBUG: data-tab attribute:', dataTab);
|
|
212
|
-
console.log('[getTabNameFromButton] DEBUG: dataTab truthy:', !!dataTab);
|
|
213
|
-
|
|
214
|
-
// CRITICAL: Specifically handle the File Tree case
|
|
215
|
-
if (dataTab === 'claude-tree') {
|
|
216
|
-
console.log('[getTabNameFromButton] DEBUG: Found claude-tree data-tab, returning it');
|
|
217
|
-
return 'claude-tree';
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (dataTab) {
|
|
221
|
-
console.log('[getTabNameFromButton] DEBUG: Returning dataTab:', dataTab);
|
|
222
|
-
return dataTab;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Fallback to text content matching
|
|
226
|
-
const text = targetButton ? targetButton.textContent.toLowerCase() : '';
|
|
227
|
-
console.log('[getTabNameFromButton] DEBUG: text content:', text);
|
|
228
|
-
console.log('[getTabNameFromButton] DEBUG: text includes file tree:', text.includes('file tree'));
|
|
229
|
-
console.log('[getTabNameFromButton] DEBUG: text includes events:', text.includes('events'));
|
|
230
|
-
|
|
231
|
-
// CRITICAL: Check File Tree FIRST since it's the problematic one
|
|
232
|
-
if (text.includes('file tree') || text.includes('📝')) {
|
|
233
|
-
console.log('[getTabNameFromButton] DEBUG: Matched file tree, returning claude-tree');
|
|
234
|
-
return 'claude-tree';
|
|
235
|
-
}
|
|
236
|
-
if (text.includes('activity') || text.includes('🌳')) return 'activity';
|
|
237
|
-
if (text.includes('agents') || text.includes('🤖')) return 'agents';
|
|
238
|
-
if (text.includes('tools') || text.includes('🔧')) return 'tools';
|
|
239
|
-
if (text.includes('files') || text.includes('📁')) return 'files';
|
|
240
|
-
if (text.includes('code')) return 'code';
|
|
241
|
-
if (text.includes('sessions')) return 'sessions';
|
|
242
|
-
if (text.includes('system')) return 'system';
|
|
243
|
-
if (text.includes('events') || text.includes('📊')) return 'events';
|
|
244
|
-
|
|
245
|
-
console.log('[getTabNameFromButton] DEBUG: No match, falling back to events');
|
|
246
|
-
return 'events';
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Switch to specified tab - BULLETPROOF VERSION
|
|
251
|
-
* @param {string} tabName - Name of tab to switch to
|
|
252
|
-
* @param {boolean} updateHash - Whether to update URL hash (default: true)
|
|
253
|
-
*/
|
|
254
|
-
switchTab(tabName, updateHash = true) {
|
|
255
|
-
// CRITICAL: Prevent race conditions by using a switching lock
|
|
256
|
-
if (this._switching) {
|
|
257
|
-
console.log(`[UIStateManager] Tab switch already in progress, queuing: ${tabName}`);
|
|
258
|
-
setTimeout(() => this.switchTab(tabName, updateHash), 50);
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
this._switching = true;
|
|
262
|
-
|
|
263
|
-
console.log(`[UIStateManager] BULLETPROOF switchTab: ${tabName}, updateHash: ${updateHash}`);
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
// Extra logging for File Tree debugging
|
|
267
|
-
if (tabName === 'claude-tree') {
|
|
268
|
-
console.log('[UIStateManager] SWITCHING TO FILE TREE TAB');
|
|
269
|
-
console.log('[UIStateManager] Current tab before switch:', this.currentTab);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Update URL hash if requested (when triggered by user action, not hash change)
|
|
273
|
-
if (updateHash && this.tabToHash[tabName]) {
|
|
274
|
-
const newHash = this.tabToHash[tabName];
|
|
275
|
-
if (window.location.hash !== newHash) {
|
|
276
|
-
console.log(`[UIStateManager] Updating hash to: ${newHash}`);
|
|
277
|
-
this._switching = false; // Release lock before hash change
|
|
278
|
-
window.location.hash = newHash;
|
|
279
|
-
return; // The hashchange event will trigger switchTab again
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const previousTab = this.currentTab;
|
|
284
|
-
this.currentTab = tabName;
|
|
285
|
-
|
|
286
|
-
// STEP 1: NUCLEAR RESET - Remove ALL active states unconditionally
|
|
287
|
-
this._removeAllActiveStates();
|
|
288
|
-
|
|
289
|
-
// STEP 2: Set the ONE correct tab as active
|
|
290
|
-
this._setActiveTab(tabName);
|
|
291
|
-
|
|
292
|
-
// STEP 3: Show ONLY the correct content
|
|
293
|
-
this._showTabContent(tabName);
|
|
294
|
-
|
|
295
|
-
// STEP 4: Cleanup and validation
|
|
296
|
-
this._validateTabState(tabName);
|
|
297
|
-
|
|
298
|
-
// Clear previous selections when switching tabs
|
|
299
|
-
this.clearUnifiedSelection();
|
|
300
|
-
|
|
301
|
-
// Trigger tab change event for other modules
|
|
302
|
-
document.dispatchEvent(new CustomEvent('tabChanged', {
|
|
303
|
-
detail: {
|
|
304
|
-
newTab: tabName,
|
|
305
|
-
previousTab: previousTab
|
|
306
|
-
}
|
|
307
|
-
}));
|
|
308
|
-
|
|
309
|
-
// Auto-scroll to bottom after a brief delay to ensure content is rendered
|
|
310
|
-
setTimeout(() => {
|
|
311
|
-
if (this.autoScroll) {
|
|
312
|
-
this.scrollCurrentTabToBottom();
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Special handling for File Tree tab - trigger the tree render
|
|
316
|
-
// But DON'T let it manipulate tabs itself
|
|
317
|
-
if (tabName === 'claude-tree' && window.CodeViewer) {
|
|
318
|
-
// Call a new method that only renders content, not tab switching
|
|
319
|
-
if (window.CodeViewer.renderContent) {
|
|
320
|
-
window.CodeViewer.renderContent();
|
|
321
|
-
} else {
|
|
322
|
-
// Fallback to show() but it should be fixed to not switch tabs
|
|
323
|
-
window.CodeViewer.show();
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}, 100);
|
|
327
|
-
|
|
328
|
-
} finally {
|
|
329
|
-
// ALWAYS release the lock
|
|
330
|
-
setTimeout(() => {
|
|
331
|
-
this._switching = false;
|
|
332
|
-
}, 200);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* NUCLEAR RESET: Remove ALL active states from ALL elements
|
|
338
|
-
* This ensures no stale states remain
|
|
339
|
-
*/
|
|
340
|
-
_removeAllActiveStates() {
|
|
341
|
-
// Remove active class from ALL tab buttons
|
|
342
|
-
document.querySelectorAll('.tab-button').forEach(btn => {
|
|
343
|
-
btn.classList.remove('active');
|
|
344
|
-
// Also remove any inline styling that might interfere
|
|
345
|
-
btn.style.removeProperty('border-bottom');
|
|
346
|
-
btn.style.removeProperty('color');
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
// Remove active class from ALL tab content
|
|
350
|
-
document.querySelectorAll('.tab-content').forEach(content => {
|
|
351
|
-
content.classList.remove('active');
|
|
352
|
-
// Clear any inline display styles
|
|
353
|
-
content.style.removeProperty('display');
|
|
354
|
-
|
|
355
|
-
// CRITICAL: Clean leaked content in non-events tabs
|
|
356
|
-
if (content.id !== 'events-tab') {
|
|
357
|
-
this._cleanLeakedEventContent(content);
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
console.log('[UIStateManager] NUCLEAR: All active states removed');
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Set ONLY the specified tab as active
|
|
366
|
-
*/
|
|
367
|
-
_setActiveTab(tabName) {
|
|
368
|
-
const targetTab = document.querySelector(`[data-tab="${tabName}"]`);
|
|
369
|
-
if (targetTab) {
|
|
370
|
-
targetTab.classList.add('active');
|
|
371
|
-
console.log(`[UIStateManager] Set active: ${tabName}`);
|
|
372
|
-
} else {
|
|
373
|
-
console.error(`[UIStateManager] Could not find tab button for: ${tabName}`);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Show ONLY the specified tab content
|
|
379
|
-
*/
|
|
380
|
-
_showTabContent(tabName) {
|
|
381
|
-
const targetContent = document.getElementById(`${tabName}-tab`);
|
|
382
|
-
if (targetContent) {
|
|
383
|
-
targetContent.classList.add('active');
|
|
384
|
-
console.log(`[UIStateManager] Showing content: ${tabName}-tab`);
|
|
385
|
-
|
|
386
|
-
// Special handling for File Tree tab
|
|
387
|
-
if (tabName === 'claude-tree') {
|
|
388
|
-
this._prepareFileTreeContent(targetContent);
|
|
389
|
-
}
|
|
390
|
-
} else {
|
|
391
|
-
console.error(`[UIStateManager] Could not find content for: ${tabName}`);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Clean any leaked event content from non-event tabs
|
|
397
|
-
*/
|
|
398
|
-
_cleanLeakedEventContent(contentElement) {
|
|
399
|
-
// Remove any event items that may have leaked
|
|
400
|
-
const leakedEventItems = contentElement.querySelectorAll('.event-item');
|
|
401
|
-
if (leakedEventItems.length > 0) {
|
|
402
|
-
console.warn(`[UIStateManager] Found ${leakedEventItems.length} leaked event items in ${contentElement.id}, removing...`);
|
|
403
|
-
leakedEventItems.forEach(item => item.remove());
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// Remove any events-list elements
|
|
407
|
-
const leakedEventsList = contentElement.querySelectorAll('#events-list, .events-list');
|
|
408
|
-
if (leakedEventsList.length > 0) {
|
|
409
|
-
console.warn(`[UIStateManager] Found leaked events-list in ${contentElement.id}, removing...`);
|
|
410
|
-
leakedEventsList.forEach(list => list.remove());
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Prepare File Tree content area
|
|
416
|
-
*/
|
|
417
|
-
_prepareFileTreeContent(fileTreeContent) {
|
|
418
|
-
const claudeTreeContainer = document.getElementById('claude-tree-container');
|
|
419
|
-
if (claudeTreeContainer) {
|
|
420
|
-
// Final cleanup check
|
|
421
|
-
this._cleanLeakedEventContent(claudeTreeContainer);
|
|
422
|
-
|
|
423
|
-
// Ensure container is properly marked for CodeViewer
|
|
424
|
-
claudeTreeContainer.setAttribute('data-owner', 'code-viewer');
|
|
425
|
-
claudeTreeContainer.setAttribute('data-component', 'CodeViewer');
|
|
426
|
-
|
|
427
|
-
console.log('[UIStateManager] File Tree container prepared');
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Validate that tab state is correct after switching
|
|
433
|
-
*/
|
|
434
|
-
_validateTabState(expectedTab) {
|
|
435
|
-
setTimeout(() => {
|
|
436
|
-
const activeTabs = document.querySelectorAll('.tab-button.active');
|
|
437
|
-
const activeContents = document.querySelectorAll('.tab-content.active');
|
|
438
|
-
|
|
439
|
-
if (activeTabs.length !== 1) {
|
|
440
|
-
console.error(`[UIStateManager] VALIDATION FAILED: Expected 1 active tab, found ${activeTabs.length}`);
|
|
441
|
-
activeTabs.forEach((tab, idx) => {
|
|
442
|
-
console.error(` - Active tab ${idx + 1}: ${tab.textContent.trim()} (${tab.getAttribute('data-tab')})`);
|
|
443
|
-
});
|
|
444
|
-
// Force fix
|
|
445
|
-
this._removeAllActiveStates();
|
|
446
|
-
this._setActiveTab(expectedTab);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
if (activeContents.length !== 1) {
|
|
450
|
-
console.error(`[UIStateManager] VALIDATION FAILED: Expected 1 active content, found ${activeContents.length}`);
|
|
451
|
-
activeContents.forEach((content, idx) => {
|
|
452
|
-
console.error(` - Active content ${idx + 1}: ${content.id}`);
|
|
453
|
-
});
|
|
454
|
-
// Force fix
|
|
455
|
-
this._removeAllActiveStates();
|
|
456
|
-
this._showTabContent(expectedTab);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
console.log(`[UIStateManager] Tab state validated for: ${expectedTab}`);
|
|
460
|
-
}, 50);
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
/**
|
|
464
|
-
* Handle unified arrow navigation across tabs
|
|
465
|
-
* @param {number} direction - Navigation direction (1 for down, -1 for up)
|
|
466
|
-
*/
|
|
467
|
-
handleUnifiedArrowNavigation(direction) {
|
|
468
|
-
const tabNav = this.tabNavigation[this.currentTab];
|
|
469
|
-
if (!tabNav) return;
|
|
470
|
-
|
|
471
|
-
let newIndex = tabNav.selectedIndex + direction;
|
|
472
|
-
|
|
473
|
-
// Handle bounds
|
|
474
|
-
if (tabNav.items.length === 0) return;
|
|
475
|
-
|
|
476
|
-
if (newIndex < 0) {
|
|
477
|
-
newIndex = tabNav.items.length - 1;
|
|
478
|
-
} else if (newIndex >= tabNav.items.length) {
|
|
479
|
-
newIndex = 0;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
this.selectCardByIndex(this.currentTab, newIndex);
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
/**
|
|
486
|
-
* Handle unified Enter key across all tabs
|
|
487
|
-
*/
|
|
488
|
-
handleUnifiedEnterKey() {
|
|
489
|
-
const tabNav = this.tabNavigation[this.currentTab];
|
|
490
|
-
if (!tabNav || tabNav.selectedIndex === -1) return;
|
|
491
|
-
|
|
492
|
-
const selectedElement = tabNav.items[tabNav.selectedIndex];
|
|
493
|
-
if (selectedElement && selectedElement.onclick) {
|
|
494
|
-
selectedElement.onclick();
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
/**
|
|
499
|
-
* Clear all unified selection states
|
|
500
|
-
*/
|
|
501
|
-
clearUnifiedSelection() {
|
|
502
|
-
// Clear all tab navigation states
|
|
503
|
-
Object.keys(this.tabNavigation).forEach(tabName => {
|
|
504
|
-
this.tabNavigation[tabName].selectedIndex = -1;
|
|
505
|
-
});
|
|
506
|
-
|
|
507
|
-
// Clear card selection
|
|
508
|
-
this.clearCardSelection();
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
/**
|
|
512
|
-
* Update tab navigation items for current tab
|
|
513
|
-
* Should be called after tab content is rendered
|
|
514
|
-
*/
|
|
515
|
-
updateTabNavigationItems() {
|
|
516
|
-
const tabNav = this.tabNavigation[this.currentTab];
|
|
517
|
-
if (!tabNav) return;
|
|
518
|
-
|
|
519
|
-
let containerSelector;
|
|
520
|
-
switch (this.currentTab) {
|
|
521
|
-
case 'events':
|
|
522
|
-
containerSelector = '#events-list .event-item';
|
|
523
|
-
break;
|
|
524
|
-
case 'agents':
|
|
525
|
-
containerSelector = '#agents-list .event-item';
|
|
526
|
-
break;
|
|
527
|
-
case 'tools':
|
|
528
|
-
containerSelector = '#tools-list .event-item';
|
|
529
|
-
break;
|
|
530
|
-
case 'files':
|
|
531
|
-
containerSelector = '#files-list .event-item';
|
|
532
|
-
break;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
if (containerSelector) {
|
|
536
|
-
tabNav.items = Array.from(document.querySelectorAll(containerSelector));
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
/**
|
|
541
|
-
* Select card by index for specified tab
|
|
542
|
-
* @param {string} tabName - Tab name
|
|
543
|
-
* @param {number} index - Index of item to select
|
|
544
|
-
*/
|
|
545
|
-
selectCardByIndex(tabName, index) {
|
|
546
|
-
const tabNav = this.tabNavigation[tabName];
|
|
547
|
-
if (!tabNav || index < 0 || index >= tabNav.items.length) return;
|
|
548
|
-
|
|
549
|
-
// Update navigation state
|
|
550
|
-
tabNav.selectedIndex = index;
|
|
551
|
-
|
|
552
|
-
// Update visual selection
|
|
553
|
-
this.updateUnifiedSelectionUI();
|
|
554
|
-
|
|
555
|
-
// If this is a different tab selection, record the card selection
|
|
556
|
-
const selectedElement = tabNav.items[index];
|
|
557
|
-
if (selectedElement) {
|
|
558
|
-
// Extract data from the element to populate selectedCard
|
|
559
|
-
this.selectCard(tabName, index, this.getCardType(tabName), index);
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
// Show details for the selected item
|
|
563
|
-
this.showCardDetails(tabName, index);
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
/**
|
|
567
|
-
* Update visual selection UI for unified navigation
|
|
568
|
-
*/
|
|
569
|
-
updateUnifiedSelectionUI() {
|
|
570
|
-
// Clear all existing selections
|
|
571
|
-
document.querySelectorAll('.event-item.keyboard-selected').forEach(el => {
|
|
572
|
-
el.classList.remove('keyboard-selected');
|
|
573
|
-
});
|
|
574
|
-
|
|
575
|
-
// Apply selection to current tab's selected item
|
|
576
|
-
const tabNav = this.tabNavigation[this.currentTab];
|
|
577
|
-
if (tabNav && tabNav.selectedIndex !== -1 && tabNav.items[tabNav.selectedIndex]) {
|
|
578
|
-
tabNav.items[tabNav.selectedIndex].classList.add('keyboard-selected');
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
/**
|
|
583
|
-
* Show card details for specified tab and index
|
|
584
|
-
* @param {string} tabName - Tab name
|
|
585
|
-
* @param {number} index - Item index
|
|
586
|
-
*/
|
|
587
|
-
showCardDetails(tabName, index) {
|
|
588
|
-
// Dispatch event for other modules to handle
|
|
589
|
-
document.dispatchEvent(new CustomEvent('showCardDetails', {
|
|
590
|
-
detail: {
|
|
591
|
-
tabName: tabName,
|
|
592
|
-
index: index
|
|
593
|
-
}
|
|
594
|
-
}));
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
/**
|
|
598
|
-
* Select a specific card
|
|
599
|
-
* @param {string} tabName - Tab name
|
|
600
|
-
* @param {number} index - Item index
|
|
601
|
-
* @param {string} type - Item type
|
|
602
|
-
* @param {*} data - Item data
|
|
603
|
-
*/
|
|
604
|
-
selectCard(tabName, index, type, data) {
|
|
605
|
-
// Clear previous selection
|
|
606
|
-
this.clearCardSelection();
|
|
607
|
-
|
|
608
|
-
// Update selection state
|
|
609
|
-
this.selectedCard = {
|
|
610
|
-
tab: tabName,
|
|
611
|
-
index: index,
|
|
612
|
-
type: type,
|
|
613
|
-
data: data
|
|
614
|
-
};
|
|
615
|
-
|
|
616
|
-
this.updateCardSelectionUI();
|
|
617
|
-
|
|
618
|
-
console.log('Card selected:', this.selectedCard);
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
/**
|
|
622
|
-
* Clear card selection
|
|
623
|
-
*/
|
|
624
|
-
clearCardSelection() {
|
|
625
|
-
// Clear visual selection from all tabs
|
|
626
|
-
document.querySelectorAll('.event-item.selected, .file-item.selected').forEach(el => {
|
|
627
|
-
el.classList.remove('selected');
|
|
628
|
-
});
|
|
629
|
-
|
|
630
|
-
// Reset selection state
|
|
631
|
-
this.selectedCard = {
|
|
632
|
-
tab: null,
|
|
633
|
-
index: null,
|
|
634
|
-
type: null,
|
|
635
|
-
data: null
|
|
636
|
-
};
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
/**
|
|
640
|
-
* Update card selection UI
|
|
641
|
-
*/
|
|
642
|
-
updateCardSelectionUI() {
|
|
643
|
-
if (!this.selectedCard.tab || this.selectedCard.index === null) return;
|
|
644
|
-
|
|
645
|
-
// Get the list container for the selected tab
|
|
646
|
-
let listContainer;
|
|
647
|
-
switch (this.selectedCard.tab) {
|
|
648
|
-
case 'events':
|
|
649
|
-
listContainer = document.getElementById('events-list');
|
|
650
|
-
break;
|
|
651
|
-
case 'agents':
|
|
652
|
-
listContainer = document.getElementById('agents-list');
|
|
653
|
-
break;
|
|
654
|
-
case 'tools':
|
|
655
|
-
listContainer = document.getElementById('tools-list');
|
|
656
|
-
break;
|
|
657
|
-
case 'files':
|
|
658
|
-
listContainer = document.getElementById('files-list');
|
|
659
|
-
break;
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
if (listContainer) {
|
|
663
|
-
const items = listContainer.querySelectorAll('.event-item, .file-item');
|
|
664
|
-
if (items[this.selectedCard.index]) {
|
|
665
|
-
items[this.selectedCard.index].classList.add('selected');
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
/**
|
|
671
|
-
* Get card type based on tab name
|
|
672
|
-
* @param {string} tabName - Tab name
|
|
673
|
-
* @returns {string} - Card type
|
|
674
|
-
*/
|
|
675
|
-
getCardType(tabName) {
|
|
676
|
-
switch (tabName) {
|
|
677
|
-
case 'events': return 'event';
|
|
678
|
-
case 'agents': return 'agent';
|
|
679
|
-
case 'tools': return 'tool';
|
|
680
|
-
case 'files': return 'file';
|
|
681
|
-
default: return 'unknown';
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
/**
|
|
686
|
-
* Scroll current tab to bottom
|
|
687
|
-
*/
|
|
688
|
-
scrollCurrentTabToBottom() {
|
|
689
|
-
const tabId = `${this.currentTab}-list`;
|
|
690
|
-
const element = document.getElementById(tabId);
|
|
691
|
-
if (element && this.autoScroll) {
|
|
692
|
-
element.scrollTop = element.scrollHeight;
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
/**
|
|
697
|
-
* Clear selection for cleanup
|
|
698
|
-
*/
|
|
699
|
-
clearSelection() {
|
|
700
|
-
this.clearCardSelection();
|
|
701
|
-
this.clearUnifiedSelection();
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
/**
|
|
705
|
-
* Get current tab name
|
|
706
|
-
* @returns {string} - Current tab name
|
|
707
|
-
*/
|
|
708
|
-
getCurrentTab() {
|
|
709
|
-
return this.currentTab;
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
/**
|
|
713
|
-
* Get selected card info
|
|
714
|
-
* @returns {Object} - Selected card state
|
|
715
|
-
*/
|
|
716
|
-
getSelectedCard() {
|
|
717
|
-
return { ...this.selectedCard };
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
/**
|
|
721
|
-
* Get tab navigation state
|
|
722
|
-
* @returns {Object} - Tab navigation state
|
|
723
|
-
*/
|
|
724
|
-
getTabNavigation() {
|
|
725
|
-
return { ...this.tabNavigation };
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
/**
|
|
729
|
-
* Set auto-scroll behavior
|
|
730
|
-
* @param {boolean} enabled - Whether to enable auto-scroll
|
|
731
|
-
*/
|
|
732
|
-
setAutoScroll(enabled) {
|
|
733
|
-
this.autoScroll = enabled;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
/**
|
|
737
|
-
* Get auto-scroll state
|
|
738
|
-
* @returns {boolean} - Auto-scroll enabled state
|
|
739
|
-
*/
|
|
740
|
-
getAutoScroll() {
|
|
741
|
-
return this.autoScroll;
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
// ES6 Module export
|
|
745
|
-
export { UIStateManager };
|
|
746
|
-
export default UIStateManager;
|
|
747
|
-
|
|
748
|
-
// Make UIStateManager globally available for dist/dashboard.js
|
|
749
|
-
window.UIStateManager = UIStateManager;
|